From 3edf8c4fc07f9784e2d04ee7a98692bb457749eb Mon Sep 17 00:00:00 2001
From: 云 <2163098428@qq.com>
Date: 星期一, 26 十月 2026 16:28:10 +0800
Subject: [PATCH] feat(mes): 新增工艺路线完整导入功能并优化相关验证
---
yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/service/pro/workorder/MesProWorkOrderProcessServiceImpl.java | 93 +++++++++++++++++++++++++++++++++++++---------
1 files changed, 75 insertions(+), 18 deletions(-)
diff --git a/yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/service/pro/workorder/MesProWorkOrderProcessServiceImpl.java b/yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/service/pro/workorder/MesProWorkOrderProcessServiceImpl.java
index e626b2e..2364935 100644
--- a/yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/service/pro/workorder/MesProWorkOrderProcessServiceImpl.java
+++ b/yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/service/pro/workorder/MesProWorkOrderProcessServiceImpl.java
@@ -7,12 +7,15 @@
import cn.iocoder.yudao.module.mes.controller.admin.pro.workorder.vo.process.MesProWorkOrderProcessSaveReqVO;
import cn.iocoder.yudao.module.mes.controller.admin.pro.workorder.vo.process.MesProWorkOrderProcessSaveReqVO;
import cn.iocoder.yudao.module.mes.dal.dataobject.pro.route.MesProRouteProcessDO;
+import cn.iocoder.yudao.module.mes.dal.dataobject.pro.route.MesProRouteProductDO;
import cn.iocoder.yudao.module.mes.dal.dataobject.pro.workorder.MesProWorkOrderBomDO;
import cn.iocoder.yudao.module.mes.dal.dataobject.pro.workorder.MesProWorkOrderProcessDO;
import cn.iocoder.yudao.module.mes.dal.mysql.pro.workorder.MesProWorkOrderBomMapper;
import cn.iocoder.yudao.module.mes.dal.mysql.pro.workorder.MesProWorkOrderProcessMapper;
import cn.iocoder.yudao.module.mes.service.pro.process.MesProProcessService;
import cn.iocoder.yudao.module.mes.service.pro.route.MesProRouteProcessService;
+import cn.iocoder.yudao.module.mes.service.pro.route.MesProRouteProductService;
+import cn.iocoder.yudao.module.mes.service.wm.warehouse.MesWmWarehouseAreaService;
import jakarta.annotation.Resource;
import org.springframework.context.annotation.Lazy;
import org.springframework.stereotype.Service;
@@ -24,6 +27,7 @@
import java.util.Comparator;
import java.util.List;
import java.util.Set;
+import java.util.stream.Collectors;
import static cn.iocoder.yudao.framework.common.exception.util.ServiceExceptionUtil.exception;
import static cn.iocoder.yudao.module.mes.enums.ErrorCodeConstants.*;
@@ -31,7 +35,7 @@
/**
* MES 鐢熶骇宸ュ崟宸ュ簭 Service 瀹炵幇绫�
*
- * @author 鑺嬮亾婧愮爜
+ * @author 瓒呯骇绠$悊鍛�
*/
@Service
@Validated
@@ -48,6 +52,10 @@
@Resource
private MesProRouteProcessService routeProcessService;
@Resource
+ private MesProRouteProductService routeProductService;
+ @Resource
+ private MesWmWarehouseAreaService warehouseAreaService;
+ @Resource
@Lazy
private MesProWorkOrderBomService workOrderBomService;
@Resource
@@ -60,6 +68,12 @@
// 2. 鎻掑叆鏁版嵁
MesProWorkOrderProcessDO workOrderProcess = BeanUtils.toBean(createReqVO, MesProWorkOrderProcessDO.class);
+ if (CollUtil.isNotEmpty(createReqVO.getOutputItemIds())) {
+ workOrderProcess.setOutputItemId(
+ createReqVO.getOutputItemIds().stream()
+ .map(String::valueOf)
+ .collect(Collectors.joining(",")));
+ }
workOrderProcessMapper.insert(workOrderProcess);
// 3. 閲嶅缓宸ュ簭閾�
@@ -75,7 +89,16 @@
// 2. 鏇存柊鏁版嵁
MesProWorkOrderProcessDO updateObj = BeanUtils.toBean(updateReqVO, MesProWorkOrderProcessDO.class);
+ if (CollUtil.isNotEmpty(updateReqVO.getOutputItemIds())) {
+ updateObj.setOutputItemId(
+ updateReqVO.getOutputItemIds().stream()
+ .map(String::valueOf)
+ .collect(Collectors.joining(",")));
+ }
workOrderProcessMapper.updateById(updateObj);
+ // 鎶ュ伐浠撳簱鍏佽缃┖锛屽崟鐙洿鏂�
+ workOrderProcessMapper.updateWarehouseById(updateReqVO.getId(), updateReqVO.getWarehouseId(),
+ updateReqVO.getLocationId(), updateReqVO.getAreaId());
// 3. 閲嶅缓宸ュ簭閾�
rebuildProcessChain(updateReqVO.getWorkOrderId());
@@ -109,6 +132,24 @@
}
@Override
+ public MesProWorkOrderProcessDO getWorkOrderProcessByWorkOrderIdAndProcessId(Long workOrderId, Long processId) {
+ return workOrderProcessMapper.selectByWorkOrderIdAndProcessId(workOrderId, processId);
+ }
+
+ @Override
+ public MesProWorkOrderProcessDO getLastWorkOrderProcessByWorkOrderId(Long workOrderId) {
+ return workOrderProcessMapper.selectLastByWorkOrderId(workOrderId);
+ }
+
+ @Override
+ public List<MesProWorkOrderProcessDO> getWorkOrderProcessListByWorkOrderIds(java.util.Collection<Long> workOrderIds) {
+ if (CollUtil.isEmpty(workOrderIds)) {
+ return Collections.emptyList();
+ }
+ return workOrderProcessMapper.selectListByWorkOrderIds(workOrderIds);
+ }
+
+ @Override
public void deleteWorkOrderProcessByWorkOrderId(Long workOrderId) {
workOrderProcessMapper.deleteByWorkOrderId(workOrderId);
}
@@ -120,11 +161,15 @@
if (CollUtil.isEmpty(routeProcessList)) {
return Collections.emptyList();
}
+ // 宸ヨ壓璺嚎浜у搧涓婇厤缃殑鎶ュ伐浠撳簱浣滀负宸ュ簭榛樿鍊硷紝涓嬪崟鏃跺彲鍐嶄慨鏀�
+ MesProRouteProductDO routeProduct = routeProductService.getRouteProductByItemId(productId);
// 杞崲涓哄伐鍗曞伐搴� DO锛堜笉璁剧疆 workOrderId锛屽墠绔繚瀛樻椂鍐嶈缃級
List<MesProWorkOrderProcessDO> processList = new ArrayList<>(routeProcessList.size());
for (MesProRouteProcessDO routeProcess : routeProcessList) {
processList.add(MesProWorkOrderProcessDO.builder()
.processId(routeProcess.getProcessId())
+ .paramTemplateId(routeProcess.getParamTemplateId())
+ .yieldRate(routeProcess.getYieldRate())
.sort(routeProcess.getSort())
.nextProcessId(routeProcess.getNextProcessId())
.linkType(routeProcess.getLinkType())
@@ -135,6 +180,9 @@
.checkFlag(routeProcess.getCheckFlag())
.backflushFlag(routeProcess.getBackflushFlag())
.outputItemId(routeProcess.getOutputItemId())
+ .warehouseId(routeProduct != null ? routeProduct.getWarehouseId() : null)
+ .locationId(routeProduct != null ? routeProduct.getLocationId() : null)
+ .areaId(routeProduct != null ? routeProduct.getAreaId() : null)
.remark(routeProcess.getRemark())
.build());
}
@@ -175,11 +223,20 @@
if (item.getId() == null) {
// 鏂板
MesProWorkOrderProcessDO process = BeanUtils.toBean(item, MesProWorkOrderProcessDO.class);
+ if (CollUtil.isNotEmpty(item.getOutputItemIds())) {
+ process.setOutputItemId(item.getOutputItemIds().stream().map(String::valueOf).collect(Collectors.joining(",")));
+ }
workOrderProcessMapper.insert(process);
} else {
// 鏇存柊
MesProWorkOrderProcessDO updateObj = BeanUtils.toBean(item, MesProWorkOrderProcessDO.class);
+ if (CollUtil.isNotEmpty(item.getOutputItemIds())) {
+ updateObj.setOutputItemId(item.getOutputItemIds().stream().map(String::valueOf).collect(Collectors.joining(",")));
+ }
workOrderProcessMapper.updateById(updateObj);
+ // 鎶ュ伐浠撳簱鍏佽缃┖锛屽崟鐙洿鏂�
+ workOrderProcessMapper.updateWarehouseById(item.getId(), item.getWarehouseId(),
+ item.getLocationId(), item.getAreaId());
}
}
@@ -191,32 +248,27 @@
}
/**
- * 浠庡伐搴忓垪琛ㄤ腑鎻愬彇 BOM 鎶曟枡锛屽悎骞跺幓閲嶅悗淇濆瓨鍒板伐鍗� BOM 琛�
+ * 浠庡伐搴忓垪琛ㄤ腑鎻愬彇 BOM 鎶曟枡锛屾寜宸ュ簭鍒嗗埆淇濆瓨鍒板伐鍗� BOM 琛�
*/
private void saveWorkOrderBomFromProcesses(Long workOrderId, List<MesProWorkOrderProcessSaveReqVO> list) {
- // 鏀堕泦鎵�鏈夊伐搴忕殑 bomItems锛屾寜 itemId 鍘婚噸锛堜繚鐣欑涓�涓嚭鐜扮殑 quantity锛�
- java.util.Map<Long, MesProWorkOrderProcessSaveReqVO.BomItem> merged = new java.util.LinkedHashMap<>();
+ workOrderBomService.deleteWorkOrderBomByWorkOrderId(workOrderId);
+ List<MesProWorkOrderBomDO> bomList = new ArrayList<>();
for (MesProWorkOrderProcessSaveReqVO item : list) {
if (CollUtil.isNotEmpty(item.getBomItems())) {
for (MesProWorkOrderProcessSaveReqVO.BomItem bomItem : item.getBomItems()) {
if (bomItem.getItemId() != null) {
- merged.putIfAbsent(bomItem.getItemId(), bomItem);
+ bomList.add(MesProWorkOrderBomDO.builder()
+ .workOrderId(workOrderId)
+ .processId(item.getProcessId())
+ .itemId(bomItem.getItemId())
+ .quantity(bomItem.getQuantity())
+ .remark(bomItem.getRemark())
+ .build());
}
}
}
}
- // 鍒犻櫎鏃� BOM锛屾壒閲忔彃鍏ユ柊 BOM
- workOrderBomService.deleteWorkOrderBomByWorkOrderId(workOrderId);
- if (CollUtil.isNotEmpty(merged)) {
- List<MesProWorkOrderBomDO> bomList = new ArrayList<>(merged.size());
- for (MesProWorkOrderProcessSaveReqVO.BomItem bomItem : merged.values()) {
- bomList.add(MesProWorkOrderBomDO.builder()
- .workOrderId(workOrderId)
- .itemId(bomItem.getItemId())
- .quantity(bomItem.getQuantity())
- .remark(bomItem.getRemark())
- .build());
- }
+ if (CollUtil.isNotEmpty(bomList)) {
workOrderBomMapper.insertBatch(bomList);
}
}
@@ -250,7 +302,12 @@
throw exception(PRO_WORK_ORDER_PROCESS_DUPLICATE);
}
}
- // 4. 鏍¢獙鍏抽敭宸ュ簭鍞竴
+ // 4. 鏍¢獙鎶ュ伐浠撳簱灞傜骇锛堜粨搴�/搴撳尯/搴撲綅鍚屾椂濉啓鏃舵牎楠屽綊灞炲叧绯伙級
+ if (reqVO.getWarehouseId() != null && reqVO.getLocationId() != null && reqVO.getAreaId() != null) {
+ warehouseAreaService.validateWarehouseAreaExists(reqVO.getWarehouseId(),
+ reqVO.getLocationId(), reqVO.getAreaId());
+ }
+ // 5. 鏍¢獙鍏抽敭宸ュ簭鍞竴
if (Boolean.TRUE.equals(reqVO.getKeyFlag())) {
for (MesProWorkOrderProcessDO process : list) {
if (reqVO.getId() != null && reqVO.getId().equals(process.getId())) {
--
Gitblit v1.9.3