云
2026-10-24 e3b783fe002b75cb0569e93e04786e00ac711075
refactor(mes): 重构质检模块物料查询逻辑并优化仓储流程

- 替换 MesMdItemService 为 MesQcItemResolver 统一处理物料查询
- 引入 MdmItemRespDTO 替代 MesMdItemDO 实现 MDM 物料数据兼容
- 在 IQC、NCR、OQC、RQC 等控制器中实现物料 ID 兼容性查询
- 重构质检模板项服务支持 MDM 与 MES 两套物料 ID 体系
- 移除 BPM 审批流程相关代码简化仓储流程逻辑
- 重命名仓储状态"待入库"为"待执行入库"提高语义准确性
- 区分仓储单据整体编辑与行数据编辑的不同状态校验规则
- 优化仓储上架操作的状态
已添加11个文件
已删除1个文件
已修改15个文件
1111 ■■■■■ 文件已修改
.playwright-mcp/qc-template-fixed.png 补丁 | 查看 | 原始文档 | blame | 历史
analytics-5668.png 补丁 | 查看 | 原始文档 | blame | 历史
arrival-current.yml 373 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
arrival-state.png 补丁 | 查看 | 原始文档 | blame | 历史
form-with-srm-select.png 补丁 | 查看 | 原始文档 | blame | 历史
home.png 补丁 | 查看 | 原始文档 | blame | 历史
itemreceipt-create.yml 381 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
po-dialog-fixed.png 补丁 | 查看 | 原始文档 | blame | 历史
qc-template-fixed.png 补丁 | 查看 | 原始文档 | blame | 历史
supplier-dialog.png 补丁 | 查看 | 原始文档 | blame | 历史
yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/controller/admin/qc/iqc/MesQcIqcController.java 12 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/controller/admin/qc/ncr/MesQcNcrController.java 10 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/controller/admin/qc/oqc/MesQcOqcController.java 13 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/controller/admin/qc/pendinginspect/MesQcPendingInspectController.java 12 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/controller/admin/qc/rqc/MesQcRqcController.java 12 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/dal/mysql/wm/itemreceipt/MesWmItemReceiptMapper.java 18 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/enums/wm/MesWmItemReceiptStatusEnum.java 2 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/service/qc/iqc/MesQcIqcServiceImpl.java 4 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/service/qc/ncr/MesQcNcrServiceImpl.java 9 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/service/qc/oqc/MesQcOqcServiceImpl.java 4 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/service/qc/rqc/MesQcRqcServiceImpl.java 14 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/service/qc/support/MesQcItemResolver.java 92 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/service/qc/template/MesQcTemplateItemServiceImpl.java 12 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/service/wm/itemreceipt/MesWmItemReceiptLineServiceImpl.java 6 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/service/wm/itemreceipt/MesWmItemReceiptService.java 31 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/service/wm/itemreceipt/MesWmItemReceiptServiceImpl.java 60 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/service/wm/itemreceipt/listener/MesWmItemReceiptStatusListener.java 46 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
.playwright-mcp/qc-template-fixed.png
analytics-5668.png
arrival-current.yml
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,373 @@
- generic [ref=f13e90]:
  - complementary [ref=f13e91]:
    - generic [ref=f13e92]:
      - generic [ref=f13e93] [cursor=pointer]
      - link "新高电力智造平台 æ–°é«˜ç”µåŠ›æ™ºé€ å¹³å°" [ref=f13e98] [cursor=pointer]:
        - /url: javascript:void 0
        - img "新高电力智造平台" [ref=f13e101]
        - generic [ref=f13e102]: æ–°é«˜ç”µåŠ›æ™ºé€ å¹³å°
      - menu [ref=f13e105]:
        - menuitem "首页" [ref=f13e106] [cursor=pointer]
        - listitem [ref=f13e113]:
          - generic [ref=f13e114] [cursor=pointer]: ç”Ÿäº§ç®¡æŽ§
        - listitem [ref=f13e121]:
          - generic [ref=f13e122] [cursor=pointer]: å·¥è‰ºè®¾è®¡
        - listitem [ref=f13e129]:
          - generic [ref=f13e130] [cursor=pointer]: äº§å“è®¾è®¡
        - listitem [ref=f13e136]:
          - generic [ref=f13e137] [cursor=pointer]: è¥é”€ç®¡ç†
        - listitem [ref=f13e143]:
          - generic [ref=f13e144] [cursor=pointer]: å”®åŽæœåŠ¡
        - listitem [ref=f13e150]:
          - generic [ref=f13e151] [cursor=pointer]: è®¡åˆ’排程
        - listitem [ref=f13e157]:
          - generic [ref=f13e158] [cursor=pointer]: è´¨é‡ç®¡ç†
        - listitem [ref=f13e164]:
          - generic [ref=f13e165] [cursor=pointer]: è®¾å¤‡ç®¡ç†
        - listitem [ref=f13e172]:
          - generic [ref=f13e173] [cursor=pointer]: é‡‡è´­ç®¡ç†
        - listitem [ref=f13e179]:
          - generic [ref=f13e180] [cursor=pointer]: ä»“储物流
          - list [ref=f13e3287]:
            - menuitem "库存事务流水" [ref=f13e3288] [cursor=pointer]
            - menuitem "仓库设置" [ref=f13e3293] [cursor=pointer]
            - menuitem "库存现有量" [ref=f13e3300] [cursor=pointer]
            - listitem [ref=f13e3305]:
              - generic [ref=f13e3306] [cursor=pointer]: é‡‡è´­ä»“库
              - list [ref=f13e3312]:
                - menuitem "到货通知" [ref=f13e3313] [cursor=pointer]
                - menuitem "采购入库" [ref=f13e3318] [cursor=pointer]
                - menuitem "采购退货" [ref=f13e3323] [cursor=pointer]
            - listitem [ref=f13e3330]:
              - generic [ref=f13e3331] [cursor=pointer]: ç”Ÿäº§ä»“库
            - listitem [ref=f13e3338]:
              - generic [ref=f13e3339] [cursor=pointer]: é”€å”®ä»“库
            - menuitem "转移调拨" [ref=f13e3345] [cursor=pointer]
            - listitem [ref=f13e3350]:
              - generic [ref=f13e3351] [cursor=pointer]: åº“存盘点
            - menuitem "装箱管理" [ref=f13e3357] [cursor=pointer]
            - menuitem "赋能管理" [ref=f13e3364] [cursor=pointer]
            - menuitem "SN ç " [ref=f13e3369] [cursor=pointer]
            - menuitem "外协发料" [ref=f13e3374] [cursor=pointer]
            - menuitem "外协入库" [ref=f13e3379] [cursor=pointer]
            - menuitem "杂项入库" [ref=f13e3384] [cursor=pointer]
            - menuitem "杂项出库" [ref=f13e3389] [cursor=pointer]
            - menuitem "设备入库" [ref=f13e3394] [cursor=pointer]
        - listitem [ref=f13e188]:
          - generic [ref=f13e189] [cursor=pointer]: äººåŠ›èµ„æº
        - listitem [ref=f13e195]:
          - generic [ref=f13e196] [cursor=pointer]: å†³ç­–支持
        - listitem [ref=f13e202]:
          - generic [ref=f13e203] [cursor=pointer]: èƒ½è€—管理
        - listitem [ref=f13e210]:
          - generic [ref=f13e211] [cursor=pointer]: åŸºç¡€æ•°æ®
        - listitem [ref=f13e219]:
          - generic [ref=f13e220] [cursor=pointer]: ååŒåŠžå…¬
        - listitem [ref=f13e226]:
          - generic [ref=f13e227] [cursor=pointer]: åŸºç¡€è®¾æ–½
        - listitem [ref=f13e233]:
          - generic [ref=f13e234] [cursor=pointer]: ç³»ç»Ÿç®¡ç†
      - generic [ref=f13e241] [cursor=pointer]
  - generic [ref=f13e246]:
    - generic [ref=f13e247]:
      - banner [ref=f13e248]:
        - button [ref=f13e249] [cursor=pointer]
        - button [ref=f13e252] [cursor=pointer]
        - navigation "breadcrumb" [ref=f13e257]:
          - list [ref=f13e258]:
            - listitem [ref=f13e3399]:
              - link "仓储物流" [ref=f13e3400] [cursor=pointer]:
                - /url: javascript:void 0
              - listitem [ref=f13e3406]
            - listitem [ref=f13e3409]:
              - link "采购仓库" [ref=f13e3410] [cursor=pointer]:
                - /url: javascript:void 0
              - listitem [ref=f13e3414]
            - listitem [ref=f13e5858]:
              - link "到货通知" [disabled] [ref=f13e5859]
        - generic [ref=f13e267]:
          - generic [ref=f13e269] [cursor=pointer]:
            - generic [ref=f13e273]: æœç´¢
            - generic [ref=f13e274]: Ctrl K
          - button [ref=f13e276] [cursor=pointer]
          - button "dark" [ref=f13e281] [cursor=pointer]
          - button [ref=f13e290] [cursor=pointer]
          - button [ref=f13e296] [cursor=pointer]
          - button [ref=f13e299] [cursor=pointer]
          - button [ref=f13e305] [cursor=pointer]:
            - button [ref=f13e307]
          - button "工作台" [ref=f13e311] [cursor=pointer]
          - button "超级管理员" [ref=f13e315] [cursor=pointer]:
            - img "超级管理员" [ref=f13e320]
      - generic [ref=f13e322]:
        - generic [ref=f13e327]:
          - generic [ref=f13e328] [cursor=pointer]: é¦–页
          - generic [ref=f13e729] [cursor=pointer]: ç”Ÿäº§è®¢å•
          - generic [ref=f13e3423] [cursor=pointer]: åˆ°è´§é€šçŸ¥
          - generic [ref=f13e4865] [cursor=pointer]: é‡‡è´­å…¥åº“
        - generic [ref=f13e344]:
          - button [ref=f13e345] [cursor=pointer]
          - generic [ref=f13e352] [cursor=pointer]
          - generic [ref=f13e356] [cursor=pointer]
    - main [ref=f13e363]:
      - generic [ref=f13e5867]:
        - generic [ref=f13e5872]:
          - generic [ref=f13e5873]:
            - generic [ref=f13e5874]: é€šçŸ¥å•编号
            - textbox "通知单编号" [ref=f13e5880]:
              - /placeholder: è¯·è¾“入通知单编号
          - generic [ref=f13e5882]:
            - generic [ref=f13e5883]: é€šçŸ¥å•名称
            - textbox "通知单名称" [ref=f13e5889]:
              - /placeholder: è¯·è¾“入通知单名称
          - generic [ref=f13e5891]:
            - generic [ref=f13e5892]: é‡‡è´­è®¢å•号
            - textbox "采购订单号" [ref=f13e5898]:
              - /placeholder: è¯·è¾“入采购订单号
          - generic [ref=f13e5900]:
            - generic [ref=f13e5901]: ä¾›åº”商
            - textbox "供应商" [ref=f13e5907]:
              - /placeholder: è¯·è¾“入供应商名称
          - generic [ref=f13e5909]:
            - generic [ref=f13e5910]: åˆ°è´§æ—¥æœŸ
            - generic [ref=f13e5915]:
              - textbox "到货日期" [ref=f13e5917]:
                - /placeholder: å¼€å§‹æ—¶é—´
              - generic "to" [ref=f13e5919]:
                - img "swap-right" [ref=f13e5920]
              - textbox "结束时间" [ref=f13e5924]
              - generic:
                - img "calendar"
          - generic [ref=f13e5925]:
            - button "重 ç½®" [ref=f13e5926] [cursor=pointer]
            - button "搜 ç´¢" [ref=f13e5928] [cursor=pointer]
            - generic [ref=f13e5930] [cursor=pointer]: æ”¶èµ·
        - generic [ref=f13e5937]:
          - generic [ref=f13e5939]:
            - generic [ref=f13e5940]: åˆ°è´§é€šçŸ¥å•列表
            - generic [ref=f13e5944]:
              - generic [ref=f13e5946]:
                - button "从采购订单生成" [active] [ref=f13e5948] [cursor=pointer]
                - button "导入" [ref=f13e5953] [cursor=pointer]
                - button "导出" [ref=f13e5958] [cursor=pointer]
              - button "" [ref=f13e5964] [cursor=pointer]
            - generic [ref=f13e5966]:
              - button "" [ref=f13e5967] [cursor=pointer]
              - button "" [ref=f13e5969] [cursor=pointer]
              - button "" [ref=f13e5971] [cursor=pointer]
          - generic [ref=f13e5979]:
            - table [ref=f13e5983]:
              - rowgroup [ref=f13e5994]:
                - row "通知单编号 é€šçŸ¥å•名称 é‡‡è´­è®¢å•号 ä¾›åº”商名称 è”系人 è”系方式 åˆ°è´§æ—¥æœŸ å•据状态 æ“ä½œ" [ref=f13e5995]:
                  - columnheader "通知单编号" [ref=f13e5996]
                  - columnheader "通知单名称" [ref=f13e6001]
                  - columnheader "采购订单号" [ref=f13e6006]
                  - columnheader "供应商名称" [ref=f13e6011]
                  - columnheader "联系人" [ref=f13e6016]
                  - columnheader "联系方式" [ref=f13e6021]
                  - columnheader "到货日期" [ref=f13e6026]
                  - columnheader "单据状态" [ref=f13e6031]
                  - columnheader "操作" [ref=f13e6036]
            - table [ref=f13e6044]:
              - rowgroup [ref=f13e6055]:
                - row "AN1792846891133 CGDD20261024000001到货通知 CGDD20261024000001 ä¹Œé²æœ¨é½å¤©å±±é‡‘具制造有限公司 2026-10-24 å¾…入库 æ‰§è¡Œå…¥åº“" [ref=f13e6056]:
                  - cell "AN1792846891133" [ref=f13e6057]:
                    - button "AN1792846891133" [ref=f13e6060] [cursor=pointer]
                  - cell "CGDD20261024000001到货通知" [ref=f13e6062]
                  - cell "CGDD20261024000001" [ref=f13e6066]
                  - cell "乌鲁木齐天山金具制造有限公司" [ref=f13e6070]
                  - cell [ref=f13e6074]
                  - cell [ref=f13e6078]
                  - cell "2026-10-24" [ref=f13e6082]
                  - cell "待入库" [ref=f13e6086]
                  - cell "执行入库" [ref=f13e6090]:
                    - button "执行入库" [ref=f13e6096] [cursor=pointer]
                - row "DH261005016 CGDD20260925004 åˆ°è´§é€šçŸ¥ CGDD20260925004 ä¸­å›½çŸ³æ²¹å…‹æ‹‰çŽ›ä¾çŸ³åŒ–å…¬å¸ è‰¾åŠ›æ±ŸÂ·ä¹°ä¹°æ 13909902018 2026-10-05 å·²å®Œæˆ" [ref=f13e6098]:
                  - cell "DH261005016" [ref=f13e6099]:
                    - button "DH261005016" [ref=f13e6102] [cursor=pointer]
                  - cell "CGDD20260925004 åˆ°è´§é€šçŸ¥" [ref=f13e6104]
                  - cell "CGDD20260925004" [ref=f13e6108]
                  - cell "中国石油克拉玛依石化公司" [ref=f13e6112]
                  - cell "艾力江·买买提" [ref=f13e6116]
                  - cell "13909902018" [ref=f13e6120]
                  - cell "2026-10-05" [ref=f13e6124]
                  - cell "已完成" [ref=f13e6128]
                  - cell [ref=f13e6132]
                - row "DH260930015 CGDD20260924004 åˆ°è´§é€šçŸ¥ CGDD20260924004 æ²³åŒ—硅谷化工有限公司 å¼ æµ·æ¶› 13383105672 2026-09-30 å·²å®Œæˆ" [ref=f13e6134]:
                  - cell "DH260930015" [ref=f13e6135]:
                    - button "DH260930015" [ref=f13e6138] [cursor=pointer]
                  - cell "CGDD20260924004 åˆ°è´§é€šçŸ¥" [ref=f13e6140]
                  - cell "CGDD20260924004" [ref=f13e6144]
                  - cell "河北硅谷化工有限公司" [ref=f13e6148]
                  - cell "张海涛" [ref=f13e6152]
                  - cell "13383105672" [ref=f13e6156]
                  - cell "2026-09-30" [ref=f13e6160]
                  - cell "已完成" [ref=f13e6164]
                  - cell [ref=f13e6168]
                - row "DH260929014 CGDD20260924003 åˆ°è´§é€šçŸ¥ CGDD20260924003 æ–°ç–†ä¼—和股份有限公司 æŽçº¢æ¢… 13999902876 2026-09-29 å·²å®Œæˆ" [ref=f13e6170]:
                  - cell "DH260929014" [ref=f13e6171]:
                    - button "DH260929014" [ref=f13e6174] [cursor=pointer]
                  - cell "CGDD20260924003 åˆ°è´§é€šçŸ¥" [ref=f13e6176]
                  - cell "CGDD20260924003" [ref=f13e6180]
                  - cell "新疆众和股份有限公司" [ref=f13e6184]
                  - cell "李红梅" [ref=f13e6188]
                  - cell "13999902876" [ref=f13e6192]
                  - cell "2026-09-29" [ref=f13e6196]
                  - cell "已完成" [ref=f13e6200]
                  - cell [ref=f13e6204]
                - row "DH261005013 CGDD20260925003 åˆ°è´§é€šçŸ¥ CGDD20260925003 æ²³åŒ—硅谷化工有限公司 å¼ æµ·æ¶› 13383105672 2026-10-05 å·²å®Œæˆ" [ref=f13e6206]:
                  - cell "DH261005013" [ref=f13e6207]:
                    - button "DH261005013" [ref=f13e6210] [cursor=pointer]
                  - cell "CGDD20260925003 åˆ°è´§é€šçŸ¥" [ref=f13e6212]
                  - cell "CGDD20260925003" [ref=f13e6216]
                  - cell "河北硅谷化工有限公司" [ref=f13e6220]
                  - cell "张海涛" [ref=f13e6224]
                  - cell "13383105672" [ref=f13e6228]
                  - cell "2026-10-05" [ref=f13e6232]
                  - cell "已完成" [ref=f13e6236]
                  - cell [ref=f13e6240]
                - row "DH260930012 CGDD20260925002 åˆ°è´§é€šçŸ¥ CGDD20260925002 ä¹Œé²æœ¨é½å¤©å±±é‡‘具制造有限公司 ä¹°ä¹°æÂ·åå°”逊 13199876235 2026-09-30 å·²å®Œæˆ" [ref=f13e6242]:
                  - cell "DH260930012" [ref=f13e6243]:
                    - button "DH260930012" [ref=f13e6246] [cursor=pointer]
                  - cell "CGDD20260925002 åˆ°è´§é€šçŸ¥" [ref=f13e6248]
                  - cell "CGDD20260925002" [ref=f13e6252]
                  - cell "乌鲁木齐天山金具制造有限公司" [ref=f13e6256]
                  - cell "买买提·吐尔逊" [ref=f13e6260]
                  - cell "13199876235" [ref=f13e6264]
                  - cell "2026-09-30" [ref=f13e6268]
                  - cell "已完成" [ref=f13e6272]
                  - cell [ref=f13e6276]
                - row "DH261004011 CGDD20260925001 åˆ°è´§é€šçŸ¥ CGDD20260925001 ç‰¹å˜ç”µå·¥æ–°ç–†æ–°èƒ½æºè‚¡ä»½æœ‰é™å…¬å¸ é©¬æ™“东 13609987654 2026-10-04 å·²å®Œæˆ" [ref=f13e6278]:
                  - cell "DH261004011" [ref=f13e6279]:
                    - button "DH261004011" [ref=f13e6282] [cursor=pointer]
                  - cell "CGDD20260925001 åˆ°è´§é€šçŸ¥" [ref=f13e6284]
                  - cell "CGDD20260925001" [ref=f13e6288]
                  - cell "特变电工新疆新能源股份有限公司" [ref=f13e6292]
                  - cell "马晓东" [ref=f13e6296]
                  - cell "13609987654" [ref=f13e6300]
                  - cell "2026-10-04" [ref=f13e6304]
                  - cell "已完成" [ref=f13e6308]
                  - cell [ref=f13e6312]
                - row "DH260930010 CGDD20260924002 åˆ°è´§é€šçŸ¥ CGDD20260924002 è¥¿å®‰è¥¿ç”µé«˜åŽ‹ç”µç“·æœ‰é™è´£ä»»å…¬å¸ åˆ˜å»ºå›½ 13572856019 2026-09-30 å·²å®Œæˆ" [ref=f13e6314]:
                  - cell "DH260930010" [ref=f13e6315]:
                    - button "DH260930010" [ref=f13e6318] [cursor=pointer]
                  - cell "CGDD20260924002 åˆ°è´§é€šçŸ¥" [ref=f13e6320]
                  - cell "CGDD20260924002" [ref=f13e6324]
                  - cell "西安西电高压电瓷有限责任公司" [ref=f13e6328]
                  - cell "刘建国" [ref=f13e6332]
                  - cell "13572856019" [ref=f13e6336]
                  - cell "2026-09-30" [ref=f13e6340]
                  - cell "已完成" [ref=f13e6344]
                  - cell [ref=f13e6348]
                - row "DH260929009 CGDD20260924001 åˆ°è´§é€šçŸ¥ CGDD20260924001 æ­£æ³°ç”µæ°”股份有限公司 é™ˆå¿—远 13968801276 2026-09-29 å·²å®Œæˆ" [ref=f13e6350]:
                  - cell "DH260929009" [ref=f13e6351]:
                    - button "DH260929009" [ref=f13e6354] [cursor=pointer]
                  - cell "CGDD20260924001 åˆ°è´§é€šçŸ¥" [ref=f13e6356]
                  - cell "CGDD20260924001" [ref=f13e6360]
                  - cell "正泰电气股份有限公司" [ref=f13e6364]
                  - cell "陈志远" [ref=f13e6368]
                  - cell "13968801276" [ref=f13e6372]
                  - cell "2026-09-29" [ref=f13e6376]
                  - cell "已完成" [ref=f13e6380]
                  - cell [ref=f13e6384]
                - row "DH261013008 CGDD20261009002 åˆ°è´§é€šçŸ¥ CGDD20261009002 é¦–钢智新迁安电磁材料有限公司 èµµå¿—强 13703158092 2026-10-13 å·²å®Œæˆ" [ref=f13e6386]:
                  - cell "DH261013008" [ref=f13e6387]:
                    - button "DH261013008" [ref=f13e6390] [cursor=pointer]
                  - cell "CGDD20261009002 åˆ°è´§é€šçŸ¥" [ref=f13e6392]
                  - cell "CGDD20261009002" [ref=f13e6396]
                  - cell "首钢智新迁安电磁材料有限公司" [ref=f13e6400]
                  - cell "赵志强" [ref=f13e6404]
                  - cell "13703158092" [ref=f13e6408]
                  - cell "2026-10-13" [ref=f13e6412]
                  - cell "已完成" [ref=f13e6416]
                  - cell [ref=f13e6420]
                - row "DH261015007 CGDD20261012001 åˆ°è´§é€šçŸ¥ CGDD20261012001 è¿œä¸œç”µç¼†æœ‰é™å…¬å¸ å‘¨æ–‡æ–Œ 13861520873 2026-10-15 å·²å®Œæˆ" [ref=f13e6422]:
                  - cell "DH261015007" [ref=f13e6423]:
                    - button "DH261015007" [ref=f13e6426] [cursor=pointer]
                  - cell "CGDD20261012001 åˆ°è´§é€šçŸ¥" [ref=f13e6428]
                  - cell "CGDD20261012001" [ref=f13e6432]
                  - cell "远东电缆有限公司" [ref=f13e6436]
                  - cell "周文斌" [ref=f13e6440]
                  - cell "13861520873" [ref=f13e6444]
                  - cell "2026-10-15" [ref=f13e6448]
                  - cell "已完成" [ref=f13e6452]
                  - cell [ref=f13e6456]
                - row "DH261013006 CGDD20261009001 åˆ°è´§é€šçŸ¥ CGDD20261009001 è¿œä¸œç”µç¼†æœ‰é™å…¬å¸ å‘¨æ–‡æ–Œ 13861520873 2026-10-13 å·²å®Œæˆ" [ref=f13e6458]:
                  - cell "DH261013006" [ref=f13e6459]:
                    - button "DH261013006" [ref=f13e6462] [cursor=pointer]
                  - cell "CGDD20261009001 åˆ°è´§é€šçŸ¥" [ref=f13e6464]
                  - cell "CGDD20261009001" [ref=f13e6468]
                  - cell "远东电缆有限公司" [ref=f13e6472]
                  - cell "周文斌" [ref=f13e6476]
                  - cell "13861520873" [ref=f13e6480]
                  - cell "2026-10-13" [ref=f13e6484]
                  - cell "已完成" [ref=f13e6488]
                  - cell [ref=f13e6492]
                - row "DH260926005 CGDD20260923002 åˆ°è´§é€šçŸ¥ CGDD20260923002 ä¸­å›½çŸ³æ²¹å…‹æ‹‰çŽ›ä¾çŸ³åŒ–å…¬å¸ è‰¾åŠ›æ±ŸÂ·ä¹°ä¹°æ 13909902018 2026-09-26 å·²å®Œæˆ" [ref=f13e6494]:
                  - cell "DH260926005" [ref=f13e6495]:
                    - button "DH260926005" [ref=f13e6498] [cursor=pointer]
                  - cell "CGDD20260923002 åˆ°è´§é€šçŸ¥" [ref=f13e6500]
                  - cell "CGDD20260923002" [ref=f13e6504]
                  - cell "中国石油克拉玛依石化公司" [ref=f13e6508]
                  - cell "艾力江·买买提" [ref=f13e6512]
                  - cell "13909902018" [ref=f13e6516]
                  - cell "2026-09-26" [ref=f13e6520]
                  - cell "已完成" [ref=f13e6524]
                  - cell [ref=f13e6528]
                - row "DH260926004 CGDD20260923001 åˆ°è´§é€šçŸ¥ CGDD20260923001 æ²³åŒ—硅谷化工有限公司 å¼ æµ·æ¶› 13383105672 2026-09-26 å·²å®Œæˆ" [ref=f13e6530]:
                  - cell "DH260926004" [ref=f13e6531]:
                    - button "DH260926004" [ref=f13e6534] [cursor=pointer]
                  - cell "CGDD20260923001 åˆ°è´§é€šçŸ¥" [ref=f13e6536]
                  - cell "CGDD20260923001" [ref=f13e6540]
                  - cell "河北硅谷化工有限公司" [ref=f13e6544]
                  - cell "张海涛" [ref=f13e6548]
                  - cell "13383105672" [ref=f13e6552]
                  - cell "2026-09-26" [ref=f13e6556]
                  - cell "已完成" [ref=f13e6560]
                  - cell [ref=f13e6564]
                - row "DH260927003 CGDD20260922003 åˆ°è´§é€šçŸ¥ CGDD20260922003 é¦–钢智新迁安电磁材料有限公司 èµµå¿—强 13703158092 2026-09-27 å·²å®Œæˆ" [ref=f13e6566]:
                  - cell "DH260927003" [ref=f13e6567]:
                    - button "DH260927003" [ref=f13e6570] [cursor=pointer]
                  - cell "CGDD20260922003 åˆ°è´§é€šçŸ¥" [ref=f13e6572]
                  - cell "CGDD20260922003" [ref=f13e6576]
                  - cell "首钢智新迁安电磁材料有限公司" [ref=f13e6580]
                  - cell "赵志强" [ref=f13e6584]
                  - cell "13703158092" [ref=f13e6588]
                  - cell "2026-09-27" [ref=f13e6592]
                  - cell "已完成" [ref=f13e6596]
                  - cell [ref=f13e6600]
                - row "DH260926002 CGDD20260922002 åˆ°è´§é€šçŸ¥ CGDD20260922002 æ–°ç–†ä¼—和股份有限公司 æŽçº¢æ¢… 13999902876 2026-09-26 å·²å®Œæˆ" [ref=f13e6602]:
                  - cell "DH260926002" [ref=f13e6603]:
                    - button "DH260926002" [ref=f13e6606] [cursor=pointer]
                  - cell "CGDD20260922002 åˆ°è´§é€šçŸ¥" [ref=f13e6608]
                  - cell "CGDD20260922002" [ref=f13e6612]
                  - cell "新疆众和股份有限公司" [ref=f13e6616]
                  - cell "李红梅" [ref=f13e6620]
                  - cell "13999902876" [ref=f13e6624]
                  - cell "2026-09-26" [ref=f13e6628]
                  - cell "已完成" [ref=f13e6632]
                  - cell [ref=f13e6636]
                - row "DH260925001 CGDD20260922001 åˆ°è´§é€šçŸ¥ CGDD20260922001 å®æ­¦é›†å›¢æ–°ç–†å…«ä¸€é’¢é“æœ‰é™å…¬å¸ çŽ‹å»ºå†› 13899112031 2026-09-25 å·²å®Œæˆ" [ref=f13e6638]:
                  - cell "DH260925001" [ref=f13e6639]:
                    - button "DH260925001" [ref=f13e6642] [cursor=pointer]
                  - cell "CGDD20260922001 åˆ°è´§é€šçŸ¥" [ref=f13e6644]
                  - cell "CGDD20260922001" [ref=f13e6648]
                  - cell "宝武集团新疆八一钢铁有限公司" [ref=f13e6652]
                  - cell "王建军" [ref=f13e6656]
                  - cell "13899112031" [ref=f13e6660]
                  - cell "2026-09-25" [ref=f13e6664]
                  - cell "已完成" [ref=f13e6668]
                  - cell [ref=f13e6672]
          - generic [ref=f13e6681]:
            - generic [ref=f13e6682]: å…± 17 æ¡è®°å½•
            - generic [ref=f13e6684] [cursor=pointer]:
              - generic "20条/页" [ref=f13e6685]:
                - textbox "请选择" [ref=f13e6686]: 20条/页
              - generic [ref=f13e6687]: î£­
            - button "" [ref=f13e6690]
            - button "" [ref=f13e6692]
            - button "" [ref=f13e6694]
            - button "1" [ref=f13e6697] [cursor=pointer]
            - button "" [ref=f13e6698]
            - button "" [ref=f13e6700]
            - button "" [ref=f13e6702]
