Browse Source

创建空投空送任务相关任务脚本

liyang 6 months ago
parent
commit
26bcde539d

+ 53 - 0
SimulationServer/Component/SJStaticCapacityComponent.cs

@@ -123,6 +123,31 @@ public class SJStaticCapacityComponent : Component
         SJStaticCapacity.有效探测距离 = 2.ToString();
     }
 
+    public void FillData3(AircraftDB db)
+    {
+        var aircraft = GetParent<AircraftKTKS>();
+
+        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()
     {
@@ -206,4 +231,32 @@ public class SJStaticCapacityComponent : Component
         };
         return report;
     }
+
+    public Dictionary<string, Dictionary<string, string>> GetReport3()
+    {
+        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;
+    }
 }

+ 6 - 3
SimulationServer/Component/TaskComponent.cs

@@ -13,7 +13,8 @@ public class TaskComponent : Component
     public List<ZCRescueMission> ZCRescueMissions;
     public List<SeaSJRescueMission> SeaSJRescueMissions;
     public List<LandSJRescueMission> LandSJRescueMissions;
-    public List<CreateKZDYMission> CreateKZDYMissions;
+    public List<KZDYMission> KZDYMissions;
+    public List<KTKSMission> KTKSMissions;
 
     public SJAllTotalTaskPerformanceComponent SSJAllTotalTaskPerformance = new SJAllTotalTaskPerformanceComponent();
     public Dictionary<string, Dictionary<string, List<string>>> alltotalReportSea = new();
@@ -39,7 +40,8 @@ public class TaskComponent : Component
         ZCRescueMissions?.ForEach(r => r.Start());
         SeaSJRescueMissions?.ForEach(r => r.Start());
         LandSJRescueMissions?.ForEach(r => r.Start());
-        CreateKZDYMissions?.ForEach(r => r.Start());
+        KZDYMissions?.ForEach(r => r.Start());
+        KTKSMissions?.ForEach(r => r.Start());
     }
 
     public void SaveSeaSJ(Dictionary<string, Dictionary<string, string>> totalReport)
@@ -181,7 +183,8 @@ 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>();
+        self.KZDYMissions = new List<KZDYMission>();
+        self.KTKSMissions = new List<KTKSMission>();
     }
 }
 

+ 19 - 4
SimulationServer/Entity/AircraftKTKS.cs

@@ -24,14 +24,21 @@ public class AircraftKTKS : AircraftEntity
     int Days;
     int Hour;
 
+    public TaskParameter taskParameter;
+    public bool IsOver;
+    public bool Success;
+
     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()
     {
@@ -71,11 +78,11 @@ public class AircraftKTKS : AircraftEntity
         List<double> KTresultPostion = new List<double>();
 
         double KTheight;
-        if("开伞空投" == "True")  //空投空送任务文件读取
+        if(taskParameter.isParachute)  //空投空送任务文件读取
         {
             KTheight = 200;
             // 空投迎风面积 = 1.5 空投空送任务文件读取 50 = 空投重量 空投空送任务文件读取
-            KTiniposition = getPositionWithUmbrella(FlightPlanEditor.missionpoint.MissionPointLongitude, FlightPlanEditor.missionpoint.MissionPointLatitude, KTheight, windSpeed, theta, 1.5, 50);
+            KTiniposition = getPositionWithUmbrella(FlightPlanEditor.missionpoint.MissionPointLongitude, FlightPlanEditor.missionpoint.MissionPointLatitude, KTheight, windSpeed, theta, taskParameter.airdropWindArea, taskParameter.airdropWeight);
             double inix = Mokatuo_lon(KTiniposition[1]);
             double iniy = Mokatuo_lat(KTiniposition[0]);
 
@@ -109,6 +116,14 @@ public class AircraftKTKS : AircraftEntity
 
         FXJHGenerate.FromMissionToEnd(FlightPlanEditor, missionEndPoint, 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();
     }
 
     //private double GetDistance(double lon1, double lon2, double lat1, double lat2)
@@ -331,6 +346,6 @@ public class AircraftKTKSAwakeSystem : AwakeSystem<AircraftKTKS, FlightPlanEdito
     {
         self.FlightPlanEditor = flightPlanEditor;
         self.Awake();
-        self.Reset();
+        //self.Reset();
     }
 }

+ 177 - 0
SimulationServer/Entity/KTKSMission.cs

@@ -0,0 +1,177 @@
+using KYFramework;
+using NPOI.SS.Formula.PTG;
+using SimulationServer.Utils;
+
+namespace SimulationServer;
+
+public class KTKSMission : Entity
+{
+    public string MissionId; // 任务ID
+    public bool Success; // 任务是否成功
+    public List<AircraftKTKS> aircrafts = new List<AircraftKTKS>();
+
+    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 (AircraftKTKS 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 (AircraftKTKS aircraftEntity in aircrafts)
+        {
+            var staticCapacity = aircraftEntity.GetComponent<SJStaticCapacityComponent>();
+
+            if (staticCapacity == null) continue;
+
+            staticCapacity.FillData3(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.GetReport3();
+            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 KTKSMissionUpdateSystem : UpdateSystem<KTKSMission>
+{
+    public override void Update(KTKSMission self)
+    {
+        if (!self.IsRunning) return;
+
+        self.aircrafts?.ForEach(a => a.Update(self.SimulationTime));
+
+        if (self.aircrafts.All(a => a.IsOver))
+        {
+            self.EndMission();
+        }
+    }
+}

+ 3 - 3
SimulationServer/Entity/CreateKZDYMission.cs → SimulationServer/Entity/KZDYMission.cs

@@ -4,7 +4,7 @@ using SimulationServer.Utils;
 
 namespace SimulationServer;
 
-public class CreateKZDYMission : Entity
+public class KZDYMission : Entity
 {
     public string MissionId; // 任务ID
     public bool Success; // 任务是否成功
@@ -161,9 +161,9 @@ public class CreateKZDYMission : Entity
 
 
 [ObjectSystem]
-public class CreateKZDYMissionUpdateSystem : UpdateSystem<CreateKZDYMission>
+public class KZDYMissionUpdateSystem : UpdateSystem<KZDYMission>
 {
-    public override void Update(CreateKZDYMission self)
+    public override void Update(KZDYMission self)
     {
         if (!self.IsRunning) return;
 

+ 54 - 2
SimulationServer/EventHandler/CreateTaskEventHandler.cs

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

+ 14 - 14
SimulationServer/EventHandler/ServerStartEventHandler.cs

@@ -125,21 +125,21 @@ public class ServerStartEventHandler : AEvent<ServerStart>
             //break;
         }
 
-        ////创建空投空送任务
-        //foreach (var KTKSTask in taskConfig.KTKSTasks)
-        //{
-        //    Game.EventSystem.Publish(new CreateKTKSTask
-        //    { EditorConfig = editorConfig, KTKSTask = KTKSTask });
-        //    //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 ZSJYTask in taskConfig.ZSJYTasks)
+        {
+            Game.EventSystem.Publish(new CreateZSJYTask
+            { EditorConfig = editorConfig, ZSJYTask = ZSJYTask });
+            //break;
+        }
 
         ////创建机降救援任务
         //foreach (var JJJYTask in taskConfig.JJJYTasks)

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


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


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