EngineRunAppService.cs 13 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398
  1. using System;
  2. using System.Collections;
  3. using System.Diagnostics;
  4. using System.Dynamic;
  5. using System.Linq;
  6. using Abp.Runtime.Caching;
  7. using IwbZero.AppServiceBase;
  8. using IwbZero.IwbBase;
  9. using IwbZero.ToolCommon.LogHelpers;
  10. using IwbZero.ToolCommon.StringModel;
  11. using WeEngine.CommonDto;
  12. using WeEngine.Enum;
  13. using WeEngine.Packages;
  14. namespace WeEngine.Application.RunEngine
  15. {
  16. /// <summary>
  17. /// 演练实施
  18. /// </summary>
  19. public class EngineRunAppService : IwbZeroAppServiceBase, IEngineRunAppService
  20. {
  21. public EngineRunAppService(ICacheManager cacheManager, PackageRunner packageRunner)
  22. {
  23. PackageRunner = packageRunner;
  24. CacheManager = cacheManager;
  25. }
  26. public PackageRunner PackageRunner { get; }
  27. /// <summary>
  28. /// 开启训练营
  29. /// </summary>
  30. /// <param name="input"></param>
  31. /// <returns></returns>
  32. public void Start(RunStartPackageDto input)
  33. {
  34. try
  35. {
  36. this.LogDebug($"---[开启训练营]---> Data:[{input.Obj2String()}]");
  37. if (input.PackageId.IsEmpty())
  38. {
  39. CheckErrors("方案包编号不能为空!");
  40. return;
  41. }
  42. var s = Stopwatch.StartNew();
  43. PackageNode info = GetPackageNode(input.PackageId);
  44. s.Stop();
  45. Debug.WriteLine($" ===>{s.Elapsed.TotalSeconds}s ===>{s.Elapsed.TotalMilliseconds}ms");
  46. if (input.GroupNos != null && input.GroupNos.Any())
  47. {
  48. foreach (var groupNo in input.GroupNos)
  49. {
  50. s.Restart();
  51. var package = (PackageNode)info.Clone();
  52. s.Stop();
  53. Debug.WriteLine($" ===>{s.Elapsed.TotalSeconds}s ===>{s.Elapsed.TotalMilliseconds}ms");
  54. package.RunningId = groupNo;
  55. package.AssessRoles = input.AssessRoles ?? package.AssessRoles;
  56. package.AssessAuto = input.AssessAuto;
  57. package.AutoNextRound = input.AutoNextRound;
  58. package.RoundScore = input.RoundScore == 0 ? package.RoundScore : input.RoundScore;
  59. package.TargetClientId = input.TargetClientId;
  60. if (input.Variable.IsNotEmpty())
  61. {
  62. Hashtable variables = new Hashtable();
  63. var arr = input.Variable.Split(',');
  64. foreach (var v in arr)
  65. {
  66. var variable = IwbRtVariable.Str2Variable(v);
  67. if (!variables.ContainsKey(variable.VarName))
  68. {
  69. variables.Add(variable.VarName, variable);
  70. }
  71. }
  72. package.Variables = variables.MergeHashtable(package.Variables);
  73. }
  74. PackageRunner.Run(package, OperationType.Start);
  75. }
  76. }
  77. }
  78. catch (Exception e)
  79. {
  80. this.LogError(e);
  81. CheckErrors("启动失败!");
  82. }
  83. }
  84. /// <summary>
  85. /// 重新启动培训营
  86. /// </summary>
  87. public void ReStart(ReStartPackageDto input)
  88. {
  89. try
  90. {
  91. this.LogDebug($"---[重启训练营]---> ");
  92. var dataNode = input.RunningInfo.Str2Obj<PackageDataNode>();
  93. this.LogDebug($"=========> Data [{dataNode?.Id}] [{dataNode?.PackageNo}]");
  94. if (dataNode != null)
  95. {
  96. var packageId = dataNode.PackageNo.IsEmpty() ? input.PackageId : dataNode.PackageNo;
  97. var package = GetPackageNode(packageId);
  98. if (package != null)
  99. {
  100. package.TargetClientId = input.TargetClientId;
  101. package.AutoNextRound = input.AutoNextRound;
  102. package.PackageNodeFrom(dataNode);
  103. PackageRunner.ReRun(package);
  104. }
  105. }
  106. }
  107. catch (Exception e)
  108. {
  109. this.LogError(e);
  110. CheckErrors("重启失败!");
  111. }
  112. }
  113. private PackageNode GetPackageNode(string no)
  114. {
  115. PackageNode info = null;
  116. try
  117. {
  118. var xmlNode = CacheManager.GetPackageXml(no);
  119. if (xmlNode == null)
  120. {
  121. CheckErrors("方案包信息获取失败!");
  122. }
  123. info = (PackageNode)new PackageNode().BuildNodeByXmlNode(xmlNode);
  124. }
  125. catch (Exception e)
  126. {
  127. CheckErrors($"方案包信息解析失败[{e.Message}]");
  128. }
  129. return info;
  130. }
  131. /// <summary>
  132. /// 下一轮次(所有组)
  133. /// </summary>
  134. /// <param name="input"></param>
  135. /// <returns></returns>
  136. public void NextRounds(RunGroupPackageDto input)
  137. {
  138. this.LogDebug($"---[进入下一轮次]---> Data:[{input.Obj2String()}]");
  139. if (input.GroupNos != null && input.GroupNos.Any())
  140. {
  141. foreach (var groupNo in input.GroupNos)
  142. {
  143. var package = GetPackageByRunId(groupNo);
  144. try
  145. {
  146. PackageRunner.Run(package, OperationType.NextRound);
  147. }
  148. catch (Exception e)
  149. {
  150. this.LogError(e);
  151. CheckErrors("操作失败!");
  152. }
  153. }
  154. }
  155. }
  156. /// <summary>
  157. /// 下一轮次
  158. /// </summary>
  159. /// <param name="groupNo"></param>
  160. /// <returns></returns>
  161. public void NextRound(string groupNo)
  162. {
  163. this.LogDebug($"---[进入下一轮次]--->Data:[groupNo:{groupNo}]");
  164. var package = GetPackageByRunId(groupNo);
  165. try
  166. {
  167. PackageRunner.Run(package, OperationType.NextRound);
  168. }
  169. catch (Exception e)
  170. {
  171. this.LogError(e);
  172. CheckErrors("操作失败!");
  173. }
  174. }
  175. /// <summary>
  176. /// 下一情景流节点(所有组)
  177. /// </summary>
  178. /// <param name="input"></param>
  179. /// <returns></returns>
  180. public void NextAllFlowNodes(RunStartPackageDto input)
  181. {
  182. this.LogDebug($"---[下一情景流节点]---> Data:[{input.Obj2String()}]");
  183. if (input.GroupNos != null && input.GroupNos.Any())
  184. {
  185. foreach (var groupNo in input.GroupNos)
  186. {
  187. var package = GetPackageByRunId(groupNo);
  188. try
  189. {
  190. PackageRunner.Run(package, OperationType.NextFlowNodes);
  191. }
  192. catch (Exception e)
  193. {
  194. this.LogError(e);
  195. CheckErrors("操作失败!");
  196. }
  197. }
  198. }
  199. }
  200. /// <summary>
  201. /// 下一情景流节点
  202. /// </summary>
  203. /// <param name="groupNo"></param>
  204. /// <returns></returns>
  205. public void NextGroupFlowNodes(string groupNo)
  206. {
  207. this.LogDebug($"---[进入下一情景流节点]---> Data:[groupNo:{groupNo}]");
  208. var package = GetPackageByRunId(groupNo);
  209. try
  210. {
  211. PackageRunner.Run(package, OperationType.NextFlowNodes);
  212. }
  213. catch (Exception e)
  214. {
  215. this.LogError(e);
  216. CheckErrors("操作失败!");
  217. }
  218. }
  219. /// <summary>
  220. /// 下一情景流节点
  221. /// </summary>
  222. /// <param name="groupNo">分组编号</param>
  223. /// <param name="flowId">情景流流ID</param>
  224. /// <returns></returns>
  225. public void NextFlowNode(string groupNo, string flowId)
  226. {
  227. this.LogDebug($"---[进入下一情景流节点]---> Data:[groupNo:{groupNo},f:{flowId}]");
  228. var package = GetPackageByRunId(groupNo);
  229. try
  230. {
  231. dynamic obj = new ExpandoObject();
  232. obj.FlowId = flowId;
  233. package.ExtendData = obj;
  234. PackageRunner.Run(package, OperationType.NextFlowNode);
  235. }
  236. catch (Exception e)
  237. {
  238. this.LogError(e);
  239. CheckErrors("操作失败!");
  240. }
  241. }
  242. /// <summary>
  243. /// 匹配关键字
  244. /// </summary>
  245. /// <param name="groupNo"></param>
  246. /// <param name="behaviorWord"></param>
  247. /// <param name="behaviorRole"></param>
  248. /// <param name="scenePath"></param>
  249. /// <param name="checkRole"></param>
  250. public void MatchWord(string groupNo, string behaviorWord, string behaviorRole, string scenePath,
  251. bool checkRole)
  252. {
  253. this.LogDebug($"---[匹配关键字]---> Data:[groupNo:{groupNo},w:{behaviorWord},r:{behaviorRole},s:{scenePath}]");
  254. var package = GetPackageByRunId(groupNo);
  255. try
  256. {
  257. dynamic obj = new ExpandoObject();
  258. obj.BehaviorWord = behaviorWord;
  259. obj.BehaviorRole = behaviorRole;
  260. obj.ScenePath = scenePath;
  261. obj.CheckRole = checkRole;
  262. package.ExtendData = obj;
  263. PackageRunner.Run(package, OperationType.MatchKey);
  264. }
  265. catch (Exception e)
  266. {
  267. this.LogError(e);
  268. CheckErrors("操作失败!");
  269. }
  270. }
  271. /// <summary>
  272. /// 匹配关键字
  273. /// </summary>
  274. /// <param name="input"></param>
  275. public void MatchWord(RunOperationDto input)
  276. {
  277. this.LogDebug($"---[匹配关键字]---> Data:[{input.Obj2String()}]");
  278. var package = GetPackageByRunId(input.GroupNo);
  279. try
  280. {
  281. dynamic obj = new ExpandoObject();
  282. obj.BehaviorWord = input.BehaviorWord;
  283. obj.BehaviorRole = input.BehaviorRole;
  284. obj.ScenePath = input.ScenePath;
  285. obj.CheckRole = input.CheckRole;
  286. package.ExtendData = obj;
  287. var ss = package.NotMatchKeywords;
  288. PackageRunner.Run(package, OperationType.MatchKey);
  289. this.LogDebug($"---[匹配 =======> 结束]");
  290. }
  291. catch (Exception e)
  292. {
  293. this.LogError(e);
  294. this.LogDebug($"---[匹配 =======> ========> 错误]");
  295. CheckErrors("操作失败!");
  296. }
  297. }
  298. /// <summary>
  299. /// 查询运行信息
  300. /// </summary>
  301. /// <param name="id"></param>
  302. /// <returns></returns>
  303. public PackageDataNode QueryPackageDataNode(string id)
  304. {
  305. try
  306. {
  307. var package = GetPackageByRunId(id);
  308. return package.CurPackageInfo.Convert2DataNode();
  309. }
  310. catch (Exception e)
  311. {
  312. this.LogError(e);
  313. }
  314. return null;
  315. }
  316. /// <summary>
  317. /// 查询运行信息
  318. /// </summary>
  319. /// <param name="id"></param>
  320. /// <param name="path"></param>
  321. /// <returns></returns>
  322. public DataNodeBase QueryPackageDataNodeWithPath(string id, string path = "")
  323. {
  324. try
  325. {
  326. var package = GetPackageByRunId(id);
  327. var node = path.IsEmpty() ? package.CurPackageInfo : package.CurPackageInfo.GetNodeByPath(path);
  328. if (node != null)
  329. {
  330. return node.ConvertToDataNode();
  331. }
  332. }
  333. catch (Exception e)
  334. {
  335. this.LogError(e);
  336. }
  337. return null;
  338. }
  339. /// <summary>
  340. /// 矫正评分
  341. /// </summary>
  342. /// <param name="groupNo"></param>
  343. /// <param name="score"></param>
  344. public void CorrectScore(string groupNo, decimal score)
  345. {
  346. this.LogDebug($"---[矫正评分]---> Data:[groupNo:{groupNo},score:{score}]");
  347. var package = GetPackageByRunId(groupNo);
  348. package.CurRoundInfo.CorrectionScore = score;
  349. }
  350. private PackageNode GetPackageByRunId(string runId)
  351. {
  352. PackageNode package = null;
  353. try
  354. {
  355. package = (PackageNode)CacheManager.GetCache(EngineCacheName.RunningPackage).GetOrDefault(runId);
  356. }
  357. catch (Exception e)
  358. {
  359. this.LogError(e);
  360. }
  361. if (package == null)
  362. {
  363. CheckErrors("未查询到正在演练的培训营!");
  364. }
  365. return package;
  366. }
  367. /// <summary>
  368. /// 非演化情景控制
  369. /// </summary>
  370. public void NeControl(string groupNo, string ocType)
  371. {
  372. }
  373. }
  374. }