# Splay 2.0 表归档切库与功能裁剪计划

## 背景与目标

1.0 已结束，在 1.0 基础上推进 2.0：去掉部分老旧能力，保留机器人、客户端购买（非 VIP）、买剧、收益周期/发放/到期退本金等核心链路。

**切库策略（已定）**：不对业务表全面改名走 `s2_*`，而是对交易/用户态表做 **同库归档 rename → 同名空表重建**，业务读写路径尽量不动，降低改动面与破坏性。

**与现有 legacy 割接的关系**：`legacy_point_*` / `playd/splay2_migration.go` 负责 1.0 余额入金库与个人等级，与本计划「业务表归档空起」正交，可并存；本计划不重复迁用户余额。`cmd/liquidate` **已执行完毕**，切库窗口不再依赖清算步骤。

---

## 已确认决策

| # | 决策 |
|---|------|
| 1 | 账号体系表（含 `users` 及附属表）**共用 1.0 原表**，不归档、不清空 |
| 2 | **保留买剧**；2.0 **不保留任何 VIP 卡相关**能力与逻辑 |
| 3 | **版权包** 2.0 不保留；**福利广告位保留**（`Advertisement.TYPE_WELFARE` 继续可用） |
| 4 | 归档后新表 **空库起步**，不做 1.0→空表业务数据迁移；**机器人配置不迁移**（后台 2.0 重新配置） |
| 5 | **短剧媒资**与**系统配置**继续使用 1.0 原表 |
| 6 | 切库方式：交易/用户态表 `ALTER … RENAME TO xxx_1_0` + `CREATE TABLE xxx (LIKE xxx_1_0 INCLUDING ALL)`；**不用** `s2_*` 并行表方案 |
| 7 | 功能下线仍需改代码：VIP / 福利页任务 / AI 聊天 / 版权包 / CPS 分销展示与入口 |
| 8 | **邀请体系**：2.0 **只保留粉丝码体系**；CPS 分销体系对用户侧下线。注册入参及**所有用户端可见**邀请标识统一展示/接收为 **uid**；底层落库与关系链仍可用 `F` 开头粉丝码，内部逻辑可不大改 |
| 9 | **`robot_coupon_rules` 随机器人空起**（归档重建，不迁 1.0 规则） |
| 10 | **弹幕相关表空起**（归档重建；聊天下线后短剧侧若仍用弹幕则写新空表） |
| 11 | **2.0 活动只保留**：升级补贴（`upgrade_subsidies`）、合伙人计划（`partner_*`），均空起；**其余运营活动全部下线**（只归档、不接流量） |
| 12 | `liquidate` 已跑过，计划中不再安排清算步骤 |
| 13 | 管理端查 `*_1_0` 只读接口：**暂时不做** |

---

## 方案说明

### 为何选「归档 + 同名空表」

- 业务 SQL / bun 模型表名不变，改动集中在「功能下线」与少量边界校验。
- 1.0 历史留在同库 `*_1_0`，便于对账、客服、审计；比「仅备份后 TRUNCATE」更安全。
- 硬切场景下无需维护两套读写路径；若未来要长期双端并行，再评估 `s2_*`（当前不做）。
- 管理端暂不提供查 `*_1_0` 的只读 API；需要时再加。

### 执行模式（示意）

```sql
-- 示例：tips_ledgers
ALTER TABLE tips_ledgers RENAME TO tips_ledgers_1_0;
CREATE TABLE tips_ledgers (LIKE tips_ledgers_1_0 INCLUDING ALL);
-- 索引/约束/序列：LIKE INCLUDING ALL 后按 PG 版本核对序列归属与自增
```

注意：

- 有 `REFERENCES users(user_id)` 等外键的表，归档后空表需重建等价外键。
- Identity / serial 需确认新表序列从 1 起或按需设置，避免与历史 ID 混淆（空起一般从 1 即可）。
- 迁移脚本须幂等或带 `data_migration_runs` / 专用标记，防止重复 rename。
- **白名单表绝对不能 rename**（见下文「保留原表」）。

### 邀请体系（粉丝码 only + 对外 uid）

1.0 并存两套路：

- **CPS 分销**（分销商申请、CPS 榜单/入口等）
- **粉丝码体系**（`fans_code` / `inviter_fans`，库内多为 `F` 前缀）

2.0：

