修改:常用获取空值问题和导入空值检查

This commit is contained in:
zjh 2025-12-17 16:29:30 +08:00
parent 225ffcbd93
commit d549bc4de4
8 changed files with 245 additions and 48 deletions

View File

@ -59,15 +59,15 @@ public class SheetDataListener implements ReadListener<Parameter> {
@Override @Override
public void invoke(Parameter data, AnalysisContext context) { public void invoke(Parameter data, AnalysisContext context) {
// 第一次读取数据时检查表头 // 第一次读取数据时检查表头
if (!headerChecked) { // if (!headerChecked) {
checkHeaderAndSkipIfNeeded(context); // checkHeaderAndSkipIfNeeded(context);
headerChecked = true; // headerChecked = true;
} // }
// 如果sheet无效直接返回不处理数据 // 如果sheet无效直接返回不处理数据
if (!validSheet) { // if (!validSheet) {
return; // return;
} // }
if (data.getSubsystemName() == null) { if (data.getSubsystemName() == null) {
problems.setFlag(true); problems.setFlag(true);
@ -79,12 +79,6 @@ public class SheetDataListener implements ReadListener<Parameter> {
data.setPartsName("/"); data.setPartsName("/");
} }
if (data.getParameterNumber() == null) {
problems.setFlag(true);
problems.getErrors().add(currentSheetName +"模板的参数"+data.getParameterName()+"的序号字段为空");
return;
}
if (currentSheetName == null) { if (currentSheetName == null) {
currentSheetName = context.readSheetHolder().getSheetName(); currentSheetName = context.readSheetHolder().getSheetName();
} }

View File

@ -5,5 +5,6 @@ import lombok.Data;
@Data @Data
public class TemplateInfoView { public class TemplateInfoView {
private String templateRowId; private String templateRowId;
private String templateId;
private Integer version; private Integer version;
} }

View File

@ -311,10 +311,72 @@ public class BenchmarkingReportServiceImpl implements BenchmarkingReportService
.eq("flow_type", 2) .eq("flow_type", 2)
.doQueryFirst(ApprovalFlow.class); .doQueryFirst(ApprovalFlow.class);
approvalFlowView.setExplanation(flow.getExplanation()); approvalFlowView.setExplanation(flow.getExplanation());
approvalFlowView.setProofreadNodes(getNodeList(flowId, "PROOFREAD")); List<ApprovalNodeView> proofread = getNodeList(flowId, "PROOFREAD");
approvalFlowView.setReviewNodes(getNodeList(flowId, "REVIEW")); if (proofread.isEmpty()) {
approvalFlowView.setApproveNodes(getNodeList(flowId, "APPROVE")); List<ApprovalNodeView> 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<ApprovalNodeView> review = getNodeList(flowId, "REVIEW");
if (review.isEmpty()) {
List<ApprovalNodeView> 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<ApprovalNodeView> approve = getNodeList(flowId, "APPROVE");
if (approve.isEmpty()) {
List<ApprovalNodeView> 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()); approvalFlowView.setFlowStatus(flow.getFlowStatus());
return approvalFlowView; return approvalFlowView;
} }

View File

@ -154,28 +154,37 @@ public class CommonParameterServiceImpl implements CommonParameterService {
if (parameterList == null || parameterList.isEmpty()) { if (parameterList == null || parameterList.isEmpty()) {
return new ArrayList<>(); return new ArrayList<>();
} }
// 先按orderNum排序然后按子系统分组保持插入顺序
LinkedHashMap<String, List<Parameter>> groupedBySubsystem = parameterList.stream() LinkedHashMap<String, List<Parameter>> 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( .collect(Collectors.groupingBy(
Parameter::getSubsystemName, Parameter::getSubsystemName,
LinkedHashMap::new, // 保持插入顺序 LinkedHashMap::new, // 保持插入顺序
Collectors.toList() Collectors.toList()
)); ));
return groupedBySubsystem.entrySet().stream() return groupedBySubsystem.entrySet().stream()
.map(entry -> { .map(entry -> {
ModelCommonItem item = new ModelCommonItem(); ModelCommonItem item = new ModelCommonItem();
item.setSubsystem(entry.getKey()); item.setSubsystem(entry.getKey());
List<ParametersView> parameters = entry.getValue().stream() List<ParametersView> parameters = entry.getValue().stream()
.map(param -> new ParametersView( .filter(Objects::nonNull) // 过滤掉 null 的参数对象
param.getId(), .map(param -> {
param.getParameterName(), String paramId = param.getId() != null ? param.getId() : "";
param.getParameterType(), String paramName = param.getParameterName() != null ? param.getParameterName() : "";
param.getSubsystemName(), String paramType = param.getParameterType() != null ? param.getParameterType() : "";
param.getPartsName() 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()); .collect(Collectors.toList());
item.setParameters(parameters); item.setParameters(parameters);
return item; return item;
@ -193,17 +202,27 @@ public class CommonParameterServiceImpl implements CommonParameterService {
return new ArrayList<>(); return new ArrayList<>();
} }
Map<String, List<ModelCommonParameters>> groupedByCommonId = paramsList.stream() Map<String, List<ModelCommonParameters>> groupedByCommonId = paramsList.stream()
.filter(param -> param.getCommonId() != null) // 过滤掉 commonId null 的参数
.collect(Collectors.groupingBy(ModelCommonParameters::getCommonId)); .collect(Collectors.groupingBy(ModelCommonParameters::getCommonId));
List<ModelCommon> result = new ArrayList<>(); List<ModelCommon> result = new ArrayList<>();
for (CommonParameter commonParameter : commonParameters) { for (CommonParameter commonParameter : commonParameters) {
String commonId = commonParameter.getId();
if (commonId == null) {
continue;
}
List<ModelCommonParameters> commonParams = groupedByCommonId.get(commonId);
if (commonParams == null || commonParams.isEmpty()) {
continue;
}
ModelCommon modelCommon = new ModelCommon(); ModelCommon modelCommon = new ModelCommon();
modelCommon.setCommonName(commonParameter.getCommonName()); modelCommon.setCommonName(commonParameter.getCommonName());
modelCommon.setCommonId(commonParameter.getId()); modelCommon.setCommonId(commonId);
Map<String, List<ModelCommonParameters>> groupedBySubsystem = commonParams.stream()
Map<String, List<ModelCommonParameters>> groupedBySubsystem = .filter(param -> param.getSubsystemName() != null) // 过滤掉 subsystemName null 的参数
groupedByCommonId.get(modelCommon.getCommonId()).stream()
.collect(Collectors.groupingBy(ModelCommonParameters::getSubsystemName)); .collect(Collectors.groupingBy(ModelCommonParameters::getSubsystemName));
if (groupedBySubsystem.isEmpty()) {
continue;
}
List<ModelCommonItem> items = new ArrayList<>(); List<ModelCommonItem> items = new ArrayList<>();
for (Map.Entry<String, List<ModelCommonParameters>> subsystemEntry : groupedBySubsystem.entrySet()) { for (Map.Entry<String, List<ModelCommonParameters>> subsystemEntry : groupedBySubsystem.entrySet()) {
ModelCommonItem item = new ModelCommonItem(); ModelCommonItem item = new ModelCommonItem();

View File

@ -109,6 +109,7 @@ public class ParameterServiceImpl implements ParameterService {
TemplateInfoView result = new TemplateInfoView(); TemplateInfoView result = new TemplateInfoView();
result.setTemplateRowId(newVersionTemplate.getRowId()); result.setTemplateRowId(newVersionTemplate.getRowId());
result.setVersion(newVersionTemplate.getVersion()); result.setVersion(newVersionTemplate.getVersion());
result.setTemplateId(newVersionTemplate.getId());
return result; return result;
} }

View File

@ -1,9 +1,9 @@
package com.xdap.self_development.service.impl; package com.xdap.self_development.service.impl;
import com.alibaba.fastjson2.JSON; import com.alibaba.fastjson2.JSON;
import com.definesys.mpaas.log.SWordLogger;
import com.definesys.mpaas.query.db.PageQueryResult; import com.definesys.mpaas.query.db.PageQueryResult;
import com.xdap.runtime.service.RuntimeDatasourceService; 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.config.BusinessDatabase;
import com.xdap.self_development.controller.form.*; import com.xdap.self_development.controller.form.*;
import com.xdap.self_development.exception.CommonException; 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.ApprovalNodeView;
import com.xdap.self_development.pojo.view.TemplateChangeView; import com.xdap.self_development.pojo.view.TemplateChangeView;
import com.xdap.self_development.pojo.view.TodoAndTemplateView; 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.TemplateApprovalService;
import com.xdap.self_development.service.XdapDeptUsersService; import com.xdap.self_development.service.XdapDeptUsersService;
import com.xdap.self_development.utils.RedisLockUtil; import com.xdap.self_development.utils.RedisLockUtil;
import lombok.extern.slf4j.Slf4j; import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.BeanUtils;
import org.springframework.beans.factory.annotation.Autowired; import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.data.redis.core.StringRedisTemplate; import org.springframework.data.redis.core.StringRedisTemplate;
import org.springframework.stereotype.Service; import org.springframework.stereotype.Service;
@ -42,11 +40,9 @@ public class TemplateApprovalServiceImpl implements TemplateApprovalService {
@Resource @Resource
private RedisLockUtil redisLockUtil; private RedisLockUtil redisLockUtil;
@Resource @Resource
private DataEntryEngineModelService dataEntryEngineModelService;
@Resource
private UserPermissionGetter permissionGetter;
@Resource
private XdapDeptUsersService xdapDeptUsersService; private XdapDeptUsersService xdapDeptUsersService;
@Autowired
private SWordLogger logger;
// 分布式锁标志 // 分布式锁标志
private static final String FLOW_LOCK_PREFIX = "approval:lock:"; private static final String FLOW_LOCK_PREFIX = "approval:lock:";
@ -295,10 +291,128 @@ public class TemplateApprovalServiceImpl implements TemplateApprovalService {
.eq("flow_type", 1) .eq("flow_type", 1)
.doQueryFirst(ApprovalFlow.class); .doQueryFirst(ApprovalFlow.class);
approvalFlowView.setExplanation(flow.getExplanation()); approvalFlowView.setExplanation(flow.getExplanation());
approvalFlowView.setProofreadNodes(getNodeList(form.getFlowId(), "PROOFREAD")); List<ApprovalNodeView> proofread = getNodeList(form.getFlowId(), "PROOFREAD");
approvalFlowView.setReviewNodes(getNodeList(form.getFlowId(), "REVIEW")); if (proofread.isEmpty()) {
approvalFlowView.setCountersignNodes(getNodeList(form.getFlowId(), "COUNTERSIGN")); List<ApprovalNodeView> list = new ArrayList<>();
approvalFlowView.setApproveNodes(getNodeList(form.getFlowId(), "APPROVE")); 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<ApprovalNodeView> review = getNodeList(flow.getId(), "REVIEW");
if (review.isEmpty()) {
List<ApprovalNodeView> 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<ApprovalNodeView> countersign = getNodeList(flow.getId(), "COUNTERSIGN");
if (countersign.isEmpty()) {
List<ApprovalNodeView> 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<String> containedIds = countersign.stream().map(ApprovalNodeView::getUserId).collect(Collectors.toList());
List<String> 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<ApprovalNodeView> approve = getNodeList(flow.getId(), "APPROVE");
if (approve.isEmpty()) {
List<ApprovalNodeView> 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()); approvalFlowView.setFlowStatus(flow.getFlowStatus());
return approvalFlowView; return approvalFlowView;

View File

@ -84,6 +84,8 @@ mpaas.query.security.mode=custom
mpaas.query.dbvendor=mysql mpaas.query.dbvendor=mysql
mpaas.query.bigdatathresholdvalue=100000 mpaas.query.bigdatathresholdvalue=100000
mpaas.mode=DEV
# ====================== Activiti ????? ====================== # ====================== Activiti ????? ======================
activiti.datasource.driverClassName=com.mysql.cj.jdbc.Driver 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 activiti.datasource.url=jdbc:mysql://127.0.0.1:3306/activiti_demo?serverTimezone=Asia/Shanghai&characterEncoding=utf-8

View File

@ -116,16 +116,20 @@ CREATE TABLE yc_datasource_0.yfsjglpt_model_role_permission(
DELETE FROM yfsjglpt_model_template; DELETE FROM yfsjglpt_model_template;
DELETE FROM yfsjglpt_model_parameter_and_template; DELETE FROM yfsjglpt_model_parameter_and_template;
DELETE FROM yfsjglpt_model_parameter; 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_flow;
DELETE FROM yfsjglpt_model_approval_record; DELETE FROM yfsjglpt_model_approval_record;
DELETE FROM yfsjglpt_model_responsible_person; 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 data_entry_engine_model;
delete from engine_param_detail; delete from engine_param_detail;
delete from todo_task; delete from todo_task;
delete from data_change_comment; delete from data_change_comment;
delete from approval_config ; delete from approval_config ;
delete from engine_review_list; delete from engine_review_list;
delete from param_approval_record; delete from param_approval_record;