From cdf5605fb5caa0da0f134893bac350785250ea8a Mon Sep 17 00:00:00 2001
From: liu <2021943741@qq.com>
Date: 星期四, 27 八月 2026 11:21:19 +0800
Subject: [PATCH] feat(mes): 基础参数与工序绑定,报工填写绑定的参数字段
---
yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/service/pro/task/MesProTaskServiceImpl.java | 88 +++++++++++++++++++++++++++++++++++++++++++
1 files changed, 87 insertions(+), 1 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 d6ebc52..71194e3 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
@@ -12,6 +12,7 @@
import cn.iocoder.yudao.module.mes.dal.dataobject.md.unitmeasure.MesMdUnitMeasureDO;
import cn.iocoder.yudao.module.mes.dal.dataobject.md.workstation.MesMdWorkstationMachineDO;
import cn.iocoder.yudao.module.mes.dal.dataobject.pro.task.MesProTaskDO;
+import cn.iocoder.yudao.module.mes.dal.dataobject.pro.process.MesProProcessParamDO;
import cn.iocoder.yudao.module.mes.dal.dataobject.pro.workorder.MesProWorkOrderDO;
import cn.iocoder.yudao.module.mes.dal.mysql.pro.task.MesProTaskMapper;
import cn.iocoder.yudao.module.mes.dal.mysql.pro.feedback.MesProFeedbackMapper;
@@ -24,6 +25,7 @@
import cn.iocoder.yudao.module.mes.service.md.workstation.MesMdWorkstationMachineService;
import cn.iocoder.yudao.module.mes.service.md.workstation.MesMdWorkstationService;
import cn.iocoder.yudao.module.mes.service.pro.process.MesProProcessService;
+import cn.iocoder.yudao.module.mes.service.pro.process.MesProProcessParamService;
import cn.iocoder.yudao.module.mes.dal.dataobject.pro.route.MesProRouteProcessDO;
import cn.iocoder.yudao.module.mes.dal.dataobject.pro.route.MesProRouteDO;
import cn.iocoder.yudao.module.mes.dal.dataobject.pro.route.MesProRouteProductDO;
@@ -33,6 +35,7 @@
import cn.iocoder.yudao.module.mes.service.pro.workorder.MesProWorkOrderService;
import cn.iocoder.yudao.module.mes.dal.dataobject.pro.workorder.MesProWorkOrderProcessDO;
import cn.iocoder.yudao.module.mes.service.pro.workorder.MesProWorkOrderProcessService;
+import cn.iocoder.yudao.module.mes.service.pro.workorder.MesProWorkOrderParamRecordService;
import jakarta.annotation.Resource;
import org.springframework.context.annotation.Lazy;
import org.springframework.stereotype.Service;
@@ -58,6 +61,8 @@
import cn.iocoder.yudao.framework.common.util.object.ObjectUtils;
import cn.iocoder.yudao.module.mes.dal.dataobject.pro.task.MesProTaskPauseRecordDO;
import cn.iocoder.yudao.module.mes.dal.mysql.pro.task.MesProTaskPauseRecordMapper;
+import cn.iocoder.yudao.module.mes.dal.dataobject.pro.task.MesProTaskAssigneeDO;
+import cn.iocoder.yudao.module.mes.dal.mysql.pro.task.MesProTaskAssigneeMapper;
import cn.iocoder.yudao.module.mes.controller.admin.pro.task.vo.MesProTaskPauseReqVO;
import cn.iocoder.yudao.module.mes.controller.admin.pro.task.vo.MesProTaskResumeReqVO;
@@ -78,6 +83,9 @@
@Resource
private MesProTaskPauseRecordMapper taskPauseRecordMapper;
+
+ @Resource
+ private MesProTaskAssigneeMapper taskAssigneeMapper;
@Resource
@Lazy
@@ -101,6 +109,12 @@
@Resource
@Lazy
private MesProWorkOrderProcessService workOrderProcessService;
+ @Resource
+ @Lazy
+ private MesProWorkOrderParamRecordService workOrderParamRecordService;
+ @Resource
+ @Lazy
+ private MesProProcessParamService processParamService;
@Resource
private MesMdAutoCodeRecordService autoCodeRecordService;
@Resource
@@ -141,7 +155,28 @@
}
// 2.2 鎻掑叆
taskMapper.insert(task);
+ // 2.2.1 鍙傛暟蹇収锛氫紭鍏堜娇鐢ㄦā鏉匡紱鏃犳ā鏉挎椂鍥為��鍒板伐搴忎富鏁版嵁缁戝畾鐨勫伐鑹哄弬鏁�
+ createTaskParamRecordWithFallback(task);
+
+ // 2.3 淇濆瓨鎸囧畾鎶ュ伐浜哄憳
+ updateTaskAssignees(task.getId(), createReqVO.getAssigneeUserIds());
+
return task.getId();
+ }
+
+ /**
+ * 涓轰换鍔″浐鍖栧弬鏁板揩鐓э細浼樺厛浣跨敤璺嚎/宸ュ崟宸ュ簭缁戝畾鐨勫弬鏁版ā鏉匡紱鏃犳ā鏉挎椂鍥為��鍒板伐搴忎富鏁版嵁缁戝畾鐨勫伐鑹哄弬鏁�
+ */
+ private void createTaskParamRecordWithFallback(MesProTaskDO task) {
+ if (task.getParamTemplateId() != null) {
+ workOrderParamRecordService.createTaskParamRecord(task.getId(), task.getParamTemplateId());
+ return;
+ }
+ // 鏃犳ā鏉匡細浠庡伐搴忎富鏁版嵁瑙f瀽缁戝畾鐨勫伐鑹哄弬鏁�
+ List<MesProProcessParamDO> processParams = processParamService.getProcessParamListByProcessId(task.getProcessId());
+ if (CollUtil.isNotEmpty(processParams)) {
+ workOrderParamRecordService.createTaskParamRecordFromProcessParams(task.getId(), processParams);
+ }
}
@Override
@@ -173,6 +208,34 @@
MesProTaskDO updateObj = BeanUtils.toBean(updateReqVO, MesProTaskDO.class)
.setName(buildTaskName(item, quantity));
taskMapper.updateById(updateObj);
+
+ // 3. 鏇存柊鎸囧畾鎶ュ伐浜哄憳锛堟瘮瀵规洿鏂帮級
+ updateTaskAssignees(task.getId(), updateReqVO.getAssigneeUserIds());
+ }
+
+ private void updateTaskAssignees(Long taskId, List<Long> assigneeUserIds) {
+ if (assigneeUserIds == null) {
+ assigneeUserIds = Collections.emptyList();
+ }
+ // 1. 鏌ヨ鏁版嵁搴撲腑鍘熸湁鐨�
+ List<MesProTaskAssigneeDO> oldAssignees = taskAssigneeMapper.selectListByTaskId(taskId);
+ Set<Long> oldUserIds = convertSet(oldAssignees, MesProTaskAssigneeDO::getUserId);
+ Set<Long> newUserIds = new java.util.HashSet<>(assigneeUserIds);
+
+ // 2. 璁$畻闇�瑕佹柊澧炵殑鍜岄渶瑕佸垹闄ょ殑
+ Set<Long> toAddUserIds = newUserIds.stream().filter(id -> !oldUserIds.contains(id)).collect(java.util.stream.Collectors.toSet());
+ Set<Long> toRemoveUserIds = oldUserIds.stream().filter(id -> !newUserIds.contains(id)).collect(java.util.stream.Collectors.toSet());
+
+ // 3. 鏂板
+ if (CollUtil.isNotEmpty(toAddUserIds)) {
+ List<MesProTaskAssigneeDO> addList = convertList(toAddUserIds, userId -> new MesProTaskAssigneeDO().setTaskId(taskId).setUserId(userId));
+ taskAssigneeMapper.insertBatch(addList);
+ }
+
+ // 4. 鍒犻櫎
+ if (CollUtil.isNotEmpty(toRemoveUserIds)) {
+ taskAssigneeMapper.deleteByTaskIdAndUserIds(taskId, toRemoveUserIds);
+ }
}
/**
@@ -220,6 +283,7 @@
result.add(new MesProRouteProcessDO()
.setRouteId(routeId)
.setProcessId(wp.getProcessId())
+ .setParamTemplateId(wp.getParamTemplateId())
.setSort(wp.getSort())
.setKeyFlag(wp.getKeyFlag())
.setCheckFlag(wp.getCheckFlag())
@@ -245,8 +309,10 @@
if (feedbackMapper.selectCountByTaskId(id) > 0) {
throw exception(PRO_TASK_HAS_FEEDBACK);
}
- // 3. 鍒犻櫎
+ // 3. 鍒犻櫎浠诲姟涓昏〃
taskMapper.deleteById(id);
+ // 4. 鍒犻櫎鍏宠仈鐨勪汉鍛�
+ taskAssigneeMapper.deleteByTaskId(id);
}
@Override
@@ -270,6 +336,14 @@
return Collections.emptyList();
}
return taskMapper.selectListByWorkOrderIds(workOrderIds);
+ }
+
+ @Override
+ public List<MesProTaskAssigneeDO> getTaskAssigneeListByTaskIds(Collection<Long> taskIds) {
+ if (CollUtil.isEmpty(taskIds)) {
+ return Collections.emptyList();
+ }
+ return taskAssigneeMapper.selectListByTaskIds(taskIds);
}
@Override
@@ -337,6 +411,15 @@
validateTaskExists(id);
// 鏇存柊鏁伴噺
taskMapper.updateProducedQuantity(id, incrProducedQuantity, incrQualifyQuantity, incrUnqualifyQuantity);
+ MesProTaskDO task = taskMapper.selectById(id);
+ if (task != null) {
+ LocalDateTime now = LocalDateTime.now();
+ MesProTaskDO timeUpdate = new MesProTaskDO().setId(id).setLastFeedbackTime(now);
+ if (task.getFirstFeedbackTime() == null) {
+ timeUpdate.setFirstFeedbackTime(now);
+ }
+ taskMapper.updateById(timeUpdate);
+ }
}
@Override
@@ -430,9 +513,12 @@
.setName(buildTaskName(item, workOrder.getQuantity()))
.setCode(autoCodeRecordService.generateAutoCode(MesMdAutoCodeRuleCodeEnum.PRO_TASK_CODE.getCode()))
.setStatus(MesProTaskStatusEnum.PREPARE.getStatus())
+ .setParamTemplateId(rp.getParamTemplateId())
.setClientId(workOrder.getClientId())
.setColorCode(rp.getColorCode());
taskMapper.insert(task);
+ // 鍙傛暟蹇収锛氫紭鍏堜娇鐢ㄦā鏉匡紱鏃犳ā鏉挎椂鍥為��鍒板伐搴忎富鏁版嵁缁戝畾鐨勫伐鑹哄弬鏁�
+ createTaskParamRecordWithFallback(task);
taskIds.add(task.getId());
}
// 7. 鏇存柊宸ュ崟宸叉帓浜ф暟閲�
--
Gitblit v1.9.3