Browse Source

修改总体指标报告生成方式

liyang 6 months ago
parent
commit
42ef1dfc52

+ 136 - 23
SimulationServer/Component/TaskComponent.cs

@@ -1,4 +1,5 @@
 using KYFramework;
+using Model;
 using OpenQA.Selenium.Remote;
 using SimulationServer.Utils;
 
@@ -40,6 +41,8 @@ public class TaskComponent : Component
 
     public string date;
 
+    public int missionCount;
+
     public void Start()
     {
         MHRescueMissions?.ForEach(r => r.Reset());
@@ -48,6 +51,7 @@ public class TaskComponent : Component
         MHRescueMissions?.ForEach(r => r.Start());
         XHRescueMissions?.ForEach(r => r.Start());
         ZCRescueMissions?.ForEach(r => r.Start());
+
         SeaSJRescueMissions?.ForEach(r => r.Start());
         LandSJRescueMissions?.ForEach(r => r.Start());
         KZDYMissions?.ForEach(r => r.Start());
@@ -207,43 +211,152 @@ public class TaskComponentAwakeSystem : AwakeSystem<TaskComponent>
 [ObjectSystem]
 public class TaskComponentUpdateSystem : UpdateSystem<TaskComponent>
 {
+    double 任务准备时间 = 0;
+    double 平均搜索时间 = 0;
+    double 总飞行时间 = 0;
+    double 人员存活率 = 0;
+    double 任务是否成功 = 0;
+    float 识别成功率 = 0f;
+    double 平均救助时间 = 0;
+    float 人员数量 = 0;
+    double aircreftCount = 0;
+
+    public bool isSeaSJRescueMissionsOver = false;
+    public bool isLandSJRescueMissionsOver = false;
+    public bool isKZDYMissionsOver = false;
+
+    public bool isReport;
+
     public override void Update(TaskComponent self)
     {
         if (self.SeaSJRescueMissions.Count > 0)
         {
-            if (self.SeaSJRescueMissions.All(m => m.IsOver))
+            if (self.SeaSJRescueMissions.All(m => m.IsOver) && !isSeaSJRescueMissionsOver)
             {
-                for (int i = 0; i < self.ExecutionContext; i++)
-                {
-                    self.SSJAllTotalTaskPerformance.FillData(self.SeaSJRescueMissions);
-                    var report = self.SSJAllTotalTaskPerformance.GetReport();
-                    if (report["总任务表现"]["任务是否成功"] == "1")
-                        self.seaSuccessCount++;
-                    self.SaveSeaSJ(report);
-                }
-                //self.SaveTotalMHSea();
-                self.ReportAllSJSea();
-                self.SeaSJRescueMissions.Clear();
+                self.missionCount--;
+                isSeaSJRescueMissionsOver = true;
+                //for (int i = 0; i < self.ExecutionContext; i++)
+                //{
+                //    self.SSJAllTotalTaskPerformance.FillData(self.SeaSJRescueMissions);
+                //    var report = self.SSJAllTotalTaskPerformance.GetReport();
+                //    if (report["总任务表现"]["任务是否成功"] == "1")
+                //        self.seaSuccessCount++;
+                //    self.SaveSeaSJ(report);
+                //}
+                ////self.SaveTotalMHSea();
+                //self.ReportAllSJSea();
+                //self.SeaSJRescueMissions.Clear();
             }
-
         }
 
         if (self.LandSJRescueMissions.Count > 0)
         {
-            if (self.LandSJRescueMissions.All(m => m.IsOver))
+            if (self.LandSJRescueMissions.All(m => m.IsOver) && !isLandSJRescueMissionsOver)
+            {
+                self.missionCount--;
+                isLandSJRescueMissionsOver = true;
+                //for (int i = 0; i < self.ExecutionContext; i++)
+                //{
+                //    self.SSJAllTotalTaskPerformance.FillData1(self.LandSJRescueMissions);
+                //    var report = self.SSJAllTotalTaskPerformance.GetReport1();
+                //    if (report["总任务表现"]["任务是否成功"] == "1")
+                //        self.landSuccessCount++;
+                //    self.SaveLandSJ(report);
+                //}
+                ////self.SaveTotalMHLand();
+                //self.ReportAllSJLand();
+                //self.LandSJRescueMissions.Clear();
+            }
+        }
+
+        if (self.KZDYMissions.Count > 0)
+        {
+            if (self.KZDYMissions.All(m => m.IsOver) && !isKZDYMissionsOver)
+            {
+                self.missionCount--;
+                isKZDYMissionsOver = true;
+            }
+        }
+
+        if (self.missionCount == 0 && !isReport)
+        {
+            for (int i = 0; i < self.ExecutionContext; i++)
             {
-                for (int i = 0; i < self.ExecutionContext; i++)
+                任务准备时间 = 0;
+                平均搜索时间 = 0;
+                总飞行时间 = 0;
+                人员存活率 = 0;
+                任务是否成功 = 0;
+                识别成功率 = 0f;
+                平均救助时间 = 0;
+                人员数量 = 0;
+                double aircreftCount = 0;
+                foreach (var item in self.SeaSJRescueMissions)
                 {
-                    self.SSJAllTotalTaskPerformance.FillData1(self.LandSJRescueMissions);
-                    var report = self.SSJAllTotalTaskPerformance.GetReport1();
-                    if (report["总任务表现"]["任务是否成功"] == "1")
-                        self.landSuccessCount++;
-                    self.SaveLandSJ(report);
+                    foreach (var item1 in item.aircraftSJDatas)
+                    {
+                        识别成功率 += float.Parse(item1.Value["识别成功率"][i]);
+                        人员数量 += float.Parse(item1.Value["人员数量"][i]);
+                        if (任务准备时间 < float.Parse(item1.Value["任务准备时间"][i]))
+                            任务准备时间 = float.Parse(item1.Value["任务准备时间"][i]);
+                        平均搜索时间 += float.Parse(item1.Value["平均搜索时间"][i]);
+                        平均救助时间 += float.Parse(item1.Value["平均救助时间"][i]);
+                        Console.WriteLine("平均救助时间1:" + 平均救助时间);
+                        总飞行时间 += float.Parse(item1.Value["总飞行时间"][i]);
+                        人员存活率 += float.Parse(item1.Value["人员存活率"][i]);
+                        aircreftCount++;
+                    }
                 }
-                //self.SaveTotalMHLand();
-                self.ReportAllSJLand();
-                self.LandSJRescueMissions.Clear();
+
+                foreach (var item in self.KZDYMissions)
+                {
+                    foreach (var item1 in item.aircraftSJDatas)
+                    {
+                        识别成功率 += float.Parse(item1.Value["识别成功率"][i]);
+                        人员数量 += float.Parse(item1.Value["人员数量"][i]);
+                        if (任务准备时间 < float.Parse(item1.Value["任务准备时间"][i]))
+                            任务准备时间 = float.Parse(item1.Value["任务准备时间"][i]);
+                        平均搜索时间 += float.Parse(item1.Value["平均搜索时间"][i]);
+                        平均救助时间 += float.Parse(item1.Value["平均救助时间"][i]);
+                        Console.WriteLine("平均救助时间2:" + 平均救助时间);
+                        总飞行时间 += float.Parse(item1.Value["总飞行时间"][i]);
+                        人员存活率 += float.Parse(item1.Value["人员存活率"][i]);
+                        aircreftCount++;
+                    }
+                }
+
+                SJAllTotalTaskPerformance allTotalTaskPerformance = new SJAllTotalTaskPerformance();
+                if (人员存活率 != 0)
+                    任务是否成功 = 1;
+                allTotalTaskPerformance.识别成功率 = (识别成功率 / 人员数量).ToString();
+                allTotalTaskPerformance.任务准备时间 = 任务准备时间.ToString();
+                allTotalTaskPerformance.平均搜索时间 = (平均搜索时间 / aircreftCount).ToString("f4");
+                allTotalTaskPerformance.平均救助时间 = (平均救助时间 / aircreftCount).ToString("f4");
+                allTotalTaskPerformance.总飞行时间 = 总飞行时间.ToString("f4");
+                allTotalTaskPerformance.海情覆盖率 = "0.6".ToString();//"60%"
+                allTotalTaskPerformance.任务是否成功 = 任务是否成功.ToString();
+                allTotalTaskPerformance.人员存活率 = (人员存活率 / 人员数量).ToString();
+
+
+                Dictionary<string, Dictionary<string, string>> report = new Dictionary<string, Dictionary<string, string>>();
+                report["总任务表现"] = new Dictionary<string, string>
+                {
+                    { "识别成功率", allTotalTaskPerformance.识别成功率.ToString() },
+                    { "任务准备时间", allTotalTaskPerformance.任务准备时间.ToString() },
+                    { "平均搜索时间", allTotalTaskPerformance.平均搜索时间.ToString() },
+                    { "平均救助时间", allTotalTaskPerformance.平均救助时间.ToString() },
+                    { "总飞行时间", allTotalTaskPerformance.总飞行时间.ToString() },
+                    { "海情覆盖率", allTotalTaskPerformance.海情覆盖率.ToString() },
+                    { "任务是否成功", allTotalTaskPerformance.任务是否成功.ToString() },
+                    { "人员存活率", allTotalTaskPerformance.人员存活率.ToString() }
+                };
+
+                self.SaveSeaSJ(report);
             }
+            self.ReportAllSJSea();
+            isReport = true;
+
+            Console.WriteLine("所有任务执行完成");
         }
     }
 }

+ 6 - 1
SimulationServer/Entity/AircraftDY.cs

@@ -14,6 +14,9 @@ public class AircraftDY : AircraftEntity
     public bool Success;
     public TaskParameter taskParameter;
     public GetNCData getNCData;
+    public double resulttime;
+
+    public int targetCount;
     public override void End()
     {
         TotalFuelConsumption = TurningPoints[0].RemainingFuel - TurningPoints[^1].RemainingFuel;
@@ -25,10 +28,12 @@ public class AircraftDY : AircraftEntity
         IsOver = false;
         Success = false;
         TotalTime = 0;
+        targetCount = 0;
     }
 
     public override void Start()
     {
+        targetCount = FlightPlanEditor.targetpoint[0].TargetType.Count;
         getNCData = new GetNCData();
         getNCData.initlatitudes = FlightPlanEditor.targetpoint[0].TargetPointLatitude;
         getNCData.initlongitudes = FlightPlanEditor.targetpoint[0].TargetPointLongitude;
@@ -53,7 +58,7 @@ public class AircraftDY : AircraftEntity
 
         FXJHGenerate.FromStartToMission(FlightPlanEditor, ref TurningPoints);//生成从起点到任务段起点的航路点
         // 吊运上升速度  吊运下降速度 Task文件读取 // Editor里读天气根据时间
-        double resulttime = get_result_time_rope(taskParameter.Height, taskParameter.liftPersonnel, windSpeed, vis, taskParameter.liftUpSpeed, taskParameter.liftDownSpeed).time;//索滑降模型输出的索滑降时间
+        resulttime = get_result_time_rope(taskParameter.Height, taskParameter.liftPersonnel, windSpeed, vis, taskParameter.liftUpSpeed, taskParameter.liftDownSpeed).time;//索滑降模型输出的索滑降时间
         Console.WriteLine("resulttime:" + resulttime);
         FXJHGenerate.SuoHuaJiang(resulttime, FlightPlanEditor, ref TurningPoints);
 

+ 7 - 1
SimulationServer/Entity/KZDYMission.cs

@@ -80,18 +80,24 @@ public class KZDYMission : Entity
             if (!aircraftSJDatas[key].ContainsKey("识别成功率"))
                 aircraftSJDatas[key]["识别成功率"] = new List<string>();
             aircraftSJDatas[key]["识别成功率"].Add("0");
+            if (!aircraftSJDatas[key].ContainsKey("人员数量"))
+                aircraftSJDatas[key]["人员数量"] = new List<string>();
+            aircraftSJDatas[key]["人员数量"].Add(aircraftEntity.targetCount.ToString());
             if (!aircraftSJDatas[key].ContainsKey("任务准备时间"))
                 aircraftSJDatas[key]["任务准备时间"] = new List<string>();
             aircraftSJDatas[key]["任务准备时间"].Add(aircraftEntity.TaskReadyTime.ToString());
             if (!aircraftSJDatas[key].ContainsKey("平均搜索时间"))
                 aircraftSJDatas[key]["平均搜索时间"] = new List<string>();
             aircraftSJDatas[key]["平均搜索时间"].Add("0");
+            if (!aircraftSJDatas[key].ContainsKey("平均救助时间"))
+                aircraftSJDatas[key]["平均救助时间"] = new List<string>();
+            aircraftSJDatas[key]["平均救助时间"].Add(aircraftEntity.resulttime.ToString());
             if (!aircraftSJDatas[key].ContainsKey("总飞行时间"))
                 aircraftSJDatas[key]["总飞行时间"] = new List<string>();
             aircraftSJDatas[key]["总飞行时间"].Add(aircraftEntity.TotalTime.ToString());
             if (!aircraftSJDatas[key].ContainsKey("人员存活率"))
                 aircraftSJDatas[key]["人员存活率"] = new List<string>();
-            aircraftSJDatas[key]["人员存活率"].Add(aircraftEntity.Success ? "1" : "0");
+            aircraftSJDatas[key]["人员存活率"].Add(aircraftEntity.Success ? aircraftEntity.targetCount.ToString() : "0");
         }
     }
 

