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/stocktaking/task/MesWmStockTakingTaskServiceImpl.java | 57 +++++++++++++++++++++++++++++++++++++++++++++++++++------
1 files changed, 51 insertions(+), 6 deletions(-)
diff --git a/yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/service/wm/stocktaking/task/MesWmStockTakingTaskServiceImpl.java b/yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/service/wm/stocktaking/task/MesWmStockTakingTaskServiceImpl.java
index a192e7a..e3f59e5 100644
--- a/yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/service/wm/stocktaking/task/MesWmStockTakingTaskServiceImpl.java
+++ b/yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/service/wm/stocktaking/task/MesWmStockTakingTaskServiceImpl.java
@@ -26,6 +26,11 @@
import java.math.BigDecimal;
import java.util.List;
+import java.util.ArrayList;
+import java.util.HashMap;
+import java.util.HashSet;
+import java.util.Map;
+import java.util.Set;
import static cn.iocoder.yudao.framework.common.exception.util.ServiceExceptionUtil.exception;
import static cn.iocoder.yudao.framework.common.util.collection.CollectionUtils.convertList;
@@ -137,7 +142,7 @@
// 3. 鏍规嵁鍐荤粨鏍囪瘑锛屽鐗╄祫杩涜鍐荤粨
if (Boolean.TRUE.equals(task.getFrozen())) {
- updateMaterialStockFrozen(lines, true);
+ updateMaterialStockFrozen(id, lines, true);
}
}
@@ -146,6 +151,7 @@
public void finishStockTakingTask(Long id) {
// 1. 鏍¢獙浠诲姟瀛樺湪涓斾负瀹℃壒涓姸鎬�
MesWmStockTakingTaskDO task = validateStockTakingTaskExistsAndApproving(id);
+ validateAllLinesCounted(id);
// 2. 鏇存柊浠诲姟鐘舵�佷负宸插畬鎴�
stockTakingTaskMapper.updateById(new MesWmStockTakingTaskDO().setId(id)
@@ -154,7 +160,41 @@
// 3. 瑙e喕搴撳瓨
if (Boolean.TRUE.equals(task.getFrozen())) {
List<MesWmStockTakingTaskLineDO> lines = stockTakingTaskLineService.getStockTakingTaskLineListByTaskId(id);
- updateMaterialStockFrozen(lines, false);
+ updateMaterialStockFrozen(id, lines, false);
+ }
+ // 涓庡畬鎴愮姸鎬併�佽В鍐诲叡鐢ㄤ簨鍔★紱宸紓鍏ヨ处澶辫触鏃舵暣鍗曞洖婊氥��
+ processStockTakingDifference(id);
+ }
+
+ private void validateAllLinesCounted(Long taskId) {
+ List<MesWmStockTakingTaskLineDO> lines = stockTakingTaskLineService.getStockTakingTaskLineListByTaskId(taskId);
+ if (CollUtil.isEmpty(lines)) {
+ throw exception(WM_STOCK_TAKING_TASK_NO_LINE);
+ }
+ List<MesWmStockTakingTaskResultDO> results = stockTakingTaskResultService.getStockTakingTaskResultListByTaskId(taskId);
+ Map<Long, MesWmStockTakingTaskLineDO> lineMap = new HashMap<>();
+ lines.forEach(line -> lineMap.put(line.getId(), line));
+ Set<Long> counted = new HashSet<>();
+ for (MesWmStockTakingTaskResultDO result : results) {
+ MesWmStockTakingTaskLineDO line = lineMap.get(result.getLineId());
+ if (line == null || !ObjUtil.equal(result.getTaskId(), taskId)
+ || !ObjUtil.equal(result.getMaterialStockId(), line.getMaterialStockId())
+ || !ObjUtil.equal(result.getItemId(), line.getItemId())
+ || !ObjUtil.equal(result.getBatchId(), line.getBatchId())
+ || !ObjUtil.equal(result.getWarehouseId(), line.getWarehouseId())
+ || !ObjUtil.equal(result.getLocationId(), line.getLocationId())
+ || !ObjUtil.equal(result.getAreaId(), line.getAreaId())
+ || !ObjUtil.equal(result.getQuantity(), line.getQuantity())
+ || result.getTakingQuantity() == null || result.getTakingQuantity().signum() < 0
+ || !counted.add(result.getLineId())) {
+ throw exception(WM_STOCK_TAKING_TASK_RESULT_LINE_INVALID);
+ }
+ }
+ List<Long> missing = new ArrayList<>();
+ lines.stream().map(MesWmStockTakingTaskLineDO::getId)
+ .filter(lineId -> !counted.contains(lineId)).forEach(missing::add);
+ if (!missing.isEmpty()) {
+ throw exception(WM_STOCK_TAKING_TASK_INCOMPLETE, missing);
}
}
@@ -169,7 +209,7 @@
task.setStatus(MesWmStockTakingTaskStatusEnum.CANCELED.getStatus());
stockTakingTaskMapper.updateById(task);
if (Boolean.TRUE.equals(task.getFrozen())) {
- updateMaterialStockFrozen(stockTakingTaskLineService.getStockTakingTaskLineListByTaskId(id), false);
+ updateMaterialStockFrozen(id, stockTakingTaskLineService.getStockTakingTaskLineListByTaskId(id), false);
}
}
@@ -210,13 +250,13 @@
return stockTakingTaskMapper.selectPage(pageReqVO);
}
- private void updateMaterialStockFrozen(List<MesWmStockTakingTaskLineDO> lines, boolean frozen) {
+ private void updateMaterialStockFrozen(Long taskId, List<MesWmStockTakingTaskLineDO> lines, boolean frozen) {
if (CollUtil.isEmpty(lines)) {
return;
}
List<Long> materialStockIds = convertList(lines,
MesWmStockTakingTaskLineDO::getMaterialStockId, line -> line.getMaterialStockId() != null);
- materialStockService.updateMaterialStockFrozen(materialStockIds, frozen);
+ materialStockService.setMaterialStockFreeze(materialStockIds, "STOCK_TAKING", taskId, frozen);
}
private void validateStockTakingTaskCodeUnique(Long id, String code) {
@@ -236,6 +276,10 @@
MesWmStockTakingTaskDO task = validateStockTakingTaskExists(id);
if (!MesWmStockTakingTaskStatusEnum.FINISHED.getStatus().equals(task.getStatus())) {
throw exception(WM_STOCK_TAKING_TASK_NOT_FINISHED);
+ }
+ // 鍘熷瓙璁ら锛涢噸澶嶈皟鐢ㄤ笉浼氶噸澶嶇敓鎴愮洏鐩�/鐩樹簭娴佹按銆�
+ if (stockTakingTaskMapper.claimDifferenceProcessing(id) == 0) {
+ return;
}
// 2. 鑾峰彇鐩樼偣缁撴灉鍒楄〃
@@ -268,6 +312,7 @@
.setWarehouseId(result.getWarehouseId())
.setLocationId(result.getLocationId())
.setAreaId(result.getAreaId())
+ .setMaterialStockId(result.getMaterialStockId())
.setBizId(task.getId())
.setBizCode(task.getCode())
.setBizLineId(result.getLineId());
@@ -280,7 +325,7 @@
} else {
// 鐩樹簭锛氬簱瀛樺噺灏�
transaction.setType(MesWmTransactionTypeEnum.OUT.getType())
- .setQuantity(difference.negate()) // 鍑哄簱鏁伴噺浼犳鏁帮紝浣嗗唴閮ㄤ細杞负璐熸暟
+ .setQuantity(difference) // 鐩樹簭涓鸿礋鏁帮紝绗﹀悎鍑哄簱浜嬪姟鏂瑰悜
.setBizType(MesBizTypeConstants.WM_STOCK_TAKING);
}
--
Gitblit v1.9.3