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 个接口)
业务流程与数据带入
- 下载模板 -> 填写 -> 导入:**一行 = 一张检验单**。物料、供应商/客户、工位、质检方案均按「编码 / 名称」匹配系统中已有数据,无需填写 ID
- 生产工单(IPQC)-> 过程检验单:模板只填「生产工单号」,**产品物料由工单自动推导**,模板不填物料
- 质检方案 -> 检验行:导入成功后由后端按物料 + 检验类型匹配质检方案,并自动生成检验行(检验指标),前端无需额外调用
- 导入成功 -> 列表:新增单据状态为「待检验」(草稿),可在列表中编辑、录入检测结果、完成检验
- 检测人员留空 = 当前登录用户;填写时按姓名匹配系统用户
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 参数,导入为**纯新增**,不做更新覆盖 |
响应:
{
"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 的检测日期可留空