Пример #1
0
        /// <summary>
        /// 获取我的任务
        /// </summary>
        /// <param name="conn">数据库链接</param>
        /// <param name="activityInstanceID">活动实例ID</param>
        /// <param name="userID">用户ID</param>
        /// <param name="trans">数据库事务</param>
        /// <returns>任务视图实体</returns>
        internal TaskViewEntity GetTaskOfMine(IDbConnection conn,
                                              int activityInstanceID,
                                              string userID,
                                              IDbTransaction trans)
        {
            //processState:2 -running 流程处于运行状态
            //activityType:4 -表示“任务”类型的节点
            //activityState: 1-ready(准备), 2-running()运行;
            //            string whereSql = @"SELECT
            //                                    TOP 1 *
            //                                FROM vwWfActivityInstanceTasks
            //                                WHERE ActivityInstanceID=@activityInstanceID
            //                                    AND AssignedToUserID=@userID
            //                                    AND ProcessState=2
            //                                    AND (ActivityType=4 OR ActivityType=5 OR ActivityType=6)
            //                                    AND (ActivityState=1 OR ActivityState=2)
            //                                ORDER BY TASKID DESC";
            TaskViewEntity entity = null;
            var            list   = Repository.GetAll <TaskViewEntity>(conn, trans).Where <TaskViewEntity>(e => e.ActivityInstanceID == activityInstanceID &&
                                                                                                           e.AssignedToUserID == userID &&
                                                                                                           e.ProcessState == 2 &&
                                                                                                           (e.ActivityType == 3 || e.ActivityType == 4 || e.ActivityType == 5 || e.ActivityType == 6 || e.WorkItemType == 1) &&
                                                                                                           (e.ActivityState == 1 || e.ActivityState == 2))
                                    .OrderByDescending(e => e.TaskID)
                                    .ToList();

            if (list.Count() > 0)
            {
                entity = list[0];
            }
            return(entity);
        }
Пример #2
0
        /// <summary>
        /// 完成任务实例
        /// </summary>
        /// <param name="taskView">任务视图</param>
        /// <param name="activityResource">活动资源</param>
        /// <param name="session">会话</param>
        internal bool CompleteWorkItem(TaskViewEntity taskView,
                                       ActivityResource activityResource,
                                       IDbSession session)
        {
            bool canContinueForwardCurrentNode = true;

            WfAppRunner runner = new WfAppRunner
            {
                UserID   = activityResource.AppRunner.UserID,       //避免taskview为空
                UserName = activityResource.AppRunner.UserName
            };

            //流程强制拉取向前跳转时,没有运行人的任务实例
            if (taskView != null)
            {
                //完成本任务,返回任务已经转移到下一个会签任务,不继续执行其它节点
                base.TaskManager.Complete(taskView.TaskID, activityResource.AppRunner, session);
            }

            //设置活动节点的状态为完成状态
            base.ActivityInstanceManager.Complete(base.Linker.FromActivityInstance.ID,
                                                  activityResource.AppRunner,
                                                  session);

            base.Linker.FromActivityInstance.ActivityState = (short)ActivityStateEnum.Completed;

            return(canContinueForwardCurrentNode);
        }
Пример #3
0
        /// <summary>
        /// 获取我的任务
        /// </summary>
        /// <param name="activityInstanceID">活动实例ID</param>
        /// <param name="userID">用户ID</param>
        /// <returns>任务视图实体</returns>
        internal TaskViewEntity GetTaskOfMine(int activityInstanceID,
                                              string userID)
        {
            //processState:2 -running 流程处于运行状态
            //activityType:4 -表示“任务”类型的节点
            //activityState: 1-ready(准备), 2-running()运行;
            //将ActivityType 修改为 WorkItemType,以处理多类型的任务节点,包括普通任务,多实例,子流程节点
            //string sql = @"SELECT
            //                    TOP 1 *
            //                FROM vwWfActivityInstanceTasks
            //                WHERE ActivityInstanceID=@activityInstanceID
            //                    AND AssignedToUserID=@userID
            //                    AND ProcessState=2
            //                    AND (ActivityType=4 OR ActivityType=5 OR ActivityType=6 OR WorkItemType=1)
            //                    AND (ActivityState=1 OR ActivityState=2)
            //                ORDER BY TASKID DESC";

            using (var session = DbFactory.CreateSession())
            {
                TaskViewEntity entity = null;
                var            list   = GetTaskViewList(session).Where <TaskViewEntity>(e => e.ActivityInstanceID == activityInstanceID &&
                                                                                        e.AssignedToUserID == userID &&
                                                                                        e.ProcessState == 2 &&
                                                                                        (e.ActivityType == 4 || e.ActivityType == 5 || e.ActivityType == 6 || e.WorkItemType == 1) &&
                                                                                        (e.ActivityState == 1 || e.ActivityState == 2))
                                        .OrderByDescending(e => e.ID)
                                        .ToList();
                if (list != null && list.Count() > 0)
                {
                    entity = list[0];
                }
                return(entity);
            }
        }
Пример #4
0
        /// <summary>
        /// 根据流程信息获取任务
        /// </summary>
        /// <param name="conn">链接</param>
        /// <param name="processInstanceID">流程实例ID</param>
        /// <param name="activityInstanceID">活动实例ID</param>
        /// <param name="trans">事务</param>
        /// <returns>任务实体</returns>
        internal TaskViewEntity GetTaskViewByActivity(IDbConnection conn,
                                                      int processInstanceID,
                                                      int activityInstanceID,
                                                      IDbTransaction trans)
        {
            TaskViewEntity taskView = null;
            //string sql = @"SELECT
            //                *
            //             FROM vwWfActivityInstanceTasks
            //             WHERE ActivityInstanceID=@activityInstanceID
            //                AND ProcessInstanceID=@processInstanceID
            //            ";

            //var list = Repository.Query<TaskViewEntity>(sql,
            //new
            //{
            //    processInstanceID = processInstanceID,
            //    activityInstanceID = activityInstanceID

            //}).ToList();
            var sqlQuery = (from tv in Repository.GetAll <TaskViewEntity>(conn, trans)
                            where tv.ActivityInstanceID == activityInstanceID &&
                            tv.ProcessInstanceID == processInstanceID
                            select tv
                            );
            var list = sqlQuery.ToList <TaskViewEntity>();

            if (list.Count() > 0)
            {
                taskView = list[0];
            }
            return(taskView);
        }
Пример #5
0
        /// <summary>
        /// 获取我的任务
        /// </summary>
        /// <param name="activityInstanceID"></param>
        /// <param name="userID"></param>
        /// <returns></returns>
        internal TaskViewEntity GetTaskOfMine(int activityInstanceID,
                                              string userID)
        {
            //processState:2 -running 流程处于运行状态
            //activityType:4 -表示“任务”类型的节点
            //activityState: 1-ready(准备), 2-running()运行;
            string whereSql = @"SELECT TOP 1 * FROM vwWfActivityInstanceTasks 
                           WHERE ActivityInstanceID=@activityInstanceID 
                                AND AssignedToUserID=@userID 
                                AND ProcessState=2 AND (ActivityType=4 OR ActivityType=5) 
                                AND (ActivityState=1 OR ActivityState=2) 
                           ORDER BY TASKID DESC";

            var list = Repository.Query <TaskViewEntity>(
                whereSql,
                new
            {
                activityInstanceID = activityInstanceID,
                userID             = userID
            }).ToList <TaskViewEntity>();

            //取出唯一待办任务记录,并返回。
            TaskViewEntity task = null;

            if (list != null && list.Count == 1)
            {
                task = list[0];
            }
            return(task);
        }
