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

docs: 五维测评客观化系统设计与开发计划(方法矩阵/计分算法/任务分解 P0-P2)

asus 2 недель назад
Родитель
Сommit
bd8daf1d9c

+ 148 - 0
docs/class-diagram.mermaid

@@ -0,0 +1,148 @@
+classDiagram
+    %% ===== 现有(复用/改造)=====
+    class EnergyDimension {
+        +Long id
+        +String code
+        +String name
+        +String icon
+        +String element
+        +Integer status
+    }
+    class EnergyService {
+        +Map~String,Object~ getOverview(Long memberId)
+    }
+    class HealthDimensionVO {
+        +Long memberId
+        +BigDecimal healthIndex
+        +BigDecimal confidence
+        +List~DimensionItem~ dimensions
+        +Date updateTime
+        +Boolean isAverage
+    }
+    class DimensionItem {
+        +String dimension
+        +String label
+        +BigDecimal score
+        +Integer percentile
+        +String dataSource
+        +Integer tier
+        +String level
+        +BigDecimal confidence
+        +String dataSources
+        +Integer sampleSize
+        +String layerBreakdown
+    }
+
+    %% ===== 新增实体 =====
+    class AssessmentMetric {
+        +Long id
+        +String metricCode
+        +String dimension
+        +String layer
+        +BigDecimal weight
+        +String direction
+        +String normStrategy
+        +BigDecimal requiredSample
+        +String status
+    }
+    class AssessmentMetricNorm {
+        +Long id
+        +String metricCode
+        +String gender
+        +Integer ageMinMonths
+        +Integer ageMaxMonths
+        +BigDecimal mean
+        +BigDecimal sd
+        +Integer p05
+        +Integer p50
+        +Integer p95
+    }
+    class DimensionMeasure {
+        +Long id
+        +Long childId
+        +String metricCode
+        +String dimension
+        +String layer
+        +BigDecimal rawValue
+        +String sourceType
+        +String device
+        +BigDecimal qualityScore
+        +String modelVersion
+        +Date measureTime
+        +Integer validFlag
+    }
+    class DimensionScore {
+        +Long id
+        +Long childId
+        +String dimension
+        +BigDecimal score
+        +BigDecimal confidence
+        +Integer sampleSize
+        +String dataSources
+        +String layerBreakdown
+        +Date computedAt
+    }
+    class HealthIndexSnapshot {
+        +Long id
+        +Long childId
+        +BigDecimal totalHealthIndex
+        +String dimensionJson
+        +BigDecimal confidence
+        +Date computedAt
+    }
+    class AssessmentReviewLog {
+        +Long id
+        +Long measureId
+        +String reviewType
+        +String result
+        +Long reviewerId
+        +Date reviewedAt
+    }
+
+    %% ===== 服务 / DTO =====
+    class ScoringAlgorithm {
+        +double dPrime(hits, fa, n)
+        +double beta(hr, far)
+        +double tScore(x, mean, sd, direction)
+        +double aggregateDimension(items, norms)
+        +double icc(sources)
+        +double confidence(completeness, consistency)
+        +Map renormalizeWeights(missing)
+    }
+    class NormService {
+        +AssessmentMetricNorm getNorm(metricCode, gender, ageMonths)
+    }
+    class DimensionMeasureService {
+        +Result submit(MeasureSubmitRequest)
+        +List~DimensionMeasure~ list(childId, dimension)
+    }
+    class DimensionScoreService {
+        +DimensionScore compute(childId, dimension)
+        +DimensionScoreVO getLatest(childId, dimension)
+    }
+    class HealthIndexService {
+        +HealthIndexSnapshot compute(childId)
+        +HealthIndexVO getLatest(childId)
+    }
+    class DimensionAssessmentController {
+        +Result submitMeasures()
+        +Result getDimensionScore()
+        +Result getHealthIndex()
+        +Result recompute()
+    }
+
+    %% ===== 关系 =====
+    AssessmentMetric "1" --> "0..*" AssessmentMetricNorm : 定义常模
+    DimensionMeasure --> AssessmentMetric : 归属指标(metricCode)
+    DimensionMeasureService ..> DimensionMeasure : CRUD
+    DimensionScoreService ..> DimensionMeasure : 聚合
+    DimensionScoreService ..> NormService : 取常模
+    DimensionScoreService ..> ScoringAlgorithm : 计分
+    HealthIndexService ..> DimensionScoreService : 取五维分
+    HealthIndexService ..> ScoringAlgorithm : 聚合
+    DimensionAssessmentController ..> DimensionMeasureService
+    DimensionAssessmentController ..> DimensionScoreService
+    DimensionAssessmentController ..> HealthIndexService
+    EnergyService ..> HealthIndexService : 读取快照(替换healthIndex=0)
+    HealthDimensionVO *-- DimensionItem
+    EnergyService ..> HealthDimensionVO : 组装

+ 53 - 0
docs/sequence-diagram.mermaid

@@ -0,0 +1,53 @@
+sequenceDiagram
+    participant Mini as 小程序(五维详情页)
+    participant Ctrl as DimensionAssessmentController
+    participant MS as DimensionMeasureService
+    participant LG as cfc-langgraph(AI)
+    participant DSS as DimensionScoreService
+    participant NS as NormService
+    participant SA as ScoringAlgorithm
+    participant HIS as HealthIndexService
+    participant ES as EnergyService
+    participant VO as HealthDimensionVO
+
+    Note over Mini,LG: ① 采集(L1 行为 / L2 机器提取)
+    Mini->>Mini: 玩游戏/拍舌/拍脸(game-wrapper 记录反应时、hits/false-alarms)
+    Mini->>LG: 上传舌象/人脸(POST /api/v1/tongue|emotion)
+    LG-->>Mini: 结构化结果(概率/质量评分/帧数)
+    Mini->>Ctrl: POST /api/assessment/measure/submit (含 rawValue/quality/modelVersion/measureTime)
+    Ctrl->>MS: submit(request)
+    MS->>MS: 校验时间戳(防补填)+质量门禁(不达标拒收)
+    MS-->>Ctrl: Result<Void> (落 DimensionMeasure)
+
+    Note over Ctrl,HIS: ② 计分 → 维度分
+    Mini->>Ctrl: POST /api/assessment/dimension-score/get {childId, dimension}
+    Ctrl->>DSS: compute(childId, dimension)
+    DSS->>MS: list(measures of dimension)
+    loop 每个指标 metric
+        DSS->>NS: getNorm(metricCode, gender, ageMonths)
+        NS-->>DSS: AssessmentMetricNorm(mean, sd)
+        DSS->>SA: tScore(raw, mean, sd, direction)  %% 负向(反应时/错误)取100-T
+        DSS->>SA: dPrime(hits, fa) / beta(hr, far)  %% 游戏类用 d′,β 异常降权
+    end
+    DSS->>SA: aggregateDimension(items)  %% Σ(w·c·T)/Σ(w·c),缺失源重归一化
+    SA->>SA: icc(sources) → 一致性系数(1/0.8/0.6)
+    SA->>SA: confidence(完整度均值 × 一致性)
+    DSS->>DSS: 落 DimensionScore 快照(含 confidence/sampleSize/dataSources)
+    DSS-->>Ctrl: DimensionScoreVO
+    Ctrl-->>Mini: Result<DimensionScoreVO>
+
+    Note over Mini,VO: ③ 维度分 → 五维健康指数 → getOverview
+    Mini->>Ctrl: POST /api/assessment/health-index/get {childId}
+    Ctrl->>HIS: compute(childId)
+    HIS->>DSS: 取五维 DimensionScore
+    HIS->>SA: 总健康指数 = Σ(维度分×权重)/Σ(权重)  %% 默认等权,配置表可调
+    HIS->>HIS: 落 HealthIndexSnapshot
+    HIS-->>Ctrl: HealthIndexVO
+    Ctrl-->>Mini: Result<HealthIndexVO>
+
+    Note over Mini,VO: ④ 五维概览页(对接现有 getOverview)
+    Mini->>ES: getOverview(memberId)
+    ES->>HIS: getLatest(childId)  %% 替换原 healthIndex=0
+    HIS-->>ES: 各维 score + confidence
+    ES->>VO: 组装 HealthDimensionVO(DimensionItem.healthIndex/confidence/dataSources)
+    ES-->>Mini: 五维概览(分数+置信度随报告展示)

+ 492 - 0
docs/五维测评开发计划.md

