参考:https://blog.csdn.net/l_bu_ting_hua/article/details/86622306
这里只记载一些比较基础的使用以及问题,关于activiti28张内部表以及api相关含义可查看
https://blog.csdn.net/zhengzixiang666/article/details/83109911
https://blog.csdn.net/hj7jay/article/details/51302829
1.创建一个基本流程
点击task节点可对节点进行相关操作,Assignee指该节点的办理人,下面两个是签收用户或者签收用户组,当该节点办理人不为空的时候,签收人也就没用了(因为activiti封装的接口查询语句是该字段为空能查询到签收用户可见的任务,一但办理人不为空,其他签收用户即不可见了
办理人可直接设计流程时指定,也可通过${userId} 这种方式指定,还可通过TaskListener监听设置
图中使用的是排他网关,即当申请报销金额大于500时需要先经过总经理审核才会到财务,需要对连线进行设置
2.关于TaskListener
对于像上面流程图中的直属上级审批这一块,因为不同人申请,他的直属上级存在不一样的情况,这时候就需要动态的设置该流程实例的直属上级审批这一个节点的办理人,这时候就可以通过设置监听类来实现
@Slf4j
@Component("MyTaskListener")
public class MyTaskListener implements TaskListener{
private static final long serialVersionUID = 478113514195354529L;
ProcessEngine processEngine = ProcessEngines.getDefaultProcessEngine();
public void notify(DelegateTask task) {
try {
//此处这里是传参给监听器,是通过上个节点办理时指定下一个节点的用户
String user = (String) processEngine.getRuntimeService().getVariable(task.getExecutionId(), "user");
log.info("......................." + user);
log.info("......................." + task.getId());
log.info("......................." + task.getName());
// processEngine.getTaskService().setAssignee(task.getId(), user); //通过转办来设置,这样可同步历史纪录里面该节点的办理人
processEngine.getTaskService().addCandidateUser(task.getId(), user); //该方法是设置该节点的签收人选,可设置多个,也可通过用户组来设置
processEngine.getTaskService().addCandidateUser(task.getId(), "a");
processEngine.getTaskService().addCandidateUser(task.getId(), "b");
processEngine.getTaskService().addCandidateUser(task.getId(), "c");
// task.setAssignee(user); //直接设置该节点办理人,此方法无法同步历史表里面的信息,查看历史纪录里面该节点办理人为null
} catch (Exception e) {
e.printStackTrace();
log.error("指定任务代办人失败:" + e.getMessage());
}
}
}
关于设置监听器的时候,activiti:taskListener 元素属性说明可参考 http://www.cnblogs.com/jimboi/p/8477014.html