# 销售出库流程数据带入与查询方案 ## 一、整体流程 ``` ┌─────────────┐ ┌─────────────┐ ┌─────────────┐ ┌─────────────┐ │ 销售订单 │───>│ 发货通知单 │───>│ 销售出库单 │───>│ 出库完成 │ │ (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 ```java // 获取物料基本信息 MesMdItemDO item = itemService.getItem(itemId); // 批量获取物料信息 Map 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 = 计算结果 |