Browse Source

按会议内容进行部分修改,创建空中吊运救援任务相关任务脚本

liyang 6 months ago
parent
commit
9fcd0bb12b
29 changed files with 519 additions and 49 deletions
  1. BIN
      KYFramework/bin/Debug/net7.0/KYFramework.dll
  2. BIN
      KYFramework/bin/Debug/net7.0/KYFramework.pdb
  3. BIN
      KYFramework/bin/Debug/net7.0/ThirdParty.dll
  4. BIN
      KYFramework/bin/Debug/net7.0/ThirdParty.pdb
  5. 11 1
      Models/SimulationCommon/TaskConfig.cs
  6. 1 1
      SimulationServer/Component/SJAllTotalTaskPerformance.cs
  7. 52 0
      SimulationServer/Component/SJStaticCapacityComponent.cs
  8. 3 0
      SimulationServer/Component/TaskComponent.cs
  9. 95 7
      SimulationServer/Entity/AircraftDY.cs
  10. 26 6
      SimulationServer/Entity/AircraftSJ.cs
  11. 177 0
      SimulationServer/Entity/CreateKZDYMission.cs
  12. 52 0
      SimulationServer/EventHandler/CreateTaskEventHandler.cs
  13. 30 0
      SimulationServer/EventHandler/EventStruct.cs
  14. 70 30
      SimulationServer/EventHandler/ServerStartEventHandler.cs
  15. BIN
      SimulationServer/bin/Debug/net7.0/KYFramework.dll
  16. BIN
      SimulationServer/bin/Debug/net7.0/KYFramework.pdb
  17. BIN
      SimulationServer/bin/Debug/net7.0/KYNetwork.dll
  18. BIN
      SimulationServer/bin/Debug/net7.0/KYNetwork.pdb
  19. 1 1
      SimulationServer/bin/Debug/net7.0/Missions/editor_config.json
  20. 1 3
      SimulationServer/bin/Debug/net7.0/Missions/task_config.json
  21. BIN
      SimulationServer/bin/Debug/net7.0/SimulationCommon.dll
  22. BIN
      SimulationServer/bin/Debug/net7.0/SimulationCommon.pdb
  23. BIN
      SimulationServer/bin/Debug/net7.0/SimulationServer.dll
  24. BIN
      SimulationServer/bin/Debug/net7.0/SimulationServer.exe
  25. BIN
      SimulationServer/bin/Debug/net7.0/SimulationServer.pdb
  26. BIN
      SimulationServer/bin/Debug/net7.0/ThirdParty.dll
  27. BIN
      SimulationServer/bin/Debug/net7.0/ThirdParty.pdb
  28. BIN
      ThirdParty/bin/Debug/net7.0/ThirdParty.dll
  29. BIN
      ThirdParty/bin/Debug/net7.0/ThirdParty.pdb

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


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


BIN
KYFramework/bin/Debug/net7.0/ThirdParty.dll


BIN
KYFramework/bin/Debug/net7.0/ThirdParty.pdb


+ 11 - 1
Models/SimulationCommon/TaskConfig.cs

@@ -284,7 +284,7 @@ public class KZDYTask //空中吊运救援任务
     [JsonProperty("应用航空器")]
     public AircraftInfo[] aircraftInfos;
     [JsonProperty("任务参数")]
-    public TaskParameter[] KTKSParameters;
+    public TaskParameter[] KZDYParameters;
 }
 
 public class DMMHTask
@@ -447,4 +447,14 @@ public class TaskConfig
     public List<SeaSouJiuTask> seaSouJiuTasks = new List<SeaSouJiuTask>();
     [JsonProperty("陆上搜寻任务")]
     public List<LandSouXunTask> LandSouXunTasks = new List<LandSouXunTask>();
+    [JsonProperty("空中吊运救援任务")]
+    public List<KZDYTask> KZDYTasks = new List<KZDYTask>();
+    [JsonProperty("空投空送任务")]
+    public List<KTKSTask> KTKSTasks = new List<KTKSTask>();
+    [JsonProperty("着水救援任务")]
+    public List<ZSJYTask> ZSJYTasks = new List<ZSJYTask>();
+    [JsonProperty("机降救援任务")]
+    public List<JJJYTask> JJJYTasks = new List<JJJYTask>();
+    [JsonProperty("索滑降救援任务")]
+    public List<SHJTask> SHJTasks = new List<SHJTask>();
 }

+ 1 - 1
SimulationServer/Component/SJAllTotalTaskPerformance.cs

@@ -49,7 +49,7 @@ public class SJAllTotalTaskPerformanceComponent
             foreach (var item in mhRescueMission.aircraftSJDatas)
             {
                 识别成功率 += float.Parse(item.Value["识别成功率"][sIndex]);
-                if (任务准备时间 < float.Parse(item.Value["任务准备时间"][sIndex]))  // 所有任务最小
+                if (任务准备时间 < float.Parse(item.Value["任务准备时间"][sIndex]))
                     任务准备时间 = float.Parse(item.Value["任务准备时间"][sIndex]);
                 平均搜索时间 += float.Parse(item.Value["平均搜索时间"][sIndex]);
                 总飞行时间 += float.Parse(item.Value["总飞行时间"][sIndex]);

+ 52 - 0
SimulationServer/Component/SJStaticCapacityComponent.cs

@@ -98,6 +98,31 @@ public class SJStaticCapacityComponent : Component
         SJStaticCapacity.有效探测距离 = 2.ToString();
     }
 