arrival-state.png
form-with-srm-select.png
home.png
itemreceipt-create.yml
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,381 @@
- generic [ref=f13e1]:
  - generic [ref=f13e90]:
    - complementary [ref=f13e91]:
      - generic [ref=f13e92]:
        - generic [ref=f13e93] [cursor=pointer]
        - link "新高电力智造平台 æ–°é«˜ç”µåŠ›æ™ºé€ å¹³å°" [ref=f13e98] [cursor=pointer]:
          - /url: javascript:void 0
          - img "新高电力智造平台" [ref=f13e101]
          - generic [ref=f13e102]: æ–°é«˜ç”µåŠ›æ™ºé€ å¹³å°
        - menu [ref=f13e105]:
          - menuitem "首页" [ref=f13e106] [cursor=pointer]
          - listitem [ref=f13e113]:
            - generic [ref=f13e114] [cursor=pointer]: ç”Ÿäº§ç®¡æŽ§
          - listitem [ref=f13e121]:
            - generic [ref=f13e122] [cursor=pointer]: å·¥è‰ºè®¾è®¡
          - listitem [ref=f13e129]:
            - generic [ref=f13e130] [cursor=pointer]: äº§å“è®¾è®¡
          - listitem [ref=f13e136]:
            - generic [ref=f13e137] [cursor=pointer]: è¥é”€ç®¡ç†
          - listitem [ref=f13e143]:
            - generic [ref=f13e144] [cursor=pointer]: å”®åŽæœåŠ¡
          - listitem [ref=f13e150]:
            - generic [ref=f13e151] [cursor=pointer]: è®¡åˆ’排程
          - listitem [ref=f13e157]:
            - generic [ref=f13e158] [cursor=pointer]: è´¨é‡ç®¡ç†
          - listitem [ref=f13e164]:
            - generic [ref=f13e165] [cursor=pointer]: è®¾å¤‡ç®¡ç†
          - listitem [ref=f13e172]:
            - generic [ref=f13e173] [cursor=pointer]: é‡‡è´­ç®¡ç†
          - listitem [ref=f13e179]:
            - generic [ref=f13e180] [cursor=pointer]: ä»“储物流
            - list [ref=f13e3287]:
              - menuitem "库存事务流水" [ref=f13e3288] [cursor=pointer]
              - menuitem "仓库设置" [ref=f13e3293] [cursor=pointer]
              - menuitem "库存现有量" [ref=f13e3300] [cursor=pointer]
              - listitem [ref=f13e3305]:
                - generic [ref=f13e3306] [cursor=pointer]: é‡‡è´­ä»“库
                - list [ref=f13e3312]:
                  - menuitem "到货通知" [ref=f13e3313] [cursor=pointer]
                  - menuitem "采购入库" [ref=f13e3318] [cursor=pointer]
                  - menuitem "采购退货" [ref=f13e3323] [cursor=pointer]
              - listitem [ref=f13e3330]:
                - generic [ref=f13e3331] [cursor=pointer]: ç”Ÿäº§ä»“库
              - listitem [ref=f13e3338]:
                - generic [ref=f13e3339] [cursor=pointer]: é”€å”®ä»“库
              - menuitem "转移调拨" [ref=f13e3345] [cursor=pointer]
              - listitem [ref=f13e3350]:
                - generic [ref=f13e3351] [cursor=pointer]: åº“存盘点
              - menuitem "装箱管理" [ref=f13e3357] [cursor=pointer]
              - menuitem "赋能管理" [ref=f13e3364] [cursor=pointer]
              - menuitem "SN ç " [ref=f13e3369] [cursor=pointer]
              - menuitem "外协发料" [ref=f13e3374] [cursor=pointer]
              - menuitem "外协入库" [ref=f13e3379] [cursor=pointer]
              - menuitem "杂项入库" [ref=f13e3384] [cursor=pointer]
              - menuitem "杂项出库" [ref=f13e3389] [cursor=pointer]
              - menuitem "设备入库" [ref=f13e3394] [cursor=pointer]
          - listitem [ref=f13e188]:
            - generic [ref=f13e189] [cursor=pointer]: äººåŠ›èµ„æº
          - listitem [ref=f13e195]:
            - generic [ref=f13e196] [cursor=pointer]: å†³ç­–支持
          - listitem [ref=f13e202]:
            - generic [ref=f13e203] [cursor=pointer]: èƒ½è€—管理
          - listitem [ref=f13e210]:
            - generic [ref=f13e211] [cursor=pointer]: åŸºç¡€æ•°æ®
          - listitem [ref=f13e219]:
            - generic [ref=f13e220] [cursor=pointer]: ååŒåŠžå…¬
          - listitem [ref=f13e226]:
            - generic [ref=f13e227] [cursor=pointer]: åŸºç¡€è®¾æ–½
          - listitem [ref=f13e233]:
            - generic [ref=f13e234] [cursor=pointer]: ç³»ç»Ÿç®¡ç†
        - generic [ref=f13e241] [cursor=pointer]
    - generic [ref=f13e246]:
      - generic [ref=f13e247]:
        - banner [ref=f13e248]:
          - button [ref=f13e249] [cursor=pointer]
          - button [ref=f13e252] [cursor=pointer]
          - navigation "breadcrumb" [ref=f13e257]:
            - list [ref=f13e258]:
              - listitem [ref=f13e3399]:
                - link "仓储物流" [ref=f13e3400] [cursor=pointer]:
                  - /url: javascript:void 0
                - listitem [ref=f13e3406]
              - listitem [ref=f13e3409]:
                - link "采购仓库" [ref=f13e3410] [cursor=pointer]:
                  - /url: javascript:void 0
                - listitem [ref=f13e3414]
              - listitem [ref=f13e4859]:
                - link "采购入库" [disabled] [ref=f13e4860]
          - generic [ref=f13e267]:
            - generic [ref=f13e269] [cursor=pointer]:
              - generic [ref=f13e273]: æœç´¢
              - generic [ref=f13e274]: Ctrl K
            - button [ref=f13e276] [cursor=pointer]
            - button "dark" [ref=f13e281] [cursor=pointer]
            - button [ref=f13e290] [cursor=pointer]
            - button [ref=f13e296] [cursor=pointer]
            - button [ref=f13e299] [cursor=pointer]
            - button [ref=f13e305] [cursor=pointer]:
              - button [ref=f13e307]
            - button "工作台" [ref=f13e311] [cursor=pointer]
            - button [ref=f13e315] [cursor=pointer]:
              - img "超级管理员" [ref=f13e320]
        - generic [ref=f13e322]:
          - generic [ref=f13e327]:
            - generic [ref=f13e328] [cursor=pointer]: é¦–页
            - generic [ref=f13e729] [cursor=pointer]: ç”Ÿäº§è®¢å•
            - generic [ref=f13e3423] [cursor=pointer]: åˆ°è´§é€šçŸ¥
            - generic [ref=f13e4865] [cursor=pointer]: é‡‡è´­å…¥åº“
          - generic [ref=f13e344]:
            - button [ref=f13e345] [cursor=pointer]
            - generic [ref=f13e352] [cursor=pointer]
            - generic [ref=f13e356] [cursor=pointer]
      - main [ref=f13e363]:
        - generic [ref=f13e4885]:
          - generic [ref=f13e4890]:
            - generic [ref=f13e4891]:
              - generic [ref=f13e4892]: å…¥åº“单编号
              - textbox "入库单编号" [ref=f13e4898]:
                - /placeholder: è¯·è¾“入入库单编号
            - generic [ref=f13e4900]:
              - generic [ref=f13e4901]: å…¥åº“单名称
              - textbox "入库单名称" [ref=f13e4907]:
                - /placeholder: è¯·è¾“入入库单名称
            - generic [ref=f13e4909]:
              - generic [ref=f13e4910]: ä¾›åº”商
              - textbox "请选择供应商" [ref=f13e4917]
            - generic [ref=f13e4923]:
              - generic [ref=f13e4924]: å…¥åº“日期
              - generic [ref=f13e4929]:
                - textbox "入库日期" [ref=f13e4931]:
                  - /placeholder: å¼€å§‹æ—¶é—´
                - generic "to" [ref=f13e4933]:
                  - img "swap-right" [ref=f13e4934]
                - textbox "结束时间" [ref=f13e4938]
                - generic:
                  - img "calendar"
            - generic [ref=f13e4939]:
              - button "重 ç½®" [ref=f13e4940] [cursor=pointer]
              - button "搜 ç´¢" [ref=f13e4942] [cursor=pointer]
              - generic [ref=f13e4944] [cursor=pointer]: æ”¶èµ·
          - generic [ref=f13e4951]:
            - generic [ref=f13e4953]:
              - generic [ref=f13e4954]: é‡‡è´­å…¥åº“单列表
              - generic [ref=f13e4958]:
                - generic [ref=f13e4960]:
                  - button "新增采购入库单" [active] [ref=f13e4962] [cursor=pointer]
                  - button "导入" [ref=f13e4967] [cursor=pointer]
                  - button "从到货通知生成" [ref=f13e4972] [cursor=pointer]
                  - button "导出" [ref=f13e4977] [cursor=pointer]
                - button "" [ref=f13e4983] [cursor=pointer]
              - generic [ref=f13e4985]:
                - button "" [ref=f13e4986] [cursor=pointer]
                - button "" [ref=f13e4988] [cursor=pointer]
                - button "" [ref=f13e4990] [cursor=pointer]
            - generic [ref=f13e4998]:
              - table [ref=f13e5002]:
                - rowgroup [ref=f13e5011]:
                  - row "入库单编号 å…¥åº“单名称 é‡‡è´­è®¢å•号 ä¾›åº”商名称 å…¥åº“日期 å•据状态 æ“ä½œ" [ref=f13e5012]:
                    - columnheader "入库单编号" [ref=f13e5013]
                    - columnheader "入库单名称" [ref=f13e5018]
                    - columnheader "采购订单号" [ref=f13e5023]
                    - columnheader "供应商名称" [ref=f13e5028]
                    - columnheader "入库日期" [ref=f13e5033]
                    - columnheader "单据状态" [ref=f13e5038]
                    - columnheader "操作" [ref=f13e5043]
              - table [ref=f13e5051]:
                - rowgroup [ref=f13e5060]:
                  - row "IR1792846916422 CGDD20261024000001到货通知入库单 CGDD20261024000001 ä¹Œé²æœ¨é½å¤©å±±é‡‘具制造有限公司 2026-10-24 å¾…上架 æ‰§è¡Œä¸Šæž¶ å–消" [ref=f13e5061]:
                    - cell "IR1792846916422" [ref=f13e5062]:
                      - button "IR1792846916422" [ref=f13e5065] [cursor=pointer]
                    - cell "CGDD20261024000001到货通知入库单" [ref=f13e5067]
                    - cell "CGDD20261024000001" [ref=f13e5071]
                    - cell "乌鲁木齐天山金具制造有限公司" [ref=f13e5075]
                    - cell "2026-10-24" [ref=f13e5079]
                    - cell "待上架" [ref=f13e5083]
                    - cell "执行上架 å–消" [ref=f13e5087]:
                      - generic [ref=f13e5091]:
                        - button "执行上架" [ref=f13e5093] [cursor=pointer]
                        - button "取消" [ref=f13e5096] [cursor=pointer]
                  - row "CGRK261005016 CGDD20260925004 é‡‡è´­å…¥åº“ CGDD20260925004 ä¸­å›½çŸ³æ²¹å…‹æ‹‰çŽ›ä¾çŸ³åŒ–å…¬å¸ 2026-10-05 å·²å®Œæˆ" [ref=f13e5098]:
                    - cell "CGRK261005016" [ref=f13e5099]:
                      - button "CGRK261005016" [ref=f13e5102] [cursor=pointer]
                    - cell "CGDD20260925004 é‡‡è´­å…¥åº“" [ref=f13e5104]
                    - cell "CGDD20260925004" [ref=f13e5108]
                    - cell "中国石油克拉玛依石化公司" [ref=f13e5112]
                    - cell "2026-10-05" [ref=f13e5116]
                    - cell "已完成" [ref=f13e5120]
                    - cell [ref=f13e5124]
                  - row "CGRK260930015 CGDD20260924004 é‡‡è´­å…¥åº“ CGDD20260924004 æ²³åŒ—硅谷化工有限公司 2026-09-30 å·²å®Œæˆ" [ref=f13e5126]:
                    - cell "CGRK260930015" [ref=f13e5127]:
                      - button "CGRK260930015" [ref=f13e5130] [cursor=pointer]
                    - cell "CGDD20260924004 é‡‡è´­å…¥åº“" [ref=f13e5132]
                    - cell "CGDD20260924004" [ref=f13e5136]
                    - cell "河北硅谷化工有限公司" [ref=f13e5140]
                    - cell "2026-09-30" [ref=f13e5144]
                    - cell "已完成" [ref=f13e5148]
                    - cell [ref=f13e5152]
                  - row "CGRK260929014 CGDD20260924003 é‡‡è´­å…¥åº“ CGDD20260924003 æ–°ç–†ä¼—和股份有限公司 2026-09-29 å·²å®Œæˆ" [ref=f13e5154]:
                    - cell "CGRK260929014" [ref=f13e5155]:
                      - button "CGRK260929014" [ref=f13e5158] [cursor=pointer]
                    - cell "CGDD20260924003 é‡‡è´­å…¥åº“" [ref=f13e5160]
                    - cell "CGDD20260924003" [ref=f13e5164]
                    - cell "新疆众和股份有限公司" [ref=f13e5168]
                    - cell "2026-09-29" [ref=f13e5172]
                    - cell "已完成" [ref=f13e5176]
                    - cell [ref=f13e5180]
                  - row "CGRK261005013 CGDD20260925003 é‡‡è´­å…¥åº“ CGDD20260925003 æ²³åŒ—硅谷化工有限公司 2026-10-05 å·²å®Œæˆ" [ref=f13e5182]:
                    - cell "CGRK261005013" [ref=f13e5183]:
                      - button "CGRK261005013" [ref=f13e5186] [cursor=pointer]
                    - cell "CGDD20260925003 é‡‡è´­å…¥åº“" [ref=f13e5188]
                    - cell "CGDD20260925003" [ref=f13e5192]
                    - cell "河北硅谷化工有限公司" [ref=f13e5196]
                    - cell "2026-10-05" [ref=f13e5200]
                    - cell "已完成" [ref=f13e5204]
                    - cell [ref=f13e5208]
                  - row "CGRK260930012 CGDD20260925002 é‡‡è´­å…¥åº“ CGDD20260925002 ä¹Œé²æœ¨é½å¤©å±±é‡‘具制造有限公司 2026-09-30 å·²å®Œæˆ" [ref=f13e5210]:
                    - cell "CGRK260930012" [ref=f13e5211]:
                      - button "CGRK260930012" [ref=f13e5214] [cursor=pointer]
                    - cell "CGDD20260925002 é‡‡è´­å…¥åº“" [ref=f13e5216]
                    - cell "CGDD20260925002" [ref=f13e5220]
                    - cell "乌鲁木齐天山金具制造有限公司" [ref=f13e5224]
                    - cell "2026-09-30" [ref=f13e5228]
                    - cell "已完成" [ref=f13e5232]
                    - cell [ref=f13e5236]
                  - row "CGRK261004011 CGDD20260925001 é‡‡è´­å…¥åº“ CGDD20260925001 ç‰¹å˜ç”µå·¥æ–°ç–†æ–°èƒ½æºè‚¡ä»½æœ‰é™å…¬å¸ 2026-10-04 å·²å®Œæˆ" [ref=f13e5238]:
                    - cell "CGRK261004011" [ref=f13e5239]:
                      - button "CGRK261004011" [ref=f13e5242] [cursor=pointer]
                    - cell "CGDD20260925001 é‡‡è´­å…¥åº“" [ref=f13e5244]
                    - cell "CGDD20260925001" [ref=f13e5248]
                    - cell "特变电工新疆新能源股份有限公司" [ref=f13e5252]
                    - cell "2026-10-04" [ref=f13e5256]
                    - cell "已完成" [ref=f13e5260]
                    - cell [ref=f13e5264]
                  - row "CGRK260930010 CGDD20260924002 é‡‡è´­å…¥åº“ CGDD20260924002 è¥¿å®‰è¥¿ç”µé«˜åŽ‹ç”µç“·æœ‰é™è´£ä»»å…¬å¸ 2026-09-30 å·²å®Œæˆ" [ref=f13e5266]:
                    - cell "CGRK260930010" [ref=f13e5267]:
                      - button "CGRK260930010" [ref=f13e5270] [cursor=pointer]
                    - cell "CGDD20260924002 é‡‡è´­å…¥åº“" [ref=f13e5272]
                    - cell "CGDD20260924002" [ref=f13e5276]
                    - cell "西安西电高压电瓷有限责任公司" [ref=f13e5280]
                    - cell "2026-09-30" [ref=f13e5284]
                    - cell "已完成" [ref=f13e5288]
                    - cell [ref=f13e5292]
                  - row "CGRK260929009 CGDD20260924001 é‡‡è´­å…¥åº“ CGDD20260924001 æ­£æ³°ç”µæ°”股份有限公司 2026-09-29 å·²å®Œæˆ" [ref=f13e5294]:
                    - cell "CGRK260929009" [ref=f13e5295]:
                      - button "CGRK260929009" [ref=f13e5298] [cursor=pointer]
                    - cell "CGDD20260924001 é‡‡è´­å…¥åº“" [ref=f13e5300]
                    - cell "CGDD20260924001" [ref=f13e5304]
                    - cell "正泰电气股份有限公司" [ref=f13e5308]
                    - cell "2026-09-29" [ref=f13e5312]
                    - cell "已完成" [ref=f13e5316]
                    - cell [ref=f13e5320]
                  - row "CGRK261013008 CGDD20261009002 é‡‡è´­å…¥åº“ CGDD20261009002 é¦–钢智新迁安电磁材料有限公司 2026-10-13 å·²å®Œæˆ" [ref=f13e5322]:
                    - cell "CGRK261013008" [ref=f13e5323]:
                      - button "CGRK261013008" [ref=f13e5326] [cursor=pointer]
                    - cell "CGDD20261009002 é‡‡è´­å…¥åº“" [ref=f13e5328]
                    - cell "CGDD20261009002" [ref=f13e5332]
                    - cell "首钢智新迁安电磁材料有限公司" [ref=f13e5336]
                    - cell "2026-10-13" [ref=f13e5340]
                    - cell "已完成" [ref=f13e5344]
                    - cell [ref=f13e5348]
                  - row "CGRK261015007 CGDD20261012001 é‡‡è´­å…¥åº“ CGDD20261012001 è¿œä¸œç”µç¼†æœ‰é™å…¬å¸ 2026-10-15 å·²å®Œæˆ" [ref=f13e5350]:
                    - cell "CGRK261015007" [ref=f13e5351]:
                      - button "CGRK261015007" [ref=f13e5354] [cursor=pointer]
                    - cell "CGDD20261012001 é‡‡è´­å…¥åº“" [ref=f13e5356]
                    - cell "CGDD20261012001" [ref=f13e5360]
                    - cell "远东电缆有限公司" [ref=f13e5364]
                    - cell "2026-10-15" [ref=f13e5368]
                    - cell "已完成" [ref=f13e5372]
                    - cell [ref=f13e5376]
                  - row "CGRK261013006 CGDD20261009001 é‡‡è´­å…¥åº“ CGDD20261009001 è¿œä¸œç”µç¼†æœ‰é™å…¬å¸ 2026-10-13 å·²å®Œæˆ" [ref=f13e5378]:
                    - cell "CGRK261013006" [ref=f13e5379]:
                      - button "CGRK261013006" [ref=f13e5382] [cursor=pointer]
                    - cell "CGDD20261009001 é‡‡è´­å…¥åº“" [ref=f13e5384]
                    - cell "CGDD20261009001" [ref=f13e5388]
                    - cell "远东电缆有限公司" [ref=f13e5392]
                    - cell "2026-10-13" [ref=f13e5396]
                    - cell "已完成" [ref=f13e5400]
                    - cell [ref=f13e5404]
                  - row "CGRK260926005 CGDD20260923002 é‡‡è´­å…¥åº“ CGDD20260923002 ä¸­å›½çŸ³æ²¹å…‹æ‹‰çŽ›ä¾çŸ³åŒ–å…¬å¸ 2026-09-26 å·²å®Œæˆ" [ref=f13e5406]:
                    - cell "CGRK260926005" [ref=f13e5407]:
                      - button "CGRK260926005" [ref=f13e5410] [cursor=pointer]
                    - cell "CGDD20260923002 é‡‡è´­å…¥åº“" [ref=f13e5412]
                    - cell "CGDD20260923002" [ref=f13e5416]
                    - cell "中国石油克拉玛依石化公司" [ref=f13e5420]
                    - cell "2026-09-26" [ref=f13e5424]
                    - cell "已完成" [ref=f13e5428]
                    - cell [ref=f13e5432]
                  - row "CGRK260926004 CGDD20260923001 é‡‡è´­å…¥åº“ CGDD20260923001 æ²³åŒ—硅谷化工有限公司 2026-09-26 å·²å®Œæˆ" [ref=f13e5434]:
                    - cell "CGRK260926004" [ref=f13e5435]:
                      - button "CGRK260926004" [ref=f13e5438] [cursor=pointer]
                    - cell "CGDD20260923001 é‡‡è´­å…¥åº“" [ref=f13e5440]
                    - cell "CGDD20260923001" [ref=f13e5444]
                    - cell "河北硅谷化工有限公司" [ref=f13e5448]
                    - cell "2026-09-26" [ref=f13e5452]
                    - cell "已完成" [ref=f13e5456]
                    - cell [ref=f13e5460]
                  - row "CGRK260927003 CGDD20260922003 é‡‡è´­å…¥åº“ CGDD20260922003 é¦–钢智新迁安电磁材料有限公司 2026-09-27 å·²å®Œæˆ" [ref=f13e5462]:
                    - cell "CGRK260927003" [ref=f13e5463]:
                      - button "CGRK260927003" [ref=f13e5466] [cursor=pointer]
                    - cell "CGDD20260922003 é‡‡è´­å…¥åº“" [ref=f13e5468]
                    - cell "CGDD20260922003" [ref=f13e5472]
                    - cell "首钢智新迁安电磁材料有限公司" [ref=f13e5476]
                    - cell "2026-09-27" [ref=f13e5480]
                    - cell "已完成" [ref=f13e5484]
                    - cell [ref=f13e5488]
                  - row "CGRK260926002 CGDD20260922002 é‡‡è´­å…¥åº“ CGDD20260922002 æ–°ç–†ä¼—和股份有限公司 2026-09-26 å·²å®Œæˆ" [ref=f13e5490]:
                    - cell "CGRK260926002" [ref=f13e5491]:
                      - button "CGRK260926002" [ref=f13e5494] [cursor=pointer]
                    - cell "CGDD20260922002 é‡‡è´­å…¥åº“" [ref=f13e5496]
                    - cell "CGDD20260922002" [ref=f13e5500]
                    - cell "新疆众和股份有限公司" [ref=f13e5504]
                    - cell "2026-09-26" [ref=f13e5508]
                    - cell "已完成" [ref=f13e5512]
                    - cell [ref=f13e5516]
                  - row "CGRK260925001 CGDD20260922001 é‡‡è´­å…¥åº“ CGDD20260922001 å®æ­¦é›†å›¢æ–°ç–†å…«ä¸€é’¢é“æœ‰é™å…¬å¸ 2026-09-25 å·²å®Œæˆ" [ref=f13e5518]:
                    - cell "CGRK260925001" [ref=f13e5519]:
                      - button "CGRK260925001" [ref=f13e5522] [cursor=pointer]
                    - cell "CGDD20260922001 é‡‡è´­å…¥åº“" [ref=f13e5524]
                    - cell "CGDD20260922001" [ref=f13e5528]
                    - cell "宝武集团新疆八一钢铁有限公司" [ref=f13e5532]
                    - cell "2026-09-25" [ref=f13e5536]
                    - cell "已完成" [ref=f13e5540]
                    - cell [ref=f13e5544]
            - generic [ref=f13e5553]:
              - generic [ref=f13e5554]: å…± 17 æ¡è®°å½•
              - generic [ref=f13e5556] [cursor=pointer]:
                - generic "20条/页" [ref=f13e5557]:
                  - textbox "请选择" [ref=f13e5558]: 20条/页
                - generic [ref=f13e5559]: î£­
              - button "" [ref=f13e5562]
              - button "" [ref=f13e5564]
              - button "" [ref=f13e5566]
              - button "1" [ref=f13e5569] [cursor=pointer]
              - button "" [ref=f13e5570]
              - button "" [ref=f13e5572]
              - button "" [ref=f13e5574]
  - dialog [ref=f13e5577]:
    - heading "新增采购入库单" [level=2] [ref=f13e5579]
    - generic [ref=f13e5583]:
      - generic [ref=f13e5584]:
        - generic [ref=f13e5585]:
          - generic [ref=f13e5586]: "*"
          - text: å…¥åº“单编号
        - generic [ref=f13e5590]:
          - textbox "* å…¥åº“单编号" [ref=f13e5591]:
            - /placeholder: è¯·è¾“入入库单编号
          - button "生 æˆ" [ref=f13e5593] [cursor=pointer]
      - generic [ref=f13e5595]:
        - generic [ref=f13e5596]: å…¥åº“单名称
        - textbox "入库单名称" [ref=f13e5601]:
          - /placeholder: è¯·è¾“入入库单名称
      - generic [ref=f13e5602]:
        - generic [ref=f13e5603]:
          - generic [ref=f13e5604]: "*"
          - text: å…¥åº“日期
        - generic [ref=f13e5610]:
          - textbox "* å…¥åº“日期" [ref=f13e5611]:
            - /placeholder: è¯·é€‰æ‹©å…¥åº“日期
          - generic:
            - img "calendar"
      - generic [ref=f13e5612]:
        - generic [ref=f13e5613]: åˆ°è´§é€šçŸ¥å•
        - textbox "请选择到货通知单" [ref=f13e5620]
      - generic [ref=f13e5626]:
        - generic [ref=f13e5627]:
          - generic [ref=f13e5628]: "*"
          - text: ä¾›åº”商
        - textbox "请选择供应商" [ref=f13e5635]
      - generic [ref=f13e5641]:
        - generic [ref=f13e5642]: é‡‡è´­è®¢å•号
        - textbox "采购订单号" [ref=f13e5647]:
          - /placeholder: è¯·è¾“入采购订单号
      - generic [ref=f13e5648]:
        - generic [ref=f13e5649]: å¤‡æ³¨
        - textbox "备注" [ref=f13e5654]:
          - /placeholder: è¯·è¾“入备注
    - button [ref=f13e5655] [cursor=pointer]
    - generic [ref=f13e5665]:
      - button "取 æ¶ˆ" [ref=f13e5666] [cursor=pointer]
      - button "ç¡® è®¤" [ref=f13e5668] [cursor=pointer]
    - button [ref=f13e5670] [cursor=pointer]
