using Serein.Library; using Serein.Library.Api; using Serein.NodeFlow.Model; using Serein.NodeFlow.Model.Nodes; using System.Diagnostics.CodeAnalysis; namespace Serein.NodeFlow.Services { /// /// 流程模型服务 /// public class FlowModelService { private readonly IFlowEnvironment environment; private readonly FlowLibraryService flowLibraryService; /// /// 流程模型服务构造函数 /// /// /// public FlowModelService(IFlowEnvironment environment, FlowLibraryService flowLibraryService) { this.environment = environment; this.flowLibraryService = flowLibraryService; } /// /// 环境加载的节点集合 /// Node Guid - Node Model /// private Dictionary NodeModels { get; } = []; /// /// 运行环境加载的画布集合 /// private Dictionary FlowCanvass { get; } = []; /// /// 存放触发器节点(运行时全部调用) /// private List FlipflopNodes { get; } = []; /// /// 获取节点模型 /// /// /// public IFlowNode? GetNodeModel(string guid) { NodeModels.TryGetValue(guid, out var nodeModel); return nodeModel; } /// /// 获取画布模型 /// /// /// public FlowCanvasDetails? GetCanvasModel(string guid) { FlowCanvass.TryGetValue(guid, out var nodeModel); return nodeModel; } /// /// 尝试获取节点模型 /// /// /// /// public bool TryGetNodeModel(string guid, [NotNullWhen(true)] out IFlowNode? flowNode) { return NodeModels.TryGetValue(guid, out flowNode!); } /// /// 尝试获取画布模型 /// /// /// /// public bool TryGetCanvasModel(string guid, [NotNullWhen(true)] out FlowCanvasDetails? flowCanvas) { if(FlowCanvass.TryGetValue(guid, out var details)) { flowCanvas = details; return true; } flowCanvas = details; return false; } /// /// 检查是否包含节点模型 /// /// /// public bool ContainsNodeModel(string guid) { return NodeModels.ContainsKey(guid); } /// /// 检查是否包含画布模型 /// /// /// public bool ContainsCanvasModel(string guid) { return FlowCanvass.ContainsKey(guid); } /// /// 添加节点模型 /// /// /// public bool AddNodeModel(IFlowNode flowNode) { ArgumentNullException.ThrowIfNull(flowNode); ArgumentNullException.ThrowIfNull(flowNode.Guid); return NodeModels.TryAdd(flowNode.Guid, flowNode); } /// /// 添加画布模型 /// /// /// public bool AddCanvasModel(FlowCanvasDetails flowCanvasDetails) { ArgumentNullException.ThrowIfNull(flowCanvasDetails); ArgumentNullException.ThrowIfNull(flowCanvasDetails.Guid); return FlowCanvass.TryAdd(flowCanvasDetails.Guid, flowCanvasDetails); } /// /// 移除节点模型 /// /// /// public bool RemoveNodeModel(IFlowNode flowNode) { ArgumentNullException.ThrowIfNull(flowNode.Guid); return NodeModels.Remove(flowNode.Guid); } /// /// 移除画布模型 /// /// /// public bool RemoveCanvasModel(FlowCanvasDetails flowCanvasDetails) { ArgumentNullException.ThrowIfNull(flowCanvasDetails.Guid); return FlowCanvass.Remove(flowCanvasDetails.Guid); } /// /// 获取所有节点模型 /// /// public List GetAllNodeModel() => [.. NodeModels.Values]; /// /// 获取指定画布上的所有节点模型 /// /// /// public List GetAllNodeModel(string canvasGuid) => NodeModels.Values.Where(x => x.CanvasDetails.Guid == canvasGuid).ToList(); /// /// 获取所有画布模型 /// /// public List GetAllCanvasModel() => [.. FlowCanvass.Values]; /// /// 检查是否存在画布模型 /// /// public bool IsExsitCanvas() { return FlowCanvass.Count > 0; } /// /// 检查指定画布上是否存在节点模型 /// /// /// public bool IsExsitNodeOnCanvas(string canvasGuid) { if (!FlowCanvass.TryGetValue(canvasGuid, out var flowCanvasDetails)) { return false; } return flowCanvasDetails.Nodes.Count > 0; } } } /* /// /// 生成方法名称 /// /// /// /// private string GetNodeMethodName(IFlowNode flowNode) { return $"FlowMethod_{flowNode.Guid.Remove('-')}"; if (flowNode.ControlType == NodeControlType.Action) { if (!flowLibraryService.TryGetMethodInfo(flowNode.MethodDetails.AssemblyName, flowNode.MethodDetails.MethodName, out var methodInfo)) { throw new Exception(); } return $"FlowMethod_{nameof(NodeControlType.Action)}_{methodInfo.Name}"; } else if (flowNode.ControlType == NodeControlType.Flipflop) { if (!flowLibraryService.TryGetMethodInfo(flowNode.MethodDetails.AssemblyName, flowNode.MethodDetails.MethodName, out var methodInfo)) { throw new Exception(); } return $"FlowMethod_{nameof(NodeControlType.Flipflop)}_{methodInfo.Name}"; } else if (flowNode.ControlType == NodeControlType.Script) { return $"FlowMethod_{flowNode.Guid.Remove('-')}"; } else if (flowNode.ControlType == NodeControlType.UI) { } else if (flowNode.ControlType == NodeControlType.ExpCondition) { } else if (flowNode.ControlType == NodeControlType.ExpOp) { } else { throw new Exception("无法为该节点生成方法名称"); } }*/