🐛 修复自选审批节点在我的发起里面查看的 NPE 问题

(cherry picked from commit 4105af1c013af5bea824e3ac485b6b6482e06d46)
This commit is contained in:
冷冷 committed 2024-05-10 15:58:54 +08:00
1 parent 946dcdaf99
commit a78682d49f
1 file changed
+219 -221
@@ -32,272 +32,270 @@ import java.util.stream.Collectors;
*/ */
public class NodeFormatUtil { public class NodeFormatUtil {
/** /**
* 格式化流程节点显示 * 格式化流程节点显示
* @param node *
* @param completeNodeSet * @param node
* @param continueNodeSet * @param completeNodeSet
* @param processInstanceId * @param continueNodeSet
* @param paramMap * @param processInstanceId
*/ * @param paramMap
@SneakyThrows */
public static List<NodeVo> formatProcessNodeShow(Node node, Set<String> completeNodeSet, @SneakyThrows
Set<String> continueNodeSet, String processInstanceId, Map<String, Object> paramMap) { public static List<NodeVo> formatProcessNodeShow(Node node, Set<String> completeNodeSet,
List<NodeVo> list = new ArrayList<>(); Set<String> continueNodeSet, String processInstanceId, Map<String, Object> paramMap) {
List<NodeVo> list = new ArrayList<>();
if (!NodeUtil.isNode(node)) { if (!NodeUtil.isNode(node)) {
return list; return list;
} }
String name = node.getName(); String name = node.getName();
Integer type = node.getType(); Integer type = node.getType();
// SELF_SELECT // SELF_SELECT
NodeVo nodeVo = new NodeVo(); NodeVo nodeVo = new NodeVo();
nodeVo.setId(node.getId()); nodeVo.setId(node.getId());
nodeVo.setName(name); nodeVo.setName(name);
nodeVo.setType(type); nodeVo.setType(type);
nodeVo.setStatus(NodeStatusEnum.WKS.getCode()); nodeVo.setStatus(NodeStatusEnum.WKS.getCode());
if (completeNodeSet.contains(node.getId())) { if (completeNodeSet.contains(node.getId())) {
nodeVo.setStatus(NodeStatusEnum.YJS.getCode()); nodeVo.setStatus(NodeStatusEnum.YJS.getCode());
} }
if (continueNodeSet.contains(node.getId())) { if (continueNodeSet.contains(node.getId())) {
nodeVo.setStatus(NodeStatusEnum.JXZ.getCode()); nodeVo.setStatus(NodeStatusEnum.JXZ.getCode());
} }
{ {
nodeVo.setPlaceholder(node.getPlaceHolder());
}
nodeVo.setPlaceholder(node.getPlaceHolder()); List<UserVo> userVoList = new ArrayList<>();
if (type == NodeTypeEnum.APPROVAL.getValue().intValue()) {
} Integer assignedType = node.getAssignedType();
List<UserVo> userVoList = new ArrayList<>(); boolean selfSelect = assignedType == ProcessInstanceConstant.AssignedTypeClass.SELF_SELECT;
if (type == NodeTypeEnum.APPROVAL.getValue().intValue()) { nodeVo.setSelectUser(selfSelect);
if (selfSelect) {
nodeVo.setMultiple(node.getMultiple());
}
Integer assignedType = node.getAssignedType(); // 用户列表
if (StrUtil.isNotBlank(processInstanceId)) {
IProcessNodeRecordAssignUserService processNodeRecordAssignUserService = SpringUtil
.getBean(IProcessNodeRecordAssignUserService.class);
List<ProcessNodeRecordAssignUser> processNodeRecordAssignUserList = processNodeRecordAssignUserService
.lambdaQuery()
.eq(ProcessNodeRecordAssignUser::getNodeId, node.getId())
.eq(ProcessNodeRecordAssignUser::getProcessInstanceId, processInstanceId)
.orderByAsc(ProcessNodeRecordAssignUser::getCreateTime)
.list();
Map<String, List<ProcessNodeRecordAssignUser>> map = processNodeRecordAssignUserList.stream()
.collect(Collectors.groupingBy(ProcessNodeRecordAssignUser::getTaskId));
boolean selfSelect = assignedType == ProcessInstanceConstant.AssignedTypeClass.SELF_SELECT; for (Map.Entry<String, List<ProcessNodeRecordAssignUser>> entry : map.entrySet()) {
nodeVo.setSelectUser(selfSelect); List<ProcessNodeRecordAssignUser> value = entry.getValue();
if (selfSelect) { List<UserVo> collect = value.stream().map(w -> {
nodeVo.setMultiple(node.getMultiple()); UserVo userVo = buildUser(Long.parseLong(w.getUserId()));
} userVo.setShowTime(w.getEndTime());
userVo.setApproveDesc(w.getApproveDesc());
userVo.setStatus(w.getStatus());
userVo.setOperType(w.getTaskType());
return userVo;
}).toList();
userVoList.addAll(collect);
}
// 用户列表 if (processNodeRecordAssignUserList.isEmpty()) {
if (StrUtil.isNotBlank(processInstanceId)) { if (assignedType == ProcessInstanceConstant.AssignedTypeClass.SELF) {
IProcessNodeRecordAssignUserService processNodeRecordAssignUserService = SpringUtil // 发起人自己
.getBean(IProcessNodeRecordAssignUserService.class); userVoList.addAll(CollUtil.newArrayList(buildRootUser(processInstanceId)));
List<ProcessNodeRecordAssignUser> processNodeRecordAssignUserList = processNodeRecordAssignUserService }
.lambdaQuery() if (assignedType == ProcessInstanceConstant.AssignedTypeClass.SELF_SELECT) {
.eq(ProcessNodeRecordAssignUser::getNodeId, node.getId()) // 发起人自选
.eq(ProcessNodeRecordAssignUser::getProcessInstanceId, processInstanceId) Object variable = paramMap.get(StrUtil.format("{}_assignee_select", node.getId()));
.orderByAsc(ProcessNodeRecordAssignUser::getCreateTime)
.list();
Map<String, List<ProcessNodeRecordAssignUser>> map = processNodeRecordAssignUserList.stream()
.collect(Collectors.groupingBy(ProcessNodeRecordAssignUser::getTaskId));
for (Map.Entry<String, List<ProcessNodeRecordAssignUser>> entry : map.entrySet()) { ObjectMapper objectMapper = SpringUtil.getBean(ObjectMapper.class);
List<ProcessNodeRecordAssignUser> value = entry.getValue(); List<NodeUser> nodeUserDtos = objectMapper.readValue(objectMapper.writeValueAsString(variable),
List<UserVo> collect = value.stream().map(w -> { new TypeReference<>() {
UserVo userVo = buildUser(Long.parseLong(w.getUserId())); });
userVo.setShowTime(w.getEndTime());
userVo.setApproveDesc(w.getApproveDesc());
userVo.setStatus(w.getStatus());
userVo.setOperType(w.getTaskType());
return userVo;
}).toList();
userVoList.addAll(collect);
}
if (processNodeRecordAssignUserList.isEmpty()) { if (CollUtil.isNotEmpty(nodeUserDtos)) {
if (assignedType == ProcessInstanceConstant.AssignedTypeClass.SELF) { List<Long> collect = nodeUserDtos.stream().map(w -> Long.valueOf(w.getId())).toList();
// 发起人自己 for (Long aLong : collect) {
userVoList.addAll(CollUtil.newArrayList(buildRootUser(processInstanceId))); UserVo userVo = buildUser(aLong);
} userVoList.addAll(CollUtil.newArrayList(userVo));
if (assignedType == ProcessInstanceConstant.AssignedTypeClass.SELF_SELECT) { }
// 发起人自选 }
Object variable = paramMap.get(StrUtil.format("{}_assignee_select", node.getId()));
ObjectMapper objectMapper = SpringUtil.getBean(ObjectMapper.class); }
List<NodeUser> nodeUserDtos = objectMapper.readValue(objectMapper.writeValueAsString(variable), }
new TypeReference<>() {
});
List<Long> collect = nodeUserDtos.stream().map(w -> Long.valueOf(w.getId())).toList(); } else if (assignedType == ProcessInstanceConstant.AssignedTypeClass.USER) {
for (Long aLong : collect) { // 指定用户
UserVo userVo = buildUser(aLong);
userVoList.addAll(CollUtil.newArrayList(userVo));
}
}
}
} List<NodeUser> nodeUserList = node.getNodeUserList();
else if (assignedType == ProcessInstanceConstant.AssignedTypeClass.USER) { List<UserVo> tempList = buildUser(nodeUserList);
// 指定用户 userVoList.addAll(tempList);
List<NodeUser> nodeUserList = node.getNodeUserList(); } else if (assignedType == ProcessInstanceConstant.AssignedTypeClass.FORM_USER) {
List<UserVo> tempList = buildUser(nodeUserList); // 表单人员
userVoList.addAll(tempList); String formUser = node.getFormUserId();
} Object o = paramMap.get(formUser);
else if (assignedType == ProcessInstanceConstant.AssignedTypeClass.FORM_USER) { if (o != null) {
// 表单人员 ObjectMapper objectMapper = SpringUtil.getBean(ObjectMapper.class);
String formUser = node.getFormUserId(); String jsonString = objectMapper.writeValueAsString(o);
if (StrUtil.isNotBlank(jsonString)) {
List<NodeUser> nodeUserDtoList = objectMapper.readValue(jsonString, new TypeReference<>() {
});
List<Long> userIdList = nodeUserDtoList.stream().map(NodeUser::getId).toList();
for (Long aLong : userIdList) {
userVoList.addAll(CollUtil.newArrayList(buildUser(aLong)));
}
}
}
Object o = paramMap.get(formUser); } else if (assignedType == ProcessInstanceConstant.AssignedTypeClass.SELF) {
if (o != null) { // 发起人自己
ObjectMapper objectMapper = SpringUtil.getBean(ObjectMapper.class); userVoList.addAll(CollUtil.newArrayList(buildUser(SecurityUtils.getUser().getId())));
String jsonString = objectMapper.writeValueAsString(o); }
if (StrUtil.isNotBlank(jsonString)) {
List<NodeUser> nodeUserDtoList = objectMapper.readValue(jsonString, new TypeReference<>() {
});
List<Long> userIdList = nodeUserDtoList.stream().map(NodeUser::getId).toList();
for (Long aLong : userIdList) {
userVoList.addAll(CollUtil.newArrayList(buildUser(aLong)));
}
}
}
} } else if (Objects.equals(node.getType(), NodeTypeEnum.ROOT.getValue())) {
else if (assignedType == ProcessInstanceConstant.AssignedTypeClass.SELF) { // 发起节点
// 发起人自己 if (StrUtil.isBlank(processInstanceId)) {
userVoList.addAll(CollUtil.newArrayList(buildUser(SecurityUtils.getUser().getId()))); UserVo userVo = buildUser(SecurityUtils.getUser().getId());
} userVoList.addAll(CollUtil.newArrayList(userVo));
} else {
} IProcessInstanceRecordService processInstanceRecordService = SpringUtil
else if (Objects.equals(node.getType(), NodeTypeEnum.ROOT.getValue())) { .getBean(IProcessInstanceRecordService.class);
// 发起节点 ProcessInstanceRecord processInstanceRecord = processInstanceRecordService.lambdaQuery()
if (StrUtil.isBlank(processInstanceId)) { .eq(ProcessInstanceRecord::getProcessInstanceId, processInstanceId)
UserVo userVo = buildUser(SecurityUtils.getUser().getId()); .one();
userVoList.addAll(CollUtil.newArrayList(userVo));
}
else {
IProcessInstanceRecordService processInstanceRecordService = SpringUtil UserVo userVo = buildRootUser(processInstanceId);
.getBean(IProcessInstanceRecordService.class); userVo.setShowTime(processInstanceRecord.getCreateTime());
ProcessInstanceRecord processInstanceRecord = processInstanceRecordService.lambdaQuery() userVo.setStatus(NodeStatusEnum.YJS.getCode());
.eq(ProcessInstanceRecord::getProcessInstanceId, processInstanceId) userVoList.addAll(CollUtil.newArrayList(userVo));
.one();
UserVo userVo = buildRootUser(processInstanceId); }
userVo.setShowTime(processInstanceRecord.getCreateTime()); } else if (node.getType() == NodeTypeEnum.CC.getValue()) {
userVo.setStatus(NodeStatusEnum.YJS.getCode()); // 抄送节点
userVoList.addAll(CollUtil.newArrayList(userVo));
} List<NodeUser> nodeUserList = node.getNodeUserList();
}
else if (node.getType() == NodeTypeEnum.CC.getValue()) {
// 抄送节点
List<NodeUser> nodeUserList = node.getNodeUserList(); List<UserVo> tempList = buildUser(nodeUserList);
userVoList.addAll(tempList);
List<UserVo> tempList = buildUser(nodeUserList); }
userVoList.addAll(tempList); nodeVo.setUserVoList(userVoList);
} List<NodeVo> branchList = new ArrayList<>();
nodeVo.setUserVoList(userVoList);
List<NodeVo> branchList = new ArrayList<>(); if (type == NodeTypeEnum.EXCLUSIVE_GATEWAY.getValue().intValue()
|| type == NodeTypeEnum.PARALLEL_GATEWAY.getValue().intValue()) {
// 条件分支
List<Node> branchs = node.getConditionNodes();
if (type == NodeTypeEnum.EXCLUSIVE_GATEWAY.getValue().intValue() for (Node branch : branchs) {
|| type == NodeTypeEnum.PARALLEL_GATEWAY.getValue().intValue()) { Node children = branch.getChildren();
// 条件分支 List<NodeVo> processNodeShowDtos = formatProcessNodeShow(children, completeNodeSet, continueNodeSet,
List<Node> branchs = node.getConditionNodes(); processInstanceId, paramMap);
for (Node branch : branchs) { NodeVo p = new NodeVo();
Node children = branch.getChildren(); p.setChildren(processNodeShowDtos);
List<NodeVo> processNodeShowDtos = formatProcessNodeShow(children, completeNodeSet, continueNodeSet,
processInstanceId, paramMap);
NodeVo p = new NodeVo(); p.setPlaceholder(branch.getPlaceHolder());
p.setChildren(processNodeShowDtos); branchList.add(p);
}
}
nodeVo.setBranch(branchList);
p.setPlaceholder(branch.getPlaceHolder()); list.add(nodeVo);
branchList.add(p);
}
}
nodeVo.setBranch(branchList);
list.add(nodeVo); List<NodeVo> next = formatProcessNodeShow(node.getChildren(), completeNodeSet, continueNodeSet,
processInstanceId, paramMap);
list.addAll(next);
List<NodeVo> next = formatProcessNodeShow(node.getChildren(), completeNodeSet, continueNodeSet, return list;
processInstanceId, paramMap); }
list.addAll(next);
return list; /**
} * 根据实例id
*
* @param processInstanceId
* @return
*/
private static UserVo buildRootUser(String processInstanceId) {
/** IProcessInstanceRecordService processInstanceRecordService = SpringUtil
* 根据实例id .getBean(IProcessInstanceRecordService.class);
* @param processInstanceId ProcessInstanceRecord processInstanceRecord = processInstanceRecordService.lambdaQuery()
* @return .eq(ProcessInstanceRecord::getProcessInstanceId, processInstanceId)
*/ .one();
private static UserVo buildRootUser(String processInstanceId) { Long userId = processInstanceRecord.getUserId();
UserVo userVo = buildUser(userId);
return userVo;
}
IProcessInstanceRecordService processInstanceRecordService = SpringUtil /**
.getBean(IProcessInstanceRecordService.class); * 根据用户id
ProcessInstanceRecord processInstanceRecord = processInstanceRecordService.lambdaQuery() *
.eq(ProcessInstanceRecord::getProcessInstanceId, processInstanceId) * @param userId
.one(); * @return
Long userId = processInstanceRecord.getUserId(); */
UserVo userVo = buildUser(userId); private static UserVo buildUser(long userId) {
return userVo; if (ProcessInstanceConstant.DEFAULT_EMPTY_ASSIGN == userId) {
} return UserVo.builder().id(userId).build();
}
/** RemoteUserService userService = SpringUtil.getBean(RemoteUserService.class);
* 根据用户id SysUser user = userService.getUserById(userId).getData();
* @param userId if (user == null) {
* @return return null;
*/ }
private static UserVo buildUser(long userId) {
if (ProcessInstanceConstant.DEFAULT_EMPTY_ASSIGN == userId){
return UserVo.builder().id(userId).build();
}
RemoteUserService userService = SpringUtil.getBean(RemoteUserService.class); return UserVo.builder().id(userId).name(user.getName()).avatar(user.getAvatar()).build();
SysUser user = userService.getUserById(userId).getData(); }
if (user == null) {
return null;
}
return UserVo.builder().id(userId).name(user.getName()).avatar(user.getAvatar()).build(); private static List<UserVo> buildUser(List<NodeUser> nodeUserList) {
} List<UserVo> userVoList = new ArrayList<>();
// 用户id
List<Long> userIdList = nodeUserList.stream()
.filter(w -> StrUtil.equals(w.getType(), NodeUserTypeEnum.USER.getKey()))
.map(w -> Convert.toLong(w.getId()))
.collect(Collectors.toList());
// 部门id
List<Long> deptIdList = nodeUserList.stream()
.filter(w -> StrUtil.equals(w.getType(), NodeUserTypeEnum.DEPT.getKey()))
.map(w -> Convert.toLong(w.getId()))
.collect(Collectors.toList());
private static List<UserVo> buildUser(List<NodeUser> nodeUserList) { if (CollUtil.isNotEmpty(deptIdList)) {
List<UserVo> userVoList = new ArrayList<>();
// 用户id
List<Long> userIdList = nodeUserList.stream()
.filter(w -> StrUtil.equals(w.getType(), NodeUserTypeEnum.USER.getKey()))
.map(w -> Convert.toLong(w.getId()))
.collect(Collectors.toList());
// 部门id
List<Long> deptIdList = nodeUserList.stream()
.filter(w -> StrUtil.equals(w.getType(), NodeUserTypeEnum.DEPT.getKey()))
.map(w -> Convert.toLong(w.getId()))
.collect(Collectors.toList());
if (CollUtil.isNotEmpty(deptIdList)) { IRemoteService iRemoteService = SpringUtil.getBean(IRemoteService.class);
IRemoteService iRemoteService = SpringUtil.getBean(IRemoteService.class); List<Long> data = iRemoteService.queryUserIdListByDepIdList(deptIdList).getData();
List<Long> data = iRemoteService.queryUserIdListByDepIdList(deptIdList).getData(); if (CollUtil.isNotEmpty(data)) {
for (long datum : data) {
if (CollUtil.isNotEmpty(data)) { if (!userIdList.contains(datum)) {
for (long datum : data) { userIdList.add(datum);
if (!userIdList.contains(datum)) { }
userIdList.add(datum); }
} }
} }
} {
} for (Long aLong : userIdList) {
{ userVoList.addAll(CollUtil.newArrayList(buildUser(aLong)));
for (Long aLong : userIdList) { }
userVoList.addAll(CollUtil.newArrayList(buildUser(aLong))); }
} return userVoList;
} }
return userVoList;
}
} }