RunNodeToWaitSetStatement.cs 3.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596
  1. using System.Collections.Generic;
  2. using IwbZero.IocNamed;
  3. using IwbZero.IwbBase;
  4. using IwbZero.ToolCommon.LogHelpers;
  5. using IwbZero.ToolCommon.StringModel;
  6. using WeEngine.ComponentInfo;
  7. using WeEngine.Components.InterfaceFactory;
  8. using WeEngine.Enum;
  9. using WeEngine.Packages;
  10. namespace WeEngine.Components.Statements
  11. {
  12. /// <summary>
  13. /// 等待其他节点运行结束
  14. /// </summary>
  15. [IocNamed(CompStmtType.SetNodeToWait)]
  16. public class SetNodeToWaitStatement : IStatementRunner
  17. {
  18. public bool Run(ComponentRunner runner, IwbXmlNode poStatement)
  19. {
  20. var flag = false;
  21. var curNode = runner.CurrentNode;
  22. this.LogDebug($"============[开始执行事务]====>[等待节点运行]======>{curNode.NodePath}");
  23. var childValue = poStatement.GetChildValue("WaitNode");
  24. if (childValue.IsEmpty())
  25. {
  26. var waitNodes = poStatement.GetChildNode("WaitNodes");
  27. if (waitNodes != null && waitNodes.Nodes.Count > 0)
  28. {
  29. foreach (IwbXmlNode node in waitNodes.Nodes)
  30. {
  31. childValue = node.GetChildValue("WaitNode");
  32. var waitPath = runner.Evaluate(childValue);
  33. flag = flag || SetWaitNode(curNode, waitPath);
  34. }
  35. }
  36. else
  37. {
  38. childValue = poStatement.GetChildValue("WaitNodes");
  39. }
  40. }
  41. if (childValue.IsNotEmpty())
  42. {
  43. foreach (var path in childValue.StrToArray())
  44. {
  45. var waitPath = runner.Evaluate(path);
  46. flag = flag || SetWaitNode(curNode, waitPath);
  47. }
  48. }
  49. //var variable = new IwbRtVariable(DefaultVariable.RunValidate).SetValue((!flag).ToString());
  50. //if (runner.Variables.ContainsKey(DefaultVariable.RunValidate))
  51. //{
  52. // runner.Variables[DefaultVariable.RunValidate] = variable;
  53. //}
  54. //else
  55. //{
  56. // runner.Variables.Add(DefaultVariable.RunValidate, variable);
  57. //}
  58. this.LogDebug($"============[执行事务完成]====>[等待节点运行]======>{flag}");
  59. return flag;
  60. }
  61. private bool SetWaitNode(NodeBase curNode, string waitPath)
  62. {
  63. waitPath = waitPath.StartsWith("P_R")
  64. ? waitPath
  65. : waitPath.Sw($"{curNode.CurPackageInfo.CurRoundInfo.NodePath}_");
  66. this.LogDebug($"============[执行事务中...]====>[等待节点运行]======>waitPath{waitPath}");
  67. var waitNode = curNode.CurPackageInfo.GetNodeByPath(waitPath);
  68. if (waitNode == null || waitNode.NodeState == NodeState.RunEnd || waitNode.NodeState == NodeState.Complete)
  69. {
  70. return false;
  71. }
  72. curNode.WaitPath = curNode.WaitPath ?? new List<string>();
  73. if (!curNode.WaitPath.Contains(waitPath))
  74. {
  75. curNode.WaitPath.Add(waitPath);
  76. }
  77. if (curNode.CurPackageInfo.WaitForRunNode.ContainsKey(waitPath))
  78. {
  79. List<string> toRunList = curNode.CurPackageInfo.WaitForRunNode[waitPath];
  80. toRunList.Add(curNode.NodePath);
  81. curNode.CurPackageInfo.WaitForRunNode[waitPath] = toRunList;
  82. }
  83. else
  84. {
  85. curNode.CurPackageInfo.WaitForRunNode.Add(waitPath, new List<string>() { curNode.NodePath });
  86. }
  87. return true;
  88. }
  89. }
  90. }