新增数学思维自学板块与考试板块(9模块154课+初一上5套真实试卷客观题)

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
This commit is contained in:
jacobxu666
2026-08-06 08:00:46 +08:00
co-authored by Claude Opus 4.8
parent 3473ecbf2b
commit bc53e2b2a5
38 changed files with 3393 additions and 10 deletions
+77
View File
@@ -0,0 +1,77 @@
"use server";
// xuchao: 数学每周检测判分(同英语 takeWeekly,打卡联动数学)
import { revalidatePath } from "next/cache";
import { and, eq, sql } from "drizzle-orm";
import { getSessionUser } from "@/lib/auth";
import { gradeAnswers, type AnswerValue } from "@/lib/grammar";
import { buildMathWeeklyQuestions, currentMathWeekKey, getMathWeeklyRecord } from "@/lib/math-weekly";
import { recordWrong } from "@/lib/wrongbook";
import { db } from "@/db";
import { taskInstances, mathWeeklyTest } from "@/db/schema";
import { todayStr } from "@/lib/dates";
export type MathWeeklyResult =
| { score: number; passed: boolean; correct: number; total: number; detail: boolean[] }
| { error: string };
// 提交数学每周检测:判分、记录、错题入库、达标关联当日数学打卡
export async function takeMathWeekly(answers: AnswerValue[]): Promise<MathWeeklyResult> {
const user = await getSessionUser();
if (!user || user.role !== "child") return { error: "会话无效,请重新激活设备" };
const wk = currentMathWeekKey();
const existing = await getMathWeeklyRecord(user.id, wk);
if (existing) return { error: "本周已完成数学检测,下周再来。" };
const questions = await buildMathWeeklyQuestions(user.id, wk);
if (questions.length === 0) return { error: "暂无可组卷的题目,先学几课吧。" };
const g = gradeAnswers(questions, answers);
questions.forEach((q, i) => {
if (!g.detail[i]) void recordWrong(user.id, "mweekly", wk, `数学周检测 ${wk}`, q, answers[i]);
});
await db
.insert(mathWeeklyTest)
.values({
childUserId: user.id,
weekKey: wk,
score: g.score,
correct: g.correct,
total: g.total,
passed: g.passed,
questions: JSON.stringify(questions),
})
.onDuplicateKeyUpdate({ set: { score: g.score, correct: g.correct, total: g.total, passed: g.passed } });
// 达标关联当日数学打卡
if (g.passed) {
const today = todayStr();
const title = `数学周检测 · ${wk}`;
const [ex] = await db
.select({ id: taskInstances.id, status: taskInstances.status })
.from(taskInstances)
.where(and(eq(taskInstances.childUserId, user.id), eq(taskInstances.date, today), eq(taskInstances.title, title)))
.limit(1);
if (ex) {
if (ex.status !== "done")
await db.update(taskInstances).set({ status: "done", doneAt: sql`CURRENT_TIMESTAMP` }).where(eq(taskInstances.id, ex.id));
} else {
await db.insert(taskInstances).values({
childUserId: user.id,
date: today,
title,
subject: "math",
status: "done",
doneAt: new Date(),
sortOrder: 95,
});
}
}
revalidatePath("/math/weekly");
revalidatePath("/kid");
revalidatePath("/parent");
revalidatePath("/wrongbook");
return g;
}