/// <summary>
        /// 查询实例
        /// </summary>
        /// <typeparam name="T">实体类型</typeparam>
        /// <param name="id">实体主键ID</param>
        /// <returns>实体</returns>
        public override T GetInstance <T>(int id)
        {
            var pim    = new ProcessInstanceManager();
            var entity = pim.GetById(id);

            return(entity as T);
        }
Exemple #2
0
        /// <summary>
        /// 启动流程
        /// </summary>
        /// <param name="user"></param>
        /// <param name="appInstanceID"></param>
        /// <param name="processGUID"></param>
        /// <param name="nextActivityGUID"></param>
        /// <returns></returns>
        public WfRuntimeManager GetRuntimeInstanceStartup(WfAppRunner runner)
        {
            //检查流程是否可以被启动
            var pim             = new ProcessInstanceManager();
            var processInstance = pim.GetRunningProcess(runner.AppName, runner.AppInstanceID, runner.ProcessGUID);

            if (processInstance != null)
            {
                throw new WfRuntimeException("当前应用已经有流程实例在运行中,除非终止或取消流程,否则流程不能被再次启动。");
            }

            this.AppRunner = runner;

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

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

            this.ActivityResource = new ActivityResource(runner.UserID, runner.UserName, this.AppRunner.NextActivityPerformers);

            return(this);
        }
        /// <summary>
        /// 获取流程实例数据
        /// </summary>
        /// <param name="appInstanceID">业务实例ID</param>
        /// <returns>流程实例实体</returns>
        public IList <ProcessInstanceEntity> GetProcessInstance(string appInstanceID)
        {
            var pim  = new ProcessInstanceManager();
            var list = pim.GetProcessInstance(appInstanceID).ToList();

            return(list);
        }
Exemple #4
0
        /// <summary>
        /// 获取流程实例数据
        /// </summary>
        /// <param name="processInstanceID"></param>
        /// <returns></returns>
        public ProcessInstanceEntity GetProcessInstance(int processInstanceID)
        {
            var pim      = new ProcessInstanceManager();
            var instance = pim.GetById(processInstanceID);

            return(instance);
        }
Exemple #5
0
        /// <summary>
        /// 启动执行方法
        /// </summary>
        /// <param name="session">会话</param>
        internal override void ExecuteInstanceImp(IDbSession session)
        {
            //构造流程实例
            var processInstance = new ProcessInstanceManager()
                                  .CreateNewProcessInstanceObject(base.AppRunner, base.ProcessModel.ProcessEntity,
                                                                  base.ParentProcessInstance,
                                                                  base.InvokedSubProcessNode.ActivityInstance);

            //构造活动实例
            //1. 获取开始节点活动
            var startActivity         = base.ProcessModel.GetStartActivity();
            var startExecutionContext = ActivityForwardContext.CreateStartupContext(base.ProcessModel,
                                                                                    processInstance,
                                                                                    startActivity,
                                                                                    base.ActivityResource);

            NodeMediator mediator = NodeMediatorFactory.CreateNodeMediator(startExecutionContext, session);

            mediator.Linker.FromActivityInstance = RunningActivityInstance;
            mediator.ExecuteWorkItem();

            //构造回调函数需要的数据
            WfExecutedResult result = base.WfExecutedResult;

            result.ProcessInstanceIDStarted = processInstance.ID;
            result.Status = WfExecutedStatus.Success;
        }
        /// <summary>
        /// 获取运行中的流程实例
        /// </summary>
        /// <param name="runner">运行者</param>
        /// <returns>流程实例实体</returns>
        public ProcessInstanceEntity GetRunningProcessInstance(WfAppRunner runner)
        {
            var pim    = new ProcessInstanceManager();
            var entity = pim.GetRunningProcessInstance(runner.AppInstanceID, runner.ProcessGUID);

            return(entity);
        }
        /// <summary>
        /// 执行子流程节点
        /// </summary>
        internal override void ExecuteWorkItem()
        {
            try
            {
                if (base.Linker.FromActivity.ActivityType == ActivityTypeEnum.SubProcessNode)
                {
                    //检查子流程是否结束
                    var  pim         = new ProcessInstanceManager(_dataAccessor, _loggerFactory);
                    bool isCompleted = pim.CheckSubProcessInstanceCompleted(
                        base.Linker.FromActivityInstance.Fid,
                        base.Linker.FromActivityInstance.NodeId);
                    if (isCompleted == false)
                    {
                        throw new WfRuntimeException(string.Format("当前子流程:[{0}]并没有到达结束状态,主流程无法向下执行。",
                                                                   base.Linker.FromActivity.ActivityName));
                    }
                }

                //完成当前的任务节点
                bool canContinueForwardCurrentNode = CompleteWorkItem(ActivityForwardContext.TaskView.Fid);

                if (canContinueForwardCurrentNode)
                {
                    //获取下一步节点列表:并继续执行
                    ContinueForwardCurrentNode(false);
                }
            }
            catch
            {
                throw;
            }
        }
