From 8c65f898ed6e5b0c7a94c792c4562f6ec831dccd Mon Sep 17 00:00:00 2001
From: gaoluyang <2820782392@qq.com>
Date: 星期六, 07 十一月 2026 08:50:53 +0800
Subject: [PATCH] feat: 完善质检、生产、销售、财务与人事模块并接入审批流程

---
 yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/service/wm/materialstock/MesWmMaterialStockServiceImpl.java |   32 ++++++++++++++++++++++++--------
 1 files changed, 24 insertions(+), 8 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 f083ece..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;
@@ -152,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

--
Gitblit v1.9.3