コード例 #1
0
ファイル: NodeMediatorEnd.cs プロジェクト: zitjubiz/Slickflow
        /// <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);
        }
コード例 #2
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);
        }
コード例 #3
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);
            }
        }
コード例 #4
0
        /// <summary>
        /// EOrJoin合并时的节点完成方法
        /// 根据前置转移上定义的是否强制分支来判断完成合并节点
        /// </summary>
        /// <param name="processInstance">流程实例</param>
        /// <param name="transitionGUID">转移GUID</param>
        /// <param name="fromActivity">起始活动</param>
        /// <param name="fromActivityInstance">起始活动实例</param>
        /// <param name="runner">运行者</param>
        /// <param name="session">会话</param>
        private NodeAutoExecutedResult CompleteAutomaticallyByForcedBranchesCount(ProcessInstanceEntity processInstance,
                                                                                  string transitionGUID,
                                                                                  ActivityEntity fromActivity,
                                                                                  ActivityInstanceEntity fromActivityInstance,
                                                                                  WfAppRunner runner,
                                                                                  IDbSession session)
        {
            NodeAutoExecutedResult result = NodeAutoExecutedResult.CreateGatewayExecutedResult(NodeAutoExecutedStatus.Unknown);

            IList <TransitionEntity> forcedTransitionList = null;
            var tokensCountRequired = base.ProcessModel.GetForcedBranchesCountBeforeEOrJoin(GatewayActivity, out forcedTransitionList);

            if (tokensCountRequired == 0)
            {
                result = NodeAutoExecutedResult.CreateGatewayExecutedResult(NodeAutoExecutedStatus.Failed);
                throw new WfXpdlException(LocalizeHelper.GetEngineMessage("nodemediatoreorjoin.CompleteAutomaticallyByForcedBranchesCount.error"));
            }

            //根据强制分支的数目和具体分支来完成增强合并节点
            var forcedCount = forcedTransitionList.Where(t => t.TransitionGUID == transitionGUID).Count();

            if (forcedCount == 0)
            {
                //当前执行的分支不是强制分支,直接返回就可以
                result = NodeAutoExecutedResult.CreateGatewayExecutedResult(NodeAutoExecutedStatus.NotForcedBrancheWhenEOrJoin);
            }
            else if (forcedCount == 1)
            {
                result = CompleteAutomaticallyInternal(processInstance, transitionGUID, fromActivity, fromActivityInstance, tokensCountRequired, runner, session);
            }
            return(result);
        }
コード例 #5
0
        /// <summary>
        /// 创建多实例节点之间回滚时的活动实例,任务数据
        /// </summary>
        /// <param name="processInstance">流程实例</param>
        /// <param name="originalBackwardToActivityInstance">原始退回到的节点实例</param>
        /// <param name="backwardType">退回类型</param>
        /// <param name="backSrcActivityInstanceID">源退回节点实例ID</param>
        /// <param name="activityResource">资源</param>
        /// <param name="session">会话</param>
        internal void CreateBackwardActivityTaskOfInnerMultipleInstance(ProcessInstanceEntity processInstance,
                                                                        ActivityInstanceEntity originalBackwardToActivityInstance,
                                                                        BackwardTypeEnum backwardType,
                                                                        int backSrcActivityInstanceID,
                                                                        ActivityResource activityResource,
                                                                        IDbSession session)
        {
            //创建回滚到的节点信息
            var rollbackPreviousActivityInstance = base.CreateBackwardToActivityInstanceObject(processInstance,
                                                                                               backwardType,
                                                                                               backSrcActivityInstanceID,
                                                                                               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,
                                    base.Session);
        }
        /// <summary>
        /// OrJoin合并时的节点完成方法
        /// 1. 如果有满足条件的OrJoin前驱转移,则会重新生成新的OrJoin节点实例
        /// </summary>
        /// <param name="processInstance"></param>
        /// <param name="fromTransition"></param>
        /// <param name="fromActivityInstance"></param>
        /// <param name="activityResource"></param>
        /// <param name="wfLinqDataContext"></param>
        public GatewayExecutedResult CompleteAutomaticlly(ProcessInstanceEntity processInstance,
            string transitionGUID,
            ActivityInstanceEntity fromActivityInstance,
            ActivityResource activityResource,
            IDbSession session)
        {
            var gatewayActivityInstance = base.CreateActivityInstanceObject(base.GatewayActivity, 
                processInstance, activityResource.AppRunner);

            gatewayActivityInstance.GatewayDirectionTypeID = (short)GatewayDirectionEnum.OrJoin;
            base.InsertActivityInstance(gatewayActivityInstance,
                session);

            base.CompleteActivityInstance(gatewayActivityInstance.ID,
                activityResource,
                session);

            gatewayActivityInstance.ActivityState = (short)ActivityStateEnum.Completed;
            base.GatewayActivityInstance = gatewayActivityInstance;
                        
            base.InsertTransitionInstance(processInstance,
                transitionGUID,
                fromActivityInstance,
                gatewayActivityInstance,
                TransitionTypeEnum.Forward,
                TransitionFlyingTypeEnum.NotFlying,
                activityResource.AppRunner,
                session);

            GatewayExecutedResult result = GatewayExecutedResult.CreateGatewayExecutedResult(GatewayExecutedStatus.Successed);
            return result;
        }
