Просмотр исходного кода

feat(energy): 五维体系新增心13维/行6维/智成长型思维/富家族传承子维度字段与计算逻辑

Xiaogang Liao 1 месяц назад
Родитель
Сommit
8b30b9a912

+ 51 - 4
cfc-backend/src/main/java/com/etotem/cfc/dto/MemberEnergyDTO.java

@@ -62,8 +62,55 @@ public class MemberEnergyDTO {
     private String wisdomActionStatus;  // normal / blind / paralysis / balanced
     private String wisdomActionMessage;
 
-    // 心的子维度(仅孩子有真实数据,成人回0)
-    private Integer heartEmotionStable;  // 心·情绪稳定 (0-100)
-    private Integer heartUnderstanding;  // 心·理解包容 (0-100)
-    private Integer heartLegacy;         // 心·传承传递 (0-100),第一阶段回0
+    // ========== 心·大五人格(Big Five,5维) ==========
+    private Integer bigFiveOpenness;          // 开放性 (0-100)
+    private Integer bigFiveConscientiousness; // 尽责性 (0-100)
+    private Integer bigFiveExtraversion;      // 外向性 (0-100)
+    private Integer bigFiveAgreeableness;     // 宜人性 (0-100)
+    private Integer bigFiveNeuroticism;       // 神经质 (0-100)
+
+    // ========== 心·情绪稳定(EMI,4维) ==========
+    private Integer emotionEmotion;           // 情绪商数 (0-100)
+    private Integer emotionResilience;        // 心理韧性 (0-100)
+    private Integer emotionStressCoping;      // 压力应对 (0-100)
+    private Integer emotionSelfAwareness;     // 自我认知 (0-100)
+
+    // ========== 心·自驱力(3维) ==========
+    private Integer driveAutonomy;            // 自主性 (0-100)
+    private Integer driveCompetence;          // 胜任感 (0-100)
+    private Integer driveRelatedness;         // 归属感 (0-100)
+
+    // ========== 心·自我概念(1维) ==========
+    private Integer selfConceptOverall;       // 综合自我概念 (0-100)
+
+    // ========== 行·家长版(6维) ==========
+    private Integer actionParentChild;        // 亲子关系 (0-100)
+    private Integer actionMarital;            // 夫妻关系 (0-100)
+    private Integer actionParental;           // 父母关系 (0-100)
+    private Integer actionLeadership;         // 领导关系 (0-100)
+    private Integer actionSociality;          // 社会性 (0-100)
+    private Integer actionInterpersonal;      // 人际韧性 (0-100)
+
+    // ========== 行·孩子版(6维) ==========
+    private Integer actionChildParentChild;   // 亲子关系 (0-100)
+    private Integer actionSibling;            // 同胞关系 (0-100)
+    private Integer actionRelative;           // 亲属关系 (0-100)
+    private Integer actionTeacherStudent;     // 师生关系 (0-100)
+    private Integer actionChildSociality;     // 社会性 (0-100)
+    private Integer actionChildInterpersonal; // 人际韧性 (0-100)
+
+    // ========== 智·成长型思维 ==========
+    private Integer wisdomGrowthMindset;      // 成长型思维 (0-100)
+
+    // ========== 富·家族传承 ==========
+    private Integer wealthLegacy;             // 家长版·家族传承 (0-100)
+    private Integer wealthChildLegacy;        // 孩子版·家族传承 (0-100)
+
+    // ========== 旧心子维度兼容(v2.0初步字段,迁移过渡用) ==========
+    @Deprecated
+    private Integer heartEmotionStable;  // 已替换为 emotionEmotion
+    @Deprecated
+    private Integer heartUnderstanding;  // 已替换为 bigFiveAgreeableness
+    @Deprecated
+    private Integer heartLegacy;         // 已迁移至 wealthLegacy
 }

+ 133 - 9
cfc-backend/src/main/java/com/etotem/cfc/service/EnergyService.java

