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