加签

加签是指以后节点审批完后须要额定再加一个审批人进行审批,额定加的审批用户审批完后流程流转到下一节点。比方失常审批流程为A->B->C,如果B执行了加签动作,那么流程就变为A->B-->D-->C,节点D就是加进来的。

医学上有个万能药叫做安慰剂,没有任何药物作用,可能就是一颗糖果,但患者并不知道,但因患者对医生信赖、患者叫自我暗示以及对某种药物疗效的冀望等而起到镇痛、镇蘸或缓解症状的作用。为什么提到这个呢,因为加签的计划就是一个安慰剂计划,用户感知到加签是从审批历史里感知的,在做加签操作时,审批历史外面记录了加签的动作,然而后盾执行了重新分配(reassign)的操作将以后流程重新分配给另外一个人,达到加签的成果,所以加签就一行代码

 taskService.setAssignee(task.getTaskId(), user);

这样可能会有以问题

流程图无奈体现加签,因为并没有新的节点产生

如果你的零碎做好了对activiti进行革新的筹备,那么规范的activiti流程图是远远满足不了你的需要的,你须要额定的计划记录审批历史绘制流程图。

咨询

之所以把加签和咨询放在一起讲,是因为加签篇幅不够,索性就放到一起。咨询是指,你对以后的流程不是很分明,你须要将流程转发给另外一个人须要另外一个人给你领导,另外一个人审批完后流程回到你这里,你依据他的审批意见进行审批。简略说,如果失常的审批流程为A->B->C,如果B执行了咨询操作,那么流程就变为了A->B-->D-->B->C,咨询和加签的区别就在于,咨询会回到发动咨询的节点,加签不会。

咨询就是两次的重新分配,怎么说呢

  1. B重新分配给D
  2. D重新分配给B

两次的reassign操作就能够实现咨询,要解决的问题就是怎么协调好这两次重新分配。

  1. B执行咨询操作时,通过变量标记咨询动作,并将咨询人B的信息(次要是账号)保留在变量中
  2. D执行回复操作时(流程变为咨询后,被咨询人只有回复的权限),从变量中取出B的账号,从新将流程调配给B
  3. B执行失常的审批操作,流程失常流转。
B执行咨询操作
/** * 咨询 * * @param context * @param task * @param users * @param user * @return */@Overridepublic TaskResponse inquire(TaskResponse task, List<String> users, String user) {    Map<String, Object> taskParams = new HashMap<>();    taskParams.put("outcome", "inquire");    taskParams.put("approveUser", user);        //执行重新分配操作    taskService.setAssignee(task.getTaskId(), users.get(0));    //标识状态为咨询,须要记录在本地变量中    taskService.setVariableLocal(task.getTaskId(), "status", "inquire");    //记录咨询人信息    taskService.setVariableLocal(task.getTaskId(), "originUser", user);    Task t = taskService.createTaskQuery()            .taskId(task.getTaskId())            .singleResult();    String instanceId = t.getProcessInstanceId();    return this.taskResponse(t, instanceId);}
D执行回复操作
/** * 咨询 * * @param context * @param task * @param toUser * @param user * @return */@Overridepublic TaskResponse reply(BPMContextInfo context, TaskResponse task, String toUser, String user) {    if (toUser == null) {        toUser = (String) taskService.getVariableLocal(task.getTaskId(), "originUser");    }    Map<String, Object> taskParams = new HashMap<>();    taskParams.put("outcome", "reply");    taskParams.put("approveUser", user);         //执行重新分配操作    taskService.setAssignee(task.getTaskId(), toUser);    taskService.removeVariable(task.getTaskId(), "status");    taskService.removeVariable(task.getTaskId(), "originUser");    Task t = taskService.createTaskQuery()            .taskId(task.getTaskId())            .singleResult();    String instanceId = t.getProcessInstanceId();    return this.taskResponse(t, instanceId);}

通过两次reassign的配合实现咨询操作。

结束语

activiti方面的技术通过十篇的文档曾经介绍完,如果你筹备用activiti搭建一个流程平台的话,这十篇文档会给你很多参考。