Exemple #8
0
        internal override void ExecuteInstanceImp(IDbSession session)
        {
            //修改流程实例为返签状态
            var pim = new ProcessInstanceManager();

            pim.Reverse(base.BackwardContext.ProcessInstance.ID,
                        base.ActivityResource.AppRunner,
                        session);

            //创建新任务节点
            var backMostPreviouslyActivityInstanceID = GetBackwardMostPreviouslyActivityInstanceID();
            var nodeMediatorBackward = new NodeMediatorBackward(base.BackwardContext, session);

            nodeMediatorBackward.CreateBackwardActivityTaskTransitionInstance(base.BackwardContext.ProcessInstance,
                                                                              base.BackwardContext.BackwardFromActivityInstance,
                                                                              BackwardTypeEnum.Reversed,
                                                                              backMostPreviouslyActivityInstanceID,
                                                                              base.BackwardContext.BackwardToTargetTransitionGUID,
                                                                              TransitionTypeEnum.Backward,
                                                                              TransitionFlyingTypeEnum.NotFlying,
                                                                              base.ActivityResource,
                                                                              session);

            //构造回调函数需要的数据
            WfExecutedResult result = base.WfExecutedResult;

            result.BackwardTaskReciever = base.BackwardContext.BackwardTaskReciever;
            result.Status = WfExecutedStatus.Success;
        }
        /// <summary>
        /// 节点内部业务逻辑执行
        /// </summary>
        internal override void ExecuteWorkItem()
        {
            //执行前Action列表
            OnBeforeExecuteWorkItem();

            //设置流程完成
            ProcessInstanceManager pim = new ProcessInstanceManager();
            var processInstance        = pim.Complete(ActivityForwardContext.ProcessInstance.ID,
                                                      ActivityForwardContext.ActivityResource.AppRunner,
                                                      Session);

            //如果当前流程是子流程,则子流程完成,主流程流转到下一节点
            if (pim.IsSubProcess(processInstance) == true)
            {
                ContinueMainProcessRunning(processInstance, this.Session);
            }

            //执行后Action列表
            OnAfterExecuteWorkItem();

            //调用流程结束事件
            DelegateExecutor.InvokeExternalDelegate(Session,
                                                    EventFireTypeEnum.OnProcessCompleted,
                                                    ActivityForwardContext.ActivityResource.AppRunner.DelegateEventList,
                                                    ActivityForwardContext.ProcessInstance.ID);
        }
        /// <summary>
        /// 执行开始节点
        /// </summary>
        internal override void ExecuteWorkItem()
        {
            try
            {
                //写入流程实例
                ProcessInstanceManager pim = new ProcessInstanceManager();
                var newID = pim.Insert(this.Session.Connection, ActivityForwardContext.ProcessInstance,
                                       this.Session.Transaction);
                ActivityForwardContext.ProcessInstance.ID = newID;

                //执行前Action列表
                OnBeforeExecuteWorkItem();

                CompleteAutomaticlly(ActivityForwardContext.ProcessInstance,
                                     ActivityForwardContext.ActivityResource,
                                     this.Session);

                //执行后Action列表
                OnAfterExecuteWorkItem();

                //执行开始节点之后的节点集合
                ContinueForwardCurrentNode(ActivityForwardContext.IsNotParsedByTransition, this.Session);
            }
            catch (System.Exception ex)
            {
                throw;
            }
        }
