feat: complete phase2 baseline cdr quality rbac

This commit is contained in:
hectorzhao
2026-06-24 18:40:21 +08:00
parent 7057fd3c42
commit a86de6545f
63 changed files with 7853 additions and 3678 deletions
+115 -3
View File
@@ -22,10 +22,11 @@ V2 的目标是把当前纯前端原型转化为可部署、可联调、可上
| --- | --- |
| 概览 Dashboard | 通话、接通率、消费、成本、毛利、注册、节点、异常网关、质检指标 |
| 客户管理 | 客户新增、编辑、启停、余额、授信、充值、网关数量、受控删除 |
| 客户网关管理 | IP/SIP 注册认证、启停、删除、多个策略、优先级、主被叫匹配、线路组绑定 |
| 业务前缀管理 | 管理客户呼入被叫业务前缀,热路径先按前缀识别业务并剥离真实被叫 |
| 客户网关管理 | 多接入 IP/SIP 注册认证、启停、删除、单线路组绑定、主叫前缀/业务前缀匹配、客户侧计费周期与费率 |
| 充值记录 | 客户充值、供应商充值、余额前后值、操作人、备注;仅记录页面人工充值,不记录话单消费扣费 |
| 供应商管理 | 供应商账户、余额、授信、充值、落地网关数量、受控删除 |
| 落地网关管理 | 认证、并发、CPS、禁呼时段、编码、号码转换、计费周期、费率、启停、删除 |
| 落地网关管理 | 认证、并发、CPS、禁呼时段、编码、落地要求被叫前缀、落地要求指定主叫号码池、计费周期、费率、启停、删除 |
| 落地线路组 | 线路组、组内网关、优先级、并发汇总、使用客户网关数量、受控删除 |
| 号码库 | 手机号码库、城市区号、运营商号码段规则;为话单归属地/运营商和落地网关屏蔽地区提供基础数据 |
| 当前通话 | OpenSIPS Dialog 实时列表、呼叫方 IP、落地 IP、自动刷新、强制挂断 |
@@ -1421,9 +1422,120 @@ sudo nohup runuser -u nobody -- /usr/bin/python3 /opt/lisglosips-s28/lisglosips-
- `POST /api/v2/number-library/carrier-prefix-rules/import`
- 权限新增:
- `number_library.view`
- `number_library.manage`
- `number_library.manage`
- 当前导入接口采用单批 `items` upsert,单次限制 1000 条,适合脚本/后台任务分批调用。80 万号段的真实文件导入、进度表、失败明细和 Redis 发布仍属于后续步骤,不在本次第 1、2 步中直接执行。
#### 25.5.10 业务前缀、客户网关匹配和落地号码改写重构
本需求为 S30 后高优先级二期变更,会重塑客户接入识别、客户侧计费、热路径路由和 CDR 号码语义。实现时不得在旧“客户网关多路由策略”模型上继续叠加临时逻辑,必须设计清楚迁移边界,避免同一通呼叫同时被旧策略和新规则命中。
新增“业务前缀管理”菜单:
- 业务前缀是客户呼入时附加在被叫号码前面的业务识别前缀,用于区分客户业务、费率和落地线路组。
- 示例:客户真实想呼叫 `18822190000`,平台收到的 SIP Request-URI/User 或 To 中被叫为 `67118822190000`,其中 `671` 为业务前缀,真实被叫号码为 `18822190000`
- 业务前缀需要平台统一维护,客户网关只能从“业务前缀管理”中多选可用前缀,不能在客户网关中随意输入未登记的业务前缀。
- 业务前缀字段建议至少包括:`id``prefix``name``description``status``priority``created_at``updated_at``deleted_at``prefix` 允许英文和阿拉伯数字,必须唯一;匹配时按最长前缀优先,再按 `priority`
呼叫识别与号码语义:
- 平台收到 SIP 呼叫后,先用来源 IP 命中候选客户网关 IP 列表,再用客户网关的主叫前缀规则和被叫业务前缀规则确定唯一客户网关。
- 被叫业务前缀匹配成功后,热路径必须剥离业务前缀,后续当前通话、CDR、计费、号码库归属地/运营商识别、地区屏蔽和落地侧转发都以“剥离后的真实被叫号码”为准。
- 当前通话和话单中写入的被叫号码必须是客户真实想呼叫的号码,即“客户送入被叫 - 被叫业务前缀”。如需排障,可额外保存原始被叫号码和命中的业务前缀。
- 建议新增 CDR 字段:`raw_callee``business_prefix_id``business_prefix``normalized_callee`。其中 `callee` 继续表示业务剥离后的真实被叫,避免影响现有话单展示语义。
客户网关配置管理调整:
- 一个客户网关可配置多个接入 IP。现有 `customer_gateways.source_ip` 单值字段应迁移为子表,例如 `customer_gateway_ips`,字段包含 `id``customer_gateway_id``source_ip``status`、审计列和软删除列。
- 删除原先“路由策略”模型。一个客户网关只对应一个落地线路组,不再维护多策略、优先级、每策略线路组绑定。
- 客户网关可配置客户侧费率,包含计费周期和周期内费率,可参考落地网关现有 `billing_cycle_sec``cycle_rate`。建议字段为 `billing_cycle_sec``cycle_rate`、必要时保留 `currency``effective_from/effective_to`
- 客户网关被叫前缀匹配规则:
- `ANY`:任意号码,不剥离业务前缀。
- `BUSINESS_PREFIXES`:从业务前缀管理中多选;匹配命中后剥离该业务前缀。
- 若多个业务前缀可命中同一个被叫,按最长前缀优先。
- 客户网关主叫前缀匹配规则:
- `ANY`:任意主叫。
- `PREFIXES`:可配置多个自定义主叫前缀。
- 主叫前缀只是匹配条件,不改写主叫。
- 若同一 IP 下多个客户网关的主叫/被叫规则都可命中同一呼叫,应在保存配置时阻止冲突,或者明确热路径选择规则。建议优先在 API 保存时做冲突检测,避免呼叫时不确定。
落地网关配置调整:
- 废弃现有“被叫前缀转换规则”列表,改为“落地要求被叫前缀”单文本框。
- 可为空。
- 可写任意英文或阿拉伯字符。
- 呼叫送到该落地网关时,在真实被叫号码前追加该前缀,再转发给落地网关。
- 示例:真实被叫 `18822190000`,落地要求被叫前缀为 `00`,则送落地的被叫为 `0018822190000`
- 废弃现有“主叫前缀转换规则”列表,改为“落地要求指定主叫”号码池。
- 每个号码可为空或写任意英文/阿拉伯字符;为空表示保持原主叫。
- 支持添加多个号码并指定权重。
- 呼叫送到该落地网关时,按权重概率选择一个指定主叫,将主叫改写为该号码。
- 建议建模为 `vendor_gateway_caller_rewrite_pool`,字段包括 `id``vendor_gateway_id``caller``weight``status`、审计列。热路径按确定性随机或可复现哈希选择,避免同一重试请求选择结果抖动。
Redis 热路径与 OpenSIPS/Lua 影响:
- Config Publisher 需要发布:
- `cfg:v:{version}:business_prefix:{prefix}` 或按客户网关聚合的业务前缀匹配结构。
- `cfg:v:{version}:customer_gateway_ip:{sourceIp}` -> 候选客户网关列表,而不是单个网关 ID。
- `cfg:v:{version}:customer_gateway:{id}` 中包含单线路组、客户侧费率、主叫前缀规则、业务前缀规则。
- `cfg:v:{version}:vendor_gateway:{id}` 中包含 `landingCalleePrefix`
- `cfg:v:{version}:vendor_gateway:{id}:caller_rewrite_pool` 中包含指定主叫与权重。
- OpenSIPS/Lua 需要调整顺序:
1. 读取来源 IP 候选客户网关列表。
2. 对每个候选客户网关检查启用状态、客户状态、主叫前缀规则、被叫业务前缀规则。
3. 选出唯一客户网关,得到客户、客户侧费率、落地线路组、命中的业务前缀和剥离后的真实被叫。
4. 用真实被叫做号码库归属地/运营商识别和地区屏蔽路由。
5. 选择落地网关后,按落地网关配置追加落地要求被叫前缀,并按权重选择落地要求指定主叫。
6. 转发给落地前,写入 Dialog 变量:原始被叫、真实被叫、业务前缀、客户网关、线路组、落地网关、落地侧最终主叫/被叫。
7. 当前通话与 CDR 使用真实被叫作为主展示字段;必要时详情显示原始被叫和落地侧最终被叫。
- 失败原因建议新增:
- `CUSTOMER_GATEWAY_IP_MISSING`
- `CUSTOMER_GATEWAY_RULE_CONFLICT`
- `CUSTOMER_GATEWAY_RULE_MISSING`
- `BUSINESS_PREFIX_NOT_MATCHED`
- `LINE_GROUP_MISSING`
- `VENDOR_CALLER_REWRITE_POOL_INVALID`
数据库和迁移影响:
- 本需求涉及 Prisma Schema 和 MySQL migration,执行前必须备份 B MySQL,并明确回滚点。
- 建议新增/调整:
- `business_prefixes`
- `customer_gateway_ips`
- `customer_gateway_business_prefixes`
- `customer_gateway_caller_prefixes`
- `customer_gateways.line_group_id`
- `customer_gateways.billing_cycle_sec`
- `customer_gateways.cycle_rate`
- `vendor_gateways.landing_callee_prefix`
- `vendor_gateway_caller_rewrite_pool`
- `raw_cdrs.raw_callee`
- `raw_cdrs.business_prefix_id`
- `raw_cdrs.business_prefix`
- `raw_cdrs.landing_caller`
- `raw_cdrs.landing_callee`
- 旧表 `customer_gateway_policies``vendor_gateway_prefix_rules` 不应立即物理删除。建议第一阶段保留表结构但停止新 UI/API 使用,迁移旧数据到新结构并标记弃用;确认 B/A/T 验收后再计划清理。
实施拆分建议:
1. 需求冻结与冲突口径确认:确认业务前缀允许字符、最长长度、是否全局唯一;确认同一 IP 下多客户网关冲突处理;确认客户网关费率是否立即替代 S23 最小计费逻辑;确认旧策略数据迁移规则。
2. 数据建模与 migration:新增业务前缀、客户网关多 IP、客户网关业务前缀关联、主叫前缀集合、客户网关单线路组和费率、落地指定主叫池、CDR 原始/真实/落地号码快照字段。执行前备份 B MySQL;本地先跑 Prisma validate/generate/schema contract。
3. API 改造:新增业务前缀 CRUD;改造客户网关 API 支持多 IP、单线路组、客户侧费率、主叫前缀集合、业务前缀多选;改造落地网关 API 支持落地要求被叫前缀和指定主叫池;停用或隐藏旧客户网关策略 API 的新增入口。
4. Web 改造:新增“业务前缀管理”菜单;客户网关页面改为多 IP、单线路组、费率、主叫前缀/业务前缀规则;落地网关页面替换旧主被叫前缀转换 UI。
5. Config Publisher 改造:发布候选客户网关列表、业务前缀匹配结构、客户网关单线路组/费率、落地前缀和主叫池;保留上一版本 Redis 回滚。
6. OpenSIPS/Lua 热路径改造:实现多候选客户网关匹配、业务前缀剥离、真实被叫号码进入号码库/地区屏蔽、落地侧主被叫改写、失败原因和 Dialog 变量。
7. CDR Stream/Worker/API/WebCDR 事件和 raw CDR 入库保存原始被叫、真实被叫、业务前缀、落地侧主叫/被叫;当前通话和话单默认展示真实被叫,详情展示原始/落地号码。
8. 旧数据迁移与兼容:将现有单 IP 客户网关迁移到 `customer_gateway_ips`;将每个客户网关当前唯一有效策略迁移为单线路组和匹配规则。若一个客户网关存在多个有效策略,必须人工确认拆分为多个客户网关或选择保留规则。
9. 本地验证:typecheck、lint、test、build;新增热路径 Lua 单元/脚本级样例,覆盖 `67118822190000 -> 18822190000`、多 IP、多主叫前缀、业务前缀多选、落地被叫追加前缀、主叫按权重选择。
10. A/B/T 验收:发布前备份 B release/MySQL/Redis 和 A OpenSIPS/Lua;在 A 执行 `opensips -C -f`;T 构造至少三类呼叫:命中业务前缀、任意被叫、未命中业务前缀;验证当前通话、CDR、计费、线路组选择、落地侧最终主被叫。
风险与约束:
- 这是高风险路由核心改造,影响前端、API、Prisma Schema、Redis 热路径、OpenSIPS、CDR Worker、当前通话、话单中心和回归脚本。
- 数据库迁移、Redis 发布和 OpenSIPS 重启必须分阶段发布,不能一次性在生产式环境无回滚点切换。
- “客户网关多 IP + 主叫前缀 + 业务前缀”会带来配置冲突,API 必须提前检测,否则热路径可能选错账户和费率。
- 被叫业务前缀剥离会改变 CDR 主展示号码和计费/地区识别输入,历史话单解释必须保留原始被叫快照以便排障。
- 落地指定主叫按权重选择需要可追溯,CDR 必须保存最终落地主叫;否则供应商侧投诉无法复盘。
### 25.6 Codex 新会话启动模板
```text