import 'package:freezed_annotation/freezed_annotation.dart'; import 'vocabulary_book_model.dart'; part 'study_plan_model.freezed.dart'; part 'study_plan_model.g.dart'; /// 学习计划模型 @freezed class StudyPlan with _$StudyPlan { const factory StudyPlan({ required String id, required String name, String? description, required String userId, required StudyPlanType type, required StudyPlanStatus status, required DateTime startDate, required DateTime endDate, required int dailyTarget, @Default([]) List vocabularyBookIds, @Default([]) List vocabularyBooks, @Default(0) int totalWords, @Default(0) int completedWords, @Default(0) int currentStreak, @Default(0) int maxStreak, @Default([]) List milestones, @Default({}) Map dailyProgress, required DateTime createdAt, required DateTime updatedAt, }) = _StudyPlan; factory StudyPlan.fromJson(Map json) => _$StudyPlanFromJson(json); } /// 学习计划类型 enum StudyPlanType { @JsonValue('daily') daily, @JsonValue('weekly') weekly, @JsonValue('monthly') monthly, @JsonValue('custom') custom, @JsonValue('exam_prep') examPrep, } /// 学习计划状态 enum StudyPlanStatus { @JsonValue('active') active, @JsonValue('paused') paused, @JsonValue('completed') completed, @JsonValue('cancelled') cancelled, } /// 学习计划里程碑 @freezed class StudyPlanMilestone with _$StudyPlanMilestone { const factory StudyPlanMilestone({ required String id, required String title, String? description, required int targetWords, required DateTime targetDate, @Default(false) bool isCompleted, DateTime? completedAt, @Default(0) int currentProgress, }) = _StudyPlanMilestone; factory StudyPlanMilestone.fromJson(Map json) => _$StudyPlanMilestoneFromJson(json); } /// 学习计划统计 @freezed class StudyPlanStats with _$StudyPlanStats { const factory StudyPlanStats({ required String planId, @Default(0) int totalDays, @Default(0) int studiedDays, @Default(0) int totalWords, @Default(0) int learnedWords, @Default(0) int reviewedWords, @Default(0) int currentStreak, @Default(0) int maxStreak, @Default(0.0) double completionRate, @Default(0.0) double averageDailyWords, @Default(0) int remainingDays, @Default(0) int remainingWords, DateTime? lastStudyDate, @Default([]) List dailyRecords, }) = _StudyPlanStats; factory StudyPlanStats.fromJson(Map json) => _$StudyPlanStatsFromJson(json); } /// 每日学习记录 @freezed class DailyStudyRecord with _$DailyStudyRecord { const factory DailyStudyRecord({ required DateTime date, @Default(0) int wordsLearned, @Default(0) int wordsReviewed, @Default(0) int studyTimeMinutes, @Default(false) bool targetAchieved, @Default([]) List vocabularyBookIds, }) = _DailyStudyRecord; factory DailyStudyRecord.fromJson(Map json) => _$DailyStudyRecordFromJson(json); } /// 学习计划模板 @freezed class StudyPlanTemplate with _$StudyPlanTemplate { const factory StudyPlanTemplate({ required String id, required String name, required String description, required StudyPlanType type, required int durationDays, required int dailyTarget, @Default([]) List recommendedBookIds, @Default([]) List milestones, @Default(0) int difficulty, @Default([]) List tags, @Default(false) bool isPopular, }) = _StudyPlanTemplate; factory StudyPlanTemplate.fromJson(Map json) => _$StudyPlanTemplateFromJson(json); }