2026-08-28-innate-portrait-mind-dimension-design.md 22 KB

星座/八字/数字能量引入心维度 · 先天画像体系设计

日期: 2026-08-28 状态: 已确认 版本: v1.0

关联文档:


一、背景与目标

1.1 现状

项目已有分散的"传统文化镜像"基础设施,各玄学来源各自有配置表和展示:

来源 配置表 先天分字段 服务
星座 zodiac_config mind_base/wisdom_base ZodiacAnnualEnergyService
八字 bazi_config mind_base/wisdom_base BaziConfigService
血型 blood_type_config mind_base/wisdom_base BloodTypeConfigService
数字能量 numsoul_config(灵数1-9) — FamilyMemberAttributeService.getNumSoulConfig()

成员先天属性存于 family_member_attributes 表(八字四柱/五行/生肖/血型/mind_base_score/wisdom_base_score/behavior_modifier含灵数)。

已有接口:/api/mind/traditional/mirror、/family-dashboard、/compatibility、/api/zodiac/energy、/api/tianpan/*。

已有前端:pages/mind-detail/ 下 traditional-mirror.vue、duo-compatibility.vue、family-dashboard.vue、index.vue。

1.2 问题

  1. 分散:各玄学来源各自展示,无统一"先天画像"聚合
  2. 数字能量薄弱:只有灵数1-9基础配置,缺天赋数/生日数/命运数
  3. 先天后天未打通:mind_base_score(先天)与 energy_balance(后天)未打通展示成长轨迹
  4. 无 AI 个性化解读:目前只有 bazi_reading_template 模板文案
  5. 管理端不可配置:各来源权重/启停/文案模板无法配置

1.3 目标

在现有基础上深化/整合,将星座/八字/数字能量统一为"心维度先天画像"体系:

  1. 统一先天画像 + AI 解读:聚合各来源,AI 主导生成个性化解读
  2. 补强数字能量:生日数字体系(生命灵数/天赋数/生日数/命运数)
  3. 先天+后天打通:展示先天起点 → 后天成长轨迹
  4. 管理端可配置化:各来源权重/启停/AI开关

1.4 产品定位(已确认)

服务于五维能量体系——星座/八字/数字能量作为心维度先天基础分来源,最终汇入五维能量,强调与后天能量打通、成长轨迹。

1.5 AI 定位(已确认)

AI 主导生成——先天画像和解读主要由 AI 生成,后端只提供原始数据。AI 服务不可用时降级为模板文案。


二、架构总览

┌─────────────────────────────────────────────────────────────┐
│                    数据源(现有,不动)                        │
│  zodiac_config / bazi_config / blood_type_config /          │
│  numsoul_config / life_number_relationship /                │
│  bazi_reading_template                                      │
└──────────────────────────┬──────────────────────────────────┘
                           │ 读取
┌──────────────────────────▼──────────────────────────────────┐
│          先天画像聚合层(新增 InnatePortraitService)          │
│  · 聚合八字/五行/星座/血型/灵数/天赋数/命运数                  │
│  · 复用 calcInnateScore 计算 mind_base_score                 │
│  · 数字能量补强(天赋数/生日数/命运数计算)                    │
└──────────────┬───────────────────────────┬─────────────────┘
               │ 原始数据                    │ 先天画像
┌──────────────▼──────────┐   ┌─────────────▼─────────────────┐
│  LangGraph AI graph     │   │  五维能量体系(现有)           │
│  (innate_portrait_graph)│   │  mind_base_score → energy_balance│
│  AI 主导生成解读文案     │   │  先天+后天成长轨迹              │
└──────────────┬──────────┘   └─────────────┬─────────────────┘
               │ AI解读                     │ 展示
┌──────────────▼───────────────────────────▼─────────────────┐
│              小程序心维度页面(增强)                         │
│  · 先天画像报告(AI解读)                                    │
│  · 先天+后天成长轨迹                                         │
└─────────────────────────────────────────────────────────────┘

三、数据模型设计

3.1 新增表:innate_portrait_config(先天画像来源权重配置)

管理端可配置各玄学来源对 mind_base_score 的权重、启停开关、AI 解读开关。

与现有硬编码权重的关系:现有 FamilyMemberAttributeService.calcInnateScore() 硬编码 zodiac×50% + bazi×30% + blood×20%。本表权重将替换该硬编码逻辑——calcInnateScore 改为读取本表权重(详见 §7.5)。数字能量(numsoul)作为第 4 个来源参与加权。

CREATE TABLE IF NOT EXISTS innate_portrait_config (
    id BIGINT AUTO_INCREMENT PRIMARY KEY,
    source_type VARCHAR(20) NOT NULL COMMENT '来源: zodiac/bazi/blood/numsoul',
    source_name VARCHAR(50) NOT NULL COMMENT '来源名称',
    weight INT DEFAULT 25 COMMENT '权重(基点,2500=25%)',
    enabled TINYINT(1) DEFAULT 1 COMMENT '是否启用',
    ai_enabled TINYINT(1) DEFAULT 1 COMMENT '是否启用AI解读',
    sort_order INT DEFAULT 0 COMMENT '排序',
    created_at DATETIME DEFAULT CURRENT_TIMESTAMP,
    updated_at DATETIME DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP,
    UNIQUE KEY uk_source (source_type)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COMMENT='先天画像来源权重配置';

3.2 新增表:innate_portrait_report(先天画像报告缓存)

AI 解读结果缓存,避免重复调用 LLM。

职责边界:本表只存 portrait_json(画像数据)+ ai_reading(AI解读)。不重复存 mind_base_score——先天分从 family_member_attributes.mind_base_score 读取,避免职责重叠。

CREATE TABLE IF NOT EXISTS innate_portrait_report (
    id BIGINT AUTO_INCREMENT PRIMARY KEY,
    member_id BIGINT NOT NULL COMMENT '成员ID',
    member_type VARCHAR(10) NOT NULL COMMENT '成员类型: child/parent',
    family_id BIGINT NOT NULL COMMENT '家庭ID',
    portrait_json TEXT COMMENT '先天画像数据JSON',
    ai_reading TEXT COMMENT 'AI解读文案',
    generated_at DATETIME COMMENT '生成时间',
    created_at DATETIME DEFAULT CURRENT_TIMESTAMP,
    UNIQUE KEY uk_member (member_id, member_type)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COMMENT='先天画像报告缓存';

3.3 新增表:numsoul_detail_config(数字能量详细配置)

覆盖所有数字类型(生命灵数/天赋数/生日数/命运数),每个类型每个数字都有解读文案。

与现有 numsoul_config 的关系:numsoul_config(灵数1-9基础配置)保留不动,兼容现有 getNumSoulConfig() 调用。numsoul_detail_config 是扩展,覆盖更细的数字类型(生命灵数/天赋数/生日数/命运数),并新增 mind_base 字段使数字能量参与 mind_base_score 加权计算。

CREATE TABLE IF NOT EXISTS numsoul_detail_config (
    id BIGINT AUTO_INCREMENT PRIMARY KEY,
    number_type VARCHAR(20) NOT NULL COMMENT '类型: life_path/talent/birthday/destiny',
    number_value INT NOT NULL COMMENT '数字值 1-9 或主数 11/22/33',
    title VARCHAR(50) COMMENT '称号',
    keywords VARCHAR(200) COMMENT '性格关键词',
    mind_base INT DEFAULT 0 COMMENT '心先天基础分(百分位)',
    mind_advice TEXT COMMENT '心维度成长建议',
    color_hex VARCHAR(10) COMMENT '代表色',
    created_at DATETIME DEFAULT CURRENT_TIMESTAMP,
    UNIQUE KEY uk_type_num (number_type, number_value)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COMMENT='数字能量详细配置表';

3.4 数字能量计算规则(后端 Service 实现)

从出生日期推导:

  • 生命灵数(life_path):年月日所有数字相加直至个位(主数 11/22/33 保留)
  • 天赋数(talent):生命灵数计算过程中化简前的两位数
  • 生日数(birthday):出生日化简至个位
  • 命运数(destiny):出生年月日总和化简(简化版,不含姓名)

四、后端服务层设计

4.1 新增 InnatePortraitService(先天画像聚合服务)

核心服务,职责:

  1. 聚合先天画像:从 family_member_attributes + 各配置表聚合出完整先天画像(八字/五行/星座/血型/灵数/天赋数/生日数/命运数)
  2. 复用 calcInnateScore 计算 mind_base_score:不重复实现加权逻辑,直接调用现有 FamilyMemberAttributeService.calcInnateScore()(该服务已实现 zodiac×50% + bazi×30% + blood×20% 加权并缓存到 mind_base_score)
  3. 数字能量计算:从出生日期推导生命灵数/天赋数/生日数/命运数
  4. AI 解读编排:调用 LangGraph graph 生成解读,结果缓存到 innate_portrait_report

关键决策:mind_base_score 的计算逻辑已存在于 FamilyMemberAttributeService.calcInnateScore()(zodiac×50% + bazi×30% + blood×20%,已缓存)。InnatePortraitService 复用该方法,不重复实现。管理端可配置权重(innate_portrait_config)将替换 calcInnateScore 中的硬编码权重(详见 §7.5)。

@Service
public class InnatePortraitService {

    @Resource
    private FamilyMemberAttributeService familyMemberAttributeService;

    @Resource
    private InnatePortraitConfigMapper innatePortraitConfigMapper;

    @Resource
    private InnatePortraitReportMapper innatePortraitReportMapper;

    @Resource
    private NumSoulDetailConfigMapper numSoulDetailConfigMapper;

    @Resource
    private AiGateway aiGateway;

    /**
     * 聚合先天画像 + 复用 calcInnateScore 计算 mind_base_score
     */
    public InnatePortraitVO getInnatePortrait(Long memberId, String memberType) {
        // 1. 读取 family_member_attributes
        // 2. 聚合各来源数据(八字/五行/星座/血型/灵数)
        // 3. 计算数字能量(生命灵数/天赋数/生日数/命运数)
        // 4. 复用 familyMemberAttributeService.calcInnateScore(memberId, memberType, "mind")
        // 5. 返回完整画像
    }

    /**
     * 生成 AI 解读(缓存到 innate_portrait_report)
     */
    public InnatePortraitReportVO generateAiReading(Long memberId, String memberType) {
        // 1. 检查缓存,未过期直接返回
        // 2. 聚合先天画像
        // 3. 调用 AiGateway 生成 AI 解读
        // 4. 缓存结果
    }

    /**
     * 数字能量计算
     */
    public NumSoulDetailVO calculateNumSoul(Date birthDatetime) {
        // 生命灵数/天赋数/生日数/命运数
    }

    /**
     * 先天+后天成长轨迹
     */
    public InnateTrajectoryVO getTrajectory(Long memberId, String memberType, Long familyId) {
        // 1. 读取先天画像 + mind_base_score
        // 2. 读取 energy_balance(后天当前能量)
        // 3. 计算先天 vs 后天的差值/趋势
        // 4. 结合 AI 解读生成成长建议
    }
}