Пример #6
0
        /// <summary>
        /// 获取我的任务
        /// </summary>
        /// <param name="activityInstanceID">活动实例ID</param>
        /// <param name="userID">用户ID</param>
        /// <returns>任务视图实体</returns>
        internal TaskViewEntity GetTaskOfMine(int activityInstanceID,
                                              string userID)
        {
            //2015.09.10 besley
            //将ActivityType 修改为 WorkItemType,以处理多类型的任务节点,包括普通任务,多实例,子流程节点
            string sql = @"SELECT 
                                TOP 1 * 
                            FROM vwWfActivityInstanceTasks 
                            WHERE ActivityInstanceID=@activityInstanceID 
                                AND AssignedToUserID=@userID 
                                AND ProcessState=2 
                                AND (ActivityType=4 OR ActivityType=5 OR ActivityType=6 OR WorkItemType=1)
                                AND (ActivityState=1 OR ActivityState=2) 
                            ORDER BY TASKID DESC";

            sql = SqlDataProvider.GetSqlTaskOfMineByAtcitivityInstance(sql);
            var list = Repository.Query <TaskViewEntity>(
                sql,
                new
            {
                activityInstanceID = activityInstanceID,
                userID             = userID
            }).ToList <TaskViewEntity>();

            //取出唯一待办任务记录,并返回。
            TaskViewEntity task = null;

            if (list != null && list.Count == 1)
            {
                task = list[0];
            }
            return(task);
        }
 /// <summary>
 /// 创建任务执行上下文对象
 /// </summary>
 /// <param name="taskView">任务</param>
 /// <param name="processModel">流程模型</param>
 /// <param name="activityResource">活动资源</param>
 /// <param name="isNotParsedForward">不需要解析的流转</param>
 /// <param name="session">数据会话</param>
 /// <returns>活动上下文</returns>
 internal static ActivityForwardContext CreateRunningContextByTask(TaskViewEntity taskView,
                                                                   IProcessModel processModel,
                                                                   ActivityResource activityResource,
                                                                   Boolean isNotParsedForward,
                                                                   IDbSession session)
 {
     return(new ActivityForwardContext(taskView, processModel, activityResource, isNotParsedForward, session));
 }
Пример #8
0
        /// <summary>
        /// 获取流程当前运行节点信息
        /// </summary>
        /// <param name="runner">执行者</param>
        /// <returns></returns>
        internal ActivityInstanceEntity GetRunningNode(WfAppRunner runner)
        {
            //如果流程在运行状态,则返回运行时信息
            TaskViewEntity task   = null;
            var            entity = GetRunningNode(runner, out task);

            return(entity);
        }
Пример #9
0
        /// <summary>
        /// 根据应用实例、流程GUID,办理用户Id获取任务列表
        /// </summary>
        /// <param name="conn">链接</param>
        /// <param name="appInstanceID">App实例ID</param>
        /// <param name="processGUID">流程定义GUID</param>
        /// <param name="userID">用户Id</param>
        /// <param name="taskID">任务ID</param>
        /// <param name="trans">事务</param>
        /// <returns>任务实体</returns>
        internal TaskViewEntity GetTaskOfMine(IDbConnection conn,
                                              string appInstanceID,
                                              string processGUID,
                                              string userID,
                                              Nullable <int> taskID,
                                              IDbTransaction trans)
        {
            TaskViewEntity taskView = null;

            if (taskID != null)
            {
                taskView = GetTaskView(conn, taskID.Value, trans);
            }
            else
            {
                //processState:2 -running 流程处于运行状态
                //activityType:4 -表示“任务”类型的节点
                //activityState: 1-ready(准备), 2-running()运行;
                //2015.09.10 besley
                //将ActivityType 修改为 WorkItemType,以处理多类型的任务节点,包括普通任务,多实例,子流程节点
                //string sql = @"SELECT
                //                TOP 1 *
                //           FROM vwWfActivityInstanceTasks
                //           WHERE AppInstanceID=@appInstanceID
                //                AND ProcessGUID=@processGUID
                //                AND AssignedToUserID=@userID
                //                AND ProcessState=2
                //                AND (ActivityType=4 OR ActivityType=5 OR ActivityType=6 OR WorkItemType=1)
                //                AND (ActivityState=1 OR ActivityState=2)
                //           ORDER BY TASKID DESC";
                var taskList = Repository.GetAll <TaskViewEntity>(conn, trans).Where <TaskViewEntity>(e => e.AppInstanceID == appInstanceID &&
                                                                                                      e.ProcessGUID == processGUID &&
                                                                                                      e.AssignedToUserID == userID &&
                                                                                                      e.ProcessState == 2 &&
                                                                                                      (e.ActivityType == 4 || e.ActivityType == 5 || e.ActivityType == 6 || e.WorkItemType == 1) &&
                                                                                                      (e.ActivityState == 1 || e.ActivityState == 2))
                               .OrderByDescending(e => e.TaskID)
                               .ToList();

                if (taskList.Count == 0)
                {
                    var message = LocalizeHelper.GetEngineMessage("taskmanager.gettaskofmine.error");
                    throw new WorkflowException(
                              string.Format("{0},AppInstanceID: {1}", message, appInstanceID.ToString())
                              );
                }
                else if (taskList.Count > 1)
                {
                    throw new WorkflowException(LocalizeHelper.GetEngineMessage("taskmanager.gettaskofmine.toomoretasks.error"));
                }
                else
                {
                    taskView = taskList[0];
                }
            }
            return(taskView);
        }
Пример #10
0
        /// <summary>
        /// 根据应用实例、流程GUID,办理用户Id获取任务列表
        /// </summary>
        /// <param name="conn">链接</param>
        /// <param name="appInstanceID">App实例ID</param>
        /// <param name="processGUID">流程定义GUID</param>
        /// <param name="userID">用户Id</param>
        /// <param name="taskID">任务ID</param>
        /// <param name="trans">事务</param>
        /// <returns>任务实体</returns>
        internal TaskViewEntity GetTaskOfMine(IDbConnection conn,
                                              string appInstanceID,
                                              string processGUID,
                                              string userID,
                                              Nullable <int> taskID,
                                              IDbTransaction trans)
        {
            TaskViewEntity taskView = null;

            if (taskID != null)
            {
                taskView = GetTaskView(conn, taskID.Value, trans);
            }
            else
            {
                //processState:2 -running 流程处于运行状态
                //activityType:4 -表示“任务”类型的节点
                //activityState: 1-ready(准备), 2-running()运行;
                //2015.09.10 besley
                //将ActivityType 修改为 WorkItemType,以处理多类型的任务节点,包括普通任务,多实例,子流程节点
                string sql = @"SELECT 
                                TOP 1 * 
                           FROM vwWfActivityInstanceTasks 
                           WHERE AppInstanceID=@appInstanceID 
                                AND ProcessGUID=@processGUID 
                                AND AssignedToUserID=@userID 
                                AND ProcessState=2 
                                AND (ActivityType=4 OR ActivityType=5 OR ActivityType=6 OR WorkItemType=1)
                                AND (ActivityState=1 OR ActivityState=2) 
                           ORDER BY TASKID DESC";

                sql = SqlDataProvider.GetSqlTaskOfMineByAppInstance(sql);
                var taskList = Repository.Query <TaskViewEntity>(conn,
                                                                 sql,
                                                                 new
                {
                    appInstanceID = appInstanceID,
                    processGUID   = processGUID,
                    userID        = userID
                },
                                                                 trans).ToList();

                if (taskList == null || taskList.Count == 0)
                {
                    throw new WorkflowException(
                              string.Format("当前没有你要办理的任务,业务单据标识ID: {0}", appInstanceID.ToString())
                              );
                }
                else if (taskList.Count > 1)
                {
                    throw new WorkflowException(string.Format("当前办理任务的数目: {0} 大于1,无法确定下一步节点!", taskList.Count));
                }

                taskView = taskList[0];
            }
            return(taskView);
        }
