feat(lesson-preparation): add AI evaluation, analytics, attachments, calendar, comments, review, substitutes, formative, and version diff

- Add actions-ai-evaluation, actions-analytics, actions-attachments, actions-calendar, actions-comments, actions-formative, actions-questions, actions-review, actions-substitutes

- Add corresponding data-access layers for each new action module

- Add calendar-view, curriculum-map-view, version-diff-viewer components

- Add editor-slice, selection-slice, version-slice hooks for state management

- Add document-diff and scope-check lib utilities

- Add default-question-service and external-questions-bridge services
This commit is contained in:
SpecialX
2026-07-03 10:25:21 +08:00
parent a16f09d3c3
commit 20023e13fd
75 changed files with 5131 additions and 1186 deletions

View File

@@ -7,6 +7,7 @@ import {
} from "@/shared/lib/auth-guard";
import { Permissions } from "@/shared/types/permissions";
import { handleActionError, safeParseDate } from "@/shared/lib/action-utils";
import { getLessonPlanById } from "./data-access";
import { publishLessonPlanHomework, PublishServiceError } from "./publish-service";
import { publishLessonPlanHomeworkSchema } from "./schema";
import { translateFieldErrors } from "./lib/i18n-errors";
@@ -31,8 +32,14 @@ export async function publishLessonPlanHomeworkAction(input: {
Permissions.LESSON_PLAN_PUBLISH,
);
await requirePermission(Permissions.HOMEWORK_CREATE);
// V3 修复:作业标题/描述由 actions 层 i18n 翻译后传入,避免 service 层硬编码中文
const homeworkTitle = t("publish.homeworkTitle", { title: parsed.data.planId });
// P0-6 修复:先查询课案标题,用于作业标题的 i18n 翻译
// (原代码错误地传入 planId 作为 title 参数)
const plan = await getLessonPlanById(parsed.data.planId, ctx.userId);
if (!plan) {
return { success: false, message: t("error.notFound") };
}
const homeworkTitle = t("publish.homeworkTitle", { title: plan.title });
const homeworkDescription = t("publish.homeworkDescription");
const availableAtLabel = t("publish.availableAtLabel");
const dueAtLabel = t("publish.dueAtLabel");