/// <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;
        }
        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;
        }
        /// <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;
        }
        /// <summary>
        /// 完成任务实例
        /// </summary>
        /// <param name="taskID"></param>
        /// <param name="activityResource"></param>
        /// <param name="session"></param>        
        internal bool CompleteWorkItem(TaskViewEntity taskView,
            ActivityResource activityResource,
            IDbSession session)
        {
            bool canContinueForwardCurrentNode = true;

            //流程强制拉取向前跳转时,没有运行人的任务实例
            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;

            //多实例会签和加签处理
            //先判断是否是会签和加签类型
            //主节点不为空时不发起加签可以正常运行
            var complexType = base.Linker.FromActivity.ActivityTypeDetail.ComplexType;
            if (complexType == ComplexTypeEnum.SignTogether
                || complexType == ComplexTypeEnum.SignForward && base.Linker.FromActivityInstance.MIHostActivityInstanceID != null)
            {
                //取出主节点信息
                var mainNodeIndex = base.Linker.FromActivityInstance.MIHostActivityInstanceID.Value;
                var mainActivityInstance = base.ActivityInstanceManager.GetById(mainNodeIndex);

                //取出处于多实例节点列表
                var sqList = base.ActivityInstanceManager.GetActivityMulitipleInstanceWithState(
                    mainNodeIndex,
                    base.Linker.FromActivityInstance.ProcessInstanceID,
                    (short)ActivityStateEnum.Suspended,
                    session).ToList<ActivityInstanceEntity>();

                //串行会签和并行会签的处理
                if (complexType == ComplexTypeEnum.SignTogether)
                {
                    if (base.Linker.FromActivity.ActivityTypeDetail.MergeType == MergeTypeEnum.Sequence)    //串行会签处理
                    {
                        short maxOrder = 0;
                        if (sqList != null && sqList.Count > 0)
                        {
                            //取出最大执行节点
                            maxOrder = (short)sqList.Max<ActivityInstanceEntity>(t => t.CompleteOrder.Value);
                        }
                        else
                        {
                            //最后一个执行节点
                            maxOrder = (short)base.Linker.FromActivityInstance.CompleteOrder.Value;
                        }

                        //串行会签通过率(按人数判断)
                        if (mainActivityInstance.CompleteOrder != null && mainActivityInstance.CompleteOrder <= maxOrder)
                        {
                            maxOrder = (short)mainActivityInstance.CompleteOrder;
                        }

                        if (base.Linker.FromActivityInstance.CompleteOrder < maxOrder)
                        {
                            //设置下一个任务进入准备状态
                            var currentNodeIndex = (short)base.Linker.FromActivityInstance.CompleteOrder.Value;
                            var nextActivityInstance = sqList[0];     //始终取第一条挂起实例
                            nextActivityInstance.ActivityState = (short)ActivityStateEnum.Ready;
                            base.ActivityInstanceManager.Update(nextActivityInstance, session);

                            canContinueForwardCurrentNode = false;
                            base.WfNodeMediatedResult.Feedback = WfNodeMediatedFeedback.ForwardToNextSequenceTask;
                        }
                        else if (base.Linker.FromActivityInstance.CompleteOrder == maxOrder)
                        {
                            //完成最后一个会签任务,会签主节点状态由挂起设置为准备状态
                            mainActivityInstance.ActivityState = (short)ActivityStateEnum.Completed;
                            base.ActivityInstanceManager.Update(mainActivityInstance, session);
                        }
                    }
                    else if (base.Linker.FromActivity.ActivityTypeDetail.MergeType == MergeTypeEnum.Parallel)   //并行会签处理
                    {
                        if (mainActivityInstance.CompleteOrder == null)//并行会签未设置通过率的判断
                            mainActivityInstance.CompleteOrder = 1;
                        var allCount = sqList.Count();
                        var completedCount = sqList.Where<ActivityInstanceEntity>(w => w.ActivityState == (short)ActivityStateEnum.Completed)
                            .ToList<ActivityInstanceEntity>()
                            .Count();
                        if ((completedCount * 0.01) / (allCount * 0.01) >= mainActivityInstance.CompleteOrder)
                        {
                            //如果超过约定的比例数,则执行下一步节点
                            mainActivityInstance.ActivityState = (short)ActivityStateEnum.Completed;
                            base.ActivityInstanceManager.Update(mainActivityInstance, session);
                        }
                        else
                        {
                            canContinueForwardCurrentNode = false;
                            base.WfNodeMediatedResult.Feedback = WfNodeMediatedFeedback.WaitingForCompletedMore;
                        }

                    }
                }
                else if (complexType == ComplexTypeEnum.SignForward)                            //加签的处理
                {
                    //判断加签是否全部完成,如果是,则流转到下一步,否则不能流转
                    var signforwardType = (SignForwardTypeEnum)Enum.Parse(typeof(SignForwardTypeEnum),
                        base.ActivityForwardContext.FromActivityInstance.SignForwardType.Value.ToString());

                    if (signforwardType == SignForwardTypeEnum.SignForwardBehind
                        || signforwardType == SignForwardTypeEnum.SignForwardBefore)
                    {
                        short maxOrder = 0;
                        if (sqList != null && sqList.Count > 0)
                        {
                            //取出最大执行节点
                            maxOrder = (short)sqList.Max<ActivityInstanceEntity>(t => t.CompleteOrder.Value);
                        }
                        else
                        {
                            //最后一个执行节点
                            maxOrder = (short)base.Linker.FromActivityInstance.CompleteOrder.Value;
                        }

                        //加签通过率
                        if (mainActivityInstance.CompleteOrder != null)
                        {
                            maxOrder = (short)mainActivityInstance.CompleteOrder;
                        }

                        if (base.Linker.FromActivityInstance.CompleteOrder < maxOrder)
                        {
                            //设置下一个节点进入等待办理状态
                            var currentNodeIndex = (short)base.Linker.FromActivityInstance.CompleteOrder.Value;
                            var nextActivityInstance = sqList[0];
                            nextActivityInstance.ActivityState = (short)ActivityStateEnum.Ready;
                            base.ActivityInstanceManager.Update(nextActivityInstance, session);

                            canContinueForwardCurrentNode = false;
                            base.WfNodeMediatedResult.Feedback = WfNodeMediatedFeedback.ForwardToNextSequenceTask;
                        }
                        else if (base.Linker.FromActivityInstance.CompleteOrder == maxOrder)
                        {
                            //最后一个节点执行完,主节点进入完成状态,整个流程向下执行
                            mainActivityInstance.ActivityState = (short)ActivityStateEnum.Completed;
                            base.ActivityInstanceManager.Update(mainActivityInstance, session);
                        }
                    }
                    else if (signforwardType == SignForwardTypeEnum.SignForwardParallel)
                    {
                        //并行加签,按照通过率来决定是否标识当前节点完成
                        var allCount = sqList.Count();
                        var completedCount = sqList.Where<ActivityInstanceEntity>(w => w.ActivityState == (short)ActivityStateEnum.Completed)
                            .ToList<ActivityInstanceEntity>()
                            .Count();

                        if ((completedCount * 0.01) / (allCount * 0.01) >= mainActivityInstance.CompleteOrder)
                        {
                            base.ActivityForwardContext.FromActivityInstance.ActivityState = (short)ActivityStateEnum.Completed;
                            mainActivityInstance.ActivityState = (short)ActivityStateEnum.Completed;
                            base.ActivityInstanceManager.Update(mainActivityInstance, base.Session);
                        }
                        else
                        {
                            canContinueForwardCurrentNode = false;
                            base.WfNodeMediatedResult.Feedback = WfNodeMediatedFeedback.WaitingForCompletedMore;
                        }
                    }
                }
            }
            return canContinueForwardCurrentNode;
        }
 /// <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);
 }
