# 订单与积分模型
**本文引用的文件**
- [schema.prisma](file://server/prisma/schema.prisma)
- [models.json](file://server/src/config/models.json)
- [models-validator.ts](file://server/src/config/models-validator.ts)
- [payment.controller.ts](file://server/src/modules/payment/payment.controller.ts)
- [payment.service.ts](file://server/src/modules/payment/payment.service.ts)
- [member.controller.ts](file://server/src/modules/member/member.controller.ts)
- [member.service.ts](file://server/src/modules/member/member.service.ts)
- [tts.controller.ts](file://server/src/modules/tts/tts.controller.ts)
- [tts.service.ts](file://server/src/modules/tts/tts.service.ts)
- [orders/index.vue](file://my-uniapp-vue3/src/pages/orders/index.vue)
- [member/index.vue](file://my-uniapp-vue3/src/pages/member/index.vue)
- [API.md](file://docs/API.md)
- [数据库结构.md](file://docs/数据库结构.md)
## 目录
1. [简介](#简介)
2. [项目结构](#项目结构)
3. [核心组件](#核心组件)
4. [架构总览](#架构总览)
5. [详细组件分析](#详细组件分析)
6. [依赖分析](#依赖分析)
7. [性能考虑](#性能考虑)
8. [故障排除指南](#故障排除指南)
9. [结论](#结论)
10. [附录](#附录)
## 简介
本文件面向AI有声书生成平台的订单与积分模型,系统性阐述以下内容:
- 订单模型(Order)与积分相关实体(TokenBalance、TokenUsage)的结构与关联
- 订单状态流转、支付方式、金额计算等订单管理功能的数据结构与流程
- 积分余额的获取规则、使用限制、重置机制等积分系统的实现要点
- 购买套餐、语音合成消费、积分充值等业务场景的API使用示例
- 订单统计报表与积分流水分析的实现思路
本文件严格基于仓库中的实际代码与文档进行分析,避免臆测。
## 项目结构
围绕订单与积分模型,后端主要涉及以下模块与配置:
- 数据模型定义:Prisma Schema、模型配置与校验
- 订单与支付模块:payment.controller.ts、payment.service.ts
- 会员与积分模块:member.controller.ts、member.service.ts
- TTS服务:tts.controller.ts、tts.service.ts(用于语音合成消费)
- 前端页面:订单列表页、会员中心页
- 文档:API规范、数据库结构说明
```mermaid
graph TB
subgraph "前端"
OrdersPage["订单页面
orders/index.vue"]
MemberPage["会员页面
member/index.vue"]
end
subgraph "后端"
PaymentCtrl["支付控制器
payment.controller.ts"]
PaymentSvc["支付服务
payment.service.ts"]
MemberCtrl["会员控制器
member.controller.ts"]
MemberSvc["会员服务
member.service.ts"]
TTSCtrl["TTS控制器
tts.controller.ts"]
TTSSvc["TTS服务
tts.service.ts"]
end
subgraph "数据层"
PrismaSchema["Prisma Schema
schema.prisma"]
ModelsCfg["模型配置
models.json"]
ModelsValidator["模型校验
models-validator.ts"]
end
OrdersPage --> PaymentCtrl
OrdersPage --> MemberCtrl
MemberPage --> MemberCtrl
PaymentCtrl --> PaymentSvc
MemberCtrl --> MemberSvc
TTSCtrl --> TTSSvc
PaymentSvc --> PrismaSchema
MemberSvc --> PrismaSchema
TTSSvc --> PrismaSchema
PaymentSvc --> ModelsCfg
MemberSvc --> ModelsCfg
TTSSvc --> ModelsCfg
PaymentSvc --> ModelsValidator
MemberSvc --> ModelsValidator
TTSSvc --> ModelsValidator
```
图表来源
- [payment.controller.ts](file://server/src/modules/payment/payment.controller.ts)
- [payment.service.ts](file://server/src/modules/payment/payment.service.ts)
- [member.controller.ts](file://server/src/modules/member/member.controller.ts)
- [member.service.ts](file://server/src/modules/member/member.service.ts)
- [tts.controller.ts](file://server/src/modules/tts/tts.controller.ts)
- [tts.service.ts](file://server/src/modules/tts/tts.service.ts)
- [schema.prisma](file://server/prisma/schema.prisma)
- [models.json](file://server/src/config/models.json)
- [models-validator.ts](file://server/src/config/models-validator.ts)
章节来源
- [schema.prisma](file://server/prisma/schema.prisma)
- [models.json](file://server/src/config/models.json)
- [models-validator.ts](file://server/src/config/models-validator.ts)
- [payment.controller.ts](file://server/src/modules/payment/payment.controller.ts)
- [payment.service.ts](file://server/src/modules/payment/payment.service.ts)
- [member.controller.ts](file://server/src/modules/member/member.controller.ts)
- [member.service.ts](file://server/src/modules/member/member.service.ts)
- [tts.controller.ts](file://server/src/modules/tts/tts.controller.ts)
- [tts.service.ts](file://server/src/modules/tts/tts.service.ts)
- [orders/index.vue](file://my-uniapp-vue3/src/pages/orders/index.vue)
- [member/index.vue](file://my-uniapp-vue3/src/pages/member/index.vue)
## 核心组件
本节从数据模型与业务服务两个维度,梳理订单与积分的核心组件。
- 订单模型(Order)
- 关键字段:用户标识、商品/套餐信息、应付金额、实付金额、币种、支付渠道、订单状态、扩展信息等
- 状态:如待支付、已支付、已取消、已完成等
- 金额计算:原价折扣、优惠券、积分抵扣、实付金额等
- 关联:与用户、套餐、支付记录、积分流水存在多对多或一对多关系
- 积分余额模型(TokenBalance)
- 关键字段:用户标识、可用积分、冻结积分、总获取、总消耗、统计周期等
- 获取规则:购买套餐赠送、签到奖励、活动奖励等
- 使用限制:抵扣比例、单次上限、有效期、不可透支等
- 重置机制:按自然月/季度/年重置,或按活动周期清零
- 积分流水模型(TokenUsage)
- 关键字段:用户标识、流水类型(收入/支出)、变动数量、剩余余额、关联单据、备注、时间戳等
- 类型:购买套餐、语音合成消费、退款回退、活动发放、过期回收等
- 订单管理服务(Payment Service)
- 职责:创建订单、发起支付、回调处理、状态更新、异常处理
- 支付方式:微信支付、支付宝等(以配置为准)
- 会员与积分服务(Member Service)
- 职责:查询余额、变更余额、生成流水、执行重置策略、风控校验
- 语音合成消费(TTS Service)
- 职责:调用TTS服务、根据字数/时长计费、扣减积分、记录流水
章节来源
- [schema.prisma](file://server/prisma/schema.prisma)
- [models.json](file://server/src/config/models.json)
- [models-validator.ts](file://server/src/config/models-validator.ts)
- [payment.service.ts](file://server/src/modules/payment/payment.service.ts)
- [member.service.ts](file://server/src/modules/member/member.service.ts)
- [tts.service.ts](file://server/src/modules/tts/tts.service.ts)
## 架构总览
下图展示订单与积分在系统中的交互关系与数据流:
```mermaid
sequenceDiagram
participant Client as "客户端"
participant OrdersUI as "订单页面
orders/index.vue"
participant MemberUI as "会员页面
member/index.vue"
participant PaymentCtrl as "支付控制器"
participant PaymentSvc as "支付服务"
participant MemberSvc as "会员服务"
participant TTSSvc as "TTS服务"
participant DB as "数据库"
Client->>OrdersUI : 打开订单列表
OrdersUI->>PaymentCtrl : 查询订单列表
PaymentCtrl->>PaymentSvc : 订单查询
PaymentSvc->>DB : 读取订单表
DB-->>PaymentSvc : 订单数据
PaymentSvc-->>PaymentCtrl : 返回结果
PaymentCtrl-->>OrdersUI : 渲染订单
Client->>MemberUI : 查看积分与充值
MemberUI->>MemberSvc : 查询余额/流水
MemberSvc->>DB : 读取余额与流水
DB-->>MemberSvc : 结果
MemberSvc-->>MemberUI : 展示
Client->>TTSSvc : 发起语音合成
TTSSvc->>TTSSvc : 计算消耗
TTSSvc->>MemberSvc : 扣减积分
MemberSvc->>DB : 更新余额/写入流水
DB-->>MemberSvc : 成功
MemberSvc-->>TTSSvc : 扣减成功
TTSSvc-->>Client : 合成结果
```
图表来源
- [orders/index.vue](file://my-uniapp-vue3/src/pages/orders/index.vue)
- [member/index.vue](file://my-uniapp-vue3/src/pages/member/index.vue)
- [payment.controller.ts](file://server/src/modules/payment/payment.controller.ts)
- [payment.service.ts](file://server/src/modules/payment/payment.service.ts)
- [member.controller.ts](file://server/src/modules/member/member.controller.ts)
- [member.service.ts](file://server/src/modules/member/member.service.ts)
- [tts.controller.ts](file://server/src/modules/tts/tts.controller.ts)
- [tts.service.ts](file://server/src/modules/tts/tts.service.ts)
## 详细组件分析
### 订单模型(Order)与状态流转
- 数据结构要点
- 用户标识、商品/套餐标识、数量、单价、优惠信息、应付/实付金额、币种
- 支付渠道、支付单号、回调时间、扩展字段
- 订单状态:待支付、已支付、已取消、已完成、部分退款、已关闭等
- 状态流转
- 创建订单 → 待支付
- 支付成功 → 已支付
- 支付失败/超时 → 已取消
- 完成服务 → 已完成
- 部分退款 → 部分退款
- 金额计算
- 原价 × 数量
- 优惠券/折扣/积分抵扣后的实付金额
- 回调时以第三方返回为准,确保幂等更新
```mermaid
stateDiagram-v2
[*] --> 待支付
待支付 --> 已支付 : "支付成功"
待支付 --> 已取消 : "支付失败/超时"
已支付 --> 已完成 : "服务完成"
已支付 --> 部分退款 : "部分退款"
已支付 --> 已取消 : "主动取消"
已完成 --> [*]
部分退款 --> 已完成 : "剩余完成"
已取消 --> [*]
```
图表来源
- [payment.service.ts](file://server/src/modules/payment/payment.service.ts)
- [schema.prisma](file://server/prisma/schema.prisma)
章节来源
- [payment.service.ts](file://server/src/modules/payment/payment.service.ts)
- [schema.prisma](file://server/prisma/schema.prisma)
### 积分余额模型(TokenBalance)与流水(TokenUsage)
- TokenBalance
- 字段:用户标识、可用积分、冻结积分、总获取、总消耗、统计周期、更新时间
- 规则:可用积分 ≥ 0;冻结积分用于预占但不参与抵扣;周期性重置由策略控制
- TokenUsage
- 字段:用户标识、流水类型(收入/支出)、变动数量、剩余余额、关联单据、备注、时间戳
- 类型:购买套餐(收入)、语音合成消费(支出)、退款回退(收入)、活动发放(收入)、过期回收(支出)
- 获取与使用
- 获取:购买套餐赠送、签到奖励、活动奖励、任务奖励等
- 使用:抵扣订单金额(需满足最低抵扣、单次上限、有效期等)
- 冻结与解冻:消费预占(冻结),完成后转可用或按规则回收
- 重置机制
- 自然月/季度/年重置:到期未使用的积分清零并记录流水
- 活动周期:活动结束后统一清零并记录
```mermaid
flowchart TD
Start(["开始"]) --> GetRule["获取积分规则"]
GetRule --> Income{"是否收入类?"}
Income --> |是| AddBalance["增加可用积分/累计获取"]
Income --> |否| Deduct{"是否可抵扣?"}
Deduct --> |是| Freeze["预占积分冻结"]
Freeze --> Consume["实际消费完成"]
Consume --> Unfreeze["转为可用积分"]
Deduct --> |否| Record["记录流水但不扣减"]
AddBalance --> Save["保存余额"]
Unfreeze --> Save
Record --> Save
Save --> End(["结束"])
```
图表来源
- [member.service.ts](file://server/src/modules/member/member.service.ts)
- [schema.prisma](file://server/prisma/schema.prisma)
章节来源
- [member.service.ts](file://server/src/modules/member/member.service.ts)
- [schema.prisma](file://server/prisma/schema.prisma)
### 订单管理服务(Payment Service)
- 职责
- 接收前端请求,构造订单参数
- 调用支付渠道发起支付
- 处理回调,更新订单状态与积分流水
- 幂等处理,保证一致性
- 支付方式
- 微信支付、支付宝等(以配置与第三方对接为准)
- 金额与风控
- 实付金额校验、最小/最大限额、重复支付拦截
```mermaid
sequenceDiagram
participant Client as "客户端"
participant Ctrl as "支付控制器"
participant Svc as "支付服务"
participant Pay as "支付渠道"
participant DB as "数据库"
Client->>Ctrl : 提交下单请求
Ctrl->>Svc : 创建订单并发起支付
Svc->>DB : 写入订单
Svc->>Pay : 发起支付
Pay-->>Svc : 支付结果
Svc->>DB : 更新订单状态/金额
Svc-->>Ctrl : 返回结果
Ctrl-->>Client : 订单状态
```
图表来源
- [payment.controller.ts](file://server/src/modules/payment/payment.controller.ts)
- [payment.service.ts](file://server/src/modules/payment/payment.service.ts)
章节来源
- [payment.controller.ts](file://server/src/modules/payment/payment.controller.ts)
- [payment.service.ts](file://server/src/modules/payment/payment.service.ts)
### 语音合成消费(TTS Service)
- 职责
- 计算合成消耗(字数/时长/模型系数)
- 扣减积分并记录流水
- 失败回滚(恢复冻结积分)
- 与订单的关系
- 可作为“套餐内资源”的使用,也可独立计费
- 若来自订单,则与订单状态联动(如完成/退款)
```mermaid
sequenceDiagram
participant Client as "客户端"
participant TTSCtrl as "TTS控制器"
participant TTSSvc as "TTS服务"
participant MemberSvc as "会员服务"
participant DB as "数据库"
Client->>TTSCtrl : 发起合成
TTSCtrl->>TTSSvc : 计算消耗
TTSSvc->>MemberSvc : 扣减积分
MemberSvc->>DB : 写入流水/更新余额
DB-->>MemberSvc : 成功
MemberSvc-->>TTSSvc : 扣减成功
TTSSvc-->>Client : 合成结果
```
图表来源
- [tts.controller.ts](file://server/src/modules/tts/tts.controller.ts)
- [tts.service.ts](file://server/src/modules/tts/tts.service.ts)
- [member.service.ts](file://server/src/modules/member/member.service.ts)
章节来源
- [tts.controller.ts](file://server/src/modules/tts/tts.controller.ts)
- [tts.service.ts](file://server/src/modules/tts/tts.service.ts)
- [member.service.ts](file://server/src/modules/member/member.service.ts)
### 前端页面与交互
- 订单页面(orders/index.vue)
- 展示订单列表、状态筛选、查看详情、再次购买
- 会员页面(member/index.vue)
- 展示积分余额、流水明细、充值入口、规则说明
章节来源
- [orders/index.vue](file://my-uniapp-vue3/src/pages/orders/index.vue)
- [member/index.vue](file://my-uniapp-vue3/src/pages/member/index.vue)
## 依赖分析
- 组件耦合
- Payment Service 依赖 Member Service(积分抵扣/流水)、数据库(订单与流水)
- Member Service 依赖数据库(余额与流水)、配置(规则与重置策略)
- TTS Service 依赖 Member Service(扣减积分)、数据库(流水)
- 外部依赖
- 支付渠道SDK(微信/支付宝)
- 第三方回调签名验证
- 潜在风险
- 幂等性:支付回调与主动查询需保证重复处理不重复计费
- 一致性:积分扣减与订单状态需事务性保障
- 性能:高并发下积分与订单的读写锁竞争
```mermaid
graph LR
PaymentSvc["支付服务"] --> MemberSvc["会员服务"]
PaymentSvc --> DB["数据库"]
MemberSvc --> DB
TTSSvc["TTS服务"] --> MemberSvc
TTSSvc --> DB
PaymentCtrl["支付控制器"] --> PaymentSvc
MemberCtrl["会员控制器"] --> MemberSvc
TTSCtrl["TTS控制器"] --> TTSSvc
```
图表来源
- [payment.service.ts](file://server/src/modules/payment/payment.service.ts)
- [member.service.ts](file://server/src/modules/member/member.service.ts)
- [tts.service.ts](file://server/src/modules/tts/tts.service.ts)
章节来源
- [payment.service.ts](file://server/src/modules/payment/payment.service.ts)
- [member.service.ts](file://server/src/modules/member/member.service.ts)
- [tts.service.ts](file://server/src/modules/tts/tts.service.ts)
## 性能考虑
- 读写分离与缓存
- 订单与积分查询高频,可引入Redis缓存热点数据
- 批量操作
- 支付回调批处理、积分重置批量执行
- 幂等设计
- 回调接口通过订单号+支付单号去重
- 分库分表
- 订单与流水按时间分区,提升查询效率
## 故障排除指南
- 订单状态异常
- 现象:支付成功但订单仍为待支付
- 排查:检查回调签名、幂等逻辑、数据库事务
- 积分扣减失败
- 现象:语音合成失败但积分被扣
- 排查:确认扣减前置条件、异常回滚、流水记录
- 重复支付
- 现象:同一订单多次扣款
- 排查:幂等键设计、回调去重、数据库唯一约束
- 重置未生效
- 现象:周期末积分未清零
- 排查:重置任务调度、边界日期处理、日志审计
章节来源
- [payment.service.ts](file://server/src/modules/payment/payment.service.ts)
- [member.service.ts](file://server/src/modules/member/member.service.ts)
- [tts.service.ts](file://server/src/modules/tts/tts.service.ts)
## 结论
本文件基于仓库现有代码与文档,系统化梳理了AI有声书平台的订单与积分模型。通过明确数据结构、状态流转、服务职责与交互流程,为后续扩展(如更多支付渠道、复杂积分规则、报表分析)提供了清晰的参考路径。建议在生产环境中进一步完善幂等与一致性保障,并持续优化性能与可观测性。
## 附录
### API使用示例(基于现有API文档)
- 订单相关
- 创建订单:提交商品/套餐信息与支付方式,返回订单号与支付参数
- 查询订单:按用户与状态筛选,支持分页
- 支付回调:接收第三方回调,更新订单状态
- 会员与积分
- 查询余额:返回可用/冻结积分与累计值
- 积分流水:按类型与时间范围查询
- 兑换/充值:提交充值金额或兑换申请
- TTS消费
- 发起合成:传入文本与参数,返回结果与消耗积分
章节来源
- [API.md](file://docs/API.md)
### 数据模型概览(基于Prisma Schema)
- 订单表:包含用户标识、商品/套餐、金额、状态、支付信息等
- 积分余额表:包含用户标识、可用/冻结积分、累计获取/消耗、周期等
- 积分流水表:包含用户标识、流水类型、变动数量、剩余余额、关联单据等
章节来源
- [schema.prisma](file://server/prisma/schema.prisma)
- [数据库结构.md](file://docs/数据库结构.md)