4.2 新增 DTO

  • InnatePortraitVO:完整先天画像(八字/五行/星座/血型/灵数/天赋数/生日数/命运数 + mind_base_score)
  • NumSoulDetailVO:数字能量详情(各类型数字 + 配置解读)
  • InnatePortraitReportVO:AI 解读报告(画像 + AI 文案 + 分数)
  • InnateTrajectoryVO:先天+后天成长轨迹

4.3 新增 Controller

InnatePortraitController(/api/mind/innate):

  • POST /api/mind/innate/portrait — 获取先天画像
  • POST /api/mind/innate/reading — 生成/获取 AI 解读
  • POST /api/mind/innate/numsoul — 获取数字能量详情
  • POST /api/mind/innate/trajectory — 获取先天+后天成长轨迹

4.4 新增 Mapper

  • InnatePortraitConfigMapper
  • InnatePortraitReportMapper
  • NumSoulDetailConfigMapper

五、AI 解读(LangGraph graph)设计

5.1 新增 innate_portrait_graph(先天画像解读 graph)

在 cfc-langgraph/app/graphs/ 新增 innate_portrait_graph.py,接收先天画像原始数据,AI 主导生成个性化解读。

┌─────────────┐   ┌──────────────┐   ┌──────────────┐   ┌──────────────┐
│ 收集画像数据  │ → │ 组装解读Prompt│ → │ LLM生成解读   │ → │ 结构化输出    │
│ (portrait)  │   │ (prompt)     │   │ (解读文案)    │   │ (JSON)       │
└─────────────┘   └──────────────┘   └──────────────┘   └──────────────┘