+    public void FillData2(AircraftDB db)
+    {
+        var aircraft = GetParent<AircraftDY>();
+
+        SJStaticCapacity.初次出动准备时间 = "30";
+        SJStaticCapacity.再次补给时间 = "5";
+        SJStaticCapacity.舱内载荷 = db.fzdnz == null ? "0" : db.fzdnz.ToString();
+        //SJStaticCapacity.机舱容量 = db.fjcrll == null ? "0" : db.fjcrll.ToString();
+        SJStaticCapacity.最大平飞速度 = db.fzdss == null ? "0" : db.fzdss.ToString();
+        SJStaticCapacity.巡航速度 = db.fzdss == null ? "0" : db.fzdss.ToString();
+        //SJStaticCapacity.搜救速度 = db.fsjfxsd == null ? "0" : db.fsjfxsd.ToString();
+        //SJStaticCapacity.单人救助时间 = db.fdrjzsj == null ? "0" : db.fdrjzsj.ToString();
+        SJStaticCapacity.抗风等级 = "八级";
+        SJStaticCapacity.最大起降高度 = "";
+        //SJStaticCapacity.抗浪等级 = db.fkldj == null ? "0" : db.fkldj.ToString();
+        //SJStaticCapacity.起降距离 = db.fjjcdc == null ? "0" : db.fjjcdc.ToString();
+        SJStaticCapacity.夜间作业能力 = 0.ToString();
+        SJStaticCapacity.仪表飞行能力 = 0.ToString();
+        SJStaticCapacity.可靠性 = "0.9";
+        //SJStaticCapacity.航程 = db.fhc == null ? "0" : db.fhc.ToString();
+        SJStaticCapacity.悬停相对耗油率 = FXJHGenerate.GetHoverFuelConsumptionRate(aircraft.FlightPlanEditor, 50).ToString();
+        SJStaticCapacity.搜救相对耗油率 = FXJHGenerate.GetCruisingVelocity(aircraft.FlightPlanEditor, 50).ToString();
+        SJStaticCapacity.有效探测距离 = 2.ToString();
+    }
+
 
     public Dictionary<string, Dictionary<string, string>> GetReport()
     {
@@ -154,4 +179,31 @@ public class SJStaticCapacityComponent : Component
         return report;
     }
 
+    public Dictionary<string, Dictionary<string, string>> GetReport2()
+    {
+        Dictionary<string, Dictionary<string, string>> report = new Dictionary<string, Dictionary<string, string>>();
+        report["静态能力"] = new Dictionary<string, string>
+        {
+            { "初次出动准备时间/s", SJStaticCapacity.初次出动准备时间.ToString() },
+            { "再次补给时间/s", SJStaticCapacity.再次补给时间.ToString() },
+            { "舱内载荷/kg", SJStaticCapacity.舱内载荷.ToString() },
+            { "机舱容量/kg", SJStaticCapacity.机舱容量.ToString() },
+            { "最大平飞速度/km/h", SJStaticCapacity.最大平飞速度.ToString() },
+            { "巡航速度/km/h", SJStaticCapacity.巡航速度.ToString() },
+            { "搜救速度/km/h", SJStaticCapacity.搜救速度.ToString() },
+            { "单人救助时间/s", SJStaticCapacity.单人救助时间.ToString() },
+            { "抗风等级", SJStaticCapacity.抗风等级.ToString() },
+            { "抗浪等级", SJStaticCapacity.抗浪等级.ToString() },
+            { "起降距离/m", SJStaticCapacity.起降距离.ToString() },
+            { "夜间作业能力", SJStaticCapacity.夜间作业能力.ToString() },
+            { "仪表飞行能力", SJStaticCapacity.仪表飞行能力.ToString() },
+            { "可靠性", SJStaticCapacity.可靠性.ToString() },
+            { "航程/km", SJStaticCapacity.航程.ToString() },
+            { "悬停相对耗油率", SJStaticCapacity.悬停相对耗油率.ToString() },
+            { "搜救相对耗油率", SJStaticCapacity.搜救相对耗油率.ToString() },
+            { "有效探测距离/m", SJStaticCapacity.有效探测距离.ToString() }
+
+        };
+        return report;
+    }
 }

+ 3 - 0
SimulationServer/Component/TaskComponent.cs

@@ -13,6 +13,7 @@ public class TaskComponent : Component
     public List<ZCRescueMission> ZCRescueMissions;
     public List<SeaSJRescueMission> SeaSJRescueMissions;
     public List<LandSJRescueMission> LandSJRescueMissions;
+    public List<CreateKZDYMission> CreateKZDYMissions;
 
     public SJAllTotalTaskPerformanceComponent SSJAllTotalTaskPerformance = new SJAllTotalTaskPerformanceComponent();
     public Dictionary<string, Dictionary<string, List<string>>> alltotalReportSea = new();
