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/bagcode/MesProBagCodeServiceImpl.java |   64 +++++++++++++++++++++-----------
 1 files changed, 42 insertions(+), 22 deletions(-)

diff --git a/yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/service/pro/bagcode/MesProBagCodeServiceImpl.java b/yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/service/pro/bagcode/MesProBagCodeServiceImpl.java
index 8966276..1611599 100644
--- a/yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/service/pro/bagcode/MesProBagCodeServiceImpl.java
+++ b/yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/service/pro/bagcode/MesProBagCodeServiceImpl.java
@@ -4,6 +4,7 @@
 import cn.hutool.core.util.IdUtil;
 import cn.hutool.core.util.StrUtil;
 import cn.iocoder.yudao.framework.common.pojo.PageResult;
+import cn.iocoder.yudao.module.mes.controller.admin.pro.bagcode.vo.MesProBagCodeBindBatchReqVO;
 import cn.iocoder.yudao.module.mes.controller.admin.pro.bagcode.vo.MesProBagCodeBindReqVO;
 import cn.iocoder.yudao.module.mes.controller.admin.pro.bagcode.vo.MesProBagCodeGenerateReqVO;
 import cn.iocoder.yudao.module.mes.controller.admin.pro.bagcode.vo.MesProBagCodeGenerateRespVO;
@@ -64,44 +65,53 @@
     @Override
     @Transactional(rollbackFor = Exception.class)
     public MesProBagCodeGenerateRespVO generateBagCodes(MesProBagCodeGenerateReqVO generateReqVO) {
-        // 1. 鏍¢獙鎵规瀛樺湪涓斿浜庣敓浜т腑鐘舵��
-        MesProBatchDO batch = batchMapper.selectByIdForUpdate(generateReqVO.getBatchId());
-        if (batch == null) {
-            throw exception(PRO_BATCH_NOT_EXISTS);
-        }
-        if (!MesProBatchStatusEnum.PRODUCING.getStatus().equals(batch.getStatus())) {
-            throw exception(PRO_BATCH_STATUS_NOT_GENERATE_CODE);
-        }
         if (generateReqVO.getCount() == null || generateReqVO.getCount() <= 0) {
             throw exception(PRO_BAG_CODE_GENERATE_COUNT_INVALID);
         }
 
-        // 2. 璁$畻璧峰搴忓彿锛堝寘鍚凡閫昏緫鍒犻櫎璁板綍锛屼繚璇佸簭鍙蜂笉鍥為��銆佺爜鍊煎敮涓�锛�
-        int startNo = bagCodeMapper.selectMaxBagNo(batch.getId()) + 1;
-
-        // 3. 鎵归噺鐢熸垚琚嬬爜锛氭壒娆″彿 + - + 4 浣嶈搴忓彿锛屽悓涓�娆$敓鎴愬叡浜悓涓� UUID锛堟暟鎹寘锛�
+        // 鐢熸垚闃舵鍙垱寤哄叏灞�鍞竴琚嬬爜锛岀敓浜ф壒娆″湪鍚庣画褰曞叆
+        int startNo = bagCodeMapper.selectMaxBagNo() + 1;
         String uuid = IdUtil.fastSimpleUUID();
         List<MesProBagCodeDO> bagCodes = new ArrayList<>(generateReqVO.getCount());
         for (int i = 0; i < generateReqVO.getCount(); i++) {
             int bagNo = startNo + i;
             bagCodes.add(new MesProBagCodeDO()
                     .setUuid(uuid)
-                    .setCode(batch.getCode() + "-" + StrUtil.padPre(String.valueOf(bagNo), 4, '0'))
+                    .setCode("BAG-" + StrUtil.padPre(String.valueOf(bagNo), 8, '0'))
                     .setBagNo(bagNo)
-                    .setBatchId(batch.getId())
-                    .setBatchCode(batch.getCode())
                     .setStatus(MesProBagCodeStatusEnum.GENERATED.getStatus())
                     .setRemark(generateReqVO.getRemark()));
         }
         bagCodeMapper.insertBatch(bagCodes);
+        return new MesProBagCodeGenerateRespVO().setUuid(uuid);
+    }
 
-        // 4. 鍥炲啓鎵规琚嬬爜鏁伴噺
+    @Override
+    @Transactional(rollbackFor = Exception.class)
+    public void bindBatch(MesProBagCodeBindBatchReqVO bindReqVO) {
+        MesProBatchDO batch = batchMapper.selectByIdForUpdate(bindReqVO.getBatchId());
+        if (batch == null) {
+            throw exception(PRO_BATCH_NOT_EXISTS);
+        }
+        if (!MesProBatchStatusEnum.PRODUCING.getStatus().equals(batch.getStatus())) {
+            throw exception(PRO_BATCH_STATUS_NOT_GENERATE_CODE);
+        }
+        // 涓存椂鎵规锛堟湭琛ュ綍姝e紡鎵规鍙凤級涓嶅厑璁歌鐮佸綍鍏�
+        if (StrUtil.isEmpty(batch.getCode())) {
+            throw exception(PRO_BATCH_NOT_FILLED);
+        }
+        List<Long> ids = bindReqVO.getIds().stream().distinct().toList();
+        List<MesProBagCodeDO> bagCodes = bagCodeMapper.selectListByIdsForUpdate(ids);
+        if (bagCodes.size() != ids.size() || bagCodes.stream().anyMatch(code ->
+                code.getBatchId() != null || !MesProBagCodeStatusEnum.GENERATED.getStatus().equals(code.getStatus()))) {
+            throw exception(PRO_BAG_CODE_STATUS_NOT_GENERATED);
+        }
+        if (bagCodeMapper.bindBatchByIds(ids, batch.getId(), batch.getCode(),
+                MesProBagCodeStatusEnum.GENERATED.getStatus()) != ids.size()) {
+            throw exception(PRO_BAG_CODE_STATUS_NOT_GENERATED);
+        }
         batchMapper.updateById(new MesProBatchDO().setId(batch.getId())
-                .setBagQuantity((batch.getBagQuantity() == null ? 0 : batch.getBagQuantity())
-                        + generateReqVO.getCount()));
-        return new MesProBagCodeGenerateRespVO()
-                .setUuid(uuid)
-                .setAutoPallets(palletService.autoCreatePallets(batch.getId()));
+                .setBagQuantity(bagCodeMapper.selectEffectiveCountByBatchId(batch.getId())));
     }
 
     @Override
@@ -147,7 +157,7 @@
 
         String replaceUuid = IdUtil.fastSimpleUUID();
         LocalDateTime replaceTime = LocalDateTime.now();
-        int startNo = bagCodeMapper.selectMaxBagNo(batch.getId()) + 1;
+        int startNo = bagCodeMapper.selectMaxBagNo() + 1;
         List<MesProBagCodeDO> newBagCodes = new ArrayList<>(oldBagCodes.size());
         List<MesProBagCodeReplaceDO> replacements = new ArrayList<>(oldBagCodes.size());
         List<MesProBagCodeReplaceItemRespVO> items = new ArrayList<>(oldBagCodes.size());
@@ -343,6 +353,16 @@
         return bagCodeMapper.selectListByBatchId(batchId);
     }
 
+    @Override
+    public void markOutbound(Long id, Long salesId) {
+        bagCodeMapper.markOutbound(id, salesId, LocalDateTime.now());
+    }
+
+    @Override
+    public void clearOutbound(Long id) {
+        bagCodeMapper.clearOutbound(id);
+    }
+
     // ==================== 绉佹湁鏂规硶 ====================
 
     /**

--
Gitblit v1.9.3