From d1a89cb86a48b77ad2feab6eb088e895c486942f Mon Sep 17 00:00:00 2001 From: ssss <111@qq.com> Date: Fri, 3 Jul 2026 10:47:27 +0800 Subject: [PATCH] =?UTF-8?q?feat:=20=E9=87=8D=E6=9E=84=E9=A1=B9=E7=9B=AE?= =?UTF-8?q?=E7=BB=93=E6=9E=84=EF=BC=8C=E6=B7=BB=E5=8A=A0=20WPF=20=E5=BA=94?= =?UTF-8?q?=E7=94=A8?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - 将核心功能提取到 WCTDataMiner.Core 类库 - 添加 WCTDataMiner.Wpf 桌面应用 - 支持数据解析、导出、统计等功能 Co-Authored-By: Claude Opus 4.8 --- WCTDataMiner.slnx | 7 ++ .../Configuration/AppSettings.cs | 2 +- .../PlossRecordConfiguration.cs | 4 +- .../Configurations/QfodRecordConfiguration.cs | 4 +- .../Configurations/RxTypeConfiguration.cs | 4 +- .../TestScenarioConfiguration.cs | 4 +- .../Configurations/TxHardwareConfiguration.cs | 4 +- .../Configurations/TxPanelConfiguration.cs | 4 +- .../Configurations/TxSoftwareConfiguration.cs | 4 +- .../Data/DbContextFactory.cs | 2 +- .../Data/IDbContextFactory.cs | 2 +- .../Data/SeedData.cs | 4 +- .../Data/WctMinerDbContext.cs | 4 +- .../Extensions/ServiceCollectionExtensions.cs | 10 +-- .../Models/PlossRecord.cs | 2 +- .../Models/QfodRecord.cs | 2 +- .../Models/RxType.cs | 2 +- .../Models/TestScenario.cs | 2 +- .../Models/TxHardware.cs | 2 +- .../Models/TxPanel.cs | 2 +- .../Models/TxSoftware.cs | 2 +- .../Parsers/FileNameParser.cs | 2 +- .../Parsers/IParser.cs | 2 +- .../Parsers/PlossParser.cs | 4 +- .../Parsers/QfodParser.cs | 4 +- .../Services/CleanService.cs | 6 +- .../Services/DimensionService.cs | 6 +- .../Services/ExportService.cs | 6 +- .../Services/ParseService.cs | 31 +++++---- .../Services/ScenarioService.cs | 8 +-- .../Services/StatsService.cs | 6 +- .../Services/ThresholdCalculator.cs | 2 +- .../WCTDataMiner.Core.csproj | 23 +++++++ src/WCTDataMiner.Wpf/App.xaml | 8 +++ src/WCTDataMiner.Wpf/App.xaml.cs | 52 +++++++++++++++ src/WCTDataMiner.Wpf/AssemblyInfo.cs | 10 +++ src/WCTDataMiner.Wpf/MainWindow.xaml | 66 +++++++++++++++++++ src/WCTDataMiner.Wpf/MainWindow.xaml.cs | 23 +++++++ .../ViewModels/MainViewModel.cs | 54 +++++++++++++++ .../ViewModels/PlossChartViewModel.cs | 49 ++++++++++++++ .../ViewModels/QfodChartViewModel.cs | 49 ++++++++++++++ .../ViewModels/ScenarioListViewModel.cs | 36 ++++++++++ .../Views/PlossChartView.xaml | 28 ++++++++ .../Views/PlossChartView.xaml.cs | 18 +++++ src/WCTDataMiner.Wpf/Views/QfodChartView.xaml | 28 ++++++++ .../Views/QfodChartView.xaml.cs | 18 +++++ .../Views/ScenarioListView.xaml | 46 +++++++++++++ .../Views/ScenarioListView.xaml.cs | 30 +++++++++ src/WCTDataMiner.Wpf/WCTDataMiner.Wpf.csproj | 29 ++++++++ src/WCTDataMiner/Commands/CleanCommand.cs | 2 +- src/WCTDataMiner/Commands/ExportCommand.cs | 2 +- src/WCTDataMiner/Commands/ParseCommand.cs | 2 +- src/WCTDataMiner/Commands/StatsCommand.cs | 2 +- src/WCTDataMiner/Program.cs | 6 +- src/WCTDataMiner/WCTDataMiner.csproj | 15 ++--- 55 files changed, 659 insertions(+), 87 deletions(-) create mode 100644 WCTDataMiner.slnx rename src/{WCTDataMiner => WCTDataMiner.Core}/Configuration/AppSettings.cs (95%) rename src/{WCTDataMiner => WCTDataMiner.Core}/Data/Configurations/PlossRecordConfiguration.cs (97%) rename src/{WCTDataMiner => WCTDataMiner.Core}/Data/Configurations/QfodRecordConfiguration.cs (96%) rename src/{WCTDataMiner => WCTDataMiner.Core}/Data/Configurations/RxTypeConfiguration.cs (92%) rename src/{WCTDataMiner => WCTDataMiner.Core}/Data/Configurations/TestScenarioConfiguration.cs (97%) rename src/{WCTDataMiner => WCTDataMiner.Core}/Data/Configurations/TxHardwareConfiguration.cs (92%) rename src/{WCTDataMiner => WCTDataMiner.Core}/Data/Configurations/TxPanelConfiguration.cs (92%) rename src/{WCTDataMiner => WCTDataMiner.Core}/Data/Configurations/TxSoftwareConfiguration.cs (92%) rename src/{WCTDataMiner => WCTDataMiner.Core}/Data/DbContextFactory.cs (98%) rename src/{WCTDataMiner => WCTDataMiner.Core}/Data/IDbContextFactory.cs (80%) rename src/{WCTDataMiner => WCTDataMiner.Core}/Data/SeedData.cs (92%) rename src/{WCTDataMiner => WCTDataMiner.Core}/Data/WctMinerDbContext.cs (93%) rename src/{WCTDataMiner => WCTDataMiner.Core}/Extensions/ServiceCollectionExtensions.cs (91%) rename src/{WCTDataMiner => WCTDataMiner.Core}/Models/PlossRecord.cs (97%) rename src/{WCTDataMiner => WCTDataMiner.Core}/Models/QfodRecord.cs (94%) rename src/{WCTDataMiner => WCTDataMiner.Core}/Models/RxType.cs (91%) rename src/{WCTDataMiner => WCTDataMiner.Core}/Models/TestScenario.cs (96%) rename src/{WCTDataMiner => WCTDataMiner.Core}/Models/TxHardware.cs (91%) rename src/{WCTDataMiner => WCTDataMiner.Core}/Models/TxPanel.cs (91%) rename src/{WCTDataMiner => WCTDataMiner.Core}/Models/TxSoftware.cs (91%) rename src/{WCTDataMiner => WCTDataMiner.Core}/Parsers/FileNameParser.cs (98%) rename src/{WCTDataMiner => WCTDataMiner.Core}/Parsers/IParser.cs (96%) rename src/{WCTDataMiner => WCTDataMiner.Core}/Parsers/PlossParser.cs (96%) rename src/{WCTDataMiner => WCTDataMiner.Core}/Parsers/QfodParser.cs (95%) rename src/{WCTDataMiner => WCTDataMiner.Core}/Services/CleanService.cs (95%) rename src/{WCTDataMiner => WCTDataMiner.Core}/Services/DimensionService.cs (95%) rename src/{WCTDataMiner => WCTDataMiner.Core}/Services/ExportService.cs (98%) rename src/{WCTDataMiner => WCTDataMiner.Core}/Services/ParseService.cs (84%) rename src/{WCTDataMiner => WCTDataMiner.Core}/Services/ScenarioService.cs (94%) rename src/{WCTDataMiner => WCTDataMiner.Core}/Services/StatsService.cs (97%) rename src/{WCTDataMiner => WCTDataMiner.Core}/Services/ThresholdCalculator.cs (97%) create mode 100644 src/WCTDataMiner.Core/WCTDataMiner.Core.csproj create mode 100644 src/WCTDataMiner.Wpf/App.xaml create mode 100644 src/WCTDataMiner.Wpf/App.xaml.cs create mode 100644 src/WCTDataMiner.Wpf/AssemblyInfo.cs create mode 100644 src/WCTDataMiner.Wpf/MainWindow.xaml create mode 100644 src/WCTDataMiner.Wpf/MainWindow.xaml.cs create mode 100644 src/WCTDataMiner.Wpf/ViewModels/MainViewModel.cs create mode 100644 src/WCTDataMiner.Wpf/ViewModels/PlossChartViewModel.cs create mode 100644 src/WCTDataMiner.Wpf/ViewModels/QfodChartViewModel.cs create mode 100644 src/WCTDataMiner.Wpf/ViewModels/ScenarioListViewModel.cs create mode 100644 src/WCTDataMiner.Wpf/Views/PlossChartView.xaml create mode 100644 src/WCTDataMiner.Wpf/Views/PlossChartView.xaml.cs create mode 100644 src/WCTDataMiner.Wpf/Views/QfodChartView.xaml create mode 100644 src/WCTDataMiner.Wpf/Views/QfodChartView.xaml.cs create mode 100644 src/WCTDataMiner.Wpf/Views/ScenarioListView.xaml create mode 100644 src/WCTDataMiner.Wpf/Views/ScenarioListView.xaml.cs create mode 100644 src/WCTDataMiner.Wpf/WCTDataMiner.Wpf.csproj diff --git a/WCTDataMiner.slnx b/WCTDataMiner.slnx new file mode 100644 index 0000000..4a1eeea --- /dev/null +++ b/WCTDataMiner.slnx @@ -0,0 +1,7 @@ + + + + + + + diff --git a/src/WCTDataMiner/Configuration/AppSettings.cs b/src/WCTDataMiner.Core/Configuration/AppSettings.cs similarity index 95% rename from src/WCTDataMiner/Configuration/AppSettings.cs rename to src/WCTDataMiner.Core/Configuration/AppSettings.cs index fd532e5..4582b46 100644 --- a/src/WCTDataMiner/Configuration/AppSettings.cs +++ b/src/WCTDataMiner.Core/Configuration/AppSettings.cs @@ -1,4 +1,4 @@ -namespace WCTDataMiner.Configuration; +namespace WCTDataMiner.Core.Configuration; /// /// 应用配置 diff --git a/src/WCTDataMiner/Data/Configurations/PlossRecordConfiguration.cs b/src/WCTDataMiner.Core/Data/Configurations/PlossRecordConfiguration.cs similarity index 97% rename from src/WCTDataMiner/Data/Configurations/PlossRecordConfiguration.cs rename to src/WCTDataMiner.Core/Data/Configurations/PlossRecordConfiguration.cs index 85fb8c7..7cf308e 100644 --- a/src/WCTDataMiner/Data/Configurations/PlossRecordConfiguration.cs +++ b/src/WCTDataMiner.Core/Data/Configurations/PlossRecordConfiguration.cs @@ -1,8 +1,8 @@ using Microsoft.EntityFrameworkCore; using Microsoft.EntityFrameworkCore.Metadata.Builders; -using WCTDataMiner.Models; +using WCTDataMiner.Core.Models; -namespace WCTDataMiner.Data.Configurations; +namespace WCTDataMiner.Core.Data.Configurations; public class PlossRecordConfiguration : IEntityTypeConfiguration { diff --git a/src/WCTDataMiner/Data/Configurations/QfodRecordConfiguration.cs b/src/WCTDataMiner.Core/Data/Configurations/QfodRecordConfiguration.cs similarity index 96% rename from src/WCTDataMiner/Data/Configurations/QfodRecordConfiguration.cs rename to src/WCTDataMiner.Core/Data/Configurations/QfodRecordConfiguration.cs index 565cc26..43a26c4 100644 --- a/src/WCTDataMiner/Data/Configurations/QfodRecordConfiguration.cs +++ b/src/WCTDataMiner.Core/Data/Configurations/QfodRecordConfiguration.cs @@ -1,8 +1,8 @@ using Microsoft.EntityFrameworkCore; using Microsoft.EntityFrameworkCore.Metadata.Builders; -using WCTDataMiner.Models; +using WCTDataMiner.Core.Models; -namespace WCTDataMiner.Data.Configurations; +namespace WCTDataMiner.Core.Data.Configurations; public class QfodRecordConfiguration : IEntityTypeConfiguration { diff --git a/src/WCTDataMiner/Data/Configurations/RxTypeConfiguration.cs b/src/WCTDataMiner.Core/Data/Configurations/RxTypeConfiguration.cs similarity index 92% rename from src/WCTDataMiner/Data/Configurations/RxTypeConfiguration.cs rename to src/WCTDataMiner.Core/Data/Configurations/RxTypeConfiguration.cs index bb81d29..849c2b2 100644 --- a/src/WCTDataMiner/Data/Configurations/RxTypeConfiguration.cs +++ b/src/WCTDataMiner.Core/Data/Configurations/RxTypeConfiguration.cs @@ -1,8 +1,8 @@ using Microsoft.EntityFrameworkCore; using Microsoft.EntityFrameworkCore.Metadata.Builders; -using WCTDataMiner.Models; +using WCTDataMiner.Core.Models; -namespace WCTDataMiner.Data.Configurations; +namespace WCTDataMiner.Core.Data.Configurations; public class RxTypeConfiguration : IEntityTypeConfiguration { diff --git a/src/WCTDataMiner/Data/Configurations/TestScenarioConfiguration.cs b/src/WCTDataMiner.Core/Data/Configurations/TestScenarioConfiguration.cs similarity index 97% rename from src/WCTDataMiner/Data/Configurations/TestScenarioConfiguration.cs rename to src/WCTDataMiner.Core/Data/Configurations/TestScenarioConfiguration.cs index 57ace69..0698299 100644 --- a/src/WCTDataMiner/Data/Configurations/TestScenarioConfiguration.cs +++ b/src/WCTDataMiner.Core/Data/Configurations/TestScenarioConfiguration.cs @@ -1,8 +1,8 @@ using Microsoft.EntityFrameworkCore; using Microsoft.EntityFrameworkCore.Metadata.Builders; -using WCTDataMiner.Models; +using WCTDataMiner.Core.Models; -namespace WCTDataMiner.Data.Configurations; +namespace WCTDataMiner.Core.Data.Configurations; public class TestScenarioConfiguration : IEntityTypeConfiguration { diff --git a/src/WCTDataMiner/Data/Configurations/TxHardwareConfiguration.cs b/src/WCTDataMiner.Core/Data/Configurations/TxHardwareConfiguration.cs similarity index 92% rename from src/WCTDataMiner/Data/Configurations/TxHardwareConfiguration.cs rename to src/WCTDataMiner.Core/Data/Configurations/TxHardwareConfiguration.cs index 8405e2a..fd643ce 100644 --- a/src/WCTDataMiner/Data/Configurations/TxHardwareConfiguration.cs +++ b/src/WCTDataMiner.Core/Data/Configurations/TxHardwareConfiguration.cs @@ -1,8 +1,8 @@ using Microsoft.EntityFrameworkCore; using Microsoft.EntityFrameworkCore.Metadata.Builders; -using WCTDataMiner.Models; +using WCTDataMiner.Core.Models; -namespace WCTDataMiner.Data.Configurations; +namespace WCTDataMiner.Core.Data.Configurations; public class TxHardwareConfiguration : IEntityTypeConfiguration { diff --git a/src/WCTDataMiner/Data/Configurations/TxPanelConfiguration.cs b/src/WCTDataMiner.Core/Data/Configurations/TxPanelConfiguration.cs similarity index 92% rename from src/WCTDataMiner/Data/Configurations/TxPanelConfiguration.cs rename to src/WCTDataMiner.Core/Data/Configurations/TxPanelConfiguration.cs index 9b9a768..6dbd13d 100644 --- a/src/WCTDataMiner/Data/Configurations/TxPanelConfiguration.cs +++ b/src/WCTDataMiner.Core/Data/Configurations/TxPanelConfiguration.cs @@ -1,8 +1,8 @@ using Microsoft.EntityFrameworkCore; using Microsoft.EntityFrameworkCore.Metadata.Builders; -using WCTDataMiner.Models; +using WCTDataMiner.Core.Models; -namespace WCTDataMiner.Data.Configurations; +namespace WCTDataMiner.Core.Data.Configurations; public class TxPanelConfiguration : IEntityTypeConfiguration { diff --git a/src/WCTDataMiner/Data/Configurations/TxSoftwareConfiguration.cs b/src/WCTDataMiner.Core/Data/Configurations/TxSoftwareConfiguration.cs similarity index 92% rename from src/WCTDataMiner/Data/Configurations/TxSoftwareConfiguration.cs rename to src/WCTDataMiner.Core/Data/Configurations/TxSoftwareConfiguration.cs index 144643b..2d454f4 100644 --- a/src/WCTDataMiner/Data/Configurations/TxSoftwareConfiguration.cs +++ b/src/WCTDataMiner.Core/Data/Configurations/TxSoftwareConfiguration.cs @@ -1,8 +1,8 @@ using Microsoft.EntityFrameworkCore; using Microsoft.EntityFrameworkCore.Metadata.Builders; -using WCTDataMiner.Models; +using WCTDataMiner.Core.Models; -namespace WCTDataMiner.Data.Configurations; +namespace WCTDataMiner.Core.Data.Configurations; public class TxSoftwareConfiguration : IEntityTypeConfiguration { diff --git a/src/WCTDataMiner/Data/DbContextFactory.cs b/src/WCTDataMiner.Core/Data/DbContextFactory.cs similarity index 98% rename from src/WCTDataMiner/Data/DbContextFactory.cs rename to src/WCTDataMiner.Core/Data/DbContextFactory.cs index 199a22e..526c555 100644 --- a/src/WCTDataMiner/Data/DbContextFactory.cs +++ b/src/WCTDataMiner.Core/Data/DbContextFactory.cs @@ -1,7 +1,7 @@ using Microsoft.EntityFrameworkCore; using Microsoft.Extensions.Configuration; -namespace WCTDataMiner.Data; +namespace WCTDataMiner.Core.Data; /// /// 数据库上下文工厂实现 - 支持SQLite和PostgreSQL切换 diff --git a/src/WCTDataMiner/Data/IDbContextFactory.cs b/src/WCTDataMiner.Core/Data/IDbContextFactory.cs similarity index 80% rename from src/WCTDataMiner/Data/IDbContextFactory.cs rename to src/WCTDataMiner.Core/Data/IDbContextFactory.cs index 5942d6b..2257625 100644 --- a/src/WCTDataMiner/Data/IDbContextFactory.cs +++ b/src/WCTDataMiner.Core/Data/IDbContextFactory.cs @@ -1,4 +1,4 @@ -namespace WCTDataMiner.Data; +namespace WCTDataMiner.Core.Data; /// /// 数据库上下文工厂接口 diff --git a/src/WCTDataMiner/Data/SeedData.cs b/src/WCTDataMiner.Core/Data/SeedData.cs similarity index 92% rename from src/WCTDataMiner/Data/SeedData.cs rename to src/WCTDataMiner.Core/Data/SeedData.cs index afe650c..f715393 100644 --- a/src/WCTDataMiner/Data/SeedData.cs +++ b/src/WCTDataMiner.Core/Data/SeedData.cs @@ -1,6 +1,6 @@ -using WCTDataMiner.Models; +using WCTDataMiner.Core.Models; -namespace WCTDataMiner.Data; +namespace WCTDataMiner.Core.Data; /// /// 初始数据种子 diff --git a/src/WCTDataMiner/Data/WctMinerDbContext.cs b/src/WCTDataMiner.Core/Data/WctMinerDbContext.cs similarity index 93% rename from src/WCTDataMiner/Data/WctMinerDbContext.cs rename to src/WCTDataMiner.Core/Data/WctMinerDbContext.cs index 53550c9..ac410a7 100644 --- a/src/WCTDataMiner/Data/WctMinerDbContext.cs +++ b/src/WCTDataMiner.Core/Data/WctMinerDbContext.cs @@ -1,7 +1,7 @@ using Microsoft.EntityFrameworkCore; -using WCTDataMiner.Models; +using WCTDataMiner.Core.Models; -namespace WCTDataMiner.Data; +namespace WCTDataMiner.Core.Data; /// /// WCT数据采集数据库上下文 diff --git a/src/WCTDataMiner/Extensions/ServiceCollectionExtensions.cs b/src/WCTDataMiner.Core/Extensions/ServiceCollectionExtensions.cs similarity index 91% rename from src/WCTDataMiner/Extensions/ServiceCollectionExtensions.cs rename to src/WCTDataMiner.Core/Extensions/ServiceCollectionExtensions.cs index 8b82175..629f3c8 100644 --- a/src/WCTDataMiner/Extensions/ServiceCollectionExtensions.cs +++ b/src/WCTDataMiner.Core/Extensions/ServiceCollectionExtensions.cs @@ -1,10 +1,10 @@ using Microsoft.Extensions.Configuration; using Microsoft.Extensions.DependencyInjection; -using WCTDataMiner.Data; -using WCTDataMiner.Parsers; -using WCTDataMiner.Services; +using WCTDataMiner.Core.Data; +using WCTDataMiner.Core.Parsers; +using WCTDataMiner.Core.Services; -namespace WCTDataMiner.Extensions; +namespace WCTDataMiner.Core.Extensions; /// /// 服务注册扩展 @@ -51,4 +51,4 @@ public static class ServiceCollectionExtensions return services; } -} \ No newline at end of file +} diff --git a/src/WCTDataMiner/Models/PlossRecord.cs b/src/WCTDataMiner.Core/Models/PlossRecord.cs similarity index 97% rename from src/WCTDataMiner/Models/PlossRecord.cs rename to src/WCTDataMiner.Core/Models/PlossRecord.cs index 556f8e5..161e3e8 100644 --- a/src/WCTDataMiner/Models/PlossRecord.cs +++ b/src/WCTDataMiner.Core/Models/PlossRecord.cs @@ -1,4 +1,4 @@ -namespace WCTDataMiner.Models; +namespace WCTDataMiner.Core.Models; /// /// Ploss记录实体 - 存储Ploss FOD格式解析数据 diff --git a/src/WCTDataMiner/Models/QfodRecord.cs b/src/WCTDataMiner.Core/Models/QfodRecord.cs similarity index 94% rename from src/WCTDataMiner/Models/QfodRecord.cs rename to src/WCTDataMiner.Core/Models/QfodRecord.cs index 87948d7..983b03c 100644 --- a/src/WCTDataMiner/Models/QfodRecord.cs +++ b/src/WCTDataMiner.Core/Models/QfodRecord.cs @@ -1,4 +1,4 @@ -namespace WCTDataMiner.Models; +namespace WCTDataMiner.Core.Models; /// /// Qfod记录实体 - 存储Qfod格式解析数据 diff --git a/src/WCTDataMiner/Models/RxType.cs b/src/WCTDataMiner.Core/Models/RxType.cs similarity index 91% rename from src/WCTDataMiner/Models/RxType.cs rename to src/WCTDataMiner.Core/Models/RxType.cs index 2b16e20..ec15f2e 100644 --- a/src/WCTDataMiner/Models/RxType.cs +++ b/src/WCTDataMiner.Core/Models/RxType.cs @@ -1,4 +1,4 @@ -namespace WCTDataMiner.Models; +namespace WCTDataMiner.Core.Models; /// /// RX类型维度表 diff --git a/src/WCTDataMiner/Models/TestScenario.cs b/src/WCTDataMiner.Core/Models/TestScenario.cs similarity index 96% rename from src/WCTDataMiner/Models/TestScenario.cs rename to src/WCTDataMiner.Core/Models/TestScenario.cs index 859e0ea..dde7190 100644 --- a/src/WCTDataMiner/Models/TestScenario.cs +++ b/src/WCTDataMiner.Core/Models/TestScenario.cs @@ -1,4 +1,4 @@ -namespace WCTDataMiner.Models; +namespace WCTDataMiner.Core.Models; /// /// 测试场景实体 - 通过外键关联各维度表 diff --git a/src/WCTDataMiner/Models/TxHardware.cs b/src/WCTDataMiner.Core/Models/TxHardware.cs similarity index 91% rename from src/WCTDataMiner/Models/TxHardware.cs rename to src/WCTDataMiner.Core/Models/TxHardware.cs index 7e1641a..d6415b3 100644 --- a/src/WCTDataMiner/Models/TxHardware.cs +++ b/src/WCTDataMiner.Core/Models/TxHardware.cs @@ -1,4 +1,4 @@ -namespace WCTDataMiner.Models; +namespace WCTDataMiner.Core.Models; /// /// TX硬件版本维度表 diff --git a/src/WCTDataMiner/Models/TxPanel.cs b/src/WCTDataMiner.Core/Models/TxPanel.cs similarity index 91% rename from src/WCTDataMiner/Models/TxPanel.cs rename to src/WCTDataMiner.Core/Models/TxPanel.cs index d1ba1a7..7635b76 100644 --- a/src/WCTDataMiner/Models/TxPanel.cs +++ b/src/WCTDataMiner.Core/Models/TxPanel.cs @@ -1,4 +1,4 @@ -namespace WCTDataMiner.Models; +namespace WCTDataMiner.Core.Models; /// /// TX面板类型维度表 diff --git a/src/WCTDataMiner/Models/TxSoftware.cs b/src/WCTDataMiner.Core/Models/TxSoftware.cs similarity index 91% rename from src/WCTDataMiner/Models/TxSoftware.cs rename to src/WCTDataMiner.Core/Models/TxSoftware.cs index a3976dc..1c22c8b 100644 --- a/src/WCTDataMiner/Models/TxSoftware.cs +++ b/src/WCTDataMiner.Core/Models/TxSoftware.cs @@ -1,4 +1,4 @@ -namespace WCTDataMiner.Models; +namespace WCTDataMiner.Core.Models; /// /// TX软件版本维度表 diff --git a/src/WCTDataMiner/Parsers/FileNameParser.cs b/src/WCTDataMiner.Core/Parsers/FileNameParser.cs similarity index 98% rename from src/WCTDataMiner/Parsers/FileNameParser.cs rename to src/WCTDataMiner.Core/Parsers/FileNameParser.cs index 86fc74f..27884dd 100644 --- a/src/WCTDataMiner/Parsers/FileNameParser.cs +++ b/src/WCTDataMiner.Core/Parsers/FileNameParser.cs @@ -1,6 +1,6 @@ using System.Globalization; -namespace WCTDataMiner.Parsers; +namespace WCTDataMiner.Core.Parsers; /// /// 文件名解析器 - 从文件名提取场景信息 diff --git a/src/WCTDataMiner/Parsers/IParser.cs b/src/WCTDataMiner.Core/Parsers/IParser.cs similarity index 96% rename from src/WCTDataMiner/Parsers/IParser.cs rename to src/WCTDataMiner.Core/Parsers/IParser.cs index 7910e15..1ccdb4a 100644 --- a/src/WCTDataMiner/Parsers/IParser.cs +++ b/src/WCTDataMiner.Core/Parsers/IParser.cs @@ -1,4 +1,4 @@ -namespace WCTDataMiner.Parsers; +namespace WCTDataMiner.Core.Parsers; /// /// 通用解析器接口 diff --git a/src/WCTDataMiner/Parsers/PlossParser.cs b/src/WCTDataMiner.Core/Parsers/PlossParser.cs similarity index 96% rename from src/WCTDataMiner/Parsers/PlossParser.cs rename to src/WCTDataMiner.Core/Parsers/PlossParser.cs index 55a8a6f..9fb11ed 100644 --- a/src/WCTDataMiner/Parsers/PlossParser.cs +++ b/src/WCTDataMiner.Core/Parsers/PlossParser.cs @@ -1,7 +1,7 @@ using System.Text.RegularExpressions; -using WCTDataMiner.Models; +using WCTDataMiner.Core.Models; -namespace WCTDataMiner.Parsers; +namespace WCTDataMiner.Core.Parsers; /// /// Ploss FOD日志解析器 diff --git a/src/WCTDataMiner/Parsers/QfodParser.cs b/src/WCTDataMiner.Core/Parsers/QfodParser.cs similarity index 95% rename from src/WCTDataMiner/Parsers/QfodParser.cs rename to src/WCTDataMiner.Core/Parsers/QfodParser.cs index 90d2b0d..c85e31c 100644 --- a/src/WCTDataMiner/Parsers/QfodParser.cs +++ b/src/WCTDataMiner.Core/Parsers/QfodParser.cs @@ -1,7 +1,7 @@ using System.Text.RegularExpressions; -using WCTDataMiner.Models; +using WCTDataMiner.Core.Models; -namespace WCTDataMiner.Parsers; +namespace WCTDataMiner.Core.Parsers; /// /// Qfod日志解析器 diff --git a/src/WCTDataMiner/Services/CleanService.cs b/src/WCTDataMiner.Core/Services/CleanService.cs similarity index 95% rename from src/WCTDataMiner/Services/CleanService.cs rename to src/WCTDataMiner.Core/Services/CleanService.cs index 2a15bec..68fd667 100644 --- a/src/WCTDataMiner/Services/CleanService.cs +++ b/src/WCTDataMiner.Core/Services/CleanService.cs @@ -1,8 +1,8 @@ using Microsoft.EntityFrameworkCore; -using WCTDataMiner.Data; -using WCTDataMiner.Models; +using WCTDataMiner.Core.Data; +using WCTDataMiner.Core.Models; -namespace WCTDataMiner.Services; +namespace WCTDataMiner.Core.Services; /// /// 数据清理服务 - 支持软删除 diff --git a/src/WCTDataMiner/Services/DimensionService.cs b/src/WCTDataMiner.Core/Services/DimensionService.cs similarity index 95% rename from src/WCTDataMiner/Services/DimensionService.cs rename to src/WCTDataMiner.Core/Services/DimensionService.cs index 0aada21..5bdf9d9 100644 --- a/src/WCTDataMiner/Services/DimensionService.cs +++ b/src/WCTDataMiner.Core/Services/DimensionService.cs @@ -1,8 +1,8 @@ using Microsoft.EntityFrameworkCore; -using WCTDataMiner.Data; -using WCTDataMiner.Models; +using WCTDataMiner.Core.Data; +using WCTDataMiner.Core.Models; -namespace WCTDataMiner.Services; +namespace WCTDataMiner.Core.Services; /// /// 维度表管理服务 - 负责维度表的CRUD操作 diff --git a/src/WCTDataMiner/Services/ExportService.cs b/src/WCTDataMiner.Core/Services/ExportService.cs similarity index 98% rename from src/WCTDataMiner/Services/ExportService.cs rename to src/WCTDataMiner.Core/Services/ExportService.cs index f6f4a0f..e33da3f 100644 --- a/src/WCTDataMiner/Services/ExportService.cs +++ b/src/WCTDataMiner.Core/Services/ExportService.cs @@ -2,10 +2,10 @@ using System.Globalization; using System.Text; using System.Text.Json; using Microsoft.EntityFrameworkCore; -using WCTDataMiner.Data; -using WCTDataMiner.Models; +using WCTDataMiner.Core.Data; +using WCTDataMiner.Core.Models; -namespace WCTDataMiner.Services; +namespace WCTDataMiner.Core.Services; /// /// 数据导出服务 diff --git a/src/WCTDataMiner/Services/ParseService.cs b/src/WCTDataMiner.Core/Services/ParseService.cs similarity index 84% rename from src/WCTDataMiner/Services/ParseService.cs rename to src/WCTDataMiner.Core/Services/ParseService.cs index f031fdf..9a11bf2 100644 --- a/src/WCTDataMiner/Services/ParseService.cs +++ b/src/WCTDataMiner.Core/Services/ParseService.cs @@ -1,11 +1,11 @@ using Microsoft.EntityFrameworkCore; using Microsoft.Extensions.Configuration; -using Serilog; -using WCTDataMiner.Data; -using WCTDataMiner.Models; -using WCTDataMiner.Parsers; +using Microsoft.Extensions.Logging; +using WCTDataMiner.Core.Data; +using WCTDataMiner.Core.Models; +using WCTDataMiner.Core.Parsers; -namespace WCTDataMiner.Services; +namespace WCTDataMiner.Core.Services; /// /// 解析流程协调服务 - 协调文件名解析、行解析、批量写入 @@ -17,6 +17,7 @@ public class ParseService private readonly QfodParser _qfodParser; private readonly PlossParser _plossParser; private readonly FileNameParser _fileNameParser; + private readonly ILogger _logger; private readonly int _batchSize; public ParseService( @@ -25,13 +26,15 @@ public class ParseService QfodParser qfodParser, PlossParser plossParser, FileNameParser fileNameParser, - IConfiguration config) + IConfiguration config, + ILogger logger) { _context = context; _scenarioService = scenarioService; _qfodParser = qfodParser; _plossParser = plossParser; _fileNameParser = fileNameParser; + _logger = logger; _batchSize = config.GetValue("Parser:BatchSize", 1000); } @@ -44,7 +47,7 @@ public class ParseService if (!fileInfo.Exists) { - Log.Error("文件不存在: {FilePath}", filePath); + _logger.LogError("文件不存在: {FilePath}", filePath); return new ParseReport(fileInfo.Name, 0, 0, 0, "文件不存在"); } @@ -52,11 +55,11 @@ public class ParseService var scenarioInfo = _fileNameParser.Parse(fileInfo.Name); if (scenarioInfo == null) { - Log.Error("无法解析文件名: {FileName}", fileInfo.Name); + _logger.LogError("无法解析文件名: {FileName}", fileInfo.Name); return new ParseReport(fileInfo.Name, 0, 0, 1, "文件名格式不匹配"); } - Log.Information("解析文件: {FileName} => 场景: {TxPanel}/{TxHardware}/{TxSoftware}/{RxType}/{TestDate}", + _logger.LogInformation("解析文件: {FileName} => 场景: {TxPanel}/{TxHardware}/{TxSoftware}/{RxType}/{TestDate}", fileInfo.Name, scenarioInfo.TxPanel, scenarioInfo.TxHardware, scenarioInfo.TxSoftware, scenarioInfo.RxType, scenarioInfo.TestDate); @@ -82,7 +85,7 @@ public class ParseService qfodRecords.Add(result.Record!); else { - Log.Error("Qfod解析失败 [{Line}] {Error}: {Message}", + _logger.LogError("Qfod解析失败 [{Line}] {Error}: {Message}", lineNumber, result.ErrorType, result.ErrorMessage); errorCount++; } @@ -94,7 +97,7 @@ public class ParseService plossRecords.Add(result.Record!); else { - Log.Error("Ploss解析失败 [{Line}] {Error}: {Message}", + _logger.LogError("Ploss解析失败 [{Line}] {Error}: {Message}", lineNumber, result.ErrorType, result.ErrorMessage); errorCount++; } @@ -107,7 +110,7 @@ public class ParseService // 更新场景统计 await UpdateScenarioStatsAsync(scenario.Id, qfodRecords.Count, plossRecords.Count); - Log.Information("解析完成: {FileName} => Qfod: {QfodCount}, Ploss: {PlossCount}, Errors: {ErrorCount}", + _logger.LogInformation("解析完成: {FileName} => Qfod: {QfodCount}, Ploss: {PlossCount}, Errors: {ErrorCount}", fileInfo.Name, qfodRecords.Count, plossRecords.Count, errorCount); return new ParseReport(fileInfo.Name, qfodRecords.Count, plossRecords.Count, errorCount, null); @@ -121,14 +124,14 @@ public class ParseService var dirInfo = new DirectoryInfo(dirPath); if (!dirInfo.Exists) { - Log.Error("目录不存在: {DirPath}", dirPath); + _logger.LogError("目录不存在: {DirPath}", dirPath); return [new ParseReport(dirPath, 0, 0, 0, "目录不存在")]; } var searchOption = recursive ? SearchOption.AllDirectories : SearchOption.TopDirectoryOnly; var logFiles = dirInfo.GetFiles("*.log", searchOption); - Log.Information("发现 {FileCount} 个日志文件", logFiles.Length); + _logger.LogInformation("发现 {FileCount} 个日志文件", logFiles.Length); var reports = new List(); foreach (var file in logFiles) diff --git a/src/WCTDataMiner/Services/ScenarioService.cs b/src/WCTDataMiner.Core/Services/ScenarioService.cs similarity index 94% rename from src/WCTDataMiner/Services/ScenarioService.cs rename to src/WCTDataMiner.Core/Services/ScenarioService.cs index a3bfa77..ee8fc98 100644 --- a/src/WCTDataMiner/Services/ScenarioService.cs +++ b/src/WCTDataMiner.Core/Services/ScenarioService.cs @@ -1,9 +1,9 @@ using Microsoft.EntityFrameworkCore; -using WCTDataMiner.Data; -using WCTDataMiner.Models; -using WCTDataMiner.Parsers; +using WCTDataMiner.Core.Data; +using WCTDataMiner.Core.Models; +using WCTDataMiner.Core.Parsers; -namespace WCTDataMiner.Services; +namespace WCTDataMiner.Core.Services; /// /// 测试场景服务 - 负责测试场景的创建和查询 diff --git a/src/WCTDataMiner/Services/StatsService.cs b/src/WCTDataMiner.Core/Services/StatsService.cs similarity index 97% rename from src/WCTDataMiner/Services/StatsService.cs rename to src/WCTDataMiner.Core/Services/StatsService.cs index 6cfd31c..8e12b2e 100644 --- a/src/WCTDataMiner/Services/StatsService.cs +++ b/src/WCTDataMiner.Core/Services/StatsService.cs @@ -1,8 +1,8 @@ using Microsoft.EntityFrameworkCore; -using WCTDataMiner.Data; -using WCTDataMiner.Models; +using WCTDataMiner.Core.Data; +using WCTDataMiner.Core.Models; -namespace WCTDataMiner.Services; +namespace WCTDataMiner.Core.Services; /// /// 统计查询服务 diff --git a/src/WCTDataMiner/Services/ThresholdCalculator.cs b/src/WCTDataMiner.Core/Services/ThresholdCalculator.cs similarity index 97% rename from src/WCTDataMiner/Services/ThresholdCalculator.cs rename to src/WCTDataMiner.Core/Services/ThresholdCalculator.cs index a599907..de3d227 100644 --- a/src/WCTDataMiner/Services/ThresholdCalculator.cs +++ b/src/WCTDataMiner.Core/Services/ThresholdCalculator.cs @@ -1,4 +1,4 @@ -namespace WCTDataMiner.Services; +namespace WCTDataMiner.Core.Services; /// /// 阈值计算器 - 根据接收功率查表获取动态阈值 diff --git a/src/WCTDataMiner.Core/WCTDataMiner.Core.csproj b/src/WCTDataMiner.Core/WCTDataMiner.Core.csproj new file mode 100644 index 0000000..a0bbb19 --- /dev/null +++ b/src/WCTDataMiner.Core/WCTDataMiner.Core.csproj @@ -0,0 +1,23 @@ + + + + net8.0 + enable + enable + 12.0 + + + + + + + + + + + + + + + + diff --git a/src/WCTDataMiner.Wpf/App.xaml b/src/WCTDataMiner.Wpf/App.xaml new file mode 100644 index 0000000..ebfa722 --- /dev/null +++ b/src/WCTDataMiner.Wpf/App.xaml @@ -0,0 +1,8 @@ + + + + + \ No newline at end of file diff --git a/src/WCTDataMiner.Wpf/App.xaml.cs b/src/WCTDataMiner.Wpf/App.xaml.cs new file mode 100644 index 0000000..be0ab14 --- /dev/null +++ b/src/WCTDataMiner.Wpf/App.xaml.cs @@ -0,0 +1,52 @@ +using System.Windows; +using Microsoft.Extensions.DependencyInjection; +using Microsoft.Extensions.Hosting; +using WCTDataMiner.Core.Extensions; +using WCTDataMiner.Core.Services; +using WCTDataMiner.Wpf.ViewModels; +using WCTDataMiner.Wpf.Views; + +namespace WCTDataMiner.Wpf; + +/// +/// Interaction logic for App.xaml +/// +public partial class App : Application +{ + private IHost? _host; + + protected override void OnStartup(StartupEventArgs e) + { + _host = Host.CreateDefaultBuilder() + .ConfigureServices((context, services) => + { + // 注册 Core 层服务 + services.AddDatabaseServices(context.Configuration); + services.AddApplicationServices(); + + // 注册 ViewModels + services.AddTransient(); + services.AddTransient(); + services.AddTransient(); + services.AddTransient(); + + // 注册 Views + services.AddTransient(); + services.AddTransient(); + services.AddTransient(); + services.AddTransient(); + }) + .Build(); + + var mainWindow = _host.Services.GetRequiredService(); + mainWindow.Show(); + + base.OnStartup(e); + } + + protected override void OnExit(ExitEventArgs e) + { + _host?.Dispose(); + base.OnExit(e); + } +} \ No newline at end of file diff --git a/src/WCTDataMiner.Wpf/AssemblyInfo.cs b/src/WCTDataMiner.Wpf/AssemblyInfo.cs new file mode 100644 index 0000000..cc29e7f --- /dev/null +++ b/src/WCTDataMiner.Wpf/AssemblyInfo.cs @@ -0,0 +1,10 @@ +using System.Windows; + +[assembly:ThemeInfo( + ResourceDictionaryLocation.None, //where theme specific resource dictionaries are located + //(used if a resource is not found in the page, + // or application resource dictionaries) + ResourceDictionaryLocation.SourceAssembly //where the generic resource dictionary is located + //(used if a resource is not found in the page, + // app, or any theme specific resource dictionaries) +)] diff --git a/src/WCTDataMiner.Wpf/MainWindow.xaml b/src/WCTDataMiner.Wpf/MainWindow.xaml new file mode 100644 index 0000000..a7f7e16 --- /dev/null +++ b/src/WCTDataMiner.Wpf/MainWindow.xaml @@ -0,0 +1,66 @@ + + + + + + + + + + + + + + + + +