2025-09-14 16:16:10 +08:00
|
|
|
using System.Collections.ObjectModel;
|
|
|
|
|
using CommunityToolkit.Mvvm.ComponentModel;
|
|
|
|
|
using CommunityToolkit.Mvvm.Input;
|
2025-09-16 12:29:09 +08:00
|
|
|
using DMS.Application.DTOs;
|
2025-09-14 16:16:10 +08:00
|
|
|
using DMS.WPF.Interfaces;
|
2025-09-14 19:13:40 +08:00
|
|
|
using DMS.WPF.ViewModels.Dialogs;
|
2025-09-23 06:51:29 +08:00
|
|
|
using DMS.WPF.ViewModels.Items;
|
2025-09-14 19:13:40 +08:00
|
|
|
using Microsoft.Extensions.DependencyInjection;
|
2025-09-23 06:51:29 +08:00
|
|
|
using ObservableCollections;
|
2025-09-14 16:16:10 +08:00
|
|
|
|
2025-09-23 06:51:29 +08:00
|
|
|
namespace DMS.WPF.ViewModels
|
2025-09-14 16:16:10 +08:00
|
|
|
{
|
|
|
|
|
/// <summary>
|
|
|
|
|
/// 触发器管理视图模型
|
|
|
|
|
/// </summary>
|
|
|
|
|
public partial class TriggersViewModel : ViewModelBase
|
|
|
|
|
{
|
2025-09-23 06:51:29 +08:00
|
|
|
private readonly ITriggerDataService _triggerDataService;
|
|
|
|
|
private readonly IDataStorageService _dataStorageService;
|
2025-09-14 16:16:10 +08:00
|
|
|
private readonly IDialogService _dialogService;
|
|
|
|
|
private readonly INotificationService _notificationService;
|
|
|
|
|
|
|
|
|
|
[ObservableProperty]
|
2025-09-23 06:51:29 +08:00
|
|
|
private ObservableDictionary<int, TriggerItemViewModel> _triggers ;
|
2025-09-14 16:16:10 +08:00
|
|
|
|
|
|
|
|
[ObservableProperty]
|
2025-09-23 06:51:29 +08:00
|
|
|
private TriggerItemViewModel? _selectedTrigger;
|
2025-09-14 16:16:10 +08:00
|
|
|
|
|
|
|
|
public TriggersViewModel(
|
2025-09-23 06:51:29 +08:00
|
|
|
ITriggerDataService triggerDataService,
|
|
|
|
|
IDataStorageService dataStorageService,
|
2025-09-14 16:16:10 +08:00
|
|
|
IDialogService dialogService,
|
|
|
|
|
INotificationService notificationService)
|
|
|
|
|
{
|
2025-09-23 06:51:29 +08:00
|
|
|
_triggerDataService = triggerDataService ?? throw new ArgumentNullException(nameof(triggerDataService));
|
|
|
|
|
_dataStorageService = dataStorageService ?? throw new ArgumentNullException(nameof(dataStorageService));
|
2025-09-14 16:16:10 +08:00
|
|
|
_dialogService = dialogService ?? throw new ArgumentNullException(nameof(dialogService));
|
|
|
|
|
_notificationService = notificationService ?? throw new ArgumentNullException(nameof(notificationService));
|
2025-09-23 06:51:29 +08:00
|
|
|
|
|
|
|
|
// 初始化时加载触发器数据
|
|
|
|
|
Triggers=_dataStorageService.Triggers;
|
2025-09-14 16:16:10 +08:00
|
|
|
}
|
|
|
|
|
|
2025-09-23 06:51:29 +08:00
|
|
|
|
2025-09-14 16:16:10 +08:00
|
|
|
|
|
|
|
|
/// <summary>
|
|
|
|
|
/// 添加新触发器
|
|
|
|
|
/// </summary>
|
|
|
|
|
[RelayCommand]
|
|
|
|
|
private async Task AddTriggerAsync()
|
|
|
|
|
{
|
2025-09-23 06:51:29 +08:00
|
|
|
var newTrigger = new TriggerItemViewModel()
|
|
|
|
|
{
|
|
|
|
|
IsActive = true,
|
|
|
|
|
Condition = Core.Models.Triggers.ConditionType.GreaterThan,
|
|
|
|
|
Action = Core.Models.Triggers.ActionType.SendEmail,
|
|
|
|
|
Description = "新建触发器",
|
|
|
|
|
CreatedAt = DateTime.UtcNow,
|
|
|
|
|
UpdatedAt = DateTime.UtcNow
|
2025-09-14 16:16:10 +08:00
|
|
|
};
|
|
|
|
|
|
2025-09-14 19:13:40 +08:00
|
|
|
TriggerDialogViewModel viewModel = App.Current.Services.GetRequiredService<TriggerDialogViewModel>();
|
|
|
|
|
await viewModel.OnInitializedAsync(newTrigger);
|
|
|
|
|
|
|
|
|
|
var result = await _dialogService.ShowDialogAsync(viewModel);
|
2025-09-14 16:16:10 +08:00
|
|
|
if (result != null)
|
|
|
|
|
{
|
|
|
|
|
try
|
|
|
|
|
{
|
2025-09-23 06:51:29 +08:00
|
|
|
// 使用TriggerDataService添加触发器
|
|
|
|
|
var createdTrigger = await _triggerDataService.AddTrigger(newTrigger);
|
|
|
|
|
|
|
|
|
|
if (createdTrigger != null )
|
|
|
|
|
{
|
|
|
|
|
// 触发器已添加到数据存储中,只需更新本地集合
|
|
|
|
|
_notificationService.ShowSuccess("触发器创建成功");
|
|
|
|
|
}
|
|
|
|
|
else
|
|
|
|
|
{
|
|
|
|
|
_notificationService.ShowError("触发器创建失败");
|
|
|
|
|
}
|
2025-09-14 16:16:10 +08:00
|
|
|
}
|
|
|
|
|
catch (Exception ex)
|
|
|
|
|
{
|
|
|
|
|
_notificationService.ShowError($"创建触发器失败: {ex.Message}");
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
/// <summary>
|
|
|
|
|
/// 编辑选中的触发器
|
|
|
|
|
/// </summary>
|
|
|
|
|
[RelayCommand]
|
|
|
|
|
private async Task EditTriggerAsync()
|
|
|
|
|
{
|
|
|
|
|
if (SelectedTrigger == null)
|
|
|
|
|
{
|
2025-09-14 19:13:40 +08:00
|
|
|
_notificationService.ShowWarn("请先选择一个触发器");
|
2025-09-14 16:16:10 +08:00
|
|
|
return;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
// 传递副本以避免直接修改原始对象
|
|
|
|
|
var triggerToEdit = new TriggerDefinitionDto
|
|
|
|
|
{
|
|
|
|
|
Id = SelectedTrigger.Id,
|
2025-09-22 22:58:51 +08:00
|
|
|
VariableIds = new List<int>(SelectedTrigger.VariableIds),
|
2025-09-14 16:16:10 +08:00
|
|
|
IsActive = SelectedTrigger.IsActive,
|
|
|
|
|
Condition = SelectedTrigger.Condition,
|
|
|
|
|
Threshold = SelectedTrigger.Threshold,
|
|
|
|
|
LowerBound = SelectedTrigger.LowerBound,
|
|
|
|
|
UpperBound = SelectedTrigger.UpperBound,
|
|
|
|
|
Action = SelectedTrigger.Action,
|
|
|
|
|
ActionConfigurationJson = SelectedTrigger.ActionConfigurationJson,
|
|
|
|
|
SuppressionDuration = SelectedTrigger.SuppressionDuration,
|
|
|
|
|
LastTriggeredAt = SelectedTrigger.LastTriggeredAt,
|
|
|
|
|
Description = SelectedTrigger.Description,
|
|
|
|
|
CreatedAt = SelectedTrigger.CreatedAt,
|
|
|
|
|
UpdatedAt = SelectedTrigger.UpdatedAt
|
|
|
|
|
};
|
2025-09-23 06:51:29 +08:00
|
|
|
|
2025-09-14 19:13:40 +08:00
|
|
|
TriggerDialogViewModel viewModel = App.Current.Services.GetRequiredService<TriggerDialogViewModel>();
|
|
|
|
|
await viewModel.OnInitializedAsync(triggerToEdit);
|
2025-09-14 16:16:10 +08:00
|
|
|
|
2025-09-14 19:13:40 +08:00
|
|
|
var result = await _dialogService.ShowDialogAsync(viewModel);
|
2025-09-14 16:16:10 +08:00
|
|
|
if (result != null)
|
|
|
|
|
{
|
|
|
|
|
try
|
|
|
|
|
{
|
2025-09-23 06:51:29 +08:00
|
|
|
// 使用TriggerDataService更新触发器
|
|
|
|
|
var updatedTrigger = await _triggerDataService.UpdateTrigger(SelectedTrigger);
|
|
|
|
|
if (updatedTrigger)
|
2025-09-14 16:16:10 +08:00
|
|
|
{
|
|
|
|
|
_notificationService.ShowSuccess("触发器更新成功");
|
|
|
|
|
}
|
|
|
|
|
else
|
|
|
|
|
{
|
2025-09-23 06:51:29 +08:00
|
|
|
_notificationService.ShowError("触发器更新失败");
|
2025-09-14 16:16:10 +08:00
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
catch (Exception ex)
|
|
|
|
|
{
|
|
|
|
|
_notificationService.ShowError($"更新触发器失败: {ex.Message}");
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
/// <summary>
|
|
|
|
|
/// 删除选中的触发器
|
|
|
|
|
/// </summary>
|
|
|
|
|
[RelayCommand]
|
|
|
|
|
private async Task DeleteTriggerAsync()
|
|
|
|
|
{
|
|
|
|
|
if (SelectedTrigger == null)
|
|
|
|
|
{
|
2025-09-14 19:13:40 +08:00
|
|
|
_notificationService.ShowWarn("请先选择一个触发器");
|
2025-09-14 16:16:10 +08:00
|
|
|
return;
|
|
|
|
|
}
|
|
|
|
|
|
2025-09-14 19:13:40 +08:00
|
|
|
var confirm = await _dialogService.ShowDialogAsync(new ConfirmDialogViewModel("确认删除", $"确定要删除触发器 '{SelectedTrigger.Description}' 吗?","删除"));
|
2025-09-14 16:16:10 +08:00
|
|
|
if (confirm)
|
|
|
|
|
{
|
|
|
|
|
try
|
|
|
|
|
{
|
2025-09-23 06:51:29 +08:00
|
|
|
// 使用TriggerDataService删除触发器
|
|
|
|
|
var success = await _triggerDataService.DeleteTrigger(SelectedTrigger);
|
2025-09-14 16:16:10 +08:00
|
|
|
if (success)
|
|
|
|
|
{
|
|
|
|
|
_notificationService.ShowSuccess("触发器删除成功");
|
|
|
|
|
}
|
|
|
|
|
else
|
|
|
|
|
{
|
|
|
|
|
_notificationService.ShowError("触发器删除失败");
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
catch (Exception ex)
|
|
|
|
|
{
|
|
|
|
|
_notificationService.ShowError($"删除触发器失败: {ex.Message}");
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
}
|
|
|
|
|
}
|