Update Saqel Platform: 2026-09-08 13:43:36
This commit is contained in:
@@ -192,17 +192,11 @@ class ExamCubit extends Cubit<ExamState> {
|
||||
}).toList();
|
||||
|
||||
try {
|
||||
ExamSubmissionResultModel result;
|
||||
try {
|
||||
result = await _repository.submitExam(
|
||||
s.exam.id,
|
||||
answers: formattedAnswers,
|
||||
timeSpentSeconds: timeSpent,
|
||||
);
|
||||
} catch (_) {
|
||||
// Safe offline evaluation fallback if API token not present
|
||||
result = _evaluateLocally(s.exam, s.selectedAnswers);
|
||||
}
|
||||
final result = await _repository.submitExam(
|
||||
s.exam.id,
|
||||
answers: formattedAnswers,
|
||||
timeSpentSeconds: timeSpent,
|
||||
);
|
||||
|
||||
emit(ExamCompleted(
|
||||
exam: s.exam,
|
||||
@@ -214,59 +208,4 @@ class ExamCubit extends Cubit<ExamState> {
|
||||
}
|
||||
}
|
||||
|
||||
ExamSubmissionResultModel _evaluateLocally(ExamModel exam, Map<int, int> selectedAnswers) {
|
||||
int earnedScore = 0;
|
||||
int totalScore = 0;
|
||||
List<String> weakTopics = [];
|
||||
List<DetailedAnswerModel> detailedAnswers = [];
|
||||
|
||||
for (var q in exam.questions) {
|
||||
totalScore += q.points;
|
||||
final selectedOptId = selectedAnswers[q.id];
|
||||
QuestionOptionModel? correctOption;
|
||||
try {
|
||||
correctOption = q.options.firstWhere((opt) => opt.isCorrect);
|
||||
} catch (_) {
|
||||
correctOption = q.options.isNotEmpty ? q.options.first : null;
|
||||
}
|
||||
|
||||
final isCorrect = selectedOptId != null && correctOption != null && selectedOptId == correctOption.id;
|
||||
final points = isCorrect ? q.points : 0;
|
||||
earnedScore += points;
|
||||
|
||||
if (!isCorrect) {
|
||||
if (!weakTopics.contains(q.topicTag)) {
|
||||
weakTopics.add(q.topicTag);
|
||||
}
|
||||
}
|
||||
|
||||
detailedAnswers.add(DetailedAnswerModel(
|
||||
questionId: q.id,
|
||||
selectedOptionId: selectedOptId ?? 0,
|
||||
isCorrect: isCorrect,
|
||||
pointsAwarded: points,
|
||||
explanation: q.explanationText ?? 'راجع نص القاعدة في كتاب الوزارة',
|
||||
aiHint: q.aiHint,
|
||||
));
|
||||
}
|
||||
|
||||
final pct = totalScore > 0 ? (earnedScore / totalScore) * 100 : 0.0;
|
||||
final passed = pct >= exam.passingPercentage;
|
||||
final report = passed
|
||||
? 'أداء ممتاز! حققت نسبة إتقان ${pct.toStringAsFixed(1)}%. لديك استيعاب عميق للمفاهيم الأساسية.'
|
||||
: 'تم رصد تعثر في مفاهيم: ${weakTopics.join('، ')}. ننصح بمشاهدة مقاطع الشرح المركزة لمعالجة الثغرات.';
|
||||
|
||||
return ExamSubmissionResultModel(
|
||||
attemptId: DateTime.now().millisecondsSinceEpoch ~/ 1000,
|
||||
score: earnedScore,
|
||||
totalScore: totalScore,
|
||||
percentage: pct,
|
||||
passed: passed,
|
||||
rewindSeconds: passed ? 0 : 45,
|
||||
aiDiagnosticReport: report,
|
||||
weakTopics: weakTopics,
|
||||
tawjihiReadinessScore: (pct * 0.7) + (passed ? 25.0 : 10.0),
|
||||
detailedAnswers: detailedAnswers,
|
||||
);
|
||||
}
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user