梳理人:老王 | 梳理时间:2026-06-03
数据来源:7份技术方案文档 + 代码库实际代码扫描
一、版本迭代历程
质检模块从0到1经历了以下迭代,每一版都是前一版的改造和扩展:
timeline
title 质检模块迭代时间线
2025-04 : MVP版本(迭代1.1) : 基础质检闭环
2025-04 : MVP版本(迭代1.2) : 加抽/全检/拆分任务
2025-05 : MVP迭代3 : 质检结果表/入库单/不良品处置
2025-05 : 1.0版本 : 装箱明细/质检结果Tab/入库记录/免在仓质检
2025-07 : 1.0版本优化 : 修改质检方式/不可接收品处置/数据权限
2025-08 : 1.0用户反馈优化 : AQL抽检/比例抽检/样本算法/标记未收货
2025-11 : 上线后优化迭代1&2 : 可/不可接收数持久化/退回供应商/中断质检
2026-02 : 上线后优化迭代3 : 退回修改质检结果/撤回处理表/自动创建入库单/Creeks消息提醒
| 版本 |
文档 |
核心变更 |
状态 |
| MVP 1.1 |
质检业务MVP版本 |
基础闭环:送货单→质检计划→质检任务→质检结果→创建入库单 |
✅ 已上线 |
| MVP 1.2 |
质检业务MVP版本 |
加抽、全检、任务拆分、任务图片 |
✅ 已上线 |
| MVP 迭代3 |
质检业务MVP版本-迭代3 |
质检结果表、入库记录、不良品处置(导入/导出) |
✅ 已上线 |
| 1.0版本 |
质检业务1.0版本 |
装箱明细、质检结果Tab、入库记录Tab、免在仓质检、灰度发布 |
✅ 已上线 |
| 1.0优化 |
质检业务1.0版本优化 |
修改质检方式、不可接收品处置表编辑/提交、数据权限控制 |
✅ 已上线 |
| 1.0用户反馈优化 |
质检业务1.0版本-用户反馈优化需求 |
AQL抽检/比例抽检、样本算法、标记未收货、质检员判定结果 |
✅ 已上线 |
| 上线后优化迭代1&2 |
质检上线后优化迭代1&2-20251201 |
可/不可接收数持久化、退回供应商、中断质检、自动判定 |
✅ 已上线 |
| 上线后优化迭代3 |
质检上线后优化迭代3 |
退回修改质检结果、撤回处理表、自动创建入库单、Creeks消息提醒 |
✅ 已上线 |
二、核心业务流程
2.1 全流程概览
flowchart TD
A["跟单员导入送货单"] --> B["编辑送货单/补充装箱明细"]
B --> C["提交送货单,自动创建质检计划"]
C --> D["仓库签收送货单"]
D --> E{"是否质检?"}
E -->|"否 或 工厂质检"| F["自动生成免检入库记录"]
E -->|"是 仓库质检"| G["质检主管创建质检任务"]
G --> H["质检员执行质检"]
H --> I{"需要加抽或全检?"}
I -->|"是"| J["加抽/全检,回到执行质检"]
J --> H
I -->|"否"| K["提交质检结果"]
K --> L{"所有任务完成?"}
L -->|"否"| H
L -->|"是"| M["系统自动判定或质检员手动判定"]
M --> N{"有不可接收品?"}
N -->|"否"| O["创建入库单,壹拓WMS上架"]
N -->|"是"| P["导出不合格品处置表"]
P --> Q["编辑处置方案:让步接收/维修合格/退供"]
Q --> R["导入处置方案并提交处置表"]
R --> S["根据可入库记录创建入库单"]
S --> O
F --> O
style A fill:#e1f5fe
style O fill:#c8e6c9
style N fill:#fff3e0
2.2 送货单生命周期
stateDiagram-v2
[*] --> 待确认 : 导入送货单
待确认 --> 送货中 : 提交送货单<br/>(自动创建质检计划)
送货中 --> 待签收 : 退回待签收
送货中 --> 仓库处理中 : 仓库签收
待签收 --> 仓库处理中 : 仓库签收
仓库处理中 --> 已完结 : 所有产品完成入库
2.3 质检计划生命周期
stateDiagram-v2
[*] --> 待确认 : 提交送货单时自动创建
待确认 --> 待质检 : 签收送货单
待质检 --> 质检中 : 开始质检任务
质检中 --> 已完成 : 所有产品完成质检<br/>或手动结束质检
质检中 --> 已完成 : 中断质检
2.4 质检任务生命周期
stateDiagram-v2
[*] --> 待质检 : 创建质检任务
待质检 --> 质检中 : 开始质检
质检中 --> 已完成 : 提交所有任务明细结果
待质检 --> 已取消 : 取消/释放任务
三、业务域核心概念
3.1 产品层级与质检维度
| 概念 |
说明 |
| SPU |
标准产品单元,如"衬衫" |
| SKC |
颜色维度,如"衬衫-黑色",定制类按SKC维度质检 |
| SKU |
最小库存单元(颜色+尺码),现货类按SKU维度质检 |
3.2 质检方式
| 方式 |
枚举值 |
说明 |
抽检数计算 |
| AQL抽检 |
2 |
按照AQL标准抽样 |
根据一般检测水平II类 + 样本算法(如0.1/0.2/...)按送货批量查表 |
| 比例抽检 |
3 |
按比例抽样 |
送货数量 × 抽检比例,加抽时递增0.1×n |
抽检 |
0 |
已废弃 |
- |
全检 |
1 |
已废弃,通过比例抽检100%实现 |
- |
3.3 判定结果
| 结果 |
枚举值 |
触发条件 |
| 可接收 |
1 |
不合格数=0(系统自动判定) |
| 不可接收 |
2 |
不合格数超标(系统自动判定或质检员手动判定) |
| 按结果接收 |
3 |
全检/100%抽检,不合格数>0但可接受(质检员手动判定) |
| 空 |
null |
质检员手动填写可/不可接收数 |
3.4 处置类型
| 类型 |
枚举值 |
说明 |
| 让步接收 |
1 |
轻微瑕疵,让步接收后可入库 |
| 维修后合格 |
2 |
维修复检合格后可入库 |
| 退供 |
3 |
退回供应商,触发采购库存调整 |
| 合格入库 |
4 |
可接收产品的正常入库 |
| 免检入库 |
5 |
免在仓质检的产品直接入库 |
3.5 不合格原因(11种)
材料问题、工艺问题、破损问题、二次工艺、印绣花工艺、规格问题、版型问题、外观问题、包装问题、功能问题、性能问题
四、数据模型
4.1 ER关系图
erDiagram
PURCHASE_RECEIPT_ORDER ||--o{ PURCHASE_RECEIPT_ORDER_DETAIL : "送货单明细"
PURCHASE_RECEIPT_ORDER ||--o{ PURCHASE_RECEIPT_BOX_INFO : "装箱信息"
PURCHASE_RECEIPT_BOX_INFO ||--o{ PURCHASE_RECEIPT_BOX_DETAIL : "箱子明细"
PURCHASE_RECEIPT_ORDER ||--|{ PURCHASE_RECEIPT_QUALITY_RELATION : "关联质检计划"
PURCHASE_RECEIPT_QUALITY_RELATION }o--|| QUALITY_INSPECTION_PLAN : "质检计划"
QUALITY_INSPECTION_PLAN ||--o{ QUALITY_INSPECTION_PLAN_DETAIL : "计划明细"
QUALITY_INSPECTION_PLAN_DETAIL ||--o{ QUALITY_INSPECTION_TASK : "质检任务"
QUALITY_INSPECTION_PLAN_DETAIL ||--o{ QUALITY_INSPECTION_ADD_RECORD : "加抽记录"
QUALITY_INSPECTION_PLAN_DETAIL ||--o{ QUALITY_INSPECTION_DISPOSE : "处置方案"
QUALITY_INSPECTION_TASK ||--o{ QUALITY_INSPECTION_TASK_DETAIL : "任务明细"
QUALITY_INSPECTION_TASK ||--o{ QUALITY_INSPECTION_TASK_PIC : "任务图片"
QUALITY_INSPECTION_TASK_DETAIL }o--|| QUALITY_INSPECTION_PLAN_DETAIL : "关联计划明细"
QUALITY_INSPECTION_PLAN ||--o{ QUALITY_INSPECTION_LOG : "操作日志"
PURCHASE_RECEIPT_ORDER {
bigint id PK
varchar receipt_order_no "送货单号"
varchar purchase_order_type "货物类型(现货/定制)"
int receipt_order_status "单据状态"
varchar signer "签收人"
datetime sign_up_at "签收时间"
int container_num "箱数"
}
QUALITY_INSPECTION_PLAN {
bigint id PK
varchar plan_no "计划编号"
varchar purchase_order_type "货物类型"
varchar source_type "货物来源"
int status "状态(0待确认/1待质检/2质检中/3已完成)"
datetime start_time "开始质检时间"
datetime end_time "结束质检时间"
}
QUALITY_INSPECTION_PLAN_DETAIL {
bigint id PK
bigint plan_id FK "计划ID"
varchar product_sku_code "SKU编码"
varchar product_skc_code "SKC编码"
int inspection_quantity "待检数"
int min_sample_quantity "期望抽检数"
int accept_quantity "可接收数"
int reject_quantity "不可接收数"
int inspection_result "判定结果"
int quality_inspection_method "质检方式(2AQL/3比例)"
varchar quality_inspection_criteria "样本算法"
int inspection_required "是否质检(0否/1是)"
int disposal_status "处置状态(0待处理/1已处理)"
int status "状态(0待确认/1待质检/2质检中/3已完成)"
}
QUALITY_INSPECTION_TASK {
bigint id PK
bigint plan_id FK "计划ID"
varchar task_no "任务编号"
int total_quantity "待检总数"
int status "状态(0待质检/1质检中/2已完成)"
}
QUALITY_INSPECTION_TASK_DETAIL {
bigint id PK
bigint task_id FK "任务ID"
bigint plan_detail_id FK "计划明细ID"
int sample_quantity "期望抽检数"
int actual_quantity "实际抽检数"
int accept_quantity "合格数"
int reject_quantity "不合格数"
varchar reject_reason "不合格原因(逗号分隔)"
int status "状态(0待质检/1质检中/2已完成)"
}
QUALITY_INSPECTION_DISPOSE {
bigint id PK
bigint plan_detail_id FK "计划明细ID"
int quantity "数量"
int type "处置类型(1让步/2维修/3退供/4合格/5免检)"
varchar inbound_order_no "入库单号"
}
QUALITY_INSPECTION_ADD_RECORD {
bigint id PK
bigint plan_detail_id FK "计划明细ID"
varchar batch_no "批次号"
int sample_quantity "抽检数"
}
QUALITY_INSPECTION_TASK_PIC {
bigint id PK
bigint task_id FK "任务ID"
varchar url "图片URL"
}
QUALITY_INSPECTION_LOG {
bigint id PK
bigint business_id "业务ID"
int business_type "业务类型(1计划/2计划明细/3任务/4任务明细)"
varchar operate_type "操作类型"
varchar contents "日志内容"
}
4.2 数据库归属
| 数据库 |
表 |
说明 |
| creeks_purchasing |
以上全部质检相关表 |
质检核心数据全部在采购服务 |
| creeks_inventory |
inv_inbound_receipt.quality_inspected |
入库单上的"是否已质检"标记 |
| dbwms_interfaceplatform |
syncinvoucher.qualityInspected |
壹拓WMS同步表上的质检标记 |
五、接口全景
5.1 送货单相关接口
| 接口 |
路径 |
说明 |
版本 |
| 导入送货单(自动匹配采购单) |
POST /api/v2/receipt/order/import |
新版导入 |
1.0 |
| 导入送货单(指定采购单) |
POST /api/v2/receipt/order/import |
指定采购单 |
用户反馈优化 |
| 导入送货单(自动匹配新版) |
POST /api/v2/receipt/order/importNewAutoMatchPurchase |
新版匹配 |
用户反馈优化 |
| 导入装箱单创建送货单 |
POST /api/v2/receipt/order/importOrderByBoxCreateAsync |
已废弃 |
用户反馈优化弃用 |
| 导入装箱明细创建送货单 |
- |
新版装箱导入 |
迭代3 |
| 导入装箱明细(指定采购单) |
POST /api/v2/receipt/order/importBoxDetailWithOrder |
指定采购单 |
迭代3 |
| 补充装箱明细 |
POST /api/v2/receipt/order/importOrderByBoxSupplementAsync |
补充装箱 |
1.0 |
| 查询装箱明细 |
POST /api/v2/receipt/order/queryReceiptDetailByBox |
查看装箱 |
1.0 |
| 编辑送货单 |
POST /api/v2/receipt/order/edit |
编辑 |
1.0 |
| 编辑前校验 |
POST /api/v2/receipt/order/editCheck |
校验是否弹窗 |
用户反馈优化 |
| 提交送货单 |
POST /api/v2/receipt/order/submit |
提交 |
MVP |
| 签收送货单 |
POST /api/v2/receipt/order/sign |
签收 |
MVP |
| 查询送货单列表(新版) |
POST /api/v2/receipt/order/list |
仓库处理中tab |
1.0 |
| 送货单详情 |
GET /api/v2/receipt/order/{id} |
详情 |
1.0 |
| 退回送货中 |
POST /api/v2/receipt/order/returnOrderDeliveringStatus |
退回 |
1.0优化 |
| 签收后退回待签收 |
POST /api/v2/receipt/order/returnOrderWaitSignStatus |
撤销签收 |
1.0优化 |
| 仓库处理中Tab条数 |
POST /api/v2/receipt/order/queryProcessingTabCount |
四种过滤 |
1.0 |
| 导出送货单质检结果 |
POST /api/v2/receipt/order/exportReceiptListQualityResult |
按单据维度 |
1.0优化 |
| 导出送货单(货物维度) |
POST /api/v2/receipt/order/exportOrderDetailBySkuDimension |
SKU维度 |
用户反馈优化 |
| 退回供应商 |
POST /api/v2/receipt/order/returnSupplier |
退供库存调整 |
迭代1&2 |
5.2 质检计划相关接口
| 接口 |
路径 |
说明 |
| 创建质检计划 |
POST /api/v1/quality/inspection/plan/create |
指定SKU+质检方式 |
| 导入创建质检计划 |
POST /api/v1/quality/inspection/importCreatePlan |
批量导入 |
| 修改质检方式 |
POST /api/v1/quality/inspection/modifyQualityInspectionMethod |
含是否质检 |
| 查询质检计划列表 |
POST /api/v1/quality/inspection/plan/list |
分页查询 |
| 查询质检计划详情 |
GET /api/v1/quality/inspection/plan/{id} |
基础信息 |
| 查询计划明细列表 |
POST /api/v1/quality/inspection/plan/detail/list |
SKC/SKU展开 |
| 查询计划明细子列表 |
GET /api/v1/quality/inspection/plan/detail/subList |
SKU展开 |
| 查询计划批次 |
POST /api/v1/quality/inspection/plan/batch |
加抽记录 |
| 查询计划汇总数据 |
POST /api/v1/quality/inspection/plan/summary |
货物总数+期望抽检数 |
| 结束质检计划 |
POST /api/v1/quality/inspection/completePlan |
手动结束 |
| 中断质检 |
POST /api/v1/quality/inspection/interrupt |
提前结束+填写可/不可接收数 |
| 导出所有计划明细 |
POST /api/v1/quality/inspection/plan/detailList/export |
全量导出 |
| 获取可加抽数 |
POST /api/v1/quality/inspection/plan/detail/canAddNum |
加抽前判断 |
| 加抽 |
POST /api/v1/quality/inspection/task/detail/addNum |
AQL/比例加抽 |
| 全检 |
POST /api/v1/quality/inspection/task/detail/addNumAll |
100%抽检 |
| 质检员给出判定结果 |
POST /api/v1/quality/inspection/plan/judgment |
手动判定 |
| 判定结果前校验 |
POST /api/v1/quality/inspection/plan/judgmentCheck |
提前结束提示 |
| 标记未收到货 |
POST /api/v1/quality/inspection/markUnReceived |
标记未收货 |
| 查询操作日志 |
POST /api/v1/quality/inspection/plan/getQualityOptLog |
日志查看 |
5.3 质检任务相关接口
| 接口 |
路径 |
说明 |
| 创建质检任务 |
POST /api/v1/quality/inspection/task/create |
按SKU+数量 |
| 查询任务列表 |
POST /api/v1/quality/inspection/task/list |
分页查询 |
| 查询任务详情 |
GET /api/v1/quality/inspection/task/{id} |
基础信息 |
| 查询任务明细 |
POST /api/v1/quality/inspection/task/detail/list |
批次+SKU |
| 查询任务关联的计划明细 |
POST /api/v1/quality/inspection/task/relatedPlanDetails |
方便判定 |
| 查看可拆分明细 |
POST /api/v1/quality/inspection/task/detail/waitSplit |
拆分前 |
| 拆分质检任务 |
POST /api/v1/quality/inspection/task/split |
按数量拆分 |
| 开始质检 |
POST /api/v1/quality/inspection/task/start |
开始 |
| 释放任务 |
POST /api/v1/quality/inspection/task/release |
取消 |
| 编辑保存质检结果 |
POST /api/v1/quality/inspection/task/detail/save |
含实际抽检数+判定 |
| 提交质检结果 |
POST /api/v1/quality/inspection/task/detail/submit |
提交 |
| 导入质检结果 |
POST /api/v1/quality/inspection/importQualityTaskResult |
Excel导入 |
| 导出任务明细 |
POST /api/v1/quality/inspection/task/detail/export |
Excel导出 |
| 上传任务图片 |
POST /api/v1/quality/inspection/task/picture/upload |
七牛云 |
| 删除任务图片 |
POST /api/v1/quality/inspection/task/picture/delete |
删除 |
| 退回修改质检结果前校验 |
POST /api/v1/quality/inspection/task/detail/returnModifyCheck |
校验 |
| 退回修改质检结果 |
POST /api/v1/quality/inspection/task/detail/returnModify |
修改已提交结果 |
| 校验是否可编辑判定结果 |
POST /api/v1/quality/inspection/checkLastFinishTask |
编辑前校验 |
| 修改任务质检员 |
- |
变更质检员 |
5.4 质检结果与入库相关接口
| 接口 |
路径 |
说明 |
| 查询质检结果 |
POST /api/v1/quality/inspection/getQualityResult |
送货单维度 |
| 查询质检结果子列表 |
POST /api/v1/quality/inspection/getQualityResultSub |
SKC展开 |
| 导出质检结果 |
POST /api/v1/quality/inspection/exportQualityResult |
不合格品处置表 |
| 编辑不可接收品处理表 |
POST /api/v2/receipt/order/saveDisposeTable |
让步/维修/退供 |
| 提交不可接收品处理表 |
POST /api/v2/receipt/order/submitDisposeTable |
提交处置 |
| 导入不合格品处置表 |
POST /api/v1/quality/inspection/importDisposeTable |
导入处置 |
| 撤回处理表 |
POST /api/v1/quality/inspection/revokeDisposeTable |
撤回已提交方案 |
| 查询入库记录 |
POST /api/v1/quality/inspection/getInboundRecord |
可入库产品 |
| 根据入库记录创建入库单 |
POST /api/v1/quality/inspection/createInboundByRecord |
勾选创建 |
5.5 其他接口
| 接口 |
路径 |
说明 |
| 获取质检企业白名单 |
GET /api/v1/receipt/order/enterprises/whiteList |
灰度发布 |
| 查询质检员 |
- |
质检主管/质检员角色 |
| 查询质检员 |
- |
质检主管/质检员角色 |
5.6 接口详细处理逻辑
以下按业务模块分类,描述每个核心接口的完整处理流程。
Controller入口统一在 QualityInspectionController(路径前缀 /remote/quality/inspection)和 PurchaseReceiptOrderControllerV2(路径前缀 /remote/purchase/receipt/v2)。
5.6.1 送货单管理接口
(1)提交送货单
| 属性 |
值 |
| 路径 |
POST /remote/purchase/receipt/v2/submit |
| 代码 |
ReceiptServiceV2Impl#submitOrder → executeSubmitOrder |
| 权限 |
receipt_order_commit_new |
flowchart TD
A["校验送货单存在且状态=送货中"] --> B["校验送货单明细非空"]
B --> C["查询质检计划明细,校验非空<br/>缺少质检计划无法提交"]
C --> D["校验质检计划SKU与送货单明细匹配"]
D --> E["校验采购单状态和最大送货量"]
E --> F["加分布式锁"]
F --> G["事务处理:"]
G --> G1["更新送货中数量=计划送货数量"]
G1 --> G2["变更采购库存:待送货减少,送货中增加"]
G2 --> G3["更新采购单状态和明细"]
G3 --> G4["送货单状态改为待签收"]
G4 --> G5["记录操作日志"]
关键校验:送货单明细必须有对应的质检计划;每个SKU都必须在质检计划中存在。
(2)签收送货单
| 属性 |
值 |
| 路径 |
POST /remote/purchase/receipt/v2/signUp |
| 代码 |
ReceiptServiceV2Impl#signUpOrder → executeSignOrder |
| 权限 |
receipt_order_sign_new |
flowchart TD
A["校验送货单存在且状态=待签收"] --> B["校验箱数>0"]
B --> C["灰度判断:进入待质检 or 仓库处理中"]
C --> D["事务处理:"]
D --> D1["更新送货单状态、签收人、签收时间"]
D1 --> D2["更新质检计划状态为待质检<br/>设置可开始质检时间=签收时间"]
D2 --> D3["更新需质检的计划明细状态为待质检"]
D3 --> D4["为免检货物创建免检入库记录<br/>(处置类型=免检入库)"]
D4 --> D5["记录签收操作日志"]
D5 --> D6{"全部货物免检?"}
D6 -->|"是"| D7["自动创建入库单"]
D6 -->|"否"| D8["结束"]
D7 --> D8
关键逻辑:签收时区分「需质检」和「免质检」货物,免质检货物直接生成可入库记录;如果全部免检则自动创建入库单。
(3)退回送货中
| 属性 |
值 |
| 路径 |
POST /remote/purchase/receipt/v2/returnOrderDeliveringStatus |
| 代码 |
ReceiptServiceV2Impl#returnOrderDeliveringStatus |
| 权限 |
receipt_order_return_status |
处理流程:
- 校验送货单存在且状态=待签收
- 加分布式锁
- 事务处理:送货中数量清零 → 采购库存变更(送货中减少、待送货增加)→ 更新采购单状态 → 送货单状态改为送货中
(4)签收后退回待签收
| 属性 |
值 |
| 路径 |
POST /remote/purchase/receipt/v2/returnOrderWaitSignStatus |
| 代码 |
ReceiptServiceV2Impl#returnOrderWaitSignStatus |
| 权限 |
receipt_order_return_wait_sign_status |
处理流程:
- 校验送货单存在且状态=仓库处理中
- 校验无质检任务(有则不可退回)
- 校验无入库单(有则不可退回)
- 送货单状态改为待签收,清空签收时间
- 质检计划状态回退为待确认,清空可开始质检时间
- 质检计划明细状态回退为待确认
(5)仓库处理中Tab条数查询
| 属性 |
值 |
| 路径 |
POST /remote/purchase/receipt/v2/queryProcessingTabCount |
| 代码 |
ReceiptServiceV2Impl#queryProcessingTabCount |
处理流程:分别调用4次SQL查询,返回四种过滤条件的计数:
allCount:全部仓库处理中的送货单
noDisposeCount:至少有一个不可接收品未处理的送货单
noInboundCount:质检完成但未全部创建入库单的送货单
createdInboundCount:已创建入库单的送货单
5.6.2 质检计划管理接口
(1)创建质检计划
| 属性 |
值 |
| 路径 |
POST /remote/quality/inspection/plan/create |
| 代码 |
QualityInspectionBizServiceImpl#createPlan → executeCreatePlan |
| 权限 |
quantity_plan_create |
flowchart TD
A["校验请求参数<br/>(SKU编码、质检方式、样本算法等)"] --> B["查询送货单,校验存在性"]
B --> C{"是否已存在质检计划?"}
C -->|"是"| D["抛异常:已存在质检计划"]
C -->|"否"| E["加分布式锁"]
E --> F["事务处理:"]
F --> F1["保存质检计划(状态=待确认)<br/>生成计划编号QIP"]
F1 --> F2["保存送货单与质检计划关联关系"]
F2 --> F3["合并送货单明细到创建项"]
F3 --> F4["根据质检方式构建计划明细:<br/>- 免质检:最小抽检数=0<br/>- AQL抽检:按AQL算法计算<br/>- 比例抽检:按比例计算"]
F4 --> F5["批量保存质检计划明细"]
F5 --> F6["为每条明细新增初始加抽记录"]
F6 --> F7["保存操作日志"]
抽检数计算规则:
- AQL抽检:根据一般检测水平II类 + 送货批量 → 查AQL表得出样本量 → 按SKU数量占比分摊
- 比例抽检:最小抽检数 = 送货数量 × 抽检比例
(2)导入创建质检计划
| 属性 |
值 |
| 路径 |
POST /remote/quality/inspection/importCreatePlan |
| 代码 |
QualityInspectionBizServiceImpl#importSkuCreatePlan |
| 权限 |
quantity_plan_create |
处理流程:
- 根据导入数据中的送货单号查询送货单列表
- 校验必填项(送货单号存在、SKU编码、是否质检、质检方式、样本算法)
- 校验唯一性(送货单号+SKU编码不能重复)
- 有错误直接返回校验结果,不执行保存
- 按送货单号分组,遍历每组调用
createPlan
(3)修改质检方式
| 属性 |
值 |
| 路径 |
POST /remote/quality/inspection/modifyQualityInspectionMethod |
| 代码 |
QualityInspectionBizServiceImpl#modifyQualityInspectionMethod → execModifyQualityInspectionMethod |
flowchart TD
A["校验送货单状态合法<br/>(待签收/仓库处理中)"] --> B["校验无质检任务产生"]
B --> C["校验无入库单产生"]
C --> D["校验SKU在计划明细中存在"]
D --> E["加分布式锁"]
E --> F["事务处理:"]
F --> F1["对比新旧字段差异<br/>(质检方式/地点/样本算法/是否质检)"]
F1 --> F2["重新计算期望抽检数"]
F2 --> F3["更新计划明细、加抽记录"]
F3 --> F4{"是否质检由是改否?"}
F4 -->|"是"| F5["创建免检入库记录"]
F4 -->|"否"| F6{"是否质检由否改是?"}
F6 -->|"是"| F7["删除免检入库记录<br/>状态改为待质检"]
F5 --> F8["记录变更日志"]
F6 -->|"否"| F8
F7 --> F8
(4)删除质检计划
| 属性 |
值 |
| 路径 |
POST /remote/quality/inspection/plan/remove |
| 代码 |
QualityInspectionBizServiceImpl#removePlan |
处理流程:
- 查询质检计划,校验状态必须为「待确认」
- 删除计划明细关联的入库记录(处置方案)
- 删除质检计划
- 记录操作日志
(5)结束质检计划
| 属性 |
值 |
| 路径 |
POST /remote/quality/inspection/completePlan |
| 代码 |
QualityInspectionBizServiceImpl#completePlan → execCompletePlan → completePartPlan/completeWholePlan |
| 权限 |
quantity_plan_complete |
flowchart TD
A["查询质检计划"] --> B["加分布式锁"]
B --> C{"planDetailIds是否为空?"}
C -->|"是(整计划结束)"| D["completeWholePlan"]
C -->|"否(部分结束)"| E["completePartPlan"]
D --> F["校验计划状态=质检中"]
E --> G["查询指定的计划明细<br/>过滤免质检的"]
F --> H["按SKC/SKU维度校验<br/>所有任务明细是否已完成"]
G --> H
H --> I["批量更新明细状态为已完成"]
I --> J["回写不合格数量和原因到送货单明细"]
J --> K{"所有明细都完成?"}
K -->|"是"| L["更新计划状态为已完成"]
K -->|"否"| M["保持质检中"]
L --> N["处理合格产品:自动创建合格入库记录<br/>不合格数=0则自动标记处置状态=已提交"]
M --> N
自动处置逻辑:合格产品(不合格数=0)自动标记处置状态为「已提交」,并创建合格入库类型的可入库记录。
(6)中断质检
| 属性 |
值 |
| 路径 |
POST /remote/quality/inspection/interrupt |
| 代码 |
QualityInspectionBizServiceImpl#qualityInspectionInterrupt → execQualityInspectionInterrupt |
| 权限 |
quantity_inspection_interrupt |
flowchart TD
A["参数校验"] --> B["校验计划存在"]
B --> C["校验计划明细状态=待质检或质检中<br/>且无判定结果"]
C --> D["校验可接收数+不可接收数=计划送货量"]
D --> E["加分布式锁"]
E --> F["事务处理:"]
F --> F1["设置明细的可接收数、不可接收数<br/>状态改为已完成"]
F1 --> F2["构建已完成的任务明细列表"]
F2 --> F3["批量更新任务明细、计划明细"]
F3 --> F4{"所有明细都完成?"}
F4 -->|"是"| F5["完成计划"]
F4 -->|"否"| F6["保持质检中"]
F5 --> F7["创建合格入库记录"]
F6 --> F7
F7 --> F8{"满足自动创建入库单条件?"}
F8 -->|"是"| F9["自动创建入库单"]
F8 -->|"否"| F10["发送不合格品待处理消息"]
F9 --> F10
5.6.3 质检任务管理接口
(1)创建质检任务
| 属性 |
值 |
| 路径 |
POST /remote/quality/inspection/task/create |
| 代码 |
QualityInspectionBizServiceImpl#createTask → executeCreateTask |
| 权限 |
quantity_plan_create |
flowchart TD
A["校验请求参数<br/>(计划ID、质检员、SKU列表、分配数量)"] --> B["校验计划存在且未完成<br/>可开始质检时间已设置"]
B --> C["校验明细状态未完成<br/>分配数量合法(非负、不超待创建数)"]
C --> D["加分布式锁(计划维度)"]
D --> E["事务处理:"]
E --> E1["更新计划明细的已创建任务数量"]
E1 --> E2["保存质检任务(状态=待开始)<br/>生成任务编号QIT"]
E2 --> E3["为每个SKU创建质检任务明细<br/>期望抽检数=分配数量"]
E3 --> E4["记录操作日志"]
(2)拆分质检任务
| 属性 |
值 |
| 路径 |
POST /remote/quality/inspection/task/split |
| 代码 |
QualityInspectionBizServiceImpl#splitTask → executeSplitTask |
| 权限 |
quantity_task_split |
处理流程:
- 校验任务和计划存在且未完成
- 加分布式锁(计划维度)
- 按SKU拆分:旧任务明细的期望抽检数减少拆分数量(为0则删除)
- 不允许全部拆分(至少保留1个明细)
- 创建新任务,新任务明细的期望抽检数=拆分数量
- 记录操作日志
(3)开始质检
| 属性 |
值 |
| 路径 |
POST /remote/quality/inspection/startTask |
| 代码 |
QualityInspectionBizServiceImpl#startTask → execStartTask |
| 权限 |
quantity_task_start |
处理流程:
- 校验任务存在且状态=待开始
- 校验每个计划明细的待创建任务数为0(即所有任务都已创建)
- 更新任务开始时间
- 任务明细状态:待质检 → 质检中
- 首次开始质检时:计划状态改为质检中,计划明细状态改为质检中
- 记录操作日志
(4)编辑保存质检结果
| 属性 |
值 |
| 路径 |
POST /remote/quality/inspection/task/detail/save |
| 代码 |
QualityInspectionBizServiceImpl#saveTaskDetailResult → QualityInspectionTaskSaveService#executeSaveTaskDetailResult |
| 权限 |
quantity_task_result_edit |
flowchart TD
A["校验操作人信息"] --> B["查询任务、计划、任务明细"]
B --> C["加分布式锁(任务维度)"]
C --> D["遍历每个SaveItem:"]
D --> D1["校验任务明细存在"]
D1 --> D2["校验未到可开始时间不允许保存"]
D2 --> D3["校验任务已完成不允许保存"]
D3 --> D4["校验:不合格数>0时必须选择不合格原因"]
D4 --> D5["校验:不合格数不能大于实际抽检数"]
D5 --> D6["校验:同SKU所有任务实际抽检数总和<br/>不能大于计划送货量"]
D6 --> D7["更新任务明细:<br/>实际抽检数、合格数=实际抽检数-不合格数<br/>不合格原因、质检说明"]
D7 --> D8["构建变更日志(对比新旧值)"]
D8 --> D9["批量更新任务明细"]
D9 --> D10["批量保存日志"]
合格数计算:合格数 = 实际抽检数 - 不合格数(系统自动计算,无需用户填写)
(5)提交质检结果
| 属性 |
值 |
| 路径 |
POST /remote/quality/inspection/task/detail/submit |
| 代码 |
QualityInspectionBizServiceImpl#submitTaskDetailResult → QualityInspectionTaskSubmitService#executeSubmitTaskDetailResult |
| 权限 |
quantity_task_result_submit |
flowchart TD
A["校验操作人、任务和计划存在"] --> B["校验任务和计划状态"]
B --> C["校验质检图片<br/>(不合格数>0时必须上传图片)"]
C --> D["校验质检结果数量<br/>(实际抽检数不为空)"]
D --> E["遍历提交的任务明细:"]
E --> E1["状态改为已完成"]
E1 --> E2["记录提交日志"]
E2 --> E3["批量更新任务明细"]
E3 --> F{"该任务所有明细都完成?"}
F -->|"是"| G["任务状态改为已完成"]
F -->|"否"| H["继续"]
G --> I{"该计划所有任务都完成?"}
H --> I
I -->|"是"| J["填充计划完成时间"]
I -->|"否"| K["触发自动判定"]
J --> K
K --> L["自动判定逻辑:<br/>- 全检完成→按结果接收<br/>- 抽检且不合格数=0→可接收"]
L --> M{"满足自动创建入库单条件?"}
M -->|"是"| N["自动创建入库单"]
M -->|"否"| O["结束"]
N --> O
自动判定触发条件:
- 产品的所有任务明细都已完成
- 待创建任务数=0
- 实际抽检数=期望抽检数
- 全检:自动判定为「按结果接收」
- 抽检+不合格数=0:自动判定为「可接收」
(6)退回修改质检结果
| 属性 |
值 |
| 路径 |
POST /remote/quality/inspection/task/detail/returnModify |
| 代码 |
QualityInspectionBizServiceImpl#returnModifyTaskDetailResult → execReturnModifyTaskDetailResult |
| 权限 |
quantity_task_result_return_modify |
flowchart TD
A["退回修改前校验:"] --> A1["SKU没有关联入库单"]
A1 --> A2["AQL抽检时同SKC下其他SKU也没有入库单"]
A2 --> A3["不可接收品处理表未提交"]
A3 --> B["加分布式锁(计划维度)"]
B --> C["事务处理:"]
C --> C1["更新任务明细数值<br/>(保持FINISH状态)"]
C1 --> C2["记录变更日志"]
C2 --> C3["删除旧的合格入库处置方案"]
C3 --> C4["重新计算判定结果:<br/>- 全部合格→可接收<br/>- 全检→按结果接收<br/>- 有不合格→清空等用户判定"]
C4 --> C5["重置计划明细状态为质检中"]
C5 --> C6["触发自动完成质检"]
C6 --> C7["记录处置方案变更日志"]
(7)加抽/全检
| 属性 |
值 |
| 路径 |
POST /remote/quality/inspection/plan/detail/addNum(加抽)/ addNumAll(全检) |
| 代码 |
QualityInspectionBizServiceImpl#addSampleNum → executeAddSampleNum |
| 权限 |
quantity_plan_add_num / quantity_plan_add_all |
flowchart TD
A["查询计划,校验存在"] --> B["校验加抽参数"]
B --> C["校验计划明细未完成"]
C --> D["校验非重复加抽<br/>(关联任务明细必须已完成)"]
D --> E["加分布式锁(计划维度)"]
E --> F["事务处理:"]
F --> F1{"质检方式?"}
F1 -->|"比例抽检"| F2["加抽数 = 送货量 × (初始比例 + 0.1×n)<br/>n=第几次加抽"]
F1 -->|"AQL抽检"| F3["按AQL算法查表计算下一档样本量"]
F2 --> F4["生成批次号"]
F3 --> F4
F4 --> F5["更新计划明细的最小抽检数"]
F5 --> F6["清空判定结果、可接收数、不可接收数"]
F6 --> F7["删除已有的可入库记录"]
F7 --> F8["保存加抽记录和日志"]
加抽后重置:加抽/全检后会清空之前已有的判定结果和可入库记录,回到「质检中」状态。
5.6.4 质检结果与判定接口
(1)质检员给出判定结果
| 属性 |
值 |
| 路径 |
POST /remote/quality/inspection/plan/judgment |
| 代码 |
QualityInspectionBizServiceImpl#inspectorJudgmentResult → execInspectorJudgmentResult |
| 权限 |
judgment_inspection_result |
flowchart TD
A["构建计划任务信息<br/>(计划、明细Map、任务明细Map)"] --> B["校验每个判定项:"]
B --> B1["明细状态=质检中"]
B1 --> B2["待创建任务数=0"]
B2 --> B3["至少有一个完成的任务明细"]
B3 --> C{"判定结果?"}
C -->|"可接收"| D["校验所有任务明细已完成"]
C -->|"不可接收"| E["收集需要提前结束的产品列表"]
D --> F["加分布式锁"]
E --> F
F --> G["事务处理:"]
G --> G1["如有需提前结束的产品:<br/>结束关联任务明细→完成任务→更新计划时间"]
G1 --> G2["更新判定结果、设置可接收数/不可接收数"]
G2 --> G3["记录判定日志"]
G3 --> G4{"判定为可接收且不合格数=0?"}
G4 -->|"是"| G5["自动触发结束质检"]
G4 -->|"否"| G6{"有不合格品待处理?"}
G5 --> G6
G6 -->|"是"| G7["发送Creeks消息提醒"]
G6 -->|"否"| G8["结束"]
G7 --> G8
可接收数/不可接收数计算规则:
- 判定「可接收」:不可接收数=所有批次不合格数总和,可接收数=送货量-不可接收数
- 判定「不可接收」:不可接收数=送货量,可接收数=0
- 判定「按结果接收」:不可接收数=所有批次不合格数总和,可接收数=送货量-不可接收数
- 判定「空」:由跟单/质检员手动填写
(2)查询质检结果(质检结果Tab)
| 属性 |
值 |
| 路径 |
POST /remote/quality/inspection/getQualityResult |
| 代码 |
QualityInspectionQueryBizServiceImpl#getQualityResult |
处理流程:
- 根据收货单ID查询质检计划
- 查询SKC/SKU级别的质检结果(mapper聚合查询)
- 填充富信息:处置方案(让步接收/维修/退供数量)、箱号、任务数据、不合格原因
- 若为SKC维度,汇总子SKU的合格数/不合格数/未抽检数等
- 返回结果列表
5.6.5 不良品处置接口
(1)编辑不可接收品处理表
| 属性 |
值 |
| 路径 |
POST /remote/quality/inspection/saveDisposeTable |
| 代码 |
QualityInspectionBizServiceImpl#saveDisposeTable |
| 权限 |
save_disposeTable |
处理流程:
- 校验计划明细状态=已完成
- 校验处置状态未提交(已提交不可编辑)
- 校验让步接收+维修合格+退供=不可接收数
- 分别为三种处置类型构建处置记录
- 与已有记录对比分类(新增/更新/删除)
- 批量执行数据库操作,记录变更日志
(2)提交不可接收品处理表
| 属性 |
值 |
| 路径 |
POST /remote/quality/inspection/submitDisposeTable |
| 代码 |
QualityInspectionBizServiceImpl#submitDisposeTable |
| 权限 |
submit_disposeTable |
处理流程:
- 查询处置方案和质检结果
- 校验:不可接收数=0的跳过;不可接收数>0的,处置总量必须等于不可接收数
- 校验不重复提交
- 提交处置方案,更新计划明细处置状态为已提交
- 提交后检查是否还有待创建入库单的记录,如有则发送Creeks消息提醒
(3)导入不合格品处置表
| 属性 |
值 |
| 路径 |
POST /remote/quality/inspection/importDisposeTable |
| 代码 |
QualityInspectionBizServiceImpl#importDisposeTable |
| 权限 |
receipt_order_import_reject_dispose |
处理流程:
- 校验没有入库单已产生
- 查询质检结果和计划明细
- 遍历导入数据逐条校验(SKU存在、处置数量合规)
- 有错误直接返回校验结果,不执行保存
- 与已有处置记录对比分类(新增/更新/删除),批量执行
(4)撤回处理表
| 属性 |
值 |
| 路径 |
POST /remote/quality/inspection/dispose/revoke |
| 代码 |
QualityInspectionBizServiceImpl#revokeDisposeTable → execRevokeDisposeTable |
| 权限 |
revoke_dispose_table |
flowchart TD
A["校验操作人、送货单、计划明细存在"] --> B["校验所有明细处置状态=已提交"]
B --> C["校验非免检货物"]
C --> D["校验处置记录未创建入库单"]
D --> E["事务处理:"]
E --> E1{"仅有退供处置?"}
E1 -->|"是"| E2["退回退供库存:<br/>采购库存送货中减少、待送货增加<br/>采购单/采购申请同步调整"]
E1 -->|"否"| E3["跳过库存回退"]
E2 --> E4["删除除合格入库和免检入库外的<br/>所有处置记录"]
E3 --> E4
E4 --> E5["重置计划明细处置状态为待提交"]
E5 --> E6["更新送货单状态为仓库处理中"]
E6 --> E7["记录撤回操作日志"]
(5)退回供应商
| 属性 |
值 |
| 路径 |
POST /remote/quality/inspection/returnSupplier |
| 代码 |
QualityInspectionBizServiceImpl#returnSupplier |
| 权限 |
quantity_return_supplier |
处理流程:
- 校验处置记录存在且类型非退供
- 按计划明细分组处置记录
- 已有退供记录则累加数量,否则新建退供记录
- 删除选中的非退供类型记录
- 执行退供库存调整:采购库存送货中增加、待送货减少 → 采购单/采购申请同步调整 → 记录库存流水日志
5.6.6 入库管理接口
(1)根据入库记录创建入库单
| 属性 |
值 |
| 路径 |
POST /remote/quality/inspection/createInboundByRecord |
| 代码 |
QualityInspectionBizServiceImpl#createInboundByRecord → createInboundOrder |
| 权限 |
save_inbound |
flowchart TD
A["根据disposeRecordIds查询入库记录"] --> B["校验记录存在且质检已完成"]
B --> C["校验没有已创建的入库单"]
C --> D["加分布式锁"]
D --> E["事务处理:"]
E --> E1["查询关联的送货单<br/>校验已签收"]
E1 --> E2["查询需创建入库单的货物明细"]
E2 --> E3["构建入库单请求:<br/>设置送货单信息、企业信息、仓库信息"]
E3 --> E4["按渠道比例构建入库单货物列表"]
E4 --> E5["按采购单分摊入库数量<br/>(allocationPurchaseInboundProduct)"]
E5 --> E6["调用inventory服务创建入库单"]
E6 --> E7["更新处置记录的入库单号"]
E7 --> E8["同步到壹拓WMS"]
自动创建入库单触发条件(checkAndAutoCreateInboundOrder):
- 全部货物免检:签收送货单时自动触发
- 部分或全部质检:提交最后一个任务结果时,若全部产品判定可接收且可接收数=送货量
- 中断质检时:若全部产品满足条件
(2)查询入库记录
| 属性 |
值 |
| 路径 |
POST /remote/quality/inspection/getInboundRecord |
| 代码 |
QualityInspectionQueryBizServiceImpl#getInboundRecord |
处理流程:
- 通过mapper查询入库记录列表
- 处置类型码转中文名称
- 批量查询inventory系统的入库单信息
- 批量查询壹拓入库单状态
- 为每条记录设置入库单ID和壹拓状态
5.6.7 辅助功能接口
(1)上传/删除任务图片
| 属性 |
值 |
| 上传路径 |
POST /remote/quality/inspection/task/picture/upload |
| 删除路径 |
POST /remote/quality/inspection/task/picture/delete |
上传流程:校验taskId和图片列表非空 → 遍历校验URL和文件名 → 构建图片记录 → 批量保存
删除流程:校验图片ID和操作人 → 逻辑删除图片记录
(2)修改任务质检员
| 属性 |
值 |
| 路径 |
POST /remote/quality/inspection/task/modifyQualityInspector |
| 代码 |
QualityInspectionBizServiceImpl#modifyTaskQualityInspector |
处理流程:
- 校验任务存在且未完成
- 加分布式锁
- 更新任务的质检员信息
- 记录操作日志(旧质检员→新质检员)
前置条件:任务状态必须为「质检中」且没有已填入实际数量的任务明细。
(3)标记未收到货
| 属性 |
值 |
| 路径 |
POST /remote/quality/inspection/markUnReceived |
| 权限 |
quantity_mark_un_received |
处理流程:
- 校验有质检结果的产品不可标记
- 同一SKC部分SKU未收货,SKC期望抽检数重算(去掉该SKU送货量)
- 标记明细的isMarkedUnreceived=1
- 标记后不可创建质检任务
- 若已有质检任务,自动删除该SKU的任务明细
(4)自动发送Creeks消息提醒
触发场景1 — 不合格品待处理(sendMsgIfHasUnprocessedRejects):
- 触发时机:给出判定结果后
- 条件:计划明细的不可接收数>0 且 处置状态=未提交
- 消息内容:送货单有不合格品待处理
- 接收者:该企业的跟单部员工
触发场景2 — 待创建入库单(sendMsgIfHasPendingInbound):
- 触发时机:提交处置方案后 / 自动提交处置方案后
- 条件:所有明细处置状态=已提交,但存在未创建入库单的可入库记录
- 消息内容:送货单待创建入库单
- 接收者:该企业的跟单部员工
(5)查询操作日志
| 属性 |
值 |
| 路径 |
POST /remote/quality/inspection/getQualityOptLog |
| 代码 |
QualityInspectionQueryBizServiceImpl#getLogs |
日志类型(business_type):
- 1=质检计划、2=计划明细、3=质检任务、4=任务明细
日志内容示例:
修改质检结果:SKU005 实际抽检数【0】改为【4】;不合格数【0】改为【1】
判定结果:SKC1 可接收数【20】改为【30】
加抽:SKU005 加抽数量【3】
退回供应商:修改产品SKU11的让步接收记录:让步接收【5】改为【0】;退供【0】改为【5】
六、代码架构现状
6.1 服务分布
| 项目 |
路径 |
职责 |
| creeks-purchasing-server |
E:\code\creeks-purchasing\creeks-purchasing-server |
质检核心业务逻辑(主服务) |
| creeks-purchasing-client |
E:\code\creeks-purchasing-client |
Feign接口定义、Entity、DTO、枚举、Request/Response |
| creeks-inventory |
E:\code\creeks-inventory |
收货单维度的质检结果录入(另一套独立逻辑) |
6.2 代码结构
creeks-purchasing-client/
├── entity/quality/ # 9个实体类
├── enums/quality/ # 枚举定义
│ ├── QualityInspectionPlanStatusEnum # 计划状态
│ ├── QualityInspectionPlanDetailStatusEnum # 计划明细状态
│ ├── QualityInspectionTaskStatusEnum # 任务状态
│ ├── QualityInspectionTaskDetailStatusEnum # 任务明细状态
│ ├── QualityInspectionResultEnum # 判定结果
│ ├── QualityInspectionDisposeType # 处置类型
│ ├── QualityInspectionRejectReasonEnum # 不合格原因
│ ├── QualityInspectionMethodType # 质检方式
│ └── QualityInspectionCriteriaType # 样本算法
├── remote/ # Feign远程接口
│ └── QualityInspectionRemoteService # 45个API端点
├── req/quality/ # 44个Request类
├── resp/quality/ # 21个Response类
└── utils/ # 工具类
└── QualityStockUtil # 抽检算法计算
creeks-purchasing-server/
├── controller/quality/
│ └── QualityInspectionController # 唯一Controller(~45个端点)
├── business/quality/
│ ├── QualityInspectionBizService # 业务接口
│ ├── QualityInspectionBizServiceImpl # 核心实现(3915行 ⚠️)
│ ├── QualityInspectionBizHelper # 写操作辅助(1401行)
│ ├── QualityInspectionQueryBizService # 查询接口
│ ├── QualityInspectionQueryBizServiceImpl # 查询实现(1180行)
│ ├── QualityInspectionQueryHelper # 查询辅助(970行)
│ ├── QualityInspectionTaskSaveService # 保存逻辑(299行)
│ └── QualityInspectionTaskSubmitService # 提交逻辑(551行)
├── service/quality/ # 9个IService基础CRUD
├── mapper/quality/ # 9个Mapper接口 + 1个综合查询Mapper
└── utils/quality/
└── QualityBatchNoUtils # 批次号生成
6.3 代码量级
| 模块 |
文件数 |
核心行数 |
说明 |
| Entity |
9 |
- |
数据模型 |
| Enum |
9 |
- |
枚举定义 |
| Controller |
1 |
- |
API入口 |
| Service(Biz) |
6 |
8,316 |
核心业务 |
| Service(CRUD) |
9 |
- |
基础CRUD |
| Mapper |
10 |
- |
数据访问 |
| Request/Response |
65 |
- |
DTO |
| 测试 |
28 |
- |
单元测试 |
6.4 ⚠️ 代码风险点
| 风险 |
说明 |
严重程度 |
| God Class |
QualityInspectionBizServiceImpl 单文件3915行,承载了几乎所有写操作 |
🔴 高 |
| 两套质检体系 |
purchasing的采购质检 与 inventory的收货质检是独立实现,逻辑不统一 |
🟡 中 |
| 历史兼容 |
质检方式枚举0/1已废弃但代码未清理,与2/3并存 |
🟡 中 |
| 灰度逻辑 |
企业白名单通过Redis管理,缺乏配置化管理 |
🟡 中 |
| MVP表废弃 |
quality_inspection_task_result 表在1.0版本已删除,字段冗余到task_detail |
🟢 低 |
七、灰度发布机制
质检模块通过企业白名单实现灰度发布:
# Redis操作
sadd 'codo:quality:inspection:white_list_key_by_enterprise' {企业ID}
- 只有白名单内的企业才能使用新质检流程
- 非白名单企业仍使用壹拓WMS的旧质检流程
- 判断逻辑:
QualityInspectionBizService 中通过检查企业ID是否在白名单来决定走新/旧流程
八、跨服务交互
graph LR
A[creekson-api<br/>前端API网关] -->|Feign| B[creeks-purchasing<br/>质检核心服务]
B -->|Feign| C[creeks-inventory<br/>库存/入库服务]
B -->|Feign| D[codo-etop-cbec<br/>壹拓WMS对接]
C -->|HTTP| D
B -->|Redis| E[灰度白名单]
B -->|七牛云| F[质检图片存储]
B -->|MySQL| G[(creeks_purchasing)]
C -->|MySQL| H[(creeks_inventory)]
| 交互 |
方向 |
说明 |
| 创建入库单 |
purchasing → inventory |
质检完成后调用inventory创建入库单 |
| 入库单推送 |
purchasing → etop |
通过inventory中转到壹拓WMS |
| 入库结果回传 |
etop → inventory → purchasing |
壹拓上架状态回传 |
| 质检标记 |
purchasing → inventory |
设置入库单的quality_inspected标记 |
| 图片上传 |
前端 → 七牛云 → purchasing |
七牛云存储质检图片 |
九、待确认/TODO事项
以下是在技术方案中标记但尚未闭环的事项:
| 事项 |
来源 |
状态 |
| 采购在途库存计算:已提交送货单但未创建入库单的在途量 |
1.0版本(第13点) |
待确认 |
| 判定结果为空时,可/不可接收数由质检员自定义填写的完整校验 |
上线后优化 |
部分实现 |
| 定制类产品SKC与SKU质检判定的边界case |
MVP版本(待确认问题4.1) |
待产品确认 |
| 没有SKC编码的货物如何展示 |
MVP版本(待确认问题4.3) |
待确认 |
十、总结
质检模块从2025年4月的MVP版本到2026年2月的上线后优化迭代3,经历了8个版本迭代,已实现了从送货单导入 → 质检计划创建 → 任务分配 → 质检执行 → 结果判定 → 不良品处置 → 入库单创建的完整闭环。
核心能力已覆盖:
- ✅ 送货单全生命周期管理(导入/编辑/提交/签收/退回)
- ✅ 质检计划/任务/明细的完整CRUD和状态流转
- ✅ AQL抽检 + 比例抽检 + 加抽/全检
- ✅ 质检结果自动判定 + 手动判定
- ✅ 不良品处置(让步接收/维修合格/退供)
- ✅ 入库记录管理与入库单创建
- ✅ 装箱明细管理
- ✅ 免在仓质检
- ✅ 退回修改质检结果 + 撤回处理表
- ✅ 自动创建入库单 + Creeks消息提醒
- ✅ 操作日志 + 数据权限控制
- ✅ 灰度发布
主要改进方向:
- 🔧
QualityInspectionBizServiceImpl 3915行的God Class需要拆分重构
- 🔧 purchasing和inventory两套质检体系需要统一或明确边界
- 🔧 已废弃的枚举值(质检方式0/1)需要代码清理