@@ -0,0 +1,492 @@
+# 五维测评客观化系统 —— 开发计划(软件实现方案)
+
+> 版本: v1.0
+> 日期: 2026-10-25
+> 编写: 架构师 Bob(software-architect)
+> 上游依据: `docs/五维测评方法设计_客观化方案.md`、`docs/舌诊情绪识别_技术选型.md`、`docs/assessment-market-plan.md`、`AGENTS.md`
+> 目标: 把"五维分数从填出来的"变成"测出来的",并落地到 `EnergyService.getOverview()` 当前写死的 `healthIndex = 0`。
+
+---
+
+## 一、实现方案
+
+### 1.1 核心技术难点
+
+| 难点 | 说明 | 应对策略 |
+|------|------|---------|
+| **客观计分 vs 自陈填分** | 现有五维多为人工录入/自评,信效度弱 | 引入三层数据模型(L1 行为痕迹 / L2 机器提取 / L3 自陈),单维度内 L1 0.50 / L2 0.30 / L3 0.20 归一化加权;自陈单维度权重上限 40% |
+| **能力与作答倾向混在一起** | 正确率 = 能力 + 倾向(保守/激进/讨好) | 凡有客观对错的游戏/判断任务统一用信号检测论 **d′** 计分,同时输出 **β** 作为作答倾向指标,\|logβ\| 超常模 2SD 降权或标记复核 |
+| **单一数据源不可信** | 任一指标单源即出分风险高 | 多源三角验证:同一指标 ≥2 个独立源且一致性达标(ICC≥0.60 或 \|r\|≥0.40)才计入,否则标"待补充"而非给 0 |
+| **缺失数据补 0 失真** | 缺数据源硬补 0 会系统性拉低 | 缺失数据源从分母剔除(权重重新归一化),同时下调置信度 |
+| **年龄/经验混淆** | 低龄被低估、高龄被高估,游戏经验干扰 | 年龄分段常模(`CognitiveNorm` 已存在,复用其模式扩展全维度);游戏经验、性别作协变量;结果以 T 分呈现 |
+| **healthIndex 写死** | `EnergyService.getOverview()` L1818 `healthIndex = 0` | 新增"维度分+五维健康指数"计算服务,读时/事件触发计算并落快照,`getOverview` 改为读取快照(见 3.4 / 4 / 7) |
+| **合规红线(医疗/心理诊断、未成年人敏感信息、AI 复核)** | 见第十节 | 全部文案定位"健康/成长参考";未成年人人脸/声纹需监护人单独明示同意、默认不存原始照片;AI 结果 5% 抽样 + 异常全检;绘画仅形式要素评分 |
+
+### 1.2 框架 / 库选型(严格沿用现有栈,不擅自换栈)
+
+| 层 | 现有技术栈 | 本方案沿用/新增 | 理由 |
+|----|-----------|----------------|------|
+| 后端 | Spring Boot 2.7.18 + MyBatis-Plus + Java 8,端口 9082 | **不换栈**;新增纯 Java 实现的 `ScoringAlgorithm`(d′/β/T 分/ICC/权重重归一化) | 不引入统计库依赖风险;d′/β/T 分/ICC(2,1) 公式均为可手写的小函数;如需 percentile 可轻量自实现 |
+| 接口规范 | 统一 `@PostMapping` + `Result<T>` + JWT Bearer + `@Resource` 注入 | **全部沿用** | 与现有 controller/service 风格一致,降低联调成本 |
+| 前端 | uni-app 微信小程序 Vue2 Options API | **不换栈**;新增 `components/assessment/*` 复用型组件;游戏用 Canvas 自研,不引重型库 | 小程序禁用可选链/Grid/`:key` 表达式/`new Date(string)`,组件需保守写法 |
+| AI 服务 | cfc-langgraph(Python FastAPI,端口 9000,LangGraph) | **不换栈**;复用已有 `tongue` 端点;新增 `emotion` 端点(DeepFace)+ 舌象质量门禁节点 | 选型文档已论证:舌诊 MVP 用 TongueDiagnosis.AI、情绪用 DeepFace 服务端,直接封装为 LangGraph 节点 |
+| 常模数据 | `CognitiveNorm`(cognitive_norms 表,已存在) | **复用模式并扩展**为 `assessment_metric_norms` 全维度通用常模表 | 已有 age/gender 分段 + 百分位结构,避免重复造轮子 |
+
+> 不引入任何新主框架;统计与图表均用现有或手写实现,保证 Java 8 / Vue2 兼容性。
+
+### 1.3 架构模式
+
+- **分层架构(沿用)**:controller(接口)→ service(业务/计分)→ mapper(MyBatis-Plus)→ entity,与现有 `EnergyService`/`DanAssessmentController` 一致。
+- **无状态计分引擎**:`ScoringAlgorithm` 为纯函数工具类(d′/β/T 分/权重重归一化/ICC/三角验证),不持有状态,便于单测。
+- **"采集—快照"分离(compute-on-read + 快照缓存)**:原始测量点(`DimensionMeasure`)实时落库;维度分与五维健康指数在"提交后"或"读 `getOverview` 时"按需计算,并落 `DimensionScore` / `HealthIndexSnapshot` 快照,避免每次读全量重算;快照带 `computedAt` 与置信度,报告随附展示。
+- **适配器模式对接 AI**:后端经 `AiGateway` 调 cfc-langgraph,返回结构化结果(仅结构化,不存原始人脸/舌象照片),由 `DimensionMeasureService` 落库。
+
+---
+
+## 二、文件清单(相对路径)
+
+> 根目录约定:`cfc-backend/`、`cfc-frontend/`、`cfc-langgraph/`。Java 包根:`com/etotem/cfc/`。
+
+### 2.1 后端 cfc-backend(新增/修改)
+
+| 类型 | 路径 | 说明 |
+|------|------|------|
+| entity | `src/main/java/com/etotem/cfc/entity/AssessmentMetric.java` | 指标目录(code/dimension/layer/weight/direction/normStrategy/status) |
+| entity | `src/main/java/com/etotem/cfc/entity/AssessmentMetricNorm.java` | 全维度常模表(复用 CognitiveNorm 模式) |
+| entity | `src/main/java/com/etotem/cfc/entity/DimensionMeasure.java` | 原子测量记录(L1/L2/L3 原始数据点) |
+| entity | `src/main/java/com/etotem/cfc/entity/DimensionScore.java` | 维度分快照(score/confidence/sampleSize/dataSources/layerBreakdown) |
+| entity | `src/main/java/com/etotem/cfc/entity/HealthIndexSnapshot.java` | 五维健康指数快照(totalHealthIndex + 五维 JSON + confidence) |
+| entity | `src/main/java/com/etotem/cfc/entity/AssessmentReviewLog.java` | AI 结果人工复核抽样留痕(合规红线 3) |
+| mapper | `src/main/java/com/etotem/cfc/mapper/{AssessmentMetric,AssessmentMetricNorm,DimensionMeasure,DimensionScore,HealthIndexSnapshot,AssessmentReviewLog}Mapper.java` | MyBatis-Plus Mapper |
+| service | `src/main/java/com/etotem/cfc/service/ScoringAlgorithm.java` | **核心计分算法**(d′/β/T 分/权重重归一化/ICC/三角验证/置信度) |
+| service | `src/main/java/com/etotem/cfc/service/NormService.java` | 常模查询(按 metricCode+age+gender) |
+| service | `src/main/java/com/etotem/cfc/service/DimensionMeasureService.java` | 测量点提交/查询/校验(质量门禁、时间戳防补填) |
+| service | `src/main/java/com/etotem/cfc/service/DimensionScoreService.java` | 维度分计算与落库 |
+| service | `src/main/java/com/etotem/cfc/service/HealthIndexService.java` | 五维健康指数计算与快照 |
+| service | `src/main/java/com/etotem/cfc/service/BehaviorTraceCollector.java` | **行维度**:从现有任务/打卡/互动日志汇聚 L1 测量点 |
+| service | `src/main/java/com/etotem/cfc/service/CatIrtService.java` | **心维度 L3**:CAT/IRT 计分 + M 题/重复题校验 |
+| controller | `src/main/java/com/etotem/cfc/controller/DimensionAssessmentController.java` | 测评采集/查询/重算接口(@PostMapping + Result<T>) |
+| controller | `src/main/java/com/etotem/cfc/controller/AssessmentReviewController.java` | 人工复核抽样接口 |
+| dto | `src/main/java/com/etotem/cfc/dto/MeasureSubmitRequest.java` | 批量提交请求(childId + MeasureItem[]) |
+| dto | `src/main/java/com/etotem/cfc/dto/MeasureItem.java` | 单条测量(metricCode/rawValue/device/quality/modelVersion/sourceType/timestamp) |
+| dto | `src/main/java/com/etotem/cfc/dto/DimensionScoreVO.java` | 维度分 VO(含 confidence/dataSources/sampleSize/layerBreakdown) |
+| dto | `src/main/java/com/etotem/cfc/dto/HealthIndexVO.java` | 五维健康指数 VO |
+| dto(改) | `src/main/java/com/etotem/cfc/dto/HealthDimensionVO.java` | 扩展 `DimensionItem`:新增 `confidence`、`dataSources`、`sampleSize`、`layerBreakdown`;VO 顶层新增 `confidence` |
+| service(改) | `src/main/java/com/etotem/cfc/service/EnergyService.java` | `getOverview()` L1818/L1825 由写死 0 改为读取 `HealthIndexService` 快照 |
+| db(改) | `src/main/resources/schema.sql`(或现有迁移机制) | 上述 6 张新表 + `HealthDimensionVO` 无需改表(仅 VO) |
+
+### 2.2 前端 cfc-frontend(新增/修改)
+
+| 类型 | 路径 | 说明 |
+|------|------|------|
+| 组件 | `components/assessment/dimension-score-card.vue` | 维度分卡片(分数+置信度+数据源) |
+| 组件 | `components/assessment/metric-item.vue` | 单指标 T 分/来源展示 |
+| 组件 | `components/assessment/confidence-badge.vue` | 置信度徽标;低置信度文案"样本不足,仅供参考" |
+| 组件 | `components/assessment/game-wrapper.vue` | 可复用游戏外壳(记录反应时、采集 d′ 所需 hits/false-alarms、禁用可选链) |
+| 组件 | `components/assessment/tongue-capture.vue` | 舌象拍摄→调 langgraph→显示质量评分 |
+| 组件 | `components/assessment/emotion-capture.vue` | 人脸/短视频拍摄→调 langgraph→多帧中位数情绪 |
+| 页面(改) | `pages/body-detail/index.vue`、`health-dimensions.vue`、`health-report.vue`、`checkin.vue`、`dimension-detail.vue` | 身维度指标展示 + 体能/饮食入口 + 舌诊入口 |
+| 页面(改) | `pages/mind-detail/index.vue`、`emotion-checkin.vue`、`screening.vue`、`traditional-mirror.vue` | 心维度:情绪识别入口 + CAT 量表 + 置信度 |
+| 页面(改) | `pages/wisdom-detail/index.vue` | 智维度:聚合认知游戏入口 |
+| 页面(改) | `pages/cognitive-test/{memory-test,logic-test,perception-test,spatial-test,speed-test,language-test}.vue` | 改造为提交 d′/RT/ICV 测量点 |
+| 页面(改) | `pages/games/{schulte,sudoku,1a2b}.vue`(及新增 `corsi.vue`、`nback.vue`、`stroop.vue`、`tower.vue`、`ravens.vue`) | 改造/新增为提交测量点 |
+| 页面(改) | `pages/action-detail/index.vue` | 行维度:行为痕迹(完成率/打卡时间戳/streak/互动频次)展示 |
+| 页面(改) | `pages/wealth-detail/member-wealth-detail.vue`、`pages/wealth-cf/*` | 富维度:财商情境+资源分配+真实 CF 流水 |
+| 页面(改) | `pages/energy/*`(五维概览页) | 读取 `getOverview` 新 healthIndex + 置信度 |
+
+### 2.3 AI 服务 cfc-langgraph(新增/修改)
+
+| 类型 | 路径 | 说明 |
+|------|------|------|
+| agent(改) | `app/agents/tongue_agent.py` | 增加**图像质量门禁**节点(光照/白平衡校正 + 质量评分),质量不达标拒测 |
+| node(新) | `app/nodes/tongue_quality_node.py` | 色卡/白平衡校正 + 质量评分(0-100) |
+| agent(新) | `app/agents/emotion_agent.py` | DeepFace 封装;短视频按 200ms 抽帧、去首 0.5s、取情绪概率中位数 + 变异度 |
+| graph(新) | `app/graphs/emotion_graph.py` | EmotionGraph:preprocess → classify → aggregate(median) |
+| api(新) | `app/api/emotion.py` | `POST /api/v1/emotion/analyze`(返回主导情绪 + 各情绪概率 + 帧数 + 变异度) |
+| model(新) | `app/models/emotion.py` | 请求/响应 Pydantic 模型 |
+| api(改) | `app/api/tongue.py` | `/tongue/diagnose` 返回中追加 `qualityScore` 字段 |
+
+---
+
+## 三、数据结构与接口
+
+### 3.1 类图(Mermaid classDiagram)
+
+```mermaid
+classDiagram
+    %% ===== 现有(复用/改造)=====
+    class EnergyDimension {
+        +Long id
+        +String code
+        +String name
+        +String icon
+        +String element
+        +Integer status
+    }
+    class EnergyService {
+        +Map~String,Object~ getOverview(Long memberId)
+    }
+    class HealthDimensionVO {
+        +Long memberId
+        +BigDecimal healthIndex
+        +BigDecimal confidence
+        +List~DimensionItem~ dimensions
+        +Date updateTime
+        +Boolean isAverage
+    }
+    class DimensionItem {
+        +String dimension
+        +String label
+        +BigDecimal score
+        +Integer percentile
+        +String dataSource
+        +Integer tier
+        +String level
+        +BigDecimal confidence
+        +String dataSources
+        +Integer sampleSize
+        +String layerBreakdown
+    }
+
+    %% ===== 新增实体 =====
+    class AssessmentMetric {
+        +Long id
+        +String metricCode
+        +String dimension
+        +String layer
+        +BigDecimal weight
+        +String direction
+        +String normStrategy
+        +BigDecimal requiredSample
+        +String status
+    }
+    class AssessmentMetricNorm {
+        +Long id
+        +String metricCode
+        +String gender
+        +Integer ageMinMonths
+        +Integer ageMaxMonths
+        +BigDecimal mean
+        +BigDecimal sd
+        +Integer p05
+        +Integer p50
+        +Integer p95
+    }
+    class DimensionMeasure {
+        +Long id
+        +Long childId
+        +String metricCode
+        +String dimension
+        +String layer
+        +BigDecimal rawValue
+        +String sourceType
+        +String device
+        +BigDecimal qualityScore
+        +String modelVersion
+        +Date measureTime
+        +Integer validFlag
+    }
+    class DimensionScore {
+        +Long id
+        +Long childId
+        +String dimension
+        +BigDecimal score
+        +BigDecimal confidence
+        +Integer sampleSize
+        +String dataSources
+        +String layerBreakdown
+        +Date computedAt
+    }
+    class HealthIndexSnapshot {
+        +Long id
+        +Long childId
+        +BigDecimal totalHealthIndex
+        +String dimensionJson
+        +BigDecimal confidence
+        +Date computedAt
+    }
+    class AssessmentReviewLog {
+        +Long id
+        +Long measureId
+        +String reviewType
+        +String result
+        +Long reviewerId
+        +Date reviewedAt
+    }
+
+    %% ===== 服务 / DTO =====
+    class ScoringAlgorithm {
+        +double dPrime(hits, fa, n)~ 
+        +double beta(hr, far)~ 
+        +double tScore(x, mean, sd, direction)~ 
+        +double aggregateDimension(items, norms)~ 
+        +double icc(sources)~ 
+        +double confidence(completeness, consistency)~ 
+        +Map renormalizeWeights(missing)~ 
+    }
+    class NormService {
+        +AssessmentMetricNorm getNorm(metricCode, gender, ageMonths)
+    }
+    class DimensionMeasureService {
+        +Result submit(MeasureSubmitRequest)
+        +List~DimensionMeasure~ list(childId, dimension)
+    }
+    class DimensionScoreService {
+        +DimensionScore compute(childId, dimension)
+        +DimensionScoreVO getLatest(childId, dimension)
+    }
+    class HealthIndexService {
+        +HealthIndexSnapshot compute(childId)
+        +HealthIndexVO getLatest(childId)
+    }
+    class DimensionAssessmentController {
+        +Result submitMeasures()
+        +Result getDimensionScore()
+        +Result getHealthIndex()
+        +Result recompute()
+    }
+
+    %% ===== 关系 =====
+    AssessmentMetric "1" --> "0..*" AssessmentMetricNorm : 定义常模
+    DimensionMeasure --> AssessmentMetric : 归属指标(metricCode)
+    DimensionMeasureService ..> DimensionMeasure : CRUD
+    DimensionScoreService ..> DimensionMeasure : 聚合
+    DimensionScoreService ..> NormService : 取常模
+    DimensionScoreService ..> ScoringAlgorithm : 计分
+    HealthIndexService ..> DimensionScoreService : 取五维分
+    HealthIndexService ..> ScoringAlgorithm : 聚合
+    DimensionAssessmentController ..> DimensionMeasureService
+    DimensionAssessmentController ..> DimensionScoreService
+    DimensionAssessmentController ..> HealthIndexService
+    EnergyService ..> HealthIndexService : 读取快照(替换healthIndex=0)
+    HealthDimensionVO *-- DimensionItem
+    EnergyService ..> HealthDimensionVO : 组装
+```
+
+### 3.2 关键 API 定义(沿用 `@PostMapping` + `Result<T>` + JWT)
+
+> 统一前缀建议 `/api/assessment/*`;响应统一 `Result<T>`;鉴权统一 JWT Bearer;依赖注入统一 `@Resource`。
+
+| 端点 | 请求体(摘要) | 响应 `Result<T>` | 说明 |
+|------|--------------|-----------------|------|
+| `POST /api/assessment/measure/submit` | `MeasureSubmitRequest{ childId, items: MeasureItem[]{ metricCode, rawValue, sourceType, device, qualityScore, modelVersion, measureTime } }` | `Result<Void>` | 批量提交 L1/L2/L3 测量点;服务端校验时间戳(防补填)、质量门禁(舌/脸 qualityScore 不达标拒收) |
+| `POST /api/assessment/measure/list` | `{ childId, dimension }` | `Result<List<DimensionMeasure>>` | 查询某维度全部测量点(含来源/质量/模型版本,留痕) |
+| `POST /api/assessment/dimension-score/get` | `{ childId, dimension }` | `Result<DimensionScoreVO>` | 取最新维度分(score/confidence/sampleSize/dataSources/layerBreakdown);无数据返回"待补充" |
+| `POST /api/assessment/health-index/get` | `{ childId }` | `Result<HealthIndexVO>` | 取五维健康指数 + 各维分 + 总置信度 |
+| `POST /api/assessment/recompute` | `{ childId }` (规划师/系统) | `Result<HealthIndexVO>` | 触发重算并刷新快照 |
+| `POST /api/assessment/review/sample` | `{ childId, dimension }` | `Result<AssessmentReviewLog>` | AI 结果人工复核抽样(合规红线 3) |
+| `POST /api/v1/emotion/analyze` (langgraph) | `multipart: 人脸/短视频` | `{ code, data:{ dominant, probabilities, frameCount, variance } }` | DeepFace 多帧中位数情绪(去首 0.5s) |
+| `POST /api/v1/tongue/diagnose` (langgraph, 已存在) | `multipart: 舌象` | 增加 `qualityScore` 字段 | 舌色/苔色/苔厚/苔腻 4 维概率 + 质量评分 |
+
+> 小程序侧所有调用走统一 request 封装(JWT 注入),游戏/量表/AI 结果最终都收敛到 `measure/submit`。
+
+---
+
+## 四、程序调用流程(Mermaid sequenceDiagram)
+
+> 关键链路:**一次测评从采集 → 计分 → 维度分 → 五维健康指数** 的完整闭环(以"智维度认知游戏 + 心维度情绪识别"为例)。
+
+```mermaid
+sequenceDiagram
+    participant Mini as 小程序(五维详情页)
+    participant Ctrl as DimensionAssessmentController
+    participant MS as DimensionMeasureService
+    participant LG as cfc-langgraph(AI)
+    participant DSS as DimensionScoreService
+    participant NS as NormService
+    participant SA as ScoringAlgorithm
+    participant HIS as HealthIndexService
+    participant ES as EnergyService
+    participant VO as HealthDimensionVO
+
+    Note over Mini,LG: ① 采集(L1 行为 / L2 机器提取)
+    Mini->>Mini: 玩游戏/拍舌/拍脸(game-wrapper 记录反应时、hits/false-alarms)
+    Mini->>LG: 上传舌象/人脸(POST /api/v1/tongue|emotion)
+    LG-->>Mini: 结构化结果(概率/质量评分/帧数)
+    Mini->>Ctrl: POST /api/assessment/measure/submit (含 rawValue/quality/modelVersion/measureTime)
+    Ctrl->>MS: submit(request)
+    MS->>MS: 校验时间戳(防补填)+质量门禁(不达标拒收)
+    MS-->>Ctrl: Result<Void> (落 DimensionMeasure)
+
+    Note over Ctrl,HIS: ② 计分 → 维度分
+    Mini->>Ctrl: POST /api/assessment/dimension-score/get {childId, dimension}
+    Ctrl->>DSS: compute(childId, dimension)
+    DSS->>MS: list(measures of dimension)
+    loop 每个指标 metric
+        DSS->>NS: getNorm(metricCode, gender, ageMonths)
+        NS-->>DSS: AssessmentMetricNorm(mean, sd)
+        DSS->>SA: tScore(raw, mean, sd, direction)  %% 负向(反应时/错误)取100-T
+        DSS->>SA: dPrime(hits, fa) / beta(hr, far)  %% 游戏类用 d′,β 异常降权
+    end
+    DSS->>SA: aggregateDimension(items)  %% Σ(w·c·T)/Σ(w·c),缺失源重归一化
+    SA->>SA: icc(sources) → 一致性系数(1/0.8/0.6)
+    SA->>SA: confidence(完整度均值 × 一致性)
+    DSS->>DSS: 落 DimensionScore 快照(含 confidence/sampleSize/dataSources)
+    DSS-->>Ctrl: DimensionScoreVO
+    Ctrl-->>Mini: Result<DimensionScoreVO>
+
+    Note over Mini,VO: ③ 维度分 → 五维健康指数 → getOverview
+    Mini->>Ctrl: POST /api/assessment/health-index/get {childId}
+    Ctrl->>HIS: compute(childId)
+    HIS->>DSS: 取五维 DimensionScore
+    HIS->>SA: 总健康指数 = Σ(维度分×权重)/Σ(权重)  %% 默认等权,配置表可调
+    HIS->>HIS: 落 HealthIndexSnapshot
+    HIS-->>Ctrl: HealthIndexVO
+    Ctrl-->>Mini: Result<HealthIndexVO>
+
+    Note over Mini,VO: ④ 五维概览页(对接现有 getOverview)
+    Mini->>ES: getOverview(memberId)
+    ES->>HIS: getLatest(childId)  %% 替换原 healthIndex=0
+    HIS-->>ES: 各维 score + confidence
+    ES->>VO: 组装 HealthDimensionVO(DimensionItem.healthIndex/confidence/dataSources)
+    ES-->>Mini: 五维概览(分数+置信度随报告展示)
+```
+
+---
+
+## 五、任务分解(按 P0 / P1 / P2 阶段 + 模块)
+
+> 说明:本项目为多阶段、多模块(后端 + 前端 + AI 服务)工程,按"阶段 + 模块"合理拆分,目标清晰可执行;优先级与工期为估算,可随人力并行调整。所有任务严守第十节合规红线。
+
+### 5.1 P0(2–4 周,用现有资产,性价比最高)
+
+| Task ID | 名称 | 涉及文件(代表) | 依赖 | 优先级 | 预估工期 |
+|---------|------|----------------|------|--------|---------|
+| **T01** | 评分算法引擎与常模目录(公共库) | `ScoringAlgorithm.java`、`AssessmentMetric.java(+Mapper)`、`AssessmentMetricNorm.java(+Mapper)`、`NormService.java`、schema 迁移 | — | P0 | 1.5 周 |
+| **T02** | 客观测评数据接入层(measure 提交/查询) | `DimensionMeasure.java(+Mapper)`、`DimensionMeasureService.java`、`DimensionAssessmentController.java`、`MeasureSubmitRequest.java`、`MeasureItem.java`、schema | T01 | P0 | 1 周 |
+| **T03** | 维度分与五维健康指数计算 + 对接 `EnergyService.getOverview` + 扩展 `HealthDimensionVO` | `DimensionScore.java(+Mapper)`、`HealthIndexSnapshot.java(+Mapper)`、`DimensionScoreService.java`、`HealthIndexService.java`、`EnergyService.java`(改 L1818/L1825)、`HealthDimensionVO.java`(改)、`DimensionScoreVO.java`、`HealthIndexVO.java` | T01, T02 | P0 | 1 周 |
+| **T04** | 行为痕迹层(行维度 L1) | `BehaviorTraceCollector.java`、`pages/action-detail/index.vue`(改)、`components/assessment/metric-item.vue` | T02 | P0 | 0.5 周 |
+| **T05** | 舌诊 AI 接入(身维度 L2) | `app/agents/tongue_agent.py`(改质量门禁)、`app/nodes/tongue_quality_node.py`、`app/api/tongue.py`(改)、`components/assessment/tongue-capture.vue`、`pages/body-detail/*`(改) | T02 | P0 | 1 周 |
+| **T06** | 情绪识别 AI 接入(心维度 L2) | `app/agents/emotion_agent.py`、`app/graphs/emotion_graph.py`、`app/api/emotion.py`、`app/models/emotion.py`、`components/assessment/emotion-capture.vue`、`pages/mind-detail/emotion-checkin.vue`(改) | T02 | P0 | 1 周 |
+| **T07** | CAT/IRT 化量表(心维度 L3) | `CatIrtService.java`、`pages/mind-detail/screening.vue`(改)、`pages/mind-detail/traditional-mirror.vue`(改)、`components/assessment/dimension-score-card.vue` | T02 | P0 | 1 周 |
+| **T08** | 认知游戏 d′ 计量(智维度 L1) | `components/assessment/game-wrapper.vue`、`pages/cognitive-test/*`(改)、`pages/games/schulte.vue`、`pages/games/sudoku.vue`、`pages/games/1a2b.vue`、`pages/wisdom-detail/index.vue`(改) | T01, T02 | P0 | 1.5 周 |
+
+### 5.2 P1(1–2 月)
+
+| Task ID | 名称 | 涉及文件(代表) | 依赖 | 优先级 | 预估工期 |
+|---------|------|----------------|------|--------|---------|
+| **T09** | 智维度补全(瑞文矩阵自适应 + Stroop + 伦敦塔) | `pages/games/ravens.vue`、`stroop.vue`、`tower.vue`、`corsi.vue`、`nback.vue`、`ScoringAlgorithm`(新增 Stroop 干扰量/转换代价/ICV) | T08 | P1 | 2 周 |
+| **T10** | 富维度(财商情境任务 + 资源分配游戏 + 真实 CF 流水) | `pages/wealth-cf/*`(改)、`pages/wealth-detail/member-wealth-detail.vue`(改)、`DimensionMeasureService`(CF 读取适配) | T02 | P1 | 2 周 |
+| **T11** | 身维度补全(体能小测试 + 饮食拍照识别) | `pages/body-detail/checkin.vue`(改)、`pages/body-detail/dimension-detail.vue`(改)、langgraph `meal` 端点复用、`DimensionMeasure`(体能/膳食) | T02, T05 | P1 | 2 周 |
+| **T12** | 年龄分段常模建立与校准 | `AssessmentMetricNorm` 数据填充脚本、`NormService`(校准)、`CognitiveNorm`(复用) | T02(累积数据) | P1 | 持续(≥200 人/年龄组) |
+| **T13** | AI 人工复核抽样系统(合规红线 3) | `AssessmentReviewLog.java(+Mapper)`、`AssessmentReviewController.java`、`app`(复核回调) | T02, T03 | P1 | 1 周 |
+
+### 5.3 P2(3 月+)
+
+| Task ID | 名称 | 涉及文件(代表) | 依赖 | 优先级 | 预估工期 |
+|---------|------|----------------|------|--------|---------|
+| **T14** | 心维度深度:绘画 FEATS + 笔迹过程 | `pages/mind-detail/screening.vue`(扩展)、`ScoringAlgorithm`(Rasch/IRT 校准)、绘画采集组件 | T07 | P2 | 3 周 |
+| **T15** | 心维度深度:听故事说选择(DIT 式) | 故事选择/排序任务页、`CatIrtService`(三择一+排序一致性+M 题) | T07 | P2 | 2 周 |
+| **T16** | EMA + 被动感知(可选,额外授权) | 情绪日记/被动感知采集、`DimensionMeasure`(EMA) | T02 | P2 | 2 周 |
+| **T17** | 全维度 CAT 自适应 + 三角验证自动化 | `DimensionScoreService`(自动三角验证/ICC)、`CatIrtService`(全维度 CAT) | T03, T12 | P2 | 3 周 |
+
+> 说明:P0 阶段**不做绘画与故事**(T14/T15)——二者需标定样本与人工复核流程,成本高于收益,留待 P2。T13(AI 复核)虽列 P1,但须在任意 AI 自动出报告上线前就位(合规红线 3 为硬约束)。
+
+---
+
+## 六、共享约定(沿用项目约定)
+
+1. **接口规范**:全部 `@PostMapping`,响应统一 `Result<T>`;鉴权统一 JWT Bearer;后端依赖注入统一 `@Resource`(不用 `@Autowired`)。
+2. **五维详情页入口**:`body/mind/wisdom/action/wealth-detail`;各维度测评入口与指标展示清单挂在这五个页面。
+3. **healthIndex 对接**:`EnergyService.getOverview()` 中写死的 `healthIndex = 0` / `totalHealthIndex = 0` 必须替换为 `HealthIndexService` 快照读取;无数据时维度分返回"待补充"且 `confidence` 置低,不得硬给 0。
+4. **年龄分段常模**:所有 T 分必须按 `AssessmentMetricNorm`(ageMonths + gender 分段)计算;未满样本阈值时降权并下调置信度。
+5. **图像质量门禁**:舌象/人脸类 L2 数据,**服务端强制色卡/白平衡校正**并返回 `qualityScore`;质量不达标**拒测**(不给出低质量结论);默认**不存储原始照片**,仅存结构化结果(合规红线 2)。
+6. **置信度随报告展示**:所有维度分/健康指数必须展示 `confidence`;低置信度文案统一为"样本不足,仅供参考",不得给出确定性结论。
+7. **缺失数据源处理**:不补 0,从分母剔除并重新归一化权重,同时下调置信度(一致性系数:≥2 源且 ICC≥0.60=1.0 / ≥2 源 0.40–0.60=0.8 / 仅 1 源=0.6)。
+8. **表单/游戏防作弊**:行为痕迹记录**真实操作时间戳**,禁止允许补录过去日期的打卡;补录数据单独标记,不计入坚持类指标。
+9. **小程序编码约束**:禁用可选链(`?.`)、禁用 CSS Grid、`:key` 不得用表达式、禁用 `new Date(string)`;游戏与组件统一用 `components/assessment/game-wrapper.vue` 采集反应时/作答序列。
+10. **数据留痕(合规红线 5)**:每次测评记录施测时间、作答时长、设备、图像质量、模型版本,保证可复现可追溯;AI 结果 `AssessmentReviewLog` 抽样复核(5% 抽样 + 异常全检)。
+
+---
+
+## 七、任务依赖图(Mermaid graph)
+
+```mermaid
+graph TD
+    T01[T01 评分算法引擎与常模目录]
+    T02[T02 测评数据接入层]
+    T03[T03 维度分&五维健康指数+EnergyService对接]
+    T04[T04 行为痕迹层-行]
+    T05[T05 舌诊AI接入-身L2]
+    T06[T06 情绪识别AI接入-心L2]
+    T07[T07 CAT/IRT量表-心L3]
+    T08[T08 认知游戏d′计量-智L1]
+    T09[T09 智维度补全-瑞文/Stroop/伦敦塔]
+    T10[T10 富维度-财商/资源/CF]
+    T11[T11 身维度补全-体能/饮食]
+    T12[T12 年龄分段常模建立]
+    T13[T13 AI人工复核抽样系统]
+    T14[T14 绘画FEATS+笔迹]
+    T15[T15 听故事说选择DIT]
+    T16[T16 EMA+被动感知]
+    T17[T17 全维度CAT+三角验证自动化]
+
+    T01 --> T02
+    T01 --> T03
+    T01 --> T08
+    T02 --> T03
+    T02 --> T04
+    T02 --> T05
+    T02 --> T06
+    T02 --> T07
+    T02 --> T08
+    T02 --> T10
+    T02 --> T11
+    T02 --> T13
+    T02 --> T16
+    T08 --> T09
+    T03 --> T12
+    T03 --> T13
+    T03 --> T17
+    T07 --> T14
+    T07 --> T15
+    T12 --> T17
+    T05 --> T11
+
+    classDef p0 fill:#e6f7ff,stroke:#1890ff;
+    classDef p1 fill:#f6ffed,stroke:#52c41a;
+    classDef p2 fill:#fff7e6,stroke:#fa8c16;
+    class T01,T02,T03,T04,T05,T06,T07,T08 p0;
+    class T09,T10,T11,T12,T13 p1;
+    class T14,T15,T16,T17 p2;
+```
+
+---
+
+## 附录 A:计分核心公式速查(对接第七节)
+
+```
+# 信号检测论(游戏/判断类任务)
+d′  = Φ⁻¹(HR) − Φ⁻¹(FAR)                       # HR=命中率, FAR=虚报率;边界用 log-linear (+0.5/N) 修正
+c   = −(z_HR + z_FAR) / 2                        # 判定标准
+β   = exp(−d′ · c) = exp(d′·(z_HR+z_FAR)/2)      # 作答倾向;|logβ| 超常模 2SD → 降权/标记复核
+
+# 标准分(7.1)
+Z   = (x − μ_age) / σ_age
+T   = 50 + 10·Z          (正向指标)
+T   = 100 − (50 + 10·Z)  (负向指标:反应时/持续性错误等)
+
+# 维度分(7.2)
+维度分 = 100 × Σ(w_i · c_i · T_i) / Σ(w_i · c_i)
+  w_i : L1=0.50 / L2=0.30 / L3=0.20(维度内归一化;缺失源从分母剔除后重归一化)
+  c_i : 数据完整度系数 = min(1, 有效样本数 / 要求样本数)
+
+# 置信度(7.3)
+置信度 = 数据完整度均值 × 一致性系数
+一致性系数 = 1.0(≥2源且ICC≥0.60) / 0.8(≥2源但0.40–0.60) / 0.6(仅1源)
+
+# 五维健康指数(7.4)
+健康指数 = Σ(维度分 × 维度权重) / Σ(维度权重)    # 默认等权,配置表可调
+```
+
+## 附录 B:与现有系统对接点(确认)
+
+| 现有位置 | 本计划填补 |
+|---------|-----------|
+| `EnergyService.getOverview()` L1818 `healthIndex = 0` / L1825 `totalHealthIndex = 0` | T03 替换为 `HealthIndexService` 快照读取 |
+| `HealthDimensionVO.DimensionItem` | T03 扩展 `confidence`/`dataSources`/`sampleSize`/`layerBreakdown`;VO 顶层加 `confidence` |
+| DAN 维度 attention/focus/memory/logic/emotion | 归入**智**维度,由 T08/T09 游戏化行为计量替代现有人工录入(`DanAssessmentResult` 可作为历史数据源之一) |
+| `CognitiveNorm`(cognitive_norms) | T12 复用其 age/gender 分段 + 百分位模式,扩展为全维度 `AssessmentMetricNorm` |
+| `body/mind/wisdom/action/wealth-detail` 页面 | T04–T11 各维度测评入口与指标展示 |
+| `docs/舌诊情绪识别_技术选型.md` | T05/T06 直接沿用其选型(TongueDiagnosis.AI / DeepFace),不重复论证 |
+| `assessment-market-plan.md` 阶段三/四 | 本计划维度分可作为"方案生成引擎"的输入(consumes 维度分) |

