← 返回文档导航

🎟️ BeeX 券体系 · 全流程设计方案

统一模型 → 12 张券逐张流程 → 资金安全·入账/提现总图(设计稿,供评审合理性)
统一模型:一张券 = 圈谁(WHO) × 触发(WHEN) × 发多少 × 核销条件 × 兑现方式。 两种兑现:① 返现型(达标→面值进钱包·待结算,过退货期转可提现)—— A/B/C 组 12 张; ② 抵扣型(买课/升级结账立减·即时·不进钱包)—— D 组「买课/升级立减券」。

一、两种兑现的生命周期主轴

所有券都走这两条主轴之一;下面 13 张:A/B/C 组 12 张走返现型、D 组 1 张走抵扣型。
返现型(购物 / 邀请 / 自购)
flowchart LR
  A(["① 圈中目标人群
身份∧时间∧行为∧关系 标签"]):::who --> B["② 触发发券
事件 / 名额 / 周期"]:::issue B --> C{"③ 领取
自动到账 / 手动领"}:::decision C --> D["④ 进券包 · 60 天倒计时"]:::hold D --> E{"⑤ 核销条件达标?
自购达标 / 邀请达标"}:::decision E -->|"否 · 到期"| Z(["过期作废"]):::dead E -->|"达标"| F["核销 1 张 · 同单取面值最大"]:::redeem F --> G(["⑥ 面值进钱包 · 待结算"]):::pending G --> H(["过退货期 → 可提现 → 提现到账"]):::avail classDef who fill:#eef6ff,stroke:#3b82f6,color:#1e40af; classDef issue fill:#fff7e6,stroke:#f59e0b,color:#b45309; classDef hold fill:#ffffff,stroke:#e8d9b8,color:#1a1410; classDef decision fill:#fef3c7,stroke:#e07c00,color:#7a4f24,stroke-width:2px; classDef redeem fill:#f5f3ff,stroke:#8b5cf6,color:#5b21b6; classDef pending fill:#fff7ed,stroke:#fb923c,color:#9a3412; classDef avail fill:#f0fdf4,stroke:#15803d,color:#15803d; classDef dead fill:#fef2f2,stroke:#dc2626,color:#991b1b; classDef ctrl fill:#fff5f5,stroke:#dc2626,color:#991b1b,stroke-width:2px;
抵扣型(买课 / 升级券)
flowchart LR
  A2(["圈中目标人群"]):::who --> B2["发「买课 / 升级券」"]:::issue
  B2 --> D2["进券包 · 60 天"]:::hold
  D2 --> E2{"买课 / 升级结账时勾选?"}:::decision
  E2 -->|"否 · 到期"| Z2(["过期作废"]):::dead
  E2 -->|"勾选"| F2["核销 → 直接减「内部应付」"]:::redeem
  F2 --> G2(["当场少付钱 · 即时生效(不进钱包)"]):::avail
  classDef who fill:#eef6ff,stroke:#3b82f6,color:#1e40af;
  classDef issue fill:#fff7e6,stroke:#f59e0b,color:#b45309;
  classDef hold fill:#ffffff,stroke:#e8d9b8,color:#1a1410;
  classDef decision fill:#fef3c7,stroke:#e07c00,color:#7a4f24,stroke-width:2px;
  classDef redeem fill:#f5f3ff,stroke:#8b5cf6,color:#5b21b6;
  classDef pending fill:#fff7ed,stroke:#fb923c,color:#9a3412;
  classDef avail fill:#f0fdf4,stroke:#15803d,color:#15803d;
  classDef dead fill:#fef2f2,stroke:#dc2626,color:#991b1b;
  classDef ctrl fill:#fff5f5,stroke:#dc2626,color:#991b1b,stroke-width:2px;
📌 抵扣型已启用:D 组「买课/升级立减券」走这条(被邀请价 5 折是另一套独立机制、不是券)。⚠️ 按现有后端逻辑,立减券与被邀请价折扣会叠加(应付 = 课价 − 被邀请价折扣 − 券);要"二选一 / 取优"需另定。

二、13 张券 · 逐张场景流程图(含 D 组抵扣型)

每张券统一结构:圈谁 → 触发发券 → 进券包(60天) → ◇核销条件 → 达标核销1张 → 面值进钱包(待结算) → 可提现;不达标/超期则过期作废。可多次核销的用虚线回环表示。

🅰 创始礼包券(开荒 · 名额 FCFS 限量)

邀 Partner 券 目的:开荒
flowchart TD
  W(["大团长 · 创始前 500 名"]):::who --> I["创始期发放(FCFS 限量,计入 650M 总池)
邀 Partner 券 · 5 × Rp 25,000"]:::issue I --> H["进券包 · 60 天有效"]:::hold H --> D{"邀到 1 个大团长入会买课 ?"}:::decision D -->|"否 / 到期"| X(["过期作废"]):::dead D -->|"达标"| R["核销 1 张 · Rp 25,000"]:::redeem R --> P(["Rp 25,000 进钱包 · 待结算 PENDING"]):::pending P --> A(["过退货期 → 可提现"]):::avail R -.下次达标 · 券包还有券(共 5 张).-> D classDef who fill:#eef6ff,stroke:#3b82f6,color:#1e40af; classDef issue fill:#fff7e6,stroke:#f59e0b,color:#b45309; classDef hold fill:#ffffff,stroke:#e8d9b8,color:#1a1410; classDef decision fill:#fef3c7,stroke:#e07c00,color:#7a4f24,stroke-width:2px; classDef redeem fill:#f5f3ff,stroke:#8b5cf6,color:#5b21b6; classDef pending fill:#fff7ed,stroke:#fb923c,color:#9a3412; classDef avail fill:#f0fdf4,stroke:#15803d,color:#15803d; classDef dead fill:#fef2f2,stroke:#dc2626,color:#991b1b; classDef ctrl fill:#fff5f5,stroke:#dc2626,color:#991b1b,stroke-width:2px;
邀 Agent 券 目的:开荒
flowchart TD
  W(["大团长 · 创始前 500 名"]):::who --> I["创始期发放(FCFS 限量)
邀 Agent 券 · 5 × Rp 15,000"]:::issue I --> H["进券包 · 60 天有效"]:::hold H --> D{"邀到 1 个小团长入会买课 ?"}:::decision D -->|"否 / 到期"| X(["过期作废"]):::dead D -->|"达标"| R["核销 1 张 · Rp 15,000"]:::redeem R --> P(["Rp 15,000 进钱包 · 待结算 PENDING"]):::pending P --> A(["过退货期 → 可提现"]):::avail R -.下次达标 · 券包还有券(共 5 张).-> D classDef who fill:#eef6ff,stroke:#3b82f6,color:#1e40af; classDef issue fill:#fff7e6,stroke:#f59e0b,color:#b45309; classDef hold fill:#ffffff,stroke:#e8d9b8,color:#1a1410; classDef decision fill:#fef3c7,stroke:#e07c00,color:#7a4f24,stroke-width:2px; classDef redeem fill:#f5f3ff,stroke:#8b5cf6,color:#5b21b6; classDef pending fill:#fff7ed,stroke:#fb923c,color:#9a3412; classDef avail fill:#f0fdf4,stroke:#15803d,color:#15803d; classDef dead fill:#fef2f2,stroke:#dc2626,color:#991b1b; classDef ctrl fill:#fff5f5,stroke:#dc2626,color:#991b1b,stroke-width:2px;
邀 User 券(大团长版) 目的:开荒
flowchart TD
  W(["大团长 · 创始前 500 名"]):::who --> I["创始期发放(FCFS 限量)
邀 User 券 · 10 × Rp 5,000"]:::issue I --> H["进券包 · 60 天有效"]:::hold H --> D{"邀到 1 个用户首单 ≥ Rp 30,000 ?"}:::decision D -->|"否 / 到期"| X(["过期作废"]):::dead D -->|"达标"| R["核销 1 张 · Rp 5,000"]:::redeem R --> P(["Rp 5,000 进钱包 · 待结算 PENDING"]):::pending P --> A(["过退货期 → 可提现"]):::avail R -.下次达标 · 券包还有券(共 10 张).-> D classDef who fill:#eef6ff,stroke:#3b82f6,color:#1e40af; classDef issue fill:#fff7e6,stroke:#f59e0b,color:#b45309; classDef hold fill:#ffffff,stroke:#e8d9b8,color:#1a1410; classDef decision fill:#fef3c7,stroke:#e07c00,color:#7a4f24,stroke-width:2px; classDef redeem fill:#f5f3ff,stroke:#8b5cf6,color:#5b21b6; classDef pending fill:#fff7ed,stroke:#fb923c,color:#9a3412; classDef avail fill:#f0fdf4,stroke:#15803d,color:#15803d; classDef dead fill:#fef2f2,stroke:#dc2626,color:#991b1b; classDef ctrl fill:#fff5f5,stroke:#dc2626,color:#991b1b,stroke-width:2px;
邀 User 券(小团长版) 目的:开荒
flowchart TD
  W(["小团长 · 创始前 500 名"]):::who --> I["创始期发放(FCFS 限量)
邀 User 券 · 10 × Rp 5,000"]:::issue I --> H["进券包 · 60 天有效"]:::hold H --> D{"邀到 1 个用户首单 ≥ Rp 30,000 ?"}:::decision D -->|"否 / 到期"| X(["过期作废"]):::dead D -->|"达标"| R["核销 1 张 · Rp 5,000"]:::redeem R --> P(["Rp 5,000 进钱包 · 待结算 PENDING"]):::pending P --> A(["过退货期 → 可提现"]):::avail R -.下次达标 · 券包还有券(共 10 张).-> D classDef who fill:#eef6ff,stroke:#3b82f6,color:#1e40af; classDef issue fill:#fff7e6,stroke:#f59e0b,color:#b45309; classDef hold fill:#ffffff,stroke:#e8d9b8,color:#1a1410; classDef decision fill:#fef3c7,stroke:#e07c00,color:#7a4f24,stroke-width:2px; classDef redeem fill:#f5f3ff,stroke:#8b5cf6,color:#5b21b6; classDef pending fill:#fff7ed,stroke:#fb923c,color:#9a3412; classDef avail fill:#f0fdf4,stroke:#15803d,color:#15803d; classDef dead fill:#fef2f2,stroke:#dc2626,color:#991b1b; classDef ctrl fill:#fff5f5,stroke:#dc2626,color:#991b1b,stroke-width:2px;
创始自购券 目的:开荒
flowchart TD
  W(["普通用户 · 创始前 5 万名"]):::who --> I["创始期发放(FCFS 限量)
创始自购券 · 2 × Rp 5,000"]:::issue I --> H["进券包 · 60 天有效"]:::hold H --> D{"自己完成订单 ≥ Rp 30,000 ?"}:::decision D -->|"否 / 到期"| X(["过期作废"]):::dead D -->|"达标"| R["核销 1 张 · Rp 5,000"]:::redeem R --> P(["Rp 5,000 进钱包 · 待结算 PENDING"]):::pending P --> A(["过退货期 → 可提现"]):::avail R -.下次达标 · 券包还有券(共 2 张).-> D classDef who fill:#eef6ff,stroke:#3b82f6,color:#1e40af; classDef issue fill:#fff7e6,stroke:#f59e0b,color:#b45309; classDef hold fill:#ffffff,stroke:#e8d9b8,color:#1a1410; classDef decision fill:#fef3c7,stroke:#e07c00,color:#7a4f24,stroke-width:2px; classDef redeem fill:#f5f3ff,stroke:#8b5cf6,color:#5b21b6; classDef pending fill:#fff7ed,stroke:#fb923c,color:#9a3412; classDef avail fill:#f0fdf4,stroke:#15803d,color:#15803d; classDef dead fill:#fef2f2,stroke:#dc2626,color:#991b1b; classDef ctrl fill:#fff5f5,stroke:#dc2626,color:#991b1b,stroke-width:2px;

🅱 升级发展券(升级激励 · 事件触发 · 无限量)

升级小团长券 目的:升级激励
flowchart TD
  W(["刚升「小团长」的人"]):::who --> I["升小团长那一刻发放(无限量)
升级小团长券 · 20 × Rp 5,000"]:::issue I --> H["进券包 · 60 天有效"]:::hold H --> D{"每邀到 1 个有效用户 ?"}:::decision D -->|"否 / 到期"| X(["过期作废"]):::dead D -->|"达标"| R["核销 1 张 · Rp 5,000"]:::redeem R --> P(["Rp 5,000 进钱包 · 待结算 PENDING"]):::pending P --> A(["过退货期 → 可提现"]):::avail R -.下次达标 · 券包还有券(共 20 张).-> D classDef who fill:#eef6ff,stroke:#3b82f6,color:#1e40af; classDef issue fill:#fff7e6,stroke:#f59e0b,color:#b45309; classDef hold fill:#ffffff,stroke:#e8d9b8,color:#1a1410; classDef decision fill:#fef3c7,stroke:#e07c00,color:#7a4f24,stroke-width:2px; classDef redeem fill:#f5f3ff,stroke:#8b5cf6,color:#5b21b6; classDef pending fill:#fff7ed,stroke:#fb923c,color:#9a3412; classDef avail fill:#f0fdf4,stroke:#15803d,color:#15803d; classDef dead fill:#fef2f2,stroke:#dc2626,color:#991b1b; classDef ctrl fill:#fff5f5,stroke:#dc2626,color:#991b1b,stroke-width:2px;
升级大团长券 · A 目的:升级激励
flowchart TD
  W(["首次成「大团长」的人"]):::who --> I["升大团长那一刻发放(无限量)
升级大团长券·A · 20 × Rp 5,000"]:::issue I --> H["进券包 · 60 天有效"]:::hold H --> D{"每邀到 1 个用户首单 ?"}:::decision D -->|"否 / 到期"| X(["过期作废"]):::dead D -->|"达标"| R["核销 1 张 · Rp 5,000"]:::redeem R --> P(["Rp 5,000 进钱包 · 待结算 PENDING"]):::pending P --> A(["过退货期 → 可提现"]):::avail R -.下次达标 · 券包还有券(共 20 张).-> D classDef who fill:#eef6ff,stroke:#3b82f6,color:#1e40af; classDef issue fill:#fff7e6,stroke:#f59e0b,color:#b45309; classDef hold fill:#ffffff,stroke:#e8d9b8,color:#1a1410; classDef decision fill:#fef3c7,stroke:#e07c00,color:#7a4f24,stroke-width:2px; classDef redeem fill:#f5f3ff,stroke:#8b5cf6,color:#5b21b6; classDef pending fill:#fff7ed,stroke:#fb923c,color:#9a3412; classDef avail fill:#f0fdf4,stroke:#15803d,color:#15803d; classDef dead fill:#fef2f2,stroke:#dc2626,color:#991b1b; classDef ctrl fill:#fff5f5,stroke:#dc2626,color:#991b1b,stroke-width:2px;
升级大团长券 · B 目的:升级激励
flowchart TD
  W(["首次成「大团长」的人"]):::who --> I["升大团长那一刻发放(无限量)
升级大团长券·B · 5 × Rp 10,000"]:::issue I --> H["进券包 · 60 天有效"]:::hold H --> D{"每邀到 1 个小团长 / 大团长 ?"}:::decision D -->|"否 / 到期"| X(["过期作废"]):::dead D -->|"达标"| R["核销 1 张 · Rp 10,000"]:::redeem R --> P(["Rp 10,000 进钱包 · 待结算 PENDING"]):::pending P --> A(["过退货期 → 可提现"]):::avail R -.下次达标 · 券包还有券(共 5 张).-> D classDef who fill:#eef6ff,stroke:#3b82f6,color:#1e40af; classDef issue fill:#fff7e6,stroke:#f59e0b,color:#b45309; classDef hold fill:#ffffff,stroke:#e8d9b8,color:#1a1410; classDef decision fill:#fef3c7,stroke:#e07c00,color:#7a4f24,stroke-width:2px; classDef redeem fill:#f5f3ff,stroke:#8b5cf6,color:#5b21b6; classDef pending fill:#fff7ed,stroke:#fb923c,color:#9a3412; classDef avail fill:#f0fdf4,stroke:#15803d,color:#15803d; classDef dead fill:#fef2f2,stroke:#dc2626,color:#991b1b; classDef ctrl fill:#fff5f5,stroke:#dc2626,color:#991b1b,stroke-width:2px;

🅲 用户购物券(激活 + 留存)

引导券① 目的:新人激活
flowchart TD
  W(["新注册用户"]):::who --> I["注册即【自动到账】
引导券① · 1 × Rp 5,000"]:::issue I --> H["进券包 · 60 天有效"]:::hold H --> D{"首单 ≥ Rp 50,000 ?"}:::decision D -->|"否 / 到期"| X(["过期作废"]):::dead D -->|"达标"| R["核销 1 张 · Rp 5,000"]:::redeem R --> P(["Rp 5,000 进钱包 · 待结算 PENDING"]):::pending P --> A(["过退货期 → 可提现"]):::avail classDef who fill:#eef6ff,stroke:#3b82f6,color:#1e40af; classDef issue fill:#fff7e6,stroke:#f59e0b,color:#b45309; classDef hold fill:#ffffff,stroke:#e8d9b8,color:#1a1410; classDef decision fill:#fef3c7,stroke:#e07c00,color:#7a4f24,stroke-width:2px; classDef redeem fill:#f5f3ff,stroke:#8b5cf6,color:#5b21b6; classDef pending fill:#fff7ed,stroke:#fb923c,color:#9a3412; classDef avail fill:#f0fdf4,stroke:#15803d,color:#15803d; classDef dead fill:#fef2f2,stroke:#dc2626,color:#991b1b; classDef ctrl fill:#fff5f5,stroke:#dc2626,color:#991b1b,stroke-width:2px;
引导券② 目的:新人激活
flowchart TD
  W(["新注册用户"]):::who --> I["注册即【自动到账】
引导券② · 1 × Rp 8,000"]:::issue I --> H["进券包 · 60 天有效"]:::hold H --> D{"第 2 单 ≥ Rp 80,000 ?"}:::decision D -->|"否 / 到期"| X(["过期作废"]):::dead D -->|"达标"| R["核销 1 张 · Rp 8,000"]:::redeem R --> P(["Rp 8,000 进钱包 · 待结算 PENDING"]):::pending P --> A(["过退货期 → 可提现"]):::avail classDef who fill:#eef6ff,stroke:#3b82f6,color:#1e40af; classDef issue fill:#fff7e6,stroke:#f59e0b,color:#b45309; classDef hold fill:#ffffff,stroke:#e8d9b8,color:#1a1410; classDef decision fill:#fef3c7,stroke:#e07c00,color:#7a4f24,stroke-width:2px; classDef redeem fill:#f5f3ff,stroke:#8b5cf6,color:#5b21b6; classDef pending fill:#fff7ed,stroke:#fb923c,color:#9a3412; classDef avail fill:#f0fdf4,stroke:#15803d,color:#15803d; classDef dead fill:#fef2f2,stroke:#dc2626,color:#991b1b; classDef ctrl fill:#fff5f5,stroke:#dc2626,color:#991b1b,stroke-width:2px;
引导券③(加官方 WA) 目的:新人激活 + 触达
flowchart TD
  W(["新注册用户"]):::who --> I["加官方 WhatsApp 后【手动领取】
引导券③ · 1 × Rp 5,000"]:::issue I --> H["进券包 · 60 天有效"]:::hold H --> D{"订单 ≥ Rp 50,000 ?"}:::decision D -->|"否 / 到期"| X(["过期作废"]):::dead D -->|"达标"| R["核销 1 张 · Rp 5,000"]:::redeem R --> P(["Rp 5,000 进钱包 · 待结算 PENDING"]):::pending P --> A(["过退货期 → 可提现"]):::avail classDef who fill:#eef6ff,stroke:#3b82f6,color:#1e40af; classDef issue fill:#fff7e6,stroke:#f59e0b,color:#b45309; classDef hold fill:#ffffff,stroke:#e8d9b8,color:#1a1410; classDef decision fill:#fef3c7,stroke:#e07c00,color:#7a4f24,stroke-width:2px; classDef redeem fill:#f5f3ff,stroke:#8b5cf6,color:#5b21b6; classDef pending fill:#fff7ed,stroke:#fb923c,color:#9a3412; classDef avail fill:#f0fdf4,stroke:#15803d,color:#15803d; classDef dead fill:#fef2f2,stroke:#dc2626,color:#991b1b; classDef ctrl fill:#fff5f5,stroke:#dc2626,color:#991b1b,stroke-width:2px;
月度补贴券 目的:留存
flowchart TD
  W(["普通用户(每月)"]):::who --> I["每月 1 号【自动到账】(按月重置)
月度补贴券 · 3 × Rp 2,000"]:::issue I --> H["进券包 · 60 天有效"]:::hold H --> D{"本月前 3 单 · 每单 ≥ Rp 30,000 ?"}:::decision D -->|"否 / 到期"| X(["过期作废"]):::dead D -->|"达标"| R["核销 1 张 · Rp 2,000"]:::redeem R --> P(["Rp 2,000 进钱包 · 待结算 PENDING"]):::pending P --> A(["过退货期 → 可提现"]):::avail R -.下次达标 · 券包还有券(共 3 张).-> D classDef who fill:#eef6ff,stroke:#3b82f6,color:#1e40af; classDef issue fill:#fff7e6,stroke:#f59e0b,color:#b45309; classDef hold fill:#ffffff,stroke:#e8d9b8,color:#1a1410; classDef decision fill:#fef3c7,stroke:#e07c00,color:#7a4f24,stroke-width:2px; classDef redeem fill:#f5f3ff,stroke:#8b5cf6,color:#5b21b6; classDef pending fill:#fff7ed,stroke:#fb923c,color:#9a3412; classDef avail fill:#f0fdf4,stroke:#15803d,color:#15803d; classDef dead fill:#fef2f2,stroke:#dc2626,color:#991b1b; classDef ctrl fill:#fff5f5,stroke:#dc2626,color:#991b1b,stroke-width:2px;
🔗 用户购物券 与 其它购物激励的关系(正交叠加 · 运营层互斥 · 封顶兜底):用户购物券(🅲)与返佣基金前x单倍率券(见收益体系设计)同属「促进用户下单」激励,三者正交、各自独立后台开关、后台都开就都生效(叠加);系统不写死互斥,「二选一 / 互斥」由运营在配置层保证(不对同一圈人群同时开生效)。系统侧保留 「单笔激励封顶」(可配)兜底:一笔订单总激励 ≤ 配置上限,防止误配叠加超支。

🅳 升级立减券(抵扣型 · 直接减买课/升级应付,不进钱包)

买课 / 升级立减券 目的:促升级
flowchart TD
  W(["运营定向发(活跃用户 / 想升大团长的小团长 / 活动期)· 圈人复用人标签"]):::who --> I["运营定向 / 活动发放
买课·升级立减券 · 立减 Rp 50,000(额度待定)"]:::issue I --> H["进券包 · 60 天有效"]:::hold H --> D{"买小团长课 / 大团长课 / 升级 结账时勾选 ?"}:::decision D -->|"否 / 到期"| X(["过期作废"]):::dead D -->|"结账勾选"| R["核销 · 立减 Rp 50,000"]:::redeem R --> A(["当场少付 Rp 50,000 · 即时(不进钱包)"]):::avail classDef who fill:#eef6ff,stroke:#3b82f6,color:#1e40af; classDef issue fill:#fff7e6,stroke:#f59e0b,color:#b45309; classDef hold fill:#ffffff,stroke:#e8d9b8,color:#1a1410; classDef decision fill:#fef3c7,stroke:#e07c00,color:#7a4f24,stroke-width:2px; classDef redeem fill:#f5f3ff,stroke:#8b5cf6,color:#5b21b6; classDef pending fill:#fff7ed,stroke:#fb923c,color:#9a3412; classDef avail fill:#f0fdf4,stroke:#15803d,color:#15803d; classDef dead fill:#fef2f2,stroke:#dc2626,color:#991b1b; classDef ctrl fill:#fff5f5,stroke:#dc2626,color:#991b1b,stroke-width:2px;

三、系统资金流 · 入账 → 提现(资金安全总图)

所有钱(返现/佣金/券/奖)入账后到提现到账的统一链路 + 7 道资金安全闸。
flowchart TD
  SRC["入账来源:买家返现 / 直推·间接佣金 / 券核销返现 / 现金奖(升星·邀请·带团队)"]:::issue
  SRC --> IDEM{"① 幂等去重
(来源类型 + 业务ID) 只入一次"}:::ctrl IDEM -->|"重复事件"| DROP(["丢弃 · 不重复入账"]):::dead IDEM -->|"首次"| LEDG["写入账流水 ledger
账面余额 = 流水累加(可对账)"]:::ctrl LEDG --> PEND(["钱包 · 待结算 PENDING"]):::pending PEND --> SET{"② 过退货 / 结算期 T+N?"}:::decision SET -->|"订单被退 / 撤销"| CLAW["反向流水扣回 · 不进可用"]:::ctrl SET -->|"安全期过 · 无异常"| AV(["钱包 · 可提现 AVAILABLE"]):::avail AV --> REQ["用户发起提现"]:::redeem REQ --> BAL{"③ 余额校验
提现额 ≤ 可提现(行锁防超提)"}:::decision BAL -->|"不足"| REJ(["驳回"]):::dead BAL -->|"足"| KYC{"④ 实名 KYC + 绑卡
一人一卡"}:::decision KYC -->|"未完成"| KX(["挡住 · 先实名"]):::dead KYC -->|"已完成"| RISK{"⑤ 风控 + 审核
金额 / 频率 / 设备 / 异常"}:::decision RISK -->|"大额 或 命中风控"| MAN{"人工审核"}:::decision RISK -->|"小额 · 正常"| FRZ["冻结该笔金额
从可提现移出(防重复提)"]:::ctrl MAN -->|"拒"| FZ(["冻结 · 人工核查"]):::dead MAN -->|"准"| FRZ FRZ --> PAY["⑥ Xendit 打款(Disbursement)
带幂等单号 · 防重复打款"]:::redeem PAY --> CB{"⑦ 打款回调对账"}:::decision CB -->|"成功"| OKED(["到账 · 扣减钱包 · 流水 WITHDRAW_SUCCESS
+ 定时对账 Xendit 兜底"]):::avail CB -->|"失败 / 超时"| BACK["解冻 · 退回可提现 · 提示改卡重提"]:::ctrl classDef who fill:#eef6ff,stroke:#3b82f6,color:#1e40af; classDef issue fill:#fff7e6,stroke:#f59e0b,color:#b45309; classDef hold fill:#ffffff,stroke:#e8d9b8,color:#1a1410; classDef decision fill:#fef3c7,stroke:#e07c00,color:#7a4f24,stroke-width:2px; classDef redeem fill:#f5f3ff,stroke:#8b5cf6,color:#5b21b6; classDef pending fill:#fff7ed,stroke:#fb923c,color:#9a3412; classDef avail fill:#f0fdf4,stroke:#15803d,color:#15803d; classDef dead fill:#fef2f2,stroke:#dc2626,color:#991b1b; classDef ctrl fill:#fff5f5,stroke:#dc2626,color:#991b1b,stroke-width:2px;
🔒 资金安全 7 道闸: ① 幂等去重(来源+业务ID,绝不重复入账); ② 待结算缓冲(过退货期才转可提现,防退货薅); ③ 余额行锁(账面=流水累加,提现额≤可提现,防超提/并发); ④ 实名 KYC + 一人一卡; ⑤ 风控 + 大额人工审核; ⑥ 打款幂等单号(防重复打款); ⑦ 回调 + 定时对账(以 Xendit 实际结果为准,失败自动退回可提现)。
📌 钱包三态:待结算 PENDING(赚到、退货期内不能提)→ 可提现 AVAILABLE → 冻结 FROZEN(提现处理中/风控)。每一分钱的移动都有一条流水(ledger),账面随时可对账,这是"稳定发放、不出错、不超发"的根。