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/task/MesProTaskServiceImpl.java | 47 +++++++++++++++++++++++++++++++++++++++--------
1 files changed, 39 insertions(+), 8 deletions(-)
diff --git a/yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/service/pro/task/MesProTaskServiceImpl.java b/yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/service/pro/task/MesProTaskServiceImpl.java
index 087ce58..bc9586d 100644
--- a/yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/service/pro/task/MesProTaskServiceImpl.java
+++ b/yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/service/pro/task/MesProTaskServiceImpl.java
@@ -76,6 +76,9 @@
public class MesProTaskServiceImpl implements MesProTaskService {
@Resource
+ private cn.iocoder.yudao.module.mes.service.pro.feedback.MesProFeedbackEquipmentService equipmentService;
+
+ @Resource
private cn.iocoder.yudao.module.mes.service.pro.task.schedule.MesProScheduleGuardService scheduleGuard;
@Resource
@@ -147,11 +150,7 @@
if (itemId == null) {
MesProRouteProcessDO routeProcess = routeProcessService
.getRouteProcessByRouteIdAndProcessId(createReqVO.getRouteId(), createReqVO.getProcessId());
- if (routeProcess != null && routeProcess.getOutputItemId() != null) {
- itemId = Long.valueOf(routeProcess.getOutputItemId().split(",")[0].trim());
- } else {
- itemId = workOrder.getProductId();
- }
+ itemId = resolveTaskItemId(routeProcess, workOrder.getProductId());
}
MesMdItemDO item = itemService.validateItemExists(itemId);
@@ -349,6 +348,25 @@
return routeProcesses;
}
+ /** 褰撳墠浜у搧鐨勪换鍔′骇鍑猴紝浼樺厛浣跨敤宸ュ簭鐨勪骇鍝佸綊灞為厤缃�� */
+ private Long resolveTaskItemId(MesProRouteProcessDO routeProcess, Long productId) {
+ if (routeProcess == null) {
+ return productId;
+ }
+ if (routeProcess.getId() != null) {
+ List<Long> outputIds = routeProcessService
+ .getOutputItemIdsByRouteProcessId(routeProcess.getId(), productId);
+ if (outputIds != null) {
+ return CollUtil.isNotEmpty(outputIds) ? outputIds.get(0) : productId;
+ }
+ }
+ String outputItemId = routeProcess.getOutputItemId();
+ if (outputItemId != null && !outputItemId.isBlank()) {
+ return Long.valueOf(outputItemId.split(",")[0].trim());
+ }
+ return productId;
+ }
+
@Override
@Transactional(rollbackFor = Exception.class)
public void deleteTask(Long id) {
@@ -424,7 +442,9 @@
}
@Override
+ @Transactional(rollbackFor = Exception.class)
public void finishTaskByOrderId(Long workOrderId) {
+ equipmentService.lock();
// 1. 璇诲彇宸ュ崟涓嬫墍鏈変换鍔★紝杩囨护鎺夊凡瀹屾垚/宸插彇娑堢殑
List<MesProTaskDO> tasks = taskMapper.selectListByWorkOrderId(workOrderId);
LocalDateTime now = LocalDateTime.now();
@@ -436,10 +456,13 @@
if (CollUtil.isNotEmpty(updateList)) {
taskMapper.updateBatch(updateList);
}
+ equipmentService.afterTaskStateChanged(tasks);
}
@Override
+ @Transactional(rollbackFor = Exception.class)
public void cancelTaskByOrderId(Long workOrderId) {
+ equipmentService.lock();
// 1. 璇诲彇宸ュ崟涓嬫墍鏈変换鍔★紝杩囨护鎺夊凡瀹屾垚/宸插彇娑堢殑
List<MesProTaskDO> tasks = taskMapper.selectListByWorkOrderId(workOrderId);
LocalDateTime now = LocalDateTime.now();
@@ -451,6 +474,7 @@
if (CollUtil.isNotEmpty(updateList)) {
taskMapper.updateBatch(updateList);
}
+ equipmentService.afterTaskStateChanged(tasks);
}
@Override
@@ -554,7 +578,7 @@
List<Long> taskIds = new java.util.ArrayList<>();
for (MesProRouteProcessDO rp : routeProcesses) {
cn.iocoder.yudao.module.mes.dal.dataobject.pro.process.MesProProcessDO proc = procMap.get(rp.getProcessId());
- Long itemId = rp.getOutputItemId() != null ? Long.valueOf(rp.getOutputItemId().split(",")[0].trim()) : workOrder.getProductId();
+ Long itemId = resolveTaskItemId(rp, workOrder.getProductId());
cn.iocoder.yudao.module.mes.dal.dataobject.md.item.MesMdItemDO item = itemService.validateItemExists(itemId);
MesProTaskDO task = new MesProTaskDO()
.setWorkOrderId(workOrder.getId())
@@ -582,10 +606,12 @@
@Override
@Transactional(rollbackFor = Exception.class)
public void pauseTask(MesProTaskPauseReqVO pauseReqVO) {
+ equipmentService.lock();
// 1. 鏍¢獙浠诲姟瀛樺湪
MesProTaskDO task = validateTaskExists(pauseReqVO.getId());
// 2. 鏍¢獙鐘舵�佹槸鍚﹀厑璁稿仠宸ワ紙濡傚繀椤绘槸 鐢熶骇涓� 鎴� 閮ㄥ垎瀹屾垚锛�
- if (!ObjectUtils.equalsAny(task.getStatus(), MesProTaskStatusEnum.PREPARE.getStatus())) {
+ if (!ObjectUtils.equalsAny(task.getStatus(), MesProTaskStatusEnum.PREPARE.getStatus(),
+ MesProTaskStatusEnum.PRODUCING.getStatus(), MesProTaskStatusEnum.PARTIAL_FINISHED.getStatus())) {
throw exception(PRO_TASK_CANNOT_PAUSE);
}
@@ -602,11 +628,13 @@
.setPauseTime(LocalDateTime.now())
.setPauseUserId(SecurityFrameworkUtils.getLoginUserId());
taskPauseRecordMapper.insert(pauseRecord);
+ equipmentService.afterTaskStateChanged(List.of(task));
}
@Override
@Transactional(rollbackFor = Exception.class)
public void resumeTask(MesProTaskResumeReqVO resumeReqVO) {
+ equipmentService.lock();
// 1. 鏍¢獙浠诲姟瀛樺湪
MesProTaskDO task = validateTaskExists(resumeReqVO.getId());
// 2. 鏍¢獙鐘舵�佸繀椤绘槸宸插仠宸�
@@ -615,8 +643,11 @@
}
// 3. 鎭㈠浠诲姟鐘舵��
- Integer resumeStatus = MesProTaskStatusEnum.PREPARE.getStatus();
+ Integer resumeStatus = task.getProducedQuantity() != null && task.getProducedQuantity().signum() > 0
+ ? MesProTaskStatusEnum.PARTIAL_FINISHED.getStatus() : MesProTaskStatusEnum.PREPARE.getStatus();
taskMapper.updateById(new MesProTaskDO().setId(task.getId()).setStatus(resumeStatus));
+ equipmentService.validateResume(task);
+ equipmentService.afterTaskStateChanged(List.of(task));
// 4. 鏇存柊鏈�鏂扮殑涓�鏉″仠宸ヨ褰�
MesProTaskPauseRecordDO pauseRecord = taskPauseRecordMapper.selectLastUnresumedByTaskId(task.getId());
--
Gitblit v1.9.3