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/workorder/MesProWorkOrderParamRecordServiceImpl.java | 130 +++++++++++++++++++++++++++++++++++++++++++
1 files changed, 130 insertions(+), 0 deletions(-)
diff --git a/yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/service/pro/workorder/MesProWorkOrderParamRecordServiceImpl.java b/yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/service/pro/workorder/MesProWorkOrderParamRecordServiceImpl.java
index c202af7..56bacbf 100644
--- a/yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/service/pro/workorder/MesProWorkOrderParamRecordServiceImpl.java
+++ b/yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/service/pro/workorder/MesProWorkOrderParamRecordServiceImpl.java
@@ -5,14 +5,17 @@
import cn.iocoder.yudao.framework.common.util.object.BeanUtils;
import cn.iocoder.yudao.module.mes.controller.admin.pro.workorder.vo.paramrecord.MesProWorkOrderParamRecordPageReqVO;
import cn.iocoder.yudao.module.mes.controller.admin.pro.workorder.vo.paramrecord.MesProWorkOrderParamRecordSaveReqVO;
+import cn.iocoder.yudao.module.mes.dal.dataobject.pd.processparam.MesPdProcessParamDO;
import cn.iocoder.yudao.module.mes.dal.dataobject.pd.processparamtemplate.MesPdProcessParamTemplateDetailDO;
import cn.iocoder.yudao.module.mes.dal.dataobject.pd.processparamtemplate.MesPdProcessParamTemplateDO;
+import cn.iocoder.yudao.module.mes.dal.dataobject.pro.process.MesProProcessParamDO;
import cn.iocoder.yudao.module.mes.dal.dataobject.pro.task.MesProTaskDO;
import cn.iocoder.yudao.module.mes.dal.dataobject.pro.workorder.MesProWorkOrderDO;
import cn.iocoder.yudao.module.mes.dal.dataobject.pro.workorder.MesProWorkOrderParamRecordDO;
import cn.iocoder.yudao.module.mes.dal.dataobject.pro.workorder.MesProWorkOrderParamRecordDetailDO;
import cn.iocoder.yudao.module.mes.dal.mysql.pro.workorder.MesProWorkOrderParamRecordDetailMapper;
import cn.iocoder.yudao.module.mes.dal.mysql.pro.workorder.MesProWorkOrderParamRecordMapper;
+import cn.iocoder.yudao.module.mes.service.pd.processparam.MesPdProcessParamService;
import cn.iocoder.yudao.module.mes.service.pd.processparamtemplate.MesPdProcessParamTemplateService;
import cn.iocoder.yudao.module.mes.service.pro.task.MesProTaskService;
import cn.iocoder.yudao.module.mes.service.pro.workorder.MesProWorkOrderService;
@@ -22,6 +25,7 @@
import org.springframework.transaction.annotation.Transactional;
import org.springframework.validation.annotation.Validated;
+import java.util.HashMap;
import java.util.List;
import java.util.Map;
import java.util.stream.Collectors;
@@ -46,10 +50,95 @@
private MesProWorkOrderService workOrderService;
@Resource
private MesPdProcessParamTemplateService templateService;
+ @Resource
+ private MesPdProcessParamService pdProcessParamService;
@Autowired
private MesProTaskService mesProTaskService;
@Autowired
private MesProWorkOrderService mesProWorkOrderService;
+
+ @Override
+ @Transactional(rollbackFor = Exception.class)
+ public Long createTaskParamRecord(Long taskId, Long templateId) {
+ MesProTaskDO task = mesProTaskService.getTask(taskId);
+ if (task == null || templateId == null) {
+ return null;
+ }
+ MesProWorkOrderDO workOrder = mesProWorkOrderService.getWorkOrder(task.getWorkOrderId());
+ MesPdProcessParamTemplateDO template = templateService.validateProcessParamTemplateExists(templateId);
+ List<MesPdProcessParamTemplateDetailDO> details = templateService.getProcessParamTemplateDetailListByTemplateId(templateId);
+ if (CollUtil.isEmpty(details)) {
+ throw exception(PRO_WORK_ORDER_PARAM_RECORD_TEMPLATE_NO_DETAIL);
+ }
+ MesProWorkOrderParamRecordDO record = MesProWorkOrderParamRecordDO.builder()
+ .workOrderId(workOrder != null ? workOrder.getId() : task.getWorkOrderId())
+ .taskId(taskId)
+ .templateId(template.getId())
+ .templateCode(template.getTemplateCode())
+ .templateName(template.getTemplateName())
+ .recordNo("TASK-" + taskId)
+ .remark("鐢熶骇浠诲姟鎺掍骇鏃剁敓鎴愮殑鍙傛暟蹇収")
+ .build();
+ paramRecordMapper.insert(record);
+ paramRecordDetailMapper.insertBatch(details.stream().map(detail -> MesProWorkOrderParamRecordDetailDO.builder()
+ .recordId(record.getId())
+ .templateDetailId(detail.getId())
+ .paramCode(detail.getParamCode())
+ .paramName(detail.getParamName())
+ .paramType(detail.getParamType())
+ .required(detail.getRequired())
+ .unitMeasureId(detail.getUnitMeasureId())
+ .paramValue(null)
+ .remark(detail.getRemark())
+ .build()).toList());
+ return record.getId();
+ }
+
+ @Override
+ @Transactional(rollbackFor = Exception.class)
+ public Long createTaskParamRecordFromProcessParams(Long taskId, List<MesProProcessParamDO> processParams) {
+ MesProTaskDO task = mesProTaskService.getTask(taskId);
+ if (task == null || CollUtil.isEmpty(processParams)) {
+ return null;
+ }
+ // 1. 鎵归噺鑾峰彇宸ヨ壓鍙傛暟瀹氫箟锛岃繃婊ゅ凡鍒犻櫎鐨勫弬鏁�
+ Map<Long, MesPdProcessParamDO> paramMap = pdProcessParamService.getProcessParamMap(
+ processParams.stream().map(MesProProcessParamDO::getProcessParamId).collect(Collectors.toSet()));
+ List<MesProProcessParamDO> valid = processParams.stream()
+ .filter(pp -> paramMap.containsKey(pp.getProcessParamId()))
+ .toList();
+ if (CollUtil.isEmpty(valid)) {
+ return null;
+ }
+ // 2. 鎻掑叆涓昏〃锛堟棤妯℃澘锛宼emplate 鐩稿叧瀛楁涓虹┖锛�
+ MesProWorkOrderDO workOrder = mesProWorkOrderService.getWorkOrder(task.getWorkOrderId());
+ MesProWorkOrderParamRecordDO record = MesProWorkOrderParamRecordDO.builder()
+ .workOrderId(workOrder != null ? workOrder.getId() : task.getWorkOrderId())
+ .taskId(taskId)
+ .templateId(null)
+ .templateCode(null)
+ .templateName("宸ュ簭缁戝畾鍙傛暟")
+ .recordNo("TASK-" + taskId)
+ .remark("鐢熶骇浠诲姟鎸夊伐搴忕粦瀹氬弬鏁扮敓鎴愮殑鍙傛暟蹇収")
+ .build();
+ paramRecordMapper.insert(record);
+ // 3. 鎻掑叆鏄庣粏锛堝揩鐓у弬鏁板畾涔夛紝required 浼樺厛鍙栫粦瀹氬�硷紝鍏舵鍙栧弬鏁伴粯璁ゅ�硷級
+ paramRecordDetailMapper.insertBatch(valid.stream().map(pp -> {
+ MesPdProcessParamDO param = paramMap.get(pp.getProcessParamId());
+ return MesProWorkOrderParamRecordDetailDO.builder()
+ .recordId(record.getId())
+ .templateDetailId(null)
+ .paramCode(param.getParamCode())
+ .paramName(param.getParamName())
+ .paramType(param.getParamType())
+ .required(pp.getRequired() != null ? pp.getRequired() : param.getRequired())
+ .unitMeasureId(param.getUnitMeasureId())
+ .paramValue(null)
+ .remark(pp.getRemark())
+ .build();
+ }).toList());
+ return record.getId();
+ }
@Override
@Transactional(rollbackFor = Exception.class)
@@ -103,6 +192,7 @@
.paramCode(templateDetail.getParamCode())
.paramName(templateDetail.getParamName())
.paramType(templateDetail.getParamType())
+ .required(templateDetail.getRequired())
.unitMeasureId(templateDetail.getUnitMeasureId())
.paramValue(item.getParamValue())
.build();
@@ -158,6 +248,7 @@
.paramCode(templateDetail.getParamCode())
.paramName(templateDetail.getParamName())
.paramType(templateDetail.getParamType())
+ .required(templateDetail.getRequired())
.unitMeasureId(templateDetail.getUnitMeasureId())
.paramValue(item.getParamValue())
.build();
@@ -191,6 +282,45 @@
return paramRecordMapper.selectListByWorkOrderId(workOrderId);
}
+ @Override
+ @Transactional(rollbackFor = Exception.class)
+ public void updateTaskParamValues(Long taskId, List<Long> detailIds, List<String> values) {
+ MesProWorkOrderParamRecordDO record = paramRecordMapper.selectFirstByTaskId(taskId);
+ if (record == null) {
+ return; // 浠诲姟鏃犲弬鏁拌褰曪紙鏈粦瀹氬弬鏁帮級锛屾棤闇�鏍¢獙
+ }
+ List<MesProWorkOrderParamRecordDetailDO> details = paramRecordDetailMapper.selectListByRecordId(record.getId());
+ if (CollUtil.isEmpty(details)) {
+ return;
+ }
+ // 1. 鏋勫缓鎻愪氦鏄庣粏鏄犲皠锛坉etailId -> 鍙傛暟鍊硷級
+ Map<Long, String> valueMap = new HashMap<>();
+ if (CollUtil.isNotEmpty(detailIds)) {
+ for (int i = 0; i < detailIds.size(); i++) {
+ valueMap.put(detailIds.get(i), values != null && values.size() > i ? values.get(i) : null);
+ }
+ }
+ // 2. 鏍¢獙蹇呭~鍙傛暟閮芥湁鍊硷紙缁戝畾鍙傛暟鎴栨ā鏉垮揩鐓т腑鐨� required锛�
+ Map<Long, MesProWorkOrderParamRecordDetailDO> detailMap = details.stream()
+ .collect(Collectors.toMap(MesProWorkOrderParamRecordDetailDO::getId, d -> d));
+ for (MesProWorkOrderParamRecordDetailDO detail : details) {
+ String value = valueMap.get(detail.getId());
+ if (Boolean.TRUE.equals(detail.getRequired())
+ && (value == null || value.isBlank())) {
+ throw exception(PRO_WORK_ORDER_PARAM_RECORD_REQUIRED_PARAM_MISSING, detail.getParamName());
+ }
+ }
+ // 3. 鏇存柊鎻愪氦鐨勫弬鏁板��
+ for (Map.Entry<Long, String> entry : valueMap.entrySet()) {
+ MesProWorkOrderParamRecordDetailDO detail = detailMap.get(entry.getKey());
+ if (detail == null) {
+ throw exception(PRO_WORK_ORDER_PARAM_RECORD_DETAIL_NOT_IN_TEMPLATE);
+ }
+ detail.setParamValue(entry.getValue());
+ paramRecordDetailMapper.updateById(detail);
+ }
+ }
+
// ==================== 鏍¢獙鏂规硶 ====================
private MesProWorkOrderParamRecordDO validateParamRecordExists(Long id) {
--
Gitblit v1.9.3