in core/src/main/java/com/alibaba/smart/framework/engine/behavior/impl/UserTaskBehaviorHelper.java [135:188]
static void compensateExecutionAndTask(ExecutionContext context, UserTask userTask,
ActivityInstance activityInstance, ExecutionInstance executionInstance,
Map<String, TaskAssigneeCandidateInstance> taskAssigneeMap, ExecutionInstanceStorage executionInstanceStorage,
ExecutionInstanceFactory executionInstanceFactory,
TaskInstanceFactory taskInstanceFactory, ProcessEngineConfiguration processEngineConfiguration) {
TaskInstanceStorage taskInstanceStorage = processEngineConfiguration.getAnnotationScanner().getExtensionPoint(
ExtensionConstant.COMMON,TaskInstanceStorage.class);
List<TaskInstance> allTaskInstanceList = queryAllTaskInstanceList(executionInstance, processEngineConfiguration, taskInstanceStorage);
List<String> taskInstanceIdList = new ArrayList<String>();
if(CollectionUtil.isNotEmpty(allTaskInstanceList)) {
for(TaskInstance taskInstance : allTaskInstanceList) {
taskInstanceIdList.add(taskInstance.getInstanceId());
}
}
TaskAssigneeStorage taskAssigneeStorage = processEngineConfiguration.getAnnotationScanner().getExtensionPoint(
ExtensionConstant.COMMON, TaskAssigneeStorage.class);
Map<String, List<TaskAssigneeInstance>> taskAssigneeInstanceMap = taskAssigneeStorage.findAssigneeOfInstanceList(taskInstanceIdList, processEngineConfiguration);
if(taskAssigneeInstanceMap != null) {
for(List<TaskAssigneeInstance> instanceList : taskAssigneeInstanceMap.values()) {
if(CollectionUtil.isNotEmpty(instanceList)) {
for(TaskAssigneeInstance instance : instanceList) {
if(taskAssigneeMap.containsKey(instance.getAssigneeId())) {
taskAssigneeMap.remove(instance.getAssigneeId());
}
}
}
}
}
if(taskAssigneeMap.size() > 0) {
List<TaskAssigneeCandidateInstance> newTaskAssigneeList = UserTaskBehaviorHelper.findBatchOfHighestPriorityTaskAssigneeList(new ArrayList<TaskAssigneeCandidateInstance>(taskAssigneeMap.values()));
for (TaskAssigneeCandidateInstance taskAssigneeCandidateInstance : newTaskAssigneeList) {
ExecutionInstance newExecutionInstance = executionInstanceFactory.create(activityInstance, context);
executionInstanceStorage.insert(newExecutionInstance, processEngineConfiguration);
TaskInstance taskInstance = taskInstanceFactory.create(userTask, newExecutionInstance, context);
taskInstance.setPriority(taskAssigneeCandidateInstance.getPriority());
//reAssign
taskInstance = taskInstanceStorage.insert(taskInstance, processEngineConfiguration);
List<TaskAssigneeInstance> taskAssigneeInstanceList = new ArrayList<TaskAssigneeInstance>(2);
IdGenerator idGenerator = context.getProcessEngineConfiguration().getIdGenerator();
UserTaskBehaviorHelper.buildTaskAssigneeInstance(taskAssigneeCandidateInstance, taskAssigneeInstanceList, idGenerator);
for(TaskAssigneeInstance taskAssigneeInstance : taskAssigneeInstanceList) {
taskAssigneeInstance.setProcessInstanceId(taskInstance.getProcessInstanceId());
taskAssigneeInstance.setTaskInstanceId(taskInstance.getInstanceId());
taskAssigneeStorage.insert(taskAssigneeInstance, processEngineConfiguration);
}
}
}
}