From f02d0df2f1dfc7a8b775cf50d45375e57628a5ef Mon Sep 17 00:00:00 2001
From: 云 <2163098428@qq.com>
Date: 星期二, 10 十一月 2026 11:26:22 +0800
Subject: [PATCH] feat(ncr): 完善NCR处置联动逻辑与关闭校验
---
yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/service/wm/materialstock/MesWmMaterialStockServiceImpl.java | 54 +++++++++++++++++++++++++++++++++++++++---------------
1 files changed, 39 insertions(+), 15 deletions(-)
diff --git a/yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/service/wm/materialstock/MesWmMaterialStockServiceImpl.java b/yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/service/wm/materialstock/MesWmMaterialStockServiceImpl.java
index d4a42da..3987dda 100644
--- a/yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/service/wm/materialstock/MesWmMaterialStockServiceImpl.java
+++ b/yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/service/wm/materialstock/MesWmMaterialStockServiceImpl.java
@@ -20,6 +20,7 @@
import cn.iocoder.yudao.module.mes.dal.dataobject.mdm.MesMdmItemDO;
import cn.iocoder.yudao.module.mes.dal.dataobject.md.item.MesMdItemTypeDO;
import cn.iocoder.yudao.module.mes.dal.dataobject.wm.materialstock.MesWmMaterialStockDO;
+import cn.iocoder.yudao.module.mes.dal.mysql.wm.materialstock.MesWmMaterialStockFreezeClaimMapper;
import cn.iocoder.yudao.module.mes.dal.dataobject.wm.warehouse.MesWmWarehouseAreaDO;
import cn.iocoder.yudao.module.mes.dal.dataobject.wm.warehouse.MesWmWarehouseDO;
import cn.iocoder.yudao.module.mes.dal.dataobject.wm.warehouse.MesWmWarehouseLocationDO;
@@ -70,6 +71,8 @@
@Resource
private MesWmMaterialStockMapper materialStockMapper;
+ @Resource
+ private MesWmMaterialStockFreezeClaimMapper freezeClaimMapper;
@Resource
private MesMdmItemService mdmItemService;
@@ -132,6 +135,8 @@
MesMdItemDO item = mdItemService.getItem(pageReqVO.getItemId());
if (item != null && item.getMdmItemId() != null) {
itemIds = SetUtils.asSet(item.getMdmItemId());
+ } else {
+ return PageResult.empty();
}
}
// 1.3 瑙f瀽 virtualFilter锛氳浆鎹负铏氭嫙浠� warehouseId
@@ -150,21 +155,34 @@
}
@Override
+ @Transactional(rollbackFor = Exception.class)
public void updateMaterialStockFrozen(MesWmMaterialStockFreezeReqVO updateReqVO) {
- // 鏍¢獙瀛樺湪
- validateMaterialStockExists(updateReqVO.getId());
-
- // 鏇存柊鍐荤粨鐘舵��
- materialStockMapper.updateById(new MesWmMaterialStockDO()
- .setId(updateReqVO.getId()).setFrozen(updateReqVO.getFrozen()));
+ setMaterialStockFreeze(List.of(updateReqVO.getId()), "MANUAL", 0L, updateReqVO.getFrozen());
}
@Override
- public void updateMaterialStockFrozen(Collection<Long> ids, boolean frozen) {
+ @Transactional(rollbackFor = Exception.class)
+ public void setMaterialStockFreeze(Collection<Long> ids, String sourceType, Long sourceId, boolean frozen) {
if (CollUtil.isEmpty(ids)) {
return;
}
- materialStockMapper.updateByIds(ids, new MesWmMaterialStockDO().setFrozen(frozen));
+ // 鎸� ID 鍥哄畾椤哄簭鍔犻攣锛岄伩鍏嶄袱涓换鍔″悓鏃跺喕缁撶浉鍚屽簱瀛樻椂浜х敓閿侀『搴忓弽杞��
+ for (Long stockId : ids.stream().filter(Objects::nonNull).distinct().sorted().toList()) {
+ MesWmMaterialStockDO stock = materialStockMapper.lockById(stockId);
+ if (stock == null) {
+ throw exception(WM_MATERIAL_STOCK_NOT_EXISTS);
+ }
+ if (frozen) {
+ freezeClaimMapper.acquire(stockId, sourceType, sourceId);
+ } else {
+ freezeClaimMapper.release(stockId, sourceType, sourceId);
+ }
+ boolean effectiveFrozen = freezeClaimMapper.countByStockId(stockId) > 0;
+ if (!Objects.equals(stock.getFrozen(), effectiveFrozen)) {
+ materialStockMapper.updateById(new MesWmMaterialStockDO()
+ .setId(stockId).setFrozen(effectiveFrozen));
+ }
+ }
}
@Override
@@ -399,7 +417,7 @@
} else {
// 鍑哄簱鏃舵牎楠屾壒娆″瓨鍦�
if (batchId != null) {
- batchService.validateBatchExists(batchId, reqVO.getItemId());
+ batchCode = batchService.validateBatchExists(batchId, reqVO.getItemId()).getCode();
}
}
@@ -457,20 +475,26 @@
* @return 鎵规璁板綍锛堢墿鏂欐湭鍚敤鎵规绠$悊鏃惰繑鍥� null锛�
*/
private MesWmBatchDO resolveBatch(MesWmMaterialStockAdjustReqVO reqVO, MesMdmItemDO item) {
- // 1. 鐗╂枡鏈惎鐢ㄦ壒娆$鐞嗭紝杩斿洖 null
- if (Boolean.FALSE.equals(item.getIsBatchManaged())) {
- return null;
+ // 鍗充娇鐗╂枡鏈惎鐢ㄦ櫘閫氭壒娆$鐞嗭紝涔熻淇濈暀骞舵牎楠岀洏鍙疯拷婧壒娆°��
+ if (reqVO.getBatchId() != null) {
+ MesWmBatchDO existing = batchService.validateBatchExists(reqVO.getBatchId(), reqVO.getItemId());
+ if (StrUtil.isNotBlank(reqVO.getReelNo())
+ && !Objects.equals(StrUtil.trim(reqVO.getReelNo()), StrUtil.trim(existing.getReelNo()))) {
+ throw exception(WM_BATCH_REEL_MISMATCH);
+ }
+ return existing;
}
- // 2. 浼犲叆 batchId锛屾牎楠屽苟杩斿洖宸叉湁鎵规
- if (reqVO.getBatchId() != null) {
- return batchService.validateBatchExists(reqVO.getBatchId(), reqVO.getItemId());
+ // 1. 鏈寚瀹氳拷婧壒娆′笖鐗╂枡鏈惎鐢ㄦ壒娆$鐞嗭紝杩斿洖 null
+ if (Boolean.FALSE.equals(item.getIsBatchManaged()) && StrUtil.isBlank(reqVO.getReelNo())) {
+ return null;
}
// 3. 鏈紶 batchId锛岃嚜鍔ㄥ垱寤烘壒娆�
MesWmBatchGenerateReqVO batchReqVO = new MesWmBatchGenerateReqVO()
.setItemId(reqVO.getItemId())
.setBatchCode(reqVO.getBatchCode())
+ .setReelNo(StrUtil.trimToNull(reqVO.getReelNo()))
.setVendorId(reqVO.getVendorId())
.setProduceDate(reqVO.getProduceDate() != null ? reqVO.getProduceDate().atStartOfDay() : null)
.setExpireDate(reqVO.getExpireDate() != null ? reqVO.getExpireDate().atStartOfDay() : null)
--
Gitblit v1.9.3