Activiti6.0 实现第一个任务节点自动流转提交

您所在的位置:网站首页 Activiti获取已审批的节点 Activiti6.0 实现第一个任务节点自动流转提交

Activiti6.0 实现第一个任务节点自动流转提交

2023-05-08 10:54| 来源: 网络整理| 查看: 265

文章目录 前言 实现 方式一 方式二 总结 前言

在Activiti流程设计中,会有2种处理方式,以请假流程举例:

方式一:第一个节点为组长审批

在这里插入图片描述

方式二:有单独的提交请假节点,第二个节点才是组长审批

我们平常的开发都是推荐第二种方式,因为第二种方式有以下优点:

可以更好的应对组长审批退回到提交申请节点,这是个很常见的功能。 使流程展示的更加完善,第二种能看出来流程的第一步是提交请假。 实现 方式一

填写完申请单,在启动流程后,获取当前流程实例申请人的待办任务,并执行当前流程实例的下一步任务。

// 提交表单 // 启动流程 Task task = null; TaskQuery query = taskService.createTaskQuery().taskAssignee("empId").active(); List todoList = query.list();//获取申请人的待办任务列表 for (Task tmp : todoList) { if(tmp.getProcessInstanceId().equals(processInstance.getId())){ task = tmp;//获取当前流程实例,当前申请人的待办任务 break; } } variables.put(ProcessConstants.KEY_DEPT_LEADER_ID, employeeId);//设置下一步办理人的流程变量 taskService.complete(task.getId(),variables); 复制代码

优点:

实现简单,便于理解

缺点:

必须每个流程都要这样hardcoding,这不能装逼啊

方式二 首先监听任务的创建 判断是否是第一个用户任务 如果是,则主动调用一下完成任务的方法

完整代码如下:

public class AutoCompleteFirstTaskEventListener implements ActivitiEventListener { @Override public void onEvent(ActivitiEvent event) { switch (event.getType()) { case TASK_CREATED: System.out.println(event); if (!(event instanceof ActivitiEntityEventImpl)) { return; } ActivitiEntityEventImpl activitiEntityEventImpl = (ActivitiEntityEventImpl) event; Object entity = activitiEntityEventImpl.getEntity(); if (!(entity instanceof TaskEntity)) { return; } TaskEntity taskEntity = (TaskEntity) entity; this.onCreate(taskEntity); break; default: break; } } @Override public boolean isFailOnException() { return false; } private void onCreate(TaskEntity delegateTask) { System.out.println(delegateTask); ExecutionEntity execution = delegateTask.getExecution(); FlowElement currentFlowElement1 = execution.getCurrentFlowElement(); Process process = ProcessDefinitionUtil.getProcess(delegateTask.getProcessDefinitionId()); UserTask currentFlowElementTask = (UserTask) currentFlowElement1; List incomingFlows = currentFlowElementTask.getIncomingFlows(); SequenceFlow sequenceFlow = incomingFlows.get(0); FlowElement sourceFlowElement = sequenceFlow.getSourceFlowElement(); if (sourceFlowElement instanceof StartEvent) { // 判断当前任务的前一个节点是否是StartEvent,即是否是第一个任务 new CompleteTaskCmd(delegateTask.getId(), null).execute(Context.getCommandContext());// 执行完成命令 } } } 复制代码

缺点:

花了我很长时间才在Activiti6版本实现,尴尬

优点:

做成了通用组件,方便拓展管理 总结

全局事件监听- ActivitiEventListener

获取当前任务的节点-execution.getCurrentFlowElement()

获取当前任务节点的前一个节点,判断是否为StartEvent

ProcessDefinitionUtil.getProcess(delegateTask.getProcessDefinitionId()); UserTask currentFlowElementTask = (UserTask) currentFlowElement1; List incomingFlows = currentFlowElementTask.getIncomingFlows(); SequenceFlow sequenceFlow = incomingFlows.get(0); FlowElement sourceFlowElement = sequenceFlow.getSourceFlowElement(); if (sourceFlowElement instanceof StartEvent) { 复制代码

主动调用自动完成操作-new CompleteTaskCmd(delegateTask.getId(), null).execute(Context.getCommandContext());

这个去看下Taskservice.complete源码即可

加群一起抱团取暖,共同进步

🍎QQ群【837324215】 🍎关注我的公众号【Java大厂面试官】,一起学习呗🍎🍎🍎 🍎个人vx【lakernote】

img



【本文地址】


今日新闻


推荐新闻


CopyRight 2018-2019 办公设备维修网 版权所有 豫ICP备15022753号-3