feat: 完善中文心理测评平台

This commit is contained in:
mikemoi
2026-06-22 22:59:01 +02:00
commit 9227c687fc
160 changed files with 16974 additions and 0 deletions
@@ -0,0 +1,70 @@
import { QuestionType } from "@/types";
interface SCL90CalculatorProps {
answers: { [key: number]: string };
questions: QuestionType[];
}
export const calculateSCL90Results = ({ answers }: SCL90CalculatorProps): any => {
// SCL-90 calculation logic
const totalScore = Object.values(answers).reduce((sum, score) => sum + parseInt(score), 0);
const positiveItemCount = Object.values(answers).filter(score => parseInt(score) >= 2).length;
const negativeItemCount = Object.values(answers).filter(score => parseInt(score) === 1).length;
const positiveItemAverage = positiveItemCount > 0
? (totalScore - negativeItemCount) / positiveItemCount
: 0;
// SCL-90 factor grouping (based on standard factor structure)
const factorMapping: { [key: string]: number[] } = {
"somatization": [1, 4, 12, 27, 40, 42, 48, 49, 52, 53, 56, 58], // Somatization
"obsessive": [3, 9, 10, 28, 38, 45, 46, 51, 55, 65], // Obsessive-compulsive
"interpersonal": [6, 21, 34, 36, 37, 41, 61, 69, 73], // Interpersonal sensitivity
"depression": [5, 14, 15, 20, 22, 26, 29, 30, 31, 32, 54, 71, 79], // Depression
"anxiety": [2, 17, 23, 33, 39, 57, 72, 78, 80, 86], // Anxiety
"hostility": [11, 24, 63, 67, 74, 81], // Hostility
"phobic": [13, 25, 47, 50, 70, 75, 82], // Phobic anxiety
"paranoid": [8, 18, 43, 68, 76, 83], // Paranoid ideation
"psychotic": [7, 16, 35, 62, 77, 84, 85, 87, 88, 90], // Psychoticism
"other": [19, 44, 59, 60, 64, 66, 89] // Other
};
// Calculate factor scores
const factorScores: { [key: string]: number } = {};
Object.entries(factorMapping).forEach(([factor, questionIndexes]) => {
let factorSum = 0;
let validQuestionCount = 0;
questionIndexes.forEach((index: number) => {
if (answers[index]) {
factorSum += parseInt(answers[index]);
validQuestionCount++;
}
});
factorScores[factor] = validQuestionCount > 0
? factorSum / validQuestionCount
: 0;
});
const isSevere = totalScore > 160 || positiveItemCount > 43;
// Determine overall severity level
let severity = "normal";
if (totalScore >= 160 && positiveItemCount >= 43) {
severity = "severe";
} else if (totalScore >= 120 || positiveItemCount >= 30) {
severity = "moderate";
} else if (totalScore >= 90 || positiveItemCount >= 20) {
severity = "mild";
}
return {
totalScore,
factorScores,
positiveItemCount,
positiveItemAverage,
isSevere,
severity
};
};