销售出库流程数据带入与查询方案
一、整体流程
┌─────────────┐ ┌─────────────┐ ┌─────────────┐ ┌─────────────┐
│ 销售订单 │───>│ 发货通知单 │───>│ 销售出库单 │───>│ 出库完成 │
│ (ERP模块) │ │ (MES模块) │ │ (MES模块) │ │ 状态回写 │
└─────────────┘ └─────────────┘ └─────────────┘ └─────────────┘
│ │ │ │
▼ ▼ ▼ ▼
出库状态同步 出库状态同步 执行出库 状态回写上游
二、单据层级结构
1. 发货通知单(mes_wm_sales_notice)
| 层级 |
表名 |
说明 |
| 主表 |
mes_wm_sales_notice |
发货通知单基本信息 |
| 行表 |
mes_wm_sales_notice_line |
按物料维度的发货明细 |
2. 销售出库单(mes_wm_product_sales)
| 层级 |
表名 |
说明 |
| 主表 |
mes_wm_product_sales |
出库单基本信息 |
| 行表 |
mes_wm_product_sales_line |
按物料/批次维度的出库行 |
| 明细表 |
mes_wm_product_sales_detail |
拣货明细,具体仓库/库区/库位 |
三、上下游数据带入规则
1. 销售订单 → 发货通知单
主表带入:
| 销售订单字段 |
发货通知单字段 |
说明 |
| id |
saleOrderId |
销售订单ID |
| no |
saleOrderCode |
销售订单号 |
| customerId |
clientId |
客户ID |
行表带入:
| 销售订单明细字段 |
发货通知单行字段 |
说明 |
| id |
saleOrderItemId |
销售订单明细ID |
| productId |
itemId |
物料ID |
| count |
quantity |
发货数量 |
API 调用:
- ErpSaleOrderApi.getSaleOrder(saleOrderId) - 获取销售订单信息
- ErpSaleOrderApi.getSaleOrderItemList(saleOrderId) - 获取销售订单明细列表
2. 发货通知单 → 销售出库单
主表带入:
| 发货通知单字段 |
销售出库单字段 |
说明 |
| id |
noticeId |
发货通知单ID |
| clientId |
clientId |
客户ID |
| saleOrderId |
saleOrderId |
销售订单ID |
| saleOrderCode |
salesOrderCode |
销售订单号 |
| salesDate |
salesDate |
出库日期 |
| recipientName |
contactName |
收货人 → 联系人 |
| recipientTelephone |
contactTelephone |
联系电话 |
| recipientAddress |
contactAddress |
收货地址 |
行表带入:
| 发货通知单行字段 |
销售出库单行字段 |
说明 |
| id |
noticeLineId |
发货通知单行ID |
| saleOrderItemId |
saleOrderItemId |
销售订单明细ID |
| itemId |
itemId |
物料ID |
| quantity |
quantity |
出库数量 |
| batchId |
batchId |
批次ID |
| batchCode |
batchCode |
批次号 |
| oqcCheckFlag |
oqcCheckFlag |
是否检验 |
注意:
- 销售出库单明细表(拣货信息)需要手动添加
- 一个发货通知单可以生成多个销售出库单(部分出库场景)
四、状态同步机制
1. 出库完成时的状态回写
触发时机: 销售出库单执行出库(finishProductSales)
回写流程:
销售出库单行.noticeLineId → 发货通知单行.outCount(累加)
↓
计算发货通知单.outStatus
↓
全部出库时 → 发货通知单.status = 已完成
↓
销售出库单行.saleOrderItemId → ERP销售订单明细.outCount(累加)
↓
计算ERP销售订单.outStatus
2. 出库状态枚举
| 值 |
名称 |
说明 |
| 0 |
未出库 |
所有行的 outCount = 0 |
| 1 |
部分出库 |
部分行已出库,或部分数量已出库 |
| 2 |
全部出库 |
所有行的 outCount >= quantity |
五、关联信息查询
1. 发货通知单查询时
需要查询的关联数据:
| 关联对象 |
API/方法 |
用途 |
| 客户信息 |
CrmCustomerApi.getCustomerMap(clientIds) |
显示客户名称 |
| 销售订单 |
ErpSaleOrderApi.getSaleOrder(saleOrderId) |
显示订单信息 |
2. 销售出库单查询时
需要查询的关联数据:
| 关联对象 |
API/方法 |
用途 |
| 客户信息 |
CrmCustomerApi.getCustomerMap(clientIds) |
显示客户名称 |
| 发货通知单 |
SalesNoticeService.getSalesNoticeMap(noticeIds) |
显示通知单编码 |
| 物料信息 |
MesMdItemService.getItemMap(itemIds) |
显示物料编码、名称、规格型号 |
| 批次信息 |
MesWmBatchService.getBatchMap(batchIds) |
显示批次号、生产日期 |
| 仓库信息 |
MesWmWarehouseService.getWarehouseMap(warehouseIds) |
显示仓库名称 |
| 库区信息 |
MesWmWarehouseLocationService.getLocationMap(locationIds) |
显示库区名称 |
| 库位信息 |
MesWmWarehouseAreaService.getAreaMap(areaIds) |
显示库位名称 |
3. 物料信息查询 API
// 获取物料基本信息
MesMdItemDO item = itemService.getItem(itemId);
// 批量获取物料信息
Map<Long, MesMdItemDO> itemMap = itemService.getItemMap(itemIds);
// 校验物料存在且启用
itemService.validateItemExistsAndEnable(itemId);
物料关键信息:
| 字段 |
说明 |
| id |
物料ID |
| code |
物料编码 |
| name |
物料名称 |
| spec |
规格型号 |
| unitId |
主单位ID |
| unitCode |
主单位编码 |
| batchCode |
是否批次管理 |
| qualityFlag |
是否质检 |
六、API 接口清单
1. 发货通知单 API
| 方法 |
路径 |
说明 |
| POST |
/mes/wm/sales-notice/create |
创建发货通知单 |
| PUT |
/mes/wm/sales-notice/update |
修改发货通知单 |
| DELETE |
/mes/wm/sales-notice/delete |
删除发货通知单 |
| GET |
/mes/wm/sales-notice/get |
获取发货通知单详情 |
| GET |
/mes/wm/sales-notice/page |
分页查询发货通知单 |
| PUT |
/mes/wm/sales-notice/submit |
提交发货通知单 |
| POST |
/mes/wm/sales-notice/generate-from-sale-order |
从销售订单生成 |
| POST |
/mes/wm/sales-notice/generate-product-sales |
生成销售出库单 |
2. 销售出库单 API
| 方法 |
路径 |
说明 |
| POST |
/mes/wm/product-sales/create |
创建销售出库单 |
| PUT |
/mes/wm/product-sales/update |
修改销售出库单 |
| DELETE |
/mes/wm/product-sales/delete |
删除销售出库单 |
| GET |
/mes/wm/product-sales/get |
获取销售出库单详情 |
| GET |
/mes/wm/product-sales/page |
分页查询销售出库单 |
| PUT |
/mes/wm/product-sales/submit |
提交销售出库单 |
| PUT |
/mes/wm/product-sales/stock |
执行拣货 |
| PUT |
/mes/wm/product-sales/shipping |
填写运单 |
| PUT |
/mes/wm/product-sales/finish |
执行出库 |
| PUT |
/mes/wm/product-sales/cancel |
取消销售出库单 |
七、前端展示字段
1. 发货通知单列表
| 字段 |
来源 |
说明 |
| code |
mes_wm_sales_notice |
通知单编码 |
| name |
mes_wm_sales_notice |
通知单名称 |
| clientName |
crm_customer |
客户名称(关联查询) |
| saleOrderCode |
mes_wm_sales_notice |
销售订单号 |
| salesDate |
mes_wm_sales_notice |
发货日期 |
| status |
mes_wm_sales_notice |
单据状态 |
| outStatus |
mes_wm_sales_notice |
出库状态 |
2. 发货通知单行列表
| 字段 |
来源 |
说明 |
| itemCode |
mes_md_item |
物料编码(关联查询) |
| itemName |
mes_md_item |
物料名称(关联查询) |
| itemSpec |
mes_md_item |
规格型号(关联查询) |
| batchCode |
mes_wm_sales_notice_line |
批次号 |
| quantity |
mes_wm_sales_notice_line |
发货数量 |
| outCount |
mes_wm_sales_notice_line |
已出库数量 |
| outProgress |
计算 |
出库进度 = outCount / quantity |
| oqcCheckFlag |
mes_wm_sales_notice_line |
是否检验 |
3. 销售出库单列表
| 字段 |
来源 |
说明 |
| code |
mes_wm_product_sales |
出库单编码 |
| name |
mes_wm_product_sales |
出库单名称 |
| clientName |
crm_customer |
客户名称(关联查询) |
| noticeCode |
mes_wm_sales_notice |
通知单编码(关联查询) |
| salesOrderCode |
mes_wm_product_sales |
销售订单号 |
| salesDate |
mes_wm_product_sales |
出库日期 |
| contactName |
mes_wm_product_sales |
联系人 |
| contactTelephone |
mes_wm_product_sales |
联系电话 |
| status |
mes_wm_product_sales |
单据状态 |
4. 销售出库单行列表
| 字段 |
来源 |
说明 |
| itemCode |
mes_md_item |
物料编码(关联查询) |
| itemName |
mes_md_item |
物料名称(关联查询) |
| batchCode |
mes_wm_product_sales_line |
批次号 |
| quantity |
mes_wm_product_sales_line |
出库数量 |
| oqcCheckFlag |
mes_wm_product_sales_line |
是否检验 |
| qualityStatus |
mes_wm_product_sales_line |
质量状态 |
5. 销售出库明细列表(拣货信息)
| 字段 |
来源 |
说明 |
| itemCode |
mes_md_item |
物料编码(关联查询) |
| batchCode |
mes_wm_product_sales_detail |
批次号 |
| quantity |
mes_wm_product_sales_detail |
拣货数量 |
| warehouseName |
mes_wm_warehouse |
仓库名称(关联查询) |
| locationName |
mes_wm_warehouse_location |
库区名称(关联查询) |
| areaName |
mes_wm_warehouse_area |
库位名称(关联查询) |
八、业务规则
1. 生成规则
| 场景 |
规则 |
| 发货通知单生成条件 |
销售订单状态为"已审核" |
| 销售出库单生成条件 |
发货通知单状态为"待出库" |
| 生成后状态 |
均为"草稿"状态,需要提交后才能流转 |
2. 提交校验
| 单据 |
校验规则 |
| 发货通知单 |
至少有一条行记录 |
| 销售出库单 |
至少有一条行记录,每行出库数量 > 0 |
3. 出库流程
草稿 → 提交 → 待拣货 → 拣货 → 待填写运单 → 填写运单 → 待出库 → 执行出库 → 已完成
↑ ↓
└──────────── 如果需要OQC检验 ←──────────────────────┘
草稿 → 提交 → 待检测 → OQC检验完成 → 待拣货
4. 状态回写规则
| 触发动作 |
回写对象 |
回写内容 |
| 执行出库 |
发货通知单行 |
outCount += 实际出库数量 |
| 执行出库 |
发货通知单 |
outStatus = 计算结果 |
| 执行出库 |
发货通知单 |
如果 outStatus=全部出库,则 status=已完成 |
| 执行出库 |
ERP销售订单明细 |
outCount += 实际出库数量 |
| 执行出库 |
ERP销售订单 |
outStatus = 计算结果 |