优化了SereinEnv.WriteLine(Exception, InfoClass)输出,可以通过更改InfoClass控制是否输出异常堆栈信息。

优化了批量加载节点时,脚本节点类型分析异常的问题。
This commit is contained in:
fengjiayi
2025-07-17 22:46:40 +08:00
parent 550122208d
commit 88de5a21f5
13 changed files with 113 additions and 36 deletions

View File

@@ -80,23 +80,17 @@ namespace Serein.NodeFlow.Model
/// </summary>
public override void OnCreating()
{
/* MethodInfo? method = this.GetType().GetMethod(nameof(GetFlowApi));
if (method != null)
{
ScriptInterpreter.AddFunction(nameof(GetFlowApi), method, () => this); // 挂载获取流程接口
}*/
var md = MethodDetails;
var pd = md.ParameterDetailss ??= new ParameterDetails[1];
md.ParamsArgIndex = 0;
pd[0] = new ParameterDetails
{
Index = 0,
Name = "object",
Name = "string",
IsExplicitData = true,
DataValue = string.Empty,
DataType = typeof(object),
ExplicitType = typeof(object),
DataType = typeof(string),
ExplicitType = typeof(string),
ArgDataSourceNodeGuid = string.Empty,
ArgDataSourceType = ConnectionArgSourceType.GetPreviousNodeData,
NodeModel = this,
@@ -105,7 +99,7 @@ namespace Serein.NodeFlow.Model
IsParams = true,
//Description = "脚本节点入参"
};
md.ReturnType = typeof(object); // 默认返回 object
md.ReturnType = typeof(void); // 默认返回
}
@@ -136,7 +130,7 @@ namespace Serein.NodeFlow.Model
this.MethodDetails.ParameterDetailss[i].Name = nodeInfo.ParameterData[i].ArgName;
}
ReloadScript();// 加载时重新解析
//ReloadScript();// 加载时重新解析
IsScriptChanged = false; // 重置脚本改变标志
}
@@ -144,7 +138,7 @@ namespace Serein.NodeFlow.Model
/// <summary>
/// 重新加载脚本代码
/// </summary>
public void ReloadScript()
public bool ReloadScript()
{
try
{
@@ -158,16 +152,30 @@ namespace Serein.NodeFlow.Model
varNames.Add(pd.Name);
}
Dictionary<string, Type> dict = MethodDetails.ParameterDetailss.ToDictionary(pd => pd.Name, pd => pd.DataType); // 准备预定义类型
var returnType = sereinScript.ParserScript(dict, Script); // 开始解析获取程序主节点
var argTypes = MethodDetails.ParameterDetailss
.Select(pd =>
{
if (Env.TryGetNodeModel(pd.ArgDataSourceNodeGuid, out var node) &&
node.MethodDetails?.ReturnType is not null)
{
pd.DataType = node.MethodDetails.ReturnType;
return (pd.Name, node.MethodDetails.ReturnType);
}
return default;
})
.Where(x => x != default)
.ToDictionary(x => x.Name, x => x.ReturnType); // 准备预定义类型
var returnType = sereinScript.ParserScript(Script, argTypes); // 开始解析获取程序主节点
MethodDetails.ReturnType = returnType;
return true;
}
catch (Exception ex)
{
SereinEnv.WriteLine(InfoType.ERROR, ex.ToString());
SereinEnv.WriteLine(ex);
return false; // 解析失败
}
}
@@ -202,7 +210,7 @@ namespace Serein.NodeFlow.Model
lock (@params) {
if (IsScriptChanged)
{
ReloadScript();// 每次都重新解析
ReloadScript();// 执行时检查是否需要重新解析
IsScriptChanged = false;
context.Env.WriteLine(InfoType.INFO, $"[{Guid}]脚本解析完成");
}

View File

@@ -378,7 +378,7 @@ namespace Serein.NodeFlow.Model.Operation
if (FromNode.MethodDetails.ReturnType == typeof(void))
{
SereinEnv.WriteLine(InfoType.WARN, $"连接失败,节点参数入参不允许接收 void 返回值");
SereinEnv.WriteLine(InfoType.WARN, $"连接失败,节点参数入参不允许接收 void 返回值。起始节点[{FromNode.Guid}],目标节点[{FromNode.Guid}]。");
return false;
}
@@ -388,7 +388,7 @@ namespace Serein.NodeFlow.Model.Operation
if (false && string.IsNullOrWhiteSpace(toNodeArgSourceGuid) && flowModelService.ContainsNodeModel(toNodeArgSourceGuid))
{
SereinEnv.WriteLine(InfoType.WARN, $"连接失败,节点参数入参不允许接收多个节点返回值");
SereinEnv.WriteLine(InfoType.WARN, $"连接失败,节点参数入参不允许接收多个节点返回值。起始节点[{FromNode.Guid}],目标节点[{FromNode.Guid}]。");
return false;
}