页面上画的是:

PLC-A
└── 一次设备-X

后来又接入一个 PLC:

PLC-A ─┐
├── 一次设备-X
PLC-B ─┘

如果数据库和删除逻辑仍把它当成两棵独立的树,问题就出现了。

删除 PLC-A 时,旧逻辑沿父子关系清理一次设备-X。结果 PLC-B 仍然存在,但它关联的设备权限和拓扑被删掉了。另一些路径只删除设备、不删除边,又会留下悬空拓扑。

最终需要区分三件不同的事:

  1. 删除 PLC 实体;
  2. 解除 PLC 与一次设备的关系;
  3. 删除已经没有任何引用的一次设备实体。

伪代码比业务描述更直观:

unlink(plcA, deviceX)

if countReferences(deviceX) == 0 {
deletePermissions(deviceX)
deleteTopologyEdges(deviceX)
deleteDevice(deviceX)
}

当然,真实逻辑还包括缓存、告警和平台同步,关键写操作也要放进事务。

这个 Bug 最终让我记住:拓扑图在 UI 上可以用树组件展示,但领域模型不能因此假装自己也是树。