云
9 小时以前 e3b0b90aa060ed05c3f860e213298505bf741027
feat(qc): 质检模块功能优化与字段调整

- 合同编号支持自定义录入,新增和编辑模式均可编辑
- IPQC过程检验单去掉生产订单/工位/生产任务字段,新增必填批号
- IPQC物料选择器统一使用MDM物料ID体系
- OQC出货检验单检测结果字典扩展为7项并明确放行规则
- OQC发货数量等4个字段由必填改为非必填
- 修复质检单产品物料信息查不出来的问题
- 优化质检单列表字段展示,提升信息密度
- 更新相关API接口参数与响应结构
- 调整待检任务页面数据带入逻辑
已添加9个文件
821 ■■■■■ 文件已修改
docs/contract_custom_no.md 92 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
docs/ipqc_remove_production_fields_frontend.md 197 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
docs/mes_oqc_check_result_frontend.md 89 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
docs/mes_oqc_required_fields_relax_frontend.md 118 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
docs/oqc_check_result_extend_frontend.md 71 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
docs/qc_item_mdm_resolution_and_list_columns.md 98 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
docs/qc_report_conclusion_print.md 97 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
docs/sql/ipqc_remove_production_fields.sql 22 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
docs/sql/mes_qc_oqc_check_result_extend.sql 37 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
docs/contract_custom_no.md
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,92 @@
# åˆåŒç¼–号支持自定义 - å‰ç«¯è”调方案
## æ¶‰åŠé¡µé¢
- CRM - åˆåŒç®¡ç† - æ–°å¢žåˆåŒå¼¹çª—
- CRM - åˆåŒç®¡ç† - ç¼–辑合同弹窗
## å˜æ›´æ¦‚è¿°
"合同编号"字段由"系统自动生成、不可编辑"改为"支持手工录入",新增和编辑两种模式均可编辑:
- æ–°å¢žæ—¶ç•™ç©º â†’ åŽç«¯è‡ªåŠ¨ç”Ÿæˆï¼ˆHT å‰ç¼€ï¼Œä¸ŽåŽŸè¡Œä¸ºä¸€è‡´ï¼‰
- æ–°å¢žæ—¶å¡«å†™ â†’ ä½¿ç”¨ç”¨æˆ·å¡«å†™çš„编号
- ç¼–辑时留空 â†’ ä¿æŒåŽŸç¼–å·ä¸å˜
- ç¼–辑时填写 â†’ ä½¿ç”¨ç”¨æˆ·å¡«å†™çš„编号(后端校验唯一性)
## API
| æ–¹æ³• | è·¯å¾„ | è¯´æ˜Ž |
|------|------|------|
| POST | /crm/contract/create | æ–°å¢žåˆåŒï¼Œè¯·æ±‚体新增 `no` å­—段 |
| PUT | /crm/contract/update | æ›´æ–°åˆåŒï¼Œ`no` å­—段可修改 |
| GET | /crm/contract/get | æŸ¥è¯¢åˆåŒè¯¦æƒ…,响应本就含 `no` å­—段(未变) |
**请求参数(POST /crm/contract/create、PUT /crm/contract/update):**
| å‚æ•° | ç±»åž‹ | å¿…å¡« | è¯´æ˜Ž |
|------|------|------|------|
| no | String | å¦ | åˆåŒç¼–号,最长 100 å­—符;新增时留空(或不传)由后端自动生成,更新时留空保持原编号 |
其余参数与现状一致,此处不再列出。
**响应(未变更):**
```json
{
  "code": 0,
  "data": 123,
  "msg": ""
}
```
`data` ä¸ºæ–°å»ºåˆåŒçš„ ID。
## å‰ç«¯ä¿®æ”¹ç‚¹
### 1. åˆåŒç¼–号字段(新增弹窗 + ç¼–辑弹窗)
| äº‹é¡¹ | çŽ°çŠ¶ | éœ€æ”¹ä¸º |
|------|------|--------|
| disabled | æ–°å¢žç¦ç”¨ã€ç¼–辑禁用 | ä¸¤ç§æ¨¡å¼å‡å¯ç¼–辑(去掉禁用) |
| placeholder | ä¿å­˜æ—¶è‡ªåŠ¨ç”Ÿæˆ | æ–°å¢žï¼šç•™ç©ºåˆ™è‡ªåŠ¨ç”Ÿæˆï¼›ç¼–è¾‘ï¼šç•™ç©ºåˆ™ä¿æŒåŽŸç¼–å· |
| å…¶ä»– | â€” | å¯æ¸…空、最大长度 100 |
### 2. ä¿å­˜æ—¶æäº¤è¯¥å­—段
新增/编辑保存时,需要把用户在"合同编号"中填写的值一并提交给后端。
### 3. ç¼–辑弹窗的其他字段
除合同编号外,编辑弹窗其余字段保持不变。
## å­—段展示规则
| å­—段 | å±•示位置 | è¯´æ˜Ž |
|------|----------|------|
| åˆåŒç¼–号 | æ–°å¢žå¼¹çª— | ç”¨æˆ·å¯å¡«å†™ï¼›ç•™ç©ºåˆ™ç”±åŽç«¯ç”Ÿæˆ |
| åˆåŒç¼–号 | ç¼–辑弹窗 | ç”¨æˆ·å¯ä¿®æ”¹ï¼›ç•™ç©ºåˆ™ä¿æŒåŽŸç¼–å· |
| åˆåŒç¼–号 | è¯¦æƒ…、列表 | å±•示后端实际保存的编号 |
## ä¸šåŠ¡è§„åˆ™è¯´æ˜Ž
| åœºæ™¯ | è§„则 |
|------|------|
| æ–°å¢žæ—¶å¡«å†™äº†ç¼–号 | ä½¿ç”¨ç”¨æˆ·å¡«å†™çš„编号,首尾空格会被自动去掉 |
| æ–°å¢žæ—¶ç•™ç©ºæˆ–只填空格 | åŽç«¯è‡ªåŠ¨ç”Ÿæˆ HT å‰ç¼€ç¼–号 |
| ç¼–辑时填写了编号 | ä½¿ç”¨ç”¨æˆ·å¡«å†™çš„编号,首尾空格会被自动去掉 |
| ç¼–辑时留空或只填空格 | ä¿æŒåŽŸç¼–å·ä¸å˜ |
| æ–°å¢ž/编辑时修改的编号与已有合同重复 | ä¿å­˜å¤±è´¥ï¼Œæç¤ºï¼šåˆåŒç¼–号【xxx】已存在,请更换后重试 |
| ç¼–辑时未改动编号 | æ­£å¸¸ä¿å­˜ï¼Œä¸ä¼šè¯¯æŠ¥é‡å¤ |
| è‡ªåŠ¨ç”Ÿæˆçš„ç¼–å·é‡å¤ï¼ˆæžå°æ¦‚çŽ‡ï¼‰ | ä¿å­˜å¤±è´¥ï¼Œæç¤ºï¼šç”ŸæˆåˆåŒåºåˆ—号重复,请重试(重新保存即可) |
| ç¼–号超过 100 å­—符 | ä¿å­˜å¤±è´¥ï¼Œæç¤ºï¼šåˆåŒç¼–号长度不能超过 100 ä¸ªå­—符 |
| ç”±æŠ¥ä»·å•转合同 | ä¸å—影响,仍自动生成编号 |
| Excel å¯¼å…¥åˆåŒ | ä¸å—影响,导入本身已支持自定义编号 |
## æ³¨æ„äº‹é¡¹
- æ–°å¢žæŽ¥å£è¿”回的是合同 ID,不包含最终编号。若新增后需要在界面上显示实际编号,请在保存成功后调用 `GET /crm/contract/get?id={id}` èŽ·å–ï¼Œæˆ–ç›´æŽ¥ä½¿ç”¨ç”¨æˆ·è‡ªå·±å¡«å†™çš„å€¼ã€‚
- ç¼–号唯一性由后端校验,前端无需额外查重;编辑时后端查重会排除合同自身,因此原样提交不会误报重复。
- ç¼–号长度上限 100 å­—符,前端可做输入长度限制以改善体验。
- ä¸åšå‰ç«¯æ ¡éªŒä¹Ÿä¸å½±å“æ­£ç¡®æ€§ï¼šæ–°å¢žç•™ç©ºèµ°è‡ªåŠ¨ç”Ÿæˆã€ç¼–è¾‘ç•™ç©ºä¿æŒåŽŸå€¼ï¼Œé‡å¤ä¼šè¢«åŽç«¯æ‹¦æˆªå¹¶è¿”å›žæ˜Žç¡®æç¤ºã€‚
- åˆåŒç¼–号的变更会计入合同操作日志(更新记录中体现"合同编号:原值 â†’ æ–°å€¼")。
docs/ipqc_remove_production_fields_frontend.md
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,197 @@
# è¿‡ç¨‹æ£€éªŒå•(IPQC)去掉生产订单/工位/生产任务、新增必填批号 - å‰ç«¯è”调方案
## å˜æ›´èƒŒæ™¯
过程检验单(IPQC)原表单要求先选「生产订单」,再由订单带出「工位」「生产任务」,并由工单/任务反推「产品物料」「质检方案」「工序」。
本次改造**去掉生产订单、工位、生产任务三个字段(工序一并去掉)**,改为:
- ã€Œäº§å“ç‰©æ–™ã€ç”±å‰ç«¯**手动选择,必填**(从待检任务入口创建时仍自动带入);
- æ–°å¢žã€Œæ‰¹å·ã€è¾“入框,**手工录入文本,必填**。
改造后 IPQC çš„表单结构与同模块已上线的 **IQC / OQC ä¸€è‡´**:单据 = æ¥æºå•据 + äº§å“ç‰©æ–™ + æ‰¹å· + æ•°é‡ + æ£€éªŒä¿¡æ¯ã€‚
> **重要(物料 ID ä½“系)**:IPQC çš„「产品物料」由原「MES ç‰©æ–™ï¼ˆ`mes_md_item`)」统一为 **MDM ç‰©æ–™ï¼ˆ`mdm_item`)**,与 IQC/OQC ç›¸åŒã€‚前端必须使用 **`MdmItemSelect`** ç»„件(`#/views/basicData/mdm/components`,勿与 MES ä¾§çš„ `MdItemSelect`(`#/views/mes/md/item/components`)混用),不要再使用任何挂工单/任务的物料选择器。
## æ¶‰åŠé¡µé¢
| æ–‡ä»¶ | è¯´æ˜Ž |
|------|------|
| `src/views/mes/qc/ipqc/data.ts` | è¡¨å• schema、列表搜索 schema、列表列定义 |
| `src/views/mes/qc/ipqc/index.vue` | åˆ—表页(引用上面 schema) |
| `src/views/mes/qc/ipqc/modules/form.vue` | æ–°å¢ž/编辑表单弹窗 |
| `src/views/mes/qc/pendinginspect/index.vue` | å¾…检任务页的「生成过程检验单」按钮(数据带入) |
| `src/api/mes/qc/ipqc/index.ts` | IPQC æŽ¥å£ç±»åž‹å®šä¹‰ |
| `src/api/mes/qc/pendinginspect/index.ts` | å¾…检任务接口类型定义 |
## ä¸šåŠ¡æµç¨‹ä¸Žæ•°æ®å¸¦å…¥
```
报工审批通过(需检验) â†’ ç”Ÿæˆäº§å‡ºè¡Œï¼ˆquality_status=待检)+ æ‰¹æ¬¡å·
        â”‚
        â–¼
   å¾…检任务页(qcType = IPQC)
        â”‚  ç‚¹å‡»ã€Œç”Ÿæˆè¿‡ç¨‹æ£€éªŒå•」带入:来源单据类型/ID/行ID、来源单据编号、
        â”‚  äº§å“ç‰©æ–™ã€æ‰¹å·ã€å¾…检数量、检测日期
        â–¼
   IPQC è¡¨å•(用户补全:检验类型、检测人员、合格/不合格数量等)
        â”‚
        â–¼
   ä¿å­˜ â†’ å®Œæˆæ£€éªŒ â†’ å›žå†™æŠ¥å·¥ + æ‹†åˆ†äº§å‡ºè¡Œ + å®Œæˆäº§å‡ºå…¥åº“
```
### æ•°æ®å¸¦å…¥è§„则(待检任务 â†’ IPQC è¡¨å•)
| è¡¨å•字段 | å¾…检任务响应字段 | å¸¦å…¥åŽæ˜¯å¦å¯ç¼–辑 |
|----------|------------------|------------------|
| æ¥æºå•据类型 sourceDocType | sourceDocType | å¦ï¼ˆéšè—åªè¯»ï¼‰ |
| æ¥æºå•据编号 sourceDocCode | sourceDocCode | å¦ï¼ˆåªè¯»å±•示) |
| æ¥æºå•据 ID sourceDocId | sourceDocId | å¦ï¼ˆéšè—å­—段) |
| æ¥æºå•据行 ID sourceLineId | sourceLineId | å¦ï¼ˆéšè—å­—段) |
| äº§å“ç‰©æ–™ itemId | itemId | å¦ï¼ˆæœ‰æ¥æºå•据时置灰) |
| **批号 batchCode(本次新增)** | **batchCode(本次新增)** | **是**(建议带入后仍允许人工修正) |
| æ£€æµ‹æ•°é‡ checkQuantity | quantity | å¦ï¼ˆæœ‰æ¥æºå•据时置灰) |
| æ£€æµ‹æ—¥æœŸ inspectDate | recordTime | æ˜¯ |
> å¾…检任务入口带入的「批号」来自产出行 `batch_code`(报工审批通过时由系统生成的批次号)。**当前只有 IPQC æ¥æºä¼šè¿”回 `batchCode`,IQC/OQC/RQC æ¥æºè¯¥å­—段为 `null`**,前端对其它检验类型忽略该字段即可。
## API
### 1. åˆ›å»º / æ›´æ–°è¿‡ç¨‹æ£€éªŒå•
| æ–¹æ³• | è·¯å¾„ | è¯´æ˜Ž |
|------|------|------|
| POST | `/mes/qc/ipqc/create` | åˆ›å»ºè¿‡ç¨‹æ£€éªŒå• |
| PUT | `/mes/qc/ipqc/update` | æ›´æ–°è¿‡ç¨‹æ£€éªŒå• |
**请求参数(仅列出本次变更字段):**
| å‚æ•° | ç±»åž‹ | å¿…å¡« | è¯´æ˜Ž |
|------|------|------|------|
| ~~workOrderId~~ | Long | â€” | **已删除**,不再允许提交 |
| ~~taskId~~ | Long | â€” | **已删除**,不再允许提交 |
| ~~workstationId~~ | Long | â€” | **已删除**,不再允许提交 |
| ~~processId~~ | Long | â€” | **已删除**,不再允许提交 |
| batchCode | String | **是** | æ‰¹å·ï¼Œæ‰‹å·¥å½•入文本,最长 100 å­—符 |
| itemId | Long | **是** | äº§å“ç‰©æ–™ ID(**MDM ç‰©æ–™ ID**),由 `MdmItemSelect` æä¾› |
| templateId | Long | å¦ | è´¨æ£€æ–¹æ¡ˆ ID;不传时后端按 `itemId + æ£€éªŒç±»åž‹(IPQC)` è‡ªåŠ¨å–ç¬¬ä¸€ä¸ªåŒ¹é…æ–¹æ¡ˆ |
> å…¶ä½™å­—段(code、name、type、checkQuantity、qualifiedQuantity、unqualifiedQuantity、工废/料废/其他废品数量、inspectorUserId、inspectDate、samplingLocation、certificateNo、executeStandard、auditUserId、approveUserId、checkResult、remark)保持不变。
**响应:** `{ "code": 0, "data": <过程检验单 ID> }`
### 2. åˆ†é¡µæŸ¥è¯¢
| æ–¹æ³• | è·¯å¾„ | è¯´æ˜Ž |
|------|------|------|
| GET | `/mes/qc/ipqc/page` | èŽ·å¾—è¿‡ç¨‹æ£€éªŒå•åˆ†é¡µ |
**查询参数(本次变更):**
| å‚æ•° | ç±»åž‹ | è¯´æ˜Ž |
|------|------|------|
| ~~workOrderId~~ | Long | **已删除** |
| batchCode | String | **新增**,批号,模糊匹配 |
### 3. è¯¦æƒ… / å¯¼å‡º
| æ–¹æ³• | è·¯å¾„ | è¯´æ˜Ž |
|------|------|------|
| GET | `/mes/qc/ipqc/get?id=` | è¯¦æƒ…,响应字段随下列变更 |
| GET | `/mes/qc/ipqc/export-excel` | å¯¼å‡º Excel,**「批号」列取 `batchCode`**(原取来源单据编号) |
### 4. è´¨æ£€æ–¹æ¡ˆé€‰é¡¹ï¼ˆè¡¨å•联动)
| æ–¹æ³• | è·¯å¾„ | è¯´æ˜Ž |
|------|------|------|
| GET | `/mes/qc/template/item/list-by-item-and-type` | æŒ‰ç‰©æ–™ + æ£€éªŒç±»åž‹å–可用质检方案 |
**参数变更:** ç”±åŽŸæ¥çš„ `{ qcType: 2, workOrderId, taskId }` æ”¹ä¸º **`{ qcType: 2, itemId }`**(`itemId` ä¸º MDM ç‰©æ–™ ID)。
### 5. å¾…检任务分页(响应新增字段)
| æ–¹æ³• | è·¯å¾„ | è¯´æ˜Ž |
|------|------|------|
| GET | `/mes/qc/pending-inspect/page` | å¾…检任务分页 |
**响应新增字段:**
| å­—段 | ç±»åž‹ | è¯´æ˜Ž |
|------|------|------|
| batchCode | String | æ‰¹å·ï¼Œ**当前仅 IPQC(产出行)来源提供**,其余来源为 `null` |
## å“åº”字段变更(详情 / åˆ†é¡µåˆ—表)
**删除字段:**
| å­—段 | è¯´æ˜Ž |
|------|------|
| workOrderId / workOrderCode / workOrderName | ç”Ÿäº§è®¢å• |
| taskId | ç”Ÿäº§ä»»åŠ¡ |
| workstationId / workstationName | å·¥ä½ |
| processId / processName | å·¥åº |
**新增字段:**
| å­—段 | ç±»åž‹ | è¯´æ˜Ž |
|------|------|------|
| batchCode | String | æ‰¹å· |
**保留不变:** itemId、itemCode、itemName、itemSpecification、unitName、检查数量类字段、checkResult、inspectDate、inspectorUserId / inspectorNickname、status、samplingLocation、certificateNo、executeStandard、auditUserId / auditNickname、approveUserId / approveNickname、remark。
## å­—段展示规则
| å­—段 | å±•示位置 | è¯´æ˜Ž |
|------|----------|------|
| äº§å“ç‰©æ–™ itemId | è¡¨å•、列表 | è¡¨å•用 `MdmItemSelect` é€‰æ‹©ï¼Œ**必填**;列表展示 `itemCode / itemName / itemSpecification`(原样保留) |
| æ‰¹å· batchCode | è¡¨å•、列表、详情、导出 | **表单必填**;列表新增列展示(建议放在「产品物料」之后);导出列「批号」 |
| ç”Ÿäº§è®¢å• / å·¥ä½ / ç”Ÿäº§ä»»åŠ¡ | â€” | ä»Žè¡¨å•、列表列、列表搜索、详情、导出中**全部移除** |
| è´¨æ£€æ–¹æ¡ˆ templateId | è¡¨å• | é€‰æ‹©èŒƒå›´æ”¹ç”±ã€Œäº§å“ç‰©æ–™ã€é©±åŠ¨ï¼ˆä¸å†ç”±ç”Ÿäº§è®¢å•é©±åŠ¨ï¼‰ |
### è¡¨å•字段调整建议(仅列调整项)
| æ“ä½œ | å­—段 | è¯´æ˜Ž |
|------|------|------|
| åˆ é™¤ | ç”Ÿäº§è®¢å• `workOrderId` | å«å…¶ `ProWorkOrderSelect` åŠè”动清空 taskId çš„逻辑 |
| åˆ é™¤ | å·¥ä½ `workstationId` | å« `MdWorkstationSelect` |
| åˆ é™¤ | ç”Ÿäº§ä»»åŠ¡ `taskId` | å« `ProTaskSelect` |
| æ–°å¢ž | æ‰¹å· `batchCode` | `Input`,`rules: 'required'`,`maxlength: 100` |
| ä¿®æ”¹ | äº§å“ç‰©æ–™ `itemId` | æ”¹ä¸º `MdmItemSelect` + `rules: 'selectRequired'`;`dependencies.triggerFields` ç”± `['sourceDocId']` ä¿æŒï¼ˆæœ‰æ¥æºå•据时置灰) |
| ä¿®æ”¹ | è´¨æ£€æ–¹æ¡ˆ `templateId` | `dependencies.triggerFields` ç”± `['workOrderId', 'taskId']` æ”¹ä¸º `['itemId']`;`disabled` æ¡ä»¶ç”± `!values.workOrderId` æ”¹ä¸º `!values.itemId`;`params` æ”¹ä¸º `{ itemId: values.itemId, qcType: 2 }`;占位文案由「请先选择生产订单」改为「请先选择产品物料」 |
| ä¿®æ”¹ | åˆ—表搜索 | `workOrderId`(生产订单)替换为 `batchCode`(批号,`Input`,`allowClear`,模糊查询) |
| ä¿®æ”¹ | åˆ—表列 | åˆ é™¤ã€Œç”Ÿäº§è®¢å•编号」列;新增「批号」列(`batchCode`) |
> å‚考实现:`src/views/mes/qc/oqc/data.ts` çš„ `itemId`(`MdmItemSelect`)与 `templateId`(`params: { itemId, qcType: 3 }`)写法,IPQC åªéœ€æŠŠ `qcType` æ¢æˆ IPQC çš„字典值。
### å¾…检任务页带入调整
`src/views/mes/qc/pendinginspect/index.vue` çš„ `handleCreateIpqc` é¢„填对象:
| æ“ä½œ | å­—段 | è¯´æ˜Ž |
|------|------|------|
| åˆ é™¤ | `taskId` / `workOrderId` / `workstationId` | åŽç«¯å·²ä¸å†æŽ¥æ”¶ï¼Œä¸”表单已无对应控件 |
| ä¿ç•™ | `itemId` / `checkQuantity` / `inspectDate` / `name` / `sourceDocCode` / `sourceDocId` / `sourceDocType` / `sourceLineId` | è¯­ä¹‰ä¸å˜ |
| **新增** | `batchCode: row.batchCode` | ä»Žå¾…检任务带入批号(该字段仅 IPQC æ¥æºæœ‰å€¼ï¼‰ |
## ä¸šåŠ¡è§„åˆ™è¯´æ˜Ž
| åœºæ™¯ | è§„则 |
|------|------|
| æ‰‹å·¥æ–°å»º IPQC | ç›´æŽ¥é€‰æ‹©äº§å“ç‰©æ–™ï¼ˆMDM)+ å¡«å†™æ‰¹å·ï¼›åŽç«¯æŒ‰ `itemId + IPQC` åŒ¹é…è´¨æ£€æ–¹æ¡ˆå¹¶è‡ªåŠ¨ç”Ÿæˆæ£€éªŒè¡Œ |
| æŒ‡å®šè´¨æ£€æ–¹æ¡ˆ | å‰ç«¯ä¼  `templateId`,但必须落在 `itemId + IPQC` åŒ¹é…åˆ°çš„æ–¹æ¡ˆé›†åˆå†…,否则后端报「未匹配到质检方案」 |
| æœªåŒ¹é…åˆ°æ–¹æ¡ˆ | åŽç«¯è¿”回错误码 `QC_NO_TEMPLATE`,前端按通用错误提示展示即可 |
| ä»Žå¾…检任务创建 | ç‰©æ–™ã€æ‰¹å·ã€æ£€æµ‹æ•°é‡ã€æ£€æµ‹æ—¥æœŸã€æ¥æºå•据信息自动带入;来源单据字段保存后不可修改 |
| æ¥æºå•据回写 | IPQC å®ŒæˆåŽå›žå†™æŠ¥å·¥ï¼ˆåˆæ ¼/不合格/工废/料废/其他废品数量),并拆分产出行、完成产出入库。**该链路依赖 `sourceDocId + sourceLineId`,与本次删除的三个字段无关,不受影响** |
| æ‰¹å·å¿…填校验 | ç”±åŽç«¯ `@NotEmpty` ä¸Žå‰ç«¯ `rules: 'required'` åŒé‡ä¿è¯ï¼›æ‰¹å·ä¸ºç©ºæ—¶åŽç«¯è¿”回「批号不能为空」 |
| ç‰©æ–™å¿…填校验 | ç”±åŽç«¯ `@NotNull` ä¸Žå‰ç«¯ `rules: 'selectRequired'` åŒé‡ä¿è¯ï¼›ç‰©æ–™ä¸å­˜åœ¨æ—¶åŽç«¯è¿”回物料不存在错误 |
| åˆ—表查询 | ç”Ÿäº§è®¢å•筛选已下线,改为按批号模糊查询 |
## æ³¨æ„äº‹é¡¹
1. **物料选择器必须换成 `MdmItemSelect`**。若仍沿用原来的物料选择器或直接回填 MES ç‰©æ–™ ID,会出现「物料不存在」或「未匹配到质检方案」错误。
2. **质检方案下拉的 `params` å¿…须由 `workOrderId/taskId` æ”¹ä¸º `itemId`**,否则选完物料后方案列表为空或与所选物料不符。
3. **批号为必填**:新增/编辑表单与创建接口都需校验,从待检任务带入后也允许用户修正。
4. **待检任务的 `batchCode` åªæœ‰ IPQC æ¥æºæœ‰å€¼**(IQC/OQC/RQC æ’为 `null`),公共带入逻辑里不要假设它一定存在;无值时留空让用户手填。
5. **历史数据**:`mes_qc_ipqc` è¿ç§»å‰ä¸º 0 æ¡æ•°æ®ï¼Œæœ¬æ¬¡ä¸ºç›´æŽ¥åˆ åˆ— + åŠ åˆ—ï¼Œæ— éœ€å‰ç«¯åšå…¼å®¹å¤„ç†ã€‚DDL(删 `work_order_id`/`task_id`/`workstation_id`/`process_id`,加 `batch_code varchar(100)`)已于 **2026-09-22** åœ¨ yzfx åº“执行完毕。
6. **导出 Excel çš„「批号」列语义已变**:原先取「来源单据编号」,现改为取真正的批号。
7. ç”Ÿäº§è®¢å•/工位/生产任务/工序在**列表列、详情、导出**中都要一并移除,避免出现永久为空白的列。
docs/mes_oqc_check_result_frontend.md
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,89 @@
# MES å‡ºè´§æ£€éªŒå•(OQC)检测结果与表头字段调整 - å‰ç«¯è”调方案
> çŠ¶æ€ï¼šå‰ç«¯æ”¹åŠ¨å·²æŒ‰æœ¬æ–‡å®žæ–½ï¼ˆOQC è¡¨å•/搜索/列表列、批次追溯 OQC åˆ—、报告打印兜底文案、常量与枚举)。本文保留作为接口与规则说明。
## å˜æ›´æ‘˜è¦
| é¡¹ | è°ƒæ•´å‰ | è°ƒæ•´åŽ |
|----|--------|--------|
| å‘货数量 `outQuantity` | å¿…å¡« | **非必填** |
| å‡ºè´§æ—¥æœŸ `outDate` | å¿…å¡« | **非必填** |
| æ£€æµ‹ç»“æžœ `checkResult` | éžå¿…填,字典 `mes_qc_check_result`(合格/特采/退货/报废) | **必填**,改用新字典 `mes_oqc_check_result`(1型/2型/废品) |
其余字段(本次检测数量、合格品数量、不合格品数量、检测日期、检测人员)**保持必填不变**。
> ä»… OQC å˜æ›´ã€‚IQC / IPQC / RQC ç»§ç»­ä½¿ç”¨åŽŸå­—å…¸ `mes_qc_check_result`。
## æ¶‰åŠé¡µé¢
- MES å‡ºè´§æ£€éªŒå•(OQC)列表页
- MES å‡ºè´§æ£€éªŒå•(OQC)新增/编辑弹窗
- MES å‡ºè´§æ£€éªŒå•(OQC)详情页
- æ‰¹æ¬¡è¿½æº¯ï¼ˆbatchtrace)——OQC ç›¸å…³åˆ—
- æ£€éªŒæŠ¥å‘Šæ‰“印页——检测结果列(见「注意事项」第 3 æ¡ï¼‰
## API
| æ–¹æ³• | è·¯å¾„ | è¯´æ˜Ž |
|------|------|------|
| POST | /mes/qc-oqc/create | æ–°å¢žå‡ºè´§æ£€éªŒå• |
| PUT | /mes/qc-oqc/update | ä¿®æ”¹å‡ºè´§æ£€éªŒå• |
| GET | /mes/qc-oqc/get | æŸ¥è¯¢å‡ºè´§æ£€éªŒå•详情 |
| GET | /mes/qc-oqc/page | åˆ†é¡µæŸ¥è¯¢å‡ºè´§æ£€éªŒå• |
| GET | /mes/qc-oqc/export-excel | å¯¼å‡ºå‡ºè´§æ£€éªŒå• |
**请求参数变更(create / update å…±ç”¨ SaveReqVO):**
| å‚æ•° | ç±»åž‹ | å¿…å¡« | å˜æ›´è¯´æ˜Ž |
|------|------|------|----------|
| outQuantity | BigDecimal | å¦ | å‘货数量,改为非必填;填值需 â‰¥ 0 |
| outDate | LocalDateTime | å¦ | å‡ºè´§æ—¥æœŸï¼Œæ”¹ä¸ºéžå¿…å¡« |
| checkResult | Integer | **是** | æ£€æµ‹ç»“果,必填;取值改为 1=1型 / 2=2型 / 3=废品 |
**响应字段变更:**
| å­—段 | ç±»åž‹ | è¯´æ˜Ž |
|------|------|------|
| checkResult | Integer | æ£€æµ‹ç»“果,返回 1 / 2 / 3(字典 `mes_oqc_check_result`) |
| checkResultText | String | å¯¼å‡º Excel æ—¶çš„æ£€æµ‹ç»“果文本,已按新字典取标签 |
**字典接口返回(`/system/dict-data/list-by-type?type=mes_oqc_check_result`):**
| value | label | é¢œè‰² |
|-------|-------|------|
| 1 | 1型 | success |
| 2 | 2型 | primary |
| 3 | åºŸå“ | danger |
> åŽŸå­—å…¸ `mes_qc_check_result` ä»ä¿ç•™ï¼Œä¾› IQC / IPQC / RQC ä½¿ç”¨ã€‚
>
> âš  æ³¨æ„ï¼šä»£ç æžšä¸¾ `MesQcCheckResultEnum` å®šä¹‰ä¸º 1合格 / 2特采 / 3不合格退货 / 4不合格报废,但**库中 `mes_qc_check_result` å­—典数据只有 2 æ¡**(1=校验通过、2=校验不通过),标签与枚举不符、且缺 3/4 ä¸¤é¡¹ã€‚该问题为既有遗留,会影响 IQC/IPQC/RQC çš„æ£€æµ‹ç»“果展示,与本次 OQC å˜æ›´æ— å…³ï¼Œéœ€å¦è¡Œç¡®è®¤ä¿®å¤ã€‚
## å­—段展示规则
| å­—段 | å±•示位置 | è¯´æ˜Ž |
|------|----------|------|
| å‘货数量 | è¡¨å•、列表、详情 | éžå¿…填,允许为空;列表/详情空值展示为 `-` |
| å‡ºè´§æ—¥æœŸ | è¡¨å•、列表、详情 | éžå¿…填,允许为空 |
| æ£€æµ‹ç»“æžœ | è¡¨å•(下拉)、列表(字典标签)、详情、查询条件 | å­—典类型由 `mes_qc_check_result` æ”¹ä¸º `mes_oqc_check_result`;下拉选项为 1型 / 2型 / åºŸå“ |
## ä¸šåŠ¡è§„åˆ™è¯´æ˜Ž
| åœºæ™¯ | è§„则 |
|------|------|
| æ£€æµ‹ç»“果提交 | å¿…填。为空时后端返回「检测结果不能为空」 |
| æ£€æµ‹ç»“果取值 | 1型 / 2型:判为合格,对应出库行质量状态置为合格,出库单在全部 OQC è¡Œæ£€éªŒå®ŒæˆåŽæµè½¬ã€Œå¾…拣货」 |
| æ£€æµ‹ç»“果取值 | åºŸå“ï¼šåˆ¤ä¸ºä¸åˆæ ¼ï¼Œå¯¹åº”出库行质量状态置为不合格,并**取消整张销售出库单** |
| åŒä¸€å‡ºåº“单多行 OQC | åªè¦å­˜åœ¨ä»»ä¸€ã€ŒåºŸå“ã€è¡Œï¼Œæ•´å•取消;全部行检验完成且无废品才流转待拣货 |
| å‘货数量 / å‡ºè´§æ—¥æœŸ | å¯ç©ºï¼Œä¸å‚与任何校验与流转判断 |
| æ•°é‡ä¸€è‡´æ€§ï¼ˆæ—¢æœ‰è§„则不变) | æœ¬æ¬¡æ£€æµ‹æ•°é‡ = åˆæ ¼å“æ•°é‡ + ä¸åˆæ ¼å“æ•°é‡ï¼Œä¸æ»¡è¶³æ—¶åŽç«¯è¿”回「检测数量必须等于合格品数量与不合格品数量之和」 |
## æ³¨æ„äº‹é¡¹
1. **字典切换范围**:OQC çš„列表列、查询下拉、表单下拉、详情标签,字典类型需从 `mes_qc_check_result` å…¨éƒ¨åˆ‡åˆ° `mes_oqc_check_result`。若某处仍复用 `mes_qc_check_result`,会出现「1型」被渲染为「合格」的错位。
2. **搜索区字典**:使用 DICT_TYPE åˆ«åæ—¶éœ€åŒæ­¥æ–°å¢ž `mes_oqc_check_result` çš„字典类型常量声明,避免搜索项取不到选项。
3. **检验报告打印页**:该页「检测结果」列当前取 `mes_qc_check_result`,且报告是四类检验单共用的。若该页可能出现 OQC æ•°æ®ï¼Œéœ€è¦æŒ‰æ¥æºå•据类型区分字典;若该页只服务于 IQC/IPQC/RQC,则无需改动。请前端按实际取数范围确认。
4. **批次追溯页**:OQC ç›¸å…³åˆ—当前取 `mes_qc_check_result`,需切换为 `mes_oqc_check_result`;同页 IQC åˆ—保持原字典。
5. **表单校验提示**:「不合格品数量为 0 æ—¶æ£€æµ‹ç»“果不能为 XX」这类基于旧四选项的提示逻辑已失效(旧枚举 3/4 ä¸å†é€‚用于 OQC),需按新三选项重写或移除。
6. **历史数据**:现有 OQC å•据中检测结果为空,列表/详情需容忍 null(展示为 `-`)。无历史数据需要迁移。
7. **发货数量与出货日期**:去掉前端必填校验后,提交时字段可为 null æˆ–省略,后端不再报错;建议表单仍保留输入项(业务上可填)。
docs/mes_oqc_required_fields_relax_frontend.md
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,118 @@
# MES å‡ºè´§æ£€éªŒå•(OQC)新增/编辑字段放开必填 - å‰ç«¯è”调方案
> çŠ¶æ€ï¼šåŽç«¯ä¸Žå‰ç«¯å‡å·²æŒ‰æœ¬æ–‡å®žæ–½ã€‚æ”¹åŠ¨ç‚¹ï¼š
> `MesQcOqcSaveReqVO`(去校验)、`MesQcOqcRespVO`(Swagger æ ‡è®°ï¼‰ã€`MesQcOqcMapper`(客户为空时的可见性)、
> `src/views/mes/qc/oqc/data.ts`(去 rules)。前端只改了 form schema çš„ rules,未动列表/详情展示。
> åŽç«¯éœ€**重启**后生效。
## å˜æ›´æ‘˜è¦
OQC æ–°å¢ž/编辑表单中,以下 4 ä¸ªå­—段由必填改为非必填:
| å­—段 | åŽç«¯å±žæ€§ | è°ƒæ•´å‰ | è°ƒæ•´åŽ |
|------|----------|--------|--------|
| å®¢æˆ· | `clientId` | å¿…å¡« `@NotNull` | **非必填** |
| å‘货数量(本次出货数量) | `outQuantity` | å¿…å¡« `@NotNull` | **非必填**(填值仍需 â‰¥ 0) |
| æ£€æµ‹æ•°é‡ï¼ˆæœ¬æ¬¡æ£€æµ‹æ•°é‡ï¼‰ | `checkQuantity` | å¿…å¡« `@NotNull` | **非必填**(填值仍需 â‰¥ 0) |
| å‡ºè´§æ—¥æœŸ | `outDate` | å¿…å¡« `@NotNull` | **非必填** |
其余字段保持不变,仍为必填:检验单编号、检验单名称、产品物料、合格品数量、不合格品数量、检测日期、检测人员。
> ç›¸å…³åŽ†å²æ–‡æ¡£ï¼š`docs/mes_oqc_check_result_frontend.md` æ›¾è®¡åˆ’放开「发货数量 / å‡ºè´§æ—¥æœŸã€ä¸¤é¡¹ï¼Œä½†æœ¬ä»“库前端
> ï¼ˆ`src/views/mes/qc/oqc/data.ts`)目前仍是 `rules: 'required'`,即该两项也未实际放开。本次一并处理。
## æ¶‰åŠé¡µé¢
- MES å‡ºè´§æ£€éªŒå•(OQC)列表页 - æ–°å¢ž/编辑弹窗
- MES å‡ºè´§æ£€éªŒå•(OQC)列表页 - åˆ—表列、查询条件
- MES å‡ºè´§æ£€éªŒå•(OQC)详情页
- å¾…检任务页(`views/mes/qc/pendinginspect`)-「出货检验」按钮跳转的创建弹窗(预填模式)
## API
| æ–¹æ³• | è·¯å¾„ | è¯´æ˜Ž |
|------|------|------|
| POST | /mes/qc/oqc/create | æ–°å¢žå‡ºè´§æ£€éªŒå• |
| PUT | /mes/qc/oqc/update | ä¿®æ”¹å‡ºè´§æ£€éªŒå• |
| GET | /mes/qc/oqc/get | æŸ¥è¯¢å‡ºè´§æ£€éªŒå•详情 |
| GET | /mes/qc/oqc/page | åˆ†é¡µæŸ¥è¯¢å‡ºè´§æ£€éªŒå• |
| GET | /mes/qc/oqc/export-excel | å¯¼å‡ºå‡ºè´§æ£€éªŒå• |
**请求参数变更(create / update å…±ç”¨ `MesQcOqcSaveReqVO`):**
| å‚æ•° | ç±»åž‹ | å¿…å¡« | è¯´æ˜Ž |
|------|------|------|------|
| clientId | Long | å¦ | å®¢æˆ· ID,可空、可省略 |
| outQuantity | BigDecimal | å¦ | æœ¬æ¬¡å‡ºè´§æ•°é‡ï¼Œå¯ç©ºï¼›å¡«å€¼éœ€ â‰¥ 0 |
| checkQuantity | BigDecimal | å¦ | æœ¬æ¬¡æ£€æµ‹æ•°é‡ï¼Œå¯ç©ºï¼›å¡«å€¼éœ€ â‰¥ 0 |
| outDate | LocalDateTime | å¦ | å‡ºè´§æ—¥æœŸï¼Œå¯ç©º |
**响应字段变更(`MesQcOqcRespVO`):** æ— æ–°å¢žå­—段,仅 `clientId` / `outQuantity` çš„ Swagger `requiredMode` ç”± REQUIRED æ”¹ä¸ºå¯ç©ºã€‚
`clientNickname`、`unitName` ç­‰å…³è”字段在对应 ID ä¸ºç©ºæ—¶ä¸å†è¿”回(保持 null),前端需容忍空值。
**请求示例(最小可提交体):**
```json
{
  "code": "OQC20260922001",
  "name": "物料A出货检验",
  "itemId": 20,
  "qualifiedQuantity": 10,
  "unqualifiedQuantity": 0,
  "inspectDate": "2026-09-22 10:00:00",
  "inspectorUserId": 1
}
```
**响应:** `{ "code": 0, "data": 123 }`(data ä¸ºæ–°å»ºå•据 ID)
## å­—段展示规则
| å­—段 | å±•示位置 | è¯´æ˜Ž |
|------|----------|------|
| å®¢æˆ· | è¡¨å•、列表、详情、查询条件 | éžå¿…填;数据库值可为空,前端空值展示 `-` |
| å‘货数量 | è¡¨å•、列表、详情 | éžå¿…填;空值展示 `-`,不可展示为 `0` |
| æ£€æµ‹æ•°é‡ | è¡¨å•、列表、详情 | éžå¿…填;空值展示 `-`,不可展示为 `0` |
| å‡ºè´§æ—¥æœŸ | è¡¨å•、列表、详情 | éžå¿…填;空值展示 `-` |
## ä¸šåŠ¡è§„åˆ™è¯´æ˜Ž
| åœºæ™¯ | è§„则 |
|------|------|
| æäº¤æ ¡éªŒ | ä¸Šè¿° 4 ä¸ªå­—段为空或省略,后端不再报「XX不能为空」 |
| æ•°é‡ä¸‹é™ | ä»ä¿ç•™ï¼šå¡«äº†å€¼å°±å¿…é¡» â‰¥ 0,否则报「XX不能小于 0」 |
| æ•°é‡ä¸€è‡´æ€§ï¼ˆæ—¢æœ‰è§„则不变) | æ£€æµ‹æ•°é‡ã€åˆæ ¼å“æ•°é‡ã€ä¸åˆæ ¼å“æ•°é‡ä¸‰è€…**都填了**时,必须满足「检测数量 = åˆæ ¼å“æ•°é‡ + ä¸åˆæ ¼å“æ•°é‡ã€ï¼Œå¦åˆ™æŠ¥ã€Œæ£€æµ‹æ•°é‡å¿…须等于合格品数量与不合格品数量之和」;检测数量为空时不做该校验 |
| å®Œæˆæ£€éªŒå• | ä¸Žæœ¬æ¬¡å˜æ›´æ— å…³ï¼Œä»è¦æ±‚:检测结果必填 + è‡³å°‘一条检测结果记录 |
| ç¼ºé™·çŽ‡è®¡ç®— | æ£€æµ‹æ•°é‡ä¸ºç©ºæ—¶ï¼Œè‡´å‘½/严重/轻微缺陷率按 0 å¤„理(后端已处理) |
| å¯¼å‡º Excel | ç©ºçš„客户/数量/日期列导出为空白单元格 |
| AI æŠ¥å‘Š / è´¨æ£€æŠ¥å‘Š | å®¢æˆ·ä¸ºç©ºæ—¶æŠ¥å‘Šä¸è¾“出「客户名称」;出货数量为空时不输出该项,不报错 |
## æ³¨æ„äº‹é¡¹
1. **前端必填校验已放开**:`src/views/mes/qc/oqc/data.ts` ä¸­ `useFormSchema` é‡Œè¿™ 4 ä¸ªå­—段的 `rules` å·²ç§»é™¤
   ï¼ˆ`clientId` åŽŸ `'selectRequired'`;`outQuantity` / `checkQuantity` / `outDate` åŽŸ `'required'`)。
   å…¶ä½™å­—段 rules æœªåŠ¨ã€‚
