From d699da385dda6257677ee93bef47388c0635f64e Mon Sep 17 00:00:00 2001
From: “mitao” <“2763622819@qq.com”>
Date: 星期五, 17 四月 2026 08:57:41 +0800
Subject: [PATCH] feat:APP个人中心

---
 tcm-training-admin-backend/src/main/java/com/tcm/training/admin/live/service/LiveSessionAppService.java |   43 +++++++++++++++++++++++++++++++++++--------
 1 files changed, 35 insertions(+), 8 deletions(-)

diff --git a/tcm-training-admin-backend/src/main/java/com/tcm/training/admin/live/service/LiveSessionAppService.java b/tcm-training-admin-backend/src/main/java/com/tcm/training/admin/live/service/LiveSessionAppService.java
index 01f3633..ad28295 100644
--- a/tcm-training-admin-backend/src/main/java/com/tcm/training/admin/live/service/LiveSessionAppService.java
+++ b/tcm-training-admin-backend/src/main/java/com/tcm/training/admin/live/service/LiveSessionAppService.java
@@ -238,19 +238,22 @@
     }
 
     /**
+     * 定时任务将已到结束时间的直播中场次切换为已结束。
+     */
+    @Transactional
+    public LiveSessionStatusVO autoEnd(Long sessionId, LocalDateTime actualEndTime) {
+        LiveSession session = liveSessionMapper.selectById(sessionId);
+        LocalDateTime resolvedEndTime = actualEndTime == null ? LocalDateTime.now() : actualEndTime;
+        return markSessionEnded(session, resolvedEndTime, false);
+    }
+
+    /**
      * 手动结束正在直播中的场次。
      */
     @Transactional
     public LiveSessionStatusVO end(Long courseId, Long sessionId) {
         LiveSession s = requireSession(courseId, sessionId);
-        if (s.getLiveStatus() == null || s.getLiveStatus() != 1) {
-            throw new IllegalArgumentException("场次状态不允许结束");
-        }
-        s.setLiveStatus(2);
-        s.setActualEndTime(LocalDateTime.now());
-        liveSessionMapper.updateById(s);
-        reconcileCourseLivingSessions(s.getLiveCourseId(), s.getActualEndTime());
-        return new LiveSessionStatusVO(s.getId(), s.getLiveStatus(), null, s.getActualEndTime());
+        return markSessionEnded(s, LocalDateTime.now(), true);
     }
 
     /**
@@ -342,6 +345,30 @@
     }
 
     /**
+     * 执行直播中场次到已结束的公共状态迁移。
+     */
+    private LiveSessionStatusVO markSessionEnded(LiveSession session, LocalDateTime actualEndTime, boolean failWhenInvalid) {
+        if (session == null) {
+            if (failWhenInvalid) {
+                throw new IllegalArgumentException("场次不存在");
+            }
+            return null;
+        }
+        if (session.getLiveStatus() == null || session.getLiveStatus().intValue() != 1) {
+            if (failWhenInvalid) {
+                throw new IllegalArgumentException("场次状态不允许结束");
+            }
+            return null;
+        }
+        LocalDateTime resolvedEndTime = actualEndTime == null ? LocalDateTime.now() : actualEndTime;
+        session.setLiveStatus(2);
+        session.setActualEndTime(resolvedEndTime);
+        liveSessionMapper.updateById(session);
+        reconcileCourseLivingSessions(session.getLiveCourseId(), resolvedEndTime);
+        return new LiveSessionStatusVO(session.getId(), session.getLiveStatus(), session.getActualStartTime(), session.getActualEndTime());
+    }
+
+    /**
      * 校验课程存在性。
      */
     private LiveCourse requireCourse(Long courseId) {

--
Gitblit v1.7.1