From bf5f52656e128f578ed42c7979c31cf4b476ce46 Mon Sep 17 00:00:00 2001
From: 云 <2163098428@qq.com>
Date: 星期六, 31 十月 2026 19:04:40 +0800
Subject: [PATCH] feat: 优化业务导入及工艺流程管理
---
yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/service/pro/route/MesProRouteServiceImpl.java | 29 +++++++++++++++++++++++++++--
1 files changed, 27 insertions(+), 2 deletions(-)
diff --git a/yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/service/pro/route/MesProRouteServiceImpl.java b/yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/service/pro/route/MesProRouteServiceImpl.java
index e30fe31..552161e 100644
--- a/yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/service/pro/route/MesProRouteServiceImpl.java
+++ b/yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/service/pro/route/MesProRouteServiceImpl.java
@@ -13,6 +13,7 @@
import cn.iocoder.yudao.module.mes.controller.admin.pro.route.vo.MesProRouteSaveReqVO;
import cn.iocoder.yudao.module.mes.dal.dataobject.pro.route.MesProRouteDO;
import cn.iocoder.yudao.module.mes.dal.dataobject.pro.route.MesProRouteProcessDO;
+import cn.iocoder.yudao.module.mes.dal.dataobject.pro.route.MesProRouteProcessOutputDO;
import cn.iocoder.yudao.module.mes.dal.dataobject.pro.route.MesProRouteProductDO;
import cn.iocoder.yudao.module.mes.dal.dataobject.pro.route.MesProRouteProductBomDO;
import cn.iocoder.yudao.module.mes.dal.dataobject.md.item.MesMdItemDO;
@@ -35,6 +36,7 @@
import java.util.Set;
import java.util.Comparator;
import java.util.Arrays;
+import java.util.Objects;
import java.util.stream.Collectors;
import java.util.concurrent.atomic.AtomicInteger;
@@ -187,8 +189,13 @@
.max(Comparator.comparing(MesProRouteProcessDO::getSort)).orElseThrow();
for (MesProRouteProcessDO process : processList) {
Set<Long> outputIds = parseOutputItemIds(process.getOutputItemId());
+ boolean last = process.getId().equals(lastProcess.getId());
if (CollUtil.isEmpty(outputIds)) {
- throw exception(PRO_ROUTE_PROCESS_OUTPUT_REQUIRED, process.getProcessId());
+ // 涓棿宸ュ簭涓嶄竴瀹氬舰鎴愬彲鍏ュ簱鐨勭嫭绔嬪崐鎴愬搧锛屽厑璁镐笉閰嶇疆浜у嚭锛涙湯閬撳伐搴忓繀椤讳骇鍑烘垚鍝併��
+ if (last) {
+ throw exception(PRO_ROUTE_LAST_OUTPUT_INVALID, process.getProcessId());
+ }
+ continue;
}
for (Long outputId : outputIds) {
if (!boundItemIds.contains(outputId)) {
@@ -196,12 +203,26 @@
throw exception(PRO_ROUTE_PROCESS_OUTPUT_NOT_BOUND, item.getName());
}
}
- if (process.getId().equals(lastProcess.getId())) {
+ if (last) {
if (finishedItemIds.isEmpty() || !outputIds.equals(finishedItemIds)) {
throw exception(PRO_ROUTE_LAST_OUTPUT_INVALID, process.getProcessId());
}
} else if (outputIds.stream().anyMatch(itemId -> !isItemUnderCategory(itemId, "SF"))) {
throw exception(PRO_ROUTE_MIDDLE_OUTPUT_INVALID, process.getProcessId());
+ }
+ }
+ // 4. 鏈亾宸ュ簭鎴愬搧浜у嚭蹇呴』鎸変骇鍝佸綊灞烇紝閬垮厤鈥滈�氱敤鈥濅骇鍑轰覆鍒板叾瀹冧骇鍝佺殑宸ュ崟
+ List<MesProRouteProcessOutputDO> lastOutputs = routeProcessService
+ .getRouteProcessOutputListByRouteProcessIds(Collections.singletonList(lastProcess.getId()));
+ if (CollUtil.isNotEmpty(lastOutputs)) {
+ boolean attributionInvalid = lastOutputs.stream().anyMatch(output ->
+ output.getProductId() == null || !output.getProductId().equals(output.getItemId()));
+ Set<Long> attributedProducts = lastOutputs.stream()
+ .map(MesProRouteProcessOutputDO::getProductId)
+ .filter(Objects::nonNull)
+ .collect(Collectors.toSet());
+ if (attributionInvalid || !attributedProducts.containsAll(finishedItemIds)) {
+ throw exception(PRO_ROUTE_LAST_OUTPUT_ATTRIBUTION_REQUIRED, lastProcess.getProcessId());
}
}
}
@@ -295,6 +316,10 @@
routeMapper.insert(route);
respVO.getCreateCodes().add(importItem.getCode());
} else if (updateSupport) {
+ if (CommonStatusEnum.ENABLE.getStatus().equals(existRoute.getStatus())) {
+ respVO.getFailureCodes().put(key, "璺嚎宸插惎鐢紝璇峰厛鍋滅敤鍚庡啀鏇存柊");
+ return;
+ }
// 2.1.2 鏇存柊锛堢姸鎬佺敱鍚敤/绂佺敤鎺ュ彛鍗曠嫭缁存姢锛屽鍏ヤ笉淇敼鐘舵�侊級
MesProRouteDO updateObj = BeanUtils.toBean(importItem, MesProRouteDO.class);
updateObj.setId(existRoute.getId());
--
Gitblit v1.9.3