/// <summary> /// 获取流程起始的活动节点列表(开始节点之后,可能有多个节点) /// </summary> /// <param name="conditionKeyValuePair">条件表达式的参数名称-参数值的集合</param> /// <returns></returns> internal NextActivityMatchedResult GetFirstActivityList(Guid processInstanceGUID, ConditionKeyValuePair conditionKeyValuePair) { ActivityEntity startActivity = GetStartActivity(); return(GetNextActivityList(processInstanceGUID, startActivity, conditionKeyValuePair)); }
/// <summary> /// 获取下一步节点列表,伴随条件信息 /// </summary> /// <param name="currentActivity"></param> /// <param name="conditionKeyValuePair"></param> /// <returns></returns> internal NextActivityMatchedResult GetNextActivityList(Guid ProcessInstanceGUID, ActivityEntity currentActivity, ConditionKeyValuePair conditionKeyValuePair) { NextActivityMatchedResult result = null; NextActivityMatchedType resultType = NextActivityMatchedType.Unknown; //创建“下一步节点”的根节点 NextActivityComponent root = NextActivityComponentFactory.CreateNextActivityComponent(); NextActivityComponent child = null; TransitionManager tm = new TransitionManager(this.ProcessEntity); List <TransitionEntity> transitionList = tm.GetForwardTransitionList(currentActivity.ActivityGUID, conditionKeyValuePair).ToList(); if (transitionList.Count > 0) { //遍历连线,获取下一步节点的列表 foreach (TransitionEntity transition in transitionList) { if (transition.ToActivity.NodeType == NodeTypeEnum.EndNode || transition.ToActivity.NodeType == NodeTypeEnum.TaskNode) { child = NextActivityComponentFactory.CreateNextActivityComponent(transition, transition.ToActivity); } else if (transition.ToActivity.NodeType == NodeTypeEnum.GatewayNode) { NextActivityScheduleBase activitySchedule = NextActivityScheduleFactory.CreateActivitySchedule(this.ProcessEntity, transition.ToActivity.GatewaySplitJoinType); child = activitySchedule.GetNextActivityListFromGateway(ProcessInstanceGUID, transition, transition.ToActivity, conditionKeyValuePair, out resultType); } else { throw new XmlDefinitionException(string.Format("未知的节点类型:{0}", transition.ToActivity.NodeType.ToString())); } if (child != null) { root.Add(child); resultType = NextActivityMatchedType.Successed; } } } else { resultType = NextActivityMatchedType.NoneTransitionFilteredByCondition; } result = NextActivityMatchedResult.CreateNextActivityMatchedResultObject(resultType, root); return(result); }
/// <summary> /// 用LINQ解析条件表达式 /// </summary> /// <param name="transition"></param> /// <param name="conditionKeyValuePair"></param> /// <returns></returns> private bool ParseCondition(TransitionEntity transition, ConditionKeyValuePair conditionKeyValuePair) { string expression = transition.Condition.ConditionText; string expressionReplaced = ReplaceParameterToValue(expression, conditionKeyValuePair); //Expression e = System.Linq.Dynamic.DynamicExpression.Parse(typeof(Boolean), expressionReplaced); Expression e = null; LambdaExpression LE = Expression.Lambda(e); Func <bool> testMe = (Func <bool>)LE.Compile(); bool result = testMe(); return(result); }
/// <summary> /// 获取当前节点的后续连线的集合(使用条件过滤) /// </summary> /// <param name="fromActivityGUID"></param> /// <param name="conditionKeyValuePair"></param> /// <returns></returns> internal IList <TransitionEntity> GetForwardTransitionList(Guid fromActivityGUID, ConditionKeyValuePair conditionKeyValuePair) { IList <TransitionEntity> transitionList = new List <TransitionEntity>(); XmlNodeList transitionNodeList = GetForwardXmlTransitionNodeList(fromActivityGUID); foreach (XmlNode transitionNode in transitionNodeList) { TransitionEntity entity = ConvertXmlTransitionNodeToTransitionEntity(transitionNode); bool isValidTranstion = IsValidTransition(entity, conditionKeyValuePair); if (isValidTranstion) { transitionList.Add(entity); } } return(transitionList); }
/// <summary> /// 是否是满足条件的Transition,如果条件为空,默认是有效的。 /// </summary> /// <param name="forwardTransition"></param> /// <param name="conditionKeyValuePair"></param> /// <returns></returns> internal bool IsValidTransition(TransitionEntity transition, ConditionKeyValuePair 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> /// 获取下一步节点列表(伴随条件和资源) /// </summary> /// <param name="currentActivity"></param> /// <param name="conditionKeyValuePair"></param> /// <returns></returns> internal NextActivityMatchedResult GetNextActivityList(Guid processInstanceGUID, ActivityEntity currentActivity, ConditionKeyValuePair conditionKeyValuePair, ActivityResource activityResource, Expression <Func <ActivityResource, ActivityEntity, bool> > expression) { NextActivityComponent newRoot = NextActivityComponentFactory.CreateNextActivityComponent(); //先获取未加运行时表达式过滤的下一步节点列表 NextActivityMatchedResult result = GetNextActivityList(processInstanceGUID, currentActivity, conditionKeyValuePair); foreach (NextActivityComponent c in result.Root) { if (c.HasChildren) { NextActivityComponent child = GetNextActivityListByExpressionRecurisivly(c, activityResource, expression); if (child != null) { newRoot.Add(child); } } else { newRoot.Add(c); } } NextActivityMatchedResult newResult = null; if (newRoot.HasChildren) { newResult = NextActivityMatchedResult.CreateNextActivityMatchedResultObject(result.MatchedType, newRoot); } else { newResult = NextActivityMatchedResult.CreateNextActivityMatchedResultObject(NextActivityMatchedType.NoneTransitionFilteredByCondition, newRoot); } return(newResult); }
/// <summary> /// 判断整个连线集合,是否满足条件 /// </summary> /// <param name="transitionList"></param> /// <param name="conditionKeyValuePair"></param> /// <returns></returns> internal bool CheckAndSplitOccurrenceCondition(List <TransitionEntity> transitionList, ConditionKeyValuePair conditionKeyValuePair) { bool isValidAll = true; foreach (TransitionEntity transition in transitionList) { //只有是必需验证的条件,采取检查 if (transition.GroupBehaviour.ParallelOption == ParallelOptionEnum.Necessary) { bool isVailid = IsValidTransition(transition, conditionKeyValuePair); if (!isVailid) { isValidAll = false; break; } } } return(isValidAll); }
public static NextActivityMatchedResult GetNextActivityList(Guid processGUID, Guid processInstanceGUID, Guid activityGUID, ConditionKeyValuePair conditionKeyValuePair) { try { //var pm = new ProcessManager(); //var var processModel = new ProcessModel(processGUID); var activity = processModel.GetActivity(activityGUID); return(processModel.GetNextActivityList(processInstanceGUID, activity, conditionKeyValuePair)); } catch (System.Exception) { //throw new WfDataException(string.Format("获取当前节点的下一节点信息失败,详细信息:{0}", ex.Message), ex); throw; } }
public static NextActivityMatchedResult GetNextActivityList(Guid processGUID, Guid processInstanceGUID, Guid activityGUID, ConditionKeyValuePair conditionKeyValuePair, ActivityResource activityResource, Expression <Func <ActivityResource, ActivityEntity, bool> > expression) { try { var processModel = new ProcessModel(processGUID); var activity = processModel.GetActivity(activityGUID); return(processModel.GetNextActivityList(processInstanceGUID, activity, conditionKeyValuePair, activityResource, expression)); } catch (System.Exception) { //throw new WfDataException(string.Format("获取当前节点的下一节点信息失败,详细信息:{0}", ex.Message), ex); throw; } }
/// <summary> /// 创建资源信息 /// </summary> /// <param name="currentLogonUser"></param> /// <param name="nextActivityPerformers"></param> /// <returns></returns> public static ActivityResource CreateActivityResource(int userID, string userName, IDictionary <Guid, PerformerList> nextActivityPerformers, ConditionKeyValuePair conditionKeyValuePair = null) { return(new ActivityResource(userID, userName, nextActivityPerformers, conditionKeyValuePair)); }