重载加载数据代码

This commit is contained in:
2025-09-09 17:47:20 +08:00
parent e92f5dac5d
commit ddfb124204
5 changed files with 110 additions and 97 deletions

View File

@@ -39,4 +39,9 @@ public interface IAppDataStorageService
/// 安全字典,用于存储所有日志数据 /// 安全字典,用于存储所有日志数据
/// </summary> /// </summary>
ConcurrentDictionary<int, NlogDto> Nlogs { get; } ConcurrentDictionary<int, NlogDto> Nlogs { get; }
/// <summary>
/// 安全字典用于存储所有MQTT变量别名的数据
/// </summary>
ConcurrentDictionary<int, VariableMqttAliasDto> VariableMqttAliases { get; }
} }

View File

@@ -17,32 +17,32 @@ public interface IDataLoaderService
/// <summary> /// <summary>
/// 异步加载所有设备数据 /// 异步加载所有设备数据
/// </summary> /// </summary>
Task<List<DeviceDto>> LoadAllDevicesAsync(); Task LoadAllDevicesAsync();
/// <summary> /// <summary>
/// 异步加载所有变量表数据 /// 异步加载所有变量表数据
/// </summary> /// </summary>
Task<List<VariableTableDto>> LoadAllVariableTablesAsync(); Task LoadAllVariableTablesAsync();
/// <summary> /// <summary>
/// 异步加载所有变量数据 /// 异步加载所有变量数据
/// </summary> /// </summary>
Task<List<VariableDto>> LoadAllVariablesAsync(); Task LoadAllVariablesAsync();
/// <summary> /// <summary>
/// 异步加载所有菜单数据 /// 异步加载所有菜单数据
/// </summary> /// </summary>
Task<List<MenuBeanDto>> LoadAllMenusAsync(); Task LoadAllMenusAsync();
/// <summary> /// <summary>
/// 异步加载所有MQTT服务器数据 /// 异步加载所有MQTT服务器数据
/// </summary> /// </summary>
Task<List<MqttServerDto>> LoadAllMqttServersAsync(); Task LoadAllMqttServersAsync();
/// <summary> /// <summary>
/// 异步加载所有日志数据 /// 异步加载所有日志数据
/// </summary> /// </summary>
Task<List<NlogDto>> LoadAllNlogsAsync(int count); Task LoadAllNlogsAsync(int count);
/// <summary> /// <summary>
/// 当数据加载完成时触发 /// 当数据加载完成时触发

View File

@@ -35,6 +35,12 @@ public class AppDataStorageService : IAppDataStorageService
/// 安全字典用于存储所有MQTT服务器数据 /// 安全字典用于存储所有MQTT服务器数据
/// </summary> /// </summary>
public ConcurrentDictionary<int, MqttServerDto> MqttServers { get; } = new(); public ConcurrentDictionary<int, MqttServerDto> MqttServers { get; } = new();
/// <summary>
/// 安全字典用于存储所有MQTT变量别名的数据
/// </summary>
public ConcurrentDictionary<int, VariableMqttAliasDto> VariableMqttAliases { get; } = new();
/// <summary> /// <summary>
/// 安全字典,用于存储所有日志数据 /// 安全字典,用于存储所有日志数据

View File

