2025-06-24 20:48:38 +08:00
|
|
|
|
using System.Collections.ObjectModel;
|
|
|
|
|
|
using CommunityToolkit.Mvvm.ComponentModel;
|
2025-07-02 12:01:20 +08:00
|
|
|
|
using iNKORE.UI.WPF.Modern.Common.IconKeys;
|
|
|
|
|
|
using iNKORE.UI.WPF.Modern.Controls;
|
|
|
|
|
|
using Microsoft.Extensions.DependencyInjection;
|
|
|
|
|
|
using Microsoft.Extensions.Logging;
|
2025-07-04 18:33:48 +08:00
|
|
|
|
using PMSWPF.Data;
|
2025-06-24 20:48:38 +08:00
|
|
|
|
using PMSWPF.Data.Repositories;
|
2025-06-28 19:32:51 +08:00
|
|
|
|
using PMSWPF.Enums;
|
2025-06-30 13:06:51 +08:00
|
|
|
|
using PMSWPF.Helper;
|
2025-06-25 22:33:57 +08:00
|
|
|
|
using PMSWPF.Models;
|
2025-06-10 20:55:39 +08:00
|
|
|
|
using PMSWPF.Services;
|
2025-05-29 08:58:58 +08:00
|
|
|
|
|
2025-06-23 17:01:06 +08:00
|
|
|
|
namespace PMSWPF.ViewModels;
|
2025-06-10 20:55:39 +08:00
|
|
|
|
|
2025-07-03 15:03:36 +08:00
|
|
|
|
/// <summary>
|
|
|
|
|
|
/// 主视图模型,负责应用程序的主导航和数据管理。
|
|
|
|
|
|
/// </summary>
|
2025-06-23 17:01:06 +08:00
|
|
|
|
public partial class MainViewModel : ViewModelBase
|
|
|
|
|
|
{
|
2025-06-28 19:32:51 +08:00
|
|
|
|
private readonly DataServices _dataServices;
|
2025-07-02 12:01:20 +08:00
|
|
|
|
private readonly IDialogService _dialogService;
|
|
|
|
|
|
private readonly ILogger<MainViewModel> _logger;
|
2025-06-26 19:36:27 +08:00
|
|
|
|
private readonly MenuRepository _menuRepository;
|
2025-07-03 15:03:36 +08:00
|
|
|
|
private readonly NavgatorServices _navgatorServices;
|
2025-07-02 18:33:08 +08:00
|
|
|
|
private readonly VarTableRepository _varTableRepository;
|
2025-06-26 19:36:27 +08:00
|
|
|
|
|
2025-07-03 15:03:36 +08:00
|
|
|
|
/// <summary>
|
|
|
|
|
|
/// 当前显示的视图模型。
|
|
|
|
|
|
/// </summary>
|
|
|
|
|
|
[ObservableProperty]
|
|
|
|
|
|
private ViewModelBase currentViewModel;
|
2025-07-02 12:01:20 +08:00
|
|
|
|
|
2025-07-03 15:03:36 +08:00
|
|
|
|
/// <summary>
|
|
|
|
|
|
/// 应用程序的菜单列表。
|
|
|
|
|
|
/// </summary>
|
|
|
|
|
|
[ObservableProperty]
|
|
|
|
|
|
private ObservableCollection<MenuBean> _menus;
|
|
|
|
|
|
|
|
|
|
|
|
/// <summary>
|
|
|
|
|
|
/// 初始化 <see cref="MainViewModel"/> 类的新实例。
|
|
|
|
|
|
/// </summary>
|
|
|
|
|
|
/// <param name="navgatorServices">导航服务。</param>
|
|
|
|
|
|
/// <param name="dataServices">数据服务。</param>
|
|
|
|
|
|
/// <param name="dialogService">对话框服务。</param>
|
|
|
|
|
|
/// <param name="logger">日志记录器。</param>
|
2025-07-02 12:01:20 +08:00
|
|
|
|
public MainViewModel(NavgatorServices navgatorServices, DataServices dataServices, IDialogService dialogService,
|
|
|
|
|
|
ILogger<MainViewModel> logger)
|
2025-06-23 17:01:06 +08:00
|
|
|
|
{
|
|
|
|
|
|
_navgatorServices = navgatorServices;
|
2025-06-28 19:32:51 +08:00
|
|
|
|
_dataServices = dataServices;
|
2025-07-02 12:01:20 +08:00
|
|
|
|
_dialogService = dialogService;
|
|
|
|
|
|
_logger = logger;
|
2025-07-02 18:33:08 +08:00
|
|
|
|
_varTableRepository = new VarTableRepository();
|
2025-07-03 15:03:36 +08:00
|
|
|
|
_menuRepository = new MenuRepository();
|
2025-06-28 19:32:51 +08:00
|
|
|
|
|
2025-06-23 17:01:06 +08:00
|
|
|
|
_navgatorServices.OnViewModelChanged += () => { CurrentViewModel = _navgatorServices.CurrentViewModel; };
|
2025-07-02 12:01:20 +08:00
|
|
|
|
|
2025-06-23 17:01:06 +08:00
|
|
|
|
CurrentViewModel = new HomeViewModel();
|
2025-06-24 20:48:38 +08:00
|
|
|
|
CurrentViewModel.OnLoaded();
|
2025-06-30 13:06:51 +08:00
|
|
|
|
// 发送消息加载数据
|
|
|
|
|
|
MessageHelper.SendLoadMessage(LoadTypes.All);
|
|
|
|
|
|
// 当菜单加载成功后,在前台显示菜单
|
2025-07-05 19:31:36 +08:00
|
|
|
|
dataServices.OnMenuTreeListChanged += (sender, menus) => { Menus = new ObservableCollection<MenuBean>(menus); };
|
2025-07-02 12:01:20 +08:00
|
|
|
|
}
|
|
|
|
|
|
|
2025-07-02 18:33:08 +08:00
|
|
|
|
/// <summary>
|
2025-07-03 15:03:36 +08:00
|
|
|
|
/// 添加变量表。
|
2025-07-02 18:33:08 +08:00
|
|
|
|
/// </summary>
|
2025-07-03 15:03:36 +08:00
|
|
|
|
/// <param name="menu">当前菜单项,用于获取父级设备信息。</param>
|
2025-07-02 12:01:20 +08:00
|
|
|
|
private async Task AddVariableTable(MenuBean menu)
|
|
|
|
|
|
{
|
2025-07-04 18:33:48 +08:00
|
|
|
|
var db = DbContext.GetInstance();
|
2025-07-02 12:01:20 +08:00
|
|
|
|
try
|
|
|
|
|
|
{
|
2025-07-02 18:33:08 +08:00
|
|
|
|
// 1. 检查父级设备信息
|
|
|
|
|
|
if (menu.Parent?.Data is not Device device)
|
|
|
|
|
|
{
|
|
|
|
|
|
_logger.LogWarning("尝试添加变量表时,Parent 或 Parent.Data 为空,或 Parent.Data 不是 Device 类型。");
|
|
|
|
|
|
NotificationHelper.ShowMessage("操作失败:无法获取有效的设备信息。", NotificationType.Error);
|
|
|
|
|
|
return;
|
|
|
|
|
|
}
|
2025-07-03 15:03:36 +08:00
|
|
|
|
|
2025-07-02 18:33:08 +08:00
|
|
|
|
|
|
|
|
|
|
// 2. 显示添加变量表对话框
|
2025-07-03 12:55:00 +08:00
|
|
|
|
var varTable = await _dialogService.ShowAddVarTableDialog();
|
2025-07-02 18:33:08 +08:00
|
|
|
|
if (varTable == null)
|
|
|
|
|
|
{
|
|
|
|
|
|
// 用户取消或未选择
|
|
|
|
|
|
return;
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
// 3. 设置变量表属性
|
|
|
|
|
|
varTable.IsActive = true;
|
|
|
|
|
|
varTable.DeviceId = device.Id;
|
|
|
|
|
|
varTable.ProtocolType = device.ProtocolType;
|
|
|
|
|
|
|
|
|
|
|
|
// 4. 添加变量表到数据库
|
2025-07-04 18:33:48 +08:00
|
|
|
|
// 假设 _varTableRepository.AddAsync 返回一个布尔值表示成功,或者一个表示 ID 的整数
|
2025-07-02 18:33:08 +08:00
|
|
|
|
// 这里为了演示,我们假设它返回新添加的ID,如果失败则返回0
|
2025-07-04 18:33:48 +08:00
|
|
|
|
await db.BeginTranAsync();
|
|
|
|
|
|
var addVarTable = await _varTableRepository.Add(varTable,db);
|
2025-07-02 18:33:08 +08:00
|
|
|
|
|
|
|
|
|
|
// 5. 添加变量表菜单
|
|
|
|
|
|
MenuBean newMenu = new MenuBean
|
|
|
|
|
|
{
|
|
|
|
|
|
Icon = SegoeFluentIcons.Tablet.Glyph,
|
|
|
|
|
|
Name = varTable.Name,
|
2025-07-04 18:33:48 +08:00
|
|
|
|
DataId = addVarTable.Id, // 使用实际添加的ID
|
2025-07-02 18:33:08 +08:00
|
|
|
|
Type = MenuType.VariableTableMenu,
|
|
|
|
|
|
ParentId = menu.Parent.Id
|
|
|
|
|
|
};
|
|
|
|
|
|
|
2025-07-04 18:33:48 +08:00
|
|
|
|
var addMenuRes = await _menuRepository.Add(newMenu,db);
|
2025-07-02 18:33:08 +08:00
|
|
|
|
if (addMenuRes > 0)
|
|
|
|
|
|
{
|
2025-07-04 18:33:48 +08:00
|
|
|
|
await db.CommitTranAsync();
|
2025-07-02 18:33:08 +08:00
|
|
|
|
// 变量表和菜单都添加成功
|
|
|
|
|
|
MessageHelper.SendLoadMessage(LoadTypes.Menu);
|
|
|
|
|
|
MessageHelper.SendLoadMessage(LoadTypes.Devices);
|
|
|
|
|
|
NotificationHelper.ShowMessage($"变量表:{varTable.Name},添加成功", NotificationType.Success);
|
|
|
|
|
|
_logger.LogInformation($"变量表:{varTable.Name},添加成功");
|
|
|
|
|
|
}
|
|
|
|
|
|
else
|
|
|
|
|
|
{
|
2025-07-04 18:33:48 +08:00
|
|
|
|
await db.RollbackTranAsync();
|
2025-07-02 18:33:08 +08:00
|
|
|
|
// 变量表菜单添加失败 (此时变量表可能已添加成功,需要根据业务决定是否回滚)
|
|
|
|
|
|
NotificationHelper.ShowMessage($"变量表:{varTable.Name},添加菜单失败", NotificationType.Error);
|
|
|
|
|
|
_logger.LogError($"变量表:{varTable.Name},添加菜单失败");
|
|
|
|
|
|
// 考虑:如果菜单添加失败,是否需要删除之前添加的变量表?
|
|
|
|
|
|
// 例如:await _varTableRepository.Delete(addVarTableId);
|
2025-07-02 12:01:20 +08:00
|
|
|
|
}
|
|
|
|
|
|
}
|
|
|
|
|
|
catch (Exception e)
|
|
|
|
|
|
{
|
2025-07-04 18:33:48 +08:00
|
|
|
|
await db.RollbackTranAsync();
|
2025-07-02 18:33:08 +08:00
|
|
|
|
// 捕获并记录所有未预料的异常
|
2025-07-04 18:33:48 +08:00
|
|
|
|
_logger.LogError($"添加变量表时出现了未预期的错误:{e}");
|
2025-07-02 12:01:20 +08:00
|
|
|
|
NotificationHelper.ShowMessage($"添加变量表时出现了错误:{e.Message}", NotificationType.Error);
|
|
|
|
|
|
}
|
2025-06-26 19:36:27 +08:00
|
|
|
|
}
|
2025-07-03 15:03:36 +08:00
|
|
|
|
|
|
|
|
|
|
/// <summary>
|
|
|
|
|
|
/// 处理菜单选择变化的逻辑。
|
|
|
|
|
|
/// </summary>
|
|
|
|
|
|
/// <param name="menu">被选中的菜单项。</param>
|
|
|
|
|
|
public async Task MenuSelectionChanged(MenuBean menu)
|
|
|
|
|
|
{
|
|
|
|
|
|
try
|
|
|
|
|
|
{
|
|
|
|
|
|
switch (menu.Type)
|
|
|
|
|
|
{
|
2025-07-05 21:49:41 +08:00
|
|
|
|
// 导航到一级菜单
|
2025-07-03 15:03:36 +08:00
|
|
|
|
case MenuType.MainMenu:
|
|
|
|
|
|
menu.ViewModel = DataServicesHelper.GetMainViewModel(menu.Name);
|
|
|
|
|
|
break;
|
2025-07-05 21:49:41 +08:00
|
|
|
|
// 导航到设备下面的菜单
|
2025-07-03 15:03:36 +08:00
|
|
|
|
case MenuType.DeviceMenu:
|
|
|
|
|
|
menu.ViewModel = App.Current.Services.GetRequiredService<DeviceDetailViewModel>();
|
|
|
|
|
|
menu.Data = _dataServices.Devices.FirstOrDefault(d => d.Id == menu.DataId);
|
|
|
|
|
|
break;
|
2025-07-05 21:49:41 +08:00
|
|
|
|
// 导航到变量表菜单
|
2025-07-03 15:03:36 +08:00
|
|
|
|
case MenuType.VariableTableMenu:
|
|
|
|
|
|
VariableTableViewModel varTableVM =
|
|
|
|
|
|
App.Current.Services.GetRequiredService<VariableTableViewModel>();
|
|
|
|
|
|
varTableVM.VariableTable =
|
|
|
|
|
|
DataServicesHelper.FindVarTableForDevice(_dataServices.Devices, menu.DataId);
|
|
|
|
|
|
|
|
|
|
|
|
varTableVM.IsLoadCompletion = false;
|
|
|
|
|
|
menu.ViewModel = varTableVM;
|
|
|
|
|
|
menu.Data = varTableVM.VariableTable;
|
|
|
|
|
|
break;
|
2025-07-05 21:49:41 +08:00
|
|
|
|
// 导航到添加变量表的菜单
|
2025-07-03 15:03:36 +08:00
|
|
|
|
case MenuType.AddVariableTableMenu:
|
|
|
|
|
|
await AddVariableTable(menu);
|
2025-07-05 21:49:41 +08:00
|
|
|
|
return;
|
2025-07-03 15:03:36 +08:00
|
|
|
|
break;
|
2025-07-05 21:49:41 +08:00
|
|
|
|
|
2025-07-03 15:03:36 +08:00
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
if (menu.ViewModel != null)
|
|
|
|
|
|
{
|
|
|
|
|
|
MessageHelper.SendNavgatorMessage(menu.ViewModel);
|
|
|
|
|
|
_logger.LogInformation($"导航到:{menu.Name}");
|
|
|
|
|
|
}
|
|
|
|
|
|
else
|
|
|
|
|
|
{
|
|
|
|
|
|
NotificationHelper.ShowMessage($"菜单:{menu.Name},没有对应的ViewModel.");
|
|
|
|
|
|
_logger.LogInformation($"菜单:{menu.Name},没有对应的ViewModel.");
|
|
|
|
|
|
}
|
|
|
|
|
|
}
|
|
|
|
|
|
catch (Exception e)
|
|
|
|
|
|
{
|
|
|
|
|
|
_logger.LogError($"菜单切换是出现了错误:{e}");
|
|
|
|
|
|
NotificationHelper.ShowMessage($"菜单切换是出现了错误:{e.Message}", NotificationType.Error);
|
|
|
|
|
|
}
|
|
|
|
|
|
}
|
2025-06-23 17:01:06 +08:00
|
|
|
|
}
|