コード例 #7
0
 /// <summary>
 /// 创建流程跳转上下文对象
 /// </summary>
 /// <param name="jumpforwardActivity"></param>
 /// <param name="processModel"></param>
 /// <param name="processInstance"></param>
 /// <param name="activityResource"></param>
 /// <returns></returns>
 internal static ActivityForwardContext CreateJumpforwardContext(ActivityEntity jumpforwardActivity,
                                                                 ProcessModel processModel,
                                                                 ProcessInstanceEntity processInstance,
                                                                 ActivityResource activityResource)
 {
     return(new ActivityForwardContext(processModel, processInstance, jumpforwardActivity, activityResource));
 }
コード例 #8
0
        /// <summary>
        /// 自动完成结束节点
        /// </summary>
        /// <param name="processInstance"></param>
        /// <param name="fromActivityInstance"></param>
        /// <param name="activityResource"></param>
        /// <param name="wfLinqDataContext"></param>
        public GatewayExecutedResult CompleteAutomaticlly(ProcessInstanceEntity processInstance,
                                                          string transitionGUID,
                                                          ActivityInstanceEntity fromActivityInstance,
                                                          ActivityResource activityResource,
                                                          IDbSession session)
        {
            GatewayExecutedResult result = null;
            var toActivityInstance       = base.CreateActivityInstanceObject(base.Linker.ToActivity,
                                                                             processInstance, activityResource.AppRunner);

            base.ActivityInstanceManager.Insert(toActivityInstance, session);

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

            //写节点转移实例数据
            base.InsertTransitionInstance(processInstance,
                                          transitionGUID,
                                          fromActivityInstance,
                                          toActivityInstance,
                                          TransitionTypeEnum.Forward,
                                          TransitionFlyingTypeEnum.NotFlying,
                                          activityResource.AppRunner,
                                          session);

            //设置流程完成
            ProcessInstanceManager pim = new ProcessInstanceManager();

            pim.Complete(processInstance.ID, activityResource.AppRunner, session);

            //发送流程结束消息给流程启动人

            return(result);
        }
コード例 #9
0
ファイル: WorkItem.cs プロジェクト: moayyaed/Wf5
        /// <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);
        }
