using Serein.Library; using Serein.Library.Api; using Serein.Library.Utils; using Serein.NodeFlow.Model; using System.Collections.Concurrent; using System.ComponentModel; using System.Reflection; namespace Serein.NodeFlow { /// /// 流程环境需要的扩展方法 /// public static class FlowNodeExtension { /// /// 判断是否为基础节点 /// /// public static bool IsBaseNode(this NodeControlType nodeControlType) { var nodeDesc = EnumHelper.GetAttribute(nodeControlType); if("base".Equals(nodeDesc?.Description, StringComparison.OrdinalIgnoreCase)) { return true; } return false; } /// /// 创建节点 /// /// 运行环境 /// 节点类型 /// 方法描述 /// /// public static NodeModelBase CreateNode(IFlowEnvironment env, NodeControlType nodeControlType, MethodDetails? methodDetails = null) { // 尝试获取需要创建的节点类型 if (!env.NodeMVVMManagement.TryGetType(nodeControlType, out var nodeMVVM) || nodeMVVM.ModelType == null) { throw new Exception($"无法创建{nodeControlType}节点,节点类型尚未注册。"); } // 生成实例 var nodeObj = Activator.CreateInstance(nodeMVVM.ModelType, env); if (nodeObj is not NodeModelBase nodeModel) { throw new Exception($"无法创建目标节点类型的实例[{nodeControlType}]"); } // 配置基础的属性 nodeModel.ControlType = nodeControlType; if (methodDetails == null) // 不存在方法描述时,可能是基础节点(表达式节点、条件表达式节点) { methodDetails = new MethodDetails(); } var md = methodDetails.CloneOfNode(nodeModel); nodeModel.DisplayName = md.MethodAnotherName; nodeModel.MethodDetails = md; nodeModel.OnCreating(); return nodeModel; } /// /// 程序集封装依赖 /// /// /// public static NodeLibraryInfo ToLibrary(this NodeLibraryInfo libraryInfo) { return new NodeLibraryInfo { AssemblyName = libraryInfo.AssemblyName, FileName = libraryInfo.FileName, FilePath = libraryInfo.FilePath, }; } /// /// 触发器运行后状态转为对应的后继分支类别 /// /// /// /// public static ConnectionInvokeType ToContentType(this FlipflopStateType flowStateType) { return flowStateType switch { FlipflopStateType.Succeed => ConnectionInvokeType.IsSucceed, FlipflopStateType.Fail => ConnectionInvokeType.IsFail, FlipflopStateType.Error => ConnectionInvokeType.IsError, FlipflopStateType.Cancel => ConnectionInvokeType.None, _ => throw new NotImplementedException("未定义的流程状态") }; } /// /// 判断 触发器节点 是否存在上游分支 /// /// /// public static bool NotExitPreviousNode(this SingleFlipflopNode node) { ConnectionInvokeType[] ct = [ConnectionInvokeType.IsSucceed, ConnectionInvokeType.IsFail, ConnectionInvokeType.IsError, ConnectionInvokeType.Upstream]; foreach (ConnectionInvokeType ctType in ct) { if (node.PreviousNodes[ctType].Count > 0) { return false; } } return true; } ///// ///// 从节点类型枚举中转为对应的 Model 类型 ///// ///// ///// //public static Type? ControlTypeToModel(this NodeControlType nodeControlType) //{ // // 确定创建的节点类型 // Type? nodeType = nodeControlType switch // { // NodeControlType.Action => typeof(SingleActionNode), // NodeControlType.Flipflop => typeof(SingleFlipflopNode), // NodeControlType.ExpOp => typeof(SingleExpOpNode), // NodeControlType.ExpCondition => typeof(SingleConditionNode), // NodeControlType.ConditionRegion => typeof(CompositeConditionNode), // _ => null // }; // return nodeType; //} //public static NodeControlType ModelToControlType(this NodeControlType nodeControlType) //{ // var type = nodeControlType.GetType(); // NodeControlType controlType = type switch // { // Type when type == typeof(SingleActionNode) => NodeControlType.Action, // Type when type == typeof(SingleFlipflopNode) => NodeControlType.Flipflop, // Type when type == typeof(SingleExpOpNode) => NodeControlType.ExpOp, // Type when type == typeof(SingleConditionNode) => NodeControlType.ExpCondition, // Type when type == typeof(CompositeConditionNode) => NodeControlType.ConditionRegion, // _ => NodeControlType.None, // }; // return controlType; //} } }