From 743f7fec436939f9dcd8006e1e6921958a150ced Mon Sep 17 00:00:00 2001 From: wanghu Date: Sun, 20 Sep 2026 10:56:41 +0800 Subject: [PATCH] =?UTF-8?q?=E4=BF=AE=E6=94=B9userid?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../common/listener/NoticeAuditListener.java | 30 +++++++------- .../dormnotice/config/ReadBackfillRunner.java | 41 +++++++++++-------- .../yunhai/dormnotice/entity/BaseEntity.java | 8 ++-- 3 files changed, 42 insertions(+), 37 deletions(-) diff --git a/src/main/java/com/yunhai/dormnotice/common/listener/NoticeAuditListener.java b/src/main/java/com/yunhai/dormnotice/common/listener/NoticeAuditListener.java index f2ea03e..308de9e 100644 --- a/src/main/java/com/yunhai/dormnotice/common/listener/NoticeAuditListener.java +++ b/src/main/java/com/yunhai/dormnotice/common/listener/NoticeAuditListener.java @@ -1,8 +1,7 @@ package com.yunhai.dormnotice.common.listener; import com.yunhai.dormnotice.entity.BaseEntity; -import com.yunhai.platform.auth.LoginUser; -import com.yunhai.platform.auth.UserContextHolder; +import com.yunhai.dormnotice.utils.UserContext; import org.springframework.stereotype.Component; import javax.persistence.PrePersist; @@ -10,9 +9,10 @@ import javax.persistence.PreUpdate; import java.time.LocalDateTime; /** - * JPA 审计监听器:在实体持久化/更新前自动填充创建人/更新人(平台当前登录人)与时间戳。 - * 对应 {@link BaseEntity} 的 createBy / updateBy / createTime / updateTime 字段。 - * 当前登录人取自基础平台 {@link UserContextHolder}。 + * JPA 审计监听器:实体持久化/更新前自动填充创建人/更新人与时间戳。 + *

决策 D4:{@code create_by / update_by} 存**当前登录用户 ID**(数字 id),不再存登录账号。 + * id 取自 {@link UserContext#getUserId()}(由 ControllerUserContextAspect 在请求线程填充); + * 无登录上下文(启动种子/系统任务)时为 null,保持原值。

*/ @Component public class NoticeAuditListener { @@ -22,26 +22,26 @@ public class NoticeAuditListener { LocalDateTime now = LocalDateTime.now(); entity.setCreateTime(now); entity.setUpdateTime(now); - String account = currentAccount(); - if (account != null) { + Integer uid = currentUserId(); + if (uid != null) { if (entity.getCreateBy() == null) { - entity.setCreateBy(account); + entity.setCreateBy(uid); } - entity.setUpdateBy(account); + entity.setUpdateBy(uid); } } @PreUpdate public void preUpdate(BaseEntity entity) { entity.setUpdateTime(LocalDateTime.now()); - String account = currentAccount(); - if (account != null) { - entity.setUpdateBy(account); + Integer uid = currentUserId(); + if (uid != null) { + entity.setUpdateBy(uid); } } - private String currentAccount() { - LoginUser user = UserContextHolder.get(); - return user == null ? null : user.getLoginName(); + /** 当前登录用户 ID(数字);无上下文返回 null。 */ + private Integer currentUserId() { + return UserContext.getUserId(); } } diff --git a/src/main/java/com/yunhai/dormnotice/config/ReadBackfillRunner.java b/src/main/java/com/yunhai/dormnotice/config/ReadBackfillRunner.java index 4a12bd4..46f1f85 100644 --- a/src/main/java/com/yunhai/dormnotice/config/ReadBackfillRunner.java +++ b/src/main/java/com/yunhai/dormnotice/config/ReadBackfillRunner.java @@ -42,26 +42,31 @@ public class ReadBackfillRunner implements ApplicationRunner { if (!enabled) { return; } - List acted = receiptRepository.findByStatusIn(java.util.Arrays.asList("confirmed", "filled")); - int added = 0; - for (Receipt r : acted) { - if (r.getNoticeId() == null || r.getStudentId() == null) { - continue; + try { + List acted = receiptRepository.findByStatusIn(java.util.Arrays.asList("confirmed", "filled")); + int added = 0; + for (Receipt r : acted) { + if (r.getNoticeId() == null || r.getStudentId() == null) { + continue; + } + if (readRepository.existsByNoticeIdAndStudentId(r.getNoticeId(), r.getStudentId())) { + continue; + } + DormNoticeRead rd = new DormNoticeRead(); + rd.setNoticeId(r.getNoticeId()); + rd.setStudentId(r.getStudentId()); + rd.setRoomId(r.getRoomId()); + rd.setReadAt(r.getSubmittedAt() != null ? r.getSubmittedAt() : LocalDateTime.now()); + rd.setSchId(r.getSchId()); + readRepository.save(rd); + added++; } - if (readRepository.existsByNoticeIdAndStudentId(r.getNoticeId(), r.getStudentId())) { - continue; + if (added > 0) { + log.info("[ReadBackfill] 依据已确认/已填报回执回填阅读记录 {} 条", added); } - DormNoticeRead rd = new DormNoticeRead(); - rd.setNoticeId(r.getNoticeId()); - rd.setStudentId(r.getStudentId()); - rd.setRoomId(r.getRoomId()); - rd.setReadAt(r.getSubmittedAt() != null ? r.getSubmittedAt() : LocalDateTime.now()); - rd.setSchId(r.getSchId()); - readRepository.save(rd); - added++; - } - if (added > 0) { - log.info("[ReadBackfill] 依据已确认/已填报回执回填阅读记录 {} 条", added); + } catch (Exception e) { + // 回填失败不得阻断启动(如列类型未迁移等) + log.warn("[ReadBackfill] 阅读记录回填跳过:{}", e.getMessage()); } } } diff --git a/src/main/java/com/yunhai/dormnotice/entity/BaseEntity.java b/src/main/java/com/yunhai/dormnotice/entity/BaseEntity.java index 1804dd5..cf85e67 100644 --- a/src/main/java/com/yunhai/dormnotice/entity/BaseEntity.java +++ b/src/main/java/com/yunhai/dormnotice/entity/BaseEntity.java @@ -24,10 +24,10 @@ public abstract class BaseEntity implements Serializable { private Integer id; /** - * 创建人登录账号 + * 创建人用户ID(数字;决策 D4,不存登录账号) */ @Column(name = "create_by", updatable = false) - private String createBy; + private Integer createBy; /** * 创建时间 @@ -36,10 +36,10 @@ public abstract class BaseEntity implements Serializable { private LocalDateTime createTime; /** - * 更新人登录账号 + * 更新人用户ID(数字;决策 D4,不存登录账号) */ @Column(name = "update_by") - private String updateBy; + private Integer updateBy; /** * 更新时间