From 8655501ffb8dbdaf2508e575933063e6731be714 Mon Sep 17 00:00:00 2001
From: 云 <2163098428@qq.com>
Date: 星期五, 28 八月 2026 17:14:40 +0800
Subject: [PATCH] refactor(mes): 重构MES生产批次和袋码管理功能

---
 yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/service/pro/batch/MesProBatchServiceImpl.java |   95 ++++++++++++++++++++++++++++++++---------------
 1 files changed, 64 insertions(+), 31 deletions(-)

diff --git a/yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/service/pro/batch/MesProBatchServiceImpl.java b/yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/service/pro/batch/MesProBatchServiceImpl.java
index e50290c..c0efa4f 100644
--- a/yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/service/pro/batch/MesProBatchServiceImpl.java
+++ b/yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/service/pro/batch/MesProBatchServiceImpl.java
@@ -5,6 +5,7 @@
 import cn.iocoder.yudao.framework.common.pojo.PageResult;
 import cn.iocoder.yudao.framework.common.util.object.BeanUtils;
 import cn.iocoder.yudao.module.mes.controller.admin.pro.batch.vo.MesProBatchPageReqVO;
+import cn.iocoder.yudao.module.mes.controller.admin.pro.batch.vo.MesProBatchPreGenerateReqVO;
 import cn.iocoder.yudao.module.mes.controller.admin.pro.batch.vo.MesProBatchSaveReqVO;
 import cn.iocoder.yudao.module.mes.dal.dataobject.mdm.MesMdmItemDO;
 import cn.iocoder.yudao.module.mes.dal.dataobject.pro.batch.MesProBatchDO;
@@ -15,7 +16,6 @@
 import cn.iocoder.yudao.module.mes.dal.mysql.pro.batch.MesProBatchWorkerMapper;
 import cn.iocoder.yudao.module.mes.dal.mysql.pro.pallet.MesProPalletMapper;
 import cn.iocoder.yudao.module.mes.enums.md.autocode.MesMdAutoCodeRuleCodeEnum;
-import cn.iocoder.yudao.module.mes.enums.pro.MesProBagTypeEnum;
 import cn.iocoder.yudao.module.mes.enums.pro.MesProBatchStatusEnum;
 import cn.iocoder.yudao.module.mes.service.md.autocode.MesMdAutoCodeRecordService;
 import cn.iocoder.yudao.module.mes.service.mdm.MesMdmItemService;
@@ -27,6 +27,7 @@
 import org.springframework.transaction.annotation.Transactional;
 import org.springframework.validation.annotation.Validated;
 
+import java.util.ArrayList;
 import java.util.Collection;
 import java.util.HashSet;
 import java.util.List;
