接上一篇,我们说了,本次我们要做一个审批超时催促(提醒)的功能,我就想camunda 应该能实现,所以就研究了一下camunda的定时器和服务任务的功能,发现应该可以实现我的需求,上一篇我们讲述了camunda的定时器和服务任务的简单应用,这一篇在上一篇的基础上实现我们的功能。
我们在上篇说过:边界事件可以是中断的,也可以是非中断的。那其实可以使用非中断的边界事件。如何实现呢?
要实现这个功能以前,我也百度了一些文章,比如:
https://www.jianshu.com/p/62955f271956
比如这篇中的这个我觉得可以实现
那么这个流程图怎么画呢,当时也花了一些时间,这里我就直接记录了。
先贴出我的流程图:
图1
我们跟上以前的流程图做个对比:
图2
仔细看我们发现其实这里的两个定时器的图标都不一样
图1中的定时器是边界事件不中断流程,而图二中的定时器会中断流程。
我们直接来说图1 是怎么画出来的。
先画一个这个中间事件(空心圆)
点这个扳手
发现这里有一个定时器的图标:Timer Intermediate Catch Event
选了这个就会发现这个就跟图2 中的定时器图标一样,这个是可以中断的定时器,其实不是我们想要的,那怎么做到呢,其实很简单,如下图:
把这个圆圈拉到销售主管审批节点的边界上,我们再来点击扳手看看:
发现这个时候就有了这个图标:Timer Boundary Event(non-interrupting)
这个就是我们想要的了,接下来
这个定时器后面跟上我们的服务任务即可,销售主管审批后面的节点可以照常画了。这里的提醒其实是算流程以外的节点不会影响流程的运转。
再来看完整的图:
定时器的参数:
服务任务的参数:
接下来我们看代码,java代码其实跟上一篇的一模一样:
import lombok.extern.slf4j.Slf4j;
import org.camunda.bpm.engine.TaskService;
import org.camunda.bpm.engine.delegate.DelegateExecution;
import org.camunda.bpm.engine.delegate.JavaDelegate;
import org.camunda.bpm.engine.task.Task;
import org.springframework.stereotype.Service;
import javax.annotation.Resource;
import java.util.List;
/**
* @Author
* @Desc 超时提醒监听类类
* @Date 2022-06-01 19:51
**/
@Slf4j
@Service("timeoutRemindDelegate")
public class TimeoutRemindDelegateListener implements JavaDelegate {
@Resource
private TaskService taskService;
@Override
public void execute(DelegateExecution execution) throws Exception {
log.info("TimeoutRemindDelegate.execute start, execution: {}", execution);
// 获取当前节点的所有待办任务
List<Task> taskList = taskService.createTaskQuery()
.processInstanceId(execution.getProcessInstanceId())
.list();
for (Task task: taskList) {
String assignee = task.getAssignee();
log.info("assignee:"+assignee);
// 实现保存记录表,发送语音提醒或短信提醒
}
log.info("TimeoutRemindDelegate.execute end");
}
}
这里就不演示了,可以结合上一篇一起看,
1.当我们发起流程后,销售主管审批的节点的审批人,如果超过1分钟没有审批就会触发这个的服务任务,就会调用我们的java代码,这个时候就可以在java代码中写发送提醒的方法了。
2.同样的主要一到销售主管审批这个节点act_ru_job就会有一条记录,到时间了就会执行java代码,执行完java代码,act_ru_job表中的记录就会消失
3.如果还没有超过1分钟审批人就审批了,其实这个时候也不会调用java代码了,act_ru_job表中的记录也会消失
好了,今天的记录就写到这里。加油