using AutoMapper; using DMS.Application.DTOs; using DMS.Application.Interfaces; using DMS.Application.Interfaces.Management; using DMS.Application.Services; using DMS.Core.Enums; using DMS.Core.Models; using DMS.WPF.Interfaces; using DMS.WPF.ItemViewModel; using DMS.WPF.ViewModels; using iNKORE.UI.WPF.Modern.Common.IconKeys; using System.Collections.ObjectModel; namespace DMS.WPF.Services.ViewService; public class VariableTableViewService : IVariableTableViewService { private readonly IMapper _mapper; private readonly IViewDataService _viewDataService; private readonly IAppDataService _appDataService; private readonly IVariableTableManagementService _variableTableManagementService; private readonly IMenuViewService _menuDataService; public VariableTableViewService(IMapper mapper, IViewDataService viewDataService, IAppDataService appDataService, IVariableTableManagementService variableTableManagementService, IMenuViewService menuDataService) { _mapper = mapper; _viewDataService = viewDataService; _appDataService = appDataService; _variableTableManagementService = variableTableManagementService; _menuDataService = menuDataService; } public void LoadAllVariableTables() { foreach (var device in _viewDataService.Devices) { foreach (var variableTable in device.Value.VariableTables) { _viewDataService.VariableTables.Add(variableTable.Id, variableTable); } } } /// /// 异步添加变量表 /// 此方法创建一个新的变量表项,包括创建对应的菜单项,并将其添加到数据库和视图数据服务中 /// /// 要添加的变量表项 /// 如果添加成功返回true,否则返回false public async Task AddAsync(VariableTableItem variableTableItem) { // 检查传入的参数是否为空,如果为空则直接返回false if (variableTableItem is null) return false; // 创建包含变量表和菜单的DTO对象 CreateVariableTableWithMenuDto createDto = new CreateVariableTableWithMenuDto(); createDto.VariableTable = _mapper.Map(variableTableItem); // 将VariableTableItem映射为VariableTable对象 // 创建与变量表关联的菜单项 var deviceMenu = _viewDataService.Menus.FirstOrDefault(m => m.MenuType == MenuType.DeviceMenu && m.TargetId == variableTableItem.DeviceId); if (deviceMenu is not null) { createDto.Menu = new MenuBean() { Header = variableTableItem.Name, // 菜单标题为变量表名称 ParentId = deviceMenu.Id, MenuType = MenuType.VariableTableMenu, Icon = SegoeFluentIcons.DataSense.Glyph, // 设置菜单图标 TargetViewKey = nameof(VariableTableViewModel) // 设置目标视图 }; } // 调用应用中心服务异步添加变量表 var resDto = await _variableTableManagementService.AddAsync(createDto); // 检查返回结果是否为空,如果为空则表示添加失败,返回false if (resDto is null) return false; // 设置变量表项的ID为服务器返回的ID variableTableItem.Id = resDto.VariableTable.Id; // 如果变量表项有关联的设备,则将该变量表添加到设备的变量表集合中 variableTableItem.Device?.VariableTables.Add(variableTableItem); _viewDataService.VariableTables.TryAdd(variableTableItem.Id, variableTableItem); // 将新创建的菜单项添加到菜单视图服务中 _menuDataService.AddMenuToView(_mapper.Map(resDto.Menu)); // 成功添加,返回true return true; } public async Task UpdateAsync(VariableTableItem variableTable) { // 检查变量表是否存在于应用数据存储中 if (!_appDataService.VariableTables.TryGetValue(variableTable.Id, out var variableTableInApp)) { return false; } _mapper.Map(variableTable, variableTableInApp); if (await _variableTableManagementService.UpdateAsync(variableTableInApp) > 0) { // 更新数据库后会自动更新内存,无需额外操作 var menu = _viewDataService.Menus.FirstOrDefault(m => m.MenuType == MenuType.VariableTableMenu && m.TargetId == variableTable.Id); if (menu is not null && menu.Header != variableTable.Name) { menu.Header = variableTable.Name; } return true; } return false; } /// /// 异步删除变量表 /// 此方法用于删除指定的变量表项,包括从数据库中删除、移除关联的变量和菜单项 /// /// 要删除的变量表项 /// 如果删除成功返回true,否则返回false public async Task DeleteAsync(VariableTableItem variableTable) { // 检查变量表是否存在于应用数据存储中 if (!_appDataService.VariableTables.TryGetValue(variableTable.Id, out var variableTableInApp)) { return false; } // 从数据库和内存中删除变量表相关数据 if (!await _variableTableManagementService.DeleteAsync(variableTableInApp)) { return false; } // 从界面删除变量表相关数据集 foreach (var variable in variableTable.Variables) { _viewDataService.Variables.Remove(variable.Id); } // 删除变量表相关的菜单 var variableTableMenu = _viewDataService.Menus.FirstOrDefault(m => m.MenuType == MenuType.VariableTableMenu && m.TargetId == variableTable.Id); if (variableTableMenu != null) { _menuDataService.DeleteMenuToView(variableTableMenu); } // 从视图数据服务中删除变量表 _viewDataService.VariableTables.Remove(variableTable.Id); // 从设备的变量表集合中移除该变量表 variableTable.Device?.VariableTables.Remove(variableTable); return true; } }