# MES 质检单批量导入 - 前端联调方案 > 需求:来料检验(IQC)、过程检验(IPQC)、出货检验(OQC)三个列表各增加「批量导入」按钮,位置在「新增」与「导出」之间,用于按模板批量导入检验单。 > 参考实现:现有各模块导入弹窗(如 `views/mes/md/item/modules/import-form.vue`、`views/crm/contract/modules/import-form.vue`),交互与结果区展示可直接沿用。 ## 涉及页面 - 修改:`views/mes/qc/iqc/index.vue`(来料检验单列表工具栏 + 导入弹窗) - 修改:`views/mes/qc/ipqc/index.vue`(过程检验单列表工具栏 + 导入弹窗) - 修改:`views/mes/qc/oqc/index.vue`(出货检验单列表工具栏 + 导入弹窗) - 新增:三个导入弹窗组件(建议 `views/mes/qc/{iqc|ipqc|oqc}/modules/import-form.vue`) - 修改:`src/api/mes/qc/{iqc|ipqc|oqc}/index.ts`(各新增 2 个接口) ## 业务流程与数据带入 1. 下载模板 -> 填写 -> 导入:**一行 = 一张检验单**。物料、供应商/客户、工位、质检方案均按「编码 / 名称」匹配系统中已有数据,无需填写 ID 2. 生产工单(IPQC)-> 过程检验单:模板只填「生产工单号」,**产品物料由工单自动推导**,模板不填物料 3. 质检方案 -> 检验行:导入成功后由后端按物料 + 检验类型匹配质检方案,并自动生成检验行(检验指标),前端无需额外调用 4. 导入成功 -> 列表:新增单据状态为「待检验」(草稿),可在列表中编辑、录入检测结果、完成检验 5. 检测人员留空 = 当前登录用户;填写时按姓名匹配系统用户 ## API | 方法 | 路径 | 说明 | |------|------|------| | GET | `/mes/qc/iqc/get-import-template` | 下载来料检验单导入模板(返回 xls 文件流) | | POST | `/mes/qc/iqc/import` | 导入来料检验单(multipart 上传 Excel) | | GET | `/mes/qc/ipqc/get-import-template` | 下载过程检验单导入模板(返回 xls 文件流) | | POST | `/mes/qc/ipqc/import` | 导入过程检验单(multipart 上传 Excel) | | GET | `/mes/qc/oqc/get-import-template` | 下载出货检验单导入模板(返回 xls 文件流) | | POST | `/mes/qc/oqc/import` | 导入出货检验单(multipart 上传 Excel) | **权限码:** `mes:qc-iqc:import` / `mes:qc-ipqc:import` / `mes:qc-oqc:import`(菜单已新增:质检管理 -> 来料检验/过程检验/出货检验 -> 「来料检验导入 / 过程检验导入 / 出货检验导入」,已授予来料/过程/出货检验现有角色)。 **请求参数(POST .../import):** | 参数 | 类型 | 必填 | 说明 | |------|------|------|------| | file | MultipartFile | 是 | 仅支持 xls、xlsx;无 `updateSupport` 参数,导入为**纯新增**,不做更新覆盖 | **响应:** ```json { "code": 0, "data": { "createList": ["IQC20260924000001", "IQC20260924000002"], "failureList": { "第 4 行": "产品物料编码不存在:WL9999。请在「物料管理」中核对该物料编码(需与模板完全一致),或修改模板中的产品物料编码后重新导入" } } } ``` | 字段 | 类型 | 说明 | |------|------|------| | createList | String[] | 导入成功的检验单编号数组(模板未填编号时返回系统自动生成的编号,可用于提示/跳转) | | failureList | Map | 导入失败集合:key 为「检验单编号 X」或「第 N 行」(N 为 Excel 行号,含表头行),value 为失败原因 | ## 模板列(下载的模板已含表头与一行示例) ### 来料检验单(IQC) | 列名 | 必填 | 说明 | |------|------|------| | 检验单编号 | 否 | 留空则系统自动生成;填写时不可与系统中已有编号重复 | | 检验单名称 | 是 | 检验单名称 | | 产品物料编码 | 是 | 需与「物料管理」中的物料编码一致 | | 供应商名称 | 否 | 需与「供应商管理」中的名称一致;留空则该单无供应商 | | 供应商批次号 | 否 | 供应商批次号 | | 质检方案 | 否 | 填方案名称;留空则后端按物料自动匹配 IQC 方案 | | 本次接收数量 | 否 | 留空自动 = 合格品数量 + 不合格品数量;填写则必须与之相等 | | 合格品数量 | 是 | 不能小于 0 | | 不合格品数量 | 是 | 不能小于 0 | | 检测结果 | 否 | 字典 `mes_qc_check_result` 名称:校验通过 / 校验不通过 | | 检测人员 | 否 | 用户姓名;留空取当前登录用户 | | 检测日期 | 是 | 格式 `2026-01-01 10:00:00` 或 `2026-01-01` | | 来料日期 | 是 | 格式 `2026-01-01 10:00:00` 或 `2026-01-01` | | 备注 | 否 | 备注 | ### 过程检验单(IPQC) | 列名 | 必填 | 说明 | |------|------|------| | 检验单编号 | 否 | 留空则系统自动生成;填写时不可重复 | | 检验单名称 | 是 | 检验单名称 | | 检验类型 | 是 | 字典 `mes_ipqc_type` 名称:自制工序检验 / 首检 / 巡检 / 自检 / 成品检验 | | 生产工单号 | 是 | 需与「生产管理-生产工单」中的工单号一致;**产品物料由工单推导,模板不填物料** | | 工位名称 | 是 | 需与「基础数据-工位管理」中的名称一致 | | 质检方案 | 否 | 填方案名称;留空则后端按物料自动匹配 IPQC 方案 | | 检测数量 | 否 | 留空自动 = 合格品数量 + 不合格品数量;填写则必须与之相等 | | 合格品数量 | 是 | 不能小于 0 | | 不合格品数量 | 是 | 不能小于 0 | | 工废数量 | 否 | 留空按 0;与料废、其他废品之和不得超过不合格品数量 | | 料废数量 | 否 | 留空按 0 | | 其他废品数量 | 否 | 留空按 0 | | 检测结果 | 否 | 字典 `mes_qc_check_result` 名称 | | 检测人员 | 否 | 用户姓名;留空取当前登录用户 | | 检测日期 | 否 | 格式 `2026-01-01 10:00:00` 或 `2026-01-01`;留空则不填 | | 备注 | 否 | 备注 | ### 出货检验单(OQC) | 列名 | 必填 | 说明 | |------|------|------| | 检验单编号 | 否 | 留空则系统自动生成;填写时不可重复 | | 检验单名称 | 是 | 检验单名称 | | 产品物料编码 | 是 | 需与「物料管理」中的物料编码一致 | | 客户名称 | 是 | 需与「CRM 客户管理」中的客户名称一致,**且必须在当前登录用户的客户数据权限范围内** | | 批次号 | 否 | 批次号 | | 质检方案 | 否 | 填方案名称;留空则后端按物料自动匹配 OQC 方案 | | 本次出货数量 | 是 | 不能小于 0 | | 检测数量 | 否 | 留空自动 = 合格品数量 + 不合格品数量;填写则必须与之相等 | | 合格品数量 | 是 | 不能小于 0 | | 不合格品数量 | 是 | 不能小于 0 | | 检测结果 | 否 | 字典 `mes_qc_check_result` 名称 | | 检测人员 | 否 | 用户姓名;留空取当前登录用户 | | 检测日期 | 是 | 格式 `2026-01-01 10:00:00` 或 `2026-01-01` | | 出货日期 | 是 | 格式 `2026-01-01 10:00:00` 或 `2026-01-01` | | 备注 | 否 | 备注 | ## 字段展示规则 | 字段 | 展示位置 | 说明 | |------|----------|------| | 批量导入按钮 | 三个列表工具栏 | 位置在「新增」与「导出」之间(即渲染顺序:新增 -> 批量导入 -> 导出);权限码 `mes:qc-{iqc|ipqc|oqc}:import` | | 下载导入模板按钮 | 导入弹窗内 | 同其它模块导入弹窗的位置(模板下载按钮放弹窗左下角) | | 新增条数 | 导入弹窗结果区 | 取 `createList.length`,文案如「新增:N 条」 | | 失败明细 | 导入弹窗结果区 | 遍历 `failureList`,逐条展示「key:value」,可滚动 | | 导入说明 | 导入弹窗内灰色提示区 | 提示必填列、数量关系(合格 + 不合格 = 检测/接收数量)、状态为「待检验」、检测人员留空取当前登录用户 | | 提示语补充 | 导入弹窗成功提示 | 导入成功后建议提示「新增检验单为『待检验』状态,请在列表中编辑并录入检测结果」 | ## 业务规则说明 | 场景 | 规则 | |------|------| | 导入方式 | 纯新增,不更新已有检验单;`updateSupport` 参数不存在 | | 编号生成 | 「检验单编号」留空由后端按编码规则自动生成(IQC / IPQC / OQC 各自前缀);填写时与系统中已有编号重复则该行失败 | | 质检方案匹配 | 「质检方案」留空时后端按物料 + 检验类型自动匹配;若该物料未配置对应类型的方案,该行失败并提示需配置方案的物料与入口 | | 数量关系 | 合格品数量 + 不合格品数量 必须等于「检测数量」(IPQC/OQC)或「本次接收数量」(IQC);留空时自动取两者之和;填写不相等时该行失败并给出两边的实际值 | | IPQC 废品数量 | 工废 + 料废 + 其他废品 之和不得超过不合格品数量,超出该行失败 | | IPQC 物料来源 | 产品物料由「生产工单号」推导,模板不提供物料列;工单不存在或未确认时该行失败 | | 状态 | 导入后的检验单统一为「待检验」(草稿),不直接完成 | | 检验行生成 | 由后端按匹配到的质检方案自动生成检验行(检验指标),无需前端额外处理 | | OQC 客户数据权限 | 「客户名称」必须在当前登录用户的可见客户范围内,否则该行失败(否则导入后列表中也看不到该单) | | 部分成功 | 逐行导入,失败行不影响成功行(同一文件内不会整体回滚);全部行为空时返回空结果 | | 空行 | 整行为空的记录自动跳过,不记为失败 | ## 注意事项 - 「检验类型」「检测结果」等字典列填**名称**(如 首检、校验通过),也兼容填数字(1/2);填错时失败原因会列出可选值 - 「质检方案」列填的是**方案名称**,不是方案编码;留空即为「自动匹配」,是推荐用法 - IPQC 的「检验类型」是**必填**列,且方案的检验类型需与检验单的类型可匹配,否则可能提示未配置方案 - 「检测人员」留空取当前登录用户;填写姓名时若存在同名用户,会取匹配到的第一条,建议填姓名全称 - 三个列表的导入互不影响,权限码各自独立;自建角色需在「角色管理」中勾选对应的「XX检验导入」按钮后才可见该按钮 - 导入弹窗的进度条 / 结果区 / 模板下载交互可直接复用现有 `import-form.vue` 实现 - 日期列支持 `yyyy-MM-dd HH:mm:ss` 与 `yyyy-MM-dd` 两种格式;IQC 的检测/来料日期、OQC 的检测/出货日期为必填,IPQC 的检测日期可留空