2025-09-23 06:51:29 +08:00
|
|
|
using AutoMapper;
|
|
|
|
|
using DMS.Application.DTOs;
|
|
|
|
|
using DMS.Application.Interfaces;
|
2025-10-19 17:53:23 +08:00
|
|
|
using DMS.Application.Services;
|
|
|
|
|
using DMS.Core.Enums;
|
2025-09-23 06:51:29 +08:00
|
|
|
using DMS.Core.Events;
|
2025-10-19 20:34:20 +08:00
|
|
|
using DMS.Core.Models;
|
2025-10-18 17:18:09 +08:00
|
|
|
using DMS.Core.Models.Triggers;
|
2025-09-23 06:51:29 +08:00
|
|
|
using DMS.WPF.Interfaces;
|
2025-10-06 18:17:56 +08:00
|
|
|
using DMS.WPF.ItemViewModel;
|
2025-10-19 20:34:20 +08:00
|
|
|
using DMS.WPF.ViewModels;
|
|
|
|
|
using HandyControl.Data;
|
2025-09-23 06:51:29 +08:00
|
|
|
using Opc.Ua;
|
2025-10-19 20:34:20 +08:00
|
|
|
using System.Windows;
|
|
|
|
|
using System.Windows.Controls;
|
2025-10-19 17:53:23 +08:00
|
|
|
using System.Windows.Threading;
|
2025-09-23 06:51:29 +08:00
|
|
|
|
|
|
|
|
namespace DMS.WPF.Services;
|
|
|
|
|
|
|
|
|
|
/// <summary>
|
|
|
|
|
/// 触发器数据服务类,负责管理触发器相关的数据和操作。
|
|
|
|
|
/// </summary>
|
|
|
|
|
public class TriggerDataService : ITriggerDataService
|
|
|
|
|
{
|
|
|
|
|
private readonly IMapper _mapper;
|
2025-10-18 17:18:09 +08:00
|
|
|
private readonly IAppCenterService _appCenterService;
|
2025-10-20 22:47:22 +08:00
|
|
|
private readonly IMenuViewService _menuDataService;
|
2025-10-22 14:06:16 +08:00
|
|
|
private readonly IAppDataService _appDataService;
|
|
|
|
|
private readonly IViewDataService _viewDataService;
|
2025-09-23 06:51:29 +08:00
|
|
|
private readonly IEventService _eventService;
|
|
|
|
|
private readonly INotificationService _notificationService;
|
|
|
|
|
private readonly Dispatcher _uiDispatcher;
|
|
|
|
|
|
|
|
|
|
/// <summary>
|
|
|
|
|
/// TriggerDataService类的构造函数。
|
|
|
|
|
/// </summary>
|
|
|
|
|
/// <param name="mapper">AutoMapper 实例。</param>
|
2025-10-18 17:18:09 +08:00
|
|
|
/// <param name="appCenterService">数据服务中心实例。</param>
|
|
|
|
|
/// <param name="appStorageService">应用数据存储服务实例。</param>
|
2025-09-23 06:51:29 +08:00
|
|
|
/// <param name="dataStorageService">数据存储服务实例。</param>
|
|
|
|
|
/// <param name="eventService">事件服务实例。</param>
|
|
|
|
|
/// <param name="notificationService">通知服务实例。</param>
|
2025-10-18 17:18:09 +08:00
|
|
|
public TriggerDataService(IMapper mapper, IAppCenterService appCenterService,
|
2025-10-20 22:47:22 +08:00
|
|
|
IMenuViewService menuDataService,
|
2025-10-22 14:06:16 +08:00
|
|
|
IAppDataService appStorageService, IViewDataService dataStorageService,
|
2025-09-23 06:51:29 +08:00
|
|
|
IEventService eventService, INotificationService notificationService)
|
|
|
|
|
{
|
|
|
|
|
_mapper = mapper;
|
2025-10-18 17:18:09 +08:00
|
|
|
_appCenterService = appCenterService;
|
2025-10-19 20:34:20 +08:00
|
|
|
_menuDataService = menuDataService;
|
2025-10-22 14:06:16 +08:00
|
|
|
_appDataService = appStorageService;
|
|
|
|
|
_viewDataService = dataStorageService;
|
2025-09-23 06:51:29 +08:00
|
|
|
_eventService = eventService;
|
|
|
|
|
_notificationService = notificationService;
|
|
|
|
|
_uiDispatcher = Dispatcher.CurrentDispatcher;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
/// <summary>
|
|
|
|
|
/// 加载所有触发器数据。
|
|
|
|
|
/// </summary>
|
|
|
|
|
public void LoadAllTriggers()
|
|
|
|
|
{
|
2025-10-22 14:06:16 +08:00
|
|
|
_viewDataService.Triggers.Clear();
|
|
|
|
|
foreach (var trigger in _appDataService.Triggers.Values)
|
2025-09-23 06:51:29 +08:00
|
|
|
{
|
2025-10-20 18:54:43 +08:00
|
|
|
TriggerItem triggerItem = _mapper.Map<TriggerItem>(trigger);
|
|
|
|
|
foreach (var variable in trigger.Variables)
|
|
|
|
|
{
|
2025-10-22 14:06:16 +08:00
|
|
|
if (_viewDataService.Variables.TryGetValue(variable.Id,out var variableItem))
|
2025-10-20 18:54:43 +08:00
|
|
|
{
|
|
|
|
|
variableItem.Triggers.Add(triggerItem);
|
|
|
|
|
triggerItem.Variables.Add(variableItem);
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
2025-10-22 14:06:16 +08:00
|
|
|
_viewDataService.Triggers.Add(trigger.Id, triggerItem);
|
2025-09-23 06:51:29 +08:00
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
/// <summary>
|
|
|
|
|
/// 添加触发器。
|
|
|
|
|
/// </summary>
|
2025-10-18 18:23:14 +08:00
|
|
|
public async Task<TriggerItem> AddTrigger(TriggerItem triggerItem)
|
2025-09-23 06:51:29 +08:00
|
|
|
{
|
|
|
|
|
// 添加null检查
|
2025-10-19 20:34:20 +08:00
|
|
|
if (triggerItem is null) return null;
|
2025-09-23 06:51:29 +08:00
|
|
|
|
|
|
|
|
var addDto
|
2025-10-19 20:34:20 +08:00
|
|
|
= await _appCenterService.TriggerManagementService.AddTriggerAsync(
|
|
|
|
|
_mapper.Map<Core.Models.Triggers.Trigger>(triggerItem));
|
2025-09-23 06:51:29 +08:00
|
|
|
|
|
|
|
|
// 添加null检查
|
2025-10-19 20:34:20 +08:00
|
|
|
if (addDto is null) return null;
|
|
|
|
|
|
|
|
|
|
// 给界面添加触发器
|
|
|
|
|
var addItem = _mapper.Map(addDto, triggerItem);
|
|
|
|
|
|
2025-10-22 14:06:16 +08:00
|
|
|
_viewDataService.Triggers.Add(triggerItem.Id, triggerItem);
|
2025-10-19 20:34:20 +08:00
|
|
|
|
|
|
|
|
//添加菜单
|
|
|
|
|
|
2025-10-22 14:06:16 +08:00
|
|
|
var parentMenu=_viewDataService.Menus.FirstOrDefault(m => m.TargetViewKey == nameof(TriggersViewModel) && m.TargetId == 0);
|
2025-10-19 20:34:20 +08:00
|
|
|
if (parentMenu is not null)
|
2025-09-23 06:51:29 +08:00
|
|
|
{
|
2025-10-19 20:34:20 +08:00
|
|
|
var menuItem = new ItemViewModel.MenuItem()
|
|
|
|
|
{
|
|
|
|
|
Header = triggerItem.Name,
|
|
|
|
|
ParentId=parentMenu.Id,
|
|
|
|
|
MenuType=MenuType.TriggerMenu,
|
|
|
|
|
TargetId=addItem.Id,
|
|
|
|
|
Icon = "\uE945", // 使用触发器图标
|
|
|
|
|
TargetViewKey = nameof(TriggerDetailViewModel),
|
|
|
|
|
};
|
2025-10-20 22:47:22 +08:00
|
|
|
_menuDataService.AddMenuToView(menuItem);
|
2025-10-19 20:34:20 +08:00
|
|
|
|
2025-09-23 06:51:29 +08:00
|
|
|
}
|
2025-10-19 20:34:20 +08:00
|
|
|
|
2025-09-23 06:51:29 +08:00
|
|
|
|
|
|
|
|
|
|
|
|
|
return addItem;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
/// <summary>
|
|
|
|
|
/// 删除触发器。
|
|
|
|
|
/// </summary>
|
2025-10-06 18:17:56 +08:00
|
|
|
public async Task<bool> DeleteTrigger(TriggerItem trigger)
|
2025-09-23 06:51:29 +08:00
|
|
|
{
|
|
|
|
|
// 从数据库删除触发器数据
|
2025-10-19 20:34:20 +08:00
|
|
|
if (await _appCenterService.TriggerManagementService.DeleteTriggerAsync(trigger.Id))
|
2025-09-23 06:51:29 +08:00
|
|
|
{
|
2025-10-19 20:34:20 +08:00
|
|
|
//删除菜单
|
2025-10-22 14:06:16 +08:00
|
|
|
var menu=_viewDataService.Menus.FirstOrDefault(m => m.MenuType == MenuType.TriggerMenu && m.TargetId == trigger.Id);
|
2025-10-19 20:34:20 +08:00
|
|
|
if (menu is not null)
|
|
|
|
|
{
|
2025-10-22 14:06:16 +08:00
|
|
|
_menuDataService.DeleteMenuToView(menu);
|
2025-10-19 20:34:20 +08:00
|
|
|
}
|
2025-09-23 06:51:29 +08:00
|
|
|
|
2025-10-19 20:34:20 +08:00
|
|
|
// 从界面删除触发器
|
2025-10-22 14:06:16 +08:00
|
|
|
_viewDataService.Triggers.Remove(trigger.Id);
|
2025-09-23 06:51:29 +08:00
|
|
|
|
2025-10-19 20:34:20 +08:00
|
|
|
return true;
|
|
|
|
|
}
|
|
|
|
|
return false;
|
2025-09-23 06:51:29 +08:00
|
|
|
}
|
|
|
|
|
|
2025-10-19 17:53:23 +08:00
|
|
|
/// <summary>
|
|
|
|
|
/// 添加触发器及其关联菜单。
|
|
|
|
|
/// </summary>
|
2025-10-19 20:34:20 +08:00
|
|
|
public async Task<CreateTriggerWithMenuDto> CreateTriggerWithMenu(CreateTriggerWithMenuDto dto)
|
2025-10-19 17:53:23 +08:00
|
|
|
{
|
|
|
|
|
// 添加null检查
|
|
|
|
|
if (dto == null || dto.Trigger == null)
|
|
|
|
|
return null;
|
|
|
|
|
|
|
|
|
|
try
|
|
|
|
|
{
|
|
|
|
|
// 首先添加触发器
|
2025-10-19 20:34:20 +08:00
|
|
|
var createdTrigger = await _appCenterService.TriggerManagementService.CreateTriggerWithMenuAsync(dto);
|
2025-10-19 17:53:23 +08:00
|
|
|
if (createdTrigger == null)
|
|
|
|
|
return null;
|
|
|
|
|
|
|
|
|
|
|
2025-10-19 20:34:20 +08:00
|
|
|
// 添加到UI数据存储
|
|
|
|
|
var addItem = _mapper.Map<TriggerItem>(createdTrigger.Trigger);
|
2025-10-22 14:06:16 +08:00
|
|
|
_viewDataService.Triggers.Add(addItem.Id, addItem);
|
2025-10-19 17:53:23 +08:00
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
return dto;
|
|
|
|
|
}
|
|
|
|
|
catch (Exception ex)
|
|
|
|
|
{
|
|
|
|
|
_notificationService?.ShowError($"添加触发器及菜单时发生错误:{ex.Message}", ex);
|
|
|
|
|
return null;
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
2025-09-23 06:51:29 +08:00
|
|
|
/// <summary>
|
|
|
|
|
/// 更新触发器。
|
|
|
|
|
/// </summary>
|
2025-10-19 20:34:20 +08:00
|
|
|
public async Task<bool> UpdateTrigger(TriggerItem triggerItem)
|
2025-09-23 06:51:29 +08:00
|
|
|
{
|
2025-10-22 14:06:16 +08:00
|
|
|
if (_appDataService.Triggers.TryGetValue(triggerItem.Id, out var triggerDto))
|
2025-09-23 06:51:29 +08:00
|
|
|
{
|
2025-10-19 20:34:20 +08:00
|
|
|
_mapper.Map(triggerItem, triggerDto);
|
|
|
|
|
if (await _appCenterService.TriggerManagementService.UpdateTriggerAsync(triggerDto) > 0)
|
|
|
|
|
{
|
2025-10-22 14:06:16 +08:00
|
|
|
if (_viewDataService.Triggers.TryGetValue(triggerItem.Id,out var mTrigger))
|
2025-10-19 20:34:20 +08:00
|
|
|
{
|
|
|
|
|
_mapper.Map(triggerItem,mTrigger);
|
|
|
|
|
|
|
|
|
|
//菜单
|
2025-10-22 14:06:16 +08:00
|
|
|
var menuItem = _viewDataService.Menus.FirstOrDefault(m => m.MenuType == MenuType.TriggerMenu && m.TargetId == triggerItem.Id);
|
2025-10-19 20:34:20 +08:00
|
|
|
if (menuItem is not null)
|
|
|
|
|
{
|
|
|
|
|
menuItem.Header = triggerItem.Name;
|
|
|
|
|
await _menuDataService.UpdateMenuItem(menuItem);
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
return true;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
}
|
2025-09-23 06:51:29 +08:00
|
|
|
}
|
|
|
|
|
|
2025-10-19 20:34:20 +08:00
|
|
|
|
|
|
|
|
|
2025-09-23 06:51:29 +08:00
|
|
|
|
|
|
|
|
return false;
|
|
|
|
|
}
|
|
|
|
|
}
|