公寓宽带账号-设备-微码绑定模型设计草案

1. 目标

当前公寓运维页已经能看到账号、在线、绑码、最近绑定记录,但平台核心绑定关系仍不够稳定。下一阶段目标不是继续堆页面,而是把下面三类对象的主关系定型:

  • 宽带账号:sys_net_user
  • TR-069 设备:tr069_device
  • 微码:sys_device_microcode

目标结果:

  • 同一个账号当前绑定什么设备、什么微码,必须有唯一且权威的答案。
  • 页面统计只基于“当前态”查询,避免不同页面口径不一致。
  • 历史换绑、解绑、迁移记录可追溯,不再通过覆盖字段硬猜历史。

2. 现状结论

2.1 已经比较清晰的部分

  • TR-069 设备当前绑定关系已经采用显式表:tr069_device_binding
  • 该表以 device_id + net_user_id 表达当前设备归属,并且现有逻辑已经把它当成“显式绑定优先”来源
  • sys_net_user 已经开始通过 tr069_device_binding 判断“是否已绑定 TR-069 设备”

2.2 仍然混乱的部分

  • 微码当前把 net_user_namedevice_sntr069_device_idbind_time 直接写回 sys_device_microcode
  • 这意味着“码主数据”和“当前绑定态”混在同一行
  • 一旦发生换绑、解绑、换设备,只能覆盖字段,历史语义不稳定
  • 微码现在通过 net_user_name 字符串关联账号,而 TR-069 绑定使用 net_user_id,主键口径不统一

2.3 直接暴露出来的问题

  • 页面统计很容易出现“概况页”和“列表页”口径不一致
  • 账号换房、设备更换、微码重绑时,很难判断谁是当前态、谁只是历史残留
  • 未来要做自动下发、装维工单、异常修复时,缺少统一的绑定主链路

3. 建议的权威关系

建议以“宽带账号”作为业务主锚点。

原因:

  • 续费、到期、开停机、套餐、区域,业务都天然围绕账号发生
  • 设备和微码都是服务账号的接入资源,不应反过来成为主对象
  • TR-069 当前也已经倾向以 net_user_id 作为显式绑定目标

目标主链路:

sys_net_user -> tr069_device_binding -> tr069_device

sys_net_user -> microcode_binding -> sys_device_microcode

必要时再通过 microcode_binding.tr069_device_id 与设备侧对齐。

4. 推荐的数据模型

4.1 保留的主数据表

sys_net_user

  • 继续作为账号主表
  • 权威主键:id
  • username 继续保留为业务账号名,但不再作为跨表主关联键

tr069_device

  • 继续作为设备主表
  • 权威主键:id
  • 设备唯一识别优先用 serial_number

sys_device_microcode

  • 改为“微码主数据 + 库存属性”主表
  • 建议长期只保留下列主属性:
    • id
    • code
    • type
    • print_status
    • print_time
    • batch_no
    • remark
  • 当前行里的这些字段不应再作为权威绑定来源:
    • net_user_name
    • device_sn
    • tr069_device_id
    • bind_time
    • unbind_time
    • region_id
    • member_id

这些字段短期可保留兼容,长期应降级为冗余快照或迁移掉。

4.2 新增显式绑定表

建议新增:sys_device_microcode_binding

用途:表达“微码当前绑定到哪个账号/设备”。

建议字段:

  • id
  • microcode_id
  • net_user_id
  • tr069_device_id
  • device_sn_snapshot
  • region_id_snapshot
  • binding_source
  • remark
  • created_at
  • updated_at
  • deleted_at

建议约束:

  • microcode_iddeleted_at IS NULL 时唯一
  • net_user_iddeleted_at IS NULL 时最多一条 active 记录

如果业务允许“一账号换码但只能有一个当前码”,这个约束是必须的。

4.3 新增绑定事件表

建议新增:sys_device_microcode_binding_event

用途:记录所有绑定行为,不把历史压回主表。

