Files
邹进 42e881576d
All checks were successful
构建并部署到测试环境(无 SSH) / build-and-deploy (push) Successful in 9m33s
feat: 卡网关按运营商账户限流并记录停复机调用
- 新增网关限流:按本系统运营商账户(卡 carrier_id)→ 限流组 → 操作限制每秒请求数,每次 HTTP 尝试计量,默认限流、仅后台人工点击/通道阈值/自动续费/手动刷新豁免;支持只统计与拦截两种模式,默认只统计
- Asynq 遇限流不计失败、固定短延迟重试;轮询任务与停复机业务重试遇限流短延迟重排
- 停机、复机不再使用网关内部重试,只发一次请求
- 网关返回结构化错误;新增上游错误分类规则表与测试接口
- 新增按月分区的停复机记录表:系统自动停复机只写记录,不再写统一审计与集成日志;普通轮询查询不再写集成日志
- 新增限流组、错误分类、停复机记录、按账户调用统计与枚举后台接口
- 迁移 000243~000246;同步 OpenSpec 提案(含后续 6 个 change)与技术方案、工程约束
2026-10-24 15:06:41 +09:00

4.5 KiB
Raw Permalink Blame History

Why

开关轮询目前只有单资产接口 PATCH /assets/:identifier/polling-status 与系统自动规则,没有人工批量操作,卡列表也不能按是否轮询筛选,也没有"谁、何时、为什么关闭"的记录;生产约 8,456 张关闭轮询的卡中约 8,420 张是风险停机或已销户自动关闭,人工关闭的卡无从查起。规则优先后,人工停机不享有豁免,需要保持停机的卡必须关闭轮询,运营需要批量处理与清单;停机被拒的卡也需要单独列出、导出与批量关闭。老系统"不轮询网卡"页面提供了对应能力。本 Change 是《轮询按运营商账户限流技术方案》第五部分第 3 节第 7 步。

What Changes

  • 卡、设备勾选批量开关轮询:单次最多 500,带目标状态与原因;数据权限校验;同一事务写 enable_polling、不轮询清单与审计;提交后按生命周期移入或移出轮询(设备沿用级联到卡)。
  • 文件导入:上传 ICCID 或设备 IMEI 文件选择开启或关闭,异步任务逐行处理、逐行返回结果,部分成功不回滚。
  • 批量开启跳过网关扩展状态为风险停机或已销户的卡,逐项返回跳过原因,不提供强制开启参数。
  • 不轮询清单(新表 tb_card_polling_pause):记录关闭来源、原因、操作人、时间与恢复来源;每个资产只保留一条"已关闭"记录,恢复时标记"已恢复"并保留历史;所有改 enable_polling 的入口同事务写入(单资产接口、批量、导入、风险停机或已销户自动关闭、设备级联、自动恢复、告警页关闭)。调度不读本表。
  • 存量补写:上线时为当前 enable_polling = false 的卡与设备补写清单,风险停机或已销户记为对应自动关闭来源,其余记为历史数据。
  • BREAKING 套餐生效类入口自动恢复轮询:订单套餐生效(客户支付成功、后台下单、批量下单、OpenAPI 钱包下单)、后台修改套餐有效期后资产有生效套餐时,先把卡或设备恢复轮询(写清单与审计)再按规则评估复机;风险停机或已销户的卡不恢复。
  • 不轮询清单页面:按运营商账户、来源、状态、ICCID、操作人、时间筛选,导出复用统一导出任务(场景 polling_pause),列表勾选可批量开启。
  • 卡列表、设备列表增加"是否轮询"筛选,导出带上该字段。
  • 失败告警页增加"停机被拒"视图与导出(场景 polling_stop_refused_alert),可勾选批量关闭轮询(来源"停机被拒告警处理")。
  • 关闭与开启轮询的确认框须提示影响(关闭后不查上游、流量用完与实名不满足不自动停机、激活与重置不自动复机;套餐到期与退款后无套餐仍停机;订单生效与改有效期会自动恢复)。

Capabilities

New Capabilities

  • polling-pause-list:批量与文件导入开关轮询、不轮询清单与历史、所有开关入口同事务写清单、存量补写、套餐生效类自动恢复轮询、清单查询与导出、卡与设备列表是否轮询筛选。

Modified Capabilities

  • carrier-polling-scheduler:失败告警增加"停机被拒"视图、导出与批量关闭轮询(该能力由第 5 个 Change 引入)。

Impact

  • 依赖:开关与清单部分无前置;停机被拒视图依赖第 5 个 Change 的失败告警表与第 6 个 Change 的停复机方向告警;自动恢复轮询后的"按规则评估"在第 6 个 Change 上线前沿用现有复机路径。
  • 数据库:新增 tb_card_polling_pause(部分唯一索引:同一资产仅一条已关闭)与存量补写迁移;新的成对迁移。
  • 代码:internal/service/iot_card 与 internal/service/device 批量接口;internal/service/polling/asset_polling_service.go;导入任务(参照 phone_asset_association 的 /unbind-imports);internal/application/cardobservation/network.go 自动关闭写清单;internal/service/order/service.go activatePackage 与改有效期接口自动恢复;卡、设备列表 Query 与导出;导出场景注册。
  • 接口:新增 POST /iot-cards/batch-update-polling-status、POST /devices/batch-update-polling-status、/polling-status-imports(创建、列表、详情)、GET /card-polling-pauses、POST /polling-failure-alerts/close-polling、GET /polling-failure-alerts?view=stop_refused;卡与设备列表增加 enable_polling 筛选。前端新增不轮询清单页、导入页,卡与设备列表增加筛选与批量操作,告警页增加停机被拒视图。