forked from hangshuo652/aurak
fix: 题库生成功能全面修复 - create方法templateId传参、异常改为BadRequest、前端错误消息透传
This commit is contained in:
@@ -2,6 +2,7 @@ import {
|
|||||||
Injectable,
|
Injectable,
|
||||||
NotFoundException,
|
NotFoundException,
|
||||||
ForbiddenException,
|
ForbiddenException,
|
||||||
|
BadRequestException,
|
||||||
Logger,
|
Logger,
|
||||||
} from '@nestjs/common';
|
} from '@nestjs/common';
|
||||||
import { InjectRepository } from '@nestjs/typeorm';
|
import { InjectRepository } from '@nestjs/typeorm';
|
||||||
@@ -87,15 +88,20 @@ export class QuestionBankService {
|
|||||||
tenantId: string | null,
|
tenantId: string | null,
|
||||||
): Promise<QuestionBank> {
|
): Promise<QuestionBank> {
|
||||||
if (!createDto.name || !createDto.name.trim()) {
|
if (!createDto.name || !createDto.name.trim()) {
|
||||||
throw new Error('Question bank name is required');
|
throw new BadRequestException('Question bank name is required');
|
||||||
}
|
}
|
||||||
const bank = this.bankRepository.create({
|
const bankData: any = {
|
||||||
...createDto,
|
name: createDto.name,
|
||||||
|
description: createDto.description || '',
|
||||||
createdBy: userId,
|
createdBy: userId,
|
||||||
tenantId: tenantId || null,
|
tenantId: tenantId || null,
|
||||||
status: QuestionBankStatus.DRAFT,
|
status: QuestionBankStatus.DRAFT,
|
||||||
});
|
};
|
||||||
return this.bankRepository.save(bank);
|
if (createDto.templateId) {
|
||||||
|
bankData.template = { id: createDto.templateId };
|
||||||
|
}
|
||||||
|
const bank = this.bankRepository.create(bankData as any);
|
||||||
|
return this.bankRepository.save(bank as unknown as QuestionBank);
|
||||||
}
|
}
|
||||||
|
|
||||||
async findAll(
|
async findAll(
|
||||||
@@ -211,7 +217,7 @@ export class QuestionBankService {
|
|||||||
createDto: CreateQuestionBankItemDto,
|
createDto: CreateQuestionBankItemDto,
|
||||||
): Promise<QuestionBankItem> {
|
): Promise<QuestionBankItem> {
|
||||||
if (!createDto.questionText || !createDto.questionText.trim()) {
|
if (!createDto.questionText || !createDto.questionText.trim()) {
|
||||||
throw new Error('Question text is required');
|
throw new BadRequestException('Question text is required');
|
||||||
}
|
}
|
||||||
await this.findOne(bankId);
|
await this.findOne(bankId);
|
||||||
const item = this.itemRepository.create({
|
const item = this.itemRepository.create({
|
||||||
@@ -261,11 +267,11 @@ export class QuestionBankService {
|
|||||||
const bank = await this.findOne(bankId);
|
const bank = await this.findOne(bankId);
|
||||||
|
|
||||||
if (count <= 0 || count > 50) {
|
if (count <= 0 || count > 50) {
|
||||||
throw new Error('生成数量必须在 1-50 之间');
|
throw new BadRequestException('生成数量必须在 1-50 之间');
|
||||||
}
|
}
|
||||||
|
|
||||||
if (!knowledgeBaseContent || knowledgeBaseContent.trim().length < 10) {
|
if (!knowledgeBaseContent || knowledgeBaseContent.trim().length < 10) {
|
||||||
throw new Error('知识库内容太短,无法生成有效题目');
|
throw new BadRequestException('知识库内容太短,无法生成有效题目');
|
||||||
}
|
}
|
||||||
|
|
||||||
this.logger.log(`[generateQuestions] Starting AI generation for bank ${bankId}, count: ${count}`);
|
this.logger.log(`[generateQuestions] Starting AI generation for bank ${bankId}, count: ${count}`);
|
||||||
@@ -316,7 +322,7 @@ export class QuestionBankService {
|
|||||||
let parsedQuestions = safeParseJson<any>(response.content as string);
|
let parsedQuestions = safeParseJson<any>(response.content as string);
|
||||||
if (!parsedQuestions) {
|
if (!parsedQuestions) {
|
||||||
this.logger.error('[generateQuestions] Failed to parse JSON from AI response');
|
this.logger.error('[generateQuestions] Failed to parse JSON from AI response');
|
||||||
throw new Error('Invalid JSON format from AI');
|
throw new BadRequestException('Invalid JSON format from AI');
|
||||||
}
|
}
|
||||||
|
|
||||||
if (!Array.isArray(parsedQuestions)) {
|
if (!Array.isArray(parsedQuestions)) {
|
||||||
|
|||||||
@@ -146,7 +146,12 @@ export const questionBankService = {
|
|||||||
headers: { 'Content-Type': 'application/json' },
|
headers: { 'Content-Type': 'application/json' },
|
||||||
body: JSON.stringify({ count, knowledgeBaseContent }),
|
body: JSON.stringify({ count, knowledgeBaseContent }),
|
||||||
});
|
});
|
||||||
if (!response.ok) throw new Error('Failed to generate questions');
|
if (!response.ok) {
|
||||||
|
const errBody = await response.text().catch(() => '');
|
||||||
|
let msg = 'Failed to generate questions';
|
||||||
|
try { const parsed = JSON.parse(errBody); if (parsed.message) msg = parsed.message; } catch {}
|
||||||
|
throw new Error(msg);
|
||||||
|
}
|
||||||
return await response.json();
|
return await response.json();
|
||||||
},
|
},
|
||||||
|
|
||||||
|
|||||||
Reference in New Issue
Block a user