编辑 | blame | 历史 | 原始文档

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_textunit_textsort_order
mes_qc_template_indicator sort_orderjudge_flag(默认1参与判定)
mes_qc_indicator_result_detail measure_no(测量批次号,默认1)
mes_qc_iqc / ipqc / oqc / rqc sampling_locationcertificate_noexecute_standardaudit_user_idapprove_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 新增:打印报告聚合数据,参数 qcIdqcTyperesultId(可选);权限 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" }
          ] }
      ]
    }
  ]
}

数据带入说明

  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 控制。
  • /reportqcType:1=IQC、2=IPQC、3=OQC、4=RQC,与 MesQcTypeEnum 一致。
  • 复核人/审核人仅作为记录与打印签字区,不引入审批流转。
  • 文件附件类指标(resultType=文件)沿用原机制,未在本次范围。
  • 回归点:既有扁平指标的老检验单(录入/完成/Excel 导出)行为不变;measure_no 默认 1 对老数据透明。