/// <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); }
/// <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; }