Example #1
0
        /// <summary>
        /// 结束节点活动及转移实例化,没有任务数据
        /// </summary>
        /// <param name="toActivity">当前Activity</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)
        {
            var toActivityInstance = base.CreateActivityInstanceObject(toActivity,
                                                                       processInstance, activityResource.AppRunner);

            base.ActivityInstanceManager.Insert(toActivityInstance, session);

            base.ActivityInstanceManager.Complete(toActivityInstance.ID,
                                                  activityResource.AppRunner,
                                                  session);

            //写节点转移实例数据
            base.InsertTransitionInstance(processInstance,
                                          transitionGUID,
                                          fromActivityInstance,
                                          toActivityInstance,
                                          transitionType,
                                          flyingType,
                                          activityResource.AppRunner,
                                          session);
        }
Example #2
0
        internal WfTransitionInstance CreateTransitionInstanceObject(WfProcessInstance processInstance,
                                                                     string transitionId,
                                                                     WfActivityInstance fromActivityInstance,
                                                                     WfActivityInstance toActivityInstance,
                                                                     TransitionTypeEnum transitionType,
                                                                     TransitionFlyingTypeEnum flyingType,
                                                                     WfAppRunner runner,
                                                                     int conditionParseResult)
        {
            var entity = new WfTransitionInstance();

            entity.Fid              = UUIDUtils.Fid;
            entity.ProcessUid       = processInstance.ProcessUid;
            entity.ProcessInsUid    = processInstance.Fid;
            entity.TransitionNodeId = transitionId;
            entity.TransitionType   = transitionType.ToString();// WfTransitionInstanceType.Forward;
            entity.JumpType         = (int)flyingType;

            //构造活动节点数据
            entity.SourceActivityInsUid   = fromActivityInstance.Fid;
            entity.SourceActivityNodeId   = fromActivityInstance.NodeId;
            entity.SourceActivityNodeType = fromActivityInstance.ActivityType;
            entity.SourceActivityNodeName = fromActivityInstance.ActivityName;
            entity.TargetActivityInsUid   = toActivityInstance.Fid;
            entity.TargetActivityNodeId   = toActivityInstance.NodeId;
            entity.TargetActivityNodeType = toActivityInstance.ActivityType;
            entity.TargetActivityNodeName = toActivityInstance.ActivityName;

            entity.WalkState = conditionParseResult;
            //entity.CreatedByUserID = runner.UserID;
            //entity.CreatedByUserName = runner.UserName;
            //entity.CreatedDateTime = System.DateTime.Now;

            return(entity);
        }
Example #3
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)
        {
            //实例化Activity
            var toActivityInstance = base.CreateActivityInstanceObject(toActivity, processInstance, activityResource.AppRunner);

            //进入运行状态
            toActivityInstance.ActivityState     = (short)ActivityStateEnum.Ready;
            toActivityInstance.AssignedToUserIDs = GenerateActivityAssignedUserIDs(
                activityResource.NextActivityPerformers[toActivity.ActivityGUID]);
            toActivityInstance.AssignedToUserNames = GenerateActivityAssignedUserNames(
                activityResource.NextActivityPerformers[toActivity.ActivityGUID]);

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

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

            //插入转移数据
            InsertTransitionInstance(processInstance,
                                     transitionGUID,
                                     fromActivityInstance,
                                     toActivityInstance,
                                     transitionType,
                                     flyingType,
                                     activityResource.AppRunner,
                                     session);
        }
Example #4
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)
        {
            if (toActivity.ActivityTypeDetail.ComplexType == ComplexTypeEnum.SignTogether)
            {
                CreateMultipleInstance(toActivity, processInstance, fromActivityInstance,
                                       transitionGUID, transitionType, flyingType, activityResource, session);
            }
            else
            {
                //实例化Activity
                var toActivityInstance = CreateActivityInstanceObject(toActivity, processInstance, activityResource.AppRunner);

                //进入运行状态
                var performerList = activityResource.NextActivityPerformers[toActivity.ActivityGUID];
                toActivityInstance.ActivityState       = (short)ActivityStateEnum.Ready;
                toActivityInstance.AssignedToUserIDs   = GenerateActivityAssignedUserIDs(performerList);
                toActivityInstance.AssignedToUserNames = GenerateActivityAssignedUserNames(performerList);

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

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

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

                //启动子流程
                WfExecutedResult startedResult = null;
                var subProcessNode             = (SubProcessNode)toActivity.Node;
                subProcessNode.ActivityInstance = toActivityInstance;
                WfAppRunner subRunner = CopyActivityForwardRunner(activityResource.AppRunner,
                                                                  new Performer(activityResource.AppRunner.UserID,
                                                                                activityResource.AppRunner.UserName),
                                                                  subProcessNode);

                var runtimeInstance = WfRuntimeManagerFactory.CreateRuntimeInstanceStartupSub(subRunner,
                                                                                              processInstance,
                                                                                              subProcessNode,
                                                                                              performerList,
                                                                                              ref startedResult);

                runtimeInstance.OnWfProcessExecuted += runtimeInstance_OnWfProcessStarted;
                runtimeInstance.Execute(Session);
            }
        }
Example #5
0
        /// <summary>
        /// 创建工作项及转移数据
        /// </summary>
        /// <param name="processInstance"></param>
        /// <param name="fromToTransition"></param>
        /// <param name="fromActivityInstance"></param>
        /// <param name="activityResource"></param>
        /// <param name="session"></param>
        internal void CreateActivityTaskAndTransitionInstances(ProcessInstanceEntity processInstance,
                                                               ActivityInstanceEntity fromActivityInstance,
                                                               TransitionEntity fromToTransition,
                                                               TransitionTypeEnum transitionType,
                                                               ActivityResource activityResource,
                                                               ISession session)
        {
            //实例化Activity
            var toActivityInstance = base.CreateActivityInstanceObject(processInstance, activityResource.LogonUser);

            //进入运行状态
            toActivityInstance.State = (short)NodeStateEnum.Ready;

            //插入活动实例数据
            base.InsertActivityInstance(toActivityInstance,
                                        session);

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

            //插入转移数据
            base.InsertTransitionInstance(processInstance,
                                          fromToTransition,
                                          fromActivityInstance,
                                          toActivityInstance,
                                          transitionType,
                                          activityResource.LogonUser,
                                          session);
        }
Example #6
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,
                                                                    WfProcessInstance processInstance,
                                                                    WfActivityInstance fromActivityInstance,
                                                                    string transitionGUID,
                                                                    TransitionTypeEnum transitionType,
                                                                    TransitionFlyingTypeEnum flyingType)
        {
            //实例化Activity
            var toActivityInstance = base.CreateActivityInstanceObject(toActivity, processInstance, AppRunner);

            //进入运行状态
            toActivityInstance.ActivityState       = ActivityStateEnum.Ready.ToString();
            toActivityInstance.AssignedToUserIds   = GenerateActivityAssignedUserIDs(toActivity.Performers);
            toActivityInstance.AssignedToUserNames = GenerateActivityAssignedUserNames(toActivity.Performers);

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

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

            //插入转移数据
            InsertTransitionInstance(processInstance,
                                     transitionGUID,
                                     fromActivityInstance,
                                     toActivityInstance,
                                     transitionType,
                                     flyingType,
                                     AppRunner);
        }
Example #7
0
        /// <summary>
        /// 会签类型的主节点, 多实例节点处理
        /// </summary>
        /// <param name="processInstance"></param>
        /// <param name="fromToTransition"></param>
        /// <param name="fromActivityInstance"></param>
        /// <param name="activityResource"></param>
        /// <param name="session"></param>
        internal void CreateMultipleInstance(ActivityEntity toActivity,
                                             ProcessInstanceEntity processInstance,
                                             ActivityInstanceEntity fromActivityInstance,
                                             String transitionGUID,
                                             TransitionTypeEnum transitionType,
                                             TransitionFlyingTypeEnum flyingType,
                                             ActivityResource activityResource,
                                             IDbSession session)
        {
            //实例化主节点Activity
            var toActivityInstance = base.CreateActivityInstanceObject(toActivity,
                                                                       processInstance, activityResource.AppRunner);

            //主节点实例数据
            toActivityInstance.ActivityState = (short)ActivityStateEnum.Suspended;
            toActivityInstance.ComplexType   = (short)ComplexTypeEnum.MultipleInstance;
            if (toActivity.ActivityTypeDetail.MergeType == MergeTypeEnum.Parallel)
            {
                toActivityInstance.CompleteOrder = toActivity.ActivityTypeDetail.CompleteOrder;
            }
            toActivityInstance.AssignedToUsers = GenerateActivityAssignedUsers(
                activityResource.NextActivityPerformers[toActivity.ActivityGUID]);

            //插入主节点实例数据
            base.ActivityInstanceManager.Insert(toActivityInstance, session);

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

            //插入会签子节点实例数据
            var plist = activityResource.NextActivityPerformers[toActivity.ActivityGUID];
            ActivityInstanceEntity entity = new ActivityInstanceEntity();

            for (short i = 0; i < plist.Count; i++)
            {
                entity = base.ActivityInstanceManager.CreateActivityInstanceObject(toActivityInstance);
                entity.AssignedToUsers          = plist[i].UserID.ToString();
                entity.MIHostActivityInstanceID = toActivityInstance.ID;
                entity.CompleteOrder            = (short)(i + 1);

                //如果是串行会签,只有第一个节点处于运行状态,其它节点挂起
                if ((i > 0) && (toActivity.ActivityTypeDetail.MergeType == MergeTypeEnum.Sequence))
                {
                    entity.ActivityState = (short)ActivityStateEnum.Suspended;
                }

                //插入活动实例数据,并返回活动实例ID
                entity.ID = base.ActivityInstanceManager.Insert(entity, session);

                //插入任务数据
                base.TaskManager.Insert(entity, plist[i], activityResource.AppRunner, session);
            }
        }