2. **列表/详情空值展示**:本次未改列表/详情模板,空值按 VXE é»˜è®¤æ¸²æŸ“为**空白**(不是 `-`),
   æ³¨æ„ä¸è¦ä¸ºäº†å¥½çœ‹æ”¹æˆ `?? 0`,会把「未填」显示成 `0`,与业务含义不符。
3. **发货数量与检测数量联动逻辑**:现有表单有「新建态下,填发货数量自动带出检测数量,反之亦然」的 `onChange` é€»è¾‘,
   åˆ¤æ–­ä¾èµ– `values.checkQuantity === null`。本次未改该逻辑,行为保持原样(仅用户主动输入时触发,清空后不会被自动填回)。
   è‹¥åŽç»­å‘现 antd InputNumber å›žå¡« `undefined` å¯¼è‡´è”动失效或互相覆盖,再按需调整。
4. **待检任务预填**:`pendinginspect` é¡µé€šè¿‡ `prefill` å¸¦å…¥ `clientId` / `outQuantity`,`form.vue` é‡Œä¼šç”¨
   `data.prefill.checkQuantity ?? data.prefill.outQuantity` è¡¥é½æ£€æµ‹æ•°é‡ã€‚放开必填后这个「补齐」仍可保留(业务上合理),
   ä½†è¦ç¡®è®¤ç”¨æˆ·æ¸…空后不会被再次自动填回。
