static void compensateExecutionAndTask()

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);
                }
            }
        }
    }