@@ -38,6 +39,7 @@ public class TaskComponent : Component
         ZCRescueMissions?.ForEach(r => r.Start());
         SeaSJRescueMissions?.ForEach(r => r.Start());
         LandSJRescueMissions?.ForEach(r => r.Start());
+        CreateKZDYMissions?.ForEach(r => r.Start());
     }
 
     public void SaveSeaSJ(Dictionary<string, Dictionary<string, string>> totalReport)
@@ -179,6 +181,7 @@ public class TaskComponentAwakeSystem : AwakeSystem<TaskComponent>
         self.XHRescueMissions = new List<XHRescueMission>();
         self.SeaSJRescueMissions = new List<SeaSJRescueMission>();
         self.LandSJRescueMissions = new List<LandSJRescueMission>();
+        self.CreateKZDYMissions = new List<CreateKZDYMission>();
     }
 }
 

+ 95 - 7
SimulationServer/Entity/AircraftDY.cs

@@ -1,32 +1,64 @@
 using KYFramework;
 using Model;
 using MongoDB.Bson;
+using SimulationCommon;
 
 namespace SimulationServer;
 
 public class AircraftDY : AircraftEntity
 {
-    public SHJTask content;
     public TaskParameter SHJParameter;
+    public KZDYTask taskContent;
+    public MissionEndPoint MissionEndPoint;
+    public bool IsOver;
+    public bool Success;
+    public TaskParameter taskParameter;
     public override void End()
     {
         TotalFuelConsumption = TurningPoints[0].RemainingFuel - TurningPoints[^1].RemainingFuel;
     }
 
+    public override void Reset()
+    {
+        base.Reset();
+        IsOver = false;
+        Success = false;
+        TotalTime = 0;
+    }
+
     public override void Start()
     {
+        int hour = Convert.ToInt32(taskContent.missionInformation.StartTime.Split("时")[0]);
+        Console.WriteLine("hour:" + hour);
+        double windSpeed = Convert.ToDouble(TargetQiXiangInfoSave("风速", hour));
+        Console.WriteLine("windSpeed:" + windSpeed);
+        double vis = Convert.ToDouble(TargetQiXiangInfoSave("能见度", hour));
+        Console.WriteLine("vis:" + vis);
+
+        // 任务参数任务点?
+        FlightPlanEditor.missionpoint.MissionPointLatitude = taskParameter.MissionPoints_KZDY[0].MissionPointLatitude;
+        FlightPlanEditor.missionpoint.MissionPointLongitude = taskParameter.MissionPoints_KZDY[0].MissionPointLongitude;
+        FlightPlanEditor.missionpoint.MissionPointHeight = taskParameter.MissionPoints_KZDY[0].MissionPointHeight;
+        Console.WriteLine("Latitude:" + FlightPlanEditor.missionpoint.MissionPointLatitude + "_" + "Longitude:" + FlightPlanEditor.missionpoint.MissionPointLongitude + "_" + "Height:" + FlightPlanEditor.missionpoint.MissionPointHeight);
+
         // 飞到目标点时间与人员存活时间做对比  有一个人活着,整个任务成功
+        //double survivalTime = SurvivalTimeModel.SurvivalTime(getNCData.tempreadNC, latitude, longitude, time, text_ReadNC.times, text_ReadNC.latitudes, text_ReadNC.longitudes, Days, Hour); //幸存时间
+
         FXJHGenerate.FromStartToMission(FlightPlanEditor, ref TurningPoints);//生成从起点到任务段起点的航路点
         // 吊运上升速度  吊运下降速度 Task文件读取 // Editor里读天气根据时间
-        double resulttime = get_result_time_rope(SHJParameter.H, SHJParameter.person_number, SHJParameter.windspeed, SHJParameter.vis, 0.75, 1.38).time;//索滑降模型输出的索滑降时间
-        FXJHGenerate.SuoHuaJiang(resulttime, FlightPlanEditor, ref TurningPoints);
-        FXJHGenerate.FromMissionToEnd(FlightPlanEditor, FXJHGenerate.SuoHuaJiangMissionEndPoint(FlightPlanEditor), ref TurningPoints);
+        double resulttime = get_result_time_rope(taskParameter.Height, taskParameter.liftPersonnel, windSpeed, vis, taskParameter.liftUpSpeed, taskParameter.liftDownSpeed).time;//索滑降模型输出的索滑降时间
+        FXJHGenerate.SuoHuaJiang(resulttime, FlightPlanEditor, ref TurningPoints);  // 索滑降通用?
+
+        FXJHGenerate.FromMissionToEnd(FlightPlanEditor, FXJHGenerate.SuoHuaJiangMissionEndPoint(FlightPlanEditor), ref TurningPoints); // // 索滑降通用?
         FXJHGenerate.FXJHTPDiedai(FlightPlanEditor, ref TurningPoints, Velocitys, FuelConsumptions);
 
         for (int i = 0; i < TurningPoints.Count; i++) // 总飞行时间
         {
             TotalTime += TurningPoints[i].SegmentFlightTime; // 总时间   //仿真轮次1 数值1
+            Console.WriteLine("TotalTime:" + TotalTime);
         }
+        IsOver = true;
+        End();
     }
 
     // --接口
@@ -69,6 +101,63 @@ public class AircraftDY : AircraftEntity
         }
         return result;
     }
