1. 修改了FlowResult的创建方式,新增了IsSuccess与Message,为后续进行流程日志追踪准备。

2. 修复了删除节点时,没有正确消除与之相关的参数获取关系。
3. IFlowNode新增了StartFlowAsync方法。
4. Library项目中FlowNodeExtension拓展类转移到了NodeFlow项目中。
5.  修改了Script自定义参数保存,对参数类型、返回值类型进行保存。
6. Library.Utils.BenchmarkHelpter中添加了Task、Task<>的重载方法。
7. NodeFlow项目中,FlowEnvironment默认使用通过NewtonsoftJson实现的JSON门户类。
8. NodeFlow项目中,FlowControl缓存了 FlowWorkOptions 选项实体,并且对于 FlowWorkManagement 进行了池化管理(但后续的项目中考虑重构流程任务运行时)。
This commit is contained in:
fengjiayi
2025-07-30 11:29:12 +08:00
parent 8dc7f5dd9b
commit 48289dae11
27 changed files with 965 additions and 106 deletions

View File

@@ -1,5 +1,6 @@
using Serein.Library;
using Serein.Library.Api;
using Serein.Library.Utils;
using Serein.Script;
using Serein.Script.Node.FlowControl;
using System;
@@ -8,6 +9,7 @@ using System.Diagnostics;
using System.Dynamic;
using System.Linq;
using System.Linq.Expressions;
using System.Reactive;
using System.Reflection;
using System.Text;
using System.Threading.Tasks;
@@ -105,18 +107,38 @@ namespace Serein.NodeFlow.Model.Nodes
}
/// <summary>
/// 保存项目时保存脚本代码
/// 保存项目时保存脚本代码、方法入参类型、返回值类型
/// </summary>
/// <param name="nodeInfo"></param>
/// <returns></returns>
public override NodeInfo SaveCustomData(NodeInfo nodeInfo)
{
var paramsTypeName = MethodDetails.ParameterDetailss.Select(pd =>
{
return new ScriptArgInfo
{
Index = pd.Index,
ArgName = pd.Name,
ArgType = pd.DataType.FullName,
};
}).ToArray();
dynamic data = new ExpandoObject();
data.Script = Script ?? "";
data.ParamsTypeName = paramsTypeName;
data.ReturnTypeName = MethodDetails.ReturnType;
nodeInfo.CustomData = data;
return nodeInfo;
}
private class ScriptArgInfo
{
public int Index { get; set; }
public string? ArgName { get; set; }
public string? ArgType { get; set; }
}
/// <summary>
/// 加载自定义数据
/// </summary>
@@ -124,18 +146,44 @@ namespace Serein.NodeFlow.Model.Nodes
public override void LoadCustomData(NodeInfo nodeInfo)
{
this.Script = nodeInfo.CustomData?.Script ?? "";
var paramCount = Math.Min(MethodDetails.ParameterDetailss.Length, nodeInfo.ParameterData.Length);
// 更新变量名
for (int i = 0; i < Math.Min(this.MethodDetails.ParameterDetailss.Length, nodeInfo.ParameterData.Length); i++)
for (int i = 0; i < paramCount; i++)
{
this.MethodDetails.ParameterDetailss[i].Name = nodeInfo.ParameterData[i].ArgName;
var pd = MethodDetails.ParameterDetailss[i];
pd.Name = nodeInfo.ParameterData[i].ArgName;
}
try
{
string paramsTypeNameJson = nodeInfo.CustomData?.ParamsTypeName.ToString() ?? "[]";
ScriptArgInfo[] array = JsonHelper.Deserialize<ScriptArgInfo[]>(paramsTypeNameJson);
string returnTypeName = nodeInfo.CustomData?.ReturnTypeName ?? typeof(object);
Type?[] argType = array.Select(item => string.IsNullOrWhiteSpace(item.ArgType) ? null : Type.GetType(item.ArgType) ?? typeof(Unit)).ToArray();
Type? resType = Type.GetType(returnTypeName);
for (int i = 0; i < paramCount; i++)
{
var pd = MethodDetails.ParameterDetailss[i];
pd.DataType = argType[i];
}
MethodDetails.ReturnType = resType;
}
catch (Exception ex)
{
SereinEnv.WriteLine(InfoType.ERROR ,$"加载脚本自定义数据类型信息时发生异常:{ex.Message}");
}
//ReloadScript();// 加载时重新解析
IsScriptChanged = false; // 重置脚本改变标志
}
/// <summary>
/// 重新加载脚本代码
/// </summary>
@@ -261,7 +309,7 @@ namespace Serein.NodeFlow.Model.Nodes
/// <returns></returns>
public async Task<FlowResult> ExecutingAsync(NodeModelBase flowCallNode, IFlowContext context, CancellationToken token)
{
if (token.IsCancellationRequested) return new FlowResult(this.Guid, context);
if (token.IsCancellationRequested) return FlowResult.Fail(this.Guid, context, "流程已通过token取消");
var @params = await flowCallNode.GetParametersAsync(context, token);
IScriptInvokeContext scriptContext = new ScriptInvokeContext(context);
@@ -284,11 +332,11 @@ namespace Serein.NodeFlow.Model.Nodes
var envEvent = context.Env.Event;
envEvent.FlowRunComplete += onFlowStop; // 防止运行后台流程
if (token.IsCancellationRequested) return new FlowResult(this.Guid, context);
if (token.IsCancellationRequested) return FlowResult.Fail(this.Guid, context, "流程已通过token取消");
var result = await sereinScript.InterpreterAsync(scriptContext); // 从入口节点执行
envEvent.FlowRunComplete -= onFlowStop;
return new FlowResult(this.Guid, context, result);
return FlowResult.OK(this.Guid, context, result);
}
}