@@ -227,10 +227,11 @@ public class EnergyService {
         dto.setActionScore(calcParentAction(parent));
         dto.setWealthScore(calcParentWealth(parent, dto));
 
-        // 心的子维度(家长暂无数据源,三方面均回0)
-        dto.setHeartEmotionStable(calcHeartEmotionStableForParent());
-        dto.setHeartUnderstanding(calcHeartUnderstandingForParent());
-        dto.setHeartLegacy(calcHeartLegacy());
+        // 心/行/智/富 子维度(家长暂无DAN数据,心13维回0;行6维/富传承留待自检问卷)
+        setMindSubDimensionsForParent(dto);
+        setActionSubDimensionsForParent(dto);
+        setWisdomSubDimensionsForParent(dto);
+        setWealthSubDimensionsForParent(dto);
 
         // v2.0 三轮算法:克环 → 生环(链式调用,避免迭代收敛)
         applyAllRestraints(dto);
@@ -377,11 +378,11 @@ public class EnergyService {
         dto.setActionScore(calcChildAction(child));
         dto.setWealthScore(calcChildWealth(child, dto));
 
-        // 心的子维度(v2.0):用最近一次 DAN 结果填入情绪稳定/理解包容/传承传递
-        DanAssessmentResult danForHeart = findLatestDanResult(child.getId());
-        dto.setHeartEmotionStable(calcHeartEmotionStableForChild(child.getId(), danForHeart));
-        dto.setHeartUnderstanding(calcHeartUnderstandingForChild(child.getId(), danForHeart));
-        dto.setHeartLegacy(calcHeartLegacy());
+        // 心/行/智/富 子维度(孩子:心13维从DAN报告取,行6维/富传承留待自检问卷)
+        setMindSubDimensionsForChild(dto, child);
+        setActionSubDimensionsForChild(dto);
+        setWisdomSubDimensionsForChild(dto, child);
+        setWealthSubDimensionsForChild(dto);
 
         // v2.0 三轮算法:克环 → 生环(链式调用,避免迭代收敛)
         applyAllRestraints(dto);
@@ -1089,6 +1090,129 @@ public class EnergyService {
         return 50;
     }
 
+    // ==================== 新五维子维度设置方法 ====================
+
+    /** 心13维 — 家长版:暂无DAN数据,全部回0,旧字段兼容回填 */
+    private void setMindSubDimensionsForParent(MemberEnergyDTO dto) {
+        dto.setBigFiveOpenness(0);
+        dto.setBigFiveConscientiousness(0);
+        dto.setBigFiveExtraversion(0);
+        dto.setBigFiveAgreeableness(0);
+        dto.setBigFiveNeuroticism(0);
+        dto.setEmotionEmotion(0);
+        dto.setEmotionResilience(0);
+        dto.setEmotionStressCoping(0);
+        dto.setEmotionSelfAwareness(0);
+        dto.setDriveAutonomy(0);
+        dto.setDriveCompetence(0);
+        dto.setDriveRelatedness(0);
+        dto.setSelfConceptOverall(0);
+        // 旧字段兼容
+        dto.setHeartEmotionStable(0);
+        dto.setHeartUnderstanding(0);
+        dto.setHeartLegacy(0);
+    }
+
+    /** 心13维 — 孩子版:从 DAN 报告取大五+EMI,从 structuredAnalysis 取自驱力+自我概念 */
+    private void setMindSubDimensionsForChild(MemberEnergyDTO dto, FamilyMember child) {
+        DanAssessmentResult dan = findLatestDanResult(child.getId());
+        if (dan != null) {
+            // 大五人格(5维)
+            dto.setBigFiveOpenness(safeScore(dan.getOpennessScore()));
+            dto.setBigFiveConscientiousness(safeScore(dan.getConscientiousnessScore()));
+            dto.setBigFiveExtraversion(safeScore(dan.getExtraversionScore()));
+            dto.setBigFiveAgreeableness(safeScore(dan.getAgreeablenessScore()));
+            dto.setBigFiveNeuroticism(safeScore(dan.getNeuroticismScore()));
+
+            // 情绪稳定(4维)
+            dto.setEmotionEmotion(safeScore(dan.getEmotionScore()));
+            dto.setEmotionResilience(safeScore(dan.getResilienceScore()));
+            dto.setEmotionStressCoping(safeScore(dan.getStressCopingScore()));
+            dto.setEmotionSelfAwareness(safeScore(dan.getSelfAwarenessScore()));
+
+            // 自驱力(3维)+ 自我概念(1维)— 从 structuredAnalysis JSON 解析
+            Map<String, Object> analysis = parseStructuredAnalysis(dan.getStructuredAnalysis());
+            if (analysis != null) {
+                dto.setDriveAutonomy(getIntFromAnalysis(analysis, "selfDriving_autonomy"));
+                dto.setDriveCompetence(getIntFromAnalysis(analysis, "selfDriving_competence"));
+                dto.setDriveRelatedness(getIntFromAnalysis(analysis, "selfDriving_relatedness"));
+                dto.setSelfConceptOverall(getIntFromAnalysis(analysis, "selfConcept_overall"));
+            }
+        }
+        // 旧字段兼容
+        dto.setHeartEmotionStable(dto.getEmotionEmotion() != null ? dto.getEmotionEmotion() : 0);
+        dto.setHeartUnderstanding(dto.getBigFiveAgreeableness() != null ? dto.getBigFiveAgreeableness() : 0);
+        dto.setHeartLegacy(0);
+    }
+
+    /** 行6维 — 家长版:初期全部回0,后续由自检问卷填充 */
+    private void setActionSubDimensionsForParent(MemberEnergyDTO dto) {
+        dto.setActionParentChild(0);
+        dto.setActionMarital(0);
+        dto.setActionParental(0);
+        dto.setActionLeadership(0);
+        dto.setActionSociality(0);
+        dto.setActionInterpersonal(0);
+    }
+
+    /** 行6维 — 孩子版:初期全部回0,后续由自检问卷填充 */
+    private void setActionSubDimensionsForChild(MemberEnergyDTO dto) {
+        dto.setActionChildParentChild(0);
+        dto.setActionSibling(0);
+        dto.setActionRelative(0);
+        dto.setActionTeacherStudent(0);
+        dto.setActionChildSociality(0);
+        dto.setActionChildInterpersonal(0);
+    }
+
+    /** 智·成长型思维 — 家长版:暂无数据,回0 */
+    private void setWisdomSubDimensionsForParent(MemberEnergyDTO dto) {
+        dto.setWisdomGrowthMindset(0);
+    }
+
+    /** 智·成长型思维 — 孩子版:从 DAN structuredAnalysis 解析 */
+    private void setWisdomSubDimensionsForChild(MemberEnergyDTO dto, FamilyMember child) {
+        DanAssessmentResult dan = findLatestDanResult(child.getId());
+        if (dan != null) {
+            Map<String, Object> analysis = parseStructuredAnalysis(dan.getStructuredAnalysis());
+            if (analysis != null) {
+                dto.setWisdomGrowthMindset(getIntFromAnalysis(analysis, "growthMindset_overall"));
+            }
+        }
+    }
+
+    /** 富·家族传承 — 家长版:初期回0,后续由自检问卷填充 */
+    private void setWealthSubDimensionsForParent(MemberEnergyDTO dto) {
+        dto.setWealthLegacy(0);
+    }
+
+    /** 富·家族传承 — 孩子版:初期回0,后续由自检问卷填充 */
+    private void setWealthSubDimensionsForChild(MemberEnergyDTO dto) {
+        dto.setWealthChildLegacy(0);
+    }
+
+    /** 从 structuredAnalysis JSON 中提取整数分值 */
+    private Integer getIntFromAnalysis(Map<String, Object> analysis, String key) {
+        if (analysis == null) return 0;
+        Object val = analysis.get(key);
+        if (val instanceof Number) return ((Number) val).intValue();
+        if (val instanceof String) {
+            try { return Integer.parseInt((String) val); } catch (NumberFormatException e) { return 0; }
+        }
+        return 0;
+    }
+
+    /** 解析 structuredAnalysis JSON(使用 fastjson) */
+    @SuppressWarnings("unchecked")
+    private Map<String, Object> parseStructuredAnalysis(String json) {
+        if (json == null || json.isEmpty()) return null;
+        try {
+            return JSON.parseObject(json, Map.class);
+        } catch (Exception e) {
+            log.warn("解析 structuredAnalysis 失败: {}", e.getMessage());
+            return null;
+        }
+    }
 
     /**
      * 计算指定成员的任务完成率得分 (0-100)