fix: enforce drainage uniqueness and carrier-specific reporting
This commit is contained in:
@@ -177,3 +177,19 @@ Gateway 每个分片等待可用连接后通过仅本机直连的 POST /api/gate
|
||||
新增迁移 20260910130000_drainage_send_gate 只加列、索引、决策表及锁触发器,不改既有批准/客户/余额/短信记录。测试发布按标准工具执行,包含此前九项运营修复提交;回退旧程序会失去本门禁,不能未经评估恢复发送。原治理工具草稿和备份/候选均保留。
|
||||
|
||||
验证:独立本机 PostgreSQL 克隆库完成新迁移,真实规则/API验证 NFKC号码、全部目标交集、审核撤销、报备撤销、并发锁等待、URL三种伪装拒绝、决策持久化及报备SQL。真实浏览器连接该API验证拦截详情、刷新、路由切换和1600×1000、1366×768、390×844;无Browser插件,使用既有Playwright/Edge。发送Worker与Gateway传输未启动,不以这些证据替代供应商零Submit、客户回执ACK、长短信物理发送、费用对账或容量测试,以上须专项发送授权后验证。自动回归及发布结果以 testing-progress.md 最新记录为准。
|
||||
|
||||
|
||||
## 11. 2026-09-14 引流唯一性与通道运营商报备设计
|
||||
|
||||
状态:本地实现与隔离验收完成;线上未部署,版本状态以 testing-progress.md 本轮记录为准。此节替代引流报备只按channelId及carrier=null通配的新增配置方式;域名匹配、平台审核、多目标交集、计费和Gateway复核协议保持。
|
||||
|
||||
1. 新增/修改及恢复引流:同一signatureId下未删除资料的引流值不得重复。按登记值trim比较,不把不同URL路径、协议或电话号码格式擅自合并;不同签名可相同。修改自身原值允许,已有重复记录不自动删除或合并,变更为其他已占用值拒绝。共同使用既有签名advisory事务锁,检查和写入同事务,覆盖管理端/客户端及并发请求;返回可读400。
|
||||
2. 新引流报备任务键为signatureId+drainageItemId+channelId+carrier,carrier为通道支持的mobile/unicom/telecom;复用已有carrier/approvalScope字段,无新表。页面与签名一样三网分组,按通道与运营商编辑;后端校验通道范围、引流归属及审核状态,返回相同维度并参与统计。新增或修改材料后,各适用运营商独立回到pending,移出通道/运营商及旧无运营商任务不继续保留旧授权。
|
||||
3. 历史carrier=null任务不批量迁移或猜测运营商;在尚无明确运营商任务时保留原通道级兼容读法,并在页面标记历史通道级继承。某运营商已有明确任务时,无论通过/失败/未报备均优先,不回落旧通过状态;运营人员保存后建立明确三网任务。旧记录保留审计,跨运营商不能互相覆盖。
|
||||
4. 路由、最终Gateway授权、签名卡片汇总、通道报备明细、批次目标/导出及按批次状态更新共用运营商语义。每个引流目标的通道交集按本条短信运营商计算;显式失败不得被旧carrier=null通过记录放行。批次按carrier业务键生成,旧all/legacy批次只保留原范围兼容,不把单运营商导出/状态结果扩散到其他运营商。
|
||||
5. 本次另外核验HTTP IP白名单英文逗号已受支持,补输入说明和回归;发送详情仅展示敏感词命中/明确异常,不展示正常零命中快照。数据库审计不删除,实际失败原因保持。
|
||||
6. 验收:并发同值新增/修改、自身/其他签名/已删除值、混合三网状态与历史覆盖、材料修改全部状态失效、真实PG/API与浏览器三尺寸、API/前端定向与全量、类型构建/质量门禁。无发送、重投、线上配置修改、推送或部署授权;本地隔离真实后端可验证配置及只读路由判断,物理短信链路不冒称通过。
|
||||
|
||||
### 11.1 实际数据库约束补核
|
||||
|
||||
真实隔离库复现原ChannelSignatureReportTask_drainage_target_key是签名+引流+通道部分唯一索引(Prisma模型未声明此部分约束)。必须新增20260914093000_drainage_carrier_reports,在同事务建立carrier非空四维唯一索引及carrier为空历史三维唯一索引,再移除旧三维索引;不改旧数据/状态。新索引同样防止状态保存与导出并发产生重复任务。迁移仅在独立验收库执行,发布后方能启用新代码;不能回退旧程序继续发送并把三网任务当通道级读取。应用回退需暂停发送并评估三网事实,不能删除新任务或直接重建旧唯一索引。
|
||||
|
||||
@@ -2293,3 +2293,12 @@ Webhook需在当前受支持Node运行时通过真实HTTPS投递;SSRF校验后
|
||||
### HTTP公共接口整改验收状态(2026-09-14)
|
||||
|
||||
上述Webhook DNS、IPv6 URL、严格日历与正文错误边界已在测试版本97d1334完成真实验收;不改变既定业务规则、计费或租户边界。高精度小数秒输入保留兼容,上行详情仅客户业务字段,禁止通道和内部匹配字段。详见 [验收报告](http-api-full-acceptance-20260914.md),生产环境状态不可由测试结论替代。
|
||||
|
||||
|
||||
## 2026-09-14 引流信息与运营商报备补充
|
||||
|
||||
- HTTP 接口 IP 白名单支持英文逗号、中文逗号和空白分隔多个 IP/CIDR,编辑说明必须明确。
|
||||
- 同一签名下未删除引流资料的登记值(去除首尾空白)唯一;新增、编辑及状态恢复均不可绕过,并发请求最多一条成功。不同签名可使用相同值,自身原值可保留,既有重复不自动清理。
|
||||
- 引流报备按引流资料、通道、运营商独立配置,只有本运营商通过的通道可进入对应短信路由;显式未通过不能继承旧通道级通过状态。材料变化使旧审批失效。
|
||||
- 发送详情保留敏感词命中及明确异常,不显示正常的零命中检查;审计数据保留。
|
||||
- 兼容、迁移和验收以 [引流门禁方案第 11 节](drainage-send-gating-plan-20260910.md#11-2026-09-14-引流唯一性与通道运营商报备设计) 为准。
|
||||
|
||||
@@ -5488,3 +5488,21 @@ HTTP-FULL-B02:去除URL IPv6方括号后区分IP字面量与DNS,DNS失败转
|
||||
完整矩阵、根因、发布恢复资产/容量与未执行项见 [HTTP全量验收报告](http-api-full-acceptance-20260914.md)。本段更新此前阶段性“待修/待授权/阻塞”状态,不将其当当前状态。
|
||||
|
||||
新增覆盖:TC-HTTP-FULL-DATE(非法日历/query/cursor与时区、高精度兼容)、TC-HTTP-FULL-BODY(畸形/非对象/超限/字符集/编码的400/413/415及关联ID)、TC-HTTP-FULL-IPV6(回环/ULA/link-local/mapped私网拒绝且配置不变)、TC-HTTP-FULL-ROTATE(新密钥真实签名成功);记录与断言名称逐项见报告附录。
|
||||
|
||||
|
||||
## 2026-09-14 引流唯一性、三网报备及详情用例
|
||||
|
||||
| 编号 | 场景与预期 |
|
||||
|---|---|
|
||||
| DRN-CARRIER-01 | HTTP 白名单混合英文逗号、中文逗号、换行及空格分隔 IP/CIDR,保存后逐项正确回读。 |
|
||||
| DRN-CARRIER-02 | 同签名重复新增及编辑撞值返回 400;前后空白不绕过;跨签名同值、自身原值和已删除值可使用。 |
|
||||
| DRN-CARRIER-03 | 同签名五请求并发新增同值只有一条成功;两条资料并发改为同值只有一条成功;恢复已删除资料不得造成重复。 |
|
||||
| DRN-CARRIER-04 | 单个三网通道分别保存移动通过、联通失败、电信未报备,刷新/报备明细/汇总维度一致;仅移动路由放行。 |
|
||||
| DRN-CARRIER-05 | 有旧 carrier=null 通过记录时,明确运营商失败仍拒绝;无明确任务的运营商继承历史状态并标注来源。 |
|
||||
| DRN-CARRIER-06 | 材料更新立即失效所有旧审批,各适用运营商回到未报备;旧通道级审批不可继续授权。 |
|
||||
| DRN-CARRIER-07 | 批次目标、导出任务及批次状态更新保留运营商,单运营商结果不得覆盖其他运营商;旧 all/legacy 批次仅作用原范围。 |
|
||||
| DRN-CARRIER-08 | 实际旧索引迁移保留旧审批所有字段,允许三网独立记录,拒绝同运营商和旧通道级重复;不自动改线上数据。 |
|
||||
| DRN-CARRIER-09 | 发送详情正常零命中快照不可见,真实命中和明确失败仍可见,数据库快照数量不变。 |
|
||||
| DRN-CARRIER-10 | 三尺寸首次打开、保存、刷新、切换详情;检查真实响应及数据库,不把隔离服务适配器视为完整认证/Gateway 验收。 |
|
||||
|
||||
执行结果与未执行边界见 testing-progress.md 本日记录。
|
||||
|
||||
@@ -4971,3 +4971,29 @@ HTTP-FULL-B02:去除URL IPv6方括号后区分IP字面量与DNS,DNS失败转
|
||||
截至 2026-09-14T07:49:14.156Z,测试环境精确版本97d133442350b9725422ed4e55386f47e37004fd。HTTP-FULL-B01至B04已修复、提交、推送、标准发布并真实复验;74套809项精确候选测试、格式、Lint、类型、构建及安全门禁通过。235项真实请求/断言中229项通过,另6条原始非通过记录已分类并有复测,不删除失败历史。20条短信19送达/1预期失败退款,23个模拟CMPP Submit,21成功计费单位,净扣6825,余额1848101→1841276。7条上行3歧义隐藏/4匹配且ACK完成;24个Webhook事件22送达/2预设终止,31次真实HTTPS收件,签名、密钥轮换、状态码、退避、超时和人工重试均核验。三个Redis Stream pending/lag均0;本轮待办排空、三个应用停用/凭据撤销、receiver及隧道关闭、hosts原字节恢复。未操作预生产、真实运营商或其他客户配置。
|
||||
|
||||
完整矩阵、根因、发布恢复资产/容量与未执行项见 [HTTP全量验收报告](http-api-full-acceptance-20260914.md)。本段更新此前阶段性“待修/待授权/阻塞”状态,不将其当当前状态。
|
||||
|
||||
|
||||
## 2026-09-14 四项配置与引流运营商报备修复(本地提交范围)
|
||||
|
||||
### 范围与只读证据
|
||||
|
||||
- 起点本地 main 与实际远端 main 均为 ac6449028c4ab072ef16a219f61d592e2d453a7e,起始暂存为空。保护既有 metrics、tools/release、HTTP 接入及需求/测试/发布草稿,不推送、不部署、不发送/补发/重投/入队,不修改线上配置或业务数据。
|
||||
- 2026-09-14 17:11:47(北京时间)只读核验预生产应用 d13ca0713abd6afbea5a62af39bcbb876b8bb186。号码 188****3795 的 MSG-b3b529de-602c-44a8-9cc9-bce3a5a8360f 在 15:39:30 至 15:41:51 有 10 条路由敏感词快照,全部 hits=0、reason=null;多轮候选选择均保存快照,详情逐条显示正常结果导致噪声。只过滤展示,审计/短信状态保持。首次只读查询使用不存在的 createdAt 后改用 queuedAt;未进行数据修复或发送。
|
||||
- HTTP 白名单原解析已支持英文逗号,本轮明确输入说明并补混合分隔符回归。引流新增/编辑此前缺少同签名重复校验;通过同签名 advisory 事务锁将检查与写入串行化,状态恢复亦校验。
|
||||
- 原引流任务按通道级 carrier=null 管理,现按通道×运营商管理,并更新路由、签名汇总、报备明细、批次/导出和状态更新。明确运营商结果优先于旧通道级状态,材料变化使旧审批失效。设计先更新于 drainage-send-gating-plan-20260910.md 第 11 节。
|
||||
- 真实 PostgreSQL 首轮创建暴露旧部分唯一索引仍限制三维键,新增 20260914093000_drainage_carrier_reports,保留全部旧记录,改为明确运营商与历史通道级两个部分唯一索引。新迁移仅在本轮独立本地库执行。
|
||||
|
||||
### 已执行验证
|
||||
|
||||
- API 全量:74 suites / 811 tests;API TypeScript 生产构建通过。
|
||||
- 前端全量最终:30 files / 144 tests(npx vitest run --maxWorkers=2);TypeScript 与 production 构建通过。最初新增三网测试发现 Select 未传递 aria 名称,修复公共组件并删除关闭时无用的 portalStyle 状态重置,覆盖三网选择与重新打开。另一轮并行构建/测试发生 17 项超时及关联断言失败,保留原日志;限制 worker 后及最终稳定代码两次全量通过,未提高超时或删除断言。
|
||||
- npm run lint、format:check、quality:verify、style:check、css:verify(15 tests)、security:verify、bundle:verify 通过;lint 留存 3 条非阻断提示(原报备页 effect 依赖、IP 解析函数导出、测试 any)。git diff --check 通过。原未格式化测试/服务文件随当前格式门禁格式化,无业务扩展。
|
||||
- tools/testing/verify-drainage-carriers.mjs:独立 loopback PostgreSQL 16414 / cmpp_qa_carriers_20260914,实际服务 HTTP 适配器 16416,25 项通过。覆盖迁移旧行完全保留及两类唯一约束、trim 重复、跨签名、自身修改、5 请求并发新增、并发改值、删除值复用及恢复防绕过、三网保存/汇总/路由、旧审批不覆盖明确失败、材料修改审批失效、批次目标与列表及 HTTP 白名单落库回读。一次新增数据扩充后列表断言受默认 10 条分页影响,限定验收签名并读取 100 条后通过。
|
||||
- 浏览器连接器本轮仍为 nodeRepl.fetch request failed;使用已安装 Playwright + Chrome。本地 Vite dev 入口加载超时后,改用 production 构建 + preview 16418,真实业务组件连接上述服务与 PG;1600×1000、1366×768、390×844 无横向溢出。三网分别保存(移动通过、联通失败、电信未报备)后刷新读取一致,重复值 HTTP 400,发送详情不显示零命中快照,切换弹窗与重新打开选择器通过。无框架错误;控制台仅验收入口 favicon 404 和故意触发的重复值 400。
|
||||
- 证据目录:%TEMP%/cmpp-drainage-carriers-20260914(preprod-records.json、api-full.log、frontend-final-stable.log、real-http-final2.log、real-fixture-final.json、ui-evidence.json、carrier-1600.png / carrier-1366.png / carrier-final-390.png 及质量日志)。保留初次失败和最终结果。
|
||||
|
||||
### 交付边界与遗留
|
||||
|
||||
- 本轮仅本地修改、文档和本地提交;未推送、未部署测试、未部署预生产。迁移和代码未在两套线上环境生效。提交号见本条记录所在提交;最终汇报提供精确 SHA。
|
||||
- 隔离 HTTP 适配器直接调用真实业务服务与 PG,不包含完整 Nest 全局认证、生产反向代理和 worker;不得将其当作在线全功能验收。测试环境/预生产完整登录页面、权限与租户隔离在线回归、MinIO 报备文件导出/导入实物、Redis/Gateway 实际短信发送与计费闭环本轮未执行。原链路单元回归通过不替代物理发送专项验收。
|
||||
- 53 项已有保护文件在最终核对中保持摘要(仅本轮文档采用追加并精确暂存);其余脏文件和草稿不纳入提交。历史重复资料不自动清理,历史通道级审批不批量重写。上线须先按标准发布流程执行新索引迁移,回退不可直接删除三网任务或重建旧索引。
|
||||
|
||||
Reference in New Issue
Block a user