safesight-control/docs/superpowers/specs/2026-04-30-device-assignment-board-design.md

294 lines
7.4 KiB
Markdown
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

# 设备分配看板设计
日期2026-04-30
## 背景
当前“设备分配”页面延续了传统的“列表 + 详情表单”结构,但这类结构不适合当前业务目标。
对设备分配来说,用户最关心的不是单条分配记录的编辑细节,而是整体分配态势:
- 一共有多少识别单元
- 一共有多少设备
- 已分配多少识别单元
- 还有多少识别单元未分配
- 每台设备分配了多少识别单元
- 哪些设备接近上限、已经满载、或者处于空闲
- 在给定设备承载上限的前提下,如何快速自动平均分配
因此,这个页面应从“表单页”转为“分配看板”。
## 目标
设备分配页需要回答四个问题:
1. 当前整体分配情况如何
2. 哪些设备负载偏高,哪些设备空闲
3. 哪些识别单元还未分配
4. 如何基于设备上限快速自动平均分配,并允许少量手工调整
## 界面原则
本页优先强调“看清分配情况”和“快速完成分配”,界面应尽量简洁。
具体原则:
- 优先展示数字、状态和卡片,不展示大段说明文字
- 不放与分配主题关系弱的输入框
- 非关键说明尽量缩成短标签、短提示或折叠信息
- 让用户进入页面后先看到总量、负载、未分配,再看到操作
- 操作按钮集中放在一行,避免表单式堆叠
## 非目标
本次不做以下内容:
- 不做复杂拖拽交互
- 不做实时设备性能采样驱动的智能调度
- 不做按设备型号自动推算上限
- 不修改设备最终运行配置 JSON 合同
- 不引入新的底层部署引擎
## 页面定位
“设备分配”页面是一个调度和部署看板,不是传统资产详情页。
它的核心职责是:
- 展示识别单元与设备之间的承载关系
- 辅助用户快速完成平均分配
- 让未分配、超载、空闲这些问题一眼可见
## 信息架构
页面从上到下分为四个区域:
1. 分配概览
2. 操作区
3. 设备分配看板
4. 未分配识别单元
## 一、分配概览
页面顶部显示 6 个关键统计值:
- 识别单元总数
- 设备总数
- 已分配识别单元
- 未分配识别单元
- 平均每台设备负载
- 超载设备数
说明:
- “已分配识别单元”按是否被任一设备分配计算
- “未分配识别单元”按未出现在任何设备分配中的识别单元计算
- “平均每台设备负载”按 `已分配识别单元 / 设备总数` 计算,保留 1 位小数
- “超载设备数”按当前页面设定的“每台设备最大单元数”判断
这些统计值用于快速判断整体均衡情况。
## 二、操作区
操作区位于概览下方,采用一行布局,包含:
- 每台设备最大单元数滑块
- 自动平均分配
- 清空分配
- 保存设备分配
### 每台设备最大单元数
- 类型:滑块
- 默认值4
- 范围1 到 8
- 右侧显示当前值,例如:`4 路/台`
这是页面级控制参数,不直接写入设备运行配置,只影响当前页面的自动分配和负载判断。
### 自动平均分配
点击后执行自动分配算法:
1. 收集所有识别单元
2. 收集所有设备
3. 清空当前页面中的暂存分配结果
4. 按设备当前已分配数量从少到多依次分配
5. 单台设备不超过当前滑块上限
6. 剩余放不下的识别单元保留在“未分配识别单元”区域
目标是:
- 尽量平均
- 不超过上限
- 剩余明确可见
自动分配完成后,页面显示轻量提示,例如:
`已按每台最多 4 路完成自动分配,剩余 3 路未分配。`
### 清空分配
清空当前页面暂存的所有设备分配,不立即落库。
### 保存设备分配
将当前页面中的设备分配关系统一保存到数据库。
## 三、设备分配看板
页面主体改为卡片式设备板,而不是传统表格。
每台设备显示为一张卡片,卡片内容包括:
- 设备名称
- 设备 ID
- 当前分配数量,例如 `3 / 4`
- 当前状态
- 已分配的识别单元标签列表
### 设备状态
基于当前“每台设备最大单元数”计算:
- `0`:空闲
- `1``上限 - 1`:正常
- `= 上限`:满载
- `> 上限`:超载
### 排序规则
卡片按以下优先级排序:
1. 超载
2. 满载
3. 正常
4. 空闲
同类内再按设备名称或设备 ID 排序。
这样最需要关注的设备会优先显示。
### 视觉形式
每张设备卡片建议包含:
- 状态标签
- 负载数字
- 简短负载条
- 识别单元标签块
这已经构成足够直观的图形化表达,不需要第一版引入复杂图表。
## 四、未分配识别单元
单独放在页面下方或右侧,作为一个明确区域。
显示:
- 未分配识别单元数量
- 未分配识别单元列表
若没有未分配单元,则显示:
`已全部分配`
这个区域用于快速暴露“还有哪些识别单元没有落到任何设备上”。
## 手工调整
第一版不做拖拽。
手工调整采用轻量操作方式:
- 在设备卡片中的识别单元标签上,支持“移出”
- 在未分配识别单元列表中,支持“加入某设备”
- 在设备卡片上,支持“从未分配中加入”
也可以支持简单的“移动到其他设备”菜单,但不要求第一版一步到位。
原则是:
- 先保证清楚和稳定
- 再考虑拖拽式优化
## 数据模型要求
本页使用现有底层对象,不新增新的核心存储结构:
- 识别单元:`recognition_units`
- 设备分配:`device_assignments`
页面上的“每台设备最大单元数”是 UI 级暂存参数,不要求本次入库。
保存时,仅保存:
- 每台设备对应的识别单元列表
- 描述信息
不修改设备最终运行配置的生成合同。
## 页面与详情页关系
设备分配页负责整体看板和编辑。
设备详情页只做状态展示:
- 当前设备分配了多少识别单元
- 当前设备对应哪个场景模板
设备详情页不再承担分配编辑职责。
## 低优先级信息处理
以下内容不应在主界面占据明显位置:
- 长段文字说明
- 单独的“描述”输入框
- 与分配动作无关的扩展属性
如确有必要保留,应放入折叠区域或次级编辑入口,而不是主操作区。
## 错误处理
需要处理这些情况:
- 没有设备:页面显示空状态,并禁用自动分配/保存
- 没有识别单元:页面显示空状态,并禁用自动分配
- 某识别单元引用缺失:在卡片或未分配区显示异常标记
- 保存失败:保留当前页面暂存状态,并提示错误
## 测试
至少覆盖以下测试:
1. 统计信息正确
2. 自动平均分配在不同设备/单元数量组合下结果正确
3. 超载、满载、空闲状态判定正确
4. 未分配识别单元列表正确
5. 保存设备分配后,数据库中的 `device_assignments` 正确更新
6. 设备详情页和预览页仍能读取保存后的分配结果
## 实施建议
建议按以下顺序实施:
1. 后端补充分配统计与自动分配计算
2. 改造设备分配页面为“概览 + 操作区 + 看板 + 未分配区”
3. 接入保存逻辑
4. 最后补样式和状态表现
## 结论
设备分配页应从“单条配置表单”转为“分配看板”。
核心不是编辑细节,而是:
- 看清楚总量
- 看清楚负载
- 看清楚未分配
- 一键自动平均分配
- 再做少量手工修正
这会比当前的列表/勾选模式更符合实际使用场景,也更适合 32 路视频、多台边缘设备的部署方式。