XHRescueMission.cs 5.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163
  1. using KYFramework;
  2. using MongoDB.Bson;
  3. using SimulationServer.Utils;
  4. namespace SimulationServer;
  5. public class XHRescueMission : Entity
  6. {
  7. public string MissionId; // 任务ID
  8. public bool Success; // 任务是否成功
  9. // 火场点
  10. public FireGround FireGround;
  11. public double tn;
  12. public List<AircraftXH> AircraftXHs = new List<AircraftXH>();
  13. public bool IsRunning;
  14. public Action End;
  15. public double SimulationTime;
  16. public int ExcuteCount = 0;
  17. public int FailureTimes = 0;
  18. // 巡护的 单机能力
  19. // <机型,<sheet,<指标名,值列表>>>
  20. public Dictionary<string,Dictionary<string,Dictionary<string,List<string>>>> singleReport = new ();
  21. // 灭火的 整体能力
  22. public Dictionary<string, Dictionary<string, List<string>>> totalXhReport = new ();
  23. public Dictionary<string, Dictionary<string, List<string>>> equipReport = new ();
  24. public void Reset()
  25. {
  26. }
  27. public void Start()
  28. {
  29. IsRunning = true;
  30. Log.Info($"{MissionId} 任务开始!");
  31. AircraftXHs.ForEach(a => a.Start());
  32. }
  33. public void EndMission()
  34. {
  35. IsRunning = false;
  36. Log.Info($"{MissionId} 任务结束!");
  37. // 灭火完成 任务结束
  38. End?.Invoke();
  39. SaveXH();
  40. ReportXH();
  41. var readyTime = AircraftXHs.First().TaskReadyTime;
  42. Task.Delay(TimeSpan.FromSeconds(readyTime)).ContinueWith(t => this.StartAsyncXH());
  43. }
  44. public void SaveXH()
  45. {
  46. foreach (AircraftXH aircraftXh in AircraftXHs)
  47. {
  48. var staticCapacity = aircraftXh.GetComponent<XHStaticCapacityComponent>();
  49. var economical = aircraftXh.GetComponent<XHEconomicalComponent>();
  50. staticCapacity.FillData(aircraftXh.Db);
  51. economical.FillData(aircraftXh.Db);
  52. if (!singleReport.ContainsKey(aircraftXh.AircraftId))
  53. {
  54. singleReport[aircraftXh.AircraftId] = new Dictionary<string, Dictionary<string, List<string>>>();
  55. }
  56. // 1次的报告
  57. Dictionary<string, Dictionary<string, string>> staticReport = staticCapacity.GetReport();
  58. foreach (var kv in staticReport)
  59. {
  60. if(!singleReport[aircraftXh.AircraftId].ContainsKey(kv.Key)) singleReport[aircraftXh.AircraftId][kv.Key] = new Dictionary<string, List<string>>();
  61. foreach (var kv2 in kv.Value)
  62. {
  63. if (!singleReport[aircraftXh.AircraftId][kv.Key].ContainsKey(kv2.Key)) singleReport[aircraftXh.AircraftId][kv.Key][kv2.Key] = new List<string>();
  64. singleReport[aircraftXh.AircraftId][kv.Key][kv2.Key].Add(kv2.Value);
  65. }
  66. }
  67. Dictionary<string, Dictionary<string, string>> economicalReport = economical.GetReport();
  68. foreach (var kv in economicalReport)
  69. {
  70. if(!singleReport[aircraftXh.AircraftId].ContainsKey(kv.Key)) singleReport[aircraftXh.AircraftId][kv.Key] = new Dictionary<string, List<string>>();
  71. foreach (var kv2 in kv.Value)
  72. {
  73. if (!singleReport[aircraftXh.AircraftId][kv.Key].ContainsKey(kv2.Key)) singleReport[aircraftXh.AircraftId][kv.Key][kv2.Key] = new List<string>();
  74. singleReport[aircraftXh.AircraftId][kv.Key][kv2.Key].Add(kv2.Value);
  75. }
  76. }
  77. }
  78. var totalPerformance = GetComponent<XHTotalTaskPerformanceComponent>();
  79. totalPerformance.FillData();
  80. var totalPerformanceReport = totalPerformance.GetReport();
  81. foreach (var kv in totalPerformanceReport)
  82. {
  83. if(!totalXhReport.ContainsKey(kv.Key)) totalXhReport[kv.Key] = new Dictionary<string, List<string>>();
  84. foreach (var kv2 in kv.Value)
  85. {
  86. if (!totalXhReport[kv.Key].ContainsKey(kv2.Key)) totalXhReport[kv.Key][kv2.Key] = new List<string>();
  87. totalXhReport[kv.Key][kv2.Key].Add(kv2.Value);
  88. }
  89. }
  90. var TotalEquipment = GetComponent<EquipmentComponent>();
  91. TotalEquipment.FillData();
  92. var totalEquipmentReport = TotalEquipment.GetReport();
  93. foreach (var kv in totalEquipmentReport)
  94. {
  95. if(!equipReport.ContainsKey(kv.Key)) equipReport[kv.Key] = new Dictionary<string, List<string>>();
  96. foreach (var kv2 in kv.Value)
  97. {
  98. if (!equipReport[kv.Key].ContainsKey(kv2.Key)) equipReport[kv.Key][kv2.Key] = new List<string>();
  99. equipReport[kv.Key][kv2.Key].Add(kv2.Value);
  100. }
  101. }
  102. }
  103. public void ReportXH()
  104. {
  105. string data = DateTime.Now.ToString("yyyy-MM-dd");
  106. string path = $"Reports/XH/{data}/{MissionId}";
  107. if(!Directory.Exists(path)) Directory.CreateDirectory(path);
  108. foreach (var kv in singleReport)
  109. {
  110. string filePath = $"{path}/{kv.Key}巡护任务单机指标报告.xls";
  111. DataTableExtensions.SaveToExcel(filePath, kv.Value);
  112. }
  113. string totalPath = $"{path}/{"巡护任务总体指标报告"}.xls";
  114. DataTableExtensions.SaveToExcel(totalPath, totalXhReport);
  115. string equicPath = $"{path}/{"装备体系评估报告"}.xls";
  116. DataTableExtensions.SaveToExcel(equicPath, equipReport);
  117. }
  118. }
  119. [ObjectSystem]
  120. public class XHRescueMissionUpdateSystem : UpdateSystem<XHRescueMission>
  121. {
  122. public override void Update(XHRescueMission self)
  123. {
  124. if(!self.IsRunning) return;
  125. foreach (var aircraftXh in self.AircraftXHs)
  126. {
  127. if(aircraftXh.isOver)
  128. {
  129. self.EndMission();
  130. self.IsRunning = false;
  131. }
  132. }
  133. }
  134. }