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; } } }