using AutoMapper;
using DMS.Application.DTOs;
using DMS.Application.Events;
using DMS.Application.Interfaces;
using DMS.Application.Interfaces.Database;
using DMS.Application.Interfaces.Management;
using DMS.Application.Services.Triggers;
using DMS.Core.Enums;
using DMS.Core.Events;
using DMS.Core.Interfaces;
using DMS.Core.Models.Triggers;
namespace DMS.Application.Services.Management
{
///
/// 触发器管理服务实现
///
public class TriggerManagementService : ITriggerManagementService
{
private readonly IAppStorageService _appStorageService;
private readonly ITriggerAppService _triggerAppService;
private readonly IMapper _mapper;
private readonly IEventService _eventService;
public TriggerManagementService(IAppStorageService appStorageService, ITriggerAppService triggerAppService, IMapper mapper, IEventService eventService)
{
_appStorageService = appStorageService;
_triggerAppService = triggerAppService;
_mapper = mapper ?? throw new ArgumentNullException(nameof(mapper));
_eventService = eventService;
}
///
/// 获取所有触发器定义
///
public List GetAllTriggersAsync()
{
var triggers = _appStorageService.Triggers.Values.ToList();
return _mapper.Map>(triggers);
}
///
/// 根据 ID 获取触发器定义
///
public async Task GetTriggerByIdAsync(int id)
{
_appStorageService.Triggers.TryGetValue(id, out var trigger);
return trigger;
}
///
/// 创建一个新的触发器定义
///
public async Task AddTriggerAsync(Trigger trigger)
{
var createdTrigger = await _triggerAppService.AddTriggerAsync(trigger);
// 创建成功后,将触发器添加到内存中
if (createdTrigger != null)
{
if (_appStorageService.Triggers.TryAdd(createdTrigger.Id, createdTrigger))
{
_eventService.RaiseTriggerChanged(this, new TriggerChangedEventArgs(DataChangeType.Added, createdTrigger));
}
}
return createdTrigger;
}
///
/// 创建触发器及其关联菜单
///
public async Task CreateTriggerWithMenuAsync(CreateTriggerWithMenuDto dto)
{
var result = await _triggerAppService.CreateTriggerWithMenuAsync(dto);
// 创建成功后,将触发器添加到内存中
if (result is null || result.Trigger is null)
{
return null;
}
if (_appStorageService.Triggers.TryAdd(result.Trigger.Id, result.Trigger))
{
_eventService.RaiseTriggerChanged(this, new TriggerChangedEventArgs(DataChangeType.Added, result.Trigger));
}
if (_appStorageService.Menus.TryAdd(result.TriggerMenu.Id, result.TriggerMenu))
{
_eventService.RaiseMenuChanged(this, new MenuChangedEventArgs(DataChangeType.Added, result.TriggerMenu));
}
return result;
}
///
/// 更新一个已存在的触发器定义
///
public async Task UpdateTriggerAsync(Trigger trigger)
{
// 4. 调用仓储更新实体
var res = await _triggerAppService.UpdateTriggerAsync(trigger);
if (res == 0)
return res;
// 6. 同步更新AppDataStorageService中的Triggers字典
if (_appStorageService.Triggers.TryGetValue(trigger.Id, out var memTrigger))
{
_mapper.Map(trigger, memTrigger);
}
return res;
}
///
/// 删除一个触发器定义
///
public async Task DeleteTriggerAsync(int id)
{
// 如果删除成功,也从AppDataStorageService中的Triggers字典中移除
if (await _triggerAppService.DeleteTriggerByIdAsync(id))
{
_appStorageService.Triggers.TryRemove(id, out _);
return true;
}
else
{
return false;
}
}
///
/// 获取与指定变量关联的所有触发器定义
///
public async Task> GetTriggersForVariableAsync(int variableId)
{
// var triggers = await _repositoryManager.Triggers.GetByVariableIdAsync(variableId);
// return _mapper.Map>(triggers);
return null;
}
///
/// 异步加载所有触发器数据
///
public async Task LoadAllTriggersAsync()
{
_appStorageService.Triggers.Clear();
var triggerDefinitions = await _triggerAppService.GetAllTriggersAsync();
foreach (var triggerDefinition in triggerDefinitions)
{
_appStorageService.Triggers.TryAdd(triggerDefinition.Id, triggerDefinition);
}
}
///
/// 内部方法:验证 TriggerMenu 的有效性
///
private void ValidateTriggerDto(Trigger dto)
{
// 检查是否至少关联了一个变量
if (dto.Variables == null || !dto.Variables.Any())
throw new ArgumentException("触发器必须至少关联一个变量。");
// 添加必要的验证逻辑
}
}
}