Example #8
0
        internal TransitionInstanceEntity CreateTransitionInstanceObject(ProcessInstanceEntity processInstance,
                                                                         TransitionEntity transition,
                                                                         ActivityInstanceEntity fromActivityInstance,
                                                                         ActivityInstanceEntity toActivityInstance,
                                                                         TransitionTypeEnum transitionType,
                                                                         WfLogonUser logonUser,
                                                                         byte conditionParseResult)
        {
            var entity = new TransitionInstanceEntity();

            entity.AppName                  = processInstance.AppName;
            entity.AppInstanceID            = processInstance.AppInstanceID;
            entity.TransitionInstanceGUID   = Guid.NewGuid();
            entity.ProcessGUID              = processInstance.ProcessGUID;
            entity.ProcessInstanceGUID      = processInstance.ProcessInstanceGUID;
            entity.TransitionGUID           = transition.TransitionGUID;
            entity.TransitionType           = (byte)transitionType;
            entity.FromActivityGUID         = transition.FromActivityGUID;
            entity.FromActivityInstanceGUID = fromActivityInstance.ActivityInstanceGUID;
            entity.FromActivityType         = fromActivityInstance.ActivityType;
            entity.FromActivityName         = fromActivityInstance.ActivityName;
            entity.ToActivityGUID           = transition.ToActivityGUID;
            entity.ToActivityInstanceGUID   = toActivityInstance.ActivityInstanceGUID;
            entity.ToActivityType           = toActivityInstance.ActivityType;
            entity.ToActivityName           = toActivityInstance.ActivityName;
            entity.ConditionParseResult     = conditionParseResult;
            entity.CreatedByUserID          = logonUser.UserID;
            entity.CreatedByUserName        = logonUser.UserName;
            entity.CreatedDateTime          = System.DateTime.Now;

            return(entity);
        }
        internal TransitionInstanceEntity CreateTransitionInstanceObject(ProcessInstanceEntity processInstance,
            String transitionGUID,
            ActivityInstanceEntity fromActivityInstance,
            ActivityInstanceEntity toActivityInstance,
            TransitionTypeEnum transitionType,
            TransitionFlyingTypeEnum flyingType,
            WfAppRunner runner,
            byte conditionParseResult)
        {
            var entity = new TransitionInstanceEntity();
            entity.AppName = processInstance.AppName;
            entity.AppInstanceID = processInstance.AppInstanceID;
            entity.ProcessGUID = processInstance.ProcessGUID;
            entity.ProcessInstanceID = processInstance.ID;
            entity.TransitionGUID = transitionGUID;
            entity.TransitionType = (byte)transitionType;
            entity.FlyingType = (byte)flyingType;

            //构造活动节点数据
            entity.FromActivityGUID = fromActivityInstance.ActivityGUID;
            entity.FromActivityInstanceID = fromActivityInstance.ID;
            entity.FromActivityType = fromActivityInstance.ActivityType;
            entity.FromActivityName = fromActivityInstance.ActivityName;
            entity.ToActivityGUID = toActivityInstance.ActivityGUID;
            entity.ToActivityInstanceID = toActivityInstance.ID;
            entity.ToActivityType = toActivityInstance.ActivityType;
            entity.ToActivityName = toActivityInstance.ActivityName;

            entity.ConditionParseResult = conditionParseResult;
            entity.CreatedByUserID = runner.UserID;
            entity.CreatedByUserName = runner.UserName;
            entity.CreatedDateTime = System.DateTime.Now;

            return entity;
        }
Example #10
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">Session</param>
 internal virtual void CreateActivityTaskTransitionInstance(ActivityEntity toActivity,
                                                            WfProcessInstance processInstance,
                                                            WfActivityInstance fromActivityInstance,
                                                            String transitionGUID,
                                                            TransitionTypeEnum transitionType,
                                                            TransitionFlyingTypeEnum flyingType
                                                            )
 {
 }
Example #11
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">Session</param>
 internal virtual void CreateActivityTaskTransitionInstance(ActivityEntity toActivity,
                                                            ProcessInstanceEntity processInstance,
                                                            ActivityInstanceEntity fromActivityInstance,
                                                            String transitionGUID,
                                                            TransitionTypeEnum transitionType,
                                                            TransitionFlyingTypeEnum flyingType,
                                                            ActivityResource activityResource,
                                                            IDbSession session)
 {
 }
Example #12
0
        /// <summary>
        /// 退回是加签情况下的处理:
        /// 要退回的节点是加签节点
        /// 只实例化当初的加签主节点
        /// </summary>
        /// <param name="processInstance">流程实例</param>
        /// <param name="backwardToTaskActvity">退回的活动节点</param>
        /// <param name="fromActivityInstance">运行节点实例</param>
        /// <param name="backwardType">退回类型</param>
        /// <param name="previousMainInstance">前主节点实例</param>
        /// <param name="transitionGUID">转移GUID</param>
        /// <param name="transitionType">转移类型</param>
        /// <param name="flyingType">跳跃类型</param>
        /// <param name="activityResource">资源</param>
        /// <param name="session">数据上下文</param>
        internal void CreateBackwardActivityTaskRepateSignForwardMainNodeOnly(ProcessInstanceEntity processInstance,
                                                                              ActivityEntity backwardToTaskActvity,
                                                                              ActivityInstanceEntity fromActivityInstance,
                                                                              BackwardTypeEnum backwardType,
                                                                              ActivityInstanceEntity previousMainInstance,
                                                                              string transitionGUID,
                                                                              TransitionTypeEnum transitionType,
                                                                              TransitionFlyingTypeEnum flyingType,
                                                                              ActivityResource activityResource,
                                                                              IDbSession session)
        {
            // 退回是加签情况下的处理:
            // 要退回的节点是加签节点
            // 只实例化当初的加签主节点
            //重新封装任务办理人为AssignedToUsers, AssignedToUsernames
            var performerList = AntiGenerateActivityPerformerList(previousMainInstance);

            activityResource.NextActivityPerformers.Clear();
            activityResource.NextActivityPerformers = new Dictionary <string, PerformerList>();
            activityResource.NextActivityPerformers.Add(backwardToTaskActvity.ActivityGUID, performerList);

            //实例化Activity
            var toActivityInstance = base.CreateBackwardToActivityInstanceObject(processInstance,
                                                                                 backwardType,
                                                                                 previousMainInstance.ID,
                                                                                 activityResource.AppRunner);

            //进入准备运行状态
            toActivityInstance.ActivityState       = (short)ActivityStateEnum.Ready;
            toActivityInstance.AssignedToUserIDs   = previousMainInstance.AssignedToUserIDs;
            toActivityInstance.AssignedToUserNames = previousMainInstance.AssignedToUserNames;
            toActivityInstance.ComplexType         = null;//previousMainInstance.ComplexType;发起加签前状态为null
            toActivityInstance.CompleteOrder       = previousMainInstance.CompleteOrder;
            toActivityInstance.SignForwardType     = previousMainInstance.SignForwardType;

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

            base.ReturnDataContext.ActivityInstanceID = toActivityInstance.ID;
            base.ReturnDataContext.ProcessInstanceID  = toActivityInstance.ProcessInstanceID;

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

            //插入转移数据
            base.InsertTransitionInstance(processInstance,
                                          transitionGUID,
                                          fromActivityInstance,
                                          toActivityInstance,
                                          transitionType,
                                          flyingType,
                                          activityResource.AppRunner,
                                          session);
        }