Exemple #11
0
        /// <summary>
        /// 执行开始节点
        /// </summary>
        internal override void ExecuteWorkItem()
        {
            try
            {
                //写入流程实例
                ProcessInstanceManager pim = new ProcessInstanceManager(_dataAccessor, _loggerFactory);
                var newInstance            = pim.Insert(ActivityForwardContext.ProcessInstance);
                //写入流程图实例
                DiagramInstanceManager dim = new DiagramInstanceManager(_dataAccessor, _loggerFactory);
                dim.Insert(dim.CreateDiagramInstance(newInstance.ProcessUid, newInstance.Fid));

                ActivityForwardContext.ProcessInstance.Id = newInstance.Id;

                CompleteAutomaticlly(ActivityForwardContext.ProcessInstance,
                                     ActivityForwardContext.Activity, base.AppRunner);

                //执行开始节点之后的节点集合
                ContinueForwardCurrentNode(false);

                //执行Action列表
                //ExecteActionList(ActivityForwardContext.Activity.ActionList,
                //    ActivityForwardContext.ActivityResource.AppRunner.ActionMethodParameters);
            }
            catch (System.Exception ex)
            {
                throw ex;
            }
        }
Exemple #12
0
        public ProcessInstanceEntity GetProcessInstanceByActivity(int activityInstanceID)
        {
            var pim      = new ProcessInstanceManager();
            var instance = pim.GetByActivity(activityInstanceID);

            return(instance);
        }
        /// <summary>
        /// 执行子流程节点
        /// </summary>
        internal override void ExecuteWorkItem()
        {
            try
            {
                if (base.Linker.FromActivity.ActivityType == ActivityTypeEnum.SubProcessNode)
                {
                    //检查子流程是否结束
                    var  pim         = new ProcessInstanceManager();
                    bool isCompleted = pim.CheckSubProcessInstanceCompleted(Session.Connection,
                                                                            base.Linker.FromActivityInstance.ID,
                                                                            base.Linker.FromActivityInstance.ActivityGUID,
                                                                            Session.Transaction);
                    if (isCompleted == false)
                    {
                        throw new WfRuntimeException(string.Format("当前子流程:[{0}]并没有到达结束状态,主流程无法向下执行。",
                                                                   base.Linker.FromActivity.ActivityName));
                    }
                }

                //完成当前的任务节点
                bool canContinueForwardCurrentNode = CompleteWorkItem(ActivityForwardContext.TaskID,
                                                                      ActivityForwardContext.ActivityResource,
                                                                      this.Session);

                //获取下一步节点列表:并继续执行
                if (canContinueForwardCurrentNode)
                {
                    ContinueForwardCurrentNode(ActivityForwardContext.IsNotParsedByTransition);
                }
            }
            catch (System.Exception ex)
            {
                throw;
            }
        }
        /// <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);
        }
        internal override void ExecuteInstanceImp(ISession session)
        {
            //构造流程实例
            var processInstance = new ProcessInstanceManager()
                                  .CreateNewProcessInstanceObject(base.AppRunner.AppName, base.AppRunner.AppInstanceID,
                                                                  base.ProcessModel.ProcessEntity,
                                                                  base.AppRunner.UserID,
                                                                  base.AppRunner.UserName);

            //构造活动实例
            //1. 获取开始节点活动
            var startActivity = base.ProcessModel.GetStartActivity();

            var startExecutionContext = ActivityForwardContext.CreateStartupContext(base.ProcessModel,
                                                                                    processInstance,
                                                                                    startActivity,
                                                                                    base.ActivityResource);

            base.ExecuteWorkItemIteraly(startExecutionContext, session);

            //构造回调函数需要的数据
            base.WfExecutedResult = WfExecutedResult.Success();
            base.WfExecutedResult.ProcessInstanceGUID = processInstance.ProcessInstanceGUID;
            base.WfExecutedResult.NextActivityTree    = GetNextActivityTree(base.AppRunner.Conditions, session);
        }
