using Serein.Library.Api; using Serein.Library; using Serein.Library.Utils; using Serein.NodeFlow.Env; using static Serein.Library.Utils.ChannelFlowInterrupt; namespace Serein.NodeFlow.Model { /// /// 触发器节点 /// public class SingleFlipflopNode : NodeModelBase { public SingleFlipflopNode(IFlowEnvironment environment) : base(environment) { } /// /// 加载完成后调用的方法 /// public override void OnCreating() { // Console.WriteLine("SingleFlipflopNode 暂未实现 OnLoading"); } /// /// 执行触发器进行等待触发 /// /// /// /// public override async Task ExecutingAsync(IDynamicContext context) { #region 执行前中断 if (DebugSetting.IsInterrupt) // 执行触发前 { string guid = this.Guid.ToString(); var cancelType = await this.DebugSetting.GetInterruptTask(); await Console.Out.WriteLineAsync($"[{this.MethodDetails.MethodName}]中断已{cancelType},开始执行后继分支"); } #endregion MethodDetails md = MethodDetails; if (!context.Env.TryGetDelegateDetails(md.AssemblyName, md.MethodName, out var dd)) // 流程运行到某个节点 { throw new Exception("不存在对应委托"); } object instance = md.ActingInstance; try { var args = await GetParametersAsync(context, this, md); // 因为这里会返回不确定的泛型 IFlipflopContext // 而我们只需要获取到 State 和 Value(返回的数据) dynamic dynamicFlipflopContext = await dd.InvokeAsync(md.ActingInstance, args); FlipflopStateType flipflopStateType = dynamicFlipflopContext.State; context.NextOrientation = flipflopStateType.ToContentType(); if (dynamicFlipflopContext.Type == TriggerType.Overtime) { throw new FlipflopException(base.MethodDetails.MethodName + "触发器超时触发。Guid" + base.Guid); } return dynamicFlipflopContext.Value; } catch (FlipflopException ex) { if(ex.Type == FlipflopException.CancelClass.CancelFlow) { throw; } await Console.Out.WriteLineAsync($"触发器[{this.MethodDetails.MethodName}]异常:" + ex); context.NextOrientation = ConnectionInvokeType.None; context.ExceptionOfRuning = ex; return null; } catch (Exception ex) { await Console.Out.WriteLineAsync($"触发器[{this.MethodDetails.MethodName}]异常:" + ex); context.NextOrientation = ConnectionInvokeType.IsError; context.ExceptionOfRuning = ex; return null; } finally { // flipflopTask?.Dispose(); } } /// /// 获取触发器参数 /// /// public override ParameterData[] GetParameterdatas() { if (base.MethodDetails.ParameterDetailss.Length > 0) { return MethodDetails.ParameterDetailss .Select(it => new ParameterData { SourceNodeGuid = it.ArgDataSourceNodeGuid, SourceType = it.ArgDataSourceType.ToString(), State = it.IsExplicitData, Value = it.DataValue }) .ToArray(); } else { return []; } } } }