5. **客户为空时列表可见性(已处理)**:
   OQC åˆ—表查询带客户权限过滤——`MesQcOqcServiceImpl.getOqcPage` å– `customerApi.getPermittedCustomerIds()`,
   éžç©ºæ—¶æ‹¼ `client_id IN (...)`。放开客户必填后,客户为空的单据原本会连**建单人自己**都看不到(受限用户),
   å·²åœ¨ `MesQcOqcMapper.selectPage(reqVO, permittedClientIds)` ä¸­æ”¹ä¸ºï¼š
   - æœ‰æƒé™å®¢æˆ·åˆ—表:`client_id IS NULL OR client_id IN (...)`
   - æ²¡æœ‰ä»»ä½•有权限客户(列表为空):只查 `client_id IS NULL`
   å³ã€Œæ— å®¢æˆ·çš„单据不属于任何客户,不受客户权限遮挡,对所有人生效」。超管等 `getPermittedCustomerIds()` è¿”回 null
   çš„用户本来就不做过滤,不受影响。
6. **历史数据**:现有 OQC å•据的这 4 ä¸ªå­—段都有值,无需数据迁移。
docs/oqc_check_result_extend_frontend.md
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,71 @@
# OQC å‡ºåŽ‚æ£€éªŒï¼ˆå‡ºè´§æ£€éªŒï¼‰æ£€æµ‹ç»“æžœæ‰©å±• - å‰ç«¯è”调方案
## å˜æ›´èƒŒæ™¯
出厂检验(OQC å‡ºè´§æ£€éªŒï¼‰çš„「检测结果」由原来的 3 é¡¹æ‰©å±•为 7 é¡¹ï¼Œå¹¶æ˜Žç¡®æ”¾è¡Œè§„则。
| value | æ ‡ç­¾ | é¢œè‰² | æ˜¯å¦æ”¾è¡Œå‘è´§ |
|-------|------|------|--------------|
| 1 | 1型 | success | æ”¾è¡Œ |
| 2 | 2型 | primary | æ”¾è¡Œ |
| 3 | åºŸå“ | danger | **不放行** |
| 4 | 3型 | success | æ”¾è¡Œ |
| 5 | ä¼˜ç­‰å“ | success | æ”¾è¡Œ |
| 6 | åˆæ ¼å“ | primary | æ”¾è¡Œ |
| 7 | ä¸åˆæ ¼å“ | danger | **不放行** |
## æ¶‰åŠé¡µé¢
- MES è´¨æ£€ - å‡ºè´§æ£€éªŒï¼ˆOQC)列表页、新增/编辑弹窗
- æ‰¹æ¬¡è¿½æº¯è¯¦æƒ…(展示 OQC æ£€éªŒç»“论)
- æ£€éªŒæŠ¥å‘Šæ‰“印、产品检验单 Word å¯¼å‡ºï¼ˆåˆ¤å®šç»“论展示)
## å­—典来源
检测结果下拉的选项来自字典 `mes_oqc_check_result`(前端常量 `DICT_TYPE.MES_OQC_CHECK_RESULT`),
选项由字典驱动、**不需要前端硬编码**。后端已扩展字典数据,下拉框会自动带出全部 7 é¡¹ã€‚
## æŽ¥å£
本次无接口新增、无请求参数与响应结构变更:
`checkResult` å­—段仍为 Integer,仅取值范围由 1~3 æ‰©å±•为 1~7。
| æ–¹æ³• | è·¯å¾„ | è¯´æ˜Ž |
|------|------|------|
| POST | /mes/qc-oqc/create | æ–°å¢žå‡ºè´§æ£€éªŒå• |
| PUT | /mes/qc-oqc/update | ä¿®æ”¹å‡ºè´§æ£€éªŒå• |
| PUT | /mes/qc-oqc/finish | å®Œæˆå‡ºè´§æ£€éªŒå• |
| GET | /mes/qc-oqc/get | æŸ¥è¯¢å‡ºè´§æ£€éªŒå•详情 |
## ä¸šåŠ¡æµç¨‹ä¸Žæ•°æ®å¸¦å…¥
1. é”€å”®å‡ºåº“单提交 â†’ ç”Ÿæˆ OQC å‡ºè´§æ£€éªŒå•(草稿态),单据信息自动带入。
2. è´¨æ£€å‘˜å½•入检测结果(下拉选择)→ å®Œæˆæ£€éªŒå•。
3. å®ŒæˆåŽæŒ‰æ”¾è¡Œè§„则回写销售出库单行:
   - ç»“果为 1型/2型/3型/优等品/合格品 â†’ å‡ºåº“行判**合格**,出库单推进「待拣货」。
   - ç»“果为 åºŸå“/不合格品 â†’ å‡ºåº“行判**不合格**,**整单取消**销售出库单。
