feat: 完善中文心理测评平台
This commit is contained in:
@@ -0,0 +1,89 @@
|
||||
import { QuestionType } from "@/types";
|
||||
|
||||
/**
|
||||
* ADHD Self-Report Scale calculator parameters interface
|
||||
*/
|
||||
interface ADHDCalculatorProps {
|
||||
/** Answer data, key is question ID, value is selected score */
|
||||
answers: { [key: number]: string };
|
||||
/** Questions list */
|
||||
questions: QuestionType[];
|
||||
}
|
||||
|
||||
/**
|
||||
* Calculate ADHD Self-Report Scale (ASRS-v1.1) results
|
||||
*
|
||||
* @param answers - User answer data, containing question ID and selected score
|
||||
* @returns Calculation results, including total score, factor scores, severity level and other information
|
||||
*/
|
||||
export const calculateADHDResults = ({ answers }: ADHDCalculatorProps): any => {
|
||||
// ADHD ASRS calculation logic
|
||||
let totalScore = 0;
|
||||
|
||||
// Subscale score initialization: inattention and hyperactivity-impulsivity
|
||||
let inattentionScore = 0; // Inattention subscale score (questions 1-9)
|
||||
let hyperactivityScore = 0; // Hyperactivity-Impulsivity subscale score (questions 10-18)
|
||||
|
||||
// Part A screening questions (questions 1-6) - critical for screening
|
||||
let partAScore = 0;
|
||||
let partAPositive = 0; // Count of positive responses in Part A
|
||||
|
||||
// Calculate total score and subscale scores
|
||||
Object.entries(answers).forEach(([questionId, score]) => {
|
||||
const questionNum = parseInt(questionId);
|
||||
const scoreValue = parseInt(score);
|
||||
|
||||
totalScore += scoreValue;
|
||||
|
||||
// Part A screening questions (questions 1-6)
|
||||
if (questionNum >= 1 && questionNum <= 6) {
|
||||
partAScore += scoreValue;
|
||||
// Part A positive criteria: questions 1-4 score ≥2, questions 5-6 score ≥3
|
||||
if ((questionNum >= 1 && questionNum <= 4 && scoreValue >= 2) ||
|
||||
(questionNum >= 5 && questionNum <= 6 && scoreValue >= 3)) {
|
||||
partAPositive++;
|
||||
}
|
||||
}
|
||||
|
||||
// Inattention subscale (questions 1-9)
|
||||
if (questionNum >= 1 && questionNum <= 9) {
|
||||
inattentionScore += scoreValue;
|
||||
}
|
||||
// Hyperactivity-Impulsivity subscale (questions 10-18)
|
||||
else if (questionNum >= 10 && questionNum <= 18) {
|
||||
hyperactivityScore += scoreValue;
|
||||
}
|
||||
});
|
||||
|
||||
// Determine screening result based on Part A
|
||||
const screeningPositive = partAPositive >= 4;
|
||||
|
||||
// Determine severity level based on total score
|
||||
let severity = "low";
|
||||
if (totalScore >= 24 && totalScore <= 36) {
|
||||
severity = "mild";
|
||||
} else if (totalScore >= 37 && totalScore <= 54) {
|
||||
severity = "moderate";
|
||||
} else if (totalScore >= 55) {
|
||||
severity = "high";
|
||||
}
|
||||
|
||||
// Calculate factor scores
|
||||
const factorScores: { [key: string]: number } = {
|
||||
"inattention": inattentionScore,
|
||||
"hyperactivity": hyperactivityScore,
|
||||
"partA": partAScore
|
||||
};
|
||||
|
||||
// Return complete calculation results
|
||||
return {
|
||||
totalScore,
|
||||
factorScores,
|
||||
positiveItemCount: Object.values(answers).filter(score => parseInt(score) >= 2).length,
|
||||
positiveItemAverage: totalScore / Object.keys(answers).length,
|
||||
isSevere: severity === "high",
|
||||
severity,
|
||||
screeningPositive,
|
||||
partAPositive,
|
||||
};
|
||||
};
|
||||
Reference in New Issue
Block a user