Example #13
0
        /// <summary>
        /// 创建退回时的流转节点对象、任务和转移数据
        /// </summary>
        /// <param name="processInstance">流程实例</param>
        /// <param name="fromActivityInstance">运行节点实例</param>
        /// <param name="backwardToTaskActivity">退回到的节点</param>
        /// <param name="backwardType">退回类型</param>
        /// <param name="transitionType">转移类型</param>
        /// <param name="flyingType">跳跃类型</param>
        /// <param name="activityResource">资源</param>
        /// <param name="session">会话</param>
        internal void CreateBackwardActivityTaskTransitionInstance(ProcessInstanceEntity processInstance,
                                                                   ActivityInstanceEntity fromActivityInstance,
                                                                   ActivityEntity backwardToTaskActivity,
                                                                   BackwardTypeEnum backwardType,
                                                                   TransitionTypeEnum transitionType,
                                                                   TransitionFlyingTypeEnum flyingType,
                                                                   ActivityResource activityResource,
                                                                   IDbSession session)
        {
            var previousActivityInstance = this.ActivityInstanceManager.GetPreviousActivityInstanceSimple(fromActivityInstance,
                                                                                                          backwardToTaskActivity.ActivityGUID,
                                                                                                          session);

            if (previousActivityInstance == null)
            {
                throw new WorkflowException(LocalizeHelper.GetEngineMessage("nodesendback.CreateBackwardActivityTaskTransitionInstance.error"));
            }

            //实例化Activity
            var toActivityInstance = this.ActivityInstanceManager.CreateBackwardActivityInstanceObject(
                processInstance.AppName,
                processInstance.AppInstanceID,
                processInstance.AppInstanceCode,
                processInstance.ID,
                backwardToTaskActivity,
                backwardType,
                fromActivityInstance.ID,
                previousActivityInstance.ID,
                activityResource.AppRunner);

            //进入准备运行状态
            toActivityInstance.ActivityState = (short)ActivityStateEnum.Ready;
            //人员来自步骤列表的用户数据
            toActivityInstance.AssignedToUserIDs   = SendBackOperation.BackwardToTaskPerformer.UserID;
            toActivityInstance.AssignedToUserNames = SendBackOperation.BackwardToTaskPerformer.UserName;

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

            //插入任务数据
            this.TaskManager.Insert(toActivityInstance,
                                    SendBackOperation.BackwardToTaskPerformer,
                                    activityResource.AppRunner,
                                    session);

            //插入转移数据
            InsertTransitionInstance(processInstance,
                                     fromActivityInstance,
                                     toActivityInstance,
                                     TransitionTypeEnum.Backward,
                                     TransitionFlyingTypeEnum.NotFlying,
                                     this.SendBackOperation.ActivityResource.AppRunner,
                                     session);
        }
Example #14
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)
        {
            //判断是否是会签节点,如果是创建会签节点
            if (toActivity.ActivityType == ActivityTypeEnum.MultipleInstanceNode)
            {
                if (toActivity.ActivityTypeDetail.ComplexType == ComplexTypeEnum.SignForward)           //加签节点生成,跟普通任务节点生成一样
                {
                    //实例化Activity
                    var toActivityInstance = base.CreateActivityInstanceObject(toActivity, processInstance, activityResource.AppRunner);

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

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

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

                    //插入转移数据
                    InsertTransitionInstance(processInstance,
                                             transitionGUID,
                                             fromActivityInstance,
                                             toActivityInstance,
                                             transitionType,
                                             flyingType,
                                             activityResource.AppRunner,
                                             session);
                }
                else if (toActivity.ActivityTypeDetail.ComplexType == ComplexTypeEnum.SignTogether)             //会签节点会生成多个实例子节点
                {
                    //创建会签节点的主节点,以及会签主节点下的实例子节点记录
                    CreateMultipleInstance(toActivity, processInstance, fromActivityInstance,
                                           transitionGUID, transitionType, flyingType, activityResource, session);
                }
                else
                {
                    throw new ApplicationException("虽然是会签节点,但是其子类型未知!");
                }
            }
            else
            {
                throw new ApplicationException("不是会签节点,无法创建活动及任务实例!");
            }
        }
        /// <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,
                                                                    WfProcessInstance processInstance,
                                                                    WfActivityInstance fromActivityInstance,
                                                                    string transitionGUID,
                                                                    TransitionTypeEnum transitionType,
                                                                    TransitionFlyingTypeEnum flyingType)
        {
            //实例化Activity
            var toActivityInstance = CreateActivityInstanceObject(toActivity, processInstance, AppRunner);

            //进入运行状态
            toActivityInstance.ActivityState     = ActivityStateEnum.Ready.ToString();
            toActivityInstance.AssignedToUserIds = GenerateActivityAssignedUserIDs(
                toActivity.Performers);
            toActivityInstance.AssignedToUserNames = GenerateActivityAssignedUserNames(
                toActivity.Performers);

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

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

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

            //启动子流程
            WfExecutedResult startedResult = null;
            var subProcessNode             = (SubProcessNode)toActivity.Node;

            subProcessNode.ActivityInstance = fromActivityInstance;
            WfAppRunner subRunner = CopyActivityForwardRunner(AppRunner,
                                                              new Performer()
            {
                UserId   = AppRunner.UserId,
                UserName =
                    AppRunner.UserName
            }, subProcessNode);

            var runtimeInstance = WfRuntimeManagerFactory.CreateRuntimeInstanceStartup(subRunner, _serviceProvider,
                                                                                       processInstance,
                                                                                       subProcessNode,
                                                                                       ref startedResult);

            runtimeInstance.OnWfProcessExecuted += runtimeInstance_OnWfProcessStarted;
            runtimeInstance.Execute();
        }
        /// <summary>
        /// 最后一个会签多实例子节点的撤销操作
        /// </summary>
        /// <param name="processInstance">流程实例</param>
        /// <param name="fromActivityInstance">运行节点</param>
        /// <param name="originalBackwardToActivityInstance">初始退回到的节点实例</param>
        /// <param name="backwardType">退回类型</param>
        /// <param name="transitionType">转移类型</param>
        /// <param name="flyingType">跳跃类型</param>
        /// <param name="activityResource">资源</param>
        /// <param name="session">会话</param>
        internal void CreateBackwardActivityTaskTransitionOfLastMultipleInstance(ProcessInstanceEntity processInstance,
                                                                                 ActivityInstanceEntity fromActivityInstance,
                                                                                 ActivityInstanceEntity originalBackwardToActivityInstance,
                                                                                 BackwardTypeEnum backwardType,
                                                                                 TransitionTypeEnum transitionType,
                                                                                 TransitionFlyingTypeEnum flyingType,
                                                                                 ActivityResource activityResource,
                                                                                 IDbSession session)
        {
            //创建回滚到的节点信息
            var rollbackPreviousActivityInstance = base.ActivityInstanceManager.CreateBackwardActivityInstanceObject(processInstance.AppName,
                                                                                                                     processInstance.AppInstanceID,
                                                                                                                     processInstance.AppInstanceCode,
                                                                                                                     processInstance.ID,
                                                                                                                     this.SendBackOperation.BackwardToTaskActivity,
                                                                                                                     backwardType,
                                                                                                                     fromActivityInstance.ID,
                                                                                                                     originalBackwardToActivityInstance.ID,
                                                                                                                     activityResource.AppRunner);

            rollbackPreviousActivityInstance.ActivityState            = (short)ActivityStateEnum.Ready;
            rollbackPreviousActivityInstance.MIHostActivityInstanceID = originalBackwardToActivityInstance.MIHostActivityInstanceID;
            rollbackPreviousActivityInstance.CompleteOrder            = originalBackwardToActivityInstance.CompleteOrder;
            rollbackPreviousActivityInstance.ComplexType     = originalBackwardToActivityInstance.ComplexType;
            rollbackPreviousActivityInstance.SignForwardType = originalBackwardToActivityInstance.SignForwardType;

            //人员来自步骤列表的用户数据
            rollbackPreviousActivityInstance.AssignedToUserIDs   = base.SendBackOperation.BackwardToTaskPerformer.UserID;    //多实例节点为单一用户任务
            rollbackPreviousActivityInstance.AssignedToUserNames = base.SendBackOperation.BackwardToTaskPerformer.UserName;

            //插入新活动实例数据
            base.ActivityInstanceManager.Insert(rollbackPreviousActivityInstance,
                                                session);

            //创建新任务数据
            //插入任务数据
            base.TaskManager.Insert(rollbackPreviousActivityInstance,
                                    base.SendBackOperation.BackwardToTaskPerformer,
                                    activityResource.AppRunner,
                                    session);

            //插入转移数据
            base.InsertTransitionInstance(processInstance,
                                          fromActivityInstance,
                                          rollbackPreviousActivityInstance,
                                          TransitionTypeEnum.Backward,
                                          TransitionFlyingTypeEnum.NotFlying,
                                          this.SendBackOperation.ActivityResource.AppRunner,
                                          session);
        }