Пример #11
0
        /// <summary>
        /// 判断任务是否属于某个用户
        /// </summary>
        /// <param name="entity">任务</param>
        /// <param name="userID">用户Id</param>
        /// <returns>是否标志</returns>
        internal bool IsMine(TaskViewEntity entity, string userID)
        {
            var isMine = false;

            if (entity.AssignedToUserID == userID)
            {
                isMine = true;
            }
            return(isMine);
        }
Пример #12
0
        /// <summary>
        /// 创建实例
        /// </summary>
        /// <param name="taskView"></param>
        /// <param name="previousActivityInstance"></param>
        /// <param name="nextActivityTree"></param>
        /// <returns></returns>
        public static CurrentRunningNodeMapComplex Instance(TaskViewEntity taskView,
                                                            IList <ActivityInstanceEntity> previousActivityInstance,
                                                            IList <NodeView> nextActivityTree)
        {
            var runningNode = new CurrentRunningNodeMapComplex();

            runningNode.IsMine = false;
            runningNode.PreviousActivityInstance = previousActivityInstance;
            runningNode.NextActivityTree         = nextActivityTree;

            return(runningNode);
        }
Пример #13
0
        /// <summary>
        /// 加签操作
        /// </summary>
        /// <param name="runner"></param>
        /// <param name="result"></param>
        /// <returns></returns>
        public static WfRuntimeManager CreateRuntimeInstanceSignForward(WfAppRunner runner,
                                                                        ref WfExecutedResult result)
        {
            var rmins = new WfRuntimeManagerSignForward();

            rmins.WfExecutedResult = result = new WfExecutedResult();

            if (string.IsNullOrEmpty(runner.AppName) ||
                String.IsNullOrEmpty(runner.AppInstanceID) ||
                runner.ProcessGUID == null ||
                runner.NextActivityPerformers == null)
            {
                result.Status        = WfExecutedStatus.Exception;
                result.ExceptionType = WfExceptionType.SignForward_ErrorArguments;
                result.Message       = "方法参数错误,无法加签流程!";
                return(rmins);
            }

            if (runner.NextActivityPerformers.Count() == 0)
            {
                result.Status        = WfExecutedStatus.Exception;
                result.ExceptionType = WfExceptionType.SignForward_NoneSigners;
                result.Message       = "没有添加要发送加签的人员";
                return(rmins);
            }

            rmins.AppRunner = runner;

            var            aim         = new ActivityInstanceManager();
            TaskViewEntity taskView    = null;
            var            runningNode = aim.GetRunningNode(runner, out taskView);

            //判断是否是当前登录用户的任务
            if (runningNode.AssignedToUserIDs.Contains(runner.UserID.ToString()) == false)
            {
                result.Status        = WfExecutedStatus.Exception;
                result.ExceptionType = WfExceptionType.RunApp_HasNoTask;
                result.Message       = "当前没有登录用户要办理的任务,无法运行流程!";
                return(rmins);
            }

            var processModel     = new ProcessModel(taskView.ProcessGUID, taskView.Version);
            var activityResource = new ActivityResource(runner, runner.NextActivityPerformers, runner.Conditions, runner.DynamicVariables);

            var tm = new TaskManager();

            rmins.TaskView = taskView;
            rmins.RunningActivityInstance = runningNode;
            rmins.ProcessModel            = processModel;
            rmins.ActivityResource        = activityResource;

            return(rmins);
        }
Пример #14
0
        internal ActivityInstanceEntity GetRunningNodeOfMine(WfAppRunner runner, out TaskViewEntity taskView)
        {
            var appInstanceID = runner.AppInstanceID;
            var processGUID   = runner.ProcessGUID;
            var taskID        = runner.TaskID;

            taskView = null;
            ActivityInstanceEntity activityInstance = null;

            //如果流程在运行状态,则返回运行时信息
            var tm = new TaskManager();

            var aim          = new ActivityInstanceManager();
            var activityList = aim.GetRunningActivityInstanceList(runner).ToList();

            if ((activityList != null) && (activityList.Count == 1))
            {
                activityInstance = activityList[0];
                taskView         = tm.GetTaskOfMine(activityInstance.ID, runner.UserID);
            }
            else if (activityList.Count > 0)
            {
                if (runner.TaskID != null && runner.TaskID.Value != 0)
                {
                    taskView = tm.GetTaskView(taskID.Value);

                    foreach (var ai in activityList)
                    {
                        if (ai.ID == taskView.ActivityInstanceID)
                        {
                            activityInstance = ai;
                            break;
                        }
                    }
                }
                else
                {
                    //当前流程运行节点不唯一
                    var e = new WorkflowException("当前流程有多个运行节点,但没有TaskID传入,状态异常!");
                    LogManager.RecordLog("获取当前运行节点信息异常", LogEventType.Exception, LogPriority.Normal, null, e);
                    throw e;
                }
            }
            else
            {
                //当前没有运行状态的节点存在,流程不存在,或者已经结束或取消
                var e = new WorkflowException("当前流程没有运行节点,状态异常!");
                LogManager.RecordLog("获取当前运行节点信息异常", LogEventType.Exception, LogPriority.Normal, null, e);
                throw e;
            }
            return(activityInstance);
        }
Пример #15
0
        /// <summary>
        /// 获取流程当前运行节点信息
        /// </summary>
        /// <param name="runner">执行者</param>
        /// <returns>活动实例</returns>
        internal ActivityInstanceEntity GetRunningNode(WfAppRunner runner)
        {
            var appInstanceID = runner.AppInstanceID;
            var processGUID   = runner.ProcessGUID;
            var taskID        = runner.TaskID;

            //如果流程在运行状态,则返回运行时信息
            TaskViewEntity task   = null;
            var            aim    = new ActivityInstanceManager();
            var            entity = GetRunningNode(runner, out task);

            return(entity);
        }
Пример #16
0
        /// <summary>
        /// 任务执行的上下文对象
        /// </summary>
        /// <param name="task"></param>
        /// <param name="processModel"></param>
        /// <param name="activityResource"></param>
        private ActivityForwardContext(TaskViewEntity task,
                                       ProcessModel processModel,
                                       ActivityResource activityResource)
        {
            this.TaskView = task;

            //check task condition has load activity instance
            this.FromActivityInstance = (new ActivityInstanceManager()).GetById(task.ActivityInstanceID);
            this.ProcessInstance      = (new ProcessInstanceManager()).GetById(task.ProcessInstanceID);
            this.Activity             = processModel.GetActivity(task.ActivityGUID);
            this.ProcessModel         = processModel;
            this.ActivityResource     = activityResource;
        }
Пример #17
0
        /// <summary>
        /// 判断任务处于运行状态
        /// </summary>
        /// <param name="task">任务</param>
        /// <returns>是否可运行</returns>
        internal Boolean CheckTaskStateInRunningState(TaskViewEntity task)
        {
            var isRunning = true;

            if (task.TaskState == (short)TaskStateEnum.Completed)
            {
                isRunning = false;
            }
            else if (task.ActivityState == (short)ActivityStateEnum.Completed)
            {
                isRunning = false;
            }
            return(isRunning);
        }