+
+    public string TargetQiXiangInfoSave(string s, int hour)
+    {
+        string result = hour.ToString() + "-" + s;
+        switch (s)
+        {
+            case "温度":
+                if (hour >= 0 && hour < 8)
+                    result = FlightPlanEditor.targetpoint[0].TargetQiXiangInfo.Temperature_00_08.ToString();
+                else if (hour >= 8 && hour < 19)
+                    result = FlightPlanEditor.targetpoint[0].TargetQiXiangInfo.Temperature_08_19.ToString();
+                else if (hour >= 19 && hour <= 24)
+                    result = FlightPlanEditor.targetpoint[0].TargetQiXiangInfo.Temperature_19_24.ToString();
+                break;
+            case "湿度":
+                if (hour >= 0 && hour < 8)
+                    result = FlightPlanEditor.targetpoint[0].TargetQiXiangInfo.Humidity_00_08.ToString();
+                else if (hour >= 8 && hour < 19)
+                    result = FlightPlanEditor.targetpoint[0].TargetQiXiangInfo.Humidity_08_19.ToString();
+                else if (hour >= 19 && hour <= 24)
+                    result = FlightPlanEditor.targetpoint[0].TargetQiXiangInfo.Humidity_19_24.ToString();
+                break;
+            case "能见度":
+                if (hour >= 0 && hour < 8)
+                    result = FlightPlanEditor.targetpoint[0].TargetQiXiangInfo.Visibility_00_08.ToString();
+                else if (hour >= 8 && hour < 19)
+                    result = FlightPlanEditor.targetpoint[0].TargetQiXiangInfo.Visibility_08_19.ToString();
+                else if (hour >= 19 && hour <= 24)
+                    result = FlightPlanEditor.targetpoint[0].TargetQiXiangInfo.Visibility_19_24.ToString();
+                break;
+            case "风速":
+                if (hour >= 0 && hour < 8)
+                    result = FlightPlanEditor.targetpoint[0].TargetQiXiangInfo.WindSpeed_00_08.ToString();
+                else if (hour >= 8 && hour < 19)
+                    result = FlightPlanEditor.targetpoint[0].TargetQiXiangInfo.WindSpeed_08_19.ToString();
+                else if (hour >= 19 && hour <= 24)
+                    result = FlightPlanEditor.targetpoint[0].TargetQiXiangInfo.WindSpeed_19_24.ToString();
+                break;
+            case "风向":
+                if (hour >= 0 && hour < 8)
+                    result = FlightPlanEditor.targetpoint[0].TargetQiXiangInfo.WindDirection_00_08.ToString();
+                else if (hour >= 8 && hour < 19)
+                    result = FlightPlanEditor.targetpoint[0].TargetQiXiangInfo.WindDirection_08_19.ToString();
+                else if (hour >= 19 && hour <= 24)
+                    result = FlightPlanEditor.targetpoint[0].TargetQiXiangInfo.WindDirection_19_24.ToString();
+                break;
+            case "天气":
+                if (hour >= 0 && hour < 8)
+                    result = FlightPlanEditor.targetpoint[0].TargetQiXiangInfo.Weather_00_08;
+                else if (hour >= 8 && hour < 19)
+                    result = FlightPlanEditor.targetpoint[0].TargetQiXiangInfo.Weather_08_19;
+                else if (hour >= 19 && hour <= 24)
+                    result = FlightPlanEditor.targetpoint[0].TargetQiXiangInfo.Weather_19_24;
+                break;
+        }
+        return result;
+    }
 }
 
 public class handling_result
@@ -78,11 +167,10 @@ public class handling_result
 }
 
 [ObjectSystem]
-public class AircraftDYAwakeSystem : AwakeSystem<AircraftDY, FlightPlanEditor, SHJTask>
+public class AircraftDYAwakeSystem : AwakeSystem<AircraftDY, FlightPlanEditor>
 {
-    public override void Awake(AircraftDY self, FlightPlanEditor flightPlanEditor, SHJTask shjTask)
+    public override void Awake(AircraftDY self, FlightPlanEditor flightPlanEditor)
     {
-        self.content = shjTask;
         self.FlightPlanEditor = flightPlanEditor;
         self.Awake();
     }

+ 26 - 6
SimulationServer/Entity/AircraftSJ.cs

@@ -26,6 +26,7 @@ public class AircraftSJ : AircraftEntity
     public SeaSouJiuTask taskContent;
     public bool Success = false; //本目标搜救是否成功
     public GetNCData getNCData;
+    public double resulttime;
 
     //private bool isbool;
     //private bool isbool2;
@@ -43,6 +44,7 @@ public class AircraftSJ : AircraftEntity
         Success = false;
         SearchTime = 0;
         TotalTime = 0;
+        resulttime = 0;
     }
 
     public override void Start()
