business/src/main/java/com/ycl/service/impl/ProjectProcessServiceImpl.java
@@ -203,7 +203,7 @@ taskStatistics.setTodoTaskNum(this.getTodoTaskNum(projectProcess.getProcessInsId())); taskStatistics.setRemainingTaskNum(this.getRemainingTaskNum(processDefId, projectProcess.getProcessInsId())); // taskStatistics.setCurrentTask(this.getCurrentNodeTaskList(projectProcess.getProcessInstanceId())); taskStatistics.setRemainingTaskNum(this.getNotFinishedTaskNum(projectProcess.getProcessInsId())); taskStatistics.setRemainingTaskNum(this.getRemainingTaskNum(projectProcess.getProcessDefId(), projectProcess.getProcessInsId())); detail.setStatistics(taskStatistics); Result result = Result.ok(); @@ -719,6 +719,7 @@ if (StringUtils.isNotBlank(identityLink.getUserId())) { SysUser sysUser = sysUserService.selectUserById(Long.parseLong(identityLink.getUserId())); if (Objects.nonNull(sysUser)) { taskVO.setHandlerType(HandlerTypeEnum.USER); taskVO.setHandlerId(sysUser.getUserId()); if (Objects.nonNull(sysUser.getDept())) { taskVO.setHandlerUnitId(sysUser.getDept().getDeptId()); @@ -729,6 +730,7 @@ // 绑定的是角色或者是部门,需要根据id判断 } else if (StringUtils.isNotBlank(identityLink.getGroupId())) { if (identityLink.getGroupId().startsWith("dept")) { // 部门的id是加了前缀的如:dept:1 taskVO.setHandlerType(HandlerTypeEnum.DEPT); String[] split = identityLink.getGroupId().split(":"); if (split.length > 1) { // 部门 @@ -741,6 +743,7 @@ } } } else { taskVO.setHandlerType(HandlerTypeEnum.ROLE); SysRole role = sysRoleService.selectRoleById(Long.parseLong(identityLink.getGroupId())); if (Objects.nonNull(role)) { taskVO.setHandlerUnitId(Long.parseLong(identityLink.getGroupId())); @@ -755,6 +758,7 @@ for (IdentityLinkInfo identityLink : identityLinkInfos) { // 绑定的是用户,查出用户姓名、部门 if (StringUtils.isNotBlank(identityLink.getUserId())) { taskVO.setHandlerType(HandlerTypeEnum.USER); SysUser sysUser = sysUserService.selectUserById(Long.parseLong(identityLink.getUserId())); if (Objects.nonNull(sysUser)) { // taskVO.setHandlerId(sysUser.getUserId()); @@ -767,6 +771,7 @@ // 绑定的是角色,查出角色名称 } else if (StringUtils.isNotBlank(identityLink.getGroupId())) { if (identityLink.getGroupId().startsWith("dept")) { taskVO.setHandlerType(HandlerTypeEnum.DEPT); String[] split = identityLink.getGroupId().split(":"); if (split.length > 1) { // 部门 @@ -776,13 +781,15 @@ taskVO.setHandlerUnitName(dept.getDeptName()); } } } SysRole role = sysRoleService.selectRoleById(Long.parseLong(identityLink.getGroupId())); if (Objects.nonNull(role)) { taskVO.setHandlerUnitId(Long.parseLong(identityLink.getGroupId())); taskVO.setHandlerUnitName("由拥有角色:【" + role.getRoleName() + "】的人处理"); } else { taskVO.setHandlerType(HandlerTypeEnum.ROLE); SysRole role = sysRoleService.selectRoleById(Long.parseLong(identityLink.getGroupId())); if (Objects.nonNull(role)) { taskVO.setHandlerUnitId(Long.parseLong(identityLink.getGroupId())); taskVO.setHandlerUnitName("由拥有角色:【" + role.getRoleName() + "】的人处理"); // taskVO.setHandlerName(role.getRoleName()); // taskVO.setHandlerId(null); } } } } @@ -833,16 +840,6 @@ */ private Long getTotalTaskNum(String processDefinitionId) { return Long.valueOf(this.getAllUserTaskElement(processDefinitionId).size()); } /** * 获取流程剩余未完成的任务数 * * @param processInstanceId * @return */ private Long getNotFinishedTaskNum(String processInstanceId) { return historyService.createHistoricTaskInstanceQuery().processInstanceId(processInstanceId).processUnfinished().count(); } /** flowable/src/main/java/com/ycl/controller/FlowTaskController.java
@@ -7,6 +7,7 @@ import com.ycl.domain.dto.FlowTaskDto; import com.ycl.domain.vo.FlowQueryVo; import com.ycl.domain.vo.FlowTaskVo; import com.ycl.domain.vo.FormDetailVO; import com.ycl.service.IFlowTaskService; import io.swagger.annotations.Api; import io.swagger.annotations.ApiOperation; @@ -97,6 +98,12 @@ return flowTaskService.processVariables(taskId); } @ApiOperation(value = "查看任务", response = FormDetailVO.class) @GetMapping(value = "/detail/{taskId}") public AjaxResult detail(@ApiParam(value = "流程任务Id") @PathVariable(value = "taskId") String taskId) { return flowTaskService.detail(taskId); } @ApiOperation(value = "完成提交表单任务/普通提交") @Log(title = "完成提交表单任务/普通提交", businessType = BusinessType.INSERT) flowable/src/main/java/com/ycl/service/IFlowTaskService.java
@@ -223,4 +223,12 @@ * @return */ AjaxResult completeSubmitForm(String taskId, Map<String, Object> variables); /** * 查看任务 * * @param taskId * @return */ AjaxResult detail(String taskId); } flowable/src/main/java/com/ycl/service/common/TaskCommonService.java
@@ -36,7 +36,7 @@ * @param currentNodeDefId * @return */ public List<FormDetailVO> getBeforeNodeDefId(String processDefId, String currentNodeDefId, ISysFormService sysFormService) { public List<FormDetailVO> getBeforeNodeDefId(String processDefId, String currentNodeDefId, ISysFormService sysFormService, Boolean needInitCurrentForm) { // 获取流程定义 ProcessDefinition processDefinition = repositoryService.createProcessDefinitionQuery() .processDefinitionId(processDefId) @@ -75,14 +75,17 @@ formDetailVO.setBeforeNodeName(currentElement.getName()); formDetailVO.setCurrent(Boolean.TRUE); SysForm sysForm = sysFormService.selectSysFormById(Long.parseLong(currentElement.getFormKey())); if (Objects.isNull(sysForm)) { throw new RuntimeException("该流程绑定的表单不存在或已被删除"); } Map<String, Object> data = new HashMap<>(1); data.put(ProcessConstants.TASK_FORM_KEY, JSONObject.parseObject(sysForm.getFormContent())); if (needInitCurrentForm) { SysForm sysForm = sysFormService.selectSysFormById(Long.parseLong(currentElement.getFormKey())); if (Objects.isNull(sysForm)) { throw new RuntimeException("该流程绑定的表单不存在或已被删除"); } Map<String, Object> data = new HashMap<>(1); data.put(ProcessConstants.TASK_FORM_KEY, JSONObject.parseObject(sysForm.getFormContent())); formDetailVO.setFormJsonObj(data); formDetailVO.setFormJsonObj(data); } defKeys.add(formDetailVO); } this.before(currentElement, defKeys); @@ -96,22 +99,51 @@ * @param currentElement * @param defKeys */ private void before(UserTask currentElement, List<FormDetailVO> defKeys) { if (! CollectionUtils.isEmpty(currentElement.getIncomingFlows())) { for (SequenceFlow incomingFlow : currentElement.getIncomingFlows()) { if (! (incomingFlow.getSourceFlowElement() instanceof UserTask)) { // 不包含开始节点 if (! (incomingFlow.getSourceFlowElement() instanceof StartEvent)) { before((UserTask) (incomingFlow.getSourceFlowElement()), defKeys); private void before(FlowElement currentElement, List<FormDetailVO> defKeys) { if (currentElement instanceof UserTask) { UserTask userTask = (UserTask) currentElement; if (! CollectionUtils.isEmpty(userTask.getIncomingFlows())) { for (SequenceFlow incomingFlow : userTask.getIncomingFlows()) { if (incomingFlow.getSourceFlowElement() instanceof UserTask) { FormDetailVO formDetailVO = new FormDetailVO(); formDetailVO.setBeforeNodeDefId(incomingFlow.getSourceFlowElement().getId()); formDetailVO.setBeforeNodeName(incomingFlow.getSourceFlowElement().getName()); defKeys.add(formDetailVO); } else { before(incomingFlow.getSourceFlowElement(), defKeys); } } else { FormDetailVO formDetailVO = new FormDetailVO(); formDetailVO.setBeforeNodeDefId(incomingFlow.getSourceFlowElement().getId()); formDetailVO.setBeforeNodeName(incomingFlow.getSourceFlowElement().getName()); defKeys.add(formDetailVO); } } } else if (currentElement instanceof Gateway ){ Gateway gateway = (Gateway) currentElement; if (! CollectionUtils.isEmpty(gateway.getIncomingFlows())) { for (SequenceFlow incomingFlow : gateway.getIncomingFlows()) { if (incomingFlow.getSourceFlowElement() instanceof UserTask) { FormDetailVO formDetailVO = new FormDetailVO(); formDetailVO.setBeforeNodeDefId(incomingFlow.getSourceFlowElement().getId()); formDetailVO.setBeforeNodeName(incomingFlow.getSourceFlowElement().getName()); defKeys.add(formDetailVO); } else { before(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); // } // } // } } } flowable/src/main/java/com/ycl/service/impl/FlowTaskServiceImpl.java
@@ -7,6 +7,7 @@ import com.baomidou.mybatisplus.extension.plugins.pagination.Page; import com.ycl.common.constant.ProcessConstants; import com.ycl.common.core.domain.AjaxResult; import com.ycl.common.core.domain.entity.SysDept; import com.ycl.common.core.domain.entity.SysRole; import com.ycl.common.core.domain.entity.SysUser; import com.ycl.common.enums.FlowComment; @@ -28,6 +29,7 @@ import com.ycl.service.ISysDeployFormService; import com.ycl.service.ISysFormService; import com.ycl.service.common.TaskCommonService; import com.ycl.system.service.ISysDeptService; import com.ycl.system.service.ISysRoleService; import com.ycl.system.service.ISysUserService; import lombok.RequiredArgsConstructor; @@ -80,6 +82,7 @@ private final ISysUserService sysUserService; private final ISysRoleService sysRoleService; private final ISysDeptService sysDeptService; private final ISysDeployFormService sysInstanceFormService; private final ISysFormService sysFormService; private final TaskCommonService taskCommonService; @@ -831,8 +834,14 @@ stringBuilder.append(sysUser.getNickName()).append(","); } if (StringUtils.isNotBlank(identityLink.getGroupId())) { SysRole sysRole = sysRoleService.selectRoleById(Long.parseLong(identityLink.getGroupId())); stringBuilder.append(sysRole.getRoleName()).append(","); if (identityLink.getGroupId().contains("dept")) { SysDept sysDept = sysDeptService.selectDeptById(Long.parseLong(identityLink.getGroupId().split(":")[1])); stringBuilder.append(sysDept.getDeptName()).append(","); } else { SysRole sysRole = sysRoleService.selectRoleById(Long.parseLong(identityLink.getGroupId())); stringBuilder.append(sysRole.getRoleName()).append(","); } } } } @@ -853,14 +862,14 @@ } map.put("flowList", hisFlowList); } // 第一次申请获取初始化表单 if (StringUtils.isNotBlank(deployId)) { SysForm sysForm = sysInstanceFormService.selectSysDeployFormByDeployId(deployId); if (Objects.isNull(sysForm)) { return AjaxResult.error("请先配置流程表单"); } map.put("formData", JSONObject.parseObject(sysForm.getFormContent())); } // // 第一次申请获取初始化表单 // if (StringUtils.isNotBlank(deployId)) { // SysForm sysForm = sysInstanceFormService.selectSysDeployFormByDeployId(deployId); // if (Objects.isNull(sysForm)) { // return AjaxResult.error("请先配置流程表单"); // } // map.put("formData", JSONObject.parseObject(sysForm.getFormContent())); // } return AjaxResult.success(map); } @@ -1149,10 +1158,46 @@ } else { parameters = taskService.getVariables(taskId); } List<FormDetailVO> beforeNodes = this.getBeforeNodeForm(parameters, task.getFormKey(), task.getName(), task.getProcessDefinitionId(), task.getTaskDefinitionKey(), Boolean.FALSE); return AjaxResult.success(beforeNodes); } @Override public AjaxResult detail(String taskId) { Task task = taskService.createTaskQuery().taskId(taskId).singleResult(); // 流程变量 Map<String, Object> parameters = new HashMap<>(); if (Objects.isNull(task)) { // 如果为空,可能是任务已经结束 HistoricTaskInstance hisTask = historyService.createHistoricTaskInstanceQuery().taskId(taskId).includeProcessVariables().singleResult(); if (Objects.isNull(hisTask)) { throw new RuntimeException("该任务不存在"); } parameters = hisTask.getProcessVariables(); List<FormDetailVO> beforeNodes = this.getBeforeNodeForm(parameters, hisTask.getFormKey(), hisTask.getName(), hisTask.getProcessDefinitionId(), hisTask.getTaskDefinitionKey(), Boolean.TRUE); return AjaxResult.success(beforeNodes); } else { parameters = taskService.getVariables(taskId); List<FormDetailVO> beforeNodes = this.getBeforeNodeForm(parameters, task.getFormKey(), task.getName(), task.getProcessDefinitionId(), task.getTaskDefinitionKey(), Boolean.TRUE); return AjaxResult.success(beforeNodes); } } /** * 获取当前节点和上一节点的表单内容 * * @param parameters 根据任务查找出来的参数 * @param formKey task自身关联的表单id * @param taskName task自身的任务名 * @param processDefId 流程定义id * @param processDefKey 流程实例id * @return */ private List<FormDetailVO> getBeforeNodeForm(Map<String, Object> parameters, String formKey, String taskName, String processDefId, String processDefKey, Boolean currentNeedData) { if (! parameters.keySet().stream().anyMatch(key -> key.contains(ProcessConstants.TASK_FORM_KEY))) { // 如果是空的,使用formId去查 if (StringUtils.isNotBlank(task.getFormKey())) { SysForm sysForm = sysFormService.selectSysFormById(Long.parseLong(task.getFormKey())); if (StringUtils.isNotBlank(formKey)) { SysForm sysForm = sysFormService.selectSysFormById(Long.parseLong(formKey)); if (Objects.isNull(sysForm)) { throw new RuntimeException("该流程绑定的表单不存在或已被删除"); } @@ -1160,16 +1205,16 @@ Map<String, Object> data = new HashMap<>(1); data.put(ProcessConstants.TASK_FORM_KEY, JSONObject.parseObject(sysForm.getFormContent())); formDetailVO.setFormJsonObj(data); formDetailVO.setBeforeNodeName(task.getName()); formDetailVO.setBeforeNodeName(taskName); formDetailVO.setCurrent(Boolean.TRUE); return AjaxResult.success(Arrays.asList(formDetailVO)); return Arrays.asList(formDetailVO); } else { return AjaxResult.success(new ArrayList<>(1)); return new ArrayList<>(1); } } // 这里只需要查自身以及上一个节点(如果并行的有多个)的表单数据 List<FormDetailVO> beforeNodes = taskCommonService.getBeforeNodeDefId(task.getProcessDefinitionId(), task.getTaskDefinitionKey(), sysFormService); List<String> beforeNodeDefIds = beforeNodes.stream().filter(item -> !item.getCurrent()).map(FormDetailVO::getBeforeNodeDefId).collect(Collectors.toList()); List<FormDetailVO> beforeNodes = taskCommonService.getBeforeNodeDefId(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()) { @@ -1177,7 +1222,8 @@ if (beforeNodeDefIds.stream().anyMatch(defId -> key.startsWith(defId))) { if (key.contains(ProcessConstants.TASK_FORM_KEY)) { newP.put(key, parameters.get(key)); } else { } else { newP.put(key.split("&")[1], parameters.get(key)); } } @@ -1186,8 +1232,8 @@ // 拿到目标表单后,再处理每个表单的数据 for (FormDetailVO formDetailVO : beforeNodes) { if (formDetailVO.getCurrent()) { continue; // 跳过当前节点,因为当前节点在获取前置节点时已经设置过了 if (formDetailVO.getCurrent() && !currentNeedData) { continue; // 跳过当前节点,因为当前节点在获取前置节点时已经设置过了(但表单数据没有给) } Object form = newP.get(formDetailVO.getBeforeNodeDefId() + "&" + ProcessConstants.TASK_FORM_KEY); if (Objects.nonNull(form)) { @@ -1224,8 +1270,7 @@ formDetailVO.setFormJsonObj(newP); } } return AjaxResult.success(beforeNodes); return beforeNodes; } /**