89 lines
3.1 KiB
TypeScript
89 lines
3.1 KiB
TypeScript
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,
|
|
};
|
|
}; |