4. æ ¡éªŒè§„则:检测数量 = åˆæ ¼å“æ•°é‡ + ä¸åˆæ ¼å“æ•°é‡ï¼ˆåŽŸæœ‰è§„åˆ™ï¼Œä¸å˜ï¼‰ã€‚
## å‰ç«¯éœ€åŒæ­¥çš„修改点
| ä½ç½® | ä¿®æ”¹è¯´æ˜Ž |
|------|----------|
| `src/packages/constants/src/biz-mes-enum.ts` | `MesQcOqcCheckResultEnum` å¸¸é‡è¡¥å…… 4 ä¸ªæ–°å€¼ï¼š3型=4、优等品=5、合格品=6、不合格品=7 |
| `src/views/mes/qc/oqc/modules/form.vue` | æäº¤æ ¡éªŒã€Œä¸åˆæ ¼å“æ•°é‡ä¸º 0 æ—¶ï¼Œæ£€æµ‹ç»“果不能为废品」需扩展为:检测结果为**废品或不合格品**时,不合格品数量不能为 0 |
> ä¸‹æ‹‰é€‰é¡¹æœ¬èº«ç”±å­—典驱动,仅补字典即可显示;上表两项是为了常量语义完整与校验一致。
## ä¸šåŠ¡è§„åˆ™è¯´æ˜Ž
| åœºæ™¯ | è§„则 |
|------|------|
| ç»“果为可放行等级 | å‡ºåº“行判合格,销售出库单推进待拣货 |
| ç»“果为 åºŸå“ æˆ– ä¸åˆæ ¼å“ | å‡ºåº“行判不合格,取消销售出库单 |
| ä¸åˆæ ¼å“æ•°é‡ä¸º 0 | ä¸å…è®¸é€‰æ‹© åºŸå“ / ä¸åˆæ ¼å“ |
| æ£€æµ‹æ•°é‡æ ¡éªŒ | æ£€æµ‹æ•°é‡ = åˆæ ¼å“æ•°é‡ + ä¸åˆæ ¼å“æ•°é‡ |
## æ³¨æ„äº‹é¡¹
- åŽ†å²æ•°æ®ä¸­å·²ä¿å­˜çš„ `checkResult`(1/2/3)语义不变,无需数据迁移。
- å­—典颜色 `color_type` ä¼šå½±å“åˆ—表标签配色,前端使用字典标签渲染时不需额外处理。
- åŽç«¯æ”¾è¡Œåˆ¤å®šç»Ÿä¸€æ”¶æ•›åœ¨ `MesQcOqcCheckResultEnum.canShip()`,前端不要自行实现放行判断。
docs/qc_item_mdm_resolution_and_list_columns.md
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,98 @@
# è´¨æ£€å•「产品物料带不出」修复 + åˆ—表字段瘦身 - å‰ç«¯è”调方案
## çŽ°çŠ¶è¯´æ˜Žï¼ˆ2026-09-22 ä¿®æ­£ï¼‰
本文原先标注后端改动「已完成」,**经实测为不实**:`grep MdmItemApi` åœ¨ `controller/admin/qc` ä¸‹é›¶å‘½ä¸­ï¼Œå³è´¨æ£€æŽ§åˆ¶å™¨å½“时仍走 MES ä¾§ `MesMdItemService`,物料名称依旧查不出来(`mes_md_item` 60 è¡Œ âŠ‚ `mdm_item` 75 è¡Œï¼Œæ¼æŽ‰çš„ 15 ä¸ªç‰©æ–™æ˜¾ç¤ºä¸ºç©ºï¼›`mes_md_unit_measure` 0 è¡Œï¼Œå•位恒为空)。
**现已于 2026-09-22 çœŸæ­£è½åœ°**,实际改动清单见下方「后端改动」表(本次改为以真实代码为准,逐文件列出)。前端联调内容(列表瘦身、`MdmItemSelect`)不受影响,仍按下文执行。
## å˜æ›´èƒŒæ™¯
1. **产品物料信息查不出来**:IQC / IPQC / OQC / RQC å››å¼ æ£€éªŒå•(以及「待检任务」页)的分页与详情接口中,`itemCode`(物料编码)、`itemName`(物料名称)、`itemSpecification`(规格型号)、`unitName`(单位)恒为空。
2. **列表字段过于冗杂**:检验单分页列表把大量**非必填**字段也作为列展示,信息密度低。
## æ ¹æœ¬åŽŸå› ï¼ˆç¬¬ 1 é¡¹ï¼‰
质检单据的 `item_id` å­˜çš„æ˜¯ **MDM ç‰©æ–™ ID**(`mdm_item.id`),后端却去 **MES ç‰©æ–™è¡¨**(`mes_md_item`)反查名称,两张表不是一套 ID ä½“系,导致查不到(`mes_md_item` ç”šè‡³å¯èƒ½ä¸ºç©ºè¡¨ï¼‰ã€‚
相关说明见记忆「MES ç‰©æ–™ ID åŒè½¨åˆ¶ã€ï¼šWM/质检单据用 `mdm_item.id`,PRO å·¥å•/任务用 `mes_md_item.id`。
## åŽç«¯æ”¹åŠ¨ï¼ˆ2026-09-22 å·²å®Œæˆï¼ŒæŽ¥å£ç»“构未变,仅响应值变正确)
| æ–‡ä»¶ | æ”¹åЍ |
|------|------|
| `MesQcIpqcController` | ç‰©æ–™/单位改由 `MdmItemApi` / `MdmUnitMeasureApi` è§£æžï¼ˆåˆ—表 VO ä¸Žå¯¼å‡ºè¡Œä¸¤å¤„) |
| `MesQcIqcController` | åŒä¸Šï¼ˆåŒæ—¶è¯¥ Service çš„物料校验早已走 `mdmItemApi`) |
| `MesQcOqcController` | åŒä¸Š |
| `MesQcRqcController` | åŒä¸Šï¼›`MesQcRqcServiceImpl` çš„物料校验一并由 `MesMdItemService` æ”¹ä¸º `MdmItemApi` |
| `MesQcNcrController`(顺带) | ä¸åˆæ ¼å“å¤„理单的 `itemId` ç»§æ‰¿è‡ªè´¨æ£€å•,同口径切到 `MdmItemApi`,否则 NCR åˆ—表物料名为空 |
| `MesQc*LineController`(IPQC/IQC/OQC/RQC è¡Œï¼‰ | è¡Œæ˜Žç»†çš„计量单位由 `MdmUnitMeasureApi` è§£æž |
| `MesQcPendingInspectController` | åœ¨ `buildPendingInspectRespVOList` ä¸­æŒ‰ `item_id` æ‰¹é‡è¡¥ `itemCode/itemName/specification/unitName`(原走 MES ä¾§è§£æžï¼Œæ¼ 15 ä¸ªç‰©æ–™ï¼‰ |
| `MesQcTemplateItemController` | äº§å“å…³è”列表的物料/计量单位由 `MesMdmItemService`/`MesMdUnitMeasureService` æ”¹ä¸º `MdmItemApi`/`MdmUnitMeasureApi`(`mes_md_unit_measure` ä¸º 0 è¡Œï¼ŒåŽŸå•ä½æ’ä¸ºç©ºï¼‰ |
| `MesQcTemplateIndicatorController` | æ£€æµ‹æŒ‡æ ‡é¡¹çš„计量单位同上切到 `MdmUnitMeasureApi` |
| `MesQcTemplateItemServiceImpl` | `getTemplateItemList` åŽ»æŽ‰ã€ŒæŒ‰ `mes_md_item.id` åæŸ¥å†è½¬ `mdm_item.id`」的中间转换——质检侧入参本就是 MDM ç‰©æ–™ ID;同时删除 `workOrderId`/`taskId` åˆ†æ”¯ï¼ˆè´¨æ£€å•据已无工单/任务维度) |
| `MesQcIqcServiceImpl` | åˆ é™¤æœªè¢«ä½¿ç”¨çš„ `MesMdItemService` å­—段 |
> **接口路径、请求参数、响应字段结构均无变化**,仅保证 `itemCode/itemName/itemSpecification/unitName` æœ‰å€¼ã€‚前端**无需改接口调用**,只要原来已展示这些字段即自动生效。
> åŽç»­ä¿®æ­£ï¼ˆ2026-09-22 äºŒæ¬¡ï¼‰ï¼š`/mes/qc/template/item/list-by-item-and-type` çš„ `workOrderId`/`taskId` å‚æ•°**已移除**,只接受 `{ qcType, itemId }`,其中 `itemId` ä¸º **MDM ç‰©æ–™ ID**。
## å‰ç«¯æ”¹åŠ¨ï¼ˆå·²å®Œæˆï¼‰
### 1. æ£€éªŒå•列表:非必填字段移出列表,仅「检测结果」例外
规则:**非必填的字段不再作为列表列,唯一例外是「检测结果」**。判定以**后端 `MesQc*SaveReqVO` çš„æ ¡éªŒæ³¨è§£**为准(与前端表单 `rules` ä¸€è‡´ï¼‰ï¼šæ—  `@NotNull` / `@NotEmpty` å³è§†ä¸ºéžå¿…填。
四个列表最终列(顺序即展示顺序):
| é¡µé¢ | åˆ—表列 |
|------|--------|
| IPQC è¿‡ç¨‹æ£€éªŒ | æ£€éªŒå•编号、检验单名称、检验类型、产品物料编码、产品物料名称、规格型号、批号、单位、检测数量、检测结果、检测日期、检测人员、单据状态、操作 |
| IQC æ¥æ–™æ£€éªŒ | æ£€éªŒå•编号、检验单名称、产品物料编码、产品物料名称、接收数量、检测数量、不合格数、检测结果、来料日期、检测日期、检测人员、单据状态、操作 |
| OQC å‡ºè´§æ£€éªŒ | æ£€éªŒå•编号、检验单名称、产品物料编码、产品物料名称、规格型号、单位、不合格数、检测结果、检测日期、检测人员、单据状态、操作 |
| RQC é€€è´§æ£€éªŒ | æ£€éªŒå•编号、检验单名称、产品物料编码、产品物料名称、规格型号、单位、检测结果、检测日期、检测人员、单据状态、操作 |
**从列表移除的列**(字段本身、详情弹窗、导出、标题栏筛选条件均保留,仅不再占列表):
| é¡µé¢ | ç§»é™¤çš„列 | ä¾æ®ï¼ˆSaveReqVO ä¸­æ— å¿…填注解的字段) |
|------|----------|--------------------------------------|
| IQC | ä¾›åº”商简称、供应商批次号 | `vendorId` / `vendorBatch` |
| OQC | å®¢æˆ·åç§°ã€æ‰¹æ¬¡å·ã€å‘货数量、检测数量、出货日期 | `clientId` / `batchCode` / `outQuantity` / `checkQuantity` / `outDate` |
| RQC | æ¥æºå•据类型、来源单据编码、批次号 | `sourceDocType` / `sourceDocCode` / `batchCode` |
| IPQC | æ— ï¼ˆåŽŸåˆ—è¡¨å·²æ— éžå¿…å¡«åˆ—ï¼‰ | â€” |
> ä¿®æ­£ï¼ˆ2026-09-22 ä¸‰æ¬¡ï¼‰ï¼šæœ¬æ–‡æ­¤å‰è®°è½½ã€Œå››ä¸ªåˆ—表新增复核人 `auditNickname` / å®¡æ ¸äºº `approveNickname`」与实测不符 â€”— `grep auditNickname|approveNickname` åœ¨ `controller/admin/qc` ä¸‹é›¶å‘½ä¸­ï¼Œå››ä¸ªé¡µé¢çš„ `data.ts` ä¸­ä¹Ÿæ— å¯¹åº”列。该条已删除,以本表为准。
### 2. å¾…检任务页:物料筛选器换成 MDM ç‰©æ–™
`src/views/mes/qc/pendinginspect/data.ts` çš„「产品物料」筛选条件,由 MES ç‰©æ–™é€‰æ‹©å™¨æ”¹ä¸º **`MdmItemSelect`**(`#/views/basicData/mdm/components`)。原因:待检任务的 `item_id` æ¥è‡ª WM å•据(`mes_wm_*`),属 MDM ç‰©æ–™ ID ä½“系;沿用 MES ç‰©æ–™é€‰æ‹©å™¨ä¼šå¸¦å…¥ `mes_md_item.id`,筛选结果恒为空。
> æ³¨æ„åŒºåˆ†ï¼š`MdmItemSelect`(MDM)位于 `#/views/basicData/mdm/components`;`MdItemSelect`(MES)位于 `#/views/mes/md/item/components`。二者不可混用。
## å­—段展示规则
| å­—段 | åˆ—表 | è¯¦æƒ… | è¯´æ˜Ž |
|------|------|------|------|
| äº§å“ç‰©æ–™ï¼ˆç¼–码/名称/规格/单位) | æ˜¯ | æ˜¯ | ç”± MDM ç‰©æ–™å¸¦å‡º |
| æ£€æµ‹ç»“æžœ | æ˜¯ | æ˜¯ | éžå¿…填,但按业务要求保留在列表 |
| æ£€æµ‹äººå‘˜ / å¤æ ¸äºº / å®¡æ ¸äºº | æ˜¯ | æ˜¯ | æŒ‰ä¸šåŠ¡è¦æ±‚ä¿ç•™åœ¨åˆ—è¡¨ï¼›å¤æ ¸äººã€å®¡æ ¸äººä¸ºæœ¬æ¬¡æ–°å¢žåˆ— |
| ä¾›åº”商 / å®¢æˆ· | å¦ | æ˜¯ | éžå¿…填,移出列表 |
| æ‰¹æ¬¡å·ï¼ˆOQC/RQC)、发货数量、出货日期、来源单据类型/编码、供应商批次号 | å¦ | æ˜¯ | éžå¿…填,移出列表 |
| é‡‡æ ·åœ°ç‚¹ã€è¯ä¹¦ç¼–号、执行标准、备注 | å¦ | æ˜¯ | åŽŸæœ¬å°±ä¸åœ¨åˆ—è¡¨ |
| å¯¼å‡º Excel | â€” | â€” | åˆ—不受本次列表瘦身影响,字段全部保留 |
## ä¸šåŠ¡è§„åˆ™è¯´æ˜Ž
| åœºæ™¯ | è§„则 |
|------|------|
| è´¨æ£€å•物料展示 | ä¸€å¾‹æŒ‰ MDM ç‰©æ–™ ID è§£æžç¼–码/名称/规格;单位取该物料的计量单位 |
| å¾…检任务物料展示 | æ¥æºå•据(WM)的物料 ID å³ MDM ç‰©æ–™ ID,按 MDM è§£æžåç§°ç­‰ |
| ç‰©æ–™ç­›é€‰ | å¾…检任务页按 MDM ç‰©æ–™ç­›é€‰ï¼›ä¼  MES ç‰©æ–™ ID å°†æŸ¥ä¸åˆ°ä»»ä½•任务 |
| åˆ—表瘦身 | éžå¿…填字段不进列表,改在详情查看;导出 Excel ä¸å—影响 |
## æ³¨æ„äº‹é¡¹
- **不是响应结构变更**:`itemCode` ç­‰å­—段本来就存在,只是过去一直为 `null`/空串;如果前端之前对空值做了兜底如「-」,会自然变为真实值。
- **复核人 / å®¡æ ¸äºº**:若列表新增列后仍显示为空,属正常现象——字段本身非必填,未填即为空。
- **`mes_md_item` ä¸Ž `mdm_item` ä¸å¯æ··ç”¨**:本次修复正是把质检链路统一切到 MDM ä½“系,后续若有新页面展示质检/待检物料的名称,同样必须走 `MdmItemApi`。
- **待检任务的 `batchCode` ä»… IPQC æ¥æºæœ‰å€¼**,其余来源为 `null`。
docs/qc_report_conclusion_print.md
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,97 @@
# è´¨æ£€æŠ¥å‘Šã€Œåˆ¤å®šç»“论 / è´¨æ£€ä¸“用章」补齐 - å‰ç«¯è”调方案
> æœ¬æ¬¡å˜æ›´ï¼šæ‰“印报告版式补齐纸质报告必有的「判定结论」「质检专用章」两栏,并把平行测量列头由固定「测量N」改为按批次数自适应。前端浏览器打印与产品检验单 Word å¯¼å‡ºä¸¤ä¸ªå‡ºå£åŒæ­¥ç”Ÿæ•ˆã€‚
> å…³è”文档:`docs/qc_chemical_report_integration.md`(化工检验报告整体版式)、`docs/mes_oqc_check_result_frontend.md`(OQC æ£€æµ‹ç»“果字典切换)。
## æ¶‰åŠé¡µé¢
- æ£€éªŒæŠ¥å‘Šæ‰“印组件 `views/mes/qc/components/qc-report-print.vue`
- å››ç±»æ£€éªŒå•列表(调用方,无需改动):`views/mes/qc/{iqc,ipqc,oqc,rqc}/index.vue`
- äº§å“æ£€éªŒå• Word å¯¼å‡ºï¼ˆåŽç«¯ç”Ÿæˆï¼Œæ— å‰ç«¯é¡µé¢ï¼‰
## å˜æ›´æ‘˜è¦
| å‡ºå£ | å˜æ›´ |
|------|------|
| å‰ç«¯æµè§ˆå™¨æ‰“印 | â‘  æ–°å¢žã€Œåˆ¤å®šç»“论 / è´¨æ£€ä¸“用章」一行(判定结论带出检验结果文案,盖章区留空)② æµ‹é‡åˆ—头:仅一个测量批次时显示「测量值」,多批次时显示「测量1」「测量2」③ è¡¨å¤´ä¿¡æ¯æ ä¸­åŽŸæœ‰çš„ã€Œæ£€æµ‹ç»“è®ºã€å·²ç§»é™¤ï¼ˆä¸Žæ–°ã€Œåˆ¤å®šç»“è®ºã€åŒå€¼ï¼Œé¿å…åŒé¡µé‡å¤ï¼‰ |
| Word å¯¼å‡º `/mes/qc/indicator-result/export-product-word` | ã€Œåˆ¤å®šç»“论:」后自动写入检验结果文案;「质检专用章:」仍留空盖章 |
## API
| æ–¹æ³• | è·¯å¾„ | è¯´æ˜Ž |
|------|------|------|
| GET | /mes/qc/indicator-result/report | æ‰“印报告聚合数据,响应新增 `checkResultText`;其余请求参数与响应结构不变 |
**响应字段新增:**
| å­—段 | ç±»åž‹ | è¯´æ˜Ž |
|------|------|------|
| checkResultText | String | æ£€æµ‹ç»“果文案,由后端按 `qcType` é€‰æ‹©å­—典解析。OQC å– `mes_oqc_check_result`(1型/2型/废品),IQC/IPQC/RQC å– `mes_qc_check_result`(校验通过/校验不通过)。`checkResult` ä¸ºç©ºæ—¶è¯¥å­—段为 null |
**响应示例(节选):**
```json
{
  "code": 0,
  "data": {
    "qcType": 3,
    "docCode": "OQC20260106001",
    "itemName": "工业用正丁醇",
    "checkResult": 1,
    "checkResultText": "1型",
    "measureNos": [1],
    "items": []
  }
}
```
## æ•°æ®å¸¦å…¥è¯´æ˜Ž
1. `checkResult`(检验单完成时由人工填写的检测结果)→ åŽç«¯è§£æžä¸º `checkResultText` éš `/report` è¿”回,前端打印时直接展示,**不再由前端按固定字典取标签**。
2. `measureNos` æ•°ç»„长度 â†’ å†³å®šæµ‹é‡åˆ—头文案:长度为 1 æ—¶åˆ—头为「测量值」,长度 â‰¥ 2 æ—¶åˆ—头为「测量1」「测量2」…,列的取值口径(每列对应一个测量批次)不变。
3. ã€Œè´¨æ£€ä¸“用章」无数据来源,仅为空白单元格,供打印后人工盖章。
## å­—段展示规则
| å­—段 | å±•示位置 | è¯´æ˜Ž |
|------|----------|------|
| checkResultText | æ‰“印版式底部「判定结论:」之后 | æ— å€¼æ—¶æ˜¾ç¤ºã€Œ-」(前端兜底逻辑不变) |
| â€” | æ‰“印版式底部「质检专用章:」 | ç©ºå•元格,预留约 90px é«˜åº¦ä¾¿äºŽç›–ç«  |
| measureNos | æ£€éªŒé¡¹çŸ©é˜µè¡¨å¤´ | å•批次「测量值」,多批次「测量1」「测量2」 |
## ä¸šåŠ¡è§„åˆ™è¯´æ˜Ž
| åœºæ™¯ | è§„则 |
|------|------|
| OQC æ£€éªŒå• | åˆ¤å®šç»“论显示产品等级(1型/2型/废品),与 `mes_oqc_check_result` å­—典一致 |
| IQC/IPQC/RQC æ£€éªŒå• | åˆ¤å®šç»“论显示通用检测结果(校验通过/校验不通过) |
| æ£€éªŒå•尚未判定 | `checkResult` ä¸ºç©º â†’ åˆ¤å®šç»“论显示「-」 |
| æœªåšå¹³è¡Œæµ‹é‡ | æµ‹é‡åˆ—只有一列,列头为「测量值」 |
| åšäº†å¹³è¡Œæµ‹é‡ | æŒ‰æ‰¹æ¬¡æ•°å±•开多列,列头为「测量1」「测量2」 |
| æ‰“印后盖章 | åˆ¤å®šç»“论、质检专用章不参与流程流转,仅作纸质留痕 |
## å‰ç«¯å…¥å£ï¼ˆæ–°å¢žï¼‰
产品检验单 Word å¯¼å‡ºæ­¤å‰åªæœ‰åŽç«¯æŽ¥å£ã€å‰ç«¯æ— å…¥å£ï¼Œæœ¬æ¬¡åœ¨å››ç±»æ£€éªŒå•列表的**行操作列**补齐按钮。
| é¡µé¢ | æŒ‰é’® | ä½ç½® |
|------|------|------|
| `views/mes/qc/iqc/index.vue` | å¯¼å‡ºäº§å“æ£€éªŒå• | è¡Œæ“ä½œåˆ—「打印报告」之后 |
| `views/mes/qc/ipqc/index.vue` | å¯¼å‡ºäº§å“æ£€éªŒå• | è¡Œæ“ä½œåˆ—「打印报告」之后 |
| `views/mes/qc/oqc/index.vue` | å¯¼å‡ºäº§å“æ£€éªŒå• | è¡Œæ“ä½œåˆ—「打印报告」之后 |
| `views/mes/qc/rqc/index.vue` | å¯¼å‡ºäº§å“æ£€éªŒå• | è¡Œæ“ä½œåˆ—「打印报告」之后 |
| é¡¹ | è¯´æ˜Ž |
|----|------|
| å›¾æ ‡ | `ant-design:file-word-outlined` |
| æƒé™ | ä¸Žå„页「打印报告」一致,`mes:qc-{iqc\|ipqc\|oqc\|rqc}:query` |
| æŽ¥å£ | `GET /mes/qc/indicator-result/export-product-word`,参数 `qcId`、`qcType`、`resultId`(可选,不传取该检验单最早一条检验结果) |
| ä¸‹è½½æ–‡ä»¶å | `产品检验单-{检验单编号}.docx` |
| è°ƒç”¨æ–¹å¼ | `requestClient.download` å– Blob â†’ `downloadFileFromBlobPart` è½ç›˜ |
## æ³¨æ„äº‹é¡¹
- `checkResultText` æ˜¯**新增响应字段**,前端读取时需容错(老版本后端不返回该字段):组件当前实现为「取 `checkResultText`,为空时回退按 `checkResult` å– `mes_qc_check_result` æ ‡ç­¾ã€ã€‚
- æ‰“印版式表头信息栏已去掉「检测结论」一项;若页面其它位置仍需要展示检测结论,请从 `/report` æˆ–列表接口的 `checkResult` å–字典标签展示,字典选择需按 `qcType` åŒºåˆ†ï¼ˆOQC ç”¨ `mes_oqc_check_result`)。
- Word å¯¼å‡ºçš„「检验 / å¤æ ¸ / æ‰¹å‡†ã€å·²å¸¦å‡ºå•据的检测人员、复核人、审核人姓名(分别为 `inspectorName` / `auditName` / `approveName`);未指定人员时该段留空手写。「质检专用章」仍为留空盖章。
- å¯¼å‡ºæŒ‰é’®ä¸Žã€Œæ‰“印报告」同为 `query` æƒé™çº§å…¥å£ï¼Œæ— éœ€æ–°å¢žèœå•权限项。
docs/sql/ipqc_remove_production_fields.sql
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,22 @@
-- ============================================================
-- è¿‡ç¨‹è´¨æ£€å•(IPQC,mes_qc_ipqc)字段调整
--
-- å˜æ›´å†…容:
--   åŽ»æŽ‰ï¼šç”Ÿäº§è®¢å• work_order_id / ç”Ÿäº§ä»»åŠ¡ task_id / å·¥ä½ workstation_id / å·¥åº process_id
--   æ–°å¢žï¼šæ‰¹å· batch_code(前端手工录入,必填)
--
-- é…å¥—改造:产品物料 item_id ç”±ã€Œå·¥å•/任务带出」改为「前端手动选择」,
--           å­˜å‚¨ä½“系统一为 MDM ç‰©æ–™ ID(mdm_item.id),与 IQC/OQC ä¸€è‡´ã€‚
--
-- è¯´æ˜Žï¼šæ‰§è¡Œå‰ mes_qc_ipqc æ— ä¸šåŠ¡æ•°æ®ï¼Œå¯ç›´æŽ¥åˆ åˆ—ï¼›
--       MySQL çš„ ALTER TABLE ADD COLUMN ä¸æ”¯æŒ IF NOT EXISTS,故直接执行。
-- ============================================================
ALTER TABLE `mes_qc_ipqc`
  DROP COLUMN `work_order_id`,
  DROP COLUMN `task_id`,
  DROP COLUMN `workstation_id`,
  DROP COLUMN `process_id`;
