替换现有"帮助记录型章鱼图"(contact_help_logs + OctopusDiagram),上线"关键人拓展型章鱼图"。 面向小程序端用户(家长/孩子),基于会员成交订单挖掘关键人,四步法 + 高频词分析 + ≤8 个拓展方向。
| 项目 | 说明 |
|---|---|
| 替换对象 | 现有 contact_help_logs 表、OctopusController、OctopusDiagram.vue(帮助记录型:谁帮过我) |
| 新定位 | 关键人拓展图谱:成效对象(会员客户) → 类型(金额大/频次高/新成交) → 关键人(单位/部门/职务/初识场合/如何认识) → 四步法分析 → 高频词提炼 → ≤8 个拓展方向 |
| 使用端/角色 | 小程序端,面向用户(家长/孩子),非规划师 |
| 数据隔离 | 以 user_id 为唯一租户键,无 child/family 概念 |
octopus_effect_record(成效记录)| 字段 | 类型 | 说明 |
|---|---|---|
id |
BIGINT PK | 自增主键 |
user_id |
BIGINT NOT NULL | 当前用户(租户键) |
member_order_id |
BIGINT | 关联 MemberSubscriptionOrder.id(会员订单),可空 |
effect_type |
TINYINT UNSIGNED | 成效类型 bitmask:1=金额大, 2=频次高, 4=新成交(支持多选) |
effect_amount |
DECIMAL(10,2) | 成效金额(元) |
effect_desc |
VARCHAR(500) | 成效描述 |
status |
TINYINT | 1=有效, 0=无效 |
created_at |
DATETIME | 创建时间 |
| 索引 | idx_oer_user(user_id), idx_oer_order(member_order_id) |
octopus_key_person(关键人画像)| 字段 | 类型 | 说明 |
|---|---|---|
id |
BIGINT PK | 自增主键 |
user_id |
BIGINT NOT NULL | 当前用户(租户键) |
name |
VARCHAR(64) NOT NULL | 关键人姓名 |
organization |
VARCHAR(128) | 单位/公司 |
department |
VARCHAR(64) | 部门 |
title |
VARCHAR(64) | 职务/职位 |
first_meet_scene |
VARCHAR(128) | 初识场合 |
know_way |
VARCHAR(255) | 如何认识(认识路径) |
contact_info |
VARCHAR(255) | 联系方式(可选) |
created_at |
DATETIME | 创建时间 |
| 索引 | idx_okp_user(user_id), idx_okp_org(organization) |
octopus_effect_key_person(成效-关键人 多对多)| 字段 | 类型 | 说明 |
|---|---|---|
id |
BIGINT PK | 自增主键 |
effect_id |
BIGINT NOT NULL | 关联 octopus_effect_record.id |
key_person_id |
BIGINT NOT NULL | 关联 octopus_key_person.id |
role |
TINYINT | 1=引荐, 2=决策, 3=其他 |
created_at |
DATETIME | 创建时间 |
| 索引 | idx_oekp_effect(effect_id), idx_oekp_person(key_person_id), uk_oekp(effect_id,key_person_id) UNIQUE |
统一 POST + Result<T> + user_id 从 JWT 解析。
| 步骤 | 接口 | 说明 |
|---|---|---|
| 1. 盘点项目 | POST /api/octopus/effect/list |
分页列表,支持 effect_type 筛选 |
POST /api/octopus/effect/add |
录入成效:member_order_id + effect_type(bitmask) + amount + desc | |
POST /api/octopus/effect/delete |
删除成效(级联删除关联关系) | |
| 2. 找关键人 | POST /api/octopus/key-person/add |
手工填:name/org/dept/title/first_meet_scene/know_way/contact_info |
POST /api/octopus/key-person/update |
修改关键人画像 | |
POST /api/octopus/key-person/delete |
删除关键人(级联关系) | |
POST /api/octopus/effect/key-persons |
查看某成效的关键人列表 | |
| 3. 分析关键人 | POST /api/octopus/analysis/keywords |
统计用户所有关键人的高频词(org/industry/identity/title/scene/way),返回 Top 词频 |
POST /api/octopus/analysis/summary |
基于高频词提炼 ≤8 个拓展方向(单位/行业/身份/职业维度聚合) | |
| 4. 拓展关键人 | POST /api/octopus/expansion/suggest |
根据分析结果推荐新关键人画像模板(预填行业/职位等) |
所有列表接口:统一 Result<{list, total, page, pageSize}>。
effect/list 每条记录:
{
"id": 1,
"memberOrderId": 100,
"effectType": 7,
"effectTypeList": ["金额大","频次高","新成交"],
"effectAmount": 2500.00,
"effectDesc": "...",
"status": 1,
"createdAt": "2026-09-01 10:00:00"
}
effectType 为 bitmask(1=金额大 2=频次高 4=新成交),同时返回解析后的 effectTypeList 供前端展示标签。
effect/key-persons 每条记录:
{
"id": 200,
"name": "张三",
"organization": "XX公司",
"department": "市场部",
"title": "总监",
"firstMeetScene": "家长会",
"knowWay": "孩子班主任介绍认识",
"contactInfo": "138xxxx",
"role": 1,
"roleName": "引荐",
"createdAt": "..."
}
role 1=引荐 2=决策 3=其他,同时返回 roleName。
analysis/summary 返回:
{
"directions": [
{ "dimension": "organization", "keyword": "重点小学家委会", "count": 12, "reason": "家长社群聚集地" },
{ "dimension": "title", "keyword": "教育从业者", "count": 8, "reason": "行业垂直人脉" }
]
}
directions 数组长度 ≤8,按 count 降序。
expansion/suggest 返回:
每个方向提供可直接用于 key-person/add 的请求体模板(organization/department/title/firstMeetScene/knowWay 均预填),前端一键点击后跳转到录入页并预填。
pages/action-detail/index.vue 内嵌,替换现有 OctopusDiagram 区块| 态 | 触发条件 | UI |
|---|---|---|
| 加载中 | 数据请求中 | "加载关键人拓展图..." |
| 空态 | 无成效记录 | "暂无成效记录" + "➕ 记录成效" 按钮 → 跳转录入页 |
| 图谱态 | 有数据 | 核心画布 |
中心节点:"我"(当前用户)
│
├─ 第1层:成效记录节点(卡片/气泡,标签:金额大/频次高/新成交)
│ └─ 点击 → 展开该成效的关键人列表
│
├─ 第2层:关键人节点(头像+姓名+单位/职务,边标记:引荐/决策)
│ └─ 点击 → 弹窗完整画像(单位/部门/职务/初识场合/如何认识/联系方式)
│
└─ 第3层:拓展方向节点(虚线/浅色,≤8个,来源:analysis/summary)
└─ 点击 → 弹出"建议画像模板" → 一键预填 → 跳转"添加关键人"页
用户所有关键人
│
├─ analysis/keywords:统计 org/industry/identity/title/scene/way 词频
│
├─ analysis/summary:聚合维度(单位/行业/身份/职业)提炼 Top 8 方向
│
└─ expansion/suggest:为每个方向生成"建议画像模板"(预填行业/职位等)
analysis/summary 刷新OctopusDiagram 的三态模板风格type="2d" + uni.createSelectorQuery().in(this).select('#canvas').fields({node:true,size:true,rect:true}) + dpr 自适应OctopusDiagram/PearlDiagram 复用模式)| 项目 | 值 |
|---|---|
| 主色 | #F97316(暖橙) |
| 次色 | #F59E0B(金)、#10B981(绿)、#6366F1(紫) |
| 背景 | #f5f5f5 页面底,白底卡片圆角 16rpx |
| 字体 | PingFang SC / 微软雅黑,14px 基准 |
| 布局 | flexbox only,禁 CSS Grid |
| 日期显示 | yyyy-MM-dd HH:mm:ss / yyyy-MM-dd(统一前端格式化,禁止 toLocaleString) |
| 可选链 | 禁 ?.,用 && 替代 |
| 步骤 | 动作 |
|---|---|
| 1 | 后端新建 3 表迁移(octopus_effect_record/octopus_key_person/octopus_effect_key_person),写入 DatabaseInitializer 迁移 304+(先 grep 确认最新编号再递增) |
| 2 | 后端新建 Entity/Mapper/Service/Controller(新建 KeyPersonController,不在 OctopusController 上改,保持职责清晰) |
| 3 | 前端新建 OctopusDiagram.vue(全新实现,替换旧组件)、成效录入页、关键人录入页 |
| 4 | pages/action-detail/index.vue 替换 <OctopusDiagram> 引用为新组件 |
| 5 | 旧文件处理:OctopusDiagram.vue / octopus-add-help.vue / octopus-records.vue 直接删除(不保留废弃版本);OctopusController.java 标记 @Deprecated,所有接口返回 410 Gone + 新接口路径;contact_help_logs 表保留归档不删,DatabaseInitializer 中该迁移块注释掉(保持幂等) |
| 6 | API_REFERENCE.md 同步新接口;OctopusController 接口标记废弃,指向新 /api/octopus/effect/* 等路径 |
| 7 | 灰度验证(先测试库运行)→ 全量切换 |
user_id 隔离,不可跨用户访问| 场景 | 前端行为 |
|---|---|
| 接口返回 code ≠ 200 | uni.showToast({ title: res.message, icon: 'none' }) |
| 网络异常 | uni.showToast({ title: '网络错误', icon: 'none' }) |
| 删除成功 | uni.showToast({ title: '已删除', icon: 'success' }) 后重载列表 |
| 保存成功 | uni.showToast({ title: '保存成功', icon: 'success' }) 后 navigateBack |
child_id/family_id,纯 user_id 隔离@PostMapping,Result<T> code=200 成功@TableName + @TableId(type=IdType.AUTO)@Resource 注入,字段名匹配默认 Bean Name?.、禁 CSS Grid、禁 :key 表达式、禁 new Date(string)、统一日期格式化MemberSubscriptionOrder 只读关联,不修改其结构CREATE TABLE IF NOT EXISTS + try-catch 忽略已存在API_REFERENCE.md 必须随接口上线更新| 检查项 | 结果 |
|---|---|
| 占位符/待定 | 无,所有枚举/bitmask/响应结构均已明确 |
| 内部一致性 | 数据模型/API/前端三节互相对齐,API 响应结构与前端三态模板一一对应 |
| 范围检查 | 单一规格覆盖完整替换链路,无需拆分子项目 |
| 模糊性 | bitmask 语义、role 枚举、≤8 方向、预填字段均明确定义 |
| YAGNI | 移除不必要字段(contact_info 可选、effect_desc 可空);analysis/keywords 仅 summary 驱动,不额外暴露 |
| 错误处理 | 统一 Toast 三态(成功/失败/网络),已写入第7节 |
| 权限 | 所有登录用户可用,无额外角色检查,已写入第7节 |
| 旧文件清理 | 删除旧组件 + 标记 Controller 410 + 保留 contact_help_logs 归档,已写入第6节 |
规格已写入 docs/superpowers/specs/2026-09-10-key-person-expansion-octopus-design.md。
请审查,如需修改请告诉我;批准后我将调用 writing-plans 创建实现计划。