Пример #6
0
        /// <summary>
        /// 完成任务实例
        /// </summary>
        /// <param name="taskID"></param>
        /// <param name="activityResource"></param>
        /// <param name="session"></param>
        internal bool CompleteWorkItem(TaskViewEntity taskView,
            ActivityResource activityResource,
            IDbSession session)
        {
            bool canContinueForwardCurrentNode = true;

            //流程强制拉取向前跳转时,没有运行人的任务实例
            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;

            //先判断是否是多实例类型的任务
            if (base.Linker.FromActivity.ActivityTypeDetail.ComplexType == ComplexTypeEnum.MultipleInstance)
            {
                //取出主节点信息
                var mainNodeIndex = base.Linker.FromActivityInstance.MIHostActivityInstanceID.Value;
                var mainActivityInstance = base.ActivityInstanceManager.GetById(mainNodeIndex);

                //取出多实例节点列表
                var sqList = base.ActivityInstanceManager.GetActivityMulitipleInstance(
                    mainNodeIndex,
                    base.Linker.FromActivityInstance.ProcessInstanceID,
                    session).ToList<ActivityInstanceEntity>();

                if (sqList == null || sqList.Count == 0)
                {
                    throw new WfRuntimeException("会签主节点下没有多实例子节点,流程运行数据异常!");
                }

                if (base.Linker.FromActivity.ActivityTypeDetail.MergeType == MergeTypeEnum.Sequence)
                {
                    //取出最大执行节点
                    short maxOrder = (short)sqList.Max<ActivityInstanceEntity>(t => t.CompleteOrder.Value);

                    if (base.Linker.FromActivityInstance.CompleteOrder < maxOrder)
                    {
                        //设置下一个任务进入准备状态
                        var currentNodeIndex = (short)base.Linker.FromActivityInstance.CompleteOrder.Value;
                        var nextActivityInstance = sqList[currentNodeIndex];
                        nextActivityInstance.ActivityState = (short)ActivityStateEnum.Ready;
                        base.ActivityInstanceManager.Update(nextActivityInstance, session);

                        canContinueForwardCurrentNode = false;
                        base.WfNodeMediatedResult.Feedback = WfNodeMediatedFeedback.ForwardToNextSequenceTask;
                    }
                    else if (base.Linker.FromActivityInstance.CompleteOrder == maxOrder)
                    {
                        //完成最后一个会签任务,会签主节点状态由挂起设置为准备状态
                        mainActivityInstance.ActivityState = (short)ActivityStateEnum.Completed;
                        base.ActivityInstanceManager.Update(mainActivityInstance, session);
                    }
                }
                else if (base.Linker.FromActivity.ActivityTypeDetail.MergeType == MergeTypeEnum.Parallel)
                {
                    var allCount = sqList.Count();
                    var completedCount = sqList.Where<ActivityInstanceEntity>(w => w.ActivityState == (short)ActivityStateEnum.Completed)
                        .ToList<ActivityInstanceEntity>()
                        .Count();
                    if (completedCount / allCount >= mainActivityInstance.CompleteOrder)
                    {
                        //如果超过约定的比例数,则执行下一步节点
                        mainActivityInstance.ActivityState = (short)ActivityStateEnum.Completed;
                        base.ActivityInstanceManager.Update(mainActivityInstance, session);
                    }
                    else
                    {
                        canContinueForwardCurrentNode = false;
                        base.WfNodeMediatedResult.Feedback = WfNodeMediatedFeedback.WaitingForCompletedMore;
                    }
                }
            }
            return canContinueForwardCurrentNode;
        }