@@ -21,12 +21,13 @@ public class DataLoaderService : IDataLoaderService
private readonly IMenuService _menuService; private readonly IMenuService _menuService;
private readonly IMqttAppService _mqttAppService; private readonly IMqttAppService _mqttAppService;
private readonly INlogAppService _nlogAppService; private readonly INlogAppService _nlogAppService;
/// <summary> /// <summary>
/// 当数据加载完成时触发 /// 当数据加载完成时触发
/// </summary> /// </summary>
public event EventHandler<DataLoadCompletedEventArgs> OnLoadDataCompleted; public event EventHandler<DataLoadCompletedEventArgs> OnLoadDataCompleted;
public const int LoadLogCount =100;
public DataLoaderService( public DataLoaderService(
IRepositoryManager repositoryManager, IRepositoryManager repositoryManager,
IMapper mapper, IMapper mapper,
@@ -50,149 +51,148 @@ public class DataLoaderService : IDataLoaderService
} }
/// <summary> /// <summary>
/// 异步加载所有设备及其关联数据到内存中 /// 异步加载所有设备及其关联数据到内存中
/// </summary> /// </summary>
public async Task LoadAllDataToMemoryAsync() public async Task LoadAllDataToMemoryAsync()
{ {
// 清空现有数据
_appDataStorageService.Devices.Clear();
_appDataStorageService.VariableTables.Clear();
_appDataStorageService.Variables.Clear();
_appDataStorageService.Menus.Clear();
_appDataStorageService.MenuTrees.Clear();
_appDataStorageService.MqttServers.Clear();
_appDataStorageService.Nlogs.Clear();
// 加载所有设备 await LoadAllDevicesAsync();
var deviceDtos = await LoadAllDevicesAsync();
// 加载所有变量表 await LoadAllVariableTablesAsync();
var variableTableDtos = await LoadAllVariableTablesAsync();
// 加载所有变量
var variableDtos = await LoadAllVariablesAsync();
await LoadAllVariablesAsync();
// 加载所有菜单 // 加载所有菜单
var menuDtos = await LoadAllMenusAsync(); await LoadAllMenusAsync();
// 加载所有MQTT服务器 // 加载所有MQTT服务器
var mqttServerDtos = await LoadAllMqttServersAsync(); await LoadAllMqttServersAsync();
// 加载所有日志 // 加载所有日志
var nlogDtos = await LoadAllNlogsAsync(100); await LoadAllNlogsAsync(LoadLogCount);
// 获取变量MQTT别名 // 获取变量MQTT别名
await LoadAllVariableMqttAliases();
OnLoadDataCompleted?.Invoke(this, new DataLoadCompletedEventArgs(true, "数据加载成功"));
}
private async Task LoadAllVariableMqttAliases()
{
var variableMqttAliases = await _repositoryManager.VariableMqttAliases.GetAllAsync(); var variableMqttAliases = await _repositoryManager.VariableMqttAliases.GetAllAsync();
var variableMqttAliasDtos = _mapper.Map<IEnumerable<VariableMqttAliasDto>>(variableMqttAliases);
// 建立设备与变量表的关联 foreach (var variableMqttAliasDto in variableMqttAliasDtos)
foreach (var deviceDto in deviceDtos) {
{ _appDataStorageService.VariableMqttAliases.TryAdd(variableMqttAliasDto.Id, variableMqttAliasDto);
deviceDto.VariableTables = variableTableDtos }
.Where(vt => vt.DeviceId == deviceDto.Id)
.ToList();
// 将设备添加到安全字典
_appDataStorageService.Devices.TryAdd(deviceDto.Id, deviceDto);
}
// 建立变量表与变量的关联
foreach (var variableTableDto in variableTableDtos)
{
variableTableDto.Variables = variableDtos
.Where(v => v.VariableTableId == variableTableDto.Id)
.ToList();
if (_appDataStorageService.Devices.TryGetValue(variableTableDto.DeviceId, out var deviceDto))
{
variableTableDto.Device = deviceDto;
}
// 将变量表添加到安全字典
_appDataStorageService.VariableTables.TryAdd(variableTableDto.Id, variableTableDto);
}
// 加载MQTT服务器数据到内存
foreach (var mqttServerDto in mqttServerDtos)
{
_appDataStorageService.MqttServers.TryAdd(mqttServerDto.Id, mqttServerDto);
}
// 加载日志数据到内存
foreach (var nlogDto in nlogDtos)
{
_appDataStorageService.Nlogs.TryAdd(nlogDto.Id, nlogDto);
}
// 将变量添加到安全字典
foreach (var variableDto in variableDtos)
{
if (_appDataStorageService.VariableTables.TryGetValue(variableDto.VariableTableId, out var variableTableDto))
{
variableDto.VariableTable = variableTableDto;
}
_appDataStorageService.Variables.TryAdd(variableDto.Id, variableDto);
}
// 将菜单添加到安全字典
foreach (var menuDto in menuDtos)
{
_appDataStorageService.Menus.TryAdd(menuDto.Id, menuDto);
}
OnLoadDataCompleted?.Invoke(this,new DataLoadCompletedEventArgs(true,"数据加载成功"));
} }
/// <summary> /// <summary>
/// 异步加载所有设备数据 /// 异步加载所有设备数据
/// </summary> /// </summary>
public async Task<List<DeviceDto>> LoadAllDevicesAsync() public async Task LoadAllDevicesAsync()
{ {
_appDataStorageService.Devices.Clear();
var devices = await _repositoryManager.Devices.GetAllAsync(); var devices = await _repositoryManager.Devices.GetAllAsync();
return _mapper.Map<List<DeviceDto>>(devices); var devicesDtos = _mapper.Map<List<DeviceDto>>(devices);
// 建立设备与变量表的关联
foreach (var deviceDto in devicesDtos)
{
// 将设备添加到安全字典
_appDataStorageService.Devices.TryAdd(deviceDto.Id, deviceDto);
}
} }
/// <summary> /// <summary>
/// 异步加载所有变量表数据 /// 异步加载所有变量表数据
/// </summary> /// </summary>
public async Task<List<VariableTableDto>> LoadAllVariableTablesAsync() public async Task LoadAllVariableTablesAsync()
{ {
_appDataStorageService.VariableTables.Clear();
var variableTables = await _repositoryManager.VariableTables.GetAllAsync(); var variableTables = await _repositoryManager.VariableTables.GetAllAsync();
return _mapper.Map<List<VariableTableDto>>(variableTables); var variableTableDtos = _mapper.Map<List<VariableTableDto>>(variableTables);
// 建立变量表与变量的关联
foreach (var variableTableDto in variableTableDtos)
{
if (_appDataStorageService.Devices.TryGetValue(variableTableDto.DeviceId, out var deviceDto))
{
variableTableDto.Device = deviceDto;
variableTableDto.Device.VariableTables.Add(variableTableDto);
}
// 将变量表添加到安全字典
_appDataStorageService.VariableTables.TryAdd(variableTableDto.Id, variableTableDto);
}
} }
/// <summary> /// <summary>
/// 异步加载所有变量数据 /// 异步加载所有变量数据
/// </summary> /// </summary>
public async Task<List<VariableDto>> LoadAllVariablesAsync() public async Task LoadAllVariablesAsync()
{ {
_appDataStorageService.Variables.Clear();
var variables = await _repositoryManager.Variables.GetAllAsync(); var variables = await _repositoryManager.Variables.GetAllAsync();
return _mapper.Map<List<VariableDto>>(variables); var variableDtos = _mapper.Map<List<VariableDto>>(variables);
// 将变量添加到安全字典
foreach (var variableDto in variableDtos)
{
if (_appDataStorageService.VariableTables.TryGetValue(variableDto.VariableTableId,
out var variableTableDto))
{
variableDto.VariableTable = variableTableDto;
variableDto.VariableTable.Variables.Add(variableDto);
}
_appDataStorageService.Variables.TryAdd(variableDto.Id, variableDto);
}
} }
/// <summary> /// <summary>
/// 异步加载所有菜单数据 /// 异步加载所有菜单数据
/// </summary> /// </summary>
public async Task<List<MenuBeanDto>> LoadAllMenusAsync() public async Task LoadAllMenusAsync()
{ {
_appDataStorageService.Menus.Clear();
_appDataStorageService.MenuTrees.Clear();
var menus = await _repositoryManager.Menus.GetAllAsync(); var menus = await _repositoryManager.Menus.GetAllAsync();
return _mapper.Map<List<MenuBeanDto>>(menus); var menuDtos = _mapper.Map<List<MenuBeanDto>>(menus);
// 将菜单添加到安全字典
foreach (var menuDto in menuDtos)
{
_appDataStorageService.Menus.TryAdd(menuDto.Id, menuDto);
}
} }
/// <summary> /// <summary>
/// 异步加载所有MQTT服务器数据 /// 异步加载所有MQTT服务器数据
/// </summary> /// </summary>
public async Task<List<MqttServerDto>> LoadAllMqttServersAsync() public async Task LoadAllMqttServersAsync()
{ {
return await _mqttAppService.GetAllMqttServersAsync(); _appDataStorageService.MqttServers.Clear();
var mqttServerDtos =await _mqttAppService.GetAllMqttServersAsync();
// 加载MQTT服务器数据到内存
foreach (var mqttServerDto in mqttServerDtos)
{
_appDataStorageService.MqttServers.TryAdd(mqttServerDto.Id, mqttServerDto);
}
} }
/// <summary> /// <summary>
/// 异步加载所有日志数据 /// 异步加载所有日志数据
/// </summary> /// </summary>
public async Task<List<NlogDto>> LoadAllNlogsAsync(int count) public async Task LoadAllNlogsAsync(int count)
{ {
return await _nlogAppService.GetLatestLogsAsync(count); _appDataStorageService.Nlogs.Clear();
var nlogDtos =await _nlogAppService.GetLatestLogsAsync(count);
// 加载日志数据到内存
foreach (var nlogDto in nlogDtos)
{
_appDataStorageService.Nlogs.TryAdd(nlogDto.Id, nlogDto);
}
} }
} }