Пример #18
0
        /// <summary>
        /// 获取我的任务
        /// </summary>
        /// <param name="conn">数据库链接</param>
        /// <param name="activityInstanceID">活动实例ID</param>
        /// <param name="userID">用户ID</param>
        /// <param name="trans">数据库事务</param>
        /// <returns>任务视图实体</returns>
        internal TaskViewEntity GetTaskOfMine(IDbConnection conn,
                                              int activityInstanceID,
                                              string userID,
                                              IDbTransaction trans)
        {
            //processState:2 -running 流程处于运行状态
            //activityType:4 -表示“任务”类型的节点
            //activityState: 1-ready(准备), 2-running()运行;
//            string whereSql = @"SELECT
//                                    TOP 1 *
//                                FROM vwWfActivityInstanceTasks
//                                WHERE ActivityInstanceID=@activityInstanceID
//                                    AND AssignedToUserID=@userID
//                                    AND ProcessState=2
//                                    AND (ActivityType=4 OR ActivityType=5 OR ActivityType=6)
//                                    AND (ActivityState=1 OR ActivityState=2)
//                                ORDER BY TASKID DESC";

            //2015.09.10 besley
            //将ActivityType 修改为 WorkItemType,以处理多类型的任务节点,包括普通任务,多实例,子流程节点
            string sql = @"SELECT 
                                TOP 1 * 
                            FROM vwWfActivityInstanceTasks 
                            WHERE ActivityInstanceID=@activityInstanceID 
                                AND AssignedToUserID=@userID 
                                AND ProcessState=2 
                                AND (ActivityType=4 OR ActivityType=5 OR ActivityType=6 OR WorkItemType=1)
                                AND (ActivityState=1 OR ActivityState=2) 
                            ORDER BY TASKID DESC";

            sql = SqlDataProvider.GetSqlTaskOfMineByAtcitivityInstance(sql);
            var list = Repository.Query <TaskViewEntity>(conn,
                                                         sql,
                                                         new
            {
                activityInstanceID = activityInstanceID,
                userID             = userID
            },
                                                         trans).ToList <TaskViewEntity>();

            //取出唯一待办任务记录,并返回。
            TaskViewEntity task = null;

            if (list != null && list.Count == 1)
            {
                task = list[0];
            }
            return(task);
        }
Пример #19
0
        /// <summary>
        /// 获取预选步骤人员列表
        /// </summary>
        /// <param name="runner">当前运行用户</param>
        /// <returns>步骤预选人员列表</returns>
        private IDictionary <string, PerformerList> GetNextActivityPerformersPriliminary(WfAppRunner runner)
        {
            IDictionary <string, PerformerList> nextSteps = null;

            var            tm       = new TaskManager();
            TaskViewEntity taskView = tm.GetTaskOfMine(runner);

            //读取活动实例中记录的步骤预选数据
            var aim = new ActivityInstanceManager();

            if (taskView.MIHostActivityInstanceID != null)
            {
                var mainActivityInstanceID = taskView.MIHostActivityInstanceID.Value;
                var mainActivityInstance   = aim.GetById(mainActivityInstanceID);
                if (mainActivityInstance != null)
                {
                    nextSteps = NextStepUtility.DeserializeNextStepPerformers(mainActivityInstance.NextStepPerformers);
                }
            }

            IProcessModel processModel = ProcessModelFactory.Create(runner.ProcessGUID, runner.Version);
            var           nextActivity = processModel.GetNextActivity(taskView.ActivityGUID);

            if (nextActivity != null)
            {
                if (nextActivity.ActivityType == ActivityTypeEnum.GatewayNode)
                {
                    //获取网关节点信息
                    var gatewayActivityInstance = aim.GetActivityInstanceLatest(taskView.ProcessInstanceID, nextActivity.ActivityGUID);
                    if (gatewayActivityInstance != null &&
                        !string.IsNullOrEmpty(gatewayActivityInstance.NextStepPerformers))
                    {
                        nextSteps = NextStepUtility.DeserializeNextStepPerformers(gatewayActivityInstance.NextStepPerformers);
                    }
                }
                else if (XPDLHelper.IsInterTimerEventComponentNode(nextActivity) == true)
                {
                    //中间Timer事件节点
                    var timerActivityInstance = aim.GetActivityInstanceLatest(taskView.ProcessInstanceID, nextActivity.ActivityGUID);
                    if (timerActivityInstance != null &&
                        !string.IsNullOrEmpty(timerActivityInstance.NextStepPerformers))
                    {
                        nextSteps = NextStepUtility.DeserializeNextStepPerformers(timerActivityInstance.NextStepPerformers);
                    }
                }
            }
            return(nextSteps);
        }
Пример #20
0
        /// <summary>
        /// 创建运行时实例对象
        /// </summary>
        /// <param name="runner">执行者</param>
        /// <param name="session">数据库会话</param>
        /// <param name="result">结果对象</param>
        /// <returns>运行时实例对象</returns>
        public static WfRuntimeManager CreateRuntimeInstanceAppRunning(WfAppRunner runner,
                                                                       IDbSession session,
                                                                       ref WfExecutedResult result)
        {
            //检查传人参数是否有效
            var rmins = new WfRuntimeManagerAppRunning();

            rmins.WfExecutedResult = result = new WfExecutedResult();
            if (string.IsNullOrEmpty(runner.AppName) ||
                String.IsNullOrEmpty(runner.AppInstanceID) ||
                runner.ProcessGUID == null)
            {
                result.Status        = WfExecutedStatus.Exception;
                result.ExceptionType = WfExceptionType.RunApp_ErrorArguments;
                result.Message       = LocalizeHelper.GetEngineMessage("wfruntimemanagerfactory.CreateRuntimeInstanceAppRunning.missing.error");
                return(rmins);
            }

            //传递runner变量
            rmins.AppRunner = runner;

            var            aim         = new ActivityInstanceManager();
            TaskViewEntity taskView    = null;
            var            runningNode = aim.GetRunningNode(runner, session, out taskView);

            //判断是否是当前登录用户的任务
            if (runningNode.AssignedToUserIDs.Contains(runner.UserID.ToString()) == false)
            {
                result.Status        = WfExecutedStatus.Exception;
                result.ExceptionType = WfExceptionType.RunApp_HasNoTask;
                result.Message       = LocalizeHelper.GetEngineMessage("wfruntimemanagerfactory.CreateRuntimeInstanceAppRunning.nonetask.error");
                return(rmins);
            }

            //用于流程注册事件时的流程实例ID提供
            rmins.ProcessInstanceID = runningNode.ProcessInstanceID;
            var processModel     = ProcessModelFactory.Create(taskView.ProcessGUID, taskView.Version);
            var activityResource = new ActivityResource(runner,
                                                        runner.NextActivityPerformers,
                                                        runner.Conditions);

            rmins.TaskView = taskView;
            rmins.RunningActivityInstance = runningNode;
            rmins.ProcessModel            = processModel;
            rmins.ActivityResource        = activityResource;

            return(rmins);
        }
Пример #21
0
        /// <summary>
        /// 获取任务视图
        /// </summary>
        /// <param name="conn">链接</param>
        /// <param name="runner">当前运行者</param>
        /// <param name="trans">事务</param>
        /// <returns>任务视图</returns>
        internal TaskViewEntity GetTaskOfMine(IDbConnection conn,
                                              WfAppRunner runner,
                                              IDbTransaction trans)
        {
            TaskViewEntity taskView = null;

            if (runner.TaskID != null)
            {
                taskView = GetTaskView(conn, runner.TaskID.Value, trans);
            }
            else
            {
                taskView = GetTaskOfMine(conn, runner.AppInstanceID, runner.ProcessGUID, runner.UserID, trans);
            }
            return(taskView);
        }
        /// <summary>
        /// 任务执行的上下文对象
        /// </summary>
        /// <param name="taskView"></param>
        /// <param name="processModel">流程模型</param>
        /// <param name="activityResource">活动资源</param>
        /// <param name="isNotParsedByTransition">非解析流转</param>
        /// <param name="session">数据会话</param>
        private ActivityForwardContext(TaskViewEntity taskView,
                                       IProcessModel processModel,
                                       ActivityResource activityResource,
                                       Boolean isNotParsedByTransition,
                                       IDbSession session)
        {
            TaskID = taskView.TaskID;

            //check task condition has load activity instance
            FromActivityInstance    = (new ActivityInstanceManager()).GetById(session.Connection, taskView.ActivityInstanceID, session.Transaction);
            ProcessInstance         = (new ProcessInstanceManager()).GetById(session.Connection, taskView.ProcessInstanceID, session.Transaction);
            Activity                = processModel.GetActivity(taskView.ActivityGUID);
            ProcessModel            = processModel;
            ActivityResource        = activityResource;
            IsNotParsedByTransition = isNotParsedByTransition;
        }
