|
|
@@ -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)
|