using System.Collections.Generic;
using IwbZero.IocNamed;
using IwbZero.IwbBase;
using IwbZero.ToolCommon.LogHelpers;
using IwbZero.ToolCommon.StringModel;
using WeEngine.ComponentInfo;
using WeEngine.Components.InterfaceFactory;
using WeEngine.Enum;
using WeEngine.Packages;
namespace WeEngine.Components.Statements
{
///
/// 等待其他节点运行结束
///
[IocNamed(CompStmtType.SetNodeToWait)]
public class SetNodeToWaitStatement : IStatementRunner
{
public bool Run(ComponentRunner runner, IwbXmlNode poStatement)
{
var flag = false;
var curNode = runner.CurrentNode;
this.LogDebug($"============[开始执行事务]====>[等待节点运行]======>{curNode.NodePath}");
var childValue = poStatement.GetChildValue("WaitNode");
if (childValue.IsEmpty())
{
var waitNodes = poStatement.GetChildNode("WaitNodes");
if (waitNodes != null && waitNodes.Nodes.Count > 0)
{
foreach (IwbXmlNode node in waitNodes.Nodes)
{
childValue = node.GetChildValue("WaitNode");
var waitPath = runner.Evaluate(childValue);
flag = flag || SetWaitNode(curNode, waitPath);
}
}
else
{
childValue = poStatement.GetChildValue("WaitNodes");
}
}
if (childValue.IsNotEmpty())
{
foreach (var path in childValue.StrToArray())
{
var waitPath = runner.Evaluate(path);
flag = flag || SetWaitNode(curNode, waitPath);
}
}
//var variable = new IwbRtVariable(DefaultVariable.RunValidate).SetValue((!flag).ToString());
//if (runner.Variables.ContainsKey(DefaultVariable.RunValidate))
//{
// runner.Variables[DefaultVariable.RunValidate] = variable;
//}
//else
//{
// runner.Variables.Add(DefaultVariable.RunValidate, variable);
//}
this.LogDebug($"============[执行事务完成]====>[等待节点运行]======>{flag}");
return flag;
}
private bool SetWaitNode(NodeBase curNode, string waitPath)
{
waitPath = waitPath.StartsWith("P_R")
? waitPath
: waitPath.Sw($"{curNode.CurPackageInfo.CurRoundInfo.NodePath}_");
this.LogDebug($"============[执行事务中...]====>[等待节点运行]======>waitPath{waitPath}");
var waitNode = curNode.CurPackageInfo.GetNodeByPath(waitPath);
if (waitNode == null || waitNode.NodeState == NodeState.RunEnd || waitNode.NodeState == NodeState.Complete)
{
return false;
}
curNode.WaitPath = curNode.WaitPath ?? new List();
if (!curNode.WaitPath.Contains(waitPath))
{
curNode.WaitPath.Add(waitPath);
}
if (curNode.CurPackageInfo.WaitForRunNode.ContainsKey(waitPath))
{
List toRunList = curNode.CurPackageInfo.WaitForRunNode[waitPath];
toRunList.Add(curNode.NodePath);
curNode.CurPackageInfo.WaitForRunNode[waitPath] = toRunList;
}
else
{
curNode.CurPackageInfo.WaitForRunNode.Add(waitPath, new List() { curNode.NodePath });
}
return true;
}
}
}