feat: 完善中文心理测评平台
This commit is contained in:
@@ -0,0 +1,95 @@
|
||||
import { QuestionType } from "@/types";
|
||||
|
||||
interface DASS21CalculatorProps {
|
||||
answers: { [key: number]: string };
|
||||
questions: QuestionType[];
|
||||
}
|
||||
|
||||
export const calculateDASS21Results = ({ answers }: DASS21CalculatorProps): any => {
|
||||
// DASS-21 calculation logic
|
||||
// Depression dimension items: 3, 5, 10, 13, 16, 17, 21
|
||||
// Anxiety dimension items: 2, 4, 7, 9, 15, 19, 20
|
||||
// Stress dimension items: 1, 6, 8, 11, 12, 14, 18
|
||||
|
||||
const depressionItems = [3, 5, 10, 13, 16, 17, 21];
|
||||
const anxietyItems = [2, 4, 7, 9, 15, 19, 20];
|
||||
const stressItems = [1, 6, 8, 11, 12, 14, 18];
|
||||
|
||||
let depressionScore = 0;
|
||||
let anxietyScore = 0;
|
||||
let stressScore = 0;
|
||||
let totalScore = 0;
|
||||
|
||||
// Calculate dimension scores
|
||||
Object.entries(answers).forEach(([questionId, score]) => {
|
||||
const questionNum = parseInt(questionId);
|
||||
const scoreValue = parseInt(score);
|
||||
|
||||
totalScore += scoreValue;
|
||||
|
||||
if (depressionItems.includes(questionNum)) {
|
||||
depressionScore += scoreValue;
|
||||
} else if (anxietyItems.includes(questionNum)) {
|
||||
anxietyScore += scoreValue;
|
||||
} else if (stressItems.includes(questionNum)) {
|
||||
stressScore += scoreValue;
|
||||
}
|
||||
});
|
||||
|
||||
// DASS-21 scores need to be multiplied by 2 for comparison with DASS-42
|
||||
const finalDepressionScore = depressionScore * 2;
|
||||
const finalAnxietyScore = anxietyScore * 2;
|
||||
const finalStressScore = stressScore * 2;
|
||||
|
||||
// Determine severity level for each dimension
|
||||
const getDepressionSeverity = (score: number) => {
|
||||
if (score <= 9) return "normal";
|
||||
if (score <= 13) return "mild";
|
||||
if (score <= 20) return "moderate";
|
||||
if (score <= 27) return "severe";
|
||||
return "extremely_severe";
|
||||
};
|
||||
|
||||
const getAnxietySeverity = (score: number) => {
|
||||
if (score <= 7) return "normal";
|
||||
if (score <= 9) return "mild";
|
||||
if (score <= 14) return "moderate";
|
||||
if (score <= 19) return "severe";
|
||||
return "extremely_severe";
|
||||
};
|
||||
|
||||
const getStressSeverity = (score: number) => {
|
||||
if (score <= 14) return "normal";
|
||||
if (score <= 18) return "mild";
|
||||
if (score <= 25) return "moderate";
|
||||
if (score <= 33) return "severe";
|
||||
return "extremely_severe";
|
||||
};
|
||||
|
||||
const depressionSeverity = getDepressionSeverity(finalDepressionScore);
|
||||
const anxietySeverity = getAnxietySeverity(finalAnxietyScore);
|
||||
const stressSeverity = getStressSeverity(finalStressScore);
|
||||
|
||||
// Determine overall severity level
|
||||
const isAnySevere = depressionSeverity === "severe" || depressionSeverity === "extremely_severe" ||
|
||||
anxietySeverity === "severe" || anxietySeverity === "extremely_severe" ||
|
||||
stressSeverity === "severe" || stressSeverity === "extremely_severe";
|
||||
|
||||
return {
|
||||
totalScore,
|
||||
depressionScore: finalDepressionScore,
|
||||
anxietyScore: finalAnxietyScore,
|
||||
stressScore: finalStressScore,
|
||||
depressionSeverity,
|
||||
anxietySeverity,
|
||||
stressSeverity,
|
||||
factorScores: {
|
||||
"depression": finalDepressionScore,
|
||||
"anxiety": finalAnxietyScore,
|
||||
"stress": finalStressScore
|
||||
},
|
||||
positiveItemCount: Object.values(answers).filter(score => parseInt(score) >= 2).length,
|
||||
positiveItemAverage: totalScore / Object.keys(answers).length,
|
||||
isSevere: isAnySevere
|
||||
};
|
||||
};
|
||||
Reference in New Issue
Block a user