2
3 - 实现触发器与菜单联动功能,现在可以同时创建触发器及其关联的菜单项
4 - 添加触发器更改事件系统,用于通知UI和其他组件触发器状态的变化
5 - 优化触发器管理服务,改进了添加、修改和删除触发器的逻辑
6 - 将CreateTriggerAsync方法重命名为AddTriggerAsync,使其语义更准确
7 - 修改UpdateTriggerAsync方法的参数和返回值类型,提高一致性
8 - 添加CreateTriggerWithMenuAsync方法用于同时创建触发器和菜单
9 - 在应用层重构触发器管理逻辑,增加事务支持确保数据一致性
10 - 更新菜单管理服务,改进并发安全处理
11 - 调整数据存储服务,使其同步触发器和菜单更新
12 - 更新触发器对话框和列表视图模型,提升用户体验
13 - 在依赖注入容器中注册触发器服务
14 - 修复设备数据服务中的异步调用问题,确保菜单项的正确处理
15 - 添加缺失的触发器项映射配置
16 - 创建TriggerChangedEventArgs类处理触发器更改事件
211 lines
7.5 KiB
C#
211 lines
7.5 KiB
C#
using System.Collections.ObjectModel;
|
|
using AutoMapper;
|
|
using CommunityToolkit.Mvvm.ComponentModel;
|
|
using CommunityToolkit.Mvvm.Input;
|
|
using DMS.Application.DTOs;
|
|
using DMS.Core.Enums;
|
|
using DMS.Core.Models;
|
|
using DMS.Core.Models.Triggers;
|
|
using DMS.WPF.Interfaces;
|
|
using DMS.WPF.ViewModels.Dialogs;
|
|
using DMS.WPF.ItemViewModel;
|
|
using Microsoft.Extensions.DependencyInjection;
|
|
using ObservableCollections;
|
|
|
|
namespace DMS.WPF.ViewModels
|
|
{
|
|
/// <summary>
|
|
/// 触发器管理视图模型
|
|
/// </summary>
|
|
public partial class TriggersViewModel : ViewModelBase
|
|
{
|
|
private readonly IMapper _mapper;
|
|
private readonly ITriggerDataService _triggerDataService;
|
|
private readonly IDataStorageService _dataStorageService;
|
|
private readonly IDialogService _dialogService;
|
|
private readonly INotificationService _notificationService;
|
|
private readonly INavigationService _navigationService;
|
|
|
|
public ISynchronizedView<KeyValuePair<int, TriggerItem>, TriggerItem> _synchronizedView;
|
|
public NotifyCollectionChangedSynchronizedViewList<TriggerItem> TriggerItemListView { get; }
|
|
|
|
[ObservableProperty]
|
|
private ObservableDictionary<int, TriggerItem> _triggers;
|
|
|
|
[ObservableProperty]
|
|
private TriggerItem? _selectedTrigger;
|
|
|
|
public TriggersViewModel(
|
|
IMapper mapper,
|
|
ITriggerDataService triggerDataService,
|
|
IDataStorageService dataStorageService,
|
|
IDialogService dialogService,
|
|
INotificationService notificationService,
|
|
INavigationService navigationService)
|
|
{
|
|
_mapper = mapper;
|
|
_triggerDataService = triggerDataService ?? throw new ArgumentNullException(nameof(triggerDataService));
|
|
_dataStorageService = dataStorageService ?? throw new ArgumentNullException(nameof(dataStorageService));
|
|
_dialogService = dialogService ?? throw new ArgumentNullException(nameof(dialogService));
|
|
_notificationService = notificationService ?? throw new ArgumentNullException(nameof(notificationService));
|
|
_navigationService = navigationService ?? throw new ArgumentNullException(nameof(navigationService));
|
|
|
|
// 初始化时加载触发器数据
|
|
_synchronizedView = _dataStorageService.Triggers.CreateView(v => v.Value);
|
|
TriggerItemListView = _synchronizedView.ToNotifyCollectionChanged();
|
|
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
/// <summary>
|
|
/// 添加新触发器
|
|
/// </summary>
|
|
[RelayCommand]
|
|
private async Task AddTriggerAsync()
|
|
{
|
|
var newTrigger = new TriggerItem()
|
|
{
|
|
IsActive = true,
|
|
Action = Core.Models.Triggers.ActionType.SendEmail,
|
|
Name = "新建触发器",
|
|
Description = "新建触发器",
|
|
CreatedAt = DateTime.Now,
|
|
UpdatedAt = DateTime.Now
|
|
};
|
|
|
|
TriggerDialogViewModel viewModel = App.Current.Services.GetRequiredService<TriggerDialogViewModel>();
|
|
await viewModel.OnInitializedAsync(newTrigger);
|
|
|
|
var result = await _dialogService.ShowDialogAsync(viewModel);
|
|
if (result is null) return;
|
|
|
|
try
|
|
{
|
|
|
|
// 使用TriggerDataService添加触发器和菜单
|
|
var resTriggerItem = await _triggerDataService.AddTrigger(result);
|
|
|
|
if (resTriggerItem is not null)
|
|
{
|
|
// 更新UI显示
|
|
_notificationService.ShowSuccess($"触发器创建成功:{resTriggerItem.Name}");
|
|
}
|
|
else
|
|
{
|
|
_notificationService.ShowError("触发器创建失败");
|
|
}
|
|
}
|
|
catch (Exception ex)
|
|
{
|
|
_notificationService.ShowError($"创建触发器失败: {ex.Message},");
|
|
}
|
|
}
|
|
|
|
/// <summary>
|
|
/// 编辑选中的触发器
|
|
/// </summary>
|
|
[RelayCommand]
|
|
private async Task EditTriggerAsync()
|
|
{
|
|
if (SelectedTrigger == null)
|
|
{
|
|
_notificationService.ShowWarn("请先选择一个触发器");
|
|
return;
|
|
}
|
|
|
|
// 传递副本以避免直接修改原始对象
|
|
TriggerItem triggerItemToEdit = new TriggerItem();
|
|
_mapper.Map(SelectedTrigger, triggerItemToEdit);
|
|
|
|
TriggerDialogViewModel viewModel = App.Current.Services.GetRequiredService<TriggerDialogViewModel>();
|
|
await viewModel.OnInitializedAsync(triggerItemToEdit);
|
|
|
|
var result = await _dialogService.ShowDialogAsync(viewModel);
|
|
if (result != null)
|
|
{
|
|
try
|
|
{
|
|
// 使用TriggerDataService更新触发器
|
|
var updatedTrigger = await _triggerDataService.UpdateTrigger(result);
|
|
if (updatedTrigger)
|
|
{
|
|
_notificationService.ShowSuccess("触发器更新成功");
|
|
}
|
|
else
|
|
{
|
|
_notificationService.ShowError("触发器更新失败");
|
|
}
|
|
}
|
|
catch (Exception ex)
|
|
{
|
|
_notificationService.ShowError($"更新触发器失败: {ex.Message}");
|
|
}
|
|
}
|
|
}
|
|
|
|
/// <summary>
|
|
/// 删除选中的触发器
|
|
/// </summary>
|
|
[RelayCommand]
|
|
private async Task DeleteTriggerAsync()
|
|
{
|
|
if (SelectedTrigger == null)
|
|
{
|
|
_notificationService.ShowWarn("请先选择一个触发器");
|
|
return;
|
|
}
|
|
|
|
var confirm = await _dialogService.ShowDialogAsync(new ConfirmDialogViewModel("确认删除", $"确定要删除触发器 '{SelectedTrigger.Description}' 吗?", "删除"));
|
|
if (confirm)
|
|
{
|
|
try
|
|
{
|
|
// 使用TriggerDataService删除触发器
|
|
var success = await _triggerDataService.DeleteTrigger(SelectedTrigger);
|
|
if (success)
|
|
{
|
|
_notificationService.ShowSuccess("触发器删除成功");
|
|
}
|
|
else
|
|
{
|
|
_notificationService.ShowError("触发器删除失败");
|
|
}
|
|
}
|
|
catch (Exception ex)
|
|
{
|
|
_notificationService.ShowError($"删除触发器失败: {ex.Message}");
|
|
}
|
|
}
|
|
}
|
|
|
|
/// <summary>
|
|
/// 刷新触发器列表
|
|
/// </summary>
|
|
[RelayCommand]
|
|
private async Task RefreshAsync()
|
|
{
|
|
try
|
|
{
|
|
// 重新加载所有触发器数据
|
|
_triggerDataService.LoadAllTriggers();
|
|
_notificationService.ShowSuccess("触发器列表已刷新");
|
|
}
|
|
catch (Exception ex)
|
|
{
|
|
_notificationService.ShowError($"刷新触发器列表失败: {ex.Message}");
|
|
}
|
|
}
|
|
|
|
[RelayCommand]
|
|
public void NavigateToTriggerDetail()
|
|
{
|
|
if (SelectedTrigger == null) return;
|
|
|
|
_navigationService.NavigateToAsync(this, new NavigationParameter(nameof(TriggerDetailViewModel), SelectedTrigger.Id, NavigationType.Trigger));
|
|
}
|
|
|
|
}
|
|
} |