@@ -219,14 +221,14 @@ public class AircraftSJ : AircraftEntity
 
         Task.Run(() =>
         {
-            bool isseePerson = false; // 没看到人是0 看到人调用下面方法 //人员存活率 读取Editor人数
+            bool isseePerson = false; // 输出表格平均救助时间没看到人是0看到人调用下面get_result_time_rope方法 //人员存活率需要重新算读取Editor搜救目标点初始坐标人数 //任务准备时间取值所有任务最小
             double temptime = 0; // 自增时间,每次增加1s
             CurrentLocation currentLocation = new CurrentLocation();
             double probability = 0;
             double finalProbability = 1.0;
             Random random = new Random();
             int fireIndex = -1; // 记录发现火点的位置
-
+            double windSpeed = 0;
             do
             {
                 if (!isseePerson && temptime >= time)
@@ -257,7 +259,7 @@ public class AircraftSJ : AircraftEntity
                     temptime, text_ReadNC.times, text_ReadNC.latitudes, text_ReadNC.longitudes, text_ReadNC.times1, text_ReadNC.latitudes1, text_ReadNC.longitudes1, Days, Hour);
 
 
-                var windSpeed = Math.Sqrt(wind[0] * wind[0] + wind[1] * wind[1]);
+                windSpeed = Math.Sqrt(wind[0] * wind[0] + wind[1] * wind[1]);
 
                 var waveHigh = SeaSJ.GetWaveHeightFromAPI(nCread, currentLocation.CurrentLon,
                     currentLocation.CurrentLat, temptime, text_ReadNC.times4, text_ReadNC.latitudes4, text_ReadNC.longitudes4, Days, Hour);
@@ -275,7 +277,7 @@ public class AircraftSJ : AircraftEntity
                 {
                     probability = helper.GetMushiSeaProbability(aricraftPoint, vis, waveHigh, FlightPlanEditor.targetpoint[0]);
                 }
-                else if(taskContent.missionSearchPayloads[0].SearchPayload == "光电(红外)搜索")
+                else if (taskContent.missionSearchPayloads[0].SearchPayload == "光电(红外)搜索")
                 {
                     // Lt = 探测目标亮度 Editor / At = 探测目标面积 Editor / τa = 1 / Lb = 3 / A0 = 1 / D0 = 0.075 / Dstar = 3 / τo = 0.8 / Ad = 0.0073728 / Δf = 0.125 / δ = 0.5 / Pf0 = Math.Pow(10, -6);
                     probability = helper.GetInfraredDetectionProbability(FlightPlanEditor.targetpoint[0].TargetType.TargetBrightness, FlightPlanEditor.targetpoint[0].TargetType.TargetArea, 1, 3, 1, aricraftPoint, FlightPlanEditor.targetpoint[0], 0.075, 3, 0.8, 0073728, 0.125, 0.5, Math.Pow(10, -6));
@@ -324,8 +326,8 @@ public class AircraftSJ : AircraftEntity
                 double longitude = FlightPlanEditor.targetpoint[0].TargetPointLongitude; //落水人员经度,数据测试用
 
                 double survivalTime = SurvivalTimeModel.SurvivalTime(getNCData.tempreadNC, latitude, longitude, time, text_ReadNC.times, text_ReadNC.latitudes, text_ReadNC.longitudes, Days, Hour); //幸存时间
-                //  SHJParameter.person_number = Eidtor里读取   SHJParameter.windspeed Nc/Editor
-                //double resulttime = get_result_time_rope(30, SHJParameter.person_number, SHJParameter.windspeed, SHJParameter.vis, 0.75, 1.38).time;//索滑降模型输出的索滑降时间
+                //  SHJParameter.person_number = Eidtor里读取   SHJParameter.windspeed Nc/Editor目标气象信息读取时间先取任务初始时间
+                resulttime = get_result_time_rope(30, FlightPlanEditor.targetpoint[0].TargetType.Count, windSpeed, vis, 0.75, 1.38).time; //调运时间
                 if (survivalTime * 3600 > time)
                 {
                     Success = true;
@@ -370,6 +372,24 @@ public class AircraftSJ : AircraftEntity
         });
     }
 
+    public static handling_result get_result_time_rope(double H, int person_number, double windspeed, double vis, double upspeed, double downspeed)
+    {
+
+        handling_result result = new handling_result();
+
+        if (windspeed < 8 && vis > 3)
+        {
+            result.time = (person_number * H) / downspeed + (person_number * H) / upspeed;
+            result.success = true;
+        }
+        else
+        {
+            result.success = false;
+        }
+        return result;
+    }
+
+
     public static int GetDaysInYear(int year, int month, int day)
     {
         int[] daysInMonths = { 31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31 };

+ 177 - 0
SimulationServer/Entity/CreateKZDYMission.cs

@@ -0,0 +1,177 @@
+using KYFramework;
+using NPOI.SS.Formula.PTG;
+using SimulationServer.Utils;
+
+namespace SimulationServer;
+
+public class CreateKZDYMission : Entity
+{
+    public string MissionId; // 任务ID
+    public bool Success; // 任务是否成功
+    public List<AircraftDY> aircrafts = new List<AircraftDY>();
+
+    public bool IsRunning;
+    public double SimulationTime;
+
+    public Dictionary<string, Dictionary<string, Dictionary<string, List<string>>>> singleReport = new();
+
+    public Dictionary<string, Dictionary<string, List<string>>> aircraftSJDatas = new();
+
+    public bool IsOver = false;
+
+    private int currentExecuteCount = 1;
+    public int ExecutionContext = 0;
+    public void Start()
+    {
+        IsRunning = true;
+        aircrafts.ForEach(a => a.Start());
+        Log.Info($"{MissionId} 任务开始!");
+    }
+
+    public void Reset()
+    {
+        SimulationTime = 0;
+        aircrafts?.ForEach(a => a.Reset());
+    }
+
+    public void EndMission()
+    {
+        IsRunning = false;
+        Log.Info($"{MissionId} 任务结束!");
+
+        if (currentExecuteCount > ExecutionContext)
+        {
+            return;
+        }
+
+        if (currentExecuteCount < ExecutionContext)
+        {
+            SaveSJ();
+            SaveAircraftSJDatas();
+        }
+
+        if (currentExecuteCount == ExecutionContext)
+        {
+            SaveSJ();
+            SaveAircraftSJDatas();
+            ReportSJ();
+            IsOver = true;
+            return;
+        }
+
+        this.Reset();
+        this.Start();
+        currentExecuteCount++;
+    }
+
+    public void SaveAircraftSJDatas()
+    {
+        foreach (AircraftDY aircraftEntity in aircrafts)
+        {
+            string key = aircraftEntity.AircraftId;
+            if (!aircraftSJDatas.ContainsKey(key))
+            {
+                aircraftSJDatas[key] = new Dictionary<string, List<string>>();
+            }
+            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.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.TotalTime.ToString());
+            if (!aircraftSJDatas[key].ContainsKey("人员存活率"))
+                aircraftSJDatas[key]["人员存活率"] = new List<string>();
+            aircraftSJDatas[key]["人员存活率"].Add(aircraftEntity.Success ? "1" : "0");
+        }
+    }
+
+    public void SaveSJ()
+    {
+        foreach (AircraftDY aircraftEntity in aircrafts)
+        {
+            var staticCapacity = aircraftEntity.GetComponent<SJStaticCapacityComponent>();
+
+            if (staticCapacity == null) continue;
+
+            staticCapacity.FillData2(aircraftEntity.Db);
+
+            string key = aircraftEntity.AircraftId;
+
+            if (!singleReport.ContainsKey(key))
+            {
+                singleReport[key] = new Dictionary<string, Dictionary<string, List<string>>>();
+            }
+
+            Dictionary<string, Dictionary<string, string>> staticReport = staticCapacity.GetReport2();
+            foreach (var kv in staticReport)
+            {
+                if (!singleReport[key].ContainsKey(kv.Key)) singleReport[key][kv.Key] = new Dictionary<string, List<string>>();
+                foreach (var kv2 in kv.Value)
+                {
+                    if (!singleReport[key][kv.Key].ContainsKey(kv2.Key)) singleReport[key][kv.Key][kv2.Key] = new List<string>();
+                    singleReport[key][kv.Key][kv2.Key].Add(kv2.Value);
+                }
+            }
+        }
+        if (currentExecuteCount == ExecutionContext)
+        {
+            foreach (var kv in singleReport)
+            {
+                foreach (var kv2 in kv.Value)
+                {
+                    foreach (var kv3 in kv2.Value)
+                    {
+                        var sum = 0f;
+                        foreach (var kv4 in kv3.Value)
+                        {
+                            bool isfloat = float.TryParse(kv4, out float f);
+                            if (isfloat)
+                                sum += float.Parse(kv4);
+                            else
+                                sum = -1f;
+                        }
+                        if (sum != -1f)
+                            kv3.Value.Add((sum / kv3.Value.Count).ToString());
+                        else
+                            kv3.Value.Add("");
+                    }
+                }
+            }
+        }
+    }
+
+    public void ReportSJ()
+    {
+        string data = DateTime.Now.ToString("yyyy-MM-dd");
+        string path = $"Reports/空中吊运救援任务/{data}/{MissionId}"; //作为海上/陆上搜救子任务需生成实验报告,路径不确定,需判断跟随谁
+        if (!Directory.Exists(path)) Directory.CreateDirectory(path);
+        foreach (var kv in singleReport)
+        {
+            string filePath = $"{path}/{kv.Key}搜救任务单机指标报告.xls";
+            DataTableExtensions.SaveToExcel(filePath, kv.Value, true);
+        }
+    }
+}
+
+
+[ObjectSystem]
+public class CreateKZDYMissionUpdateSystem : UpdateSystem<CreateKZDYMission>
+{
+    public override void Update(CreateKZDYMission self)
+    {
+        if (!self.IsRunning) return;
+
+        self.aircrafts?.ForEach(a => a.Update(self.SimulationTime));
+
+        if (self.aircrafts.All(a => a.IsOver))
+        {
+            self.EndMission();
+        }
+    }
+}

+ 52 - 0
SimulationServer/EventHandler/CreateTaskEventHandler.cs

@@ -352,4 +352,56 @@ public class CreateLandSJEventHandler : AEvent<CreateLandSXTask>
 
         return UniTask.CompletedTask;
     }
