From 0f792c9b3b88dc4b1b7b306f89e257d931d2d0bd Mon Sep 17 00:00:00 2001
From: liyong <18434998025@163.com>
Date: 星期六, 18 七月 2026 15:38:57 +0800
Subject: [PATCH] 代码提交

---
 yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/service/wm/batch/MesWmBatchServiceImpl.java |  325 ++++++++++++++++++++++++++++++++++++-----------------
 1 files changed, 218 insertions(+), 107 deletions(-)

diff --git a/yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/service/wm/batch/MesWmBatchServiceImpl.java b/yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/service/wm/batch/MesWmBatchServiceImpl.java
index 35d0a18..151f178 100644
--- a/yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/service/wm/batch/MesWmBatchServiceImpl.java
+++ b/yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/service/wm/batch/MesWmBatchServiceImpl.java
@@ -2,19 +2,20 @@
 
 import cn.hutool.core.collection.CollUtil;
 import cn.hutool.core.util.ObjUtil;
+import cn.hutool.core.util.StrUtil;
 import cn.iocoder.yudao.framework.common.pojo.PageResult;
 import cn.iocoder.yudao.module.mes.controller.admin.wm.batch.vo.MesWmBatchGenerateReqVO;
 import cn.iocoder.yudao.module.mes.controller.admin.wm.batch.vo.MesWmBatchPageReqVO;
-import cn.iocoder.yudao.module.mes.dal.dataobject.md.item.MesMdItemBatchConfigDO;
-import cn.iocoder.yudao.module.mes.dal.dataobject.md.item.MesMdItemDO;
+import cn.iocoder.yudao.module.mes.dal.dataobject.mdm.MesMdmItemDO;
 import cn.iocoder.yudao.module.mes.dal.dataobject.wm.batch.MesWmBatchDO;
 import cn.iocoder.yudao.module.mes.dal.mysql.wm.batch.MesWmBatchMapper;
 import cn.iocoder.yudao.module.mes.enums.MesBizTypeConstants;
 import cn.iocoder.yudao.module.mes.enums.md.autocode.MesMdAutoCodeRuleCodeEnum;
 import cn.iocoder.yudao.module.mes.service.md.autocode.MesMdAutoCodeRecordService;
-import cn.iocoder.yudao.module.mes.service.md.item.MesMdItemBatchConfigService;
-import cn.iocoder.yudao.module.mes.service.md.item.MesMdItemService;
+import cn.iocoder.yudao.module.mes.service.mdm.MesMdmItemService;
 import cn.iocoder.yudao.module.mes.service.wm.barcode.MesWmBarcodeService;
+import cn.iocoder.yudao.module.mdm.api.item.MdmItemBatchConfigApi;
+import cn.iocoder.yudao.module.mdm.api.item.dto.MdmItemBatchConfigRespDTO;
 import jakarta.annotation.Resource;
 import lombok.extern.slf4j.Slf4j;
 import org.springframework.stereotype.Service;
@@ -48,9 +49,9 @@
     private MesWmBatchMapper batchMapper;
 
     @Resource
-    private MesMdItemService itemService;
+    private MesMdmItemService mdmItemService;
     @Resource
-    private MesMdItemBatchConfigService itemBatchConfigService;
+    private MdmItemBatchConfigApi itemBatchConfigApi;
     @Resource
     private MesMdAutoCodeRecordService autoCodeRecordService;
     @Resource