+ 281 - 0
docs/五维测评方法设计_客观化方案.md

@@ -0,0 +1,281 @@
+# 五维测评方法设计 —— 客观化测量方案
+
+> 版本: v1.0
+> 日期: 2026-10-25
+> 状态: 待评审
+> 适用: 小程序五维(身·土 / 心·火 / 智·金 / 行·木 / 富·水)健康指数与测评结果生成
+> 已对齐资产: `docs/舌诊情绪识别_技术选型.md`、`docs/assessment-market-plan.md`、DAN 测评维度(attention / focus / memory / logic / emotion)、`EnergyService.healthIndex`(现状:算法待定)
+
+---
+
+## 一、结论先行
+
+本方案要解决的不是"多设计几种玩法",而是**把五维分数从"填出来的"变成"测出来的"**。
+
+三条铁律:
+
+1. **行为痕迹 > 机器提取 > 自陈量表**。能量权重按此递减,自陈量表单维度权重上限 40%。
+2. **单一数据源不出分**。任一指标至少 2 个独立数据源通过一致性检验(ICC ≥ 0.60 或 |r| ≥ 0.40)后才计入维度分,否则标为"待补充"而非给 0 分。
+3. **能力与作答倾向必须分离**。凡有客观对错的任务,一律用信号检测论的 **d′(辨别力)** 而非正确率计分,用 **β(判定标准)** 识别并剔除"保守/激进/趋中/讨好"作答倾向。
+
+---
+
+## 二、为什么必须客观化(证据基础)
+
+现有方案里最容易被忽略的三个坑:
+
+| 方法 | 表面优点 | 实际证据 | 对设计的约束 |
+|------|---------|---------|-------------|
+| 游戏化认知测评 | 孩子愿意做、可远程 | 系统综述与 meta 分析显示:游戏化测评与传统测评**显著相关中过半为 0.3–0.49 的低相关**,且受年龄、既往游戏经验显著影响(玩过的孩子空间类任务天然占优) | 游戏分数**不能单独出分**,必须与另一独立数据源三角验证;必须建年龄分段常模;必须控制"既往游戏经验" |
+| 房树人(HTP)等绘画投射 | 孩子爱画、可远程 | 主观解释路径**信效度支持很弱**;但细节数量等量化评分与 WAIS 等高相关;已有中文版计算机化评分系统 + Rasch 分析验证 | 只保留**结构化形式要素评分(FEATS)**,禁止开放式主观解读;用 Rasch/IRT 校准 |
+| 自陈量表 | 实施成本最低 | 受社会赞许性、回忆偏差、趋中效应影响显著 | 用 CAT/IRT 化改造;插入重复题与"无意义题"检测作答认真度;迫选法替代 Likert 评分 |
+
+> 一句话:**任何一种新方法单独拿出来都不足以支撑结论,组合 + 结构化才有意义。**
+
+---
+
+## 三、数据采集三层模型
+
+```
+L1 行为痕迹层(最高可信)—— 系统自动记录,不经人手
+    反应时 / 反应时变异 / 正确率 / d′ / 完成时间 / 频次 / 连续天数 / 时间戳 / 绘图笔迹
+        ↓
+L2 机器提取层 —— 原始数据客观,特征由模型提取,需抽样人工复核
+    舌象特征 / 面部情绪 / 语音韵律 / 饮食图像 / 体成分
+        ↓
+L3 自陈层(最低可信)—— 主观输入,必须做偏差校正
+    量表 / 问卷 / 自评
+        ↓
+  ┌─────────────────────────────────────┐
+  │  三角验证 + 作答倾向校正(β/M题/迫选)  │
+  └─────────────────────────────────────┘
+        ↓
+  指标标准分 → 维度分(0-100)→ 五维健康指数 + 置信度
+```
+
+**权重建议**:L1 0.50 / L2 0.30 / L3 0.20(单维度内归一化;缺失则按剩余权重重新归一化,并下调置信度)。
+
+---
+
+## 四、五维测评方法总矩阵
+
+| 维度 | 核心指标 | 主测评方法 | 客观计量口径 | 数据源层 | 落地页面 |
+|------|---------|-----------|-------------|---------|---------|
+| **身**<br>🌏土 | 中医体质 / 体成分 / 心肺耐力 / 睡眠 / 饮食 | ① 舌诊 AI ② 体脂秤 ③ 体能小测试 ④ 睡眠记录 ⑤ 饮食拍照 | 舌色/苔色/苔厚 4 维概率;BMI、体脂率、内脏脂肪;6 分钟步行距离、握力、闭眼单脚站立秒数;睡眠时长+入睡时点变异;膳食图像识别 | L2 + L1 | `body-detail/`<br>`checkin` `health-report` |
+| **心**<br>🔥火 | 情绪状态 / 情绪调节 / 压力 / 人格倾向 | ① CAT 量表 ② 绘画(FEATS)③ 听故事说选择(DIT 式)④ 拍照/短视频情绪识别 ⑤ EMA | 绘画 14 项形式要素分 + 笔迹过程数据;故事选择的分值+排序一致性+M 题;多帧情绪概率中位数;CAT θ 值 | L1 + L2 + L3 | `mind-detail/`<br>`emotion-checkin` `screening` `traditional-mirror` |
+| **智**<br>⚔️金 | 记忆力 / 逻辑推理 / 注意力 / 专注力 / 加工速度 / 执行功能 | ① 记忆游戏 ② 推理游戏 ③ 舒尔特/Go-NoGo ④ Stroop/任务转换 ⑤ 伦敦塔 | 最大广度、d′、反应时、反应时变异系数 ICV、Stroop 干扰量、转换代价、最优解达成率 | L1(纯行为) | `wisdom-detail/`<br>`self-quiz` `cognitive-report` `training-hub` |
+| **行**<br>🌿木 | 习惯坚持 / 执行功能 / 自控 / 关系经营 | ① 系统行为日志 ② 延迟满足选择任务 ③ 关系互动日志 ④ 计划能力任务 | 任务完成率、打卡时间戳、连续天数、等待时长选择、互动频次、伦敦塔计划步数 | L1(系统痕迹) | `action-detail/`<br>`interaction-log` `relationship-questionnaire` |
+| **富**<br>💧水 | 财商 / 资源规划 / 延迟满足 / 价值创造 | ① 财商情境任务 ② 资源分配游戏 ③ 延迟满足 ④ 真实账本流水(CF) | 情境决策正确率+反应时;分配比例与收益;即时/延迟选择记录;收支结构与储蓄率 | L1 + L2 | `wealth-detail/`<br>`wealth-cf` |
+
+---
+
+## 五、分维详细设计
+
+### 5.1 身(土)—— 已有选型可直接复用,补齐体能与饮食
+
+| 指标 | 方法 | 客观口径 | 说明 |
+|------|------|---------|------|
+| 中医体质倾向 | **舌诊 AI** | 舌色 / 苔色 / 苔厚 / 苔腻 4 维分类概率 | 沿用 `docs/舌诊情绪识别_技术选型.md`:MVP 用 TongueDiagnosis.AI(舌色 ~86%、苔色 ~84%),中长期换 U2Net-MT + 自训 ViT(ROC-AUC 0.89–0.99)。**必做光照/白平衡校正**,否则颜色类特征全部失效 |
+| 体成分 | 体脂秤(已有 `AdminBodyFatScaleController`) | BMI、体脂率、肌肉量、水分、蛋白质、骨量、内脏脂肪、基础代谢 | 已是结构化数值,直接入参;需记录测量时点(晨起/餐后差异大) |
+| 心肺耐力/体能 | 体能小测试 | 6 分钟步行距离、3 分钟台阶后心率恢复、握力(kg)、闭眼单脚站立(s) | 有客观数值,是身体维度里最硬的数据 |
+| 睡眠 | 睡眠记录 / 可穿戴 | 睡眠时长、入睡时点、醒来次数、**入睡时点标准差**(规律性) | 规律性比时长更能反映状态;若无可穿戴,用小程序打卡时间戳(仍需防补填) |
+| 饮食 | 拍照识别 | 膳食图像 → 食材/份量 → 膳食多样性得分、油盐估计 | 替代自陈饮食问卷,规避回忆偏差 |
+| 可选 | 面诊/手诊 AI | 面色、目色等 | 与舌诊同 pipeline,优先级 P2 |
+
+**落地要点**:舌诊最容易"看起来客观其实不客观"——**必须在服务端强制色卡校正**,并在报告里显示"图像质量评分",质量不合格直接拒测而非给出低质量结论。
+
+---
+
+### 5.2 心(火)—— 四条腿走路,绘画与故事必须结构化
+
+这是主观性风险最高的一维,也是本方案最需要动手术的一维。
+
+| 指标 | 方法 | 客观计量口径 | 抗主观设计 |
+|------|------|-------------|-----------|
+| 情绪状态 | **拍照/短视频情绪识别** | 7 类情绪概率 | 沿用选型:DeepFace(~80%)。短视频按 200ms 抽帧 → **去掉前 0.5s(摆拍/首因效应)** → 取各情绪概率**中位数** + 记录情绪**变异度**。单帧结果不出分 |
+| 情绪/压力/焦虑 | **CAT 量表** | IRT θ 值(标准分,均值 0 / SD 1) | 自适应选题,题量减少约 40% 且测量更精;插入 M 题(无意义题)检测乱答;自动记录作答时间,过快作答降权 |
+| 人格/内在倾向 | **绘画(房树人)** | FEATS 形式要素 14 项(0–5 分)+ 笔迹过程数据 | ① **只评形式,不做符号解读**(不允许"小房子=拒绝家庭"这类解释)② 笔迹过程:笔压、速度、停顿次数、橡皮擦使用次数、覆盖面积、用色数量、作画时长 ③ 评分走 Rasch/IRT 校准 ④ 成品与过程双记录 |
+| 价值观/道德判断 | **听故事说选择(DIT 式)** | 选择得分 + 排序一致性 + M 题通过情况 | 用"限定问题测验"结构:故事 → 先做**三择一** → 再对 12 个理由**排序**。**客观计分,不用开放式陈述**(开放式会引入语言能力与评分者主观性)。排序一致性过低 → 判定为不良作答 |
+| 情绪动态 | **EMA + 被动感知(可选)** | 每日情绪评分序列、波动幅度 | 生态瞬时评估规避回忆偏差;被动感知(活动量/光照/屏幕)与量表相关 0.44–0.72,**可作为校验项而非独立结论** |
+
+**关键取舍**:绘画这条腿,**过程数据(笔迹)比成品解读更客观**。同样一幅画,主观解读可以千人千面,但"停顿 23 次、橡皮擦用了 15 次、作画 4 分 12 秒"是不可争辩的事实。设计时应优先采集过程数据。
+
+**一致性检验举例**:CAT 量表 θ 值(自陈)与短视频情绪识别(机器)应呈预期方向相关;若量表显示"情绪良好"而连续 7 天视频情绪以负性为主,系统应标记"结果不一致,建议人工复核"而非直接取平均。
+
+---
+
+### 5.3 智(金)—— 游戏化,但必须行为计量
+
+对应现有 DAN 维度 memory / logic / attention / focus。
+
+| 指标 | 游戏范式 | 客观计量口径 | 说明 |
+|------|---------|-------------|------|
+| 言语记忆 | **数字广度**(顺背/倒背) | 最大广度(span)、正确率、反应时 | 经典且客观 |
+| 视觉空间记忆 | **Corsi 积木点击** | 最大广度、错误序列位置 | 与言语记忆分开计,避免相互污染 |
+| 工作记忆更新 | **n-back**(1/2/3-back) | **d′**(信号检测论)、反应时 | 必须用 d′,否则"全都答是"的人也能拿高分 |
+| 情景记忆 | **图形配对回忆**(翻牌配对) | 翻牌次数、完成时间、(首次点击分布) | 翻牌次数越少越好,是纯行为痕迹 |
+| 归纳推理 | **瑞文渐进矩阵** | 正确率、反应时 | 自适应呈现:答对升难度、答错降难度 |
+| 演绎/类比 | **图形类比 / 数列推理** | 正确率、反应时 | 自适应 |
+| 认知灵活性 | **卡片分类(WCST 简化版)** | 持续性错误次数、分类达成数 | 持续性错误是关键客观指标 |
+| 注意力/专注 | **舒尔特方格** / **Go·NoGo** / **CPT** | 完成时间、错误次数、漏报率、虚报率、d′、**反应时变异系数 ICV** | ICV 反映注意力稳定性,比正确率更敏感 |
+| 抑制控制 | **Stroop** | **干扰效应量 = 不一致条件RT − 一致条件RT** | 单一数值,客观 |
+| 任务转换 | **任务转换范式** | **转换代价 = 转换试次RT − 重复试次RT** | 同上 |
+| 计划能力 | **伦敦塔** | 计划前思考时长、移动步数、最优解达成率 | 同上 |
+| 加工速度 | **符号译码** | 单位时间正确个数 | 同上 |
+
+**为什么必须用 d′ 而不是正确率**:
+- 正确率 = 能力 + 作答倾向(有人保守、有人激进、有人讨好式地"全选是")。
+- d′ 把两者分开:d′ 反映真实辨别能力,β 反映作答倾向。
+- 对游戏类任务,**计分用 d′,同时记录 β**;β 极端者(|logβ| 超过常模 2SD)该次结果降权或标记复核。
+
+**年龄分段常模是硬要求**:meta 分析显示年龄显著影响游戏表现与效度。必须按年龄组分建常模,否则低龄孩子被系统性低估、高龄孩子被高估。
+
+**既往游戏经验控制**:加入 1 题"每周玩电子游戏时长"作为协变量;游戏设计时用**抽象刺激(图形/色块)而非具象题材**,降低经验差异影响。
+
+---
+
+### 5.4 行(木)—— 把"自评"换成"系统痕迹"
+
+| 指标 | 方法 | 客观计量口径 | 说明 |
+|------|------|-------------|------|
+| 习惯坚持 | **系统行为日志** | 任务完成率、打卡**时间戳**(非自报)、连续天数 streak、完成时间分布(是否集中在截止前) | 现有任务系统已能记录,直接取数即可,**是最客观的一维** |
+| 自控/延迟满足 | **延迟满足选择任务** | 选择"即时小奖励 / 等待更大奖励"的记录、实际等待时长 | 客观行为选择,非自评 |
+| 计划与执行 | **伦敦塔 + 真实任务分解** | 计划步数/最优解达成率 + 真实任务按时完成率 | 实验室指标与真实行为互为校验 |
+| 关系经营 | **互动日志频次** | 与关键人的互动次数、间隔天数、主动发起比例 | 替代"你觉得你人际关系好吗"这类自评 |
+| 关系质量 | **关系问卷(IRT 化)** | θ 值 + M 题检测 | 现有 `relationship-questionnaire` 改造 |
+
+**⚠️ 反作弊**:行为痕迹最怕"补填"。必须记录**真实操作时间戳**,禁止允许补录过去日期的打卡;补录数据单独标记,不计入坚持类指标。
+
+---
+
+### 5.5 富(水)—— 情境任务 + 真实账本
+
+| 指标 | 方法 | 客观计量口径 | 说明 |
+|------|------|-------------|------|
+| 财商 | **财商情境决策任务** | 情境选择正确率、反应时、风险偏好(选择分布) | 用真实购物/储蓄/借贷情境,客观计分 |
+| 资源规划 | **资源分配游戏**(有限资源在多个目标间分配) | 分配比例、最终收益、跨轮次调整策略 | 过程完全可记录 |
+| 延迟满足 | **即时/延迟奖励选择** | 选择记录、等待时长 | 与"行"维度共用范式,避免重复施测 |
+| 财富健康 | **真实 CF 账本流水** | 收支结构、储蓄率、消费分类占比、收入稳定性 | 已是结构化真实数据,直接计算,零主观 |
+
+---
+
+## 六、八大抗主观机制(本方案的核心)
+
+1. **行为痕迹优先**:能用系统记录就不用手填,能用反应时就不只用正确率。
+2. **信号检测论分离能力与倾向**:游戏/判断类任务统一计 d′,同时输出 β 作为作答倾向指标;β 异常者降权。
+3. **多源三角验证**:同一指标 ≥2 个独立数据源,一致性不达标则出"待补充"而非硬给分。
+4. **结构化评分替代主观解读**:绘画只走 FEATS 形式要素 + 笔迹过程,不做符号化主观解释;量表走 CAT/IRT,评分者主观性被彻底移除。
+5. **作答质量门禁**:M 题(无意义题)、重复题一致性、作答时长下限,任一不通过则该次结果作废。
+6. **时间采样抗偶然**:短视频多帧取中位数、去首 0.5s;情绪/睡眠看**序列与变异度**而非单点。
+7. **年龄分段常模 + 协变量控制**:年龄分段建常模;游戏经验、性别作协变量;结果以**百分等级/T 分**呈现,不用原始分。
+8. **反社会赞许性**:关键条目用**迫选法**(二选一必选)替代 Likert 评分,消除趋中效应;隐藏测量意图,避免孩子猜到"标准答案"。
+
+---
+
+## 七、计分与聚合算法
+
+### 7.1 原始分 → 标准分
+
+```
+百分等级 PR = 该年龄组内低于该得分的人数占比
+T 分 = 50 + 10 × Z,  Z = (x − μ_age) / σ_age
+正向指标用 T 分,负向指标(如反应时、持续性错误)取 100 − T
+```
+
+### 7.2 指标分 → 维度分
+
+```
+                 Σ(w_i × c_i × T_i)
+维度分 = 100 × ─────────────────────
+                    Σ(w_i × c_i)
+
+w_i : 指标权重(L1 0.50 / L2 0.30 / L3 0.20,维度内归一化)
+c_i : 数据完整度系数 = min(1, 实际有效样本数 / 要求样本数)
+T_i : 该指标 T 分
+```
+
+缺失数据源**不补 0**,而是从分母中剔除(权重重新归一化),同时下调置信度。
+
+### 7.3 置信度
+
+```
+置信度 = 数据完整度均值 × 一致性系数
+一致性系数 = 1(≥2 源且 ICC≥0.60) / 0.8(≥2 源但 ICC 0.40–0.60) / 0.6(仅 1 源)
+```
+
+**报告必须展示置信度**,低置信度时文案为"样本不足,仅供参考",不得给出确定性结论。
+
+### 7.4 五维健康指数
+
+```
+健康指数 = Σ(维度分 × 维度权重) / Σ(维度权重)    默认等权,可在配置表调整
+```
+
+> 直接对接 `EnergyService.getOverview()` 中当前写死的 `healthIndex = 0`。
+
+---
+
+## 八、落地路线图
+
+### P0(2–4 周,用现有资产,性价比最高)
+
+| 项 | 内容 | 依赖 |
+|----|------|------|
+| 行为痕迹层 | 打通任务完成率、打卡时间戳、streak、互动日志 → 支撑 **行** 维度 | 现有任务系统 |
+| 舌诊 MVP | 接入 TongueDiagnosis.AI → 支撑 **身** 维度 | 已有选型文档 |
+| 情绪识别 MVP | 接入 DeepFace,多帧中位数 + 去首帧 → 支撑 **心** 维度 | 已有选型文档 |
+| CAT 化量表 | 现有情绪/关系问卷改 IRT 计分 + M 题 | 需先做小规模标定 |
+| 认知游戏 | 数字广度 + Corsi + 舒尔特 + Go/NoGo(先 4 个)→ 支撑 **智** 维度 | 小程序内可自研,无需 AI |
+
+> P0 阶段**不做绘画与故事**——二者需要标定样本和人工复核流程,成本高于收益。
+
+### P1(1–2 月)
+
+- 推理游戏(瑞文矩阵自适应)+ Stroop + 伦敦塔 → **智** 维度完整
+- 财商情境任务 + 资源分配游戏 + 真实 CF 流水 → **富** 维度
+- 体能小测试 + 饮食拍照识别 → **身** 维度完整
+- 年龄分段常模建立(需累积 ≥200 人/年龄组)
+
+### P2(3 月+)
+
+- 绘画(FEATS + 笔迹过程)+ 听故事说选择(DIT 式)→ **心** 维度深度
+- EMA + 被动感知(需额外授权,隐私成本高)
+- 全维度 CAT 自适应 + 三角验证自动化
+
+---
+
+## 九、与现有系统的对接
+
+| 现有位置 | 本方案填补内容 |
+|---------|--------------|
+| `EnergyService.getOverview()` L1818 `healthIndex = 0 // 算法待定` | 第七节完整算法 |
+| `HealthDimensionVO.healthIndex` | 增加 `confidence`、`dataSources`、`sampleSize` 字段 |
+| DAN 测评维度 attention/focus/memory/logic/emotion | 归入 **智** 维度,用游戏化行为计量替代现有人工录入 |
+| `docs/舌诊情绪识别_技术选型.md` | 本方案直接沿用其选型结论,不重复论证 |
+| `body/mind/wisdom/action/wealth-detail` 页面 | 各维度测评入口与指标展示清单 |
+| `assessment-market-plan.md` 阶段三/四 | 测评结果接入后,方案生成引擎可直接消费本方案的维度分 |
+
+---
+
+## 十、合规与风险红线
+
+1. **一律定位为"健康/成长参考",不做医疗诊断、不做心理疾病诊断**。舌诊结论不得出现疾病名,情绪识别不得出现"抑郁""焦虑"等诊断词。
+2. **未成年人人脸/声纹属敏感个人信息**,必须取得监护人单独明示同意,可跳过、可删除;默认不存储原始照片,仅存结构化结果。
+3. **AI 结果需人工复核抽样**(建议 5% 抽样 + 异常值全检),不得全自动出报告。
+4. **绘画内容不得做病理化解读**,仅呈现形式要素评分与发展性描述。
+5. **数据留痕**:每次测评记录施测时间、作答时长、设备、图像质量、模型版本,保证结果可复现可追溯。
+
+---
+
+## 附录:关键证据来源
+
+| 结论 | 来源 |
+|------|------|
+| 游戏化认知测评与传统测评相关偏低(0.3–0.49),受年龄与既往游戏经验影响 | 儿童青少年游戏化认知测评效度系统综述与 meta 分析 (PMC12967847) |
+| HTP 主观解释信效度支持弱;量化细节评分与 WAIS 高相关 | Encyclopedia of Mental Disorders;Gale Encyclopedia of Mental Health |
+| 中文版计算机化 HTP 评分系统 + Rasch 验证 | 台大硕论(动态人树房子电脑化计分系统,2008) |
+| CAT 基于 IRT,题量减少约 40%,降低测量误差、提升精度 | Gibbons / Weiss; 青少年心理健康 CAT(AMH-CAT,8679 样本) |
+| 被动感知与症状相关 0.44–0.72;手机感知预测情绪状态准确率 >70% | 青少年抑郁被动感知研究 (PMC12570096 / JMIR Res Protoc) |
+| n-back 与传统工作记忆测评相关弱(结构效度争议) | Redick & Lindsey (2013);n-back 相关文献 |
+| 舌诊模型准确率 ~86%(舌色)、~84%(苔色);自训 ROC-AUC 0.89–0.99 | `docs/舌诊情绪识别_技术选型.md` |
+| DeepFace 情绪识别 ~80%(FER2013) | `docs/舌诊情绪识别_技术选型.md` |