ALTER TABLE `mes_qc_ipqc`
  ADD COLUMN `batch_code` varchar(100) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci DEFAULT NULL COMMENT '批号' AFTER `source_doc_code`;
docs/sql/mes_qc_oqc_check_result_extend.sql
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,37 @@
-- ============================================================
-- OQC å‡ºè´§æ£€éªŒï¼ˆå‡ºåŽ‚æ£€éªŒï¼‰æ£€æµ‹ç»“æžœå­—å…¸æ‰©å±•
--
-- å˜æ›´å†…容:检测结果由「1型 / 2型 / åºŸå“ã€æ‰©å±•为
--           1型 / 2型 / 3型 / ä¼˜ç­‰å“ / åˆæ ¼å“ / åºŸå“ / ä¸åˆæ ¼å“
--           æ”¾è¡Œè§„则:废品、不合格品 åˆ¤è¡Œä¸åˆæ ¼å¹¶å–消销售出库单;
--                     å…¶ä½™ç­‰çº§åˆ¤è¡Œåˆæ ¼å¹¶æŽ¨è¿›å‡ºåº“单待拣货
-- å¯¹åº”枚举:MesQcOqcCheckResultEnum
-- ç›®æ ‡åº“  ï¼šmom-jhhg
-- å¹‚ç­‰    ï¼šå¯é‡å¤æ‰§è¡Œ
-- æ—¥æœŸ    ï¼š2026-09-24
-- ============================================================
-- 1. æ¸…理旧字典(按 dict_type åˆ é™¤ï¼Œä¸å½±å“å…¶å®ƒå­—典)
DELETE FROM system_dict_data WHERE dict_type = 'mes_oqc_check_result';
DELETE FROM system_dict_type WHERE type = 'mes_oqc_check_result';
-- 2. å…œåº•清理被占用的固定 ID,防止配置漂移导致主键冲突
DELETE FROM system_dict_data WHERE id BETWEEN 1065401 AND 1065407;
DELETE FROM system_dict_type WHERE id = 1065400;
-- 3. å­—典类型
INSERT INTO system_dict_type (id, name, type, status, remark, creator, create_time, updater, update_time, deleted)
VALUES (1065400, 'MES å‡ºè´§æ£€éªŒæ£€æµ‹ç»“æžœ', 'mes_oqc_check_result', 0,
        '出货检验单(OQC)判定结果:1型/2型/3型/优等品/合格品为可发货等级,废品与不合格品不放行',
        '1', NOW(), '1', NOW(), b'0');