コード例 #10
0
        /// <summary>
        /// 自动完成
        /// </summary>
        /// <param name="processInstance">流程实例</param>
        /// <param name="transitionGUID">转移GUID</param>
        /// <param name="fromActivity">起始活动</param>
        /// <param name="fromActivityInstance">起始活动实例</param>
        /// <param name="toActivity">目标活动</param>
        /// <param name="runner">运行者</param>
        /// <param name="session">会话</param>
        /// <returns>网关执行结果</returns>
        public NodeAutoExecutedResult CompleteAutomaticlly(ProcessInstanceEntity processInstance,
                                                           string transitionGUID,
                                                           ActivityEntity fromActivity,
                                                           ActivityInstanceEntity fromActivityInstance,
                                                           ActivityEntity toActivity,
                                                           WfAppRunner runner,
                                                           IDbSession session)
        {
            var gatewayActivityInstance = base.CreateActivityInstanceObject(toActivity, processInstance, runner);

            base.InsertActivityInstance(gatewayActivityInstance,
                                        session);

            base.CompleteActivityInstance(gatewayActivityInstance.ID,
                                          runner,
                                          session);

            gatewayActivityInstance.ActivityState = (short)ActivityStateEnum.Completed;
            base.Linker.ToActivityInstance        = gatewayActivityInstance;

            //写节点转移实例数据
            base.InsertTransitionInstance(processInstance,
                                          transitionGUID,
                                          fromActivityInstance,
                                          gatewayActivityInstance,
                                          TransitionTypeEnum.Forward,
                                          TransitionFlyingTypeEnum.NotFlying,
                                          runner,
                                          session);

            NodeAutoExecutedResult result = NodeAutoExecutedResult.CreateGatewayExecutedResult(NodeAutoExecutedStatus.Successed);

            return(result);
        }
コード例 #11
0
        /// <summary>
        /// OrJoin合并时的节点完成方法
        /// 1. 如果有满足条件的OrJoin前驱转移,则会重新生成新的OrJoin节点实例
        /// </summary>
        /// <param name="processInstance"></param>
        /// <param name="fromTransition"></param>
        /// <param name="fromActivityInstance"></param>
        /// <param name="activityResource"></param>
        /// <param name="wfLinqDataContext"></param>
        public GatewayExecutedResult CompleteAutomaticlly(ProcessInstanceEntity processInstance,
                                                          TransitionEntity fromTransition,
                                                          ActivityInstanceEntity fromActivityInstance,
                                                          ActivityResource activityResource,
                                                          ISession session)
        {
            var toActivityInstance = base.CreateActivityInstanceObject(processInstance, activityResource.LogonUser);

            base.InsertActivityInstance(toActivityInstance,
                                        session);

            base.CompleteActivityInstance(toActivityInstance.ActivityInstanceGUID,
                                          activityResource,
                                          session);

            SyncActivityInstanceObjectState(NodeStateEnum.Completed);

            base.InsertTransitionInstance(processInstance,
                                          fromTransition,
                                          fromActivityInstance,
                                          toActivityInstance,
                                          TransitionTypeEnum.Forward,
                                          activityResource.LogonUser,
                                          session);

            GatewayExecutedResult result = GatewayExecutedResult.CreateGatewayExecutedResult(GatewayExecutedStatus.Successed);

            return(result);
        }
コード例 #12
0
        /// <summary>
        /// 根据流程定义,创建新的流程实例
        /// </summary>
        /// <param name="runner">运行者</param>
        /// <param name="processEntity">流程定义</param>
        /// <param name="parentProcessInstance">父流程实例</param>
        /// <param name="subProcessNode">子流程节点</param>
        /// <returns>流程实例的ID</returns>
        internal ProcessInstanceEntity CreateNewProcessInstanceObject(WfAppRunner runner,
                                                                      ProcessEntity processEntity,
                                                                      ProcessInstanceEntity parentProcessInstance,
                                                                      ActivityInstanceEntity subProcessNode)
        {
            ProcessInstanceEntity entity = new ProcessInstanceEntity();

            entity.ProcessGUID   = processEntity.ProcessGUID;
            entity.ProcessName   = processEntity.ProcessName;
            entity.Version       = processEntity.Version;
            entity.AppName       = runner.AppName;
            entity.AppInstanceID = runner.AppInstanceID;
            entity.ProcessState  = (int)ProcessStateEnum.Running;
            if (parentProcessInstance != null)
            {
                //流程的Parent信息
                entity.ParentProcessInstanceID   = parentProcessInstance.ID;
                entity.ParentProcessGUID         = parentProcessInstance.ProcessGUID;
                entity.InvokedActivityInstanceID = subProcessNode.ID;
                entity.InvokedActivityGUID       = subProcessNode.ActivityGUID;
            }
            entity.CreatedByUserID       = runner.UserID;
            entity.CreatedByUserName     = runner.UserName;
            entity.CreatedDateTime       = System.DateTime.Now;
            entity.LastUpdatedByUserID   = runner.UserID;
            entity.LastUpdatedByUserName = runner.UserName;
            entity.LastUpdatedDateTime   = System.DateTime.Now;

            return(entity);
        }
