mirror of
https://gitee.com/langsisi_admin/serein-flow
synced 2026-03-03 00:00:49 +08:00
优化了脚本生成AST时的代码提示,增加了脚本运行时错误提示。
This commit is contained in:
@@ -146,24 +146,28 @@ namespace Serein.NodeFlow.Model
|
||||
partial void OnIsPublicChanged(bool oldValue, bool newValue)
|
||||
{
|
||||
var list = CanvasDetails.PublicNodes.ToList();
|
||||
if (newValue)
|
||||
_ = SereinEnv.TriggerEvent(() =>
|
||||
{
|
||||
// 公开节点
|
||||
if (!CanvasDetails.PublicNodes.Contains(this))
|
||||
if (newValue)
|
||||
{
|
||||
list.Add(this);
|
||||
CanvasDetails.PublicNodes= list;
|
||||
// 公开节点
|
||||
if (!CanvasDetails.PublicNodes.Contains(this))
|
||||
{
|
||||
list.Add(this);
|
||||
CanvasDetails.PublicNodes = list;
|
||||
}
|
||||
}
|
||||
}
|
||||
else
|
||||
{
|
||||
// 取消公开
|
||||
if (CanvasDetails.PublicNodes.Contains(this))
|
||||
else
|
||||
{
|
||||
list.Remove(this);
|
||||
CanvasDetails.PublicNodes = list;
|
||||
// 取消公开
|
||||
if (CanvasDetails.PublicNodes.Contains(this))
|
||||
{
|
||||
list.Remove(this);
|
||||
CanvasDetails.PublicNodes = list;
|
||||
}
|
||||
}
|
||||
}
|
||||
});
|
||||
|
||||
}
|
||||
|
||||
|
||||
|
||||
@@ -132,19 +132,31 @@ namespace Serein.NodeFlow.Model
|
||||
|
||||
throw new Exception($"节点{this.Guid}不存在对应委托");
|
||||
}
|
||||
var instance = Env.IOC.Get(md.ActingInstanceType);
|
||||
if (instance is null)
|
||||
if (md.IsStatic)
|
||||
{
|
||||
Env.IOC.Register(md.ActingInstanceType).Build();
|
||||
instance = Env.IOC.Get(md.ActingInstanceType);
|
||||
object[] args = await this.GetParametersAsync(context, token);
|
||||
var result = await dd.InvokeAsync(null, args);
|
||||
var flowReslt = new FlowResult(this.Guid, context, result);
|
||||
return flowReslt;
|
||||
}
|
||||
object[] args = await this.GetParametersAsync(context, token);
|
||||
var result = await dd.InvokeAsync(instance, args);
|
||||
var flowReslt = new FlowResult(this.Guid, context, result);
|
||||
return flowReslt;
|
||||
else
|
||||
{
|
||||
var instance = Env.IOC.Get(md.ActingInstanceType);
|
||||
if (instance is null)
|
||||
{
|
||||
Env.IOC.Register(md.ActingInstanceType).Build();
|
||||
instance = Env.IOC.Get(md.ActingInstanceType);
|
||||
}
|
||||
object[] args = await this.GetParametersAsync(context, token);
|
||||
var result = await dd.InvokeAsync(instance, args);
|
||||
var flowReslt = new FlowResult(this.Guid, context, result);
|
||||
return flowReslt;
|
||||
}
|
||||
|
||||
|
||||
}
|
||||
|
||||
|
||||
}
|
||||
|
||||
|
||||
|
||||
@@ -317,7 +317,8 @@ namespace Serein.NodeFlow.Model
|
||||
_ => base.ExecutingAsync(context, token)
|
||||
});
|
||||
|
||||
|
||||
// 对于目标节点的后续节点,如果入参参数来源指定为它(目标节点)时,就需要从上下文中根据它的Guid获取流程数据
|
||||
context.AddOrUpdateFlowData(TargetNode.Guid, flowData);
|
||||
if (IsShareParam)
|
||||
{
|
||||
// 设置运行时上一节点
|
||||
@@ -325,7 +326,6 @@ namespace Serein.NodeFlow.Model
|
||||
// 此处代码与SereinFlow.Library.FlowNode.ParameterDetails
|
||||
// ToMethodArgData()方法中判断流程接口节点分支逻辑耦合
|
||||
// 不要轻易修改
|
||||
context.AddOrUpdateFlowData(TargetNode.Guid, flowData);
|
||||
foreach (ConnectionInvokeType ctType in NodeStaticConfig.ConnectionTypes)
|
||||
{
|
||||
if (this.SuccessorNodes[ctType] == null) continue;
|
||||
|
||||
@@ -158,13 +158,14 @@ namespace Serein.NodeFlow.Model
|
||||
varNames.Add(pd.Name);
|
||||
}
|
||||
|
||||
StringBuilder sb = new StringBuilder();
|
||||
var sb = new StringBuilder();
|
||||
foreach (var pd in MethodDetails.ParameterDetailss)
|
||||
{
|
||||
sb.AppendLine($"let {pd.Name};"); // 提前声明这些变量
|
||||
}
|
||||
sb.Append(Script);
|
||||
var p = new SereinScriptParser(sb.ToString());
|
||||
var script = sb.ToString();
|
||||
var p = new SereinScriptParser(script);
|
||||
//var p = new SereinScriptParser(Script);
|
||||
mainNode = p.Parse(); // 开始解析
|
||||
|
||||
|
||||
@@ -5,6 +5,8 @@ using Serein.NodeFlow.Model;
|
||||
using System;
|
||||
using System.Collections.Generic;
|
||||
using System.Linq;
|
||||
using System.Reactive;
|
||||
using System.Security.AccessControl;
|
||||
using System.Text;
|
||||
using System.Threading.Tasks;
|
||||
using static Serein.Library.Api.NodeConnectChangeEventArgs;
|
||||
@@ -163,11 +165,51 @@ namespace Serein.NodeFlow.Model.Operation
|
||||
return false;
|
||||
}
|
||||
|
||||
|
||||
var isOverwriting = false;
|
||||
ConnectionInvokeType overwritingCt = ConnectionInvokeType.None;
|
||||
var isPass = false;
|
||||
|
||||
#region 类型检查
|
||||
bool checkTypeState = true;
|
||||
List<ParameterDetails> toPds = new List<ParameterDetails>();
|
||||
if (ToNode.MethodDetails.ParameterDetailss.Length > 0)
|
||||
{
|
||||
var fromNoeReturnType = fromNode.MethodDetails.ReturnType;
|
||||
if (fromNoeReturnType != null
|
||||
&& fromNoeReturnType != typeof(object)
|
||||
&& fromNoeReturnType != typeof(void)
|
||||
&& fromNoeReturnType != typeof(Unit))
|
||||
{
|
||||
var toNodePds = toNode.MethodDetails.ParameterDetailss;
|
||||
foreach (ParameterDetails toNodePd in toNodePds)
|
||||
{
|
||||
if (string.IsNullOrWhiteSpace(toNodePd.ArgDataSourceNodeGuid) // 入参没有设置数据来源节点
|
||||
&& toNodePd.DataType.IsAssignableFrom(fromNoeReturnType)) // 返回值与目标入参相同(或可转换为目标入参)
|
||||
{
|
||||
|
||||
toPds.Add(toNodePd);
|
||||
}
|
||||
}
|
||||
if (toPds.Count == 0)
|
||||
{
|
||||
var any = toNodePds.Any(pd => pd.ArgDataSourceNodeGuid == fromNode.Guid); // 判断目标节点是否已有该节点的连接
|
||||
checkTypeState = any;
|
||||
}
|
||||
else
|
||||
{
|
||||
checkTypeState = true; // 类型检查初步通过
|
||||
}
|
||||
}
|
||||
}
|
||||
if (!checkTypeState) // 类型检查不通过
|
||||
{
|
||||
SereinEnv.WriteLine(InfoType.ERROR, "创建失败,目标节点没有合适的入参接收返回值");
|
||||
return false;
|
||||
}
|
||||
#endregion
|
||||
|
||||
|
||||
|
||||
#region 检查是否存在对应的连接
|
||||
foreach (ConnectionInvokeType ctType in NodeStaticConfig.ConnectionTypes)
|
||||
{
|
||||
@@ -237,7 +279,27 @@ namespace Serein.NodeFlow.Model.Operation
|
||||
NodeConnectChangeEventArgs.ConnectChangeType.Create // 是创建连接还是删除连接
|
||||
));
|
||||
});
|
||||
|
||||
|
||||
|
||||
/* foreach (var toPd in toPds)
|
||||
{
|
||||
string canvasGuid = CanvasGuid;
|
||||
string fromNodeGuid = fromNode.Guid;
|
||||
string toNodeGuid = toNode.Guid;
|
||||
JunctionType fromNodeJunctionType = JunctionType.ReturnData;
|
||||
JunctionType toNodeJunctionType = JunctionType.ArgData;
|
||||
ConnectionArgSourceType argSourceType = ConnectionArgSourceType.GetOtherNodeData;
|
||||
int argIndex = toPd.Index;
|
||||
// 调用创建连线接口
|
||||
flowEnvironment.FlowEdit.ConnectArgSourceNode(canvasGuid,
|
||||
fromNodeGuid,
|
||||
toNodeGuid,
|
||||
fromNodeJunctionType,
|
||||
toNodeJunctionType,
|
||||
argSourceType,
|
||||
argIndex);
|
||||
}*/
|
||||
|
||||
// Invoke
|
||||
// GetResult
|
||||
return true;
|
||||
@@ -407,7 +469,9 @@ namespace Serein.NodeFlow.Model.Operation
|
||||
/// <param name="index"></param>
|
||||
private async Task<bool> RemoveArgConnection()
|
||||
{
|
||||
ToNode.MethodDetails.ParameterDetailss[ArgIndex].ArgDataSourceNodeGuid = null;
|
||||
var type = ToNode.MethodDetails.ParameterDetailss[ArgIndex].ArgDataSourceType;
|
||||
FromNode.NeedResultNodes[type].Remove(ToNode);
|
||||
ToNode.MethodDetails.ParameterDetailss[ArgIndex].ArgDataSourceNodeGuid = string.Empty;
|
||||
ToNode.MethodDetails.ParameterDetailss[ArgIndex].ArgDataSourceType = ConnectionArgSourceType.GetPreviousNodeData; // 恢复默认值
|
||||
|
||||
|
||||
|
||||
@@ -102,23 +102,7 @@ namespace Serein.NodeFlow.Model.Operation
|
||||
public abstract void ToInfo();
|
||||
|
||||
|
||||
protected async Task TriggerEvent(Action action)
|
||||
{
|
||||
/* if (OperatingSystem.IsWindows())
|
||||
{
|
||||
}*/
|
||||
if (uiContextOperation is null)
|
||||
{
|
||||
action?.Invoke();
|
||||
}
|
||||
else
|
||||
{
|
||||
await uiContextOperation.InvokeAsync(() =>
|
||||
{
|
||||
action?.Invoke();
|
||||
});
|
||||
}
|
||||
}
|
||||
protected async Task TriggerEvent(Action action) => await SereinEnv.TriggerEvent(action);
|
||||
|
||||
}
|
||||
|
||||
|
||||
@@ -9,6 +9,7 @@ using System.Linq;
|
||||
using System.Reflection.Metadata;
|
||||
using System.Text;
|
||||
using System.Threading.Tasks;
|
||||
using System.Xml.Linq;
|
||||
|
||||
namespace Serein.NodeFlow.Model.Operation
|
||||
{
|
||||
@@ -58,13 +59,17 @@ namespace Serein.NodeFlow.Model.Operation
|
||||
// 还需要记录移除的事件参数,用以撤销恢复
|
||||
|
||||
#region 移除方法调用关系
|
||||
foreach (var item in flowNode.PreviousNodes)
|
||||
|
||||
// 检查该节点的前继节点,然后从这些前继节点中移除与该节点的连接关系
|
||||
var previousNodes = flowNode.PreviousNodes.Where(kvp => kvp.Value.Count > 0).ToDictionary();
|
||||
foreach (var item in previousNodes)
|
||||
{
|
||||
|
||||
var connectionType = item.Key; // 连接类型
|
||||
var previousNodes = item.Value; // 对应类型的父节点集合
|
||||
foreach (IFlowNode previousNode in previousNodes)
|
||||
var nodes = item.Value.ToArray(); // 对应类型的父节点集合
|
||||
foreach (IFlowNode previousNode in nodes)
|
||||
{
|
||||
flowNode.PreviousNodes[connectionType].Remove(previousNode);
|
||||
previousNode.SuccessorNodes[connectionType].Remove(flowNode);
|
||||
var e = new NodeConnectChangeEventArgs(
|
||||
CanvasGuid, // 画布
|
||||
@@ -74,13 +79,11 @@ namespace Serein.NodeFlow.Model.Operation
|
||||
connectionType, // 对应的连接关系
|
||||
NodeConnectChangeEventArgs.ConnectChangeType.Remove); // 移除连线
|
||||
EventArgs.Add(e); // 缓存事件参数
|
||||
await TriggerEvent(() =>
|
||||
{
|
||||
flowEnvironmentEvent.OnNodeConnectChanged(e);
|
||||
});
|
||||
}
|
||||
}
|
||||
|
||||
// 检查该节点的后续节点,然后从这些后续节点中移除与该节点的连接关系
|
||||
var successorNodes = flowNode.SuccessorNodes.Where(kvp => kvp.Value.Count > 0).ToDictionary();
|
||||
if (flowNode.ControlType == NodeControlType.FlowCall)
|
||||
{
|
||||
// 根据流程接口节点目前的设计,暂未支持能连接下一个节点
|
||||
@@ -88,14 +91,15 @@ namespace Serein.NodeFlow.Model.Operation
|
||||
else
|
||||
{
|
||||
// 遍历所有后继节点,从那些后继节点中的前置节点集合中移除该节点
|
||||
foreach (var item in flowNode.SuccessorNodes)
|
||||
foreach (var item in successorNodes)
|
||||
{
|
||||
|
||||
var connectionType = item.Key; // 方法调用连接类型
|
||||
var successorNodes = item.Value; // 对应类型的父节点集合
|
||||
foreach (IFlowNode successorNode in successorNodes)
|
||||
var nodes = item.Value.ToArray(); // 对应类型的父节点集合
|
||||
foreach (IFlowNode successorNode in nodes)
|
||||
{
|
||||
successorNode.SuccessorNodes[connectionType].Remove(flowNode);
|
||||
successorNode.PreviousNodes[connectionType].Remove(flowNode);
|
||||
flowNode.SuccessorNodes[connectionType].Remove(successorNode);
|
||||
var e = new NodeConnectChangeEventArgs(
|
||||
CanvasGuid, // 画布
|
||||
flowNode.Guid, // 被移除的节点Guid
|
||||
@@ -104,10 +108,7 @@ namespace Serein.NodeFlow.Model.Operation
|
||||
connectionType, // 对应的连接关系
|
||||
NodeConnectChangeEventArgs.ConnectChangeType.Remove); // 移除连线
|
||||
EventArgs.Add(e); // 缓存事件参数
|
||||
await TriggerEvent(() =>
|
||||
{
|
||||
flowEnvironmentEvent.OnNodeConnectChanged(e);
|
||||
});
|
||||
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -120,7 +121,7 @@ namespace Serein.NodeFlow.Model.Operation
|
||||
foreach (var item in flowNode.NeedResultNodes)
|
||||
{
|
||||
var connectionType = item.Key; // 参数来源连接类型
|
||||
var argNodes = item.Value; // 对应类型的入参需求节点集合
|
||||
var argNodes = item.Value.ToArray(); // 对应类型的入参需求节点集合
|
||||
foreach (var argNode in argNodes)
|
||||
{
|
||||
var md = argNode.MethodDetails;
|
||||
@@ -140,10 +141,6 @@ namespace Serein.NodeFlow.Model.Operation
|
||||
connectionType, // 对应的连接关系
|
||||
NodeConnectChangeEventArgs.ConnectChangeType.Remove); // 移除连线
|
||||
EventArgs.Add(e); // 缓存事件参数
|
||||
await TriggerEvent(() =>
|
||||
{
|
||||
flowEnvironmentEvent.OnNodeConnectChanged(e);
|
||||
});
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -152,7 +149,7 @@ namespace Serein.NodeFlow.Model.Operation
|
||||
|
||||
if (flowNode.MethodDetails?.ParameterDetailss != null)
|
||||
{
|
||||
var pds = flowNode.MethodDetails.ParameterDetailss;
|
||||
var pds = flowNode.MethodDetails.ParameterDetailss.ToArray();
|
||||
foreach (var pd in pds)
|
||||
{
|
||||
if (string.IsNullOrWhiteSpace(pd.ArgDataSourceNodeGuid)) continue;
|
||||
@@ -168,10 +165,6 @@ namespace Serein.NodeFlow.Model.Operation
|
||||
pd.ArgDataSourceType, // 对应的连接关系
|
||||
NodeConnectChangeEventArgs.ConnectChangeType.Remove); // 移除连线
|
||||
EventArgs.Add(e); // 缓存事件参数
|
||||
await TriggerEvent(() =>
|
||||
{
|
||||
flowEnvironmentEvent.OnNodeConnectChanged(e);
|
||||
});
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -179,28 +172,55 @@ namespace Serein.NodeFlow.Model.Operation
|
||||
#endregion
|
||||
|
||||
flowModelService.RemoveNodeModel(flowNode); // 从记录中移除
|
||||
//flowNode.Remove(); // 调用节点的移除方法
|
||||
//flowNode.Remove(); // 调用节点的移除方法
|
||||
|
||||
if(flowEnvironment.UIContextOperation is null)
|
||||
|
||||
// 存在UI上下文操作,当前运行环境极有可能运行在有UI线程的平台上
|
||||
// 为了避免直接修改 ObservableCollection 集合导致异常产生,故而使用UI线程上下文操作运行
|
||||
NodeConnectChangeEventArgs[] es = EventArgs.ToArray();
|
||||
await TriggerEvent(() =>
|
||||
{
|
||||
|
||||
/*flowCanvasDetails.Nodes.Remove(flowNode);
|
||||
flowCanvasDetails.OnPropertyChanged(nameof(FlowCanvasDetails.Nodes));
|
||||
if (flowNode.IsPublic)
|
||||
{
|
||||
flowCanvasDetails.PublicNodes.Remove(flowNode);
|
||||
flowCanvasDetails.OnPropertyChanged(nameof(FlowCanvasDetails.PublicNodes));
|
||||
}*/
|
||||
|
||||
// 手动赋值刷新UI显示
|
||||
var lsit = flowCanvasDetails.Nodes.ToList();
|
||||
lsit.Remove(flowNode);
|
||||
flowCanvasDetails.Nodes = lsit;
|
||||
if (flowNode.IsPublic)
|
||||
{
|
||||
var publicNodes = flowCanvasDetails.PublicNodes.ToList();
|
||||
publicNodes.Remove(flowNode);
|
||||
flowCanvasDetails.PublicNodes = publicNodes;
|
||||
}
|
||||
|
||||
foreach (var e in es)
|
||||
{
|
||||
flowEnvironmentEvent.OnNodeConnectChanged(e); // 触发事件
|
||||
}
|
||||
flowEnvironmentEvent.OnNodeRemoved(new NodeRemoveEventArgs(CanvasGuid, NodeGuid));
|
||||
});
|
||||
|
||||
/*if (flowEnvironment.UIContextOperation is null)
|
||||
{
|
||||
flowCanvasDetails?.Nodes.Remove(flowNode);
|
||||
}
|
||||
else
|
||||
{
|
||||
// 存在UI上下文操作,当前运行环境极有可能运行在有UI线程的平台上
|
||||
// 为了避免直接修改 ObservableCollection 集合导致异常产生,故而使用UI线程上下文操作运行
|
||||
await TriggerEvent(() =>
|
||||
{
|
||||
var lsit = flowCanvasDetails.Nodes.ToList();
|
||||
lsit.Remove(flowNode);
|
||||
flowCanvasDetails.Nodes = lsit;
|
||||
});
|
||||
}
|
||||
|
||||
|
||||
}*/
|
||||
|
||||
await TriggerEvent(() =>
|
||||
/* await TriggerEvent(() =>
|
||||
{
|
||||
flowEnvironmentEvent.OnNodeRemoved(new NodeRemoveEventArgs(CanvasGuid, NodeGuid));
|
||||
});
|
||||
|
||||
});*/
|
||||
return true;
|
||||
}
|
||||
|
||||
|
||||
Reference in New Issue
Block a user