From 476d70b2f294f36a9dbd8d0c3cf5d1b75ba34c66 Mon Sep 17 00:00:00 2001
From: 云 <2163098428@qq.com>
Date: 星期一, 24 八月 2026 09:12:29 +0800
Subject: [PATCH] feat(mes): 新增包装袋型管理和托盘自动生成功能

---
 yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/service/pro/batch/MesProBatchServiceImpl.java |   29 +++++++++++++++++++++++++++++
 1 files changed, 29 insertions(+), 0 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 de727f9..e50290c 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
@@ -15,6 +15,7 @@
 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;
@@ -67,6 +68,7 @@
     @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());
@@ -80,6 +82,7 @@
                 .setCode(code)
                 .setLineCode(line.getCode())
                 .setLineName(line.getName())
+                .setBagType(createReqVO.getBagType())
                 .setBagQuantity(0)
                 .setPalletQuantity(0)
                 .setStatus(MesProBatchStatusEnum.DRAFT.getStatus());
@@ -96,6 +99,12 @@
         // 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);
 
@@ -157,6 +166,9 @@
         }
         if (!valid) {
             throw exception(PRO_BATCH_STATUS_INVALID);
+        }
+        if (MesProBatchStatusEnum.PRODUCING.getStatus().equals(status)) {
+            validateBagType(batch.getBagType());
         }
         // 3. 鏇存柊鐘舵��
         batchMapper.updateById(new MesProBatchDO().setId(id).setStatus(status));
@@ -246,6 +258,23 @@
     }
 
     /**
+     * 鏍¢獙鍖呰琚嬪瀷鏈夋晥
+     */
+    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);
+    }
+
+    /**
      * 鎻掑叆鎵规鐢熶骇浜哄憳閰嶇疆
      */
     private void insertBatchWorkers(Long batchId, List<MesProBatchSaveReqVO.Worker> workers) {

--
Gitblit v1.9.3