コード例 #13
0
        /// <summary>
        /// 创建多实例节点之间回滚时的活动实例,任务数据
        /// </summary>
        /// <param name="processInstance">流程实例</param>
        /// <param name="originalBackwardToActivityInstance">原始退回到的节点实例</param>
        /// <param name="backwardType">退回类型</param>
        /// <param name="backSrcActivityInstanceID">源退回节点实例ID</param>
        /// <param name="activityResource">资源</param>
        /// <param name="session">会话</param>
        internal void CreateBackwardActivityTaskOfInnerMultipleInstance(ProcessInstanceEntity processInstance,
                                                                        ActivityInstanceEntity originalBackwardToActivityInstance,
                                                                        BackwardTypeEnum backwardType,
                                                                        int backSrcActivityInstanceID,
                                                                        ActivityResource activityResource,
                                                                        IDbSession session)
        {
            //创建回滚到的节点信息
            var rollbackPreviousActivityInstance = base.CreateBackwardToActivityInstanceObject(processInstance,
                                                                                               backwardType,
                                                                                               backSrcActivityInstanceID,
                                                                                               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);
        }
コード例 #14
0
ファイル: EndNode.cs プロジェクト: moayyaed/Wf5
        /// <summary>
        /// 自动完成结束节点
        /// </summary>
        /// <param name="processInstance"></param>
        /// <param name="fromActivityInstance"></param>
        /// <param name="activityResource"></param>
        /// <param name="wfLinqDataContext"></param>
        public GatewayExecutedResult CompleteAutomaticlly(ProcessInstanceEntity processInstance,
                                                          TransitionEntity fromToTransition,
                                                          ActivityInstanceEntity fromActivityInstance,
                                                          ActivityResource activityResource,
                                                          ISession session)
        {
            GatewayExecutedResult result = null;
            var toActivityInstance       = base.CreateActivityInstanceObject(processInstance, activityResource.LogonUser);

            base.InsertActivityInstance(toActivityInstance,
                                        session);

            base.CompleteActivityInstance(toActivityInstance.ActivityInstanceGUID,
                                          activityResource,
                                          session);

            //写节点转移实例数据
            base.InsertTransitionInstance(processInstance,
                                          fromToTransition,
                                          fromActivityInstance,
                                          toActivityInstance,
                                          TransitionTypeEnum.Forward,
                                          activityResource.LogonUser,
                                          session);

            //设置流程完成
            ProcessInstanceManager pim = new ProcessInstanceManager();

            pim.Complete(processInstance.ProcessInstanceGUID, activityResource.LogonUser, session);

            return(result);
        }
