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

fix(stats): add monthActiveDays to /api/stats/child/overview

前端 profile.vue 成长报告调 /api/stats/child/overview 取 monthActiveDays 字段,
后端原未返回该字段,growthReport.monthActiveDays 始终为 0。
改为统计当月有积分变动的天数。

Co-authored-by: Sisyphus <sisyphus@ohmyopencode.dev>
liaoxg 4 месяцев назад
Родитель
Сommit
76fb867c2b

+ 24 - 0
cfc-backend/src/main/java/com/etotem/cfc/controller/ReportStatsController.java

@@ -46,6 +46,30 @@ public class ReportStatsController {
         Child child = childMapper.selectById(childId);
         result.put("totalPoints", child != null ? child.getTotalPoints() : 0);
 
+        // 月活跃天数(当月有积分变动的天数)
+        Calendar monthCal = Calendar.getInstance();
+        monthCal.set(Calendar.DAY_OF_MONTH, 1);
+        monthCal.set(Calendar.HOUR_OF_DAY, 0);
+        monthCal.set(Calendar.MINUTE, 0);
+        monthCal.set(Calendar.SECOND, 0);
+        monthCal.set(Calendar.MILLISECOND, 0);
+        Date monthStart = monthCal.getTime();
+
+        List<PointsLog> monthLogs = pointsLogMapper.selectList(
+                new LambdaQueryWrapper<PointsLog>()
+                        .eq(PointsLog::getChildId, childId)
+                        .ge(PointsLog::getCreatedAt, monthStart)
+                        .orderByAsc(PointsLog::getCreatedAt));
+
+        Set<String> activeDays = new HashSet<>();
+        SimpleDateFormat daySdf = new SimpleDateFormat("yyyy-MM-dd");
+        for (PointsLog log : monthLogs) {
+            if (log.getCreatedAt() != null) {
+                activeDays.add(daySdf.format(log.getCreatedAt()));
+            }
+        }
+        result.put("monthActiveDays", activeDays.size());
+
         // 任务统计
         List<Task> tasks = taskService.getAllTasksByChild(childId);
         long taskTotal = tasks.size();