EvolutionRunner.cs 49 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485868788899091929394959697989910010110210310410510610710810911011111211311411511611711811912012112212312412512612712812913013113213313413513613713813914014114214314414514614714814915015115215315415515615715815916016116216316416516616716816917017117217317417517617717817918018118218318418518618718818919019119219319419519619719819920020120220320420520620720820921021121221321421521621721821922022122222322422522622722822923023123223323423523623723823924024124224324424524624724824925025125225325425525625725825926026126226326426526626726826927027127227327427527627727827928028128228328428528628728828929029129229329429529629729829930030130230330430530630730830931031131231331431531631731831932032132232332432532632732832933033133233333433533633733833934034134234334434534634734834935035135235335435535635735835936036136236336436536636736836937037137237337437537637737837938038138238338438538638738838939039139239339439539639739839940040140240340440540640740840941041141241341441541641741841942042142242342442542642742842943043143243343443543643743843944044144244344444544644744844945045145245345445545645745845946046146246346446546646746846947047147247347447547647747847948048148248348448548648748848949049149249349449549649749849950050150250350450550650750850951051151251351451551651751851952052152252352452552652752852953053153253353453553653753853954054154254354454554654754854955055155255355455555655755855956056156256356456556656756856957057157257357457557657757857958058158258358458558658758858959059159259359459559659759859960060160260360460560660760860961061161261361461561661761861962062162262362462562662762862963063163263363463563663763863964064164264364464564664764864965065165265365465565665765865966066166266366466566666766866967067167267367467567667767867968068168268368468568668768868969069169269369469569669769869970070170270370470570670770870971071171271371471571671771871972072172272372472572672772872973073173273373473573673773873974074174274374474574674774874975075175275375475575675775875976076176276376476576676776876977077177277377477577677777877978078178278378478578678778878979079179279379479579679779879980080180280380480580680780880981081181281381481581681781881982082182282382482582682782882983083183283383483583683783883984084184284384484584684784884985085185285385485585685785885986086186286386486586686786886987087187287387487587687787887988088188288388488588688788888989089189289389489589689789889990090190290390490590690790890991091191291391491591691791891992092192292392492592692792892993093193293393493593693793893994094194294394494594694794894995095195295395495595695795895996096196296396496596696796896997097197297397497597697797897998098198298398498598698798898999099199299399499599699799899910001001100210031004100510061007100810091010101110121013101410151016101710181019102010211022102310241025102610271028102910301031103210331034103510361037103810391040104110421043104410451046104710481049105010511052105310541055105610571058105910601061106210631064106510661067106810691070107110721073107410751076107710781079108010811082108310841085108610871088108910901091109210931094109510961097109810991100110111021103110411051106110711081109111011111112111311141115111611171118111911201121112211231124112511261127112811291130113111321133113411351136113711381139114011411142114311441145114611471148114911501151115211531154115511561157115811591160116111621163116411651166116711681169117011711172117311741175117611771178117911801181118211831184118511861187118811891190119111921193119411951196119711981199120012011202120312041205120612071208120912101211121212131214121512161217121812191220122112221223122412251226122712281229123012311232123312341235123612371238
  1. using System;
  2. using System.Collections.Generic;
  3. using System.Dynamic;
  4. using System.Linq;
  5. using System.Threading;
  6. using IwbZero.Expr;
  7. using IwbZero.ToolCommon.LogHelpers;
  8. using IwbZero.ToolCommon.StringModel;
  9. using WeEngine.CommonDto;
  10. using WeEngine.CommonDto.WeInfo;
  11. using WeEngine.Components;
  12. using WeEngine.Enum;
  13. using WeEngine.Message;
  14. using WeEngine.Packages;
  15. using WeEngine.Strategy.Runner;
  16. namespace WeEngine.Module
  17. {
  18. public class EvolutionRunner : IRunnerStrategy
  19. {
  20. public EvolutionRunner(ComponentRunner componentRunner)
  21. {
  22. ComponentRunner = componentRunner;
  23. }
  24. private ComponentRunner ComponentRunner { get; }
  25. public string Message { get; set; }
  26. public virtual PackageNode PackageInfo { get; set; }
  27. public NodeBase CurrentNode { get; set; }
  28. private NodeBase GetNodeByPath(string path)
  29. {
  30. var node = PackageInfo.GetNodeByPath(path);
  31. return node;
  32. }
  33. #region 运行
  34. /// <summary>
  35. /// 运行方案包
  36. /// </summary>
  37. /// <param name="node"></param>
  38. /// <param name="operationType"></param>
  39. /// <returns></returns>
  40. public virtual bool Run(NodeBase node, OperationType operationType)
  41. {
  42. CurrentNode = node;
  43. return Run(operationType);
  44. }
  45. /// <summary>
  46. /// 运行
  47. /// </summary>
  48. /// <param name="path">匹配关键字时('path|word|role|scenePath')</param>
  49. /// <param name="operationType"></param>
  50. /// <returns></returns>
  51. public virtual bool Run(string path, OperationType operationType)
  52. {
  53. if (operationType == OperationType.MatchKey)
  54. {
  55. string[] arr = path.Split('|');
  56. if (arr.Length == 4)
  57. {
  58. CurrentNode = GetNodeByPath(arr[0]);
  59. dynamic obj = new ExpandoObject();
  60. obj.BehaviorWord = arr[1];
  61. obj.BehaviorRole = arr[2];
  62. obj.ScenePath = arr[3];
  63. CurrentNode.ExtendData = obj;
  64. return Run(OperationType.MatchKey);
  65. }
  66. return false;
  67. }
  68. CurrentNode = GetNodeByPath(path);
  69. return Run(operationType);
  70. }
  71. /// <summary>
  72. /// 运行
  73. /// </summary>
  74. /// <param name="operationType"></param>
  75. /// <returns></returns>
  76. private bool Run(OperationType operationType)
  77. {
  78. if (CurrentNode != null)
  79. {
  80. return RunNode(CurrentNode, operationType);
  81. }
  82. return false;
  83. }
  84. /// <summary>
  85. /// 运行节点
  86. /// </summary>
  87. /// <param name="curPackageInfo"></param>
  88. /// <param name="id"></param>
  89. /// <param name="operationType"></param>
  90. /// <returns></returns>
  91. public bool RunNode(PackageNode curPackageInfo, string id, OperationType operationType)
  92. {
  93. if (operationType == OperationType.MatchKey)
  94. {
  95. string[] arr = id.Split('|');
  96. if (arr.Length == 3)
  97. {
  98. var curNode = curPackageInfo.GetNodeByPath(arr[0]);
  99. dynamic obj = new ExpandoObject();
  100. obj.BehaviorWord = arr[1];
  101. obj.BehaviorRole = arr[2];
  102. curNode.ExtendData = obj;
  103. return RunNode(curNode, OperationType.MatchKey);
  104. }
  105. return false;
  106. }
  107. {
  108. var curNode = curPackageInfo.GetNodeByPath(id);
  109. return RunNode(curNode, operationType);
  110. }
  111. }
  112. /// <summary>
  113. /// 运行节点
  114. /// </summary>
  115. /// <param name="node"></param>
  116. /// <param name="operationType"></param>
  117. /// <returns></returns>
  118. private bool RunNode(NodeBase node, OperationType operationType)
  119. {
  120. var flag = true;
  121. switch (operationType)
  122. {
  123. //case OperationType.PreEvent:
  124. // flag = RunnerPre(node);
  125. // break;
  126. //case OperationType.RunningEvent:
  127. // flag = RunnerRunning(node);
  128. // break;
  129. //case OperationType.RunnedEvent:
  130. // flag = RunnerRunned(node);
  131. // break;
  132. //case OperationType.PostEvent:
  133. // flag = RunnerPost(node);
  134. // break;
  135. //case OperationType.SelectNextNode:
  136. // SelectNext2Run(node);
  137. // break;
  138. case OperationType.MatchKey:
  139. flag = RunnerMatchKey(node);
  140. break;
  141. case OperationType.MatchSuccess:
  142. flag = RunnerMatchSuccess(node);
  143. SendMsg(node, MessageType.RunningInfo, $"培训营[{node.CurPackageInfo.RunningId}]评分已变化");
  144. break;
  145. //case OperationType.Start:
  146. //case OperationType.Stop:
  147. //case OperationType.NextRound:
  148. //case OperationType.NextFlowNodes:
  149. //case OperationType.NextFlowNode:
  150. default:
  151. switch (operationType)
  152. {
  153. case OperationType.Start:
  154. flag = Start(node);
  155. SendNodeChange(node);
  156. break;
  157. case OperationType.Stop:
  158. flag = Stop(node);
  159. SendNodeChange(node);
  160. break;
  161. case OperationType.NextRound:
  162. flag = NextRound(node);
  163. SendNodeChange(node);
  164. break;
  165. case OperationType.NextFlowNodes:
  166. flag = NextFlowNodes(node);
  167. SendNodeChange(node);
  168. break;
  169. case OperationType.NextFlowNode:
  170. flag = NextFlowNode(node);
  171. SendNodeChange(node);
  172. break;
  173. }
  174. //SendMsg(node, MessageType.RunningInfo, $"培训营[{node.CurPackageInfo.RunningId}]评分已变化");
  175. //SendMsg(node, MessageType.RunningInfo, $"培训营[{node.CurPackageInfo.RunningId}]情景数据结构已变化@{node.NodePath}");
  176. break;
  177. }
  178. return flag;
  179. }
  180. private void SendNodeChange(NodeBase node)
  181. {
  182. SendMsg(node, MessageType.RunningInfo, $"培训营[{node.CurPackageInfo.RunningId}]评分已变化");
  183. SendMsg(node, MessageType.RunningInfo, $"培训营[{node.CurPackageInfo.RunningId}]情景数据结构已变化@{node.NodePath}");
  184. }
  185. #endregion 运行
  186. /// <summary>
  187. /// 节点状态变更事件
  188. /// </summary>
  189. /// <param name="node"></param>
  190. /// <param name="oldState"></param>
  191. public void NodeChangeEventHandle(NodeBase node, NodeState oldState)
  192. {
  193. if (node.NodeState == NodeState.New)
  194. {
  195. return;
  196. }
  197. if (node.NodeState == NodeState.ReStart)
  198. {
  199. //重启后自动变更为运行状态
  200. node.NodeState = NodeState.Running;
  201. return;
  202. }
  203. switch (oldState)
  204. {
  205. case NodeState.New:
  206. node.PreConditionValidated = true;
  207. RunnerPre(node);
  208. if (!node.NotNeedValidated && !node.PreConditionValidated)
  209. {
  210. node.NodeState = NodeState.New;
  211. if (node.NodeType == NodeType.FlowNode || node.NodeType == NodeType.SceneFlowBlock)
  212. {
  213. SelectNext2Run(node);
  214. }
  215. return;
  216. }
  217. if (node.IsWait)
  218. {
  219. node.NodeState = NodeState.Wait;
  220. return;
  221. }
  222. node.NotNeedValidated = false;
  223. if (node.NodeState == NodeState.Running)
  224. {
  225. if (node.NodeType != NodeType.KeyWord)
  226. {
  227. typeof(NodeBase).LogDebug($"节点 - [{node.NodeType}] - [{node.CurPackageInfo.RunningId}] - [{node.NodePath}] -【已启动】");
  228. }
  229. RunnerRunning(node);
  230. }
  231. break;
  232. case NodeState.Wait:
  233. {
  234. if (node.NodeState == NodeState.Running)
  235. {
  236. typeof(NodeBase).LogDebug($"节点 - [{node.NodeType}] - [{node.CurPackageInfo.RunningId}] - [{node.NodePath}] -【已启动】");
  237. RunnerRunning(node);
  238. }
  239. break;
  240. }
  241. case NodeState.Running:
  242. if (node.NodeState == NodeState.RunEnd)
  243. {
  244. node.RunnedConditionValidated = true;
  245. RunnerRunned(node);
  246. if (!node.RunnedConditionValidated)
  247. {
  248. node.NodeState = oldState;
  249. return;
  250. }
  251. if (node.NodeType != NodeType.KeyWord)
  252. {
  253. typeof(NodeBase).LogDebug($"节点 - [{node.NodeType}] - [{node.CurPackageInfo.RunningId}] - [{node.NodePath}] -【已结束】");
  254. }
  255. }
  256. else if (node.NodeState == NodeState.Complete)
  257. {
  258. if (node.NodeType != NodeType.KeyWord)
  259. {
  260. typeof(NodeBase).LogDebug($"节点 - [{node.NodeType}] - [{node.CurPackageInfo.RunningId}] - [{node.NodePath}] -【【已完成】】");
  261. }
  262. RunnerPost(node);
  263. }
  264. break;
  265. case NodeState.RunEnd:
  266. if (node.NodeState == NodeState.Complete)
  267. {
  268. RunnerPost(node);
  269. typeof(NodeBase).LogDebug($"节点- [{node.NodeType}] - [{node.CurPackageInfo.RunningId}] - [{node.NodePath}] - 【【 已完成 】】");
  270. }
  271. break;
  272. case NodeState.ReStart:
  273. break;
  274. }
  275. }
  276. /// <summary>
  277. /// 开始
  278. /// </summary>
  279. /// <param name="node"></param>
  280. /// <returns></returns>
  281. private bool Start(NodeBase node)
  282. {
  283. if (node.NodeState == NodeState.Running)
  284. {
  285. return false;
  286. }
  287. node.NodeState = NodeState.Running;
  288. return true;
  289. }
  290. /// <summary>
  291. /// 结束
  292. /// </summary>
  293. /// <param name="node"></param>
  294. /// <returns></returns>
  295. private bool Stop(NodeBase node)
  296. {
  297. if (node.NodeState == NodeState.Running)
  298. {
  299. node.NodeState = NodeState.RunEnd;
  300. }
  301. return true;
  302. }
  303. /// <summary>
  304. /// 前置验证
  305. /// </summary>
  306. /// <param name="node"></param>
  307. /// <returns></returns>
  308. private void RunnerPre(NodeBase node)
  309. {
  310. node.SetPreVariables();
  311. if (node.EventComponentNode != null && node.EventComponentNode.PreComponent.IsNotEmpty() &&
  312. !node.EventComponentNode.PreComponent.EndsWith("|"))
  313. {
  314. var vars = node.GetVariables();
  315. var arr = node.EventComponentNode.PreComponent.StrToArray("|");
  316. string componentId = arr[0], mapping = "";
  317. if (arr.Length >= 2)
  318. {
  319. mapping = arr[1];
  320. }
  321. ComponentRunner.Variables.Clear();
  322. ComponentRunner.Variables = ComponentRunner.Variables.MergeHashtable(vars);
  323. ComponentRunner.CurrentNode = node;
  324. ComponentRunner.Run(componentId, mapping);
  325. node.PreConditionValidated = ComponentRunner.GetValue(DefaultVariable.RunValidate.UAndT()).ValB();
  326. typeof(EvolutionRunner).LogDebug($"---[运行前事务:{node.PreConditionValidated}]--->[GroupNo:{node.CurPackageInfo.RunningId},Path:{node.NodePath},Component:{node.EventComponentNode.PreComponent},\r\n" +
  327. $" ============> RoundScore:{ ComponentRunner.GetValue(DefaultVariable.RoundScore)}--{ComponentRunner.GetValue(DefaultVariable.FullRoundScore)}," +
  328. $" FlowScore:{ ComponentRunner.GetValue(DefaultVariable.FlowScore)}--{ComponentRunner.GetValue(DefaultVariable.FullFlowScore)}]");
  329. }
  330. //if (node.PreConditionValidated)
  331. //{
  332. // SelectChildRun(node);
  333. //}
  334. //else if (node.NodeType == NodeType.FlowNode|| node.NodeType == NodeType.SceneFlowBlock)
  335. //{
  336. // SelectNext2Run(node);
  337. //}
  338. }
  339. /// <summary>
  340. /// 通知下一节点运行
  341. /// </summary>
  342. /// <param name="node"></param>
  343. private void SelectNext2Run(NodeBase node)
  344. {
  345. if (node.HasParent && (node.NodeType == NodeType.SceneFlowBlock || node.NodeType == NodeType.FlowNode))
  346. {
  347. var next = node.PreConditionValidated;
  348. if (node.NodeType == NodeType.SceneFlowBlock)
  349. {
  350. var b = (SceneFlowBlockNode)node;
  351. if (b.BlockType == SceneFlowBlockType.Objective)
  352. {
  353. next = false;
  354. }
  355. }
  356. if (next)
  357. {
  358. return;
  359. }
  360. var nodes = node.Parent.Children;
  361. var index = nodes.FindIndex(a => a.Id == node.Id && a.InternalNo == node.InternalNo);
  362. index++;
  363. if (index > 0 && index < nodes.Count)
  364. {
  365. var nextNode = nodes[index];
  366. if (nextNode != null)
  367. {
  368. typeof(EvolutionRunner).LogDebug($"---[准备启动下一节点]--->[GroupNo:{node.CurPackageInfo.RunningId},本节点Path:{node.NodePath}]");
  369. nextNode.NodeState = NodeState.Running;
  370. }
  371. }
  372. else if (node.NodeType == NodeType.FlowNode)
  373. {
  374. var flowNode = (FlowNode)node;
  375. if (flowNode.SelfFlow.NodeState == NodeState.Running)
  376. {
  377. if (node.CurPackageInfo?.WaitForRunNode?.Values.Any(a => a.Any(s => s.StartsWith(flowNode.SelfFlow.NodePath))) ?? false)
  378. {
  379. typeof(EvolutionRunner).LogDebug($"---[没有节点运行,情景流中等待运行的节点]--->[GroupNo:{node.CurPackageInfo?.RunningId},Path:{node.NodePath}]");
  380. return;
  381. }
  382. typeof(EvolutionRunner).LogDebug($"---[没有节点运行,结束情景流]--->[GroupNo:{node.CurPackageInfo?.RunningId},Path:{node.NodePath}]");
  383. flowNode.SelfFlow.NodeState = NodeState.RunEnd;
  384. }
  385. }
  386. else if (node.NodeType == NodeType.SceneFlowBlock)
  387. {
  388. var b = (SceneFlowBlockNode)node;
  389. if (b.BlockType != SceneFlowBlockType.Objective)
  390. {
  391. node.NodeState = NodeState.New;
  392. typeof(EvolutionRunner).LogDebug($"---[随机选取演化情景块]--->[GroupNo:{node.CurPackageInfo.RunningId},Path:{node.NodePath}]");
  393. SelectRandomFlowBlock(node);
  394. }
  395. }
  396. }
  397. //if ( node.NodeType == NodeType.SceneFlowBlock)
  398. //{
  399. // var blockNode = ((SceneFlowBlockNode)node);
  400. // if (((SceneRoundNode)blockNode.Parent).EvolutionBlockHasSelected && blockNode.BlockType != SceneFlowBlockType.Objective)
  401. // {
  402. // return;
  403. // }
  404. // if (node.PreConditionValidated && blockNode.BlockType != SceneFlowBlockType.Objective)
  405. // {
  406. // SelectRandomFlowBlock(node);
  407. // return;
  408. // }
  409. //} else if (node.PreConditionValidated)
  410. //{
  411. // return;
  412. //}
  413. }
  414. /// <summary>
  415. /// 运行时事件
  416. /// </summary>
  417. /// <param name="node"></param>
  418. /// <returns></returns>
  419. private void RunnerRunning(NodeBase node)
  420. {
  421. SendRunInfo(node);
  422. SelectChildRun(node);
  423. if (node.EventComponentNode != null && node.EventComponentNode.RunningComponent.IsNotEmpty() && !node.EventComponentNode.RunningComponent.EndsWith("|"))
  424. {
  425. typeof(EvolutionRunner).LogDebug($"---[运行时事务]---> [GroupNo:{node.CurPackageInfo.RunningId},Path:{node.NodePath},Component:{node.EventComponentNode.RunningComponent}]");
  426. var vars = node.GetVariables();
  427. var arr = node.EventComponentNode.RunningComponent.StrToArray("|");
  428. string componentId = arr[0], mapping = "";
  429. if (arr.Length == 2)
  430. {
  431. mapping = arr[1];
  432. }
  433. ComponentRunner.Variables.Clear();
  434. ComponentRunner.Variables = ComponentRunner.Variables.MergeHashtable(vars);
  435. ComponentRunner.CurrentNode = node;
  436. ComponentRunner.Run(componentId, mapping);
  437. }
  438. }
  439. private void SendRunInfo(NodeBase node)
  440. {
  441. if (node.NodeType == NodeType.ScenePackage)
  442. {
  443. SendMsg(node, MessageType.Start, $"培训营{node.CurPackageInfo.RunningId}开始演练");
  444. }
  445. if (node.NodeType == NodeType.SceneInfo)
  446. {
  447. var scene = (SceneNode)node;
  448. //var pushSceneInfo = new PushSceneInfo(scene);
  449. SendMsg(node, MessageType.SceneInfo, new { No = scene.Id, Path = scene.NodePath }.Obj2String());
  450. if (scene.EnvironResources != null && scene.EnvironResources.Any())
  451. {
  452. Thread.Sleep(2000);
  453. foreach (var render in scene.EnvironResources)
  454. {
  455. render.NodePath = scene.NodePath;
  456. SendMsg(node, MessageType.Environment, render.Obj2StringCamelCase());
  457. }
  458. }
  459. }
  460. else if (node.NodeType == NodeType.Behavior)
  461. {
  462. var behaviorNode = (BehaviorNode)node;
  463. if (behaviorNode.EnvironResources != null && behaviorNode.EnvironResources.Any())
  464. {
  465. foreach (var render in behaviorNode.EnvironResources)
  466. {
  467. render.NodePath = behaviorNode.NodePath;
  468. SendMsg(node, MessageType.Environment, render.Obj2StringCamelCase());
  469. }
  470. }
  471. }
  472. var guideInfos = node.GuideInfos?.Where(a => a.IsPush).ToList();
  473. if (guideInfos != null && guideInfos.Any())
  474. {
  475. foreach (var guideInfo in guideInfos)
  476. {
  477. SendMsg(node, MessageType.GuideInfo, new GuidePushDto() { RunningId = node.CurPackageInfo.RunningId, GuideNo = guideInfo.Id, GuideName = guideInfo.Name, GuideDesc = guideInfo.Description, No = node.Id, Path = node.NodePath }.Obj2StringCamelCase());
  478. }
  479. }
  480. }
  481. /// <summary>
  482. /// 通知子节点运行
  483. /// </summary>
  484. /// <param name="node"></param>
  485. private void SelectChildRun(NodeBase node)
  486. {
  487. switch (node.NodeType)
  488. {
  489. case NodeType.ScenePackage:
  490. {
  491. var n = ((PackageNode)node);
  492. var roundIndex = n.CurrentRoundIndex + 1;
  493. var roundInfo = n.Children.Select(a => (SceneRoundNode)a).FirstOrDefault(a => a.RoundIndex == roundIndex);
  494. if (roundInfo != null)
  495. {
  496. roundInfo.NodeState = NodeState.Running;
  497. }
  498. else
  499. {
  500. Stop(n);
  501. }
  502. break;
  503. }
  504. case NodeType.SceneRound:
  505. {
  506. //SelectChild2Run((SceneRoundNode)node);
  507. var roundNode = (SceneRoundNode)node;
  508. if (!roundNode.HasChild)
  509. {
  510. return;
  511. }
  512. var child = roundNode.Children.FirstOrDefault();
  513. if (child != null)
  514. {
  515. child.NodeState = NodeState.Running;
  516. }
  517. break;
  518. }
  519. case NodeType.SceneFlowBlock:
  520. {
  521. var n = ((SceneFlowBlockNode)node);
  522. if (n.BlockType == SceneFlowBlockType.Objective)
  523. {
  524. //SelectAllChildren2Run(node);
  525. if (!n.HasChild)
  526. {
  527. return;
  528. }
  529. foreach (var child in n.Children)
  530. {
  531. child.NodeState = NodeState.Running;
  532. }
  533. SelectNext2Run(node);
  534. }
  535. else if (n.BlockType == SceneFlowBlockType.Evolutionary && !((SceneRoundNode)n.Parent).EvolutionBlockHasSelected)
  536. {
  537. SelectRandomFlowBlock(node);
  538. }
  539. //else if (n.BlockType == SceneFlowBlockType.Evolutionary &&
  540. // !((SceneRoundNode)n.Parent).EvolutionBlockHasSelected)
  541. //{
  542. // ((SceneRoundNode)n.Parent).EvolutionBlockHasSelected = true;
  543. //}
  544. //else
  545. //{
  546. // n.PreConditionValidated = false;
  547. // SelectRandomFlowBlock(node);
  548. //}
  549. break;
  550. }
  551. case NodeType.SceneFlow:
  552. {
  553. var n = ((SceneFlowNode)node);
  554. var runChild = n.RunningNode;
  555. //SelectChild2Run(runChild);
  556. if (runChild == null)
  557. {
  558. runChild = (FlowNode)n.Children.FirstOrDefault();
  559. if (runChild != null) runChild.NodeState = NodeState.Running;
  560. }
  561. else if (runChild.HasChild)
  562. {
  563. var child = runChild.Children.FirstOrDefault();
  564. if (child != null)
  565. {
  566. child.NodeState = NodeState.Running;
  567. }
  568. }
  569. break;
  570. }
  571. case NodeType.FlowNode:
  572. {
  573. var n = ((FlowNode)node);
  574. n.SelfFlow.RunningNode = n;
  575. foreach (var sceneInfo in n.SceneInfos)
  576. {
  577. sceneInfo.NodeState = NodeState.Running;
  578. }
  579. break;
  580. }
  581. case NodeType.SceneInfo:
  582. {
  583. var n = ((SceneNode)node);
  584. if (!n.HasChild)
  585. {
  586. return;
  587. }
  588. foreach (var child in n.Children)
  589. {
  590. child.NodeState = NodeState.Running;
  591. }
  592. break;
  593. }
  594. case NodeType.Behavior:
  595. {
  596. var n = ((BehaviorNode)node);
  597. if (!n.HasChild)
  598. {
  599. return;
  600. }
  601. foreach (var child in n.Children)
  602. {
  603. child.NodeState = NodeState.Running;
  604. }
  605. break;
  606. }
  607. case NodeType.KeyWord:
  608. {
  609. var n = ((KeywordNode)node);
  610. if (!n.HasChild)
  611. {
  612. return;
  613. }
  614. foreach (var child in n.Children)
  615. {
  616. child.NodeState = NodeState.Running;
  617. }
  618. break;
  619. }
  620. }
  621. }
  622. /// <summary>
  623. /// 选取演化情景流块(带权重)
  624. /// </summary>
  625. /// <param name="node"></param>
  626. private void SelectRandomFlowBlock(NodeBase node)
  627. {
  628. var curRoundInfo = node.CurPackageInfo.CurRoundInfo;
  629. var list = curRoundInfo.Children.Select(a => (SceneFlowBlockNode)a).Where(a => a.BlockType == SceneFlowBlockType.Evolutionary).ToList();
  630. if (curRoundInfo.EvolutionBlockHasSelected)
  631. {
  632. return;
  633. }
  634. curRoundInfo.EvolutionBlockHasSelected = true;
  635. SceneFlowBlockNode selectBlock = null;
  636. if (list.Count > 0)
  637. {
  638. if (node.NodeState == NodeState.Running)
  639. {
  640. //生成随机值,判断是否在权重范围内
  641. //var randomResult = "1";
  642. var randomResult = EvalExpr.Evaluate($"IFunRandomSelection({curRoundInfo.ControlRate})");
  643. if (randomResult.ValB())
  644. {
  645. selectBlock = (SceneFlowBlockNode)node;
  646. }
  647. }
  648. if (selectBlock == null)
  649. {
  650. typeof(EvolutionRunner).LogDebug($"---[选取其他演化情景块]---> [GroupNo:{node.CurPackageInfo.RunningId},Path:{node.NodePath}]");
  651. var noRunBlock = list.Where(a => a.NodeState == NodeState.New).ToList();
  652. if (noRunBlock.Any())
  653. {
  654. node.NodeState = NodeState.New;
  655. var random = new Random().Next(0, noRunBlock.Count - 1);
  656. selectBlock = noRunBlock[random];
  657. }
  658. else
  659. {
  660. selectBlock = (SceneFlowBlockNode)node;
  661. }
  662. }
  663. }
  664. //选取情景流
  665. if (selectBlock != null)
  666. {
  667. typeof(EvolutionRunner).LogDebug($"================> [NewPath:{selectBlock.NodePath}]");
  668. selectBlock.NotNeedValidated = true;
  669. selectBlock.NodeState = NodeState.Running;
  670. var sceneCount = curRoundInfo.SceneCount;
  671. var flows = new List<NodeBase>();
  672. flows.AddRange(selectBlock.Children);
  673. sceneCount = sceneCount > flows.Count ? flows.Count : sceneCount;
  674. while (sceneCount > 0)
  675. {
  676. var id = SelectRandomFlows(ref flows);
  677. var flow = selectBlock.Children.FirstOrDefault(a => a.Id == id);
  678. if (flow != null)
  679. {
  680. typeof(EvolutionRunner).LogDebug($"---[选取演化情景流]---> [Path:{flow.NodePath}]");
  681. flow.NodeState = NodeState.Running;
  682. }
  683. sceneCount--;
  684. }
  685. }
  686. }
  687. /// <summary>
  688. /// 演化情景流块选取情景流
  689. /// </summary>
  690. /// <param name="flows"></param>
  691. /// <returns></returns>
  692. private string SelectRandomFlows(ref List<NodeBase> flows)
  693. {
  694. var random = new Random().Next(0, flows.Count - 1);
  695. var flow = flows[random];
  696. flows.Remove(flow);
  697. return flow.Id;
  698. }
  699. /// <summary>
  700. /// 运行结束时事件
  701. /// </summary>
  702. /// <param name="node"></param>
  703. /// <returns></returns>
  704. private void RunnerRunned(NodeBase node)
  705. {
  706. node.SetRunnedVariables();
  707. if (node.EventComponentNode != null && node.EventComponentNode.RunnedComponent.IsNotEmpty() && !node.EventComponentNode.RunnedComponent.EndsWith("|"))
  708. {
  709. var vars = node.GetVariables();
  710. var arr = node.EventComponentNode.RunnedComponent.StrToArray("|");
  711. string componentId = arr[0], mapping = "";
  712. if (arr.Length == 2)
  713. {
  714. mapping = arr[1];
  715. }
  716. ComponentRunner.Variables.Clear();
  717. ComponentRunner.Variables = ComponentRunner.Variables.MergeHashtable(vars);
  718. ComponentRunner.CurrentNode = node;
  719. ComponentRunner.Run(componentId, mapping);
  720. node.RunnedConditionValidated = ComponentRunner.GetValue(DefaultVariable.RunValidate.UAndT()).ValB();
  721. typeof(EvolutionRunner).LogDebug($"---[运行结束事务{node.RunnedConditionValidated}]--->[GroupNo:{node.CurPackageInfo.RunningId},Path:{node.NodePath},Component:{node.EventComponentNode.RunnedComponent},\r\n" +
  722. $" ============> RoundScore:{ ComponentRunner.GetValue(DefaultVariable.RoundScore)}--{ComponentRunner.GetValue(DefaultVariable.FullRoundScore)}," +
  723. $" FlowScore:{ ComponentRunner.GetValue(DefaultVariable.FlowScore)}--{ComponentRunner.GetValue(DefaultVariable.FullFlowScore)}]");
  724. }
  725. if (node.RunnedConditionValidated)
  726. {
  727. SelectPrevEnd(node);
  728. node.NodeState = NodeState.Complete;
  729. }
  730. }
  731. /// <summary>
  732. /// 通知父节点结束
  733. /// </summary>
  734. /// <param name="node"></param>
  735. private void SelectPrevEnd(NodeBase node)
  736. {
  737. if (node.CurPackageInfo.NodeState != NodeState.Running)
  738. {
  739. return;
  740. }
  741. switch (node.NodeType)
  742. {
  743. case NodeType.ScenePackage:
  744. {
  745. var n = ((PackageNode)node);
  746. if (n.AutoNextRound)
  747. {
  748. }
  749. break;
  750. }
  751. case NodeType.SceneRound:
  752. {
  753. var n = ((SceneRoundNode)node);
  754. if (n.HasParent && !n.Parent.ChildIsRunning)
  755. {
  756. var nextRound = n.Parent.Children.Select(a => (SceneRoundNode)a)
  757. .FirstOrDefault(a => a.RoundIndex == n.RoundIndex + 1);
  758. if (nextRound == null)
  759. {
  760. n.Parent.NodeState = NodeState.RunEnd;
  761. }
  762. }
  763. break;
  764. }
  765. case NodeType.SceneFlowBlock:
  766. {
  767. SelectParent2Stop(node);
  768. break;
  769. }
  770. case NodeType.SceneFlow:
  771. SelectParent2Stop(node);
  772. break;
  773. case NodeType.FlowNode:
  774. var flowNode = (FlowNode)node;
  775. if (flowNode.SceneInfos.Any())
  776. {
  777. foreach (var s in flowNode.SceneInfos)
  778. {
  779. s.NodeState = NodeState.RunEnd;
  780. }
  781. }
  782. if (!flowNode.HasChild && flowNode.SelfFlow != null)
  783. {
  784. flowNode.SelfFlow.NodeState = NodeState.RunEnd;
  785. }
  786. break;
  787. case NodeType.SceneInfo:
  788. var sceneNode = (SceneNode)node;
  789. if (sceneNode.HasChild)
  790. {
  791. foreach (var child in sceneNode.Children)
  792. {
  793. child.NodeState = NodeState.RunEnd;
  794. }
  795. }
  796. break;
  797. case NodeType.Behavior:
  798. break;
  799. default:
  800. SelectParent2Stop(node);
  801. break;
  802. }
  803. }
  804. /// <summary>
  805. /// 通知父节点结束
  806. /// </summary>
  807. /// <param name="node"></param>
  808. private void SelectParent2Stop(NodeBase node)
  809. {
  810. if (node.HasParent && !node.Parent.ChildIsRunning)
  811. {
  812. node.Parent.NodeState = NodeState.RunEnd;
  813. }
  814. }
  815. /// <summary>
  816. /// 后置事件
  817. /// </summary>
  818. /// <param name="node"></param>
  819. /// <returns></returns>
  820. private void RunnerPost(NodeBase node)
  821. {
  822. if (node.EventComponentNode != null && node.EventComponentNode.PostComponent.IsNotEmpty() && !node.EventComponentNode.PostComponent.EndsWith("|"))
  823. {
  824. typeof(EvolutionRunner).LogDebug($"---[运行完成后事务]--->[GroupNo:{node.CurPackageInfo.RunningId},Path:{node.NodePath},Component:{node.EventComponentNode.PostComponent}]");
  825. var vars = node.GetVariables();
  826. var arr = node.EventComponentNode.PostComponent.StrToArray("|");
  827. string componentId = arr[0], mapping = "";
  828. if (arr.Length == 2)
  829. {
  830. mapping = arr[1];
  831. }
  832. ComponentRunner.Variables.Clear();
  833. ComponentRunner.Variables = ComponentRunner.Variables.MergeHashtable(vars);
  834. ComponentRunner.CurrentNode = node;
  835. ComponentRunner.Run(componentId, mapping);
  836. node.PostConditionValidated = ComponentRunner.GetValue(DefaultVariable.RunValidate.UAndT()).ValB();
  837. }
  838. CallNodesToRun(node);
  839. NextNode(node);
  840. }
  841. /// <summary>
  842. /// 通知待运行节点
  843. /// </summary>
  844. /// <param name="node"></param>
  845. private void CallNodesToRun(NodeBase node)
  846. {
  847. var waitNodes = node.CurPackageInfo.WaitForRunNode;
  848. if (waitNodes.Count > 0 && waitNodes.ContainsKey(node.NodePath))
  849. {
  850. typeof(EvolutionRunner).LogDebug($"---[等待通知运行的节点]--->\r\n" +
  851. $"======>[{string.Join(",", waitNodes.Keys.ToArray())}]");
  852. var toRunIds = waitNodes[node.NodePath];
  853. if (toRunIds != null && toRunIds.Any())
  854. {
  855. typeof(EvolutionRunner).LogDebug($"---[准备通知节点运行]--->[GroupNo:{node.CurPackageInfo.RunningId},Path:{node.NodePath}\r\n=========>ToRunPaths:{string.Join(",", toRunIds.ToArray())}]");
  856. var temp = new List<string>();
  857. temp.AddRange(toRunIds);
  858. foreach (var nodeId in temp)
  859. {
  860. var runNode = node.CurPackageInfo.GetNodeByPath(nodeId);
  861. if (runNode.NodeState == NodeState.Wait && runNode.WaitPath.Any(a => a == node.NodePath))
  862. {
  863. typeof(EvolutionRunner).LogDebug($"---[移除待等待节点]--->[Path:{runNode.NodePath}] [Remove Path:{node.NodePath}]");
  864. runNode.WaitPath.Remove(node.NodePath);
  865. }
  866. if (!runNode.IsWait && (runNode.NodeType != NodeType.FlowNode ||
  867. runNode.Parent.Children.All(a =>
  868. a.NodeState == NodeState.New || a.NodeState == NodeState.Wait)))
  869. {
  870. typeof(EvolutionRunner).LogDebug($"---[通知节点运行]--->[Path:{runNode.NodePath}]");
  871. runNode.NodeState = NodeState.Running;
  872. }
  873. }
  874. }
  875. }
  876. }
  877. /// <summary>
  878. /// 关键字匹配
  879. /// </summary>
  880. /// <param name="node"></param>
  881. /// <returns></returns>
  882. private bool RunnerMatchKey(NodeBase node)
  883. {
  884. typeof(EvolutionRunner).LogDebug($"---[关键字开始匹配]---> [ groupNo:{node.CurPackageInfo.RunningId}]");
  885. node.CurPackageInfo.EvalManager?.Instance?.MatchKeyWord(node);
  886. return true;
  887. }
  888. /// <summary>
  889. /// 关键字匹配成功
  890. /// </summary>
  891. /// <param name="node"></param>
  892. /// <returns></returns>
  893. private bool RunnerMatchSuccess(NodeBase node)
  894. {
  895. if (node.NodeType != NodeType.KeyWord)
  896. {
  897. return false;
  898. }
  899. var n = (KeywordNode)node;
  900. string word = node.ExtendData?.MatchWord ?? "";
  901. n.HasMatched = true;
  902. n.MatchWord = word;
  903. var roundScore = new RoundScoreInfo
  904. {
  905. No = n.CurPackageInfo.RunningId,
  906. RoundIndex = n.CurPackageInfo.CurrentRoundIndex,
  907. RoundScore = n.CurPackageInfo.CurRoundInfo.ActualScore,
  908. TotalScore = n.CurPackageInfo.CurRoundInfo.RoundFullScore,
  909. KeyWords = word,
  910. TagScores = new List<TagScoreInfo>()
  911. };
  912. var behavior = (BehaviorNode)node.Parent;
  913. if (behavior.BehaviorScoreType == BehaviorScoreType.Normal && behavior.BehaviorTagArray.Length > 0)
  914. {
  915. foreach (var tag in behavior.BehaviorTagArray)
  916. {
  917. decimal totalScore = 0;
  918. if (n.CurPackageInfo.BehaviorTagFullScoreDic.ContainsKey(tag))
  919. {
  920. totalScore = n.CurPackageInfo.BehaviorTagFullScoreDic[tag];
  921. }
  922. roundScore.TagScores.Add(new TagScoreInfo()
  923. {
  924. TagNo = tag,
  925. SystemScore = n.ActualScore,
  926. CorrectionScore = 0,
  927. TotalScore = totalScore
  928. });
  929. }
  930. }
  931. var msg = roundScore.Obj2String();
  932. typeof(EvolutionRunner).LogDebug($"---[关键字匹配成功]--->[ groupNo:{node.CurPackageInfo.RunningId} ]\r\n" +
  933. $" ===============> MatchWord:{word}\r\n" +
  934. $" ===============> Word: {n.Word}\r\n" +
  935. $" ===============> Tag:[{msg}]");
  936. SendMsg(node, MessageType.RoundScore, msg);
  937. SendMsg(node, MessageType.CommandMatchSuccess, new WeCmdMatchSuccessDto(behavior.Id, behavior.NodePath, $"{word}|{n.Word}", behavior.BehaviorScoreType).Obj2StringCamelCase());
  938. return true;
  939. }
  940. /// <summary>
  941. /// 下一节点
  942. /// </summary>
  943. /// <param name="node"></param>
  944. private void NextNode(NodeBase node)
  945. {
  946. switch (node.NodeType)
  947. {
  948. case NodeType.ScenePackage:
  949. {
  950. SendMsg(node, MessageType.End, $"训练营[{node.CurPackageInfo.RunningId}]结束");
  951. break;
  952. }
  953. case NodeType.SceneRound:
  954. {
  955. typeof(EvolutionRunner).LogDebug($"---[下一轮次]--->[GroupNo:{node.CurPackageInfo.RunningId},本节点Path:{node.NodePath}]");
  956. if (node.CurPackageInfo.AutoNextRound)
  957. {
  958. SelectChildRun(node.CurPackageInfo);
  959. }
  960. break;
  961. }
  962. case NodeType.FlowNode:
  963. {
  964. var n = ((FlowNode)node);
  965. if (n.HasChild && n.Children.Count > 0)
  966. {
  967. typeof(EvolutionRunner).LogDebug($"---[下一流节点]--->[GroupNo:{n.CurPackageInfo.RunningId},本节点Path:{n.NodePath}]");
  968. SelectChildRun(n.SelfFlow);
  969. }
  970. }
  971. break;
  972. }
  973. }
  974. /// <summary>
  975. /// 下一轮次
  976. /// </summary>
  977. /// <param name="node"></param>
  978. /// <returns></returns>
  979. private bool NextRound(NodeBase node)
  980. {
  981. if (node.CurPackageInfo.CurRoundInfo.NodeState == NodeState.Complete)
  982. {
  983. SelectChildRun(node.CurPackageInfo);
  984. }
  985. else
  986. {
  987. NextFlowNodes(node);
  988. NextRound(node);
  989. }
  990. //var child = node.CurPackageInfo.CurRoundInfo;
  991. //if (child.NodeState == NodeState.Running)
  992. //{
  993. // child.NodeState = NodeState.RunEnd;
  994. // //child.NodeState = NodeState.Complete;
  995. // return true;
  996. //}
  997. //if (child.NodeState == NodeState.RunEnd)
  998. //{
  999. // child.NodeState = NodeState.Complete;
  1000. // return true;
  1001. //}
  1002. return true;
  1003. }
  1004. /// <summary>
  1005. /// 下一情景流
  1006. /// </summary>
  1007. /// <param name="node"></param>
  1008. /// <returns></returns>
  1009. public bool NextFlowNode(NodeBase node)
  1010. {
  1011. FlowNode flowNode = null;
  1012. if (node.NodeType == NodeType.SceneFlow)
  1013. {
  1014. flowNode = ((SceneFlowNode)node).RunningNode;
  1015. //flowNode.NodeState = NodeState.Running;
  1016. }
  1017. else if (node.NodeType == NodeType.FlowNode)
  1018. {
  1019. flowNode = (FlowNode)node;
  1020. }
  1021. if (flowNode != null && flowNode.NodeState != NodeState.New)
  1022. {
  1023. if (flowNode.NodeState == NodeState.Running)
  1024. {
  1025. typeof(EvolutionRunner).LogDebug($"---[节点准备结束]--->[GroupNo:{flowNode.CurPackageInfo.RunningId},Path:{flowNode.NodePath}]");
  1026. flowNode.NodeState = NodeState.RunEnd;
  1027. //flowNode.NodeState = NodeState.Complete;
  1028. }
  1029. else if (flowNode.NodeState == NodeState.RunEnd)
  1030. {
  1031. typeof(EvolutionRunner).LogDebug($"---[节点准备完成]--->[GroupNo:{flowNode.CurPackageInfo.RunningId},Path:{flowNode.NodePath}]");
  1032. flowNode.NodeState = NodeState.Complete;
  1033. }
  1034. else
  1035. {
  1036. return false;
  1037. }
  1038. return true;
  1039. }
  1040. return false;
  1041. }
  1042. /// <summary>
  1043. /// 下一情景流(当前运行的所有情景流)
  1044. /// </summary>
  1045. /// <param name="node"></param>
  1046. /// <returns></returns>
  1047. private bool NextFlowNodes(NodeBase node)
  1048. {
  1049. if (node.CurPackageInfo != null)
  1050. {
  1051. if (node.CurPackageInfo.CurFlowNodes.Any())
  1052. {
  1053. EndNode(node.CurPackageInfo.CurFlowNodes.Where(a => a != null).Select(a => (NodeBase)a).ToList(), "流节点");
  1054. //foreach (var child in node.CurPackageInfo.CurFlowNodes)
  1055. //{
  1056. // if (child.NodeState == NodeState.New)
  1057. // {
  1058. // continue;
  1059. // }
  1060. // if (child.NodeState == NodeState.Running)
  1061. // {
  1062. // typeof(EvolutionRunner).LogDebug($"---[流节点准备结束]--->[GroupNo:{child.CurPackageInfo.RunningId},Path:{child.NodePath}]");
  1063. // child.NodeState = NodeState.RunEnd;
  1064. // //child.NodeState = NodeState.Complete;
  1065. // }
  1066. // else if (child.NodeState == NodeState.RunEnd)
  1067. // {
  1068. // typeof(EvolutionRunner).LogDebug($"---[流节点准备完成]--->[GroupNo:{child.CurPackageInfo.RunningId},Path:{child.NodePath}]");
  1069. // child.NodeState = NodeState.Complete;
  1070. // }
  1071. //}
  1072. return true;
  1073. }
  1074. if (node.CurPackageInfo.CurFlowInfos.Any())
  1075. {
  1076. EndNode(node.CurPackageInfo.CurFlowInfos.Select(a => (NodeBase)a).ToList(), "情景流准备结束");
  1077. return true;
  1078. }
  1079. if (node.CurPackageInfo.CurBlockInfos.Any())
  1080. {
  1081. EndNode(node.CurPackageInfo.CurBlockInfos.Select(a => (NodeBase)a).ToList(), "情景快准备结束");
  1082. return true;
  1083. }
  1084. var round = node.CurPackageInfo.CurRoundInfo;
  1085. if (round.NodeState == NodeState.Running)
  1086. {
  1087. typeof(EvolutionRunner).LogDebug($"---[轮次准备结束]--->[GroupNo:{round.CurPackageInfo.RunningId},Path:{round.NodePath}]");
  1088. round.NodeState = NodeState.RunEnd;
  1089. //child.NodeState = NodeState.Complete;
  1090. }
  1091. else if (round.NodeState == NodeState.RunEnd)
  1092. {
  1093. typeof(EvolutionRunner).LogDebug($"---[轮次准备完成]--->[GroupNo:{round.CurPackageInfo.RunningId},Path:{round.NodePath}]");
  1094. round.NodeState = NodeState.Complete;
  1095. }
  1096. if (node.CurPackageInfo.AutoNextRound)
  1097. {
  1098. NextRound(node.CurPackageInfo.CurRoundInfo);
  1099. }
  1100. return true;
  1101. }
  1102. return false;
  1103. }
  1104. /// <summary>
  1105. /// 结束节点
  1106. /// </summary>
  1107. /// <param name="nodes"></param>
  1108. /// <param name="str"></param>
  1109. private void EndNode(List<NodeBase> nodes, string str)
  1110. {
  1111. foreach (var child in nodes)
  1112. {
  1113. if (child == null)
  1114. {
  1115. continue;
  1116. }
  1117. if (child.NodeState == NodeState.New)
  1118. {
  1119. continue;
  1120. }
  1121. if (child.NodeState == NodeState.Running)
  1122. {
  1123. typeof(EvolutionRunner).LogDebug($"---[{str}准备结束]--->[GroupNo:{child.CurPackageInfo.RunningId},Path:{child.NodePath}]");
  1124. child.NodeState = NodeState.RunEnd;
  1125. //child.NodeState = NodeState.Complete;
  1126. }
  1127. else if (child.NodeState == NodeState.RunEnd)
  1128. {
  1129. typeof(EvolutionRunner).LogDebug($"---[{str}准备完成]--->[GroupNo:{child.CurPackageInfo.RunningId},Path:{child.NodePath}]");
  1130. child.NodeState = NodeState.Complete;
  1131. }
  1132. }
  1133. }
  1134. /// <summary>
  1135. /// 发送消息
  1136. /// </summary>
  1137. /// <param name="node"></param>
  1138. /// <param name="type"></param>
  1139. /// <param name="msg"></param>
  1140. /// <returns></returns>
  1141. private void SendMsg(NodeBase node, MessageType type, string msg)
  1142. {
  1143. var weMsg = new WeMessage(type, node.CurPackageInfo.RunningId, node.CurPackageInfo.TargetClientId, msg);
  1144. node.CurPackageInfo.MessageSender?.SendMsg(weMsg);
  1145. }
  1146. }
  1147. }