进销存系统(Purchase-Sales-InventorySystem)是中小企业数字化管理的基础工具,它帮助企业实时掌握采购、销售、库存动态,避免库存积压或断货。本文将从需求分析、数据库设计、技术选型到核心功能实现,手把手教你制作一个完整的进销存系统,并附上5个常见问题解答。

一、系统需求分析
在动手开发前,需明确业务场景。一套标准的进销存系统应包含三大模块:
-采购管理:记录采购订单、入库单、供应商信息,支持采购退货。
-销售管理:记录销售订单、出库单、客户信息,支持销售退货。
-库存管理:实时统计商品库存量、预警低库存、盘点库存。
此外还需基础信息管理(商品档案、仓库、用户权限)和统计报表(采购汇总、销售排行、库存周转等)。本文以轻量级单体应用为例,适合小型团队或学习使用。
二、数据库设计
使用MySQL数据库,核心表设计如下:

1.商品表(goods)
“`sql
CREATETABLEgoods(
idINTAUTO_INCREMENTPRIMARYKEY,
goods_codeVARCHAR(20)NOTNULLUNIQUE,–商品编码
goods_nameVARCHAR(100)NOTNULL,

category_idINT,–分类ID
unitVARCHAR(10),–单位(个、箱、kg)
purchase_priceDECIMAL(10,2),–采购价
sale_priceDECIMAL(10,2),–销售价
current_stockINTDEFAULT0,–当前库存
min_stockINTDEFAULT0,–最低库存预警
statusTINYINTDEFAULT1–1启用0停用
);
“`
2.采购入库单表(purchase_order)
“`sql
CREATETABLEpurchase_order(

idINTAUTO_INCREMENTPRIMARYKEY,
order_noVARCHAR(30)NOTNULLUNIQUE,–单号(自动生成)
supplier_idINT,–供应商ID
total_amountDECIMAL(12,2),–总金额
create_timeDATETIMEDEFAULTNOW(),
statusTINYINTDEFAULT0–0待审核1已入库2已取消
);
–采购明细表(purchase_order_detail),记录商品、数量、单价等
“`
3.销售出库单表与明细表结构与采购类似
4.库存变动日志表(stock_log)
记录每次入库/出库的变动,用于追溯和报表:
“`sql
CREATETABLEstock_log(
idINTAUTO_INCREMENTPRIMARYKEY,
goods_idINT,
change_qtyINT,–正数入库,负数出库
change_typeVARCHAR(20),–‘purchase’,’sale’,’adjust’
relate_order_noVARCHAR(30),
create_timeDATETIMEDEFAULTNOW()
);
“`
关系说明:一个商品对应多个库存变动记录;采购/销售单明细中记录商品数量,审核后更新`goods.current_stock`并插入`stock_log`。
三、技术选型
为降低学习门槛,推荐以下技术栈:
|层次|技术选择|说明|
||-||
|后端框架|JavaSpringBoot|企业级开发,生态丰富|
|前端框架|Vue3+ElementPlus|响应式,组件化|
|数据库|MySQL8.0|稳定,支持事务|
|持久层|MyBatis-Plus|简化SQL编写|
|缓存|Redis(可选)|提升查询速度|
|部署|Docker+Nginx|单机或云服务器|
若想快速原型,也可使用PythonDjango+DjangoRESTFramework。
四、核心功能实现
1.采购入库流程
后端API设计(SpringBoot示例):
“`java
//创建采购订单
@PostMapping(“/purchase/order”)
publicResultcreateOrder(@RequestBodyPurchaseOrderDTOdto){
//1.生成订单号:格式PUR+yyyyMMdd+序列
//2.保存主表、明细表
//3.返回订单ID
}
//审核入库
@PostMapping(“/purchase/order/{id}/audit”)
publicResultauditOrder(@PathVariableLongid){
//1.校验订单状态为待审核
//2.使用事务:逐条更新商品库存(current_stock+=qty)
//3.插入stock_log记录
//4.更新订单状态为已入库
}
“`
前端页面:使用Vue表单收集商品列表,提交后调用API,用ElementPlus的表格展示明细。
2.销售出库流程
与采购类似,但库存减少(current_stock-=qty),并需检查库存是否充足。伪代码:
“`java
//审核出库
for(Detaildetail:order.getDetails()){
Goodsgoods=goodsMapper.selectById(detail.getGoodsId());
if(goods.getCurrentStock() thrownewRuntimeException(“商品”+goods.getName()+”库存不足”); } } //然后更新库存并记录日志 “` 3.库存预警与报表 -预警查询:`SELECTFROMgoodsWHEREcurrent_stock -月度采购汇总:按商品统计当月入库数量、金额(关联stock_log和purchase_order) -用Redis缓存热门商品库存:减少数据库压力。 1.单元测试:使用JUnit测试库存更新事务是否原子。 2.并发问题:高并发场景需加悲观锁(`SELECT…FORUPDATE`)或乐观锁(version字段)。 3.部署:打包SpringBoot为jar,配合Nginx反向代理前端静态文件。数据库使用MySQL容器化部署。 Q1:进销存系统是否需要实时库存?如何保证数据一致性? A:必须实时。核心做法是“单事务更新”:采购、销售等操作在同一个数据库事务中同时更新商品库存表和库存日志表。使用数据库行锁避免并发修改同一商品。对于高并发场景,可采用Redis缓存库存数量+异步写入数据库,但需做好补偿机制。 Q2:如何处理采购退货和销售退货? A:退货本质是逆向流程。采购退货:创建采购退货单,审核后减少库存(current_stock-=qty),并记录日志,类型为`purchase_return`。销售退货同理,增加库存。注意退货单与原单号关联,便于财务对账。 Q3:系统需要支持多仓库吗?设计上有什么不同? A:若要支持多仓库,需在商品表之外新增`warehouse`表,并将库存字段从`goods`表移到单独的`goods_stock`表(仓库ID+商品ID→数量)。采购入库时指定仓库,销售出库时从指定仓库扣减。订单明细也需增加仓库ID字段。 Q4:进销存系统如何生成财务报表? A:可通过数据库查询并汇总。例如销售毛利=销售额-成本额。成本计算常用移动加权平均法:每次入库后更新商品的平均单价,出库时按该单价计算成本。可在`stock_log`中增加`unit_cost`字段记录每次变动的成本价。 Q5:非技术人员如何快速搭建进销存系统? A:若不想编码,可使用现成低代码平台(如微搭、明道云)或开源软件(如Odoo、ERPNext)。但定制化需求较高时,仍建议按本文教程开发,可控制核心流程,且易于二次迭代。初学者可从SpringBoot+Vue基础项目入手。 结语 本文从零讲解了一套进销存系统的制作流程,涵盖数据库设计、技术选型、核心功能代码及常见问题。实际开发中还需考虑权限管理(RBAC)、数据备份、Excel导入导出等。建议先完成最小可用版本(MVP),再根据业务反馈逐步完善。希望本教程能帮助你快速搭建自己的库存管理工具。 版权声明:部分文章信息来源于网络以及网友投稿,本站只负责对文章进行整理、排版、编辑,出于传递更多信息之目的, 并不意味着赞同其观点或证实其内容的真实性,如本站文章和转稿涉及版权等问题,请及时联系2022@guanmai.cn,我们会在5个工作日内处理。五、测试与部署建议
六、常见问题FAQ
文章标题:进销存系统制作教程:从零搭建企业级库存管理平台
文章链接:https://www.guanmaicfd.com/baike/5199.html
