refactor: 移除 stats 统计功能

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
This commit is contained in:
Scottxjw
2026-08-14 09:23:26 +08:00
parent 2b031995e1
commit f3472d21ee
7 changed files with 4 additions and 286 deletions

View File

@@ -1,142 +0,0 @@
using Microsoft.EntityFrameworkCore;
using Microsoft.Extensions.Logging;
using Gpulse.WCT.DataAnalyzer.Core.Infrastructure.LocalData;
using Gpulse.WCT.DataAnalyzer.Core.Domain.Local;
namespace Gpulse.WCT.DataAnalyzer.Core.Application;
/// <summary>
/// 统计查询服务 - 使用数据库端聚合优化内存效率
/// </summary>
public class StatsService
{
private readonly WctMinerDbContext _context;
private readonly ILogger<StatsService> _logger;
public StatsService(WctMinerDbContext context, ILogger<StatsService> logger)
{
_context = context;
_logger = logger;
}
/// <summary>
/// 获取整体统计摘要(并行查询优化)
/// </summary>
public async Task<StatsSummary> GetSummaryAsync()
{
// 使用 Task.WhenAll 并行执行多个查询
var tasks = new[]
{
_context.TestScenarios.CountAsync(),
_context.QfodRecords.CountAsync(),
_context.PlossRecords.CountAsync(),
_context.TxPanels.CountAsync(),
_context.TxHardwares.CountAsync(),
_context.TxSoftwares.CountAsync(),
_context.RxTypes.CountAsync()
};
var results = await Task.WhenAll(tasks);
var summary = new StatsSummary(
results[0], results[1], results[2],
results[3], results[4], results[5], results[6]
);
_logger.LogDebug("统计摘要: Scenarios={ScenarioCount}, Qfod={QfodCount}, Ploss={PlossCount}",
summary.ScenarioCount, summary.QfodCount, summary.PlossCount);
return summary;
}
/// <summary>
/// 按FOD类型统计Qfod记录数据库端聚合
/// </summary>
public async Task<List<FodTypeStats>> GetStatsByFodTypeAsync()
{
// 使用数据库端 GroupBy
var stats = await _context.QfodRecords
.GroupBy(r => r.FodType)
.Select(g => new FodTypeStats(g.Key, g.Count()))
.OrderBy(s => s.FodType)
.ToListAsync();
_logger.LogDebug("按 FOD 类型统计完成: {Count} 种类型", stats.Count);
return stats;
}
/// <summary>
/// 按面板类型统计(数据库端聚合 - 使用维度表反向统计)
/// </summary>
public async Task<List<DimensionStats>> GetStatsByPanelAsync()
{
// 方式: 使用维度表反向统计(更高效)
var stats = await _context.TxPanels
.Select(p => new DimensionStats(
p.Name,
p.TestScenarios.Count()
))
.OrderByDescending(s => s.Count)
.ToListAsync();
_logger.LogDebug("按面板类型统计完成: {Count} 种面板", stats.Count);
return stats;
}
/// <summary>
/// 按硬件版本统计(数据库端聚合)
/// </summary>
public async Task<List<DimensionStats>> GetStatsByHardwareAsync()
{
var stats = await _context.TxHardwares
.Select(h => new DimensionStats(
h.Version,
h.TestScenarios.Count()
))
.OrderByDescending(s => s.Count)
.ToListAsync();
_logger.LogDebug("按硬件版本统计完成: {Count} 种版本", stats.Count);
return stats;
}
/// <summary>
/// 按RX类型统计数据库端聚合
/// </summary>
public async Task<List<DimensionStats>> GetStatsByRxTypeAsync()
{
var stats = await _context.RxTypes
.Select(r => new DimensionStats(
r.Name,
r.TestScenarios.Count()
))
.OrderByDescending(s => s.Count)
.ToListAsync();
_logger.LogDebug("按 RX 类型统计完成: {Count} 种类型", stats.Count);
return stats;
}
}
/// <summary>
/// 整体统计摘要
/// </summary>
public record StatsSummary(
int ScenarioCount,
int QfodCount,
int PlossCount,
int PanelCount,
int HardwareCount,
int SoftwareCount,
int RxTypeCount
);
/// <summary>
/// FOD类型统计
/// </summary>
public record FodTypeStats(byte FodType, int Count);
/// <summary>
/// 维度统计
/// </summary>
public record DimensionStats(string Name, int Count);

