using AutoMapper;
using DMS.Application.DTOs;
using DMS.Application.Interfaces;
using DMS.Core.Interfaces;
using System.Collections.Concurrent;
using DMS.Application.DTOs.Events;
namespace DMS.Application.Services;
///
/// 数据加载服务,负责从数据源加载数据到内存中
///
public class DataLoaderService : IDataLoaderService
{
private readonly IRepositoryManager _repositoryManager;
private readonly IMapper _mapper;
private readonly IAppDataStorageService _appDataStorageService;
private readonly IDeviceAppService _deviceAppService;
private readonly IVariableTableAppService _variableTableAppService;
private readonly IVariableAppService _variableAppService;
private readonly IMenuService _menuService;
private readonly IMqttAppService _mqttAppService;
private readonly INlogAppService _nlogAppService;
///
/// 当数据加载完成时触发
///
public event EventHandler OnLoadDataCompleted;
public DataLoaderService(
IRepositoryManager repositoryManager,
IMapper mapper,
IAppDataStorageService appDataStorageService,
IDeviceAppService deviceAppService,
IVariableTableAppService variableTableAppService,
IVariableAppService variableAppService,
IMenuService menuService,
IMqttAppService mqttAppService,
INlogAppService nlogAppService)
{
_repositoryManager = repositoryManager;
_mapper = mapper;
_appDataStorageService = appDataStorageService;
_deviceAppService = deviceAppService;
_variableTableAppService = variableTableAppService;
_variableAppService = variableAppService;
_menuService = menuService;
_mqttAppService = mqttAppService;
_nlogAppService = nlogAppService;
}
///
/// 异步加载所有设备及其关联数据到内存中
///
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();
// 加载所有设备
var deviceDtos = await LoadAllDevicesAsync();
// 加载所有变量表
var variableTableDtos = await LoadAllVariableTablesAsync();
// 加载所有变量
var variableDtos = await LoadAllVariablesAsync();
// 加载所有菜单
var menuDtos = await LoadAllMenusAsync();
// 加载所有MQTT服务器
var mqttServerDtos = await LoadAllMqttServersAsync();
// 加载所有日志
var nlogDtos = await LoadAllNlogsAsync();
// 获取变量MQTT别名
var variableMqttAliases = await _repositoryManager.VariableMqttAliases.GetAllAsync();
// 建立设备与变量表的关联
foreach (var deviceDto in deviceDtos)
{
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,"数据加载成功"));
}
///
/// 异步加载所有设备数据
///
public async Task> LoadAllDevicesAsync()
{
var devices = await _repositoryManager.Devices.GetAllAsync();
return _mapper.Map>(devices);
}
///
/// 异步加载所有变量表数据
///
public async Task> LoadAllVariableTablesAsync()
{
var variableTables = await _repositoryManager.VariableTables.GetAllAsync();
return _mapper.Map>(variableTables);
}
///
/// 异步加载所有变量数据
///
public async Task> LoadAllVariablesAsync()
{
var variables = await _repositoryManager.Variables.GetAllAsync();
return _mapper.Map>(variables);
}
///
/// 异步加载所有菜单数据
///
public async Task> LoadAllMenusAsync()
{
var menus = await _repositoryManager.Menus.GetAllAsync();
return _mapper.Map>(menus);
}
///
/// 异步加载所有MQTT服务器数据
///
public async Task> LoadAllMqttServersAsync()
{
return await _mqttAppService.GetAllMqttServersAsync();
}
///
/// 异步加载所有日志数据
///
public async Task> LoadAllNlogsAsync()
{
return await _nlogAppService.GetAllLogsAsync();
}
}