页面上画的是:
PLC-A
└── 一次设备-X
后来又接入一个 PLC:
PLC-A ─┐
├── 一次设备-X
PLC-B ─┘
如果数据库和删除逻辑仍把它当成两棵独立的树,问题就出现了。
删除 PLC-A 时,旧逻辑沿父子关系清理一次设备-X。结果 PLC-B 仍然存在,但它关联的设备权限和拓扑被删掉了。另一些路径只删除设备、不删除边,又会留下悬空拓扑。
最终需要区分三件不同的事:
- 删除 PLC 实体;
- 解除 PLC 与一次设备的关系;
- 删除已经没有任何引用的一次设备实体。
伪代码比业务描述更直观:
unlink(plcA, deviceX)
if countReferences(deviceX) == 0 {
deletePermissions(deviceX)
deleteTopologyEdges(deviceX)
deleteDevice(deviceX)
}
当然,真实逻辑还包括缓存、告警和平台同步,关键写操作也要放进事务。
这个 Bug 最终让我记住:拓扑图在 UI 上可以用树组件展示,但领域模型不能因此假装自己也是树。