public boolean enter()

in core/src/main/java/com/alibaba/smart/framework/engine/behavior/impl/UserTaskBehavior.java [46:132]


    public boolean enter(ExecutionContext context, PvmActivity pvmActivity) {
        UserTask userTask = (UserTask)pvmActivity.getModel();

        List<TaskAssigneeCandidateInstance> allTaskAssigneeCandidateInstanceList = UserTaskBehaviorHelper.getTaskAssigneeCandidateInstances(
            context, userTask);

        ProcessInstance processInstance = context.getProcessInstance();

        LOGGER.info("The taskAssigneeCandidateInstance are "+allTaskAssigneeCandidateInstanceList +" for PI:"+ processInstance
            .getInstanceId() +" and AI id: "+pvmActivity.getModel().getId() );

        
        //1. 开启了会签特性
        MultiInstanceLoopCharacteristics multiInstanceLoopCharacteristics = userTask
            .getMultiInstanceLoopCharacteristics();

        if (null != multiInstanceLoopCharacteristics) {

            fireEvent(context,pvmActivity, EventConstant.ACTIVITY_START);

            ActivityInstance activityInstance  = super.createSingleActivityInstanceAndAttachToProcessInstance(context,userTask);


            List<ExecutionInstance> executionInstanceList = new ArrayList<ExecutionInstance>(allTaskAssigneeCandidateInstanceList.size());
            activityInstance.setExecutionInstanceList(executionInstanceList);

            //1.1 会签节点有两种业务类型,分别是 顺序会签 和 并发会签。 前者需要按照特定顺序的节点来审批,后者则需要是并发会签。
            // 针对顺序会签,则需要指定顺序,并且需要在 UserTask 节点完成的时候,去补充创建下一批任务。
            // 针对并发会签,则会批量创建出所有的会签任务。

            List<TaskAssigneeCandidateInstance> newTaskAssigneeCandidateInstanceList = null;

            if(multiInstanceLoopCharacteristics.isSequential()){
                 newTaskAssigneeCandidateInstanceList = UserTaskBehaviorHelper.findBatchOfHighestPriorityTaskAssigneeList(allTaskAssigneeCandidateInstanceList);
            }else{
                newTaskAssigneeCandidateInstanceList = allTaskAssigneeCandidateInstanceList;
            }

            for (TaskAssigneeCandidateInstance taskAssigneeCandidateInstance : newTaskAssigneeCandidateInstanceList) {

                ExecutionInstance executionInstance = this.executionInstanceFactory.create(activityInstance, context);

                executionInstanceList.add(executionInstance);


                TaskInstance taskInstance = super.taskInstanceFactory.create(userTask, executionInstance, context);
                taskInstance.setPriority(taskAssigneeCandidateInstance.getPriority());

                List<TaskAssigneeInstance> taskAssigneeInstanceList = new ArrayList<TaskAssigneeInstance>(2);

                IdGenerator idGenerator = context.getProcessEngineConfiguration().getIdGenerator();

                UserTaskBehaviorHelper.buildTaskAssigneeInstance(taskAssigneeCandidateInstance, taskAssigneeInstanceList, idGenerator);

                taskInstance.setTaskAssigneeInstanceList(taskAssigneeInstanceList);

                executionInstance.setTaskInstance(taskInstance);

            }

        } else {

            //2.  普通任务节点
            super.enter(context, pvmActivity);

            if (null != allTaskAssigneeCandidateInstanceList) {
                ExecutionInstance executionInstance = context.getExecutionInstance();

                TaskInstance taskInstance = super.taskInstanceFactory.create(userTask, executionInstance,
                    context);

                List<TaskAssigneeInstance> taskAssigneeInstanceList = new ArrayList<TaskAssigneeInstance>(2);

                IdGenerator idGenerator = context.getProcessEngineConfiguration().getIdGenerator();

                for (TaskAssigneeCandidateInstance taskAssigneeCandidateInstance : allTaskAssigneeCandidateInstanceList) {
                    UserTaskBehaviorHelper.buildTaskAssigneeInstance(taskAssigneeCandidateInstance, taskAssigneeInstanceList, idGenerator);
                }

                //2.1 普通UserTask,只会创建出一个TI和可能多个TACI(TaskAssigneeCandidateInstance)
                taskInstance.setTaskAssigneeInstanceList(taskAssigneeInstanceList);
                executionInstance.setTaskInstance(taskInstance);
            }
        }

        return true;
    }