Example #17
0
        /// <summary>
        /// 创建活动任务转移实例数据
        /// </summary>
        /// <param name="toActivity"></param>
        /// <param name="processInstance"></param>
        /// <param name="fromActivityInstance"></param>
        /// <param name="transitionGUID"></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)
        {
            //判断是否是会签节点,如果是创建会签节点
            if (toActivity.ActivityTypeDetail != null &&
                toActivity.ActivityTypeDetail.ComplexType == ComplexTypeEnum.SignTogether)
            {
                //创建会签节点的主节点,以及会签主节点下的实例子节点记录
                CreateMultipleInstance(toActivity, processInstance, fromActivityInstance,
                                       transitionGUID, transitionType, flyingType, activityResource, session);
            }
            else
            {
                //实例化Activity
                var toActivityInstance = base.CreateActivityInstanceObject(toActivity, processInstance, activityResource.AppRunner);

                //进入运行状态
                toActivityInstance.ActivityState     = (short)ActivityStateEnum.Ready;
                toActivityInstance.AssignedToUserIDs = GenerateActivityAssignedUserIDs(
                    activityResource.NextActivityPerformers[toActivity.ActivityGUID]);
                toActivityInstance.AssignedToUserNames = GenerateActivityAssignedUserNames(
                    activityResource.NextActivityPerformers[toActivity.ActivityGUID]);

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

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

                //插入转移数据
                InsertTransitionInstance(processInstance,
                                         transitionGUID,
                                         fromActivityInstance,
                                         toActivityInstance,
                                         transitionType,
                                         flyingType,
                                         activityResource.AppRunner,
                                         session);
            }
        }
Example #18
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)
        {
            Boolean isParallel = false;

            if (fromActivityInstance.ActivityType == (short)ActivityTypeEnum.GatewayNode)
            {
                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++)
                {
                    var performer = plist[i];
                    CreateSubProcessNode(toActivity, processInstance, fromActivityInstance, transitionGUID, transitionType,
                                         flyingType, activityResource, performer, session);
                }
            }
            else
            {
                if (toActivity.ActivityTypeDetail.ComplexType == ComplexTypeEnum.SignTogether)
                {
                    CreateMultipleInstance(toActivity, processInstance, fromActivityInstance,
                                           transitionGUID, transitionType, flyingType, activityResource, session);
                }
                else
                {
                    CreateSubProcessNode(toActivity, processInstance, fromActivityInstance, transitionGUID, transitionType,
                                         flyingType, activityResource, null, session);
                }
            }
        }
Example #19
0
        /// <summary>
        /// 创建退回时的流转节点对象、任务和转移数据
        /// </summary>
        /// <param name="processInstance">流程实例</param>
        /// <param name="fromActivityInstance">运行节点实例</param>
        /// <param name="backwardType">退回类型</param>
        /// <param name="backMostPreviouslyActivityInstanceID">退回节点实例ID</param>
        /// <param name="transitionGUID">转移GUID</param>
        /// <param name="transitionType">转移类型</param>
        /// <param name="flyingType">跳跃类型</param>
        /// <param name="activityResource">资源</param>
        /// <param name="session">会话</param>
        internal void CreateBackwardActivityTaskTransitionInstance(ProcessInstanceEntity processInstance,
                                                                   ActivityInstanceEntity fromActivityInstance,
                                                                   BackwardTypeEnum backwardType,
                                                                   int backMostPreviouslyActivityInstanceID,
                                                                   string transitionGUID,
                                                                   TransitionTypeEnum transitionType,
                                                                   TransitionFlyingTypeEnum flyingType,
                                                                   ActivityResource activityResource,
                                                                   IDbSession session)
        {
            //实例化Activity
            var toActivityInstance = base.CreateBackwardToActivityInstanceObject(processInstance,
                                                                                 backwardType,
                                                                                 backMostPreviouslyActivityInstanceID,
                                                                                 activityResource.AppRunner);

            //进入准备运行状态
            toActivityInstance.ActivityState     = (short)ActivityStateEnum.Ready;
            toActivityInstance.AssignedToUserIDs = base.GenerateActivityAssignedUserIDs(
                activityResource.NextActivityPerformers[base.BackwardContext.BackwardToTaskActivity.ActivityGUID]);
            toActivityInstance.AssignedToUserNames = base.GenerateActivityAssignedUserNames(
                activityResource.NextActivityPerformers[base.BackwardContext.BackwardToTaskActivity.ActivityGUID]);

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

            base.ReturnDataContext.ActivityInstanceID = toActivityInstance.ID;
            base.ReturnDataContext.ProcessInstanceID  = toActivityInstance.ProcessInstanceID;

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

            //插入转移数据
            base.InsertTransitionInstance(processInstance,
                                          transitionGUID,
                                          fromActivityInstance,
                                          toActivityInstance,
                                          transitionType,
                                          flyingType,
                                          activityResource.AppRunner,
                                          session);
        }
Example #20
0
        /// <summary>
        /// 插入连线实例的方法
        /// </summary>
        /// <param name="processInstance">流程实例</param>
        /// <param name="transitionGUID">转移GUID</param>
        /// <param name="fromActivityInstance">来源活动实例</param>
        /// <param name="toActivityInstance">目的活动实例</param>
        /// <param name="transitionType">转移类型</param>
        /// <param name="flyingType">飞跃类型</param>
        /// <param name="runner">运行者</param>
        /// <param name="session">会话</param>
        /// <returns></returns>
        internal virtual void InsertTransitionInstance(WfProcessInstance processInstance,
                                                       string transitionGUID,
                                                       WfActivityInstance fromActivityInstance,
                                                       WfActivityInstance toActivityInstance,
                                                       TransitionTypeEnum transitionType,
                                                       TransitionFlyingTypeEnum flyingType)
        {
            var tim = new TransitionInstanceManager(_serviceProvider);
            var transitionInstanceObject = tim.CreateTransitionInstanceObject(processInstance,
                                                                              transitionGUID,
                                                                              fromActivityInstance,
                                                                              toActivityInstance,
                                                                              transitionType,
                                                                              flyingType,
                                                                              _runner,
                                                                              (byte)ConditionParseResultEnum.Passed);

            tim.Insert(transitionInstanceObject);
        }
Example #21
0
        /// <summary>
        /// 最后一个会签多实例子节点的撤销操作
        /// </summary>
        /// <param name="processInstance">流程实例</param>
        /// <param name="fromActivityInstance">运行节点</param>
        /// <param name="originalBackwardToActivityInstance">初始退回到的节点实例</param>
        /// <param name="backwardType">退回类型</param>
        /// <param name="transitionGUID">转移GUID</param>
        /// <param name="transitionType">转移类型</param>
        /// <param name="flyingType">跳跃类型</param>
        /// <param name="activityResource">资源</param>
        /// <param name="session">会话</param>
        internal void CreateBackwardActivityTaskTransitionOfLastMultipleInstance(ProcessInstanceEntity processInstance,
                                                                                 ActivityInstanceEntity fromActivityInstance,
                                                                                 ActivityInstanceEntity originalBackwardToActivityInstance,
                                                                                 BackwardTypeEnum backwardType,
                                                                                 string transitionGUID,
                                                                                 TransitionTypeEnum transitionType,
                                                                                 TransitionFlyingTypeEnum flyingType,
                                                                                 ActivityResource activityResource,
                                                                                 IDbSession session)
        {
            //创建回滚到的节点信息
            var rollbackPreviousActivityInstance = base.CreateBackwardToActivityInstanceObject(processInstance,
                                                                                               backwardType,
                                                                                               fromActivityInstance.ID,
                                                                                               originalBackwardToActivityInstance.ID,
                                                                                               activityResource.AppRunner);

            rollbackPreviousActivityInstance.ActivityState            = (short)ActivityStateEnum.Ready;
            rollbackPreviousActivityInstance.MIHostActivityInstanceID = originalBackwardToActivityInstance.MIHostActivityInstanceID;
            rollbackPreviousActivityInstance.CompleteOrder            = originalBackwardToActivityInstance.CompleteOrder;
            rollbackPreviousActivityInstance.ComplexType         = originalBackwardToActivityInstance.ComplexType;
            rollbackPreviousActivityInstance.SignForwardType     = originalBackwardToActivityInstance.SignForwardType;
            rollbackPreviousActivityInstance.AssignedToUserIDs   = originalBackwardToActivityInstance.AssignedToUserIDs;    //多实例节点为单一用户任务
            rollbackPreviousActivityInstance.AssignedToUserNames = originalBackwardToActivityInstance.AssignedToUserNames;

            //插入新活动实例数据
            base.ActivityInstanceManager.Insert(rollbackPreviousActivityInstance,
                                                session);
            base.ReturnDataContext.ActivityInstanceID = rollbackPreviousActivityInstance.ID;
            base.ReturnDataContext.ProcessInstanceID  = rollbackPreviousActivityInstance.ProcessInstanceID;
            //创建新任务数据
            base.CreateNewTask(rollbackPreviousActivityInstance, activityResource, session);

            //插入转移数据
            base.InsertTransitionInstance(processInstance,
                                          transitionGUID,
                                          fromActivityInstance,
                                          rollbackPreviousActivityInstance,
                                          transitionType,
                                          flyingType,
                                          activityResource.AppRunner,
                                          session);
        }
