fix: simplify balance billing and govern operation logs

This commit is contained in:
hectorzhao
2026-07-14 17:40:32 +08:00
parent f35691f185
commit 28dad93e3e
40 changed files with 740 additions and 395 deletions
+54 -21
View File
@@ -21,7 +21,7 @@
| 模板 | 验证码模板 `验证码为 ${code}`,营销模板 `尊敬的${name},优惠活动开始`,分别准备草稿、待审核、通过、驳回。 |
| 通道 | active CMPP 通道、disabled 通道、备用通道;通道组包含主备优先级。 |
| 号码 | 合法号码、重复号码、非法号码、企业黑名单号码、全局黑名单号码。 |
| 账户 | 余额充足、余额不足、套餐余量充足、套餐余量不足、授信额度可用。 |
| 账户 | 现金余额充足、现金余额不足;不配置套餐余量授信额度。 |
| 企业认证 | 未认证、待审核、已通过、已驳回四类企业认证资料。 |
| 客户 | 正常客户、停用客户、欠费客户、未认证客户、跨租户客户、客户联系人和开票资料。 |
| 导入文件 | UTF-8 CSV、GBK CSV、TXT、超 20 MB 文件、含空行/重复/非法号码/非法字符文件。 |
@@ -54,7 +54,7 @@
- 前置条件:存在 `tenant-a``tenant-b`,两个租户各有发送任务和充值/计费记录。
- 步骤:
1. 使用 `tenant-a` 企业管理员登录客户端。
2. 打开工作台、批量任务、发送详情、上行短信、充值套餐
2. 打开工作台、批量任务、发送详情、上行短信、账户余额
3. 使用查询条件搜索 `tenant-b` 的任务编号或手机号。
- 预期结果:
- 登录成功,返回当前租户上下文。
@@ -138,7 +138,7 @@
### TC-CLIENT-007 账户余额不足禁止发送
- 优先级:P0
- 前置条件:账户余额、套餐余量和授信额度不足
- 前置条件:企业现金余额小于预估发送费用
- 步骤:
1. 使用长内容和多个手机号生成较高预估费用。
2. 提交发送。
@@ -749,7 +749,7 @@
- 步骤:创建发送任务并进入待发送。
- 预期结果:
- 生成 frozen 流水。
- 账户余额或套餐余量减少。
- 企业现金余额减少。
- 流水关联 taskId。
### TC-BILLING-003 submit 成功扣费
@@ -2322,16 +2322,16 @@
### TC-DASHBOARD-002 客户端 Dashboard 余额和可发送额度准确
- 优先级:P0
- 前置条件:客户 A 账户余额 10000 分,套餐余量 200 条,授信额度 5000 分;存在冻结、扣费、退款、释放流水。
- 前置条件:客户 A 现金余额 10000 分;存在冻结、扣费、退款、释放流水。
- 步骤:
1. 打开客户端 Dashboard。
2. 查看余额、套餐余量、授信额度、可发送额度。
2. 查看现金余额和可发送额度。
3. 打开账单流水。
4. 按交易类型核对充值、冻结、扣费、退款、释放后的余额。
- 预期结果:
- Dashboard 余额与账户表和流水计算结果一致。
- 冻结金额不应被当作可用余额重复计算。
- 套餐余量和金额余额分别展示,口径不混淆
- 可发送额度等于现金余额,不叠加其他额度
- 跳转账单流水后可核对组成明细。
### TC-DASHBOARD-003 客户端 Dashboard 待处理事项准确
@@ -2414,11 +2414,11 @@
5. 运营端查看账户余额、账单流水和系统日志。
- 预期结果:
- 生成 RechargeOrder,状态为 paid 或人工充值完成状态。
- 账户余额和套餐余量同步增加。
- 企业现金余额同步增加。
- 生成 account_transaction,类型为 recharge,关联 recharge_order。
- 客户端余额、账单流水即时可见。
- 运营端充值记录、账单流水、系统日志三处可追溯。
- 所有金额、余额、套餐价格和单价固定展示三位小数,例如 `¥1.000`
- 所有金额、余额和单价固定展示三位小数,例如 `¥1.000`
### TC-BILLING-007 人工充值金额和短信条数只填其一
@@ -2429,7 +2429,7 @@
2. 再发起一笔只填写短信条数,不填写充值金额。
3. 查看账户和流水。
- 预期结果:
- 系统按填写项分别增加余额或套餐余量
- 系统按填写金额增加或冲正现金余额
- 未填写项按 0 处理,不产生脏数据。
- 流水金额和短信条数字段方向正确。
- 备注和操作人保留。
@@ -2445,7 +2445,7 @@
4. 客户端查看账单流水。
- 预期结果:
- 原充值记录状态变为 canceled/reversed,或生成一笔反向调整流水。
- 账户余额和套餐余量正确回退。
- 企业现金余额正确回退。
- 若余额已消费导致不能全额撤销,应提示不可撤销或只允许人工调整。
- 客户端和运营端均可看到冲正流水和原因。
- 系统日志记录冲正操作者和原因。
@@ -2552,6 +2552,35 @@
- 失败原因可读且与前端提示一致。
- 客户端只可见本客户失败日志,运营端可全平台查询。
### TC-LOG-010 高频运行事件不得放大系统日志
- 优先级:P0
- 前置条件:客户 CMPP 连接在线,Gateway 正常发送心跳并周期同步下游恢复状态。
- 步骤:
1. 建立一条客户 CMPP 连接并记录当前 `OperationLog` 数量。
2. 连续发送多次 heartbeat、Submit、Deliver 事件。
3. 连续上报仅时间、尝试次数或锁过期时间变化、业务状态未变化的恢复状态。
4. 触发连接断开,并将恢复状态从 waiting_connection 改为 running 或 failed。
- 预期结果:
- heartbeat、Submit、Deliver 仍更新连接表对应时间,但不新增系统日志。
- 周期恢复状态只更新 `GatewayDownstreamRecoveryStatus`,未发生审计字段变化时不新增系统日志。
- 连接建立/断开以及恢复状态、实例、锁持有者、失败分类或失败原因真实变化时各新增一条系统日志。
### TC-LOG-011 系统日志分页索引与归档安全
- 优先级:P0
- 前置条件:准备超过两页、覆盖 info/success/warning/error 的系统日志,并准备超过在线保留期的日志。
- 步骤:
1. 分别按级别、租户、模块、时间和关键词查询第一页、第二页。
2. 调用兼容审计接口并传入超大 pageSize。
3. 执行一次归档任务,再查询 `OperationLog``OperationLogArchive`
4. 模拟归档插入失败并重新执行。
- 预期结果:
- 级别筛选在数据库分页前生效,total、页数和当前页记录准确且排序稳定。
- 所有接口 pageSize 最大为 100,不存在无界全表返回。
- 到期日志按 `archiveMonth=YYYY-MM` 进入归档表,在线表只删除已成功归档的记录,原始 id 和详情不丢失。
- 归档使用有界小批量和 `SKIP LOCKED`;归档失败时源日志仍保留,不阻塞正常日志写入。
### TC-CUSTOMER-001 运营端创建客户并初始化租户
- 优先级:P0
@@ -2631,7 +2660,7 @@
### TC-CUSTOMER-006 客户欠费或额度不足状态联动发送
- 优先级:P0
- 前置条件:客户余额、套餐余量、授信额度不足,或运营端标记欠费。
- 前置条件:客户现金余额不足,或运营端标记欠费。
- 步骤:
1. 客户端创建发送任务。
2. API 调用发送。
@@ -2675,10 +2704,10 @@
### TC-CUSTOMER-009 客户详情展示业务总览准确
- 优先级:P0
- 前置条件:客户 A 下存在应用 3 个、签名 4 个、模板 5 个、通道绑定 2 个、今日发送 100 条、余额和套餐余量
- 前置条件:客户 A 下存在应用 3 个、签名 4 个、模板 5 个、通道绑定 2 个、今日发送 100 条和现金余额
- 步骤:
1. 运营端打开客户详情。
2. 查看客户业务总览:应用数、签名数、模板数、今日发送量、成功率、余额、套餐余量、待审核数。
2. 查看客户业务总览:应用数、签名数、模板数、今日发送量、成功率、现金余额、待审核数。
3. 点击每个指标进入对应明细列表。
- 预期结果:
- 客户详情总览只统计客户 A。
@@ -3005,7 +3034,7 @@
3. 初始化 active/disabled 客户、未认证/待审核/已认证/驳回企业认证资料。
4. 初始化可用应用、停用应用、待删除应用。
5. 初始化签名、引流信息、模板、多变量模板、通道、通道组、路由规则。
6. 初始化账户余额、套餐余量、欠费/不足余额场景。
6. 初始化现金余额、欠费/不足余额场景。
7. 准备 CSV/TXT/GBK/大文件/非法字符/黑名单号码测试文件。
8. 确认 Gateway 模拟器可切换 online、auth_failed、heartbeat_timeout、disconnected、slow_response。
- 产出物:
@@ -3164,7 +3193,7 @@ npm run verify:phase8
| 用例 | 数据准备 | 指标断言 |
| --- | --- | --- |
| TC-DASHBOARD-001 | 客户 A 当天 delivered=10、failed=3、unknown=2、timeout=1;客户 B 有干扰数据。 | 客户端总量=16;成功=10;失败按 failed+timeout 为 4unknown=2;成功率若按 delivered/total 为 62.5%;点击卡片后的明细筛选一致。 |
| TC-DASHBOARD-002 | 账户余额 10000 分、套餐 200 条、授信 5000 分,另有冻结、扣费、释放、退款流水。 | 可用余额不重复计算冻结;金额余额和套餐余量分开展示;账单流水余额 after 与 Dashboard 一致。 |
| TC-DASHBOARD-002 | 现金余额 10000 分,另有冻结、扣费、释放、退款流水。 | 可用额度仅为现金余额不重复计算冻结;账单流水 balanceAfter 与 Dashboard 一致。 |
| TC-DASHBOARD-003 | 待审核签名 2、模板 3、待报备 1、pending_review 发送任务 4。 | 待处理总数和分类数准确;点击跳转后列表筛选数量一致;只包含当前租户。 |
| TC-DASHBOARD-004 | 多客户、多通道、多状态发送和账务流水。 | 运营端统计全平台;活跃客户、今日发送、成功率、待审核、收入均可在明细页复核。 |
| TC-DASHBOARD-005 | 客户 A/B 均有发送、账务、审核数据。 | 切换客户后所有卡片、趋势、状态分布、账务汇总同步刷新;跳转明细继承客户筛选。 |
@@ -3175,11 +3204,13 @@ npm run verify:phase8
| 用例 | 细化执行点 | 必查断言 |
| --- | --- | --- |
| TC-BILLING-006 | 运营端人工充值金额和短信条数,客户端查看 Dashboard 和账单流水。 | RechargeOrder 状态为 paid/manual_topupTenantAccount 同步增加;AccountTransaction 类型 recharge;充值记录“充值后余额”必须等于该订单关联 AccountTransaction.balanceAfter,不能用当前账户余额替代;运营日志和客户端流水均可追溯。 |
| TC-BILLING-007 | 分别只填金额、只填短信条数;金额填写负数执行冲正。 | 未填项按 0;正负金额和条数字段方向正确;允许有业务含义的负数调整,不产生 null、NaN 或零变更脏数据。 |
| TC-BILLING-006 | 运营端人工充值现金金额,客户端查看 Dashboard 和充值记录。 | RechargeOrder 状态为 paid/manual_topupTenantAccount 现金余额同步增加;AccountTransaction 类型 recharge;充值记录“充值后余额”必须等于该订单关联 AccountTransaction.balanceAfter,不能用当前账户余额替代;运营日志可追溯。 |
| TC-BILLING-007 | 分别填写正数金额和负数金额执行充值、冲正;提交 0 或非法金额。 | 正负金额方向正确;0 和非法金额被拒绝;数据模型和接口不存在短信条数、套餐或授信字段。 |
| TC-BILLING-008 | 对已充值记录执行撤销/冲正,分别覆盖未消费和已部分消费。 | 未消费可全额回退;已消费按规则拒绝或生成人工调整;原订单状态和反向流水清晰;日志记录原因。 |
| TC-BILLING-009 | 无权限用户、审核员、管理员分别执行充值;大额人工充值不走审批。 | 权限不足被拒绝并写失败日志;有权限用户确认后立即入账;不产生 pending 审批态;充值订单、账户余额、流水和日志同步完成。 |
| TC-BILLING-010 | 余额不足发送失败,人工充值后重试发送并模拟 delivered。 | 充值前不扣费;充值后发送成功;冻结、扣费、短信计费记录完整;reconciliation diff 为 0。 |
| TC-BILLING-011 | 账户现金余额 100 分,预估费用 5 分,且数据库不存在套餐和授信数据;再将余额改为 4 分重试。 | 100 分时可发送,4 分时提示“企业账户余额不足”;判断只依赖 TenantAccount.balanceCents。 |
| TC-BILLING-012 | 已扣费短信收到最终失败回执;另一个未提交成功任务只释放冻结。 | 前者只生成一条 refunded 流水并计入“今日返还”;重复回执不重复退款;后者的 released 流水不计入“今日返还”。 |
### 17.6 系统日志细化
@@ -3188,8 +3219,10 @@ npm run verify:phase8
| TC-LOG-005 | 客户 A 查看日志并尝试查询客户 B 日志。 | 客户端只返回本租户日志;越权查询失败;日志包含 IP、User-Agent、result、resourceId。 |
| TC-LOG-006 | 客户端导入号码、立即发送、创建并取消定时任务。 | 导入日志含文件名、行数、成功/失败数;发送日志含任务编号、号码数、发送类型;取消日志含取消人。 |
| TC-LOG-007 | 运营端按客户、动作、资源、结果、时间查询并导出。 | 查询准确;导出内容与筛选一致;导出动作本身写日志。 |
| TC-LOG-008 | 人工充值、冲正、账户调整。 | 日志含客户、金额、短信条数、订单号、流水号、操作者;敏感字段脱敏。 |
| TC-LOG-008 | 人工充值、冲正、账户调整。 | 日志含客户、金额、订单号、流水号、操作者;敏感字段脱敏。 |
| TC-LOG-009 | 触发无权限充值、余额不足发送、无在线通道发送。 | 失败动作也写日志;result/status 标记失败;失败原因与前端提示一致。 |
| TC-LOG-010 | 保持 CMPP 在线并连续发送 heartbeat/Submit/Deliver、重复恢复状态,再触发断开和状态变化。 | 高频事件只更新状态表;连接和恢复状态关键变化才新增日志;日志量不随心跳线性增长。 |
| TC-LOG-011 | 准备多级别、多页和过期日志,验证查询上限与归档重试。 | 数据库侧筛选后分页;每页最多 100;归档成功才删除源记录;archiveMonth、原始 id 和详情完整。 |
### 17.7 客户管理细化
@@ -3200,7 +3233,7 @@ npm run verify:phase8
| TC-CUSTOMER-003 | 停用客户后分别通过客户端、API、CMPP 接入尝试发送。 | 全部阻断;不入队、不扣费;失败原因是客户停用;历史任务可查。 |
| TC-CUSTOMER-004 | 客户 active 时创建 scheduled,到点前停用。 | 到点重校验失败;任务 rejected/canceled/failed;冻结费用释放;日志指向客户停用。 |
| TC-CUSTOMER-005 | 重新启用客户后发送。 | 客户状态 active;新发送成功进入链路;账务和日志完整。 |
| TC-CUSTOMER-006 | 余额不足、套餐不足、授信不足、欠费标记。 | 发送前账户校验失败;不投递 Gateway;客户详情展示欠费或不足状态。 |
| TC-CUSTOMER-006 | 现金余额不足欠费标记。 | 发送前账户校验失败;不投递 Gateway;客户详情展示欠费或不足状态。 |
| TC-CUSTOMER-007 | 客户 A 使用 URL/API 参数访问客户 B 资源。 | 不泄露 B 数据;返回无权限或空结果;失败访问写安全日志。 |
| TC-CUSTOMER-008 | 删除/归档有历史数据的客户。 | 不允许硬删除或执行归档;新发送和未执行 scheduled 阻断;历史 trace/对账可查。 |
| TC-CUSTOMER-009 | 客户详情总览应用、签名、模板、今日发送、余额。 | 各指标与明细列表聚合一致;跳转带客户筛选;异常状态有标识。 |
@@ -3268,7 +3301,7 @@ npm run verify:phase8
| 用例编号 | 操作 | 预期结果 |
| --- | --- | --- |
| TC-MOCK-CLEAN-001 | 断开 API 或让 API 返回 500,访问客户端充值套餐、账单流水、批量任务、短信发送、签名、模板页面。 | 页面展示错误态或空态;不得出现前端静态套餐、任务、模板、签名或最近发送记录。 |
| TC-MOCK-CLEAN-001 | 断开 API 或让 API 返回 500,访问客户端账户余额、充值记录、批量任务、短信发送、签名、模板页面。 | 页面展示错误态或空态;不得出现前端静态余额、任务、模板、签名或最近发送记录。 |
| TC-MOCK-CLEAN-002 | 访问运营端数据统计、账务账户、发送监控、安全控制、手机号段库、报备字段库、通道组、报备任务、报备记录。 | 所有列表和卡片来自真实 API;新增动作写入数据库;后端缺失的编辑/删除能力不得用本地状态伪造。 |
| TC-UI-ENTERPRISE-SELECT-001 | 逐一打开包含企业或企业应用选择的表单和筛选项,输入部分企业/应用名称。 | 下拉面板提供搜索框并实时缩小真实 API 选项范围;清空后恢复全部选项。 |
| TC-UI-TEMPLATE-RESPONSIVE-001 | 在 1024px、1366px 和宽屏视口打开企业短信模板页。 | 模板卡片自适应换列,页面不出现水平滚动,每张卡片的编辑和删除按钮直接可见。 |