上线版本6.0

This commit is contained in:
zjh 2026-02-24 08:40:35 +08:00
parent 27c5a0317f
commit 20d92d7153
20 changed files with 305 additions and 135 deletions

View File

@ -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

View File

@ -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("更新部门成功");
}
/**
* 参数列表查询

View File

@ -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("导入成功");

View File

@ -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<EngineDeptUpdateItem> list;
}

View File

@ -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;
}

View File

@ -25,6 +25,10 @@ public class AnalysisModelParamterView {
* 模型名称
*/
private String modelName;
/**
* 状态代号
*/
private String productNumber;
/**
* 平台
*/

View File

@ -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,20 +35,45 @@ public class ParameterValueCalculationTimer {
scriptEngine = scriptEngineManager.getEngineByName("JavaScript");
}
public static Map<String, Map<String, String>> convertMap(
List<CalculationParameterView> 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<CalculationParameterView> toUpdate = new ArrayList<>();
@ -102,93 +127,138 @@ public class ParameterValueCalculationTimer {
log.info("从中台更新参数完成,共处理{}个TC参数成功{}个,失败{}个", tcParameters, updatedFromTC, failedToUpdateFromTC);
// 3.维护所有参数的原始值
Map<String, Map<String, String>> originalValueMap = convertMap(parameterValues);
// 3.构建初始值映射 仅包含非公式参数
Map<String, Map<String, String>> currentValues = convertMap(parameterValues);
// 4.构建参数名列表按长度降序排列
List<String> parameterNames = originalValueMap.keySet().stream()
.sorted((a, b) -> Integer.compare(b.length(), a.length()))
// 4. 分离出所有公式计算类型的参数
List<CalculationParameterView> 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<String> computedKeys = new HashSet<>();
Map<String, String> 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);
String formattedResult = String.format("%.2f", result);
parameterValue.setParameterValue(formattedResult);
toUpdate.add(parameterValue);
log.info("机型【{}】的参数【{}】计算结果:{}",parameterValue.getProductNumber(), parameterValue.getParameterName(), formattedResult);
successCount++;
} catch (Exception e) {
log.error("机型【{}】的参数【{}】计算失败:{},公式:{}模型ID{}",parameterValue.getProductNumber(),
parameterValue.getParameterName(), e.getMessage(), formula, modelId, e);
parameterValue.setParameterValue(null);
toUpdate.add(parameterValue); // 仍然添加到更新列表用于更新null值
failureCount++;
if (result == null) {
errors.put(key, "替换公式:'" + replacedFormula + "'无法计算" + ",原公式为:'" + param.getNumberOrFormula() + "'");
continue;
}
String formattedResult = String.format("%.2f", result);
// 更新内存中的值
currentValues.computeIfAbsent(paramName, k -> new HashMap<>()).put(modelId, formattedResult);
param.setParameterValue(formattedResult);
computedKeys.add(key);
changed = true;
} catch (Exception e) {
// 暂不报错留到最后一轮统一处理
}
}
} 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<String> parameterNames,
Map<String, Map<String, String>> valueMap, String modelId, String currentParameterName) {
List<String> 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);
private String replaceParametersInFormula(String formula,
Map<String, Map<String, String>> currentValueMap,
String modelId,
String currentParamName) {
String result = formula.replace("π", "Math.PI");
// 获取所有已知参数名按长度降序
List<String> 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 = "(?<![\u4e00-\u9fa5a-zA-Z0-9])" + escaped + "(?![\u4e00-\u9fa5a-zA-Z0-9])";
result = result.replaceAll(pattern, value);
}
}
return result;
}
@ -200,30 +270,16 @@ public class ParameterValueCalculationTimer {
return value;
}
}
return paramName;
return paramName; // 找不到返回原名会导致非数字
}
private Double calculateExpression(String expression) throws CommonException {
Double result = calculateWithScriptEngine(expression);
if (result != null) {
return result;
}
throw new CommonException("无法计算表达式: " + expression);
}
private Double calculateWithScriptEngine(String expression) {
private boolean isNumeric(String str) {
if (str == null || str.isEmpty()) return false;
try {
if (!isSafeExpression(expression)) {
throw new SecurityException("表达式包含不安全内容");
}
Object result = scriptEngine.eval(expression);
if (result instanceof Number) {
return ((Number) result).doubleValue();
}
return null;
} catch (Exception e) {
log.warn("ScriptEngine计算失败: {}, 错误: {}", expression, e.getMessage(), e);
return null;
Double.parseDouble(str);
return true;
} catch (NumberFormatException e) {
return false;
}
}
@ -243,24 +299,19 @@ public class ParameterValueCalculationTimer {
return true;
}
public static Map<String, Map<String, String>> convertMap(
List<CalculationParameterView> 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
)
));
}
}

View File

@ -43,7 +43,7 @@ public class PersonReadListener implements ReadListener<ResponsiblePersonPojo> {
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());

View File

@ -40,6 +40,8 @@ public class SheetDataListener implements ReadListener<ParameterPojo> {
@Override
public void invokeHead(Map<Integer, ReadCellData<?>> 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<ParameterPojo> {
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()));

View File

@ -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<ParameterPojo> selectParamByIsUserId(List<ParameterPojo> list, String userId);
List<EngineParamDetailPojo> selectModelParamByIsUserId(List<EngineParamDetailPojo> list, String userId);
void updateDept(@Valid EngineDeptUpdateDTO engineDeptUpdateDTO);
}

View File

@ -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(","))

View File

@ -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("对标报告审核");

View File

@ -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);
// 更新新版本机型的参数

View File

@ -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<MenuParamView> 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<EngineParamDetailPojo> engineParamDetailPojos, String currentUserId) {
// TODO:修改参数值
// 获取欲更新参数列表
List<String> detailIds = engineParamDetailPojos.stream()
.map(EngineParamDetailPojo::getId)
@ -1037,7 +1041,6 @@ public class EngineParamDetailServiceImpl implements EngineParamDetailService {
if (userId == null || userId.isEmpty()) {
return list;
}
// TODO:根据权限过滤
List<MenuParamView> 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<MenuParamView> 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<EngineParamDetailPojo> 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<String, List<String>> 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<String, List<String>> entry : deptMap.entrySet()) {
String department = entry.getKey();
List<String> paramIds = entry.getValue();
// 更新部门信息
bd.getBusinessDatabase()
.update("department", department)
.in("id", paramIds)
.doUpdate(EngineParamDetailPojo.class);
}
}
}

View File

@ -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;

View File

@ -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<String, String> modelNames = getModelNameMapping(models);
// 从Redis加载并处理数据
Map<String, Map<String, String>> parameterValues = new TreeMap<>();
;
Map<String, Map<String, String>> parameterValues = new TreeMap<>(Collator.getInstance(Locale.CHINA));
loadAndProcessRedisData(request, models, userID, subsystemParts, parameterValues);

View File

@ -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("模板审核");

View File

@ -118,6 +118,14 @@ public class TemplateServiceImpl implements TemplateService {
throw new CommonException("没有找到模板");
}
List<TemplatePojo> 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())

View File

@ -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);

View File

@ -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