Пример #23
0
        /// <summary>
        /// 创建运行时实例
        /// </summary>
        /// <param name="appName"></param>
        /// <param name="appInstanceID"></param>
        /// <param name="processGUID"></param>
        /// <param name="userID"></param>
        /// <param name="userName"></param>
        /// <param name="nextActivityPerformers"></param>
        /// <returns></returns>
        public static WfRuntimeManager CreateRuntimeInstanceAppRunning(
            WfAppRunner runner,
            ref WfExecutedResult result)
        {
            //检查传人参数是否有效
            var rmins = new WfRuntimeManagerAppRunning();

            rmins.WfExecutedResult = result = new WfExecutedResult();
            if (string.IsNullOrEmpty(runner.AppName) ||
                String.IsNullOrEmpty(runner.AppInstanceID) ||
                runner.ProcessGUID == null)
            {
                result.Status        = WfExecutedStatus.Exception;
                result.ExceptionType = WfExceptionType.RunApp_ErrorArguments;
                result.Message       = "方法参数错误,无法运行流程!";
                return(rmins);
            }

            //传递runner变量
            rmins.AppRunner = runner;

            var            aim         = new ActivityInstanceManager();
            TaskViewEntity taskView    = null;
            var            runningNode = aim.GetRunningNodeOfMine(runner, out taskView);

            //判断是否是当前登录用户的任务
            if (runningNode.AssignedToUsers.Contains(runner.UserID.ToString()) == false)
            {
                result.Status        = WfExecutedStatus.Exception;
                result.ExceptionType = WfExceptionType.RunApp_HasNoTask;
                result.Message       = "当前没有登录用户要办理的任务,无法运行流程!";
                return(rmins);
            }

            var processModel     = new ProcessModel(runningNode.ProcessGUID);
            var activityResource = new ActivityResource(runner, runner.NextActivityPerformers, runner.Conditions);

            var tm = new TaskManager();

            rmins.TaskView = taskView;
            rmins.RunningActivityInstance = runningNode;
            rmins.ProcessModel            = processModel;
            rmins.ActivityResource        = activityResource;

            return(rmins);
        }
Пример #24
0
        /// <summary>
        /// 获取预选步骤人员列表
        /// </summary>
        /// <param name="nextActivityTree">下一步活动节点树</param>
        /// <param name="runner">当前运行用户</param>
        /// <returns>步骤预选人员列表</returns>
        private IDictionary <string, PerformerList> GetNextActivityPerformers(IList <NodeView> nextActivityTree,
                                                                              WfAppRunner runner)
        {
            IDictionary <string, PerformerList> nextSteps = null;

            var            tm       = new TaskManager();
            TaskViewEntity taskView = tm.GetTaskOfMine(runner);

            //读取活动实例中记录的步骤预选数据
            var aim = new ActivityInstanceManager();

            if (taskView.MIHostActivityInstanceID != null)
            {
                var mainActivityInstanceID = taskView.MIHostActivityInstanceID.Value;
                var mainActivityInstance   = aim.GetById(mainActivityInstanceID);
                if (mainActivityInstance != null)
                {
                    nextSteps = NextStepUtility.DeserializeNextStepPerformers(mainActivityInstance.NextStepPerformers);
                }
            }

            //获取网关节点信息
            IProcessModel processModel = ProcessModelFactory.Create(runner.ProcessGUID, runner.Version);
            var           nextActivity = processModel.GetNextActivity(taskView.ActivityGUID);

            if (nextActivity.ActivityType == ActivityTypeEnum.GatewayNode)
            {
                var gatewayActivityInstance = aim.GetActivityInstanceLatest(taskView.ProcessInstanceID, nextActivity.ActivityGUID);
                if (gatewayActivityInstance != null &&
                    !string.IsNullOrEmpty(gatewayActivityInstance.NextStepPerformers))
                {
                    nextSteps = NextStepUtility.DeserializeNextStepPerformers(gatewayActivityInstance.NextStepPerformers);
                }
            }
            return(nextSteps);
        }
        /// <summary>
        /// 创建跳转实例信息
        /// </summary>
        /// <param name="runner">执行者</param>
        /// <param name="result">结果对象</param>
        /// <returns>运行时实例对象</returns>
        public static WfRuntimeManager CreateRuntimeInstanceJump(WfAppRunner runner,
                                                                 ref WfExecutedResult result)
        {
            var rmins = new WfRuntimeManagerJump();

            rmins.WfExecutedResult = result = new WfExecutedResult();

            if (string.IsNullOrEmpty(runner.AppName) ||
                String.IsNullOrEmpty(runner.AppInstanceID) ||
                runner.ProcessGUID == null ||
                runner.NextActivityPerformers == null)
            {
                //缺失方法参数
                result.Status        = WfExecutedStatus.Exception;
                result.ExceptionType = WfExceptionType.Jump_ErrorArguments;
                result.Message       = LocalizeHelper.GetEngineMessage("wfruntimemanagerfactory.CreateRuntimeInstanceJump.missing.error");
                return(rmins);
            }

            //流程跳转时,只能跳转到一个节点
            if (runner.NextActivityPerformers.Count() > 1)
            {
                result.Status        = WfExecutedStatus.Exception;
                result.ExceptionType = WfExceptionType.Jump_OverOneStep;
                result.Message       = LocalizeHelper.GetEngineMessage("wfruntimemanagerfactory.CreateRuntimeInstanceJump.jump.error",
                                                                       runner.NextActivityPerformers.Count().ToString());
                return(rmins);
            }

            //获取当前运行节点信息
            var            aim         = new ActivityInstanceManager();
            TaskViewEntity taskView    = null;
            var            runningNode = aim.GetRunningNode(runner, out taskView);

            //传递runner变量
            rmins.TaskView                = taskView;
            rmins.AppRunner               = runner;
            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;

            //用于流程注册时间调用时候的流程实例ID提供
            rmins.ProcessInstanceID = runningNode.ProcessInstanceID;

            var processModel = ProcessModelFactory.Create(taskView.ProcessGUID, taskView.Version);

            rmins.ProcessModel = processModel;

            #region 考虑回跳方式
            //获取跳转节点信息
            var jumpBackActivityGUID     = runner.NextActivityPerformers.First().Key;
            var jumpBackActivityInstance = aim.GetActivityInstanceLatest(runningNode.ProcessInstanceID, jumpBackActivityGUID);

            if (jumpBackActivityInstance != null)
            {
                //跳转到曾经执行过的节点上,可以作为跳回方式处理
                rmins.IsBackward = true;
                rmins.BackwardContext.ProcessInstance        = (new ProcessInstanceManager()).GetById(runningNode.ProcessInstanceID);
                rmins.BackwardContext.BackwardToTaskActivity = processModel.GetActivity(jumpBackActivityGUID);

                //获取当前运行节点的上一步节点
                bool hasGatewayNode             = false;
                var  tim                        = new TransitionInstanceManager();
                var  lastTaskTransitionInstance = tim.GetLastTaskTransition(runner.AppName,
                                                                            runner.AppInstanceID, runner.ProcessGUID);

                var npc = new PreviousStepChecker();
                var previousActivityInstance = npc.GetPreviousActivityInstanceList(runningNode, true,
                                                                                   out hasGatewayNode).ToList()[0];

                //仅仅是回跳到上一步节点,即按SendBack方式处理
                if (previousActivityInstance.ActivityGUID == jumpBackActivityGUID)
                {
                    rmins.BackwardContext.BackwardToTaskActivityInstance = previousActivityInstance;
                    rmins.BackwardContext.BackwardToTargetTransitionGUID =
                        hasGatewayNode == false ? lastTaskTransitionInstance.TransitionGUID : WfDefine.WF_XPDL_GATEWAY_BYPASS_GUID;        //如果中间有Gateway节点,则没有直接相连的TransitonGUID

                    rmins.BackwardContext.BackwardFromActivity         = processModel.GetActivity(runningNode.ActivityGUID);
                    rmins.BackwardContext.BackwardFromActivityInstance = runningNode;
                    rmins.BackwardContext.BackwardTaskReceiver         = WfBackwardTaskReceiver.Instance(
                        previousActivityInstance.ActivityName,
                        previousActivityInstance.EndedByUserID,
                        previousActivityInstance.EndedByUserName);

                    rmins.AppRunner.NextActivityPerformers = ActivityResource.CreateNextActivityPerformers(
                        previousActivityInstance.ActivityGUID,
                        previousActivityInstance.EndedByUserID,
                        previousActivityInstance.EndedByUserName);
                }
                else
                {
                    //回跳到早前节点
                    if (jumpBackActivityInstance.ActivityState != (short)ActivityStateEnum.Completed)
                    {
                        //回跳节点不在完成状态
                        result.Status        = WfExecutedStatus.Exception;
                        result.ExceptionType = WfExceptionType.Jump_NotActivityBackCompleted;
                        result.Message       = LocalizeHelper.GetEngineMessage("wfruntimemanagerfactory.CreateRuntimeInstanceJump.back.error");

                        return(rmins);
                    }

                    rmins.BackwardContext.BackwardToTaskActivityInstance = jumpBackActivityInstance;

                    //判断两个节点是否有Transition的定义存在
                    var transition = processModel.GetForwardTransition(runningNode.ActivityGUID, jumpBackActivityGUID);
                    rmins.BackwardContext.BackwardToTargetTransitionGUID = transition != null ? transition.TransitionGUID : WfDefine.WF_XPDL_GATEWAY_BYPASS_GUID;

                    rmins.BackwardContext.BackwardFromActivity         = processModel.GetActivity(runningNode.ActivityGUID);
                    rmins.BackwardContext.BackwardFromActivityInstance = runningNode;
                    rmins.BackwardContext.BackwardTaskReceiver         = WfBackwardTaskReceiver.Instance(
                        jumpBackActivityInstance.ActivityName,
                        jumpBackActivityInstance.EndedByUserID,
                        jumpBackActivityInstance.EndedByUserName);

                    rmins.AppRunner.NextActivityPerformers = ActivityResource.CreateNextActivityPerformers(
                        jumpBackActivityInstance.ActivityGUID,
                        jumpBackActivityInstance.EndedByUserID,
                        jumpBackActivityInstance.EndedByUserName);
                }
                //获取资源数据
                var activityResourceBack = new ActivityResource(rmins.AppRunner,
                                                                rmins.AppRunner.NextActivityPerformers,
                                                                runner.Conditions);
                rmins.ActivityResource = activityResourceBack;
            }
            else
            {
                //跳转到从未执行过的节点上
                var activityResource = new ActivityResource(runner, runner.NextActivityPerformers, runner.Conditions);
                rmins.ActivityResource        = activityResource;
                rmins.RunningActivityInstance = runningNode;
            }
            #endregion

            return(rmins);
        }
