# 过程检验单(IPQC)去掉生产订单/工位/生产任务、新增必填批号 - 前端联调方案 ## 变更背景 过程检验单(IPQC)原表单要求先选「生产订单」,再由订单带出「工位」「生产任务」,并由工单/任务反推「产品物料」「质检方案」「工序」。 本次改造**去掉生产订单、工位、生产任务三个字段(工序一并去掉)**,改为: - 「产品物料」由前端**手动选择,必填**(从待检任务入口创建时仍自动带入); - 新增「批号」输入框,**手工录入文本,必填**。 改造后 IPQC 的表单结构与同模块已上线的 **IQC / OQC 一致**:单据 = 来源单据 + 产品物料 + 批号 + 数量 + 检验信息。 > **重要(物料 ID 体系)**:IPQC 的「产品物料」由原「MES 物料(`mes_md_item`)」统一为 **MDM 物料(`mdm_item`)**,与 IQC/OQC 相同。前端必须使用 **`MdmItemSelect`** 组件(`#/views/basicData/mdm/components`,勿与 MES 侧的 `MdItemSelect`(`#/views/mes/md/item/components`)混用),不要再使用任何挂工单/任务的物料选择器。 ## 涉及页面 | 文件 | 说明 | |------|------| | `src/views/mes/qc/ipqc/data.ts` | 表单 schema、列表搜索 schema、列表列定义 | | `src/views/mes/qc/ipqc/index.vue` | 列表页(引用上面 schema) | | `src/views/mes/qc/ipqc/modules/form.vue` | 新增/编辑表单弹窗 | | `src/views/mes/qc/pendinginspect/index.vue` | 待检任务页的「生成过程检验单」按钮(数据带入) | | `src/api/mes/qc/ipqc/index.ts` | IPQC 接口类型定义 | | `src/api/mes/qc/pendinginspect/index.ts` | 待检任务接口类型定义 | ## 业务流程与数据带入 ``` 报工审批通过(需检验) → 生成产出行(quality_status=待检)+ 批次号 │ ▼ 待检任务页(qcType = IPQC) │ 点击「生成过程检验单」带入:来源单据类型/ID/行ID、来源单据编号、 │ 产品物料、批号、待检数量、检测日期 ▼ IPQC 表单(用户补全:检验类型、检测人员、合格/不合格数量等) │ ▼ 保存 → 完成检验 → 回写报工 + 拆分产出行 + 完成产出入库 ``` ### 数据带入规则(待检任务 → IPQC 表单) | 表单字段 | 待检任务响应字段 | 带入后是否可编辑 | |----------|------------------|------------------| | 来源单据类型 sourceDocType | sourceDocType | 否(隐藏只读) | | 来源单据编号 sourceDocCode | sourceDocCode | 否(只读展示) | | 来源单据 ID sourceDocId | sourceDocId | 否(隐藏字段) | | 来源单据行 ID sourceLineId | sourceLineId | 否(隐藏字段) | | 产品物料 itemId | itemId | 否(有来源单据时置灰) | | **批号 batchCode(本次新增)** | **batchCode(本次新增)** | **是**(建议带入后仍允许人工修正) | | 检测数量 checkQuantity | quantity | 否(有来源单据时置灰) | | 检测日期 inspectDate | recordTime | 是 | > 待检任务入口带入的「批号」来自产出行 `batch_code`(报工审批通过时由系统生成的批次号)。**当前只有 IPQC 来源会返回 `batchCode`,IQC/OQC/RQC 来源该字段为 `null`**,前端对其它检验类型忽略该字段即可。 ## API ### 1. 创建 / 更新过程检验单 | 方法 | 路径 | 说明 | |------|------|------| | POST | `/mes/qc/ipqc/create` | 创建过程检验单 | | PUT | `/mes/qc/ipqc/update` | 更新过程检验单 | **请求参数(仅列出本次变更字段):** | 参数 | 类型 | 必填 | 说明 | |------|------|------|------| | ~~workOrderId~~ | Long | — | **已删除**,不再允许提交 | | ~~taskId~~ | Long | — | **已删除**,不再允许提交 | | ~~workstationId~~ | Long | — | **已删除**,不再允许提交 | | ~~processId~~ | Long | — | **已删除**,不再允许提交 | | batchCode | String | **是** | 批号,手工录入文本,最长 100 字符 | | itemId | Long | **是** | 产品物料 ID(**MDM 物料 ID**),由 `MdmItemSelect` 提供 | | templateId | Long | 否 | 质检方案 ID;不传时后端按 `itemId + 检验类型(IPQC)` 自动取第一个匹配方案 | > 其余字段(code、name、type、checkQuantity、qualifiedQuantity、unqualifiedQuantity、工废/料废/其他废品数量、inspectorUserId、inspectDate、samplingLocation、certificateNo、executeStandard、auditUserId、approveUserId、checkResult、remark)保持不变。 **响应:** `{ "code": 0, "data": <过程检验单 ID> }` ### 2. 分页查询 | 方法 | 路径 | 说明 | |------|------|------| | GET | `/mes/qc/ipqc/page` | 获得过程检验单分页 | **查询参数(本次变更):** | 参数 | 类型 | 说明 | |------|------|------| | ~~workOrderId~~ | Long | **已删除** | | batchCode | String | **新增**,批号,模糊匹配 | ### 3. 详情 / 导出 | 方法 | 路径 | 说明 | |------|------|------| | GET | `/mes/qc/ipqc/get?id=` | 详情,响应字段随下列变更 | | GET | `/mes/qc/ipqc/export-excel` | 导出 Excel,**「批号」列取 `batchCode`**(原取来源单据编号) | ### 4. 质检方案选项(表单联动) | 方法 | 路径 | 说明 | |------|------|------| | GET | `/mes/qc/template/item/list-by-item-and-type` | 按物料 + 检验类型取可用质检方案 | **参数变更:** 由原来的 `{ qcType: 2, workOrderId, taskId }` 改为 **`{ qcType: 2, itemId }`**(`itemId` 为 MDM 物料 ID)。 ### 5. 待检任务分页(响应新增字段) | 方法 | 路径 | 说明 | |------|------|------| | GET | `/mes/qc/pending-inspect/page` | 待检任务分页 | **响应新增字段:** | 字段 | 类型 | 说明 | |------|------|------| | batchCode | String | 批号,**当前仅 IPQC(产出行)来源提供**,其余来源为 `null` | ## 响应字段变更(详情 / 分页列表) **删除字段:** | 字段 | 说明 | |------|------| | workOrderId / workOrderCode / workOrderName | 生产订单 | | taskId | 生产任务 | | workstationId / workstationName | 工位 | | processId / processName | 工序 | **新增字段:** | 字段 | 类型 | 说明 | |------|------|------| | batchCode | String | 批号 | **保留不变:** itemId、itemCode、itemName、itemSpecification、unitName、检查数量类字段、checkResult、inspectDate、inspectorUserId / inspectorNickname、status、samplingLocation、certificateNo、executeStandard、auditUserId / auditNickname、approveUserId / approveNickname、remark。 ## 字段展示规则 | 字段 | 展示位置 | 说明 | |------|----------|------| | 产品物料 itemId | 表单、列表 | 表单用 `MdmItemSelect` 选择,**必填**;列表展示 `itemCode / itemName / itemSpecification`(原样保留) | | 批号 batchCode | 表单、列表、详情、导出 | **表单必填**;列表新增列展示(建议放在「产品物料」之后);导出列「批号」 | | 生产订单 / 工位 / 生产任务 | — | 从表单、列表列、列表搜索、详情、导出中**全部移除** | | 质检方案 templateId | 表单 | 选择范围改由「产品物料」驱动(不再由生产订单驱动) | ### 表单字段调整建议(仅列调整项) | 操作 | 字段 | 说明 | |------|------|------| | 删除 | 生产订单 `workOrderId` | 含其 `ProWorkOrderSelect` 及联动清空 taskId 的逻辑 | | 删除 | 工位 `workstationId` | 含 `MdWorkstationSelect` | | 删除 | 生产任务 `taskId` | 含 `ProTaskSelect` | | 新增 | 批号 `batchCode` | `Input`,`rules: 'required'`,`maxlength: 100` | | 修改 | 产品物料 `itemId` | 改为 `MdmItemSelect` + `rules: 'selectRequired'`;`dependencies.triggerFields` 由 `['sourceDocId']` 保持(有来源单据时置灰) | | 修改 | 质检方案 `templateId` | `dependencies.triggerFields` 由 `['workOrderId', 'taskId']` 改为 `['itemId']`;`disabled` 条件由 `!values.workOrderId` 改为 `!values.itemId`;`params` 改为 `{ itemId: values.itemId, qcType: 2 }`;占位文案由「请先选择生产订单」改为「请先选择产品物料」 | | 修改 | 列表搜索 | `workOrderId`(生产订单)替换为 `batchCode`(批号,`Input`,`allowClear`,模糊查询) | | 修改 | 列表列 | 删除「生产订单编号」列;新增「批号」列(`batchCode`) | > 参考实现:`src/views/mes/qc/oqc/data.ts` 的 `itemId`(`MdmItemSelect`)与 `templateId`(`params: { itemId, qcType: 3 }`)写法,IPQC 只需把 `qcType` 换成 IPQC 的字典值。 ### 待检任务页带入调整 `src/views/mes/qc/pendinginspect/index.vue` 的 `handleCreateIpqc` 预填对象: | 操作 | 字段 | 说明 | |------|------|------| | 删除 | `taskId` / `workOrderId` / `workstationId` | 后端已不再接收,且表单已无对应控件 | | 保留 | `itemId` / `checkQuantity` / `inspectDate` / `name` / `sourceDocCode` / `sourceDocId` / `sourceDocType` / `sourceLineId` | 语义不变 | | **新增** | `batchCode: row.batchCode` | 从待检任务带入批号(该字段仅 IPQC 来源有值) | ## 业务规则说明 | 场景 | 规则 | |------|------| | 手工新建 IPQC | 直接选择产品物料(MDM)+ 填写批号;后端按 `itemId + IPQC` 匹配质检方案并自动生成检验行 | | 指定质检方案 | 前端传 `templateId`,但必须落在 `itemId + IPQC` 匹配到的方案集合内,否则后端报「未匹配到质检方案」 | | 未匹配到方案 | 后端返回错误码 `QC_NO_TEMPLATE`,前端按通用错误提示展示即可 | | 从待检任务创建 | 物料、批号、检测数量、检测日期、来源单据信息自动带入;来源单据字段保存后不可修改 | | 来源单据回写 | IPQC 完成后回写报工(合格/不合格/工废/料废/其他废品数量),并拆分产出行、完成产出入库。**该链路依赖 `sourceDocId + sourceLineId`,与本次删除的三个字段无关,不受影响** | | 批号必填校验 | 由后端 `@NotEmpty` 与前端 `rules: 'required'` 双重保证;批号为空时后端返回「批号不能为空」 | | 物料必填校验 | 由后端 `@NotNull` 与前端 `rules: 'selectRequired'` 双重保证;物料不存在时后端返回物料不存在错误 | | 列表查询 | 生产订单筛选已下线,改为按批号模糊查询 | ## 注意事项 1. **物料选择器必须换成 `MdmItemSelect`**。若仍沿用原来的物料选择器或直接回填 MES 物料 ID,会出现「物料不存在」或「未匹配到质检方案」错误。 2. **质检方案下拉的 `params` 必须由 `workOrderId/taskId` 改为 `itemId`**,否则选完物料后方案列表为空或与所选物料不符。 3. **批号为必填**:新增/编辑表单与创建接口都需校验,从待检任务带入后也允许用户修正。 4. **待检任务的 `batchCode` 只有 IPQC 来源有值**(IQC/OQC/RQC 恒为 `null`),公共带入逻辑里不要假设它一定存在;无值时留空让用户手填。 5. **历史数据**:`mes_qc_ipqc` 迁移前为 0 条数据,本次为直接删列 + 加列,无需前端做兼容处理。DDL(删 `work_order_id`/`task_id`/`workstation_id`/`process_id`,加 `batch_code varchar(100)`)已于 **2026-09-22** 在 yzfx 库执行完毕。 6. **导出 Excel 的「批号」列语义已变**:原先取「来源单据编号」,现改为取真正的批号。 7. 生产订单/工位/生产任务/工序在**列表列、详情、导出**中都要一并移除,避免出现永久为空白的列。