+ 8 - 1
SimulationServer/EventHandler/ServerStartEventHandler.cs

@@ -117,6 +117,7 @@ public class ServerStartEventHandler : AEvent<ServerStart>
         //创建搜救
         foreach (var seaSJTask in taskConfig.seaSouJiuTasks)
         {
+            taskSys.missionCount++;
             //Console.WriteLine("seaSJTask.missionInformation.MissionName:" + seaSJTask.missionInformation.MissionName);
             //Console.WriteLine("TargetPointId:" + seaSJTask.TargetPointId);
             //Console.WriteLine("SearchPayload:" + seaSJTask.SearchPayload);
@@ -125,11 +126,12 @@ public class ServerStartEventHandler : AEvent<ServerStart>
             //Console.WriteLine("仿真次数:" + editorConfig.runCounts);
             Game.EventSystem.Publish(new CreateSeaSJTask
             { EditorConfig = editorConfig, SeaSJTask = seaSJTask });
-            //break;
+            break;
         }
 
         //foreach (var landSXTask in taskConfig.LandSouXunTasks)
         //{
+        //    taskSys.missionCount++;
         //    Game.EventSystem.Publish(new CreateLandSXTask
         //    { EditorConfig = editorConfig, LandSXTask = landSXTask });
         //    //break;
