mirror of
https://gitee.com/langsisi_admin/serein-flow
synced 2026-03-18 15:36:34 +08:00
修复了条件表达式".xxx<bool> = true/false"执行了错误分支,优化了流程的运行。
This commit is contained in:
@@ -294,33 +294,6 @@ namespace Serein.Library
|
||||
|
||||
// 从栈中弹出一个节点作为当前节点进行处理
|
||||
var currentNode = stack.Pop();
|
||||
#if false
|
||||
// 筛选出上游分支
|
||||
var upstreamNodes = currentNode.SuccessorNodes[ConnectionInvokeType.Upstream].ToArray();
|
||||
for (int index = 0; index < upstreamNodes.Length; index++)
|
||||
{
|
||||
NodeModelBase upstreamNode = upstreamNodes[index];
|
||||
if (!(upstreamNode is null) && upstreamNode.DebugSetting.IsEnable)
|
||||
{
|
||||
if (upstreamNode.DebugSetting.IsInterrupt) // 执行触发前
|
||||
{
|
||||
var cancelType = await upstreamNode.DebugSetting.GetInterruptTask();
|
||||
await Console.Out.WriteLineAsync($"[{upstreamNode.MethodDetails?.MethodName}]中断已{cancelType},开始执行后继分支");
|
||||
}
|
||||
context.SetPreviousNode(upstreamNode, currentNode);
|
||||
await upstreamNode.StartFlowAsync(context); // 执行流程节点的上游分支
|
||||
if (context.NextOrientation == ConnectionInvokeType.IsError)
|
||||
{
|
||||
// 如果上游分支执行失败,不再继续执行
|
||||
// 使上游节点(仅上游节点本身,不包含上游节点的后继节点)
|
||||
// 具备通过抛出异常中断流程的能力
|
||||
break;
|
||||
}
|
||||
}
|
||||
}
|
||||
#endif
|
||||
// 上游分支执行完成,才执行当前节点
|
||||
if (IsBradk(context, flowCts)) break; // 退出执行
|
||||
context.NextOrientation = ConnectionInvokeType.None; // 重置上下文状态
|
||||
|
||||
object newFlowData;
|
||||
|
||||
@@ -18,20 +18,22 @@ namespace Serein.Library.Utils.SereinExpression.Resolver
|
||||
|
||||
public Operator Op { get; set; }
|
||||
public bool Value { get; set; }
|
||||
public bool Data { get; set; }
|
||||
|
||||
public override bool Evaluate(object obj)
|
||||
{
|
||||
|
||||
if (obj is bool boolObj)
|
||||
{
|
||||
return boolObj == Value;
|
||||
/*switch (Op)
|
||||
{
|
||||
case Operator.Is:
|
||||
return boolObj == Value;
|
||||
}*/
|
||||
}
|
||||
return false;
|
||||
return Value.Equals(Data);
|
||||
//if (obj is bool boolObj && Value is bool boolValue)
|
||||
//{
|
||||
|
||||
// /*switch (Op)
|
||||
// {
|
||||
// case Operator.Is:
|
||||
// return boolObj == Value;
|
||||
// }*/
|
||||
//}
|
||||
//return false;
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
@@ -2,6 +2,7 @@
|
||||
using System.Collections.Generic;
|
||||
using System.Linq;
|
||||
using System.Text;
|
||||
using System.Threading;
|
||||
using System.Threading.Tasks;
|
||||
|
||||
namespace Serein.Library.Utils.SereinExpression.Resolver
|
||||
@@ -24,14 +25,15 @@ namespace Serein.Library.Utils.SereinExpression.Resolver
|
||||
|
||||
if (TargetObj is T typedObj)
|
||||
{
|
||||
return new ValueTypeConditionResolver<T>
|
||||
var res = new ValueTypeConditionResolver<T>
|
||||
{
|
||||
RangeStart = RangeStart,
|
||||
RangeEnd = RangeEnd,
|
||||
Op = Op,
|
||||
Value = Value,
|
||||
ArithmeticExpression = ArithmeticExpression,
|
||||
}.Evaluate(typedObj);
|
||||
};
|
||||
return res.Evaluate(typedObj);
|
||||
}
|
||||
return false;
|
||||
}
|
||||
|
||||
@@ -317,12 +317,23 @@ namespace Serein.Library.Utils.SereinExpression
|
||||
#region 解析类型 bool
|
||||
else if (type == typeof(bool))
|
||||
{
|
||||
return new MemberConditionResolver<bool>
|
||||
bool targetData = false;
|
||||
if (targetObj is bool tmp)
|
||||
{
|
||||
//MemberPath = memberPath,
|
||||
TargetObj = targetObj,
|
||||
Op = (ValueTypeConditionResolver<bool>.Operator)ParseBoolOperator(operatorStr)
|
||||
targetData = tmp;
|
||||
}
|
||||
else
|
||||
{
|
||||
targetObj = bool.Parse(targetObj.ToString());
|
||||
}
|
||||
return new BoolConditionResolver
|
||||
{
|
||||
//Value = bool.Parse(targetObj.ToString()),
|
||||
Value = bool.Parse(valueStr),
|
||||
Data = targetData,
|
||||
Op = BoolConditionResolver.Operator.Is
|
||||
};
|
||||
|
||||
}
|
||||
#endregion
|
||||
#region 解析类型 string
|
||||
|
||||
@@ -5,6 +5,7 @@ using System.Data;
|
||||
using System.Diagnostics;
|
||||
using System.IO;
|
||||
using System.Linq;
|
||||
using System.Net.Http.Headers;
|
||||
using System.Reflection;
|
||||
using System.Threading.Tasks;
|
||||
|
||||
@@ -483,6 +484,10 @@ namespace Serein.Library.Utils.SereinExpression
|
||||
tempType = typeof(string);
|
||||
break;
|
||||
case "datetime":
|
||||
if(valueStr.Equals("now", StringComparison.OrdinalIgnoreCase))
|
||||
{
|
||||
return DateTime.Now;
|
||||
}
|
||||
tempType = typeof(DateTime);
|
||||
break;
|
||||
default:
|
||||
|
||||
Reference in New Issue
Block a user