using Serein.Library; using Serein.Library.Api; using Serein.NodeFlow.Model; using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Threading.Tasks; namespace Serein.NodeFlow.Services { /// /// 流程模型服务 /// public class FlowModelService { private readonly IFlowEnvironment environment; public FlowModelService(IFlowEnvironment environment) { this.environment = environment; } /// /// 环境加载的节点集合 /// 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,out IFlowNode flowNode) { return NodeModels.TryGetValue(guid, out flowNode!); } public bool TryGetCanvasModel(string guid,out FlowCanvasDetails flowCanvas) { return FlowCanvass.TryGetValue(guid, out flowCanvas!);; } 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; } } }