From 962f78c8383e7c884ddb08c951c15e5ba6eb4cb8 Mon Sep 17 00:00:00 2001
From: liu <2021943741@qq.com>
Date: 星期五, 23 十月 2026 15:43:33 +0800
Subject: [PATCH] fix: 完善审批流程与业务状态校验

---
 yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/service/wm/stocktaking/task/MesWmStockTakingTaskResultServiceImpl.java |   31 +++++++++++++++++++++++--------
 1 files changed, 23 insertions(+), 8 deletions(-)

diff --git a/yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/service/wm/stocktaking/task/MesWmStockTakingTaskResultServiceImpl.java b/yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/service/wm/stocktaking/task/MesWmStockTakingTaskResultServiceImpl.java
index a7fbc02..93299b4 100644
--- a/yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/service/wm/stocktaking/task/MesWmStockTakingTaskResultServiceImpl.java
+++ b/yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/service/wm/stocktaking/task/MesWmStockTakingTaskResultServiceImpl.java
@@ -19,6 +19,7 @@
 
 import static cn.iocoder.yudao.framework.common.exception.util.ServiceExceptionUtil.exception;
 import static cn.iocoder.yudao.module.mes.enums.ErrorCodeConstants.WM_STOCK_TAKING_TASK_LINE_ALREADY_TAKEN;
+import static cn.iocoder.yudao.module.mes.enums.ErrorCodeConstants.WM_STOCK_TAKING_TASK_LINE_NOT_MATCH;
 import static cn.iocoder.yudao.module.mes.enums.ErrorCodeConstants.WM_STOCK_TAKING_TASK_RESULT_NOT_EXISTS;
 
 /**
@@ -52,8 +53,9 @@
     @Override
     @Transactional(rollbackFor = Exception.class)
     public Long createStockTakingTaskResult(MesWmStockTakingTaskResultSaveReqVO createReqVO) {
-        // 1. 鏍¢獙浠诲姟澶勪簬鐩樼偣涓姸鎬�
+        // 1. 鏍¢獙浠诲姟澶勪簬鐩樼偣涓姸鎬侊紝涓旂粨鏋滃鎵瑰凡鎻愪氦銆佹湭瀹℃牳鏃剁姝㈠啓鍏�
         stockTakingTaskService.validateStockTakingTaskExistsAndApproving(createReqVO.getTaskId());
+        stockTakingTaskService.validateResultApprovalNotPending(createReqVO.getTaskId());
 
         // 2. 纭畾 lineId 鍜岃处闈㈡暟閲�
         Long lineId = createReqVO.getLineId();
@@ -71,10 +73,16 @@
         } else {
             // 2.3 濡傛灉浼犻�掍簡 lineId锛屼粠 line 涓幏鍙� quantity
             existingLine = stockTakingTaskLineService.validateStockTakingTaskLineExists(lineId);
+            // 2.4 闃叉涓插崟锛氱洏鐐硅蹇呴』灞炰簬璇锋眰鎸囧畾鐨勭洏鐐逛换鍔�
+            if (ObjUtil.notEqual(existingLine.getTaskId(), createReqVO.getTaskId())) {
+                throw exception(WM_STOCK_TAKING_TASK_LINE_NOT_MATCH);
+            }
         }
-        if (existingLine != null
-                && existingLine.getTakingQuantity() != null
-                && existingLine.getTakingQuantity().compareTo(BigDecimal.ZERO) > 0) {
+        // 2.5 闃叉閲嶅锛氬悓涓�鐩樼偣浠诲姟琛屽彧鍏佽瀛樺湪涓�鏉$洏鐐圭粨鏋滐紙鏃犺瀹炵洏鏁伴噺鏄惁涓� 0锛�
+        Long finalLineId = lineId;
+        boolean resultExists = stockTakingTaskResultMapper.selectListByTaskId(createReqVO.getTaskId()).stream()
+                .anyMatch(result -> Objects.equals(result.getLineId(), finalLineId));
+        if (resultExists) {
             throw exception(WM_STOCK_TAKING_TASK_LINE_ALREADY_TAKEN);
         }
         BigDecimal quantity = existingLine != null ? existingLine.getQuantity() : BigDecimal.ZERO; // 璐﹂潰鏁伴噺
@@ -95,8 +103,9 @@
         updateReqVO.setLineId(null); // lineId 涓嶈兘淇敼锛岄伩鍏嶈鎿嶄綔
         // 1.1 鏍¢獙璁板綍瀛樺湪
         MesWmStockTakingTaskResultDO oldResult = validateStockTakingTaskResultExists(updateReqVO.getId());
-        // 1.2 鏍¢獙浠诲姟澶勪簬鐩樼偣涓姸鎬�
+        // 1.2 鏍¢獙浠诲姟澶勪簬鐩樼偣涓姸鎬侊紝涓旂粨鏋滃鎵瑰凡鎻愪氦銆佹湭瀹℃牳鏃剁姝慨鏀�
         stockTakingTaskService.validateStockTakingTaskExistsAndApproving(oldResult.getTaskId());
+        stockTakingTaskService.validateResultApprovalNotPending(oldResult.getTaskId());
 
         // 2. 鏇存柊 result 璁板綍
         MesWmStockTakingTaskResultDO result = BeanUtils.toBean(updateReqVO, MesWmStockTakingTaskResultDO.class);
@@ -112,15 +121,21 @@
     public void deleteStockTakingTaskResult(Long id) {
         // 1.1 鏍¢獙 result 鏄惁瀛樺湪
         MesWmStockTakingTaskResultDO result = validateStockTakingTaskResultExists(id);
-        // 1.2 鏍¢獙 task 鏄惁澶勪簬 APPROVING 鐘舵��
+        // 1.2 鏍¢獙 task 鏄惁澶勪簬 APPROVING 鐘舵�侊紝涓旂粨鏋滃鎵瑰凡鎻愪氦銆佹湭瀹℃牳鏃剁姝㈠垹闄�
         stockTakingTaskService.validateStockTakingTaskExistsAndApproving(result.getTaskId());
+        stockTakingTaskService.validateResultApprovalNotPending(result.getTaskId());
 
         // 2. 鍒犻櫎 result 璁板綍
         stockTakingTaskResultMapper.deleteById(id);
 
-        // 3. 鏇存柊瀵瑰簲 line 鐨勭洏鐐规暟閲忓拰鐘舵��
+        // 3. 鎸夊墿浣欑洏鐐圭粨鏋滈噸绠楀搴� line 鐨勫疄鐩樻暟閲忥紙鏃犲墿浣欑粨鏋滄椂缃� 0锛夛紝閬垮厤瑕嗙洊鎴愯礋鏁�
+        BigDecimal remainingTakingQuantity = stockTakingTaskResultMapper.selectListByTaskId(result.getTaskId()).stream()
+                .filter(item -> Objects.equals(item.getLineId(), result.getLineId()))
+                .map(MesWmStockTakingTaskResultDO::getTakingQuantity)
+                .filter(Objects::nonNull)
+                .reduce(BigDecimal.ZERO, BigDecimal::add);
         stockTakingTaskLineService.updateStockTakingTaskLineTakingQuantity(
-                result.getLineId(), result.getTakingQuantity().negate());
+                result.getLineId(), remainingTakingQuantity);
     }
 
     @Override

--
Gitblit v1.9.3