refactor: 清理平台表述并统一为系统
This commit is contained in:
@@ -30,7 +30,7 @@ public sealed class CreatePaymentCommand : IRequest<PaymentDto>
|
||||
public decimal Amount { get; set; }
|
||||
|
||||
/// <summary>
|
||||
/// 平台交易号。
|
||||
/// 系统交易号。
|
||||
/// </summary>
|
||||
public string? TradeNo { get; set; }
|
||||
|
||||
|
||||
@@ -35,7 +35,7 @@ public sealed record UpdatePaymentCommand : IRequest<PaymentDto?>
|
||||
public decimal Amount { get; init; }
|
||||
|
||||
/// <summary>
|
||||
/// 平台交易号。
|
||||
/// 系统交易号。
|
||||
/// </summary>
|
||||
public string? TradeNo { get; init; }
|
||||
|
||||
|
||||
@@ -43,7 +43,7 @@ public sealed class PaymentDto
|
||||
public decimal Amount { get; init; }
|
||||
|
||||
/// <summary>
|
||||
/// 平台交易号。
|
||||
/// 系统交易号。
|
||||
/// </summary>
|
||||
public string? TradeNo { get; init; }
|
||||
|
||||
|
||||
@@ -37,7 +37,7 @@ public sealed class ToggleBusinessStatusCommandHandler(
|
||||
|
||||
if (store.BusinessStatus == StoreBusinessStatus.ForceClosed)
|
||||
{
|
||||
throw new BusinessException(ErrorCodes.Conflict, "门店已被平台强制关闭,无法切换");
|
||||
throw new BusinessException(ErrorCodes.Conflict, "门店已被风控强制关闭,无法切换");
|
||||
}
|
||||
|
||||
// 2. (空行后) 应用状态变更
|
||||
|
||||
@@ -71,7 +71,7 @@ public sealed class TenantPackageDto
|
||||
public string? FeaturePoliciesJson { get; init; }
|
||||
|
||||
/// <summary>
|
||||
/// 是否仍启用(平台控制)。
|
||||
/// 是否仍启用(系统控制)。
|
||||
/// </summary>
|
||||
public bool IsActive { get; init; }
|
||||
|
||||
|
||||
@@ -29,7 +29,7 @@ public sealed class CreateTenantAnnouncementCommandHandler(
|
||||
/// <returns>公告 DTO。</returns>
|
||||
public async Task<TenantAnnouncementDto> Handle(CreateTenantAnnouncementCommand request, CancellationToken cancellationToken)
|
||||
{
|
||||
// 1. 校验租户上下文(租户端禁止跨租户/平台公告)
|
||||
// 1. 校验租户上下文(租户端禁止跨租户/系统公告)
|
||||
var currentTenantId = tenantProvider.GetCurrentTenantId();
|
||||
if (currentTenantId <= 0)
|
||||
{
|
||||
@@ -51,7 +51,7 @@ public sealed class CreateTenantAnnouncementCommandHandler(
|
||||
// 4. (空行后) 校验公告发布范围:租户端仅允许租户公告
|
||||
if (request.PublisherScope != PublisherScope.Tenant)
|
||||
{
|
||||
throw new BusinessException(ErrorCodes.ValidationFailed, "租户端不允许创建平台公告");
|
||||
throw new BusinessException(ErrorCodes.ValidationFailed, "租户端仅允许创建租户公告");
|
||||
}
|
||||
|
||||
if (string.IsNullOrWhiteSpace(request.TargetType))
|
||||
|
||||
@@ -35,7 +35,7 @@ public sealed class CreateAnnouncementCommandValidator : AbstractValidator<Creat
|
||||
|
||||
RuleFor(x => x.PublisherScope)
|
||||
.Equal(PublisherScope.Tenant)
|
||||
.WithMessage("租户端不允许创建平台公告");
|
||||
.WithMessage("租户端仅允许创建租户公告");
|
||||
|
||||
RuleFor(x => x.EffectiveFrom)
|
||||
.LessThan(x => x.EffectiveTo!.Value)
|
||||
|
||||
@@ -26,7 +26,7 @@ public sealed class CurrentUserProfile
|
||||
public long TenantId { get; init; }
|
||||
|
||||
/// <summary>
|
||||
/// 所属商户 ID(平台管理员为空)。
|
||||
/// 所属商户 ID(租户管理员为空)。
|
||||
/// </summary>
|
||||
public long? MerchantId { get; init; }
|
||||
|
||||
|
||||
@@ -288,7 +288,7 @@ public sealed class AdminAuthService(
|
||||
{
|
||||
var tenantId = user.TenantId;
|
||||
var roles = await ResolveUserRolesAsync(tenantId, user.Id, cancellationToken);
|
||||
// 1. 强制仅允许租户管理员登录(平台不允许超级管理员)
|
||||
// 1. 强制仅允许租户管理员登录(不支持超级管理员)
|
||||
EnsureTenantAdmin(tenantId, roles);
|
||||
// 2. 加载权限并返回档案
|
||||
var permissions = await ResolveUserPermissionsAsync(tenantId, user.Id, cancellationToken);
|
||||
|
||||
@@ -24,7 +24,7 @@ public sealed class ChatSession : MultiTenantEntityBase
|
||||
public long? AgentUserId { get; set; }
|
||||
|
||||
/// <summary>
|
||||
/// 所属门店(可空为平台)。
|
||||
/// 所属门店(可空为系统会话)。
|
||||
/// </summary>
|
||||
public long? StoreId { get; set; }
|
||||
|
||||
|
||||
@@ -9,7 +9,7 @@ namespace TakeoutSaaS.Domain.Distribution.Entities;
|
||||
public sealed class AffiliatePartner : MultiTenantEntityBase
|
||||
{
|
||||
/// <summary>
|
||||
/// 用户 ID(如绑定平台账号)。
|
||||
/// 用户 ID(如绑定登录账号)。
|
||||
/// </summary>
|
||||
public long? UserId { get; set; }
|
||||
|
||||
|
||||
@@ -4,7 +4,7 @@ using TakeoutSaaS.Shared.Abstractions.Entities;
|
||||
namespace TakeoutSaaS.Domain.Identity.Entities;
|
||||
|
||||
/// <summary>
|
||||
/// 管理后台账户实体(平台管理员、租户管理员或商户员工)。
|
||||
/// 管理后台账户实体(租户管理员或商户员工)。
|
||||
/// </summary>
|
||||
public sealed class IdentityUser : MultiTenantEntityBase
|
||||
{
|
||||
@@ -59,7 +59,7 @@ public sealed class IdentityUser : MultiTenantEntityBase
|
||||
public bool MustChangePassword { get; set; }
|
||||
|
||||
/// <summary>
|
||||
/// 所属商户(平台管理员为空)。
|
||||
/// 所属商户(租户管理员为空)。
|
||||
/// </summary>
|
||||
public long? MerchantId { get; set; }
|
||||
|
||||
|
||||
@@ -3,7 +3,7 @@ using TakeoutSaaS.Shared.Abstractions.Entities;
|
||||
namespace TakeoutSaaS.Domain.Identity.Entities;
|
||||
|
||||
/// <summary>
|
||||
/// 角色模板定义(平台级)。
|
||||
/// 角色模板定义(系统级)。
|
||||
/// </summary>
|
||||
public sealed class RoleTemplate : AuditableEntityBase
|
||||
{
|
||||
|
||||
@@ -3,7 +3,7 @@ using TakeoutSaaS.Shared.Abstractions.Entities;
|
||||
namespace TakeoutSaaS.Domain.Identity.Entities;
|
||||
|
||||
/// <summary>
|
||||
/// 角色模板-权限关系(平台级)。
|
||||
/// 角色模板-权限关系(系统级)。
|
||||
/// </summary>
|
||||
public sealed class RoleTemplatePermission : AuditableEntityBase
|
||||
{
|
||||
|
||||
@@ -35,16 +35,6 @@ public enum MerchantAuditAction
|
||||
/// </summary>
|
||||
MerchantReviewed = 5,
|
||||
|
||||
/// <summary>
|
||||
/// 领取审核。
|
||||
/// </summary>
|
||||
ReviewClaimed = 6,
|
||||
|
||||
/// <summary>
|
||||
/// 释放审核。
|
||||
/// </summary>
|
||||
ReviewReleased = 7,
|
||||
|
||||
/// <summary>
|
||||
/// 审核通过。
|
||||
/// </summary>
|
||||
@@ -63,10 +53,5 @@ public enum MerchantAuditAction
|
||||
/// <summary>
|
||||
/// 关键信息变更进入待审核。
|
||||
/// </summary>
|
||||
ReviewPendingReApproval = 11,
|
||||
|
||||
/// <summary>
|
||||
/// 强制接管审核。
|
||||
/// </summary>
|
||||
ReviewForceClaimed = 12
|
||||
ReviewPendingReApproval = 11
|
||||
}
|
||||
|
||||
@@ -29,7 +29,7 @@ public sealed class PaymentRecord : MultiTenantEntityBase
|
||||
public decimal Amount { get; set; }
|
||||
|
||||
/// <summary>
|
||||
/// 平台交易号。
|
||||
/// 系统交易号。
|
||||
/// </summary>
|
||||
public string? TradeNo { get; set; }
|
||||
|
||||
|
||||
@@ -16,7 +16,7 @@ public enum StoreBusinessStatus
|
||||
Resting = 1,
|
||||
|
||||
/// <summary>
|
||||
/// 强制关闭(平台风控)。
|
||||
/// 强制关闭(风控)。
|
||||
/// </summary>
|
||||
ForceClosed = 2
|
||||
}
|
||||
|
||||
@@ -36,9 +36,9 @@ public enum StoreClosureReason
|
||||
LicenseExpired = 5,
|
||||
|
||||
/// <summary>
|
||||
/// 平台封禁。
|
||||
/// 风控封禁。
|
||||
/// </summary>
|
||||
PlatformSuspended = 6,
|
||||
RiskSuspended = 6,
|
||||
|
||||
/// <summary>
|
||||
/// 其他原因。
|
||||
|
||||
@@ -4,7 +4,7 @@ using TakeoutSaaS.Shared.Abstractions.Entities;
|
||||
namespace TakeoutSaaS.Domain.Tenants.Entities;
|
||||
|
||||
/// <summary>
|
||||
/// 配额包定义(平台提供的可购买配额包)。
|
||||
/// 配额包定义(系统提供的可购买配额包)。
|
||||
/// </summary>
|
||||
public sealed class QuotaPackage : AuditableEntityBase
|
||||
{
|
||||
|
||||
@@ -44,7 +44,7 @@ public sealed class TenantAnnouncement : MultiTenantEntityBase
|
||||
public PublisherScope PublisherScope { get; set; }
|
||||
|
||||
/// <summary>
|
||||
/// 发布者用户 ID(平台或租户后台账号)。
|
||||
/// 发布者用户 ID(系统或租户后台账号)。
|
||||
/// </summary>
|
||||
public long? PublisherUserId { get; set; }
|
||||
|
||||
|
||||
@@ -4,7 +4,7 @@ using TakeoutSaaS.Shared.Abstractions.Entities;
|
||||
namespace TakeoutSaaS.Domain.Tenants.Entities;
|
||||
|
||||
/// <summary>
|
||||
/// 平台提供的租户套餐定义。
|
||||
/// 系统提供的租户套餐定义。
|
||||
/// </summary>
|
||||
public sealed class TenantPackage : AuditableEntityBase
|
||||
{
|
||||
@@ -64,7 +64,7 @@ public sealed class TenantPackage : AuditableEntityBase
|
||||
public string? FeaturePoliciesJson { get; set; }
|
||||
|
||||
/// <summary>
|
||||
/// 是否仍启用(平台控制)。
|
||||
/// 是否仍启用(系统控制)。
|
||||
/// </summary>
|
||||
public bool IsActive { get; set; } = true;
|
||||
|
||||
|
||||
@@ -6,9 +6,9 @@ namespace TakeoutSaaS.Domain.Tenants.Enums;
|
||||
public enum PublisherScope
|
||||
{
|
||||
/// <summary>
|
||||
/// 平台发布。
|
||||
/// 系统发布。
|
||||
/// </summary>
|
||||
Platform = 0,
|
||||
System = 0,
|
||||
|
||||
/// <summary>
|
||||
/// 租户发布。
|
||||
|
||||
@@ -21,9 +21,9 @@ public enum TenantAnnouncementType
|
||||
Operation = 2,
|
||||
|
||||
/// <summary>
|
||||
/// 平台系统更新公告。
|
||||
/// 系统更新公告。
|
||||
/// </summary>
|
||||
SYSTEM_PLATFORM_UPDATE = 3,
|
||||
SYSTEM_PRODUCT_UPDATE = 3,
|
||||
|
||||
/// <summary>
|
||||
/// 系统安全公告。
|
||||
|
||||
@@ -39,29 +39,4 @@ public enum TenantAuditAction
|
||||
/// 租户状态变更(启用/停用/到期等)。
|
||||
/// </summary>
|
||||
StatusChanged = 7,
|
||||
|
||||
/// <summary>
|
||||
/// 领取入驻审核。
|
||||
/// </summary>
|
||||
ReviewClaimed = 8,
|
||||
|
||||
/// <summary>
|
||||
/// 强制接管入驻审核。
|
||||
/// </summary>
|
||||
ReviewForceClaimed = 9,
|
||||
|
||||
/// <summary>
|
||||
/// 释放入驻审核(审核完成或手动释放)。
|
||||
/// </summary>
|
||||
ReviewClaimReleased = 10,
|
||||
|
||||
/// <summary>
|
||||
/// 平台伪装登录租户。
|
||||
/// </summary>
|
||||
ImpersonatedLogin = 11,
|
||||
|
||||
/// <summary>
|
||||
/// 生成主管理员重置链接。
|
||||
/// </summary>
|
||||
AdminResetLinkIssued = 12
|
||||
}
|
||||
|
||||
@@ -15,7 +15,7 @@ public interface ISubscriptionRepository
|
||||
/// </summary>
|
||||
/// <param name="subscriptionId">订阅 ID。</param>
|
||||
/// <param name="cancellationToken">取消标记。</param>
|
||||
/// <param name="ignoreTenantFilter">是否忽略租户过滤(用于平台级查询/任务)。</param>
|
||||
/// <param name="ignoreTenantFilter">是否忽略租户过滤(用于系统级任务)。</param>
|
||||
/// <returns>订阅实体,未找到返回 null。</returns>
|
||||
Task<TenantSubscription?> FindByIdAsync(
|
||||
long subscriptionId,
|
||||
@@ -27,7 +27,7 @@ public interface ISubscriptionRepository
|
||||
/// </summary>
|
||||
/// <param name="subscriptionIds">订阅 ID 列表。</param>
|
||||
/// <param name="cancellationToken">取消标记。</param>
|
||||
/// <param name="ignoreTenantFilter">是否忽略租户过滤(用于平台级查询/任务)。</param>
|
||||
/// <param name="ignoreTenantFilter">是否忽略租户过滤(用于系统级任务)。</param>
|
||||
/// <returns>订阅实体列表。</returns>
|
||||
Task<IReadOnlyList<TenantSubscription>> FindByIdsAsync(
|
||||
IEnumerable<long> subscriptionIds,
|
||||
@@ -39,7 +39,7 @@ public interface ISubscriptionRepository
|
||||
/// </summary>
|
||||
/// <param name="filter">查询过滤条件。</param>
|
||||
/// <param name="cancellationToken">取消标记。</param>
|
||||
/// <param name="ignoreTenantFilter">是否忽略租户过滤(用于平台级查询/任务)。</param>
|
||||
/// <param name="ignoreTenantFilter">是否忽略租户过滤(用于系统级任务)。</param>
|
||||
/// <returns>分页结果。</returns>
|
||||
Task<(IReadOnlyList<SubscriptionWithRelations> Items, int Total)> SearchPagedAsync(
|
||||
SubscriptionSearchFilter filter,
|
||||
@@ -51,7 +51,7 @@ public interface ISubscriptionRepository
|
||||
/// </summary>
|
||||
/// <param name="subscriptionId">订阅 ID。</param>
|
||||
/// <param name="cancellationToken">取消标记。</param>
|
||||
/// <param name="ignoreTenantFilter">是否忽略租户过滤(用于平台级查询/任务)。</param>
|
||||
/// <param name="ignoreTenantFilter">是否忽略租户过滤(用于系统级任务)。</param>
|
||||
/// <returns>订阅详情信息。</returns>
|
||||
Task<SubscriptionDetailInfo?> GetDetailAsync(
|
||||
long subscriptionId,
|
||||
@@ -63,7 +63,7 @@ public interface ISubscriptionRepository
|
||||
/// </summary>
|
||||
/// <param name="subscriptionIds">订阅 ID 列表。</param>
|
||||
/// <param name="cancellationToken">取消标记。</param>
|
||||
/// <param name="ignoreTenantFilter">是否忽略租户过滤(用于平台级查询/任务)。</param>
|
||||
/// <param name="ignoreTenantFilter">是否忽略租户过滤(用于系统级任务)。</param>
|
||||
/// <returns>订阅与租户信息列表。</returns>
|
||||
Task<IReadOnlyList<SubscriptionWithTenant>> FindByIdsWithTenantAsync(
|
||||
IEnumerable<long> subscriptionIds,
|
||||
@@ -76,7 +76,7 @@ public interface ISubscriptionRepository
|
||||
/// <param name="now">当前时间(UTC)。</param>
|
||||
/// <param name="renewalThreshold">续费阈值时间(UTC),到期时间小于等于该时间视为候选。</param>
|
||||
/// <param name="cancellationToken">取消标记。</param>
|
||||
/// <param name="ignoreTenantFilter">是否忽略租户过滤(用于平台级查询/任务)。</param>
|
||||
/// <param name="ignoreTenantFilter">是否忽略租户过滤(用于系统级任务)。</param>
|
||||
/// <returns>候选订阅集合(含套餐信息)。</returns>
|
||||
Task<IReadOnlyList<AutoRenewalCandidate>> FindAutoRenewalCandidatesAsync(
|
||||
DateTime now,
|
||||
@@ -90,7 +90,7 @@ public interface ISubscriptionRepository
|
||||
/// <param name="startOfDay">筛选开始时间(UTC,含)。</param>
|
||||
/// <param name="endOfDay">筛选结束时间(UTC,不含)。</param>
|
||||
/// <param name="cancellationToken">取消标记。</param>
|
||||
/// <param name="ignoreTenantFilter">是否忽略租户过滤(用于平台级查询/任务)。</param>
|
||||
/// <param name="ignoreTenantFilter">是否忽略租户过滤(用于系统级任务)。</param>
|
||||
/// <returns>候选订阅集合(含租户与套餐信息)。</returns>
|
||||
Task<IReadOnlyList<RenewalReminderCandidate>> FindRenewalReminderCandidatesAsync(
|
||||
DateTime startOfDay,
|
||||
@@ -103,7 +103,7 @@ public interface ISubscriptionRepository
|
||||
/// </summary>
|
||||
/// <param name="now">当前时间(UTC)。</param>
|
||||
/// <param name="cancellationToken">取消标记。</param>
|
||||
/// <param name="ignoreTenantFilter">是否忽略租户过滤(用于平台级查询/任务)。</param>
|
||||
/// <param name="ignoreTenantFilter">是否忽略租户过滤(用于系统级任务)。</param>
|
||||
/// <returns>到期订阅集合。</returns>
|
||||
Task<IReadOnlyList<TenantSubscription>> FindExpiredActiveSubscriptionsAsync(
|
||||
DateTime now,
|
||||
@@ -116,7 +116,7 @@ public interface ISubscriptionRepository
|
||||
/// <param name="now">当前时间(UTC)。</param>
|
||||
/// <param name="gracePeriodDays">宽限期天数。</param>
|
||||
/// <param name="cancellationToken">取消标记。</param>
|
||||
/// <param name="ignoreTenantFilter">是否忽略租户过滤(用于平台级查询/任务)。</param>
|
||||
/// <param name="ignoreTenantFilter">是否忽略租户过滤(用于系统级任务)。</param>
|
||||
/// <returns>宽限期到期订阅集合。</returns>
|
||||
Task<IReadOnlyList<TenantSubscription>> FindGracePeriodExpiredSubscriptionsAsync(
|
||||
DateTime now,
|
||||
@@ -177,7 +177,7 @@ public interface ISubscriptionRepository
|
||||
/// </summary>
|
||||
/// <param name="tenantId">租户 ID。</param>
|
||||
/// <param name="cancellationToken">取消标记。</param>
|
||||
/// <param name="ignoreTenantFilter">是否忽略租户过滤(用于平台级查询/任务)。</param>
|
||||
/// <param name="ignoreTenantFilter">是否忽略租户过滤(用于系统级任务)。</param>
|
||||
/// <returns>配额使用列表。</returns>
|
||||
Task<IReadOnlyList<TenantQuotaUsage>> GetQuotaUsagesAsync(
|
||||
long tenantId,
|
||||
|
||||
@@ -46,7 +46,7 @@ ON CONFLICT ("TenantId", "Code") DO NOTHING;
|
||||
|
||||
INSERT INTO dictionary_items ("Id", "TenantId", "GroupId", "Key", "Value", "IsDefault", "IsEnabled", "SortOrder", "Description", "CreatedAt", "CreatedBy")
|
||||
VALUES
|
||||
(10031, 0, 1003, 'PLATFORM_DELIVERY', '{"zh-CN":"平台配送","en":"Platform Delivery"}', true, true, 10, '平台自有骑手配送', CURRENT_TIMESTAMP, 0),
|
||||
(10031, 0, 1003, 'SYSTEM_DELIVERY', '{"zh-CN":"系统配送","en":"System Delivery"}', true, true, 10, '系统自有骑手配送', CURRENT_TIMESTAMP, 0),
|
||||
(10032, 0, 1003, 'MERCHANT_DELIVERY', '{"zh-CN":"商家配送","en":"Merchant Delivery"}', false, true, 20, '商家自行配送', CURRENT_TIMESTAMP, 0),
|
||||
(10033, 0, 1003, 'SELF_PICKUP', '{"zh-CN":"到店自取","en":"Self Pickup"}', false, true, 30, '顾客到店自取', CURRENT_TIMESTAMP, 0)
|
||||
ON CONFLICT ("TenantId", "GroupId", "Key") DO NOTHING;
|
||||
|
||||
@@ -52,7 +52,7 @@ public sealed class SeedUserOptions
|
||||
public long TenantId { get; set; }
|
||||
|
||||
/// <summary>
|
||||
/// 所属商户 ID(平台管理员为空)。
|
||||
/// 所属商户 ID(租户管理员为空)。
|
||||
/// </summary>
|
||||
public long? MerchantId { get; set; }
|
||||
|
||||
|
||||
@@ -35,7 +35,7 @@ public sealed class IdentityDbContext(
|
||||
public DbSet<Role> Roles => Set<Role>();
|
||||
|
||||
/// <summary>
|
||||
/// 角色模板集合(平台级)。
|
||||
/// 角色模板集合(系统级)。
|
||||
/// </summary>
|
||||
public DbSet<RoleTemplate> RoleTemplates => Set<RoleTemplate>();
|
||||
|
||||
|
||||
@@ -11,7 +11,7 @@ public sealed class SmsSendResult
|
||||
public bool Success { get; init; }
|
||||
|
||||
/// <summary>
|
||||
/// 平台返回的请求标识。
|
||||
/// 服务商返回的请求标识。
|
||||
/// </summary>
|
||||
public string? RequestId { get; init; }
|
||||
|
||||
|
||||
@@ -84,7 +84,7 @@ public sealed class CreateAnnouncementCommandValidatorTests
|
||||
// Arrange
|
||||
var command = AnnouncementTestData.CreateValidCreateCommand() with
|
||||
{
|
||||
PublisherScope = PublisherScope.Platform
|
||||
PublisherScope = PublisherScope.System
|
||||
};
|
||||
|
||||
// Act
|
||||
|
||||
Reference in New Issue
Block a user