using System.ComponentModel.DataAnnotations; using System.Text.Json; using Tiku.Application.TenantAdmin; using Tiku.Domain.Common; namespace Tiku.Api.Contracts; /// /// 租户管理端班级查询参数。 /// public sealed class TenantAdminClassQueryDto { /// /// 地区 ID。 /// public Guid? RegionId { get; set; } /// /// 状态。 /// public string? Status { get; set; } /// /// 关键字。 /// public string? Keyword { get; set; } /// /// 返回数量上限。 /// [Range(1, 500)] public int? Limit { get; set; } public TenantAdminClassFilter ToFilter() { return new TenantAdminClassFilter(RegionId, Status, Keyword, Limit); } } /// /// 租户管理端班级成员查询参数。 /// public sealed class TenantAdminClassMemberQueryDto { /// /// 班级 ID。 /// [Required] public Guid ClassId { get; set; } /// /// 成员类型。 /// public string? MemberType { get; set; } /// /// 状态。 /// public string? Status { get; set; } /// /// 返回数量上限。 /// [Range(1, 500)] public int? Limit { get; set; } public TenantAdminClassMemberFilter ToFilter() { return new TenantAdminClassMemberFilter(ClassId, MemberType, Status, Limit); } } /// /// 租户管理端学生查询参数。 /// public sealed class TenantAdminStudentQueryDto { /// /// 地区 ID。 /// public Guid? RegionId { get; set; } /// /// 班级 ID。 /// public Guid? ClassId { get; set; } /// /// 状态。 /// public string? Status { get; set; } /// /// 关键字。 /// public string? Keyword { get; set; } /// /// 返回数量上限。 /// [Range(1, 500)] public int? Limit { get; set; } public TenantAdminStudentFilter ToFilter() { return new TenantAdminStudentFilter(RegionId, ClassId, Status, Keyword, Limit); } } /// /// 租户管理端学生活动查询参数。 /// public sealed class TenantAdminStudentActivityQueryDto { /// /// 学生用户 ID。 /// public Guid? StudentUserId { get; set; } /// /// 状态。 /// public string? Status { get; set; } /// /// 返回数量上限。 /// [Range(1, 500)] public int? Limit { get; set; } public TenantAdminStudentActivityFilter ToFilter() { return new TenantAdminStudentActivityFilter(StudentUserId, Status, Limit); } } /// /// 租户管理端成员查询参数。 /// public sealed class TenantAdminMemberQueryDto { /// /// 角色。 /// public string? Role { get; set; } /// /// 状态。 /// public string? Status { get; set; } /// /// 关键字。 /// public string? Keyword { get; set; } /// /// 返回数量上限。 /// [Range(1, 500)] public int? Limit { get; set; } public TenantAdminMemberFilter ToFilter() { return new TenantAdminMemberFilter(Role, Status, Keyword, Limit); } } /// /// 租户管理端审计日志查询参数。 /// public sealed class TenantAdminAuditLogQueryDto { /// /// 操作。 /// public string? Action { get; set; } /// /// 目标类型。 /// public string? TargetType { get; set; } /// /// 操作人用户 ID。 /// public Guid? ActorUserId { get; set; } /// /// 返回数量上限。 /// [Range(1, 500)] public int? Limit { get; set; } public TenantAdminAuditLogFilter ToFilter() { return new TenantAdminAuditLogFilter(Action, TargetType, ActorUserId, Limit); } } /// /// 租户管理端徽章查询参数。 /// public sealed class TenantAdminBadgeQueryDto { /// /// 分类。 /// public string? Category { get; set; } /// /// 是否包含停用数据。 /// public bool IncludeInactive { get; set; } /// /// 返回数量上限。 /// [Range(1, 500)] public int? Limit { get; set; } public TenantAdminBadgeFilter ToFilter() { return new TenantAdminBadgeFilter(Category, IncludeInactive, Limit); } } /// /// 租户管理端徽章授予查询参数。 /// public sealed class TenantAdminBadgeGrantQueryDto { /// /// 用户 ID。 /// public Guid? UserId { get; set; } /// /// 徽章 ID。 /// public Guid? BadgeId { get; set; } /// /// 返回数量上限。 /// [Range(1, 500)] public int? Limit { get; set; } public TenantAdminBadgeGrantFilter ToFilter() { return new TenantAdminBadgeGrantFilter(UserId, BadgeId, Limit); } } /// /// 租户管理端通知查询参数。 /// public sealed class TenantAdminNotificationQueryDto { /// /// 用户 ID。 /// public Guid? UserId { get; set; } /// /// 状态。 /// public string? Status { get; set; } /// /// 通知类型。 /// public string? NotificationType { get; set; } /// /// 返回数量上限。 /// [Range(1, 500)] public int? Limit { get; set; } public TenantAdminNotificationFilter ToFilter() { return new TenantAdminNotificationFilter(UserId, Status, NotificationType, Limit); } } /// /// 租户管理端反馈查询参数。 /// public sealed class TenantAdminFeedbackQueryDto { /// /// 用户 ID。 /// public Guid? UserId { get; set; } /// /// 状态。 /// public string? Status { get; set; } /// /// 类型。 /// public string? Type { get; set; } /// /// 关键字。 /// public string? Keyword { get; set; } /// /// 返回数量上限。 /// [Range(1, 500)] public int? Limit { get; set; } public TenantAdminFeedbackFilter ToFilter() { return new TenantAdminFeedbackFilter(UserId, Status, Type, Keyword, Limit); } } /// /// 新增或更新租户管理端班级请求 DTO。 /// public sealed class UpsertTenantAdminClassDto { /// /// ID。 /// public Guid? Id { get; set; } /// /// 地区 ID。 /// public Guid? RegionId { get; set; } /// /// 历史系统 ID。 /// public string? LegacyId { get; set; } /// /// 编码。 /// public string? Code { get; set; } /// /// 名称。 /// public required string Name { get; set; } /// /// 说明。 /// public string? Description { get; set; } /// /// 状态。 /// public string? Status { get; set; } /// /// 显示顺序。 /// public int? Order { get; set; } /// /// 扩展元数据。 /// public JsonElement Metadata { get; set; } = JsonDefaults.Object(); public UpsertTenantAdminClassCommand ToCommand() { return new UpsertTenantAdminClassCommand(Id, RegionId, LegacyId, Code, Name, Description, Status, Order, Metadata); } } /// /// 租户管理端用户查找请求 DTO。 /// public sealed class TenantAdminUserLookupDto { /// /// 用户 ID。 /// public Guid? UserId { get; set; } /// /// 用户名。 /// public string? Username { get; set; } /// /// 邮箱。 /// public string? Email { get; set; } /// /// 手机号。 /// public string? Phone { get; set; } /// /// 名称。 /// public string? Name { get; set; } /// /// 头像地址。 /// public string? AvatarUrl { get; set; } public UserLookupCommand ToCommand() { return new UserLookupCommand(UserId, Username, Email, Phone, Name, AvatarUrl); } } /// /// 新增或更新租户管理端班级成员请求 DTO。 /// public sealed class UpsertTenantAdminClassMemberDto { /// /// 班级 ID。 /// [Required] public Guid ClassId { get; set; } /// /// 用户信息。 /// public TenantAdminUserLookupDto User { get; set; } = new(); /// /// 成员类型。 /// public string? MemberType { get; set; } /// /// 状态。 /// public string? Status { get; set; } /// /// 扩展元数据。 /// public JsonElement Metadata { get; set; } = JsonDefaults.Object(); public UpsertTenantAdminClassMemberCommand ToCommand() { return new UpsertTenantAdminClassMemberCommand(ClassId, User.ToCommand(), MemberType, Status, Metadata); } } /// /// 移除租户管理端班级成员请求 DTO。 /// public sealed class RemoveTenantAdminClassMemberDto { /// /// 班级成员 ID。 /// [Required] public Guid ClassMemberId { get; set; } } /// /// 新增或更新租户管理端学生请求 DTO。 /// public sealed class UpsertTenantAdminStudentDto { /// /// 用户信息。 /// public TenantAdminUserLookupDto User { get; set; } = new(); /// /// 地区 ID。 /// public Guid? RegionId { get; set; } /// /// 已选择院校 ID。 /// public Guid? SelectedSchoolId { get; set; } /// /// 已选择专业 ID。 /// public Guid? SelectedMajorId { get; set; } /// /// 头像预设。 /// public string? AvatarPreset { get; set; } /// /// 统计数据。 /// public JsonElement Stats { get; set; } = JsonDefaults.Object(); /// /// 进度数据。 /// public JsonElement Progress { get; set; } = JsonDefaults.Object(); /// /// 模块选择数据。 /// public JsonElement ModuleSelections { get; set; } = JsonDefaults.Object(); /// /// 原始用户资料。 /// public JsonElement RawProfile { get; set; } = JsonDefaults.Object(); public UpsertTenantAdminStudentCommand ToCommand() { return new UpsertTenantAdminStudentCommand( User.ToCommand(), RegionId, SelectedSchoolId, SelectedMajorId, AvatarPreset, Stats, Progress, ModuleSelections, RawProfile); } } /// /// 更新租户管理端学生状态请求 DTO。 /// public sealed class UpdateTenantAdminStudentStatusDto { /// /// 用户 ID。 /// [Required] public Guid UserId { get; set; } /// /// 状态。 /// public string? Status { get; set; } /// /// 原因。 /// public string? Reason { get; set; } public UpdateTenantAdminStudentStatusCommand ToCommand() { return new UpdateTenantAdminStudentStatusCommand(UserId, Status, Reason); } } /// /// 租户管理端学生导入行请求 DTO。 /// public sealed class TenantAdminStudentImportRowDto { /// /// 用户信息。 /// public TenantAdminUserLookupDto User { get; set; } = new(); /// /// 地区 ID。 /// public Guid? RegionId { get; set; } /// /// 班级 ID。 /// public Guid? ClassId { get; set; } /// /// 头像预设。 /// public string? AvatarPreset { get; set; } /// /// 原始用户资料。 /// public JsonElement RawProfile { get; set; } = JsonDefaults.Object(); public TenantAdminStudentImportRowCommand ToCommand() { return new TenantAdminStudentImportRowCommand(User.ToCommand(), RegionId, ClassId, AvatarPreset, RawProfile); } } /// /// 租户管理端学生导入请求 DTO。 /// public sealed class TenantAdminStudentImportDto { /// /// 数据行列表。 /// [Required] public IReadOnlyCollection Rows { get; set; } = []; public TenantAdminStudentImportCommand ToCommand() { return new TenantAdminStudentImportCommand(Rows.Select(row => row.ToCommand()).ToArray()); } } /// /// 租户管理端批量分配班级请求 DTO。 /// public sealed class TenantAdminBulkAssignClassDto { /// /// 班级 ID。 /// [Required] public Guid ClassId { get; set; } /// /// 用户 ID 列表。 /// [Required] public IReadOnlyCollection UserIds { get; set; } = []; public TenantAdminBulkAssignClassCommand ToCommand() { return new TenantAdminBulkAssignClassCommand(ClassId, UserIds); } } /// /// 租户管理端批量状态请求 DTO。 /// public sealed class TenantAdminBulkStatusDto { /// /// 用户 ID 列表。 /// [Required] public IReadOnlyCollection UserIds { get; set; } = []; /// /// 状态。 /// public string? Status { get; set; } /// /// 原因。 /// [StringLength(1000)] public string? Reason { get; set; } public TenantAdminBulkStatusCommand ToCommand() { return new TenantAdminBulkStatusCommand(UserIds, Status, Reason); } } /// /// 新增或更新租户督导规则请求 DTO。 /// public sealed class UpsertTenantSupervisionRuleDto { /// /// 编码。 /// [Required] [StringLength(100)] public string Code { get; set; } = string.Empty; /// /// 标题。 /// [Required] [StringLength(200)] public string Title { get; set; } = string.Empty; /// /// 是否启用。 /// public bool Enabled { get; set; } = true; /// /// 未签到天数。 /// [Range(0, 3650)] public int? DaysWithoutCheckIn { get; set; } /// /// 当天最大答题数。 /// [Range(0, int.MaxValue)] public int? MaxQuestionsAnsweredToday { get; set; } /// /// 跟进类型。 /// [StringLength(50)] public string? FollowupType { get; set; } /// /// 优先级。 /// [StringLength(50)] public string? Priority { get; set; } /// /// 扩展元数据。 /// public JsonElement Metadata { get; set; } = JsonDefaults.Object(); public UpsertTenantSupervisionRuleCommand ToCommand() { return new UpsertTenantSupervisionRuleCommand( Code, Title, Enabled, DaysWithoutCheckIn, MaxQuestionsAnsweredToday, FollowupType, Priority, Metadata); } } /// /// 租户督导生成请求 DTO。 /// public sealed class TenantSupervisionGenerateDto { /// /// 用户 ID 列表。 /// public IReadOnlyCollection? UserIds { get; set; } /// /// 分配处理人用户 ID。 /// public Guid? AssignedToUserId { get; set; } /// /// 到期时间。 /// public DateTimeOffset? DueAt { get; set; } public TenantSupervisionGenerateCommand ToCommand() { return new TenantSupervisionGenerateCommand(UserIds, AssignedToUserId, DueAt); } } /// /// 新增或更新租户管理端学生Note请求 DTO。 /// public sealed class UpsertTenantAdminStudentNoteDto { /// /// ID。 /// public Guid? Id { get; set; } /// /// 学生用户 ID。 /// [Required] public Guid StudentUserId { get; set; } /// /// 备注类型。 /// public string? NoteType { get; set; } /// /// 内容。 /// public required string Content { get; set; } /// /// 可见性。 /// public string? Visibility { get; set; } /// /// 是否置顶。 /// public bool? IsPinned { get; set; } /// /// 扩展元数据。 /// public JsonElement Metadata { get; set; } = JsonDefaults.Object(); public UpsertTenantAdminStudentNoteCommand ToCommand() { return new UpsertTenantAdminStudentNoteCommand(Id, StudentUserId, NoteType, Content, Visibility, IsPinned, Metadata); } } /// /// 新增或更新租户管理端学生跟进请求 DTO。 /// public sealed class UpsertTenantAdminStudentFollowupDto { /// /// ID。 /// public Guid? Id { get; set; } /// /// 学生用户 ID。 /// [Required] public Guid StudentUserId { get; set; } /// /// 分配处理人用户 ID。 /// public Guid? AssignedToUserId { get; set; } /// /// 班级 ID。 /// public Guid? ClassId { get; set; } /// /// 标题。 /// public required string Title { get; set; } /// /// 说明。 /// public string? Description { get; set; } /// /// 跟进类型。 /// public string? FollowupType { get; set; } /// /// 优先级。 /// public string? Priority { get; set; } /// /// 状态。 /// public string? Status { get; set; } /// /// 到期时间。 /// public DateTimeOffset? DueAt { get; set; } /// /// 扩展元数据。 /// public JsonElement Metadata { get; set; } = JsonDefaults.Object(); public UpsertTenantAdminStudentFollowupCommand ToCommand() { return new UpsertTenantAdminStudentFollowupCommand( Id, StudentUserId, AssignedToUserId, ClassId, Title, Description, FollowupType, Priority, Status, DueAt, Metadata); } } /// /// 新增或更新租户管理端成员请求 DTO。 /// public sealed class UpsertTenantAdminMemberDto { /// /// 成员关系 ID。 /// public Guid? MembershipId { get; set; } /// /// 用户信息。 /// public TenantAdminUserLookupDto User { get; set; } = new(); /// /// 角色。 /// public string? Role { get; set; } /// /// 状态。 /// public string? Status { get; set; } /// /// 主要角色。 /// public string? PrimaryRole { get; set; } public UpsertTenantAdminMemberCommand ToCommand() { return new UpsertTenantAdminMemberCommand(MembershipId, User.ToCommand(), Role, Status, PrimaryRole); } } /// /// 禁用租户管理端成员请求 DTO。 /// public sealed class DisableTenantAdminMemberDto { /// /// 成员关系 ID。 /// [Required] public Guid MembershipId { get; set; } } /// /// 新增或更新租户品牌请求 DTO。 /// public sealed class UpsertTenantBrandingDto { /// /// 品牌名称。 /// public required string BrandName { get; set; } /// /// 品牌简称。 /// public string? ShortName { get; set; } /// /// 品牌标语。 /// public string? Slogan { get; set; } /// /// 机构名称。 /// public string? OrganizationName { get; set; } /// /// Logo 地址。 /// public string? LogoUrl { get; set; } /// /// 站点图标地址。 /// public string? FaviconUrl { get; set; } /// /// 客服微信。 /// public string? ServiceWechat { get; set; } /// /// 客服账号名称。 /// public string? ServiceAccountName { get; set; } public UpsertTenantBrandingCommand ToCommand() { return new UpsertTenantBrandingCommand( BrandName, ShortName, Slogan, OrganizationName, LogoUrl, FaviconUrl, ServiceWechat, ServiceAccountName); } } /// /// 新增或更新租户设置请求 DTO。 /// public sealed class UpsertTenantSettingsDto { /// /// 前端功能开关。 /// public JsonElement FeatureFlags { get; set; } = JsonDefaults.Object(); /// /// 管理端功能开关。 /// public JsonElement AdminFeatureFlags { get; set; } = JsonDefaults.Object(); /// /// 公开配置。 /// public JsonElement PublicConfig { get; set; } = JsonDefaults.Object(); public UpsertTenantSettingsCommand ToCommand() { return new UpsertTenantSettingsCommand(FeatureFlags, AdminFeatureFlags, PublicConfig); } } /// /// 预览租户主题请求 DTO。 /// public sealed class PreviewTenantThemeDto { /// /// 模板编码。 /// public required string TemplateCode { get; set; } /// /// 主题配置。 /// public JsonElement Theme { get; set; } = JsonDefaults.Object(); /// /// 公开资源配置。 /// public JsonElement PublicAssets { get; set; } = JsonDefaults.Object(); public PreviewTenantThemeCommand ToCommand() { return new PreviewTenantThemeCommand(TemplateCode, Theme, PublicAssets); } } /// /// 发布租户主题请求 DTO。 /// public sealed class PublishTenantThemeDto { /// /// 是否使用草稿配置。 /// public bool? UseDraft { get; set; } /// /// 模板编码。 /// public string? TemplateCode { get; set; } /// /// 主题配置。 /// public JsonElement Theme { get; set; } = JsonDefaults.Object(); /// /// 公开资源配置。 /// public JsonElement PublicAssets { get; set; } = JsonDefaults.Object(); public PublishTenantThemeCommand ToCommand() { return new PublishTenantThemeCommand(UseDraft ?? true, TemplateCode, Theme, PublicAssets); } } /// /// 创建租户域名请求 DTO。 /// public sealed class CreateTenantDomainDto { /// /// 访问域名。 /// public required string Host { get; set; } /// /// 域名类型。 /// public string? DomainType { get; set; } /// /// 是否主域名。 /// public bool IsPrimary { get; set; } public CreateTenantDomainCommand ToCommand() { return new CreateTenantDomainCommand(Host, DomainType, IsPrimary); } } /// /// 新增或更新租户身份源Provider请求 DTO。 /// public sealed class UpsertTenantIdentityProviderDto { /// /// 服务提供方。 /// public required string Provider { get; set; } /// /// 状态。 /// public string? Status { get; set; } /// /// 显示名称。 /// public string? DisplayName { get; set; } /// /// 密钥引用。 /// public string? SecretRef { get; set; } /// /// 优先级。 /// public int? Priority { get; set; } /// /// 公开配置内容。 /// public JsonElement ConfigPublic { get; set; } = JsonDefaults.Object(); public UpsertTenantIdentityProviderCommand ToCommand() { return new UpsertTenantIdentityProviderCommand(Provider, Status, DisplayName, SecretRef, Priority, ConfigPublic); } } /// /// 新增或更新租户管理端徽章请求 DTO。 /// public sealed class UpsertTenantAdminBadgeDto { /// /// ID。 /// public Guid? Id { get; set; } /// /// 历史系统 ID。 /// public string? LegacyId { get; set; } /// /// 名称。 /// public required string Name { get; set; } /// /// 说明。 /// public string? Description { get; set; } /// /// 分类。 /// public string? Category { get; set; } /// /// 图标地址。 /// public string? IconUrl { get; set; } /// /// 级别。 /// public int? Level { get; set; } /// /// 解锁类型。 /// public string? UnlockType { get; set; } /// /// 条件字段。 /// public string? ConditionField { get; set; } /// /// 条件运算符。 /// public string? ConditionOperator { get; set; } /// /// 条件值。 /// public decimal? ConditionValue { get; set; } /// /// 条件扩展配置。 /// public JsonElement ConditionExtra { get; set; } = JsonDefaults.Object(); /// /// 显示顺序。 /// public int? Order { get; set; } /// /// 是否启用。 /// public bool? IsActive { get; set; } public UpsertTenantAdminBadgeCommand ToCommand() { return new UpsertTenantAdminBadgeCommand( Id, LegacyId, Name, Description, Category, IconUrl, Level, UnlockType, ConditionField, ConditionOperator, ConditionValue, ConditionExtra, Order, IsActive); } } /// /// 授予租户管理端徽章请求 DTO。 /// public sealed class GrantTenantAdminBadgeDto { /// /// 用户 ID。 /// [Required] public Guid UserId { get; set; } /// /// 徽章 ID。 /// [Required] public Guid BadgeId { get; set; } /// /// 历史系统 ID。 /// public string? LegacyId { get; set; } /// /// 备注。 /// public string? Note { get; set; } /// /// 授予时间。 /// public DateTimeOffset? GrantedAt { get; set; } /// /// 扩展元数据。 /// public JsonElement Metadata { get; set; } = JsonDefaults.Object(); public GrantTenantAdminBadgeCommand ToCommand() { return new GrantTenantAdminBadgeCommand(UserId, BadgeId, LegacyId, Note, GrantedAt, Metadata); } } /// /// 新增或更新租户管理端通知请求 DTO。 /// public sealed class UpsertTenantAdminNotificationDto { /// /// 用户 ID。 /// [Required] public Guid UserId { get; set; } /// /// 通知类型。 /// public required string NotificationType { get; set; } /// /// 严重级别。 /// public string? Severity { get; set; } /// /// 标题。 /// public required string Title { get; set; } /// /// 消息内容。 /// public required string Message { get; set; } /// /// 操作按钮文案。 /// public string? ActionLabel { get; set; } /// /// 操作路径。 /// public string? ActionPath { get; set; } /// /// 来源类型。 /// public string? SourceType { get; set; } /// /// 来源 ID。 /// public Guid? SourceId { get; set; } /// /// 去重键。 /// public string? DedupeKey { get; set; } /// /// 扩展元数据。 /// public JsonElement Metadata { get; set; } = JsonDefaults.Object(); public UpsertTenantAdminNotificationCommand ToCommand() { return new UpsertTenantAdminNotificationCommand( UserId, NotificationType, Severity, Title, Message, ActionLabel, ActionPath, SourceType, SourceId, DedupeKey, Metadata); } } /// /// 更新租户管理端反馈请求 DTO。 /// public sealed class UpdateTenantAdminFeedbackDto { /// /// 反馈 ID。 /// [Required] public Guid FeedbackId { get; set; } /// /// 状态。 /// public string? Status { get; set; } /// /// 优先级。 /// public string? Priority { get; set; } /// /// 处理结果。 /// public string? Resolution { get; set; } /// /// 备注。 /// public string? Note { get; set; } /// /// 扩展元数据。 /// public JsonElement Metadata { get; set; } = JsonDefaults.Object(); public UpdateTenantAdminFeedbackCommand ToCommand() { return new UpdateTenantAdminFeedbackCommand(FeedbackId, Status, Priority, Resolution, Note, Metadata); } }