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

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
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<Parameter> {
data.setPartsName("/");
}
if (data.getParameterNumber() == null) {
problems.setFlag(true);
problems.getErrors().add(currentSheetName +"模板的参数"+data.getParameterName()+"的序号字段为空");
return;
}
if (currentSheetName == null) {
currentSheetName = context.readSheetHolder().getSheetName();
}

View File

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

View File

@ -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<ApprovalNodeView> proofread = getNodeList(flowId, "PROOFREAD");
if (proofread.isEmpty()) {
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());
return approvalFlowView;
}

View File

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

View File

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

View File

@ -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<ApprovalNodeView> proofread = getNodeList(form.getFlowId(), "PROOFREAD");
if (proofread.isEmpty()) {
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.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());
return approvalFlowView;

View File

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

View File

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