From 4ca4444ad33a2a1a51f5c06e78ee9365dfb1eed6 Mon Sep 17 00:00:00 2001
From: liu <2021943741@qq.com>
Date: 星期四, 08 十月 2026 17:11:11 +0800
Subject: [PATCH] feat(mes): 种子二维码标签国标四要素合规改造

---
 yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/service/wm/materialstockbag/MesWmMaterialStockBagServiceImpl.java |  165 +++++++++++++++++++++++++++++++++++++++++++++++++++++++
 1 files changed, 165 insertions(+), 0 deletions(-)

diff --git a/yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/service/wm/materialstockbag/MesWmMaterialStockBagServiceImpl.java b/yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/service/wm/materialstockbag/MesWmMaterialStockBagServiceImpl.java
new file mode 100644
index 0000000..3929602
--- /dev/null
+++ b/yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/service/wm/materialstockbag/MesWmMaterialStockBagServiceImpl.java
@@ -0,0 +1,165 @@
+package cn.iocoder.yudao.module.mes.service.wm.materialstockbag;
+
+import cn.hutool.core.util.ObjUtil;
+import cn.hutool.core.util.StrUtil;
+import cn.iocoder.yudao.module.mes.dal.dataobject.wm.materialstock.MesWmMaterialStockDO;
+import cn.iocoder.yudao.module.mes.dal.dataobject.wm.materialstockbag.MesWmMaterialStockBagDO;
+import cn.iocoder.yudao.module.mes.dal.mysql.wm.materialstockbag.MesWmMaterialStockBagMapper;
+import cn.iocoder.yudao.module.mes.enums.wm.MesWmMaterialStockBagStatusEnum;
+import cn.iocoder.yudao.module.mes.enums.wm.MesWmStockStateEnum;
+import cn.iocoder.yudao.module.mes.service.wm.transaction.dto.MesWmTransactionSaveReqDTO;
+import jakarta.annotation.Resource;
+import org.springframework.stereotype.Service;
+import org.springframework.transaction.annotation.Transactional;
+import org.springframework.validation.annotation.Validated;
+
+import java.math.BigDecimal;
+import java.time.LocalDateTime;
+
+import static cn.iocoder.yudao.framework.common.exception.util.ServiceExceptionUtil.exception;
+import static cn.iocoder.yudao.module.mes.enums.ErrorCodeConstants.*;
+
+/**
+ * MES 搴撳瓨琚嬬爜鏄庣粏 Service 瀹炵幇绫�
+ *
+ * 琚嬬爜鏄庣粏鐢熷懡鍛ㄦ湡锛氶娆″叆搴撳缓绔嬶紙ACTIVE锛夆啋 绉诲簱/璐ㄦ杩佺Щ浣嶇疆鐘舵�� 鈫� 鍑哄簱/鎶ュ簾缁撴潫锛圤UT/SCRAPPED锛夈��
+ * 鍞竴绾︽潫 bag_code 淇濊瘉姣忎釜琚嬬爜浠呬竴鏉℃槑缁嗭紝澶嶇敤鍚屼竴琛屽畬鎴愬叏鐢熷懡鍛ㄦ湡娴佽浆銆�
+ */
+@Service
+@Validated
+public class MesWmMaterialStockBagServiceImpl implements MesWmMaterialStockBagService {
+
+    @Resource
+    private MesWmMaterialStockBagMapper materialStockBagMapper;
+
+    @Override
+    @Transactional(rollbackFor = Exception.class)
+    public MesWmMaterialStockBagDO inbound(MesWmTransactionSaveReqDTO reqDTO, MesWmMaterialStockDO stock, Long transactionId) {
+        String bagCode = reqDTO.getBagCode();
+        if (StrUtil.isBlank(bagCode)) {
+            throw exception(WM_MATERIAL_STOCK_BAG_REQUIRED);
+        }
+        // 1. 鏌ヨ璇ヨ鐮佹棦鏈夋槑缁嗭細浼樺厛鎸� bagCodeId锛屽叾娆℃寜 bagCode
+        MesWmMaterialStockBagDO existing = materialStockBagMapper.selectByBagCode(bagCode);
+        if (existing == null && reqDTO.getBagCodeId() != null) {
+            existing = materialStockBagMapper.selectByBagCodeId(reqDTO.getBagCodeId());
+        }
+        if (existing != null) {
+            // 2. 宸插湪搴� 鈫� 閲嶅鍏ュ簱锛岀姝�
+            if (MesWmMaterialStockBagStatusEnum.ACTIVE.getStatus().equals(existing.getStatus())) {
+                throw exception(WM_MATERIAL_STOCK_BAG_DUPLICATE, bagCode);
+            }
+            // 3. 宸插嚭搴�/鎶ュ簾 鈫� 閲嶆柊婵�娲诲苟鏇存柊浣嶇疆
+            return reactivate(existing, reqDTO, stock, transactionId);
+        }
+        // 4. 棣栨鍏ュ簱 鈫� 鏂板缓鏄庣粏
+        MesWmMaterialStockBagDO bag = MesWmMaterialStockBagDO.builder()
+                .materialStockId(stock.getId())
+                .bagCodeId(reqDTO.getBagCodeId())
+                .bagCode(bagCode)
+                .itemId(stock.getItemId())
+                .batchId(stock.getBatchId())
+                .batchCode(stock.getBatchCode())
+                .vendorId(stock.getVendorId())
+                .warehouseId(stock.getWarehouseId())
+                .locationId(stock.getLocationId())
+                .areaId(stock.getAreaId())
+                .stockState(ObjUtil.defaultIfNull(reqDTO.getStockState(), stock.getStockState()))
+                .status(MesWmMaterialStockBagStatusEnum.ACTIVE.getStatus())
+                .quantity(BigDecimal.ONE)
+                .frozen(false)
+                .lastTransactionId(transactionId)
+                .inboundTime(LocalDateTime.now())
+                .build();
+        materialStockBagMapper.insert(bag);
+        return bag;
+    }
+
+    @Override
+    @Transactional(rollbackFor = Exception.class)
+    public void outbound(MesWmTransactionSaveReqDTO reqDTO, Long transactionId) {
+        MesWmMaterialStockBagDO bag = requireActiveBag(reqDTO);
+        MesWmMaterialStockBagDO update = new MesWmMaterialStockBagDO();
+        update.setId(bag.getId());
+        update.setStatus(MesWmMaterialStockBagStatusEnum.OUT.getStatus());
+        update.setStockState(MesWmStockStateEnum.OUT.getState());
+        update.setLastTransactionId(transactionId);
+        update.setOutboundTime(LocalDateTime.now());
+        materialStockBagMapper.updateById(update);
+    }
+
+    @Override
+    @Transactional(rollbackFor = Exception.class)
+    public void moveIn(MesWmTransactionSaveReqDTO reqDTO, MesWmMaterialStockDO targetStock, Long transactionId) {
+        MesWmMaterialStockBagDO bag = requireActiveBag(reqDTO);
+        MesWmMaterialStockBagDO update = new MesWmMaterialStockBagDO();
+        update.setId(bag.getId());
+        update.setMaterialStockId(targetStock.getId());
+        update.setWarehouseId(targetStock.getWarehouseId());
+        update.setLocationId(targetStock.getLocationId());
+        update.setAreaId(targetStock.getAreaId());
+        update.setStockState(ObjUtil.defaultIfNull(reqDTO.getStockState(), targetStock.getStockState()));
+        update.setLastTransactionId(transactionId);
+        materialStockBagMapper.updateById(update);
+    }
+
+    @Override
+    @Transactional(rollbackFor = Exception.class)
+    public void scrap(MesWmTransactionSaveReqDTO reqDTO, Long transactionId) {
+        MesWmMaterialStockBagDO bag = requireActiveBag(reqDTO);
+        MesWmMaterialStockBagDO update = new MesWmMaterialStockBagDO();
+        update.setId(bag.getId());
+        update.setStatus(MesWmMaterialStockBagStatusEnum.SCRAPPED.getStatus());
+        update.setStockState(MesWmStockStateEnum.OUT.getState());
+        update.setQuantity(BigDecimal.ZERO);
+        update.setLastTransactionId(transactionId);
+        update.setOutboundTime(LocalDateTime.now());
+        materialStockBagMapper.updateById(update);
+    }
+
+    @Override
+    public MesWmMaterialStockBagDO getActiveByMaterialStockId(Long materialStockId) {
+        return materialStockBagMapper.selectOneActiveByMaterialStockId(materialStockId);
+    }
+
+    /**
+     * 鏌ヨ鎸囧畾琚嬬爜鐨勬椿鍔ㄦ槑缁嗭紝涓嶅瓨鍦ㄦ垨宸插嚭搴�/鎶ュ簾鍒欐姏寮傚父銆�
+     */
+    private MesWmMaterialStockBagDO requireActiveBag(MesWmTransactionSaveReqDTO reqDTO) {
+        MesWmMaterialStockBagDO bag = null;
+        if (reqDTO.getBagCodeId() != null) {
+            bag = materialStockBagMapper.selectActiveByBagCodeId(reqDTO.getBagCodeId());
+        }
+        if (bag == null && StrUtil.isNotBlank(reqDTO.getBagCode())) {
+            bag = materialStockBagMapper.selectActiveByBagCode(reqDTO.getBagCode());
+        }
+        if (bag == null) {
+            String code = StrUtil.blankToDefault(reqDTO.getBagCode(), String.valueOf(reqDTO.getBagCodeId()));
+            throw exception(WM_MATERIAL_STOCK_BAG_NOT_ACTIVE, code);
+        }
+        return bag;
+    }
+
+    private MesWmMaterialStockBagDO reactivate(MesWmMaterialStockBagDO existing, MesWmTransactionSaveReqDTO reqDTO,
+                                               MesWmMaterialStockDO stock, Long transactionId) {
+        MesWmMaterialStockBagDO update = new MesWmMaterialStockBagDO();
+        update.setId(existing.getId());
+        update.setMaterialStockId(stock.getId());
+        update.setItemId(stock.getItemId());
+        update.setBatchId(stock.getBatchId());
+        update.setBatchCode(stock.getBatchCode());
+        update.setVendorId(stock.getVendorId());
+        update.setWarehouseId(stock.getWarehouseId());
+        update.setLocationId(stock.getLocationId());
+        update.setAreaId(stock.getAreaId());
+        update.setStockState(ObjUtil.defaultIfNull(reqDTO.getStockState(), stock.getStockState()));
+        update.setStatus(MesWmMaterialStockBagStatusEnum.ACTIVE.getStatus());
+        update.setQuantity(BigDecimal.ONE);
+        update.setFrozen(false);
+        update.setLastTransactionId(transactionId);
+        update.setInboundTime(LocalDateTime.now());
+        update.setOutboundTime(null);
+        materialStockBagMapper.updateById(update);
+        return existing;
+    }
+}

--
Gitblit v1.9.3