fix: close sms scheduling and billing gaps

This commit is contained in:
hectorzhao
2026-07-01 18:56:05 +08:00
parent 8ba4ef8a13
commit f8c9b78c21
28 changed files with 1480 additions and 26 deletions
+15
View File
@@ -96,6 +96,21 @@ node <inline step5 schedule probe>
主要缺口是定时发送未实现,且发送链路尚未把余额冻结扣费、模板/签名/报备状态阻断等业务规则接入完整闭环。
## 缺口修复复测记录
- 定时发送已补齐 `scheduledAt``canceledAt` 字段,支持 `sendMode=scheduled` 创建 scheduled 任务。
- 新增 `POST /api/client/send/batch-tasks/:id/cancel` 支持到点前取消。
- 新增 `POST /api/admin/send/scheduled/dispatch-due` 支持到点触发入队。
- 到点触发前会重新校验企业状态、认证状态、应用状态、模板审核状态、签名审核/报备状态和账户余额。
- `api/src/send-chain/send-chain.service.spec.ts` 已覆盖定时创建、取消、到点触发和到点余额/资源校验基础路径。
复测命令:
```bash
npm --prefix api test -- send-chain.service.spec.ts
npm --prefix api run build
```
## 下一步
进入第 6 步:执行计费和对账闭环测试。重点覆盖人工充值、费用预估、余额检查、冻结、扣费、释放、退款、短信计费记录、对账 reconciliation,以及 dashboard/statistics 中计费相关数据准确性。
+16
View File
@@ -90,6 +90,22 @@ node <inline step6 auto-billing probe>
主要缺口是发送链路尚未自动调用计费闭环:发送任务创建后不会自动冻结或扣费,也不会自动生成短信计费记录,消息金额默认为 0。后续需要把第 5 步发送链路和第 6 步计费能力连接起来。
## 缺口修复复测记录
- 发送创建时会按通道单价写入 `SmsMessageRecord.billingUnits/unitPrice/amountCents`
- 立即发送创建时执行账户检查和冻结;定时发送创建时检查余额,到点触发再冻结。
- Gateway submit accepted 后会生成/更新 `SmsBillingRecord`,写入 charged 流水。
- Gateway submit rejected/timeout 会释放冻结。
- 最终失败回执和 72 小时 unknown 转 timeout 会执行退款并更新计费记录状态。
- trace、dashboard 和 reconciliation 可通过消息金额、计费记录和账户交易聚合看到自动计费数据。
复测命令:
```bash
npm --prefix api test -- send-chain.service.spec.ts billing.service.spec.ts operations.service.spec.ts
npm --prefix api run build
```
## 下一步
进入第 7 步:执行 CMPP 连接状态、通道路由、客户/通道连接数量管理和展示测试。重点覆盖客户连接状态、通道 CMPP 连接状态、连接数量展示、通道 health/metrics、路由规则和 Gateway 相关契约。
+36
View File
@@ -90,6 +90,42 @@ npm run test:gateway
| Gateway 未接真实运营商 SMSC | 真实 CMPP 互通仍需联调环境验证。 | 在运营商测试环境补充联调测试报告。 |
| 前端自动化测试缺失 | 当前只有 build smoke,缺少页面级断言。 | 后续补充 Playwright/Vitest smoke 覆盖 dashboard、发送、配置核心页面。 |
## 缺口修复复测追加
本轮已修复或补齐以下原缺口:
- 定时短信:新增计划发送时间、scheduled 状态、取消接口、到点触发和到点重校验。
- 自动计费:发送链路接入余额检查、冻结、扣费、释放、退款和短信计费记录。
- 内容校验:发送前风控接入敏感词和控制字符拦截。
- 企业认证:新增企业认证模型/API,并接入发送前阻断。
- 导入发送:新增客户侧导入预览/确认 API,覆盖重复、非法、黑名单和变量列缺失。
- 配置状态:应用、签名、模板、通道状态变化和应用密钥重置写入系统日志,并影响后续发送校验。
- CMPP 连接状态:新增连接状态模型/API,支持客户/通道维度查询和 dashboard 聚合。
- 接口健壮性:无效 reviewerId/createdById 不再返回数据库外键 500。
已执行复测命令:
```bash
npm run prisma:generate
npm --prefix api test
npm --prefix api run build
npm --prefix api run prisma:migrate:deploy
npm run verify:phase8
npm run test:api
npm run test:gateway
```
最终复测结果:
- `npm run verify:phase8` 通过,BullMQ 15000 条消息、并发 500,端到端 TPS 608.93,满足 500 TPSPrisma generate、API build、前端 build 均通过。
- `npm run test:api` 通过,7 个 test suite、34 个 tests 全部通过。
- `npm run test:gateway` 通过,Go Gateway health、connection、tracker、cmpp、spike 测试全部通过。
当前剩余说明:
- Gateway 仍不连接真实运营商 SMSC,继续使用本地模拟器、mock 回写和契约测试。
- 前端自动化测试仍未新增,当前继续以 build smoke 为主。
## 最终结论
第一版系统化测试第 1 步到第 8 步已全部执行并归档。当前版本在 mock 单元/轻集成、真实环境 smoke、Go Gateway 测试、BullMQ 性能 smoke、API build 和前端 build 层面均通过。
+66
View File
@@ -107,3 +107,69 @@ npm run test:gateway
- 定时短信发送缺少计划发送时间字段、scheduled 状态、到点触发和取消接口。
- 发送链路尚未自动接入计费闭环,发送任务不会自动冻结/扣费/生成短信计费记录。
- 客户/通道 CMPP 连接状态和连接数量尚未形成运营端/客户端一等接口,Gateway health 未聚合到 NestJS dashboard。
## 2026-07-01 缺口修复复测
### 本轮修复范围
- P0 定时短信发送闭环:
- `SmsBatchTask` 增加 `scheduledAt``canceledAt` 字段和 `status/scheduledAt` 索引。
- `CreateBatchTaskDto` 支持 `sendMode=scheduled``scheduledAt`
- 新增定时任务取消和到点触发入口:`POST /api/client/send/batch-tasks/:id/cancel``POST /api/admin/send/scheduled/dispatch-due`
- 到点触发前重新校验企业状态、认证状态、应用状态、模板审核状态、签名审核/报备状态和账户余额。
- P0 发送链路自动计费闭环:
- 发送创建时按通道单价写入消息计费条数、单价和金额。
- 立即发送创建时执行账户检查和冻结;定时发送创建时检查余额,到点再冻结。
- submit accepted 后生成/更新 `SmsBillingRecord`、写入 charged 流水;submit rejected/timeout 释放冻结;失败回执和 72 小时超时执行退款。
- P0 发送前内容校验:
- 风控评估接入敏感词字典和控制字符扫描。
- `variableIssues` 扩展为 `{ variables, content }`,同时保留变量异常和内容异常证据。
- emoji/UCS2、多空格和换行不直接拒绝,继续通过 70/67 字符长度影响计费。
- P1/P2 补齐:
- 新增企业认证模型/API,提交、审核通过、驳回会同步 `Tenant.certificationStatus`,发送前强制认证通过。
- 新增客户侧导入预览/确认入口,覆盖 CSV/TXT 文本解析、20MB 限制、重复/非法/黑名单/变量缺失提示。
- 新增客户/通道 CMPP 连接状态模型/APIGateway/mock 可回写连接状态,运营 dashboard 聚合连接状态。
- 新增应用密钥重置、应用/签名/模板状态变化、通道启停接口,并写入系统日志。
- 无效 `createdById``reviewerId` 改为明确 400,不再冒泡数据库外键 500。
### 新增/更新测试
| 测试文件 | 新增覆盖 |
| --- | --- |
| `api/src/send-chain/send-chain.service.spec.ts` | TC-SCHEDULE-001 到 006、TC-BILLING-AUTO-001 到 004、TC-IMPORT-001 到 006 子集、企业认证/状态阻断。 |
| `api/src/risk-review/risk-review.service.spec.ts` | TC-CONTENT-001 到 004 子集、敏感词和控制字符拦截、无效 createdById。 |
| `api/src/certification/certification.service.spec.ts` | TC-CERT-001 到 004 子集,认证提交、审核、驳回和租户状态同步。 |
| `api/src/channels/channels.service.spec.ts` | 通道启停日志、通道连接状态 upsert/list、客户连接状态 list。 |
| `api/src/sms-config/sms-config.service.spec.ts` | 无效 reviewerId 400,避免审核外键 500。 |
| `api/src/operations/operations.service.spec.ts` | Dashboard Gateway 连接状态聚合。 |
### 已执行命令
```bash
npm run prisma:generate
npm --prefix api test -- send-chain.service.spec.ts risk-review.service.spec.ts sms-config.service.spec.ts
npm --prefix api test
npm --prefix api run build
npm --prefix api run prisma:migrate:deploy
npm run verify:phase8
npm run test:api
npm run test:gateway
```
### 当前结果
- Prisma Client 生成通过。
- 新增迁移已应用到真实 PostgreSQL
- `20260701103000_add_scheduled_sms_fields`
- `20260701110000_add_certification_and_connection_state`
- API build 通过。
- API Jest7 个 test suite 通过,34 个测试通过。
- 最终回归通过:
- `npm run verify:phase8` 通过,BullMQ 15000 条消息、并发 500、端到端 TPS 608.93,满足 500 TPSPrisma generate、API build、前端 build 均通过。
- `npm run test:api` 通过,7 个 test suite、34 个 tests 全部通过。
- `npm run test:gateway` 通过,Go Gateway health、connection、tracker、cmpp、spike 测试全部通过。
### 剩余说明
- 客户侧导入当前提供 API 级文本预览/确认闭环;浏览器端真实文件选择、GBK 二进制转码和错误文件下载仍需前端/E2E 后续覆盖。
- Gateway 连接状态通过 NestJS API 支持 mock/Gateway 回写;真实运营商 SMSC 联调仍需运营商测试环境。