核心功能: - 公告状态机(草稿/已发布/已撤销)支持发布、撤销和重新发布 - 发布者范围区分平台级和租户级公告 - 目标受众定向推送(全部租户/指定角色/指定用户) - 平台管理、租户管理和应用端查询API - 已读/未读管理和未读统计 技术实现: - CQRS+DDD架构,清晰的领域边界和事件驱动 - 查询性能优化:数据库端排序和限制,估算策略减少内存占用 - 并发控制:修复RowVersion配置(IsRowVersion→IsConcurrencyToken) - 完整的FluentValidation验证器和输入保护 测试验证: - 36个测试全部通过(27单元+9集成) - 性能测试达标(1000条数据<5秒) - 代码质量评级A(优秀) 文档: - 完整的ADR、API文档和迁移指南 - 交付报告和技术债务记录
105 lines
4.3 KiB
C#
105 lines
4.3 KiB
C#
using TakeoutSaaS.Domain.Tenants.Entities;
|
||
using TakeoutSaaS.Domain.Tenants.Enums;
|
||
|
||
namespace TakeoutSaaS.Domain.Tenants.Repositories;
|
||
|
||
/// <summary>
|
||
/// 租户公告仓储。
|
||
/// </summary>
|
||
public interface ITenantAnnouncementRepository
|
||
{
|
||
/// <summary>
|
||
/// 查询公告列表(包含平台公告 TenantId=0),按类型、状态与生效时间筛选。
|
||
/// </summary>
|
||
/// <param name="tenantId">租户 ID。</param>
|
||
/// <param name="status">公告状态。</param>
|
||
/// <param name="type">公告类型。</param>
|
||
/// <param name="isActive">启用状态。</param>
|
||
/// <param name="effectiveFrom">生效开始时间筛选。</param>
|
||
/// <param name="effectiveTo">生效结束时间筛选。</param>
|
||
/// <param name="effectiveAt">生效时间点,为空不限制。</param>
|
||
/// <param name="orderByPriority">是否按优先级降序和生效时间降序排序,默认 false。</param>
|
||
/// <param name="limit">限制返回数量,为空不限制。</param>
|
||
/// <param name="cancellationToken">取消标记。</param>
|
||
/// <returns>公告集合。</returns>
|
||
Task<IReadOnlyList<TenantAnnouncement>> SearchAsync(
|
||
long tenantId,
|
||
AnnouncementStatus? status,
|
||
TenantAnnouncementType? type,
|
||
bool? isActive,
|
||
DateTime? effectiveFrom,
|
||
DateTime? effectiveTo,
|
||
DateTime? effectiveAt,
|
||
bool orderByPriority = false,
|
||
int? limit = null,
|
||
CancellationToken cancellationToken = default);
|
||
|
||
/// <summary>
|
||
/// 按 ID 获取公告(包含平台公告 TenantId=0)。
|
||
/// </summary>
|
||
/// <param name="tenantId">租户 ID。</param>
|
||
/// <param name="announcementId">公告 ID。</param>
|
||
/// <param name="cancellationToken">取消标记。</param>
|
||
/// <returns>公告实体或 null。</returns>
|
||
Task<TenantAnnouncement?> FindByIdInScopeAsync(long tenantId, long announcementId, CancellationToken cancellationToken = default);
|
||
|
||
/// <summary>
|
||
/// 查询未读公告(包含平台公告 TenantId=0)。
|
||
/// </summary>
|
||
/// <param name="tenantId">租户 ID。</param>
|
||
/// <param name="userId">用户 ID。</param>
|
||
/// <param name="status">公告状态。</param>
|
||
/// <param name="isActive">启用状态。</param>
|
||
/// <param name="effectiveAt">生效时间点,为空不限制。</param>
|
||
/// <param name="cancellationToken">取消标记。</param>
|
||
/// <returns>未读公告集合。</returns>
|
||
Task<IReadOnlyList<TenantAnnouncement>> SearchUnreadAsync(
|
||
long tenantId,
|
||
long? userId,
|
||
AnnouncementStatus? status,
|
||
bool? isActive,
|
||
DateTime? effectiveAt,
|
||
CancellationToken cancellationToken = default);
|
||
|
||
/// <summary>
|
||
/// 按 ID 获取公告。
|
||
/// </summary>
|
||
/// <param name="tenantId">租户 ID。</param>
|
||
/// <param name="announcementId">公告 ID。</param>
|
||
/// <param name="cancellationToken">取消标记。</param>
|
||
/// <returns>公告实体或 null。</returns>
|
||
Task<TenantAnnouncement?> FindByIdAsync(long tenantId, long announcementId, CancellationToken cancellationToken = default);
|
||
|
||
/// <summary>
|
||
/// 新增公告。
|
||
/// </summary>
|
||
/// <param name="announcement">公告实体。</param>
|
||
/// <param name="cancellationToken">取消标记。</param>
|
||
/// <returns>异步任务。</returns>
|
||
Task AddAsync(TenantAnnouncement announcement, CancellationToken cancellationToken = default);
|
||
|
||
/// <summary>
|
||
/// 更新公告。
|
||
/// </summary>
|
||
/// <param name="announcement">公告实体。</param>
|
||
/// <param name="cancellationToken">取消标记。</param>
|
||
/// <returns>异步任务。</returns>
|
||
Task UpdateAsync(TenantAnnouncement announcement, CancellationToken cancellationToken = default);
|
||
|
||
/// <summary>
|
||
/// 删除公告。
|
||
/// </summary>
|
||
/// <param name="tenantId">租户 ID。</param>
|
||
/// <param name="announcementId">公告 ID。</param>
|
||
/// <param name="cancellationToken">取消标记。</param>
|
||
/// <returns>异步任务。</returns>
|
||
Task DeleteAsync(long tenantId, long announcementId, CancellationToken cancellationToken = default);
|
||
|
||
/// <summary>
|
||
/// 保存变更。
|
||
/// </summary>
|
||
/// <param name="cancellationToken">取消标记。</param>
|
||
/// <returns>异步任务。</returns>
|
||
Task SaveChangesAsync(CancellationToken cancellationToken = default);
|
||
}
|