po-dialog-fixed.png
qc-template-fixed.png
supplier-dialog.png
yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/controller/admin/qc/iqc/MesQcIqcController.java
@@ -12,12 +12,12 @@
import cn.iocoder.yudao.module.mes.controller.admin.qc.iqc.vo.MesQcIqcSaveReqVO;
import cn.iocoder.yudao.module.srm.api.supplier.SrmSupplierApi;
import cn.iocoder.yudao.module.srm.api.supplier.dto.SrmSupplierRespDTO;
import cn.iocoder.yudao.module.mes.dal.dataobject.md.item.MesMdItemDO;
import cn.iocoder.yudao.module.mdm.api.item.dto.MdmItemRespDTO;
import cn.iocoder.yudao.module.mes.dal.dataobject.md.unitmeasure.MesMdUnitMeasureDO;
import cn.iocoder.yudao.module.mes.dal.dataobject.qc.iqc.MesQcIqcDO;
import cn.iocoder.yudao.module.mes.service.md.item.MesMdItemService;
import cn.iocoder.yudao.module.mes.service.md.unitmeasure.MesMdUnitMeasureService;
import cn.iocoder.yudao.module.mes.service.qc.iqc.MesQcIqcService;
import cn.iocoder.yudao.module.mes.service.qc.support.MesQcItemResolver;
import cn.iocoder.yudao.module.system.api.user.AdminUserApi;
import cn.iocoder.yudao.module.system.api.user.dto.AdminUserRespDTO;
import io.swagger.v3.oas.annotations.Operation;
@@ -56,7 +56,7 @@
    @Resource
    private SrmSupplierApi srmSupplierApi;
    @Resource
    private MesMdItemService itemService;
    private MesQcItemResolver qcItemResolver;
    @Resource
    private MesMdUnitMeasureService unitMeasureService;
