← 返回文档导航
统一模型:一张券 = 圈谁(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),账面随时可对账,这是"稳定发放、不出错、不超发"的根。