using Newtonsoft.Json;
using Serein.NodeFlow;
using Serein.NodeFlow.Tool;
namespace Serein.NodeFlow.Model
{
public enum ConnectionType
{
///
/// 真分支
///
IsSucceed,
///
/// 假分支
///
IsFail,
///
/// 异常发生分支
///
IsError,
///
/// 上游分支(执行当前节点前会执行一次上游分支)
///
Upstream,
}
public enum FlowStateType
{
///
/// 成功(方法成功执行)
///
Succeed,
///
/// 失败(方法没有成功执行,不过执行时没有发生非预期的错误)
///
Fail,
///
/// 异常(节点没有
///
Error,
}
///
/// 节点基类(数据):条件控件,动作控件,条件区域,动作区域
///
public abstract class NodeBase : IDynamicFlowNode
{
public MethodDetails MethodDetails { get; set; }
public string Guid { get; set; }
public string DisplayName { get; set; }
public bool IsStart { get; set; }
public string DelegateName { get; set; }
///
/// 运行时的上一节点
///
public NodeBase? PreviousNode { get; set; }
///
/// 上一节点集合
///
public List PreviousNodes { get; set; } = [];
///
/// 下一节点集合(真分支)
///
public List SucceedBranch { get; set; } = [];
///
/// 下一节点集合(假分支)
///
public List FailBranch { get; set; } = [];
///
/// 异常分支
///
public List ErrorBranch { get; set; } = [];
///
/// 上游分支
///
public List UpstreamBranch { get; set; } = [];
///
/// 当前状态(进入真分支还是假分支,异常分支在异常中确定)
///
public FlowStateType FlowState { get; set; } = FlowStateType.Succeed;
public Exception Exception { get; set; } = null;
///
/// 当前传递数据
///
public object? FlowData { get; set; } = null;
///
/// 执行节点对应的方法
///
/// 流程上下文
/// 节点传回数据对象
public virtual object? Execute(DynamicContext context)
{
MethodDetails md = MethodDetails;
object? result = null;
if (!DelegateCache.GlobalDicDelegates.TryGetValue(md.MethodName, out Delegate del))
{
return result;
}
try
{
if (md.ExplicitDatas.Length == 0)
{
if (md.ReturnType == typeof(void))
{
((Action