Пример #26
0
        /// <summary>
        /// 创建跳转实例信息
        /// </summary>
        /// <param name="runner">执行者</param>
        /// <param name="result">结果对象</param>
        /// <returns>运行时实例对象</returns>
        public static WfRuntimeManager CreateRuntimeInstanceJump(WfAppRunner runner,
                                                                 ref WfExecutedResult result)
        {
            var rmins = new WfRuntimeManagerJump();

            rmins.WfExecutedResult = result = new WfExecutedResult();

            if (string.IsNullOrEmpty(runner.AppName) ||
                String.IsNullOrEmpty(runner.AppInstanceID) ||
                runner.ProcessGUID == null ||
                runner.NextActivityPerformers == null)
            {
                result.Status        = WfExecutedStatus.Exception;
                result.ExceptionType = WfExceptionType.Jump_ErrorArguments;
                result.Message       = "方法参数错误,无法运行流程!";
                return(rmins);
            }

            //流程跳转时,只能跳转到一个节点
            if (runner.NextActivityPerformers.Count() > 1)
            {
                result.Status        = WfExecutedStatus.Exception;
                result.ExceptionType = WfExceptionType.Jump_OverOneStep;
                result.Message       = string.Format("不能跳转到多个节点!节点数:{0}",
                                                     runner.NextActivityPerformers.Count());
                return(rmins);
            }

            //获取当前运行节点信息
            var            aim         = new ActivityInstanceManager();
            TaskViewEntity taskView    = null;
            var            runningNode = aim.GetRunningNode(runner, out taskView);

            //传递runner变量
            rmins.TaskView                = taskView;
            rmins.AppRunner               = runner;
            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;

            var processModel = ProcessModelFactory.Create(taskView.ProcessGUID, taskView.Version);

            rmins.ProcessModel = processModel;

            #region  考虑回跳方式
            ////获取跳转节点信息
            //var jumpActivityGUID = runner.NextActivityPerformers.First().Key;
            //var jumpActivityInstanceList = aim.GetActivityInstance(runner.AppInstanceID, runner.ProcessGUID, jumpActivityGUID);

            //if (jumpActivityInstanceList != null
            //    && jumpActivityInstanceList.Count > 0)
            //{
            //    //跳转到曾经执行过的节点上,可以作为跳回方式处理
            //    rmins.IsBackward = true;
            //    rmins.BackwardContext.ProcessInstance = (new ProcessInstanceManager()).GetById(runningNode.ProcessInstanceID);
            //    rmins.BackwardContext.BackwardToTaskActivity = processModel.GetActivity(jumpActivityGUID);

            //    //获取当前运行节点的上一步节点
            //    bool hasGatewayNode = false;
            //    var tim = new TransitionInstanceManager();
            //    var lastTaskTransitionInstance = tim.GetLastTaskTransition(runner.AppName,
            //        runner.AppInstanceID, runner.ProcessGUID);
            //    var previousActivityInstance = tim.GetPreviousActivityInstance(runningNode, true,
            //        out hasGatewayNode).ToList()[0];

            //    //仅仅是回跳到上一步节点,即按SendBack方式处理
            //    if (previousActivityInstance.ActivityGUID == jumpActivityGUID)
            //    {
            //        rmins.BackwardContext.BackwardToTaskActivityInstance = previousActivityInstance;
            //        rmins.BackwardContext.BackwardToTargetTransitionGUID =
            //            hasGatewayNode == false ? lastTaskTransitionInstance.TransitionGUID : System.Guid.Empty;        //如果中间有Gateway节点,则没有直接相连的TransitonGUID

            //        rmins.BackwardContext.BackwardFromActivity = processModel.GetActivity(runningNode.ActivityGUID);
            //        rmins.BackwardContext.BackwardFromActivityInstance = runningNode;
            //        rmins.BackwardContext.BackwardTaskReciever = WfBackwardTaskReciever.Instance(
            //            previousActivityInstance.ActivityName,
            //            previousActivityInstance.EndedByUserID.Value,
            //            previousActivityInstance.EndedByUserName);

            //        rmins.AppRunner.NextActivityPerformers = ActivityResource.CreateNextActivityPerformers(
            //            previousActivityInstance.ActivityGUID,
            //            previousActivityInstance.EndedByUserID.Value,
            //            previousActivityInstance.EndedByUserName);
            //    }
            //    else
            //    {
            //        //回跳到早前节点
            //        var jumptoActivityInstance = jumpActivityInstanceList[0];
            //        if (jumptoActivityInstance.ActivityState != (short)ActivityStateEnum.Completed)
            //        {
            //            result.Status = WfExecutedStatus.Exception;
            //            result.Exception = WfJumpException.NotActivityBackCompleted;
            //            result.Message = string.Format("回跳到的节点不在完成状态,无法重新回跳!");

            //            return rmins;
            //        }

            //        rmins.BackwardContext.BackwardToTaskActivityInstance = jumptoActivityInstance;

            //        //判断两个节点是否有Transition的定义存在
            //        var transition = processModel.GetForwardTransition(runningNode.ActivityGUID, runner.JumpbackActivityGUID.Value);
            //        rmins.BackwardContext.BackwardToTargetTransitionGUID = transition != null ? transition.TransitionGUID : System.Guid.Empty;

            //        rmins.BackwardContext.BackwardFromActivity = processModel.GetActivity(runningNode.ActivityGUID);
            //        rmins.BackwardContext.BackwardFromActivityInstance = runningNode;
            //        rmins.BackwardContext.BackwardTaskReciever = WfBackwardTaskReciever.Instance(
            //            jumptoActivityInstance.ActivityName,
            //            jumptoActivityInstance.EndedByUserID.Value,
            //            jumptoActivityInstance.EndedByUserName);

            //        rmins.AppRunner.NextActivityPerformers = ActivityResource.CreateNextActivityPerformers(
            //            jumptoActivityInstance.ActivityGUID,
            //            jumptoActivityInstance.EndedByUserID.Value,
            //            jumptoActivityInstance.EndedByUserName);
            //    }
            //    //获取资源数据
            //    var activityResourceBack = new ActivityResource(rmins.AppRunner,
            //        rmins.AppRunner.NextActivityPerformers,
            //        runner.Conditions);
            //    rmins.ActivityResource = activityResourceBack;
            //}
            //else
            //{
            //    //跳转到从未执行过的节点上
            //    var activityResource = new ActivityResource(runner, runner.NextActivityPerformers, runner.Conditions);
            //    rmins.ActivityResource = activityResource;
            //    rmins.RunningActivityInstance = runningNode;
            //}
            #endregion

            //跳转到从未执行过的节点上
            var activityResource = new ActivityResource(runner, runner.NextActivityPerformers, runner.Conditions);
            rmins.ActivityResource        = activityResource;
            rmins.RunningActivityInstance = runningNode;

            return(rmins);
        }
        /// <summary>
        /// 退回操作
        /// </summary>
        /// <param name="runner">执行者</param>
        /// <param name="result">结果对象</param>
        /// <returns>运行时实例对象</returns>
        internal static WfRuntimeManager CreateRuntimeInstanceSendBack(WfAppRunner runner,
                                                                       ref WfExecutedResult result)
        {
            var rmins = new WfRuntimeManagerSendBack();

            rmins.WfExecutedResult = result = new WfExecutedResult();

            //没有指定退回节点信息
            if (runner.NextPerformerType != NextPerformerIntTypeEnum.Traced &&
                (runner.NextActivityPerformers == null || runner.NextActivityPerformers.Count == 0))
            {
                result.Status        = WfExecutedStatus.Exception;
                result.ExceptionType = WfExceptionType.Sendback_IsNull;
                result.Message       = LocalizeHelper.GetEngineMessage("wfruntimemanagerfactory.CreateRuntimeInstanceSendBack.null.error");

                return(rmins);
            }

            //先查找当前用户正在办理的运行节点
            var            aim         = new ActivityInstanceManager();
            TaskViewEntity taskView    = null;
            var            runningNode = aim.GetRunningNode(runner, out taskView);

            if (runningNode == null)
            {
                result.Status        = WfExecutedStatus.Exception;
                result.ExceptionType = WfExceptionType.Sendback_NotInRunning;
                result.Message       = LocalizeHelper.GetEngineMessage("wfruntimemanagerfactory.CreateRuntimeInstanceSendBack.nonerun.error");

                return(rmins);
            }

            if (aim.IsMineTask(runningNode, runner.UserID) == false)
            {
                result.Status        = WfExecutedStatus.Exception;
                result.ExceptionType = WfExceptionType.Sendback_NotMineTask;
                result.Message       = LocalizeHelper.GetEngineMessage("wfruntimemanagerfactory.CreateRuntimeInstanceSendBack.nonetask.error");
                return(rmins);
            }

            var activityType = EnumHelper.ParseEnum <ActivityTypeEnum>(runningNode.ActivityType.ToString());

            if (XPDLHelper.IsSimpleComponentNode(activityType) == false)
            {
                result.Status        = WfExecutedStatus.Exception;
                result.ExceptionType = WfExceptionType.Sendback_NotTaskNode;
                result.Message       = LocalizeHelper.GetEngineMessage("wfruntimemanagerfactory.CreateRuntimeInstanceSendBack.nottask.error");
                return(rmins);
            }

            //获取上一步节点信息
            var hasGatewayPassed     = false;
            var processInstance      = (new ProcessInstanceManager()).GetById(runningNode.ProcessInstanceID);
            var processModel         = ProcessModelFactory.Create(processInstance.ProcessGUID, processInstance.Version);
            var previousStepChecker  = new PreviousStepChecker();
            var previousActivityList = previousStepChecker.GetPreviousActivityList(runningNode, processModel, out hasGatewayPassed);

            //判断退回是否有效
            if (previousActivityList == null || previousActivityList.Count == 0)
            {
                result.Status        = WfExecutedStatus.Exception;
                result.ExceptionType = WfExceptionType.Sendback_IsNull;
                result.Message       = LocalizeHelper.GetEngineMessage("wfruntimemanagerfactory.CreateRuntimeInstanceSendBack.empty.error");
                return(rmins);
            }

            //前端用户指定退回步骤的模式
            if (runner.NextPerformerType != NextPerformerIntTypeEnum.Traced)
            {
                if (runner.NextActivityPerformers == null || runner.NextActivityPerformers.Count == 0)
                {
                    result.Status        = WfExecutedStatus.Exception;
                    result.ExceptionType = WfExceptionType.Sendback_IsNull;
                    result.Message       = LocalizeHelper.GetEngineMessage("wfruntimemanagerfactory.CreateRuntimeInstanceSendBack.noneperformer.error");

                    return(rmins);
                }

                //检查节点是否一致
                if (previousActivityList.Count == 1)
                {
                    var onlyActivityGUID = previousActivityList[0].ActivityGUID;
                    var isOnly           = true;
                    foreach (var step in runner.NextActivityPerformers)
                    {
                        if (step.Key != onlyActivityGUID)
                        {
                            isOnly = false;
                            break;
                        }
                    }

                    //存在不一致的退回节点
                    if (isOnly == false)
                    {
                        result.Status        = WfExecutedStatus.Exception;
                        result.ExceptionType = WfExceptionType.Sendback_IsTooManyPrevious;
                        result.Message       = LocalizeHelper.GetEngineMessage("wfruntimemanagerfactory.CreateRuntimeInstanceSendBack.notunique.error");

                        return(rmins);
                    }
                }
            }
            else
            {
                //Traced 用于直接返回上一步使用,测试模式
                var prevActivity  = previousActivityList[0];
                var performerList = PerformerBuilder.CreatePerformerList(runningNode.CreatedByUserID, runningNode.CreatedByUserName);
                runner.NextActivityPerformers = ActivityResource.CreateNextActivityPerformers(prevActivity.ActivityGUID, performerList);
            }

            //创建运行时
            rmins.TaskView = taskView;
            rmins.RunningActivityInstance = runningNode;
            rmins.ProcessInstanceID       = runningNode.ProcessInstanceID;
            rmins.ProcessInstance         = processInstance;
            rmins.ProcessModel            = processModel;

            rmins.AppRunner.AppName                = runner.AppName;
            rmins.AppRunner.AppInstanceID          = runner.AppInstanceID;
            rmins.AppRunner.UserID                 = runner.UserID;
            rmins.AppRunner.UserName               = runner.UserName;
            rmins.AppRunner.NextActivityPerformers = runner.NextActivityPerformers;

            //设置退回选项类
            var sendbackOperation = new SendBackOperation();

            sendbackOperation.BackwardType    = BackwardTypeEnum.Sendback;
            sendbackOperation.ProcessInstance = processInstance;
            sendbackOperation.BackwardFromActivityInstance = runningNode;
            sendbackOperation.HasGatewayPassed             = hasGatewayPassed;
            sendbackOperation.ActivityResource             = new ActivityResource(runner, rmins.AppRunner.NextActivityPerformers);
            sendbackOperation.ProcessModel             = processModel;
            sendbackOperation.IsCancellingBrothersNode = (runner.ControlParameterSheet != null &&
                                                          runner.ControlParameterSheet.IsCancellingBrothersNode == 1) ? true : false;

            rmins.SendBackOperation = sendbackOperation;

            return(rmins);
        }
