# 业务数据模型
**本文引用的文件**
- [schema.prisma](file://server/prisma/schema.prisma)
- [payment.controller.ts](file://server/src/modules/payment/payment.controller.ts)
- [payment.service.ts](file://server/src/modules/payment/payment.service.ts)
- [subscription.controller.ts](file://server/src/modules/subscription/subscription.controller.ts)
- [subscription.service.ts](file://server/src/modules/subscription/subscription.service.ts)
- [member.controller.ts](file://server/src/modules/member/member.controller.ts)
- [member.service.ts](file://server/src/modules/member/member.service.ts)
- [auth.controller.ts](file://server/src/modules/auth/auth.controller.ts)
- [auth.service.ts](file://server/src/modules/auth/auth.service.ts)
- [orders 页面](file://my-uniapp-vue3/src/pages/orders/index.vue)
- [支付确认页面](file://my-uniapp-vue3/src/pages/payment-confirm/index.vue)
- [支付结果页面](file://my-uniapp-vue3/src/pages/payment-result/index.vue)
- [会员中心页面](file://my-uniapp-vue3/src/pages/member/index.vue)
- [数据库结构文档](file://docs/database-structure.md)
- [支付集成指南](file://docs/支付集成指南.md)
- [订阅系统使用说明](file://docs/订阅系统使用说明.md)
## 目录
1. [简介](#简介)
2. [项目结构](#项目结构)
3. [核心组件](#核心组件)
4. [架构总览](#架构总览)
5. [详细组件分析](#详细组件分析)
6. [依赖关系分析](#依赖关系分析)
7. [性能考虑](#性能考虑)
8. [故障排除指南](#故障排除指南)
9. [结论](#结论)
10. [附录](#附录)
## 简介
本文件面向AI有声书生成平台的业务数据模型,聚焦于订单(Order)、订阅(Subscription)、积分余额(TokenBalance)等关键商业实体的数据设计与业务规则。文档从数据模型定义出发,结合订单状态流转、订阅周期管理、使用配额控制等核心业务逻辑,给出支付流程、会员升级、积分消费等典型业务场景的API使用路径与数据流说明,并提供统计分析与报表生成的思路。
## 项目结构
后端采用Prisma进行数据库建模与ORM访问,业务模块分布在server/src/modules下,前端页面位于my-uniapp-vue3/src/pages中。数据库结构与业务模型在schema.prisma中集中定义,支付、订阅、会员等业务通过对应的controller/service层对外提供接口。
```mermaid
graph TB
subgraph "前端"
OrdersPage["订单页面
orders/index.vue"]
PaymentConfirm["支付确认页面
payment-confirm/index.vue"]
PaymentResult["支付结果页面
payment-result/index.vue"]
MemberCenter["会员中心页面
member/index.vue"]
end
subgraph "后端"
AuthCtrl["认证控制器
auth.controller.ts"]
PaymentCtrl["支付控制器
payment.controller.ts"]
SubCtrl["订阅控制器
subscription.controller.ts"]
MemberCtrl["会员控制器
member.controller.ts"]
AuthSvc["认证服务
auth.service.ts"]
PaymentSvc["支付服务
payment.service.ts"]
SubSvc["订阅服务
subscription.service.ts"]
MemberSvc["会员服务
member.service.ts"]
end
OrdersPage --> PaymentCtrl
PaymentConfirm --> PaymentCtrl
PaymentResult --> PaymentCtrl
MemberCenter --> SubCtrl
OrdersPage --> AuthCtrl
PaymentCtrl --> AuthCtrl
SubCtrl --> AuthCtrl
MemberCtrl --> AuthCtrl
PaymentCtrl --> PaymentSvc
SubCtrl --> SubSvc
MemberCtrl --> MemberSvc
AuthCtrl --> AuthSvc
```
**图表来源**
- [payment.controller.ts](file://server/src/modules/payment/payment.controller.ts)
- [subscription.controller.ts](file://server/src/modules/subscription/subscription.controller.ts)
- [member.controller.ts](file://server/src/modules/member/member.controller.ts)
- [auth.controller.ts](file://server/src/modules/auth/auth.controller.ts)
- [orders 页面](file://my-uniapp-vue3/src/pages/orders/index.vue)
- [支付确认页面](file://my-uniapp-vue3/src/pages/payment-confirm/index.vue)
- [支付结果页面](file://my-uniapp-vue3/src/pages/payment-result/index.vue)
- [会员中心页面](file://my-uniapp-vue3/src/pages/member/index.vue)
**章节来源**
- [schema.prisma](file://server/prisma/schema.prisma)
- [payment.controller.ts](file://server/src/modules/payment/payment.controller.ts)
- [subscription.controller.ts](file://server/src/modules/subscription/subscription.controller.ts)
- [member.controller.ts](file://server/src/modules/member/member.controller.ts)
- [auth.controller.ts](file://server/src/modules/auth/auth.controller.ts)
## 核心组件
本节对Order、Subscription、TokenBalance三个核心业务模型进行深入解析,包括字段含义、约束关系、索引策略与业务规则。
- 用户(User)
- 关键字段:手机号、微信OpenID、会员等级、到期时间、每日用量、上次用量日期、累计音频时长、订阅重置日期等。
- 与订单、订阅、积分余额、播放记录等存在一对多或一对一关系。
- 业务规则:会员等级与到期时间决定可用额度;每日用量与上次用量日期用于日配额清零;订阅重置日期用于月度配额重置。
- 订单(Order)
- 关键字段:订单号唯一、关联用户与可选订阅套餐、金额、状态、支付方式、支付流水号、支付时间等。
- 业务状态:待支付、已支付、已取消等(默认待支付)。
- 与订阅套餐(SubscriptionPlan)和用户双向关联;与积分使用(TokenUsage)关联。
- 索引:按用户+创建时间、订单号、状态、套餐ID建立索引以支持查询与分页。
- 订阅(Subscription)
- 关键字段:起止日期、状态、自动续费、关联用户与套餐。
- 状态:激活、暂停、过期、取消等(默认激活)。
- 与用户、套餐建立外键关系;用于控制用户权限与配额。
- 订阅套餐(SubscriptionPlan)
- 关键字段:名称、等级、月/年价格、描述、特性、是否推荐、是否启用、排序、日生成次数、单次上限、月度令牌数、月度分钟数、年套餐令牌、超量计费等。
- 业务规则:等级决定会员等级;月度令牌与分钟数构成月度配额;超量计费用于超出配额的收费。
- 积分余额(TokenBalance)
- 关键字段:用户唯一、总令牌、已用令牌、重置日期。
- 业务规则:总令牌=已用令牌+可用令牌;重置日期用于月度配额重置;与TokenUsage记录关联。
- 积分使用(TokenUsage)
- 关键字段:类型、数量、内容长度、关联订单、描述。
- 业务规则:记录每次消费的令牌类型与数量,支持按用户与时间维度统计。
**章节来源**
- [schema.prisma](file://server/prisma/schema.prisma)
## 架构总览
下图展示业务数据模型在系统中的位置与交互关系,突出订单、订阅、积分余额三者如何共同支撑支付、会员升级与消费配额控制。
```mermaid
erDiagram
USER ||--o{ ORDER : "拥有"
USER ||--o{ SUBSCRIPTION : "持有"
USER ||--o{ TOKEN_BALANCE : "拥有"
USER ||--o{ TOKEN_USAGE : "产生"
ORDER }o--|| SUBSCRIPTION_PLAN : "对应"
SUBSCRIPTION }o--|| SUBSCRIPTION_PLAN : "基于"
TOKEN_USAGE }o--|| ORDER : "关联"
SUBSCRIPTION_PLAN ||--o{ ORDER : "被购买"
SUBSCRIPTION ||--|| USER : "归属"
TOKEN_BALANCE ||--|| USER : "归属"
```
**图表来源**
- [schema.prisma](file://server/prisma/schema.prisma)
## 详细组件分析
### 订单模型(Order)
- 数据结构要点
- 订单号唯一性保证交易幂等与对账。
- 金额使用Decimal类型确保支付精度。
- 状态字段默认“待支付”,后续由支付服务更新。
- 可选planId关联订阅套餐,用于区分一次性购买与订阅购买。
- 业务规则
- 待支付状态下允许取消并释放配额。
- 已支付状态下根据planId决定是否创建/续期订阅。
- 订单与TokenUsage关联,用于记录支付所消耗的令牌。
- 状态流转
```mermaid
stateDiagram-v2
[*] --> 待支付
待支付 --> 已支付 : "支付成功"
待支付 --> 已取消 : "用户取消/超时"
已支付 --> [*]
已取消 --> [*]
```
**图表来源**
- [schema.prisma](file://server/prisma/schema.prisma)
**章节来源**
- [schema.prisma](file://server/prisma/schema.prisma)
### 订阅模型(Subscription)
- 数据结构要点
- 起止日期与状态共同决定订阅有效性。
- 自动续费标志决定到期后的处理策略。
- 与SubscriptionPlan的外键关系承载套餐能力与配额。
- 业务规则
- 订阅到期后状态转为过期或取消,需重新购买或续费。
- 自动续费开启时,到期前尝试扣费续期。
- 订阅状态影响用户可用的生成次数、单次上限、月度令牌与分钟数。
- 周期管理
```mermaid
flowchart TD
Start(["开始订阅"]) --> Active["状态=激活"]
Active --> RenewCheck{"到期前检查"}
RenewCheck --> |需要续费| AutoRenew["自动续费尝试"]
RenewCheck --> |无需续费| Active
AutoRenew --> RenewSuccess{"续费成功?"}
RenewSuccess --> |是| Active
RenewSuccess --> |否| Expired["状态=过期"]
Expired --> ManualRenew["手动续费"]
ManualRenew --> Active
```
**图表来源**
- [schema.prisma](file://server/prisma/schema.prisma)
**章节来源**
- [schema.prisma](file://server/prisma/schema.prisma)
### 积分余额模型(TokenBalance)
- 数据结构要点
- 用户唯一索引确保一对一关系。
- 总令牌与已用令牌构成可用余额计算基础。
- 重置日期用于月度配额周期化管理。
- 业务规则
- 消费时从可用余额扣减,记录TokenUsage。
- 到达重置日期后,根据套餐规则恢复配额。
- 与订单关联,用于追踪消费来源。
- 配额控制
```mermaid
flowchart TD
Init(["初始化/重置"]) --> Balance["读取用户余额与套餐配额"]
Balance --> Consume{"消费请求?"}
Consume --> |是| Check["校验可用余额>=消费数量"]
Check --> |是| Deduct["扣减已用令牌并写入TokenUsage"]
Check --> |否| Reject["拒绝请求并提示不足"]
Consume --> |否| Wait["等待消费请求"]
Deduct --> Wait
```
**图表来源**
- [schema.prisma](file://server/prisma/schema.prisma)
**章节来源**
- [schema.prisma](file://server/prisma/schema.prisma)
## 依赖关系分析
- 订单与订阅
- 订单可选择订阅套餐,支付完成后创建或续期订阅。
- 订阅状态变化影响用户可用配额与功能权限。
- 订单与积分
- 订单支付可能消耗TokenBalance中的令牌,生成TokenUsage记录。
- TokenUsage与订单建立关联,便于对账与审计。
- 用户与配额
- 用户的会员等级、到期时间、订阅状态共同决定其可用的生成次数、单次上限、月度令牌与分钟数。
```mermaid
graph LR
Order["订单(Order)"] -- "关联" --> Plan["订阅套餐(SubscriptionPlan)"]
Order -- "关联" --> Usage["积分使用(TokenUsage)"]
Subscription["订阅(Subscription)"] -- "关联" --> Plan
TokenBalance["积分余额(TokenBalance)"] -- "关联" --> User["用户(User)"]
Order -- "关联" --> User
Subscription -- "关联" --> User
```
**图表来源**
- [schema.prisma](file://server/prisma/schema.prisma)
**章节来源**
- [schema.prisma](file://server/prisma/schema.prisma)
## 性能考虑
- 索引策略
- 订单:按用户+创建时间、订单号、状态、套餐ID建立索引,支持高效分页与筛选。
- 订阅:按用户+状态、用户+到期时间建立索引,支持到期扫描与状态变更。
- 积分:按用户+创建时间、用户+类型建立索引,支持消费统计与报表。
- 查询优化
- 使用分页查询避免一次性加载大量订单与订阅记录。
- 对高频统计字段(如月度令牌、分钟数)建立物化视图或缓存,减少重复计算。
- 写入优化
- 批量插入TokenUsage与批量更新用户配额,降低事务开销。
- 异步处理订阅到期与自动续费,避免阻塞主流程。
## 故障排除指南
- 订单状态异常
- 现象:订单显示“待支付”但用户无法发起支付。
- 排查:检查支付回调是否正确更新状态;核对支付渠道返回信息与订单金额一致性。
- 订阅未生效
- 现象:支付成功但用户仍无高级权限。
- 排查:确认订单状态已更新为“已支付”;检查订阅创建逻辑是否执行;验证套餐等级与用户等级匹配。
- 积分不足
- 现象:生成失败提示余额不足。
- 排查:核对TokenBalance可用余额与TokenUsage消费明细;检查重置日期是否导致配额回退。
**章节来源**
- [支付集成指南](file://docs/支付集成指南.md)
- [订阅系统使用说明](file://docs/订阅系统使用说明.md)
## 结论
本文档基于Prisma schema定义,系统梳理了订单、订阅、积分余额三大业务模型的数据结构与业务规则,明确了状态流转、周期管理与配额控制的关键实现点,并给出了支付流程、会员升级、积分消费等场景的API使用路径与数据流图。建议在生产环境中配合完善的索引策略、异步任务与监控告警,确保订单支付、订阅续费与积分消费的稳定性与可扩展性。
## 附录
### API使用示例(路径指引)
- 订单管理
- 创建订单:前端调用后端支付控制器创建订单接口,传入用户标识、套餐ID与金额。
- 查询订单列表:按用户ID与状态分页查询,支持筛选时间范围。
- 取消订单:仅限“待支付”状态,调用取消接口并释放相关配额。
- 订阅服务
- 会员升级:用户选择订阅套餐后创建订单,支付成功后创建/续期订阅。
- 自动续费:到期前触发续费任务,成功则延长有效期,失败则标记为过期。
- 积分消费
- 生成音频:根据内容长度计算所需令牌,检查TokenBalance后扣减并记录TokenUsage。
- 报表统计:按用户、时间、类型聚合TokenUsage,生成消费报表。
- 前端页面参考
- 订单页面:展示用户历史订单与状态,支持查看详情与再次购买。
- 支付确认/结果页面:展示支付金额、优惠信息与支付状态反馈。
- 会员中心页面:展示当前订阅状态、到期时间与升级入口。
**章节来源**
- [payment.controller.ts](file://server/src/modules/payment/payment.controller.ts)
- [subscription.controller.ts](file://server/src/modules/subscription/subscription.controller.ts)
- [member.controller.ts](file://server/src/modules/member/member.controller.ts)
- [orders 页面](file://my-uniapp-vue3/src/pages/orders/index.vue)
- [支付确认页面](file://my-uniapp-vue3/src/pages/payment-confirm/index.vue)
- [支付结果页面](file://my-uniapp-vue3/src/pages/payment-result/index.vue)
- [会员中心页面](file://my-uniapp-vue3/src/pages/member/index.vue)