fix: 代码整合修复 - Entity类型、题库生成、评估流程等14项修复

This commit is contained in:
Developer
2026-05-14 09:55:07 +08:00
parent 122ab5e96f
commit 368eddfd75
17 changed files with 1666 additions and 115 deletions
@@ -196,6 +196,11 @@ export class QuestionBankService {
if (bank.status === QuestionBankStatus.PUBLISHED) {
return bank;
}
if (bank.status !== QuestionBankStatus.PUBLISHED && bank.status !== QuestionBankStatus.REJECTED) {
throw new ForbiddenException(
'Only PUBLISHED or REJECTED status can be re-published',
);
}
bank.status = QuestionBankStatus.PUBLISHED;
this.logger.log(`QuestionBank ${id} published`);
return this.bankRepository.save(bank);
@@ -254,6 +259,15 @@ export class QuestionBankService {
tenantId: string,
): Promise<QuestionBankItem[]> {
const bank = await this.findOne(bankId);
if (count <= 0 || count > 50) {
throw new Error('生成数量必须在 1-50 之间');
}
if (!knowledgeBaseContent || knowledgeBaseContent.trim().length < 10) {
throw new Error('知识库内容太短,无法生成有效题目');
}
this.logger.log(`[generateQuestions] Starting AI generation for bank ${bankId}, count: ${count}`);
const modelConfig = await this.modelConfigService.findDefaultByType(
@@ -338,11 +352,13 @@ export class QuestionBankService {
basis: q.basis,
status: QuestionBankItemStatus.PENDING_REVIEW,
});
items.push(await this.itemRepository.save(item));
items.push(item);
}
this.logger.log(`[generateQuestions] Generated ${items.length} questions for bank ${bankId}`);
return items;
const savedItems = await this.itemRepository.save(items);
this.logger.log(`[generateQuestions] Generated ${savedItems.length} questions for bank ${bankId}`);
return savedItems;
} catch (error) {
this.logger.error('[generateQuestions] Error generating questions:', error);
throw error;
@@ -371,15 +387,14 @@ export class QuestionBankService {
const usedIds = new Set<string>();
const selected: QuestionBankItem[] = [];
const availableItems = [...allItems];
let dimIdx = 0;
while (selected.length < count && usedIds.size < allItems.length) {
while (selected.length < count && availableItems.length > 0) {
const dim = DIMENSIONS[dimIdx % DIMENSIONS.length];
dimIdx++;
if (selected.length >= count) break;
const available = allItems.filter(
const available = availableItems.filter(
(i) => i.dimension === dim && !usedIds.has(i.id),
);
@@ -388,7 +403,27 @@ export class QuestionBankService {
const item = available[idx];
selected.push(item);
usedIds.add(item.id);
const actualIdx = availableItems.findIndex(i => i.id === item.id);
if (actualIdx > -1) {
availableItems.splice(actualIdx, 1);
}
}
if (dimIdx >= DIMENSIONS.length * 3) {
break;
}
}
if (selected.length < count && availableItems.length > 0) {
const shuffled = this.shuffleArray([...availableItems]);
for (const item of shuffled) {
if (selected.length >= count) break;
if (!usedIds.has(item.id)) {
selected.push(item);
usedIds.add(item.id);
}
}
}
}
if (selected.length < count) {
@@ -440,4 +475,13 @@ export class QuestionBankService {
this.logger.log(`[batchReview] ${items.length} items ${approved ? 'approved' : 'rejected'}`);
return items;
}
private shuffleArray<T>(array: T[]): T[] {
const result = [...array];
for (let i = result.length - 1; i > 0; i--) {
const j = Math.floor(Math.random() * (i + 1));
[result[i], result[j]] = [result[j], result[i]];
}
return result;
}
}