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