79 lines
2.6 KiB
C#
79 lines
2.6 KiB
C#
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;
|
||
|
||
/// <summary>
|
||
/// 公告服务
|
||
/// </summary>
|
||
public class AnnouncementService : ApplicationService, IAnnouncementService
|
||
{
|
||
private readonly ISqlSugarRepository<AnnouncementAggregateRoot> _announcementRepository;
|
||
private readonly IConfiguration _configuration;
|
||
private readonly IDistributedCache<AnnouncementCacheDto> _announcementCache;
|
||
private const string AnnouncementCacheKey = "AiHub:Announcement";
|
||
|
||
public AnnouncementService(
|
||
ISqlSugarRepository<AnnouncementAggregateRoot> announcementRepository,
|
||
IConfiguration configuration,
|
||
IDistributedCache<AnnouncementCacheDto> announcementCache)
|
||
{
|
||
_announcementRepository = announcementRepository;
|
||
_configuration = configuration;
|
||
_announcementCache = announcementCache;
|
||
}
|
||
|
||
/// <summary>
|
||
/// 获取公告信息
|
||
/// </summary>
|
||
public async Task<List<AnnouncementLogDto>> GetAsync()
|
||
{
|
||
// 使用 GetOrAddAsync 从缓存获取或添加数据,缓存1小时
|
||
var cacheData = await _announcementCache.GetOrAddAsync(
|
||
AnnouncementCacheKey,
|
||
async () => await LoadAnnouncementDataAsync(),
|
||
() => new DistributedCacheEntryOptions
|
||
{
|
||
AbsoluteExpirationRelativeToNow = TimeSpan.FromHours(1)
|
||
}
|
||
);
|
||
|
||
return cacheData?.Logs ?? new List<AnnouncementLogDto>();
|
||
}
|
||
|
||
/// <summary>
|
||
/// 从数据库加载公告数据
|
||
/// </summary>
|
||
private async Task<AnnouncementCacheDto> 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<List<AnnouncementLogDto>>();
|
||
return new AnnouncementCacheDto
|
||
{
|
||
Logs = logDtos
|
||
};
|
||
}
|
||
}
|