graph 节点设计:

  1. build_prompt:接收先天画像数据(八字四柱/五行/星座/血型/灵数/天赋数/生日数/命运数),组装解读 prompt(含角色设定:家庭教育/成长陪伴语境)
  2. generate:调用 LLM 生成解读(心维度特质 + 成长建议 + 亲子互动建议)
  3. parse:解析 LLM 输出为结构化 JSON

输出结构:

{
  "mindTraits": "心维度特质描述(基于五行/星座/灵数综合分析)",
  "strengths": ["先天优势1", "先天优势2"],
  "growthAdvice": "心维度成长建议",
  "parentAdvice": "家长互动建议",
  "wuxingBalance": "五行平衡提示"
}

5.2 新增 FastAPI 端点

在 app/api/adapter.py 或新增 app/api/innate.py:

  • POST /api/v1/innate/reading — 接收先天画像数据,返回 AI 解读

5.3 AiGateway 扩展

在 AiGateway.java 新增方法:

public Map<String, Object> generateInnateReading(Map<String, Object> portrait) {
    // POST baseUrl + "/api/v1/innate/reading"
    // 熔断 + fallback(fallback 返回模板文案)
}

Fallback 策略(关键):

  • AI 服务不可用时,降级为 bazi_reading_template 模板文案 + numsoul_detail_config 静态文案拼接
  • 保证功能可用,AI 是增强不是依赖