Exemple #16
0
        /// <summary>
        /// 执行开始节点
        /// </summary>
        /// <param name="activityExecutionObject"></param>
        /// <param name="processInstance"></param>
        internal override void ExecuteWorkItem()
        {
            try
            {
                //写入流程实例
                ProcessInstanceManager pim = new ProcessInstanceManager();
                pim.Insert(WfExecutionContext.ProcessInstance,
                           this.Session);

                //自动完成开始节点(开始节点不参与Task)
                NodeBase startNode = CreateNewNode(WfExecutionContext.Activity);
                ICompleteAutomaticlly autoStartNode = (ICompleteAutomaticlly)startNode;
                autoStartNode.CompleteAutomaticlly(WfExecutionContext.ProcessInstance,
                                                   null,
                                                   null,
                                                   WfExecutionContext.ActivityResource,
                                                   this.Session);

                //执行开始节点之后的节点集合
                ContinueForwardCurrentNode(startNode,
                                           WfExecutionContext.ActivityResource);
            }
            catch (System.Exception ex)
            {
                throw;
            }
        }
Exemple #17
0
        /// <summary>
        /// 根据应用获取流程下一步节点列表,包含角色用户
        /// </summary>
        /// <param name="runner">应用执行人</param>
        /// <param name="condition">条件</param>
        /// <returns>节点列表</returns>
        public IList <NodeView> GetNextActivityRoleUserTree(WfAppRunner runner,
                                                            IDictionary <string, string> condition = null)
        {
            var tm           = new TaskManager();
            var taskView     = tm.GetTaskOfMine(runner.AppInstanceID, runner.ProcessGUID, runner.UserID);
            var processModel = ProcessModelFactory.Create(taskView.ProcessGUID, taskView.Version);
            var nextSteps    = processModel.GetNextActivityTree(taskView.ProcessInstanceID,
                                                                taskView.ActivityGUID,
                                                                condition);

            foreach (var ns in nextSteps)
            {
                if (ns.ReceiverType == ReceiverTypeEnum.ProcessInitiator)       //下一步执行人为流程发起人
                {
                    var pim = new ProcessInstanceManager();
                    ns.Users = AppendUserList(ns.Users, pim.GetProcessInitiator(taskView.ProcessInstanceID));   //获取流程发起人
                }
                else
                {
                    var roleIDs = ns.Roles.Select(x => x.ID).ToArray();
                    ns.Users = ResourceService.GetUserListByRoleReceiverType(roleIDs, runner.UserID, (int)ns.ReceiverType);     //增加转移前置过滤条件
                }
            }
            return(nextSteps);
        }
Exemple #18
0
 /// <summary>
 /// 获取运行中的流程实例
 /// </summary>
 /// <param name="runner"></param>
 /// <returns></returns>
 public ProcessInstanceEntity GetRunningProcessInstance(WfAppRunner runner)
 {
     using (var session = DbFactory.CreateSession())
     {
         var pim = new ProcessInstanceManager();
         return(pim.GetRunningProcessInstance(runner.AppInstanceID, runner.ProcessGUID, session));
     }
 }