+
+    [Event]
+    public class CreateKZDYEventHandler : AEvent<CreateKZDYTask>
+    {
+        protected override UniTask Run(CreateKZDYTask config)
+        {
+            var taskSys = Game.Scene.GetComponent<TaskComponent>();
+            CreateKZDYMission mission = ComponentFactory.Create<CreateKZDYMission>();
+            taskSys.CreateKZDYMissions.Add(mission);
+            mission.MissionId = $"空中吊运救援任务 {config.KZDYTask.missionInformation.MissionName}";
+            mission.ExecutionContext = config.EditorConfig.runCounts;
+            //mission.AddComponent<SJTotalTaskPerformanceComponent>();
+            for (int i = 0; i < config.KZDYTask.aircraftInfos.Length; i++)
+            {
+                //飞机参数
+                var aircraftParameter = config.EditorConfig.aircraftParameters.Find(
+                    a => a.AircraftID == config.KZDYTask.aircraftInfos[i].AircraftType);
+                //基地
+                var originBase = config.EditorConfig.bases.Find(b => b.BaseId == aircraftParameter.AirportId);
+
+                TargetPoint targetPoint = config.EditorConfig.targetPoints.Find(t => t.TargetPointId == config.KZDYTask.missionInformation.TargetPointId);
+                //创建飞行计划编辑器
+                var flightPlanEditor = FlightPlanEditor.Create(aircraftParameter, config.EditorConfig.cityWeather, originBase, new TargetPoint[] { targetPoint });
+
+                AircraftDY aircraft = ComponentFactory.Create<AircraftDY, FlightPlanEditor>(flightPlanEditor);
+                aircraft.Name = config.KZDYTask.aircraftInfos[i].AircraftType;
+                aircraft.TaskReadyTime = config.KZDYTask.missionInformation.TakeoffPreparationTime;
+                mission.aircrafts.Add(aircraft);
+                aircraft.taskContent = config.KZDYTask;
+                aircraft.AircraftId = config.KZDYTask.aircraftInfos[i].AircraftId;
+                aircraft.MissionEndPoint = new MissionEndPoint
+                {
+                    MissionEndPointLongitude = targetPoint.TargetPointLongitude,
+                    MissionEndPointLatitude = targetPoint.TargetPointLatitude,
+                    MissionEndPointHeight = targetPoint.TargetPointHeight
+                };
+
+                foreach (var item in config.KZDYTask.KZDYParameters)
+                {
+                    if (item.AircraftId == aircraft.AircraftId)
+                    {
+                        aircraft.taskParameter = item;
+                    }
+                }
+
+                aircraft.AddComponent<SJStaticCapacityComponent>();
+                Log.Info($"创建机型 : {flightPlanEditor.aircraftparameter.AircraftID}");
+            }
+
+            return UniTask.CompletedTask;
+        }
+    }
 }

