From 3059e109fc1bb005bde27ca39400804f0cc25dc7 Mon Sep 17 00:00:00 2001 From: fengjiayi <12821976+ning_xi@user.noreply.gitee.com> Date: Mon, 4 Aug 2025 23:13:13 +0800 Subject: [PATCH] =?UTF-8?q?1.=20=E4=BF=AE=E5=A4=8D=E4=BA=86=E6=B5=81?= =?UTF-8?q?=E7=A8=8B=E5=9B=BE=E8=BD=ACc#=E4=BB=A3=E7=A0=81=E6=97=B6?= =?UTF-8?q?=EF=BC=8C=E6=96=B9=E6=B3=95=E5=AD=98=E5=9C=A8=E5=8F=AF=E9=80=89?= =?UTF-8?q?=E5=8F=82=E6=95=B0=EF=BC=8C=E4=BD=86=E6=97=A0=E6=B3=95=E6=AD=A3?= =?UTF-8?q?=E5=B8=B8=E7=94=9F=E6=88=90=E7=9A=84=E9=97=AE=E9=A2=98=202.=20?= =?UTF-8?q?=E6=B7=BB=E5=8A=A0=E4=BA=86=E5=AF=B9[Global]=E5=85=A8=E5=B1=80?= =?UTF-8?q?=E6=95=B0=E6=8D=AE=E8=8A=82=E7=82=B9=E7=9A=84=E4=BB=A3=E7=A0=81?= =?UTF-8?q?=E7=94=9F=E6=88=90=E6=94=AF=E6=8C=81?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- Library/Enums/NodeType.cs | 1 + NodeFlow/Services/CoreGenerateExtension.cs | 1 - NodeFlow/Services/FlowCoreGenerateService.cs | 77 ++++++++++++++------ 3 files changed, 56 insertions(+), 23 deletions(-) diff --git a/Library/Enums/NodeType.cs b/Library/Enums/NodeType.cs index f641ae7..d110ed0 100644 --- a/Library/Enums/NodeType.cs +++ b/Library/Enums/NodeType.cs @@ -111,6 +111,7 @@ namespace Serein.Library /// C#脚本节点 /// [Description("base")] + [Obsolete("目前没有支持C#转流程节点的计划")] NetScript, /// diff --git a/NodeFlow/Services/CoreGenerateExtension.cs b/NodeFlow/Services/CoreGenerateExtension.cs index 6a9f835..5f46656 100644 --- a/NodeFlow/Services/CoreGenerateExtension.cs +++ b/NodeFlow/Services/CoreGenerateExtension.cs @@ -72,7 +72,6 @@ namespace Serein.NodeFlow.Services return methodName; } - /// /// 生成完全的xml注释 diff --git a/NodeFlow/Services/FlowCoreGenerateService.cs b/NodeFlow/Services/FlowCoreGenerateService.cs index b30226c..8ac62ca 100644 --- a/NodeFlow/Services/FlowCoreGenerateService.cs +++ b/NodeFlow/Services/FlowCoreGenerateService.cs @@ -5,6 +5,7 @@ using Serein.Library.Utils; using Serein.NodeFlow.Model.Infos; using Serein.NodeFlow.Model.Nodes; using Serein.Script; +using System; using System.Reflection; using System.Runtime.CompilerServices; using System.Text; @@ -182,6 +183,10 @@ namespace Serein.NodeFlow.Services { CreateMethodCore_Script(sb_main, singleScriptNode, flowContextTypeName, flowContext); } + else if (flowNode.ControlType == NodeControlType.GlobalData && flowNode is SingleGlobalDataNode globalDataNode) + { + CreateMethodCore_GlobalData(sb_main, globalDataNode, flowContextTypeName, flowContext); + } else if (flowNode.ControlType == NodeControlType.UI) { } @@ -232,6 +237,7 @@ namespace Serein.NodeFlow.Services || node.ControlType == NodeControlType.Flipflop || node.ControlType == NodeControlType.FlowCall || node.ControlType == NodeControlType.Script + || node.ControlType == NodeControlType.GlobalData ) { var md = node.MethodDetails; @@ -505,8 +511,8 @@ public async global::System.Threading.Tasks.Task InitAndStartAsync(global::Syste for (int index = 0; index < pds.Length; index++) { ParameterDetails? pd = pds[index]; - ParameterInfo parameterInfo = param[index]; - var paramtTypeFullName = parameterInfo.ParameterType.GetFriendlyName(); + ParameterInfo parameterInfo = pd.IsParams ? param[md.ParamsArgIndex] : param[index]; + var paramtTypeFullName = pd.IsParams ? parameterInfo.ParameterType.GetElementType().GetFriendlyName() : parameterInfo.ParameterType.GetFriendlyName(); if (pd.IsExplicitData) { @@ -524,16 +530,12 @@ public async global::System.Threading.Tasks.Task InitAndStartAsync(global::Syste } } - else if (parameterInfo.ParameterType == typeof(string)) + else /*if (parameterInfo.ParameterType == typeof(string))*/ { var dataString = EscapeForCSharpString(pd.DataValue); sb_invoke_login.AppendCode(3, $"global::{paramtTypeFullName} value{index} = \"{dataString}\"; // 获取当前节点的上一节点数据"); } - else - { - // 处理表达式 - } - + } else { @@ -691,28 +693,16 @@ public async global::System.Threading.Tasks.Task InitAndStartAsync(global::Syste var instanceType = flowCallNode.MethodDetails.ActingInstanceType; var returnType = singleScriptNode.MethodDetails.ReturnType; - //var instanceName = instanceType.ToCamelCase();// $"instance_{instanceType.Name}"; - - //var instanceTypeFullName = instanceType.FullName; var returnTypeFullName = returnType == typeof(void) ? "void" : returnType.FullName; #region 方法内部逻辑 StringBuilder sb_invoke_login = new StringBuilder(); if (flowCallNode.MethodDetails is null) return; - //var param = methodInfo.GetParameters(); var md = flowCallNode.MethodDetails; var pds = flowCallNode.MethodDetails.ParameterDetailss; - //if (param is null) return; if (pds is null) return; - /* for (int index = 0; index < pds.Length; index++) - { - ParameterDetails? pd = pds[index]; - ParameterInfo parameterInfo = param[index]; - var paramtTypeFullName = parameterInfo.ParameterType.FullName; - }*/ - var flowDataName = $"flowData{flowApiMethodInfo.ApiMethodName}"; var apiData = $"apiData{flowApiMethodInfo.ApiMethodName}"; sb_invoke_login.AppendCode(3, $"global::{typeof(object).FullName} {flowDataName} = {flowContext}.GetFlowData(\"{flowApiMethodInfo.ApiMethodName}\").Value;"); @@ -867,7 +857,6 @@ public async global::System.Threading.Tasks.Task InitAndStartAsync(global::Syste private void CreateMethodCore_Script(StringBuilder sb_main, SingleScriptNode singleScriptNode, string? flowContextTypeName, string flowContext) { - if (!_scriptMethodInfos.TryGetValue(singleScriptNode, out var scriptMethodInfo)) { return; @@ -1055,6 +1044,50 @@ public async global::System.Threading.Tasks.Task InitAndStartAsync(global::Syste } + /// + /// 生成[GlobalData]节点的方法调用 + /// + /// + /// + /// + /// + private void CreateMethodCore_GlobalData(StringBuilder sb_main, SingleGlobalDataNode globalDataNode, string? flowContextTypeName, string flowContext) + { + if (!_globalDataInfos.TryGetValue(globalDataNode, out var globalDataInfo)) + { + return; + } + + var dataSourceNode = globalDataInfo.DataSourceNode; + var returnType = dataSourceNode.MethodDetails.ReturnType; + + var keyName = globalDataInfo.KeyName; + + sb_main.AppendCode(2, $"[Description(\"全局数据\")]"); + sb_main.AppendCode(2, $"private void {globalDataNode.ToNodeMethodName()}(global::{flowContextTypeName} {flowContext})"); + sb_main.AppendCode(2, $"{{"); + + if (typeof(Task).IsAssignableFrom(returnType)) + { + sb_main.AppendCode(3, $"await {dataSourceNode.ToNodeMethodName()}({flowContext}); // 需要立即调用指定方法"); + } + else + { + sb_main.AppendCode(3, $"{dataSourceNode.ToNodeMethodName()}({flowContext}); // 需要立即调用指定方法"); + } + var returnTypeFullName = $"global::{returnType.GetFriendlyName()}"; + string data = nameof(data); + sb_main.AppendCode(3, $"{returnTypeFullName} {data} = ({returnTypeFullName}){flowContext}.{nameof(IFlowContext.GetFlowData)}(\"{dataSourceNode.Guid}\").Value; // 获取指定节点的数据"); + sb_main.AppendCode(3, $"global::{typeof(SereinEnv).FullName}.{nameof(SereinEnv.AddOrUpdateFlowGlobalData)}(\"{keyName}\", {data}); // 设置全局数据"); + sb_main.AppendCode(3, $"{flowContext}.{nameof(IFlowContext.AddOrUpdate)}(\"{globalDataNode.Guid}\", {data}); // 更新全局数据节点的数据"); + sb_main.AppendCode(3, $"{flowContext}.{nameof(IFlowContext.AddOrUpdate)}(\"{dataSourceNode.Guid}\", {data}); // 更新全局数据节点数据来源节点的数据"); + sb_main.AppendCode(2, $"}}"); // 方法结束 + sb_main.AppendLine(); // 方法结束 + + } + + + #endregion #region 全局触发器与分支触发器生成 @@ -1136,7 +1169,7 @@ public async global::System.Threading.Tasks.Task InitAndStartAsync(global::Syste { var xmlDescription = $"{$"全局数据,来源于[{info.Node.MethodDetails?.MethodName}]{info.Node.Guid}".ToXmlComments(2)}"; sb.AppendCode(2, xmlDescription); - sb.AppendCode(2, $"public global::{info.DataType.FullName} {info.KeyName} {{ get; set; }};"); + sb.AppendCode(2, $"public global::{info.DataType.FullName} {info.KeyName} {{ get; set; }}"); } sb.AppendLine(); sb.AppendCode(1, $"}}");