MES 质检升级:化工检验报告(分组检验项 + 公式文本 + 平行测量 + 打印)
支撑纸质"正丁醇检验记录"(GB/T 6027)类报告:行分组矩阵、公式文本展示、平行测量批次列、表头采样信息、分析者/复核人/审核人签字区、前端浏览器打印。IQC/IPQC/OQC/RQC 四类检验单通用。
涉及页面(均已实施)
| 页面 |
变更 |
质检指标维护 views/mes/qc/indicator |
表单新增 条目类型/所属分组/公式文本/单位文本/排序号;列表新增 条目类型/所属分组/单位 列;结果值类型仅录入项显示必填 |
质检方案-指标项 views/mes/qc/template |
方案表单新增"默认执行标准";指标项列表新增"排序号""参与判定"开关列(可列表直改) |
四类检验单表单 views/mes/qc/{iqc,ipqc,oqc,rqc} |
新增 采样地点/证书编号/执行标准/复核人/审核人;选择质检方案时执行标准自动带入方案默认值;列表操作列新增"打印报告" |
检验结果录入 views/mes/qc/indicatorresult/components/form.vue |
按分组树渲染(组标题行 + 公式文本);每个录入项支持增删"测量批次"平行列 |
打印组件(新建) views/mes/qc/components/qc-report-print.vue |
Teleport + @media print 浏览器打印报告版式 |
数据库变更(已执行至 ruoyi-vue-pro;结构已同步 docs/sql/config_export_all_20260904.sql 阶段一)
| 表 |
新增列 |
mes_qc_indicator |
parent_id(0=顶级)、item_type(1录入/2分组)、formula_text、unit_text、sort_order |
mes_qc_template_indicator |
sort_order、judge_flag(默认1参与判定) |
mes_qc_indicator_result_detail |
measure_no(测量批次号,默认1) |
mes_qc_iqc / ipqc / oqc / rqc |
sampling_location、certificate_no、execute_standard、audit_user_id、approve_user_id |
mes_qc_template |
default_execute_standard |
指标层级规则:仅两级(分组项必须顶级;录入项可挂一个分组);同层级下检测项名称唯一(不同分组下允许同名参数行,如"水分""酸含量"组下各有一个"试样质量 m")。
种子数据:sql/mysql/mes_qc_indicator_seed.sql(正丁醇报告样例树,编码前缀 SEED-BT-,幂等可重跑)。
API
| 方法 |
路径 |
说明 |
| GET |
/mes/qc/indicator/list |
指标平铺列表(前端据此派生树;RespVO 新增 parentId/itemType/formulaText/unitText/sortOrder/parentName) |
| POST/PUT |
/mes/qc/indicator/create、/update |
SaveReqVO 含上述 5 新字段;删除有子项的指标将被拦截 |
| PUT |
/mes/qc/template/indicator/update |
支持 sortOrder/judgeFlag |
| GET |
/mes/qc/indicator-result/get-detail-list |
Item 树形化:+parentId/itemType/formulaText/unitText/sortOrder/children;单值 value/remark 改为 measures: [{resultId, measureNo, value, remark}] |
| POST |
/mes/qc/indicator-result/create、/update |
明细项 +measureNo(空默认1);分组项不提交明细 |
| GET |
/mes/qc/indicator-result/report |
新增:打印报告聚合数据,参数 qcId、qcType、resultId(可选);权限 mes:qc-iqc:query |
/report 响应示例(节选):
{
"qcType": 1,
"docCode": "IQC20260830001",
"itemName": "正丁醇",
"samplingLocation": "罐区",
"certificateNo": "V0028",
"executeStandard": "GB/T6027",
"samplingTime": "2026-08-30T01:00:00",
"batchQuantity": 30,
"checkResult": 1,
"inspectorName": "新艳",
"auditName": "海丽",
"approveName": "王五",
"measureNos": [1, 2],
"items": [
{
"indicatorId": 21, "indicatorName": "酸含量", "itemType": 2,
"formulaText": "w3 = c × V × 0.06005 / m × 100%",
"children": [
{ "indicatorName": "试样质量 m /g", "itemType": 1,
"measures": [
{ "measureNo": 1, "value": "10.023" },
{ "measureNo": 2, "value": "10.115" }
] }
]
}
]
}
数据带入说明
- 方案
defaultExecuteStandard → 新建四类检验单选方案后自动填入 executeStandard(用户已手填则不覆盖;仅当请求值为空时后端从方案回填)。
- 方案指标
sortOrder/judgeFlag → 生成检验行/结果树时排序与判定提示依据;judgeFlag=false(分组/中间参数行)不参与合格判定提示。
- 指标树形结构由字典层
parent_id 派生,检验行表不加层级字段;老扁平指标(parentId=0)完全兼容。
打印版式字段映射(qc-report-print.vue ↔ 纸质报告)
| 纸质栏位 |
数据来源 |
| 证书编号 / 采样地点 / 批量 / 采样时间 / 执行标准 |
report 同名字段 |
| 分组行(水分/酸含量…) |
itemType=2 节点:名称行 + 公式文本(formulaText) |
| 参数行/结果行 |
分组 children 录入项,按 sortOrder 排序 |
| 平行测量两列 |
measureNos 数组驱动列头,每 measureNo 一列 |
| 外观等定性项 |
resultType=文本/字典 的录入项直接显示 value |
| 分析者/复核人/审核人 |
inspectorName / auditName / approveName |
业务规则
| 场景 |
规则 |
| 分组项录入 |
不录值:结果值类型隐藏、明细不提交、后端 validateDetailValues 对 GROUP 跳过格式校验 |
| 平行测量 |
每录入项至少保留 1 个测量批次;新增批次自动取下一个序号 |
| 结果回显 |
单批次老数据 measureNo=1,前端 measures 正常渲染 |
| 判定流程 |
不变:checkResult 仍由完成检验时人工填写,系统无自动阈值判定 |
| 删除指标 |
存在子项时后端拦截报错 |
注意事项
- 打印为浏览器
window.print(),建议在 Chrome 下预览;隐藏打印外其他元素由组件内 @media print 控制。
/report 的 qcType:1=IQC、2=IPQC、3=OQC、4=RQC,与 MesQcTypeEnum 一致。
- 复核人/审核人仅作为记录与打印签字区,不引入审批流转。
- 文件附件类指标(resultType=文件)沿用原机制,未在本次范围。
- 回归点:既有扁平指标的老检验单(录入/完成/Excel 导出)行为不变;
measure_no 默认 1 对老数据透明。