| 层 | 行为 |
|----|------|
| 用户端 API / 展示 | 邀请人、分享码等一律用 **uid**（注册入参也收 uid） |
| 落库 / 关系链 | 可继续写/查 `F…` 粉丝码与现有 `inviter_fans` / `inviter_user_ids` 结构，**底层逻辑尽量不动** |
| 转换 | 入口：uid → 查用户 → 取/校验粉丝码再走原邀请逻辑；出口：粉丝码/内部字段 → 对用户只返回 uid |
| CPS | 用户侧下线；`services/cps`、分销商相关入口停用或对客户端不可见（`distributor_applies` 等账号表仍保留在 A，仅停业务） |

---

## 功能取舍

### 保留（逻辑基本不变，落库见分类）

| 功能 | 说明 |
|------|------|
| 用户/登录/实名/提现卡等 | 共用 `users` 及账号附属表 |
| 邀请（仅粉丝码） | 对外 uid；对内仍可 F 码；CPS 用户侧下线 |
| 机器人管理与客户端购买 | 配置含券规则空起；购买/托管写空表后的 `robots` / `tips_ledgers` 等 |
| 收益周期、每日收益发放、到期退本金 | cron / `CheckRobotIncomeSettlement` 等仍打原表名（已是空表后的新数据） |
| 买剧 | `PRODUCT_TYPE_EPISODES`；去掉 VIP 相关判断 |
| 短剧媒资浏览/支持玩法 | 媒资读原表；支持份额等用户态走归档重建表 |
| 弹幕 | 表空起后若产品仍开放，写新表；与 AI 聊天解耦 |
| 福利广告位 | `advertisements` 原表保留，`TYPE_WELFARE` 继续下发 |
| 钱包余额 | 仍在 `users`；新流水写入空表后的 `point_ledgers` |
| 升级补贴 | `upgrade_subsidies` 归档空起后接 2.0 |
| 合伙人计划 | `partner_pool_records` / `partner_divided_records` 等空起后接 2.0 |

### 下线（2.0 不做）

| 功能 | 处理 |
|------|------|
| VIP 购买 / VIP 卡 | 下线 API 与 man 配置；订单禁止 `PRODUCT_TYPE_VIP`；`plans` / `user_plans` 归档 |
| VIP 解锁短剧 | 删除 `IsVip()` 免看/禁买剧等分支 |
| 福利页任务 | 下线 `/v1/task/*`、`/v1/user/task/*` 等；任务相关表归档 |
| AI 聊天 | 下线 chat API；`chat_*` / `sensitive_words` 等归档 |
| 版权包 | 下线 copyright 相关 API；版权包全套表归档 |
| CPS 分销（用户侧） | 下线 CPS/分销商用户入口；对外邀请统一粉丝码→uid |
| 除升级补贴、合伙人外的运营活动 | 表归档；API/cron/man 入口下线 |

---

## 表分类清单

> Bun 默认复数蛇形表名；下列以业务名为准。归档后缀统一：`_1_0`（例：`tips_ledgers` → `tips_ledgers_1_0`）。

### A. 保留原表（不 rename、不清空）

#### A1. 账号体系

- `users`（含 `fans_code`、`inviter_fans`、`inviter_user_ids` 等；关系数据保留，对外展示转 uid）
- `roles`、`verifications`、`distributor_applies`、`third_logins`
- `bank_cards`、`withdrawals`、`feedbacks`
- `invite_logs`、`login_logs`、`operate_logs`
- `sign_in_records`、`configs`
- `withdraw_face_checks`、`withdraw_face_check_snapshots`

#### A2. 短剧媒资与观看侧（共用 1.0）

- `playlets`、`playlet_episodes`、`playlet_groups`
- `playlet_materials`、`subtitles`
- `user_playlet_ledgers`、`user_playlet_collects`、`user_playlet_episodes`
- `ad_records`、`material_watch_histories`
- `movies`（若仍作媒资引用；AI 聊天下线后不再走聊天逻辑）

#### A3. 系统配置 / 运营参数

- `tips_parameters`、`global_parameters`、`refund_parameters`、`wealth_parameters`
- `app_page_parameters`、`app_popup_parameters`
- `share_links`、`whats_app_links`、`user_whats_app_links`
- `experts`、`customer_services`、`announcements`
- `deposit_channels`、`withdraw_banks`、`withdraw_bank_channels`、`withdraw_channel_limits`
- `pay_bank_cards`、`versions`、`point_packs`
- **`advertisements`（含福利页 `TYPE_WELFARE`，保留）**
- 券**模板**（非机器人券规则）：`coupons`、`support_coupons`、`double_coupons`
- 通知**模板**：`notifications`
- 已是 2.0 割接表（不动）：`legacy_point_vaults`、`legacy_unlock_ledgers`、`legacy_unlock_adjustments`、`legacy_point_exchanges`、`legacy_exchange_quotas`、`data_migration_runs`