View File

@@ -54,7 +54,6 @@ public static class ServiceCollectionExtensions
services.AddScoped<DimensionService>();
services.AddScoped<ScenarioService>();
services.AddScoped<ParseService>();
services.AddScoped<StatsService>();
services.AddScoped<ExportService>();
services.AddScoped<CleanService>();
services.AddScoped<AggregationService>();

View File

@@ -1,112 +0,0 @@
using System.CommandLine;
using Gpulse.WCT.DataAnalyzer.Core.Application;
namespace Gpulse.WCT.DataAnalyzer.Commands;
/// <summary>
/// 统计查询命令
/// </summary>
public class StatsCommand : Command
{
public StatsCommand(StatsService statsService)
: base("stats", "Query statistics from database")
{
var summaryOption = new Option<bool>(
"--summary",
() => false,
"Show overall statistics summary"
);
var byFodTypeOption = new Option<bool>(
"--by-fod-type",
() => false,
"Show statistics by FOD type"
);
var byPanelOption = new Option<bool>(
"--by-panel",
() => false,
"Show statistics by TX panel"
);
var byHardwareOption = new Option<bool>(
"--by-hardware",
() => false,
"Show statistics by TX hardware version"
);
var byRxTypeOption = new Option<bool>(
"--by-rx-type",
() => false,
"Show statistics by RX type"
);
AddOption(summaryOption);
AddOption(byFodTypeOption);
AddOption(byPanelOption);
AddOption(byHardwareOption);
AddOption(byRxTypeOption);
this.SetHandler(async (summary, byFodType, byPanel, byHardware, byRxType) =>
{
// 如果没有指定任何选项,默认显示摘要
if (!summary && !byFodType && !byPanel && !byHardware && !byRxType)
{
summary = true;
}
if (summary)
{
var s = await statsService.GetSummaryAsync();
Console.WriteLine("=== Statistics Summary ===");
Console.WriteLine($" Scenarios: {s.ScenarioCount}");
Console.WriteLine($" Qfod Records: {s.QfodCount}");
Console.WriteLine($" Ploss Records: {s.PlossCount}");
Console.WriteLine($" TX Panels: {s.PanelCount}");
Console.WriteLine($" TX Hardware: {s.HardwareCount}");
Console.WriteLine($" TX Software: {s.SoftwareCount}");
Console.WriteLine($" RX Types: {s.RxTypeCount}");
}
if (byFodType)
{
Console.WriteLine("\n=== By FOD Type ===");
var stats = await statsService.GetStatsByFodTypeAsync();
foreach (var s in stats)
{
Console.WriteLine($" FOD Type {s.FodType}: {s.Count}");
}
}
if (byPanel)
{
Console.WriteLine("\n=== By TX Panel ===");
var stats = await statsService.GetStatsByPanelAsync();
foreach (var s in stats)
{
Console.WriteLine($" {s.Name}: {s.Count}");
}
}
if (byHardware)
{
Console.WriteLine("\n=== By TX Hardware ===");
var stats = await statsService.GetStatsByHardwareAsync();
foreach (var s in stats)
{
Console.WriteLine($" {s.Name}: {s.Count}");
}
}
if (byRxType)
{
Console.WriteLine("\n=== By RX Type ===");
var stats = await statsService.GetStatsByRxTypeAsync();
foreach (var s in stats)
{
Console.WriteLine($" {s.Name}: {s.Count}");
}
}
}, summaryOption, byFodTypeOption, byPanelOption, byHardwareOption, byRxTypeOption);
}
}

View File

@@ -74,7 +74,6 @@ public class Program
rootCommand.AddCommand(new ParseCommand(provider.GetRequiredService<ParseService>()));
rootCommand.AddCommand(new AggregateCommand(provider.GetRequiredService<AggregationService>()));
rootCommand.AddCommand(new StatsCommand(provider.GetRequiredService<StatsService>()));
rootCommand.AddCommand(new ExportCommand(provider.GetRequiredService<ExportService>()));
rootCommand.AddCommand(new CleanCommand(provider.GetRequiredService<CleanService>()));