Exemple #19
0
        /// <summary>
        /// 流程返签,先检查约束条件,然后调用wfruntimeinstance执行
        /// </summary>
        /// <param name="runner">执行者</param>
        /// <param name="result">结果对象</param>
        /// <returns>运行时实例对象</returns>
        public static WfRuntimeManager CreateRuntimeInstanceReverse(WfAppRunner runner,
                                                                    ref WfExecutedResult result)
        {
            var rmins = new WfRuntimeManagerReverse();

            rmins.WfExecutedResult = result = new WfExecutedResult();
            var pim             = new ProcessInstanceManager();
            var processInstance = pim.GetProcessInstanceLatest(runner.AppInstanceID, runner.ProcessGUID);

            if (processInstance == null || processInstance.ProcessState != (short)ProcessStateEnum.Completed)
            {
                result.Status        = WfExecutedStatus.Exception;
                result.ExceptionType = WfExceptionType.Reverse_NotInCompleted;
                result.Message       = string.Format("当前应用:{0},实例ID:{1}, 没有完成的流程实例,无法让流程重新运行!",
                                                     runner.AppName, runner.AppInstanceID);
                return(rmins);
            }

            var tim = new TransitionInstanceManager();
            var endTransitionInstance = tim.GetEndTransition(runner.AppName, runner.AppInstanceID, runner.ProcessGUID);

            var processModel = ProcessModelFactory.Create(processInstance.ProcessGUID, processInstance.Version);
            var endActivity  = processModel.GetActivity(endTransitionInstance.ToActivityGUID);

            var aim = new ActivityInstanceManager();
            var endActivityInstance = aim.GetById(endTransitionInstance.ToActivityInstanceID);

            bool hasGatewayNode           = false;
            var  lastTaskActivityInstance = tim.GetPreviousActivityInstance(endActivityInstance, false,
                                                                            out hasGatewayNode).ToList()[0];
            var lastTaskActivity = processModel.GetActivity(lastTaskActivityInstance.ActivityGUID);

            //封装返签结束点之前办理节点的任务接收人
            rmins.AppRunner.NextActivityPerformers = ActivityResource.CreateNextActivityPerformers(lastTaskActivityInstance.ActivityGUID,
                                                                                                   lastTaskActivityInstance.EndedByUserID,
                                                                                                   lastTaskActivityInstance.EndedByUserName);

            rmins.ActivityResource        = new ActivityResource(runner, rmins.AppRunner.NextActivityPerformers);
            rmins.AppRunner.AppName       = runner.AppName;
            rmins.AppRunner.AppInstanceID = runner.AppInstanceID;
            rmins.AppRunner.ProcessGUID   = runner.ProcessGUID;
            rmins.AppRunner.UserID        = runner.UserID;
            rmins.AppRunner.UserName      = runner.UserName;

            rmins.BackwardContext.ProcessInstance                = processInstance;
            rmins.BackwardContext.BackwardToTaskActivity         = lastTaskActivity;
            rmins.BackwardContext.BackwardToTaskActivityInstance = lastTaskActivityInstance;
            rmins.BackwardContext.BackwardToTargetTransitionGUID =
                hasGatewayNode == false ? endTransitionInstance.TransitionGUID : String.Empty;
            rmins.BackwardContext.BackwardFromActivity         = endActivity;
            rmins.BackwardContext.BackwardFromActivityInstance = endActivityInstance;
            rmins.BackwardContext.BackwardTaskReceiver         = WfBackwardTaskReceiver.Instance(lastTaskActivityInstance.ActivityName,
                                                                                                 lastTaskActivityInstance.EndedByUserID,
                                                                                                 lastTaskActivityInstance.EndedByUserName);

            return(rmins);
        }
Exemple #20
0
        /// <summary>
        /// 节点内部业务逻辑执行
        /// </summary>
        internal override void ExecuteWorkItem()
        {
            //设置流程完成
            ProcessInstanceManager pim = new ProcessInstanceManager();

            pim.Complete(ActivityForwardContext.ProcessInstance.ID,
                         ActivityForwardContext.ActivityResource.AppRunner,
                         Session);
        }
Exemple #21
0
 /// <summary>
 /// 获取流程实例数据
 /// </summary>
 /// <param name="activityInstanceID">活动实例ID</param>
 /// <returns>流程实例实体</returns>
 public ProcessInstanceEntity GetProcessInstanceByActivity(int activityInstanceID)
 {
     using (var session = SessionFactory.CreateSession())
     {
         var pim      = new ProcessInstanceManager();
         var instance = pim.GetByActivity(session.Connection, activityInstanceID, session.Transaction);
         return(instance);
     }
 }
Exemple #22
0
        /// <summary>
        /// 获取流程实例数据
        /// </summary>
        /// <param name="conn">链接</param>
        /// <param name="processInstanceID">流程实例ID</param>
        /// <param name="trans">事务</param>
        /// <returns>流程实例实体</returns>
        public ProcessInstanceEntity GetProcessInstance(IDbConnection conn,
                                                        int processInstanceID,
                                                        IDbTransaction trans)
        {
            var pim      = new ProcessInstanceManager();
            var instance = pim.GetById(conn, processInstanceID, trans);

            return(instance);
        }
