From 60b0f82f3e45669d522e68a4ee0e14cf706b1222 Mon Sep 17 00:00:00 2001 From: tony <846249920@qq.com> Date: Wed, 14 Apr 2021 23:20:10 +0800 Subject: [PATCH] =?UTF-8?q?feat:=20=E5=8A=A8=E6=80=81=E9=80=89=E6=8B=A9?= =?UTF-8?q?=E4=BB=BB=E5=8A=A1=E6=8E=A5=E6=94=B6=E4=BA=BA?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../controller/FlowTaskController.java | 6 + .../ruoyi/flowable/domain/vo/FlowTaskVo.java | 5 +- .../flowable/service/IFlowTaskService.java | 8 ++ .../service/impl/FlowTaskServiceImpl.java | 107 +++++++++--------- ruoyi-ui/src/api/flowable/todo.js | 9 ++ .../src/views/flowable/task/record/index.vue | 31 ++++- 6 files changed, 110 insertions(+), 56 deletions(-) diff --git a/ruoyi-flowable/src/main/java/com/ruoyi/flowable/controller/FlowTaskController.java b/ruoyi-flowable/src/main/java/com/ruoyi/flowable/controller/FlowTaskController.java index cfdcf33..2826f89 100644 --- a/ruoyi-flowable/src/main/java/com/ruoyi/flowable/controller/FlowTaskController.java +++ b/ruoyi-flowable/src/main/java/com/ruoyi/flowable/controller/FlowTaskController.java @@ -135,6 +135,12 @@ public class FlowTaskController { return AjaxResult.success(); } + @ApiOperation(value = "获取下一节点") + @PostMapping(value = "/nextFlowNode") + public AjaxResult getNextFlowNode(@RequestBody FlowTaskVo flowTaskVo) { + return flowTaskService.getNextFlowNode(flowTaskVo); + } + /** * 生成流程图 * diff --git a/ruoyi-flowable/src/main/java/com/ruoyi/flowable/domain/vo/FlowTaskVo.java b/ruoyi-flowable/src/main/java/com/ruoyi/flowable/domain/vo/FlowTaskVo.java index 86aac57..63a4117 100644 --- a/ruoyi-flowable/src/main/java/com/ruoyi/flowable/domain/vo/FlowTaskVo.java +++ b/ruoyi-flowable/src/main/java/com/ruoyi/flowable/domain/vo/FlowTaskVo.java @@ -28,9 +28,12 @@ public class FlowTaskVo { @ApiModelProperty("流程实例Id") private String instanceId; - @ApiModelProperty("退回节点") + @ApiModelProperty("节点") private String targetKey; @ApiModelProperty("流程变量信息") private Map values; + + @ApiModelProperty("审批人") + private String assignee; } diff --git a/ruoyi-flowable/src/main/java/com/ruoyi/flowable/service/IFlowTaskService.java b/ruoyi-flowable/src/main/java/com/ruoyi/flowable/service/IFlowTaskService.java index 7fc4f81..7ab6f60 100644 --- a/ruoyi-flowable/src/main/java/com/ruoyi/flowable/service/IFlowTaskService.java +++ b/ruoyi-flowable/src/main/java/com/ruoyi/flowable/service/IFlowTaskService.java @@ -5,6 +5,7 @@ import com.ruoyi.flowable.domain.vo.FlowTaskVo; import org.flowable.task.api.Task; import java.io.InputStream; +import java.util.List; /** * @author XuanXuan @@ -142,4 +143,11 @@ public interface IFlowTaskService { * @return */ AjaxResult processVariables(String taskId); + + /** + * 获取下一节点 + * @param flowTaskVo 任务 + * @return + */ + AjaxResult getNextFlowNode(FlowTaskVo flowTaskVo); } diff --git a/ruoyi-flowable/src/main/java/com/ruoyi/flowable/service/impl/FlowTaskServiceImpl.java b/ruoyi-flowable/src/main/java/com/ruoyi/flowable/service/impl/FlowTaskServiceImpl.java index a092231..94b53f4 100644 --- a/ruoyi-flowable/src/main/java/com/ruoyi/flowable/service/impl/FlowTaskServiceImpl.java +++ b/ruoyi-flowable/src/main/java/com/ruoyi/flowable/service/impl/FlowTaskServiceImpl.java @@ -15,14 +15,15 @@ import com.ruoyi.flowable.domain.dto.FlowTaskDto; import com.ruoyi.flowable.domain.vo.FlowTaskVo; import com.ruoyi.flowable.factory.FlowServiceFactory; import com.ruoyi.flowable.flow.CustomProcessDiagramGenerator; +import com.ruoyi.flowable.flow.FindNextNodeUtil; import com.ruoyi.flowable.flow.FlowableUtils; import com.ruoyi.flowable.service.IFlowTaskService; import com.ruoyi.flowable.service.ISysDeployFormService; import com.ruoyi.system.domain.SysForm; import com.ruoyi.system.service.ISysRoleService; import com.ruoyi.system.service.ISysUserService; -import liquibase.pro.packaged.S; import lombok.extern.slf4j.Slf4j; +import org.apache.commons.collections4.CollectionUtils; import org.apache.commons.lang3.StringUtils; import org.flowable.bpmn.model.Process; import org.flowable.bpmn.model.*; @@ -32,6 +33,7 @@ import org.flowable.common.engine.impl.identity.Authentication; import org.flowable.engine.ProcessEngineConfiguration; import org.flowable.engine.history.HistoricActivityInstance; import org.flowable.engine.history.HistoricProcessInstance; +import org.flowable.engine.impl.persistence.entity.ExecutionEntity; import org.flowable.engine.repository.ProcessDefinition; import org.flowable.engine.runtime.Execution; import org.flowable.engine.runtime.ProcessInstance; @@ -106,8 +108,12 @@ public class FlowTaskServiceImpl extends FlowServiceFactory implements IFlowTask // } taskService.setVariables(task.getTaskId(), map); } - // 设置任务处理人员 + // 设置任务审批人员 taskService.setAssignee(task.getTaskId(), userId.toString()); + // todo : 这种方式无法动态设置任务接收人 +// if (StringUtils.isNotBlank(task.getAssignee())) { +// taskService.addCandidateUser(task.getTaskId(), task.getAssignee()); +// } // 提交任务 taskService.complete(task.getTaskId()); @@ -495,7 +501,7 @@ public class FlowTaskServiceImpl extends FlowServiceFactory implements IFlowTask } /** - * 撤回流程 + * 撤回流程 目前存在错误 * * @param flowTaskVo * @return @@ -544,7 +550,6 @@ public class FlowTaskServiceImpl extends FlowServiceFactory implements IFlowTask Execution execution = runtimeService.createExecutionQuery().executionId(task.getExecutionId()).singleResult(); String activityId = execution.getActivityId(); - log.warn("------->> activityId:{}", activityId); FlowNode flowNode = (FlowNode) bpmnModel.getMainProcess().getFlowElement(activityId); //记录原活动方向 @@ -598,13 +603,7 @@ public class FlowTaskServiceImpl extends FlowServiceFactory implements IFlowTask // 当前流程信息 flowTask.setTaskId(task.getId()); flowTask.setTaskDefKey(task.getTaskDefinitionKey()); -// // 审批人员信息 -// SysUser sysUser = sysUserService.selectUserById(Long.parseLong(task.getAssignee())); -// flowTask.setAssigneeId(sysUser.getUserId()); -// flowTask.setAssigneeName(sysUser.getNickName()); -// flowTask.setDeptName(sysUser.getDept().getDeptName()); flowTask.setCreateTime(task.getCreateTime()); -// flowTask.setProcVars(task.getProcessVariables()); flowTask.setProcDefId(task.getProcessDefinitionId()); flowTask.setTaskName(task.getName()); // 流程定义信息 @@ -655,10 +654,6 @@ public class FlowTaskServiceImpl extends FlowServiceFactory implements IFlowTask // 当前流程信息 flowTask.setTaskId(histTask.getId()); // 审批人员信息 -// SysUser sysUser = sysUserService.selectUserById(Long.parseLong(histTask.getAssignee())); -// flowTask.setAssigneeId(sysUser.getUserId()); -// flowTask.setAssigneeName(sysUser.getNickName()); -// flowTask.setDeptName(sysUser.getDept().getDeptName()); flowTask.setCreateTime(histTask.getCreateTime()); flowTask.setFinishTime(histTask.getEndTime()); flowTask.setDuration(getDate(histTask.getDurationInMillis())); @@ -725,6 +720,7 @@ public class FlowTaskServiceImpl extends FlowServiceFactory implements IFlowTask flowTask.setAssigneeName(sysUser.getNickName()); flowTask.setDeptName(sysUser.getDept().getDeptName()); } + // 展示审批人员 List linksForTask = historyService.getHistoricIdentityLinksForTask(histIns.getTaskId()); StringBuilder stringBuilder = new StringBuilder(); for (HistoricIdentityLink identityLink : linksForTask) { @@ -790,39 +786,11 @@ public class FlowTaskServiceImpl extends FlowServiceFactory implements IFlowTask */ @Override public InputStream diagram(String processId) { -// HistoricProcessInstance instance = historyService.createHistoricProcessInstanceQuery().processInstanceId(processId).singleResult(); -// //获得已经办理的历史节点 -// List activityInstances = historyService.createHistoricActivityInstanceQuery().processInstanceId(processId).orderByHistoricActivityInstanceStartTime().asc().list(); -// List activties = new ArrayList<>(); -// List flows = new ArrayList<>(); -// for (HistoricActivityInstance activityInstance : activityInstances) { -// if ("sequenceFlow".equals(activityInstance.getActivityType())) { -// //需要高亮显示的连接线 -// flows.add(activityInstance.getActivityId()); -// } else { -// //需要高亮显示的节点 -// activties.add(activityInstance.getActivityId()); -// } -// } -// BpmnModel bpmnModel = repositoryService.getBpmnModel(instance.getProcessDefinitionId()); -// //获得图片流 -// DefaultProcessDiagramGenerator diagramGenerator = new DefaultProcessDiagramGenerator(); -// return diagramGenerator.generateDiagram( -// bpmnModel, -// "png", -// activties, -// flows, -// "宋体", -// "宋体", -// "宋体", -// null, -// 1.0, -// false); - String processDefinitionId; - //1.获取当前的流程实例 + // 获取当前的流程实例 ProcessInstance processInstance = runtimeService.createProcessInstanceQuery().processInstanceId(processId).singleResult(); - if (Objects.isNull(processInstance)) {// 如果流程已经结束,则得到结束节点 + // 如果流程已经结束,则得到结束节点 + if (Objects.isNull(processInstance)) { HistoricProcessInstance pi = historyService.createHistoricProcessInstanceQuery().processInstanceId(processId).singleResult(); processDefinitionId = pi.getProcessDefinitionId(); @@ -832,10 +800,7 @@ public class FlowTaskServiceImpl extends FlowServiceFactory implements IFlowTask processDefinitionId = pi.getProcessDefinitionId(); } - - /** - * 获得活动的节点 - */ + // 获得活动的节点 List highLightedFlowList = historyService.createHistoricActivityInstanceQuery().processInstanceId(processId).orderByHistoricActivityInstanceStartTime().asc().list(); List highLightedFlows = new ArrayList<>(); @@ -853,10 +818,7 @@ public class FlowTaskServiceImpl extends FlowServiceFactory implements IFlowTask //获取流程图 BpmnModel bpmnModel = repositoryService.getBpmnModel(processDefinitionId); - ProcessEngineConfiguration configuration = processEngine.getProcessEngineConfiguration(); - - // ProcessDiagramGenerator diagramGenerator = engconf.getProcessDiagramGenerator(); //获取自定义图片生成器 ProcessDiagramGenerator diagramGenerator = new CustomProcessDiagramGenerator(); InputStream in = diagramGenerator.generateDiagram(bpmnModel, "png", highLightedNodes, highLightedFlows, configuration.getActivityFontName(), @@ -883,6 +845,47 @@ public class FlowTaskServiceImpl extends FlowServiceFactory implements IFlowTask } } + /** + * 获取下一节点 + * + * @param flowTaskVo 任务 + * @return + */ + @Override + public AjaxResult getNextFlowNode(FlowTaskVo flowTaskVo) { + Task task = taskService.createTaskQuery().taskId(flowTaskVo.getTaskId()).singleResult(); + List nextNodeList = new ArrayList<>(); + if (Objects.nonNull(task)) { + ExecutionEntity ee = (ExecutionEntity) runtimeService.createExecutionQuery() + .executionId(task.getExecutionId()).singleResult(); + // 当前审批节点 + String crruentActivityId = ee.getActivityId(); + BpmnModel bpmnModel = repositoryService.getBpmnModel(task.getProcessDefinitionId()); + FlowNode flowNode = (FlowNode) bpmnModel.getFlowElement(crruentActivityId); + // 输出连线 + List outFlows = flowNode.getOutgoingFlows(); + + for (SequenceFlow sequenceFlow : outFlows) { + // 下一个审userTask + FlowElement targetFlow = sequenceFlow.getTargetFlowElement(); + if (targetFlow instanceof UserTask) { + FlowTaskDto flowTaskDto = new FlowTaskDto(); + // 当流程设计时未指定任务接受人员/组时 判定为用户动态选择下一任务审批人 + // todo 1. 读取自定义节点属性来验证是否动态选择审批人 + // 2. 验证表达式 + if (StringUtils.isBlank(((UserTask) targetFlow).getAssignee()) && + CollectionUtils.isEmpty(((UserTask) targetFlow).getCandidateGroups()) && + CollectionUtils.isEmpty(((UserTask) targetFlow).getCandidateUsers())) { + flowTaskDto.setTaskDefKey(targetFlow.getId()); + flowTaskDto.setTaskName(targetFlow.getName()); + nextNodeList.add(flowTaskDto); + } + } + } + } + return AjaxResult.success(nextNodeList); + } + /** * 流程完成时间处理 * diff --git a/ruoyi-ui/src/api/flowable/todo.js b/ruoyi-ui/src/api/flowable/todo.js index f8a1025..562e813 100644 --- a/ruoyi-ui/src/api/flowable/todo.js +++ b/ruoyi-ui/src/api/flowable/todo.js @@ -46,6 +46,15 @@ export function returnList(data) { }) } +// 下一节点 +export function getNextFlowNode(data) { + return request({ + url: '/flowable/task/nextFlowNode', + method: 'post', + data: data + }) +} + // 部署流程实例 export function deployStart(deployId) { return request({ diff --git a/ruoyi-ui/src/views/flowable/task/record/index.vue b/ruoyi-ui/src/views/flowable/task/record/index.vue index 92eca54..945f46f 100644 --- a/ruoyi-ui/src/views/flowable/task/record/index.vue +++ b/ruoyi-ui/src/views/flowable/task/record/index.vue @@ -29,6 +29,15 @@ >{{item.name}} + + + <{{item.nickName}} + + @@ -104,8 +113,8 @@