完整 SQLite 系统设置仓储 波形更新机制

发布时间:2026/7/12 20:41:53
完整 SQLite 系统设置仓储 波形更新机制 1.完整 SQLite 系统设置仓储SystemSettingsRepository.cs// MaxWell.Repository/SystemSettingsRepository.csusingSystem;usingSystem.Threading.Tasks;usingMicrosoft.Data.Sqlite;usingDapper;usingMaxWell.Models;usinglog4net;namespaceMaxWell.Repository;publicclassSystemSettingsRepository:ISystemSettingsRepository{privatereadonlystring_connectionString;privatestaticreadonlyILog_loggerLogManager.GetLogger(Repository.Settings);publicSystemSettingsRepository(stringdbPathnull){varpathdbPath??Path.Combine(AppDomain.CurrentDomain.BaseDirectory,Data,SystemSettings.db);Directory.CreateDirectory(Path.GetDirectoryName(path)!);_connectionString$Data Source{path};CacheShared;Journal ModeWAL;;InitializeDatabase();}privatevoidInitializeDatabase(){usingvarconnnewSqliteConnection(_connectionString);conn.Open();conststringsql CREATE TABLE IF NOT EXISTS SystemSettings ( Id INTEGER PRIMARY KEY, Key TEXT UNIQUE NOT NULL, Value TEXT, Description TEXT, UpdateTime DATETIME DEFAULT CURRENT_TIMESTAMP );;conn.Execute(sql);}publicasyncTaskSaveSettingAsync(stringkey,stringvalue,stringdescriptionnull){usingvarconnnewSqliteConnection(_connectionString);conststringsql INSERT INTO SystemSettings (Key, Value, Description) VALUES (Key, Value, Description) ON CONFLICT(Key) DO UPDATE SET Value excluded.Value, Description excluded.Description, UpdateTime CURRENT_TIMESTAMP;awaitconn.ExecuteAsync(sql,new{Keykey,Valuevalue,Descriptiondescription});}publicasyncTaskstringGetSettingAsync(stringkey,stringdefaultValue){usingvarconnnewSqliteConnection(_connectionString);conststringsqlSELECT Value FROM SystemSettings WHERE Key Key;varvalueawaitconn.QueryFirstOrDefaultAsyncstring(sql,new{Keykey});returnvalue??defaultValue;}publicasyncTaskSystemSettingsLoadAllAsync(){varsettingsnewSystemSettings();usingvarconnnewSqliteConnection(_connectionString);conststringsqlSELECT Key, Value FROM SystemSettings;vardict(awaitconn.QueryAsync(stringKey,stringValue)(sql)).ToDictionary(xx.Key,xx.Value);settings.RecipePathdict.GetValueOrDefault(RecipePath,/D/Maxwell-Pro/Recipes);settings.RecordDataPathdict.GetValueOrDefault(RecordDataPath,/D/RecordData);settings.VendorCodedict.GetValueOrDefault(VendorCode,YX);settings.CustomerCodedict.GetValueOrDefault(CustomerCode,泰山);returnsettings;}publicasyncTaskSaveAllAsync(SystemSettingssettings){awaitTask.WhenAll(SaveSettingAsync(RecipePath,settings.RecipePath),SaveSettingAsync(RecordDataPath,settings.RecordDataPath),SaveSettingAsync(VendorCode,settings.VendorCode),SaveSettingAsync(CustomerCode,settings.CustomerCode));}}2.StationViewModel 实时数据绑定// MaxWell.ViewModels/StationViewModel.csusingCommunityToolkit.Mvvm.ComponentModel;usingCommunityToolkit.Mvvm.Input;usingMaxWell.Interface;usingMaxWell.Models;usingPrism.Events;usingSystem;usingSystem.Collections.ObjectModel;usingSystem.Threading.Tasks;namespaceMaxWell.ViewModels;publicpartialclassStationViewModel:ObservableObject{privatereadonlyITestService_testService;privatereadonlyIEventAggregator_eventAggregator;publicstringStationId{get;}publicstringStationName{get;}[ObservableProperty]privatestringstatusOffline;[ObservableProperty]privatestringstatusColor#95A5A6;[ObservableProperty]privatestringcloseButtonText关闭;[ObservableProperty]privateboolisTesting;// 实时数据绑定[ObservableProperty]privatestringcurrent0.0 A;[ObservableProperty]privatestringvoltage0.0 V;[ObservableProperty]privatestringtemperature46.8 °C;[ObservableProperty]privatestringflowRate0.0 L/min;publicObservableCollectionRealtimeDataPointWaveformData{get;}new();publicIAsyncRelayCommandStartTestCommand{get;}publicIAsyncRelayCommandStopTestCommand{get;}publicStationViewModel(stringstationId,ITestServicetestService,IEventAggregatoreventAggregator){StationIdstationId;StationName${stationId}站;_testServicetestService;_eventAggregatoreventAggregator;StartTestCommandnewAsyncRelayCommand(StartTestAsync);StopTestCommandnewAsyncRelayCommand(StopTestAsync);// 订阅实时数据事件_eventAggregator.GetEventRealtimeDataEvent().Subscribe(OnRealtimeDataReceived);}privateasyncTaskStartTestAsync(){await_testService.StartTestAsync();IsTestingtrue;StatusTesting;StatusColor#27AE60;}privateasyncTaskStopTestAsync(){await_testService.StopTestAsync();IsTestingfalse;StatusIdle;StatusColor#3498DB;}privatevoidOnRealtimeDataReceived(RealtimeDatadata){if(data.StationId!StationId)return;Current${data.Current:F1}A;Voltage${data.Voltage:F1}V;Temperature${data.Temperature:F1}°C;FlowRate${data.FlowRate:F1}L/min;// 更新波形数据保留最近200点WaveformData.Add(newRealtimeDataPoint{TimeDateTime.Now,Valuedata.Current});if(WaveformData.Count200)WaveformData.RemoveAt(0);}}3.波形更新机制OxyPlot EventAggregator事件定义// MaxWell.Common/Events/RealtimeDataEvent.csusingPrism.Events;usingMaxWell.Models;publicclassRealtimeDataEvent:PubSubEventRealtimeData{}publicclassRealtimeData{publicstringStationId{get;set;};publicdoubleCurrent{get;set;}publicdoubleVoltage{get;set;}publicdoubleTemperature{get;set;}publicdoubleFlowRate{get;set;}publicDateTimeTimestamp{get;set;}DateTime.Now;}publicclassRealtimeDataPoint{publicDateTimeTime{get;set;}publicdoubleValue{get;set;}}在 TestService 中发布数据// TestService.cs 中 TestLoopAsync 内添加varrealtimeDatanewRealtimeData{StationId_stationId,CurrentConvert.ToDouble(loadData.Data??0),Temperature46.8newRandom().NextDouble()*2,FlowRate12.5};_eventAggregator.GetEventRealtimeDataEvent().Publish(realtimeData);注册App.xaml.cscontainerRegistry.RegisterSingletonITestServiceFactory,TestServiceFactory();containerRegistry.RegisterSingletonIEventAggregator,EventAggregator();// Prism 自带使用总结ConfigurationService加载所有配置文件SystemSettingsRepository持久化系统设置StationViewModel实现实时数据绑定 波形TestService驱动测试流程