本域总览见《账号计费中心 · 结构大纲》。本文为该域完整设计:定位与边界 / 角色与依赖 / 数据模型 / 核心流程 / 接口契约 / 关键约束与验收标准。
定位:全仓资金真相的唯一持有者。回答三个问题——「钱包里有多少钱」(现金余额与可用额度)、「每一分钱从哪来、到哪去」(只增流水)、「这个客户还能不能继续用」(欠款与欠费派生标记)。
核心概念
| 概念 | 承载 | 语义 |
|---|---|---|
| 现金余额 | customers.cash_balance |
元、6 位小数,可为负;负值即欠款,充值按符号算术自然清偿 |
| 赠金账本 | customer_grants |
授权记录而非余额计数器:剩余由流水聚合派生,不原地扣减 |
| 信用额度 | customers.credit_limit |
准入缓冲(可用额度的下限),默认 0;不拦截单笔扣费 |
| 可用额度 | 派生量 available |
唯一公式 = 现金 + Σ(在营未过期赠金剩余) + 信用额度;准入真相 |
| 欠款 | 现金余额为负 | 唯一未偿债务真相 |
| 欠费标记 | customers.overdue_since |
派生标记(报表与清单用),非准入真相 |
| 资金流水 | customer_transactions |
账务真相源,只增不改 |
关键口径
边界
归属口径
能力矩阵
| 能力 | 计费路由(router)与计量方 | 数据面网关 | 运营面 | 门户用户 |
|---|---|---|---|---|
| 上报批量扣费 | ✓(幂等键 = 事件标识) | ✗ | ✗ | ✗ |
| 读余额与可用额度 | ✓ | ✓(经状态键) | ✓ | ✓(本人钱包) |
| 赠金入账 | ✗ | ✗ | ✓ | ✗ |
| 信用额度配置 | ✗ | ✗ | ✓ | ✗ |
| 调整流水(核销 / 修正) | ✗ | ✗ | ✓ | ✗ |
| 宽限期设置 | ✗ | ✗ | ✓ | ✗ |
| 状态标记(正常 / 封禁) | ✗ | ✗ | ✓ | ✗ |
| 按 ref 集合拉流水做同源比对 | ✓ | ✗ | ✓ | ✗(门户只读展示详见 D12) |
上游依赖
| 上游 | 依赖内容 | 语义 |
|---|---|---|
| 订购与支付域 | 充值入账、退款冲减 | 现金增减的事实来源;以订单号为入账幂等键 |
| 计量与计费域 | 应付金额与用量 | 本域只入账不计价;金额随扣费请求上报 |
| 租户与组织域 | 工作区 | 钱包与工作区一一对应,是资金归属主体 |
| 账号与身份域 | 门户身份与令牌 | 本人钱包查询的身份来源 |
| 通知与触达域 | 站内信与告警投递 | 余额告警、欠费告知的送达(投递本身不在本域) |
下游被引用
| 引用方 | 引用内容 | 语义 |
|---|---|---|
| 账户状态与准入域 | 现金余额、赠金剩余、信用额度、宽限截止 | 派生准入状态与状态键载荷的唯一账务来源 |
| 计量与计费域 | 按 ref 集合的流水只读通道 | 跨服务同源精确比对的数据来源 |
| 退款与对账域 | 现金扣费行、调整行、剩余可退额度 | 退款额度与「支付后消费」画像依赖支出类流水 |
| 发票域 | 账期费用构成 | 开票金额口径来自流水按类型聚合 |
| 风控与合规域 | 欠款账龄、封禁与宽限状态 | 分级提醒 / 催收 / 冻结的输入 |
| 运营管理 | 客户台账投影与审计 | 运营面只读展示与留痕索引 |
赠金不落余额列:剩余随时可用聚合派生(
amount减去被本赠金抵扣的扣费行金额之和),故不存在「计数器与流水不一致」这一类偏差。
users 由本域弱引用(赠金发放人),不入本域表清单。| 表 | 职责 | 关键字段 |
|---|---|---|
| customers | 钱包主体与准入账务位,与工作区一一对应 | organization_id / cash_balance / credit_limit / tier / overdue_since / grace_until / grace_granted_at / balance_alert_threshold / status / state_version / auto_recharge |
| customer_transactions | 只增资金流水,全部资金事实的唯一真相源 | customer_id / type / amount / balance_after / ref_spend_log / ref_order / group_id / grant_id / key_ref / detail / created_at |
| customer_grants | 赠金额度授权账本,剩余由流水聚合 | customer_id / name / amount / expires_at / status / subscription_id / created_by |
active / banned / closed 三值,closed 为终态、无退出路径;客户级单调状态版本由数据库层触发器在行锁内取全局序列赋值(版本序 = 提交序),应用层只读不写。expires_at 为必填;过期是时间驱动的被动衰减,不落任何事务,故不以它作为债务或准入的判据。idempotent 回显、不回扣。free(评估档,新注册默认,限速从严)、standard(完成首笔支付或转为企业工作区后自动升档)、enterprise(预留,仅供手工设置)。/api/account)| 方法 | 路径 | 语义 |
|---|---|---|
| GET | /wallet |
本人钱包:现金余额(可为负,负值即欠款)、赠金额度与明细、信用额度、可用额度、派生态与宽限截止、支付模式标记 |
/internal)| 方法 | 路径 | 语义 |
|---|---|---|
| POST | /internal/customers/{customer_id}/deduct-batch |
批量扣费(1~200 项):幂等键去重、赠金优先、现金兜底;计量链令牌 |
| POST | /internal/customers/{customer_id}/deduct |
单笔扣费兼容入口(分口径),内联同一核心;计量链令牌 |
| GET | /internal/customers/{customer_id}/balance |
余额全量:现金 + 信用额度 + 赠金明细 + 可用额度(准入真相);运营链令牌 |
| POST | /internal/customers/{customer_id}/credit |
赠金入账(运营赠予),按引用幂等;运营链令牌 |
| GET | /internal/transactions |
按日 / 类型 / 客户 / 组 / ref 集合拉流水(跨服务同源比对数据通道):返回全集条数、截断标记与全集金额和;计量链令牌 |
/internal,运营链令牌)| 方法 | 路径 | 语义 |
|---|---|---|
| GET | /internal/customers |
客户列表:按工作区与负责人投影,支持按档位 / 经营状态 / 欠费筛选与关键词搜索,附余额与可用额度派生值 |
| GET | /internal/customers/{customer_id} |
客户详情:钱包账务位 + 赠金明细 + 最近流水 + 用量摘要 + 成员与组摘要 |
| PATCH | /internal/customers/{customer_id}/status |
状态标记(正常 ↔ 封禁):欠费是自动派生态不可手工设置,注销态为终态不可改写 |
/api/account/ops)| 方法 | 路径 | 语义 |
|---|---|---|
| PATCH | /api/account/ops/customers/{customer_id}/status |
状态标记(同上语义,运营面入口,落审计并同步发布状态) |
| PATCH | /api/account/ops/customers/{customer_id}/credit-limit |
信用额度配置:即时影响可用额度(提高可解封欠费客户,下调收紧准入);不触碰现金与赠金 |
| POST | /api/account/ops/customers/{customer_id}/adjustment |
运营调整:坏账核销(正)/ 手工修正(正负):必带原因,同事务落调整流水并重算欠费标记 |
| PUT | /api/account/ops/customers/{customer_id}/grace |
宽限期设置:延长或清零(0 即清除、欠费即时停服);仅动宽限截止,不动账务与欠费标记 |
/internal,计量链令牌)| 方法 | 路径 | 语义 |
|---|---|---|
| GET | /internal/groups/{group_id} |
按组反查归属工作区与钱包:计量归因与准入的读穿入口 |
| GET | /internal/groups |
全部在营组的生效限速(组显式值优先,否则档位默认;降档事件生效期间减半),分页返回并带截断标记 |
| # | 验收口径 |
|---|---|
| 1 | 同一幂等键重复提交扣费:第二次返回幂等标记且不重复扣减,流水行数不增加 |
| 2 | 批内出现重复幂等键:整批 422 拒绝,无任何流水落库 |
| 3 | 客户状态非在营时提交扣费:整批 403 拒绝,无部分落库 |
| 4 | 现金不足时提交扣费:费用全额照扣、现金转负,响应不返回余额不足语义 |
| 5 | 一次扣费跨越两个赠金包:流水为「每包一行 + 现金行一行」,各行共享同一幂等键与批末余额快照 |
| 6 | 赠金按最快要到期优先消耗;某赠金扣满后剩余恰为 0,不出现负剩余 |
| 7 | 并发两次同客户扣费:现金余额为两次扣减之和,无丢失更新(对账无缺口) |
| 8 | 数据库层直接更新或删除任一流水行被拒;整表清空语句同样被拒;旁路开关在普通角色下打开仍被拒 |
| 9 | 同客户同类型同引用重复入账:返回幂等,赠金不重复发放 |
| 10 | 赠金引用以订单号前缀开头:入参即拒(422);绕过入参层写入的跨类型同引用行撞互斥索引时显式 409,不收敛为幂等 |
| 11 | 可用额度转正或转负后,欠费标记在同一事务内被清除或置位 |
| 12 | 「现金为正、唯一赠金刚过期」与「现金为零、无赠金、无信用」的客户发起注销或余额转出:均放行,不被残留标记或准入额度误拦 |
| 13 | 「现金为负」的客户发起注销 / 关户 / 余额转出:409 存在未清偿债务;现金清偿后放行 |
| 14 | 余额转出:转出方现金清零、接收方原子自增;两侧各有且仅有一行对偶流水且引用相同;重复提交自然空跑不二次入账 |
| 15 | 全库对账:任一客户流水代数和与现金余额不等即告警并列出缺口;补记后缺口归零,同客户重跑不再写入 |
| 16 | 参与过余额转让的客户:对账归人工复核桶、补记被拒 |
| 17 | 免计费项:金额必须为 0 且带枚举原因,落一行恒 0 留痕流水、不动现金与赠金;裸零(未标豁免)被 422 拒绝 |
| 18 | 信用额度调高使可用额度转正后,欠费标记被清除、状态转为在营;下调不触碰现金与赠金 |
| 19 | 降档事件生效期间,组生效限速恰为原值的一半(下限 1);事件解除后恢复原值 |
| 20 | 门户钱包响应中金额均为元字符串,现金余额为负时如实返回负值 |