报告重构: 仿真结果提前到第一章, 统一七章结构

This commit is contained in:
tian 2026-06-12 12:21:02 +08:00
parent 50b7bd7f69
commit 04e02c43eb

View File

@ -14,11 +14,14 @@ namespace CounterDrone.Core.Services
{
var sb = new StringBuilder();
var platforms = config.Equipment.Where(e => e.EquipmentRole == (int)EquipmentRole.LaunchPlatform).ToList();
var detections = config.Equipment.Where(e => e.EquipmentRole == (int)EquipmentRole.Detection).ToList();
var target = config.Targets.FirstOrDefault();
var scene = config.Scene;
var destroyed = events.Count(e => e.Type == SimEventType.DroneDestroyed);
var reached = events.Count(e => e.Type == SimEventType.DroneReachedTarget);
var intruded = events.Count(e => e.Type == SimEventType.ZoneIntruded);
var totalDrones = config.Targets.Sum(t => t.Quantity);
var result = DetermineInterceptResult(destroyed, reached + intruded, totalDrones);
// === 头部 ===
sb.AppendLine("# 仿真评估报告");
sb.AppendLine();
sb.AppendLine($"| 项目 | 值 |");
@ -29,8 +32,23 @@ namespace CounterDrone.Core.Services
sb.AppendLine($"| 气溶胶类型 | {TranslateAerosol((AerosolType)config.Cloud.AerosolType)} |");
sb.AppendLine();
// === 一、环境 ===
sb.AppendLine("## 一、作战环境");
// === 一、仿真结果 ===
sb.AppendLine("## 一、仿真结果");
sb.AppendLine();
sb.AppendLine($"| 统计项 | 值 |");
sb.AppendLine($"|--------|-----|");
sb.AppendLine($"| 无人机总数 | {totalDrones} |");
sb.AppendLine($"| 被摧毁 | {destroyed} |");
sb.AppendLine($"| 到达目标 | {reached} |");
sb.AppendLine($"| 侵入管控区 | {intruded} |");
sb.AppendLine($"| 弹药发射 | {events.Count(e => e.Type == SimEventType.MunitionLaunched)} |");
sb.AppendLine($"| 云团生成 | {events.Count(e => e.Type == SimEventType.CloudGenerated)} |");
sb.AppendLine();
sb.AppendLine($"**对抗结果**{TranslateResult(result)}");
sb.AppendLine();
// === 二、作战环境 ===
sb.AppendLine("## 二、作战环境");
sb.AppendLine();
sb.AppendLine($"| 参数 | 值 |");
sb.AppendLine($"|------|-----|");
@ -41,47 +59,45 @@ namespace CounterDrone.Core.Services
sb.AppendLine($"| 能见度 | {scene.Visibility} m |");
sb.AppendLine();
// === 二、目标 ===
sb.AppendLine("## 、威胁目标");
// === 三、威胁目标 ===
sb.AppendLine("## 、威胁目标");
sb.AppendLine();
sb.AppendLine($"| 参数 | 值 |");
sb.AppendLine($"|------|-----|");
sb.AppendLine($"| 类型 | {TranslateTarget((TargetType)(target?.TargetType ?? 0))} |");
sb.AppendLine($"| 数量 | {config.Targets.Sum(t => t.Quantity)} 架 |");
sb.AppendLine($"| 数量 | {totalDrones} 架 |");
sb.AppendLine($"| 速度 | {target?.TypicalSpeed ?? 0} km/h |");
sb.AppendLine($"| 高度 | {target?.TypicalAltitude ?? 0} m |");
sb.AppendLine($"| 动力 | {TranslatePower((PowerType)(target?.PowerType ?? 0))} |");
sb.AppendLine();
// === 、推荐方案 ===
// === 、推荐方案 ===
if (config.Cloud.Source == "Algorithm" && config.Cloud.EstimatedProbability.HasValue)
{
sb.AppendLine("## 、推荐方案");
sb.AppendLine("## 、推荐方案");
sb.AppendLine();
sb.AppendLine($"| 参数 | 值 |");
sb.AppendLine($"|------|-----|");
sb.AppendLine($"| 气溶胶类型 | {TranslateAerosol((AerosolType)config.Cloud.AerosolType)} |");
sb.AppendLine($"| 发射方式 | {TranslateRelease((ReleaseMode)config.Cloud.ReleaseMode)} |");
sb.AppendLine($"| 弹药数 | {config.Cloud.SalvoRounds} 发 |");
sb.AppendLine($"| 云团间距 | {config.Cloud.SalvoSpacing:F0} m |");
sb.AppendLine($"| 拦截概率(算法估计) | {config.Cloud.EstimatedProbability.Value:P0} |");
sb.AppendLine($"| 拦截概率 | {config.Cloud.EstimatedProbability.Value:P0} |");
sb.AppendLine($"| 抛撒时机 | {config.Cloud.RecommendedTiming:F0}s |");
sb.AppendLine();
}
// === 、我方部署 ===
sb.AppendLine("## 、我方部署");
// === 、我方部署 ===
sb.AppendLine("## 、我方部署");
sb.AppendLine();
sb.AppendLine($"| 装备 | 数量 |");
sb.AppendLine($"|------|------|");
sb.AppendLine($"| 发射平台 | {platforms.Sum(p => p.Quantity)} 台 |");
sb.AppendLine($"| 探测设备 | {detections.Sum(d => d.Quantity)} 台 |");
sb.AppendLine($"| 云团位置 | ({config.Cloud.PositionX:F0}, {config.Cloud.PositionY:F0}, {config.Cloud.PositionZ:F0}) |");
sb.AppendLine($"| 释放高度 | {config.Cloud.DisperseHeight:F0} m |");
sb.AppendLine();
// === 、事件时序 ===
sb.AppendLine("## 、事件时序");
// === 、事件时序 ===
sb.AppendLine("## 、事件时序");
sb.AppendLine();
sb.AppendLine("| 时间(s) | 事件 | 详情 |");
sb.AppendLine("|---------|------|------|");
@ -102,11 +118,11 @@ namespace CounterDrone.Core.Services
}
sb.AppendLine();
// === 四、时间线分析 ===
// === 七、时间线 ===
var launchTime = events.Where(e => e.Type == SimEventType.MunitionLaunched).Select(e => e.OccurredAt).DefaultIfEmpty(0).Min();
var cloudTime = events.Where(e => e.Type == SimEventType.CloudGenerated).Select(e => e.OccurredAt).DefaultIfEmpty(0).Min();
var destroyTime = events.Where(e => e.Type == SimEventType.DroneDestroyed).Select(e => e.OccurredAt).DefaultIfEmpty(0).Min();
sb.AppendLine("## 、时间线");
sb.AppendLine("## 、时间线");
sb.AppendLine();
sb.AppendLine($"| 阶段 | 时间 | 耗时 |");
sb.AppendLine($"|------|------|------|");
@ -117,27 +133,6 @@ namespace CounterDrone.Core.Services
sb.AppendLine($"| 总耗时 | 0 → {simulationDuration:F1}s | {simulationDuration:F1}s |");
sb.AppendLine();
// === 五、统计 ===
var destroyed = events.Count(e => e.Type == SimEventType.DroneDestroyed);
var reached = events.Count(e => e.Type == SimEventType.DroneReachedTarget);
var intruded = events.Count(e => e.Type == SimEventType.ZoneIntruded);
var totalDrones = config.Targets.Sum(t => t.Quantity);
var result = DetermineInterceptResult(destroyed, reached + intruded, totalDrones);
sb.AppendLine("## 七、结果统计");
sb.AppendLine();
sb.AppendLine($"| 统计项 | 值 |");
sb.AppendLine($"|--------|-----|");
sb.AppendLine($"| 无人机总数 | {totalDrones} |");
sb.AppendLine($"| 被摧毁 | {destroyed} |");
sb.AppendLine($"| 到达目标 | {reached} |");
sb.AppendLine($"| 侵入管控区 | {intruded} |");
sb.AppendLine($"| 弹药发射 | {events.Count(e => e.Type == SimEventType.MunitionLaunched)} |");
sb.AppendLine($"| 云团生成 | {events.Count(e => e.Type == SimEventType.CloudGenerated)} |");
sb.AppendLine();
sb.AppendLine($"**对抗结果**{TranslateResult(result)}");
sb.AppendLine();
return sb.ToString();
}
@ -187,10 +182,8 @@ namespace CounterDrone.Core.Services
private static string TranslateRelease(ReleaseMode r) => r switch
{
ReleaseMode.Single => "单次齐射",
ReleaseMode.Continuous => "连续释放",
ReleaseMode.Pulse => "脉冲释放",
_ => r.ToString(),
ReleaseMode.Single => "单次齐射", ReleaseMode.Continuous => "连续释放",
ReleaseMode.Pulse => "脉冲释放", _ => r.ToString(),
};
private static string TranslateEvent(SimEventType t) => t switch