# 计费与配额 **本文引用的文件** - [server/src/modules/subscription/subscription.service.ts](file://server/src/modules/subscription/subscription.service.ts) - [server/src/modules/subscription/subscription.controller.ts](file://server/src/modules/subscription/subscription.controller.ts) - [server/src/modules/payment/payment.service.ts](file://server/src/modules/payment/payment.service.ts) - [server/src/modules/payment/payment.controller.ts](file://server/src/modules/payment/payment.controller.ts) - [server/src/modules/tts/tts.service.ts](file://server/src/modules/tts/tts.service.ts) - [server/src/middleware/usageLimit.ts](file://server/src/middleware/usageLimit.ts) - [server/src/middleware/errorHandler.ts](file://server/src/middleware/errorHandler.ts) - [server/src/types/index.ts](file://server/src/types/index.ts) - [server/prisma/schema.prisma](file://server/prisma/schema.prisma) - [docs/API.md](file://docs/API.md) - [docs/支付集成指南.md](file://docs/支付集成指南.md) - [docs/TTS成本分析报告.md](file://docs/TTS成本分析报告.md) - [server/src/services/log.service.ts](file://server/src/services/log.service.ts) ## 目录 1. [引言](#引言) 2. [项目结构](#项目结构) 3. [核心组件](#核心组件) 4. [架构总览](#架构总览) 5. [详细组件分析](#详细组件分析) 6. [依赖关系分析](#依赖关系分析) 7. [性能考量](#性能考量) 8. [故障排查指南](#故障排查指南) 9. [结论](#结论) 10. [附录](#附录) ## 引言 本文件面向计费与配额系统,系统采用“Token计费 + 音频时长计费”的双轨计费模型,结合套餐体系与实时扣费机制,确保在保障用户体验的同时实现成本可控与商业可持续。文档涵盖以下主题: - Token计费模型设计与配额计算算法 - 音频生成计费规则与字数转时长算法 - 配额检查机制、实时扣费逻辑、余额不足处理与预估费用计算 - 完整计费API接口文档(配额查询、使用记录、余额变更等) - 计费数据模型、统计报表、审计日志与财务对账 - 异常处理、数据一致性保证与性能优化策略 ## 项目结构 计费与配额相关能力分布在以下模块与文件中: - 订阅与配额服务:subscription.service.ts、subscription.controller.ts - 支付与订单:payment.service.ts、payment.controller.ts - TTS生成流程:tts.service.ts - 中间件:usageLimit.ts(字数/次数限制)、errorHandler.ts(统一错误处理) - 类型定义:types/index.ts - 数据模型:prisma/schema.prisma - 文档:API.md、支付集成指南.md、TTS成本分析报告.md - 日志服务:services/log.service.ts ```mermaid graph TB subgraph "前端" FE["前端页面
订单/余额/使用记录"] end subgraph "后端" CTRL_SUB["订阅控制器
subscription.controller.ts"] SVC_SUB["订阅服务
subscription.service.ts"] CTRL_PAY["支付控制器
payment.controller.ts"] SVC_PAY["支付服务
payment.service.ts"] M_WL["使用限制中间件
usageLimit.ts"] M_ERR["错误处理中间件
errorHandler.ts"] SVC_TTS["TTS服务
tts.service.ts"] PRISMA["Prisma模型
schema.prisma"] LOG["日志服务
log.service.ts"] end FE --> CTRL_SUB FE --> CTRL_PAY CTRL_SUB --> SVC_SUB CTRL_PAY --> SVC_PAY SVC_SUB --> PRISMA SVC_PAY --> PRISMA SVC_TTS --> PRISMA M_WL --> SVC_TTS M_ERR --> CTRL_SUB M_ERR --> CTRL_PAY LOG --> SVC_SUB LOG --> SVC_PAY ``` 图表来源 - [server/src/modules/subscription/subscription.controller.ts:1-191](file://server/src/modules/subscription/subscription.controller.ts#L1-L191) - [server/src/modules/subscription/subscription.service.ts:1-727](file://server/src/modules/subscription/subscription.service.ts#L1-L727) - [server/src/modules/payment/payment.controller.ts:1-258](file://server/src/modules/payment/payment.controller.ts#L1-L258) - [server/src/modules/payment/payment.service.ts:1-578](file://server/src/modules/payment/payment.service.ts#L1-L578) - [server/src/modules/tts/tts.service.ts:1-715](file://server/src/modules/tts/tts.service.ts#L1-L715) - [server/src/middleware/usageLimit.ts:1-66](file://server/src/middleware/usageLimit.ts#L1-L66) - [server/src/middleware/errorHandler.ts:1-67](file://server/src/middleware/errorHandler.ts#L1-L67) - [server/prisma/schema.prisma:1-470](file://server/prisma/schema.prisma#L1-L470) - [server/src/services/log.service.ts:1-354](file://server/src/services/log.service.ts#L1-L354) 章节来源 - [server/src/modules/subscription/subscription.controller.ts:1-191](file://server/src/modules/subscription/subscription.controller.ts#L1-L191) - [server/src/modules/subscription/subscription.service.ts:1-727](file://server/src/modules/subscription/subscription.service.ts#L1-L727) - [server/src/modules/payment/payment.controller.ts:1-258](file://server/src/modules/payment/payment.controller.ts#L1-L258) - [server/src/modules/payment/payment.service.ts:1-578](file://server/src/modules/payment/payment.service.ts#L1-L578) - [server/src/modules/tts/tts.service.ts:1-715](file://server/src/modules/tts/tts.service.ts#L1-L715) - [server/src/middleware/usageLimit.ts:1-66](file://server/src/middleware/usageLimit.ts#L1-L66) - [server/src/middleware/errorHandler.ts:1-67](file://server/src/middleware/errorHandler.ts#L1-L67) - [server/prisma/schema.prisma:1-470](file://server/prisma/schema.prisma#L1-L470) - [docs/API.md:1-499](file://docs/API.md#L1-L499) - [docs/支付集成指南.md:277-336](file://docs/支付集成指南.md#L277-L336) - [docs/TTS成本分析报告.md:62-216](file://docs/TTS成本分析报告.md#L62-L216) - [server/src/services/log.service.ts:1-354](file://server/src/services/log.service.ts#L1-L354) ## 核心组件 - 订阅与配额服务:负责套餐等级、Token配额、音频时长配额、余额查询、使用记录、配额检查、实时扣费与预估费用计算。 - 支付服务:负责订单创建、支付回调处理、订阅激活、Token余额初始化与重置。 - TTS服务:负责音频生成流程,集成配额检查与扣费逻辑。 - 中间件:使用限制中间件(次数/字数)与统一错误处理。 - 数据模型:Prisma定义的用户、订单、订阅、Token余额与使用记录等模型。 - 日志服务:请求日志、错误分析与统计。 章节来源 - [server/src/modules/subscription/subscription.service.ts:1-727](file://server/src/modules/subscription/subscription.service.ts#L1-L727) - [server/src/modules/payment/payment.service.ts:1-578](file://server/src/modules/payment/payment.service.ts#L1-L578) - [server/src/modules/tts/tts.service.ts:1-715](file://server/src/modules/tts/tts.service.ts#L1-L715) - [server/src/middleware/usageLimit.ts:1-66](file://server/src/middleware/usageLimit.ts#L1-L66) - [server/prisma/schema.prisma:1-470](file://server/prisma/schema.prisma#L1-L470) - [server/src/services/log.service.ts:1-354](file://server/src/services/log.service.ts#L1-L354) ## 架构总览 计费与配额系统围绕“套餐—订阅—配额—扣费—统计”闭环构建,支付成功后激活订阅并初始化Token余额;生成音频前进行配额检查与预估;生成完成后按实际时长扣费并记录使用。 ```mermaid sequenceDiagram participant U as "用户" participant FE as "前端" participant PC as "支付控制器" participant PS as "支付服务" participant SC as "订阅控制器" participant SS as "订阅服务" participant PR as "Prisma" participant TS as "TTS服务" U->>FE : "选择套餐并发起支付" FE->>PC : "POST /api/payment/create" PC->>PS : "创建订单" PS->>PR : "写入订单" PS-->>PC : "返回支付链接/二维码" PC-->>FE : "返回支付信息" FE->>PC : "支付回调/同步返回" PC->>PS : "处理回调" PS->>PR : "更新订单状态" PS->>PR : "激活订阅/更新用户等级" PS->>PR : "初始化/更新Token余额" U->>FE : "发起音频生成" FE->>SC : "GET /api/subscription/audio-estimate" SC->>SS : "预估费用" SS-->>SC : "返回预估结果" SC-->>FE : "显示预估费用" FE->>TS : "POST /api/tts/generate" TS->>SS : "检查配额/预估" TS->>PR : "生成音频并更新状态" TS->>SS : "扣除音频时长" SS->>PR : "更新用户usedAudioMinutes/记录TokenUsage" TS-->>FE : "返回音频URL/时长" ``` 图表来源 - [server/src/modules/payment/payment.controller.ts:1-258](file://server/src/modules/payment/payment.controller.ts#L1-L258) - [server/src/modules/payment/payment.service.ts:1-578](file://server/src/modules/payment/payment.service.ts#L1-L578) - [server/src/modules/subscription/subscription.controller.ts:1-191](file://server/src/modules/subscription/subscription.controller.ts#L1-L191) - [server/src/modules/subscription/subscription.service.ts:556-727](file://server/src/modules/subscription/subscription.service.ts#L556-L727) - [server/src/modules/tts/tts.service.ts:1-715](file://server/src/modules/tts/tts.service.ts#L1-L715) - [server/prisma/schema.prisma:1-470](file://server/prisma/schema.prisma#L1-L470) ## 详细组件分析 ### 订阅与配额服务(subscription.service.ts) - Token计费配置与成本计算 - 提供不同AI模型与TTS提供商的成本配置,支持按字数估算Token消耗与总成本。 - 提供建议售价以保证利润空间。 - 音频时长计费系统 - 基于语速(字/分钟)将文本长度转换为音频时长。 - 支持包月配额与按量超额计费,不同会员等级对应不同的配额与超额单价。 - 配额检查与余额管理 - 检查用户Token余额是否充足;支持无限配额场景。 - 提供Token使用记录查询与分页。 - 音频时长余额与扣费 - 每月1日重置音频时长配额;生成完成后按实际时长扣费并记录使用。 - 提供音频生成预估接口,返回配额内/外分钟数与预估费用。 ```mermaid flowchart TD Start(["开始:生成音频"]) --> CalcDur["计算音频时长
textLength -> minutes"] CalcDur --> GetQuota["获取用户配额与余额"] GetQuota --> CheckUnlimited{"是否无限配额?"} CheckUnlimited --> |是| Deduct["直接扣费按量"] CheckUnlimited --> |否| Compare{"剩余分钟是否足够?"} Compare --> |否| Reject["拒绝生成:余额不足"] Compare --> |是| Deduct["扣费:按配额内/外分别计费"] Deduct --> Log["记录TokenUsage"] Log --> End(["结束"]) Reject --> End ``` 图表来源 - [server/src/modules/subscription/subscription.service.ts:556-727](file://server/src/modules/subscription/subscription.service.ts#L556-L727) 章节来源 - [server/src/modules/subscription/subscription.service.ts:95-155](file://server/src/modules/subscription/subscription.service.ts#L95-L155) - [server/src/modules/subscription/subscription.service.ts:519-600](file://server/src/modules/subscription/subscription.service.ts#L519-L600) - [server/src/modules/subscription/subscription.service.ts:602-727](file://server/src/modules/subscription/subscription.service.ts#L602-L727) ### 支付服务(payment.service.ts) - 订单创建与支付通道 - 支持支付宝与微信支付,生成支付链接或二维码;提供沙箱/模拟支付能力。 - 支付回调与订阅激活 - 验签并通过回调更新订单状态;成功后激活订阅、更新用户等级与会员到期时间。 - 根据套餐配置初始化或更新Token余额(含重置日期)。 - 订单查询与列表 - 提供订单列表与详情查询,便于财务对账与审计。 ```mermaid sequenceDiagram participant C as "客户端" participant PC as "支付控制器" participant PS as "支付服务" participant SDK as "支付SDK" participant DB as "数据库" C->>PC : "POST /api/payment/create" PC->>PS : "创建订单" PS->>SDK : "生成支付链接/二维码" SDK-->>PS : "返回支付信息" PS->>DB : "写入订单" PS-->>PC : "返回支付信息" PC-->>C : "返回支付链接/二维码" note over SDK,DB : "支付回调" SDK-->>PC : "异步通知/同步返回" PC->>PS : "处理回调" PS->>DB : "更新订单状态/激活订阅" PS->>DB : "初始化/更新Token余额" ``` 图表来源 - [server/src/modules/payment/payment.controller.ts:1-258](file://server/src/modules/payment/payment.controller.ts#L1-L258) - [server/src/modules/payment/payment.service.ts:121-509](file://server/src/modules/payment/payment.service.ts#L121-L509) 章节来源 - [server/src/modules/payment/payment.controller.ts:1-258](file://server/src/modules/payment/payment.controller.ts#L1-L258) - [server/src/modules/payment/payment.service.ts:121-509](file://server/src/modules/payment/payment.service.ts#L121-L509) ### TTS服务(tts.service.ts) - 文本分段与Provider选择 - 根据Provider类型(阿里云/MiniMax/模拟)选择分段策略与并发参数。 - 音频生成与状态管理 - 生成完成后合并音频、上传存储、更新章节状态与AudioRecord记录。 - 与计费系统的集成点 - 在生成前进行配额检查与预估;生成完成后按实际时长扣费并记录使用。 章节来源 - [server/src/modules/tts/tts.service.ts:200-542](file://server/src/modules/tts/tts.service.ts#L200-L542) - [server/src/modules/tts/tts.service.ts:544-715](file://server/src/modules/tts/tts.service.ts#L544-L715) ### 使用限制中间件(usageLimit.ts) - 每日使用次数与字数限制 - 基于用户会员等级配置每日次数与单次字数上限;跨日自动重置。 - 对超限请求抛出配额超限错误。 章节来源 - [server/src/middleware/usageLimit.ts:1-66](file://server/src/middleware/usageLimit.ts#L1-L66) - [server/src/types/index.ts:120-124](file://server/src/types/index.ts#L120-L124) ### 错误处理中间件(errorHandler.ts) - 统一错误响应 - 捕获自定义业务错误(如配额超限、参数错误等),返回标准化错误码与消息。 章节来源 - [server/src/middleware/errorHandler.ts:1-67](file://server/src/middleware/errorHandler.ts#L1-L67) ### 数据模型(Prisma schema.prisma) - 关键模型 - User:用户基本信息、会员等级、音频时长使用与重置时间。 - SubscriptionPlan:套餐计划(月/年价格、Token配额、每日生成次数、音色数、音质等)。 - Subscription:用户订阅记录(起止时间、状态、自动续费)。 - TokenBalance:Token余额(总量、已用、重置日期)。 - TokenUsage:Token使用记录(类型、数量、内容长度、描述)。 - Order:订单(金额、状态、支付渠道、支付单号、购买套餐)。 章节来源 - [server/prisma/schema.prisma:10-470](file://server/prisma/schema.prisma#L10-L470) - [docs/支付集成指南.md:277-336](file://docs/支付集成指南.md#L277-L336) ### 计费API接口文档 - 订阅与配额相关接口 - 获取套餐列表与详情 - 获取用户订阅信息 - 获取用户Token余额与使用记录 - 获取用户配额与配额检查 - 书籍规模预估与生成配额检查 - 获取用户音频时长余额与音频生成预估 - 支付相关接口 - 创建支付订单 - 支付宝/微信回调与同步返回 - 订单列表与详情查询 - 生成支付宝扫码支付二维码 章节来源 - [server/src/modules/subscription/subscription.controller.ts:1-191](file://server/src/modules/subscription/subscription.controller.ts#L1-L191) - [server/src/modules/payment/payment.controller.ts:1-258](file://server/src/modules/payment/payment.controller.ts#L1-L258) - [docs/API.md:1-499](file://docs/API.md#L1-L499) ## 依赖关系分析 - 订阅服务依赖Prisma模型进行余额与使用记录的读写。 - 支付服务在回调中激活订阅并初始化Token余额,依赖Prisma模型。 - TTS服务在生成完成后调用订阅服务进行音频时长扣费与记录。 - 中间件在TTS生成前进行字数/次数限制校验。 - 日志服务贯穿各模块,提供请求与错误日志记录与分析。 ```mermaid graph LR SVC_SUB["订阅服务"] --> PRISMA["Prisma模型"] SVC_PAY["支付服务"] --> PRISMA SVC_TTS["TTS服务"] --> SVC_SUB M_WL["使用限制中间件"] --> SVC_TTS M_ERR["错误处理中间件"] --> SVC_SUB M_ERR --> SVC_PAY LOG["日志服务"] --> SVC_SUB LOG --> SVC_PAY ``` 图表来源 - [server/src/modules/subscription/subscription.service.ts:1-727](file://server/src/modules/subscription/subscription.service.ts#L1-L727) - [server/src/modules/payment/payment.service.ts:1-578](file://server/src/modules/payment/payment.service.ts#L1-L578) - [server/src/modules/tts/tts.service.ts:1-715](file://server/src/modules/tts/tts.service.ts#L1-L715) - [server/src/middleware/usageLimit.ts:1-66](file://server/src/middleware/usageLimit.ts#L1-L66) - [server/src/middleware/errorHandler.ts:1-67](file://server/src/middleware/errorHandler.ts#L1-L67) - [server/prisma/schema.prisma:1-470](file://server/prisma/schema.prisma#L1-L470) - [server/src/services/log.service.ts:1-354](file://server/src/services/log.service.ts#L1-L354) 章节来源 - [server/src/modules/subscription/subscription.service.ts:1-727](file://server/src/modules/subscription/subscription.service.ts#L1-L727) - [server/src/modules/payment/payment.service.ts:1-578](file://server/src/modules/payment/payment.service.ts#L1-L578) - [server/src/modules/tts/tts.service.ts:1-715](file://server/src/modules/tts/tts.service.ts#L1-L715) - [server/src/middleware/usageLimit.ts:1-66](file://server/src/middleware/usageLimit.ts#L1-L66) - [server/src/middleware/errorHandler.ts:1-67](file://server/src/middleware/errorHandler.ts#L1-L67) - [server/prisma/schema.prisma:1-470](file://server/prisma/schema.prisma#L1-L470) - [server/src/services/log.service.ts:1-354](file://server/src/services/log.service.ts#L1-L354) ## 性能考量 - 并发与分段 - TTS分段与并发策略依据Provider类型调整,减少长文本等待时间。 - 缓存与索引 - Prisma模型已建立常用索引(用户、时间、状态等),提升查询效率。 - 日志与监控 - 日志服务提供请求统计与错误分析,辅助定位性能瓶颈。 - 重置策略 - Token与音频时长配额按月重置,避免长期累积导致查询压力。 [本节为通用指导,无需特定文件引用] ## 故障排查指南 - 支付回调未生效 - 检查回调签名验证与订单状态更新逻辑;确认支付SDK初始化与证书配置。 - 配额检查失败 - 确认用户会员等级与套餐配置;检查每日使用次数与字数限制中间件是否生效。 - 余额不足 - 检查Token余额与使用记录;确认支付成功后是否正确初始化/更新余额。 - 音频生成失败 - 查看TTS服务生成日志与错误回退逻辑;确认Provider可用性与分段策略。 - 日志与审计 - 使用日志服务分析错误模式与趋势,定位高频错误与热点路径。 章节来源 - [server/src/modules/payment/payment.service.ts:358-406](file://server/src/modules/payment/payment.service.ts#L358-L406) - [server/src/middleware/usageLimit.ts:1-66](file://server/src/middleware/usageLimit.ts#L1-L66) - [server/src/modules/subscription/subscription.service.ts:410-437](file://server/src/modules/subscription/subscription.service.ts#L410-L437) - [server/src/modules/tts/tts.service.ts:518-542](file://server/src/modules/tts/tts.service.ts#L518-L542) - [server/src/services/log.service.ts:217-297](file://server/src/services/log.service.ts#L217-L297) ## 结论 本计费与配额系统通过清晰的双轨计费模型(Token与音频时长)、完善的套餐与订阅机制、严格的配额检查与实时扣费流程,实现了成本可控与用户体验的平衡。配合支付回调、日志审计与错误处理机制,系统具备良好的可维护性与扩展性。建议在后续迭代中完善Token扣费与TTS生成流程的深度集成,并持续优化性能与可观测性。 [本节为总结性内容,无需特定文件引用] ## 附录 ### 计费数据模型(摘录) - User:会员等级、音频时长使用与重置时间 - SubscriptionPlan:月/年价格、Token配额、每日生成次数、音色数、音质 - Subscription:订阅起止时间、状态、自动续费 - TokenBalance:总量、已用、重置日期 - TokenUsage:类型、数量、内容长度、描述 - Order:金额、状态、支付渠道、支付单号、购买套餐 章节来源 - [server/prisma/schema.prisma:10-470](file://server/prisma/schema.prisma#L10-L470) - [docs/支付集成指南.md:277-336](file://docs/支付集成指南.md#L277-L336) ### Token计费与音频时长计费要点 - Token计费 - 基于AI模型与TTS提供商的成本配置,按字数估算Token消耗与总成本。 - 音频时长计费 - 语速固定,文本长度转换为分钟数;包月配额内按批发价计费,超出部分按零售价计费。 - 预估与扣费 - 生成前提供预估费用;生成完成后按实际时长扣费并记录使用。 章节来源 - [docs/TTS成本分析报告.md:62-216](file://docs/TTS成本分析报告.md#L62-L216) - [server/src/modules/subscription/subscription.service.ts:519-600](file://server/src/modules/subscription/subscription.service.ts#L519-L600) - [server/src/modules/subscription/subscription.service.ts:685-724](file://server/src/modules/subscription/subscription.service.ts#L685-L724)