15 小时以前 2ce991aa161aa955d14821e0338c7b138db745fd
feat(mes): 实现质检化工报告功能支持分组检验项公式文本平行测量

- 新增质检指标维护表单包含条目类型/所属分组/公式文本/单位文本/排序号字段
- 在质检方案指标项中增加默认执行标准和参与判定开关功能
- 为四类检验单表单添加采样地点/证书编号/执行标准/复核人/审核人字段
- 实现检验结果录入按分组树渲染支持增删测量批次平行列
- 创建打印组件支持浏览器打印报告版式
- 新增数据库表结构包括指标父级关系/公式文本/测量批次号等字段
- 实现API接口支持指标树形化和批量测量结果处理
- 添加打印报告聚合数据接口和权限控制
已添加1个文件
106 ■■■■■ 文件已修改
docs/qc_chemical_report_integration.md 106 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
docs/qc_chemical_report_integration.md
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,106 @@
# 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 å¯¹è€æ•°æ®é€æ˜Žã€‚