コード例 #15
0
ファイル: XPDLHelper.cs プロジェクト: pchenatwork/Slickflow
        /// <summary>
        /// 获取跨流程XML的消息节点实体对象
        /// </summary>
        /// <param name="processInstance">流程实例</param>
        /// <param name="throwActivity">消息抛出节点</param>
        /// <param name="throwActivityInstance">消息抛出节点活动实例</param>
        /// <param name="catchProcessEntity">消息捕获流程实体对象</param>
        /// <returns>消息接收节点实体</returns>
        internal static ActivityEntity GetMessageCatchActivity(ProcessInstanceEntity processInstance,
                                                               ActivityEntity throwActivity,
                                                               ActivityInstanceEntity throwActivityInstance,
                                                               out ProcessEntity catchProcessEntity)
        {
            ActivityEntity catchActivity = null;
            var            pm            = new ProcessManager();
            var            processEntity = pm.GetByVersion(processInstance.ProcessGUID, processInstance.Version);
            var            xmlDoc        = new XmlDocument();

            xmlDoc.LoadXml(processEntity.XmlContent);

            var packageNode       = xmlDoc.DocumentElement;
            var messagesNode      = packageNode.SelectSingleNode("Layout/Messages");
            var messageNode       = messagesNode.SelectSingleNode(string.Format("Message[@from='{0}']", throwActivity.ActivityGUID));
            var catchActivityGUID = XMLHelper.GetXmlAttribute(messageNode, "to");

            var catchActivityNode = packageNode.SelectSingleNode(string.Format("WorkflowProcesses/Process/Activities/Activity[@id='{0}']", catchActivityGUID));
            var catchProcessNode  = catchActivityNode.ParentNode.ParentNode;

            catchProcessEntity             = new ProcessEntity();
            catchProcessEntity.ProcessGUID = XMLHelper.GetXmlAttribute(catchProcessNode, "id");
            catchProcessEntity.Version     = XMLHelper.GetXmlAttribute(catchProcessNode, "version");
            catchProcessEntity.ProcessName = XMLHelper.GetXmlAttribute(catchProcessNode, "name");
            catchProcessEntity.ProcessCode = XMLHelper.GetXmlAttribute(catchProcessNode, "code");

            catchActivity = ConvertHelper.ConvertXmlActivityNodeToActivityEntity(catchActivityNode, catchProcessEntity.ProcessGUID);

            return(catchActivity);
        }
コード例 #16
0
        /// <summary>
        /// 删除不正常的流程实例(流程在取消状态,才可以进行删除!)
        /// </summary>
        /// <param name="processInstanceID"></param>
        /// <returns></returns>
        internal bool Delete(int processInstanceID)
        {
            bool       isDeleted = false;
            IDbSession session   = SessionFactory.CreateSession();

            try
            {
                ProcessInstanceEntity entity = Repository.GetById <ProcessInstanceEntity>(processInstanceID);

                if (entity.ProcessState == (int)ProcessStateEnum.Canceled)
                {
                    Repository.Delete <ProcessInstanceEntity>(session.Connection, processInstanceID, session.Transaction);
                    session.Commit();
                    isDeleted = true;
                }
                else
                {
                    throw new ProcessInstanceException("流程只有先取消,才可以删除!");
                }
            }
            catch (System.Exception)
            {
                session.Rollback();
                throw;
            }
            finally
            {
                session.Dispose();
            }

            return(isDeleted);
        }
コード例 #17
0
        /// <summary>
        /// 获取处于运行状态的流程实例
        /// </summary>
        /// <param name="appInstanceID">应用实例ID</param>
        /// <param name="processGUID">流程GUID</param>
        /// <param name="session">会话</param>
        /// <returns>流程实例实体</returns>
        internal ProcessInstanceEntity GetRunningProcessInstance(string appInstanceID,
                                                                 string processGUID,
                                                                 IDbSession session)
        {
            //var sql = @"SELECT
            //                *
            //            FROM WfProcessInstance
            //            WHERE AppInstanceID=@appInstanceID
            //                AND ProcessGUID=@processGUID
            //                AND RecordStatusInvalid=0
            //                AND (ProcessState=1 OR ProcessState=2)
            //            ORDER BY CreatedDateTime DESC";
            ProcessInstanceEntity entity = null;
            var instanceList             = session.GetRepository <ProcessInstanceEntity>().Query(e => e.AppInstanceID == appInstanceID &&
                                                                                                 e.ProcessGUID == processGUID &&
                                                                                                 e.RecordStatusInvalid == 0 &&
                                                                                                 (e.ProcessState == 1 || e.ProcessState == 2))
                                           .OrderByDescending(e => e.CreatedDateTime)
                                           .ToList();

            if (instanceList != null && instanceList.Count() == 1)
            {
                entity = instanceList[0];
            }
            return(entity);
        }
