Activit7中默认是没有加签动作的,为了实现自定的加签和减签操作就需要程序猿自己来实现对应的命令。
一、实现思路
- 判断当前节点类型是否允许加签,可以限制非多实例节点、序签节点不能执行加签(当然这两类节点也可以实现)
- 在当前节点执行实例上面创建一个任务执行实例,然后设置变量
- 修改节点变量
- 执行任务实例的默认动作
二、实现代码
下面是基于activiti7的代码片段
注意 实现代码都是需要写到activiti命令的实现类中的
ExecutionEntityManager executionEntityManager = commandContext.getExecutionEntityManager();
ExecutionEntity currentExecutionEntity = executionEntityManager.findById(task.getExecutionId());
ExecutionEntity miExecution = currentExecutionEntity.getParent();
Integer nrOfInstances = (Integer) miExecution.getVariableLocal(EActiviti.NUMBER_OF_INSTANCES);
Integer nrOfActiveInstances = (Integer) miExecution.getVariableLocal(EActiviti.NUMBER_OF_ACTIVE_INSTANCES);
// 判断当前节点能否加签
...
// 在当前节点执行实例上面创建一个任务执行实例,然后设置变量
ExecutionEntity childExecution = executionEntityManager.createChildExecution(miExecution);
UserTask userTask = (UserTask) miExecution.getCurrentFlowElement();
childExecution.setActive(true);
childExecution.setScope(false);
childExecution.setCurrentFlowElement(userTask);
childExecution.setVariableLocal("loopCounter", nrOfInstances);
childExecution.setVariableLocal("assignee", assignee);
...
// 修改节点变量
miExecution.setVariableLocal("nrOfInstances", nrOfInstances + 1);
miExecution.setVariableLocal("nrOfActiveInstances", nrOfActiveInstances + 1);
// 执行当前任务实例
commandContext.getAgenda().planContinueMultiInstanceOperation(childExecution);
三、非多实例、序签的加签
1. 非多实例加签
在流程的创建的时候,将非多实例加签默认设置为多实例加签(或签、会签都可以)。\
到底设置成或签还是会签,这个不用纠结,后面我会介绍如何动态的在会签和或签之间切换。
2. 序签加签
序签加签可以添加新表解决。或者在获取的审批人的接口中动态添加解决。
注意: 两种方案都需要修改节点的变量(设置审批人的总数)