Просмотр исходного кода

直播积分倒计时功能,重新计算完课比例

yuhongqi 2 недель назад
Родитель
Сommit
84d7126105

+ 14 - 9
fs-user-app/src/main/java/com/fs/app/controller/live/LiveCompletionPointsController.java

@@ -210,23 +210,28 @@ public class LiveCompletionPointsController extends AppBaseController {
                     ? record.getWatchDuration() : 0L;
 
             vo.setVideoDuration(videoDuration);
-            // 按照观看时长 / 视频总时长计算完课比例
+            vo.setWatchDuration(watchDuration);
+            
+            // 如果配置了看课时长,使用看课时长作为目标;否则使用视频总时长
+            Long targetDuration = requiredWatchDuration != null ? requiredWatchDuration : videoDuration;
+            vo.setRemainingTime(Math.max(0, targetDuration - watchDuration));
+            
+            // 使用RemainingTime和videoDuration计算完课比例
+            // 先计算基于videoDuration的剩余时长
             if (videoDuration != null && videoDuration > 0) {
-                BigDecimal completionRate = BigDecimal.valueOf(watchDuration)
+                Long remainingTimeForVideo = Math.max(0, videoDuration - watchDuration); // 基于视频总时长的剩余时长
+                Long watchedTime = videoDuration - remainingTimeForVideo; // 已观看时长 = 视频总时长 - 剩余时长
+                BigDecimal completionRate = BigDecimal.valueOf(watchedTime)
                         .multiply(BigDecimal.valueOf(100))
                         .divide(BigDecimal.valueOf(videoDuration), 2, java.math.RoundingMode.HALF_UP);
                 if (completionRate.compareTo(BigDecimal.valueOf(100)) > 0) {
                     completionRate = BigDecimal.valueOf(100);
                 }
+                if (completionRate.compareTo(BigDecimal.ZERO) < 0) {
+                    completionRate = BigDecimal.ZERO;
+                }
                 vo.setCompletionRate(completionRate);
-            } else {
-                vo.setCompletionRate(BigDecimal.ZERO);
             }
-            vo.setWatchDuration(watchDuration);
-            
-            // 如果配置了看课时长,使用看课时长作为目标;否则使用视频总时长
-            Long targetDuration = requiredWatchDuration != null ? requiredWatchDuration : videoDuration;
-            vo.setRemainingTime(Math.max(0, targetDuration - watchDuration));
             vo.setHasReceived(record != null && record.getReceiveStatus() != null && record.getReceiveStatus() == 1);
 
             return R.ok().put("data", vo);