@@ -135,12 +135,12 @@
        Map<Long, SrmSupplierRespDTO> vendorMap = srmSupplierApi.getSupplierList(
                convertSet(list, MesQcIqcDO::getVendorId)).getCheckedData().stream()
                .collect(java.util.stream.Collectors.toMap(SrmSupplierRespDTO::getId, s -> s));
        // æ‰¹é‡æŸ¥è¯¢ç‰©æ–™
        Map<Long, MesMdItemDO> itemMap = itemService.getItemMap(
        // æ‰¹é‡æŸ¥è¯¢ç‰©æ–™ï¼ˆå…¼å®¹ mdm_item.id / mes_md_item.id)
        Map<Long, MdmItemRespDTO> itemMap = qcItemResolver.getItemMap(
                convertSet(list, MesQcIqcDO::getItemId));
        // æ‰¹é‡æŸ¥è¯¢è®¡é‡å•位(通过物料的 unitMeasureId)
        Map<Long, MesMdUnitMeasureDO> unitMeasureMap = unitMeasureService.getUnitMeasureMap(
                convertSet(itemMap.values(), MesMdItemDO::getUnitMeasureId));
                convertSet(itemMap.values(), MdmItemRespDTO::getUnitMeasureId));
        // æ‰¹é‡æŸ¥è¯¢æ£€æµ‹äººå‘˜
        Map<Long, AdminUserRespDTO> userMap = adminUserApi.getUserMap(
                convertSet(list, MesQcIqcDO::getInspectorUserId));
yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/controller/admin/qc/ncr/MesQcNcrController.java
@@ -8,10 +8,10 @@
import cn.iocoder.yudao.framework.common.util.object.BeanUtils;
import cn.iocoder.yudao.framework.excel.core.util.ExcelUtils;
import cn.iocoder.yudao.module.mes.controller.admin.qc.ncr.vo.*;
import cn.iocoder.yudao.module.mes.dal.dataobject.md.item.MesMdItemDO;
import cn.iocoder.yudao.module.mdm.api.item.dto.MdmItemRespDTO;
import cn.iocoder.yudao.module.mes.dal.dataobject.qc.ncr.MesQcNcrDO;
import cn.iocoder.yudao.module.mes.service.md.item.MesMdItemService;
import cn.iocoder.yudao.module.mes.service.qc.ncr.MesQcNcrService;
import cn.iocoder.yudao.module.mes.service.qc.support.MesQcItemResolver;
import cn.iocoder.yudao.module.system.api.dept.DeptApi;
import cn.iocoder.yudao.module.system.api.dept.dto.DeptRespDTO;
import cn.iocoder.yudao.module.system.api.user.AdminUserApi;
@@ -49,7 +49,7 @@
    private MesQcNcrService ncrService;
    @Resource
    private MesMdItemService itemService;
    private MesQcItemResolver qcItemResolver;
    @Resource
    private AdminUserApi adminUserApi;