Example #22
0
        /// <summary>
        /// 插入连线实例的方法
        /// </summary>
        /// <param name="processInstance"></param>
        /// <param name="fromToTransition"></param>
        /// <param name="fromActivityInstance"></param>
        /// <param name="toActivityInstance"></param>
        /// <param name="conditionParseResult"></param>
        /// <param name="wfLinqDataContext"></param>
        /// <returns></returns>
        internal virtual void InsertTransitionInstance(ProcessInstanceEntity processInstance,
                                                       TransitionEntity fromToTransition,
                                                       ActivityInstanceEntity fromActivityInstance,
                                                       ActivityInstanceEntity toActivityInstance,
                                                       TransitionTypeEnum transitionType,
                                                       WfLogonUser logonUser,
                                                       ISession session)
        {
            var tim = new TransitionInstanceManager();
            var transitionInstanceObject = tim.CreateTransitionInstanceObject(processInstance,
                                                                              fromToTransition,
                                                                              fromActivityInstance,
                                                                              toActivityInstance,
                                                                              transitionType,
                                                                              logonUser,
                                                                              (byte)ConditionParseResultEnum.Passed);

            tim.Insert(transitionInstanceObject,
                       session);
        }
Example #23
0
        /// <summary>
        /// 插入连线实例的方法
        /// </summary>
        /// <param name="processInstance">流程实例</param>
        /// <param name="transitionId">转移ID</param>
        /// <param name="fromActivityInstance">起始活动实例</param>
        /// <param name="toActivityInstance">到达活动实例</param>
        /// <param name="transitionType">转移类型</param>
        /// <param name="flyingType">跳跃类型</param>
        /// <param name="runner">执行者</param>
        /// <param name="session">Session</param>
        internal virtual void InsertTransitionInstance(WfProcessInstance processInstance,
                                                       String transitionId,
                                                       WfActivityInstance fromActivityInstance,
                                                       WfActivityInstance toActivityInstance,
                                                       TransitionTypeEnum transitionType,
                                                       TransitionFlyingTypeEnum flyingType,
                                                       WfAppRunner runner)
        {
            var tim = new TransitionInstanceManager(_dataAccessor, _loggerFactory);
            var transitionInstanceObject = tim.CreateTransitionInstanceObject(processInstance,
                                                                              transitionId,
                                                                              fromActivityInstance,
                                                                              toActivityInstance,
                                                                              transitionType,
                                                                              flyingType,
                                                                              runner,
                                                                              (byte)ConditionParseResultEnum.Passed);

            tim.Insert(transitionInstanceObject);
        }
        /// <summary>
        /// 插入连线实例的方法
        /// </summary>
        /// <param name="processInstance">流程实例</param>
        /// <param name="transitionGUID">转移GUID</param>
        /// <param name="fromActivityInstance">来源活动实例</param>
        /// <param name="toActivityInstance">目的活动实例</param>
        /// <param name="transitionType">转移类型</param>
        /// <param name="flyingType">飞跃类型</param>
        /// <param name="runner">运行者</param>
        /// <param name="session">会话</param>
        /// <returns></returns>
        internal virtual void InsertTransitionInstance(ProcessInstanceEntity processInstance,
                                                       string transitionGUID,
                                                       ActivityInstanceEntity fromActivityInstance,
                                                       ActivityInstanceEntity toActivityInstance,
                                                       TransitionTypeEnum transitionType,
                                                       TransitionFlyingTypeEnum flyingType,
                                                       WfAppRunner runner,
                                                       IDbSession session)
        {
            var tim = new TransitionInstanceManager();
            var transitionInstanceObject = tim.CreateTransitionInstanceObject(processInstance,
                                                                              transitionGUID,
                                                                              fromActivityInstance,
                                                                              toActivityInstance,
                                                                              transitionType,
                                                                              flyingType,
                                                                              runner,
                                                                              (byte)ConditionParseResultEnum.Passed);

            tim.Insert(session.Connection, transitionInstanceObject, session.Transaction);
        }
        /// <summary>
        /// 创建退回时的流转节点对象、任务和转移数据
        /// </summary>
        /// <param name="processInstance"></param>
        /// <param name="fromActivityInstance"></param>
        /// <param name="backMostPreviouslyActivityInstanceID"></param>
        /// <param name="transitionGUID"></param>
        /// <param name="transitionType"></param>
        /// <param name="flyingType"></param>
        /// <param name="activityResource"></param>
        /// <param name="session"></param>
        internal void CreateBackwardActivityTaskTransitionInstance(ProcessInstanceEntity processInstance,
            ActivityInstanceEntity fromActivityInstance,
            BackwardTypeEnum backwardType,
            int backMostPreviouslyActivityInstanceID,
            string transitionGUID,
            TransitionTypeEnum transitionType,
            TransitionFlyingTypeEnum flyingType,
            ActivityResource activityResource,
            IDbSession session)
        {
            //实例化Activity
            var toActivityInstance = base.CreateBackwardToActivityInstanceObject(processInstance,
                backwardType,
                backMostPreviouslyActivityInstanceID,
                activityResource.AppRunner);

            //进入运行状态
            toActivityInstance.ActivityState = (short)ActivityStateEnum.Ready;
            toActivityInstance.AssignedToUsers = base.GenerateActivityAssignedUsers(
                activityResource.NextActivityPerformers[base.BackwardContext.BackwardToTaskActivity.ActivityGUID]);

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

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

            //插入转移数据
            base.InsertTransitionInstance(processInstance,
                transitionGUID,
                fromActivityInstance,
                toActivityInstance,
                transitionType,
                flyingType,
                activityResource.AppRunner,
                session);
        }
Example #26
0
        /// <summary>
        /// 插入连线实例的方法
        /// </summary>
        /// <param name="processInstance">流程实例</param>
        /// <param name="fromActivityInstance">起始活动实例</param>
        /// <param name="toActivityInstance">到达活动实例</param>
        /// <param name="transitionType">转移类型</param>
        /// <param name="flyingType">跳跃类型</param>
        /// <param name="runner">执行者</param>
        /// <param name="session">Session</param>
        /// <returns>新转移实例ID</returns>
        internal virtual int InsertTransitionInstance(ProcessInstanceEntity processInstance,
                                                      ActivityInstanceEntity fromActivityInstance,
                                                      ActivityInstanceEntity toActivityInstance,
                                                      TransitionTypeEnum transitionType,
                                                      TransitionFlyingTypeEnum flyingType,
                                                      WfAppRunner runner,
                                                      IDbSession session)
        {
            var transition = SendBackOperation.ProcessModel.GetForwardTransition(toActivityInstance.ActivityGUID,
                                                                                 fromActivityInstance.ActivityGUID);
            var transitionGUID           = transition != null ? transition.TransitionGUID : WfDefine.WF_XPDL_SEND_BACK_UNKNOWN_GUID;
            var transitionInstanceObject = this.TransitionInstanceManager.CreateTransitionInstanceObject(processInstance,
                                                                                                         transitionGUID,
                                                                                                         fromActivityInstance,
                                                                                                         toActivityInstance,
                                                                                                         transitionType,
                                                                                                         flyingType,
                                                                                                         runner,
                                                                                                         (byte)ConditionParseResultEnum.Passed);
            var newID = this.TransitionInstanceManager.Insert(session.Connection, transitionInstanceObject, session.Transaction);

            return(newID);
        }
