using Microsoft.Extensions.Logging; using QYZH.InteractiveMagazine.IService; using QYZH.InteractiveMagazine.Models.Common; using QYZH.InteractiveMagazine.Models.Dto; using QYZH.InteractiveMagazine.Models.Entity; using QYZH.InteractiveMagazine.Repository; using SqlSugar; namespace QYZH.InteractiveMagazine.Service; /// /// AIPrompt配置服务实现 /// public class AiBasePromptService( BaseRepository promptRepository, ILogger logger) : BaseRepository, IAiBasePromptService { /// /// 创建Prompt配置 /// public async Task CreateAsync(AiBasePromptInput input) { logger.LogInformation("正在创建Prompt配置,PromptKey: {PromptKey}", input.PromptKey); if (string.IsNullOrWhiteSpace(input.PromptKey)) { throw new BusinessException("配置标识不能为空", 400); } if (string.IsNullOrWhiteSpace(input.PromptName)) { throw new BusinessException("配置名称不能为空", 400); } if (string.IsNullOrWhiteSpace(input.PromptTemplate)) { throw new BusinessException("Prompt模板内容不能为空", 400); } // 检查PromptKey是否已存在 var exists = await promptRepository.IsAnyAsync(p => p.PromptKey == input.PromptKey.Trim()); if (exists) { throw new BusinessException($"配置标识 '{input.PromptKey.Trim()}' 已存在", 400); } var entity = new AiBasePrompt { PromptKey = input.PromptKey.Trim(), PromptName = input.PromptName.Trim(), PromptTemplate = input.PromptTemplate, Description = input.Description, Priority = input.Priority, IsDefault = input.IsDefault, CreatedBy = "System", UpdatedBy = "System", CreatedAt = DateTime.Now, UpdatedAt = DateTime.Now, IsDeleted = false }; var result = await promptRepository.InsertAsync(entity); if (!result) { logger.LogError("Prompt配置创建失败,PromptKey: {PromptKey}", input.PromptKey); throw new BusinessException("创建Prompt配置失败", 500); } logger.LogInformation("Prompt配置创建成功,PromptKey: {PromptKey}, ID: {Id}", input.PromptKey, entity.Id); return new AiBasePromptOutput { Id = entity.Id, PromptKey = entity.PromptKey, PromptName = entity.PromptName, PromptTemplate = entity.PromptTemplate, Description = entity.Description, Priority = entity.Priority, IsDefault = entity.IsDefault, Status = entity.Status, CreatedBy = entity.CreatedBy, CreatedAt = entity.CreatedAt, UpdatedBy = entity.UpdatedBy, UpdatedAt = entity.UpdatedAt }; } /// /// 更新Prompt配置 /// public async Task UpdateAsync(long id, AiBasePromptInput input) { logger.LogInformation("正在更新Prompt配置,ID: {Id}", id); var entity = await promptRepository.GetByIdAsync(id); if (entity == null) { logger.LogWarning("未找到要更新的Prompt配置,ID: {Id}", id); throw new BusinessException("Prompt配置不存在", 404); } if (string.IsNullOrWhiteSpace(input.PromptKey)) { throw new BusinessException("配置标识不能为空", 400); } if (string.IsNullOrWhiteSpace(input.PromptName)) { throw new BusinessException("配置名称不能为空", 400); } if (string.IsNullOrWhiteSpace(input.PromptTemplate)) { throw new BusinessException("Prompt模板内容不能为空", 400); } // 检查PromptKey是否被其他记录占用 var exists = await promptRepository.IsAnyAsync(p => p.PromptKey == input.PromptKey.Trim() && p.Id != id); if (exists) { throw new BusinessException($"配置标识 '{input.PromptKey.Trim()}' 已被其他配置使用", 400); } entity.PromptKey = input.PromptKey.Trim(); entity.PromptName = input.PromptName.Trim(); entity.PromptTemplate = input.PromptTemplate; entity.Description = input.Description; entity.Priority = input.Priority; entity.IsDefault = input.IsDefault; entity.UpdatedBy = "System"; entity.UpdatedAt = DateTime.Now; var result = await promptRepository.UpdateAsync(entity); if (!result) { logger.LogError("Prompt配置更新失败,ID: {Id}", id); throw new BusinessException("更新Prompt配置失败", 500); } logger.LogInformation("Prompt配置更新成功,ID: {Id}", id); return new AiBasePromptOutput { Id = entity.Id, PromptKey = entity.PromptKey, PromptName = entity.PromptName, PromptTemplate = entity.PromptTemplate, Description = entity.Description, Priority = entity.Priority, IsDefault = entity.IsDefault, Status = entity.Status, CreatedBy = entity.CreatedBy, CreatedAt = entity.CreatedAt, UpdatedBy = entity.UpdatedBy, UpdatedAt = entity.UpdatedAt }; } /// /// 删除Prompt配置(软删除) /// public async Task DeleteAsync(long id) { logger.LogInformation("正在删除Prompt配置,ID: {Id}", id); var entity = await promptRepository.GetByIdAsync(id); if (entity == null) { logger.LogWarning("未找到要删除的Prompt配置,ID: {Id}", id); throw new BusinessException("Prompt配置不存在", 404); } var result = await promptRepository.DeleteByIdAsync(id); if (!result) { logger.LogError("Prompt配置删除失败,ID: {Id}", id); throw new BusinessException("删除Prompt配置失败", 500); } logger.LogInformation("Prompt配置删除成功,ID: {Id}", id); } /// /// 根据ID获取Prompt配置 /// public async Task GetByIdAsync(long id) { logger.LogInformation("正在获取Prompt配置信息,ID: {Id}", id); var entity = await promptRepository.GetByIdAsync(id); if (entity == null) { logger.LogWarning("未找到Prompt配置,ID: {Id}", id); throw new BusinessException("Prompt配置不存在", 404); } return new AiBasePromptOutput { Id = entity.Id, PromptKey = entity.PromptKey, PromptName = entity.PromptName, PromptTemplate = entity.PromptTemplate, Description = entity.Description, Priority = entity.Priority, IsDefault = entity.IsDefault, Status = entity.Status, CreatedBy = entity.CreatedBy, CreatedAt = entity.CreatedAt, UpdatedBy = entity.UpdatedBy, UpdatedAt = entity.UpdatedAt }; } /// /// 分页查询Prompt配置列表 /// public async Task> GetListAsync(AiBasePromptQueryInput input) { logger.LogInformation("正在查询Prompt配置列表,页码: {PageIndex}, 每页条数: {PageSize}", input.PageIndex, input.PageSize); if (input.PageIndex <= 0) { throw new BusinessException("页码必须大于0", 400); } if (input.PageSize <= 0 || input.PageSize > 100) { throw new BusinessException("每页条数必须在1-100之间", 400); } RefAsync totalNumber = 0; var pageResult = await promptRepository.Queryable() .WhereIF(!string.IsNullOrWhiteSpace(input.PromptKey), p => p.PromptKey == input.PromptKey) .WhereIF(!string.IsNullOrWhiteSpace(input.PromptName), p => p.PromptName.Contains(input.PromptName)) .OrderBy(p => p.Priority) .OrderByDescending(p => p.CreatedAt) .ToPageListAsync(input.PageIndex, input.PageSize, totalNumber); var result = pageResult.Select(p => new AiBasePromptOutput { Id = p.Id, PromptKey = p.PromptKey, PromptName = p.PromptName, PromptTemplate = p.PromptTemplate, Description = p.Description, Priority = p.Priority, IsDefault = p.IsDefault, Status = p.Status, CreatedBy = p.CreatedBy, CreatedAt = p.CreatedAt, UpdatedBy = p.UpdatedBy, UpdatedAt = p.UpdatedAt }).ToList(); return new PageListModel(result, input.PageIndex, input.PageSize, totalNumber); } /// /// 获取全部Prompt配置(无分页) /// public async Task> GetAllAsync() { logger.LogInformation("正在查询全部Prompt配置"); var list = await promptRepository.Queryable() .OrderBy(p => p.Priority) .OrderByDescending(p => p.CreatedAt) .ToListAsync(); return list.Select(p => new AiBasePromptOutput { Id = p.Id, PromptKey = p.PromptKey, PromptName = p.PromptName, PromptTemplate = p.PromptTemplate, Description = p.Description, Priority = p.Priority, IsDefault = p.IsDefault, Status = p.Status, CreatedBy = p.CreatedBy, CreatedAt = p.CreatedAt, UpdatedBy = p.UpdatedBy, UpdatedAt = p.UpdatedAt }).ToList(); } /// /// 切换Prompt启用/禁用状态 /// public async Task ToggleStatusAsync(long id) { logger.LogInformation("正在切换Prompt配置状态,ID: {Id}", id); var entity = await promptRepository.GetByIdAsync(id); if (entity == null) { logger.LogWarning("未找到要切换状态的Prompt配置,ID: {Id}", id); throw new BusinessException("Prompt配置不存在", 404); } entity.Status = entity.Status == 1 ? 0 : 1; entity.UpdatedBy = "System"; entity.UpdatedAt = DateTime.Now; var result = await promptRepository.UpdateAsync(entity); if (!result) { logger.LogError("Prompt配置状态切换失败,ID: {Id}", id); throw new BusinessException("切换Prompt状态失败", 500); } logger.LogInformation("Prompt配置状态切换成功,ID: {Id}, Status: {Status}", id, entity.Status); } }