Beispiel #1
0
        /// <summary>
        /// 创建活动任务转移实例数据
        /// </summary>
        /// <param name="toActivity">活动</param>
        /// <param name="processInstance">流程实例</param>
        /// <param name="fromActivityInstance">开始活动实例</param>
        /// <param name="transitionGUID">转移GUID</param>
        /// <param name="transitionType">转移类型</param>
        /// <param name="flyingType">跳跃类型</param>
        /// <param name="activityResource">活动资源</param>
        /// <param name="session">会话</param>
        internal override void CreateActivityTaskTransitionInstance(ActivityEntity toActivity,
                                                                    ProcessInstanceEntity processInstance,
                                                                    ActivityInstanceEntity fromActivityInstance,
                                                                    string transitionGUID,
                                                                    TransitionTypeEnum transitionType,
                                                                    TransitionFlyingTypeEnum flyingType,
                                                                    ActivityResource activityResource,
                                                                    IDbSession session)
        {
            int     newActivityInstanceID = 0;
            Boolean isParallel            = false;

            if (fromActivityInstance.ActivityType == (short)ActivityTypeEnum.GatewayNode)
            {
                //并发多实例分支判断(AndSplit Multiple)
                var processModel = ProcessModelFactory.Create(processInstance.ProcessGUID, processInstance.Version);
                var activityNode = processModel.GetActivity(fromActivityInstance.ActivityGUID);
                isParallel = processModel.IsAndSplitMI(activityNode);
            }

            if (isParallel)
            {
                //并行多实例容器
                var entity = new ActivityInstanceEntity();
                var plist  = activityResource.NextActivityPerformers[toActivity.ActivityGUID];

                //创建并行多实例分支
                for (var i = 0; i < plist.Count; i++)
                {
                    entity = base.CreateActivityInstanceObject(toActivity, processInstance, activityResource.AppRunner);
                    entity.AssignedToUserIDs   = plist[i].UserID;
                    entity.AssignedToUserNames = plist[i].UserName;
                    entity.ActivityState       = (short)ActivityStateEnum.Ready;
                    //插入活动实例数据
                    entity.ID = base.ActivityInstanceManager.Insert(entity, session);
                    //插入任务
                    base.TaskManager.Insert(entity, plist[i], activityResource.AppRunner, session);
                    //插入转移数据
                    InsertTransitionInstance(processInstance,
                                             transitionGUID,
                                             fromActivityInstance,
                                             entity,
                                             transitionType,
                                             flyingType,
                                             activityResource.AppRunner,
                                             session);
                }
            }
            else
            {
                //普通任务节点
                var toActivityInstance = base.CreateActivityInstanceObject(toActivity, processInstance, activityResource.AppRunner);

                //进入运行状态
                toActivityInstance.ActivityState = (short)ActivityStateEnum.Ready;
                toActivityInstance = GenerateActivityAssignedUserInfo(toActivityInstance, activityResource);

                //插入活动实例数据
                newActivityInstanceID = base.ActivityInstanceManager.Insert(toActivityInstance, session);

                //插入任务数据
                base.CreateNewTask(toActivityInstance, activityResource, session);

                //插入转移数据
                InsertTransitionInstance(processInstance,
                                         transitionGUID,
                                         fromActivityInstance,
                                         toActivityInstance,
                                         transitionType,
                                         flyingType,
                                         activityResource.AppRunner,
                                         session);

                //调用外部事件的注册方法
                var delegateContext = new DelegateContext
                {
                    AppInstanceID     = processInstance.AppInstanceID,
                    ProcessGUID       = processInstance.ProcessGUID,
                    ProcessInstanceID = processInstance.ID,
                    ActivityGUID      = toActivity.ActivityGUID,
                    ActivityCode      = toActivity.ActivityCode,
                    ActivityResource  = activityResource
                };
                DelegateExecutor.InvokeExternalDelegate(session,
                                                        EventFireTypeEnum.OnActivityCreated,
                                                        activityResource.AppRunner.DelegateEventList,
                                                        delegateContext);
            }
        }