using AutoMapper; using DMS.Application.DTOs; using DMS.Application.DTOs.Events; using DMS.Core.Models; using DMS.Application.Interfaces; using DMS.Core.Interfaces; using DMS.Core.Models; using DMS.Core.Enums; using System.Collections.Concurrent; using System.Collections.Generic; using System.Threading.Tasks; using System; using System.Linq; namespace DMS.Application.Services; /// /// 数据中心服务,负责管理所有的数据,包括设备、变量表、变量、菜单和日志。 /// 实现 接口。 /// public class DataCenterService : IDataCenterService { private readonly IRepositoryManager _repositoryManager; private readonly IMapper _mapper; // 管理服务 private readonly DeviceManagementService _deviceManagementService; private readonly VariableTableManagementService _variableTableManagementService; private readonly VariableManagementService _variableManagementService; private readonly MenuManagementService _menuManagementService; private readonly MqttManagementService _mqttManagementService; private readonly LogManagementService _logManagementService; /// /// 安全字典,用于存储所有设备数据 /// public ConcurrentDictionary Devices { get; } = new(); /// /// 安全字典,用于存储所有变量表数据 /// public ConcurrentDictionary VariableTables { get; } = new(); /// /// 安全字典,用于存储所有变量数据 /// public ConcurrentDictionary Variables { get; } = new(); /// /// 安全字典,用于存储所有菜单数据 /// public ConcurrentDictionary Menus { get; } = new(); /// /// 安全字典,用于存储所有菜单数据 /// public ConcurrentDictionary MenuTrees { get; } = new(); /// /// 安全字典,用于存储所有MQTT服务器数据 /// public ConcurrentDictionary MqttServers { get; } = new(); /// /// 安全字典,用于存储所有日志数据 /// public ConcurrentDictionary Nlogs { get; } = new(); #region 事件定义 /// /// 当数据加载完成时触发 /// public event EventHandler OnLoadDataCompleted; /// /// 当设备数据发生变化时触发 /// public event EventHandler DeviceChanged; /// /// 当变量表数据发生变化时触发 /// public event EventHandler VariableTableChanged; /// /// 当变量数据发生变化时触发 /// public event EventHandler VariableChanged; /// /// 当菜单数据发生变化时触发 /// public event EventHandler MenuChanged; /// /// 当MQTT服务器数据发生变化时触发 /// public event EventHandler MqttServerChanged; /// /// 当日志数据发生变化时触发 /// public event EventHandler NlogChanged; /// /// 当变量值发生变化时触发 /// public event EventHandler VariableValueChanged; #endregion /// /// 构造函数,通过依赖注入获取仓储管理器和相关服务实例。 /// /// 仓储管理器实例。 /// AutoMapper 实例。 /// 设备应用服务实例。 /// 变量表应用服务实例。 /// 变量应用服务实例。 /// 菜单服务实例。 /// MQTT应用服务实例。 /// Nlog应用服务实例。 public DataCenterService( IRepositoryManager repositoryManager, IMapper mapper, IDeviceAppService deviceAppService, IVariableTableAppService variableTableAppService, IVariableAppService variableAppService, IMenuService menuService, IMqttAppService mqttAppService, INlogAppService nlogAppService) { _repositoryManager = repositoryManager; _mapper = mapper; // 初始化管理服务 _deviceManagementService = new DeviceManagementService(deviceAppService, Devices); _variableTableManagementService = new VariableTableManagementService(variableTableAppService, VariableTables); _variableManagementService = new VariableManagementService(variableAppService, Variables); _menuManagementService = new MenuManagementService(menuService, Menus, MenuTrees); _mqttManagementService = new MqttManagementService(mqttAppService, MqttServers); _logManagementService = new LogManagementService(nlogAppService, Nlogs); } #region 设备管理 /// /// 异步根据ID获取设备DTO。 /// public async Task GetDeviceByIdAsync(int id) { return await _deviceManagementService.GetDeviceByIdAsync(id); } /// /// 异步获取所有设备DTO列表。 /// public async Task> GetAllDevicesAsync() { return await _deviceManagementService.GetAllDevicesAsync(); } /// /// 异步创建一个新设备及其关联的变量表和菜单(事务性操作)。 /// public async Task CreateDeviceWithDetailsAsync(CreateDeviceWithDetailsDto dto) { return await _deviceManagementService.CreateDeviceWithDetailsAsync(dto); } /// /// 异步更新一个已存在的设备。 /// public async Task UpdateDeviceAsync(DeviceDto deviceDto) { return await _deviceManagementService.UpdateDeviceAsync(deviceDto); } /// /// 异步删除一个设备。 /// public async Task DeleteDeviceByIdAsync(int deviceId) { return await _deviceManagementService.DeleteDeviceByIdAsync(deviceId); } /// /// 异步切换设备的激活状态。 /// public async Task ToggleDeviceActiveStateAsync(int id) { await _deviceManagementService.ToggleDeviceActiveStateAsync(id); } /// /// 在内存中添加设备 /// public void AddDeviceToMemory(DeviceDto deviceDto) { _deviceManagementService.AddDeviceToMemory(deviceDto, VariableTables, Variables); } /// /// 在内存中更新设备 /// public void UpdateDeviceInMemory(DeviceDto deviceDto) { _deviceManagementService.UpdateDeviceInMemory(deviceDto); } /// /// 在内存中删除设备 /// public void RemoveDeviceFromMemory(int deviceId) { _deviceManagementService.RemoveDeviceFromMemory(deviceId, VariableTables, Variables); } #endregion #region 变量表管理 /// /// 异步根据ID获取变量表DTO。 /// public async Task GetVariableTableByIdAsync(int id) { return await _variableTableManagementService.GetVariableTableByIdAsync(id); } /// /// 异步获取所有变量表DTO列表。 /// public async Task> GetAllVariableTablesAsync() { return await _variableTableManagementService.GetAllVariableTablesAsync(); } /// /// 异步创建一个新变量表及其关联菜单(事务性操作)。 /// public async Task CreateVariableTableAsync(CreateVariableTableWithMenuDto dto) { return await _variableTableManagementService.CreateVariableTableAsync(dto); } /// /// 异步更新一个已存在的变量表。 /// public async Task UpdateVariableTableAsync(VariableTableDto variableTableDto) { return await _variableTableManagementService.UpdateVariableTableAsync(variableTableDto); } /// /// 异步删除一个变量表。 /// public async Task DeleteVariableTableAsync(int id) { return await _variableTableManagementService.DeleteVariableTableAsync(id); } /// /// 在内存中添加变量表 /// public void AddVariableTableToMemory(VariableTableDto variableTableDto) { _variableTableManagementService.AddVariableTableToMemory(variableTableDto, Devices); } /// /// 在内存中更新变量表 /// public void UpdateVariableTableInMemory(VariableTableDto variableTableDto) { _variableTableManagementService.UpdateVariableTableInMemory(variableTableDto, Devices); } /// /// 在内存中删除变量表 /// public void RemoveVariableTableFromMemory(int variableTableId) { _variableTableManagementService.RemoveVariableTableFromMemory(variableTableId, Devices); } #endregion #region 菜单管理 /// /// 异步获取所有菜单DTO列表。 /// public async Task> GetAllMenusAsync() { return await _menuManagementService.GetAllMenusAsync(); } /// /// 异步根据ID获取菜单DTO。 /// public async Task GetMenuByIdAsync(int id) { return await _menuManagementService.GetMenuByIdAsync(id); } /// /// 异步创建一个新菜单。 /// public async Task CreateMenuAsync(MenuBeanDto menuDto) { return await _menuManagementService.CreateMenuAsync(menuDto); } /// /// 异步更新一个已存在的菜单。 /// public async Task UpdateMenuAsync(MenuBeanDto menuDto) { await _menuManagementService.UpdateMenuAsync(menuDto); } /// /// 异步删除一个菜单。 /// public async Task DeleteMenuAsync(int id) { await _menuManagementService.DeleteMenuAsync(id); } /// /// 在内存中添加菜单 /// public void AddMenuToMemory(MenuBeanDto menuDto) { _menuManagementService.AddMenuToMemory(menuDto); } /// /// 在内存中更新菜单 /// public void UpdateMenuInMemory(MenuBeanDto menuDto) { _menuManagementService.UpdateMenuInMemory(menuDto); } /// /// 在内存中删除菜单 /// public void RemoveMenuFromMemory(int menuId) { _menuManagementService.RemoveMenuFromMemory(menuId); } /// /// 获取根菜单列表 /// public List GetRootMenus() { return _menuManagementService.GetRootMenus(); } /// /// 根据父级ID获取子菜单列表 /// /// 父级菜单ID /// 子菜单列表 public List GetChildMenus(int parentId) { return _menuManagementService.GetChildMenus(parentId); } #endregion #region 变量管理 /// /// 异步根据ID获取变量DTO。 /// public async Task GetVariableByIdAsync(int id) { return await _variableManagementService.GetVariableByIdAsync(id); } /// /// 异步获取所有变量DTO列表。 /// public async Task> GetAllVariablesAsync() { return await _variableManagementService.GetAllVariablesAsync(); } /// /// 异步创建一个新变量。 /// public async Task CreateVariableAsync(VariableDto variableDto) { return await _variableManagementService.CreateVariableAsync(variableDto); } /// /// 异步更新一个已存在的变量。 /// public async Task UpdateVariableAsync(VariableDto variableDto) { return await _variableManagementService.UpdateVariableAsync(variableDto); } /// /// 异步批量更新变量。 /// public async Task UpdateVariablesAsync(List variableDtos) { return await _variableManagementService.UpdateVariablesAsync(variableDtos); } /// /// 异步删除一个变量。 /// public async Task DeleteVariableAsync(int id) { return await _variableManagementService.DeleteVariableAsync(id); } /// /// 异步批量删除变量。 /// public async Task DeleteVariablesAsync(List ids) { return await _variableManagementService.DeleteVariablesAsync(ids); } /// /// 在内存中添加变量 /// public void AddVariableToMemory(VariableDto variableDto) { _variableManagementService.AddVariableToMemory(variableDto, VariableTables); } /// /// 在内存中更新变量 /// public void UpdateVariableInMemory(VariableDto variableDto) { _variableManagementService.UpdateVariableInMemory(variableDto, VariableTables); } /// /// 在内存中删除变量 /// public void RemoveVariableFromMemory(int variableId) { _variableManagementService.RemoveVariableFromMemory(variableId, VariableTables); } #endregion #region MQTT服务器管理 /// /// 异步根据ID获取MQTT服务器DTO。 /// public async Task GetMqttServerByIdAsync(int id) { return await _mqttManagementService.GetMqttServerByIdAsync(id); } /// /// 异步获取所有MQTT服务器DTO列表。 /// public async Task> GetAllMqttServersAsync() { return await _mqttManagementService.GetAllMqttServersAsync(); } /// /// 异步创建一个新的MQTT服务器。 /// public async Task CreateMqttServerAsync(MqttServerDto mqttServerDto) { return await _mqttManagementService.CreateMqttServerAsync(mqttServerDto); } /// /// 异步更新一个已存在的MQTT服务器。 /// public async Task UpdateMqttServerAsync(MqttServerDto mqttServerDto) { await _mqttManagementService.UpdateMqttServerAsync(mqttServerDto); } /// /// 异步删除一个MQTT服务器。 /// public async Task DeleteMqttServerAsync(int id) { await _mqttManagementService.DeleteMqttServerAsync(id); } /// /// 在内存中添加MQTT服务器 /// public void AddMqttServerToMemory(MqttServerDto mqttServerDto) { _mqttManagementService.AddMqttServerToMemory(mqttServerDto); } /// /// 在内存中更新MQTT服务器 /// public void UpdateMqttServerInMemory(MqttServerDto mqttServerDto) { _mqttManagementService.UpdateMqttServerInMemory(mqttServerDto); } /// /// 在内存中删除MQTT服务器 /// public void RemoveMqttServerFromMemory(int mqttServerId) { _mqttManagementService.RemoveMqttServerFromMemory(mqttServerId); } #endregion #region 数据加载和初始化 /// /// 异步加载所有设备及其关联数据到内存中。 /// public async Task LoadAllDataToMemoryAsync() { try { // 清空现有数据 Devices.Clear(); VariableTables.Clear(); Variables.Clear(); Menus.Clear(); MenuTrees.Clear(); MqttServers.Clear(); Nlogs.Clear(); // 加载所有设备 var devices = await _repositoryManager.Devices.GetAllAsync(); var deviceDtos = _mapper.Map>(devices); // 加载所有变量表 var variableTables = await _repositoryManager.VariableTables.GetAllAsync(); var variableTableDtos = _mapper.Map>(variableTables); // 加载所有变量 var variables = await _repositoryManager.Variables.GetAllAsync(); var variableDtos = _mapper.Map>(variables); // 加载所有菜单 var menus = await _repositoryManager.Menus.GetAllAsync(); var menuDtos = _mapper.Map>(menus); var mqttServers = await LoadAllMqttServersAsync(); // 加载所有日志 var nlogs = await LoadAllNlogsAsync(); var variableMqttAliases = await _repositoryManager.VariableMqttAliases.GetAllAsync(); // 建立设备与变量表的关联 foreach (var deviceDto in deviceDtos) { deviceDto.VariableTables = variableTableDtos .Where(vt => vt.DeviceId == deviceDto.Id) .ToList(); // 将设备添加到安全字典 Devices.TryAdd(deviceDto.Id, deviceDto); } // 建立变量表与变量的关联 foreach (var variableTableDto in variableTableDtos) { variableTableDto.Variables = variableDtos .Where(v => v.VariableTableId == variableTableDto.Id) .ToList(); if (Devices.TryGetValue(variableTableDto.DeviceId, out var deviceDto)) { variableTableDto.Device = deviceDto; } // 将变量表添加到安全字典 VariableTables.TryAdd(variableTableDto.Id, variableTableDto); } // 加载MQTT服务器数据到内存 foreach (var mqttServer in mqttServers) { MqttServers.TryAdd(mqttServer.Id, mqttServer); } // 加载日志数据到内存 foreach (var nlog in nlogs) { Nlogs.TryAdd(nlog.Id, nlog); } // 将变量添加到安全字典 foreach (var variableDto in variableDtos) { if (VariableTables.TryGetValue(variableDto.VariableTableId, out var variableTable)) { variableDto.VariableTable = variableTable; } // var alises= variableMqttAliases.FirstOrDefault(vm => vm.VariableId == variableDto.Id); // if (alises != null) // { // // var variableMqttAliasDto = _mapper.Map(alises); // variableMqttAliasDto.Variable = _mapper.Map(variableDto) ; // if (MqttServers.TryGetValue(variableMqttAliasDto.MqttServerId, out var mqttServerDto)) // { // variableMqttAliasDto.MqttServer = _mapper.Map(mqttServerDto) ; // variableMqttAliasDto.MqttServerName = variableMqttAliasDto.MqttServer.ServerName; // } // // variableDto.MqttAliases.Add(variableMqttAliasDto); // } Variables.TryAdd(variableDto.Id, variableDto); } // 将菜单添加到安全字典 foreach (var menuDto in menuDtos) { Menus.TryAdd(menuDto.Id, menuDto); } // 构建菜单树 _menuManagementService.BuildMenuTree(); // 触发数据加载完成事件 OnDataLoadCompleted(new DataLoadCompletedEventArgs(true, "数据加载完成")); } catch (Exception ex) { OnDataLoadCompleted(new DataLoadCompletedEventArgs(false, $"数据加载失败: {ex.Message}")); throw; } } /// /// 异步加载所有设备及其关联数据。 /// public async Task> LoadAllDevicesAsync() { return await _deviceManagementService.GetAllDevicesAsync(); } /// /// 异步加载所有变量表及其关联数据。 /// public async Task> LoadAllVariableTablesAsync() { return await _variableTableManagementService.GetAllVariableTablesAsync(); } /// /// 异步加载所有变量数据。 /// public async Task> LoadAllVariablesAsync() { return await _variableManagementService.GetAllVariablesAsync(); } /// /// 异步加载所有菜单数据。 /// public async Task> LoadAllMenusAsync() { return await _menuManagementService.GetAllMenusAsync(); } /// /// 异步加载所有MQTT服务器数据。 /// public async Task> LoadAllMqttServersAsync() { return await _mqttManagementService.GetAllMqttServersAsync(); } /// /// 异步加载所有日志数据。 /// public async Task> LoadAllNlogsAsync() { return await _logManagementService.GetAllNlogsAsync(); } #endregion #region 事件触发方法 /// /// 触发数据加载完成事件 /// protected virtual void OnDataLoadCompleted(DataLoadCompletedEventArgs e) { OnLoadDataCompleted?.Invoke(this, e); } /// /// 触发设备变更事件 /// protected virtual void OnDeviceChanged(DeviceChangedEventArgs e) { DeviceChanged?.Invoke(this, e); } /// /// 触发变量表变更事件 /// protected virtual void OnVariableTableChanged(VariableTableChangedEventArgs e) { VariableTableChanged?.Invoke(this, e); } /// /// 触发变量变更事件 /// protected virtual void OnVariableChanged(VariableChangedEventArgs e) { VariableChanged?.Invoke(this, e); } /// /// 触发菜单变更事件 /// protected virtual void OnMenuChanged(MenuChangedEventArgs e) { MenuChanged?.Invoke(this, e); } /// /// 触发MQTT服务器变更事件 /// protected virtual void OnMqttServerChanged(MqttServerChangedEventArgs e) { MqttServerChanged?.Invoke(this, e); } /// /// 触发日志变更事件 /// protected virtual void OnNlogChanged(NlogChangedEventArgs e) { NlogChanged?.Invoke(this, e); } /// /// 触发变量值变更事件 /// public void OnVariableValueChanged(VariableValueChangedEventArgs e) { VariableValueChanged?.Invoke(this, e); } #endregion #region 日志管理 /// /// 异步根据ID获取日志DTO。 /// public async Task GetNlogByIdAsync(int id) { return await _logManagementService.GetNlogByIdAsync(id); } /// /// 异步获取所有日志DTO列表。 /// public async Task> GetAllNlogsAsync() { return await _logManagementService.GetAllNlogsAsync(); } /// /// 异步获取指定数量的最新日志DTO列表。 /// public async Task> GetLatestNlogsAsync(int count) { return await _logManagementService.GetLatestNlogsAsync(count); } /// /// 异步清空所有日志。 /// public async Task ClearAllNlogsAsync() { await _logManagementService.ClearAllNlogsAsync(); } /// /// 在内存中添加日志 /// public void AddNlogToMemory(NlogDto nlogDto) { _logManagementService.AddNlogToMemory(nlogDto); } /// /// 在内存中更新日志 /// public void UpdateNlogInMemory(NlogDto nlogDto) { _logManagementService.UpdateNlogInMemory(nlogDto); } /// /// 在内存中删除日志 /// public void RemoveNlogFromMemory(int nlogId) { _logManagementService.RemoveNlogFromMemory(nlogId); } #endregion }