Example #27
0
        /// <summary>
        /// 结束节点活动及转移实例化,没有任务数据
        /// </summary>
        /// <param name="toActivity">当前Activity</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">Session</param>
        internal override void CreateActivityTaskTransitionInstance(ActivityEntity toActivity,
                                                                    WfProcessInstance processInstance,
                                                                    WfActivityInstance fromActivityInstance,
                                                                    string transitionGUID,
                                                                    TransitionTypeEnum transitionType,
                                                                    TransitionFlyingTypeEnum flyingType)
        {
            var toActivityInstance = base.CreateActivityInstanceObject(toActivity,
                                                                       processInstance, AppRunner);

            base.ActivityInstanceManager.Insert(toActivityInstance);

            base.ActivityInstanceManager.Complete(toActivityInstance.Fid,
                                                  AppRunner);

            //写节点转移实例数据
            base.InsertTransitionInstance(processInstance,
                                          transitionGUID,
                                          fromActivityInstance,
                                          toActivityInstance,
                                          transitionType,
                                          flyingType, AppRunner);
        }
        /// <summary>
        /// 创建退回时的流转节点对象、任务和转移数据
        /// </summary>
        /// <param name="processInstance">流程实例</param>
        /// <param name="fromActivityInstance">运行节点实例</param>
        /// <param name="backwardType">退回类型</param>
        /// <param name="backMostPreviouslyActivityInstanceID">退回节点实例ID</param>
        /// <param name="transitionGUID">转移GUID</param>
        /// <param name="transitionType">转移类型</param>
        /// <param name="flyingType">跳跃类型</param>
        /// <param name="activityResource">资源</param>
        /// <param name="session">会话</param>
        internal void CreateBackwardActivityTaskTransitionInstance(WfProcessInstance processInstance,
                                                                   WfActivityInstance fromActivityInstance,
                                                                   BackwardTypeEnum backwardType,
                                                                   string backMostPreviouslyActivityInstanceID,
                                                                   string transitionGUID,
                                                                   TransitionTypeEnum transitionType,
                                                                   TransitionFlyingTypeEnum flyingType)
        {
            //实例化Activity
            var toActivityInstance = base.CreateBackwardToActivityInstanceObject(processInstance, fromActivityInstance,
                                                                                 backwardType,
                                                                                 backMostPreviouslyActivityInstanceID,
                                                                                 this.AppRunner);

            //进入准备运行状态
            toActivityInstance.ActivityState       = ActivityStateEnum.Ready.ToString();
            toActivityInstance.AssignedToUserIds   = base.GenerateActivityAssignedUserIDs(this.BackwardContext.BackwardToTaskActivity.Performers);
            toActivityInstance.AssignedToUserNames = base.GenerateActivityAssignedUserNames(this.BackwardContext.BackwardToTaskActivity.Performers);

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

            base.ReturnDataContext.ActivityInstanceUid = toActivityInstance.Fid;
            base.ReturnDataContext.ProcessInstanceUid  = toActivityInstance.ProcessInsUid;

            //插入任务数据
            base.CreateNewTask(toActivityInstance, this.BackwardContext.BackwardToTaskActivity);

            //插入转移数据
            base.InsertTransitionInstance(processInstance,
                                          transitionGUID,
                                          fromActivityInstance,
                                          toActivityInstance,
                                          transitionType,
                                          flyingType, AppRunner);
        }
Example #29
0
        /// <summary>
        /// 退回是会签情况下的处理:
        /// 要退回的节点是会签节点
        /// 1) 全部实例化会签节点下的多实例节点
        /// 2) 只取得办理完成的节点,而且保证CompleteOrder的唯一性
        /// </summary>
        /// <param name="processInstance">流程实例</param>
        /// <param name="backwardToTaskActvity">退回到的活动节点</param>
        /// <param name="fromActivityInstance">运行节点</param>
        /// <param name="backwardType">退回类型</param>
        /// <param name="previousMainInstance">前主节点实例</param>
        /// <param name="transitionGUID">转移GUID</param>
        /// <param name="transitionType">转移类型</param>
        /// <param name="flyingType">跳跃类型</param>
        /// <param name="activityResource">资源</param>
        /// <param name="session">会话</param>
        internal void CreateBackwardActivityTaskRepeatedSignTogetherMultipleInstance(ProcessInstanceEntity processInstance,
                                                                                     ActivityEntity backwardToTaskActvity,
                                                                                     ActivityInstanceEntity fromActivityInstance,
                                                                                     BackwardTypeEnum backwardType,
                                                                                     ActivityInstanceEntity previousMainInstance,
                                                                                     string transitionGUID,
                                                                                     TransitionTypeEnum transitionType,
                                                                                     TransitionFlyingTypeEnum flyingType,
                                                                                     ActivityResource activityResource,
                                                                                     IDbSession session)
        {
            //上一步节点是会签节点的退回处理
            //需要重新实例化会签节点上的所有办理人的任务
            //重新封装任务办理人为AssignedToUsers, AssignedToUsernames
            var performerList = AntiGenerateActivityPerformerList(previousMainInstance);

            activityResource.NextActivityPerformers.Clear();
            activityResource.NextActivityPerformers = new Dictionary <string, PerformerList>();
            activityResource.NextActivityPerformers.Add(backwardToTaskActvity.ActivityGUID, performerList);

            //重新生成会签节点的多实例数据
            CreateMultipleInstance(backwardToTaskActvity, processInstance, fromActivityInstance,
                                   transitionGUID, transitionType, flyingType, activityResource, session);
        }
        /// <summary>
        /// 创建转移实例数据
        /// </summary>
        /// <param name="processInstance">流程实例</param>
        /// <param name="transitionGUID">转移GUID</param>
        /// <param name="fromActivityInstance">来源活动实例</param>
        /// <param name="toActivityInstance">目的活动实例</param>
        /// <param name="transitionType">转移类型</param>
        /// <param name="flyingType">飞越类型</param>
        /// <param name="runner">执行者</param>
        /// <param name="conditionParseResult">条件解析结果</param>
        /// <returns>转移实例</returns>
        internal TransitionInstanceEntity CreateTransitionInstanceObject(ProcessInstanceEntity processInstance,
                                                                         String transitionGUID,
                                                                         ActivityInstanceEntity fromActivityInstance,
                                                                         ActivityInstanceEntity toActivityInstance,
                                                                         TransitionTypeEnum transitionType,
                                                                         TransitionFlyingTypeEnum flyingType,
                                                                         WfAppRunner runner,
                                                                         byte conditionParseResult)
        {
            var entity = new TransitionInstanceEntity();

            entity.AppName           = processInstance.AppName;
            entity.AppInstanceID     = processInstance.AppInstanceID;
            entity.ProcessGUID       = processInstance.ProcessGUID;
            entity.ProcessInstanceID = processInstance.ID;
            entity.TransitionGUID    = transitionGUID;
            entity.TransitionType    = (byte)transitionType;
            entity.FlyingType        = (byte)flyingType;

            //构造活动节点数据
            entity.FromActivityGUID       = fromActivityInstance.ActivityGUID;
            entity.FromActivityInstanceID = fromActivityInstance.ID;
            entity.FromActivityType       = fromActivityInstance.ActivityType;
            entity.FromActivityName       = fromActivityInstance.ActivityName;
            entity.ToActivityGUID         = toActivityInstance.ActivityGUID;
            entity.ToActivityInstanceID   = toActivityInstance.ID;
            entity.ToActivityType         = toActivityInstance.ActivityType;
            entity.ToActivityName         = toActivityInstance.ActivityName;

            entity.ConditionParseResult = conditionParseResult;
            entity.CreatedByUserID      = runner.UserID;
            entity.CreatedByUserName    = runner.UserName;
            entity.CreatedDateTime      = System.DateTime.Now;

            return(entity);
        }
        /// <summary>
        /// 会签类型的主节点, 多实例节点处理
        /// </summary>
        /// <param name="processInstance"></param>
        /// <param name="fromToTransition"></param>
        /// <param name="fromActivityInstance"></param>
        /// <param name="activityResource"></param>
        /// <param name="session"></param>
        internal void CreateMultipleInstance(ActivityEntity toActivity,
                                             ProcessInstanceEntity processInstance,
                                             ActivityInstanceEntity fromActivityInstance,
                                             String transitionGUID,
                                             TransitionTypeEnum transitionType,
                                             TransitionFlyingTypeEnum flyingType,
                                             ActivityResource activityResource,
                                             IDbSession session)
        {
            //实例化主节点Activity
            var toActivityInstance = CreateActivityInstanceObject(toActivity,
                                                                  processInstance, activityResource.AppRunner);

            //主节点实例数据
            toActivityInstance.ActivityState = (short)ActivityStateEnum.Suspended;
            toActivityInstance.ComplexType   = (short)ComplexTypeEnum.SignTogether;
            if (toActivity.ActivityTypeDetail.MergeType == MergeTypeEnum.Parallel)
            {
                toActivityInstance.CompleteOrder = toActivity.ActivityTypeDetail.CompleteOrder;
            }
            toActivityInstance.AssignedToUserIDs = GenerateActivityAssignedUserIDs(
                activityResource.NextActivityPerformers[toActivity.ActivityGUID]);

            //插入主节点实例数据
            base.ActivityInstanceManager.Insert(toActivityInstance, session);

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

            //插入会签子节点实例数据
            var plist = activityResource.NextActivityPerformers[toActivity.ActivityGUID];
            ActivityInstanceEntity entity = new ActivityInstanceEntity();

            for (short i = 0; i < plist.Count; i++)
            {
                entity = base.ActivityInstanceManager.CreateActivityInstanceObject(toActivityInstance);
                entity.AssignedToUserIDs        = plist[i].UserID;
                entity.AssignedToUserNames      = plist[i].UserName;
                entity.MIHostActivityInstanceID = toActivityInstance.ID;
                entity.CompleteOrder            = (short)(i + 1);

                //只有第一个节点处于运行状态,其它节点挂起
                if ((i > 0) && (toActivity.ActivityTypeDetail.MergeType == MergeTypeEnum.Sequence))
                {
                    entity.ActivityState = (short)ActivityStateEnum.Suspended;
                }

                //插入活动实例数据,并返回活动实例ID
                entity.ID = base.ActivityInstanceManager.Insert(entity, session);

                //插入任务数据
                base.TaskManager.Insert(entity, plist[i], activityResource.AppRunner, session);

                //启动子流程
                IDbSession       subSession    = SessionFactory.CreateSession();
                WfExecutedResult startedResult = null;
                var subProcessNode             = (SubProcessNode)toActivity.Node;
                subProcessNode.ActivityInstance = entity;   //在流程实例表中记录激活子流程的活动节点ID
                WfAppRunner subRunner = CopyActivityForwardRunner(activityResource.AppRunner,
                                                                  plist[i],
                                                                  subProcessNode);
                var runtimeInstance = WfRuntimeManagerFactory.CreateRuntimeInstanceStartup(subRunner,
                                                                                           processInstance,
                                                                                           subProcessNode,
                                                                                           ref startedResult);

                if (runtimeInstance.WfExecutedResult.Status == WfExecutedStatus.Exception)
                {
                    throw new WfRuntimeException(runtimeInstance.WfExecutedResult.Message);
                }
                runtimeInstance.Execute(subSession);

                //如果是串行会签,只有第一个子流程可以运行,其它子流程处于挂起状态
                if ((i > 0) && (toActivity.ActivityTypeDetail.MergeType == MergeTypeEnum.Sequence))
                {
                    var startResult = (WfExecutedResult)runtimeInstance.WfExecutedResult;
                    base.ProcessInstanceManager.Suspend(startedResult.ProcessInstanceIDStarted, subRunner, subSession);
                }
            }
        }
