flowable超时自动审批通过当前节点
由于业务上需要这么一个场景:
流程中间的某一个会签节点超过某个时间后,剩余未审批的人自动审批通过,于是上网搜索了一些大佬的案例,根据这些案例结合实际需求修改了一下流程,在本地测试后可以实现需求:
关于这个需求我个人觉得可以用两个事件来做
1、定时器启动事件;
2、定时器边界事件;
个人思考了一下,如果用定时器启动事件的话,有可能会出现已经到了用户设置的截止时间,但是定时器任务还没有启动,造成了超时之后还可以审批,如果用定时器边界事件的话,可以在用户设置的截止时间时,判断当前节点剩余的审批活动,并且一次性的自动审批通过,不过可能也会有一个小弊端,如果服务器正好在那个时间段挂断的话,就没办法达到自动审批通过的功能了,这个我后续再想一下可以怎么改比较好。本篇文章先讲述是如何实现的会签节点超时自动审批通过。
如果你是用Flowable BPMN visualizer来画流程图的话,你可以根据以下的步骤来操作:
1、点击需要超时自动审批通过的会签节点,右键;
2、选择Boundary events ---> Boundary timer event;
3、这个时候会签task的右下方会出现一个小时钟的按钮,点击这个按钮;
4、Attach to这一栏填写会签Task的ID;
5、Attach to下面有三个属性,分别代表的意思是:
- timeDate:设置在指定时间触发;
- timeDuration:置指定一个时间段之后执行;
- 通过 timeCycle 设置指定定时器的运行周期;
详情可以看这个Flowable边界事件-定时边界事件_flowable 定时边界事件-优快云博客
6、所以这里我们选择timeDate,设置在指定时间触发,在这一行加上"${approvalDeadLine}",这里你可以根据自己的喜好设置名字,给流程setVariables的时候记得给Map集合put上相应的key就行了。
7、右键新增一个Service Task,并将小时钟连线指向这个Service Task,把ServiceTask与下一个Task连起来。
8、delegateExpression选择你为这个Task创建的监听器(也可以创建了监听器之后再来加上),"${autoApprovalDelegate}";
9、(补充)配置文件中将:
flowable.async-executor-activate = true
完成了以上步骤后可以编写代码了;
监听器的代码大概如下,大家可以根据自己的实际业务来修改,逻辑基本上是一样的,代码实现方式有不同而已
@Component
@Slf4j
public class AutoApprovalDelegate implements JavaDelegate{
@Autowired
public TaskService taskService;
public void execute(DelegateExecution execution){
//获取当前流程实例的ID
String processInstanceId = execution.getProcessInstanceId();
//查询流程实例相关的活动任务列表
List<Task> tasks = taskService.createTaskQuery().processInstanceId(processInstanceId).taskDefinitionKey(会签节点的id).active.list();
//完成会签节点的全部任务
tasks.forEach(task1->taskService.complete(task1.getId()));
}
}