using YD_Event.Application.Certificate.Dtos;
using YD_Event.Core.Entities;
using SqlSugar;
using Mapster;
namespace YD_Event.Application.Certificate;
///
/// 证书模板管理服务
///
public class CertificateTemplateService : IDynamicApiController, ITransient
{
private readonly ISqlSugarRepository _templateRepository;
private readonly ISqlSugarRepository _elementRepository;
private readonly IIdGenerator _idGenerator;
public CertificateTemplateService(
ISqlSugarRepository templateRepository,
ISqlSugarRepository elementRepository,
IIdGenerator idGenerator)
{
_templateRepository = templateRepository;
_elementRepository = elementRepository;
_idGenerator = idGenerator;
}
///
/// 上传并创建模板
///
[DisplayName("上传模板")]
public async Task Upload(UploadTemplateInput input)
{
var entity = input.Adapt();
entity.Id = _idGenerator.NextId();
// 独立模板不再有 CertificateId,Version 概念可能需要调整,或者所有模板都是 V1
// 如果要保留版本控制,应该是基于某种“模板组”的概念,但这里简化为每次上传都是新模板
entity.Version = 1;
entity.IsActive = true; // 默认为激活,因为现在是单次引用
await _templateRepository.InsertAsync(entity);
return entity.Id;
}
///
/// 获取模板详情
///
[DisplayName("获取模板详情")]
public async Task Get(IdInput input)
{
var entity = await _templateRepository.GetByIdAsync(input.Id);
if (entity == null) throw Oops.Bah("模板不存在");
return entity.Adapt();
}
///
/// 获取模板元素列表
///
[DisplayName("获取元素列表")]
public async Task> GetElementList(IdInput input)
{
var list = await _elementRepository.AsQueryable()
.Where(x => x.TemplateId == input.Id)
.OrderBy(x => x.Sort)
.ToListAsync();
return list.Adapt>();
}
///
/// 批量保存元素
///
[DisplayName("批量保存元素")]
public async Task SaveElementList(SaveElementListInput input)
{
// 校验模板是否存在
var exists = await _templateRepository.IsAnyAsync(x => x.Id == input.TemplateId);
if (!exists) throw Oops.Bah("模板不存在");
await _elementRepository.AsSugarClient().Ado.BeginTranAsync();
try
{
// 删除旧元素
await _elementRepository.DeleteAsync(x => x.TemplateId == input.TemplateId);
// 插入新元素
if (input.Elements != null && input.Elements.Any())
{
var entities = input.Elements.Select(x =>
{
var entity = x.Adapt();
entity.Id = _idGenerator.NextId();
entity.TemplateId = input.TemplateId;
return entity;
}).ToList();
await _elementRepository.InsertRangeAsync(entities);
}
await _elementRepository.AsSugarClient().Ado.CommitTranAsync();
}
catch (Exception)
{
await _elementRepository.AsSugarClient().Ado.RollbackTranAsync();
throw;
}
}
}