Files
DMS/DMS.Application/Services/Management/TriggerManagementService.cs
David P.G 0007235171 1 feat: 触发器功能增强及菜单集成
2
    3 - 添加 CreateTriggerWithMenuDto 数据传输对象,用于同时创建触发器及关联菜单
    4 - 在 TriggerDataService 中新增 AddTriggerWithMenu 方法,实现触发器与菜单的同时创建
    5 - 更新 TriggersViewModel 以使用新的触发器和菜单创建流程
    6 - 在 MenuType 枚举中添加 TriggerMenu 类型
    7 - 调整 InitializeRepository 中触发器菜单的图标
    8 - 更新相关服务中的注释,将 Trigger 替换为 TriggerMenu 以保持一致
    9 - 修改时间记录方式,使用 DateTime.Now 替代 DateTime.UtcNow
   10 - 优化 TriggerManagementService 中的触发器创建与存储流程
   11 - 更新触发器评估和管理服务中的日志文本,统一使用 TriggerMenu 术语
2025-10-19 17:53:23 +08:00

152 lines
5.3 KiB
C#
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

using AutoMapper;
using DMS.Application.DTOs;
using DMS.Application.Interfaces;
using DMS.Application.Interfaces.Management;
using DMS.Application.Services.Triggers;
using DMS.Core.Interfaces;
using DMS.Core.Models.Triggers;
namespace DMS.Application.Services.Management
{
/// <summary>
/// 触发器管理服务实现
/// </summary>
public class TriggerManagementService : ITriggerManagementService
{
private readonly IAppStorageService _appStorageService;
private readonly IRepositoryManager _repositoryManager;
private readonly IMapper _mapper;
public TriggerManagementService(IAppStorageService appStorageService,IRepositoryManager repositoryManager, IMapper mapper)
{
_appStorageService = appStorageService;
_repositoryManager = repositoryManager;
_mapper = mapper ?? throw new ArgumentNullException(nameof(mapper));
}
/// <summary>
/// 获取所有触发器定义
/// </summary>
public List<Trigger> GetAllTriggersAsync()
{
var triggers = _appStorageService.Triggers.Values.ToList();
return _mapper.Map<List<Trigger>>(triggers);
}
/// <summary>
/// 根据 ID 获取触发器定义
/// </summary>
public async Task<Trigger?> GetTriggerByIdAsync(int id)
{
_appStorageService.Triggers.TryGetValue(id, out var trigger);
return trigger;
}
/// <summary>
/// 创建一个新的触发器定义
/// </summary>
public async Task<Trigger> CreateTriggerAsync(Trigger triggerDto)
{
// 1. 验证 DTO (可以在应用层或领域层做)
// ValidateTriggerDto(triggerDto);
// 2. 转换 DTO 到实体
var triggerEntity = _mapper.Map<Trigger>(triggerDto);
triggerEntity.CreatedAt = DateTime.UtcNow;
triggerEntity.UpdatedAt = DateTime.UtcNow;
// 3. 调用仓储保存实体
var createdTrigger = await _repositoryManager.Triggers.AddAsync(triggerEntity);
// 5. 同步更新AppDataStorageService中的Triggers字典
_appStorageService.Triggers[createdTrigger.Id] = createdTrigger;
return createdTrigger;
}
/// <summary>
/// 更新一个已存在的触发器定义
/// </summary>
public async Task<Trigger?> UpdateTriggerAsync(int id, Trigger triggerDto)
{
// 1. 获取现有实体
var existingTrigger = await _repositoryManager.Triggers.GetByIdAsync(id);
if (existingTrigger == null)
return null;
// 2. 验证 DTO
ValidateTriggerDto(triggerDto);
// 3. 将 DTO 映射到现有实体 (排除不可变字段如 Id, CreatedAt)
_mapper.Map(triggerDto, existingTrigger, opts => opts.Items["IgnoreIdAndCreatedAt"] = true);
existingTrigger.UpdatedAt = DateTime.UtcNow;
// 4. 调用仓储更新实体
var updatedTrigger = await _repositoryManager.Triggers.UpdateAsync(existingTrigger);
if (updatedTrigger == null)
return null;
// 5. 转换回 DTO 并返回
var result = _mapper.Map<Trigger>(updatedTrigger);
// 6. 同步更新AppDataStorageService中的Triggers字典
_appStorageService.Triggers[result.Id] = result;
return result;
}
/// <summary>
/// 删除一个触发器定义
/// </summary>
public async Task<bool> DeleteTriggerAsync(int id)
{
// var result = await _repositoryManager.Triggers.DeleteAsync(id);
//
// // 如果删除成功也从AppDataStorageService中的Triggers字典中移除
// if (result)
// {
// _appStorageService.Triggers.TryRemove(id, out _);
// }
//
// return result;
return false;
}
/// <summary>
/// 获取与指定变量关联的所有触发器定义
/// </summary>
public async Task<List<Trigger>> GetTriggersForVariableAsync(int variableId)
{
// var triggers = await _repositoryManager.Triggers.GetByVariableIdAsync(variableId);
// return _mapper.Map<List<TriggerMenu>>(triggers);
return null;
}
/// <summary>
/// 异步加载所有触发器数据
/// </summary>
public async Task LoadAllTriggersAsync()
{
_appStorageService.Triggers.Clear();
var triggerDefinitions = await _repositoryManager.Triggers.GetAllAsync();
foreach (var triggerDefinition in triggerDefinitions)
{
_appStorageService.Triggers.TryAdd(triggerDefinition.Id, triggerDefinition);
}
}
/// <summary>
/// 内部方法:验证 TriggerMenu 的有效性
/// </summary>
private void ValidateTriggerDto(Trigger dto)
{
// 检查是否至少关联了一个变量
if (dto.Variables == null || !dto.Variables.Any())
throw new ArgumentException("触发器必须至少关联一个变量。");
// 添加必要的验证逻辑
}
}
}