< Summary

Information
Class: CounterDrone.Core.Services.ReportGenerator
Assembly: CounterDrone.Core
File(s): C:\Users\Tellme\apps\CounterDroneBackend\src\CounterDrone.Core\Services\ReportGenerator.cs
Line coverage
96%
Covered lines: 62
Uncovered lines: 2
Coverable lines: 64
Total lines: 96
Line coverage: 96.8%
Branch coverage
75%
Covered branches: 9
Total branches: 12
Branch coverage: 75%
Method coverage

Feature is only available for sponsors

Upgrade to PRO version

Metrics

MethodBranch coverage Crap Score Cyclomatic complexity Line coverage
Generate(...)100%22100%
DetermineInterceptResult(...)83.33%66100%
TranslateResult(...)50%4471.42%

File(s)

C:\Users\Tellme\apps\CounterDroneBackend\src\CounterDrone.Core\Services\ReportGenerator.cs

#LineLine coverage
 1using System;
 2using System.Collections.Generic;
 3using System.Linq;
 4using System.Text;
 5using CounterDrone.Core.Models;
 6using SimEvent = CounterDrone.Core.Simulation.SimEvent;
 7
 8namespace CounterDrone.Core.Services
 9{
 10    public class ReportGenerator
 11    {
 12        /// <summary>根据仿真结果生成报告内容</summary>
 13        public string Generate(TaskFullConfig config, List<SimEvent> events,
 14            Simulation.DroneStatus finalDroneStatus, float simulationDuration)
 915        {
 916            var sb = new StringBuilder();
 17
 18            // === 仿真前:我方配置 ===
 919            sb.AppendLine("# 仿真评估报告");
 920            sb.AppendLine();
 921            sb.AppendLine($"**任务名称**:{config.Task.Name}");
 922            sb.AppendLine($"**任务编号**:{config.Task.TaskNumber}");
 923            sb.AppendLine($"**仿真耗时**:{simulationDuration:F1} 秒");
 924            sb.AppendLine();
 25
 926            sb.AppendLine("## 一、仿真前 — 我方配置");
 927            sb.AppendLine();
 928            var deployment = config.Equipment;
 3729            var platforms = deployment.Where(e => e.EquipmentRole == (int)EquipmentRole.LaunchPlatform).ToList();
 3730            var detections = deployment.Where(e => e.EquipmentRole == (int)EquipmentRole.Detection).ToList();
 31
 932            sb.AppendLine($"| 配置项 | 值 |");
 933            sb.AppendLine($"|--------|-----|");
 1834            sb.AppendLine($"| 目标数量 | {config.Targets.Sum(t => t.Quantity)} |");
 3235            sb.AppendLine($"| 发射平台 | {platforms.Sum(p => p.Quantity)} 台 |");
 1436            sb.AppendLine($"| 探测设备 | {detections.Sum(d => d.Quantity)} 台 |");
 937            sb.AppendLine($"| 气溶胶类型 | {(AerosolType)config.Cloud.AerosolType} |");
 938            sb.AppendLine();
 39
 40            // === 仿真中:关键事件时序 ===
 941            sb.AppendLine("## 二、仿真中 — 关键事件时序");
 942            sb.AppendLine();
 943            sb.AppendLine("| 时间(s) | 事件 | 描述 |");
 944            sb.AppendLine("|---------|------|------|");
 19845            foreach (var e in events.OrderBy(e => e.OccurredAt))
 5746            {
 5747                sb.AppendLine($"| {e.OccurredAt:F1} | {e.Type} | {e.Description} |");
 5748            }
 949            sb.AppendLine();
 50
 51            // === 仿真后:统计分析 ===
 952            sb.AppendLine("## 三、仿真后 — 数据统计");
 953            sb.AppendLine();
 54
 6655            var destroyed = events.Count(e => e.Type == SimEventType.DroneDestroyed);
 6656            var reached = events.Count(e => e.Type == SimEventType.DroneReachedTarget);
 6657            var intruded = events.Count(e => e.Type == SimEventType.ZoneIntruded);
 6658            var cloudCount = events.Count(e => e.Type == SimEventType.CloudGenerated);
 6659            var launchCount = events.Count(e => e.Type == SimEventType.MunitionLaunched);
 1860            var totalDrones = config.Targets.Sum(t => t.Quantity);
 61
 962            sb.AppendLine($"| 统计项 | 值 |");
 963            sb.AppendLine($"|--------|-----|");
 964            sb.AppendLine($"| 无人机总数 | {totalDrones} |");
 965            sb.AppendLine($"| 被摧毁 | {destroyed} |");
 966            sb.AppendLine($"| 到达目标 | {reached} |");
 967            sb.AppendLine($"| 侵入管控区 | {intruded} |");
 968            sb.AppendLine($"| 弹药发射次数 | {launchCount} |");
 969            sb.AppendLine($"| 云团生成次数 | {cloudCount} |");
 970            sb.AppendLine();
 71
 72            // 对抗结果
 973            var result = DetermineInterceptResult(destroyed, reached + intruded, totalDrones);
 974            sb.AppendLine($"**对抗结果**:{TranslateResult(result)}");
 975            sb.AppendLine();
 76
 977            return sb.ToString();
 978        }
 79
 80        public InterceptResult DetermineInterceptResult(int destroyed, int reachedOrIntruded, int total)
 1881        {
 1882            if (total == 0) return InterceptResult.Failed;
 2683            if (destroyed >= total) return InterceptResult.Success;
 1184            if (destroyed > 0) return InterceptResult.Partial;
 985            return InterceptResult.Failed;
 1886        }
 87
 988        private static string TranslateResult(InterceptResult r) => r switch
 989        {
 590            InterceptResult.Success => "成功拦截",
 091            InterceptResult.Partial => "部分拦截",
 492            InterceptResult.Failed => "拦截失败",
 093            _ => "未知",
 994        };
 95    }
 96}