From 20d92d7153428d6509bbd14eb8df53d621affb47 Mon Sep 17 00:00:00 2001 From: zjh <15615273395@163.com> Date: Tue, 24 Feb 2026 08:40:35 +0800 Subject: [PATCH] =?UTF-8?q?=E4=B8=8A=E7=BA=BF=E7=89=88=E6=9C=AC6.0?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../self_development/MainApplication.java | 3 +- .../EngineParamDetailController.java | 22 ++ .../controller/TemplateController.java | 2 +- .../domain/dto/EngineDeptUpdateDTO.java | 17 ++ .../domain/dto/EngineDeptUpdateItem.java | 13 + .../view/AnalysisModelParamterView.java | 4 + .../job/ParameterValueCalculationTimer.java | 257 +++++++++++------- .../listener/PersonReadListener.java | 2 +- .../listener/SheetDataListener.java | 4 +- .../service/EngineParamDetailService.java | 4 + .../impl/ActivitiProcessServiceImpl.java | 11 +- .../impl/BenchmarkingReportServiceImpl.java | 12 +- .../impl/DataEntryEngineModelServiceImpl.java | 4 +- .../impl/EngineParamDetailServiceImpl.java | 56 +++- .../impl/ResponsiblePersonServiceImpl.java | 4 +- .../service/impl/TcDataQueryServiceImpl.java | 4 +- .../impl/TemplateApprovalServiceImpl.java | 8 +- .../service/impl/TemplateServiceImpl.java | 8 + .../service/impl/TodoTaskServiceImpl.java | 1 - src/main/resources/application.properties | 4 +- 20 files changed, 305 insertions(+), 135 deletions(-) create mode 100644 src/main/java/com/xdap/self_development/domain/dto/EngineDeptUpdateDTO.java create mode 100644 src/main/java/com/xdap/self_development/domain/dto/EngineDeptUpdateItem.java diff --git a/src/main/java/com/xdap/self_development/MainApplication.java b/src/main/java/com/xdap/self_development/MainApplication.java index 96846d3..bb22ea1 100644 --- a/src/main/java/com/xdap/self_development/MainApplication.java +++ b/src/main/java/com/xdap/self_development/MainApplication.java @@ -1,5 +1,6 @@ package com.xdap.self_development; +import com.github.kfcfans.powerjob.worker.autoconfigure.PowerJobAutoConfiguration; import org.springframework.boot.SpringApplication; import org.springframework.boot.autoconfigure.SpringBootApplication; import org.springframework.boot.autoconfigure.mongo.embedded.EmbeddedMongoAutoConfiguration; @@ -10,7 +11,7 @@ import org.springframework.transaction.annotation.EnableTransactionManagement; @EnableCaching @SpringBootApplication( - exclude = {EmbeddedMongoAutoConfiguration.class} + exclude = {EmbeddedMongoAutoConfiguration.class, PowerJobAutoConfiguration.class} ) @EnableTransactionManagement @EnableScheduling diff --git a/src/main/java/com/xdap/self_development/controller/EngineParamDetailController.java b/src/main/java/com/xdap/self_development/controller/EngineParamDetailController.java index 8a34fcb..e0ff263 100644 --- a/src/main/java/com/xdap/self_development/controller/EngineParamDetailController.java +++ b/src/main/java/com/xdap/self_development/controller/EngineParamDetailController.java @@ -4,14 +4,18 @@ package com.xdap.self_development.controller; import com.definesys.mpaas.common.http.Response; import com.xdap.api.moudle.user.pojo.XdapUsers; import com.xdap.self_development.controller.request.EngineParamDetailRequest; +import com.xdap.self_development.domain.dto.EngineDeptUpdateDTO; import com.xdap.self_development.domain.dto.EngineParamDetailDTO; import com.xdap.self_development.domain.pojo.EngineParamDetailPojo; +import com.xdap.self_development.exception.CommonException; import com.xdap.self_development.service.EngineParamDetailService; +import org.springframework.validation.BindingResult; import org.springframework.web.bind.annotation.*; import org.springframework.web.multipart.MultipartFile; import javax.annotation.Resource; import javax.servlet.http.HttpServletResponse; +import javax.validation.Valid; import javax.validation.constraints.NotBlank; import javax.validation.constraints.NotEmpty; import java.util.List; @@ -31,6 +35,24 @@ public class EngineParamDetailController { @Resource private EngineParamDetailService engineParamDetailService; + /** + * 更新部门 + * + * @return 操作结果响应 + */ + @PostMapping("/updateDept") + public Response updateDept( + @Valid @RequestBody EngineDeptUpdateDTO engineDeptUpdateDTO, + BindingResult bindingResult + ) { + if (bindingResult.hasErrors()) { + bindingResult.getFieldErrors().forEach(error -> { + throw new CommonException(error.getDefaultMessage()); + }); + } + engineParamDetailService.updateDept(engineDeptUpdateDTO); + return Response.ok().data("更新部门成功"); + } /** * 参数列表查询 diff --git a/src/main/java/com/xdap/self_development/controller/TemplateController.java b/src/main/java/com/xdap/self_development/controller/TemplateController.java index c3f4d6b..e5dd355 100644 --- a/src/main/java/com/xdap/self_development/controller/TemplateController.java +++ b/src/main/java/com/xdap/self_development/controller/TemplateController.java @@ -140,7 +140,7 @@ public class TemplateController { @RequestPart("userId") String userId ) { MyResponse templateImportProblemView = templateService.importTemplate(file, templateRowId, userId); - if (templateImportProblemView.isFlag()) { + if (!templateImportProblemView.getErrors().isEmpty()) { return Response.error("导入异常").data(templateImportProblemView); } else { return Response.ok().setMessage("导入成功"); diff --git a/src/main/java/com/xdap/self_development/domain/dto/EngineDeptUpdateDTO.java b/src/main/java/com/xdap/self_development/domain/dto/EngineDeptUpdateDTO.java new file mode 100644 index 0000000..cf66fb9 --- /dev/null +++ b/src/main/java/com/xdap/self_development/domain/dto/EngineDeptUpdateDTO.java @@ -0,0 +1,17 @@ +package com.xdap.self_development.domain.dto; + +import lombok.Data; + +import javax.validation.constraints.NotBlank; +import javax.validation.constraints.NotEmpty; +import java.util.List; + +@Data +public class EngineDeptUpdateDTO { + @NotBlank(message = "机型ID不能为空") + private String modelId; + @NotBlank(message = "用户ID不能为空") + private String userId; + @NotEmpty(message = "列表不能为空") + private List list; +} diff --git a/src/main/java/com/xdap/self_development/domain/dto/EngineDeptUpdateItem.java b/src/main/java/com/xdap/self_development/domain/dto/EngineDeptUpdateItem.java new file mode 100644 index 0000000..8d6a46f --- /dev/null +++ b/src/main/java/com/xdap/self_development/domain/dto/EngineDeptUpdateItem.java @@ -0,0 +1,13 @@ +package com.xdap.self_development.domain.dto; + +import lombok.Data; + +import javax.validation.constraints.NotBlank; + +@Data +public class EngineDeptUpdateItem { + @NotBlank(message = "参数ID不能为空") + private String paramId; + @NotBlank(message = "部门不能为空") + private String department; +} diff --git a/src/main/java/com/xdap/self_development/domain/view/AnalysisModelParamterView.java b/src/main/java/com/xdap/self_development/domain/view/AnalysisModelParamterView.java index 73f46d5..d83746b 100644 --- a/src/main/java/com/xdap/self_development/domain/view/AnalysisModelParamterView.java +++ b/src/main/java/com/xdap/self_development/domain/view/AnalysisModelParamterView.java @@ -25,6 +25,10 @@ public class AnalysisModelParamterView { * 模型名称 */ private String modelName; + /** + * 状态代号 + */ + private String productNumber; /** * 平台 */ diff --git a/src/main/java/com/xdap/self_development/job/ParameterValueCalculationTimer.java b/src/main/java/com/xdap/self_development/job/ParameterValueCalculationTimer.java index ce2d13d..9dbdd1b 100644 --- a/src/main/java/com/xdap/self_development/job/ParameterValueCalculationTimer.java +++ b/src/main/java/com/xdap/self_development/job/ParameterValueCalculationTimer.java @@ -5,7 +5,6 @@ import com.xdap.self_development.domain.pojo.ClassificationAttributePojo; import com.xdap.self_development.domain.pojo.EnginePartsCollectionPojo; import com.xdap.self_development.domain.view.CalculationParameterView; import com.xdap.self_development.exception.CommonException; -import com.xdap.self_development.utils.FormulaValidatorUtils; import lombok.extern.slf4j.Slf4j; import org.springframework.scheduling.annotation.Scheduled; import org.springframework.stereotype.Service; @@ -15,7 +14,8 @@ import javax.annotation.PostConstruct; import javax.annotation.Resource; import javax.script.ScriptEngine; import javax.script.ScriptEngineManager; -import java.time.LocalDate; +import java.time.LocalDateTime; +import java.time.format.DateTimeFormatter; import java.util.*; import java.util.regex.Pattern; import java.util.stream.Collectors; @@ -35,21 +35,46 @@ public class ParameterValueCalculationTimer { scriptEngine = scriptEngineManager.getEngineByName("JavaScript"); } + public static Map> convertMap( + List list + ) { + if (list == null) { + return new HashMap<>(); + } + + return list.stream() + .filter(Objects::nonNull) + .filter(param -> param.getParameterValue() != null) + .filter(param -> !"公式计算".equals(param.getParameterSource())) + .filter(item -> item.getParameterName() != null && item.getModelId() != null) + .collect(Collectors.groupingBy( + CalculationParameterView::getParameterName, + Collectors.toMap( + CalculationParameterView::getModelId, + item -> item.getParameterValue() != null ? item.getParameterValue() : item.getParameterName(), + (existing, replacement) -> replacement + ) + )); + } + // 每天凌晨执行一次 @Scheduled(cron = "0 0 0 * * ?") @Transactional public void dailyCalculate() { - LocalDate today = LocalDate.now(); - log.info("开始执行{}参数计算任务", today); + log.info("开始执行{}参数计算任务", LocalDateTime.now().format(DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss"))); // 统计信息 int totalParameters; int tcParameters = 0; - int calculatedParameters = 0; + int calculatedParameters; int updatedFromTC = 0; int failedToUpdateFromTC = 0; - + int successCount = 0; + int failureCount = 0; + int updatedCount = 0; + int dbUpdateFailures = 0; + List toUpdate = new ArrayList<>(); // 1.查询所有参数配置 @@ -57,7 +82,7 @@ public class ParameterValueCalculationTimer { .viewQueryMode(true) .view("getModelParameterValue") .doQuery(CalculationParameterView.class); - + totalParameters = parameterValues.size(); log.info("共查询到{}个参数配置", totalParameters); @@ -99,96 +124,141 @@ public class ParameterValueCalculationTimer { } } } - + log.info("从中台更新参数完成,共处理{}个TC参数,成功{}个,失败{}个", tcParameters, updatedFromTC, failedToUpdateFromTC); - // 3.维护所有参数的原始值 - Map> originalValueMap = convertMap(parameterValues); + // 3.构建初始值映射 —— 仅包含非公式参数 + Map> currentValues = convertMap(parameterValues); - // 4.构建参数名列表,按长度降序排列 - List parameterNames = originalValueMap.keySet().stream() - .sorted((a, b) -> Integer.compare(b.length(), a.length())) + // 4. 分离出所有“公式计算”类型的参数 + List formulaParamsList = parameterValues.stream() + .filter(p -> "公式计算".equals(p.getParameterSource())) .collect(Collectors.toList()); + calculatedParameters = formulaParamsList.size(); + + // 5. 多轮迭代计算 + int round = 0; + final int MAX_ROUNDS = 5; + boolean changed; + Set computedKeys = new HashSet<>(); + Map errors = new HashMap<>(); + + do { + changed = false; + round++; + + for (CalculationParameterView param : formulaParamsList) { + String modelId = param.getModelId(); + String paramName = param.getParameterName(); + String paramId = param.getParameterId(); + String key = modelId + "|" + paramId + "|" + paramName; + + // 跳过已成功计算的 + if (computedKeys.contains(key)) continue; - // 5.遍历参数,计算需运算的参数值 - int successCount = 0; - int failureCount = 0; - for (CalculationParameterView parameterValue : parameterValues) { - if (Objects.equals(parameterValue.getParameterSource(), "公式计算")) { - calculatedParameters++; - String formula = parameterValue.getNumberOrFormula(); - String modelId = parameterValue.getModelId(); try { - String replacedFormula = replaceParametersInFormula(formula, parameterNames, originalValueMap, modelId, parameterValue.getParameterName()); - log.debug("机型【{}】的参数【{}】替换公式:{} -> {}",parameterValue.getProductNumber(), parameterValue.getParameterName(), formula, replacedFormula); + String replacedFormula = replaceParametersInFormula( + param.getNumberOrFormula(), + currentValues, // 只包含原始输入 + 已算出的公式值 + modelId, + paramName + ); + Double result = calculateExpression(replacedFormula); + if (result == null) { + errors.put(key, "替换公式:'" + replacedFormula + "'无法计算" + ",原公式为:'" + param.getNumberOrFormula() + "'"); + continue; + } String formattedResult = String.format("%.2f", result); - parameterValue.setParameterValue(formattedResult); - toUpdate.add(parameterValue); - log.info("机型【{}】的参数【{}】计算结果:{}",parameterValue.getProductNumber(), parameterValue.getParameterName(), formattedResult); - successCount++; + + // 更新内存中的值 + currentValues.computeIfAbsent(paramName, k -> new HashMap<>()).put(modelId, formattedResult); + param.setParameterValue(formattedResult); + + computedKeys.add(key); + changed = true; + } catch (Exception e) { - log.error("机型【{}】的参数【{}】计算失败:{},公式:{},模型ID:{}",parameterValue.getProductNumber(), - parameterValue.getParameterName(), e.getMessage(), formula, modelId, e); - parameterValue.setParameterValue(null); - toUpdate.add(parameterValue); // 仍然添加到更新列表,用于更新null值 - failureCount++; + // 暂不报错,留到最后一轮统一处理 } } + + } while (changed && round < MAX_ROUNDS); + + // 6. 标记最终失败的参数 + for (CalculationParameterView param : formulaParamsList) { + String key = param.getModelId() + "|" + param.getParameterId() + "|" + param.getParameterName(); + if (computedKeys.contains(key)) { + successCount++; + toUpdate.add(param); + } else { + String err = errors.get(key); + if (err != null) { + log.error("机型【{}】的参数【{}】最终计算失败,{}", + param.getProductNumber(), param.getParameterName(), err); + } else { + log.error("机型【{}】的参数【{}】最终计算失败,无具体错误信息", + param.getProductNumber(), param.getParameterName()); + } + param.setParameterValue(null); + toUpdate.add(param); + failureCount++; + } } - + log.info("公式计算参数完成,共处理{}个计算参数,成功{}个,失败{}个", calculatedParameters, successCount, failureCount); - // 批量插入或更新计算结果 - int updatedCount = 0; - int dbUpdateFailures = 0; + // 7. 批量更新数据库 if (!toUpdate.isEmpty()) { - for (CalculationParameterView parameterValue : toUpdate) { + for (CalculationParameterView param : toUpdate) { try { - if (parameterValue.getParameterValue() != null) { + if (param.getParameterValue() != null) { bd.getBusinessDatabase() .table("engine_param_detail") - .eq("id", parameterValue.getId()) - .update("parameter_value", parameterValue.getParameterValue()) - .doUpdate(); - } else { - // 对于计算失败的参数,也更新为null值 - bd.getBusinessDatabase() - .table("engine_param_detail") - .eq("id", parameterValue.getId()) - .update("parameter_value", null) + .eq("id", param.getId()) + .update("parameter_value", param.getParameterValue()) .doUpdate(); } updatedCount++; } catch (Exception e) { - log.error("参数【{}】更新数据库失败:{}", parameterValue.getParameterName(), e.getMessage(), e); + log.error("参数【{}】更新数据库失败:{}", param.getParameterName(), e.getMessage(), e); dbUpdateFailures++; } } log.info("{}参数计算完成,成功处理{}个参数,失败{}个参数,更新{}个参数,数据库更新失败{}个", - today, successCount, failureCount, updatedCount, dbUpdateFailures); + LocalDateTime.now().format(DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss")), successCount, failureCount, updatedCount, dbUpdateFailures); } else { - log.info("{}参数计算完成,无需更新任何参数", today); + log.info("{}参数计算完成,无需更新任何参数", LocalDateTime.now().format(DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss"))); } - - // 添加汇总信息 + log.info("{}参数计算任务结束,总参数数{},TC参数{}(成功{},失败{}),计算参数{}(成功{},失败{}),数据库更新{}(失败{})", - today, totalParameters, tcParameters, updatedFromTC, failedToUpdateFromTC, + LocalDateTime.now().format(DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss")), totalParameters, tcParameters, updatedFromTC, failedToUpdateFromTC, calculatedParameters, successCount, failureCount, updatedCount, dbUpdateFailures); } - private String replaceParametersInFormula(String formula, List parameterNames, - Map> valueMap, String modelId, String currentParameterName) { - List formulaParams = FormulaValidatorUtils.extractParameters(formula); - String result = formula; - result = result.replace("π", "PI").replace("PI", "Math.PI"); - result = result.replace("e", "Math.E"); - for (String paramName : formulaParams) { - if (!parameterNames.contains(paramName) || Objects.equals(paramName, currentParameterName)) continue; - String pattern = "\\b" + Pattern.quote(paramName) + "\\b"; - String value = getParameterValue(valueMap, paramName, modelId); - result = result.replaceAll(pattern, value); + private String replaceParametersInFormula(String formula, + Map> currentValueMap, + String modelId, + String currentParamName) { + String result = formula.replace("π", "Math.PI"); + + // 获取所有已知参数名,按长度降序 + List knownParams = currentValueMap.keySet().stream() + .filter(name -> !Objects.equals(name, currentParamName)) + .sorted((a, b) -> Integer.compare(b.length(), a.length())) + .collect(Collectors.toList()); + + for (String paramName : knownParams) { + String value = getParameterValue(currentValueMap, paramName, modelId); + // 仅当 value 是有效数字时才替换 + if (value != null && !value.equals(paramName) && isNumeric(value)) { + String escaped = Pattern.quote(paramName); + // 使用否定前后瞻,支持中文和中文括号 + String pattern = "(?> convertMap( - List list - ) { - if (list == null) { - return new HashMap<>(); + private Double calculateExpression(String expression) throws CommonException { + try { + if (!isSafeExpression(expression)) { + return null; + } + Object result = scriptEngine.eval(expression); + if (result instanceof Number) { + return ((Number) result).doubleValue(); + } + return null; + } catch (Exception e) { + log.warn("{}导致计算失败: {}", e.getMessage(), expression, e); + return null; } - - return list.stream() - .filter(Objects::nonNull) - .filter(item -> item.getParameterName() != null) - .filter(item -> item.getModelId() != null) - .collect(Collectors.groupingBy( - CalculationParameterView::getParameterName, - Collectors.toMap( - CalculationParameterView::getModelId, - item -> item.getParameterValue() != null ? item.getParameterValue() : item.getParameterName(), - (existing, replacement) -> replacement - ) - )); } } \ No newline at end of file diff --git a/src/main/java/com/xdap/self_development/listener/PersonReadListener.java b/src/main/java/com/xdap/self_development/listener/PersonReadListener.java index 88e303a..709346b 100644 --- a/src/main/java/com/xdap/self_development/listener/PersonReadListener.java +++ b/src/main/java/com/xdap/self_development/listener/PersonReadListener.java @@ -43,7 +43,7 @@ public class PersonReadListener implements ReadListener { problems.getErrors().add("责任人导入失败:用户" + responsiblePerson.getUsername() + "无法找到或有多个重名用户"); } else if (user.getDepartmentId() == null) { problems.setFlag(true); - problems.getErrors().add("责任人导入失败:部门" + responsiblePerson.getUsername() + "无法找到"); + problems.getErrors().add("责任人导入失败:部门" + responsiblePerson.getDepartment() + "无法找到"); } else { responsiblePerson.setUserId(user.getUserId()); responsiblePerson.setDepartmentId(user.getDepartmentId()); diff --git a/src/main/java/com/xdap/self_development/listener/SheetDataListener.java b/src/main/java/com/xdap/self_development/listener/SheetDataListener.java index 61c4e45..8463c57 100644 --- a/src/main/java/com/xdap/self_development/listener/SheetDataListener.java +++ b/src/main/java/com/xdap/self_development/listener/SheetDataListener.java @@ -40,6 +40,8 @@ public class SheetDataListener implements ReadListener { @Override public void invokeHead(Map> headMap, AnalysisContext context) { currentSheetName = context.readSheetHolder().getSheetName(); + // 每个模板一开始认定没有问题 + problems.setFlag(false); log.info("开始解析Sheet: {}", currentSheetName); log.info("开始解析表头行: {}", context.readRowHolder().getRowIndex()); log.info("解析到一条头数据:{}", JSON.toJSONString(headMap)); @@ -84,7 +86,7 @@ public class SheetDataListener implements ReadListener { return; } - if (!subDepartments.contains(data.getDepartment())) { + if (data.getDepartment() != null && !subDepartments.contains(data.getDepartment())) { problems.setFlag(true); problems.getErrors().add(String.format("模板导入失败:" + "模板'%s'的参数'%s'部门不存在", currentSheetName, data.getParameterName())); diff --git a/src/main/java/com/xdap/self_development/service/EngineParamDetailService.java b/src/main/java/com/xdap/self_development/service/EngineParamDetailService.java index 8c3a1a4..0df5f34 100644 --- a/src/main/java/com/xdap/self_development/service/EngineParamDetailService.java +++ b/src/main/java/com/xdap/self_development/service/EngineParamDetailService.java @@ -2,12 +2,14 @@ package com.xdap.self_development.service; import com.xdap.api.moudle.user.pojo.XdapUsers; import com.xdap.self_development.controller.request.EngineParamDetailRequest; +import com.xdap.self_development.domain.dto.EngineDeptUpdateDTO; import com.xdap.self_development.domain.dto.EngineParamDetailDTO; import com.xdap.self_development.domain.pojo.EngineParamDetailPojo; import com.xdap.self_development.domain.pojo.ParameterPojo; import org.springframework.web.multipart.MultipartFile; import javax.servlet.http.HttpServletResponse; +import javax.validation.Valid; import java.util.List; import java.util.Map; import java.util.Set; @@ -58,4 +60,6 @@ public interface EngineParamDetailService { List selectParamByIsUserId(List list, String userId); List selectModelParamByIsUserId(List list, String userId); + + void updateDept(@Valid EngineDeptUpdateDTO engineDeptUpdateDTO); } diff --git a/src/main/java/com/xdap/self_development/service/impl/ActivitiProcessServiceImpl.java b/src/main/java/com/xdap/self_development/service/impl/ActivitiProcessServiceImpl.java index 9da7829..6d56c4e 100644 --- a/src/main/java/com/xdap/self_development/service/impl/ActivitiProcessServiceImpl.java +++ b/src/main/java/com/xdap/self_development/service/impl/ActivitiProcessServiceImpl.java @@ -169,7 +169,6 @@ public class ActivitiProcessServiceImpl implements ActivitiProcessService { if (ObjectUtils.isEmpty(model)) { throw new CommonException("机型不存在,请检查"); } - // TODO:机型发起审批 // 检查当前参数是否全部填写完成 TodoTaskPojo filledTodo = bd.getBusinessDatabase() .eq("model_id", model.getId()) @@ -339,6 +338,7 @@ public class ActivitiProcessServiceImpl implements ActivitiProcessService { //新增这个人的填写的已办和经办 CompletedTaskPojo completedTaskPojo = new CompletedTaskPojo(); BeanUtils.copyProperties(todoTaskPojo, completedTaskPojo); + completedTaskPojo.setCurrentProcessor(null); completedTaskPojo.setId(UUID.randomUUID().toString().replace("-", "")); completedTaskPojo.setDocumentNo(todoTaskPojo.getDocumentNo()); completedTaskPojo.setCreationDate(engineReviewListPojo.getCreationDate()); @@ -348,6 +348,7 @@ public class ActivitiProcessServiceImpl implements ActivitiProcessService { InitiatedTaskPojo initiatedTask = new InitiatedTaskPojo(); BeanUtils.copyProperties(todoTaskPojo, initiatedTask); + initiatedTask.setCurrentProcessor(null); initiatedTask.setId(UUID.randomUUID().toString().replace("-", "")); initiatedTask.setDocumentNo(todoTaskPojo.getDocumentNo()); initiatedTask.setCreationDate(engineReviewListPojo.getCreationDate()); @@ -635,7 +636,6 @@ public class ActivitiProcessServiceImpl implements ActivitiProcessService { DataEntryEngineModelPojo model = bd.getBusinessDatabase() .eq("id", flow.getModelId()) .doQueryFirst(DataEntryEngineModelPojo.class); - // TODO:机型审批通过 // 检查当前参数是否为一版本,是则更新参数,否则新建版本。 // 这个机型下所有参数都全部写入一版且版本加一 没有参与审批的参数时原来的值,参与审批的参数值要取小版本值作为大版本 // 现版本需要填写的全部参数 @@ -718,6 +718,7 @@ public class ActivitiProcessServiceImpl implements ActivitiProcessService { .update("approver_persons", "") .update("last_update_date", new Date()) .update("pre_node", -1) + .update("node_name", null) .eq("id", flow.getId()) .doUpdate(EngineReviewListPojo.class); @@ -866,7 +867,7 @@ public class ActivitiProcessServiceImpl implements ActivitiProcessService { reviewListPojo.setStatusCode(ParamValueVersionEnum.UNDER.getCode()); reviewListPojo.setNodeName(firstNode.getNodeName()); - // 这一批数据改成审核中, + // 这一批数据改成审核中 bd.getBusinessDatabase() .update("version_status", ParamValueVersionEnum.UNDER.getCode()) .update("last_update_date", new Date()) @@ -1160,7 +1161,7 @@ public class ActivitiProcessServiceImpl implements ActivitiProcessService { 1 ); - // 这一批数据改成审核中, + // 这一批数据改成审核中 bd.getBusinessDatabase() .update("version_status", ParamValueVersionEnum.UNDER.getCode()) .update("last_update_date", new Date()) @@ -1502,7 +1503,7 @@ public class ActivitiProcessServiceImpl implements ActivitiProcessService { } // 查询基础数据 - activitiDataAndRecordDTO.setCurrentNode(flow.getNodeName()); + activitiDataAndRecordDTO.setCurrentNode(flow.getNodeName() == null ? "无" : flow.getNodeName()); activitiDataAndRecordDTO.setCreateBy( getUserNames( Arrays.asList(flow.getApplicant().split(",")) diff --git a/src/main/java/com/xdap/self_development/service/impl/BenchmarkingReportServiceImpl.java b/src/main/java/com/xdap/self_development/service/impl/BenchmarkingReportServiceImpl.java index 8c2541f..8d6db46 100644 --- a/src/main/java/com/xdap/self_development/service/impl/BenchmarkingReportServiceImpl.java +++ b/src/main/java/com/xdap/self_development/service/impl/BenchmarkingReportServiceImpl.java @@ -301,8 +301,8 @@ public class BenchmarkingReportServiceImpl implements BenchmarkingReportService // 新增我创建的 InitiatedTaskPojo initiatedTask = new InitiatedTaskPojo(); initiatedTask.setDocumentNo(approvalFlow.getId()); - initiatedTask.setCreatedById(form.getUserId()); - initiatedTask.setCreatedBy(xdapDeptUsersService.selectUserByID(form.getUserId()).getUsername()); + initiatedTask.setCreatedById(approvalFlow.getCreateBy()); + initiatedTask.setCreatedBy(xdapDeptUsersService.selectUserByID(approvalFlow.getCreateBy()).getUsername()); initiatedTask.setCurrentNode(firstNode.getNodeName()); initiatedTask.setCurrentProcessor(firstNode.getAssignees()); initiatedTask.setDataType("对标报告审核"); @@ -525,8 +525,8 @@ public class BenchmarkingReportServiceImpl implements BenchmarkingReportService // 新增我创建的 InitiatedTaskPojo initiatedTask = new InitiatedTaskPojo(); initiatedTask.setDocumentNo(flow.getId()); - initiatedTask.setCreatedById(newForm.getUserId()); - initiatedTask.setCreatedBy(xdapDeptUsersService.selectUserByID(newForm.getUserId()).getUsername()); + initiatedTask.setCreatedById(flow.getCreateBy()); + initiatedTask.setCreatedBy(xdapDeptUsersService.selectUserByID(flow.getCreateBy()).getUsername()); initiatedTask.setCurrentNode(firstNode.getNodeName()); initiatedTask.setCurrentProcessor(firstNode.getAssignees()); initiatedTask.setDataType("对标报告审核"); @@ -1020,8 +1020,8 @@ public class BenchmarkingReportServiceImpl implements BenchmarkingReportService // 更新当前用户的已办 CompletedTaskPojo completedTaskPojo = new CompletedTaskPojo(); completedTaskPojo.setDocumentNo(flow.getId()); - completedTaskPojo.setCreatedById(request.getUserId()); - completedTaskPojo.setCreatedBy(xdapDeptUsersService.selectUserByID(request.getUserId()).getUsername()); + completedTaskPojo.setCreatedById(flow.getCreateBy()); + completedTaskPojo.setCreatedBy(xdapDeptUsersService.selectUserByID(flow.getCreateBy()).getUsername()); completedTaskPojo.setCurrentNode(currentNode.getNodeName()); completedTaskPojo.setCurrentProcessor(currentNode.getAssignees()); completedTaskPojo.setDataType("对标报告审核"); diff --git a/src/main/java/com/xdap/self_development/service/impl/DataEntryEngineModelServiceImpl.java b/src/main/java/com/xdap/self_development/service/impl/DataEntryEngineModelServiceImpl.java index 13ae516..dd92bb8 100644 --- a/src/main/java/com/xdap/self_development/service/impl/DataEntryEngineModelServiceImpl.java +++ b/src/main/java/com/xdap/self_development/service/impl/DataEntryEngineModelServiceImpl.java @@ -7,6 +7,7 @@ import com.alibaba.excel.write.metadata.WriteSheet; import com.alibaba.excel.write.metadata.style.WriteCellStyle; import com.alibaba.excel.write.metadata.style.WriteFont; import com.alibaba.excel.write.style.HorizontalCellStyleStrategy; +import com.alibaba.excel.write.style.column.LongestMatchColumnWidthStyleStrategy; import com.definesys.mpaas.query.MpaasQueryFactory; import com.definesys.mpaas.query.db.PageQueryResult; import com.xdap.api.moudle.user.pojo.XdapUsers; @@ -339,6 +340,7 @@ public class DataEntryEngineModelServiceImpl implements DataEntryEngineModelServ new HorizontalCellStyleStrategy(headWriteCellStyle, new WriteCellStyle()); WriteSheet sheet = EasyExcel.writerSheet() + .registerWriteHandler(new LongestMatchColumnWidthStyleStrategy()) .registerWriteHandler(horizontalCellStyleStrategy) .head(DataEntryEngineModelExcel.class) // 所有Sheet使用相同的表头 .build(); @@ -435,7 +437,6 @@ public class DataEntryEngineModelServiceImpl implements DataEntryEngineModelServ @Override @Transactional public Integer synchronizeParams(String modelId, String userId) { - // TODO: 同步模板最新参数到机型 // 检查机型 DataEntryEngineModelPojo model = bd.getBusinessDatabase() .eq("id", modelId) @@ -537,7 +538,6 @@ public class DataEntryEngineModelServiceImpl implements DataEntryEngineModelServ .eq("id", model.getId()) .update("version_number", model.getVersionNumber()) .update("parameter_num", parameters.size()) - .update("distribute_status", DistributeStatusEnum.COMPLETE.getCode()) .doUpdate(DataEntryEngineModelPojo.class); // 更新新版本机型的参数 diff --git a/src/main/java/com/xdap/self_development/service/impl/EngineParamDetailServiceImpl.java b/src/main/java/com/xdap/self_development/service/impl/EngineParamDetailServiceImpl.java index d9dff33..d4d765f 100644 --- a/src/main/java/com/xdap/self_development/service/impl/EngineParamDetailServiceImpl.java +++ b/src/main/java/com/xdap/self_development/service/impl/EngineParamDetailServiceImpl.java @@ -7,14 +7,18 @@ import com.alibaba.excel.write.metadata.WriteSheet; import com.alibaba.excel.write.metadata.style.WriteCellStyle; import com.alibaba.excel.write.metadata.style.WriteFont; import com.alibaba.excel.write.style.HorizontalCellStyleStrategy; +import com.alibaba.excel.write.style.column.LongestMatchColumnWidthStyleStrategy; import com.alibaba.fastjson.JSON; import com.definesys.mpaas.query.MpaasQueryFactory; import com.xdap.api.moudle.user.pojo.XdapUsers; import com.xdap.self_development.common.BusinessDatabase; import com.xdap.self_development.controller.request.EngineParamDetailExcel; import com.xdap.self_development.controller.request.EngineParamDetailRequest; +import com.xdap.self_development.domain.dto.EngineDeptUpdateDTO; +import com.xdap.self_development.domain.dto.EngineDeptUpdateItem; import com.xdap.self_development.domain.dto.EngineParamDetailDTO; import com.xdap.self_development.domain.enums.CurrentNodeEnum; +import com.xdap.self_development.domain.enums.DistributeStatusEnum; import com.xdap.self_development.domain.enums.ParamOperationEnum; import com.xdap.self_development.domain.enums.ParamValueVersionEnum; import com.xdap.self_development.domain.pojo.*; @@ -28,6 +32,7 @@ import org.apache.commons.lang3.ObjectUtils; import org.apache.poi.ss.usermodel.IndexedColors; import org.springframework.beans.BeanUtils; import org.springframework.stereotype.Service; +import org.springframework.transaction.annotation.Transactional; import org.springframework.web.multipart.MultipartFile; import javax.annotation.Resource; @@ -293,7 +298,6 @@ public class EngineParamDetailServiceImpl implements EngineParamDetailService { if (userId == null || userId.isEmpty()) { return pojoList; } - // TODO:根据权限过滤 List menuParamViews = modelRoleService.selectPersByUser(userId); // 管理员返回全部 for (MenuParamView menuParamView : menuParamViews) { @@ -436,6 +440,7 @@ public class EngineParamDetailServiceImpl implements EngineParamDetailService { engineParamDetailExcels.add(engineParamDetailExcel); } WriteSheet sheet = EasyExcel.writerSheet(i, sheetNames.get(i)) + .registerWriteHandler(new LongestMatchColumnWidthStyleStrategy()) .registerWriteHandler(horizontalCellStyleStrategy) .head(EngineParamDetailExcel.class) // 所有Sheet使用相同的表头 .build(); @@ -615,7 +620,6 @@ public class EngineParamDetailServiceImpl implements EngineParamDetailService { */ @Override public void updateParamValue(List engineParamDetailPojos, String currentUserId) { - // TODO:修改参数值 // 获取欲更新参数列表 List detailIds = engineParamDetailPojos.stream() .map(EngineParamDetailPojo::getId) @@ -1037,7 +1041,6 @@ public class EngineParamDetailServiceImpl implements EngineParamDetailService { if (userId == null || userId.isEmpty()) { return list; } - // TODO:根据权限过滤 List menuParamViews = modelRoleService.selectPersByUser(userId); // 管理员返回全部 for (MenuParamView menuParamView : menuParamViews) { @@ -1066,7 +1069,6 @@ public class EngineParamDetailServiceImpl implements EngineParamDetailService { if (userId == null || userId.isEmpty()) { return list; } - // TODO:根据权限过滤 List menuParamViews = modelRoleService.selectPersByUser(userId); // 管理员返回全部 for (MenuParamView menuParamView : menuParamViews) { @@ -1088,4 +1090,50 @@ public class EngineParamDetailServiceImpl implements EngineParamDetailService { )) .collect(Collectors.toList()); } + + @Override + @Transactional + public void updateDept(EngineDeptUpdateDTO engineDeptUpdateDTO) { + if (engineDeptUpdateDTO.getList().isEmpty()) throw new CommonException("部门信息不能为空"); + + // 检查机型 + DataEntryEngineModelPojo model = bd.getBusinessDatabase() + .eq("id", engineDeptUpdateDTO.getModelId()) + .in("distribute_status", + DistributeStatusEnum.UNDISTRIBUTED.getCode(), + DistributeStatusEnum.COMPLETE.getCode() + ) + .doQueryFirst(DataEntryEngineModelPojo.class); + if (model == null) { + throw new CommonException("机型不存在或已分发"); + } + + // 检查当前版本机型是否有参数正在审批中 + List paramsInApproval = bd.getBusinessDatabase() + .eq("engine_model_id", model.getId()) + .eq("major_version", model.getVersionNumber()) + .eq("version_status", ParamValueVersionEnum.UNDER.getCode()) + .doQuery(EngineParamDetailPojo.class); + if (!paramsInApproval.isEmpty()) { + throw new CommonException("当前版本机型有参数正在审批中,请等待审批完成"); + } + + // 整理部门和参数 + Map> deptMap = engineDeptUpdateDTO.getList().stream() + .filter(item -> item.getDepartment() != null && !item.getDepartment().isEmpty()) + .collect(Collectors.groupingBy( + EngineDeptUpdateItem::getDepartment, + Collectors.mapping(EngineDeptUpdateItem::getParamId, Collectors.toList()) + )); + + for (Map.Entry> entry : deptMap.entrySet()) { + String department = entry.getKey(); + List paramIds = entry.getValue(); + // 更新部门信息 + bd.getBusinessDatabase() + .update("department", department) + .in("id", paramIds) + .doUpdate(EngineParamDetailPojo.class); + } + } } diff --git a/src/main/java/com/xdap/self_development/service/impl/ResponsiblePersonServiceImpl.java b/src/main/java/com/xdap/self_development/service/impl/ResponsiblePersonServiceImpl.java index 94b45ed..59bded8 100644 --- a/src/main/java/com/xdap/self_development/service/impl/ResponsiblePersonServiceImpl.java +++ b/src/main/java/com/xdap/self_development/service/impl/ResponsiblePersonServiceImpl.java @@ -355,7 +355,7 @@ public class ResponsiblePersonServiceImpl implements ResponsiblePersonService { throw new CommonException("只支持 .xls 或 .xlsx 格式的文件"); } MyResponse problems = - new MyResponse(false, new ArrayList<>(), new StringBuilder("已完成导入:无")); + new MyResponse(false, new ArrayList<>(), new StringBuilder("已完成导入")); try (InputStream inputStream = file.getInputStream()) { EasyExcel.read( @@ -455,7 +455,7 @@ public class ResponsiblePersonServiceImpl implements ResponsiblePersonService { list.add(item); } }); - if (list.isEmpty()) { + if (list.isEmpty() && !problems.isFlag()) { problems.setFlag(true); problems.getErrors().add("没有合适的责任人导入"); return; diff --git a/src/main/java/com/xdap/self_development/service/impl/TcDataQueryServiceImpl.java b/src/main/java/com/xdap/self_development/service/impl/TcDataQueryServiceImpl.java index 0627bc9..1981c02 100644 --- a/src/main/java/com/xdap/self_development/service/impl/TcDataQueryServiceImpl.java +++ b/src/main/java/com/xdap/self_development/service/impl/TcDataQueryServiceImpl.java @@ -27,6 +27,7 @@ import javax.servlet.http.HttpServletResponse; import java.io.IOException; import java.io.OutputStream; import java.net.URLEncoder; +import java.text.Collator; import java.time.LocalDateTime; import java.time.format.DateTimeFormatter; import java.util.*; @@ -385,8 +386,7 @@ public class TcDataQueryServiceImpl implements TcDataQueryService { Map modelNames = getModelNameMapping(models); // 从Redis加载并处理数据 - Map> parameterValues = new TreeMap<>(); - ; + Map> parameterValues = new TreeMap<>(Collator.getInstance(Locale.CHINA)); loadAndProcessRedisData(request, models, userID, subsystemParts, parameterValues); diff --git a/src/main/java/com/xdap/self_development/service/impl/TemplateApprovalServiceImpl.java b/src/main/java/com/xdap/self_development/service/impl/TemplateApprovalServiceImpl.java index 09cb38e..100ac57 100644 --- a/src/main/java/com/xdap/self_development/service/impl/TemplateApprovalServiceImpl.java +++ b/src/main/java/com/xdap/self_development/service/impl/TemplateApprovalServiceImpl.java @@ -170,8 +170,8 @@ public class TemplateApprovalServiceImpl implements TemplateApprovalService { // 新增我创建的 InitiatedTaskPojo initiatedTask = new InitiatedTaskPojo(); initiatedTask.setDocumentNo(flow.getId()); - initiatedTask.setCreatedById(request.getUserId()); - initiatedTask.setCreatedBy(xdapDeptUsersService.selectUserByID(request.getUserId()).getUsername()); + initiatedTask.setCreatedById(flow.getCreateBy()); + initiatedTask.setCreatedBy(xdapDeptUsersService.selectUserByID(flow.getCreateBy()).getUsername()); initiatedTask.setCurrentNode(firstNode.getNodeName()); initiatedTask.setCurrentProcessor(JSON.toJSONString(firstNode.getAssignees())); initiatedTask.setDataType("模板审核"); @@ -547,8 +547,8 @@ public class TemplateApprovalServiceImpl implements TemplateApprovalService { // 新增当前处理人的已办 CompletedTaskPojo completedTaskPojo = new CompletedTaskPojo(); completedTaskPojo.setDocumentNo(flow.getId()); - completedTaskPojo.setCreatedById(request.getUserId()); - completedTaskPojo.setCreatedBy(xdapDeptUsersService.selectUserByID(request.getUserId()).getUsername()); + completedTaskPojo.setCreatedById(flow.getCreateBy()); + completedTaskPojo.setCreatedBy(xdapDeptUsersService.selectUserByID(flow.getCreateBy()).getUsername()); completedTaskPojo.setCurrentNode(currentNode.getNodeName()); completedTaskPojo.setCurrentProcessor(currentNode.getAssignees()); completedTaskPojo.setDataType("模板审核"); diff --git a/src/main/java/com/xdap/self_development/service/impl/TemplateServiceImpl.java b/src/main/java/com/xdap/self_development/service/impl/TemplateServiceImpl.java index 7159cde..28c7f67 100644 --- a/src/main/java/com/xdap/self_development/service/impl/TemplateServiceImpl.java +++ b/src/main/java/com/xdap/self_development/service/impl/TemplateServiceImpl.java @@ -118,6 +118,14 @@ public class TemplateServiceImpl implements TemplateService { throw new CommonException("没有找到模板"); } + List templates = bd.getBusinessDatabase() + .eq("template_name", templateName.getTemplateName()) + .doQuery(TemplatePojo.class); + + if (!templates.isEmpty()) { + throw new CommonException("已有同名模板,不允许修改模板名称"); + } + bd.getBusinessDatabase() .eq("template_name", templateName) .update("template_name", form.getTemplateName()) diff --git a/src/main/java/com/xdap/self_development/service/impl/TodoTaskServiceImpl.java b/src/main/java/com/xdap/self_development/service/impl/TodoTaskServiceImpl.java index 3072194..2d76ccf 100644 --- a/src/main/java/com/xdap/self_development/service/impl/TodoTaskServiceImpl.java +++ b/src/main/java/com/xdap/self_development/service/impl/TodoTaskServiceImpl.java @@ -456,7 +456,6 @@ public class TodoTaskServiceImpl implements TodoTaskService { @Override public void skipApproval(RejectTodoRequest request) { - // TODO:跳过审批 TodoTaskPojo todoTaskPojo = bd.getBusinessDatabase() .eq("id", request.getTodoId()) .doQueryFirst(TodoTaskPojo.class); diff --git a/src/main/resources/application.properties b/src/main/resources/application.properties index 08a3d83..c8b5df8 100644 --- a/src/main/resources/application.properties +++ b/src/main/resources/application.properties @@ -60,7 +60,7 @@ deploy.powerjob.address=127.0.0.1:7700 # ====================== ??????MPAAS? ====================== mpaas.datasource[0].name=xdap_app_223770822127386625 mpaas.datasource[0].type=mysql -mpaas.datasource[0].url=jdbc:mysql://127.0.0.1:3306/xdap_app_223770822127386625?serverTimezone=GMT%2B8&characterEncoding=utf-8 +mpaas.datasource[0].url=jdbc:mysql://127.0.0.1:3306/test?serverTimezone=GMT%2B8&characterEncoding=utf-8 mpaas.datasource[0].driver-class-name=com.mysql.cj.jdbc.Driver mpaas.datasource[0].username=root mpaas.datasource[0].password=qwer12 @@ -76,7 +76,7 @@ mpaas.datasource[1].minPoolSize=50 mpaas.datasource[1].maxPoolSize=1000 mpaas.datasource[2].name=qygs mpaas.datasource[2].type=mysql -mpaas.datasource[2].url=jdbc:mysql://127.0.0.1:3306/qygs?serverTimezone=GMT%2B8&characterEncoding=utf-8 +mpaas.datasource[2].url=jdbc:mysql://127.0.0.1:3306/test?serverTimezone=GMT%2B8&characterEncoding=utf-8 mpaas.datasource[2].driver-class-name=com.mysql.cj.jdbc.Driver mpaas.datasource[2].username=root mpaas.datasource[2].password=qwer12