@@ -75,124 +76,165 @@
     @Transactional(rollbackFor = Exception.class)
     public MesWmBatchDO getOrGenerateBatchCode(MesWmBatchGenerateReqVO reqVO) {
         // 1.1 鏌ヨ鐗╂枡淇℃伅锛屾鏌ユ槸鍚﹀惎鐢ㄦ壒娆$鐞�
-        MesMdItemDO item = itemService.validateItemExists(reqVO.getItemId());
-        if (Boolean.FALSE.equals(item.getBatchFlag())) {
+        MesMdmItemDO item = mdmItemService.validateItemExists(reqVO.getItemId());
+        if (Boolean.FALSE.equals(item.getIsBatchManaged())) {
             // 鏈惎鐢ㄦ壒娆$鐞嗭紝杩斿洖 null
             return null;
         }
-        // 1.2 鏌ヨ鐗╂枡鎵规閰嶇疆
-        MesMdItemBatchConfigDO config = itemBatchConfigService.validateItemBatchConfigExists(reqVO.getItemId());
+
+        // 璋冭瘯鏃ュ織锛氭墦鍗版帴鏀跺埌鐨勬棩鏈�
+        log.info("[getOrGenerateBatchCode] 鏀跺埌璇锋眰, itemId={}, batchCode={}, produceDate={}",
+                reqVO.getItemId(), reqVO.getBatchCode(), reqVO.getProduceDate());
+
+        // 1.2 鏌ヨ鐗╂枡鎵规閰嶇疆锛堜粠 MDM 鑾峰彇锛屼笉瀛樺湪鍒欎娇鐢ㄩ粯璁ら厤缃級
+        MdmItemBatchConfigRespDTO config = itemBatchConfigApi.getItemBatchConfig(reqVO.getItemId());
 
         // 2. 鏍规嵁閰嶇疆鏍¢獙蹇呭~鍙傛暟骞舵竻绌轰笉闇�瑕佺殑鍙傛暟
         MesWmBatchDO batch = MesWmBatchDO.builder().itemId(reqVO.getItemId()).build();
-        // 鐢熶骇鏃ユ湡
-        if (Boolean.TRUE.equals(config.getProduceDateFlag())) {
-            if (ObjUtil.isNull(reqVO.getProduceDate())) {
-                throw exception(WM_BATCH_PRODUCE_DATE_REQUIRED);
+        if (config != null) {
+            // 鐢熶骇鏃ユ湡
+            if (Boolean.TRUE.equals(config.getProduceDateFlag())) {
+                if (ObjUtil.isNull(reqVO.getProduceDate())) {
+                    throw exception(WM_BATCH_PRODUCE_DATE_REQUIRED);
+                }
+                batch.setProduceDate(reqVO.getProduceDate());
             }
-            batch.setProduceDate(reqVO.getProduceDate());
+            // 鍏ュ簱鏃ユ湡
+            if (Boolean.TRUE.equals(config.getReceiptDateFlag())) {
+                if (ObjUtil.isNull(reqVO.getReceiptDate())) {
+                    throw exception(WM_BATCH_RECEIPT_DATE_REQUIRED);
+                }
+                batch.setReceiptDate(reqVO.getReceiptDate());
+            }
+            // 鏈夋晥鏈�
+            if (Boolean.TRUE.equals(config.getExpireDateFlag())) {
+                if (ObjUtil.isNull(reqVO.getExpireDate())) {
+                    throw exception(WM_BATCH_EXPIRE_DATE_REQUIRED);
+                }
+                batch.setExpireDate(reqVO.getExpireDate());
+            }
+            // 渚涘簲鍟�
+            if (Boolean.TRUE.equals(config.getVendorFlag())) {
+                if (ObjUtil.isNull(reqVO.getVendorId())) {
+                    throw exception(WM_BATCH_VENDOR_REQUIRED);
+                }
+                batch.setVendorId(reqVO.getVendorId());
+            }
+            // 瀹㈡埛
+            if (Boolean.TRUE.equals(config.getClientFlag())) {
+                if (ObjUtil.isNull(reqVO.getClientId())) {
+                    throw exception(WM_BATCH_CLIENT_REQUIRED);
+                }
+                batch.setClientId(reqVO.getClientId());
+            }
+            // 閲囪喘璁㈠崟缂栧彿
+            if (Boolean.TRUE.equals(config.getPurchaseOrderCodeFlag())) {
+                if (ObjUtil.isNull(reqVO.getPurchaseOrderCode())) {
+                    throw exception(WM_BATCH_PURCHASE_ORDER_CODE_REQUIRED);
+                }
+                batch.setPurchaseOrderCode(reqVO.getPurchaseOrderCode());
+            }
+            // 閿�鍞鍗曠紪鍙�
+            if (Boolean.TRUE.equals(config.getSalesOrderCodeFlag())) {
+                if (ObjUtil.isNull(reqVO.getSalesOrderCode())) {
+                    throw exception(WM_BATCH_CUSTOMER_ORDER_CODE_REQUIRED);
+                }
+                batch.setSalesOrderCode(reqVO.getSalesOrderCode());
+            }
+            // 鐢熶骇宸ュ崟
+            if (Boolean.TRUE.equals(config.getWorkOrderFlag())) {
+                if (ObjUtil.isNull(reqVO.getWorkOrderId())) {
+                    throw exception(WM_BATCH_WORK_ORDER_REQUIRED);
+                }
+                batch.setWorkOrderId(reqVO.getWorkOrderId());
+            }
+            // 鐢熶骇浠诲姟
+            if (Boolean.TRUE.equals(config.getTaskFlag())) {
+                if (ObjUtil.isNull(reqVO.getTaskId())) {
+                    throw exception(WM_BATCH_TASK_REQUIRED);
+                }
+                batch.setTaskId(reqVO.getTaskId());
+            }
+            // 宸ヤ綔绔�
+            if (Boolean.TRUE.equals(config.getWorkstationFlag())) {
+                if (ObjUtil.isNull(reqVO.getWorkstationId())) {
+                    throw exception(WM_BATCH_WORKSTATION_REQUIRED);
+                }
+                batch.setWorkstationId(reqVO.getWorkstationId());
+            }
+            // 宸ュ叿
+            if (Boolean.TRUE.equals(config.getToolFlag())) {
+                if (ObjUtil.isNull(reqVO.getToolId())) {
+                    throw exception(WM_BATCH_TOOL_REQUIRED);
+                }
+                batch.setToolId(reqVO.getToolId());
+            }
+            // 妯″叿
+            if (Boolean.TRUE.equals(config.getMoldFlag())) {
+                if (ObjUtil.isNull(reqVO.getMoldId())) {
+                    throw exception(WM_BATCH_MOLD_REQUIRED);
+                }
+                batch.setMoldId(reqVO.getMoldId());
+            }
+            // 鐢熶骇鎵瑰彿
+            if (Boolean.TRUE.equals(config.getLotNumberFlag())) {
+                if (ObjUtil.isNull(reqVO.getLotNumber())) {
+                    throw exception(WM_BATCH_LOT_NUMBER_REQUIRED);
+                }
+                batch.setLotNumber(reqVO.getLotNumber());
+            }
+            // 璐ㄩ噺鐘舵��
+            if (Boolean.TRUE.equals(config.getQualityStatusFlag())) {
+                if (ObjUtil.isNull(reqVO.getQualityStatus())) {
+                    throw exception(WM_BATCH_QUALITY_STATUS_REQUIRED);
+                }
+                batch.setQualityStatus(reqVO.getQualityStatus());
+            }
         }
-        // 鍏ュ簱鏃ユ湡
-        if (Boolean.TRUE.equals(config.getReceiptDateFlag())) {
-            if (ObjUtil.isNull(reqVO.getReceiptDate())) {
-                throw exception(WM_BATCH_RECEIPT_DATE_REQUIRED);
+        // 鏃犳壒娆¢厤缃椂锛屼娇鐢ㄤ紶鍏ョ殑鍙傛暟锛堝鏉炬ā寮忥紝閫傜敤浜庤嚜瀹氫箟鍏ュ簱绛夊満鏅級
+        else {
+            if (reqVO.getProduceDate() != null) {
+                batch.setProduceDate(reqVO.getProduceDate());
             }
-            batch.setReceiptDate(reqVO.getReceiptDate());
-        }
-        // 鏈夋晥鏈�
-        if (Boolean.TRUE.equals(config.getExpireDateFlag())) {
-            if (ObjUtil.isNull(reqVO.getExpireDate())) {
-                throw exception(WM_BATCH_EXPIRE_DATE_REQUIRED);
+            if (reqVO.getReceiptDate() != null) {
+                batch.setReceiptDate(reqVO.getReceiptDate());
             }
-            batch.setExpireDate(reqVO.getExpireDate());
-        }
-        // 渚涘簲鍟�
-        if (Boolean.TRUE.equals(config.getVendorFlag())) {
-            if (ObjUtil.isNull(reqVO.getVendorId())) {
-                throw exception(WM_BATCH_VENDOR_REQUIRED);
+            if (reqVO.getExpireDate() != null) {
+                batch.setExpireDate(reqVO.getExpireDate());
             }
-            batch.setVendorId(reqVO.getVendorId());
-        }
-        // 瀹㈡埛
-        if (Boolean.TRUE.equals(config.getClientFlag())) {
-            if (ObjUtil.isNull(reqVO.getClientId())) {
-                throw exception(WM_BATCH_CLIENT_REQUIRED);
+            if (reqVO.getVendorId() != null) {
+                batch.setVendorId(reqVO.getVendorId());
             }
-            batch.setClientId(reqVO.getClientId());
-        }
-        // 閲囪喘璁㈠崟缂栧彿
-        if (Boolean.TRUE.equals(config.getPurchaseOrderCodeFlag())) {
-            if (ObjUtil.isNull(reqVO.getPurchaseOrderCode())) {
-                throw exception(WM_BATCH_PURCHASE_ORDER_CODE_REQUIRED);
+            if (reqVO.getClientId() != null) {
+                batch.setClientId(reqVO.getClientId());
             }
-            batch.setPurchaseOrderCode(reqVO.getPurchaseOrderCode());
-        }
-        // 閿�鍞鍗曠紪鍙�
-        if (Boolean.TRUE.equals(config.getSalesOrderCodeFlag())) {
-            if (ObjUtil.isNull(reqVO.getSalesOrderCode())) {
-                throw exception(WM_BATCH_CUSTOMER_ORDER_CODE_REQUIRED);
-            }
-            batch.setSalesOrderCode(reqVO.getSalesOrderCode());
-        }
-        // 鐢熶骇宸ュ崟
-        if (Boolean.TRUE.equals(config.getWorkOrderFlag())) {
-            if (ObjUtil.isNull(reqVO.getWorkOrderId())) {
-                throw exception(WM_BATCH_WORK_ORDER_REQUIRED);
-            }
-            batch.setWorkOrderId(reqVO.getWorkOrderId());
-        }
-        // 鐢熶骇浠诲姟
-        if (Boolean.TRUE.equals(config.getTaskFlag())) {
-            if (ObjUtil.isNull(reqVO.getTaskId())) {
-                throw exception(WM_BATCH_TASK_REQUIRED);
-            }
-            batch.setTaskId(reqVO.getTaskId());
-        }
-        // 宸ヤ綔绔�
-        if (Boolean.TRUE.equals(config.getWorkstationFlag())) {
-            if (ObjUtil.isNull(reqVO.getWorkstationId())) {
-                throw exception(WM_BATCH_WORKSTATION_REQUIRED);
-            }
-            batch.setWorkstationId(reqVO.getWorkstationId());
-        }
-        // 宸ュ叿
-        if (Boolean.TRUE.equals(config.getToolFlag())) {
-            if (ObjUtil.isNull(reqVO.getToolId())) {
-                throw exception(WM_BATCH_TOOL_REQUIRED);
-            }
-            batch.setToolId(reqVO.getToolId());
-        }
-        // 妯″叿
-        if (Boolean.TRUE.equals(config.getMoldFlag())) {
-            if (ObjUtil.isNull(reqVO.getMoldId())) {
-                throw exception(WM_BATCH_MOLD_REQUIRED);
-            }
-            batch.setMoldId(reqVO.getMoldId());
-        }
-        // 鐢熶骇鎵瑰彿
-        if (Boolean.TRUE.equals(config.getLotNumberFlag())) {
-            if (ObjUtil.isNull(reqVO.getLotNumber())) {
-                throw exception(WM_BATCH_LOT_NUMBER_REQUIRED);
-            }
-            batch.setLotNumber(reqVO.getLotNumber());
-        }
-        // 璐ㄩ噺鐘舵��
-        if (Boolean.TRUE.equals(config.getQualityStatusFlag())) {
-            if (ObjUtil.isNull(reqVO.getQualityStatus())) {
-                throw exception(WM_BATCH_QUALITY_STATUS_REQUIRED);
-            }
-            batch.setQualityStatus(reqVO.getQualityStatus());
         }
 
-        // 3.1 鎯呭喌涓�锛氭煡璇㈡槸鍚﹀瓨鍦ㄥ尮閰嶇殑鎵规
-        MesWmBatchDO existingBatch = batchMapper.selectFirst(batch);
-        if (existingBatch != null) {
-            return existingBatch;
+        // 3.1 鎯呭喌涓�锛氫紶鍏ヤ簡 batchCode锛屾煡璇㈡槸鍚﹀瓨鍦ㄨ鎵规鍙�
+        if (StrUtil.isNotBlank(reqVO.getBatchCode())) {
+            MesWmBatchDO existingBatch = batchMapper.selectByCode(reqVO.getBatchCode());
+            if (existingBatch != null) {
+                // 鏍¢獙鐗╂枡鏄惁鍖归厤
+                if (!existingBatch.getItemId().equals(reqVO.getItemId())) {
+                    throw exception(WM_BATCH_ITEM_MISMATCH);
+                }
+                // 鏇存柊鎵规灞炴�э紙浠呮洿鏂颁紶鍏ョ殑闈炵┖鍊硷級
+                updateBatchProperties(existingBatch, batch);
+                return existingBatch;
+            }
+            // 涓嶅瓨鍦ㄥ垯浣跨敤浼犲叆鐨� batchCode 鍒涘缓鏂版壒娆�
+            batch.setCode(reqVO.getBatchCode());
+        } else {
+            // 3.2 鎯呭喌浜岋細鏌ヨ鏄惁瀛樺湪鍖归厤鐨勬壒娆★紙鏍规嵁灞炴�у尮閰嶏級
+            MesWmBatchDO existingBatch = batchMapper.selectFirst(batch);
+            if (existingBatch != null) {
+                return existingBatch;
+            }
+            // 3.3 鎯呭喌涓夛細鑷姩鐢熸垚鏂版壒娆″彿
+            String batchCode = autoCodeRecordService.generateAutoCode(MesMdAutoCodeRuleCodeEnum.WM_BATCH_CODE.getCode());
+            batch.setCode(batchCode);
         }
 
-        // 3.2 鎯呭喌浜岋細鐢熸垚鏂版壒娆�
-        String batchCode = autoCodeRecordService.generateAutoCode(MesMdAutoCodeRuleCodeEnum.WM_BATCH_CODE.getCode());
-        batch.setCode(batchCode);
         batchMapper.insert(batch);
 
         // 4. 鐢熸垚鏉$爜
@@ -200,6 +242,75 @@
         return batch;
     }
 
+    /**
+     * 鏇存柊宸叉湁鎵规鐨勫睘鎬э紙浠呮洿鏂颁紶鍏ョ殑闈炵┖鍊硷級
+     *
+     * @param existingBatch 宸叉湁鎵规
+     * @param newBatch 鏂版壒娆″睘鎬�
+     */
+    private void updateBatchProperties(MesWmBatchDO existingBatch, MesWmBatchDO newBatch) {
+        boolean needUpdate = false;
+        if (newBatch.getProduceDate() != null && !newBatch.getProduceDate().equals(existingBatch.getProduceDate())) {
+            existingBatch.setProduceDate(newBatch.getProduceDate());
+            needUpdate = true;
+        }
+        if (newBatch.getExpireDate() != null && !newBatch.getExpireDate().equals(existingBatch.getExpireDate())) {
+            existingBatch.setExpireDate(newBatch.getExpireDate());
+            needUpdate = true;
+        }
+        if (newBatch.getReceiptDate() != null && !newBatch.getReceiptDate().equals(existingBatch.getReceiptDate())) {
+            existingBatch.setReceiptDate(newBatch.getReceiptDate());
+            needUpdate = true;
+        }
+        if (newBatch.getVendorId() != null && !newBatch.getVendorId().equals(existingBatch.getVendorId())) {
+            existingBatch.setVendorId(newBatch.getVendorId());
+            needUpdate = true;
+        }
+        if (newBatch.getClientId() != null && !newBatch.getClientId().equals(existingBatch.getClientId())) {
+            existingBatch.setClientId(newBatch.getClientId());
+            needUpdate = true;
+        }
+        if (newBatch.getSalesOrderCode() != null && !newBatch.getSalesOrderCode().equals(existingBatch.getSalesOrderCode())) {
+            existingBatch.setSalesOrderCode(newBatch.getSalesOrderCode());
+            needUpdate = true;
+        }
+        if (newBatch.getPurchaseOrderCode() != null && !newBatch.getPurchaseOrderCode().equals(existingBatch.getPurchaseOrderCode())) {
+            existingBatch.setPurchaseOrderCode(newBatch.getPurchaseOrderCode());
+            needUpdate = true;
+        }
+        if (newBatch.getWorkOrderId() != null && !newBatch.getWorkOrderId().equals(existingBatch.getWorkOrderId())) {
+            existingBatch.setWorkOrderId(newBatch.getWorkOrderId());
+            needUpdate = true;
+        }
+        if (newBatch.getTaskId() != null && !newBatch.getTaskId().equals(existingBatch.getTaskId())) {
+            existingBatch.setTaskId(newBatch.getTaskId());
+            needUpdate = true;
+        }
+        if (newBatch.getWorkstationId() != null && !newBatch.getWorkstationId().equals(existingBatch.getWorkstationId())) {
+            existingBatch.setWorkstationId(newBatch.getWorkstationId());
+            needUpdate = true;
+        }
+        if (newBatch.getToolId() != null && !newBatch.getToolId().equals(existingBatch.getToolId())) {
+            existingBatch.setToolId(newBatch.getToolId());
+            needUpdate = true;
+        }
+        if (newBatch.getMoldId() != null && !newBatch.getMoldId().equals(existingBatch.getMoldId())) {
+            existingBatch.setMoldId(newBatch.getMoldId());
+            needUpdate = true;
+        }
+        if (newBatch.getLotNumber() != null && !newBatch.getLotNumber().equals(existingBatch.getLotNumber())) {
+            existingBatch.setLotNumber(newBatch.getLotNumber());
+            needUpdate = true;
+        }
+        if (newBatch.getQualityStatus() != null && !newBatch.getQualityStatus().equals(existingBatch.getQualityStatus())) {
+            existingBatch.setQualityStatus(newBatch.getQualityStatus());
+            needUpdate = true;
+        }
+        if (needUpdate) {
+            batchMapper.updateById(existingBatch);
+        }
+    }
+
     @Override
     public List<MesWmBatchDO> getForwardBatchList(String code) {
         return getForwardBatchList(code, new HashSet<>(), 0);

--
Gitblit v1.9.3