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

1,217 阅读2分钟

文章目录

前言

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

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

在这里插入图片描述

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

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

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

实现

方式一

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

        // 提交表单
        // 启动流程
        Task task = null;
        TaskQuery query = taskService.createTaskQuery().taskAssignee("empId").active();
        List<Task> 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<SequenceFlow> 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<SequenceFlow> 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大厂面试官】,一起学习呗🍎🍎🍎
🍎个人vxlakernote

img