using Store.Users.Contracts.Enums; using System.ComponentModel.DataAnnotations; namespace Store.Users.Contracts.Dtos; /// 账户资料;null 保留原值,空字符串清空文本。输入约束由 DTO 声明,权限与账户关系由服务检查。 public class UserEditRequest { [StringLength(50)] public string? NickName { get; set; } [StringLength(30)] public string? Mobile { get; set; } [StringLength(100)] public string? CompanyName { get; set; } [StringLength(255)] public string? Notes { get; set; } [StringLength(50)] public string? CardId { get; set; } [EnumDataType(typeof(UserGroup), ErrorMessage = "请选择有效的用户分组")] public UserGroup? GroupId { get; set; } /// 仅管理员可设置;普通账号不能通过资料修改提升管理员级别。 [EnumDataType(typeof(UserAdminLevel), ErrorMessage = "管理员级别只能为普通用户或超级管理员")] public UserAdminLevel? SaLevel { get; set; } [StringLength(1000)] public string? Authority { get; set; } [StringLength(1000)] public string? ForbiddenPage { get; set; } [StringLength(50)] public string? OemId { get; set; } [Range(30, int.MaxValue, ErrorMessage = "每月续费积分不能低于30")] public int? ShopPointsPerMonth { get; set; } [Range(typeof(decimal), "2.2", "999999")] public decimal? PostagePerOrder { get; set; } [Range(typeof(decimal), "2.5", "999999")] public decimal? RefundPostagePerOrder { get; set; } [Range(typeof(decimal), "0", "999999")] public decimal? GiftOemAmountPerOrder { get; set; } [Range(typeof(decimal), "0", "999999")] public decimal? SyncLogisticsPerOrder { get; set; } } /// 修改账户资料;账户 ID 与资料字段统一通过 JSON 请求体提交。 public sealed class UserUpdateRequest : UserEditRequest { [Range(1, int.MaxValue, ErrorMessage = "ID必须大于0")] public int Id { get; set; } } /// 创建主账号或当前主账号的直属子账号。 public sealed class UserCreateRequest : UserEditRequest { /// 创建子账号时的父账号;管理员可指定任意主账号,普通主账号只能指定自己。 [StringLength(20)] public string? ParentUserName { get; set; } [Required(ErrorMessage = "用户名不能为空"), StringLength(20)] public string UserName { get; set; } = ""; [Required(ErrorMessage = "密码不能为空"), StringLength(128, MinimumLength = 6)] public string Password { get; set; } = ""; } /// 非管理员本人改密需原密码;管理员可重置任意账户,主账号可重置直属子账号密码。 public sealed class ChangePasswordRequest { [StringLength(20)] public string? UserName { get; set; } [StringLength(128)] public string? OldPassword { get; set; } [Required(ErrorMessage = "新密码不能为空"), StringLength(128, MinimumLength = 6)] public string NewPassword { get; set; } = ""; } /// 本人修改密码时验证原密码非空。 public sealed class UserPasswordProofRequest { [Required(ErrorMessage = "原密码不能为空")] public string OldPassword { get; set; } = ""; } /// 分页参数;在查询数据库前完成范围校验。 public class UserSearchRequest { [Range(1, 1000000)] public int Page { get; set; } = 1; [Range(1, 200)] public int PageSize { get; set; } = 50; [StringLength(100)] public string? Keyword { get; set; } [EnumDataType(typeof(UserGroup), ErrorMessage = "请选择有效的用户分组")] public UserGroup? GroupId { get; set; } /// 查询子账号时可按父账号筛选;管理员可指定任意账号,普通主账号只能指定自己。 [StringLength(20)] public string? ParentUserName { get; set; } } public sealed record UserPage(long Total, IReadOnlyList Items); /// 流水查询支持时间范围、操作类型、店铺及订单过滤。 public sealed class UserRecordSearchRequest : UserSearchRequest, IValidatableObject { /// 目标账户;省略时查询本人。 [StringLength(20)] public string? UserName { get; set; } public DateTime? StartTime { get; set; } public DateTime? EndTime { get; set; } [StringLength(20)] public string? Operation { get; set; } [StringLength(50)] public string? ShopId { get; set; } public int? PaymentType { get; set; } [StringLength(100)] public string? OrderId { get; set; } public IEnumerable Validate(ValidationContext validationContext) { if (StartTime > EndTime) yield return new ValidationResult("开始时间不能晚于结束时间", [nameof(StartTime), nameof(EndTime)]); } } /// 单个账户 ID 参数的校验,供服务内部调用复用。 public sealed class UserIdRequest { [Range(1, int.MaxValue, ErrorMessage = "ID必须大于0")] public int Id { get; set; } }