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; using System.Xml.Linq; 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; } public void ToCsharpCoreFile() { // TODO: 实现将流程模型转换为C# Core文件的逻辑 // 遍历每个画布 int canvas_index = 0; HashSet assemblyFlowClasss = new HashSet(); // 用于创建依赖注入项 StringBuilder stringBuilder = new StringBuilder(); foreach (var canvas in FlowCanvass.Values) { int flowTemplateId = canvas_index++; string flowTemplateClassName = $"FlowTemplate{flowTemplateId}"; HashSet flowClasss = new HashSet(); // 收集程序集信息 foreach (var node in canvas.Nodes) { var instanceType = node.MethodDetails.ActingInstanceType; if(instanceType is not null) { flowClasss.Add(instanceType); assemblyFlowClasss.Add(instanceType); } } // 生成方法信息 foreach (var node in canvas.Nodes) { var instanceType = node.MethodDetails.ActingInstanceType; var returnType = node.MethodDetails.ReturnType; var methodName = node.MethodDetails.MethodAnotherName; var instanceTypeFullName = instanceType.FullName; var returnTypeFullName = returnType == typeof(void) ? "void" : returnType.FullName; string methodContext = $"private {returnTypeFullName} NodeMethod_{methodName}({nameof(IDynamicContext)} context)"; SereinEnv.WriteLine(InfoType.INFO, methodContext); } } } } }