供应商管理系统(Supplier Management System,简称SMS)就像企业的“补给站”,保证货源充足、流转顺畅。其中,库存管理板块就相当于“仓库大管家”,负责记录入库、出库、调拨、盘点等全流程,帮助企业实时掌握库存状态,避免缺货断供或积压滞销。下面,我先用一个小故事拉开序幕。
小张是某中型制造企业的采购主管,上个月因为一次数据错误,公司急缺关键零件,被迫停产一天,损失十几万。后来他们上线了供应商管理系统,配置了库存管理板块,入库、出库、调拨和盘点都走系统,实时数据一目了然,再也没出过差错。
有了这次教训,小张深刻认识到——再大的企业,也离不开扎实的库存管理。接下来,就带大家一起来聊:
注:本文示例所用方案模板:简道云供应商管理系统,给大家示例的是一些通用的功能和模块,都是支持自定义修改的,你可以根据自己的需求修改里面的功能。
- 供应商管理系统到底是什么?
- 库存管理板块要怎么搭?
- 主要内容和目录概览
- 正文: 功能模块 业务流程 开发技巧 实现效果
- FAQ
一、为什么要讲供应商管理系统?
企业生产、销售都离不开原材料或配件,任何“断供”都可能带来停产、延期、赔付等巨大风险。手工或Excel管理库存,数据易错且时效差;传统ERP虽然强大,但部署成本高、周期长。中小企业更需要一套灵活可定制、与供应商直联的SMS。库存管理板块作为核心,关系到资金占用和供应链稳定,必须打牢基础。
二、什么是供应商管理系统?
供应商管理系统,顾名思义,是以“供应商”为中心,串联从需求发布→询报价→订单协同→发货协同→入库验收→库存管理→付款结算等全流程的信息化平台。它能够对供应商资质、合同、绩效、交期、质量等进行综合管理。库存管理板块是其中一个重要子系统,专注于仓储动态。
三、库存管理板块如何搭建?
1.系统架构图
mermaid
graph LR
A[前端Vue/React] -->|RESTful API| B(后端SpringBoot)
B --> C[业务服务层]
C --> D[入库服务]
C --> E[出库服务]
C --> F[调拨服务]
C --> G[盘点服务]
D & E & F & G --> H[(MySQL库存表)]
C --> I[缓存Redis]
B --> J[消息队列RabbitMQ]
2.流程图
mermaid
flowchart TD
subgraph 入库流程
A1[生成入库单] --> A2[供应商发货通知]
A2 --> A3[仓库验收入库]
A3 --> A4[更新库存表]
A4 --> A5[发送MQ消息通知其他系统]
end
subgraph 出库流程
B1[生成出库单] --> B2[审核出库单]
B2 --> B3[仓库拣货]
B3 --> B4[出库并减库存]
B4 --> B5[发送通知]
end
subgraph 调拨流程 & 盘点流程
C1[调拨申请] --> C2[审核] --> C3[执行调拨] --> C4[更新库存]
D1[定期盘点] --> D2[录入盘点结果] --> D3[自动比对差异] --> D4[生成差异报告]
end
四、功能模块
1.入库单管理
功能点 自动编号:规则 YYYYMMDD+4位流水 信息录入:供应商、产品、数量、批次、规格、价格 验收拍照:支持上传验收照片 状态跟踪:新建、验收中、已入库
java
// 示例:入库单实体(SpringBoot+MyBatis)
@Data
@TableName("po_inbound_order")
public class InboundOrder {
@TableId(type = IdType.AUTO)
private Long id;
private String orderCode; // YYYYMMDD0001
private Long supplierId;
private Date inboundDate;
private String status; // NEW, RECEIVING, COMPLETED
private BigDecimal totalAmount;
// … getter/setter
}
关键SQL
sql
CREATE TABLE po_inbound_order (
id BIGINT PRIMARY KEY AUTO_INCREMENT,
order_code VARCHAR(20) UNIQUE NOT NULL,
supplier_id BIGINT NOT NULL,
inbound_date DATETIME NOT NULL,
status VARCHAR(20) NOT NULL,
total_amount DECIMAL(12,2),
INDEX(idx_supplier, supplier_id),
INDEX(idx_date, inbound_date)
);
2.出库单管理
功能点 多仓库支持:可指定源仓库 审核流转:草稿→待审→已出库→关闭 配货规则:先进先出(FIFO)、指定批次
ts
// 前端TypeScript接口定义
export interface OutboundOrder {
id?: number;
orderCode: string;
warehouseId: number;
items: Array<{ productId: number; qty: number; batchNo?: string }>;
status: 'DRAFT' | 'PENDING' | 'RELEASED' | 'CLOSED';
}
后端Controller示例
java
@RestController
@RequestMapping("/api/outbound")
public class OutboundController {
@Autowired private OutboundService service;
@PostMapping
public ResponseEntity create(@RequestBody OutboundOrderDto dto) {
Long id = service.create(dto);
return ResponseEntity.ok(id);
}
// …其他接口
}
3.调拨单管理
功能点 跨仓库调拨:支持调出仓库和调入仓库 审批机制:二级审批 自动库存更新
java
// 调拨服务核心逻辑(伪码)
@Transactional
public void transfer(TransferOrder order) {
deductStock(order.getFromWarehouse(), order.getItems());
addStock(order.getToWarehouse(), order.getItems());
updateOrderStatus(order.getId(), "COMPLETED");
}
4.库存盘点
功能点 周期性/临时盘点 盘点差异自动对账 盘点报告生成
sql
-- 生成盘点差异报告视图
CREATE VIEW vw_inventory_diff AS
SELECT i.product_id, i.batch_no, i.qty AS system_qty, p.qty AS counted_qty,
(p.qty - i.qty) AS diff
FROM inventory i
JOIN physical_count p ON i.product_id = p.product_id AND i.batch_no = p.batch_no;
五、业务流程
1.入库流程
- 采购模块下单
- 供应商发货通知
- 仓库扫描ASN,生成入库单
- 实物验收(拍照、重量核对)
- 系统调用库存服务,更新库存表
- 发送MQ消息给财务、销售等模块
2.出库流程
- 销售/生产下发出库申请
- 库存模块审核
- 仓库拣货(扫描批次)
- 系统扣减库存,更新出库记录
- 通知物流揽收
3.调拨流程
- A仓库申请调拨
- B仓库确认
- 双方执行实物交接
- 系统双向更新库存
- 完成调拨单
4.盘点流程
- 系统生成盘点任务
- 仓管员录入实物数量
- 系统比对差异
- 生成报告,通知管理层审批
- 若有差异,触发财务调整
六、开发技巧
1.技术选型
- 后端:Spring Boot + MyBatis-Plus
- 前端:Vue3 + TypeScript + Element-Plus
- 数据库:MySQL 8.0 + Redis缓存
- 消息队列:RabbitMQ 或 RocketMQ
- 部署:Docker + Kubernetes
2.数据库设计
- 库存表 inventory
sql
CREATE TABLE inventory (
warehouse_id BIGINT,
product_id BIGINT,
batch_no VARCHAR(50),
qty DECIMAL(12,2),
PRIMARY KEY (warehouse_id, product_id, batch_no)
);
- 索引策略:常用查询字段(warehouse_id、product_id、batch_no)建立联合索引;历史表分区
3.接口与前端交互
- 分页查询:后台统一返回 PageInfo,对应前端 Table 组件
- 长列表:使用虚拟滚动(Virtual Scroll)减少渲染压力
- 表单校验:Element-Plus + vee-validate
4.性能与并发控制
- 乐观锁:在 inventory 表添加版本号字段 version
- 批量更新:使用单语句批量扣减库存
- 缓存预热:关键页面数据放入 Redis
七、实现效果
- 界面示例: 入库单列表 → 支持快速筛选、搜索 出库单详情 → 展示拣货地图 盘点看板 → 实时差异曲线
- 数据看板: 实时库存总览 30天入/出库趋势 异常预警
通过上述功能,企业实现了:入库平均时长缩短30%,盘点差异率下降80%,库存周转率提升20%。
FAQ
Q1:如何避免库存“脏数据”导致的实际库存与系统不符?
库存管理系统要从源头控制数据质量。
- 首先,在入库/出库环节必须扫码(或RFID)确认实物批次和数量,禁止手工录入;
- 其次,引入照片验收和电子签名,留下可追溯痕迹;再次,定期盘点任务要排入日常计划,通过系统自动比对并生成差异报告,及时调整。
技术上,可对库存表加乐观锁(version字段)防止并发写冲突,并使用消息队列保证事务最终一致性。管理制度上,要明确盘盈盘亏处理流程,定期培训仓管和采购,才能最大程度降低“脏数据”风险。
Q2:库存调拨过程中的“占用库存”如何实现?
- 在调拨申请通过后,不要立即从可用库存中扣减,而是将调拨数量放入“锁定库存”字段(locked_qty),同时在响应接口中区分“可用库存=总库存-锁定库存”;
- 实际调拨执行时,再将锁定库存转换为实际调拨操作,更新总库存。这样,在调拨审核通过到执行间隙,其他出库操作不会误扣已调拨的货物;若调拨被驳回,直接释放锁定库存即可。
- 数据库表设计上,可在 inventory 表新增 locked_qty 字段,并为其建立索引以优化查询性能。