完成报告
交付
GET /learning/continue — 首页继续学习:
@Get("learning/continue")
async continueLearning(req) {
// 查询最新阅读进度的资料
…
完成报告
交付
ReadingController.getProgress() — 资料阅读进度查询:
GET /materials/:id/reading-progress?readingTargetType=knowledge_source
Authorization: Bearer…
实现提醒(来自 Batch C 审查 F2)
DailyLearningActivity.materialsReadCount 同日重复打开同一资料会重复计数。需去重:同一 (userId, materialId) 当日首次…
完成报告
交付
ProcessorService 事务新增 Step 5d — LearningRecord 写入:
// 仅在以下事件写入记录:
// material_opened → "Reading…
完成报告
交付
1. LearningActivityRepository.upsertFromReadingEvent(tx, data) — 时区感知的每日聚合:
// computeActivityDate: clientTimestampMs +…
完成报告
交付
1. MaterialReadingProgressService.upsertFromReadingEvent(tx, data) — 事务内聚合方法:
// MaterialOpened → 创建或更新,sessionCoun…
完成报告
交付
1. LearningSessionRepository.upsertFromReadingEvent(tx, data) — 聚合核心方法:
// MaterialOpened → 新建 session (mode=reading,…
实现提醒(来自 Batch B 审查 F6)
ReadingEventProcessorService.processOne() 中 insertReadingEvent 和 aggregateEvent 不在同一事务中。
如果聚合失败,事件已写…
完成报告
交付
reading-event-processor.service.ts — 独立 ProcessorService,6 步处理管线:
class ReadingEventProcessorService {
processBatch(userId,…
完成报告
交付
reading-event.service.ts — processBatch() 完整 7 步校验管线:
1. Required fields — eventId / clientSessionId / materialId 缺失 → failed **2.…
完成报告
交付
1. Controller — reading-event.controller.ts:
POST /learning/reading-events/batch
@UseGuards(JwtAuthGuard)
async uploadBatch(req, body:…
实现提醒(来自 Batch A 审查 F3)
LearningRecordService.findByUser() 当前不返回分页总数(total count),实现学习历史记录接口时需补齐。
代码位置:`src…