using AutoMapper; using CommunityToolkit.Mvvm.ComponentModel; using DMS.Application.DTOs; using DMS.Application.Interfaces; using DMS.Core.Models; using DMS.WPF.Interfaces; using DMS.WPF.ItemViewModel; using System.Collections.ObjectModel; using DMS.Application.Interfaces.Management; using DMS.Application.Services.Management; namespace DMS.WPF.Services.ViewService; /// /// 变量数据服务类,负责管理变量表和变量相关的数据和操作。 /// public class VariableViewService : IVariableViewService { private readonly IMapper _mapper; private readonly IAppDataService _appDataService; private readonly IVariableManagementService _variableManagementService; private readonly IViewDataService _viewDataService; private readonly IAppCenterService _appCenterService; /// /// VariableDataService类的构造函数。 /// /// AutoMapper 实例。 /// 数据服务中心实例。 public VariableViewService(IMapper mapper, IAppDataService appStorageService, IVariableManagementService variableManagementService, IViewDataService dataStorageService, IAppCenterService appCenterService) { _mapper = mapper; _appDataService = appStorageService; _variableManagementService = variableManagementService; _viewDataService = dataStorageService; _appCenterService = appCenterService; } /// /// 加载所有变量 /// public void LoadAllVariables() { foreach (var variableTable in _viewDataService.VariableTables) { foreach (var variable in variableTable.Value.Variables) { _viewDataService.Variables.Add(variable.Id, variable); } } } /// /// 添加变量表。 /// public async Task AddVariableTableToView(VariableTable tableDto) { // 添加null检查 if (tableDto == null || tableDto.DeviceId == 0) return false; if (_viewDataService.Devices.TryGetValue(tableDto.DeviceId, out var device)) { var variableTableItem = _mapper.Map(tableDto); device.VariableTables.Add(variableTableItem); _viewDataService.VariableTables.TryAdd(variableTableItem.Id, variableTableItem); } return true; } /// /// 更新变量表。 /// public async Task UpdateVariableTable(VariableTableItem variableTableItem) { if (variableTableItem is null) { return false; } var variableTable = _mapper.Map(variableTableItem); if (await _appCenterService.VariableTableManagementService.UpdateAsync(variableTable) > 0) { // 更新数据库后会自动更新内存,无需额外操作 return true; } return false; } /// /// 添加变量。 /// public void AddVariable(VariableItem variableItem) { if (variableItem == null) { return; } _viewDataService.Variables.Add(variableItem.Id, variableItem); } /// /// 添加变量。 /// public async Task AddAsync(List variableItems, VariableTableItem variableTable) { foreach (var variableDto in variableItems) { variableDto.IsActive = true; variableDto.CreatedAt = DateTime.Now; variableDto.UpdatedAt = DateTime.Now; variableDto.VariableTableId = variableTable.Id; } var resVariables = await _variableManagementService.AddAsync(_mapper.Map>(variableItems)); List resVariableItems = _mapper.Map>(resVariables); foreach (var variableItem in resVariableItems) { _viewDataService.Variables.TryAdd(variableItem.Id, variableItem); variableTable.Variables.Add(variableItem); } return true; } /// /// 删除变量。 /// public void DeleteVariable(int id) { if (!_viewDataService.Variables.TryGetValue(id, out var variableItem)) { return; } if (_viewDataService.VariableTables.TryGetValue(variableItem.VariableTableId, out var variableTable)) { variableTable.Variables.Remove(variableItem); } _viewDataService.Variables.Remove(variableItem.Id); } public async Task DeleteAsync(List variableItems) { List deleteList = new List(); foreach (var variable in variableItems) { if (_appDataService.Variables.TryGetValue(variable.Id, out var mVariable)) { deleteList.Add(mVariable); } } return await _variableManagementService.DeleteAsync(deleteList); } public List CheckExistingVariables(List importedVariables, DeviceItem device) { List? existList = new List(); var allVariable = device.VariableTables.SelectMany(vt => vt.Variables); foreach (var variable in allVariable) { foreach (var item in importedVariables) { bool slelect = item.Name == variable.Name || item.S7Address == variable.S7Address || item.OpcUaNodeId == variable.OpcUaNodeId; if (slelect) { existList.Add(item); } } } return existList; } }