From 4b1bea687e1e121c94fb7d894daf6171c877430c Mon Sep 17 00:00:00 2001
From: “mitao” <“2763622819@qq.com”>
Date: 星期五, 17 四月 2026 09:36:44 +0800
Subject: [PATCH] feat:养生直播修改

---
 tcm-training-admin-backend/src/main/java/com/tcm/training/admin/app/live/service/AppLiveCourseService.java |   32 +++++++++++++++-----------------
 traditionalApp/pages/watchLive/watchLive.vue                                                               |   18 ++++--------------
 2 files changed, 19 insertions(+), 31 deletions(-)

diff --git a/tcm-training-admin-backend/src/main/java/com/tcm/training/admin/app/live/service/AppLiveCourseService.java b/tcm-training-admin-backend/src/main/java/com/tcm/training/admin/app/live/service/AppLiveCourseService.java
index ba22245..9e219a0 100644
--- a/tcm-training-admin-backend/src/main/java/com/tcm/training/admin/app/live/service/AppLiveCourseService.java
+++ b/tcm-training-admin-backend/src/main/java/com/tcm/training/admin/app/live/service/AppLiveCourseService.java
@@ -228,7 +228,8 @@
         }
 
         boolean pointsAwarded = false;
-        if (allCorrect && watchSummary.isWatchCompleted()) {
+        // 当前业务改为只要三题全部答对就立即发放积分,不再依赖完整观看直播。
+        if (allCorrect) {
             pointsAwarded = awardQuizPoints(course, session, userId, insertedRecords, questions);
         }
 
@@ -238,7 +239,7 @@
         resultVO.setWatchCompleted(Boolean.valueOf(watchSummary.isWatchCompleted()));
         resultVO.setPointsAwarded(Boolean.valueOf(pointsAwarded));
         resultVO.setPointsReward(Integer.valueOf(defaultNumber(course.getQuizPoints())));
-        resultVO.setMessage(resolveQuizSubmitMessage(allCorrect, watchSummary.isWatchCompleted(), pointsAwarded));
+        resultVO.setMessage(resolveQuizSubmitMessage(allCorrect, pointsAwarded));
         return resultVO;
     }
 
@@ -250,7 +251,7 @@
                                                               Long sessionId,
                                                               AppLiveWatchRecordUploadRequest request) {
         Long userId = appAuthSessionService.requireLoginUserId();
-        LiveCourse course = requireCourse(courseId);
+        requireCourse(courseId);
         LiveSession session = requireCourseSession(courseId, sessionId);
         validateWatchRecordRequest(request);
 
@@ -268,20 +269,15 @@
         record.setIsEffective(defaultNumber(request.getDurationSeconds()) > 0 ? 1 : 0);
         liveWatchRecordMapper.insert(record);
 
-        List<LiveSessionQuestion> questions = listSessionQuestions(sessionId);
         List<LiveSessionQuizRecord> quizRecords = listUserQuizRecords(sessionId, userId);
-        QuizUserState quizUserState = resolveQuizUserState(questions, quizRecords, watchCompleted);
-        boolean pointsAwarded = quizUserState.isQuizPointsAwarded();
-        if (quizUserState.isQuizAllCorrect() && watchCompleted && !quizUserState.isQuizPointsAwarded()) {
-            pointsAwarded = awardQuizPoints(course, session, userId, quizRecords, questions);
-        }
+        QuizUserState quizUserState = resolveQuizUserState(listSessionQuestions(sessionId), quizRecords, watchCompleted);
 
         AppLiveWatchRecordUploadResultVO resultVO = new AppLiveWatchRecordUploadResultVO();
         resultVO.setCumulativeWatchSeconds(Integer.valueOf(cumulativeWatchSeconds));
         resultVO.setWatchCompleted(Boolean.valueOf(watchCompleted));
         resultVO.setQuizSubmitted(Boolean.valueOf(quizUserState.isQuizSubmitted()));
         resultVO.setQuizAllCorrect(Boolean.valueOf(quizUserState.isQuizAllCorrect()));
-        resultVO.setQuizPointsAwarded(Boolean.valueOf(pointsAwarded));
+        resultVO.setQuizPointsAwarded(Boolean.valueOf(quizUserState.isQuizPointsAwarded()));
         return resultVO;
     }
 
