如果有加签的需求,第一步应该是获取当前的节点所有的执行,已经是执行人的用户就不应该再次被加签。
一、实现思路
- 根据当前任务获取节点执行实例
- 根据节点执行实例获取所有的任务执行实例。
- 遍历任务执行实例,获取所有的任务执行人。
二、实现代码片段
下面是基于activiti7的代码片段
注意 实现代码都是需要写到activiti的CMD实现类中的
// 根据当前任务获取节点执行实例
ExecutionEntityManager executionEntityManager = commandContext.getExecutionEntityManager();
String executionId = task.getExecutionId();
ExecutionEntity currentExecutionEntity = executionEntityManager.findById(executionId);
ExecutionEntity miExecution = currentExecutionEntity.getParent();
// 获取当前BpmnModel对象,判读节点的类型
String processDefinitionId = task.getProcessDefinitionId();
BpmnModel bpmnModel = ProcessDefinitionUtil.getBpmnModel(processDefinitionId);
String taskDefinitionKey = task.getTaskDefinitionKey();
Activity miActivityElement = (Activity) bpmnModel.getFlowElement(taskDefinitionKey);
MultiInstanceLoopCharacteristics multiInstanceLoopCharacteristics = miActivityElement.getLoopCharacteristics();
// 判断节点是否为顺序审批
if (multiInstanceLoopCharacteristics.isSequential()) {
// 如果是顺序审批,取出执行人表达式,然后执行获取所有的执行人
// 表达式
String exp = multiInstanceLoopCharacteristics.getInputDataItem();
// 变量
Map<String, Object> variables = miExecution.getProcessInstance().getVariables();
// 执行表达式,解析执行人
// 执行表达式可以使用三方的,springboot可以使用tomcat-embed-el包
// ...
} else {
// 根据节点执行实例获取所有的任务执行实例。
List<? extends ExecutionEntity> subExecutionEntities = miExecution.getExecutions();
subExecutionEntities.stream().map(ExecutionEntity::getTasks).flatMap(List::stream).forEach(task -> {
// 当前任务执行人
task.getAssignee();
task.getIdentityLinks().forEach(identityLink -> {
// 候选执行人
identityLink.getUserId();
// 候选执行组
identityLink.getGroupId();
});
});
}