コード例 #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)
        {
            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);
            }
        }
コード例 #19
0
 /// <summary>
 /// 启动流程的上下文对象
 /// </summary>
 /// <param name="processModel"></param>
 /// <param name="processInstance"></param>
 /// <param name="activity"></param>
 /// <param name="activityResource"></param>
 /// <returns></returns>
 internal static ActivityForwardContext CreateStartupContext(ProcessModel processModel,
                                                             ProcessInstanceEntity processInstance,
                                                             ActivityEntity activity,
                                                             ActivityResource activityResource)
 {
     return(new ActivityForwardContext(processModel, processInstance, activity, activityResource));
 }
コード例 #20
0
        /// <summary>
        /// 消息发布方法
        /// </summary>
        /// <param name="processInstance">流程实例</param>
        /// <param name="throwActivity">消息活动</param>
        /// <param name="throwActivityInstance">消息活动实例</param>
        public void PublishMessage(ProcessInstanceEntity processInstance,
                                   ActivityEntity throwActivity,
                                   ActivityInstanceEntity throwActivityInstance)
        {
            var           topic         = throwActivity.ActivityTypeDetail.Expression;
            ProcessEntity catchProcess  = null;
            var           catchActivity = XPDLHelper.GetMessageCatchActivity(processInstance, throwActivity, throwActivityInstance, out catchProcess);

            var appRunner = new WfAppRunner();

            appRunner.MessageTopic    = topic;
            appRunner.AppName         = throwActivityInstance.AppName;
            appRunner.AppInstanceID   = throwActivityInstance.AppInstanceID;
            appRunner.AppInstanceCode = throwActivityInstance.AppInstanceCode;
            appRunner.UserID          = throwActivityInstance.CreatedByUserID;
            appRunner.UserName        = throwActivityInstance.CreatedByUserName;

            var msgRunnerView = new MessageRunnerView();

            msgRunnerView.ProcessEntity  = catchProcess;
            msgRunnerView.ActivityEntity = catchActivity;
            msgRunnerView.WfAppRunner    = appRunner;

            var jsonRunner = JsonConvert.SerializeObject(msgRunnerView);

            var messageService = MessageQueueServiceFactory.Create();

            messageService.Publish(topic, jsonRunner);
        }
コード例 #21
0
        /// <summary>
        /// 流程数据插入
        /// </summary>
        /// <param name="entity"></param>
        /// <param name="wfLinqDataContext"></param>
        /// <returns></returns>
        internal void Insert(IDbConnection conn, ProcessInstanceEntity entity, IDbTransaction trans)
        {
            int newID = Repository.Insert(conn, entity, trans);

            entity.ID = newID;

            Debug.WriteLine(string.Format("process instance inserted, Guid:{0}, time:{1}", entity.ID.ToString(), System.DateTime.Now.ToString()));
        }
コード例 #22
0
        /// <summary>
        /// 流程数据插入
        /// </summary>
        /// <param name="conn">链接</param>
        /// <param name="entity">流程实例实体</param>
        /// <param name="trans">事务</param>
        /// <returns></returns>
        internal Int32 Insert(IDbConnection conn, ProcessInstanceEntity entity, IDbTransaction trans)
        {
            int newID = Repository.Insert(conn, entity, trans);

            entity.ID = newID;

            return(newID);
        }