Example #32
0
        /// <summary>
        /// 会签类型的主节点, 多实例节点处理
        /// </summary>
        /// <param name="processInstance"></param>
        /// <param name="fromToTransition"></param>
        /// <param name="fromActivityInstance"></param>
        /// <param name="activityResource"></param>
        /// <param name="session"></param>
        internal void CreateMultipleInstance(ActivityEntity toActivity,
            ProcessInstanceEntity processInstance,
            ActivityInstanceEntity fromActivityInstance,
            String transitionGUID,
            TransitionTypeEnum transitionType,
            TransitionFlyingTypeEnum flyingType,
            ActivityResource activityResource,
            IDbSession session)
        {
            //实例化主节点Activity
            var toActivityInstance = base.CreateActivityInstanceObject(toActivity,
                processInstance, activityResource.AppRunner);

            //主节点实例数据
            toActivityInstance.ActivityState = (short)ActivityStateEnum.Suspended;
            toActivityInstance.ComplexType = (short)ComplexTypeEnum.MultipleInstance;
            if (toActivity.ActivityTypeDetail.MergeType == MergeTypeEnum.Parallel)
            {
                toActivityInstance.CompleteOrder = toActivity.ActivityTypeDetail.CompleteOrder;
            }
            toActivityInstance.AssignedToUsers = GenerateActivityAssignedUsers(
                activityResource.NextActivityPerformers[toActivity.ActivityGUID]);

            //插入主节点实例数据
            base.ActivityInstanceManager.Insert(toActivityInstance, session);

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

            //插入会签子节点实例数据
            var plist = activityResource.NextActivityPerformers[toActivity.ActivityGUID];
            ActivityInstanceEntity entity = new ActivityInstanceEntity();
            for (short i = 0; i < plist.Count; i++)
            {
                entity = base.ActivityInstanceManager.CreateActivityInstanceObject(toActivityInstance);
                entity.AssignedToUsers = plist[i].UserID.ToString();
                entity.MIHostActivityInstanceID = toActivityInstance.ID;
                entity.CompleteOrder = (short)(i + 1);

                //如果是串行会签,只有第一个节点处于运行状态,其它节点挂起
                if ((i > 0) && (toActivity.ActivityTypeDetail.MergeType == MergeTypeEnum.Sequence))
                {
                    entity.ActivityState = (short)ActivityStateEnum.Suspended;
                }

                //插入活动实例数据,并返回活动实例ID
                entity.ID = base.ActivityInstanceManager.Insert(entity, session);

                //插入任务数据
                base.TaskManager.Insert(entity, plist[i], activityResource.AppRunner, session);
            }
        }
        /// <summary>
        /// 退回是会签情况下的处理:
        /// 要退回的节点是会签节点
        /// 1) 全部实例化会签节点下的多实例节点
        /// 2) 只取得办理完成的节点,而且保证CompleteOrder的唯一性
        /// </summary>
        /// <param name="processInstance"></param>
        /// <param name="originalBackwardToActivityInstance"></param>
        /// <param name="backwardType"></param>
        /// <param name="backSrcActivityInstanceID"></param>
        /// <param name="activityResource"></param>
        /// <param name="session"></param>
        internal void CreateBackwardActivityTaskRepeatedSignTogetherMultipleInstance(ProcessInstanceEntity processInstance,
            ActivityEntity backwardToTaskActvity,
            ActivityInstanceEntity fromActivityInstance,
            BackwardTypeEnum backwardType,
            ActivityInstanceEntity previousMainInstance,
            string transitionGUID,
            TransitionTypeEnum transitionType,
            TransitionFlyingTypeEnum flyingType,
            ActivityResource activityResource,
            IDbSession session)
        {
            //上一步节点是会签节点的退回处理
            //需要重新实例化会签节点上的所有办理人的任务
            //重新封装任务办理人为AssignedToUsers, AssignedToUsernames
            var performerList = AntiGenerateActivityPerformerList(previousMainInstance);

            activityResource.NextActivityPerformers.Clear();
            activityResource.NextActivityPerformers = new Dictionary<string, PerformerList>();
            activityResource.NextActivityPerformers.Add(backwardToTaskActvity.ActivityGUID, performerList);

            //重新生成会签节点的多实例数据
            CreateMultipleInstance(backwardToTaskActvity, processInstance, fromActivityInstance,
                transitionGUID, transitionType, flyingType, activityResource, session);
        }
Example #34
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);
            }
        }
        /// <summary>
        /// 退回是加签情况下的处理:
        /// 要退回的节点是加签节点
        /// 只实例化当初的加签主节点
        /// </summary>
        /// <param name="processInstance"></param>
        /// <param name="backwardToTaskActvity"></param>
        /// <param name="fromActivityInstance"></param>
        /// <param name="backwardType"></param>
        /// <param name="previousMainInstance"></param>
        /// <param name="transitionGUID"></param>
        /// <param name="transitionType"></param>
        /// <param name="flyingType"></param>
        /// <param name="activityResource"></param>
        /// <param name="session"></param>
        internal void CreateBackwardActivityTaskRepateSignForwardMainNodeOnly(ProcessInstanceEntity processInstance,
            ActivityEntity backwardToTaskActvity,
            ActivityInstanceEntity fromActivityInstance,
            BackwardTypeEnum backwardType,
            ActivityInstanceEntity previousMainInstance,
            string transitionGUID,
            TransitionTypeEnum transitionType,
            TransitionFlyingTypeEnum flyingType,
            ActivityResource activityResource,
            IDbSession session)
        {
            // 退回是加签情况下的处理:
            // 要退回的节点是加签节点
            // 只实例化当初的加签主节点
            //重新封装任务办理人为AssignedToUsers, AssignedToUsernames
            var performerList = AntiGenerateActivityPerformerList(previousMainInstance);

            activityResource.NextActivityPerformers.Clear();
            activityResource.NextActivityPerformers = new Dictionary<string, PerformerList>();
            activityResource.NextActivityPerformers.Add(backwardToTaskActvity.ActivityGUID, performerList);

            //实例化Activity
            var toActivityInstance = base.CreateBackwardToActivityInstanceObject(processInstance,
                backwardType,
                previousMainInstance.ID,
                activityResource.AppRunner);

            //进入准备运行状态
            toActivityInstance.ActivityState = (short)ActivityStateEnum.Ready;
            toActivityInstance.AssignedToUserIDs = previousMainInstance.AssignedToUserIDs;
            toActivityInstance.AssignedToUserNames = previousMainInstance.AssignedToUserNames;
            toActivityInstance.ComplexType = previousMainInstance.ComplexType;
            toActivityInstance.CompleteOrder = previousMainInstance.CompleteOrder;
            toActivityInstance.SignForwardType = previousMainInstance.SignForwardType;

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

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

            //插入转移数据
            base.InsertTransitionInstance(processInstance,
                transitionGUID,
                fromActivityInstance,
                toActivityInstance,
                transitionType,
                flyingType,
                activityResource.AppRunner,
                session);
        }
Example #36
0
 /// <summary>
 /// 创建工作项及转移数据
 /// </summary>
 /// <param name="toActivity"></param>
 /// <param name="processInstance"></param>
 /// <param name="fromActivityInstance"></param>
 /// <param name="transitionGUID"></param>
 /// <param name="transitionType"></param>
 /// <param name="flyingType"></param>
 /// <param name="activityResource"></param>
 /// <param name="session"></param>
 internal virtual void CreateActivityTaskTransitionInstance(ActivityEntity toActivity,
     ProcessInstanceEntity processInstance,
     ActivityInstanceEntity fromActivityInstance,
     String transitionGUID,
     TransitionTypeEnum transitionType,
     TransitionFlyingTypeEnum flyingType,
     ActivityResource activityResource,
     IDbSession session)
 {
 }
