编辑 | blame | 历史 | 原始文档

质检检验单手动选择质检方案 - 前端联调方案

涉及页面

  • 来料检验(IQC)新建表单
  • 过程检验(IPQC)新建表单
  • 出货检验(OQC)新建表单
  • 退货检验(RQC)新建表单

背景

一个产品可在 mes_qc_template_item 关联多个质检方案(mes_qc_template)。此前后端命中多个方案时静默取第一个,用户无法控制。现支持在检验单**新建表单**中通过「质检方案」下拉手动选择;未配置或仅一个方案时保持原有自动行为不变。

API

方法 路径 说明
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 使用

说明:itemIdworkOrderIdtaskId 三者至少传一个。优先顺序: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 在现有 RespVO 中已存在,无需额外对接。
  • 保存请求参数新增 templateId(质检方案 ID),四个模块 SaveReqVO 均已补充;RQC 原本就带此字段。
  • 下拉默认选中第一个依赖组件 autoSelect: 'first',仅当当前值为空时生效,用户手动选择后不会被动覆盖。