文章目录
前言
在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大厂面试官】,一起学习呗🍎🍎🍎
🍎个人vx【lakernote】