internal override void ExecuteInstanceImp(IDbSession session) { //创建新任务节点 var backMostPreviouslyActivityInstanceID = GetBackwardMostPreviouslyActivityInstanceID(); var nodeMediatorBackward = new NodeMediatorBackward(base.BackwardContext, session); nodeMediatorBackward.CreateBackwardActivityTaskTransitionInstance(base.BackwardContext.ProcessInstance, base.BackwardContext.BackwardFromActivityInstance, BackwardTypeEnum.Withdrawed, backMostPreviouslyActivityInstanceID, base.BackwardContext.BackwardToTargetTransitionGUID, TransitionTypeEnum.Withdrawed, TransitionFlyingTypeEnum.NotFlying, base.ActivityResource, session); //更新撤销节点的状态(从准备状态更新为撤销状态) var aim = new ActivityInstanceManager(); aim.Withdraw(base.BackwardContext.BackwardFromActivityInstance.ID, base.ActivityResource.AppRunner, session); //构造回调函数需要的数据 WfExecutedResult result = base.WfExecutedResult; result.BackwardTaskReciever = base.BackwardContext.BackwardTaskReciever; result.Status = WfExecutedStatus.Success; }
internal override void ExecuteInstanceImp(IDbSession session) { WfExecutedResult result = base.WfExecutedResult; //回跳类型的处理 if (base.IsBackward == true) { //创建新任务节点 var backMostPreviouslyActivityInstanceID = GetBackwardMostPreviouslyActivityInstanceID(); var nodeMediatorBackward = new NodeMediatorBackward(base.BackwardContext, session); nodeMediatorBackward.CreateBackwardActivityTaskTransitionInstance(base.BackwardContext.ProcessInstance, base.BackwardContext.BackwardFromActivityInstance, BackwardTypeEnum.Sendback, backMostPreviouslyActivityInstanceID, base.BackwardContext.BackwardToTargetTransitionGUID, TransitionTypeEnum.Sendback, TransitionFlyingTypeEnum.NotFlying, base.ActivityResource, session); //更新当前办理节点的状态(从准备或运行状态更新为退回状态) var aim = new ActivityInstanceManager(); aim.SendBack(base.BackwardContext.BackwardFromActivityInstance.ID, base.ActivityResource.AppRunner, session); //构造回调函数需要的数据 result.BackwardTaskReciever = base.BackwardContext.BackwardTaskReciever; result.Status = WfExecutedStatus.Success; } else { var jumpActivityGUID = base.AppRunner.NextActivityPerformers.First().Key; var jumpforwardActivity = base.ProcessModel.GetActivity(jumpActivityGUID); var proecessInstance = (new ProcessInstanceManager()).GetById(base.RunningActivityInstance.ProcessInstanceID); var jumpforwardExecutionContext = ActivityForwardContext.CreateJumpforwardContext(jumpforwardActivity, base.ProcessModel, proecessInstance, base.ActivityResource); NodeMediator mediator = NodeMediatorFactory.CreateNodeMediator(jumpforwardExecutionContext, session); mediator.Linker.FromActivityInstance = base.RunningActivityInstance; mediator.Linker.ToActivity = jumpforwardActivity; mediator.ExecuteWorkItem(); result.Status = WfExecutedStatus.Success; result.Message = mediator.GetNodeMediatedMessage(); } }
/// <summary> /// 获取一个流程实例下的所有活动实例 /// </summary> /// <param name="processInstanceID"></param> /// <returns></returns> public IList<ActivityInstanceEntity> GetActivityInstances(int processInstanceID) { var aim = new ActivityInstanceManager(); var session = SessionFactory.CreateSession(); try { return aim.GetActivityInstances(processInstanceID, session); } catch { throw; } finally { session.Dispose(); } }
/// <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; }
/// <summary> /// 多实例情况下(会签和加签)撤销处理 /// </summary> /// <param name="session"></param> internal override void ExecuteInstanceImp(IDbSession session) { var runningNode = BackwardContext.BackwardFromActivityInstance; //创建撤销到上一步的节点记录 var nodeMediatorBackward = new NodeMediatorBackward(base.BackwardContext, session); nodeMediatorBackward.CreateBackwardActivityTaskOfInnerMultipleInstance( base.BackwardContext.ProcessInstance, base.BackwardContext.BackwardToTaskActivityInstance, BackwardTypeEnum.WithdrawedOfMI, base.BackwardContext.BackwardFromActivityInstance.ID, base.ActivityResource, session); //置当前节点为撤销状态 var aim = new ActivityInstanceManager(); aim.Withdraw(runningNode.ID, base.ActivityResource.AppRunner, session); //创建新的一条待办状态的记录,用于下次执行 var newSuspendNode = aim.CreateActivityInstanceObject(runningNode); newSuspendNode.ActivityState = (short)ActivityStateEnum.Suspended; newSuspendNode.MIHostActivityInstanceID = runningNode.MIHostActivityInstanceID; newSuspendNode.CompleteOrder = runningNode.CompleteOrder; newSuspendNode.ComplexType = runningNode.ComplexType; newSuspendNode.SignForwardType = runningNode.SignForwardType; newSuspendNode.AssignedToUserIDs = runningNode.AssignedToUserIDs; newSuspendNode.AssignedToUserNames = runningNode.AssignedToUserNames; aim.Insert(newSuspendNode, session); //同时为此活动实例,创建新的任务 var tm = new TaskManager(); tm.Renew(base.BackwardContext.BackwardFromActivityInstance, newSuspendNode, base.AppRunner, session); //构造回调函数需要的数据 WfExecutedResult result = base.WfExecutedResult; result.BackwardTaskReciever = base.BackwardContext.BackwardTaskReciever; result.Status = WfExecutedStatus.Success; }
/// <summary> /// 撤销操作 /// 包括: /// 1) 正常流转 /// 2) 多实例节点流转 /// </summary> /// <param name="appName"></param> /// <param name="appInstanceID"></param> /// <param name="processGUID"></param> /// <param name="userID"></param> /// <param name="userName"></param> /// <param name="result"></param> /// <returns></returns> public static WfRuntimeManager CreateRuntimeInstanceWithdraw(WfAppRunner runner, ref WfExecutedResult result) { WfRuntimeManager rmins = null; //获取当前运行节点信息 var aim = new ActivityInstanceManager(); var runningNode = aim.GetRunningNode(runner); var processInstance = (new ProcessInstanceManager()).GetById(runningNode.ProcessInstanceID); var processModel = (new ProcessModel(processInstance.ProcessGUID, processInstance.Version)); if ((runningNode == null) || (runningNode.ActivityState != (short)ActivityStateEnum.Ready)) { result.Status = WfExecutedStatus.Exception; result.ExceptionType = WfExceptionType.Withdraw_NotInReady; result.Message = string.Format("要撤销的节点不在【待办】状态,已经无法撤销到上一步,当前状态: {0}", runningNode.ActivityState);//,节点状态:{0} runningNode.ActivityState 为空报错20150514 return rmins; } //判断是否是多实例节点 if (runningNode.MIHostActivityInstanceID != null && runningNode.MIHostActivityInstanceID.Value > 0) { //获取同一会签主节点下的前置节点信息 var previousActivityInstance = aim.GetPreviousOfMultipleInstanceNode( runningNode.MIHostActivityInstanceID.Value, runningNode.ID, runningNode.CompleteOrder.Value); if (previousActivityInstance != null && previousActivityInstance.EndedByUserID == runner.UserID) { //返回多实例节点下的处理模式 rmins = new WfRuntimeManagerWithdrawMI(); rmins.WfExecutedResult = result = new WfExecutedResult(); rmins.BackwardContext.ProcessInstance = processInstance; rmins.BackwardContext.BackwardToTaskActivity = processModel.GetActivity(previousActivityInstance.ActivityGUID); rmins.BackwardContext.BackwardToTaskActivityInstance = previousActivityInstance; rmins.BackwardContext.BackwardFromActivityInstance = runningNode; //准备状态的接收节点 rmins.BackwardContext.BackwardTaskReciever = WfBackwardTaskReciever.Instance( previousActivityInstance.ActivityName, previousActivityInstance.EndedByUserID, previousActivityInstance.EndedByUserName); //封装AppUser对象 rmins.AppRunner.AppName = runner.AppName; rmins.AppRunner.AppInstanceID = runner.AppInstanceID; rmins.AppRunner.UserID = runner.UserID; rmins.AppRunner.UserName = runner.UserName; rmins.AppRunner.NextActivityPerformers = ActivityResource.CreateNextActivityPerformers( previousActivityInstance.ActivityGUID, runner.UserID, runner.UserName); rmins.ActivityResource = new ActivityResource(runner, rmins.AppRunner.NextActivityPerformers); return rmins; } } //以下部分是处理非多实例节点的情况 //正常流转过程,无会签加签等特殊场景 rmins = new WfRuntimeManagerWithdraw(); rmins.WfExecutedResult = result = new WfExecutedResult(); //获取上一步流转节点信息,可能经过And, Or等路由节点 var tim = new TransitionInstanceManager(); bool hasGatewayNode = false; var lastActivityInstanceList = tim.GetPreviousActivityInstance(runningNode, false, out hasGatewayNode).ToList(); if (lastActivityInstanceList == null || lastActivityInstanceList.Count > 1) { result.Status = WfExecutedStatus.Exception; result.ExceptionType = WfExceptionType.Withdraw_HasTooMany; result.Message = "当前没有可以撤销回去的节点,或者有多个可以撤销回去的节点,无法选择!"; return rmins; } TransitionInstanceEntity lastTaskTransitionInstance = null; if (hasGatewayNode == false) { lastTaskTransitionInstance = tim.GetLastTaskTransition(runner.AppName, runner.AppInstanceID, runner.ProcessGUID); } var withdrawActivityInstance = lastActivityInstanceList[0]; if (withdrawActivityInstance.EndedByUserID != runner.UserID) { result.Status = WfExecutedStatus.Exception; result.ExceptionType = WfExceptionType.Withdraw_NotCreatedByMine; result.Message = string.Format("上一步节点的任务办理人跟当前登录用户不一致,无法撤销回上一步!节点办理人:{0}", withdrawActivityInstance.EndedByUserName); return rmins; } if (withdrawActivityInstance.ActivityType == (short)ActivityTypeEnum.EndNode) { result.Status = WfExecutedStatus.Exception; result.ExceptionType = WfExceptionType.Withdraw_PreviousIsEndNode; result.Message = "上一步是结束节点,无法撤销!"; return rmins; } if (withdrawActivityInstance.ComplexType != null && (withdrawActivityInstance.ComplexType.Value == (short)ComplexTypeEnum.SignTogether || withdrawActivityInstance.ComplexType.Value == (short) ComplexTypeEnum.SignForward)) { //上一步节点是会签(或加签)节点,当前节点是会签节点的下一节点 //会签节点是里程碑节点,不允许可以被撤销,即会签节点的最后一个办理人不能撤销已经完成的会签任务 //但是可以做【退回】处理,退回时整个会签节点重新执行,这样避免会签任务的单个人随意操作。 result.Status = WfExecutedStatus.Exception; result.ExceptionType = WfExceptionType.Withdraw_SignTogetherNotAllowed; result.Message = "会签(或加签)已经发送出去(里程碑节点),不能撤销;但可由下一步操作人退回,重新开始所有人的会签(或加签)!"; return rmins; } //准备撤销节点的相关信息 rmins.ProcessModel = processModel; rmins.AppRunner.ProcessGUID = runner.ProcessGUID; rmins.BackwardContext.ProcessInstance = processInstance; rmins.BackwardContext.BackwardToTargetTransitionGUID = hasGatewayNode == false ? lastTaskTransitionInstance.TransitionGUID : String.Empty; rmins.BackwardContext.BackwardToTaskActivity = processModel.GetActivity(withdrawActivityInstance.ActivityGUID); rmins.BackwardContext.BackwardToTaskActivityInstance = withdrawActivityInstance; rmins.BackwardContext.BackwardFromActivity = processModel.GetActivity(runningNode.ActivityGUID); rmins.BackwardContext.BackwardFromActivityInstance = runningNode; //准备状态的接收节点 rmins.BackwardContext.BackwardTaskReciever = WfBackwardTaskReciever.Instance( withdrawActivityInstance.ActivityName, withdrawActivityInstance.EndedByUserID, withdrawActivityInstance.EndedByUserName); //封装AppUser对象 rmins.AppRunner.AppName = runner.AppName; rmins.AppRunner.AppInstanceID = runner.AppInstanceID; rmins.AppRunner.UserID = runner.UserID; rmins.AppRunner.UserName = runner.UserName; rmins.AppRunner.NextActivityPerformers = ActivityResource.CreateNextActivityPerformers( withdrawActivityInstance.ActivityGUID, runner.UserID, runner.UserName); rmins.ActivityResource = new ActivityResource(runner, rmins.AppRunner.NextActivityPerformers); return rmins; }
/// <summary> /// 创建节点对象 /// </summary> /// <param name="processInstance">流程实例</param> protected ActivityInstanceEntity CreateActivityInstanceObject(ActivityEntity activity, ProcessInstanceEntity processInstance, WfAppRunner runner) { ActivityInstanceManager aim = new ActivityInstanceManager(); this.GatewayActivityInstance = aim.CreateActivityInstanceObject(processInstance.AppName, processInstance.AppInstanceID, processInstance.ID, activity, runner); return this.GatewayActivityInstance; }
/// <summary> /// 获取活动实例数据 /// </summary> /// <param name="activityInstanceID"></param> /// <returns></returns> public ActivityInstanceEntity GetActivityInstance(int activityInstanceID) { var aim = new ActivityInstanceManager(); var instance = aim.GetById(activityInstanceID); return instance; }
/// <summary> /// 获取已经完成的节点 /// </summary> /// <param name="taskID"></param> /// <returns></returns> public IList<NodeImage> GetActivityInstanceCompleted(int taskID) { IList<NodeImage> imageList = new List<NodeImage>(); var tm = new TaskManager(); var task = tm.GetTaskView(taskID); var am = new ActivityInstanceManager(); var list = am.GetCompletedActivityInstanceList(task.AppInstanceID, task.ProcessGUID); foreach (ActivityInstanceEntity a in list) { imageList.Add(new NodeImage { ID = a.ID, ActivityName = a.ActivityName }); } return imageList; }
/// <summary> /// 获取流程当前运行节点信息 /// </summary> /// <param name="runner"></param> /// <returns></returns> public ActivityInstanceEntity GetRunningNode(WfAppRunner runner) { var aim = new ActivityInstanceManager(); var entity = aim.GetRunningNode(runner); return entity; }
/// <summary> /// 判断是否是我的任务 /// </summary> /// <param name="entity"></param> /// <param name="userID"></param> /// <returns></returns> public bool IsMineTask(ActivityInstanceEntity entity, string userID) { var aim = new ActivityInstanceManager(); bool isMine = aim.IsMineTask(entity, userID); return isMine; }
/// <summary> /// 获取流程当前运行节点信息 /// </summary> /// <param name="appInstanceID"></param> /// <param name="processGUID"></param> /// <returns></returns> internal ActivityInstanceEntity GetRunningNodeOfMine(WfAppRunner runner) { var appInstanceID = runner.AppInstanceID; var processGUID = runner.ProcessGUID; var taskID = runner.TaskID; //如果流程在运行状态,则返回运行时信息 TaskViewEntity task = null; var aim = new ActivityInstanceManager(); var entity = GetRunningNodeOfMine(runner, out task); return entity; }
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="runningNode">当前节点</param> /// <param name="hasPassedGatewayNode">是否经由路由节点</param> /// <returns></returns> internal IList<ActivityInstanceEntity> GetPreviousActivityInstance(ActivityInstanceEntity runningNode, bool isSendback, out bool hasPassedGatewayNode) { hasPassedGatewayNode = false; var transitionList = GetTransitionInstanceList(runningNode.AppInstanceID, runningNode.ProcessGUID, runningNode.ProcessInstanceID).ToList(); var backSrcActivityInstanceId = 0; if (isSendback == true && runningNode.BackSrcActivityInstanceID != null) { //节点时曾经发生退回的节点 backSrcActivityInstanceId = runningNode.BackSrcActivityInstanceID.Value; } else backSrcActivityInstanceId = runningNode.ID; var aim = new ActivityInstanceManager(); var runningTransitionList = transitionList .Where(o => o.ToActivityInstanceID == backSrcActivityInstanceId) .ToList(); IList<ActivityInstanceEntity> previousActivityInstanceList = new List<ActivityInstanceEntity>(); foreach (var entity in runningTransitionList) { //如果是逻辑节点,则继续查找 if (entity.FromActivityType == (short)ActivityTypeEnum.GatewayNode) { GetPreviousOfGatewayActivityInstance(transitionList, entity.FromActivityInstanceID, previousActivityInstanceList); hasPassedGatewayNode = true; } else { previousActivityInstanceList.Add(aim.GetById(entity.FromActivityInstanceID)); } } return previousActivityInstanceList; }
/// <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; }
/// <summary> /// 撤销操作 /// </summary> /// <param name="appName"></param> /// <param name="appInstanceID"></param> /// <param name="processGUID"></param> /// <param name="userID"></param> /// <param name="userName"></param> /// <param name="result"></param> /// <returns></returns> public static WfRuntimeManager CreateRuntimeInstanceWithdraw(WfAppRunner runner, ref WfExecutedResult result) { //获取当前运行节点信息 var rmins = new WfRuntimeManagerWithdraw(); rmins.WfExecutedResult = result = new WfExecutedResult(); var aim = new ActivityInstanceManager(); var runningNode = aim.GetRunningNodeOfMine(runner); if ((runningNode == null) || (runningNode.ActivityState != (short)ActivityStateEnum.Ready)) { result.Status = WfExecutedStatus.Exception; result.ExceptionType = WfExceptionType.Withdraw_NotInReady; result.Message = string.Format("要撤销的节点不在【待办】状态,已经无法撤销到上一步,节点状态:{0}", runningNode.ActivityState); } //获取上一步流转节点信息,可能经过And, Or等路由节点 var tim = new TransitionInstanceManager(); bool hasGatewayNode = false; var lastActivityInstanceList = tim.GetPreviousActivityInstance(runningNode, false, out hasGatewayNode).ToList(); if (lastActivityInstanceList == null || lastActivityInstanceList.Count > 1) { result.Status = WfExecutedStatus.Exception; result.ExceptionType = WfExceptionType.Withdraw_HasTooMany; result.Message = "当前没有可以撤销回去的节点,或者有多个可以撤销回去的节点,无法选择!"; return rmins; } TransitionInstanceEntity lastTaskTransitionInstance = null; if (hasGatewayNode == false) { lastTaskTransitionInstance = tim.GetLastTaskTransition(runner.AppName, runner.AppInstanceID, runner.ProcessGUID); } var withdrawActivityInstance = lastActivityInstanceList[0]; if (withdrawActivityInstance.EndedByUserID != runner.UserID) { result.Status = WfExecutedStatus.Exception; result.ExceptionType = WfExceptionType.Withdraw_NotCreatedByMine; result.Message = string.Format("上一步节点的任务办理人跟当前登录用户不一致,无法撤销回上一步!节点办理人:{0}", withdrawActivityInstance.EndedByUserName); return rmins; } if (withdrawActivityInstance.ActivityType == (short)ActivityTypeEnum.EndNode) { result.Status = WfExecutedStatus.Exception; result.ExceptionType = WfExceptionType.Withdraw_PreviousIsEndNode; result.Message = "上一步是结束节点,无法撤销!"; return rmins; } //准备撤销节点的相关信息 var processModel = (new ProcessModel(runner.ProcessGUID)); rmins.ProcessModel = processModel; rmins.AppRunner.ProcessGUID = runner.ProcessGUID; rmins.BackwardContext.ProcessInstance = (new ProcessInstanceManager()).GetById(runningNode.ProcessInstanceID); rmins.BackwardContext.BackwardToTargetTransitionGUID = hasGatewayNode == false ? lastTaskTransitionInstance.TransitionGUID : String.Empty; rmins.BackwardContext.BackwardToTaskActivity = processModel.GetActivity(withdrawActivityInstance.ActivityGUID); rmins.BackwardContext.BackwardToTaskActivityInstance = withdrawActivityInstance; rmins.BackwardContext.BackwardFromActivity = processModel.GetActivity(runningNode.ActivityGUID); rmins.BackwardContext.BackwardFromActivityInstance = runningNode; //准备状态的接收节点 rmins.BackwardContext.BackwardTaskReciever = WfBackwardTaskReciever.Instance( withdrawActivityInstance.ActivityName, withdrawActivityInstance.EndedByUserID, withdrawActivityInstance.EndedByUserName); //封装AppUser对象 rmins.AppRunner.AppName = runner.AppName; rmins.AppRunner.AppInstanceID = runner.AppInstanceID; rmins.AppRunner.UserID = runner.UserID; rmins.AppRunner.UserName = runner.UserName; rmins.AppRunner.NextActivityPerformers = ActivityResource.CreateNextActivityPerformers( withdrawActivityInstance.ActivityGUID, runner.UserID, runner.UserName); rmins.ActivityResource = new ActivityResource(runner, rmins.AppRunner.NextActivityPerformers); return rmins; }
/// <summary> /// 退回操作 /// </summary> /// <param name="appName"></param> /// <param name="appInstanceID"></param> /// <param name="processGUID"></param> /// <param name="userID"></param> /// <param name="userName"></param> /// <param name="result"></param> /// <returns></returns> public static WfRuntimeManager CreateRuntimeInstanceSendBack(WfAppRunner runner, ref WfExecutedResult result) { //检查当前运行节点信息 var rmins = new WfRuntimeManagerSendBack(); rmins.WfExecutedResult = result = new WfExecutedResult(); var aim = new ActivityInstanceManager(); var runningNode = aim.GetRunningNodeOfMine(runner); if (runningNode.ActivityType != (short)ActivityTypeEnum.TaskNode) { result.Status = WfExecutedStatus.Exception; result.ExceptionType = WfExceptionType.Sendback_NotTaskNode; result.Message = "当前节点不是任务节点,无法退回上一步节点!"; return rmins; } if (!(runningNode.ActivityState == (short)ActivityStateEnum.Ready || runningNode.ActivityState == (short)ActivityStateEnum.Running)) { result.Status = WfExecutedStatus.Exception; result.ExceptionType = WfExceptionType.Sendback_NotInRunning; result.Message = string.Format("当前节点的状态不在运行状态,无法退回上一步节点!当前节点状态:{0}", runningNode.ActivityState); return rmins; } if (aim.IsMineTask(runningNode, runner.UserID) == false) { result.Status = WfExecutedStatus.Exception; result.ExceptionType = WfExceptionType.Sendback_NotMineTask; result.Message = "不是登录用户的任务,无法退回!"; return rmins; } var tim = new TransitionInstanceManager(); var lastTaskTransitionInstance = tim.GetLastTaskTransition(runner.AppName, runner.AppInstanceID, runner.ProcessGUID); if (lastTaskTransitionInstance.TransitionType == (short)TransitionTypeEnum.Loop) { result.Status = WfExecutedStatus.Exception; result.ExceptionType = WfExceptionType.Sendback_IsLoopNode; result.Message = "当前流转是自循环,无需退回!"; return rmins; } //设置退回节点的相关信息 bool hasGatewayNode = false; var sendbackToActivityInstance = tim.GetPreviousActivityInstance(runningNode, true, out hasGatewayNode).ToList()[0]; if (sendbackToActivityInstance.ActivityType == (short)ActivityTypeEnum.StartNode) { result.Status = WfExecutedStatus.Exception; result.ExceptionType = WfExceptionType.Sendback_PreviousIsStartNode; result.Message = "上一步是开始节点,无需退回!"; return rmins; } var processModel = (new ProcessModel(runner.ProcessGUID)); rmins.ProcessModel = processModel; rmins.BackwardContext.ProcessInstance = (new ProcessInstanceManager()).GetById(lastTaskTransitionInstance.ProcessInstanceID); rmins.BackwardContext.BackwardToTaskActivity = processModel.GetActivity(sendbackToActivityInstance.ActivityGUID); rmins.BackwardContext.BackwardToTaskActivityInstance = sendbackToActivityInstance; rmins.BackwardContext.BackwardToTargetTransitionGUID = hasGatewayNode == false ? lastTaskTransitionInstance.TransitionGUID : String.Empty; //如果中间有Gateway节点,则没有直接相连的TransitonGUID rmins.BackwardContext.BackwardFromActivity = processModel.GetActivity(runningNode.ActivityGUID); rmins.BackwardContext.BackwardFromActivityInstance = runningNode; rmins.BackwardContext.BackwardTaskReciever = WfBackwardTaskReciever.Instance(sendbackToActivityInstance.ActivityName, sendbackToActivityInstance.EndedByUserID, sendbackToActivityInstance.EndedByUserName); //封装AppUser对象 rmins.AppRunner.AppName = runner.AppName; rmins.AppRunner.AppInstanceID = runner.AppInstanceID; rmins.AppRunner.ProcessGUID = runner.ProcessGUID; rmins.AppRunner.UserID = runner.UserID; rmins.AppRunner.UserName = runner.UserName; rmins.AppRunner.NextActivityPerformers = ActivityResource.CreateNextActivityPerformers(sendbackToActivityInstance.ActivityGUID, sendbackToActivityInstance.EndedByUserID, sendbackToActivityInstance.EndedByUserName); rmins.ActivityResource = new ActivityResource(runner, rmins.AppRunner.NextActivityPerformers); return rmins; }
/// <summary> /// 流程返签,先检查约束条件,然后调用wfruntimeinstance执行 /// </summary> /// <param name="appName"></param> /// <param name="appInstanceID"></param> /// <param name="processGUID"></param> /// <param name="userID"></param> /// <param name="userName"></param> /// <returns></returns> public static WfRuntimeManager CreateRuntimeInstanceReverse(WfAppRunner runner, ref WfExecutedResult result) { var rmins = new WfRuntimeManagerReverse(); rmins.WfExecutedResult = result = new WfExecutedResult(); var pim = new ProcessInstanceManager(); var processInstance = pim.GetProcessInstanceLatest(runner.AppName, runner.AppInstanceID, runner.ProcessGUID); if (processInstance == null || processInstance.ProcessState != (short)ProcessStateEnum.Completed) { result.Status = WfExecutedStatus.Exception; result.ExceptionType = WfExceptionType.Reverse_NotInCompleted; result.Message = string.Format("当前应用:{0},实例ID:{1}, 没有完成的流程实例,无法让流程重新运行!", runner.AppName, runner.AppInstanceID); return rmins; } var tim = new TransitionInstanceManager(); var endTransitionInstance = tim.GetEndTransition(runner.AppName, runner.AppInstanceID, runner.ProcessGUID); var processModel = new ProcessModel(runner.ProcessGUID); var endActivity = processModel.GetActivity(endTransitionInstance.ToActivityGUID); var aim = new ActivityInstanceManager(); var endActivityInstance = aim.GetById(endTransitionInstance.ToActivityInstanceID); bool hasGatewayNode = false; var lastTaskActivityInstance = tim.GetPreviousActivityInstance(endActivityInstance, false, out hasGatewayNode).ToList()[0]; var lastTaskActivity = processModel.GetActivity(lastTaskActivityInstance.ActivityGUID); //封装返签结束点之前办理节点的任务接收人 rmins.AppRunner.NextActivityPerformers = ActivityResource.CreateNextActivityPerformers(lastTaskActivityInstance.ActivityGUID, lastTaskActivityInstance.EndedByUserID, lastTaskActivityInstance.EndedByUserName); rmins.ActivityResource = new ActivityResource(runner, rmins.AppRunner.NextActivityPerformers); rmins.AppRunner.AppName = runner.AppName; rmins.AppRunner.AppInstanceID = runner.AppInstanceID; rmins.AppRunner.ProcessGUID = runner.ProcessGUID; rmins.AppRunner.UserID = runner.UserID; rmins.AppRunner.UserName = runner.UserName; rmins.BackwardContext.ProcessInstance = processInstance; rmins.BackwardContext.BackwardToTaskActivity = lastTaskActivity; rmins.BackwardContext.BackwardToTaskActivityInstance = lastTaskActivityInstance; rmins.BackwardContext.BackwardToTargetTransitionGUID = hasGatewayNode == false ? endTransitionInstance.TransitionGUID : String.Empty; rmins.BackwardContext.BackwardFromActivity = endActivity; rmins.BackwardContext.BackwardFromActivityInstance = endActivityInstance; rmins.BackwardContext.BackwardTaskReciever = WfBackwardTaskReciever.Instance(lastTaskActivityInstance.ActivityName, lastTaskActivityInstance.EndedByUserID, lastTaskActivityInstance.EndedByUserName); return rmins; }
/// <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.GetRunningNodeOfMine(runner, out taskView); //传递runner变量 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 = (new ProcessModel(runner.ProcessGUID)); 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> /// <returns></returns> public IList<NodeImage> GetActivityInstanceCompleted(WfAppRunner runner) { IList<NodeImage> imageList = new List<NodeImage>(); var am = new ActivityInstanceManager(); var list = am.GetCompletedActivityInstanceList(runner.AppInstanceID, runner.ProcessGUID); foreach (ActivityInstanceEntity a in list) { imageList.Add(new NodeImage { ID = a.ID, ActivityName = a.ActivityName }); } return imageList; }
private void GetPreviousOfGatewayActivityInstance(IList<TransitionInstanceEntity> transitionList, int toActivityInstanceID, IList<ActivityInstanceEntity> previousActivityInstanceList) { var previousTransitionList = transitionList .Where(o => o.ToActivityInstanceID == toActivityInstanceID) .ToList(); var aim = new ActivityInstanceManager(); foreach (var entity in previousTransitionList) { if (entity.FromActivityType == (short)ActivityTypeEnum.TaskNode || entity.FromActivityType == (short)ActivityTypeEnum.PluginNode || entity.FromActivityType == (short)ActivityTypeEnum.ScriptNode || entity.FromActivityType == (short)ActivityTypeEnum.StartNode) { previousActivityInstanceList.Add(aim.GetById(entity.FromActivityInstanceID)); } else if (entity.FromActivityType == (short)ActivityTypeEnum.GatewayNode) { GetPreviousOfGatewayActivityInstance(transitionList, entity.FromActivityInstanceID, previousActivityInstanceList); } } }
/// <summary> /// 创建新的委托任务 /// </summary> /// <param name="entity"></param> internal void Entrust(TaskEntrustedEntity entity) { var session = SessionFactory.CreateSession(); try { //获取活动实例信息 session.BeginTrans(); var am = new ActivityInstanceManager(); var activityInstance = am.GetByTask(entity.ID, session); if (activityInstance.ActivityState != (short)ActivityStateEnum.Ready && activityInstance.ActivityState != (short)ActivityStateEnum.Running) { throw new WorkflowException("没有可以委托的任务,因为活动实例的状态不在运行状态!"); } //更新AssignedToUsers 信息 activityInstance.AssignedToUsers = activityInstance.AssignedToUsers + "," + entity.EntrustToUserID; am.Update(activityInstance, session); //插入委托任务 Insert(activityInstance, entity.EntrustToUserID, entity.EntrustToUserName, entity.RunnerID, entity.RunnerName, session); session.Commit(); } catch(System.Exception e) { session.Rollback(); throw new WorkflowException("任务委托失败,请查看异常信息!", e); } finally { session.Dispose(); } }