API-INFO-006 P0 | 扩展 DailyLearningActivity 字段与 Repository 【status:partial】 #127

Closed
opened 2026-06-07 11:16:04 +08:00 by wangdl · 2 comments
Owner

目标

支持 upsert/increment 操作,按日聚合学习时长。

新增字段

readingSeconds, reviewSeconds, quizSeconds, chatSeconds,
materialsReadCount, markedReadCount

Repository 方法

  • upsertByUserAndDate, incrementDuration/ReadingSeconds/SessionsCount/MaterialsReadCount/MarkedReadCount

时区

  • activityDate 使用 clientTimezoneOffsetMinutes 计算
  • 缺失时默认 UTC

详见设计文档 API-INFO-000。

## 目标 支持 upsert/increment 操作,按日聚合学习时长。 ### 新增字段 ```text readingSeconds, reviewSeconds, quizSeconds, chatSeconds, materialsReadCount, markedReadCount ``` ### Repository 方法 - upsertByUserAndDate, incrementDuration/ReadingSeconds/SessionsCount/MaterialsReadCount/MarkedReadCount ### 时区 - activityDate 使用 clientTimezoneOffsetMinutes 计算 - 缺失时默认 UTC 详见设计文档 API-INFO-000。
wangdl added this to the M8:学习信息收集与基础分析闭环 milestone 2026-06-07 11:16:04 +08:00
wangdl changed title from API-INFO-008A P0 | 扩展 DailyLearningActivity 字段与 Repository to API-INFO-006 P0 | 扩展 DailyLearningActivity 字段与 Repository 2026-06-07 11:22:14 +08:00
wangdl changed title from API-INFO-006 P0 | 扩展 DailyLearningActivity 字段与 Repository to API-INFO-006 P0 | 扩展 DailyLearningActivity 字段与 Repository 【status:partial】 2026-06-07 19:04:11 +08:00
Author
Owner

审查结论:当前 API 项目学习信息收集体系基本为全新建设。可复用:JWT Guard、LearningSession 基础表/CRUD、DailyLearningActivity 基础表、ActivityController 部分接口、LearningRecord schema。其余 ReadingEvent/TemporaryMaterial/Progress/批量上报/Processor/聚合/查询接口/错误码/去重/权限/测试/文档均不存在或仅部分存在。

本 Issue: 仅 findAll。缺 upsert/increment/recalculateActivityLevel。

标签: audit:reviewed audit:api-info status:partial work:extend-existing

## 审查结论:当前 API 项目学习信息收集体系基本为全新建设。可复用:JWT Guard、LearningSession 基础表/CRUD、DailyLearningActivity 基础表、ActivityController 部分接口、LearningRecord schema。其余 ReadingEvent/TemporaryMaterial/Progress/批量上报/Processor/聚合/查询接口/错误码/去重/权限/测试/文档均不存在或仅部分存在。 **本 Issue**: 仅 findAll。缺 upsert/increment/recalculateActivityLevel。 **标签**: audit:reviewed audit:api-info status:partial work:extend-existing
Author
Owner

完成报告

交付

1. Prisma SchemaDailyLearningActivity 新增 3 个 M8 字段:

model DailyLearningActivity {
  // ... 现有字段 (durationSeconds, sessionsCount, activeRecallCount, reviewCount, aiAnalysisCount, completedLoopCount, activityLevel) ...

  // ── M8 新增 ──
  readingSeconds     Int  @default(0)  // 当日阅读时长(秒)
  materialsReadCount Int  @default(0)  // 当日阅读资料数
  markedReadCount    Int  @default(0)  // 当日标记已读数
}

2. Servicelearning-activity.service.ts 新增方法:

async upsertFromReadingEvent(data: {
  userId: string;
  activityDate: Date;        // 使用 clientTimezoneOffsetMinutes 计算
  activeSecondsDelta: number; // 原子 increment
  isNewMaterial?: boolean;    // increment materialsReadCount
  isMarkedRead?: boolean;     // increment markedReadCount
})

时区处理(#130 ProcessorService 实现):

  • activityDate 使用 clientTimezoneOffsetMinutes 计算本地日期
  • 缺失时默认 UTC
## 完成报告 ### 交付 **1. Prisma Schema** — `DailyLearningActivity` 新增 3 个 M8 字段: ```prisma model DailyLearningActivity { // ... 现有字段 (durationSeconds, sessionsCount, activeRecallCount, reviewCount, aiAnalysisCount, completedLoopCount, activityLevel) ... // ── M8 新增 ── readingSeconds Int @default(0) // 当日阅读时长(秒) materialsReadCount Int @default(0) // 当日阅读资料数 markedReadCount Int @default(0) // 当日标记已读数 } ``` **2. Service** — `learning-activity.service.ts` 新增方法: ```typescript async upsertFromReadingEvent(data: { userId: string; activityDate: Date; // 使用 clientTimezoneOffsetMinutes 计算 activeSecondsDelta: number; // 原子 increment isNewMaterial?: boolean; // increment materialsReadCount isMarkedRead?: boolean; // increment markedReadCount }) ``` **时区处理**(#130 ProcessorService 实现): - `activityDate` 使用 `clientTimezoneOffsetMinutes` 计算本地日期 - 缺失时默认 UTC
Sign in to join this conversation.
No Label
1 Participants
Notifications
Due Date
No due date set.
Dependencies

No dependencies set.

Reference: wangdl/api-server#127
No description provided.