internal EventNode(ActivityEntity activity) : base(activity) { }
internal AndSplitNode(ActivityEntity activity) : base(activity) { }
internal ComplexJoinNode(ActivityEntity activity) : base(activity) { }
/// <summary> /// 构造函数 /// </summary> /// <param name="currentActivity"></param> public NodeBase(ActivityEntity currentActivity) { Activity = currentActivity; }
internal ComplexSplitNode(ActivityEntity activity) : base(activity) { }
public string UpdateActivity(ActivityEntity activity) { const string sql = @"uspUpdate_Activity"; return(Db.Update(sql, true, Take(activity))); }
/// <summary> /// 获取下一步节点列表 /// </summary> /// <param name="fromTransition">起始转移</param> /// <param name="currentGatewayActivity">当前节点</param> /// <param name="conditionKeyValuePair">条件</param> /// <param name="resultType">结果类型</param> /// <returns>返回节点</returns> internal override NextActivityComponent GetNextActivityListFromGateway(TransitionEntity fromTransition, ActivityEntity currentGatewayActivity, IDictionary <string, string> conditionKeyValuePair, out NextActivityMatchedType resultType) { NextActivityComponent child = null; NextActivityComponent gatewayComponent = null; resultType = NextActivityMatchedType.Unknown; var transitionList = this.ProcessModel.GetForwardTransitionList(currentGatewayActivity.ActivityGUID).ToList(); if (currentGatewayActivity.GatewayDirectionType == GatewayDirectionEnum.AndSplit || currentGatewayActivity.GatewayDirectionType == GatewayDirectionEnum.AndSplitMI) { //获取AndSplit的每一条后续连线上的To节点 foreach (TransitionEntity transition in transitionList) { child = GetNextActivityListFromGatewayCore(transition, conditionKeyValuePair, out resultType); gatewayComponent = AddChildToGatewayComponent(fromTransition, currentGatewayActivity, gatewayComponent, child); } if (gatewayComponent == null) { resultType = NextActivityMatchedType.WaitingForSplitting; } } else if (currentGatewayActivity.GatewayDirectionType == GatewayDirectionEnum.OrSplit) { //获取OrSplit的,满足条件的后续连线上的To节点 foreach (TransitionEntity transition in transitionList) { bool isValidTransition = base.ProcessModel.IsValidTransition(transition, conditionKeyValuePair); if (isValidTransition) { child = GetNextActivityListFromGatewayCore(transition, conditionKeyValuePair, out resultType); gatewayComponent = AddChildToGatewayComponent(fromTransition, currentGatewayActivity, gatewayComponent, child); } if (gatewayComponent == null) { resultType = NextActivityMatchedType.NoneTransitionMatchedToSplit; } } } else if (currentGatewayActivity.GatewayDirectionType == GatewayDirectionEnum.XOrSplit) { //按连线定义的优先级排序 transitionList.Sort(new TransitionPriorityCompare()); //获取XOrSplit的,第一条满足条件的后续连线上的To节点 foreach (TransitionEntity transition in transitionList) { bool isValidTransitionXOr = base.ProcessModel.IsValidTransition(transition, conditionKeyValuePair); if (isValidTransitionXOr) { child = GetNextActivityListFromGatewayCore(transition, conditionKeyValuePair, out resultType); gatewayComponent = AddChildToGatewayComponent(fromTransition, currentGatewayActivity, gatewayComponent, child); //退出循环 break; } } if (gatewayComponent == null) { resultType = NextActivityMatchedType.NoneTransitionMatchedToSplit; } } else { resultType = NextActivityMatchedType.Failed; throw new Exception("Split 分支节点的类型不明确!"); } return(gatewayComponent); }
internal StartNode(ActivityEntity activity) : base(activity) { }
public int InsertActivity(ActivityEntity activity) { const string sql = @"uspInsert_Activity"; return(Db.Insert(sql, true, Take(activity))); }
internal MultiInsNode(ActivityEntity activity) : base(activity) { }
internal NodeMediatorAndJoinMI(ActivityEntity activity, IProcessModel processModel, IDbSession session) : base(activity, processModel, session) { }
/// <summary> /// 根据课程id和活动类型更新活动目标轮次 /// </summary> /// <param name="activityEntity"></param> /// <returns></returns> public int UpdateTargetTurnNumber(ActivityEntity activityEntity) { return(activityDAO.UpdateTargetTurnNumber(activityEntity)); }
protected void InitFlowInfo() { string AppInstanceID = Request.QueryString["AppInstanceID"] == null ? string.Empty : Request.QueryString["AppInstanceID"].ToString(); string ProcessGUID = Request.QueryString["ProcessGUID"] == null ? string.Empty : Request.QueryString["ProcessGUID"].ToString(); int ActivityInstanceID = Request.QueryString["ActivityInstanceID"] == null ? 0 : Helper.ConverToInt32(Request.QueryString["ActivityInstanceID"].ToString()); if (!string.IsNullOrEmpty(AppInstanceID)) { int leaveID = int.Parse(AppInstanceID); HrsLeaveEntity hrsLeaveEntity = WorkFlows.GetHrsLeaveModel(leaveID); if (hrsLeaveEntity != null && hrsLeaveEntity.ID > 0) { selectLeaveType.Value = hrsLeaveEntity.LeaveType.ToString(); selectLeaveType.Disabled = true; txtDays.Value = hrsLeaveEntity.Days.ToString(); txtFromDate.Value = hrsLeaveEntity.FromDate.ToString("yyyy-MM-dd"); txtToDate.Value = hrsLeaveEntity.ToDate.ToString("yyyy-MM-dd"); hiddenInstanceId.Value = hrsLeaveEntity.ID.ToString(); hiddenActivityInstanceID.Value = ActivityInstanceID.ToString(); this.txtDepmanagerRemark.Value = hrsLeaveEntity.DepManagerRemark; this.txtDirectorRemark.Value = hrsLeaveEntity.DirectorRemark; //主管总监 this.txtDeputyGeneralRemark.Value = hrsLeaveEntity.DeputyGeneralRemark; //副总经理 this.txtGeneralManagerRemark.Value = hrsLeaveEntity.GeneralManagerRemark; //总经理 //权限设置 IWorkflowService service = new WorkflowService(); ActivityInstanceEntity activityInstanceEntity = service.GetActivityInstance(ActivityInstanceID); ProcessInstanceEntity processInstanceEntity = service.GetProcessInstance(activityInstanceEntity.ProcessInstanceID); this.txtProcessGUID.Value = activityInstanceEntity.ProcessGUID; if (activityInstanceEntity != null) { ActivityEntity activityEntity = service.GetActivityEntity(processInstanceEntity.ProcessGUID, processInstanceEntity.Version, activityInstanceEntity.ActivityGUID); var roles = service.GetActivityRoles(processInstanceEntity.ProcessGUID, processInstanceEntity.Version, activityInstanceEntity.ActivityGUID); if (activityEntity != null && roles != null && roles.Count > 0) { foreach (var role in roles) { if (role.ID == LoginRoleID.ToString()) { switch (role.ID) { case "2": //部门经理 this.txtDepmanagerRemark.Disabled = false; hiddenPerformField.Value = "DepManager"; break; case "4": //主管总监 this.txtDirectorRemark.Disabled = false; hiddenPerformField.Value = "Director"; break; case "7": //副总经理 this.txtDeputyGeneralRemark.Disabled = false; hiddenPerformField.Value = "Deputy"; break; case "8": //总经理 this.txtGeneralManagerRemark.Disabled = false; hiddenPerformField.Value = "General"; break; } } } } } } } }
/// <summary> /// 根据模板自动创建训练活动 传入的是用户的数据库主键id /// </summary> /// <param name="trainingCourseEntity"></param> /// <param name="memberPkId"></param> /// <param name="planTemplate"></param> /// <returns></returns> public long AutoSaveActivityTemplate(TrainingCourseEntity trainingCourseEntity, long memberPkId, PlanTemplate planTemplate) { using (TransactionScope ts = new TransactionScope()) { long result = 0; List <ActivityEntity> activities = new List <ActivityEntity>(); //力量循环活动 ActivityEntity strengthActivity = new ActivityEntity(); //耐力循环活动 ActivityEntity enduranceActivity = new ActivityEntity(); //上传表 UploadManagementDAO uploadManagementDao = new UploadManagementDAO(); //根据不同模板创建不同的活动 switch (planTemplate) { case PlanTemplate.StrengthCycle: //力量循环 strengthActivity.Id = KeyGenerator.GetNextKeyValueLong("bdl_activity"); strengthActivity.Member_id = trainingCourseEntity.Member_id; strengthActivity.Fk_member_id = memberPkId; strengthActivity.Fk_training_course_id = trainingCourseEntity.Id; strengthActivity.Gmt_create = System.DateTime.Now; strengthActivity.Is_complete = false; //模板创建默认两轮 strengthActivity.Target_turn_number = 2; strengthActivity.current_turn_number = 0; //0:力量循环 strengthActivity.Activity_type = "0"; activities.Add(strengthActivity); // 插入至上传表 uploadManagementDao.Insert(new UploadManagement(strengthActivity.Id, "bdl_activity", 0)); break; case PlanTemplate.EnduranceCycle: //耐力循环 enduranceActivity.Id = KeyGenerator.GetNextKeyValueLong("bdl_activity"); enduranceActivity.Member_id = trainingCourseEntity.Member_id; enduranceActivity.Fk_member_id = memberPkId; enduranceActivity.Fk_training_course_id = trainingCourseEntity.Id; enduranceActivity.Gmt_create = System.DateTime.Now; enduranceActivity.Is_complete = false; //模板创建默认两轮 enduranceActivity.Target_turn_number = 2; enduranceActivity.current_turn_number = 0; //1:耐力循环 enduranceActivity.Activity_type = "1"; activities.Add(enduranceActivity); //插入至上传表 uploadManagementDao.Insert(new UploadManagement(enduranceActivity.Id, "bdl_activity", 0)); break; case PlanTemplate.StrengthEnduranceCycle: //创建力量循环活动 strengthActivity.Id = KeyGenerator.GetNextKeyValueLong("bdl_activity"); strengthActivity.Member_id = trainingCourseEntity.Member_id; strengthActivity.Fk_member_id = memberPkId; strengthActivity.Fk_training_course_id = trainingCourseEntity.Id; strengthActivity.Gmt_create = System.DateTime.Now; strengthActivity.Is_complete = false; //模板创建默认两轮 strengthActivity.Target_turn_number = 2; strengthActivity.current_turn_number = 0; //0:力量循环 strengthActivity.Activity_type = "0"; activities.Add(strengthActivity); //插入至上传表 uploadManagementDao.Insert(new UploadManagement(strengthActivity.Id, "bdl_activity", 0)); //创建耐力循环活动 enduranceActivity.Id = KeyGenerator.GetNextKeyValueLong("bdl_activity"); enduranceActivity.Member_id = trainingCourseEntity.Member_id; enduranceActivity.Fk_member_id = memberPkId; enduranceActivity.Fk_training_course_id = trainingCourseEntity.Id; enduranceActivity.Gmt_create = System.DateTime.Now; enduranceActivity.Is_complete = false; //模板创建默认两轮 enduranceActivity.Target_turn_number = 2; enduranceActivity.current_turn_number = 0; //1:耐力循环 enduranceActivity.Activity_type = "1"; activities.Add(enduranceActivity); //插入至上传表 uploadManagementDao.Insert(new UploadManagement(enduranceActivity.Id, "bdl_activity", 0)); break; default: break; } //批量插入训练活动 result = activityDAO.BatchInsert(activities); //根据训练活动批量插入个人设置记录 传入用户主键id personalSettingService.AutoSavePersonalSettings(memberPkId, trainingCourseEntity.Id, trainingCourseEntity.Member_id); ts.Complete(); return(result); } }
internal ScriptNode(ActivityEntity activity) : base(activity) { }
internal MultipleInstanceNode(ActivityEntity activity) : base(activity) { }
internal OrSplitNode(ActivityEntity activity) : base(activity) { }
/// <summary> /// 创建活动任务转移实例数据 /// </summary> /// <param name="toActivity">活动</param> /// <param name="processInstance">流程实例</param> /// <param name="fromActivityInstance">开始活动实例</param> /// <param name="transitionGUID">转移GUID</param> /// <param name="transitionType">转移类型</param> /// <param name="flyingType">跳跃类型</param> /// <param name="activityResource">活动资源</param> /// <param name="session">会话</param> internal override void CreateActivityTaskTransitionInstance(ActivityEntity toActivity, ProcessInstanceEntity processInstance, ActivityInstanceEntity fromActivityInstance, string transitionGUID, TransitionTypeEnum transitionType, TransitionFlyingTypeEnum flyingType, ActivityResource activityResource, IDbSession session) { Boolean isParallel = false; if (fromActivityInstance.ActivityType == (short)ActivityTypeEnum.GatewayNode) { //并发多实例分支判断(AndSplit Multiple) var processModel = new ProcessModel(processInstance.ProcessGUID, processInstance.Version); var activityNode = processModel.GetActivity(fromActivityInstance.ActivityGUID); if (activityNode.GatewaySplitJoinType == GatewaySplitJoinTypeEnum.Split && activityNode.GatewayDirectionType == GatewayDirectionEnum.AndSplitMI) { isParallel = true; } } if (isParallel) { //并行多实例 var entity = new ActivityInstanceEntity(); var plist = activityResource.NextActivityPerformers[toActivity.ActivityGUID]; for (var i = 0; i < plist.Count; i++) { entity = base.CreateActivityInstanceObject(toActivity, processInstance, activityResource.AppRunner); entity.AssignedToUserIDs = plist[i].UserID; entity.AssignedToUserNames = plist[i].UserName; entity.ActivityState = (short)ActivityStateEnum.Ready; //插入活动实例数据 entity.ID = base.ActivityInstanceManager.Insert(entity, session); //插入任务 base.TaskManager.Insert(entity, plist[i], activityResource.AppRunner, session); //插入转移数据 InsertTransitionInstance(processInstance, transitionGUID, fromActivityInstance, entity, transitionType, flyingType, activityResource.AppRunner, session); } } else { //普通任务节点 var toActivityInstance = base.CreateActivityInstanceObject(toActivity, processInstance, activityResource.AppRunner); //进入运行状态 toActivityInstance.ActivityState = (short)ActivityStateEnum.Ready; toActivityInstance.AssignedToUserIDs = GenerateActivityAssignedUserIDs( activityResource.NextActivityPerformers[toActivity.ActivityGUID]); toActivityInstance.AssignedToUserNames = GenerateActivityAssignedUserNames( activityResource.NextActivityPerformers[toActivity.ActivityGUID]); //插入活动实例数据 base.ActivityInstanceManager.Insert(toActivityInstance, session); //插入任务数据 base.CreateNewTask(toActivityInstance, activityResource, session); //插入转移数据 InsertTransitionInstance(processInstance, transitionGUID, fromActivityInstance, toActivityInstance, transitionType, flyingType, activityResource.AppRunner, session); } }
internal TaskNode(ActivityEntity activity) : base(activity) { }
internal NodeMediatorXOrJoin(ActivityEntity activity, IProcessModel processModel, WfAppRunner runner, IServiceProvider serviceProvider) : base(activity, processModel, runner, serviceProvider) { }
/// <summary> /// 会签类型的主节点, 多实例节点处理 /// </summary> /// <param name="processInstance"></param> /// <param name="fromToTransition"></param> /// <param name="fromActivityInstance"></param> /// <param name="activityResource"></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.MultipleInstance; if (toActivity.ActivityTypeDetail.MergeType == MergeTypeEnum.Parallel) { toActivityInstance.CompleteOrder = toActivity.ActivityTypeDetail.CompleteOrder; } toActivityInstance.AssignedToUsers = GenerateActivityAssignedUsers( activityResource.NextActivityPerformers[toActivity.ActivityGUID]); //插入主节点实例数据 base.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 = base.ActivityInstanceManager.CreateActivityInstanceObject(toActivityInstance); entity.AssignedToUsers = plist[i].UserID.ToString(); entity.MIHostActivityInstanceID = toActivityInstance.ID; entity.CompleteOrder = (short)(i + 1); //只有第一个节点处于运行状态,其它节点挂起 if ((i > 0) && (toActivity.ActivityTypeDetail.MergeType == MergeTypeEnum.Sequence)) { entity.ActivityState = (short)ActivityStateEnum.Suspended; } //插入活动实例数据,并返回活动实例ID entity.ID = base.ActivityInstanceManager.Insert(entity, session); //插入任务数据 base.TaskManager.Insert(entity, plist[i], activityResource.AppRunner, session); //启动子流程 IDbSession subSession = SessionFactory.CreateSession(); WfExecutedResult startedResult = null; var subProcessNode = (SubProcessNode)toActivity.Node; subProcessNode.ActivityInstance = entity; //在流程实例表中记录激活子流程的活动节点ID WfAppRunner subRunner = CopyActivityForwardRunner(activityResource.AppRunner, plist[i], subProcessNode); var runtimeInstance = WfRuntimeManagerFactory.CreateRuntimeInstanceStartup(subRunner, processInstance, subProcessNode, ref startedResult); if (runtimeInstance.WfExecutedResult.Status == WfExecutedStatus.Exception) { throw new WfRuntimeException(runtimeInstance.WfExecutedResult.Message); } runtimeInstance.Execute(subSession); //如果是串行会签,只有第一个子流程可以运行,其它子流程处于挂起状态 if ((i > 0) && (toActivity.ActivityTypeDetail.MergeType == MergeTypeEnum.Sequence)) { var startResult = (WfExecutedResult)runtimeInstance.WfExecutedResult; base.ProcessInstanceManager.Suspend(startedResult.ProcessInstanceIDStarted, subRunner, subSession); } } }
/// <summary> /// 递归执行节点 /// 1)创建普通节点的任务 /// 2)创建会签节点的任务 /// </summary> /// <param name="fromActivity">起始活动</param> /// <param name="fromActivityInstance">起始活动实例</param> /// <param name="isJumpforward">是否跳跃</param> /// <param name="root">根节点</param> /// <param name="conditionKeyValuePair">条件key-value</param> protected void ContinueForwardCurrentNodeRecurisivly(ActivityEntity fromActivity, WfActivityInstance fromActivityInstance, NextActivityComponent root, Boolean isJumpforward) { foreach (NextActivityComponent comp in root) { if (comp.HasChildren) { //此节点类型为分支或合并节点类型:首先需要实例化当前节点(自动完成) NodeMediatorGateway gatewayNodeMediator = NodeMediatorGatewayFactory.CreateGatewayNodeMediator(comp.Activity, this.ActivityForwardContext.ProcessModel, AppRunner, _dataAccessor, _loggerFactory); ICompleteAutomaticlly autoGateway = (ICompleteAutomaticlly)gatewayNodeMediator; GatewayExecutedResult gatewayResult = autoGateway.CompleteAutomaticlly( ActivityForwardContext.ProcessInstance, comp.Transition.TransitionID, fromActivityInstance); if (gatewayResult.Status == GatewayExecutedStatus.Successed) { //遍历后续子节点 ContinueForwardCurrentNodeRecurisivly(fromActivity, gatewayNodeMediator.GatewayActivityInstance, comp, isJumpforward); } else { WfRuntimeException e = new WfRuntimeException("第一个满足条件的节点已经被成功执行,此后的节点被阻止在XOrJoin节点!"); _logger.LogError($"第一个满足条件的节点已经被成功执行,此后的节点被阻止在XOrJoin节点!"); } } else if (comp.Activity.ActivityType == ActivityTypeEnum.TaskNode || comp.Activity.ActivityType == ActivityTypeEnum.TimerNode || comp.Activity.ActivityType == ActivityTypeEnum.SignNode) //普通任务节点 { //此节点类型为任务节点:根据fromActivityInstance的类型判断是否可以创建任务 if (fromActivityInstance.ActivityState == ActivityStateEnum.Completed.ToString()) { //创建新任务节点 NodeMediator taskNodeMediator = new NodeMediatorTask(AppRunner, _dataAccessor, _loggerFactory); taskNodeMediator.CreateActivityTaskTransitionInstance(comp.Activity, ActivityForwardContext.ProcessInstance, fromActivityInstance, comp.Transition.TransitionID, comp.Transition.DirectionType == TransitionDirectionTypeEnum.Loop ? TransitionTypeEnum.Loop : TransitionTypeEnum.Forward, //根据Direction方向确定是否是自身循环 isJumpforward == true ? TransitionFlyingTypeEnum.ForwardFlying : TransitionFlyingTypeEnum.NotFlying); } else { //下一步的任务节点没有创建,需给出提示信息 if ((fromActivity.GatewayDirectionType | GatewayDirectionEnum.AllJoinType) == GatewayDirectionEnum.AllJoinType) { WfRuntimeException e = new WfRuntimeException("等待其它需要合并的分支!"); _logger.LogWarning("等待其它需要合并的分支!"); } } } else if (comp.Activity.ActivityType == ActivityTypeEnum.SubProcessNode) //子流程节点 { //节点类型为subprocessnode if (fromActivityInstance.ActivityState == ActivityStateEnum.Completed.ToString()) { //实例化subprocess节点数据 NodeMediator subNodeMediator = new NodeMediatorSubProcess(AppRunner, _dataAccessor, _loggerFactory); subNodeMediator.CreateActivityTaskTransitionInstance(comp.Activity, ActivityForwardContext.ProcessInstance, fromActivityInstance, comp.Transition.TransitionID, comp.Transition.DirectionType == TransitionDirectionTypeEnum.Loop ? TransitionTypeEnum.Loop : TransitionTypeEnum.Forward, TransitionFlyingTypeEnum.NotFlying); } } else if (comp.Activity.ActivityType == ActivityTypeEnum.EndNode) //结束节点 { //此节点为完成结束节点,结束流程 NodeMediator endMediator = new NodeMediatorEnd(ActivityForwardContext, AppRunner, _dataAccessor, _loggerFactory); endMediator.Linker.ToActivity = comp.Activity; //创建结束节点实例及转移数据 endMediator.CreateActivityTaskTransitionInstance(comp.Activity, ActivityForwardContext.ProcessInstance, fromActivityInstance, comp.Transition.TransitionID, TransitionTypeEnum.Forward, TransitionFlyingTypeEnum.NotFlying); //执行结束节点中的业务逻辑 endMediator.ExecuteWorkItem(); } else { WfRuntimeException e = new WfRuntimeException(string.Format("XML文件定义了未知的节点类型,执行失败,节点类型信息:{0}", comp.Activity.ActivityType.ToString())); _logger.LogError($"XML文件定义了未知的节点类型,执行失败,节点类型信息:{comp.Activity.ActivityType.ToString()}"); } } }
internal NodeMediatorOrSplit(ActivityEntity activity, IProcessModel processModel, IDbSession session) : base(activity, processModel, session) { }
internal abstract NodeBase CreateNewNode(ActivityEntity activity);
/// <summary> /// /// </summary> protected void InitStepMember() { //流程定义的GUID string flowGuid = Request.QueryString["ProcessGUID"] == null ? "" : Request.QueryString["ProcessGUID"].ToString(); string Step = Request.QueryString["Step"] == null ? "" : Request.QueryString["Step"].ToString(); if (string.IsNullOrEmpty(flowGuid) || string.IsNullOrEmpty(Step)) { base.RegisterStartupScript("", "<script>alert('流程GUID为空');</script>"); } else { String processGUID = flowGuid; IWorkflowService service = new WorkflowService(); switch (Step) { case "start": //流程第一步选择 ActivityEntity firstActivity = service.GetFirstActivity(processGUID); String firstActivityGUID = firstActivity.ActivityGUID; string conditions = Request.QueryString["condition"] == null ? "" : Request.QueryString["condition"].ToString(); IList <NodeView> nextNodes = service.GetNextActivity(processGUID, firstActivityGUID, GetCondition(conditions)); if (nextNodes != null) { Repeater1.DataSource = nextNodes; Repeater1.DataBind(); } else { LiteralMSG.Text = "当前没有需要您办理的步骤"; } break; case "task": try { if (LoginUserID > 0) { string condition = Request.QueryString["condition"] == null ? "" : Request.QueryString["condition"].ToString(); string instanceId = Request.QueryString["instanceId"] == null ? string.Empty : Request.QueryString["instanceId"].ToString(); WfAppRunner runner = new WfAppRunner(); runner.AppInstanceID = instanceId; runner.ProcessGUID = processGUID; runner.UserID = this.LoginUserID.ToString(); hiddenIsSelectMember.Value = "true"; IList <NodeView> NodeViewList = service.GetNextActivityTree(runner, GetCondition(condition)); if (NodeViewList != null) { Repeater1.DataSource = NodeViewList; Repeater1.DataBind(); if (NodeViewList.Count == 1) { string nextActivityGuid = NodeViewList[0].ActivityGUID; /* * ActivityEntity activityEntity = service.GetActivityInstance(processGUID, nextActivityGuid); * if (activityEntity.ActivityType == ActivityTypeEnum.EndNode) * { * hiddenIsSelectMember.Value = "false"; * }*/ } } else { LiteralMSG.Text = "当前没有需要您办理的步骤"; } } } catch (Exception ex) { } break; } } }
/// <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); }
internal EndNode(ActivityEntity activity) : base(activity) { }
/// <summary> /// 创建下一步活动的节点 /// </summary> /// <param name="transition">转移</param> /// <param name="activity">活动</param> /// <returns>下一步节点封装</returns> internal static NextActivityComponent CreateNextActivityComponent(TransitionEntity transition, ActivityEntity activity) { string name = string.Empty; NextActivityComponent component = null; if (XPDLHelper.IsSimpleComponentNode(activity.ActivityType) == true) //可流转简单类型节点 { name = "单一节点"; component = new NextActivityItem(name, transition, activity); } else if (XPDLHelper.IsIntermediateEventComponentNode(activity.ActivityType) == true) { name = "跨事件节点"; component = new NextActivityIntermediate(name, transition, activity); } else if (XPDLHelper.IsGatewayComponentNode(activity.ActivityType) == true) { if (activity.GatewayDirectionType == GatewayDirectionEnum.AndSplit || activity.GatewayDirectionType == GatewayDirectionEnum.AndJoin) { name = "必全选节点"; } else if (activity.GatewayDirectionType == GatewayDirectionEnum.AndSplitMI || activity.GatewayDirectionType == GatewayDirectionEnum.AndJoinMI) { name = "并行多实例节点"; } else if (activity.GatewayDirectionType == GatewayDirectionEnum.OrSplit || activity.GatewayDirectionType == GatewayDirectionEnum.OrJoin) { name = "或多选节点"; } else if (activity.GatewayDirectionType == GatewayDirectionEnum.XOrSplit || activity.GatewayDirectionType == GatewayDirectionEnum.XOrJoin) { name = "异或节点"; } else if (activity.GatewayDirectionType == GatewayDirectionEnum.EOrJoin) { name = "增强合并多选节点"; } else { throw new WfXpdlException(string.Format("无法创建下一步节点列表,不明确的分支类型:{0}", activity.GatewayDirectionType.ToString())); } component = new NextActivityGateway(name, transition, activity); } else if (activity.ActivityType == ActivityTypeEnum.SubProcessNode) { name = "子流程节点"; component = new NextActivityItem(name, transition, activity); } else { throw new WfXpdlException(string.Format("无法创建下一步节点列表,不明确的节点类型:{0}", activity.ActivityType.ToString())); } return(component); }
/// <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); }
protected ActivityEntity FillActivityRuntimeFields(DbDataReader reader, ref int at, bool includeParents = false, ActivityEntity entity = null) { if (entity == null) { entity = new ActivityEntity(); } object value; //Id, entity.Id = reader.GetGuid(at++); //ParentId, entity.ParentId = (value = reader.GetValue(at)) == DBNull.Value ? null : new Nullable <Guid>((Guid)value); at++; //FlowId, entity.FlowId = reader.GetGuid(at++); entity.Domain = reader.GetString(at++); //NodeName, entity.NodeName = reader.GetString(at++); //Fullname, entity.NodePath = reader.GetString(at++); //Version, entity.Version = reader.GetString(at++); entity.HasChildren = reader.GetInt32(at++) == 1; //InstanceType, entity.ActionType = (value = reader.GetValue(at++)) == DBNull.Value ? null : value.ToString(); at++; //Status, entity.Status = (ActivityStates)reader.GetInt32(at++); entity.OwnerId = (value = reader.GetValue(at++)) == DBNull.Value ? null : value.ToString(); entity.OwnerName = (value = reader.GetValue(at++)) == DBNull.Value ? null : value.ToString(); //States, entity.States = reader.GetString(at++); entity.Nexts = (value = reader.GetValue(at++)) == DBNull.Value ? null : value.ToString(); entity.Graph = reader.GetString(at++); if (includeParents) { Guid?pId = (value = reader.GetValue(at)) == DBNull.Value ? null : new Nullable <Guid>((Guid)value); if (pId == null) { entity.FlowActivity = entity; } else { entity.ParentActivity = FillActivityRuntimeFields(reader, ref at, false); } } return(entity); }
/// <summary>Enumerates by activity in this collection.</summary> /// <param name="entity"> The entity. </param> /// <returns> /// An enumerator that allows foreach to be used to process by activity in this /// collection. /// </returns> public IEnumerable <ActivityRoleEntity> ByActivity(ActivityEntity entity) { return(Collection.Find(e => e.ActivityId == entity.Id)); }
protected ActivityEntity FillActivityRecordFields(DbDataReader reader, ref int at, ActivityEntity entity = null) { if (entity == null) { entity = new ActivityEntity(); } object value; //CreateTime, entity.CreateTime = reader.GetDateTime(at++); //CreatorId, entity.CreatorId = reader.GetString(at++); //CreatorName, entity.CreatorName = reader.GetString(at++); //ExecuteTime, entity.DealTime = (value = reader.GetValue(at++)) == DBNull.Value ? null : new Nullable <DateTime>((DateTime)value); //DealerId, entity.DealerId = (value = reader.GetValue(at++)) == DBNull.Value ? null : value.ToString(); //DealerName, entity.DealerName = (value = reader.GetValue(at++)) == DBNull.Value ? null : value.ToString(); //DoneTime, entity.DoneTime = (value = reader.GetValue(at++)) == DBNull.Value ? null : new Nullable <DateTime>((DateTime)value); //CloseTime, entity.CloseTime = (value = reader.GetValue(at++)) == DBNull.Value ? null : new Nullable <DateTime>((DateTime)value); //CloserId, entity.CloserId = (value = reader.GetValue(at++)) == DBNull.Value ? null : value.ToString(); //CloserName entity.CloserName = (value = reader.GetValue(at++)) == DBNull.Value ? null : value.ToString(); return(entity); }
/// <summary> /// 创建子流程节点数据以及子流程记录 /// </summary> /// <param name="toActivity">目的活动</param> /// <param name="processInstance">流程实例</param> /// <param name="fromActivityInstance">来源活动实例</param> /// <param name="transitionGUID">转移GUID</param> /// <param name="transitionType">转移类型</param> /// <param name="flyingType">飞跃类型</param> /// <param name="activityResource">活动资源</param> /// <param name="performer">执行者</param> /// <param name="session">会话</param> private void CreateSubProcessNode(ActivityEntity toActivity, ProcessInstanceEntity processInstance, ActivityInstanceEntity fromActivityInstance, string transitionGUID, TransitionTypeEnum transitionType, TransitionFlyingTypeEnum flyingType, ActivityResource activityResource, Performer performer, IDbSession session) { WfExecutedResult startedResult = WfExecutedResult.Default(); //实例化Activity var toActivityInstance = CreateActivityInstanceObject(toActivity, processInstance, activityResource.AppRunner); //进入运行状态 toActivityInstance.ActivityState = (short)ActivityStateEnum.Ready; if (performer != null) { //并行容器中的子流程节点,每个人发起一个子流程 toActivityInstance.AssignedToUserIDs = performer.UserID; toActivityInstance.AssignedToUserNames = performer.UserName; //插入活动实例数据 base.ActivityInstanceManager.Insert(toActivityInstance, session); //插入任务数据 this.TaskManager.Insert(toActivityInstance, performer, activityResource.AppRunner, session); } else { toActivityInstance = GenerateActivityAssignedUserInfo(toActivityInstance, activityResource); //插入活动实例数据 base.ActivityInstanceManager.Insert(toActivityInstance, session); //插入任务数据 base.CreateNewTask(toActivityInstance, activityResource, session); } //插入转移数据 var newTransitionInstanceID = InsertTransitionInstance(processInstance, transitionGUID, fromActivityInstance, toActivityInstance, transitionType, flyingType, activityResource.AppRunner, session); //启动子流程 var subProcessNode = (SubProcessNode)toActivity.Node; subProcessNode.ActivityInstance = toActivityInstance; //复制子流程启动用户信息 WfAppRunner subRunner = null; var performerList = new PerformerList(); if (performer != null) { subRunner = CreateSubProcessRunner(activityResource.AppRunner, new Performer(performer.UserID, performer.UserName), subProcessNode, session); performerList.Add(performer); } else { subRunner = CreateSubProcessRunner(activityResource.AppRunner, new Performer(activityResource.AppRunner.UserID, activityResource.AppRunner.UserName), subProcessNode, session); performerList = activityResource.NextActivityPerformers[toActivity.ActivityGUID]; } var runtimeInstance = WfRuntimeManagerFactory.CreateRuntimeInstanceStartupSub(subRunner, processInstance, subProcessNode, performerList, session, ref startedResult); runtimeInstance.OnWfProcessExecuted += runtimeInstance_OnWfProcessStarted; runtimeInstance.Execute(session); void runtimeInstance_OnWfProcessStarted(object sender, WfEventArgs args) { startedResult = args.WfExecutedResult; } }
protected ActivityEntity FillActivityAllFields(DbDataReader reader, ref int at, ActivityEntity entity = null) { if (entity == null) { entity = new ActivityEntity(); } this.FillActivityRuntimeFields(reader, ref at, false, entity); this.FillActivityRecordFields(reader, ref at, entity); object value; entity.Results = (value = reader.GetValue(at++)) == DBNull.Value ? null : value.ToString(); entity.Inputs = (value = reader.GetValue(at++)) == DBNull.Value ? null : value.ToString(); return(entity); }
internal SubProcessNode(ActivityEntity activity) : base(activity) { }
/// <summary> /// 递归执行节点 /// 1)创建普通节点的任务 /// 2)创建会签节点的任务 /// </summary> /// <param name="fromActivity">起始活动</param> /// <param name="fromActivityInstance">起始活动实例</param> /// <param name="isNotParsedForward">是否跳跃</param> /// <param name="root">根节点</param> /// <param name="conditionKeyValuePair">条件key-value</param> /// <param name="mediatorResult">执行结果的返回列表</param> protected void ContinueForwardCurrentNodeRecurisivly(ActivityEntity fromActivity, ActivityInstanceEntity fromActivityInstance, NextActivityComponent root, IDictionary <string, string> conditionKeyValuePair, Boolean isNotParsedForward, ref List <WfNodeMediatedResult> mediatorResult) { foreach (NextActivityComponent comp in root) { if (comp.HasChildren) { NodeAutoExecutedResult nodeExecutedResult = null; if (XPDLHelper.IsGatewayComponentNode(comp.Activity.ActivityType) == true) { //此节点类型为任务节点:根据fromActivityInstance的类型判断是否可以创建任务 if (fromActivityInstance.ActivityState == (short)ActivityStateEnum.Completed) { //此节点类型为分支或合并节点类型:首先需要实例化当前节点(自动完成) NodeMediatorGateway gatewayNodeMediator = NodeMediatorFactory.CreateNodeMediatorGateway(comp.Activity, this.ActivityForwardContext.ProcessModel, Session); ICompleteGatewayAutomaticlly autoGateway = (ICompleteGatewayAutomaticlly)gatewayNodeMediator; nodeExecutedResult = autoGateway.CompleteAutomaticlly(ActivityForwardContext.ProcessInstance, comp.Transition.TransitionGUID, fromActivity, fromActivityInstance, ActivityForwardContext.ActivityResource.AppRunner, Session); if (nodeExecutedResult.Status == NodeAutoExecutedStatus.Successed) { //遍历后续子节点 ContinueForwardCurrentNodeRecurisivly(gatewayNodeMediator.GatewayActivity, gatewayNodeMediator.GatewayActivityInstance, comp, conditionKeyValuePair, isNotParsedForward, ref mediatorResult); } else { mediatorResult.Add(WfNodeMediatedResult.CreateNodeMediatedResultWithException( WfNodeMediatedFeedback.OrJoinOneBranchHasBeenFinishedWaittingOthers)); LogManager.RecordLog("ContinueForwardCurrentNodeRecurisivlyExeception", LogEventType.Exception, LogPriority.Normal, null, new WfRuntimeException( LocalizeHelper.GetEngineMessage("nodemediator.ContinueForwardCurrentNodeRecurisivly.warn")) ); } } else { //下一步的任务节点没有创建,需给出提示信息 if (IsWaitingOneOfJoin(fromActivity.GatewayDirectionType) == true) { mediatorResult.Add(WfNodeMediatedResult.CreateNodeMediatedResultWithException( WfNodeMediatedFeedback.NeedOtherGatewayBranchesToJoin)); LogManager.RecordLog("NodeMediator.ContinueForwardCurrentNodeRecurisivly.IsWaintingOneOfJoin.Exception", LogEventType.Exception, LogPriority.Normal, null, new WfRuntimeException(LocalizeHelper.GetEngineMessage("nodemediator.ContinueForwardCurrentNodeRecurisivly.waitingothers.warn")) ); } else { mediatorResult.Add(WfNodeMediatedResult.CreateNodeMediatedResultWithException( WfNodeMediatedFeedback.OtherUnknownReasonToDebug)); LogManager.RecordLog("NodeMediator.ContinueForwardCurrentNodeRecurisivly.IsWaintingOneOfJoin.OtherUnknownReason.Exception", LogEventType.Exception, LogPriority.Normal, null, new WfRuntimeException(LocalizeHelper.GetEngineMessage("nodemediator.ContinueForwardCurrentNodeRecurisivly.otherreason.warn")) ); } } } else { mediatorResult.Add(WfNodeMediatedResult.CreateNodeMediatedResultWithException( WfNodeMediatedFeedback.UnknownNodeTypeToWatch)); LogManager.RecordLog("NodeMediator.UnknownType.Exception", LogEventType.Exception, LogPriority.Normal, null, new WfRuntimeException(LocalizeHelper.GetEngineMessage("nodemediator.ContinueForwardCurrentNodeRecurisivly.unknowntype.warn", comp.Activity.ActivityType.ToString())) ); } } else if (comp.Activity.ActivityType == ActivityTypeEnum.TaskNode) //普通任务节点 { //此节点类型为任务节点:根据fromActivityInstance的类型判断是否可以创建任务 if (fromActivityInstance.ActivityState == (short)ActivityStateEnum.Completed) { //创建新任务节点 NodeMediator taskNodeMediator = new NodeMediatorTask(Session); taskNodeMediator.CreateActivityTaskTransitionInstance(comp.Activity, ActivityForwardContext.ProcessInstance, fromActivityInstance, comp.Transition.TransitionGUID, comp.Transition.DirectionType == TransitionDirectionTypeEnum.Loop ? TransitionTypeEnum.Loop : TransitionTypeEnum.Forward, //根据Direction方向确定是否是自身循环 isNotParsedForward == true ? TransitionFlyingTypeEnum.ForwardFlying : TransitionFlyingTypeEnum.NotFlying, ActivityForwardContext.ActivityResource, Session); } else { //下一步的任务节点没有创建,需给出提示信息 if (IsWaitingOneOfJoin(fromActivity.GatewayDirectionType) == true) { mediatorResult.Add(WfNodeMediatedResult.CreateNodeMediatedResultWithException( WfNodeMediatedFeedback.NeedOtherGatewayBranchesToJoin)); LogManager.RecordLog("NodeMediator.TaskNode.NeedOtherGatewayBranchesToJoin.Exception", LogEventType.Exception, LogPriority.Normal, null, new WfRuntimeException(LocalizeHelper.GetEngineMessage("nodemediator.ContinueForwardCurrentNodeRecurisivly.waitingothers.warn")) ); } else { mediatorResult.Add(WfNodeMediatedResult.CreateNodeMediatedResultWithException( WfNodeMediatedFeedback.OtherUnknownReasonToDebug)); LogManager.RecordLog("NodeMediator.TaskNode.NeedOtherGatewayBranchesToJoin.OtherUnkownReaseon.Exception", LogEventType.Exception, LogPriority.Normal, null, new WfRuntimeException(LocalizeHelper.GetEngineMessage("nodemediator.ContinueForwardCurrentNodeRecurisivly.otherreason.warn")) ); } } } else if (comp.Activity.ActivityType == ActivityTypeEnum.SubProcessNode) //子流程节点 { //节点类型为subprocessnode if (fromActivityInstance.ActivityState == (short)ActivityStateEnum.Completed) { //实例化subprocess节点数据 NodeMediator subNodeMediator = new NodeMediatorSubProcess(Session); subNodeMediator.CreateActivityTaskTransitionInstance(comp.Activity, ActivityForwardContext.ProcessInstance, fromActivityInstance, comp.Transition.TransitionGUID, comp.Transition.DirectionType == TransitionDirectionTypeEnum.Loop ? TransitionTypeEnum.Loop : TransitionTypeEnum.Forward, TransitionFlyingTypeEnum.NotFlying, ActivityForwardContext.ActivityResource, Session); } } else if (comp.Activity.ActivityType == ActivityTypeEnum.EndNode) //结束节点 { if (fromActivityInstance.ActivityState == (short)ActivityStateEnum.Completed) { //此节点为完成结束节点,结束流程 var endMediator = NodeMediatorFactory.CreateNodeMediatorEnd(ActivityForwardContext, comp.Activity, Session); endMediator.Linker.ToActivity = comp.Activity; //创建结束节点实例及转移数据 endMediator.CreateActivityTaskTransitionInstance(comp.Activity, ActivityForwardContext.ProcessInstance, fromActivityInstance, comp.Transition.TransitionGUID, TransitionTypeEnum.Forward, TransitionFlyingTypeEnum.NotFlying, ActivityForwardContext.ActivityResource, Session); //执行结束节点中的业务逻辑 endMediator.ExecuteWorkItem(); } else { //结束节点没有创建,需给出提示信息 if (IsWaitingOneOfJoin(fromActivity.GatewayDirectionType) == true) { mediatorResult.Add(WfNodeMediatedResult.CreateNodeMediatedResultWithException( WfNodeMediatedFeedback.NeedOtherGatewayBranchesToJoin)); LogManager.RecordLog("NodeMediator.EndNode.NeedOtherGatewayBranchesToJoin.Exception", LogEventType.Exception, LogPriority.Normal, null, new WfRuntimeException(LocalizeHelper.GetEngineMessage("nodemediator.ContinueForwardCurrentNodeRecurisivly.waitingothers.warn")) ); } else { mediatorResult.Add(WfNodeMediatedResult.CreateNodeMediatedResultWithException( WfNodeMediatedFeedback.OtherUnknownReasonToDebug)); LogManager.RecordLog("NodeMediator.EndNode.NeedOtherGatewayBranchesToJoin.OtherUnkownReaseon.Exception", LogEventType.Exception, LogPriority.Normal, null, new WfRuntimeException(LocalizeHelper.GetEngineMessage("nodemediator.ContinueForwardCurrentNodeRecurisivly.otherreason.warn")) ); } } } else { mediatorResult.Add(WfNodeMediatedResult.CreateNodeMediatedResultWithException( WfNodeMediatedFeedback.UnknownNodeTypeToWatch)); LogManager.RecordLog("NodeMediator.UnkonwNodeType.Exception", LogEventType.Exception, LogPriority.Normal, null, new WfRuntimeException(LocalizeHelper.GetEngineMessage("nodemediator.ContinueForwardCurrentNodeRecurisivly.unknowntype.warn", comp.Activity.ActivityType.ToString())) ); } } }
internal OrJoinNode(ActivityEntity activity) : base(activity) { }
/// <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); } }
internal PluginNode(ActivityEntity activity) : base(activity) { }