View File

@@ -3,15 +3,17 @@
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
xmlns:d="http://schemas.microsoft.com/expression/blend/2008" xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006" xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
xmlns:vm="clr-namespace:DMS.WPF.ViewModels"
d:DataContext="{d:DesignInstance vm:SplashViewModel}"
xmlns:local="clr-namespace:DMS.WPF.Views" xmlns:local="clr-namespace:DMS.WPF.Views"
mc:Ignorable="d" mc:Ignorable="d"
Title="SplashWindow" Height="400" Width="600" Title="正在启动..." Height="400" Width="600"
WindowStyle="None" WindowStartupLocation="CenterScreen" AllowsTransparency="True" Background="Transparent"> WindowStyle="None" WindowStartupLocation="CenterScreen" AllowsTransparency="True" Background="Transparent">
<Grid> <Grid>
<Border CornerRadius="10" Background="#FF333333"> <Border CornerRadius="10" Background="#FF333333">
<StackPanel VerticalAlignment="Center" HorizontalAlignment="Center"> <StackPanel VerticalAlignment="Center" HorizontalAlignment="Center">
<Image Source="/Assets/AppIcon2.ico" Width="100" Height="100"/> <Image Source="/Assets/AppIcon2.ico" Width="100" Height="100"/>
<TextBlock Text="{Binding LoadingMessage}" Foreground="White" FontSize="16" Margin="0,20,0,0"/> <TextBlock VerticalAlignment="Center" TextWrapping="Wrap" MaxWidth="500" Text="{Binding LoadingMessage}" Foreground="White" FontSize="16" Margin="0,20,0,0"/>
</StackPanel> </StackPanel>
</Border> </Border>
</Grid> </Grid>