Эх сурвалжийг харах

docs: 添加关系质量功能(第二层)实现计划

User 2 сар өмнө
parent
commit
c47ddd82a8

+ 434 - 0
docs/relationship-layer2-plan.md

@@ -0,0 +1,434 @@
+# 关系质量功能(第二层)实现计划
+
+## TL;DR
+
+> **Quick Summary**: 为"行·人际和谐"维度实现完整的关系质量管理体系,包含 AI 生成问卷评分、互动记录追踪、健康预警、里程碑提醒五大功能
+>
+> **Deliverables**:
+> - 后端:3 个新 Service、1 个 Controller、4 个新 Entity、3 个 DTO、新数据表
+> - 前端:family-members 增强、新问卷页面、互动记录组件、健康预警提示
+> - AI:基于 Dify 的动态问卷生成
+>
+> **Estimated Effort**: Large
+> **Parallel Execution**: YES - 3 waves
+> **Critical Path**: T1 (schema) → T5 (backend APIs) → T10 (frontend integration) → T14 (AI questionnaire) → T17 (health alerts)
+
+---
+
+## Context
+
+### Original Request
+实现"行·人际和谐"维度的第二层关系质量功能(五项全量)
+
+### Interview Summary
+**Key Discussions**:
+- 关系质量三维:信任(trust) + 亲密(intimacy) + 沟通(communication)
+- 评分方式:AI 动态生成问卷(每次不同模板)→ 用户填写 → 自动计算 + 互动记录辅助
+- 展示:成员卡片显示三围评分;联系人单独实现
+- A2 报告:是 DAN 评估的特定模板,非数据库字段
+- 全量实现所有 5 个功能
+
+**Research Findings**:
+- `AIService.java` 已封装 Dify AI(`/chat-messages` 端点,blocking 模式)
+- `DanAssessmentResult.java` 已有 EMI 维度(情绪商数/心理韧性/压力应对/自我认知)可作为关系质量参考
+- 前端 `action/index.vue` 已有 FamilyEnergyBar + FamilyRelationGraph + ContactCard 组件
+- `FamilyRelationGraph.vue` 已有 `intimacyMap` + `energyMap` props(但 family-members.vue 当前不传入)
+- `ContactCard.vue` 已有 `intimacyLevel` 显示
+- `Contact` 实体已有 `intimacyLevel` 字段
+- 评分展示模式已有参考:FamilyEnergyBar(进度条)、PointsProgressRing(环形)
+
+---
+
+## Work Objectives
+
+### Core Objective
+在"行·人际和谐"维度建立完整的关系质量管理体系,用户可以通过 AI 问卷 + 互动记录了解家庭成员间的关系健康度,并获得改善建议。
+
+### Concrete Deliverables
+- 后端 Schema:`family_members` 新增 4 字段 + 3 张新表
+- 后端 API:`/api/family/relationship/*`、`/api/family/interaction/*`
+- 前端成员卡片:显示信任/亲密/沟通三围评分(进度条)
+- 前端问卷页面:AI 生成问卷 → 填写 → 提交 → 计算评分
+- 前端互动记录:记录家庭成员互动(类型+描述+时间)
+- 前端健康预警:长期未互动提醒(30天无互动)
+- 前端里程碑:生日/纪念日即将到来提醒
+- 前端行维度首页:关系质量概览
+
+### Definition of Done
+- [ ] `mvn clean compile` 后端编译通过
+- [ ] 所有 API 端点返回 `Result<T>` 格式
+- [ ] family-members.vue 成员卡片显示三围评分
+- [ ] 问卷页面可 AI 生成问题并提交计算
+- [ ] 互动记录可添加/查看
+- [ ] 健康预警正确计算(30天无互动触发)
+- [ ] 里程碑正确显示即将到来的生日/纪念日
+- [ ] 行维度首页显示关系质量概览
+
+### Must Have
+- AI 动态生成问卷(每次不同,基于关系类型和成员信息)
+- 三维评分计算(信任/亲密/沟通)
+- 互动记录 CRUD
+- 成员卡片三色进度条展示
+- 健康度预警
+
+### Must NOT Have (Guardrails)
+- 不修改现有的 `Contact` 实体和联系人功能(联系人单独实现)
+- 不修改 DAN 测评相关表结构(只读 A2 报告数据)
+- 不使用可选链 `?.`(微信小程序限制)
+- 不使用 CSS Grid(用 flexbox)
+- 不在 Controller 直接调用 Mapper
+
+---
+
+## Execution Strategy
+
+### Parallel Execution Waves
+
+```
+Wave 1 (Foundation — 8 tasks, MAX PARALLEL):
+├── T1: Schema 变更 + Entity 定义 [quick]
+├── T2: InteractionLog Entity + Mapper [quick]
+├── T3: RelationshipQuestionnaireSnapshot Entity + Mapper [quick]
+├── T4: RelationshipQuestionnaireResponse Entity + Mapper [quick]
+├── T5: RelationshipQualityController + Service [unspecified-high]
+├── T6: InteractionLogController + Service [unspecified-high]
+├── T7: RelationshipQuestionnaireController + Service [unspecified-high]
+└── T8: 前端 API 封装 (utils/api.js) [quick]
+
+Wave 2 (Frontend Core — 6 tasks, MAX PARALLEL):
+├── T9:  family-members.vue 三维评分展示 [visual-engineering]
+├── T10: member-action-detail.vue 增强 [visual-engineering]
+├── T11: action/index.vue 关系质量概览 [visual-engineering]
+├── T12: 互动记录弹窗/页面 [visual-engineering]
+├── T13: 联系人卡片增强 (ContactCard intimacyLevel) [visual-engineering]
+└── T14: 问卷填写页面 (relationship-questionnaire.vue) [visual-engineering]
+
+Wave 3 (AI + Advanced — 4 tasks):
+├── T15: AI 问卷生成(Dify 集成) [unspecified-high]
+├── T16: 评分计算逻辑(问卷 + 互动记录) [deep]
+├── T17: 健康预警 + 里程碑计算 [deep]
+└── T18: 行维度首页完整集成 [deep]
+
+Wave FINAL:
+└── T19: 端到端验证 + 提交推送
+```
+
+### Dependency Matrix
+
+| Task | Deps | Blocks |
+|------|------|--------|
+| T1: Schema | - | T5, T6, T7 |
+| T2: InteractionLog Entity | - | T6 |
+| T3: Snapshot Entity | - | T7 |
+| T4: Response Entity | T3 | T7 |
+| T5: RelationshipQuality Ctrl+Svc | T1 | T8 (验证) |
+| T6: InteractionLog Ctrl+Svc | T1, T2 | T8 (验证) |
+| T7: Questionnaire Ctrl+Svc | T1, T3, T4 | T8 (验证) |
+| T8: Frontend API | T5, T6, T7 | T9, T12, T13, T14 |
+| T9: family-members 增强 | T8 | T11 |
+| T10: member-action-detail | T8 | - |
+| T11: action/index 概览 | T9, T10 | T18 |
+| T12: 互动记录 UI | T8 | - |
+| T13: ContactCard 增强 | T8 | - |
+| T14: 问卷页面 | T8 | T15, T16 |
+| T15: AI 问卷生成 | T14 | T16, T18 |
+| T16: 评分计算 | T15 | T18 |
+| T17: 健康预警+里程碑 | T5, T6 | T18 |
+| T18: 行首页集成 | T11, T15, T16, T17 | T19 |
+| T19: 端到端验证 | T18 | - |
+
+---
+
+## TODOs
+
+> 每个任务格式:推荐 Agent + 并行信息 + 参考文件 + 验收标准 + QA 场景
+
+---
+
+### Wave 1 — Foundation (后端基础设施)
+
+#### T1. Schema 变更 + 扩展 FamilyMember 实体
+
+**SQL 变更**:
+```sql
+ALTER TABLE family_members
+ADD COLUMN trust_score DECIMAL(5,2) DEFAULT 0 COMMENT '信任度 0-100',
+ADD COLUMN intimacy_score DECIMAL(5,2) DEFAULT 0 COMMENT '亲密度 0-100',
+ADD COLUMN communication_score DECIMAL(5,2) DEFAULT 0 COMMENT '沟通质量 0-100',
+ADD COLUMN last_interaction_at DATETIME DEFAULT NULL COMMENT '最近互动时间';
+
+CREATE TABLE interaction_logs (
+  id BIGINT AUTO_INCREMENT PRIMARY KEY,
+  family_id BIGINT NOT,
+  from_member_id BIGINT NOT,
+  to_member_id BIGINT NOT,
+  interaction_type VARCHAR(32) NOT COMMENT 'dining/outgoing/call/video/chat/play/gift',
+  description VARCHAR(256),
+  happened_at DATETIME NOT,
+  created_at DATETIME DEFAULT CURRENT_TIMESTAMP,
+  INDEX idx_family (family_id),
+  INDEX idx_member (from_member_id),
+  INDEX idx_happened (happened_at)
+) COMMENT '家庭成员互动记录';
+
+CREATE TABLE relationship_questionnaire_snapshots (
+  id BIGINT AUTO_INCREMENT PRIMARY KEY,
+  family_member_id BIGINT NOT,
+  respondent_id BIGINT NOT,
+  member_name VARCHAR(64),
+  relationship_type VARCHAR(32),
+  ai_generated_json LONGTEXT NOT NULL COMMENT 'AI生成的题目 JSON',
+  version VARCHAR(32),
+  created_at DATETIME DEFAULT CURRENT_TIMESTAMP,
+  INDEX idx_member (family_member_id),
+  UNIQUE INDEX idx_version (family_member_id, version)
+) COMMENT '关系问卷快照';
+
+CREATE TABLE relationship_questionnaire_responses (
+  id BIGINT AUTO_INCREMENT PRIMARY KEY,
+  snapshot_id BIGINT NOT,
+  respondent_id BIGINT NOT,
+  answers_json LONGTEXT NOT NULL COMMENT '用户回答 JSON',
+  trust_score DECIMAL(5,2),
+  intimacy_score DECIMAL(5,2),
+  communication_score DECIMAL(5,2),
+  interaction_bonus DECIMAL(5,2) DEFAULT 0 COMMENT '互动记录加分',
+  total_score DECIMAL(5,2),
+  calculated_at DATETIME DEFAULT CURRENT_TIMESTAMP,
+  INDEX idx_snapshot (snapshot_id),
+  INDEX idx_respondent (respondent_id)
+) COMMENT '关系问卷回答结果';
+```
+
+**Entity 变更**:`FamilyMember.java` 新增 `trustScore`, `intimacyScore`, `communicationScore`, `lastInteractionAt` 字段
+
+**Agent**: `quick`
+
+---
+
+#### T2. InteractionLog Entity + Mapper
+
+**Entity**:`InteractionLog.java` — familyId, fromMemberId, toMemberId, interactionType, description, happenedAt, createdAt
+
+**Agent**: `quick`
+
+---
+
+#### T3. RelationshipQuestionnaireSnapshot Entity + Mapper
+
+**Entity**:`RelationshipQuestionnaireSnapshot.java` — familyMemberId, respondentId, memberName, relationshipType, aiGeneratedJson, version, createdAt
+
+**Agent**: `quick`
+
+---
+
+#### T4. RelationshipQuestionnaireResponse Entity + Mapper
+
+**Entity**:`RelationshipQuestionnaireResponse.java` — snapshotId, respondentId, answersJson, trustScore, intimacyScore, communicationScore, interactionBonus, totalScore, calculatedAt
+
+**Agent**: `quick`
+
+---
+
+#### T5. RelationshipQualityController + RelationshipQualityService
+
+**API 端点**:
+- `POST /api/family/relationship/scores` — 获取评分
+- `POST /api/family/relationship/calculate` — 计算并保存评分
+- `POST /api/family/relationship/health-alerts` — 健康预警
+- `POST /api/family/relationship/milestones` — 里程碑
+
+**Agent**: `unspecified-high`
+
+---
+
+#### T6. InteractionLogController + InteractionLogService
+
+**API 端点**:
+- `POST /api/family/interaction/add` — 添加互动
+- `POST /api/family/interaction/list` — 查询互动记录
+- `GET /api/family/interaction/types` — 获取互动类型列表
+
+**Agent**: `unspecified-high`
+
+---
+
+#### T7. RelationshipQuestionnaireController + RelationshipQuestionnaireService
+
+**API 端点**:
+- `POST /api/family/questionnaire/generate` — AI 生成问卷
+- `POST /api/family/questionnaire/submit` — 提交问卷
+- `GET /api/family/questionnaire/snapshot/{memberId}` — 获取快照
+- `GET /api/family/questionnaire/history/{memberId}` — 获取历史
+
+**Agent**: `unspecified-high`
+
+---
+
+#### T8. 前端 API 封装 (cfc-frontend/utils/api.js)
+
+**新增函数**:
+```javascript
+// 关系质量评分
+export const getRelationshipScores = (familyId) => request('/api/family/relationship/scores', 'POST', { familyId })
+export const calculateRelationshipScore = (data) => request('/api/family/relationship/calculate', 'POST', data)
+export const getHealthAlerts = (familyId) => request('/api/family/relationship/health-alerts', 'POST', { familyId })
+export const getMilestones = (familyId, daysAhead) => request('/api/family/relationship/milestones', 'POST', { familyId, daysAhead })
+
+// 互动记录
+export const addInteraction = (data) => request('/api/family/interaction/add', 'POST', data)
+export const listInteractions = (data) => request('/api/family/interaction/list', 'POST', data)
+export const getInteractionTypes = () => request('/api/family/interaction/types', 'GET', {})
+
+// 关系问卷
+export const generateQuestionnaire = (data) => request('/api/family/questionnaire/generate', 'POST', data)
+export const submitQuestionnaire = (data) => request('/api/family/questionnaire/submit', 'POST', data)
+export const getQuestionnaireSnapshot = (memberId) => request('/api/family/questionnaire/snapshot/' + memberId, 'GET', {})
+export const getQuestionnaireHistory = (memberId) => request('/api/family/questionnaire/history/' + memberId, 'GET', {})
+```
+
+**Agent**: `quick`
+
+---
+
+### Wave 2 — Frontend Core (前端界面)
+
+#### T9. family-members.vue 三维评分展示
+
+每个成员卡片增加三个进度条(信任绿色/亲密粉色/沟通蓝色),显示 trust/intimacy/communication 评分。增加"做问卷"和"记录互动"按钮。
+
+**Agent**: `visual-engineering`
+
+---
+
+#### T10. member-action-detail.vue 关系质量增强
+
+三维评分大号展示 + 最近互动记录列表 + 互动类型分布 + 关系健康状态指示(健康/注意/预警)。
+
+**Agent**: `visual-engineering`
+
+---
+
+#### T11. action/index.vue 关系质量概览
+
+在 `FamilyRelationGraph` 下方新增关系质量概览区块:家庭整体关系健康度 + 健康预警列表 + 即将到来的里程碑 + 快速入口。
+
+**Agent**: `visual-engineering`
+
+---
+
+#### T12. 互动记录弹窗/页面
+
+新建 `pages/action/interaction-log.vue`:选择互动类型(dining/outgoing/call/video/chat/play/gift/other)+ 选择互动对象 + 填写描述 + 选择时间。
+
+**Agent**: `visual-engineering`
+
+---
+
+#### T13. ContactCard 亲密关系评分增强
+
+`ContactCard.vue` 已有 `intimacyLevel` 改为进度条样式展示,低分显示预警色。
+
+**Agent**: `visual-engineering`
+
+---
+
+#### T14. 问卷填写页面 (relationship-questionnaire.vue)
+
+新建 `pages/action/relationship-questionnaire.vue`:显示 AI 生成的问卷题目 + 用户选择选项 + 提交后显示三维评分。
+
+**Agent**: `visual-engineering`
+
+---
+
+### Wave 3 — AI + Advanced (AI集成)
+
+#### T15. AI 问卷生成(Dify 集成)
+
+扩展 `AIService.java`,新增 `generateRelationshipQuestionnaire()` 方法:
+- 构建 Dify prompt(9-15 题,覆盖信任/亲密/沟通三个维度)
+- 调用 Dify `/chat-messages` 端点(blocking 模式)
+- 解析 AI 返回 JSON,保存到 `relationship_questionnaire_snapshots` 表
+- 返回快照 ID 和题目 JSON
+
+**Agent**: `unspecified-high`
+
+---
+
+#### T16. 评分计算逻辑(问卷 + 互动记录)
+
+实现评分计算:
+- 问卷得分 = 各维度平均分(0-100)
+- 互动加分 = min(10, 30天内互动次数 × 0.5)
+- 最终分 = 问卷分 × 0.8 + 互动加分
+- 更新 `family_members` 三围字段 + `last_interaction_at`
+
+**Agent**: `deep`
+
+---
+
+#### T17. 健康预警 + 里程碑计算
+
+`getHealthAlerts()`:30 天无互动触发预警,返回预警列表(成员名、关系类型、无互动天数、建议)
+
+`getUpcomingMilestones()`:查询 `family_member_attributes.birthDatetime`,返回未来 7 天内的生日/纪念日
+
+**Agent**: `deep`
+
+---
+
+#### T18. 行维度首页完整集成
+
+整合 T11 + T15 + T16 + T17 到 `action/index.vue`:关系质量概览 + 健康预警列表 + 里程碑列表 + 问卷/互动入口
+
+**Agent**: `deep`
+
+---
+
+### Wave FINAL
+
+#### T19. 端到端验证 + Git 提交
+
+- `mvn clean compile` 验证
+- API 端点 curl 测试
+- 前端页面 Playwright 验证
+- `git add` + `git commit` + `git push`
+
+---
+
+## Commit Strategy
+
+```
+Wave 1 完成: git add cfc-backend/src/main/java/com/etotem/cfc/entity/InteractionLog.java cfc-backend/src/main/java/com/etotem/cfc/entity/Relationship*.java ...; git commit -m "feat: 关系质量后端基础架构"
+Wave 2 完成: git add cfc-frontend/pages/profile/family-members.vue cfc-frontend/pages/action/...; git commit -m "feat: 关系质量前端UI"
+Wave 3 完成: git add ...; git commit -m "feat: AI问卷生成+健康预警+里程碑"
+最终: git push origin cfclub
+```
+
+---
+
+## Success Criteria
+
+### 验收命令
+```bash
+# 后端编译
+cd cfc-backend && mvn clean compile
+
+# 后端启动
+mvn spring-boot:run  # localhost:9082
+
+# API 验证
+curl -X POST http://localhost:9082/api/family/relationship/scores -d '{"familyId":1}'
+curl -X POST http://localhost:9082/api/family/interaction/add -d '{"familyId":1,"fromMemberId":2,"toMemberId":3,"type":"dining"}'
+curl -X POST http://localhost:9082/api/family/questionnaire/generate -d '{"memberId":2,"respondentId":1}'
+```
+
+### 最终检查清单
+- [ ] 所有 API 端点返回 `Result<T>` 格式
+- [ ] `mvn clean compile` 无 error
+- [ ] 成员卡片显示三维评分(trust/intimacy/communication)
+- [ ] AI 可生成问卷题目
+- [ ] 互动记录可添加/查看
+- [ ] 30天无互动触发健康预警
+- [ ] 里程碑显示即将到来的生日
+- [ ] 行维度首页显示关系质量概览