mirror of
https://gitee.com/langsisi_admin/serein-flow
synced 2026-03-03 00:00:49 +08:00
重写了Web Api的逻辑,用Emit构造委托加速API处理
This commit is contained in:
@@ -395,37 +395,66 @@ namespace Serein.NodeFlow.Base
|
||||
|
||||
try
|
||||
{
|
||||
string? valueStr = inputParameter?.ToString();
|
||||
parameters[i] = ed.DataType switch
|
||||
|
||||
if (ed.DataType.IsValueType)
|
||||
{
|
||||
Type t when t == typeof(IDynamicContext) => context, // 上下文
|
||||
Type t when t.IsEnum => Enum.Parse(ed.DataType, ed.DataValue),// 需要枚举
|
||||
Type t when t == typeof(string) => inputParameter?.ToString(),
|
||||
Type t when t == typeof(char) && !string.IsNullOrEmpty(valueStr) => char.Parse(valueStr),
|
||||
Type t when t == typeof(bool) && !string.IsNullOrEmpty(valueStr) => inputParameter is not null && bool.Parse(valueStr),
|
||||
Type t when t == typeof(float) && !string.IsNullOrEmpty(valueStr) => float.Parse(valueStr),
|
||||
Type t when t == typeof(decimal) && !string.IsNullOrEmpty(valueStr) => decimal.Parse(valueStr),
|
||||
Type t when t == typeof(double) && !string.IsNullOrEmpty(valueStr) => double.Parse(valueStr),
|
||||
Type t when t == typeof(sbyte) && !string.IsNullOrEmpty(valueStr) => sbyte.Parse(valueStr),
|
||||
Type t when t == typeof(byte) && !string.IsNullOrEmpty(valueStr) => byte.Parse(valueStr),
|
||||
Type t when t == typeof(short) && !string.IsNullOrEmpty(valueStr) => short.Parse(valueStr),
|
||||
Type t when t == typeof(ushort) && !string.IsNullOrEmpty(valueStr) => ushort.Parse(valueStr),
|
||||
Type t when t == typeof(int) && !string.IsNullOrEmpty(valueStr) => int.Parse(valueStr),
|
||||
Type t when t == typeof(uint) && !string.IsNullOrEmpty(valueStr) => uint.Parse(valueStr),
|
||||
Type t when t == typeof(long) && !string.IsNullOrEmpty(valueStr) => long.Parse(valueStr),
|
||||
Type t when t == typeof(ulong) && !string.IsNullOrEmpty(valueStr) => ulong.Parse(valueStr),
|
||||
Type t when t == typeof(nint) && !string.IsNullOrEmpty(valueStr) => nint.Parse(valueStr),
|
||||
Type t when t == typeof(nuint) && !string.IsNullOrEmpty(valueStr) => nuint.Parse(valueStr),
|
||||
//Type t when t == typeof(DateTime) => string.IsNullOrEmpty(valueStr) ? 0 : DateTime.Parse(valueStr),
|
||||
if (inputParameter is null)
|
||||
{
|
||||
parameters[i] = Activator.CreateInstance(ed.DataType);
|
||||
}
|
||||
else
|
||||
{
|
||||
string? valueStr = inputParameter?.ToString();
|
||||
if (string.IsNullOrEmpty(valueStr))
|
||||
{
|
||||
parameters[i] = Activator.CreateInstance(ed.DataType);
|
||||
}
|
||||
else
|
||||
{
|
||||
parameters[i] = ed.DataType switch
|
||||
{
|
||||
Type t when t.IsEnum => Enum.Parse(ed.DataType, ed.DataValue),// 需要枚举
|
||||
Type t when t == typeof(char) => char.Parse(valueStr),
|
||||
Type t when t == typeof(bool) => bool.Parse(valueStr),
|
||||
Type t when t == typeof(float) => float.Parse(valueStr),
|
||||
Type t when t == typeof(decimal) => decimal.Parse(valueStr),
|
||||
Type t when t == typeof(double) => double.Parse(valueStr),
|
||||
Type t when t == typeof(sbyte) => sbyte.Parse(valueStr),
|
||||
Type t when t == typeof(byte) => byte.Parse(valueStr),
|
||||
Type t when t == typeof(short) => short.Parse(valueStr),
|
||||
Type t when t == typeof(ushort) => ushort.Parse(valueStr),
|
||||
Type t when t == typeof(int) => int.Parse(valueStr),
|
||||
Type t when t == typeof(uint) => uint.Parse(valueStr),
|
||||
Type t when t == typeof(long) => long.Parse(valueStr),
|
||||
Type t when t == typeof(ulong) => ulong.Parse(valueStr),
|
||||
Type t when t == typeof(nint) => nint.Parse(valueStr),
|
||||
Type t when t == typeof(nuint) => nuint.Parse(valueStr),
|
||||
_ => throw new Exception($"调用节点对应方法[{nodeModel.MethodDetails.MethodName}]时,遇到了未在预期内的值类型入参:{ed.DataType.FullName}"),
|
||||
// Type t when Nullable.GetUnderlyingType(t) != null => inputParameter is null ? null : Convert.ChangeType(inputParameter, Nullable.GetUnderlyingType(t)),
|
||||
};
|
||||
}
|
||||
|
||||
}
|
||||
}
|
||||
else
|
||||
{
|
||||
parameters[i] = ed.DataType switch
|
||||
{
|
||||
Type t when t == typeof(IDynamicContext) => context, // 上下文
|
||||
Type t when t == typeof(string) => inputParameter?.ToString(),
|
||||
|
||||
Type t when t == typeof(MethodDetails) => md, // 节点方法描述
|
||||
Type t when t == typeof(NodeModelBase) => nodeModel, // 节点实体类
|
||||
//Type t when t == typeof(DateTime) => string.IsNullOrEmpty(valueStr) ? 0 : DateTime.Parse(valueStr),
|
||||
|
||||
Type t when t.IsArray => (inputParameter as Array)?.Cast<object>().ToList(),
|
||||
Type t when t.IsGenericType && t.GetGenericTypeDefinition() == typeof(List<>) => inputParameter,
|
||||
_ => inputParameter,
|
||||
// Type t when Nullable.GetUnderlyingType(t) != null => inputParameter is null ? null : Convert.ChangeType(inputParameter, Nullable.GetUnderlyingType(t)),
|
||||
};
|
||||
Type t when t == typeof(MethodDetails) => md, // 节点方法描述
|
||||
Type t when t == typeof(NodeModelBase) => nodeModel, // 节点实体类
|
||||
|
||||
Type t when t.IsArray => (inputParameter as Array)?.Cast<object>().ToList(),
|
||||
Type t when t.IsGenericType && t.GetGenericTypeDefinition() == typeof(List<>) => inputParameter,
|
||||
_ => inputParameter,
|
||||
// Type t when Nullable.GetUnderlyingType(t) != null => inputParameter is null ? null : Convert.ChangeType(inputParameter, Nullable.GetUnderlyingType(t)),
|
||||
};
|
||||
}
|
||||
|
||||
|
||||
|
||||
}
|
||||
|
||||
@@ -526,7 +526,7 @@ namespace Serein.NodeFlow
|
||||
|
||||
|
||||
/// <summary>
|
||||
/// 运行时创建节点
|
||||
/// 流程正在运行时创建节点
|
||||
/// </summary>
|
||||
/// <param name="nodeControlType"></param>
|
||||
/// <param name="position"></param>
|
||||
@@ -536,12 +536,12 @@ namespace Serein.NodeFlow
|
||||
var nodeModel = CreateNode(nodeControlType, methodDetails);
|
||||
TryAddNode(nodeModel);
|
||||
|
||||
if (flowStarter?.FlowState != RunState.Completion
|
||||
&& nodeControlType == NodeControlType.Flipflop
|
||||
&& nodeModel is SingleFlipflopNode flipflopNode)
|
||||
{
|
||||
_ = flowStarter?.RunGlobalFlipflopAsync(this, flipflopNode); // 当前添加节点属于触发器,且当前正在运行,则加载到运行环境中
|
||||
}
|
||||
//if (flowStarter?.FlowState != RunState.Completion
|
||||
// && nodeControlType == NodeControlType.Flipflop
|
||||
// && nodeModel is SingleFlipflopNode flipflopNode)
|
||||
//{
|
||||
// _ = flowStarter?.RunGlobalFlipflopAsync(this, flipflopNode); // 当前添加节点属于触发器,且当前正在运行,则加载到运行环境中
|
||||
//}
|
||||
|
||||
// 通知UI更改
|
||||
OnNodeCreate?.Invoke(new NodeCreateEventArgs(nodeModel, position));
|
||||
@@ -642,33 +642,7 @@ namespace Serein.NodeFlow
|
||||
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// 移除连接关系
|
||||
/// </summary>
|
||||
/// <param name="fromNodeGuid">起始节点Model</param>
|
||||
/// <param name="toNodeGuid">目标节点Model</param>
|
||||
/// <param name="connectionType">连接关系</param>
|
||||
/// <exception cref="NotImplementedException"></exception>
|
||||
private void RemoteConnect(NodeModelBase fromNode, NodeModelBase toNode, ConnectionType connectionType)
|
||||
{
|
||||
fromNode.SuccessorNodes[connectionType].Remove(toNode);
|
||||
toNode.PreviousNodes[connectionType].Remove(fromNode);
|
||||
|
||||
if (toNode is SingleFlipflopNode flipflopNode) // 子节点为触发器
|
||||
{
|
||||
if (flowStarter?.FlowState != RunState.Completion
|
||||
&& flipflopNode.NotExitPreviousNode()) // 正在运行,且该触发器没有上游节点
|
||||
{
|
||||
flowStarter?.RunGlobalFlipflopAsync(this, flipflopNode); // 被父节点移除连接关系的子节点若为触发器,且无上级节点,则当前流程正在运行,则加载到运行环境中
|
||||
}
|
||||
}
|
||||
|
||||
// 通知UI
|
||||
OnNodeConnectChange?.Invoke(new NodeConnectChangeEventArgs(fromNode.Guid,
|
||||
toNode.Guid,
|
||||
connectionType,
|
||||
NodeConnectChangeEventArgs.ConnectChangeType.Remote));
|
||||
}
|
||||
|
||||
|
||||
/// <summary>
|
||||
/// 获取方法描述
|
||||
@@ -709,6 +683,8 @@ namespace Serein.NodeFlow
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
|
||||
/// <summary>
|
||||
/// 设置起点控件
|
||||
/// </summary>
|
||||
@@ -781,55 +757,6 @@ namespace Serein.NodeFlow
|
||||
return true;
|
||||
}
|
||||
}
|
||||
//public bool AddInterruptExpression(string nodeGuid, string expression)
|
||||
//{
|
||||
// var nodeModel = GuidToModel(nodeGuid);
|
||||
// if (nodeModel is null) return false;
|
||||
// if (string.IsNullOrEmpty(expression))
|
||||
// {
|
||||
// nodeModel.DebugSetting.InterruptExpressions.Clear(); // 传入空表达式时清空
|
||||
// return true;
|
||||
// }
|
||||
|
||||
// if (nodeModel.DebugSetting.InterruptExpressions.Contains(expression))
|
||||
// {
|
||||
// Console.WriteLine("表达式已存在");
|
||||
// return false;
|
||||
// }
|
||||
// else
|
||||
// {
|
||||
// nodeModel.DebugSetting.InterruptExpressions.Clear();// 暂时删除,等UI做好了
|
||||
// nodeModel.DebugSetting.InterruptExpressions.Add(expression);
|
||||
// return true;
|
||||
// }
|
||||
//}
|
||||
|
||||
|
||||
/// <summary>
|
||||
/// 监视节点的数据(暂时注释)
|
||||
/// </summary>
|
||||
/// <param name="nodeGuid">需要监视的节点Guid</param>
|
||||
//public void SetMonitorObjState(string nodeGuid, bool isMonitor)
|
||||
//{
|
||||
// var nodeModel = GuidToModel(nodeGuid);
|
||||
// if (nodeModel is null) return;
|
||||
// nodeModel.DebugSetting.IsMonitorFlowData = isMonitor;
|
||||
|
||||
// if (isMonitor)
|
||||
// {
|
||||
// var obj = nodeModel.GetFlowData();
|
||||
// if(obj is not null)
|
||||
// {
|
||||
// FlowDataNotification(nodeGuid, obj);
|
||||
|
||||
// }
|
||||
// }
|
||||
// else
|
||||
// {
|
||||
// // 不再监视的节点清空表达式
|
||||
// nodeModel.DebugSetting.InterruptExpressions.Clear();
|
||||
// }
|
||||
//}
|
||||
|
||||
/// <summary>
|
||||
/// 要监视的对象,以及与其关联的表达式
|
||||
@@ -894,6 +821,36 @@ namespace Serein.NodeFlow
|
||||
OnInterruptTrigger?.Invoke(new InterruptTriggerEventArgs(nodeGuid, expression, type));
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// 激活全局触发器
|
||||
/// </summary>
|
||||
/// <param name="nodeGuid"></param>
|
||||
public void ActivateFlipflopNode(string nodeGuid)
|
||||
{
|
||||
var nodeModel = GuidToModel(nodeGuid);
|
||||
if (nodeModel is null) return;
|
||||
if (flowStarter is not null && nodeModel is SingleFlipflopNode flipflopNode) // 子节点为触发器
|
||||
{
|
||||
if (flowStarter.FlowState != RunState.Completion
|
||||
&& flipflopNode.NotExitPreviousNode()) // 正在运行,且该触发器没有上游节点
|
||||
{
|
||||
_ = flowStarter.RunGlobalFlipflopAsync(this, flipflopNode);// 被父节点移除连接关系的子节点若为触发器,且无上级节点,则当前流程正在运行,则加载到运行环境中
|
||||
|
||||
}
|
||||
}
|
||||
} /// <summary>
|
||||
/// 关闭全局触发器
|
||||
/// </summary>
|
||||
/// <param name="nodeGuid"></param>
|
||||
public void TerminateFlipflopNode(string nodeGuid)
|
||||
{
|
||||
var nodeModel = GuidToModel(nodeGuid);
|
||||
if (nodeModel is null) return;
|
||||
if (flowStarter is not null && nodeModel is SingleFlipflopNode flipflopNode) // 子节点为触发器
|
||||
{
|
||||
flowStarter.TerminateGlobalFlipflopRuning(flipflopNode);
|
||||
}
|
||||
}
|
||||
|
||||
public Task<CancelType> GetOrCreateGlobalInterruptAsync()
|
||||
{
|
||||
@@ -902,7 +859,6 @@ namespace Serein.NodeFlow
|
||||
}
|
||||
|
||||
|
||||
|
||||
/// <summary>
|
||||
/// Guid 转 NodeModel
|
||||
/// </summary>
|
||||
@@ -955,7 +911,24 @@ namespace Serein.NodeFlow
|
||||
}
|
||||
|
||||
}
|
||||
/// <summary>
|
||||
/// 移除连接关系
|
||||
/// </summary>
|
||||
/// <param name="fromNodeGuid">起始节点Model</param>
|
||||
/// <param name="toNodeGuid">目标节点Model</param>
|
||||
/// <param name="connectionType">连接关系</param>
|
||||
/// <exception cref="NotImplementedException"></exception>
|
||||
private void RemoteConnect(NodeModelBase fromNode, NodeModelBase toNode, ConnectionType connectionType)
|
||||
{
|
||||
fromNode.SuccessorNodes[connectionType].Remove(toNode);
|
||||
toNode.PreviousNodes[connectionType].Remove(fromNode);
|
||||
|
||||
// 通知UI
|
||||
OnNodeConnectChange?.Invoke(new NodeConnectChangeEventArgs(fromNode.Guid,
|
||||
toNode.Guid,
|
||||
connectionType,
|
||||
NodeConnectChangeEventArgs.ConnectChangeType.Remote));
|
||||
}
|
||||
|
||||
private (NodeLibrary?, Dictionary<RegisterSequence, List<Type>>, List<MethodDetails>) LoadAssembly(string dllPath)
|
||||
{
|
||||
|
||||
@@ -304,7 +304,7 @@ namespace Serein.NodeFlow
|
||||
// 使用 TaskCompletionSource 创建未启动的触发器任务
|
||||
var tasks = flipflopNodes.Select(async node =>
|
||||
{
|
||||
await RunGlobalFlipflopAsync(env,node);
|
||||
await RunGlobalFlipflopAsync(env,node); // 启动流程时启动全局触发器
|
||||
}).ToArray();
|
||||
_ = Task.WhenAll(tasks);
|
||||
}
|
||||
@@ -362,7 +362,7 @@ namespace Serein.NodeFlow
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// 总结所有全局触发器
|
||||
/// 终结所有全局触发器
|
||||
/// </summary>
|
||||
private void TerminateAllGlobalFlipflop()
|
||||
{
|
||||
|
||||
Reference in New Issue
Block a user