建议字段:

  • id
  • microcode_id
  • net_user_id
  • tr069_device_id
  • event_type
    • bind
    • unbind
    • replace_device
    • replace_code
    • repair
  • source
  • operator_id
  • remark
  • created_at

这张表只负责审计与追溯,不参与“当前态”判定。

5. 当前态与历史态的规则

必须明确分层:

当前态

  • 当前账号绑定哪台设备:看 tr069_device_binding
  • 当前账号绑定哪个微码:看 sys_device_microcode_binding
  • 当前微码是否已使用:看是否存在 active binding

历史态

  • 历史换绑、解绑、修复:看 sys_device_microcode_binding_event
  • 历史设备归属变更:可继续由 tr069_device_binding 的软删历史或单独事件表承载

原则:

  • 页面概况只查当前态
  • 操作记录、审计、异常排查才查历史态

6. 核心业务约束

建议先按下面规则收敛:

  1. 一个账号同一时刻只能绑定一台当前设备
  2. 一个账号同一时刻只能绑定一个当前微码
  3. 一个微码同一时刻只能绑定一个账号
  4. 一个设备同一时刻只能归属一个账号
  5. 换绑不是覆盖旧关系,而是“结束旧 current + 新增新 current + 写事件”

7. 推荐操作流

7.1 扫码绑定

输入:微码、设备 SN、账号

处理:

  • 校验账号存在
  • 校验微码未被其他 active 关系占用
  • 如果设备不存在则注册/发现设备
  • tr069_device_binding 当前态
  • sys_device_microcode_binding 当前态
  • sys_device_microcode_binding_event(bind)

7.2 设备更换

输入:账号、新设备 SN

处理:

  • 结束该账号旧设备 current binding
  • 建立新设备 current binding
  • 微码 current binding 不变,只更新其 tr069_device_id
  • 写事件 replace_device

7.3 微码更换

输入:账号、新微码

处理:

  • 结束旧微码 current binding
  • 建立新微码 current binding
  • 设备 current binding 不变
  • 写事件 replace_code

7.4 退租/解绑

输入:账号

处理:

  • 结束 tr069_device_binding 当前态
  • 结束 sys_device_microcode_binding 当前态
  • unbind 事件

8. 对现有页面和接口的影响

8.1 公寓运维页

当前页继续只做概况页即可,不建议继续加复杂操作。

页面查询口径应切到:

  • 绑码用户数:基于 sys_device_microcode_binding active 记录
  • TR-069 已绑设备数:基于 tr069_device_binding active 记录
  • 最近绑码记录:基于 sys_device_microcode_binding_event

8.2 用户列表

HasMicrocodeBind 不再通过 sys_device_microcode.net_user_name exists 判断,改为通过显式绑定表判断。

8.3 微码列表

主列表展示主数据和当前绑定摘要;历史变更单独走事件记录页。

9. 推荐实施顺序

必须先做

  1. 新增 sys_device_microcode_binding
  2. 新增 sys_device_microcode_binding_event
  3. 扫码绑定逻辑切到显式绑定表写 current/event

第二批再做

  1. 概况页、用户页、微码页查询全部切到新 current 表
  2. 补换绑、解绑、修复接口

最后收口

  1. sys_device_microcode 中旧绑定字段降级为兼容字段
  2. 清理旧统计口径和旧 exists 查询

10. 最小迁移策略

不建议一次性清掉旧字段,建议分三步:

  1. 建新表,不删旧字段
  2. 新绑定操作双写:
    • 新表写 current/event
    • 旧字段仅做兼容回填
  3. 页面全部切换到新表后,再逐步废弃旧字段口径

11. 结论

下一阶段最该做的不是继续堆运维页功能,而是把:

  • 账号当前绑定设备
  • 账号当前绑定微码
  • 换绑/解绑历史

三件事拆开并定型。

TR-069 侧已经提供了正确方向:显式 current binding 表优先。微码侧应尽快对齐到同一模式。

作者:wuge  创建时间:2026-04-05 12:09
最后编辑:wuge  更新时间:2026-04-05 12:10