fix(learning): finalize report and generated contracts

This commit is contained in:
2026-08-03 09:51:30 +08:00
parent 6bdfee6807
commit c54e223ca1
5 changed files with 200 additions and 47 deletions

View File

@@ -46,6 +46,6 @@ for (const [route, pathItem] of Object.entries(document.paths || {})) {
operations.sort((a, b) => a.path.localeCompare(b.path) || a.method.localeCompare(b.method));
const schemas = document.components?.schemas || {};
const source = `/* eslint-disable */\n// 由 scripts/generate-platform-operations.mjs 根据后端 OpenAPI 自动生成,请勿手改。\nimport type { PlatformOperation } from './types';\n\nexport const generatedAt = ${JSON.stringify(new Date().toISOString())};\nexport const platformOperations = ${JSON.stringify(operations, null, 2)} as const satisfies readonly PlatformOperation[];\nexport const openApiSchemas = ${JSON.stringify(schemas, null, 2)} as const;\n`;
const source = `/* eslint-disable */\n// 由 scripts/generate-platform-operations.mjs 根据后端 OpenAPI 自动生成,请勿手改。\nimport type { PlatformOperation } from './types';\n\nexport const platformOperations = ${JSON.stringify(operations, null, 2)} as const satisfies readonly PlatformOperation[];\nexport const openApiSchemas = ${JSON.stringify(schemas, null, 2)} as const;\n`;
writeFileSync(path.join(apiDir, 'platform-operations.generated.ts'), source);
console.log(`已生成 ${operations.length} 个平台接口契约,来源:${openApiUrl}`);

View File

@@ -2,7 +2,6 @@
// 由 scripts/generate-platform-operations.mjs 根据后端 OpenAPI 自动生成,请勿手改。
import type { PlatformOperation } from './types';
export const generatedAt = "2026-08-01T08:13:39.099Z";
export const platformOperations = [
{
"id": "GET /api/backoffice/platform/bootstrap",
@@ -3137,10 +3136,13 @@ export const openApiSchemas = {
"id",
"sessionQuestionId",
"practiceSessionId",
"selectedOptions",
"selectedOptionIndices",
"answerText",
"isCorrect",
"answeredAt"
"status",
"revision",
"clientSequence",
"sessionVersion",
"acceptedAt"
],
"type": "object",
"properties": {
@@ -3156,7 +3158,7 @@ export const openApiSchemas = {
"type": "string",
"format": "uuid"
},
"selectedOptions": {
"selectedOptionIndices": {
"$ref": "#/components/schemas/JsonElement"
},
"answerText": {
@@ -3165,13 +3167,34 @@ export const openApiSchemas = {
"string"
]
},
"isCorrect": {
"type": [
"null",
"boolean"
]
"status": {
"type": "string"
},
"answeredAt": {
"revision": {
"pattern": "^-?(?:0|[1-9]\\d*)$",
"type": [
"integer",
"string"
],
"format": "int32"
},
"clientSequence": {
"pattern": "^-?(?:0|[1-9]\\d*)$",
"type": [
"integer",
"string"
],
"format": "int64"
},
"sessionVersion": {
"pattern": "^-?(?:0|[1-9]\\d*)$",
"type": [
"integer",
"string"
],
"format": "int64"
},
"acceptedAt": {
"type": "string",
"format": "date-time"
}
@@ -19690,6 +19713,9 @@ export const openApiSchemas = {
"PracticeMode": {
"type": "integer"
},
"PracticeReportStatus": {
"type": "integer"
},
"PracticeSessionDetailItem": {
"required": [
"session",
@@ -19736,7 +19762,9 @@ export const openApiSchemas = {
"finishedAt",
"expiresAt",
"metadata",
"status"
"status",
"version",
"lastClientSequence"
],
"type": "object",
"properties": {
@@ -19857,7 +19885,23 @@ export const openApiSchemas = {
"$ref": "#/components/schemas/JsonElement"
},
"status": {
"type": "string"
"$ref": "#/components/schemas/PracticeSessionStatus"
},
"version": {
"pattern": "^-?(?:0|[1-9]\\d*)$",
"type": [
"integer",
"string"
],
"format": "int64"
},
"lastClientSequence": {
"pattern": "^-?(?:0|[1-9]\\d*)$",
"type": [
"integer",
"string"
],
"format": "int64"
}
}
},
@@ -19873,8 +19917,7 @@ export const openApiSchemas = {
"tags",
"versionId",
"content",
"options",
"explanation"
"options"
],
"type": "object",
"properties": {
@@ -19929,12 +19972,6 @@ export const openApiSchemas = {
},
"options": {
"$ref": "#/components/schemas/JsonElement"
},
"explanation": {
"type": [
"null",
"string"
]
}
}
},
@@ -19956,6 +19993,11 @@ export const openApiSchemas = {
"durationSeconds",
"startedAt",
"submittedAt",
"status",
"version",
"isFinal",
"pendingReviewCount",
"scoringVersion",
"sectionStats",
"questionResults",
"wrongQuestionIds",
@@ -20071,6 +20113,36 @@ export const openApiSchemas = {
"type": "string",
"format": "date-time"
},
"status": {
"$ref": "#/components/schemas/PracticeReportStatus"
},
"version": {
"pattern": "^-?(?:0|[1-9]\\d*)$",
"type": [
"integer",
"string"
],
"format": "int32"
},
"isFinal": {
"type": "boolean"
},
"pendingReviewCount": {
"pattern": "^-?(?:0|[1-9]\\d*)$",
"type": [
"integer",
"string"
],
"format": "int32"
},
"scoringVersion": {
"pattern": "^-?(?:0|[1-9]\\d*)$",
"type": [
"integer",
"string"
],
"format": "int32"
},
"sectionStats": {
"$ref": "#/components/schemas/JsonElement"
},
@@ -20085,6 +20157,9 @@ export const openApiSchemas = {
}
}
},
"PracticeSessionStatus": {
"type": "integer"
},
"PreviewReconciliationImportDto": {
"required": [
"provider",
@@ -24332,7 +24407,10 @@ export const openApiSchemas = {
},
"SubmitAnswerDto": {
"required": [
"sessionQuestionId"
"sessionQuestionId",
"expectedSessionVersion",
"clientSequence",
"idempotencyKey"
],
"type": "object",
"properties": {
@@ -24341,15 +24419,48 @@ export const openApiSchemas = {
"description": "会话题目 ID。",
"format": "uuid"
},
"selectedOptions": {
"expectedSessionVersion": {
"maximum": 9223372036854776000,
"minimum": 1,
"pattern": "^-?(?:0|[1-9]\\d*)$",
"type": [
"integer",
"string"
],
"description": "客户端读取会话时获得的版本。",
"format": "int64"
},
"clientSequence": {
"maximum": 9223372036854776000,
"minimum": 1,
"pattern": "^-?(?:0|[1-9]\\d*)$",
"type": [
"integer",
"string"
],
"description": "客户端在本会话内单调递增的序列。",
"format": "int64"
},
"idempotencyKey": {
"maxLength": 200,
"minLength": 1,
"type": "string",
"description": "网络重试幂等键。"
},
"selectedOptionIndices": {
"type": [
"null",
"array"
],
"items": {
"type": "string"
"pattern": "^-?(?:0|[1-9]\\d*)$",
"type": [
"integer",
"string"
],
"format": "int32"
},
"description": "已选选项。"
"description": "已选选项的零基索引。"
},
"answerText": {
"maxLength": 10000,
@@ -24359,13 +24470,6 @@ export const openApiSchemas = {
"string"
],
"description": "文字答案。"
},
"selfJudgedCorrect": {
"type": [
"null",
"boolean"
],
"description": "主观题自评是否正确。"
}
},
"description": "提交答案请求 DTO。"
@@ -24448,7 +24552,9 @@ export const openApiSchemas = {
},
"SubmitPracticeSessionDto": {
"required": [
"practiceSessionId"
"practiceSessionId",
"expectedSessionVersion",
"idempotencyKey"
],
"type": "object",
"properties": {
@@ -24456,6 +24562,21 @@ export const openApiSchemas = {
"type": "string",
"description": "练习会话 ID。",
"format": "uuid"
},
"expectedSessionVersion": {
"maximum": 9223372036854776000,
"minimum": 1,
"pattern": "^-?(?:0|[1-9]\\d*)$",
"type": [
"integer",
"string"
],
"format": "int64"
},
"idempotencyKey": {
"maxLength": 200,
"minLength": 1,
"type": "string"
}
},
"description": "提交练习会话请求 DTO。"

View File

@@ -19623,11 +19623,17 @@ export interface components {
sessionQuestionId: string;
/** Format: uuid */
practiceSessionId: string;
selectedOptions: components["schemas"]["JsonElement"];
selectedOptionIndices: components["schemas"]["JsonElement"];
answerText: null | string;
isCorrect: null | boolean;
status: string;
/** Format: int32 */
revision: number | string;
/** Format: int64 */
clientSequence: number | string;
/** Format: int64 */
sessionVersion: number | string;
/** Format: date-time */
answeredAt: string;
acceptedAt: string;
};
AppAssetCatalogItem: {
/** Format: uuid */
@@ -24291,6 +24297,7 @@ export interface components {
accuracy: null | number | string;
};
PracticeMode: number;
PracticeReportStatus: number;
PracticeSessionDetailItem: {
session: components["schemas"]["PracticeSessionItem"];
questions: components["schemas"]["PracticeSessionQuestionItem"][];
@@ -24332,7 +24339,11 @@ export interface components {
/** Format: date-time */
expiresAt: null | string;
metadata: components["schemas"]["JsonElement"];
status: string;
status: components["schemas"]["PracticeSessionStatus"];
/** Format: int64 */
version: number | string;
/** Format: int64 */
lastClientSequence: number | string;
};
PracticeSessionQuestionItem: {
/** Format: uuid */
@@ -24351,7 +24362,6 @@ export interface components {
versionId: null | string;
content: null | string;
options: components["schemas"]["JsonElement"];
explanation: null | string;
};
PracticeSessionReportItem: {
/** Format: uuid */
@@ -24385,11 +24395,20 @@ export interface components {
startedAt: null | string;
/** Format: date-time */
submittedAt: string;
status: components["schemas"]["PracticeReportStatus"];
/** Format: int32 */
version: number | string;
isFinal: boolean;
/** Format: int32 */
pendingReviewCount: number | string;
/** Format: int32 */
scoringVersion: number | string;
sectionStats: components["schemas"]["JsonElement"];
questionResults: components["schemas"]["JsonElement"];
wrongQuestionIds: components["schemas"]["JsonElement"];
metadata: components["schemas"]["JsonElement"];
};
PracticeSessionStatus: number;
/** @description 预览对账导入请求 DTO。 */
PreviewReconciliationImportDto: {
/** @description 服务提供方。 */
@@ -25534,12 +25553,22 @@ export interface components {
* @description 会话题目 ID。
*/
sessionQuestionId: string;
/** @description 已选选项。 */
selectedOptions?: null | string[];
/**
* Format: int64
* @description 客户端读取会话时获得的版本。
*/
expectedSessionVersion: number | string;
/**
* Format: int64
* @description 客户端在本会话内单调递增的序列。
*/
clientSequence: number | string;
/** @description 网络重试幂等键。 */
idempotencyKey: string;
/** @description 已选选项的零基索引。 */
selectedOptionIndices?: null | (number | string)[];
/** @description 文字答案。 */
answerText?: null | string;
/** @description 主观题自评是否正确。 */
selfJudgedCorrect?: null | boolean;
};
/** @description 提交反馈请求 DTO。 */
SubmitFeedbackDto: {
@@ -25572,6 +25601,9 @@ export interface components {
* @description 练习会话 ID。
*/
practiceSessionId: string;
/** Format: int64 */
expectedSessionVersion: number | string;
idempotencyKey: string;
};
SvipPlanCatalogItem: {
/** Format: uuid */