package com.dms.model; import java.time.LocalDateTime; import lombok.Data; /** sys_user 表实体(对齐 Alembic 0016 head)。 */ @Data public class UserEntity { private Long id; private Long createdBy; private Long updatedBy; private LocalDateTime createdAt; private LocalDateTime updatedAt; private LocalDateTime deletedAt; private Boolean isDeleted; private Integer rowVersion; private String username; private String passwordHash; private String realName; private Long organizationId; private String organizationName; private String roleCode; private String securityLevel; private String status; private Integer authVersion; private LocalDateTime lastLoginAt; private String lastLoginIp; /** 登录失败锁定:连续密码错误计数与锁定截止时间(UTC,null=未锁定)。 */ private Integer failedLoginCount; private LocalDateTime lockedUntil; private String externalId; /** 席位(契约1.46):右上角用户信息第二行「机构 + 空格 + 席位」展示;可空。 */ private String seatName; /** 用户类型(契约1.46):NORMAL=普通用户、COMMANDER=首长(仍属 USER 类别, * 仅重置密码方式后续差异化);DB 缺省 NORMAL。 */ private String userType; /** 界面主题偏好(账号级漫游,契约1.20):blue/red/green,存量与缺省为 blue。 */ private String uiTheme; /** 拖动排序号(契约1.27):拖拽重排按步长10全量重编号,排序号输入已废止。 */ private Integer sortNo; /** 用户级管理范围(契约1.30):null=全局、0=跟随本人所在机构(SELF 哨兵)、 * 机构ID=固定锚点;仅角色锚点为 SELF 时生效(实际范围以角色设置为准)。 */ private Long managedOrgId; /** 一次一码会话代(安全需求):当前有效授权码的 JWT jti;写操作成功后轮换, * 旧码写操作拒绝。NULL = 未纳管(存量会话/轮换开关关闭期间登录),校验跳过。 */ private String sessionJti; }