Example #37
0
        /// <summary>
        /// 会签类型的主节点, 多实例节点处理
        /// </summary>
        /// <param name="processInstance"></param>
        /// <param name="fromToTransition"></param>
        /// <param name="fromActivityInstance"></param>
        /// <param name="activityResource"></param>
        /// <param name="session"></param>
        internal void CreateMultipleInstance(ActivityEntity toActivity,
            ProcessInstanceEntity processInstance,
            ActivityInstanceEntity fromActivityInstance,
            String transitionGUID,
            TransitionTypeEnum transitionType,
            TransitionFlyingTypeEnum flyingType,
            ActivityResource activityResource,
            IDbSession session)
        {
            //实例化主节点Activity
            var toActivityInstance = CreateActivityInstanceObject(toActivity,
                processInstance, activityResource.AppRunner);

            //主节点实例数据
            toActivityInstance.ActivityState = (short)ActivityStateEnum.Suspended;
            toActivityInstance.ComplexType = (short)ComplexTypeEnum.SignTogether;
            if (toActivity.ActivityTypeDetail.MergeType == MergeTypeEnum.Parallel)
            {
                toActivityInstance.CompleteOrder = toActivity.ActivityTypeDetail.CompleteOrder;
            }
            toActivityInstance.AssignedToUserIDs = GenerateActivityAssignedUserIDs(
                activityResource.NextActivityPerformers[toActivity.ActivityGUID]);

            //插入主节点实例数据
            base.ActivityInstanceManager.Insert(toActivityInstance, session);

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

            //插入会签子节点实例数据
            var plist = activityResource.NextActivityPerformers[toActivity.ActivityGUID];
            ActivityInstanceEntity entity = new ActivityInstanceEntity();
            for (short i = 0; i < plist.Count; i++)
            {
                entity = base.ActivityInstanceManager.CreateActivityInstanceObject(toActivityInstance);
                entity.AssignedToUserIDs = plist[i].UserID;
                entity.AssignedToUserNames = plist[i].UserName;
                entity.MIHostActivityInstanceID = toActivityInstance.ID;
                entity.CompleteOrder = (short)(i + 1);

                //只有第一个节点处于运行状态,其它节点挂起
                if ((i > 0) && (toActivity.ActivityTypeDetail.MergeType == MergeTypeEnum.Sequence))
                {
                    entity.ActivityState = (short)ActivityStateEnum.Suspended;
                }

                //插入活动实例数据,并返回活动实例ID
                entity.ID = base.ActivityInstanceManager.Insert(entity, session);

                //插入任务数据
                base.TaskManager.Insert(entity, plist[i], activityResource.AppRunner, session);

                //启动子流程
                IDbSession subSession = SessionFactory.CreateSession();
                WfExecutedResult startedResult = null;
                var subProcessNode = (SubProcessNode)toActivity.Node;
                subProcessNode.ActivityInstance = entity;   //在流程实例表中记录激活子流程的活动节点ID
                WfAppRunner subRunner = CopyActivityForwardRunner(activityResource.AppRunner,
                    plist[i],
                    subProcessNode);
                var runtimeInstance = WfRuntimeManagerFactory.CreateRuntimeInstanceStartup(subRunner,
                    processInstance,
                    subProcessNode,
                    ref startedResult);

                if (runtimeInstance.WfExecutedResult.Status == WfExecutedStatus.Exception)
                {
                    throw new WfRuntimeException(runtimeInstance.WfExecutedResult.Message);
                }
                runtimeInstance.Execute(subSession);

                //如果是串行会签,只有第一个子流程可以运行,其它子流程处于挂起状态
                if ((i > 0) && (toActivity.ActivityTypeDetail.MergeType == MergeTypeEnum.Sequence))
                {
                    var startResult = (WfExecutedResult)runtimeInstance.WfExecutedResult;
                    base.ProcessInstanceManager.Suspend(startedResult.ProcessInstanceIDStarted, subRunner, subSession);
                }
            }
        }
Example #38
0
        internal override void CreateActivityTaskTransitionInstance(ActivityEntity toActivity,
           ProcessInstanceEntity processInstance,
           ActivityInstanceEntity fromActivityInstance,
           string transitionGUID,
           TransitionTypeEnum transitionType,
           TransitionFlyingTypeEnum flyingType,
           ActivityResource activityResource,
           IDbSession session)
        {
            if (toActivity.ActivityTypeDetail.ComplexType == ComplexTypeEnum.SignTogether)
            {
                CreateMultipleInstance(toActivity, processInstance, fromActivityInstance,
                    transitionGUID, transitionType, flyingType, activityResource, session);
            }
            else
            {
                //实例化Activity
                var toActivityInstance = CreateActivityInstanceObject(toActivity, processInstance, activityResource.AppRunner);

                //进入运行状态
                toActivityInstance.ActivityState = (short)ActivityStateEnum.Ready;
                toActivityInstance.AssignedToUserIDs = GenerateActivityAssignedUserIDs(
                    activityResource.NextActivityPerformers[toActivity.ActivityGUID]);
                toActivityInstance.AssignedToUserNames = GenerateActivityAssignedUserNames(
                    activityResource.NextActivityPerformers[toActivity.ActivityGUID]);

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

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

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

                //启动子流程
                WfExecutedResult startedResult = null;
                var subProcessNode = (SubProcessNode)toActivity.Node;
                subProcessNode.ActivityInstance = toActivityInstance;
                WfAppRunner subRunner = CopyActivityForwardRunner(activityResource.AppRunner,
                    new Performer(activityResource.AppRunner.UserID,
                        activityResource.AppRunner.UserName),
                    subProcessNode);
                var runtimeInstance = WfRuntimeManagerFactory.CreateRuntimeInstanceStartup(subRunner,
                    processInstance,
                    subProcessNode,
                    ref startedResult);
                runtimeInstance.Execute(Session);
            }
        }
        /// <summary>
        /// 创建活动任务转移实例数据
        /// </summary>
        /// <param name="toActivity"></param>
        /// <param name="processInstance"></param>
        /// <param name="fromActivityInstance"></param>
        /// <param name="transitionGUID"></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)
        {
            //判断是否是会签节点,如果是创建会签节点
            if (toActivity.ActivityTypeDetail != null
                && toActivity.ActivityTypeDetail.ComplexType == ComplexTypeEnum.SignTogether)
            {
                //创建会签节点的主节点,以及会签主节点下的实例子节点记录
                CreateMultipleInstance(toActivity, processInstance, fromActivityInstance,
                    transitionGUID, transitionType, flyingType, activityResource, session);
            }
            else
            {
                //实例化Activity
                var toActivityInstance = base.CreateActivityInstanceObject(toActivity, processInstance, activityResource.AppRunner);

                //进入运行状态
                toActivityInstance.ActivityState = (short)ActivityStateEnum.Ready;
                toActivityInstance.AssignedToUserIDs = GenerateActivityAssignedUserIDs(
                    activityResource.NextActivityPerformers[toActivity.ActivityGUID]);
                toActivityInstance.AssignedToUserNames = GenerateActivityAssignedUserNames(
                    activityResource.NextActivityPerformers[toActivity.ActivityGUID]);

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

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

                //插入转移数据
                InsertTransitionInstance(processInstance,
                    transitionGUID,
                    fromActivityInstance,
                    toActivityInstance,
                    transitionType,
                    flyingType,
                    activityResource.AppRunner,
                    session);
            }
        }
        /// <summary>
        /// 插入连线实例的方法
        /// </summary>
        /// <param name="processInstance"></param>
        /// <param name="fromToTransition"></param>
        /// <param name="fromActivityInstance"></param>
        /// <param name="toActivityInstance"></param>
        /// <param name="conditionParseResult"></param>
        /// <param name="wfLinqDataContext"></param>
        /// <returns></returns>
        internal virtual void InsertTransitionInstance(ProcessInstanceEntity processInstance,
            string transitionGUID,
            ActivityInstanceEntity fromActivityInstance,
            ActivityInstanceEntity toActivityInstance,
            TransitionTypeEnum transitionType,
            TransitionFlyingTypeEnum flyingType,
            WfAppRunner runner,
            IDbSession session)
        {
            var tim = new TransitionInstanceManager();
            var transitionInstanceObject = tim.CreateTransitionInstanceObject(processInstance,
                transitionGUID,
                fromActivityInstance,
                toActivityInstance,
                transitionType,
                flyingType,
                runner,
                (byte)ConditionParseResultEnum.Passed);

            tim.Insert(session.Connection, transitionInstanceObject, session.Transaction);
        }