一个产品可在 mes_qc_template_item 关联多个质检方案(mes_qc_template)。此前后端命中多个方案时静默取第一个,用户无法控制。现支持在检验单**新建表单**中通过「质检方案」下拉手动选择;未配置或仅一个方案时保持原有自动行为不变。
| 方法 | 路径 | 说明 |
|---|---|---|
| GET | /mes/qc/template/item/list-by-item-and-type | 根据物料或工单/任务和检测种类获取可用质检方案列表 |
请求参数:
| 参数 | 类型 | 必填 | 说明 |
|---|---|---|---|
| qcType | Integer | 是 | 检测种类:1=IQC、2=IPQC、3=OQC、4=RQC |
| itemId | Long | 否 | 产品物料 ID(mes_md_item.id);IQC/OQC/RQC 使用 |
| workOrderId | Long | 否 | 生产订单 ID;IPQC 使用 |
| taskId | Long | 否 | 生产任务 ID;IPQC 使用 |
说明:
itemId、workOrderId、taskId三者至少传一个。优先顺序:taskId → workOrderId → itemId。IPQC 表单不选物料,传 workOrderId(+可选 taskId)由后端解析产品;其余三个模块传 itemId。
响应字段(数组):
| 字段 | 类型 | 说明 |
|---|---|---|
| id | Long | 方案-产品关联编号(templateItem.id) |
| templateId | Long | 质检方案 ID |
| templateCode | String | 质检方案编号 |
| templateName | String | 质检方案名称 |
| quantityCheck | Integer | 最低检测数 |
| quantityUnqualified | Integer | 最大不合格数 |
| criticalRate | BigDecimal | 最大致命缺陷率(%) |
| majorRate | BigDecimal | 最大严重缺陷率(%) |
| minorRate | BigDecimal | 最大轻微缺陷率(%) |
响应示例:
{
"code": 0,
"data": [
{
"id": 5,
"templateId": 10,
"templateCode": "IQC-AQL-Ⅱ",
"templateName": "IQC 正常检验二级水平",
"quantityCheck": 8,
"quantityUnqualified": 1,
"criticalRate": 0,
"majorRate": 2.5,
"minorRate": 10
}
]
}
| 模块 | 触发字段 | qcType | 说明 |
|---|---|---|---|
| IQC | itemId | 1 | 选中物料后按 qcType=1 拉取 |
| OQC | itemId | 3 | 选中物料后按 qcType=3 拉取 |
| RQC | itemId | 4 | 选中物料后按 qcType=4 拉取(后端已修复为按检测种类匹配模板,不再误匹配到 IQC/IPQC 方案) |
| IPQC | workOrderId、taskId | 2 | 选中生产订单后按 qcType=2 拉取,taskId 可选传入 |
「质检方案」字段(templateId):
| 场景 | 规则 |
|---|---|
| 新建、未选物料/生产订单 | 下拉禁用,提示"请先选择产品物料/生产订单" |
| 新建、已选物料/生产订单 | 下拉可用,默认选中返回列表第一个方案,可切换 |
| 编辑/详情 | 下拉禁用,仅回显已保存的方案 |
| 产品未配置可用方案 | 下拉为空(保存时后端仍校验报「未配置质检方案」) |
| 产品配置多个 enable 方案 | 下拉展示全部可选方案,用户可切换 |
| 场景 | 规则 |
|---|---|
| 前端显式传了 templateId | 后端在校验方案必须属于"产品+检测种类"可匹配列表,否则拒绝(防止选到其他产品/其他检测种类的方案) |
| 前端未传 templateId | 自动取匹配列表第一个方案,与旧行为一致 |
| 编辑检验单 | 不允许修改方案(后端 update 时忽略 templateId) |
| 自动触发路径(到货通知→IQC、销售出库→OQC) | 不走下拉,仍由后端自动取方案,行为不变 |
templateId(质检方案 ID),四个模块 SaveReqVO 均已补充;RQC 原本就带此字段。autoSelect: 'first',仅当当前值为空时生效,用户手动选择后不会被动覆盖。