/// <summary> /// 生成活动用户分配信息 /// </summary> /// <param name="toActivityInstance">下一步活动实例</param> /// <param name="activityResource">活动资源</param> /// <returns>下一步活动实例</returns> protected ActivityInstanceEntity GenerateActivityAssignedUserInfo(ActivityInstanceEntity toActivityInstance, ActivityResource activityResource) { if (activityResource.AppRunner.NextPerformerType == NextPerformerIntTypeEnum.Specific && activityResource.NextActivityPerformers != null) { //前端显式指定下一步骤的执行用户列表 toActivityInstance.AssignedToUserIDs = PerformerBuilder.GenerateActivityAssignedUserIDs( activityResource.NextActivityPerformers[toActivityInstance.ActivityGUID]); toActivityInstance.AssignedToUserNames = PerformerBuilder.GenerateActivityAssignedUserNames( activityResource.NextActivityPerformers[toActivityInstance.ActivityGUID]); } else if (activityResource.AppRunner.NextPerformerType == NextPerformerIntTypeEnum.Definition) { //根据节点上的角色定义获取下一步骤的执行用户列表 var performers = ActivityForwardContext.ProcessModel.GetActivityPerformers(toActivityInstance.ActivityGUID); activityResource.NextActivityPerformers = performers; toActivityInstance.AssignedToUserIDs = PerformerBuilder.GenerateActivityAssignedUserIDs( performers[toActivityInstance.ActivityGUID]); toActivityInstance.AssignedToUserNames = PerformerBuilder.GenerateActivityAssignedUserNames( performers[toActivityInstance.ActivityGUID]); } else if (activityResource.AppRunner.NextPerformerType == NextPerformerIntTypeEnum.Single) { //用于测试使用的单一用户列表 activityResource.NextActivityPerformers = ActivityResource.CreateNextActivityPerformers(toActivityInstance.ActivityGUID, activityResource.AppRunner.UserID, activityResource.AppRunner.UserName); toActivityInstance.AssignedToUserIDs = activityResource.AppRunner.UserID; toActivityInstance.AssignedToUserNames = activityResource.AppRunner.UserName; } else { throw new ApplicationException(LocalizeHelper.GetEngineMessage("nodemediator.generateactivityassigneduserinfo.warn")); } return(toActivityInstance); }
/// <summary> /// 使用流程定义资源添加角色用户 /// </summary> /// <param name="mainActivityInstanceID">主流程节点实例ID</param> /// <param name="mainActivityGUID">主流程节点GUID</param> /// <param name="session">数据库会话</param> /// <returns>执行用户</returns> private WfAppRunner FillNextActivityPerformersByRoleList(int mainActivityInstanceID, string mainActivityGUID, IDbSession session) { var pm = new ProcessInstanceManager(); var mainProcessInstance = pm.GetByActivity(session.Connection, mainActivityInstanceID, session.Transaction); var processModel = ProcessModelFactory.Create(mainProcessInstance.ProcessGUID, mainProcessInstance.Version); var nextSteps = processModel.GetNextActivityTree(mainActivityGUID); //获取主流程的任务 var task = (new TaskManager()).GetTaskByActivity(session.Connection, mainProcessInstance.ID, mainActivityInstanceID, session.Transaction); var runner = new WfAppRunner { AppName = mainProcessInstance.AppName, AppInstanceID = mainProcessInstance.AppInstanceID, AppInstanceCode = mainProcessInstance.AppInstanceCode, ProcessGUID = mainProcessInstance.ProcessGUID, Version = mainProcessInstance.Version, UserID = task.AssignedToUserID, UserName = task.AssignedToUserName }; foreach (var node in nextSteps) { Dictionary <string, PerformerList> dict = new Dictionary <string, PerformerList>(); var performerList = PerformerBuilder.CreatePerformerList(node.Roles); //根据节点角色定义,读取执行者列表 if (node.ActivityType != ActivityTypeEnum.EndNode && performerList.Count == 0) { throw new WfRuntimeException(LocalizeHelper.GetEngineMessage("nodemediatorend.FillNextActivityPerformersByRoleList.warn", node.ActivityName)); } else { dict.Add(node.ActivityGUID, performerList); } runner.NextActivityPerformers = dict; } return(runner); }
/// <summary> /// 获取节点上的执行者列表 /// </summary> /// <param name="nextNode"></param> /// <returns></returns> public PerformerList GetPerformerList(NodeView nextNode) { var performerList = PerformerBuilder.CreatePerformerList(nextNode.Roles); return(performerList); }
/// <summary> /// 会签类型的主节点, 多实例节点处理 /// 创建会签节点的主节点,以及会签主节点下的实例子节点记录 /// </summary> /// <param name="processInstance">流程实例</param> /// <param name="toActivity">活动</param> /// <param name="fromActivityInstance">起始活动实例</param> /// <param name="activityResource">资源</param> /// <param name="flyingType">跳跃类型</param> /// <param name="transitionGUID">转移GUID</param> /// <param name="transitionType">转移类型</param> /// <param name="session">会话</param> internal void CreateMultipleInstance(ActivityEntity toActivity, ProcessInstanceEntity processInstance, ActivityInstanceEntity fromActivityInstance, String transitionGUID, TransitionTypeEnum transitionType, TransitionFlyingTypeEnum flyingType, ActivityResource activityResource, IDbSession session) { //实例化主节点Activity var toActivityInstance = CreateActivityInstanceObject(toActivity, processInstance, activityResource.AppRunner); //更新主节点实例数据 toActivityInstance.ActivityState = (short)ActivityStateEnum.Suspended; toActivityInstance.ComplexType = (short)ComplexTypeEnum.SignTogether; //串行或并行类型 toActivityInstance.MergeType = (short)toActivity.ActivityTypeDetail.MergeType; //通过率类型:个数或者百分比 toActivityInstance.CompareType = (short)toActivity.ActivityTypeDetail.CompareType; //主节点设置通过率 toActivityInstance.CompleteOrder = toActivity.ActivityTypeDetail.CompleteOrder; toActivityInstance.AssignedToUserIDs = PerformerBuilder.GenerateActivityAssignedUserIDs( activityResource.NextActivityPerformers[toActivity.ActivityGUID]); toActivityInstance.AssignedToUserNames = PerformerBuilder.GenerateActivityAssignedUserNames( activityResource.NextActivityPerformers[toActivity.ActivityGUID]); //插入主节点实例数据 ActivityInstanceManager.Insert(toActivityInstance, session); //插入主节点转移数据 InsertTransitionInstance(processInstance, transitionGUID, fromActivityInstance, toActivityInstance, transitionType, flyingType, activityResource.AppRunner, session); //插入会签子节点实例数据 var plist = activityResource.NextActivityPerformers[toActivity.ActivityGUID]; ActivityInstanceEntity entity = new ActivityInstanceEntity(); for (short i = 0; i < plist.Count; i++) { entity = ActivityInstanceManager.CreateActivityInstanceObject(toActivityInstance); entity.AssignedToUserIDs = plist[i].UserID; entity.AssignedToUserNames = plist[i].UserName; entity.MIHostActivityInstanceID = toActivityInstance.ID; //并行串行下,多实例子节点的执行顺序设置 if (toActivityInstance.MergeType == (short)MergeTypeEnum.Sequence) { entity.CompleteOrder = (short)(i + 1); } else if (toActivityInstance.MergeType == (short)MergeTypeEnum.Parallel) { entity.CompleteOrder = -1; //并行模式下CompleteOrder的优先级一样,所以置为 -1 } //如果是串行会签,只有第一个节点处于运行状态,其它节点挂起 if ((i > 0) && (toActivity.ActivityTypeDetail.MergeType == MergeTypeEnum.Sequence)) { entity.ActivityState = (short)ActivityStateEnum.Suspended; } //插入活动实例数据,并返回活动实例ID entity.ID = ActivityInstanceManager.Insert(entity, session); //插入任务数据 TaskManager.Insert(entity, plist[i], activityResource.AppRunner, session); } }
/// <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); }