---

### B. 归档为 `*_1_0` 后重建空表（2.0 业务写入）

#### B1. 机器人（配置空起，含券规则，不迁 1.0）

- `robots`
- `robot_daily_income_rates`
- **`robot_coupon_rules`**
- `robot_coupon_codes`、`robot_coupon_send_stats`

#### B2. 支持 / 收益 / 活跃

- `tips_ledgers`、`tips_income_ledgers`、`playlet_income_ledgers`
- `income_claim_ledgers`、`playlet_views`、`playlet_tips_shelf_ledgers`
- `active_value_ledgers`、`empiric_value_ledgers`

#### B3. 订单与积分流水

- `orders`、`point_ledgers`、`point_frozen_ledgers`
- 统计 rollup：`point_ledger_daily_stats`、`point_ledger_total_stats`、`tips_ledger_daily_stats`、`fund_flow_daily_stats`、`fund_flow_total_stats`、`incremental_task_cursors`
- `user_stats`、`user_stats_details`

#### B4. 优惠券用户态 / 发放态

- `coupon_codes`、`user_support_coupons`、`user_double_coupons`

#### B5. 通知用户态

- `user_notifications`、`notification_reactions`

#### B6. 弹幕（空起）

- `bullet_comments`、`bullet_comment_reports`、`bullet_comment_hiddens`

#### B7. 2.0 保留活动（仅此两类，空起）

- **升级补贴**：`upgrade_subsidies`
- **合伙人计划**：`partner_pool_records`、`partner_divided_records`（及相关仅服务合伙人的表，若有则一并空起）

---

### C. 随功能下线：归档即可（可不重建，或重建但不接流量）

| 域 | 表 |
|----|-----|
| VIP | `plans`、`user_plans`；`vip_invite_activities` |
| 福利任务 | `tasks`、`user_tasks`、`task_plans`、`user_task_plans`、`task_videos` |
| AI 聊天 | `chat_prompts`、`chat_roles`、`chat_sessions`、`chat_messages`、`sensitive_words`；`chat_role_reports`、`chat_role_hiddens` |
| 版权包 | `copyright_packs`、`user_copyright_packs`、`copyright_materials`、`second_creations`、`copyright_pack_settlements`、`copyright_pack_deposits`、`cooperation_agreements` |
| 非保留活动 | 宝藏计划 `treasure_plan_*`；抢购 `flash_sale_*`；拼团房 `team_rooms*`；33 挑战 `challenge33*` / `help33*`；`ai_carnivals*`；`ai_x_subscription_*`；`invite_register_*`；`support_send_users`；`parenting_charity_applies`；`campaigns` / `issue_product_ledgers`；`mega_subsidies*`；`help_subsidies*`；`lottery_lists`；斋月 `ramadan*` / `prayer_*`；周年 `anniversary_*`；`deposit_match_*`；官方群用户态 `user_official_groups` 等（官方配置表若算 A3 可留，用户态归档）；`rank_data` / `user_fake_rank_data*`；`channel_data`；`movie_tickets` 等与下线活动绑定的表 |

下线域：**必须改代码停 API/cron**，不能只靠清表。

---

## 代码改造范围（按优先级）

### P0 — 切库迁移

1. 新增 migration：按 A/B/C 清单执行 rename +（B 类）CREATE LIKE；写入执行标记防重入。
2. 预发完整演练：备份 → 跑迁移 → 冒烟核心路径。
3. 文档化回滚：`DROP` 新空表 + `RENAME xxx_1_0 → xxx`（仅切库失败且尚未写入新数据时）。
4. **不**再跑 `liquidate`。

### P1 — 功能下线与邀请改造

1. **VIP**：`services/point/order.go`、`pay.go`、`plan.go`；man plan；禁止 `PRODUCT_TYPE_VIP`。
2. **VIP 解锁**：清除 `User.IsVip()` 对买剧/播放的特殊分支。
3. **福利任务**：`services/task/task.go` 及 man task；保留 `CheckRobotIncomeSettlement` 等结算（可挪到 playlet/point）。
4. **AI 聊天**：`services/user/chat.go`、`man/chat.go`。
5. **版权包**：`services/task/copyrightpack.go`、`man/copyrightpack.go`。
6. **CPS / 分销用户侧**：`services/cps`、分销商申请/入口对客户端关闭。
7. **邀请对外 uid**：注册与用户端邀请相关 API（如 `services/user/user.go`、`invite.go`、粉丝/分享相关）入参出参统一 uid；内部 uid↔fans_code 转换一层即可。
8. **非保留活动**：对应 service/cron/man 入口全部停用（宝藏、抢购、拼团、33、嘉年华等）。

