[F11] 设备查询页 subsystemId 筛选 + 未归属标签

- apps/web-antd/src/api/iot/device/device/index.ts
  - Device 接口加 subsystemId/subsystemName
  - 新增 BindSubsystemReqVO + bindDeviceSubsystem (PUT /iot/device/bindSubsystem)
- apps/web-antd/src/views/iot/device/device/index.vue
  - 筛选器:子系统下拉 + 未归属哨兵 -1 (→ queryParams.unassigned=true)
  - 单设备/批量绑定弹窗,批量 100 台/批
  - 行操作 + TableAction 增加"绑定子系统"按钮 (auth: iot:device:update)
- apps/web-antd/src/views/iot/device/device/data.ts
  - useGridColumns 追加"所属子系统"列 (slot: subsystem)
- apps/web-antd/src/views/iot/device/device/modules/card-view.vue
  - 卡片视图加子系统信息行 + 未归属红标签
  - Props 透传 subsystems / searchParams.subsystemId / unassigned
- apps/web-antd/src/views/iot/device/device/__tests__/device-subsystem-filter.spec.ts
  - 14 用例: 筛选参数转换 / 未归属标签条件 / 批量分批逻辑
- locales/langs/{zh-CN,en-US}/page.json: iot.device.filter.subsystem.* 12 键同步
- Known Pitfalls 落地: 评审 A2 NULL 醒目红标签 / 哨兵 -1 → unassigned=true /
  批量 100 台分批 / iot:device:update 权限 / simple-list 加载静默降级

后端 B11 API 补充契约:
- GET /iot/device/page?unassigned=true (subsystemId IS NULL 过滤)
- PUT /iot/device/bindSubsystem { deviceId, subsystemId: number | null }
- 分页响应 Device 含 subsystemId?: number | null + subsystemName?: string

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
This commit is contained in:
lzh
2026-04-23 23:02:01 +08:00
parent ba459aa1d7
commit 887e51eaaa
7 changed files with 456 additions and 1 deletions

View File

@@ -41,6 +41,24 @@
}
},
"iot": {
"device": {
"filter": {
"subsystem": {
"placeholder": "All Subsystems",
"unassigned": "Unassigned",
"bind": "Bind Subsystem",
"bindTitle": "Bind Subsystem",
"batchBind": "Batch Bind Subsystem",
"batchBindTitle": "Batch Bind Subsystem",
"batchBindSuccess": "{0} device(s) bound successfully",
"bindSuccess": "Bound successfully",
"selectRequired": "Please select a subsystem first",
"selectDeviceTip": "Please select devices first",
"binding": "Binding...",
"batchBindHint": "{0} device(s) selected, max 100 per batch"
}
}
},
"subsystem": {
"title": "Subsystem",
"listTitle": "Subsystem List",

View File

@@ -41,6 +41,24 @@
}
},
"iot": {
"device": {
"filter": {
"subsystem": {
"placeholder": "全部子系统",
"unassigned": "未归属",
"bind": "绑定子系统",
"bindTitle": "绑定子系统",
"batchBind": "批量绑定子系统",
"batchBindTitle": "批量绑定子系统",
"batchBindSuccess": "已成功绑定 {0} 台设备",
"bindSuccess": "绑定成功",
"selectRequired": "请先选择子系统",
"selectDeviceTip": "请先选择要绑定的设备",
"binding": "正在绑定...",
"batchBindHint": "已选 {0} 台设备,每批最多 100 台"
}
}
},
"subsystem": {
"title": "子系统",
"listTitle": "子系统列表",