< Summary

Information
Class: CounterDrone.Core.Services.ReportService
Assembly: CounterDrone.Core
File(s): C:\Users\Tellme\apps\CounterDroneBackend\src\CounterDrone.Core\Services\ReportService.cs
Line coverage
96%
Covered lines: 58
Uncovered lines: 2
Coverable lines: 60
Total lines: 94
Line coverage: 96.6%
Branch coverage
58%
Covered branches: 7
Total branches: 12
Branch coverage: 58.3%
Method coverage

Feature is only available for sponsors

Upgrade to PRO version

Metrics

MethodBranch coverage Crap Score Cyclomatic complexity Line coverage
.ctor(...)100%11100%
Generate(...)100%11100%
GetReport(...)100%11100%
DeleteReport(...)100%11100%
SearchReports(...)60%101088.88%
ExportToFile(...)50%22100%

File(s)

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

#LineLine coverage
 1using System;
 2using System.Collections.Generic;
 3using System.IO;
 4using System.Linq;
 5using CounterDrone.Core.Models;
 6using SQLite;
 7using SimEvent = CounterDrone.Core.Simulation.SimEvent;
 8
 9namespace CounterDrone.Core.Services
 10{
 11    public class ReportService : IReportService
 12    {
 13        private readonly SQLiteConnection _db;
 514        private readonly ReportGenerator _generator = new();
 15        private readonly IPathProvider _paths;
 16
 517        public ReportService(SQLiteConnection db, IPathProvider paths)
 518        {
 519            _db = db;
 520            _paths = paths;
 521        }
 22
 23        public SimulationReport Generate(string taskId, TaskFullConfig config,
 24            List<SimEvent> events, string finalDroneStatus, float duration)
 625        {
 3326            var destroyed = events.Count(e => e.Type == SimEventType.DroneDestroyed);
 3327            var reached = events.Count(e => e.Type == SimEventType.DroneReachedTarget);
 3328            var intruded = events.Count(e => e.Type == SimEventType.ZoneIntruded);
 1229            var total = config.Targets.Sum(t => t.Quantity);
 630            var result = _generator.DetermineInterceptResult(destroyed, reached + intruded, total);
 31
 632            var report = new SimulationReport
 633            {
 634                TaskId = taskId,
 635                TaskName = config.Task.Name,
 636                TaskNumber = config.Task.TaskNumber,
 637                CompletedAt = DateTime.UtcNow.ToString("o"),
 638                TargetCount = total,
 639                EquipmentCount = config.Equipment.Count,
 640                InterceptResult = (int)result,
 641                Content = _generator.Generate(config, events, Simulation.DroneStatus.Flying, duration),
 642            };
 43
 644            _db.Insert(report);
 645            return report;
 646        }
 47
 48        public SimulationReport GetReport(string id)
 249        {
 250            return _db.Find<SimulationReport>(id);
 251        }
 52
 53        public void DeleteReport(string id)
 154        {
 155            _db.Delete<SimulationReport>(id);
 156        }
 57
 58        public PagedResult<SimulationReport> SearchReports(string keyword, string? dateFrom, string? dateTo, int page, i
 159        {
 160            if (page < 1) page = 1;
 161            if (pageSize < 1) pageSize = 10;
 162            var offset = (page - 1) * pageSize;
 63
 164            var query = _db.Table<SimulationReport>().AsQueryable();
 165            if (!string.IsNullOrWhiteSpace(keyword))
 166                query = query.Where(r => r.TaskName.Contains(keyword) || r.TaskNumber.Contains(keyword));
 167            if (!string.IsNullOrWhiteSpace(dateFrom))
 068                query = query.Where(r => r.CompletedAt.CompareTo(dateFrom) >= 0);
 169            if (!string.IsNullOrWhiteSpace(dateTo))
 070                query = query.Where(r => r.CompletedAt.CompareTo(dateTo) <= 0);
 71
 172            var total = query.Count();
 173            var items = query.OrderByDescending(r => r.CompletedAt).Skip(offset).Take(pageSize).ToList();
 74
 175            return new PagedResult<SimulationReport>
 176            {
 177                Items = items, TotalCount = total, Page = page, PageSize = pageSize,
 178            };
 179        }
 80
 81        public string ExportToFile(string reportId, string outputDir)
 282        {
 283            var report = _db.Find<SimulationReport>(reportId);
 284            if (report == null) throw new ArgumentException($"报告 {reportId} 不存在");
 85
 286            Directory.CreateDirectory(outputDir);
 287            var safeTime = DateTime.UtcNow.ToString("yyyyMMdd_HHmmss");
 288            var fileName = $"{report.TaskName}_{safeTime}.md";
 289            var filePath = Path.Combine(outputDir, fileName);
 290            File.WriteAllText(filePath, report.Content);
 291            return filePath;
 292        }
 93    }
 94}