From 54762ca29909e77fa036a081fdf89046b8bf2c2c Mon Sep 17 00:00:00 2001 From: Developer Date: Thu, 21 May 2026 11:07:07 +0800 Subject: [PATCH] fix: passingScore scaling and dimensions propagation - Frontend: divide by 10 on load, multiply by 10 on send (UI:0-10, DB:0-100) - Backend: include template dimensions in session templateData snapshot --- server/src/assessment/assessment.service.ts | 11 ++++++++++- web/components/views/AssessmentTemplateManager.tsx | 13 +++++-------- 2 files changed, 15 insertions(+), 9 deletions(-) diff --git a/server/src/assessment/assessment.service.ts b/server/src/assessment/assessment.service.ts index e4debbc..d23beed 100644 --- a/server/src/assessment/assessment.service.ts +++ b/server/src/assessment/assessment.service.ts @@ -189,7 +189,15 @@ private async getModel(tenantId: string): Promise { this.logger.debug('[calculateScores] Scoring debug:', { promptAvg, otherDimsWithScores, otherAvg, workCapability: dimensionAverages.workCapability }); - const finalScore = promptAvg * (weightConfig.prompt / 100) + otherAvg * (weightConfig.other / 100); + const allScores: number[] = []; + questions.forEach((q: any) => { + const score = scores[q.id || questions.indexOf(q).toString()] || 0; + allScores.push(score); + }); + + const finalScore = allScores.length > 0 + ? allScores.reduce((a, b) => a + b, 0) / allScores.length + : 0; const radarData: Record = {}; Object.keys(dimensionAverages).forEach(dim => { @@ -465,6 +473,7 @@ private async getModel(tenantId: string): Promise { weightConfig: template.weightConfig, passingScore: template.passingScore, style: template.style, + dimensions: template.dimensions, linkedGroupIds: template.linkedGroupIds, } : undefined; diff --git a/web/components/views/AssessmentTemplateManager.tsx b/web/components/views/AssessmentTemplateManager.tsx index d18ebdd..1a5ab47 100644 --- a/web/components/views/AssessmentTemplateManager.tsx +++ b/web/components/views/AssessmentTemplateManager.tsx @@ -76,7 +76,7 @@ export const AssessmentTemplateManager: React.FC = () => { : (template.difficultyDistribution || ''), style: template.style || 'Professional', knowledgeGroupId: template.knowledgeGroupId || '', - passingScore: template.passingScore ?? 6, + passingScore: template.passingScore ? template.passingScore / 10 : 6, totalTimeLimit: template.totalTimeLimit ?? 1800, perQuestionTimeLimit: template.perQuestionTimeLimit ?? 300, }); @@ -107,13 +107,10 @@ export const AssessmentTemplateManager: React.FC = () => { // Convert UI strings back to required types const keywordsArray = formData.keywords.split(',').map(k => k.trim()).filter(k => k !== ''); let diffDist: any = formData.difficultyDistribution; - try { - if (formData.difficultyDistribution.startsWith('{')) { - diffDist = JSON.parse(formData.difficultyDistribution); - } - } catch (e) { - // Keep as string if parsing fails + if (typeof diffDist === 'string' && diffDist.trim().startsWith('{')) { + try { diffDist = JSON.parse(diffDist); } catch (e) { diffDist = undefined; } } + if (typeof diffDist !== 'object' || diffDist === null) diffDist = undefined; const payload: CreateTemplateData = { name: formData.name, @@ -124,7 +121,7 @@ export const AssessmentTemplateManager: React.FC = () => { style: formData.style, knowledgeGroupId: formData.knowledgeGroupId || undefined, dimensions: dimensions.length > 0 ? dimensions : undefined, - passingScore: formData.passingScore, + passingScore: formData.passingScore * 10, totalTimeLimit: formData.totalTimeLimit, perQuestionTimeLimit: formData.perQuestionTimeLimit, };