fix: enforce carrier-specific channel group routing

This commit is contained in:
hectorzhao
2026-07-03 12:48:16 +08:00
parent a890b03163
commit dd09d91c1e
17 changed files with 630 additions and 78 deletions
+55 -8
View File
@@ -248,16 +248,27 @@
### TC-ADMIN-004 通道组与路由规则
- 优先级:P0
- 前置条件:存在主通道和备用通道。
- 前置条件:存在移动、联通、电信专属通道和三网通道,存在主通道和备用通道。
- 步骤:
1. 创建通道组。
2. 添加主通道优先级 10、备用通道优先级 20
3. 创建租户/应用维度路由规则
4. 创建发送任务触发送链路
1. 创建移动通道组、联通通道组、电信通道组。
2. 尝试创建三网通道组
3. 在移动通道组中添加 mobile item,引用移动通道或三网通道
4. 尝试在移动通道组中添加 unicom item 或引用电信专属通道
5. 尝试在移动通道组中添加山东省网 item,但引用发送地区为河南的通道。
6. 在同一通道组中为山东省重复添加第二个省网通道。
7. 添加主通道优先级 10、备用全国通道优先级 20,并尝试添加另一个优先级 20 的全国通道。
8. 创建租户/应用维度路由规则。
9. 创建发送任务触发送链路。
- 预期结果:
- 只能创建 mobile/unicom/telecom 通道组,三网通道组被拒绝。
- 通道组明细 carrier 必须等于通道组运营商。
- 通道组明细引用通道时必须满足通道本体能力兼容:移动组只允许 mobile/all,联通组只允许 unicom/all,电信组只允许 telecom/all。
- 省网 item 的省份必须与通道发送地区一致。
- 同一通道组内同一省份只能配置一个通道,全国通道可配置多个但优先级不能重复。
- 路由优先命中租户/应用规则。
- 主通道 active 时选择主通道。
- 主通道 disabled 时选择备用 active 通道。
- 通道组不支持权重分流,同优先级全国通道配置被拒绝。
### TC-ADMIN-005 签名报备任务生成与导出
@@ -286,6 +297,7 @@
- 报备任务状态变为 approved。
- 签名 `reportStatus` 同步为 approved。
- 报备记录包含 receipt_import。
- 发送前仅允许使用最终选中通道上报备状态为 approved 的签名。
### TC-ADMIN-007 报备回执导入失败
@@ -613,11 +625,12 @@
### TC-BILLING-003 submit 成功扣费
- 优先级:P0
- 前置条件:计费口径为 submit_success
- 前置条件:企业应用已配置客户单价,发送任务已冻结预算
- 步骤:模拟 Gateway 返回 submit accepted。
- 预期结果:
- 生成 charged 流水。
- 短信计费记录状态更新为 charged。
- 扣费金额按企业应用客户单价计算,不按通道成本价或运营商差异价计算。
- 可按 messageId 对账。
### TC-BILLING-004 最终失败退款
@@ -629,6 +642,7 @@
- 短信状态 failed/undelivered。
- 生成 refunded 流水。
- 退款金额与原扣费一致。
- 重复 failed receipt 不重复退款。
### TC-BILLING-005 72 小时超时退款
@@ -709,6 +723,7 @@
3. 查询 submit record、trace 和路由日志。
- 预期结果:
- 系统按可配置前缀正则识别运营商,并按手机号段库查询省份和城市。
- 手机号段 carrier 仅作为后台校验或提示,不改变正则识别出的发送运营商。
- trace 记录识别出的运营商、省份和城市。
- 路由优先选择山东省网通道 A。
- Gateway SubmitCommand 的 channelId 为 A。
@@ -741,6 +756,7 @@
- 补发不跨出企业应用授权通道组。
- 原失败原因、补发次数、前后 channelId 和状态流转在 trace 中可查。
- 最终成功只按企业应用客户费率扣一次,不按通道成本价重复扣费。
- 补发选择通道时使用当前通道组配置,并重新校验新通道上的签名报备状态。
### TC-SEND-015 企业应用通道组保存校验
@@ -768,17 +784,21 @@
- 联通号码进入联通通道组。
- 电信号码进入电信通道组。
- 运营商识别失败时进入移动通道组。
- 若手机号段库 carrier 与正则识别结果冲突,以正则识别结果为准,号段 carrier 仅记录为提示信息。
### TC-SEND-017 三网通道作为运营商通配
- 优先级:P0
- 前置条件:企业应用绑定移动通道组;移动通道组内无可用移动全国通道,但有可用三网全国通道。
- 前置条件:企业应用绑定移动通道组;移动通道组 carrier 为 mobile;组内明细 carrier 为 mobile;组内无可用移动全国通道,但有可用三网全国通道。
- 步骤:
1. 提交移动号码。
2. 触发送 worker。
3. 查询 submit record 和 trace。
4. 将同一三网通道放入联通通道组,再提交移动号码。
- 预期结果:
- 三网通道可作为移动、联通电信的通配通道参与路由
- 三网通道本体 `channel.carrier=all` 只表示通道能力,可被运营分配到移动、联通电信通道组
- 移动号码只会选择移动通道组内 `item.carrier=mobile` 且通道本体为 mobile/all 的通道。
- 放入联通通道组的三网通道不能被移动号码选中。
- route/trace 标明实际命中的三网通道。
### TC-SEND-018 失败补发停止条件
@@ -798,6 +818,33 @@
- 超过通道组补发时间上限不触发补发。
- 通道组关闭失败补发时不触发补发。
### TC-SEND-019 迟到旧通道回执不覆盖最终成功
- 优先级:P0
- 前置条件:短信首次通过通道 A 发送失败并补发到通道 B,通道 B 已返回 delivered。
- 步骤:
1. 查询短信记录列表,确认该短信当前状态为 deliveredchannelId/gatewayMessageId 为通道 B。
2. 模拟通道 A 迟到的 failed receipt。
3. 查询短信记录列表、短信详情弹窗、回执历史和账单流水。
- 预期结果:
- 短信记录列表仍展示最终 delivered 状态,不被通道 A 的 failed receipt 覆盖。
- 短信详情弹窗可见通道 A 的历史 failed receipt。
- 不产生重复退款,也不改变已成功短信的最终计费状态。
### TC-SEND-020 重复回调幂等
- 优先级:P0
- 前置条件:存在一条已 submit accepted 并完成账务扣费的短信。
- 步骤:
1. 连续发送两次相同 submit accepted 回调。
2. 连续发送两次相同 failed receipt 回调。
3. 查询短信记录、提交记录、回执记录、短信计费记录和账户流水。
- 预期结果:
- 提交/回执历史可追踪,但短信最终状态按最新有效尝试处理。
- accepted 不重复扣费。
- failed receipt 不重复退款。
- 账户流水、短信计费记录和 reconciliation 无重复金额。
### TC-SEND-004 SubmitResult accepted
- 优先级:P0