- 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>
271 lines
8.7 KiB
JSON
271 lines
8.7 KiB
JSON
{
|
||
"auth": {
|
||
"login": "登录",
|
||
"register": "注册",
|
||
"codeLogin": "验证码登录",
|
||
"qrcodeLogin": "二维码登录",
|
||
"forgetPassword": "忘记密码",
|
||
"profile": "个人中心"
|
||
},
|
||
"dashboard": {
|
||
"title": "概览",
|
||
"analytics": "分析页",
|
||
"workspace": "工作台"
|
||
},
|
||
"action": {
|
||
"action": "操作",
|
||
"add": "新增",
|
||
"edit": "编辑",
|
||
"delete": "删除",
|
||
"save": "保存",
|
||
"import": "导入",
|
||
"export": "导出",
|
||
"submit": "提交",
|
||
"cancel": "取消",
|
||
"confirm": "确认",
|
||
"reset": "重置",
|
||
"search": "搜索",
|
||
"more": "更多"
|
||
},
|
||
"tenant": {
|
||
"placeholder": "请选择租户",
|
||
"success": "切换租户成功"
|
||
},
|
||
"mp": {
|
||
"upload": {
|
||
"invalidFormat": "上传{0}格式不对!",
|
||
"maxSize": "上传{0}大小不能超过{1}M!",
|
||
"image": "图片",
|
||
"video": "视频",
|
||
"voice": "语音"
|
||
}
|
||
},
|
||
"iot": {
|
||
"device": {
|
||
"filter": {
|
||
"subsystem": {
|
||
"placeholder": "全部子系统",
|
||
"unassigned": "未归属",
|
||
"bind": "绑定子系统",
|
||
"bindTitle": "绑定子系统",
|
||
"batchBind": "批量绑定子系统",
|
||
"batchBindTitle": "批量绑定子系统",
|
||
"batchBindSuccess": "已成功绑定 {0} 台设备",
|
||
"bindSuccess": "绑定成功",
|
||
"selectRequired": "请先选择子系统",
|
||
"selectDeviceTip": "请先选择要绑定的设备",
|
||
"binding": "正在绑定...",
|
||
"batchBindHint": "已选 {0} 台设备,每批最多 100 台"
|
||
}
|
||
}
|
||
},
|
||
"subsystem": {
|
||
"title": "子系统",
|
||
"listTitle": "子系统列表",
|
||
"name": "子系统名称",
|
||
"namePlaceholder": "请输入子系统名称",
|
||
"nameRequired": "子系统名称不能为空",
|
||
"nameTooLong": "子系统名称长度不能超过 128 个字符",
|
||
"code": "子系统编码",
|
||
"codePlaceholder": "请输入编码,如 security、clean",
|
||
"codeRequired": "子系统编码不能为空",
|
||
"codeTooLong": "子系统编码长度不能超过 64 个字符",
|
||
"codeFormat": "编码格式错误:仅允许小写字母/数字/下划线,且以字母开头",
|
||
"codeHelp": "格式:小写字母开头,允许数字和下划线,如 clean_01",
|
||
"status": "状态",
|
||
"statusEnabled": "启用",
|
||
"statusDisabled": "禁用",
|
||
"statusPlaceholder": "请选择状态",
|
||
"icon": "图标",
|
||
"iconPlaceholder": "图标 URL 或 iconify 名称",
|
||
"description": "描述",
|
||
"descriptionPlaceholder": "请输入子系统描述",
|
||
"deviceCount": "设备数",
|
||
"searchPlaceholder": "搜索名称 / 编码",
|
||
"viewDevices": "查看设备",
|
||
"deleteDisabledTip": "子系统下有 {0} 台设备,无法删除",
|
||
"deviceListTitle": "子系统设备列表",
|
||
"deviceName": "设备名称",
|
||
"serialNumber": "序列号",
|
||
"deviceState": "在线状态",
|
||
"deviceOnline": "在线",
|
||
"deviceOffline": "离线",
|
||
"deviceSearchPlaceholder": "搜索设备名称",
|
||
"statTotal": "设备总数",
|
||
"statOnline": "在线设备",
|
||
"statAlarm": "告警设备",
|
||
"statsNotice": "统计数据由 Redis 缓存提供,可能有短暂延迟(⚠️ A6)",
|
||
"batchBind": "批量绑定设备",
|
||
"batchBindHint": "每批最多支持 100 台设备同时绑定",
|
||
"bindSuccess": "已成功绑定 {0} 台设备",
|
||
"selectDeviceTip": "请先选择要绑定的设备",
|
||
"unbind": "移除",
|
||
"unbindConfirm": "确认将设备「{0}」从当前子系统移除?",
|
||
"unbinding": "正在移除设备...",
|
||
"unbindSuccess": "设备已移除",
|
||
"transferCandidate": "候选设备",
|
||
"transferSelected": "已选设备"
|
||
},
|
||
"dag": {
|
||
"toolbar": {
|
||
"zoomIn": "放大",
|
||
"zoomOut": "缩小",
|
||
"fitView": "适应视图",
|
||
"undo": "撤销 (Ctrl+Z)",
|
||
"redo": "重做 (Ctrl+Y)",
|
||
"save": "保存"
|
||
},
|
||
"canvas": {
|
||
"readonly": "只读模式",
|
||
"empty": "拖拽节点到画布开始编排"
|
||
},
|
||
"panel": {
|
||
"title": "节点类型",
|
||
"searchPlaceholder": "搜索节点...",
|
||
"loading": "加载中...",
|
||
"loadError": "加载失败,请刷新重试",
|
||
"noMatch": "未找到匹配节点",
|
||
"category": {
|
||
"trigger": "触发器",
|
||
"condition": "条件",
|
||
"action": "动作"
|
||
}
|
||
},
|
||
"node": {
|
||
"device_state": {
|
||
"name": "设备状态",
|
||
"desc": "设备上线/下线时触发"
|
||
},
|
||
"device_property": {
|
||
"name": "设备属性上报",
|
||
"desc": "设备属性数据上报时触发"
|
||
},
|
||
"device_event": {
|
||
"name": "设备事件",
|
||
"desc": "设备上报事件时触发"
|
||
},
|
||
"device_service": {
|
||
"name": "设备服务调用",
|
||
"desc": "设备服务被调用时触发"
|
||
},
|
||
"timer": {
|
||
"name": "定时触发",
|
||
"desc": "按 Cron 表达式定时触发"
|
||
},
|
||
"expression": {
|
||
"name": "表达式判断",
|
||
"desc": "Aviator 表达式计算条件"
|
||
},
|
||
"time_range": {
|
||
"name": "时间段判断",
|
||
"desc": "判断当前时间是否在指定范围"
|
||
},
|
||
"condition_device_state": {
|
||
"name": "设备状态判断",
|
||
"desc": "判断设备当前在线状态"
|
||
},
|
||
"property_set": {
|
||
"name": "下发属性",
|
||
"desc": "向设备下发属性设置指令"
|
||
},
|
||
"service_invoke": {
|
||
"name": "调用服务",
|
||
"desc": "调用设备服务"
|
||
},
|
||
"alarm_trigger": {
|
||
"name": "触发告警",
|
||
"desc": "触发设备告警"
|
||
},
|
||
"alarm_clear": {
|
||
"name": "清除告警",
|
||
"desc": "清除设备告警"
|
||
},
|
||
"notify": {
|
||
"name": "发送通知",
|
||
"desc": "发送消息通知(短信/邮件/webhook)"
|
||
}
|
||
}
|
||
},
|
||
"alarm": {
|
||
"state": {
|
||
"archived": "已归档",
|
||
"activeUnacked": "活跃·未确认",
|
||
"activeAcked": "活跃·已确认",
|
||
"clearedUnacked": "已清除·未确认",
|
||
"clearedAcked": "已清除·已确认",
|
||
"unknown": "未知"
|
||
},
|
||
"severity": {
|
||
"critical": "紧急",
|
||
"major": "重要",
|
||
"minor": "次要",
|
||
"warning": "警告",
|
||
"info": "信息",
|
||
"unknown": "未知"
|
||
},
|
||
"list": {
|
||
"title": "告警记录"
|
||
},
|
||
"field": {
|
||
"alarmName": "告警名称",
|
||
"severity": "严重度",
|
||
"state": "状态",
|
||
"deviceName": "设备",
|
||
"productName": "产品",
|
||
"triggerCount": "触发次数",
|
||
"startTs": "首次触发",
|
||
"endTs": "最近触发",
|
||
"clearTs": "清除时间",
|
||
"ackTs": "确认时间"
|
||
},
|
||
"filter": {
|
||
"all": "全部",
|
||
"ackState": "确认状态",
|
||
"clearState": "清除状态",
|
||
"archived": "归档",
|
||
"unacked": "未确认",
|
||
"acked": "已确认",
|
||
"active": "活跃",
|
||
"cleared": "已清除",
|
||
"excludeArchived": "排除归档",
|
||
"allRecords": "全部记录",
|
||
"onlyArchived": "只看归档"
|
||
},
|
||
"op": {
|
||
"ack": "确认",
|
||
"unack": "撤销确认",
|
||
"clear": "清除",
|
||
"archive": "归档",
|
||
"noOps": "无可操作",
|
||
"confirmTitle": "操作确认",
|
||
"ackConfirm": "确认该告警?",
|
||
"unackConfirm": "撤销确认该告警?",
|
||
"clearConfirm": "清除该告警?",
|
||
"archiveConfirm": "归档该告警?归档后不可操作。",
|
||
"batchAck": "批量确认",
|
||
"batchClear": "批量清除",
|
||
"batchArchive": "批量归档",
|
||
"batchAckConfirm": "确认选中的 {count} 条告警?",
|
||
"batchClearConfirm": "清除选中的 {count} 条告警?",
|
||
"batchArchiveConfirm": "归档选中的 {count} 条告警?归档后不可操作。",
|
||
"selectFirst": "请先选择记录",
|
||
"ackSuccess": "确认成功",
|
||
"unackSuccess": "撤销确认成功",
|
||
"clearSuccess": "清除成功",
|
||
"archiveSuccess": "归档成功"
|
||
},
|
||
"detail": {
|
||
"title": "告警详情",
|
||
"basicInfo": "基本信息",
|
||
"propagationPath": "传播路径",
|
||
"details": "告警详情",
|
||
"remark": "处理备注",
|
||
"remarkPlaceholder": "请输入处理备注",
|
||
"remarkSaved": "备注已保存",
|
||
"history": "历史变化",
|
||
"noHistory": "暂无历史记录"
|
||
}
|
||
}
|
||
}
|
||
}
|