“mitao”
2026-04-17 d699da385dda6257677ee93bef47388c0635f64e
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) {