business/src/main/java/com/ycl/domain/vo/CustomerTaskVO.java
@@ -21,6 +21,11 @@ private String taskId; /** * 任务定义id */ private String taskDefinitionKey; /** * flowable流程实例id */ private String processInsId; @@ -53,7 +58,7 @@ /** * 发起人id */ private Long promoterId; private String promoterId; /** * 发起人姓名 @@ -63,7 +68,7 @@ /** * 发起人单位 */ private Long promoterUnitId; private String promoterUnitId; /** * 发起人单位名称 business/src/main/java/com/ycl/service/impl/ProjectProcessServiceImpl.java
@@ -277,16 +277,11 @@ taskVO.setDeployId(pd.getDeploymentId()); taskVO.setProcessName(pd.getName()); taskVO.setProcessInsId(task.getProcessInstanceId()); taskVO.setTaskDefinitionKey(task.getTaskDefinitionKey()); // 流程发起人信息 HistoricProcessInstance historicProcessInstance = historyService.createHistoricProcessInstanceQuery() .processInstanceId(task.getProcessInstanceId()) .singleResult(); SysUser startUser = sysUserService.selectUserById(Long.parseLong(historicProcessInstance.getStartUserId())); taskVO.setPromoterId(startUser.getUserId()); taskVO.setPromoterName(startUser.getNickName()); taskVO.setPromoterUnitName(Objects.nonNull(startUser.getDept()) ? startUser.getDept().getDeptName() : ""); taskVO.setPromoterUnitId(Objects.nonNull(startUser.getDept()) ? startUser.getDept().getDeptId() : null); this.setPromoterInfo(taskVO); // 流程处理人信息 List<IdentityLink> identityLinksForTask = taskService.getIdentityLinksForTask(task.getId()); for (IdentityLink identityLink : identityLinksForTask) { @@ -401,16 +396,11 @@ taskVO.setDeployId(pd.getDeploymentId()); taskVO.setProcessName(pd.getName()); taskVO.setProcessInsId(task.getProcessInstanceId()); taskVO.setTaskDefinitionKey(task.getTaskDefinitionKey()); // 流程发起人信息 HistoricProcessInstance historicProcessInstance = historyService.createHistoricProcessInstanceQuery() .processInstanceId(task.getProcessInstanceId()) .singleResult(); SysUser startUser = sysUserService.selectUserById(Long.parseLong(historicProcessInstance.getStartUserId())); taskVO.setPromoterId(startUser.getUserId()); taskVO.setPromoterName(startUser.getNickName()); taskVO.setPromoterUnitName(Objects.nonNull(startUser.getDept()) ? startUser.getDept().getDeptName() : ""); taskVO.setPromoterUnitId(Objects.nonNull(startUser.getDept()) ? startUser.getDept().getDeptId() : null); this.setPromoterInfo(taskVO); // 流程处理人信息 List<IdentityLink> identityLinksForTask = taskService.getIdentityLinksForTask(task.getId()); for (IdentityLink identityLink : identityLinksForTask) { @@ -502,6 +492,8 @@ .includeIdentityLinks() .singleResult(); if (Objects.isNull(historicTask)) { vo.setPromoterName("暂无"); vo.setPromoterUnitName("暂无"); // 未开始的任务,其关联的用户组这些都可以从UserTask中拿到,因为本身未开始的任务是没有task的,所以这里直接查 if (StringUtils.isNotBlank(userTask.getAssignee())) { vo.setHandlerType(HandlerTypeEnum.USER); @@ -552,6 +544,7 @@ vo.setHandlerId(handlerUserId); vo.setHandlerName(handlerUser.getNickName()); } vo.setTaskDefinitionKey(historicTask.getTaskDefinitionKey()); this.setPromoterAndHandler(vo, historicTask.getIdentityLinks()); } } else { @@ -559,6 +552,8 @@ vo.setTaskId(task.getId()); vo.setExecutionId(task.getExecutionId()); vo.setCreateTime(task.getCreateTime()); vo.setTaskDefinitionKey(task.getTaskDefinitionKey()); this.setPromoterAndHandler(vo, null); } return vo; @@ -695,22 +690,13 @@ /** * 设置任务的发起人&处理人 * 设置任务的发起人&处理人 只有待办任务和已完成任务才会掉这个方法 * * @param taskVO * @param identityLinkInfos 如果是已完成的任务,用这个去取关联的用户/用户组 */ private void setPromoterAndHandler(CustomerTaskVO taskVO, List<? extends IdentityLinkInfo> identityLinkInfos) { // TODO 发起人是否应为上一节点的处理人 // 流程发起人信息 HistoricProcessInstance historicProcessInstance = historyService.createHistoricProcessInstanceQuery() .processInstanceId(taskVO.getProcessInsId()) .singleResult(); SysUser startUser = sysUserService.selectUserById(Long.parseLong(historicProcessInstance.getStartUserId())); taskVO.setPromoterId(startUser.getUserId()); taskVO.setPromoterName(startUser.getNickName()); taskVO.setPromoterUnitId(Objects.nonNull(startUser.getDept()) ? startUser.getDept().getDeptId() : null); taskVO.setPromoterUnitName(Objects.nonNull(startUser.getDept()) ? startUser.getDept().getDeptName() : ""); this.setPromoterInfo(taskVO); // 流程处理人信息 if (TaskStatusEnum.TODO.equals(taskVO.getTaskStatus())) { List<IdentityLink> identityLinksForTask = taskService.getIdentityLinksForTask(taskVO.getTaskId()); @@ -798,6 +784,36 @@ } /** * 设置任务发起人 * * @param taskVO */ private void setPromoterInfo(CustomerTaskVO taskVO) { // 发起人应为上一节点的处理人 List<String> beforeNodeKey = taskCommonService.getBeforeNodeInfo(taskVO.getProcessDefId(), taskVO.getTaskDefinitionKey()); List<SysUser> userList = beforeNodeKey.stream().map(key -> { HistoricTaskInstance historicTaskInstance = historyService.createHistoricTaskInstanceQuery().taskDefinitionKey(key).singleResult(); if (Objects.nonNull(historicTaskInstance)) { // 实际领取这个任务的人,也就是处理人 String assignee = historicTaskInstance.getAssignee(); SysUser startUser = sysUserService.selectUserById(Long.parseLong(assignee)); return startUser; } else { return null; } }).filter(user -> Objects.nonNull(user)).collect(Collectors.toList()); if (CollectionUtils.isEmpty(userList)) { taskVO.setPromoterName("暂无"); taskVO.setPromoterUnitName("暂无"); } else { taskVO.setPromoterId(userList.stream().map(user -> { return user.getUserId() + ""; }).collect(Collectors.joining("、"))); taskVO.setPromoterName(userList.stream().map(user -> { return user.getNickName(); }).collect(Collectors.joining("、"))); taskVO.setPromoterUnitId(userList.stream().filter(user -> Objects.nonNull(user.getDept())).map(user -> { return user.getDept().getDeptId() + "";}).collect(Collectors.joining("、"))); taskVO.setPromoterUnitName(userList.stream().filter(user -> Objects.nonNull(user.getDept())).map(user -> { return user.getDept().getDeptName() + "";}).collect(Collectors.joining("、"))); } } /** * 获取某个流程的所有任务节点 * * @param processDefinitionId flowable/src/main/java/com/ycl/service/common/TaskCommonService.java
@@ -17,6 +17,7 @@ import org.springframework.util.StringUtils; import java.util.*; import java.util.stream.Collectors; /** * @author:xp @@ -30,13 +31,15 @@ private final RepositoryService repositoryService; /** * 通过当前节点定义key,获取其上一个节点的定义id,如果前面是并行的会返回多个 * 通过当前节点定义key,获取其上一个节点以及当前节点的信息,如果前面是并行的会返回多个 * * @param processDefId 流程定义id * @param currentNodeDefId * @param currentNodeDefId 当前节点定义id * @param sysFormService 表单服务层 * @param needInitCurrentForm 是否需要初始化当前节点的表单数据,一般查询已完成的任务详情需要 * @return */ public List<FormDetailVO> getBeforeNodeDefId(String processDefId, String currentNodeDefId, ISysFormService sysFormService, Boolean needInitCurrentForm) { public List<FormDetailVO> getBeforeNodeDefInfo(String processDefId, String currentNodeDefId, ISysFormService sysFormService, Boolean needInitCurrentForm) { // 获取流程定义 ProcessDefinition processDefinition = repositoryService.createProcessDefinitionQuery() .processDefinitionId(processDefId) @@ -64,7 +67,7 @@ } } if (Objects.isNull(currentElement)) { throw new RuntimeException("未找到改任务的流程定义节点"); throw new RuntimeException("未找到该任务的流程定义节点"); } // 获取当前节点的输入 @@ -88,18 +91,18 @@ defKeys.add(formDetailVO); } this.before(currentElement, defKeys); this.beforeNodeInfo(currentElement, defKeys); return defKeys; } /** * 递归获取当前节点的前一个任务节点key * 递归获取当前节点的前一个任务节点信息 * * @param currentElement * @param defKeys */ private void before(FlowElement currentElement, List<FormDetailVO> defKeys) { private void beforeNodeInfo(FlowElement currentElement, List<FormDetailVO> defKeys) { if (currentElement instanceof UserTask) { UserTask userTask = (UserTask) currentElement; if (! CollectionUtils.isEmpty(userTask.getIncomingFlows())) { @@ -108,9 +111,10 @@ FormDetailVO formDetailVO = new FormDetailVO(); formDetailVO.setBeforeNodeDefId(incomingFlow.getSourceFlowElement().getId()); formDetailVO.setBeforeNodeName(incomingFlow.getSourceFlowElement().getName()); formDetailVO.setBeforeNodeName(((UserTask) incomingFlow.getSourceFlowElement()).getOwner()); defKeys.add(formDetailVO); } else { before(incomingFlow.getSourceFlowElement(), defKeys); beforeNodeInfo(incomingFlow.getSourceFlowElement(), defKeys); } } } @@ -124,28 +128,60 @@ formDetailVO.setBeforeNodeName(incomingFlow.getSourceFlowElement().getName()); defKeys.add(formDetailVO); } else { before(incomingFlow.getSourceFlowElement(), defKeys); beforeNodeInfo(incomingFlow.getSourceFlowElement(), defKeys); } } } } // if (! CollectionUtils.isEmpty(currentElement.getIncomingFlows())) { // for (SequenceFlow incomingFlow : currentElement.getIncomingFlows()) { // if (! (incomingFlow.getSourceFlowElement() instanceof UserTask)) { // // 不包含开始节点、并行网关、互斥网关,// TODO 还需要排除其它特殊类型 // if (! (incomingFlow.getSourceFlowElement() instanceof StartEvent) && ! (incomingFlow.getSourceFlowElement() instanceof ParallelGateway) && ! (incomingFlow.getSourceFlowElement() instanceof ExclusiveGateway)) { // before((UserTask) (incomingFlow.getSourceFlowElement()), defKeys); // } // } else { // FormDetailVO formDetailVO = new FormDetailVO(); // formDetailVO.setBeforeNodeDefId(incomingFlow.getSourceFlowElement().getId()); // formDetailVO.setBeforeNodeName(incomingFlow.getSourceFlowElement().getName()); // defKeys.add(formDetailVO); // } // } // } } /** * 获取当前节点的上一节点id,不反悔当前节点信息,如果前面是并行,那么会返回多个 * * @param processDefId 流程定义id * @param currentNodeDefId 当前节点定义id * @return */ public List<String> getBeforeNodeInfo(String processDefId, String currentNodeDefId) { // 获取流程定义 ProcessDefinition processDefinition = repositoryService.createProcessDefinitionQuery() .processDefinitionId(processDefId) .singleResult(); // 获取流程模型 BpmnModel bpmnModel = repositoryService.getBpmnModel(processDefId); if (bpmnModel == null) { throw new RuntimeException("BpmnModel not found for processDefinitionId: " + processDefId); } // 获取流程对象 Process process = bpmnModel.getProcessById(processDefinition.getKey()); if (process == null) { throw new RuntimeException("Process not found for processDefinitionId: " + processDefId); } // 遍历流程元素,找到对应的任务节点 Collection<FlowElement> flowElements = process.getFlowElements(); UserTask currentElement = null; for (FlowElement flowElement : flowElements) { if (flowElement instanceof UserTask && flowElement.getId().equals(currentNodeDefId)) { currentElement = (UserTask) flowElement; break; } } if (Objects.isNull(currentElement)) { throw new RuntimeException("未找到该任务的流程定义节点"); } // 获取当前节点的输入 List<FormDetailVO> defKeys = new ArrayList<>(2); this.beforeNodeInfo(currentElement, defKeys); return defKeys.stream().map(FormDetailVO::getBeforeNodeDefId).collect(Collectors.toList()); } /** * 检查任务节点是否配置了:需要审核 的扩展属性 * flowable/src/main/java/com/ycl/service/impl/FlowTaskServiceImpl.java
@@ -1213,12 +1213,12 @@ } } // 这里只需要查自身以及上一个节点(如果并行的有多个)的表单数据 List<FormDetailVO> beforeNodes = taskCommonService.getBeforeNodeDefId(processDefId, processDefKey, sysFormService, Boolean.TRUE); List<FormDetailVO> beforeNodes = taskCommonService.getBeforeNodeDefInfo(processDefId, processDefKey, sysFormService, Boolean.TRUE); List<String> beforeNodeDefIds = beforeNodes.stream().filter(item -> !item.getCurrent() || currentNeedData).map(FormDetailVO::getBeforeNodeDefId).collect(Collectors.toList()); Map<String, Object> newP = new HashMap<>(); if (CollectionUtils.isNotEmpty(beforeNodeDefIds)) { for (String key : parameters.keySet()) { // 过滤目标数据,将目标表单数据放到新map中 // 过滤拿到目标数据,将目标表单数据放到新map中 if (beforeNodeDefIds.stream().anyMatch(defId -> key.startsWith(defId))) { if (key.contains(ProcessConstants.TASK_FORM_KEY)) { newP.put(key, parameters.get(key));