-- 4. å­—典数据
INSERT INTO system_dict_data (id, sort, label, value, dict_type, status, color_type, css_class, remark, creator, create_time, updater, update_time, deleted)
VALUES
(1065401, 1, '1型',     '1', 'mes_oqc_check_result', 0, 'success', '', '', '1', NOW(), '1', NOW(), b'0'),
(1065402, 2, '2型',     '2', 'mes_oqc_check_result', 0, 'primary', '', '', '1', NOW(), '1', NOW(), b'0'),
(1065403, 3, '废品',    '3', 'mes_oqc_check_result', 0, 'danger',  '', '', '1', NOW(), '1', NOW(), b'0'),
(1065404, 4, '3型',     '4', 'mes_oqc_check_result', 0, 'success', '', '', '1', NOW(), '1', NOW(), b'0'),
(1065405, 5, '优等品',  '5', 'mes_oqc_check_result', 0, 'success', '', '', '1', NOW(), '1', NOW(), b'0'),
(1065406, 6, '合格品',  '6', 'mes_oqc_check_result', 0, 'primary', '', '', '1', NOW(), '1', NOW(), b'0'),
(1065407, 7, '不合格品', '7', 'mes_oqc_check_result', 0, 'danger',  '', '', '1', NOW(), '1', NOW(), b'0');