SHJMission.cs 6.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187
  1. using KYFramework;
  2. using NPOI.SS.Formula.PTG;
  3. using SimulationServer.Utils;
  4. namespace SimulationServer;
  5. public class SHJMission : Entity
  6. {
  7. public string MissionId; // 任务ID
  8. public bool Success; // 任务是否成功
  9. public List<AircraftSHJ> aircrafts = new List<AircraftSHJ>();
  10. public bool IsRunning;
  11. public double SimulationTime;
  12. public Dictionary<string, Dictionary<string, Dictionary<string, List<string>>>> singleReport = new();
  13. public Dictionary<string, Dictionary<string, List<string>>> aircraftSJDatas = new();
  14. public bool IsOver = false;
  15. private int currentExecuteCount = 1;
  16. public int ExecutionContext = 0;
  17. public string date;
  18. public void Start()
  19. {
  20. IsRunning = true;
  21. aircrafts.ForEach(a => a.Start());
  22. Log.Info($"{MissionId} 任务开始!");
  23. }
  24. public void Reset()
  25. {
  26. SimulationTime = 0;
  27. aircrafts?.ForEach(a => a.Reset());
  28. }
  29. public void EndMission()
  30. {
  31. IsRunning = false;
  32. Log.Info($"{MissionId} 任务结束!");
  33. if (currentExecuteCount > ExecutionContext)
  34. {
  35. return;
  36. }
  37. if (currentExecuteCount < ExecutionContext)
  38. {
  39. SaveSJ();
  40. SaveAircraftSJDatas();
  41. }
  42. if (currentExecuteCount == ExecutionContext)
  43. {
  44. SaveSJ();
  45. SaveAircraftSJDatas();
  46. ReportSJ();
  47. IsOver = true;
  48. return;
  49. }
  50. this.Reset();
  51. this.Start();
  52. currentExecuteCount++;
  53. }
  54. public void SaveAircraftSJDatas()
  55. {
  56. foreach (AircraftSHJ aircraftEntity in aircrafts)
  57. {
  58. string key = aircraftEntity.AircraftId;
  59. if (!aircraftSJDatas.ContainsKey(key))
  60. {
  61. aircraftSJDatas[key] = new Dictionary<string, List<string>>();
  62. }
  63. if (!aircraftSJDatas[key].ContainsKey("识别成功率"))
  64. aircraftSJDatas[key]["识别成功率"] = new List<string>();
  65. aircraftSJDatas[key]["识别成功率"].Add("0");
  66. if (!aircraftSJDatas[key].ContainsKey("识别数量"))
  67. aircraftSJDatas[key]["识别数量"] = new List<string>();
  68. aircraftSJDatas[key]["识别数量"].Add("0");
  69. if (!aircraftSJDatas[key].ContainsKey("人员数量"))
  70. aircraftSJDatas[key]["人员数量"] = new List<string>();
  71. aircraftSJDatas[key]["人员数量"].Add("0");
  72. if (!aircraftSJDatas[key].ContainsKey("任务准备时间"))
  73. aircraftSJDatas[key]["任务准备时间"] = new List<string>();
  74. aircraftSJDatas[key]["任务准备时间"].Add(aircraftEntity.TaskReadyTime.ToString());
  75. if (!aircraftSJDatas[key].ContainsKey("平均搜索时间"))
  76. aircraftSJDatas[key]["平均搜索时间"] = new List<string>();
  77. aircraftSJDatas[key]["平均搜索时间"].Add("0");
  78. if (!aircraftSJDatas[key].ContainsKey("平均救助时间"))
  79. aircraftSJDatas[key]["平均救助时间"] = new List<string>();
  80. aircraftSJDatas[key]["平均救助时间"].Add("0");
  81. if (!aircraftSJDatas[key].ContainsKey("总飞行时间"))
  82. aircraftSJDatas[key]["总飞行时间"] = new List<string>();
  83. aircraftSJDatas[key]["总飞行时间"].Add(aircraftEntity.TotalTime.ToString());
  84. if (!aircraftSJDatas[key].ContainsKey("人员存活率"))
  85. aircraftSJDatas[key]["人员存活率"] = new List<string>();
  86. aircraftSJDatas[key]["人员存活率"].Add("0");
  87. }
  88. }
  89. public void SaveSJ()
  90. {
  91. foreach (AircraftSHJ aircraftEntity in aircrafts)
  92. {
  93. var staticCapacity = aircraftEntity.GetComponent<SJStaticCapacityComponent>();
  94. if (staticCapacity == null) continue;
  95. staticCapacity.FillData6(aircraftEntity.Db);
  96. string key = aircraftEntity.AircraftId;
  97. if (!singleReport.ContainsKey(key))
  98. {
  99. singleReport[key] = new Dictionary<string, Dictionary<string, List<string>>>();
  100. }
  101. Dictionary<string, Dictionary<string, string>> staticReport = staticCapacity.GetReport6();
  102. foreach (var kv in staticReport)
  103. {
  104. if (!singleReport[key].ContainsKey(kv.Key)) singleReport[key][kv.Key] = new Dictionary<string, List<string>>();
  105. foreach (var kv2 in kv.Value)
  106. {
  107. if (!singleReport[key][kv.Key].ContainsKey(kv2.Key)) singleReport[key][kv.Key][kv2.Key] = new List<string>();
  108. singleReport[key][kv.Key][kv2.Key].Add(kv2.Value);
  109. }
  110. }
  111. }
  112. if (currentExecuteCount == ExecutionContext)
  113. {
  114. foreach (var kv in singleReport)
  115. {
  116. foreach (var kv2 in kv.Value)
  117. {
  118. foreach (var kv3 in kv2.Value)
  119. {
  120. var sum = 0f;
  121. foreach (var kv4 in kv3.Value)
  122. {
  123. bool isfloat = float.TryParse(kv4, out float f);
  124. if (isfloat)
  125. sum += float.Parse(kv4);
  126. else
  127. sum = -1f;
  128. }
  129. if (sum != -1f)
  130. kv3.Value.Add((sum / kv3.Value.Count).ToString());
  131. else
  132. kv3.Value.Add("");
  133. }
  134. }
  135. }
  136. }
  137. }
  138. public void ReportSJ()
  139. {
  140. string path = $"Reports/{date}/{MissionId}";
  141. if (!Directory.Exists(path)) Directory.CreateDirectory(path);
  142. foreach (var kv in singleReport)
  143. {
  144. string filePath = $"{path}/{kv.Key}搜救任务单机指标报告.xls";
  145. DataTableExtensions.SaveToExcel(filePath, kv.Value, true);
  146. }
  147. }
  148. }
  149. [ObjectSystem]
  150. public class SHJMissionUpdateSystem : UpdateSystem<SHJMission>
  151. {
  152. public override void Update(SHJMission self)
  153. {
  154. if (!self.IsRunning) return;
  155. self.aircrafts?.ForEach(a => a.Update(self.SimulationTime));
  156. if (self.aircrafts.All(a => a.IsOver))
  157. {
  158. self.EndMission();
  159. }
  160. }
  161. }