/// <summary> /// 从消息视图中封装运行者对象 /// </summary> /// <param name="msgRunnerView">消息视图</param> /// <returns>运行者对象</returns> private WfAppRunner GetRunnerFromMessagExchange(MessageRunnerView msgRunnerView) { var runner = new WfAppRunner(); runner.ProcessGUID = msgRunnerView.ProcessEntity.ProcessGUID; runner.Version = msgRunnerView.ProcessEntity.Version; runner.ProcessCode = msgRunnerView.ProcessEntity.ProcessCode; runner.AppName = msgRunnerView.WfAppRunner.AppName; runner.AppInstanceID = msgRunnerView.WfAppRunner.AppInstanceID; runner.AppInstanceCode = msgRunnerView.WfAppRunner.AppInstanceCode; runner.UserID = msgRunnerView.WfAppRunner.UserID; runner.UserName = msgRunnerView.WfAppRunner.UserName; var query = new TaskQuery { ProcessGUID = runner.ProcessGUID, AppInstanceID = runner.AppInstanceID }; var wfService = new WorkflowService(); var activityInstanceList = wfService.GetRunningActivityInstance(query); if (activityInstanceList.Count == 1) { var activityInstance = activityInstanceList[0]; runner.NextActivityPerformers = NextStepUtility.DeserializeNextStepPerformers(activityInstance.NextStepPerformers); } return(runner); }
/// <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); }
/// <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="processInstance">流程实例</param> /// <param name="transitionGUID">转移GUID</param> /// <param name="fromActivity">起始活动</param> /// <param name="fromActivityInstance">起始活动实例</param> /// <param name="runner">运行者</param> /// <param name="session">会话</param> /// <returns>网关执行结果</returns> public NodeAutoExecutedResult CompleteAutomaticlly(ProcessInstanceEntity processInstance, string transitionGUID, ActivityEntity fromActivity, ActivityInstanceEntity fromActivityInstance, WfAppRunner runner, IDbSession session) { //检查是否有运行中的合并节点实例 ActivityInstanceEntity joinNode = base.ActivityInstanceManager.GetActivityRunning( processInstance.ID, base.GatewayActivity.ActivityGUID, session); int tokensRequired = 0; int tokensHad = 0; if (joinNode == null) { var joinActivityInstance = base.CreateActivityInstanceObject(base.GatewayActivity, processInstance, runner); //计算总需要的Token数目 joinActivityInstance.TokensRequired = GetTokensRequired(processInstance.AppInstanceID, processInstance.ID, base.GatewayActivity); joinActivityInstance.TokensHad = 1; tokensRequired = joinActivityInstance.TokensRequired; //进入运行状态 joinActivityInstance.ActivityState = (short)ActivityStateEnum.Running; joinActivityInstance.GatewayDirectionTypeID = (short)GatewayDirectionEnum.AndJoinMI; //写入默认第一次的预选步骤用户列表 joinActivityInstance.NextStepPerformers = NextStepUtility.SerializeNextStepPerformers(runner.NextActivityPerformers); base.InsertActivityInstance(joinActivityInstance, session); base.InsertTransitionInstance(processInstance, transitionGUID, fromActivityInstance, joinActivityInstance, TransitionTypeEnum.Forward, TransitionFlyingTypeEnum.NotFlying, runner, session); } else { //更新节点的活动实例属性 base.GatewayActivityInstance = joinNode; tokensRequired = base.GatewayActivityInstance.TokensRequired; tokensHad = base.GatewayActivityInstance.TokensHad; //更新Token数目 base.ActivityInstanceManager.IncreaseTokensHad(base.GatewayActivityInstance.ID, runner, session); base.InsertTransitionInstance(processInstance, transitionGUID, fromActivityInstance, joinNode, TransitionTypeEnum.Forward, TransitionFlyingTypeEnum.NotFlying, runner, session); } if ((tokensHad + 1) == tokensRequired) { //如果达到完成节点的Token数,则设置该节点状态为完成 base.CompleteActivityInstance(base.GatewayActivityInstance.ID, runner, session); base.GatewayActivityInstance.ActivityState = (short)ActivityStateEnum.Completed; } NodeAutoExecutedResult result = NodeAutoExecutedResult.CreateGatewayExecutedResult( NodeAutoExecutedStatus.Successed); return(result); }
/// <summary> /// EOrJoin合并时的节点完成方法 /// 内部执行逻辑 /// </summary> /// <param name="processInstance">流程实例</param> /// <param name="transitionGUID">转移GUID</param> /// <param name="fromActivity">起始活动</param> /// <param name="fromActivityInstance">起始活动实例</param> /// <param name="tokensCountRequired">合并要求的Token数目</param> /// <param name="runner">运行者</param> /// <param name="session">会话</param> private NodeAutoExecutedResult CompleteAutomaticallyInternal(ProcessInstanceEntity processInstance, string transitionGUID, ActivityEntity fromActivity, ActivityInstanceEntity fromActivityInstance, int tokensCountRequired, WfAppRunner runner, IDbSession session) { NodeAutoExecutedResult result = NodeAutoExecutedResult.CreateGatewayExecutedResult(NodeAutoExecutedStatus.Unknown); //当前执行的分支就是强制分支 //检查是否有运行中的合并节点实例 ActivityInstanceEntity joinNode = base.ActivityInstanceManager.GetActivityRunning( processInstance.ID, base.GatewayActivity.ActivityGUID, session);; if (joinNode == null) { //第一个分支首次运行 joinNode = base.CreateActivityInstanceObject(base.GatewayActivity, processInstance, runner); //计算总需要的Token数目 joinNode.TokensRequired = tokensCountRequired; joinNode.TokensHad = 1; //进入运行状态 joinNode.ActivityState = (short)ActivityStateEnum.Running; joinNode.GatewayDirectionTypeID = (short)GatewayDirectionEnum.OrJoin; //写入默认第一次的预选步骤用户列表 joinNode.NextStepPerformers = NextStepUtility.SerializeNextStepPerformers(runner.NextActivityPerformers); base.InsertActivityInstance(joinNode, session); base.InsertTransitionInstance(processInstance, transitionGUID, fromActivityInstance, joinNode, TransitionTypeEnum.Forward, TransitionFlyingTypeEnum.NotFlying, runner, session); } else { //更新节点的活动实例属性 joinNode.TokensHad += 1; base.GatewayActivityInstance = joinNode; //更新Token数目 base.ActivityInstanceManager.IncreaseTokensHad(base.GatewayActivityInstance.ID, runner, session); base.InsertTransitionInstance(processInstance, transitionGUID, fromActivityInstance, joinNode, TransitionTypeEnum.Forward, TransitionFlyingTypeEnum.NotFlying, runner, session); } //判断是否到达合并节点的通过Token数目要求 if (joinNode.TokensHad == joinNode.TokensRequired) { //如果达到完成节点的Token数,则设置该节点状态为完成 base.CompleteActivityInstance(base.GatewayActivityInstance.ID, runner, session); base.GatewayActivityInstance.ActivityState = (short)ActivityStateEnum.Completed; //更新其它分支上的待办节点为阻止状态(CanRenewInstance = 0) base.ActivityInstanceManager.UpdateActivityInstanceBlockedBetweenSplitJoin(base.GatewayActivity, base.GatewayActivityInstance, base.ProcessModel, session); result = NodeAutoExecutedResult.CreateGatewayExecutedResult(NodeAutoExecutedStatus.Successed); } else if (joinNode.TokensHad < joinNode.TokensRequired) { result = NodeAutoExecutedResult.CreateGatewayExecutedResult(NodeAutoExecutedStatus.WaitingForOthersJoin); } return(result); }
/// <summary> /// 完成任务实例 /// </summary> /// <param name="taskID">任务视图</param> /// <param name="activityResource">活动资源</param> /// <param name="session">会话</param> internal bool CompleteWorkItem(int?taskID, ActivityResource activityResource, IDbSession session) { bool canContinueForwardCurrentNode = true; WfAppRunner runner = new WfAppRunner { UserID = activityResource.AppRunner.UserID, //避免taskview为空 UserName = activityResource.AppRunner.UserName }; //流程强制拉取向前跳转时,没有运行人的任务实例 if (taskID != null) { //完成本任务,返回任务已经转移到下一个会签任务,不继续执行其它节点 base.TaskManager.Complete(taskID.Value, 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); //串行会签和并行会签的处理 if (complexType == ComplexTypeEnum.SignTogether) { if (base.Linker.FromActivity.ActivityTypeDetail.MergeType == MergeTypeEnum.Sequence) //串行会签处理 { //取出处于多实例节点列表 var sqList = base.ActivityInstanceManager.GetActivityMulitipleInstanceWithStateBatch(mainActivityInstance.ProcessInstanceID, mainActivityInstance.ID, (short)ActivityStateEnum.Suspended, session).ToList(); 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.CompareType == (short)CompareTypeEnum.Count || mainActivityInstance.CompareType == null) { //串行会签通过率(按人数判断) 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); //更新主节点的执行人员列表 mainActivityInstance.NextStepPerformers = NextStepUtility.SerializeNextStepPerformers( base.ActivityForwardContext.ActivityResource.AppRunner.NextActivityPerformers); base.ActivityInstanceManager.Update(mainActivityInstance, 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); //更新未办理完成节点状态为取消状态 base.ActivityInstanceManager.CancelUnCompletedMultipleInstance(mainActivityInstance.ID, session, runner); } } else { if (mainActivityInstance.CompleteOrder == null || mainActivityInstance.CompleteOrder > 1)//并行会签未设置通过率的判断 { mainActivityInstance.CompleteOrder = 1; } if ((base.Linker.FromActivityInstance.CompleteOrder * 0.01) / (maxOrder * 0.01) >= mainActivityInstance.CompleteOrder) { //完成最后一个会签任务,会签主节点状态由挂起设置为完成状态 mainActivityInstance.ActivityState = (short)ActivityStateEnum.Completed; base.ActivityInstanceManager.Update(mainActivityInstance, session); //更新未办理完成节点状态为取消状态 base.ActivityInstanceManager.CancelUnCompletedMultipleInstance(mainActivityInstance.ID, session, runner); } else { //设置下一个任务进入准备状态 var currentNodeIndex = (short)base.Linker.FromActivityInstance.CompleteOrder.Value; var nextActivityInstance = sqList[0]; //始终取第一条挂起实例 nextActivityInstance.ActivityState = (short)ActivityStateEnum.Ready; base.ActivityInstanceManager.Update(nextActivityInstance, session); //更新主节点的执行人员列表 mainActivityInstance.NextStepPerformers = NextStepUtility.SerializeNextStepPerformers( base.ActivityForwardContext.ActivityResource.AppRunner.NextActivityPerformers); base.ActivityInstanceManager.Update(mainActivityInstance, session); canContinueForwardCurrentNode = false; base.WfNodeMediatedResult.Feedback = WfNodeMediatedFeedback.ForwardToNextSequenceTask; } } } else if (base.Linker.FromActivity.ActivityTypeDetail.MergeType == MergeTypeEnum.Parallel) //并行会签处理 { //取出处于多实例节点列表 var sqList = base.ActivityInstanceManager.GetActivityMulitipleInstanceWithStateBatch(mainActivityInstance.ProcessInstanceID, mainActivityInstance.ID, null, session); var allCount = sqList.Where(x => x.ActivityState != (short)ActivityStateEnum.Withdrawed && x.ActivityState != (short)ActivityStateEnum.Sendbacked).ToList().Count(); var completedCount = sqList.Where <ActivityInstanceEntity>(w => w.ActivityState == (short)ActivityStateEnum.Completed) .ToList <ActivityInstanceEntity>() .Count(); if (mainActivityInstance.CompareType == null || mainActivityInstance.CompareType == (short)CompareTypeEnum.Percentage) { if (mainActivityInstance.CompleteOrder == null || mainActivityInstance.CompleteOrder > 1)//并行会签未设置通过率的判断 { mainActivityInstance.CompleteOrder = 1; } if ((completedCount * 0.01) / (allCount * 0.01) >= mainActivityInstance.CompleteOrder) { //如果超过约定的比例数,则执行下一步节点 mainActivityInstance.ActivityState = (short)ActivityStateEnum.Completed; base.ActivityInstanceManager.Update(mainActivityInstance, session); //更新未办理完成节点状态为取消状态 base.ActivityInstanceManager.CancelUnCompletedMultipleInstance(mainActivityInstance.ID, session, runner); } else { //更新主节点的执行人员列表 mainActivityInstance.NextStepPerformers = NextStepUtility.SerializeNextStepPerformers( base.ActivityForwardContext.ActivityResource.AppRunner.NextActivityPerformers); base.ActivityInstanceManager.Update(mainActivityInstance, session); canContinueForwardCurrentNode = false; base.WfNodeMediatedResult.Feedback = WfNodeMediatedFeedback.WaitingForCompletedMore; } } else { //串行会签通过率(按人数判断) if (mainActivityInstance.CompleteOrder != null && mainActivityInstance.CompleteOrder > allCount) { mainActivityInstance.CompleteOrder = allCount; } if (mainActivityInstance.CompleteOrder > completedCount) { //更新主节点的执行人员列表 mainActivityInstance.NextStepPerformers = NextStepUtility.SerializeNextStepPerformers( base.ActivityForwardContext.ActivityResource.AppRunner.NextActivityPerformers); base.ActivityInstanceManager.Update(mainActivityInstance, session); canContinueForwardCurrentNode = false; base.WfNodeMediatedResult.Feedback = WfNodeMediatedFeedback.WaitingForCompletedMore; } else if (mainActivityInstance.CompleteOrder == completedCount) { //如果超过约定的比例数,则执行下一步节点 mainActivityInstance.ActivityState = (short)ActivityStateEnum.Completed; base.ActivityInstanceManager.Update(mainActivityInstance, session); //更新未办理完成节点状态为取消状态 base.ActivityInstanceManager.CancelUnCompletedMultipleInstance(mainActivityInstance.ID, session, runner); } } } } } return(canContinueForwardCurrentNode); }
/// <summary> /// 创建撤销处理运行时 /// </summary> /// <param name="runner">撤销人</param> /// <param name="result">创建结果</param> /// <returns>运行时管理器</returns> internal static WfRuntimeManager CreateRuntimeInstanceWithdraw(WfAppRunner runner, ref WfExecutedResult result) { var rmins = new WfRuntimeManagerSendBack(); rmins.WfExecutedResult = result = new WfExecutedResult(); if (runner.TaskID == null) { result.Status = WfExecutedStatus.Exception; result.ExceptionType = WfExceptionType.Withdraw_ErrorArguments; result.Message = LocalizeHelper.GetEngineMessage("wfruntimemanagerfactory.CreateRuntimeInstanceWithdraw.missingtaskid.error"); return(rmins); } //获取已经完成任务的信息 var tm = new TaskManager(); var taskDone = tm.GetTaskView(runner.TaskID.Value); if (tm.IsMine(taskDone, runner.UserID) == false) { result.Status = WfExecutedStatus.Exception; result.ExceptionType = WfExceptionType.Sendback_NotMineTask; result.Message = LocalizeHelper.GetEngineMessage("wfruntimemanagerfactory.CreateRuntimeInstanceWithdraw.nonetask.error"); return(rmins); } //赋值下一步办理列表 runner.NextActivityPerformers = NextStepUtility.CreateNextStepPerformerList(taskDone.ActivityGUID, taskDone.AssignedToUserID, taskDone.AssignedToUserName); //没有指定退回节点信息 if (runner.NextActivityPerformers == null || runner.NextActivityPerformers.Count == 0) { result.Status = WfExecutedStatus.Exception; result.ExceptionType = WfExceptionType.Sendback_IsNull; result.Message = LocalizeHelper.GetEngineMessage("wfruntimemanagerfactory.CreateRuntimeInstanceWithdraw.noneperformer.error"); return(rmins); } //获取待办任务 var tim = new TransitionInstanceManager(); var nextStepList = tim.GetTargetActivityInstanceList(taskDone.ActivityInstanceID).ToList(); ActivityInstanceEntity runningNode = nextStepList.Count > 0 ? nextStepList[0] : null; if (runningNode == null) { result.Status = WfExecutedStatus.Exception; result.ExceptionType = WfExceptionType.Sendback_NotInRunning; result.Message = LocalizeHelper.GetEngineMessage("wfruntimemanagerfactory.CreateRuntimeInstanceWithdraw.nonerun.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.CreateRuntimeInstanceWithdraw.nottask.error"); return(rmins); } //获取待办任务(模拟待办任务用户做退回处理) var taskToDo = tm.GetTaskViewByActivity(runningNode.ProcessInstanceID, runningNode.ID); runner.UserID = taskToDo.AssignedToUserID; runner.UserName = taskToDo.AssignedToUserName; //获取上一步节点信息 var hasGatewayPassed = false; var processInstance = (new ProcessInstanceManager()).GetById(runningNode.ProcessInstanceID); var previousStepChecker = new PreviousStepChecker(); var processModel = ProcessModelFactory.Create(taskToDo.ProcessGUID, taskToDo.Version); 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.CreateRuntimeInstanceWithdraw.empty.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.CreateRuntimeInstanceWithdraw.notunique.error"); return(rmins); } } //创建运行时 rmins.TaskView = taskToDo; 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.Withdrawed; sendbackOperation.ProcessInstance = processInstance; sendbackOperation.BackwardFromActivityInstance = runningNode; sendbackOperation.HasGatewayPassed = hasGatewayPassed; sendbackOperation.ActivityResource = new ActivityResource(runner, rmins.AppRunner.NextActivityPerformers); sendbackOperation.ProcessModel = processModel; sendbackOperation.IsCancellingBrothersNode = true; //撤销时默认撤销各个并行分支 rmins.SendBackOperation = sendbackOperation; return(rmins); }