5.4 Prompt 设计要点

解读 prompt 需:

  • 角色设定:家庭教育成长陪伴师
  • 结合五行哲学(心=火)与五维能量体系
  • 强调"先天特质 + 后天成长"视角
  • 避免宿命论措辞,强调"了解先天特质 → 针对性培养"
  • 输出限定 JSON 结构

六、先天+后天打通设计

6.1 数据流打通

现有五维能量体系用 energy_balance(当前能量)+ energy_log(流水)。先天基础分(mind_base_score)需要与后天能量打通,展示成长轨迹。

设计思路:

  • 先天:mind_base_score(0-100)作为心维度的"起点基线"
  • 后天:energy_balance(当前能量值)作为心维度的"当前状态"
  • 成长轨迹:先天 vs 后天对比,展示"天赋起点 → 后天成长"

6.2 新增接口:POST /api/mind/innate/trajectory

返回某成员的先天画像 + 后天成长轨迹:

{
  "innatePortrait": { "mindBaseScore": 72, "zodiac": "狮子座", "lifeNumber": 3, "..." },
  "innateDimensionScores": { "body": 65, "mind": 72, "wisdom": 68, "action": 60, "wealth": 55 },
  "currentEnergy": { "mindBalance": 120, "mindTotalEarned": 350, "..." },
  "trajectory": {
    "innateVsCurrent": { "mindInnate": 72, "mindCurrent": 81, "growth": "+9" },
    "growthTrend": "先天心能量充沛,后天通过情绪打卡/家庭互动持续成长",
    "advice": "保持当前情绪打卡频率,建议增加家庭共处时间..."
  }
}

6.3 打通逻辑

InnatePortraitService.getTrajectory(memberId, memberType, familyId):

  1. 读取先天画像 + mind_base_score
  2. 读取 energy_balance(后天当前能量)
  3. 计算先天 vs 后天的差值/趋势
  4. 结合 AI 解读生成成长建议

6.4 展示位置

小程序 pages/mind-detail/index.vue 心维度首页,新增"先天画像"卡片:

  • 显示先天心能量基础分 + 后天当前能量分
  • 先天数字能量画像(生命灵数/天赋数等)
  • 点击进入 AI 解读报告页

七、管理端可配置化设计

7.1 新增管理端页面:InnatePortraitConfig.vue

在 cfc-web/src/views/admin/ 新增,管理先天画像来源权重配置:

功能:

  • 各来源(星座/八字/血型/数字能量)的权重配置(基点)
  • 启停开关(enabled)
  • AI 解读开关(ai_enabled)
  • 排序

7.2 新增管理端页面:NumSoulDetailConfig.vue

管理数字能量详细配置(numsoul_detail_config):

功能:

  • 按数字类型(生命灵数/天赋数/生日数/命运数)筛选
  • 每个数字(1-9 + 主数11/22/33)的称号/关键词/心维度成长建议/代表色
  • 增删改查

7.3 新增管理端 Controller

  • InnatePortraitConfigController(/api/admin/innate-portrait-config):list/create/update/delete
  • NumSoulDetailConfigController(/api/admin/numsoul-detail-config):list/create/update/delete

