relationship-layer2-plan.md 15 KB

关系质量功能(第二层)实现计划

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 变更

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

EntityInteractionLog.java — familyId, fromMemberId, toMemberId, interactionType, description, happenedAt, createdAt

Agent: quick


T3. RelationshipQuestionnaireSnapshot Entity + Mapper

EntityRelationshipQuestionnaireSnapshot.java — familyMemberId, respondentId, memberName, relationshipType, aiGeneratedJson, version, createdAt

Agent: quick


T4. RelationshipQuestionnaireResponse Entity + Mapper

EntityRelationshipQuestionnaireResponse.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)

新增函数

// 关系质量评分
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

验收命令

# 后端编译
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天无互动触发健康预警
  • 里程碑显示即将到来的生日
  • 行维度首页显示关系质量概览