### P2 — 回归与运维

1. 机器人：后台重建 `robots` + `robot_coupon_rules` → 客户端购买 → 收益 cron → 到期退本。
2. 买剧：下单支付、扣点、新空表订单/流水；观看仍读媒资原表。
3. 邀请：用 uid 注册/绑定；库内仍可见 F 码；用户响应无 F 码、无 CPS 入口。
4. 升级补贴、合伙人：空表后主路径冒烟。
5. 广告：首页 + **福利页** 均正常。
6. 弹幕：若产品开放，确认写的是新空表。
7. 确认无 cron 仍扫描 `*_1_0` 或误写归档表；**暂不**做管理端 `*_1_0` 只读接口。

---

## 明确不做

- 不为 2.0 业务表建 `s2_*` 并行体系（本阶段）。
- 不把 1.0 机器人配置/券规则、tips/订单/流水迁入新空表。
- 不新建 `users` 或拆账号库。
- 不迁短剧媒资；不迁 A3 系统配置。
- 不改粉丝码底层落库形态（保持 F 前缀等现有结构）。
- 不再执行 `liquidate`。
- 暂不提供管理端查询 `*_1_0` 的只读 API。
- 除升级补贴、合伙人外，其余 1.0 运营活动不在 2.0 上线。

---

## 风险与注意事项

| 风险 | 缓解 |
|------|------|
| 误归档白名单表（users/媒资/配置） | 迁移脚本硬编码白名单 + code review + 预发校验「表仍存在且行数未变」 |
| 外键/序列重建失败 | 预发用真实库结构演练；迁移后 `\d` 核对 |
| 余额与流水观感 | 列表只查新 `point_ledgers`；1.0 在 `point_ledgers_1_0`；legacy 金库逻辑不变 |
| uid↔粉丝码转换遗漏 | 注册/分享/邀请全链路用例；禁止用户端再出现 F 码与 CPS 文案 |
| 活动下线不彻底 | 按 C 类活动清单关 API/cron；只留升级补贴与合伙人 |
| 下线不彻底（VIP/任务/聊天等） | P1 清单 + 接口黑名单测试 |

---

## 建议实施顺序

1. 按本文 A/B/C 冻结表清单（活动去留已定）。
2. 编写并预发跑通归档 migration。
3. 合并功能下线 + 邀请 uid 改造 PR（可与 migration 同发或紧随其后）。
4. 生产：停机或只读窗口 → migration → 配置机器人/券规则与必要运营数据 → 冒烟 → 开写。
5. 观察期：监控购买/收益/退本/买剧/邀请注册；`*_1_0` 只读留库，管理端暂不接查询接口。

---

## 决策冻结状态

| 项 | 结论 |
|----|------|
| `robot_coupon_rules` | **随机器人进 B，空起** |
| 弹幕表 | **进 B，空起**（非随聊天进 C 废弃） |
| 2.0 活动 | **仅升级补贴 + 合伙人**，空起；其余进 C |
| `liquidate` | **已完成，不再安排** |
| 管理端 `*_1_0` 只读 API | **暂不做** |
| 邀请 | **仅粉丝码**；对外 **uid**；落库可仍 F 码 |

---

## 关键路径速查

| 域 | 路径 |
|----|------|
| 模型 | `models/*.go` |
| 迁移 | `migrations/` |
| 机器人/收益 | `services/man/robot.go`、`services/playlet/tips.go`、`services/playlet/cron.go`、`services/task/common.go` |
| 订单/VIP/买剧 | `services/point/order.go`、`pay.go`、`plan.go` |
| 福利任务 | `services/task/task.go` |
| AI 聊天 | `services/user/chat.go`、`services/man/chat.go` |
| 版权包 | `services/task/copyrightpack.go` |
| 邀请/粉丝 | `services/user/user.go`、`invite.go`、`services/point/fans.go` |
| CPS | `services/cps/` |
| 升级补贴 / 合伙人 | `models/lottery.go`（`UpgradeSubsidies`）、`models/partners.go`、`services/point/partner.go`、`services/man/partner.go` |
| Legacy 余额 | `models/legacy_point.go`、`playd/splay2_migration.go`、`services/point/legacy_point.go` |
| 广告 | `models/advertisement.go`、`services/man/advertisement.go` |
| 弹幕 | `models/chat.go`（`BulletComment*`） |