コード例 #23
0
        /// <summary>
        /// 启动流程
        /// </summary>
        /// <param name="runner">执行者</param>
        /// <param name="result">结果对象</param>
        /// <returns>运行时实例对象</returns>
        public static WfRuntimeManager CreateRuntimeInstanceStartup(WfAppRunner runner,
                                                                    ref WfExecutedResult result)
        {
            //检查流程是否可以被启动
            var rmins = new WfRuntimeManagerStartup();

            rmins.WfExecutedResult = result = new WfExecutedResult();

            //正常流程启动
            var pim = new ProcessInstanceManager();
            ProcessInstanceEntity processInstance = pim.GetProcessInstanceCurrent(runner.AppInstanceID,
                                                                                  runner.ProcessGUID);

            //不能同时启动多个主流程
            if (processInstance != null &&
                processInstance.ParentProcessInstanceID == null &&
                processInstance.ProcessState == (short)ProcessStateEnum.Running)
            {
                result.Status        = WfExecutedStatus.Exception;
                result.ExceptionType = WfExceptionType.Started_IsRunningAlready;
                result.Message       = LocalizeHelper.GetEngineMessage("wfruntimemanagerfactory.CreateRuntimeInstanceStartup.error");
                return(rmins);
            }

            rmins.AppRunner = runner;

            //获取流程第一个可办理节点
            rmins.ProcessModel = ProcessModelFactory.Create(runner.ProcessGUID, runner.Version);
            var startActivity = rmins.ProcessModel.GetStartActivity();
            var firstActivity = rmins.ProcessModel.GetFirstActivity();

            //var firstActivityList = rmins.ProcessModel.GetFirstActivityList(startActivity, runner.Conditions);

            if (startActivity.ActivityTypeDetail.TriggerType == TriggerTypeEnum.None)
            {
                rmins.AppRunner.NextActivityPerformers = ActivityResource.CreateNextActivityPerformers(firstActivity.ActivityGUID,
                                                                                                       runner.UserID,
                                                                                                       runner.UserName);
            }
            else if (startActivity.ActivityTypeDetail.TriggerType == TriggerTypeEnum.Timer ||
                     startActivity.ActivityTypeDetail.TriggerType == TriggerTypeEnum.Message)
            {
                if (!string.IsNullOrEmpty(runner.UserID))
                {
                    rmins.AppRunner.NextActivityPerformers = ActivityResource.CreateNextActivityPerformers(firstActivity.ActivityGUID,
                                                                                                           runner.UserID,
                                                                                                           runner.UserName);
                }
                else
                {
                    rmins.AppRunner.NextActivityPerformers = rmins.ProcessModel.GetActivityPerformers(firstActivity.ActivityGUID);
                }
            }
            rmins.ActivityResource = new ActivityResource(runner, rmins.AppRunner.NextActivityPerformers);

            return(rmins);
        }
コード例 #24
0
        /// <summary>
        /// 流程数据插入
        /// </summary>
        /// <param name="entity">流程实例实体</param>
        /// <param name="session">会话</param>
        /// <returns>新实例ID</returns>
        internal Int32 Insert(ProcessInstanceEntity entity,
                              IDbSession session)
        {
            var newEntity = session.GetRepository <ProcessInstanceEntity>().Insert(entity);

            session.SaveChanges();

            return(newEntity.ID);
        }