Пример #28
0
 /// <summary>
 /// 创建任务执行上下文对象
 /// </summary>
 /// <param name="task"></param>
 /// <param name="processModel"></param>
 /// <param name="activityResource"></param>
 /// <returns></returns>
 internal static ActivityForwardContext CreateRunningContext(TaskViewEntity task,
                                                             ProcessModel processModel,
                                                             ActivityResource activityResource)
 {
     return(new ActivityForwardContext(task, processModel, activityResource));
 }
Пример #29
0
        /// <summary>
        /// 获取流程当前运行节点信息
        /// </summary>
        /// <param name="runner">执行者</param>
        /// <param name="taskView">任务视图</param>
        /// <returns>活动实例</returns>
        internal ActivityInstanceEntity GetRunningNode(WfAppRunner runner,
                                                       out TaskViewEntity taskView)
        {
            var appInstanceID = runner.AppInstanceID;
            var processGUID   = runner.ProcessGUID;
            var taskID        = runner.TaskID;

            taskView = null;
            ActivityInstanceEntity activityInstance = null;

            //如果流程在运行状态,则返回运行时信息
            var tm = new TaskManager();

            var aim = new ActivityInstanceManager();
            var activityInstanceList = aim.GetRunningActivityInstanceList(runner.AppInstanceID, runner.ProcessGUID).ToList();

            if ((activityInstanceList != null) && (activityInstanceList.Count == 1))
            {
                activityInstance = activityInstanceList[0];
                taskView         = tm.GetTaskOfMine(activityInstance.ID, runner.UserID);
            }
            else if (activityInstanceList.Count > 0)
            {
                if (runner.TaskID != null && runner.TaskID.Value != 0)
                {
                    taskView = tm.GetTaskView(taskID.Value);

                    foreach (var ai in activityInstanceList)
                    {
                        if (ai.ID == taskView.ActivityInstanceID)
                        {
                            activityInstance = ai;
                            break;
                        }
                    }

                    //判断是否有并行节点存在,如果有并行节点存在,取并行节点的主节点(并行会签)
                    if (activityInstance == null && activityInstanceList[0].MIHostActivityInstanceID != null)
                    {
                        var mainActivityInstanceID = activityInstanceList[0].MIHostActivityInstanceID;
                        activityInstance = aim.GetById(mainActivityInstanceID.Value);
                    }
                }
                else
                {
                    //并行模式处理
                    //根据当前执行者身份取出(他或她)要办理的活动实例(并行模式下有多个处于待办或运行状态的节点)
                    foreach (var ai in activityInstanceList)
                    {
                        if (ai.AssignedToUserIDs == runner.UserID)
                        {
                            activityInstance = ai;
                            break;
                        }
                    }

                    if (activityInstance != null)
                    {
                        //获取taskview
                        taskView = tm.GetTaskOfMine(activityInstance.ID, runner.UserID);
                    }
                    else
                    {
                        //当前用户的待办任务不唯一,抛出异常,需要TaskID唯一界定
                        var e = new WorkflowException("当前流程有多个运行节点,但没有TaskID传入,状态异常!");
                        LogManager.RecordLog("获取当前运行节点信息异常", LogEventType.Exception, LogPriority.Normal, null, e);
                        throw e;
                    }
                }
            }
            else
            {
                //当前没有运行状态的节点存在,流程不存在,或者已经结束或取消
                var e = new WorkflowException("当前流程没有运行节点,状态异常!");
                LogManager.RecordLog("获取当前运行节点信息异常", LogEventType.Exception, LogPriority.Normal, null, e);
                throw e;
            }
            return(activityInstance);
        }
