种子质检原逻辑:质检合格后**整批**将仓库批次库存从暂存库(10)转为合格库(20),一袋合格即整批放行,颗粒度过粗。
本次改造为**按袋码粒度**:质检只针对被扫的那一袋,合格仅将该袋对应库存从暂存库转入合格库,同批次其他袋保持暂存库待检;同时给每袋打上质检标记(qc_status),销售出库扫袋码/托盘时校验已质检合格才允许出库。
mes_wm_material_stock 分页:同批次可能同时出现暂存库与合格库两条记录,状态列已按字典展示文字)本次**无新增/修改接口**,均为既有接口的校验语义与数据流转变化。
| 方法 | 路径 | 说明 |
|---|---|---|
| POST | /mes/qc/seed-quality/submit |
提交种子质检(按袋码) |
请求参数(不变):
| 参数 | 类型 | 必填 | 说明 |
|---|---|---|---|
| code | String | 是 | 袋码(扫码内容),**必须为有效袋码** |
| batchCode | String | 否 | 生产批次号(兼容预留) |
| indicators | Array | 是 | 四项指标(purity/cleanliness/germination_rate/moisture) |
| reason | String | 否 | 备注 |
响应(不变): { "code": 0, "data": 质检记录ID }
| 方法 | 路径 | 说明 |
|---|---|---|
| POST | /mes/wm/product-sales/scan |
扫码拣货(袋码/托盘) |
请求参数(不变):
| 参数 | 类型 | 必填 | 说明 |
|---|---|---|---|
| salesId | Long | 是 | 销售出库单ID |
| scanContent | String | 是 | 袋码或托盘码 |
| quantity | BigDecimal | 否 | 出库数量(缺省用行数量) |
响应(不变): 沿用 MesWmProductSalesScanRespVO,availableQuantity/outboundQuantity 均基于**合格库**库存计算。
| 场景 | 原行为 | 新行为 |
|---|---|---|
| 种子质检提交非袋码 | 兼容批次码提交 | 报错「未解析到有效袋码,种子质检必须以袋码提交」 |
| 质检合格 | 整批暂存库→合格库 | 仅该袋:暂存库 -1、合格库 +1(同批次其他袋仍为暂存库);袋码 qc_status=20 |
| 质检不合格 | 无库存变化 | 该袋从暂存库存清除(报废);袋码 qc_status=30 |
| 销售出库扫袋码 | 不校验质检 | qc_status 必须为 20,否则报「该袋码未质检合格,禁止出库」 |
| 销售出库扫托盘 | 不校验质检 | 托盘下所有袋码 qc_status 必须为 20,否则报「托盘下存在未质检袋码,禁止整托出库」 |
| 销售出库选库存 | 可能选中暂存库记录 | 仅从合格库(20)记录中选数量足够的 |
同一次(入库仍按批次聚合)质检合格后,同批次 mes_wm_material_stock 会同时存在两条记录:
| 记录 | stock_state | 含义 | 是否可出库 |
|---|---|---|---|
| 暂存库 | 10 | 该批次未质检的剩余袋数 | 否 |
| 合格库 | 20 | 已质检合格、可销售的袋数 | 是 |
示例:批次入库 3 袋(quantity=3、暂存库)。质检合格 1 袋后 → 暂存库 quantity=2 + 合格库 quantity=1。
| 字段 | 展示位置 | 说明 |
|---|---|---|
| 质检状态(qc_status) | 种子质检提交结果反馈 | 前端无需展示,后端在第二次提交同一袋码时报「该袋码已质检,禁止重复提交」 |
| 库存状态 | 库存台账列表 | 同一物料/批次可能出现两条不同状态记录,均为正常现象 |
| 可出库数量 | 扫码拣货结果 | 以 availableQuantity 为准,只反映合格库库存 |
code 字段现在必须是系统中存在的有效袋码;仅传批次号不再被接受。availableQuantity 为准。