# 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 响应示例(节选):** ```json { "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" } ] } ] } ] } ``` ## 数据带入说明 1. 方案 `defaultExecuteStandard` → 新建四类检验单选方案后自动填入 `executeStandard`(用户已手填则不覆盖;仅当请求值为空时后端从方案回填)。 2. 方案指标 `sortOrder`/`judgeFlag` → 生成检验行/结果树时排序与判定提示依据;`judgeFlag=false`(分组/中间参数行)不参与合格判定提示。 3. 指标树形结构由字典层 `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 对老数据透明。