コード例 #25
0
        public static WfRuntimeManager CreateRuntimeInstanceStartup(WfAppRunner runner,
                                                                    ProcessInstanceEntity parentProcessInstance,
                                                                    SubProcessNode subProcessNode,
                                                                    ref WfExecutedResult result)
        {
            //检查流程是否可以被启动
            var rmins = new WfRuntimeManagerStartup();

            rmins.WfExecutedResult = result = new WfExecutedResult();

            var pim = new ProcessInstanceManager();
            ProcessInstanceEntity processInstance = null;

            if (subProcessNode == null)
            {
                //正常流程启动
                processInstance = pim.GetProcessInstanceLatest(runner.AppName,
                                                               runner.AppInstanceID,
                                                               runner.ProcessGUID);
            }
            else
            {
                //子流程启动
                processInstance = pim.GetProcessInstanceLatest(runner.AppName,
                                                               runner.AppInstanceID,
                                                               subProcessNode.SubProcessGUID);
            }

            //不能同时启动多个主流程
            if (processInstance != null &&
                processInstance.ParentProcessInstanceID == null &&
                processInstance.ProcessState == (short)ProcessStateEnum.Running)
            {
                result.Status        = WfExecutedStatus.Exception;
                result.ExceptionType = WfExceptionType.Started_IsRunningAlready;
                result.Message       = "流程已经处于运行状态,如果要重新启动,请先终止当前流程实例!";
                return(rmins);
            }

            //processInstance 为空,此时继续执行启动操作
            rmins.AppRunner             = runner;
            rmins.ParentProcessInstance = parentProcessInstance;
            rmins.InvokedSubProcessNode = subProcessNode;

            //获取流程第一个可办理节点
            rmins.ProcessModel = ProcessModelFactory.Create(runner.ProcessGUID);
            var firstActivity = rmins.ProcessModel.GetFirstActivity();

            rmins.AppRunner.NextActivityPerformers = ActivityResource.CreateNextActivityPerformers(firstActivity.ActivityGUID,
                                                                                                   runner.UserID,
                                                                                                   runner.UserName);

            rmins.ActivityResource = new ActivityResource(runner, rmins.AppRunner.NextActivityPerformers);

            return(rmins);
        }
コード例 #26
0
ファイル: XOrJoinNode.cs プロジェクト: moayyaed/Wf5
        public GatewayExecutedResult CompleteAutomaticlly(ProcessInstanceEntity processInstance,
                                                          TransitionEntity fromTransition,
                                                          ActivityInstanceEntity fromActivityInstance,
                                                          ActivityResource activityResource,
                                                          ISession session)
        {
            GatewayExecutedResult result = GatewayExecutedResult.CreateGatewayExecutedResult(GatewayExecutedStatus.Unknown);

            bool canRenewInstance = false;

            //检查是否有运行中的合并节点实例
            ActivityInstanceEntity joinNode = base.ActivityInstanceManager.GetActivityWithRunningState(
                processInstance.ProcessInstanceGUID,
                base.Activity.ActivityGUID,
                session);

            if (joinNode == null)
            {
                canRenewInstance = true;
            }
            else
            {
                //判断是否可以激活下一步节点
                canRenewInstance = (joinNode.CanRenewInstance == 1);
                if (!canRenewInstance)
                {
                    result = GatewayExecutedResult.CreateGatewayExecutedResult(GatewayExecutedStatus.FallBehindOfXOrJoin);
                    return(result);
                }
            }

            if (canRenewInstance)
            {
                var toActivityInstance = base.CreateActivityInstanceObject(processInstance, activityResource.LogonUser);
                base.InsertActivityInstance(toActivityInstance,
                                            session);

                base.CompleteActivityInstance(toActivityInstance.ActivityInstanceGUID,
                                              activityResource,
                                              session);

                base.SyncActivityInstanceObjectState(NodeStateEnum.Completed);

                //写节点转移实例数据
                base.InsertTransitionInstance(processInstance,
                                              fromTransition,
                                              fromActivityInstance,
                                              toActivityInstance,
                                              TransitionTypeEnum.Forward,
                                              activityResource.LogonUser,
                                              session);

                result = GatewayExecutedResult.CreateGatewayExecutedResult(GatewayExecutedStatus.Successed);
            }
            return(result);
        }
コード例 #27
0
ファイル: NodeMediator.cs プロジェクト: yecb/Slickflow
 /// <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)
 {
 }
コード例 #28
0
 /// <summary>
 /// 开始节点的构造执行上下文对象
 /// </summary>
 /// <param name="processModel"></param>
 /// <param name="processInstance"></param>
 /// <param name="activity"></param>
 /// <param name="activityResource"></param>
 private ActivityForwardContext(ProcessModel processModel,
                                ProcessInstanceEntity processInstance,
                                ActivityEntity activity,
                                ActivityResource activityResource)
 {
     ProcessModel     = processModel;
     ProcessInstance  = processInstance;
     Activity         = activity;
     ActivityResource = activityResource;
 }
コード例 #29
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);
        }
コード例 #30
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);
        }