/// <summary> /// 根据Transition,获取下一步节点列表 /// </summary> /// <param name="nextActivityList"></param> /// <param name="processInstanceID"></param> /// <param name="currentGatewayActivity"></param> /// <param name="forwardTransition"></param> /// <param name="conditionKeyValuePair"></param> protected NextActivityComponent GetNextActivityListFromGatewayCore(TransitionEntity forwardTransition, IDictionary<string, string> conditionKeyValuePair, out NextActivityMatchedType resultType) { NextActivityComponent child = null; if (forwardTransition.ToActivity.ActivityType == ActivityTypeEnum.TaskNode || forwardTransition.ToActivity.ActivityType == ActivityTypeEnum.EndNode) { child = NextActivityComponentFactory.CreateNextActivityComponent(forwardTransition, forwardTransition.ToActivity); resultType = NextActivityMatchedType.Successed; } else if (forwardTransition.ToActivity.ActivityType == ActivityTypeEnum.GatewayNode) { child = GetNextActivityListFromGateway(forwardTransition, forwardTransition.ToActivity, conditionKeyValuePair, out resultType); } else { resultType = NextActivityMatchedType.Failed; throw new XmlDefinitionException(string.Format("未知的节点类型:{0}", forwardTransition.ToActivity.ActivityType.ToString())); } return child; }
/// <summary> /// 创建下一步活动的节点 /// </summary> /// <param name="activity"></param> /// <returns></returns> internal static NextActivityComponent CreateNextActivityComponent(TransitionEntity transition, ActivityEntity activity) { NextActivityComponent component = null; if (activity.ActivityType == ActivityTypeEnum.TaskNode || activity.ActivityType == ActivityTypeEnum.EndNode) { string name = "单一节点"; component = new NextActivityItem(name, transition, activity); } else { string name = string.Empty; if (activity.GatewayDirectionType == Slickflow.Engine.Common.GatewayDirectionEnum.AndSplit) { name = "必全选节点"; } else { name = "或多选节点"; } component = new NextActivityGateway(name, transition, activity); } return component; }
public NextActivityGateway(string name, TransitionEntity transition, ActivityEntity activity) { base.Name = name; base.Transition = transition; base.Activity = activity; }
/// <summary> /// 把子节点添加到网关路由节点,根据网关节点和子节点是否为空处理 /// </summary> /// <param name="gatewayComponent"></param> /// <param name="child"></param> /// <param name="currentGatewayActivity"></param> /// <returns></returns> protected NextActivityComponent AddChildToGatewayComponent(TransitionEntity fromTransition, ActivityEntity currentGatewayActivity, NextActivityComponent gatewayComponent, NextActivityComponent child) { if ((gatewayComponent == null) && (child != null)) gatewayComponent = NextActivityComponentFactory.CreateNextActivityComponent(fromTransition, currentGatewayActivity); if ((gatewayComponent != null) && (child != null)) gatewayComponent.Add(child); return gatewayComponent; }
/// <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, IDictionary<string, string> conditionKeyValuePair, out NextActivityMatchedType resultType) { NextActivityComponent child = null; NextActivityComponent gatewayComponent = null; resultType = NextActivityMatchedType.Unknown; //直接取出下步列表,运行时再根据条件执行 List<TransitionEntity> transitionList = base.ProcessModel.GetForwardTransitionList(currentGatewayActivity.ActivityGUID).ToList(); foreach (TransitionEntity transition in transitionList) { child = GetNextActivityListFromGatewayCore(transition, conditionKeyValuePair, out resultType); gatewayComponent = AddChildToGatewayComponent(fromTransition, currentGatewayActivity, gatewayComponent, child); } return gatewayComponent; }
/// <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, 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) { //判读连线上的条件是否都满足,如果都满足才可以取出后续节点列表 bool isCheckedOk = base.ProcessModel.CheckAndSplitOccurrenceCondition(transitionList, conditionKeyValuePair); if (isCheckedOk) { //获取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 if (currentGatewayActivity.GatewayDirectionType == GatewayDirectionEnum.ComplexSplit) { resultType = NextActivityMatchedType.Failed; throw new Exception("ComplexSplit 没有具体实现!"); } else { resultType = NextActivityMatchedType.Failed; throw new Exception("Split 分支节点的类型不明确!"); } return gatewayComponent; }
/// <summary> /// 根据网关类型获取下一步节点列表的抽象方法 /// </summary> /// <param name="processInstanceID"></param> /// <param name="transition"></param> /// <param name="activity"></param> /// <param name="conditionKeyValuePair"></param> /// <returns></returns> internal abstract NextActivityComponent GetNextActivityListFromGateway(TransitionEntity transition, ActivityEntity activity, IDictionary<string, string> conditionKeyValuePair, out NextActivityMatchedType scheduleStatus);
public static TransitionEntity CreateJumpforwardEmptyTransition(ActivityEntity fromActivity, ActivityEntity toActivity) { TransitionEntity transition = new TransitionEntity(); transition.TransitionGUID = string.Empty; transition.FromActivity = fromActivity; transition.FromActivityGUID = fromActivity.ActivityGUID; transition.ToActivity = toActivity; transition.ToActivityGUID = toActivity.ActivityGUID; transition.DirectionType = TransitionDirectionTypeEnum.Forward; return transition; }
/// <summary> /// 是否是满足条件的Transition,如果条件为空,默认是有效的。 /// </summary> /// <param name="forwardTransition"></param> /// <param name="conditionKeyValuePair"></param> /// <returns></returns> internal bool IsValidTransition(TransitionEntity transition, IDictionary<string, string> conditionKeyValuePair) { bool isValid = false; if (transition.Condition != null && !string.IsNullOrEmpty(transition.Condition.ConditionText)) { if (conditionKeyValuePair != null) { isValid = ParseCondition(transition, conditionKeyValuePair); } } else { //流程节点上定义的条件为空,则认为连线是可到达的 isValid = true; } return isValid; }
/// <summary> /// 把XML节点转换为ActivityEntity实体对象 /// </summary> /// <param name="node"></param> /// <returns></returns> internal TransitionEntity ConvertXmlTransitionNodeToTransitionEntity(XmlNode node) { //构造转移的基本属性 TransitionEntity entity = new TransitionEntity(); entity.TransitionGUID = XMLHelper.GetXmlAttribute(node, "id"); entity.FromActivityGUID = XMLHelper.GetXmlAttribute(node, "from"); entity.ToActivityGUID = XMLHelper.GetXmlAttribute(node, "to"); if (!string.IsNullOrEmpty(XMLHelper.GetXmlAttribute(node, "direction"))) { entity.DirectionType = (TransitionDirectionTypeEnum)Enum.Parse(typeof(TransitionDirectionTypeEnum), XMLHelper.GetXmlAttribute(node, "direction")); } //构造活动节点的实体对象 entity.FromActivity = GetActivity(entity.FromActivityGUID); entity.ToActivity = GetActivity(entity.ToActivityGUID); //构造转移的条件节点 XmlNode conditionNode = node.SelectSingleNode("Condition"); if (conditionNode != null) { entity.Condition = new ConditionEntity(); if (!string.IsNullOrEmpty(XMLHelper.GetXmlAttribute(conditionNode, "type"))) { entity.Condition.ConditionType = (ConditionTypeEnum)Enum.Parse(typeof(ConditionTypeEnum), XMLHelper.GetXmlAttribute(conditionNode, "type")); } if ((conditionNode.SelectSingleNode("ConditionText") != null) && !string.IsNullOrEmpty(XMLHelper.GetXmlNodeValue(conditionNode, "ConditionText"))) { entity.Condition.ConditionText = XMLHelper.GetXmlNodeValue(conditionNode, "ConditionText"); } } //构造转移的行为节点 XmlNode groupBehaviourNode = node.SelectSingleNode("GroupBehaviour"); if (groupBehaviourNode != null) { entity.GroupBehaviour = new GroupBehaviourEntity(); if (!string.IsNullOrEmpty(XMLHelper.GetXmlAttribute(groupBehaviourNode, "priority"))) { entity.GroupBehaviour.Priority = short.Parse(XMLHelper.GetXmlAttribute(groupBehaviourNode, "priority")); } if (!string.IsNullOrEmpty(XMLHelper.GetXmlAttribute(groupBehaviourNode, "parallelOption"))) { entity.GroupBehaviour.ParallelOption = (ParallelOptionEnum)Enum.Parse(typeof(ParallelOptionEnum), XMLHelper.GetXmlAttribute(groupBehaviourNode, "parallelOption")); } } return entity; }
/// <summary> /// 用LINQ解析条件表达式 /// </summary> /// <param name="transition"></param> /// <param name="conditionKeyValuePair"></param> /// <returns></returns> private bool ParseCondition(TransitionEntity transition, IDictionary<string, string> conditionKeyValuePair) { string expression = transition.Condition.ConditionText; string expressionReplaced = ReplaceParameterToValue(expression, conditionKeyValuePair); Expression e = System.Linq.Dynamic.DynamicExpression.Parse(typeof(Boolean), expressionReplaced); LambdaExpression LE = Expression.Lambda(e); Func<bool> testMe = (Func<bool>)LE.Compile(); bool result = testMe(); return result; }