Exemple #23
0
        /// <summary>
        /// 设置活动实例的定时作业为完成状态
        /// (用于HangFire后台轮询任务)
        /// </summary>
        /// <param name="conn">链接</param>
        /// <param name="processInstanceID">流程实例ID</param>
        /// <param name="trans">事务</param>
        public void SetProcessJobTimerCompleted(IDbConnection conn, int processInstanceID, IDbTransaction trans)
        {
            var pim             = new ProcessInstanceManager();
            var processInstance = pim.GetById(conn, processInstanceID, trans);

            processInstance.JobTimerStatus          = (short)JobTimerStatusEnum.Completed;
            processInstance.JobTimerTreatedDateTime = System.DateTime.Now;
            pim.Update(conn, processInstance, trans);
        }
        /// <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);
        }
        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);
        }
        public static WfRuntimeManager CreateRuntimeInstanceStartup(WfAppRunner runner, IServiceProvider serviceProvider,
                                                                    WfProcessInstance parentProcessInstance,
                                                                    SubProcessNode subProcessNode,
                                                                    ref WfExecutedResult result)
        {
            //检查流程是否可以被启动
            var rmins = new WfRuntimeManagerStartup(serviceProvider);

            rmins.WfExecutedResult = result = new WfExecutedResult();
            var pim = new ProcessInstanceManager(serviceProvider);
            WfProcessInstance processInstance = null;

            if (subProcessNode == null)
            {
                //正常流程启动
                processInstance = pim.GetProcessInstanceLatest(
                    runner.ProcessUid,
                    runner.BillUid);
            }
            else
            {
                //子流程启动
                processInstance = pim.GetProcessInstanceLatest(
                    subProcessNode.SubProcessId, runner.BillUid);
            }

            //不能同时启动多个主流程
            if (processInstance != null &&
                processInstance.ParentProcessInsUid == null &&
                processInstance.ProcessState == WfProcessInstanceState.Running)
            {
                result.Status        = WfExecutedStatus.Exception;
                result.ExceptionType = WfExceptionType.Started_IsRunningAlready;
                result.Message       = "流程已经处于运行状态,不要重复提交!";
            }
            else
            {
                //processInstance 为空,此时继续执行启动操作
                rmins.AppRunner             = runner;
                rmins.ParentProcessInstance = parentProcessInstance;
                rmins.InvokedSubProcessNode = subProcessNode;

                //获取流程第一个可办理节点
                rmins.ProcessModel = new ProcessModel(serviceProvider, runner.ProcessUid, runner.BillUid);
            }

            //var firstActivity = rmins.ProcessModel.GetFirstActivity();

            //rmins.AppRunner.NextActivityPerformers = ActivityResource.CreateNextActivityPerformers(firstActivity.ActivityID,
            //    runner.UserId,
            //    runner.UserName);


            return(rmins);
        }
Exemple #27
0
        /// <summary>
        /// 节点内部业务逻辑执行
        /// </summary>
        internal override void ExecuteWorkItem()
        {
            //执行Action列表
            //ExecteActionList(Linker.ToActivity.ActionList,
            //    ActivityForwardContext.ActivityResource.AppRunner.ActionMethodParameters);

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

            pim.Complete(ActivityForwardContext.ProcessInstance.Fid, AppRunner.BillUid);
        }
Exemple #28
0
 /// <summary>
 /// 删除流程实例(先要进行取消操作)
 /// </summary>
 /// <param name="processInstanceGUID"></param>
 /// <returns></returns>
 public static bool DeleteProcessInstance(Guid processInstanceGUID)
 {
     try
     {
         ProcessInstanceManager pim = new ProcessInstanceManager();
         return(pim.Delete(processInstanceGUID));
     }
     catch (System.Exception)
     {
         throw;
     }
 }
Exemple #29
0
        /// <summary>
        /// 撤销处理具体功能实现
        /// </summary>
        /// <param name="session">会话</param>
        internal override void ExecuteInstanceImp()
        {
            //如果审批人还没有人审批 则可以撤销回草稿态
            ProcessInstanceManager manager = new ProcessInstanceManager(_serviceProvider);

            manager.Withdrawn(AppRunner);

            //构造回调函数需要的数据
            WfExecutedResult result = base.WfExecutedResult;

            //result.BackwardTaskReciever = base.BackwardContext.BackwardTaskReciever;
            result.Status = WfExecutedStatus.Success;
        }
Exemple #30
0
        /// <summary>
        /// 节点内部业务逻辑执行
        /// </summary>
        internal override void ExecuteWorkItem()
        {
            //执行Action列表
            ExecteActionList(Linker.ToActivity.ActionList,
                             ActivityForwardContext.ActivityResource.AppRunner.ActionMethodParameters);

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

            pim.Complete(ActivityForwardContext.ProcessInstance.ID,
                         ActivityForwardContext.ActivityResource.AppRunner,
                         Session);
        }