Преглед изворни кода

feat(backend): add report-reading-time API for cumulative reading tracking

Xiaogang Liao пре 1 месец
родитељ
комит
f021124223

+ 13 - 0
cfc-backend/src/main/java/com/etotem/cfc/controller/content/ArticleController.java

@@ -110,6 +110,19 @@ public class ArticleController {
         return Result.success(readResult);
     }
 
+    @PostMapping("/report-reading-time")
+    public Result<Void> reportReadingTime(@RequestBody Map<String, Object> body,
+                                           @RequestAttribute(value = "userId", required = false) Long userId) {
+        Long articleId = Long.valueOf(body.get("articleId").toString());
+        int durationSeconds = body.get("durationSeconds") != null
+                ? Integer.parseInt(body.get("durationSeconds").toString()) : 0;
+        Long childId = body.get("childId") != null
+                ? Long.valueOf(body.get("childId").toString()) : null;
+
+        articleService.reportReadingTime(articleId, userId, childId, durationSeconds);
+        return Result.success(null);
+    }
+
     @PostMapping("/reading-stats")
     public Result<ReadingStatsDTO> readingStats(@RequestBody Map<String, Object> body) {
         Long childId = body.get("childId") != null

+ 29 - 0
cfc-backend/src/main/java/com/etotem/cfc/service/ArticleService.java

@@ -307,6 +307,35 @@ public class ArticleService {
         return result;
     }
 
+    public void reportReadingTime(Long articleId, Long userId, Long childId, int durationSeconds) {
+        if (childId == null) return;
+
+        // 查找当日已有记录(同文章+同孩子)
+        LambdaQueryWrapper<ArticleReadingRecord> wrapper = new LambdaQueryWrapper<ArticleReadingRecord>()
+                .eq(ArticleReadingRecord::getArticleId, articleId)
+                .eq(ArticleReadingRecord::getChildId, childId)
+                .apply("DATE(read_at) = CURDATE()")
+                .last("LIMIT 1");
+        ArticleReadingRecord existing = articleReadingRecordMapper.selectOne(wrapper);
+
+        if (existing != null) {
+            // 累加时长
+            existing.setDurationSeconds(existing.getDurationSeconds() + durationSeconds);
+            existing.setUpdatedAt(new Date());
+            articleReadingRecordMapper.updateById(existing);
+        } else {
+            // 新建记录
+            ArticleReadingRecord record = new ArticleReadingRecord();
+            record.setArticleId(articleId);
+            record.setUserId(userId);
+            record.setChildId(childId);
+            record.setDurationSeconds(durationSeconds);
+            record.setReadAt(new Date());
+            record.setCreatedAt(new Date());
+            articleReadingRecordMapper.insert(record);
+        }
+    }
+
     public Article getById(Long id) {
         return articleMapper.selectById(id);
     }