using Newtonsoft.Json.Linq; using Serein.Library; using Serein.Library.Api; using Serein.Library.Utils; using System; using System.Collections.Generic; using System.Dynamic; using System.Linq; using System.Linq.Expressions; using System.Text; using System.Threading.Tasks; namespace Serein.NodeFlow.Model { /// /// Expression Operation - 表达式操作 /// [NodeProperty(ValuePath = NodeValuePath.Node)] public partial class SingleGlobalDataNode : NodeModelBase { /// /// 表达式 /// [PropertyInfo(IsNotification = true, CustomCodeAtStart = "ChangeName(value);")] private string _keyName; } /// /// 全局数据节点 /// public partial class SingleGlobalDataNode : NodeModelBase { public SingleGlobalDataNode(IFlowEnvironment environment) : base(environment) { } /// /// 数据节点 /// private string? DataNodeGuid; /// /// 设置数据节点 /// /// public void SetDataNode(NodeModelBase dataNode) { DataNodeGuid = dataNode.Guid; } private void ChangeName(string newName) { if(SereinEnv.GetFlowGlobalData(_keyName) == null) { return; } SereinEnv.ChangeNameFlowGlobalData(_keyName, newName); } /// /// 设置全局数据 /// /// /// public override async Task ExecutingAsync(IDynamicContext context) { if (string.IsNullOrEmpty(KeyName)) { context.NextOrientation = ConnectionInvokeType.IsError; SereinEnv.WriteLine(InfoType.ERROR, $"全局数据的KeyName不能为空[{this.Guid}]"); return null; } if (DataNodeGuid == null) { context.NextOrientation = ConnectionInvokeType.IsError; SereinEnv.WriteLine(InfoType.ERROR, $"全局数据节点没有数据[{this.Guid}]"); return null; } try { var result = await context.Env.InvokeNodeAsync(context, DataNodeGuid); SereinEnv.AddOrUpdateFlowGlobalData(KeyName, result); return result; } catch (Exception ex) { context.NextOrientation = ConnectionInvokeType.IsError; context.ExceptionOfRuning = ex; return null; } } /// /// 保存全局变量的数据 /// /// /// public override NodeInfo SaveCustomData(NodeInfo nodeInfo) { dynamic data = new ExpandoObject(); nodeInfo.CustomData = data; data.KeyName = KeyName; // 变量名称 if (string.IsNullOrEmpty(DataNodeGuid)) { return nodeInfo; } data.DataNodeGuid = DataNodeGuid; // 数据节点Guid nodeInfo.ChildNodeGuids = [DataNodeGuid]; return nodeInfo; } /// /// 加载全局变量的数据 /// /// public override void LoadCustomData(NodeInfo nodeInfo) { KeyName = nodeInfo.CustomData?.KeyName; DataNodeGuid = nodeInfo.CustomData?.DataNodeGuid; } /// /// 需要移除数据节点 /// public override void Remove() { // 移除数据节点 _ = this.Env.RemoveNodeAsync(DataNodeGuid); } } }