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; /// /// 社区消息后台管理服务实现 /// public class CommunityMessageService(BaseRepository messageRepository, ILogger logger) : BaseRepository, ICommunityMessageService { /// /// 分页查询消息列表 /// public async Task> GetListAsync(AdminMessageQueryInput input) { logger.LogInformation("正在查询社区消息列表,页码: {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 messageRepository.Queryable() .WhereIF(input.JournalId.HasValue, m => m.JournalId == input.JournalId.Value) .WhereIF(!string.IsNullOrWhiteSpace(input.Type), m => m.Type == input.Type) .WhereIF(input.Status.HasValue, m => m.Status == input.Status.Value) .WhereIF(input.IsFeatured.HasValue, m => m.IsFeatured == input.IsFeatured.Value) .WhereIF(input.IsActive.HasValue, m => m.IsActive == input.IsActive.Value) .WhereIF(!string.IsNullOrWhiteSpace(input.Keyword), m => m.Content.Contains(input.Keyword)) .WhereIF(input.UserId.HasValue, m => m.UserId == input.UserId.Value) .OrderByDescending(m => m.IsFeatured) .OrderByDescending(m => m.CreatedAt) .Select(m => new AdminMessageDetailOutput { Id = m.Id, JournalId = m.JournalId, UserId = m.UserId, UserJournalId = m.UserJournalId, JournalTaskId = m.JournalTaskId, JournalTaskAnswerId = m.JournalTaskAnswerId, Content = m.Content, ImageUrl = m.ImageUrl, SortOrder = m.SortOrder, IsActive = m.IsActive, Type = m.Type, LikeCount = m.LikeCount, IsFeatured = m.IsFeatured, Status = m.Status, CreatedBy = m.CreatedBy, CreatedAt = m.CreatedAt, UpdatedBy = m.UpdatedBy, UpdatedAt = m.UpdatedAt }, true) .ToPageListAsync(input.PageIndex, input.PageSize, totalNumber); return new PageListModel(pageResult, input.PageIndex, input.PageSize, totalNumber); } /// /// 查看消息详情 /// public async Task GetDetailAsync(long id) { logger.LogInformation("正在获取社区消息详情,ID: {Id}", id); var message = await messageRepository.GetByIdAsync(id); if (message == null) { logger.LogWarning("未找到社区消息,ID: {Id}", id); throw new BusinessException("消息不存在", 404); } return new AdminMessageDetailOutput { Id = message.Id, JournalId = message.JournalId, UserId = message.UserId, UserJournalId = message.UserJournalId, JournalTaskId = message.JournalTaskId, JournalTaskAnswerId = message.JournalTaskAnswerId, Content = message.Content, ImageUrl = message.ImageUrl, SortOrder = message.SortOrder, IsActive = message.IsActive, Type = message.Type, LikeCount = message.LikeCount, IsFeatured = message.IsFeatured, Status = message.Status, CreatedBy = message.CreatedBy, CreatedAt = message.CreatedAt, UpdatedBy = message.UpdatedBy, UpdatedAt = message.UpdatedAt }; } /// /// 软删除消息 /// public async Task DeleteAsync(long id) { logger.LogInformation("正在删除社区消息,ID: {Id}", id); var message = await messageRepository.GetByIdAsync(id); if (message == null) { logger.LogWarning("未找到要删除的社区消息,ID: {Id}", id); throw new BusinessException("消息不存在", 404); } var result = await messageRepository.DeleteByIdAsync(id); if (!result) { logger.LogError("社区消息删除失败,ID: {Id}", id); throw new BusinessException("删除消息失败", 500); } logger.LogInformation("社区消息删除成功,ID: {Id}", id); } /// /// 冻结/解冻消息 /// public async Task FreezeAsync(long id, int status) { logger.LogInformation("正在更新社区消息冻结状态,ID: {Id}, Status: {Status}", id, status); if (status != 1 && status != 2) { throw new BusinessException("状态值无效,只能为1(解冻/通过)或2(冻结)", 400); } var message = await messageRepository.GetByIdAsync(id); if (message == null) { logger.LogWarning("未找到社区消息,ID: {Id}", id); throw new BusinessException("消息不存在", 404); } message.Status = status; message.UpdatedBy = "System"; message.UpdatedAt = DateTime.Now; var result = await messageRepository.UpdateAsync(message); if (!result) { logger.LogError("社区消息冻结状态更新失败,ID: {Id}", id); throw new BusinessException("更新冻结状态失败", 500); } logger.LogInformation("社区消息冻结状态更新成功,ID: {Id}, Status: {Status}", id, status); } /// /// 设置/取消精选 /// public async Task SetFeaturedAsync(long id, int isFeatured) { logger.LogInformation("正在设置社区消息精选状态,ID: {Id}, IsFeatured: {IsFeatured}", id, isFeatured); if (isFeatured != 0 && isFeatured != 1) { throw new BusinessException("精选值无效,只能为0(取消)或1(精选)", 400); } var message = await messageRepository.GetByIdAsync(id); if (message == null) { logger.LogWarning("未找到社区消息,ID: {Id}", id); throw new BusinessException("消息不存在", 404); } message.IsFeatured = isFeatured; message.UpdatedBy = "System"; message.UpdatedAt = DateTime.Now; var result = await messageRepository.UpdateAsync(message); if (!result) { logger.LogError("社区消息精选设置失败,ID: {Id}", id); throw new BusinessException("设置精选失败", 500); } logger.LogInformation("社区消息精选设置成功,ID: {Id}, IsFeatured: {IsFeatured}", id, isFeatured); } /// /// 设置排序权重 /// public async Task SetSortOrderAsync(long id, int sortOrder) { logger.LogInformation("正在设置社区消息排序权重,ID: {Id}, SortOrder: {SortOrder}", id, sortOrder); var message = await messageRepository.GetByIdAsync(id); if (message == null) { logger.LogWarning("未找到社区消息,ID: {Id}", id); throw new BusinessException("消息不存在", 404); } message.SortOrder = sortOrder; message.UpdatedBy = "System"; message.UpdatedAt = DateTime.Now; var result = await messageRepository.UpdateAsync(message); if (!result) { logger.LogError("社区消息排序权重设置失败,ID: {Id}", id); throw new BusinessException("设置排序权重失败", 500); } logger.LogInformation("社区消息排序权重设置成功,ID: {Id}, SortOrder: {SortOrder}", id, sortOrder); } }