文档版本:v1.1(v1.0 → v1.1 增补 RT-01
06 挽留动作 + GR-04 防滥用 + RT-05 双通道触发) 文档类型:从 PRD v2.0 提取的专项设计说明 + 原型 v1.0v1.6 设计沉淀 来源文档:PRD_代聊系统_产品需求文档 (1).md+PRD_代聊系统_技术落地版 (1).md+ 高保真原型 v1.6 PRD 版本:v2.0 | 2026-04-08 整理日期:2026-05-23 → 更新于 2026-05-25 整理人:PM 助手 + 张一章 关联条款:CP-01 ~ CP-05、GR-02、GR-04(v1.1 新增)、EX-08、AC-27 ~ AC-32、RT-01 ~ RT-06(v1.1 新增)、AC-55 ~ AC-57(v1.1 新增)
对代聊员撒谎,保护创作者。 代聊员对冷静期完全不知情。
如果代聊员知道"24 小时后这个号就不属于我了",极有可能疯狂发低俗内容、引流竞品、拉黑粉丝,进行同归于尽式毁号操作。
Off(关闭) ─→ On(开启) ─→ CoolingDown(冷静期) ─→ Off / On(撤回)
| 状态 | 数据库字段 | 判定逻辑 | 系统行为 |
|---|---|---|---|
| Off | agent_chat_enabled=false · agent_chat_disabled_at=NULL |
默认状态 | 不触发任何代聊/AI |
| On | agent_chat_enabled=true · agent_chat_disabled_at=NULL |
创作者主动开启 | 正常运行代聊+AI |
| CoolingDown | agent_chat_enabled=true · agent_chat_disabled_at 有值且 < 24h |
创作者点了关闭但还在 24h 内 | 代聊继续工作(代聊员不知情)+ 创作者看到倒计时 + 可撤回 |
| 编号 | 规则名称 | 规则内容 | 优先级 |
|---|---|---|---|
| CP-01 | 关闭不立即生效 | 创作者点关闭 → 设 agent_chat_disabled_at=NOW(),不立即关 agent_chat_enabled |
P0 |
| CP-02 | 创作者端倒计时 | 创作者看到"代聊将在 xx 小时后停止" + 撤回按钮 | P0 |
| CP-03 | 创作者可撤回 | 冷静期内点撤回 → 清除 disabled_at,恢复正常 |
P1 |
| CP-04 | 挽留弹窗 | 关闭时弹窗显示代聊收入数据,引导不要关闭 | P1 |
| CP-05 | 到期自动关闭 | 24h 后 agent_chat_enabled=false,所有 agent_session 关闭,对话回到创作者端 |
P0 |
| GR-02 | 静默冷静期 | 创作者关闭代聊后 24h 冷静期内,代聊端零提示零警告,一切照常。到期瞬间弹"用户已离线"切断 | P0 |
| 时间点 | 看到什么 |
|---|---|
| 点击关闭时 | 挽留弹窗:"代聊帮你赚了 ¥2,380,关闭后粉丝互动将无人响应,确认关闭吗?" |
| 确认关闭后 | 倒计时:"代聊将在 23 小时 58 分 后停止服务" + 蓝色"撤回关闭"按钮 |
| 冷静期内 | 倒计时持续走,随时可一键撤回 |
| 24h 到期 | 提示"代聊已关闭",所有对话恢复到消息列表 |
| 时间点 | 看到什么 |
|---|---|
| 冷静期全程 | 什么都没有。 零提示、零警告、零倒计时。正常聊天、正常发 PPV、正常拿提成 |
| 24h 到期瞬间 | 弹出常规提示"用户已离线"或"会话已结束",会话从列表消失 |
| 事后 | 代聊员以为是正常的用户流失,不会意识到是创作者主动关的 |
users 表新增 2 个字段:
| 字段 | 类型 | 用途 |
|---|---|---|
agent_chat_enabled |
BOOLEAN | 创作者是否开启代聊 |
agent_chat_disabled_at |
TIMESTAMPTZ | 关闭代聊的时间(24h 冷静期判定基准) |
| 方法 | 路径 | 说明 |
|---|---|---|
| PUT | /users/me/agent-chat |
开启/关闭代聊(含 24h 冷静期逻辑) |
| GET | /users/me/agent-chat/status |
代聊状态查询,返回:开启 / 冷静期中 / 已关闭 + 倒计时 |
graph TD
A["创作者点击'关闭代聊'"] --> B["弹出挽留弹窗(CP-04)"]
B --> C{"创作者坚持关闭?"}
C -->|"被挽留,取消"| D["保持开启"]
C -->|"确认关闭"| E["设置 agent_chat_disabled_at = NOW()<br/>agent_chat_enabled 保持 true(CP-01)"]
E --> F["创作者端:显示24h倒计时(CP-02)<br/>+ 一键撤回按钮"]
E --> G["代聊端:零提示<br/>一切照常工作(GR-02)"]
F --> H{"创作者24h内撤回?"}
H -->|"撤回(CP-03)"| I["清除 disabled_at<br/>恢复正常"]
H -->|"未撤回,24h到(CP-05)"| J["agent_chat_enabled = false<br/>所有 agent_session 关闭"]
J --> K["创作者端:<br/>所有对话恢复可见"]
J --> L["代聊端:<br/>弹出'用户已离线'<br/>会话消失"]
style G fill:#d4edda,stroke:#28a745
style L fill:#f8d7da,stroke:#dc3545
style E fill:#e8daef,stroke:#8e44ad
Tab1 代聊设置包含:
| 编号 | 验收项 | 验证方式 | 关联规则 | ☐ |
|---|---|---|---|---|
| AC-27 | 挽留弹窗 | 点关闭 → 显示收入数据 + 确认按钮 | CP-04 | ☐ |
| AC-28 | 倒计时显示 | 确认后 → 创作者端显示 24h 倒计时 | CP-02 | ☐ |
| AC-29 | 可撤回 | 冷静期内点撤回 → 代聊恢复正常 | CP-03 | ☐ |
| AC-30 | 代聊端零提示 | 冷静期全程 → 代聊工作台无任何异常 | GR-02 | ☐ |
| AC-31 | 到期切断 | 24h 到 → 代聊端弹"用户已离线" | CP-05 | ☐ |
| AC-32 | 到期后恢复 | 所有对话回到创作者消息列表 | CP-05 | ☐ |
场景:频繁开 → 关 → 开
系统处理:
优先级:P1
| 维度 | 设定 |
|---|---|
| 冷静期时长 | 24 小时(不可调整) |
| 触发字段 | users.agent_chat_disabled_at |
| enabled 字段 | 冷静期内保持 true,到期才置 false |
| 创作者端 | 全程透明,倒计时 + 可撤回 |
| 代聊员端 | 全程静默,零提示,到期才感知 |
| 挽留机制 | 关闭瞬间弹窗显示已赚收入 |
| 撤回机制 | 冷静期内随时可撤回,不消耗次数 |
| 优先级 | CP-01/02/05 + GR-02 全部 P0;CP-03/04 P1 |
| 关联验收 | AC-27 ~ AC-32 共 6 项 |
风险描述:如果代聊员知道冷静期存在,可能在 24h 内进行毁号操作(发低俗内容、引流竞品、拉黑粉丝)。
防护机制:
agent_chat_enabled 在冷静期内保持 true,代聊端无法通过状态判定风险描述:完全黑箱让创作者怀疑"平台是不是拿着我的账号搞诈骗""我的死忠粉是不是被洗走了"。
防护机制:
风险描述:频繁开关代聊会触发多次粉丝重新分配,可能影响代聊员效率。
防护机制:
CP-04 挽留弹窗只在"关闭瞬间"触发一次。如果创作者点击确认关闭后开始进入 24h 冷静期,期间可能因为情绪冷静下来想撤回,但没有外部刺激提醒"代聊还在赚钱"。流失率分析显示:仅靠 CP-04 单点挽留,撤回率 < 8%。
v1.1 引入 RT 系列挽留动作(Retention) ,把挽留链路从"单点击穿"扩展到"全程渗透",覆盖:关闭瞬间 → 冷静期间 → 撤回成功 → 最后 1 小时强提醒。预期撤回率提升至 25-35%。
| 编号 | 名称 | 触发时机 | 通道 | 对应 PRD 关联 |
|---|---|---|---|---|
| RT-01 | 强化挽留弹窗 | 创作者点击关闭瞬间(增强 CP-04) | 弹窗内嵌行业对标动态柱状图 | CP-04 |
| RT-02 | 冷静期顶部 sticky 横幅 | 进入冷静期立即出现,全程可见 | Tab 栏下方 sticky 横幅(黄/红双形态) | CP-02 |
| RT-03 | 站内信中心 | 冷静期内代聊每笔产出 | 主动入站内信(用户自主查看,非被动 toast 骚扰) | 新增 |
| RT-04 | 撤回成功正反馈 | 创作者点击撤回时 | 中央绿色气泡:"已挽回 12 位粉丝活跃 + 减少损失 ¥1660" | CP-03 |
| RT-05 | 最后 1 小时强提醒 | 冷静期剩余 ≤ 1h | 双通道:① 全局弹窗(红色头模态) + ② 站内信推送 | 新增(v1.6 升级为双通道) |
| RT-06 | 战报数据快照 | 冷静期内进入战报 Tab | Tab 顶部黄色横幅"冷静期数据快照·24h 内持续更新" | GR-03 |
| 维度 | 设定 |
|---|---|
| 阈值 | 冷静期剩余时间 ≤ 1 小时(即 disabledAt + 23h ≤ Date.now()) |
| 检测器 | 顶部 sticky 横幅 TopCoolingBar 内置 1 秒 setInterval 持续检测 |
| 触发器 | 通过 onLastHour() 回调触发主组件双通道动作 |
| 去重锁 | lastHourFiredRef.current 布尔锁,仅触发一次(避免每秒重复推送) |
onLastHour() → ① setShowLastHourModal(true) (全局弹窗)
+ ② setInboxItems(prev => [{ (站内信推送)
type: 'chat',
title: '⚠ 冷静期最后 1 小时',
body: '代聊将在 1 小时内正式停止。如需保留代聊服务,请在到期前撤回关闭操作',
time, read: false
}, ...prev])
| 通道 | 形态 | 强度 | 创作者侧表现 |
|---|---|---|---|
| ① 全局弹窗 | 红色头模态(LastHourModal) | 强提醒 · 阻断式 | 当前会话立即看到 |
| ② 站内信推送 | 信件中心置顶单条 | 留底通知 · 非阻断式 | 当前会话信件徽章 +1,关闭弹窗后仍可在站内信查看历史记录 |
双通道目的:弹窗保证当前在线创作者立即感知;站内信保证创作者离线/关闭弹窗后仍能回看,不漏失。
LastHourModal 弹窗 JSX 不展示任何 RT-XX/规则编码标注:
设计编码(RT-XX)只在沙盒右侧 DocPanel 文档面板出现(开发/产品文档化用),创作者侧绝对干净。
EX-08 在 PRD v2.0 明确"不做额外限制,但运营可监控该创作者行为"。但运营监控是事后处置,无法防止:
GR-04 是前置硬约束:30 天内仅允许关闭一次代聊,让"关闭"成为创作者必须深思熟虑的高代价决策。
| 编号 | 规则名称 | 规则内容 | 优先级 |
|---|---|---|---|
| GR-04 | 防滥用频次限制 | 30 天内仅可关闭代聊一次。撤回成功视为本次窗口已用,下次关闭需间隔 ≥ 30 天。冷静期到期切断的同样计入。 | P0 |
关键细节:撤回也消耗次数
撤回操作(CP-03)虽然没有真正切断代聊服务,但仍消耗本次 30 天关闭额度。设计理由:
业务规则保留 + 前端展示全清:
| 端 | 是否感知 GR-04 |
|---|---|
| 数据库 | ✅ 完整记录(lastClosedAt 字段) |
| API | ✅ 完整返回(status 接口含 lastClosedAt) |
| 前端业务逻辑 | ✅ 限制期内 Toggle 自动 disabled |
| 创作者 UI 展示 | ❌ 完全隐藏:不展示"30 天内仅可关闭一次"任何文案、卡片、tooltip |
设计哲学:让创作者只感受到"按钮点不动"的物理性阻碍,不解释为什么不能点。理由:
| 字段 | 类型 | 用途 |
|---|---|---|
agent_chat_last_closed_at |
TIMESTAMPTZ | 最近一次"关闭决定"时间。confirmClose 时写入 NOW(),撤回时不重置,到期切断时不重置。用于计算 30 天窗口起点。 |
判定公式:
isRestricted = (Date.now() - lastClosedAt) < (30 × 24 × 3600 × 1000)
restrictionDaysLeft = Math.ceil((RESTRICT_MS - elapsed) / 86400000) // 仅业务计算用,不暴露给创作者
| 与 CP-01 关系 | CP-01 触发瞬间,同步写入 lastClosedAt = NOW()(与 disabled_at 写入同步) |
| 与 CP-03 关系 | 撤回时 disabled_at 清空但 lastClosedAt 保留(消耗次数核心) |
| 与 CP-05 关系 | 到期切断时同样不重置 lastClosedAt |
| 与 EX-08 关系 | EX-08 原文"不做额外限制"被 GR-04 替代,原文需更新为"受 GR-04 约束" |
| 方法 | 路径 | v1.0 → v1.1 变更 |
|---|---|---|
| PUT | /users/me/agent-chat |
请求体新增 last_closed_at 字段(仅 confirmClose 时写入 NOW(),撤回/到期不更新) |
| GET | /users/me/agent-chat/status |
响应体新增 last_closed_at(用于前端计算 isRestricted) |
| GET | /users/me/agent-chat/inbox |
新增:拉取代聊冷静期内的站内信列表(RT-03 + RT-05 写入) |
| POST | /users/me/agent-chat/inbox/:id/read |
新增:站内信标记已读 |
| 编号 | 验收项 | 验证方式 | 关联规则 | ☐ |
|---|---|---|---|---|
| AC-55 | GR-04 30 天限制生效 | 关闭后撤回 → 第二次点击 Toggle → 应 disabled 不可点 | GR-04 | ☐ |
| AC-56 | GR-04 创作者端零展示 | 限制期内 UI 全 grep → 无"30 天/防滥用/距离下次"字样 | GR-04 + v1.5 决策 | ☐ |
| AC-57 | RT-05 双通道同步触发 | 冷静期剩余 ≤ 1h 瞬间 → 同时出现 LastHourModal + 站内信 +1(仅一次) | RT-05 | ☐ |
风险描述:TopCoolingBar 每秒检测一次剩余时间,到达阈值后若不锁定,每秒触发 1 次会推送 60 条站内信。
防护机制:
lastHourFiredRef.current 布尔锁,触发后置 true 永不再触发风险描述:完全隐藏后,创作者发现 Toggle 点不动可能去客服投诉"系统坏了"。
防护机制:
风险描述:创作者撤回后想再次关闭被拒,可能投诉"我又没真正关闭怎么算我用过了"。
防护机制:
| 原型版本 | 引入特性 | 文档章节 |
|---|---|---|
| v1.0 | 形态3 双 Tab + 人设卡片(10 项设计风格落地) | 八、相关页面规格 |
| v1.1 | iPhone 17 适配 + RT-01~05 挽留动作首版 | 十三、挽留动作系统 |
| v1.2 | GR-04 防滥用 + 倒计时只保留顶部 + Toggle 置灰 | 十四、GR-04 + 13.2 RT-02 |
| v1.3 | H5 内 8 处规则编码全清 + 战报柱状图修复 | 13.3.3 弹窗设计原则 |
| v1.4 | Toast React 化 + 柱状图金额标注 | (沙盒交互细节,未单独章节化) |
| v1.5 | GR-04 创作者端全清 + Toast H5 内完全居中 | 14.3 创作者端隐藏 |
| v1.6 | RT-05 升级双通道(弹窗 + 站内信) | 13.3 RT-05 双通道触发机制 |
| 版本 | 日期 | 修订人 | 修订内容 |
|---|---|---|---|
| v1.0 | 2026-05-23 | PM 助手 + 张一章 | 从 PRD v2.0 提取整理首版冷静期专项设计说明 |
| v1.1 | 2026-05-25 | PM 助手 + 张一章 | 基于高保真原型 v1.0agent_chat_last_closed_at ⑤ 验收标准 AC-55~57 |