using Mapster;
using Microsoft.Extensions.Caching.Distributed;
using Microsoft.Extensions.Configuration;
using Volo.Abp.Application.Services;
using Volo.Abp.Caching;
using Yi.Framework.AiHub.Application.Contracts.Dtos.Announcement;
using Yi.Framework.AiHub.Application.Contracts.IServices;
using Yi.Framework.AiHub.Domain.Entities;
using Yi.Framework.SqlSugarCore.Abstractions;
namespace Yi.Framework.AiHub.Application.Services;
///
/// 公告服务
///
public class AnnouncementService : ApplicationService, IAnnouncementService
{
private readonly ISqlSugarRepository _announcementRepository;
private readonly IConfiguration _configuration;
private readonly IDistributedCache _announcementCache;
private const string AnnouncementCacheKey = "AiHub:Announcement";
public AnnouncementService(
ISqlSugarRepository announcementRepository,
IConfiguration configuration,
IDistributedCache announcementCache)
{
_announcementRepository = announcementRepository;
_configuration = configuration;
_announcementCache = announcementCache;
}
///
/// 获取公告信息
///
public async Task> GetAsync()
{
// 使用 GetOrAddAsync 从缓存获取或添加数据,缓存1小时
var cacheData = await _announcementCache.GetOrAddAsync(
AnnouncementCacheKey,
async () => await LoadAnnouncementDataAsync(),
() => new DistributedCacheEntryOptions
{
AbsoluteExpirationRelativeToNow = TimeSpan.FromHours(1)
}
);
return cacheData?.Logs ?? new List();
}
///
/// 从数据库加载公告数据
///
private async Task LoadAnnouncementDataAsync()
{
// 1️⃣ 一次性查出全部公告(不排序)
var logs = await _announcementRepository._DbQueryable
.ToListAsync();
var now = DateTime.Now;
// 2️⃣ 内存中处理排序
var orderedLogs = logs
.OrderByDescending(x =>
x.StartTime <= now &&
(x.EndTime == null || x.EndTime >= now)
)
.ThenByDescending(x => x.StartTime)
.ToList();
// 转换为 DTO
var logDtos = orderedLogs.Adapt>();
return new AnnouncementCacheDto
{
Logs = logDtos
};
}
}