From b620af46945757c8c578a9f8d3ef472e40544d70 Mon Sep 17 00:00:00 2001
From: “mitao” <“2763622819@qq.com”>
Date: 星期五, 24 四月 2026 17:29:25 +0800
Subject: [PATCH] bugfix
---
tcm-training-admin-backend/src/main/java/com/tcm/training/admin/app/live/support/AppLiveCourseDisplaySupport.java | 62 ++++++++++++++++++++++++++-----
1 files changed, 52 insertions(+), 10 deletions(-)
diff --git a/tcm-training-admin-backend/src/main/java/com/tcm/training/admin/app/live/support/AppLiveCourseDisplaySupport.java b/tcm-training-admin-backend/src/main/java/com/tcm/training/admin/app/live/support/AppLiveCourseDisplaySupport.java
index e51bf95..dd1958e 100644
--- a/tcm-training-admin-backend/src/main/java/com/tcm/training/admin/app/live/support/AppLiveCourseDisplaySupport.java
+++ b/tcm-training-admin-backend/src/main/java/com/tcm/training/admin/app/live/support/AppLiveCourseDisplaySupport.java
@@ -36,14 +36,14 @@
CourseDisplaySnapshot snapshot = new CourseDisplaySnapshot();
LiveSession latestStartedSession = findLatestStartedSession(safeSessions, now);
snapshot.setLatestStartedSession(latestStartedSession);
- LiveSession currentSession = resolveCurrentSession(latestStartedSession);
+ LiveSession currentSession = resolveCurrentSession(latestStartedSession, now);
snapshot.setCurrentSession(currentSession);
if (currentSession != null) {
snapshot.setDisplayStatus(DISPLAY_STATUS_LIVING);
return snapshot;
}
- LiveSession latestEndedSession = resolveLatestEndedSession(safeSessions, latestStartedSession);
+ LiveSession latestEndedSession = resolveLatestEndedSession(safeSessions, latestStartedSession, now);
snapshot.setLatestEndedSession(latestEndedSession);
snapshot.setLatestEndedAt(resolveEndedAt(latestEndedSession));
if (isInEndedCooldown(latestEndedSession, now, endedCooldownMinutes)) {
@@ -115,7 +115,7 @@
}
/**
- * 获取直播结束时间,优先使用实际结束时间。
+ * 获取直播结束时间,优先使用实际结束时间,其次按计划开播时间和配置时长计算。
*/
public LocalDateTime resolveEndedAt(LiveSession session) {
if (session == null) {
@@ -123,6 +123,9 @@
}
if (session.getActualEndTime() != null) {
return session.getActualEndTime();
+ }
+ if (session.getStartTime() != null && defaultNumber(session.getDurationSeconds()) > 0) {
+ return session.getStartTime().plusSeconds(defaultNumber(session.getDurationSeconds()));
}
return session.getStartTime();
}
@@ -206,26 +209,44 @@
/**
* 将时间线上最近一场已开始场次解析为当前直播场次。
*/
- private LiveSession resolveCurrentSession(LiveSession latestStartedSession) {
+ private LiveSession resolveCurrentSession(LiveSession latestStartedSession, LocalDateTime now) {
if (latestStartedSession == null) {
return null;
}
- if (defaultNumber(latestStartedSession.getLiveStatus()) != SESSION_STATUS_LIVING) {
- return null;
+ if (defaultNumber(latestStartedSession.getLiveStatus()) == SESSION_STATUS_LIVING) {
+ if (defaultNumber(latestStartedSession.getDurationSeconds()) > 0) {
+ LocalDateTime endedAt = resolveEndedAt(latestStartedSession);
+ if (endedAt != null && !endedAt.isAfter(now)) {
+ return null;
+ }
+ }
+ return latestStartedSession;
}
- return latestStartedSession;
+ if (defaultNumber(latestStartedSession.getLiveStatus()) == SESSION_STATUS_NOT_STARTED) {
+ if (defaultNumber(latestStartedSession.getDurationSeconds()) <= 0) {
+ return latestStartedSession;
+ }
+ LocalDateTime endedAt = resolveEndedAt(latestStartedSession);
+ // APP 展示态按计划时间实时计算,避免低频定时任务导致到点后仍显示未开始。
+ if (endedAt == null || endedAt.isAfter(now)) {
+ return latestStartedSession;
+ }
+ }
+ return null;
}
/**
* 解析最近一场已结束场次,优先使用时间线上的最新已开始场次。
*/
- private LiveSession resolveLatestEndedSession(List<LiveSession> sessions, LiveSession latestStartedSession) {
- if (latestStartedSession != null && defaultNumber(latestStartedSession.getLiveStatus()) == SESSION_STATUS_ENDED) {
+ private LiveSession resolveLatestEndedSession(List<LiveSession> sessions,
+ LiveSession latestStartedSession,
+ LocalDateTime now) {
+ if (isEndedForDisplay(latestStartedSession, now)) {
return latestStartedSession;
}
LiveSession result = null;
for (LiveSession session : sessions) {
- if (defaultNumber(session.getLiveStatus()) != SESSION_STATUS_ENDED) {
+ if (!isEndedForDisplay(session, now)) {
continue;
}
if (result == null || compareEndedSession(result, session) < 0) {
@@ -236,6 +257,27 @@
}
/**
+ * 判断场次在 APP 当前展示口径下是否已经结束。
+ */
+ private boolean isEndedForDisplay(LiveSession session, LocalDateTime now) {
+ if (session == null) {
+ return false;
+ }
+ if (defaultNumber(session.getLiveStatus()) == SESSION_STATUS_ENDED) {
+ return true;
+ }
+ int status = defaultNumber(session.getLiveStatus());
+ if (status != SESSION_STATUS_NOT_STARTED && status != SESSION_STATUS_LIVING) {
+ return false;
+ }
+ if (defaultNumber(session.getDurationSeconds()) <= 0) {
+ return false;
+ }
+ LocalDateTime endedAt = resolveEndedAt(session);
+ return session.getStartTime() != null && endedAt != null && !endedAt.isAfter(now);
+ }
+
+ /**
* 选择下一场待开播的场次。
*/
private LiveSession findNextSession(List<LiveSession> sessions, LocalDateTime now) {
--
Gitblit v1.7.1