7.4 菜单接入

在管理端菜单(SysMenuController / 前端路由)新增入口:

  • 先天画像配置
  • 数字能量配置

7.5 权重替换硬编码逻辑(缺陷修复)

现有逻辑:FamilyMemberAttributeService.calcInnateScore() 硬编码:

Integer result = (zodiacScore * 5000 + baziScore * 3000 + bloodScore * 2000) / 10000;

改造:calcInnateScore() 改为读取 innate_portrait_config 表权重:

// 读取配置(默认 zodiac/bazi/blood/numsoul 各 25%)
// 只累加 enabled=1 的来源
// 权重未配置时回退到现有硬编码 50/30/20
Integer result = (zodiacScore * wZodiac + baziScore * wBazi + bloodScore * wBlood + numsoulScore * wNumsoul) / 10000;

要求:

  • 权重未配置(表空)时回退到现有 50/30/20 硬编码,保证存量数据不变化
  • numsoul_score 从 numsoul_detail_config.life_path.mind_base 读取(按生命灵数匹配)
  • 启用的来源权重之和不足 100% 时按比例归一化,超过则按比例缩放

八、前端小程序展示设计

8.1 新增页面:pages/mind-detail/innate-portrait.vue(先天画像报告页)

展示 AI 解读报告:

  • 头部:成员头像 + 先天心能量基础分
  • 先天画像:八字四柱 / 五行能量 / 星座 / 血型 / 数字能量(生命灵数/天赋数/生日数/命运数)
  • AI 解读:心维度特质 / 先天优势 / 成长建议 / 家长互动建议
  • 五行平衡:五行能量条

8.2 新增页面:pages/mind-detail/innate-trajectory.vue(先天+后天成长轨迹页)

展示成长轨迹:

  • 先天 vs 后天:心维度先天基础分 vs 当前能量分对比
  • 成长趋势:趋势图/文案
  • 成长建议:AI 生成的针对性建议

8.3 心维度首页增强:pages/mind-detail/index.vue

在现有首页新增"先天画像"入口卡片:

  • 显示先天心能量基础分
  • 点击进入先天画像报告页
  • 显示数字能量画像(生命灵数等)

8.4 小程序限制遵守

  • 禁止可选链 ?.(用 && 替代)
  • 禁止 CSS Grid(用 flexbox)
  • 禁止 :key 表达式(用方法调用)
  • 禁止直接 new Date(string)(用 parseDate())
  • Vue 2 Options API

九、数据库迁移

在 DatabaseInitializer.runMigrations() 新增迁移(编号从 267 开始):

  1. 迁移267:创建 innate_portrait_config 表 + 种子数据(4 来源默认权重 25%)
  2. 迁移268:创建 innate_portrait_report 表
  3. 迁移269:创建 numsoul_detail_config 表 + 种子数据(4 类型 × 数字 1-9 + 主数,含 mind_base 字段)

同步更新 schema.sql 的 CREATE TABLE 定义。

注意:numsoul_detail_config 的 mind_base 字段是数字能量参与 mind_base_score 加权计算的关键。种子数据需为每个数字类型(life_path/talent/birthday/destiny)的每个数字(1-9 + 主数 11/22/33)配置 mind_base 值。


十、测试策略

10.1 后端单元测试

  • InnatePortraitServiceTest:数字能量计算(生命灵数/天赋数/生日数/命运数)、先天画像聚合
  • NumSoulDetailConfigMapperTest:配置表 CRUD
  • FamilyMemberAttributeServiceTest(扩展):calcInnateScore 权重替换后——配置表权重生效、表空时回退硬编码 50/30/20、numsoul 参与加权、权重归一化

10.2 后端集成测试

  • InnatePortraitControllerTest:portrait/reading/numsoul/trajectory 接口
  • AI 解读 fallback 测试(AI 不可用时降级模板文案)
  • calcInnateScore 权重替换回归测试(存量数据 mind_base_score 不因权重替换而变化)

10.3 前端测试

  • 小程序页面渲染测试(先天画像报告页/成长轨迹页)
  • 管理端配置页 CRUD 测试

十一、非目标(YAGNI)

  • 不重构现有 zodiac_config/bazi_config/blood_type_config 表结构
  • 不新增手机号/车牌号等后天数字能量分析
  • 不重构现有天盘/合盘/镜像页面
  • 不引入新的中间件或依赖