Files
DMS/ViewModels/VariableTableViewModel.cs

353 lines
13 KiB
C#
Raw Normal View History

using System.Collections.ObjectModel;
using CommunityToolkit.Mvvm.ComponentModel;
2025-07-03 12:55:00 +08:00
using CommunityToolkit.Mvvm.Input;
2025-07-04 14:15:44 +08:00
using iNKORE.UI.WPF.Modern.Controls;
using Newtonsoft.Json;
2025-07-03 12:55:00 +08:00
using NLog;
using PMSWPF.Data.Repositories;
using PMSWPF.Enums;
using PMSWPF.Extensions;
using PMSWPF.Helper;
using PMSWPF.Models;
2025-07-03 12:55:00 +08:00
using PMSWPF.Services;
using ILogger = Microsoft.Extensions.Logging.ILogger;
namespace PMSWPF.ViewModels;
partial class VariableTableViewModel : ViewModelBase
{
2025-07-03 12:55:00 +08:00
private static readonly Logger Logger = LogManager.GetCurrentClassLogger();
private readonly IDialogService _dialogService;
// private readonly ILogger<VariableTableViewModel> _logger;
2025-07-03 12:55:00 +08:00
[ObservableProperty]
private VariableTable variableTable;
[ObservableProperty]
private ObservableCollection<VariableData> _dataVariables;
private ObservableCollection<VariableData> _originalDataVariables;
2025-07-03 15:29:07 +08:00
[ObservableProperty]
private VariableData _selectedVariableData;
/// <summary>
/// 是否是第一次加载,防止ToggleSwitch第一次加载触发改变事件
/// </summary>
public bool IsLoadCompletion { get; set; } = false;
private readonly VarTableRepository _varTableRepository;
2025-07-03 12:55:00 +08:00
private readonly VarDataRepository _varDataRepository;
2025-07-03 12:55:00 +08:00
public VariableTableViewModel(IDialogService dialogService)
{
2025-07-03 12:55:00 +08:00
_dialogService = dialogService;
IsLoadCompletion = false;
// _logger = logger;
_varTableRepository = new VarTableRepository();
2025-07-03 12:55:00 +08:00
_varDataRepository = new VarDataRepository();
}
2025-07-03 12:55:00 +08:00
public override void OnLoaded()
{
if (VariableTable.DataVariables != null)
{
2025-07-02 22:07:16 +08:00
DataVariables = new ObservableCollection<VariableData>(VariableTable.DataVariables);
// 3. 创建原始数据的深拷贝备份
// 推荐使用 JSON 序列化/反序列化进行深度拷贝
var serialized = JsonConvert.SerializeObject(DataVariables);
_originalDataVariables = JsonConvert.DeserializeObject<ObservableCollection<VariableData>>(serialized);
2025-07-05 17:15:03 +08:00
// 在数据加载完成后,将所有变量的 IsModified 状态重置为 false
foreach (var variableData in DataVariables)
{
variableData.IsModified = false;
}
}
2025-07-03 12:55:00 +08:00
2025-07-03 15:03:36 +08:00
IsLoadCompletion = true;
}
2025-07-04 13:40:14 +08:00
/// <summary>
/// 退出当前实体时调用
/// </summary>
/// <returns></returns>
public override async Task<bool> OnExitAsync()
{
var modifiedDatas = DataVariables.Where(d => d.IsModified == true)
.ToList();
if (modifiedDatas.Count == 0)
return true;
var isExit = await _dialogService.ShowConfrimeDialog(
"数据未保存", $"你有{modifiedDatas.Count}个修改的变量没有保存,离开后这些数据就可能丢失了确认要离开吗?", "离开");
if (!isExit)
{
// 不保存数据,还原原来的数据
foreach (var modifiedData in modifiedDatas)
{
2025-07-04 13:40:14 +08:00
var oldData = _originalDataVariables.First(od => od.Id == modifiedData.Id);
oldData.CopyTo(modifiedData);
modifiedData.IsModified = false;
}
return false;
}
return true;
}
/// <summary>
/// 保存修改过的变量数据
/// </summary>
[RelayCommand]
private async void SaveModifiedVarData()
{
var modifiedDatas = DataVariables.Where(d => d.IsModified == true)
.ToList();
///更新数据库
await _varDataRepository.UpdateAsync(modifiedDatas);
// 还原修改状态
foreach (var modifiedData in modifiedDatas)
{
modifiedData.IsModified = false;
}
2025-07-04 13:40:14 +08:00
NotificationHelper.ShowMessage($"修改的{modifiedDatas.Count}变量保存成功.", NotificationType.Success);
}
2025-07-03 15:29:07 +08:00
[RelayCommand]
2025-07-04 13:40:14 +08:00
private async void EditVarData(VariableTable variableTable)
2025-07-03 15:29:07 +08:00
{
try
{
// // 1. 显示添加设备对话框
var varData = await _dialogService.ShowEditVarDataDialog(SelectedVariableData);
// // 如果用户取消或对话框未返回设备,则直接返回
if (varData == null)
return;
varData.VariableTableId = variableTable.Id;
// 更新数据库
await _varDataRepository.UpdateAsync(varData);
// 更新当前页面的
var index = variableTable.DataVariables.IndexOf(SelectedVariableData);
// 更新变量表中的
if (index >= 0 && index < variableTable.DataVariables.Count)
variableTable.DataVariables[index] = varData;
NotificationHelper.ShowMessage($"编辑变量成功:{varData?.Name}", NotificationType.Success);
}
catch (Exception e)
{
string msg = $"编辑变量的过程中发生了不可预期的错误:";
Logger.Error(msg + e);
NotificationHelper.ShowMessage(msg + e.Message, NotificationType.Error);
}
}
2025-07-04 13:40:14 +08:00
[RelayCommand]
private async void ImprotFromTiaVarTable()
{
2025-07-04 14:15:44 +08:00
ContentDialog processingDialog = null;
2025-07-04 13:40:14 +08:00
try
{
// 让用户选择导入的Excel文件
var filePath = await _dialogService.ShowImportExcelDialog();
if (string.IsNullOrEmpty(filePath))
return;
// 读取Excel转换成VariableData列表
var importVarDataList = ExcelHelper.ImprotFromTiaVariableTable(filePath);
if (importVarDataList.Count == 0)
return;
2025-07-04 14:15:44 +08:00
processingDialog= _dialogService.ShowProcessingDialog("正在处理...", "正在导入变量,请稍等片刻....");
2025-07-04 13:40:14 +08:00
foreach (var variableData in importVarDataList)
{
variableData.CreateTime=DateTime.Now;
variableData.VariableTableId = VariableTable.Id;
}
// 插入数据库
2025-07-04 18:33:48 +08:00
var resVarDataCount= await _varDataRepository.AddAsync(importVarDataList);
2025-07-04 13:40:14 +08:00
//更新界面
// variableTable.DataVariables.AddRange(resVarDataList);
2025-07-04 18:33:48 +08:00
variableTable.DataVariables= await _varDataRepository.GetAllAsync();
DataVariables=new ObservableCollection<VariableData>(variableTable.DataVariables);
2025-07-04 14:15:44 +08:00
processingDialog?.Hide();
2025-07-04 18:33:48 +08:00
string msgSuccess = $"成功导入变量:{resVarDataCount}个。";
2025-07-04 13:40:14 +08:00
Logger.Info(msgSuccess);
NotificationHelper.ShowMessage(msgSuccess, NotificationType.Success);
}
catch (Exception e)
{
string msg = $"从TIA导入变量的过程中发生了不可预期的错误";
Logger.Error(msg + e);
NotificationHelper.ShowMessage(msg + e.Message, NotificationType.Error);
}
}
2025-07-03 15:29:07 +08:00
2025-07-03 12:55:00 +08:00
[RelayCommand]
2025-07-04 13:40:14 +08:00
private async void AddVarData(VariableTable variableTable)
2025-07-03 12:55:00 +08:00
{
try
{
// // 1. 显示添加设备对话框
var varData = await _dialogService.ShowAddVarDataDialog();
// // 如果用户取消或对话框未返回设备,则直接返回
if (varData == null)
return;
varData.VariableTableId = variableTable.Id;
// 更新数据库
2025-07-05 00:04:00 +08:00
await _varDataRepository.AddAsync(varData);
// 更新当前页面的
2025-07-04 13:40:14 +08:00
DataVariables.Add(varData);
NotificationHelper.ShowMessage($"添加变量成功:{varData?.Name}", NotificationType.Success);
2025-07-03 12:55:00 +08:00
}
catch (Exception e)
{
string msg = $"添加变量的过程中发生了不可预期的错误:";
Logger.Error(msg + e);
NotificationHelper.ShowMessage(msg + e.Message, NotificationType.Error);
}
}
2025-07-05 00:04:00 +08:00
[RelayCommand]
2025-07-05 00:18:59 +08:00
public async Task DeleteVarData(List<VariableData> variablesToDelete)
2025-07-05 00:04:00 +08:00
{
2025-07-05 00:18:59 +08:00
if (variablesToDelete == null || !variablesToDelete.Any())
2025-07-05 00:04:00 +08:00
{
NotificationHelper.ShowMessage("请选择要删除的变量", NotificationType.Warning);
return;
}
2025-07-05 00:18:59 +08:00
var names = string.Join("、", variablesToDelete.Select(v => v.Name));
2025-07-05 00:04:00 +08:00
var confirm = await _dialogService.ShowConfrimeDialog(
"删除确认",
2025-07-05 00:18:59 +08:00
$"确定要删除选中的 {variablesToDelete.Count} 个变量吗?\n\n{names}",
2025-07-05 00:04:00 +08:00
"删除");
if (!confirm)
return;
try
{
2025-07-05 00:18:59 +08:00
var result = await _varDataRepository.DeleteAsync(variablesToDelete);
2025-07-05 00:04:00 +08:00
if (result > 0)
{
2025-07-05 00:18:59 +08:00
foreach (var variable in variablesToDelete)
{
DataVariables.Remove(variable);
}
NotificationHelper.ShowMessage($"成功删除 {result} 个变量", NotificationType.Success);
2025-07-05 00:04:00 +08:00
}
else
{
2025-07-05 00:18:59 +08:00
NotificationHelper.ShowMessage("删除变量失败", NotificationType.Error);
2025-07-05 00:04:00 +08:00
}
}
catch (Exception e)
{
string msg = $"删除变量的过程中发生了不可预期的错误:";
Logger.Error(msg + e);
NotificationHelper.ShowMessage(msg + e.Message, NotificationType.Error);
}
}
2025-07-05 16:13:46 +08:00
[RelayCommand]
public async Task ChangePollLevel(List<VariableData> variablesToChange)
2025-07-05 16:13:46 +08:00
{
if (variablesToChange == null || !variablesToChange.Any())
2025-07-05 16:13:46 +08:00
{
NotificationHelper.ShowMessage("请选择要修改轮询频率的变量", NotificationType.Warning);
2025-07-05 16:13:46 +08:00
return;
}
var newPollLevelType = await _dialogService.ShowPollLevelDialog(variablesToChange.First().PollLevelType);
2025-07-05 16:13:46 +08:00
if (newPollLevelType.HasValue)
{
foreach (var variable in variablesToChange)
{
variable.PollLevelType = newPollLevelType.Value;
variable.IsModified=false;
}
await _varDataRepository.UpdateAsync(variablesToChange);
NotificationHelper.ShowMessage($"已成功更新 {variablesToChange.Count} 个变量的轮询频率", NotificationType.Success);
2025-07-05 16:13:46 +08:00
}
}
2025-07-05 18:15:21 +08:00
[RelayCommand]
public async Task AddMqttServerToVariables(IList<VariableData> variablesToAddMqtt)
{
if (variablesToAddMqtt == null || !variablesToAddMqtt.Any())
{
NotificationHelper.ShowMessage("请选择要添加MQTT服务器的变量", NotificationType.Warning);
return;
}
try
{
var selectedMqtt = await _dialogService.ShowMqttSelectionDialog();
if (selectedMqtt == null)
{
return; // 用户取消选择
}
foreach (VariableData variable in variablesToAddMqtt)
{
if (variable.Mqtts == null)
{
variable.Mqtts = new List<Mqtt>();
}
// 避免重复添加
if (!variable.Mqtts.Any(m => m.Id == selectedMqtt.Id))
{
variable.Mqtts.Add(selectedMqtt);
// variable.IsModified = true; // 标记为已修改
2025-07-05 18:15:21 +08:00
}
}
// 批量更新数据库
await _varDataRepository.UpdateAsync(variablesToAddMqtt.ToList());
NotificationHelper.ShowMessage($"已成功为 {variablesToAddMqtt.Count} 个变量添加MQTT服务器: {selectedMqtt.Name}", NotificationType.Success);
}
catch (Exception ex)
{
Logger.Error(ex, "添加MQTT服务器到变量时发生错误。");
NotificationHelper.ShowMessage($"添加MQTT服务器失败: {ex.Message}", NotificationType.Error);
}
}
2025-07-04 13:40:14 +08:00
// [RelayCommand]
// private async void ImportFromExcel()
// {
// var filePath = await _dialogService.ShowImportExcelDialog();
// if (!string.IsNullOrEmpty(filePath))
// {
// // TODO: Implement Excel import logic using the filePath
// NotificationHelper.ShowMessage($"Successfully imported from {filePath}", NotificationType.Success);
// }
// }
2025-07-03 12:55:00 +08:00
public async Task OnIsActiveChanged(bool active)
{
var res = await _varTableRepository.Edit(VariableTable);
if (res > 0)
{
var statusMessage = active ? "已启用" : "已停用";
NotificationHelper.ShowMessage($"变量表:{VariableTable.Name},{statusMessage}", NotificationType.Success);
}
else
{
NotificationHelper.ShowMessage($"变量表:{VariableTable.Name},状态修改失败,状态:{active}", NotificationType.Error);
// _logger.LogInformation($"变量表:{VariableTable.Name},状态修改失败,状态:{active}");
}
}
}