Browse Source

创建着水救援任务相关任务脚本

liyang 6 months ago
parent
commit
389332fa53

+ 53 - 0
SimulationServer/Component/SJStaticCapacityComponent.cs

@@ -148,6 +148,31 @@ public class SJStaticCapacityComponent : Component
         SJStaticCapacity.有效探测距离 = 2.ToString();
     }
 
+    public void FillData4(AircraftDB db)
+    {
+        var aircraft = GetParent<AircraftZS>();
+
+        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()
     {
@@ -259,4 +284,32 @@ public class SJStaticCapacityComponent : Component
         };
         return report;
     }
+
+    public Dictionary<string, Dictionary<string, string>> GetReport4()
+    {
+        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

@@ -15,6 +15,7 @@ public class TaskComponent : Component
     public List<LandSJRescueMission> LandSJRescueMissions;
     public List<KZDYMission> KZDYMissions;
     public List<KTKSMission> KTKSMissions;
+    public List<ZSJYMission> ZSJYMissions;
 
     public SJAllTotalTaskPerformanceComponent SSJAllTotalTaskPerformance = new SJAllTotalTaskPerformanceComponent();
     public Dictionary<string, Dictionary<string, List<string>>> alltotalReportSea = new();
@@ -42,6 +43,7 @@ public class TaskComponent : Component
         LandSJRescueMissions?.ForEach(r => r.Start());
         KZDYMissions?.ForEach(r => r.Start());
         KTKSMissions?.ForEach(r => r.Start());
+        ZSJYMissions?.ForEach(r => r.Start());
     }
 
     public void SaveSeaSJ(Dictionary<string, Dictionary<string, string>> totalReport)
@@ -185,6 +187,7 @@ public class TaskComponentAwakeSystem : AwakeSystem<TaskComponent>
         self.LandSJRescueMissions = new List<LandSJRescueMission>();
         self.KZDYMissions = new List<KZDYMission>();
         self.KTKSMissions = new List<KTKSMission>();
+        self.ZSJYMissions = new List<ZSJYMission>();
     }
 }
 

+ 2 - 1
SimulationServer/Entity/AircraftDY.cs

@@ -55,9 +55,10 @@ public class AircraftDY : AircraftEntity
         for (int i = 0; i < TurningPoints.Count; i++) // 总飞行时间
         {
             TotalTime += TurningPoints[i].SegmentFlightTime; // 总时间   //仿真轮次1 数值1
-            Console.WriteLine("TotalTime:" + TotalTime);
+            //Console.WriteLine("TotalTime:" + TotalTime);
         }
         IsOver = true;
+        Success = true;
         End();
     }
 

+ 2 - 1
SimulationServer/Entity/AircraftKTKS.cs

@@ -120,9 +120,10 @@ public class AircraftKTKS : AircraftEntity
         for (int i = 0; i < TurningPoints.Count; i++) // 总飞行时间
         {
             TotalTime += TurningPoints[i].SegmentFlightTime; // 总时间   //仿真轮次1 数值1
-            Console.WriteLine("TotalTime:" + TotalTime);
+            //Console.WriteLine("TotalTime:" + TotalTime);
         }
         IsOver = true;
+        Success = true; //需要判断
         End();
     }
 

+ 39 - 3
SimulationServer/Entity/AircraftZS.cs

@@ -1,4 +1,5 @@
 using KYFramework;
+using KYFramework.Network;
 using Model;
 using SimulationServer.Utils;
 using Define = SimulationServer.Utils.Define;
@@ -18,16 +19,24 @@ public class AircraftZS : AircraftEntity
 
     public int landingPoint = 0;
 
-    public List<AirRoute> airRoutes = new List<AirRoute>();
+    public List<Model.AirRoute> airRoutes = new List<Model.AirRoute>();
+
+    public ZSJYTask taskContent;
+    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()
     {
@@ -37,10 +46,27 @@ public class AircraftZS : AircraftEntity
         missionEndPoint.MissionEndPointLongitude = FlightPlanEditor.targetpoint[0].TargetPointLongitude;
         missionEndPoint.MissionEndPointHeight = FlightPlanEditor.targetpoint[0].TargetPointHeight;
 
+        airRoutes.Clear();
         List<double> list = GenerateCircleTrajectory(FlightPlanEditor.targetpoint[0].TargetPointLatitude, FlightPlanEditor.targetpoint[0].TargetPointLongitude, 1, 360);
         //airRoutes = list
+        Model.AirRoute airRoute = new Model.AirRoute();
+        for (int i = 0; i < list.Count; i++)
+        {
+            if (i % 2 == 0)
+            {
+                //Console.WriteLine("i0:" + list[i]);
+                airRoute = new Model.AirRoute();
+                airRoute.AirRouteLongitude = list[i];
+            }
+            else
+            {
+                //Console.WriteLine("i1:" + list[i]);
+                airRoute.AirRouteLatitude = list[i];
+                airRoutes.Add(airRoute);
+            }
+        }
 
-        for (int i = 0; i < 观察盘旋圈数; i++)
+        for (int i = 0; i < taskParameter.TurnsNumber; i++)
         {
             FXJHGenerate.ZhaoShuiJiuYuan(airRoutes, ref TurningPoints);
 
@@ -50,6 +76,16 @@ public class AircraftZS : 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;
+        Success = true; //需要判断
+        End();
     }
 
     // centerLat centerLon 想定里目标点的经纬度 radiusKm = 1 numPoints = 360  返回的airRoutes  // 

+ 177 - 0
SimulationServer/Entity/ZSJYMission.cs

@@ -0,0 +1,177 @@
+using KYFramework;
+using NPOI.SS.Formula.PTG;
+using SimulationServer.Utils;
+
+namespace SimulationServer;
+
+public class ZSJYMission : Entity
+{
+    public string MissionId; // 任务ID
+    public bool Success; // 任务是否成功
+    public List<AircraftZS> aircrafts = new List<AircraftZS>();
+
+    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 (AircraftZS 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 (AircraftZS aircraftEntity in aircrafts)
+        {
+            var staticCapacity = aircraftEntity.GetComponent<SJStaticCapacityComponent>();
+
+            if (staticCapacity == null) continue;
+
+            staticCapacity.FillData4(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.GetReport4();
+            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 ZSJYMissionUpdateSystem : UpdateSystem<ZSJYMission>
+{
+    public override void Update(ZSJYMission 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

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

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


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


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