feat: 完善中文心理测评平台
This commit is contained in:
@@ -0,0 +1,86 @@
|
||||
import { QuestionType } from "@/types";
|
||||
|
||||
interface PSS10CalculatorProps {
|
||||
answers: { [key: number]: string };
|
||||
questions: QuestionType[];
|
||||
}
|
||||
|
||||
export const calculatePSS10Results = ({ answers }: PSS10CalculatorProps): any => {
|
||||
// PSS-10 calculation logic
|
||||
let totalScore = 0;
|
||||
|
||||
// Reverse scoring items (4, 5, 7, 8)
|
||||
const reverseItems = [4, 5, 7, 8];
|
||||
|
||||
// Calculate total score
|
||||
Object.entries(answers).forEach(([questionId, score]) => {
|
||||
const questionNum = parseInt(questionId);
|
||||
const scoreValue = parseInt(score);
|
||||
|
||||
if (reverseItems.includes(questionNum)) {
|
||||
// Reverse scoring: 0->4, 1->3, 2->2, 3->1, 4->0
|
||||
totalScore += (4 - scoreValue);
|
||||
} else {
|
||||
totalScore += scoreValue;
|
||||
}
|
||||
});
|
||||
|
||||
// Determine stress level (based on reference values from research literature)
|
||||
let severity = "low";
|
||||
if (totalScore >= 27) {
|
||||
severity = "high";
|
||||
} else if (totalScore >= 14) {
|
||||
severity = "moderate";
|
||||
}
|
||||
|
||||
// Analyze item scores
|
||||
const itemAnalysis = Object.entries(answers).map(([questionId, score]) => {
|
||||
const questionNum = parseInt(questionId);
|
||||
const scoreValue = parseInt(score);
|
||||
const isReverse = reverseItems.includes(questionNum);
|
||||
const actualScore = isReverse ? (4 - scoreValue) : scoreValue;
|
||||
|
||||
return {
|
||||
questionId: questionNum,
|
||||
originalScore: scoreValue,
|
||||
actualScore: actualScore,
|
||||
isReverse: isReverse,
|
||||
isHigh: actualScore >= 3 // Scores of 3 or above are considered high score items
|
||||
};
|
||||
});
|
||||
|
||||
const highScoreItems = itemAnalysis.filter(item => item.isHigh);
|
||||
|
||||
// Calculate subscale scores
|
||||
const stressPerceptionItems = [1, 2, 3, 6, 9, 10]; // Stress perception items
|
||||
const copingAbilityItems = [4, 5, 7, 8]; // Coping ability items
|
||||
|
||||
let stressPerceptionScore = 0;
|
||||
let copingAbilityScore = 0;
|
||||
|
||||
itemAnalysis.forEach(item => {
|
||||
if (stressPerceptionItems.includes(item.questionId)) {
|
||||
stressPerceptionScore += item.actualScore;
|
||||
} else if (copingAbilityItems.includes(item.questionId)) {
|
||||
copingAbilityScore += item.actualScore;
|
||||
}
|
||||
});
|
||||
|
||||
return {
|
||||
totalScore,
|
||||
severity,
|
||||
itemAnalysis,
|
||||
highScoreItemCount: highScoreItems.length,
|
||||
stressPerceptionScore, // Stress perception score (0-24 points)
|
||||
copingAbilityScore, // Coping ability score (0-16 points)
|
||||
factorScores: {
|
||||
"stress_perception": stressPerceptionScore,
|
||||
"coping_ability": copingAbilityScore
|
||||
},
|
||||
positiveItemCount: highScoreItems.length,
|
||||
positiveItemAverage: highScoreItems.length > 0
|
||||
? highScoreItems.reduce((sum, item) => sum + item.actualScore, 0) / highScoreItems.length
|
||||
: 0,
|
||||
isSevere: severity === "high"
|
||||
};
|
||||
};
|
||||
Reference in New Issue
Block a user