@@ -726,15 +722,12 @@
     /**
      * 构造答题提交后的提示文案。
      */
-    private String resolveQuizSubmitMessage(boolean allCorrect, boolean watchCompleted, boolean pointsAwarded) {
+    private String resolveQuizSubmitMessage(boolean allCorrect, boolean pointsAwarded) {
         if (!allCorrect) {
             return "回答错误,本次不获得积分";
         }
         if (pointsAwarded) {
             return "答题成功,积分已到账";
-        }
-        if (!watchCompleted) {
-            return "已全部答对,完整观看直播后自动发放积分";
         }
         return "答题成功";
     }
@@ -850,9 +843,14 @@
      * 判断当前场次是否已达到答题开放时间。
      */
     private boolean isQuizEnabled(LiveSession session, LocalDateTime quizAvailableAt, LocalDateTime now) {
-        return session != null
-                && quizAvailableAt != null
-                && !quizAvailableAt.isAfter(now);
+        if (session == null || quizAvailableAt == null || quizAvailableAt.isAfter(now)) {
+            return false;
+        }
+        if (appLiveCourseDisplaySupport.defaultNumber(session.getLiveStatus()) == AppLiveCourseDisplaySupport.SESSION_STATUS_LIVING) {
+            return true;
+        }
+        // 直播结束后的五分钟冷却窗口内继续允许用户进入直播间并完成答题。
+        return appLiveCourseDisplaySupport.isInEndedCooldown(session, now, DETAIL_WATCH_KEEP_MINUTES);
     }
 
     /**
diff --git a/traditionalApp/pages/watchLive/watchLive.vue b/traditionalApp/pages/watchLive/watchLive.vue
index 4fa49f5..ca60865 100644
--- a/traditionalApp/pages/watchLive/watchLive.vue
+++ b/traditionalApp/pages/watchLive/watchLive.vue
@@ -101,20 +101,9 @@
 					<view class="result-container">
 						<image class="trophy-img" src="/static/image/home/qualified.png" mode="aspectFit"></image>
 						<view class="result-box">
-							<view class="result-title">答题完成且观看完整直播</view>
+							<view class="result-title">答题成功</view>
 							<view class="result-sub">获得积分</view>
 							<view class="result-score">{{ rewardPointsText }}</view>
-						</view>
-					</view>
-				</template>
-
-				<!-- 已全部答对,等待看满后发分 -->
-				<template v-else-if="answerViewState === 'pending'">
-					<view class="result-container">
-						<image class="trophy-img" src="/static/image/home/qualified.png" mode="aspectFit"></image>
-						<view class="result-box pending-box">
-							<view class="result-title">已全部答对</view>
-							<view class="result-sub">完整观看直播后自动发放{{ rewardPointsText }}积分</view>
 						</view>
 					</view>
 				</template>
@@ -150,7 +139,7 @@
 import { getLiveCourseDetail, getLiveQuizStatus, submitLiveQuiz, uploadLiveWatchRecord } from './service';
 
 type LiveActionStatus = 'RESERVABLE' | 'RESERVED' | 'WATCHABLE' | 'CLOSED'
-type QuizViewState = 'answering' | 'success' | 'pending' | 'wrong' | 'unopened'
+type QuizViewState = 'answering' | 'success' | 'wrong' | 'unopened'
 type QuestionOptionLabel = 'A' | 'B' | 'C'
 type VideoMetadataEvent = {
 	detail?: {
@@ -430,8 +419,9 @@
 		if (quizState.value.quizPointsAwarded) {
 			return 'success'
 		}
+		// 历史数据若出现已全部答对但积分到账标记延迟,界面仍按成功态兜底展示。
 		if (quizState.value.quizAllCorrect) {
-			return 'pending'
+			return 'success'
 		}
 		return 'wrong'
 	}

--
Gitblit v1.7.1