@@ -138,6 +140,7 @@ public class ServerStartEventHandler : AEvent<ServerStart>
         //创建空中吊运救援任务
         foreach (var KZDYTask in taskConfig.KZDYTasks)
         {
+            taskSys.missionCount++;
             Game.EventSystem.Publish(new CreateKZDYTask
             { EditorConfig = editorConfig, KZDYTask = KZDYTask });
             //break;
@@ -146,6 +149,7 @@ public class ServerStartEventHandler : AEvent<ServerStart>
         ////创建空投空送任务
         //foreach (var KTKSTask in taskConfig.KTKSTasks)
         //{
+        //    taskSys.missionCount++;
         //    Game.EventSystem.Publish(new CreateKTKSTask
         //    { EditorConfig = editorConfig, KTKSTask = KTKSTask });
         //    //break;
@@ -154,6 +158,7 @@ public class ServerStartEventHandler : AEvent<ServerStart>
         ////创建着水救援任务
         //foreach (var ZSJYTask in taskConfig.ZSJYTasks)
         //{
+        //    taskSys.missionCount++;
         //    Game.EventSystem.Publish(new CreateZSJYTask
         //    { EditorConfig = editorConfig, ZSJYTask = ZSJYTask });
         //    //break;
@@ -162,6 +167,7 @@ public class ServerStartEventHandler : AEvent<ServerStart>
         ////创建机降救援任务
         //foreach (var JJJYTask in taskConfig.JJJYTasks)
         //{
+        //    taskSys.missionCount++;
         //    Game.EventSystem.Publish(new CreateJJJYTask
         //    { EditorConfig = editorConfig, JJJYTask = JJJYTask });
         //    //break;
@@ -170,6 +176,7 @@ public class ServerStartEventHandler : AEvent<ServerStart>
         ////创建索滑降救援任务
         //foreach (var SHJTask in taskConfig.SHJTasks)
         //{
+        //    taskSys.missionCount++;
         //    Game.EventSystem.Publish(new CreateSHJTask
         //    { EditorConfig = editorConfig, SHJTask = SHJTask });
         //    //break;

+ 1 - 1
SimulationServer/bin/Debug/net7.0/Missions/editor_config.json

@@ -1,5 +1,5 @@
 {
-    "仿真次数": 1,
+    "仿真次数": 2,
     "想定信息": {
         "想定日期": "2024年6月4日",
         "想定时间": "00时00分00秒"

BIN
SimulationServer/bin/Debug/net7.0/SimulationServer.dll


BIN
SimulationServer/bin/Debug/net7.0/SimulationServer.exe


BIN
SimulationServer/bin/Debug/net7.0/SimulationServer.pdb