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; } } }