/// <summary> /// 把XML节点转换为ActivityEntity实体对象 /// </summary> /// <param name="node"></param> /// <returns></returns> internal ActivityEntity ConvertXmlActivityNodeToActivityEntity(XmlNode node) { var nodeType = (ActivityTypeEnum)Enum.Parse(typeof(ActivityTypeEnum), XMLHelper.GetXmlAttribute(node, "nodeType")); ActivityEntity entity = new ActivityEntity(); entity.ActivityName = XMLHelper.GetXmlAttribute(node, "label"); entity.ActivityCode = XMLHelper.GetXmlAttribute(node, "nodeName"); if (entity.ActivityName.IsMissing()) { //开始结束节点label为“” entity.ActivityName = entity.ActivityCode; } entity.ActivityID = XMLHelper.GetXmlAttribute(node, "id"); entity.ProcessUid = ProcessEntity.ProcessUid; entity.IsAppoint = XMLHelper.GetXmlAttribute(node, "isAppoint").ToBool(); entity.ActivityType = nodeType; //单据模板 entity.BillTemplate = XMLHelper.GetXmlAttribute(node, "billTemplate"); if (entity.ActivityType == ActivityTypeEnum.SubProcessNode) //sub process node { //子流程节点 string subProcess = XMLHelper.GetXmlAttribute(node, "subProcess"); entity.SubProcess = subProcess; } else if (entity.ActivityType == ActivityTypeEnum.TaskNode) { entity.ApproverMethod = (ApproverMethodEnum)Enum.Parse(typeof(ApproverMethodEnum), XMLHelper.GetXmlAttribute(node, "approverMethod")); } else if (entity.ActivityType == ActivityTypeEnum.SignNode) //multiple instance node { string passRate = XMLHelper.GetXmlAttribute(node, "passRate"); entity.PassRate = Convert.ToInt16(passRate); } else if (entity.ActivityType == ActivityTypeEnum.TimerNode) { entity.Expiration = Convert.ToInt32(XMLHelper.GetXmlAttribute(node, "expiration")); } else if (entity.ActivityType == ActivityTypeEnum.GatewayNode) { string gateway = XMLHelper.GetXmlAttribute(node, "gateway"); string direction = XMLHelper.GetXmlAttribute(node, "direction"); entity.GatewaySplitJoinType = (GatewaySplitJoinTypeEnum)Enum.Parse(typeof(GatewaySplitJoinTypeEnum), gateway); entity.GatewayDirectionType = (GatewayDirectionEnum)Enum.Parse(typeof(GatewayDirectionEnum), direction); } //字段权限以及审批人 if (nodeType != ActivityTypeEnum.StartNode && nodeType != ActivityTypeEnum.EndNode && nodeType != ActivityTypeEnum.GatewayNode) { //获取可操作字段 entity.FieldItems = GetActivityDataItems(entity.ActivityID); //获取审批人 entity.Performers = GetActivityPerformers(entity.ActivityID); } entity.NoticeApplicant = XMLHelper.GetXmlAttribute(node, "noticeApplicant").ToBool(); entity.NoticeApprover = XMLHelper.GetXmlAttribute(node, "noticeApprover").ToBool(); entity.IsMail = XMLHelper.GetXmlAttribute(node, "isMail").ToBool(); entity.IsMessage = XMLHelper.GetXmlAttribute(node, "isMessage").ToBool(); //获取节点的操作列表 //XmlNode actionsNode = node.SelectSingleNode("Actions"); //if (actionsNode != null) //{ // XmlNodeList xmlActionList = actionsNode.ChildNodes; // List<ActionEntity> actionList = new List<ActionEntity>(); // foreach (XmlNode element in xmlActionList) // { // actionList.Add(ConvertXmlActionNodeToActionEntity(element)); // } // entity.ActionList = actionList; //} return(entity); }
/// <summary> /// 创建跳转Transition实体对象 /// </summary> /// <param name="sourceActivity">来源节点</param> /// <param name="targetActivity">目标节点</param> /// <returns>转移实体</returns> public static TransitionEntity CreateJumpforwardEmptyTransition(ActivityEntity sourceActivity, ActivityEntity targetActivity) { TransitionEntity transition = new TransitionEntity(); transition.TransitionID = string.Empty; transition.SourceActivity = sourceActivity; transition.SourceActivityID = sourceActivity.ActivityID; transition.TargetActivity = targetActivity; transition.TargetActivityID = targetActivity.ActivityID; transition.DirectionType = TransitionDirectionTypeEnum.Forward; return(transition); }
/// <summary> /// 根据网关类型获取下一步节点列表的抽象方法 /// </summary> /// <param name="transition">转移</param> /// <param name="activity">活动</param> /// <param name="conditionKeyValuePair">条件kv对</param> /// <param name="scheduleStatus">匹配类型</param> /// <returns></returns> internal abstract NextActivityComponent GetNextActivityListFromGateway(TransitionEntity transition, ActivityEntity activity, out NextActivityMatchedType scheduleStatus);
/// <summary> /// 获取下一步节点列表 /// </summary> /// <param name="processInstanceID"></param> /// <param name="fromTransition"></param> /// <param name="currentGatewayActivity"></param> /// <param name="conditionKeyValuePair"></param> /// <returns></returns> internal override NextActivityComponent GetNextActivityListFromGateway(TransitionEntity fromTransition, ActivityEntity currentGatewayActivity, out NextActivityMatchedType resultType) { NextActivityComponent child = null; NextActivityComponent gatewayComponent = null; resultType = NextActivityMatchedType.Unknown; var transitionList = this.ProcessModel.GetForwardTransitionList(currentGatewayActivity.ActivityID).ToList(); if (currentGatewayActivity.GatewayDirectionType == GatewayDirectionEnum.AndSplit) { //判读连线上的条件是否都满足,如果都满足才可以取出后续节点列表 //获取AndSplit的每一条后续连线上的To节点 foreach (TransitionEntity transition in transitionList) { child = GetNextActivityListFromGatewayCore(transition, 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) { child = GetNextActivityListFromGatewayCore(transition, 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) { child = GetNextActivityListFromGatewayCore(transition, out resultType); gatewayComponent = AddChildToGatewayComponent(fromTransition, currentGatewayActivity, gatewayComponent, child); //退出循环 break; } if (gatewayComponent == null) { resultType = NextActivityMatchedType.NoneTransitionMatchedToSplit; } } else if (currentGatewayActivity.GatewayDirectionType == GatewayDirectionEnum.ComplexSplit) { resultType = NextActivityMatchedType.Failed; throw new Exception("ComplexSplit 没有具体实现!"); } else { resultType = NextActivityMatchedType.Failed; throw new Exception("Split 分支节点的类型不明确!"); } return(gatewayComponent); }