@@ -143,8 +143,8 @@
        if (CollUtil.isEmpty(list)) {
            return Collections.emptyList();
        }
        // æ‰¹é‡æŸ¥è¯¢ç‰©æ–™
        Map<Long, MesMdItemDO> itemMap = itemService.getItemMap(
        // æ‰¹é‡æŸ¥è¯¢ç‰©æ–™ï¼ˆå…¼å®¹ mdm_item.id / mes_md_item.id)
        Map<Long, MdmItemRespDTO> itemMap = qcItemResolver.getItemMap(
                convertSet(list, MesQcNcrDO::getItemId));
        // æ‰¹é‡æŸ¥è¯¢è¯„审人
        Set<Long> reviewerUserIds = convertSet(list, MesQcNcrDO::getReviewerUserId);
yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/controller/admin/qc/oqc/MesQcOqcController.java
@@ -12,13 +12,12 @@
import cn.iocoder.yudao.module.mes.controller.admin.qc.oqc.vo.MesQcOqcSaveReqVO;
import cn.iocoder.yudao.module.crm.api.customer.CrmCustomerApi;
import cn.iocoder.yudao.module.crm.api.customer.dto.CrmCustomerRespDTO;
import cn.iocoder.yudao.module.mes.dal.dataobject.md.item.MesMdItemDO;
import cn.iocoder.yudao.module.mdm.api.item.dto.MdmItemRespDTO;
import cn.iocoder.yudao.module.mes.dal.dataobject.md.unitmeasure.MesMdUnitMeasureDO;
import cn.iocoder.yudao.module.mes.dal.dataobject.qc.oqc.MesQcOqcDO;
import cn.iocoder.yudao.module.crm.api.customer.CrmCustomerApi;
import cn.iocoder.yudao.module.mes.service.md.item.MesMdItemService;
import cn.iocoder.yudao.module.mes.service.md.unitmeasure.MesMdUnitMeasureService;
import cn.iocoder.yudao.module.mes.service.qc.oqc.MesQcOqcService;
import cn.iocoder.yudao.module.mes.service.qc.support.MesQcItemResolver;
import cn.iocoder.yudao.module.system.api.user.AdminUserApi;
import cn.iocoder.yudao.module.system.api.user.dto.AdminUserRespDTO;
import io.swagger.v3.oas.annotations.Operation;
@@ -56,7 +55,7 @@
    @Resource
    private CrmCustomerApi customerApi;
    @Resource
    private MesMdItemService itemService;
    private MesQcItemResolver qcItemResolver;
    @Resource
    private MesMdUnitMeasureService unitMeasureService;
@@ -134,12 +133,12 @@
        // æ‰¹é‡æŸ¥è¯¢å®¢æˆ·
        Map<Long, CrmCustomerRespDTO> clientMap = customerApi.getCustomerMap(
                convertSet(list, MesQcOqcDO::getClientId));
        // æ‰¹é‡æŸ¥è¯¢ç‰©æ–™
        Map<Long, MesMdItemDO> itemMap = itemService.getItemMap(
        // æ‰¹é‡æŸ¥è¯¢ç‰©æ–™ï¼ˆå…¼å®¹ mdm_item.id / mes_md_item.id)
        Map<Long, MdmItemRespDTO> itemMap = qcItemResolver.getItemMap(
                convertSet(list, MesQcOqcDO::getItemId));
        // æ‰¹é‡æŸ¥è¯¢è®¡é‡å•位
        Map<Long, MesMdUnitMeasureDO> unitMeasureMap = unitMeasureService.getUnitMeasureMap(
                convertSet(itemMap.values(), MesMdItemDO::getUnitMeasureId));
                convertSet(itemMap.values(), MdmItemRespDTO::getUnitMeasureId));
        // æ‰¹é‡æŸ¥è¯¢æ£€æµ‹äººå‘˜
        Map<Long, AdminUserRespDTO> userMap = adminUserApi.getUserMap(
                convertSet(list, MesQcOqcDO::getInspectorUserId));
yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/controller/admin/qc/pendinginspect/MesQcPendingInspectController.java
@@ -9,15 +9,15 @@
import cn.iocoder.yudao.module.crm.api.customer.dto.CrmCustomerRespDTO;
import cn.iocoder.yudao.module.srm.api.supplier.SrmSupplierApi;
import cn.iocoder.yudao.module.srm.api.supplier.dto.SrmSupplierRespDTO;
import cn.iocoder.yudao.module.mes.dal.dataobject.md.item.MesMdItemDO;
import cn.iocoder.yudao.module.mdm.api.item.dto.MdmItemRespDTO;
import cn.iocoder.yudao.module.mes.dal.dataobject.md.unitmeasure.MesMdUnitMeasureDO;
import cn.iocoder.yudao.module.mes.dal.dataobject.md.workstation.MesMdWorkstationDO;
import cn.iocoder.yudao.module.mes.dal.dataobject.pro.task.MesProTaskDO;
import cn.iocoder.yudao.module.mes.service.md.item.MesMdItemService;
import cn.iocoder.yudao.module.mes.service.md.unitmeasure.MesMdUnitMeasureService;
import cn.iocoder.yudao.module.mes.service.md.workstation.MesMdWorkstationService;
import cn.iocoder.yudao.module.mes.service.pro.task.MesProTaskService;
import cn.iocoder.yudao.module.mes.service.qc.pendinginspect.MesQcPendingInspectService;
import cn.iocoder.yudao.module.mes.service.qc.support.MesQcItemResolver;
import io.swagger.v3.oas.annotations.Operation;
import io.swagger.v3.oas.annotations.tags.Tag;
import jakarta.annotation.Resource;
@@ -44,7 +44,7 @@
    @Resource
    private MesQcPendingInspectService pendingInspectService;
    @Resource
    private MesMdItemService itemService;
    private MesQcItemResolver qcItemResolver;
    @Resource
    private MesMdUnitMeasureService unitMeasureService;
    @Resource
@@ -73,12 +73,12 @@
        if (CollUtil.isEmpty(list)) {
            return;
        }
        // æ‰¹é‡æŸ¥è¯¢ç‰©æ–™
        Map<Long, MesMdItemDO> itemMap = itemService.getItemMap(
        // æ‰¹é‡æŸ¥è¯¢ç‰©æ–™ï¼ˆå…¼å®¹ mdm_item.id / mes_md_item.id)
        Map<Long, MdmItemRespDTO> itemMap = qcItemResolver.getItemMap(
                convertSet(list, MesQcPendingInspectRespVO::getItemId));
        // æ‰¹é‡æŸ¥è¯¢è®¡é‡å•位(通过物料的 unitMeasureId)
        Map<Long, MesMdUnitMeasureDO> unitMeasureMap = unitMeasureService.getUnitMeasureMap(
                convertSet(itemMap.values(), MesMdItemDO::getUnitMeasureId));
                convertSet(itemMap.values(), MdmItemRespDTO::getUnitMeasureId));
        // æ‰¹é‡æŸ¥è¯¢ä¾›åº”商(IQC åœºæ™¯ï¼‰
        Map<Long, SrmSupplierRespDTO> vendorMap = srmSupplierApi.getSupplierList(
                convertSet(list, MesQcPendingInspectRespVO::getVendorId)).getCheckedData().stream()
yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/controller/admin/qc/rqc/MesQcRqcController.java
@@ -10,12 +10,12 @@
import cn.iocoder.yudao.module.mes.controller.admin.qc.rqc.vo.MesQcRqcPageReqVO;
import cn.iocoder.yudao.module.mes.controller.admin.qc.rqc.vo.MesQcRqcRespVO;
import cn.iocoder.yudao.module.mes.controller.admin.qc.rqc.vo.MesQcRqcSaveReqVO;
import cn.iocoder.yudao.module.mes.dal.dataobject.md.item.MesMdItemDO;
import cn.iocoder.yudao.module.mdm.api.item.dto.MdmItemRespDTO;
import cn.iocoder.yudao.module.mes.dal.dataobject.md.unitmeasure.MesMdUnitMeasureDO;
import cn.iocoder.yudao.module.mes.dal.dataobject.qc.rqc.MesQcRqcDO;
import cn.iocoder.yudao.module.mes.service.md.item.MesMdItemService;
import cn.iocoder.yudao.module.mes.service.md.unitmeasure.MesMdUnitMeasureService;
import cn.iocoder.yudao.module.mes.service.qc.rqc.MesQcRqcService;
import cn.iocoder.yudao.module.mes.service.qc.support.MesQcItemResolver;
import cn.iocoder.yudao.module.system.api.user.AdminUserApi;
import cn.iocoder.yudao.module.system.api.user.dto.AdminUserRespDTO;
import io.swagger.v3.oas.annotations.Operation;
@@ -51,7 +51,7 @@
    @Resource
    private MesQcRqcService rqcService;
    @Resource
    private MesMdItemService itemService;
    private MesQcItemResolver qcItemResolver;
    @Resource
    private MesMdUnitMeasureService unitMeasureService;
@@ -126,12 +126,12 @@
        if (CollUtil.isEmpty(list)) {
            return Collections.emptyList();
        }
        // æ‰¹é‡æŸ¥è¯¢ç‰©æ–™
        Map<Long, MesMdItemDO> itemMap = itemService.getItemMap(
        // æ‰¹é‡æŸ¥è¯¢ç‰©æ–™ï¼ˆå…¼å®¹ mdm_item.id / mes_md_item.id)
        Map<Long, MdmItemRespDTO> itemMap = qcItemResolver.getItemMap(
                convertSet(list, MesQcRqcDO::getItemId));
        // æ‰¹é‡æŸ¥è¯¢è®¡é‡å•位
        Map<Long, MesMdUnitMeasureDO> unitMeasureMap = unitMeasureService.getUnitMeasureMap(
                convertSet(itemMap.values(), MesMdItemDO::getUnitMeasureId));
                convertSet(itemMap.values(), MdmItemRespDTO::getUnitMeasureId));
        // æ‰¹é‡æŸ¥è¯¢æ£€æµ‹äººå‘˜
        Map<Long, AdminUserRespDTO> userMap = adminUserApi.getUserMap(
                convertSet(list, MesQcRqcDO::getInspectorUserId));
yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/dal/mysql/wm/itemreceipt/MesWmItemReceiptMapper.java
@@ -5,7 +5,6 @@
import cn.iocoder.yudao.framework.mybatis.core.query.LambdaQueryWrapperX;
import cn.iocoder.yudao.module.mes.controller.admin.wm.itemreceipt.vo.MesWmItemReceiptPageReqVO;
import cn.iocoder.yudao.module.mes.dal.dataobject.wm.itemreceipt.MesWmItemReceiptDO;
import cn.iocoder.yudao.module.mes.enums.wm.MesWmItemReceiptStatusEnum;
import com.baomidou.mybatisplus.core.conditions.update.LambdaUpdateWrapper;
import org.apache.ibatis.annotations.Mapper;
@@ -80,23 +79,6 @@
                .set(MesWmItemReceiptDO::getStatus, status)
                .set(MesWmItemReceiptDO::getReviewerId, reviewerId)
                .set(MesWmItemReceiptDO::getReviewerName, reviewerName)
                .set(MesWmItemReceiptDO::getReviewTime, LocalDateTime.now())
                .set(MesWmItemReceiptDO::getReviewRemark, reviewRemark));
    }
    /**
     * BPM å®¡æ‰¹ç»“果回写:仅当单据仍处于审批中时更新,避免重复 / è¿‡æœŸäº‹ä»¶è¦†ç›–人工审核结果
     *
     * @param id           ç¼–号
     * @param status       ç›®æ ‡çŠ¶æ€ï¼ˆå¾…æ‰§è¡Œå…¥åº“ / è‰ç¨¿ / å·²å–消)
     * @param reviewRemark å®¡æ‰¹æ„è§
     * @return å½±å“è¡Œæ•°
     */
    default int updateAuditStatusByBpm(Long id, Integer status, String reviewRemark) {
        return update(null, new LambdaUpdateWrapper<MesWmItemReceiptDO>()
                .eq(MesWmItemReceiptDO::getId, id)
                .eq(MesWmItemReceiptDO::getStatus, MesWmItemReceiptStatusEnum.APPROVING.getStatus())
                .set(MesWmItemReceiptDO::getStatus, status)
                .set(MesWmItemReceiptDO::getReviewTime, LocalDateTime.now())
                .set(MesWmItemReceiptDO::getReviewRemark, reviewRemark));
    }
yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/enums/wm/MesWmItemReceiptStatusEnum.java
@@ -29,7 +29,7 @@
     */
    APPROVING(MesOrderStatusConstants.APPROVING, "待上架"),
    /**
     * å¾…入库
     * å¾…执行入库
     *
     * å¯¹åº” MesWmItemReceiptService#stockItemReceipt æ–¹æ³•
     */
yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/service/qc/iqc/MesQcIqcServiceImpl.java
@@ -27,6 +27,7 @@
import cn.iocoder.yudao.module.mes.enums.qc.MesQcCheckResultEnum;
import cn.iocoder.yudao.module.srm.api.supplier.SrmSupplierApi;
import cn.iocoder.yudao.module.mdm.api.item.MdmItemApi;
import cn.iocoder.yudao.module.mdm.api.item.dto.MdmItemRespDTO;
import cn.iocoder.yudao.module.system.api.user.AdminUserApi;
import jakarta.annotation.Resource;
import org.springframework.context.annotation.Lazy;
@@ -459,7 +460,8 @@
                respVO.getFailureCodes().put(key, "合格品数量与不合格品数量之和必须等于本次接收数量");
                return;
            }
            cn.iocoder.yudao.module.mes.dal.dataobject.md.item.MesMdItemDO item = itemService.getItemByCode(importItem.getItemCode());
            // æ¥æ–™æ£€éªŒå•的物料以 MDM ä¸ºå‡†ï¼Œå¯¼å…¥æŒ‰ MDM ç‰©æ–™ç¼–码解析
            MdmItemRespDTO item = mdmItemApi.getItemByCode(importItem.getItemCode()).getCheckedData();
            if (item == null) {
                respVO.getFailureCodes().put(key, "物料不存在:" + importItem.getItemCode());
                return;
yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/service/qc/ncr/MesQcNcrServiceImpl.java
@@ -13,6 +13,7 @@
import cn.iocoder.yudao.module.mes.service.qc.ipqc.MesQcIpqcService;
import cn.iocoder.yudao.module.mes.service.qc.oqc.MesQcOqcService;
import cn.iocoder.yudao.module.mes.service.qc.rqc.MesQcRqcService;
import cn.iocoder.yudao.module.mes.service.qc.support.MesQcItemResolver;
import cn.iocoder.yudao.module.mdm.api.item.MdmItemApi;
import jakarta.annotation.Resource;
import org.springframework.context.annotation.Lazy;
@@ -57,6 +58,9 @@
    @Resource
    private MdmItemApi mdmItemApi;
    @Resource
    private MesQcItemResolver qcItemResolver;
    @Resource
    @Lazy
@@ -208,9 +212,8 @@
     * æ ¡éªŒç‰©æ–™å­˜åœ¨
     */
    private void validateItemExists(Long itemId) {
        if (itemId != null) {
            mdmItemApi.getItem(itemId).getCheckedData();
        }
        // ä¸åˆæ ¼å“å•的物料可能来自 MDM å•据或 MES å·¥å•,需兼容两套 ID
        qcItemResolver.validateItemExists(itemId);
    }
    /**
yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/service/qc/oqc/MesQcOqcServiceImpl.java
@@ -25,6 +25,7 @@
import cn.iocoder.yudao.module.mes.dal.dataobject.wm.productsales.MesWmProductSalesLineDO;
import cn.iocoder.yudao.module.crm.api.customer.CrmCustomerApi;
import cn.iocoder.yudao.module.mdm.api.item.MdmItemApi;
import cn.iocoder.yudao.module.mdm.api.item.dto.MdmItemRespDTO;
import cn.iocoder.yudao.module.system.api.user.AdminUserApi;
import jakarta.annotation.Resource;
import org.springframework.context.annotation.Lazy;
@@ -446,7 +447,8 @@
                respVO.getFailureCodes().put(key, "客户不存在:" + importItem.getClientName());
                return;
            }
            cn.iocoder.yudao.module.mes.dal.dataobject.md.item.MesMdItemDO item = itemService.getItemByCode(importItem.getItemCode());
            // å‡ºè´§æ£€éªŒå•的物料以 MDM ä¸ºå‡†ï¼Œå¯¼å…¥æŒ‰ MDM ç‰©æ–™ç¼–码解析
            MdmItemRespDTO item = mdmItemApi.getItemByCode(importItem.getItemCode()).getCheckedData();
            if (item == null) {
                respVO.getFailureCodes().put(key, "物料不存在:" + importItem.getItemCode());
                return;
yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/service/qc/rqc/MesQcRqcServiceImpl.java
@@ -3,6 +3,8 @@
import cn.hutool.core.util.ObjUtil;
import cn.iocoder.yudao.framework.common.pojo.PageResult;
import cn.iocoder.yudao.framework.common.util.object.BeanUtils;
import cn.iocoder.yudao.module.mdm.api.item.MdmItemApi;
import cn.iocoder.yudao.module.mdm.api.item.dto.MdmItemRespDTO;
import cn.iocoder.yudao.module.mes.controller.admin.qc.rqc.vo.MesQcRqcPageReqVO;
import cn.iocoder.yudao.module.mes.controller.admin.qc.rqc.vo.MesQcRqcSaveReqVO;
import cn.iocoder.yudao.module.mes.dal.dataobject.qc.defectrecord.MesQcDefectRecordDO;
@@ -23,6 +25,7 @@
import cn.iocoder.yudao.module.mes.service.wm.returnsales.MesWmReturnSalesLineService;
import cn.iocoder.yudao.module.mes.controller.admin.qc.ncr.vo.MesQcNcrSaveReqVO;
import cn.iocoder.yudao.module.mes.service.qc.ncr.MesQcNcrService;
import cn.iocoder.yudao.module.mes.service.qc.support.MesQcItemResolver;
import cn.iocoder.yudao.module.mes.enums.qc.MesQcCheckResultEnum;
import cn.iocoder.yudao.module.system.api.user.AdminUserApi;
import jakarta.annotation.Resource;
@@ -68,6 +71,10 @@
    @Resource
    @Lazy
    private MesMdItemService itemService;
    @Resource
    private MdmItemApi mdmItemApi;
    @Resource
    private MesQcItemResolver qcItemResolver;
    @Resource
    @Lazy
    private MesQcDefectRecordService defectRecordService;
@@ -137,8 +144,8 @@
    private void validateRqcSaveData(MesQcRqcSaveReqVO reqVO) {
        // æ ¡éªŒç¼–号唯一
        validateRqcCodeUnique(reqVO.getId(), reqVO.getCode());
        // æ ¡éªŒç‰©æ–™ã€æ£€æµ‹äººå‘˜å­˜åœ¨
        itemService.validateItemExists(reqVO.getItemId());
        // æ ¡éªŒç‰©æ–™ã€æ£€æµ‹äººå‘˜å­˜åœ¨ï¼ˆå…¼å®¹ mdm_item.id / mes_md_item.id)
        qcItemResolver.validateItemExists(reqVO.getItemId());
        adminUserApi.validateUser(reqVO.getInspectorUserId());
    }
@@ -379,7 +386,8 @@
                respVO.getFailureCodes().put(key, "检测日期不能为空");
                return;
            }
            cn.iocoder.yudao.module.mes.dal.dataobject.md.item.MesMdItemDO item = itemService.getItemByCode(importItem.getItemCode());
            // é€€è´§æ£€éªŒå•的物料以 MDM ä¸ºå‡†ï¼Œå¯¼å…¥æŒ‰ MDM ç‰©æ–™ç¼–码解析
            MdmItemRespDTO item = mdmItemApi.getItemByCode(importItem.getItemCode()).getCheckedData();
            if (item == null) {
                respVO.getFailureCodes().put(key, "物料不存在:" + importItem.getItemCode());
                return;
yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/service/qc/support/MesQcItemResolver.java
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,92 @@
package cn.iocoder.yudao.module.mes.service.qc.support;
import cn.hutool.core.collection.CollUtil;
import cn.iocoder.yudao.module.mdm.api.item.MdmItemApi;
import cn.iocoder.yudao.module.mdm.api.item.dto.MdmItemRespDTO;
import cn.iocoder.yudao.module.mes.dal.dataobject.md.item.MesMdItemDO;
import cn.iocoder.yudao.module.mes.service.md.item.MesMdItemService;
import jakarta.annotation.Resource;
import org.springframework.stereotype.Service;
import java.util.Collection;
import java.util.Collections;
import java.util.HashMap;
import java.util.HashSet;
import java.util.Map;
import java.util.Set;
import static cn.iocoder.yudao.framework.common.exception.util.ServiceExceptionUtil.exception;
import static cn.iocoder.yudao.module.mes.enums.ErrorCodeConstants.MD_ITEM_NOT_EXISTS;
/**
 * è´¨æ£€å•据物料 ID è§£æžå™¨
 *
 * è´¨æ£€å•据的物料 ID å­˜åœ¨ä¸¤å¥—来源:质检/仓储单据使用 mdm_item.id,PRO å·¥å•/任务使用 mes_md_item.id。
 * ç»Ÿä¸€åœ¨æ­¤è§£æžï¼šå…ˆæŒ‰ mdm_item.id æŸ¥è¯¢ï¼Œæœªå‘½ä¸­çš„再按 mes_md_item.id â†’ mdm_item.id æ˜ å°„查询。
 */
@Service
public class MesQcItemResolver {
    @Resource
    private MesMdItemService mesMdItemService;
    @Resource
    private MdmItemApi mdmItemApi;
    /**
     * æ‰¹é‡æŸ¥è¯¢ç‰©æ–™ä¿¡æ¯ï¼Œè¿”回以调用方传入的物料 ID ä¸º key çš„结果
     */
    public Map<Long, MdmItemRespDTO> getItemMap(Collection<Long> itemIds) {
        if (CollUtil.isEmpty(itemIds)) {
            return Collections.emptyMap();
        }
        Set<Long> ids = new HashSet<>();
        itemIds.forEach(id -> {
            if (id != null) {
                ids.add(id);
            }
        });
        if (ids.isEmpty()) {
            return Collections.emptyMap();
        }
        // 1. å…ˆæŒ‰ mdm_item.id ç›´æŽ¥æŸ¥è¯¢ï¼ˆè´¨æ£€/仓储单据)
        Map<Long, MdmItemRespDTO> result = new HashMap<>(mdmItemApi.getItemMap(ids));
        // 2. æœªå‘½ä¸­çš„再按 mes_md_item.id â†’ mdm_item.id è§£æžï¼ˆPRO å·¥å•/任务)
        Set<Long> missingIds = new HashSet<>(ids);
        missingIds.removeAll(result.keySet());
        if (missingIds.isEmpty()) {
            return result;
        }
        Map<Long, MesMdItemDO> mesItemMap = mesMdItemService.getItemMap(missingIds);
        Map<Long, Long> idToMdmId = new HashMap<>();
        missingIds.forEach(id -> {
            MesMdItemDO mesItem = mesItemMap.get(id);
            if (mesItem != null && mesItem.getMdmItemId() != null) {
                idToMdmId.put(id, mesItem.getMdmItemId());
            }
        });
        if (idToMdmId.isEmpty()) {
            return result;
        }
        Map<Long, MdmItemRespDTO> fallbackMap = mdmItemApi.getItemMap(idToMdmId.values());
        idToMdmId.forEach((id, mdmId) -> {
            MdmItemRespDTO item = fallbackMap.get(mdmId);
            if (item != null) {
                result.put(id, item);
            }
        });
        return result;
    }
    /**
     * æ ¡éªŒç‰©æ–™å­˜åœ¨ï¼ˆå…¼å®¹ä¸¤å¥— ID)
     */
    public void validateItemExists(Long itemId) {
        if (itemId == null) {
            return;
        }
        if (!getItemMap(Collections.singleton(itemId)).containsKey(itemId)) {
            throw exception(MD_ITEM_NOT_EXISTS);
        }
    }
}
yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/service/qc/template/MesQcTemplateItemServiceImpl.java
@@ -116,9 +116,17 @@
    @Override
    public MesQcTemplateItemDO getRequiredTemplateByItemIdAndType(Long itemId, Integer qcType) {
        if (itemId == null) {
            throw exception(QC_NO_TEMPLATE);
        }
        // 1. æŸ¥å‡º itemId å…³è”的所有 templateItem
        MesMdItemDO item1 = mesMdItemService.getItem(itemId);
        List<MesQcTemplateItemDO> templateItems = templateItemMapper.selectListByItemId(item1.getMdmItemId());
        // å…¼å®¹ä¸¤å¥—物料 ID:质检/仓储单据传入 mdm_item.id,PRO å·¥å•/任务传入 mes_md_item.id
        Long templateItemId = itemId;
        MesMdItemDO mesItem = mesMdItemService.getItem(itemId);
        if (mesItem != null && mesItem.getMdmItemId() != null) {
            templateItemId = mesItem.getMdmItemId();
        }
        List<MesQcTemplateItemDO> templateItems = templateItemMapper.selectListByItemId(templateItemId);
        if (CollUtil.isEmpty(templateItems)) {
            throw exception(QC_NO_TEMPLATE);
        }
yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/service/wm/itemreceipt/MesWmItemReceiptLineServiceImpl.java
@@ -48,7 +48,7 @@
    @Override
    public Long createItemReceiptLine(MesWmItemReceiptLineSaveReqVO createReqVO) {
        // 1. æ ¡éªŒçˆ¶å•据存在且为可编辑状态
        MesWmItemReceiptDO receipt = itemReceiptService.validateItemReceiptEditable(createReqVO.getReceiptId());
        MesWmItemReceiptDO receipt = itemReceiptService.validateItemReceiptLineEditable(createReqVO.getReceiptId());
        // 2. æ ¡éªŒæ•°æ®
        validateItemReceiptLineSaveData(receipt, createReqVO);
@@ -70,7 +70,7 @@
        // 1.1 æ ¡éªŒå­˜åœ¨
        MesWmItemReceiptLineDO line = validateItemReceiptLineExists(updateReqVO.getId());
        // 1.2 æ ¡éªŒçˆ¶å•据存在且为可编辑状态
        MesWmItemReceiptDO receipt = itemReceiptService.validateItemReceiptEditable(line.getReceiptId());
        MesWmItemReceiptDO receipt = itemReceiptService.validateItemReceiptLineEditable(line.getReceiptId());
        // 1.3 æ ¡éªŒæ•°æ®
        validateItemReceiptLineSaveData(receipt, updateReqVO);
@@ -96,7 +96,7 @@
        // 1.1 æ ¡éªŒå­˜åœ¨
        MesWmItemReceiptLineDO line = validateItemReceiptLineExists(id);
        // 1.2 æ ¡éªŒçˆ¶å•据存在且为可编辑状态
        itemReceiptService.validateItemReceiptEditable(line.getReceiptId());
        itemReceiptService.validateItemReceiptLineEditable(line.getReceiptId());
        // 2.1 çº§è”删除明细
        itemReceiptDetailService.deleteItemReceiptDetailByLineId(id);
yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/service/wm/itemreceipt/MesWmItemReceiptService.java
@@ -58,20 +58,16 @@
    PageResult<MesWmItemReceiptDO> getItemReceiptPage(MesWmItemReceiptPageReqVO pageReqVO);
    /**
     * æäº¤é‡‡è´­å…¥åº“单审批(草稿 â†’ å¾…上架)
     *
     * å®¡æ ¸äººç”±ã€Œç³»ç»Ÿç®¡ç† - å®¡æ‰¹é…ç½®ã€æŒ‰ä¸šåŠ¡ç±»åž‹ç»Ÿä¸€é…ç½®ï¼ˆä¸šåŠ¡ç¼–ç  item_receipt_approve),
     * æäº¤æ—¶æ— éœ€æŒ‡å®šï¼›æœªå¯ç”¨å®¡æ‰¹æˆ–未配置有效审核人时抛出业务异常。
     * æäº¤é‡‡è´­å…¥åº“单(草稿 â†’ å¾…上架)
     *
     * @param id ç¼–号
     */
    void submitItemReceipt(Long id);
    /**
     * æ‰§è¡Œä¸Šæž¶æ ¡éªŒï¼ˆä»…校验已审批单据的明细数量一致性,不修改单据状态)
     * æ‰§è¡Œä¸Šæž¶ï¼ˆå¾…上架 â†’ å¾…执行入库)
     *
     * å•据状态只能由审核(APPROVING â†’ APPROVED)与入库(APPROVED â†’ FINISHED)推进,
     * æœ¬æ–¹æ³•不得把单据直接置为已审批。
     * æ ¡éªŒæ¯è¡Œä¸Šæž¶æ˜Žç»†æ•°é‡ä¹‹å’Œç­‰äºŽè¡Œå…¥åº“数量后推进单据状态。
     *
     * @param id ç¼–号
     */
@@ -92,12 +88,20 @@
    void cancelItemReceipt(Long id);
    /**
     * æ ¡éªŒé‡‡è´­å…¥åº“单存在且处于可编辑状态(仅草稿)
     * æ ¡éªŒé‡‡è´­å…¥åº“单存在且处于可编辑状态(草稿或待上架)
     *
     * @param id ç¼–号
     * @return é‡‡è´­å…¥åº“单
     */
    MesWmItemReceiptDO validateItemReceiptEditable(Long id);
    /**
     * æ ¡éªŒé‡‡è´­å…¥åº“单存在且行数据可编辑(仅草稿)
     *
     * @param id ç¼–号
     * @return é‡‡è´­å…¥åº“单
     */
    MesWmItemReceiptDO validateItemReceiptLineEditable(Long id);
    /**
     * æŸ¥è¯¢æŒ‡å®šä¾›åº”商的采购入库单数量
@@ -161,17 +165,6 @@
     * @param reviewRemark å®¡æ ¸æ„è§ï¼Œå®¡æ ¸ä¸é€šè¿‡æ—¶å¿…å¡«
     */
    void auditItemReceipt(Long id, Boolean pass, String reviewRemark);
    /**
     * å›žå†™ BPM å®¡æ‰¹ç»“果(供 BPM æµç¨‹çŠ¶æ€ç›‘å¬å™¨è°ƒç”¨ï¼‰
     *
     * ä»…在单据处于审批中时生效:通过=待执行入库 / ä¸é€šè¿‡=草稿 / å–消=已取消。
     *
     * @param id        ç¼–号
     * @param bpmStatus BPM ä»»åŠ¡çŠ¶æ€ï¼Œè§ {@link cn.iocoder.yudao.module.bpm.enums.task.BpmTaskStatusEnum}
     * @param reason    å®¡æ‰¹æ„è§ / å–消原因
     */
    void updateItemReceiptAuditStatus(Long id, Integer bpmStatus, String reason);
    /**
     * å¯¼å…¥é‡‡è´­å…¥åº“单
yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/service/wm/itemreceipt/MesWmItemReceiptServiceImpl.java
@@ -6,9 +6,6 @@
import cn.iocoder.yudao.framework.common.util.collection.CollectionUtils;
import cn.iocoder.yudao.framework.common.util.object.BeanUtils;
import cn.iocoder.yudao.framework.common.util.object.ObjectUtils;
import cn.iocoder.yudao.module.bpm.api.task.BpmProcessInstanceApi;
import cn.iocoder.yudao.module.bpm.api.task.dto.BpmProcessInstanceCreateReqDTO;
import cn.iocoder.yudao.module.bpm.enums.task.BpmTaskStatusEnum;
import cn.iocoder.yudao.module.mes.controller.admin.wm.itemreceipt.vo.MesWmItemReceiptImportExcelVO;
import cn.iocoder.yudao.module.mes.controller.admin.wm.itemreceipt.vo.MesWmItemReceiptImportRespVO;
import cn.iocoder.yudao.module.mes.controller.admin.wm.itemreceipt.vo.MesWmItemReceiptPageReqVO;
@@ -71,16 +68,8 @@
     */
    private static final String ITEM_RECEIPT_APPROVE_BIZ_TYPE = "item_receipt_approve";
    /**
     * é‡‡è´­å…¥åº“单审批的 BPM æµç¨‹å®šä¹‰ Key
     */
    private static final String ITEM_RECEIPT_APPROVE_PROCESS_KEY = "item_receipt_approve";
    @Resource
    private MesWmItemReceiptMapper itemReceiptMapper;
    @Resource
    private BpmProcessInstanceApi bpmProcessInstanceApi;
    @Resource
    private MesWmItemReceiptLineService itemReceiptLineService;
@@ -192,35 +181,8 @@
        // æ ¡éªŒç‰©æ–™æ‰¹æ¬¡ç®¡ç†ï¼šå¦‚果物料开启批次管理,则明细的批次号不能为空
        validateBatchManagement(lines);
        // æ ¡éªŒå®¡æ‰¹é…ç½®å·²å¯ç”¨ä¸”配置了有效审核人(未配置时抛出带明确提示的业务异常)
        approvalConfigApi.validateApprovalEnabledAndGetApprovers(ITEM_RECEIPT_APPROVE_BIZ_TYPE);
        // æäº¤ï¼ˆè‰ç¨¿ â†’ å¾…上架),并清空上一轮审核结果
        itemReceiptMapper.submitAndResetAuditInfo(id, MesWmItemReceiptStatusEnum.APPROVING.getStatus());
        // åˆ›å»º BPM æµç¨‹å®žä¾‹ï¼Œä½¿å®¡æ‰¹å‡ºçŽ°åœ¨ã€ŒååŒåŠžå…¬ - æˆ‘的流程」
        bpmProcessInstanceApi.createProcessInstance(getLoginUserId(),
                new BpmProcessInstanceCreateReqDTO()
                        .setProcessDefinitionKey(ITEM_RECEIPT_APPROVE_PROCESS_KEY)
                        .setBusinessKey(String.valueOf(id)));
    }
    @Override
    @Transactional(rollbackFor = Exception.class)
    public void updateItemReceiptAuditStatus(Long id, Integer bpmStatus, String reason) {
        // BPM å®¡æ‰¹ç»“果映射为单据状态:通过=待执行入库 / ä¸é€šè¿‡=草稿 / å–消=已取消
        Integer status;
        if (BpmTaskStatusEnum.APPROVE.getStatus().equals(bpmStatus)) {
            status = MesWmItemReceiptStatusEnum.APPROVED.getStatus();
        } else if (BpmTaskStatusEnum.REJECT.getStatus().equals(bpmStatus)) {
            status = MesWmItemReceiptStatusEnum.PREPARE.getStatus();
        } else if (BpmTaskStatusEnum.CANCEL.getStatus().equals(bpmStatus)) {
            status = MesWmItemReceiptStatusEnum.CANCELED.getStatus();
        } else {
            return;
        }
        if (itemReceiptMapper.updateAuditStatusByBpm(id, status, reason) != 1) {
            log.warn("[updateItemReceiptAuditStatus] é‡‡è´­å…¥åº“单({}) ä¸å¤„于审批中状态,忽略 BPM ç»“æžœ({})", id, bpmStatus);
        }
    }
    @Override
@@ -300,9 +262,9 @@
    @Override
    @Transactional(rollbackFor = Exception.class)
    public void stockItemReceipt(Long id) {
        // æ ¡éªŒå­˜åœ¨ + å·²å®¡æ‰¹ï¼ˆçŠ¶æ€åªèƒ½ç”± audit æŽ¨è¿›ï¼šAPPROVING â†’ APPROVED)
        // æ ¡éªŒå­˜åœ¨ + å¾…上架
        MesWmItemReceiptDO receipt = validateItemReceiptExists(id);
        if (ObjUtil.notEqual(MesWmItemReceiptStatusEnum.APPROVED.getStatus(), receipt.getStatus())) {
        if (ObjUtil.notEqual(MesWmItemReceiptStatusEnum.APPROVING.getStatus(), receipt.getStatus())) {
            throw exception(WM_ITEM_RECEIPT_STATUS_ERROR);
        }
        // æ ¡éªŒæ¯è¡Œæ˜Žç»†æ•°é‡ä¹‹å’Œæ˜¯å¦ç­‰äºŽè¡Œå…¥åº“数量
@@ -318,8 +280,9 @@
                throw exception(WM_ITEM_RECEIPT_DETAIL_QUANTITY_MISMATCH);
            }
        }
        // æ³¨æ„ï¼šæœ¬æ–¹æ³•仅做数量一致性校验,不得修改单据状态。
        // çŠ¶æ€æµè½¬ç”± audit(APPROVING â†’ APPROVED)与 finish(APPROVED â†’ FINISHED)负责。
        // ä¸Šæž¶å®Œæˆï¼ˆå¾…上架 â†’ å¾…执行入库)
        itemReceiptMapper.updateById(new MesWmItemReceiptDO()
                .setId(id).setStatus(MesWmItemReceiptStatusEnum.APPROVED.getStatus()));
    }
    @Override
@@ -441,7 +404,18 @@
    @Override
    public MesWmItemReceiptDO validateItemReceiptEditable(Long id) {
        // ä»…草稿状态允许编辑行/明细;审批中(APPROVING)已锁定,避免绕过审核修改数据
        // è‰ç¨¿ä¸Žå¾…上架状态允许编辑上架明细:提交后仓库执行上架时录入库位/批次
        MesWmItemReceiptDO receipt = validateItemReceiptExists(id);
        if (ObjUtil.notEqual(MesWmItemReceiptStatusEnum.PREPARE.getStatus(), receipt.getStatus())
                && ObjUtil.notEqual(MesWmItemReceiptStatusEnum.APPROVING.getStatus(), receipt.getStatus())) {
            throw exception(WM_ITEM_RECEIPT_STATUS_NOT_PREPARE);
        }
        return receipt;
    }
    @Override
    public MesWmItemReceiptDO validateItemReceiptLineEditable(Long id) {
        // è¡Œæ•°æ®ä»…草稿可改:提交后行数据锁定,避免上架阶段改动入库数量
        return validateItemReceiptExistsAndDraft(id);
    }
yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/service/wm/itemreceipt/listener/MesWmItemReceiptStatusListener.java
ÎļþÒÑɾ³ý