+ 30 - 0
SimulationServer/EventHandler/EventStruct.cs

@@ -31,6 +31,36 @@ public struct CreateLandSXTask
     public LandSouXunTask LandSXTask;
 }
 
+public struct CreateKZDYTask
+{
+    public EditorConfig EditorConfig;
+    public KZDYTask KZDYTask;
+}
+
+public struct CreateKTKSTask
+{
+    public EditorConfig EditorConfig;
+    public KTKSTask KTKSTask;
+}
+
+public struct CreateZSJYTask
+{
+    public EditorConfig EditorConfig;
+    public ZSJYTask ZSJYTask;
+}
+
+public struct CreateJJJYTask
+{
+    public EditorConfig EditorConfig;
+    public JJJYTask JJJYTask;
+}
+
+public struct CreateSHJTask
+{
+    public EditorConfig EditorConfig;
+    public SHJTask SHJTask;
+}
+
 public struct CreateXHTask
 {
     public EditorConfig EditorConfig;

+ 70 - 30
SimulationServer/EventHandler/ServerStartEventHandler.cs

@@ -75,40 +75,40 @@ public class ServerStartEventHandler : AEvent<ServerStart>
         Define.WIND = double.Parse(wind_temp[0]);
 
 
-        // 创建灭火
-        foreach (var mhTask in taskConfig.mHTaskConfigs)
-        {
-            Game.EventSystem.Publish(new CreateMHTask
-            { EditorConfig = editorConfig, MHTaskConfig = mhTask });
-        }
+        //// 创建灭火
+        //foreach (var mhTask in taskConfig.mHTaskConfigs)
+        //{
+        //    Game.EventSystem.Publish(new CreateMHTask
+        //    { EditorConfig = editorConfig, MHTaskConfig = mhTask });
+        //}
 
-        // 创建侦察
-        foreach (var zcTask in taskConfig.zCTask)
-        {
-            Game.EventSystem.Publish(new CreateZCTask
-            { EditorConfig = editorConfig, ZCTask = zcTask });
-        }
+        //// 创建侦察
+        //foreach (var zcTask in taskConfig.zCTask)
+        //{
+        //    Game.EventSystem.Publish(new CreateZCTask
+        //    { EditorConfig = editorConfig, ZCTask = zcTask });
+        //}
 
-        // 创建巡护
-        foreach (var xhTask in taskConfig.xHTask)
-        {
-            Game.EventSystem.Publish(new CreateXHTask
-            { EditorConfig = editorConfig, XHTask = xhTask });
-        }
+        //// 创建巡护
+        //foreach (var xhTask in taskConfig.xHTask)
+        //{
+        //    Game.EventSystem.Publish(new CreateXHTask
+        //    { EditorConfig = editorConfig, XHTask = xhTask });
+        //}
         //Console.WriteLine("taskConfig.seaSouJiuTasks.Count:" + taskConfig.seaSouJiuTasks.Count);
         //创建搜救
-        foreach (var seaSJTask in taskConfig.seaSouJiuTasks)
-        {
-            //Console.WriteLine("seaSJTask.missionInformation.MissionName:" + seaSJTask.missionInformation.MissionName);
-            //Console.WriteLine("TargetPointId:" + seaSJTask.TargetPointId);
-            //Console.WriteLine("SearchPayload:" + seaSJTask.SearchPayload);
-            //Console.WriteLine("SearchMode:" + seaSJTask.SearchMode);
-            //Console.WriteLine("RadarTransmitterPower:" + seaSJTask.RadarTransmitterPower);
-            //Console.WriteLine("仿真次数:" + editorConfig.runCounts);
-            Game.EventSystem.Publish(new CreateSeaSJTask
-            { EditorConfig = editorConfig, SeaSJTask = seaSJTask });
-            //break;
-        }
+        //foreach (var seaSJTask in taskConfig.seaSouJiuTasks)
+        //{
+        //    //Console.WriteLine("seaSJTask.missionInformation.MissionName:" + seaSJTask.missionInformation.MissionName);
+        //    //Console.WriteLine("TargetPointId:" + seaSJTask.TargetPointId);
+        //    //Console.WriteLine("SearchPayload:" + seaSJTask.SearchPayload);
+        //    //Console.WriteLine("SearchMode:" + seaSJTask.SearchMode);
+        //    //Console.WriteLine("RadarTransmitterPower:" + seaSJTask.RadarTransmitterPower);
+        //    //Console.WriteLine("仿真次数:" + editorConfig.runCounts);
+        //    Game.EventSystem.Publish(new CreateSeaSJTask
+        //    { EditorConfig = editorConfig, SeaSJTask = seaSJTask });
+        //    //break;
+        //}
 
         //foreach (var landSXTask in taskConfig.LandSouXunTasks)
         //{
@@ -117,6 +117,46 @@ public class ServerStartEventHandler : AEvent<ServerStart>
         //    //break;
         //}
 
+        //创建空中吊运救援任务
+        foreach (var KZDYTask in taskConfig.KZDYTasks)
+        {
+            Game.EventSystem.Publish(new CreateKZDYTask
+            { EditorConfig = editorConfig, KZDYTask = KZDYTask });
+            //break;
+        }
+
+        ////创建空投空送任务
+        //foreach (var KTKSTask in taskConfig.KTKSTasks)
+        //{
+        //    Game.EventSystem.Publish(new CreateKTKSTask
+        //    { EditorConfig = editorConfig, KTKSTask = KTKSTask });
+        //    //break;
+        //}
+
+        ////创建着水救援任务
+        //foreach (var ZSJYTask in taskConfig.ZSJYTasks)
+        //{
+        //    Game.EventSystem.Publish(new CreateZSJYTask
+        //    { EditorConfig = editorConfig, ZSJYTask = ZSJYTask });
+        //    //break;
+        //}
+
+        ////创建机降救援任务
+        //foreach (var JJJYTask in taskConfig.JJJYTasks)
+        //{
+        //    Game.EventSystem.Publish(new CreateJJJYTask
+        //    { EditorConfig = editorConfig, JJJYTask = JJJYTask });
+        //    //break;
+        //}
+
+        ////创建索滑降救援任务
+        //foreach (var SHJTask in taskConfig.SHJTasks)
+        //{
+        //    Game.EventSystem.Publish(new CreateSHJTask
+        //    { EditorConfig = editorConfig, SHJTask = SHJTask });
+        //    //break;
+        //}
+
         taskSys.ExecutionContext = editorConfig.runCounts;
         taskSys.Start();
         return UniTask.CompletedTask;

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


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


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


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


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

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

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

@@ -347,10 +347,8 @@
             "任务参数": [
                 {
                     "应用飞机编号": "3-3",
-                    "索滑降高度": 200.0,
+                    "索滑降高度": 30,
                     "投送人数": 5,
-                    "风速": 5.0,
-                    "能见度": 5.0,
                     "索滑降速度": 3.0,
                     "索滑降点": [
                         {

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


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


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


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


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


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


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


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


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