Ver código fonte

fix(health-main): 心理雷达图改用10维完整数据(大五+自驱力+情绪稳定性+自我概念)

- EmiReportDTO新增 emotionStability/driveAutonomy/driveCompetence/driveRelatedness/selfConceptOverall 字段
- EmiReportService.toDTO() 解析 DanAssessmentResult.structuredAnalysis JSON 提取自驱力三维度及自我概念;emotionStability = (emotionScore+resilienceScore+stressCopingScore+selfAwarenessScore)/4
- 心理雷达图扩展为10维:开放性/尽责性/外向性/宜人性/神经质/自主性/胜任感/归属感/情绪稳定性/自我概念
- 家庭平均数据同步使用10维字段计算
- mind-detail页面的emiData.driveAutonomy等字段现在也能正确获取到数据
iwt 1 mês atrás
pai
commit
c61b30f9df

+ 11 - 0
cfc-backend/src/main/java/com/etotem/cfc/dto/EmiReportDTO.java

@@ -32,6 +32,17 @@ public class EmiReportDTO implements Serializable {
     private Integer socialAdaptabilityScore;
     private Integer selfMotivationScore;
 
+    /** 情绪稳定性综合分 = (emotionScore+resilienceScore+stressCopingScore+selfAwarenessScore)/4 */
+    private Integer emotionStability;
+
+    /** 自驱力三维度(来自 structuredAnalysis.extra.selfDriving) */
+    private Integer driveAutonomy;
+    private Integer driveCompetence;
+    private Integer driveRelatedness;
+
+    /** 综合自我概念(来自 structuredAnalysis.extra.selfConcept 均值) */
+    private Integer selfConceptOverall;
+
     private Integer overallScore;
 
     private String analysisReport;

+ 107 - 23
cfc-backend/src/main/java/com/etotem/cfc/service/EmiReportService.java

@@ -1,5 +1,7 @@
 package com.etotem.cfc.service;
 
+import com.alibaba.fastjson.JSON;
+import com.alibaba.fastjson.JSONObject;
 import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
 import com.etotem.cfc.dto.EmiReportDTO;
 import com.etotem.cfc.entity.DanAssessmentResult;
@@ -10,6 +12,7 @@ import org.springframework.stereotype.Service;
 import javax.annotation.Resource;
 import java.util.ArrayList;
 import java.util.List;
+import java.util.Map;
 
 @Slf4j
 @Service
@@ -45,15 +48,90 @@ public class EmiReportService {
         dto.setEmpathyScore(result.getEmpathyScore());
         dto.setSocialAdaptabilityScore(result.getSocialAdaptabilityScore());
         dto.setSelfMotivationScore(result.getSelfMotivationScore());
+        // 情绪稳定性 = 四个EMI子分均值
+        int eSum = safeScore(result.getEmotionScore()) + safeScore(result.getResilienceScore())
+                + safeScore(result.getStressCopingScore()) + safeScore(result.getSelfAwarenessScore());
+        dto.setEmotionStability(eSum / 4);
+        // 自驱力 + 自我概念 从 structuredAnalysis JSON 解析
+        Map<String, Object> analysis = parseStructuredAnalysis(result.getStructuredAnalysis());
+        if (analysis != null) {
+            Map<String, Object> extra = (Map<String, Object>) analysis.get("extra");
+            if (extra != null) {
+                // 自驱力三维度
+                Map<String, Object> sd = (Map<String, Object>) extra.get("selfDriving");
+                if (sd != null) {
+                    dto.setDriveAutonomy(getInt(sd, "自主性", "selfDriving_autonomy"));
+                    dto.setDriveCompetence(getInt(sd, "胜任感", "selfDriving_competence"));
+                    dto.setDriveRelatedness(getInt(sd, "归属感", "selfDriving_relatedness"));
+                }
+                // 综合自我概念
+                Map<String, Object> sc = (Map<String, Object>) extra.get("selfConcept");
+                if (sc != null && !sc.isEmpty()) {
+                    int scSum = 0, scCount = 0;
+                    for (Object v : sc.values()) {
+                        Integer n = parseNumber(v);
+                        if (n != null) { scSum += n; scCount++; }
+                    }
+                    dto.setSelfConceptOverall(scCount > 0 ? scSum / scCount : 0);
+                }
+            }
+        }
+        dto.setAnalysisReport(result.getAnalysisReport());
+        dto.setGrowthSuggestions(result.getGrowthSuggestions());
+        dto.setAssessmentDate(result.getAssessmentDate());
+        return dto;
+    }
+
+    private EmiReportDTO toDTO(DanAssessmentResult result) {
+        EmiReportDTO dto = new EmiReportDTO();
+        dto.setMemberId(result.getChildId());
+        dto.setChildName(result.getChildName());
+        dto.setEmotionScore(result.getEmotionScore());
+        dto.setResilienceScore(result.getResilienceScore());
+        dto.setStressCopingScore(result.getStressCopingScore());
+        dto.setSelfAwarenessScore(result.getSelfAwarenessScore());
+        dto.setOpennessScore(result.getOpennessScore());
+        dto.setConscientiousnessScore(result.getConscientiousnessScore());
+        dto.setExtraversionScore(result.getExtraversionScore());
+        dto.setAgreeablenessScore(result.getAgreeablenessScore());
+        dto.setNeuroticismScore(result.getNeuroticismScore());
+        dto.setBigFiveOverallScore(result.getBigFiveOverallScore());
+        dto.setEmotionManagementScore(result.getEmotionManagementScore());
+        dto.setEmpathyScore(result.getEmpathyScore());
+        dto.setSocialAdaptabilityScore(result.getSocialAdaptabilityScore());
+        dto.setSelfMotivationScore(result.getSelfMotivationScore());
+        int eSum = safeScore(result.getEmotionScore()) + safeScore(result.getResilienceScore())
+                + safeScore(result.getStressCopingScore()) + safeScore(result.getSelfAwarenessScore());
+        dto.setEmotionStability(eSum / 4);
+        Map<String, Object> analysis = parseStructuredAnalysis(result.getStructuredAnalysis());
+        if (analysis != null) {
+            Map<String, Object> extra = (Map<String, Object>) analysis.get("extra");
+            if (extra != null) {
+                Map<String, Object> sd = (Map<String, Object>) extra.get("selfDriving");
+                if (sd != null) {
+                    dto.setDriveAutonomy(getInt(sd, "自主性", "selfDriving_autonomy"));
+                    dto.setDriveCompetence(getInt(sd, "胜任感", "selfDriving_competence"));
+                    dto.setDriveRelatedness(getInt(sd, "归属感", "selfDriving_relatedness"));
+                }
+                Map<String, Object> sc = (Map<String, Object>) extra.get("selfConcept");
+                if (sc != null && !sc.isEmpty()) {
+                    int scSum = 0, scCount = 0;
+                    for (Object v : sc.values()) {
+                        Integer n = parseNumber(v);
+                        if (n != null) { scSum += n; scCount++; }
+                    }
+                    dto.setSelfConceptOverall(scCount > 0 ? scSum / scCount : 0);
+                }
+            }
+        }
+        dto.setOverallScore(result.getOverallScore());
         dto.setAnalysisReport(result.getAnalysisReport());
         dto.setGrowthSuggestions(result.getGrowthSuggestions());
         dto.setAssessmentDate(result.getAssessmentDate());
         return dto;
     }
 
-    /**
-     * 获取家庭所有孩子的最新EMI心理报告
-     */
+    /** 获取家庭所有孩子的最新EMI心理报告 */
     public List<EmiReportDTO> getFamilyLatestEmiReports(List<Long> childIds) {
         if (childIds == null || childIds.isEmpty()) return new ArrayList<>();
         LambdaQueryWrapper<DanAssessmentResult> wrapper = new LambdaQueryWrapper<DanAssessmentResult>()
@@ -63,27 +141,33 @@ public class EmiReportService {
         List<DanAssessmentResult> results = danAssessmentResultMapper.selectList(wrapper);
         List<EmiReportDTO> list = new ArrayList<>();
         for (DanAssessmentResult r : results) {
-            EmiReportDTO dto = new EmiReportDTO();
-            dto.setMemberId(r.getChildId());
-            dto.setChildName(r.getChildName());
-            dto.setEmotionScore(r.getEmotionScore());
-            dto.setResilienceScore(r.getResilienceScore());
-            dto.setStressCopingScore(r.getStressCopingScore());
-            dto.setSelfAwarenessScore(r.getSelfAwarenessScore());
-            dto.setOpennessScore(r.getOpennessScore());
-            dto.setConscientiousnessScore(r.getConscientiousnessScore());
-            dto.setExtraversionScore(r.getExtraversionScore());
-            dto.setAgreeablenessScore(r.getAgreeablenessScore());
-            dto.setNeuroticismScore(r.getNeuroticismScore());
-            dto.setBigFiveOverallScore(r.getBigFiveOverallScore());
-            dto.setEmotionManagementScore(r.getEmotionManagementScore());
-            dto.setEmpathyScore(r.getEmpathyScore());
-            dto.setSocialAdaptabilityScore(r.getSocialAdaptabilityScore());
-            dto.setSelfMotivationScore(r.getSelfMotivationScore());
-            dto.setOverallScore(r.getOverallScore());
-            dto.setAssessmentDate(r.getAssessmentDate());
-            list.add(dto);
+            list.add(toDTO(r));
         }
         return list;
     }
+
+    private static int safeScore(Integer v) { return v != null && v > 0 ? v : 0; }
+
+    private static Integer getInt(Map<String, Object> map, String cnKey, String enKey) {
+        if (map == null) return null;
+        Object val = map.get(cnKey);
+        if (val == null) val = map.get(enKey);
+        return parseNumber(val);
+    }
+
+    private static Integer parseNumber(Object val) {
+        if (val == null) return null;
+        if (val instanceof Number) return ((Number) val).intValue();
+        if (val instanceof String) {
+            try { return Integer.parseInt(((String) val).trim()); }
+            catch (NumberFormatException e) { return null; }
+        }
+        return null;
+    }
+
+    private static Map<String, Object> parseStructuredAnalysis(String json) {
+        if (json == null || json.isEmpty()) return null;
+        try { return JSON.parseObject(json, Map.class); }
+        catch (Exception e) { return null; }
+    }
 }

+ 8 - 3
cfc-frontend/pages/health-main/index.vue

@@ -341,7 +341,7 @@ export default {
         return [{ label:'记忆力',key:'memory'},{ label:'注意力',key:'attention'},{ label:'逻辑推理',key:'logic'},{ label:'空间想象',key:'spatial'},{ label:'感知能力',key:'perception'},{ label:'专注力',key:'focus'},{ label:'加工速度',key:'processingSpeed' }]
       }
       if (this.currentTab === 'mental') {
-        return [{ label:'开放性',key:'openness'},{ label:'尽责性',key:'conscientiousness'},{ label:'外向性',key:'extraversion'},{ label:'宜人性',key:'agreeableness'},{ label:'神经质',key:'neuroticism' }]
+        return [{ label:'开放性',key:'openness'},{ label:'尽责性',key:'conscientiousness'},{ label:'外向性',key:'extraversion'},{ label:'宜人性',key:'agreeableness'},{ label:'神经质',key:'neuroticism'},{ label:'自主性',key:'driveAutonomy'},{ label:'胜任感',key:'driveCompetence'},{ label:'归属感',key:'driveRelatedness'},{ label:'情绪稳定性',key:'emotionStability'},{ label:'自我概念',key:'selfConceptOverall' }]
       }
       if (this.currentTab === 'relationship') {
         return [{ label:'亲子信任',key:'parentTrust'},{ label:'亲子亲密度',key:'parentIntimacy'},{ label:'沟通质量',key:'communication'},{ label:'关系健康度',key:'healthStatus'},{ label:'最近互动',key:'lastInteraction' }]
@@ -398,7 +398,12 @@ export default {
           this._emiScore('conscientiousnessScore'),
           this._emiScore('extraversionScore'),
           this._emiScore('agreeablenessScore'),
-          this._emiScore('neuroticismScore')
+          this._emiScore('neuroticismScore'),
+          this._emiScore('driveAutonomy'),
+          this._emiScore('driveCompetence'),
+          this._emiScore('driveRelatedness'),
+          this._emiScore('emotionStability'),
+          this._emiScore('selfConceptOverall')
         ]
       }
       if (this.currentTab === 'relationship') {
@@ -442,7 +447,7 @@ export default {
         return avgs
       }
       if (this.currentTab === 'mental' && this.emiFamilyData.length > 0) {
-        var keys2 = ['opennessScore','conscientiousnessScore','extraversionScore','agreeablenessScore','neuroticismScore']
+        var keys2 = ['opennessScore','conscientiousnessScore','extraversionScore','agreeablenessScore','neuroticismScore','driveAutonomy','driveCompetence','driveRelatedness','emotionStability','selfConceptOverall']
         var avgs2 = []
         for (var k2 = 0; k2 < keys2.length; k2++) {
           var sum2 = 0