feat(alarm): 设备报警监控报警提示升级与警灯交互优化 - 报警提示升级:后端新增报警派单完成接口 POST /api/worker-app/alarm-dispatches/:id/complete(供共享电工APP确认完成,归属校验403/不存在404/已完成幂等,status置1并写completed_at);GET /api/device-alarms 的 summary 由 severeIds 改为 activeSevereIds(grade=1 且无已完成派单的报警id,倒序100条,派单完成自动移出即报警取消)并新增轻量接口 GET /api/device-alarms/active-severe;前端新建全局悬浮立体警灯组件 AlarmSirenLight(红蓝双色3D警灯,挂载主布局所有页面可见,点击跳转报警监控页,30秒轮询activeSevereIds新id即时响+每3分钟重复响,Web Audio合成警笛700/900Hz交替,浏览器自动播放静默降级);index.vue 移除原10秒指示灯与880Hz beep、瘦身为纯列表页;警灯交互优化:警灯可鼠标拖动(位移>5px判为拖动不触发跳转)、位置经localStorage跨刷新记忆(默认右上角)、取消「重置报警提示」按钮;后端tsc与前端vue-tsc编译通过,接口实测派单完成排除逻辑生效,浏览器端到端验证通过(全局显示、点击跳转、拖动、刷新记忆、重置按钮无残留)

This commit is contained in:
wk authored and trae-solo-agent committed 2026-10-24 18:40:05 +08:00
1 parent 7ff2405634
commit 2d55947762
13 files changed
+676 -115

No files matched your search

@@ -0,0 +1,11 @@
# Checklist
- [x] 警灯容器支持鼠标拖动,拖动过程不触发页面跳转
- [x] 拖动松开后警灯停驻在当前位置
- [x] 拖动位置经 localStorage(`alarm-siren-pos`)记忆,刷新后警灯显示在拖动处
- [x] 首次进入(无记录)警灯显示默认右上角
- [x] 未拖动的点击警灯仍跳转 /device/alarm(不在该页时)
- [x] 「重置报警提示」按钮已移除(模板/函数/样式/tooltip 无残留)
- [x] 即时响/3 分钟重复响/警灯激活(is-on)等原有逻辑不受影响
- [x] 前端 vue-tsc 编译通过
- [x] 浏览器端到端验证通过(默认位置、拖动、刷新记忆、点击跳转、无重置按钮)
@@ -0,0 +1,46 @@
# 报警灯可拖动 + 取消重置报警提示 Spec
## Why
上一版升级(upgrade-alarm-monitor-alert)中悬浮立体警灯固定右上角、带「重置报警提示」按钮;用户希望警灯可鼠标自由拖动(位置跨刷新记忆),并取消重置报警提示按钮。
## What Changes
- **前端 [AlarmSirenLight.vue](file:///F:/NewProject/鑫潼Git/smart_grid_iot/client/src/components/AlarmSirenLight.vue)**:
- 警灯改为**可鼠标拖动**:鼠标按下拖动、松开停驻;初始默认位置为右上角(现 fixed top:120px/right:24px),拖动后位置经 `localStorage` 记忆(刷新浏览器后停在拖动处)。
- 拖动与点击跳转区分:拖动位移超过阈值(约 5px)视为拖动不跳转;未拖动视为点击,保留「不在 /device/alarm 则跳转」行为。
- **移除「重置报警提示」按钮**及其逻辑(resetAlarmPrompt/按钮模板/相关 tooltip);`notifiedIds` 已通知集合保留(去重即时响仍需),仅删除清空入口。
- 布局挂载(layouts/index.vue)、后端接口、触发模型、警笛逻辑均不变。
## Impact
- Affected specs: 设备报警监控报警提示升级(upgrade-alarm-monitor-alert)
- Affected code:
- [client/src/components/AlarmSirenLight.vue](file:///F:/NewProject/鑫潼Git/smart_grid_iot/client/src/components/AlarmSirenLight.vue)(拖动 + 位置记忆 + 移除重置按钮)
## 明确假设
1. **拖动范围**:任意位置均可停驻(fixed 定位,拖动后以 left/top 定位);跨页面由全局组件天然保持,刷新由 localStorage 恢复。
2. **localStorage key**:`alarm-siren-pos`,存 `{ left, top }`(px);读取异常或首次进入用默认右上角。
3. **点击语义**:警灯本体点击仍跳转 `/device/alarm`(若不在该页);拖动过程不触发跳转。
## ADDED Requirements
### Requirement: 报警灯可拖动
系统 SHALL 允许用户用鼠标拖动悬浮警灯到任意位置,位置跨刷新记忆。
#### Scenario: 拖动警灯
- **WHEN** 用户在任意页面按住警灯并移动鼠标
- **THEN** 警灯跟随鼠标移动,松开后停驻在当前位置,且不触发页面跳转
#### Scenario: 刷新后位置保持
- **WHEN** 用户刷新浏览器或重新登录
- **THEN** 警灯显示在上次拖动停留的位置;首次使用时显示在默认右上角
#### Scenario: 点击仍可跳转
- **WHEN** 用户点击警灯(未拖动),且当前不在 /device/alarm
- **THEN** 跳转到设备报警监控页面
## MODIFIED Requirements
### Requirement: 悬浮警灯位置与重置按钮(原「固定右上角 + 重置报警提示」)
原实现为 fixed 右上角(top:120px/right:24px)固定位置,警灯旁有「重置报警提示」按钮(清空已通知集合重新触发)。现修改为:警灯可拖动且位置跨刷新记忆;移除「重置报警提示」按钮及其清空逻辑(已通知集合仅在页面生命周期内累积去重)。
## REMOVED Requirements
### Requirement: 「重置报警提示」按钮
**Reason**: 用户明确取消该功能。
**Migration**: 删除按钮模板、`resetAlarmPrompt()` 函数与相关样式/tooltip;`notifiedIds` 集合与即时响去重逻辑保留,不再提供清空入口。
@@ -0,0 +1,15 @@
# Tasks
- [x] Task 1: 报警灯拖动 + 位置记忆 + 移除重置按钮(client/src/components/AlarmSirenLight.vue)
- 移除「重置报警提示」按钮模板、`resetAlarmPrompt()` 函数、相关 tooltip 与 `.siren-reset` 样式
- 拖动实现:警灯容器(.floating-siren)`position: fixed`,改为 left/top 定位;mousedown 记录起点与容器坐标 → mousemove(window 监听)更新 left/top → mouseup 移除监听并保存位置
- 拖动与点击区分:mousedown 至 mouseup 位移 ≤5px 视为点击(保留「不在 /device/alarm 则 router.push」),超过则视为拖动
- 位置记忆:localStorage key `alarm-siren-pos` 存 `{ left, top }`;onMounted 读取恢复,无记录或解析失败用默认右上角(换算为 left/top,约 right:24px 对应 left = viewportWidth - 警灯宽度 - 24px)
- 保留:30 秒轮询 activeSevereIds、即时响、3 分钟重复响、警灯激活(is-on)、AudioContext 懒创建与清理
- [x] Task 2: 编译 + 浏览器验证
- client/ `npx vue-tsc --noEmit` 通过
- 浏览器验证:登录后警灯默认右上角;拖动到新位置;刷新页面警灯停在拖动处;点击(未拖动)跳转 /device/alarm;无「重置报警提示」按钮残留
# Task Dependencies
- Task 2 依赖 Task 1