Пример #30
0
        /// <summary>
        /// 根据应用获取流程下一步节点列表,包含角色用户
        /// </summary>
        /// <param name="resourceService">资源服务</param>
        /// <param name="runner">应用执行人</param>
        /// <param name="condition">条件</param>
        /// <returns>节点列表</returns>
        internal IList <NodeView> GetNextActivityRoleUserTree(IResourceService resourceService,
                                                              WfAppRunner runner,
                                                              IDictionary <string, string> condition = null)
        {
            //判断应用数据是否缺失
            if (string.IsNullOrEmpty(runner.AppInstanceID) ||
                string.IsNullOrEmpty(runner.ProcessGUID))
            {
                throw new WorkflowException(LocalizeHelper.GetEngineMessage("nextstepparser.getnextactivityroleusertree.error"));
            }

            //条件参数一致
            if (condition == null && runner.Conditions != null)
            {
                condition = runner.Conditions;
            }

            IList <NodeView> nextSteps    = new List <NodeView>();
            IProcessModel    processModel = ProcessModelFactory.Create(runner.ProcessGUID, runner.Version);

            using (var session = SessionFactory.CreateSession())
            {
                var pim = new ProcessInstanceManager();
                var processInstanceList = pim.GetProcessInstance(session.Connection,
                                                                 runner.AppInstanceID,
                                                                 runner.ProcessGUID,
                                                                 session.Transaction).ToList();
                var processInstanceEntity = EnumHelper.GetFirst <ProcessInstanceEntity>(processInstanceList);

                //判断流程是否创建还是已经运行
                if (processInstanceEntity != null &&
                    processInstanceEntity.ProcessState == (short)ProcessStateEnum.Running)
                {
                    //运行状态的流程实例
                    var            tm       = new TaskManager();
                    TaskViewEntity taskView = tm.GetTaskOfMine(session.Connection, runner, session.Transaction);

                    //获取下一步列表
                    nextSteps = processModel.GetNextActivityTree(taskView.ActivityGUID, condition);

                    foreach (var ns in nextSteps)
                    {
                        if (ns.ReceiverType == ReceiverTypeEnum.ProcessInitiator)       //下一步执行人为流程发起人
                        {
                            ns.Users = AppendUserList(ns.Users, pim.GetProcessInitiator(session.Connection,
                                                                                        taskView.ProcessInstanceID,
                                                                                        session.Transaction)); //获取流程发起人
                        }
                        else
                        {
                            var roleIDs = ns.Roles.Select(x => x.ID).ToArray();
                            if (roleIDs.Count() > 0)
                            {
                                ns.Users = resourceService.GetUserListByRoleReceiverType(roleIDs, runner.UserID, (int)ns.ReceiverType);     //增加转移前置过滤条件
                            }
                        }
                    }
                }
                else
                {
                    //流程准备启动,获取第一个办理节点的用户列表
                    var firstActivity = processModel.GetFirstActivity();
                    nextSteps = processModel.GetNextActivityTree(firstActivity.ActivityGUID,
                                                                 condition);

                    foreach (var ns in nextSteps)
                    {
                        var roleIDs = ns.Roles.Select(x => x.ID).ToArray();
                        ns.Users = resourceService.GetUserListByRoleReceiverType(roleIDs, runner.UserID, (int)ns.ReceiverType);     //增加转移前置过滤条件
                    }
                }
            }

            return(nextSteps);
        }