@@ -68,7 +69,6 @@
     @Override
     @Transactional(rollbackFor = Exception.class)
     public Long createBatch(MesProBatchSaveReqVO createReqVO) {
-        validateBagType(createReqVO.getBagType());
         // 1. 鏍¢獙鍏宠仈鏁版嵁锛堝搧绉嶃�佷骇绾裤�佺敓浜т汉鍛橈級
         MesMdmItemDO item = mdmItemService.validateItemExists(createReqVO.getItemId());
         MesProLineDO line = lineService.validateLineExistsAndEnable(createReqVO.getLineId());
@@ -82,7 +82,6 @@
                 .setCode(code)
                 .setLineCode(line.getCode())
                 .setLineName(line.getName())
-                .setBagType(createReqVO.getBagType())
                 .setBagQuantity(0)
                 .setPalletQuantity(0)
                 .setStatus(MesProBatchStatusEnum.DRAFT.getStatus());
@@ -95,28 +94,72 @@
 
     @Override
     @Transactional(rollbackFor = Exception.class)
+    public List<MesProBatchDO> preGenerateBatch(MesProBatchPreGenerateReqVO reqVO) {
+        // 1. 鐢熸垚涓存椂鎵规鐮侊紙鍏ㄥ眬 8 浣嶅簭鍙凤紝鏍煎紡 PB-00000001锛�
+        int startSeq = batchMapper.selectMaxTempCodeSeq() + 1;
+        List<MesProBatchDO> list = new ArrayList<>(reqVO.getCount());
+        for (int i = 0; i < reqVO.getCount(); i++) {
+            list.add(new MesProBatchDO()
+                    .setTempCode("PB-" + StrUtil.padPre(String.valueOf(startSeq + i), 8, '0'))
+                    .setBagQuantity(0)
+                    .setPalletQuantity(0)
+                    .setStatus(MesProBatchStatusEnum.DRAFT.getStatus())
+                    .setRemark(reqVO.getRemark()));
+        }
+        // 2. 鎵归噺鎻掑叆锛堣崏绋跨姸鎬侊紝绛夊緟琛ュ綍涓氬姟淇℃伅锛�
+        for (MesProBatchDO batch : list) {
+            batchMapper.insert(batch);
+        }
+        return list;
+    }
+
+    @Override
+    @Transactional(rollbackFor = Exception.class)
+    public void fillBatchInfo(MesProBatchSaveReqVO fillReqVO) {
+        // 1. 閿佸畾鎵规锛屼粎鍏佽灏氭湭琛ュ綍姝e紡淇℃伅鐨勪复鏃舵壒娆�
+        MesProBatchDO batch = batchMapper.selectByIdForUpdate(fillReqVO.getId());
+        if (batch == null) {
+            throw exception(PRO_BATCH_NOT_EXISTS);
+        }
+        if (StrUtil.isNotEmpty(batch.getCode())) {
+            throw exception(PRO_BATCH_ALREADY_FILLED);
+        }
+        // 2. 鏍¢獙鍏宠仈鏁版嵁骞剁敓鎴愭寮忔壒娆″彿
+        MesMdmItemDO item = mdmItemService.validateItemExists(fillReqVO.getItemId());
+        MesProLineDO line = lineService.validateLineExistsAndEnable(fillReqVO.getLineId());
+        validateRelations(fillReqVO);
+        String code = generateBatchCode(line.getCode(), item.getCode());
+        // 3. 钀藉簱涓氬姟淇℃伅锛堜繚鐣欎复鏃舵壒娆$爜鐢ㄤ簬鍘嗗彶鎵爜杩芥函锛涗骇绾跨紪鐮�/鍚嶇О鍐椾綑鍥炲~锛�
+        MesProBatchDO updateObj = BeanUtils.toBean(fillReqVO, MesProBatchDO.class)
+                .setCode(code)
+                .setLineCode(line.getCode())
+                .setLineName(line.getName())
+                .setStatus(MesProBatchStatusEnum.DRAFT.getStatus());
+        batchMapper.updateById(updateObj);
+        // 4. 閲嶅缓鐢熶骇浜哄憳閰嶇疆
+        batchWorkerMapper.deleteByBatchId(fillReqVO.getId());
+        insertBatchWorkers(fillReqVO.getId(), fillReqVO.getWorkers());
+    }
+
+    @Override
+    @Transactional(rollbackFor = Exception.class)
     public void updateBatch(MesProBatchSaveReqVO updateReqVO) {
         // 1. 鏍¢獙瀛樺湪 + 鐘舵�侊紙鑽夌/鐢熶骇涓墠鍏佽淇敼锛�
         MesProBatchDO oldBatch = validateBatchExists(updateReqVO.getId());
         validateBatchEditable(oldBatch);
-        // 2. 宸茬敓鎴愯鐮佹垨鎵樼洏鐮佸悗涓嶅厑璁镐慨鏀硅鍨嬶紙閬垮厤鍚屼竴鎵规闃堝�煎彉鍖栧鑷村綊闆嗛敊涔憋級
-        if (updateReqVO.getBagType() != null && !Objects.equals(oldBatch.getBagType(), updateReqVO.getBagType())
-                && (bagQuantityOrPalletCreated(oldBatch))) {
-            throw exception(PRO_BATCH_BAG_TYPE_NOT_ALLOW_CHANGE);
-        }
-        validateBagType(updateReqVO.getBagType());
         // 2. 鏍¢獙鍏宠仈鏁版嵁锛堢敓浜т汉鍛橈級
         validateRelations(updateReqVO);
 
-        // 3. 鍝佺/浜х嚎鍙樺寲鏃堕噸鏂扮敓鎴愭壒娆″彿锛堟壒娆″彿鍖呭惈浜х嚎缂栫爜 + 鍝佺缂栫爜瑕佺礌锛�
+        // 3. 鏈敓鎴愭寮忔壒娆″彿鎴栧搧绉�/浜х嚎鍙樺寲鏃堕噸鏂扮敓鎴愭壒娆″彿锛堟壒娆″彿鍖呭惈浜х嚎缂栫爜 + 鍝佺缂栫爜瑕佺礌锛�
+        boolean codeEmpty = StrUtil.isEmpty(oldBatch.getCode());
         boolean itemChanged = !Objects.equals(oldBatch.getItemId(), updateReqVO.getItemId());
         boolean lineChanged = !Objects.equals(oldBatch.getLineId(), updateReqVO.getLineId());
         String code = oldBatch.getCode();
         MesProBatchDO updateObj = BeanUtils.toBean(updateReqVO, MesProBatchDO.class);
-        if (itemChanged || lineChanged) {
+        if (codeEmpty || itemChanged || lineChanged) {
             MesMdmItemDO item = mdmItemService.validateItemExists(updateReqVO.getItemId());
             // 鍙樻洿浜х嚎鏃讹紝鐩爣浜х嚎蹇呴』鍚敤锛涙湭鍙樻洿鍒欎粎鏍¢獙瀛樺湪锛堥伩鍏嶅仠鐢ㄤ骇绾跨殑鍘嗗彶鎵规鏃犳硶缂栬緫鍏朵粬瀛楁锛�
-            MesProLineDO line = lineChanged
+            MesProLineDO line = (lineChanged || codeEmpty)
                     ? lineService.validateLineExistsAndEnable(updateReqVO.getLineId())
                     : lineService.validateLineExists(updateReqVO.getLineId());
             code = generateBatchCode(line.getCode(), item.getCode());
@@ -168,7 +211,10 @@
             throw exception(PRO_BATCH_STATUS_INVALID);
         }
         if (MesProBatchStatusEnum.PRODUCING.getStatus().equals(status)) {
-            validateBagType(batch.getBagType());
+            // 鏈ˉ褰曚笟鍔′俊鎭殑涓存椂鎵规涓嶅厑璁歌繘鍏ョ敓浜�
+            if (StrUtil.isEmpty(batch.getCode())) {
+                throw exception(PRO_BATCH_NOT_FILLED);
+            }
         }
         // 3. 鏇存柊鐘舵��
         batchMapper.updateById(new MesProBatchDO().setId(id).setStatus(status));
@@ -181,7 +227,11 @@
 
     @Override
     public MesProBatchDO getBatchByCode(String code) {
-        return batchMapper.selectByCode(code);
+        MesProBatchDO batch = batchMapper.selectByCode(code);
+        if (batch == null) {
+            batch = batchMapper.selectByTempCode(code);
+        }
+        return batch;
     }
 
     @Override
@@ -255,23 +305,6 @@
                 && !MesProBatchStatusEnum.PRODUCING.getStatus().equals(batch.getStatus())) {
             throw exception(PRO_BATCH_STATUS_NOT_DRAFT_OR_PRODUCING);
         }
-    }
-
-    /**
-     * 鏍¢獙鍖呰琚嬪瀷鏈夋晥
-     */
-    private void validateBagType(Integer bagType) {
-        if (bagType != null && MesProBagTypeEnum.valueOfType(bagType) == null) {
-            throw exception(PRO_BATCH_BAG_TYPE_INVALID);
-        }
-    }
-
-    /**
-     * 鍒ゆ柇鎵规鏄惁宸茬敓鎴愯鐮佹垨鎵樼洏鐮侊紙鐢ㄤ簬绂佹淇敼琚嬪瀷锛�
-     */
-    private boolean bagQuantityOrPalletCreated(MesProBatchDO batch) {
-        return (batch.getBagQuantity() != null && batch.getBagQuantity() > 0)
-                || (batch.getPalletQuantity() != null && batch.getPalletQuantity() > 0);
     }
 
     /**

--
Gitblit v1.9.3