Files
iotlcm/docs/plans/channel-template-model-design.md
T
MiFaZhan 96b1edff45 chore: 初始开源发布
iotlcm-upstream-chan:运营商上游通道适配服务(统一 /sim/* 协议)。

- 内联原私有依赖:yunze-public → internal/pub/(10 包 18 文件),
  yunze-pb/pb → internal/pb/(9 文件);Consul 注册改用官方
  gogf/gf/contrib/registry/consul/v2(API 兼容)
- Go module:yz-svr → git.5iot.com/iotlcm-public/iotlcm-upstream-chan
- 修复 mingqian 包测试:实现重构后 `adapter.operations` 字段已移除,
  测试断言按当前实现语义重写(不改产品行为)
- 凭据与内部标识脱敏:MySQL/Redis/Consul 凭据、私网与生产 IP、
  内网域名、真实手机号、注释里的真实 token/transid
- 移除内部资产:CI 触发器、生产通道种子 SQL、真实凭据测试资源文档
- Dockerfile 改用公共基础镜像,移除写死的 registry 凭据
- 补 Apache-2.0 LICENSE,重写 README,LF 行尾 + .gitattributes
2026-10-22 16:08:06 +08:00

120 lines
4.1 KiB
Markdown

# 通道模板模型设计
## 1. 设计结论
通道配置分成三层:
```text
temp_model 接入方式大类
temp_key 具体上游协议模板
chan_config 具体通道的账号凭证和运行时状态
```
`temp_model` 只使用两个值:
```text
direct 直接调用上游 API
shared_token 先获取共享 Token,再调用业务 API
```
`direct` 是分类值,不是通用实现。普通模板必须通过 `temp_key` 找到精确注册的协议实现;不能仅凭 `direct` 推断运营商或请求协议。
`shared_token` 是共享 Token 模型的路由值,可以由共享实现工厂创建具体通道。
## 2. Mermaid 架构图
```mermaid
flowchart TB
DB["模板数据"] --> TEMPLATE["通道模板"]
TEMPLATE --> KEY["temp_key\n具体协议模板"]
TEMPLATE --> MODEL["temp_model\n接入方式"]
MODEL --> DIRECT["direct\n直接调用上游 API"]
MODEL --> SHARED["shared_token\n先获取共享 Token"]
KEY --> TY["sim_recharge_sdtywl_v1\n腾宇直连"]
KEY --> YD["sim_yd_v5\n中国移动官方"]
KEY --> DX["sim_dx_v1\n中国电信官方"]
KEY --> TY_SHARED["sim_onelink_tengyu_v1\n腾宇获取 Token + OneLink"]
KEY --> XZ_SHARED["sim_onelink_xuzhou_mobile_v1\n徐州移动获取 Token + OneLink"]
TY --> DIRECT_IMPL["精确 temp_key 注册的 direct 实现"]
YD --> DIRECT_IMPL
DX --> DIRECT_IMPL
TY_SHARED --> SHARED_IMPL["shared_token 模型工厂\n复用 OneLink 业务能力"]
XZ_SHARED --> SHARED_IMPL
SHARED_IMPL --> PROVIDER["Token Provider"]
PROVIDER --> TOKEN["共享 Token"]
TOKEN --> ONELINK["OneLink 业务 API"]
CREATE["新建通道"] --> SELECT["选择已有 temp_key"]
SELECT --> CREDENTIALS["填写通道凭证"]
CREDENTIALS --> CHANNEL["t_sim_channels"]
RULES["规则"] --> R1["temp_model 只有 direct / shared_token"]
RULES --> R2["temp_key 决定具体协议"]
RULES --> R3["direct 必须有精确注册"]
RULES --> R4["shared_token 使用共享工厂"]
```
## 3. 模板示例
```text
sim_yd_v5
temp_model = direct
中国移动官方 OneLink
sim_yd_mock_v5
temp_model = direct
中国移动 Mock OneLink
sim_dx_v1
temp_model = direct
中国电信 CMP
sim_recharge_sdtywl_v1
temp_model = direct
腾宇直连 API
sim_onelink_tengyu_v1
temp_model = shared_token
腾宇获取 Token + OneLink
sim_onelink_xuzhou_mobile_v1
temp_model = shared_token
徐州移动获取 Token + OneLink
```
## 4. 路由规则
运行时始终先按 `temp_key` 查找精确实现。精确注册优先于模型工厂,因此现有直连通道的协议行为不会因为模型分类改变。
当没有精确 `temp_key` 注册时:
- `temp_model=shared_token` 使用共享 Token 模型工厂。
- `temp_model=direct` 返回明确错误,因为 direct 本身不描述具体协议。
- 空值、未知值或旧的具体实现名称返回明确配置错误。
## 5. 新增三方协议流程
1. 实现三方协议的请求、签名、响应映射、错误处理和业务能力。
2. 增加新的 `temp_key` 并注册精确实现。
3. 为模板设置 `temp_model=direct`;如果需要共享 Token,则设置 `temp_model=shared_token`。
4. 在模板数据中保存公共配置,通道数据中保存账号凭证。
5. 业务人员创建通道时选择已有 `temp_key`,只填写该通道自己的凭证。
## 6. 配置边界
模板配置适合保存公共 API 地址、固定路径、超时时间和其他非账号协议参数。
通道配置适合保存 appKey、appSecret、pwdKey、channelNo、appId、账号密码及该通道独立的 Token 状态。
配置不能试图描述完整协议;新增协议通常仍需要修改代码。
## 7. 迁移约束
- 新代码只接受 `direct` 和 `shared_token` 两个模型值。
- 部署前通过 DBX 将现有普通模板修正为 `direct`,共享 Token 模板修正为 `shared_token`。
- 旧的 `onelink`、`onelink_mock`、`telecom`、`shared_token_onelink` 不作为新配置值保留。
- 发现无法根据 `temp_key` 判断类型的模板时,停止自动迁移并人工确认。
- 本仓库不提交数据库修复 SQL;数据库变更由 DBX 直接执行。