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 8acc158..94d8dda 100644 --- a/src/main/java/com/xdap/self_development/listener/SheetDataListener.java +++ b/src/main/java/com/xdap/self_development/listener/SheetDataListener.java @@ -59,15 +59,15 @@ public class SheetDataListener implements ReadListener { @Override public void invoke(Parameter data, AnalysisContext context) { // 第一次读取数据时检查表头 - if (!headerChecked) { - checkHeaderAndSkipIfNeeded(context); - headerChecked = true; - } +// if (!headerChecked) { +// checkHeaderAndSkipIfNeeded(context); +// headerChecked = true; +// } // 如果sheet无效,直接返回,不处理数据 - if (!validSheet) { - return; - } +// if (!validSheet) { +// return; +// } if (data.getSubsystemName() == null) { problems.setFlag(true); @@ -79,12 +79,6 @@ public class SheetDataListener implements ReadListener { data.setPartsName("/"); } - if (data.getParameterNumber() == null) { - problems.setFlag(true); - problems.getErrors().add(currentSheetName +"模板的参数"+data.getParameterName()+"的序号字段为空"); - return; - } - if (currentSheetName == null) { currentSheetName = context.readSheetHolder().getSheetName(); } diff --git a/src/main/java/com/xdap/self_development/pojo/view/TemplateInfoView.java b/src/main/java/com/xdap/self_development/pojo/view/TemplateInfoView.java index 0126543..5a6489d 100644 --- a/src/main/java/com/xdap/self_development/pojo/view/TemplateInfoView.java +++ b/src/main/java/com/xdap/self_development/pojo/view/TemplateInfoView.java @@ -5,5 +5,6 @@ import lombok.Data; @Data public class TemplateInfoView { private String templateRowId; + private String templateId; private Integer version; } 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 d6c291c..c120412 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 @@ -311,10 +311,72 @@ public class BenchmarkingReportServiceImpl implements BenchmarkingReportService .eq("flow_type", 2) .doQueryFirst(ApprovalFlow.class); approvalFlowView.setExplanation(flow.getExplanation()); - approvalFlowView.setProofreadNodes(getNodeList(flowId, "PROOFREAD")); - approvalFlowView.setReviewNodes(getNodeList(flowId, "REVIEW")); - approvalFlowView.setApproveNodes(getNodeList(flowId, "APPROVE")); - + List proofread = getNodeList(flowId, "PROOFREAD"); + if (proofread.isEmpty()) { + List list = new ArrayList<>(); + StringBuilder usernames = new StringBuilder(); + JSON.parseArray(flow.getProofreadUsers()).toJavaList(String.class).forEach(id -> { + ApprovalXdapUsers user = bd.getBusinessDatabase() + .eq("id", id) + .doQueryFirst(ApprovalXdapUsers.class); + usernames.append(user.getUsername()).append(" "); + }); + ApprovalNodeView approvalNodeView = new ApprovalNodeView(); + approvalNodeView.setNode("APPROVING"); + approvalNodeView.setUserName(usernames.toString()); + approvalNodeView.setResult("APPROVING"); + approvalNodeView.setApprovalTime(Timestamp.valueOf(LocalDateTime.now())); + list.add(approvalNodeView); + approvalFlowView.setProofreadNodes(list); + approvalFlowView.setReviewNodes(new ArrayList<>()); + approvalFlowView.setApproveNodes(new ArrayList<>()); + approvalFlowView.setFlowStatus(flow.getFlowStatus()); + return approvalFlowView; + } + approvalFlowView.setProofreadNodes(proofread); + List review = getNodeList(flowId, "REVIEW"); + if (review.isEmpty()) { + List list = new ArrayList<>(); + StringBuilder usernames = new StringBuilder(); + JSON.parseArray(flow.getReviewUsers()).toJavaList(String.class).forEach(id -> { + ApprovalXdapUsers user = bd.getBusinessDatabase() + .eq("id", id) + .doQueryFirst(ApprovalXdapUsers.class); + usernames.append(user.getUsername()).append(" "); + }); + ApprovalNodeView approvalNodeView = new ApprovalNodeView(); + approvalNodeView.setNode("APPROVING"); + approvalNodeView.setUserName(usernames.toString()); + approvalNodeView.setResult("APPROVING"); + approvalNodeView.setApprovalTime(Timestamp.valueOf(LocalDateTime.now())); + list.add(approvalNodeView); + approvalFlowView.setReviewNodes(list); + approvalFlowView.setApproveNodes(new ArrayList<>()); + approvalFlowView.setFlowStatus(flow.getFlowStatus()); + return approvalFlowView; + } + approvalFlowView.setReviewNodes(review); + List approve = getNodeList(flowId, "APPROVE"); + if (approve.isEmpty()) { + List list = new ArrayList<>(); + StringBuilder usernames = new StringBuilder(); + JSON.parseArray(flow.getApproveUsers()).toJavaList(String.class).forEach(id -> { + ApprovalXdapUsers user = bd.getBusinessDatabase() + .eq("id", id) + .doQueryFirst(ApprovalXdapUsers.class); + usernames.append(user.getUsername()).append(" "); + }); + ApprovalNodeView approvalNodeView = new ApprovalNodeView(); + approvalNodeView.setNode("APPROVING"); + approvalNodeView.setUserName(usernames.toString()); + approvalNodeView.setResult("APPROVING"); + approvalNodeView.setApprovalTime(Timestamp.valueOf(LocalDateTime.now())); + list.add(approvalNodeView); + approvalFlowView.setApproveNodes(list); + approvalFlowView.setFlowStatus(flow.getFlowStatus()); + return approvalFlowView; + } + approvalFlowView.setApproveNodes(approve); approvalFlowView.setFlowStatus(flow.getFlowStatus()); return approvalFlowView; } diff --git a/src/main/java/com/xdap/self_development/service/impl/CommonParameterServiceImpl.java b/src/main/java/com/xdap/self_development/service/impl/CommonParameterServiceImpl.java index cb3df85..47c7c92 100644 --- a/src/main/java/com/xdap/self_development/service/impl/CommonParameterServiceImpl.java +++ b/src/main/java/com/xdap/self_development/service/impl/CommonParameterServiceImpl.java @@ -154,28 +154,37 @@ public class CommonParameterServiceImpl implements CommonParameterService { if (parameterList == null || parameterList.isEmpty()) { return new ArrayList<>(); } - - // 先按orderNum排序,然后按子系统分组,保持插入顺序 LinkedHashMap> groupedBySubsystem = parameterList.stream() - .sorted(Comparator.comparingInt(Parameter::getOrderNum)) + .filter(param -> param.getSubsystemName() != null) // 过滤掉 subsystemName 为 null 的参数 + .sorted(Comparator.comparingInt(param -> { + Integer orderNum = param.getOrderNum(); + return orderNum != null ? orderNum : Integer.MAX_VALUE; // null 值的放到最后 + })) .collect(Collectors.groupingBy( Parameter::getSubsystemName, LinkedHashMap::new, // 保持插入顺序 Collectors.toList() )); - return groupedBySubsystem.entrySet().stream() .map(entry -> { ModelCommonItem item = new ModelCommonItem(); item.setSubsystem(entry.getKey()); List parameters = entry.getValue().stream() - .map(param -> new ParametersView( - param.getId(), - param.getParameterName(), - param.getParameterType(), - param.getSubsystemName(), - param.getPartsName() - )) + .filter(Objects::nonNull) // 过滤掉 null 的参数对象 + .map(param -> { + String paramId = param.getId() != null ? param.getId() : ""; + String paramName = param.getParameterName() != null ? param.getParameterName() : ""; + String paramType = param.getParameterType() != null ? param.getParameterType() : ""; + String subsystem = param.getSubsystemName() != null ? param.getSubsystemName() : ""; + String partsName = param.getPartsName() != null ? param.getPartsName() : ""; + return new ParametersView( + paramId, + paramName, + paramType, + subsystem, + partsName + ); + }) .collect(Collectors.toList()); item.setParameters(parameters); return item; @@ -193,17 +202,27 @@ public class CommonParameterServiceImpl implements CommonParameterService { return new ArrayList<>(); } Map> groupedByCommonId = paramsList.stream() + .filter(param -> param.getCommonId() != null) // 过滤掉 commonId 为 null 的参数 .collect(Collectors.groupingBy(ModelCommonParameters::getCommonId)); List result = new ArrayList<>(); for (CommonParameter commonParameter : commonParameters) { + String commonId = commonParameter.getId(); + if (commonId == null) { + continue; + } + List commonParams = groupedByCommonId.get(commonId); + if (commonParams == null || commonParams.isEmpty()) { + continue; + } ModelCommon modelCommon = new ModelCommon(); modelCommon.setCommonName(commonParameter.getCommonName()); - modelCommon.setCommonId(commonParameter.getId()); - - Map> groupedBySubsystem = - groupedByCommonId.get(modelCommon.getCommonId()).stream() + modelCommon.setCommonId(commonId); + Map> groupedBySubsystem = commonParams.stream() + .filter(param -> param.getSubsystemName() != null) // 过滤掉 subsystemName 为 null 的参数 .collect(Collectors.groupingBy(ModelCommonParameters::getSubsystemName)); - + if (groupedBySubsystem.isEmpty()) { + continue; + } List items = new ArrayList<>(); for (Map.Entry> subsystemEntry : groupedBySubsystem.entrySet()) { ModelCommonItem item = new ModelCommonItem(); diff --git a/src/main/java/com/xdap/self_development/service/impl/ParameterServiceImpl.java b/src/main/java/com/xdap/self_development/service/impl/ParameterServiceImpl.java index 0a2f234..e559241 100644 --- a/src/main/java/com/xdap/self_development/service/impl/ParameterServiceImpl.java +++ b/src/main/java/com/xdap/self_development/service/impl/ParameterServiceImpl.java @@ -109,6 +109,7 @@ public class ParameterServiceImpl implements ParameterService { TemplateInfoView result = new TemplateInfoView(); result.setTemplateRowId(newVersionTemplate.getRowId()); result.setVersion(newVersionTemplate.getVersion()); + result.setTemplateId(newVersionTemplate.getId()); return result; } 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 d3044a3..fa200e2 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 @@ -1,9 +1,9 @@ package com.xdap.self_development.service.impl; import com.alibaba.fastjson2.JSON; +import com.definesys.mpaas.log.SWordLogger; import com.definesys.mpaas.query.db.PageQueryResult; import com.xdap.runtime.service.RuntimeDatasourceService; -import com.xdap.self_development.common.UserPermissionGetter; import com.xdap.self_development.config.BusinessDatabase; import com.xdap.self_development.controller.form.*; import com.xdap.self_development.exception.CommonException; @@ -12,12 +12,10 @@ import com.xdap.self_development.pojo.view.ApprovalFlowView; import com.xdap.self_development.pojo.view.ApprovalNodeView; import com.xdap.self_development.pojo.view.TemplateChangeView; import com.xdap.self_development.pojo.view.TodoAndTemplateView; -import com.xdap.self_development.service.DataEntryEngineModelService; import com.xdap.self_development.service.TemplateApprovalService; import com.xdap.self_development.service.XdapDeptUsersService; import com.xdap.self_development.utils.RedisLockUtil; import lombok.extern.slf4j.Slf4j; -import org.springframework.beans.BeanUtils; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.data.redis.core.StringRedisTemplate; import org.springframework.stereotype.Service; @@ -42,11 +40,9 @@ public class TemplateApprovalServiceImpl implements TemplateApprovalService { @Resource private RedisLockUtil redisLockUtil; @Resource - private DataEntryEngineModelService dataEntryEngineModelService; - @Resource - private UserPermissionGetter permissionGetter; - @Resource private XdapDeptUsersService xdapDeptUsersService; + @Autowired + private SWordLogger logger; // 分布式锁标志 private static final String FLOW_LOCK_PREFIX = "approval:lock:"; @@ -295,10 +291,128 @@ public class TemplateApprovalServiceImpl implements TemplateApprovalService { .eq("flow_type", 1) .doQueryFirst(ApprovalFlow.class); approvalFlowView.setExplanation(flow.getExplanation()); - approvalFlowView.setProofreadNodes(getNodeList(form.getFlowId(), "PROOFREAD")); - approvalFlowView.setReviewNodes(getNodeList(form.getFlowId(), "REVIEW")); - approvalFlowView.setCountersignNodes(getNodeList(form.getFlowId(), "COUNTERSIGN")); - approvalFlowView.setApproveNodes(getNodeList(form.getFlowId(), "APPROVE")); + List proofread = getNodeList(form.getFlowId(), "PROOFREAD"); + if (proofread.isEmpty()) { + List list = new ArrayList<>(); + StringBuilder usernames = new StringBuilder(); + JSON.parseArray(flow.getProofreadUsers()).toJavaList(String.class).forEach(id -> { + ApprovalXdapUsers user = bd.getBusinessDatabase() + .eq("id", id) + .doQueryFirst(ApprovalXdapUsers.class); + usernames.append(user.getUsername()).append(" "); + }); + ApprovalNodeView approvalNodeView = new ApprovalNodeView(); + approvalNodeView.setNode("APPROVING"); + approvalNodeView.setUserName(usernames.toString()); + approvalNodeView.setResult("APPROVING"); + approvalNodeView.setApprovalTime(Timestamp.valueOf(LocalDateTime.now())); + list.add(approvalNodeView); + + approvalFlowView.setProofreadNodes(list); + approvalFlowView.setReviewNodes(new ArrayList<>()); + approvalFlowView.setCountersignNodes(new ArrayList<>()); + approvalFlowView.setApproveNodes(new ArrayList<>()); + + approvalFlowView.setFlowStatus(flow.getFlowStatus()); + return approvalFlowView; + } + approvalFlowView.setProofreadNodes(proofread); + List review = getNodeList(flow.getId(), "REVIEW"); + if (review.isEmpty()) { + List list = new ArrayList<>(); + StringBuilder usernames = new StringBuilder(); + JSON.parseArray(flow.getReviewUsers()).toJavaList(String.class).forEach(id -> { + ApprovalXdapUsers user = bd.getBusinessDatabase() + .eq("id", id) + .doQueryFirst(ApprovalXdapUsers.class); + usernames.append(user.getUsername()).append(" "); + }); + ApprovalNodeView approvalNodeView = new ApprovalNodeView(); + approvalNodeView.setNode("APPROVING"); + approvalNodeView.setUserName(usernames.toString()); + approvalNodeView.setResult("APPROVING"); + approvalNodeView.setApprovalTime(Timestamp.valueOf(LocalDateTime.now())); + list.add(approvalNodeView); + + approvalFlowView.setReviewNodes(list); + approvalFlowView.setCountersignNodes(new ArrayList<>()); + approvalFlowView.setApproveNodes(new ArrayList<>()); + + approvalFlowView.setFlowStatus(flow.getFlowStatus()); + return approvalFlowView; + } + approvalFlowView.setReviewNodes(review); + + if (JSON.parseArray(flow.getCountersignUsers()).toJavaList(String.class).isEmpty()) { + approvalFlowView.setCountersignNodes(new ArrayList<>()); + } else { + List countersign = getNodeList(flow.getId(), "COUNTERSIGN"); + if (countersign.isEmpty()) { + List list = new ArrayList<>(); + StringBuilder usernames = new StringBuilder(); + JSON.parseArray(flow.getCountersignUsers()).toJavaList(String.class).forEach(id -> { + ApprovalXdapUsers user = bd.getBusinessDatabase() + .eq("id", id) + .doQueryFirst(ApprovalXdapUsers.class); + usernames.append(user.getUsername()).append(" "); + }); + ApprovalNodeView approvalNodeView = new ApprovalNodeView(); + approvalNodeView.setNode("APPROVING"); + approvalNodeView.setUserName(usernames.toString()); + approvalNodeView.setResult("APPROVING"); + approvalNodeView.setApprovalTime(Timestamp.valueOf(LocalDateTime.now())); + list.add(approvalNodeView); + approvalFlowView.setCountersignNodes(list); + approvalFlowView.setApproveNodes(new ArrayList<>()); + approvalFlowView.setFlowStatus(flow.getFlowStatus()); + return approvalFlowView; + } else { + if (countersign.size() == JSON.parseArray(flow.getCountersignUsers()).size()) { + approvalFlowView.setCountersignNodes(countersign); + } else { + List containedIds = countersign.stream().map(ApprovalNodeView::getUserId).collect(Collectors.toList()); + List uncontainedIds = JSON.parseArray(flow.getCountersignUsers()).toJavaList(String.class).stream().filter(id -> !containedIds.contains(id)).collect(Collectors.toList()); + StringBuilder usernames = new StringBuilder(); + uncontainedIds.forEach(id -> { + ApprovalXdapUsers user = bd.getBusinessDatabase() + .eq("id", id) + .doQueryFirst(ApprovalXdapUsers.class); + usernames.append(user.getUsername()).append(" "); + }); + ApprovalNodeView approvalNodeView = new ApprovalNodeView(); + approvalNodeView.setNode("APPROVING"); + approvalNodeView.setUserName(usernames.toString()); + approvalNodeView.setResult("APPROVING"); + approvalNodeView.setApprovalTime(Timestamp.valueOf(LocalDateTime.now())); + countersign.add(approvalNodeView); + approvalFlowView.setCountersignNodes(countersign); + approvalFlowView.setApproveNodes(new ArrayList<>()); + return approvalFlowView; + } + } + } + + List approve = getNodeList(flow.getId(), "APPROVE"); + if (approve.isEmpty()) { + List list = new ArrayList<>(); + StringBuilder usernames = new StringBuilder(); + JSON.parseArray(flow.getApproveUsers()).toJavaList(String.class).forEach(id -> { + ApprovalXdapUsers user = bd.getBusinessDatabase() + .eq("id", id) + .doQueryFirst(ApprovalXdapUsers.class); + usernames.append(user.getUsername()).append(" "); + }); + ApprovalNodeView approvalNodeView = new ApprovalNodeView(); + approvalNodeView.setNode("APPROVING"); + approvalNodeView.setUserName(usernames.toString()); + approvalNodeView.setResult("APPROVING"); + approvalNodeView.setApprovalTime(Timestamp.valueOf(LocalDateTime.now())); + list.add(approvalNodeView); + approvalFlowView.setApproveNodes(list); + approvalFlowView.setFlowStatus(flow.getFlowStatus()); + return approvalFlowView; + } + approvalFlowView.setApproveNodes(approve); approvalFlowView.setFlowStatus(flow.getFlowStatus()); return approvalFlowView; diff --git a/src/main/resources/application.properties b/src/main/resources/application.properties index c6072a0..1caca57 100644 --- a/src/main/resources/application.properties +++ b/src/main/resources/application.properties @@ -84,6 +84,8 @@ mpaas.query.security.mode=custom mpaas.query.dbvendor=mysql mpaas.query.bigdatathresholdvalue=100000 +mpaas.mode=DEV + # ====================== Activiti ????? ====================== activiti.datasource.driverClassName=com.mysql.cj.jdbc.Driver activiti.datasource.url=jdbc:mysql://127.0.0.1:3306/activiti_demo?serverTimezone=Asia/Shanghai&characterEncoding=utf-8 diff --git a/src/main/resources/sql.sql b/src/main/resources/sql.sql index a3ffb5b..3bc96f4 100644 --- a/src/main/resources/sql.sql +++ b/src/main/resources/sql.sql @@ -116,16 +116,20 @@ CREATE TABLE yc_datasource_0.yfsjglpt_model_role_permission( DELETE FROM yfsjglpt_model_template; DELETE FROM yfsjglpt_model_parameter_and_template; DELETE FROM yfsjglpt_model_parameter; +DELETE FROM yfsjglpt_model_revision_record; +DELETE FROM yfsjglpt_model_benchmarking_report; + DELETE FROM yfsjglpt_model_approval_flow; DELETE FROM yfsjglpt_model_approval_record; + DELETE FROM yfsjglpt_model_responsible_person; -DELETE FROM yfsjglpt_model_benchmarking_report; -DELETE FROM yfsjglpt_model_revision_record; + + delete from data_entry_engine_model; delete from engine_param_detail; delete from todo_task; -delete from data_change_comment; -delete from approval_config ; +delete from data_change_comment; +delete from approval_config ; delete from engine_review_list; delete from param_approval_record; \ No newline at end of file