Files
smart_grid_iot/.trae/specs/upgrade-alarm-monitor-alert/tasks.md
T

55 lines
4.1 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.
# Tasks
- [x] Task 1: 后端报警派单完成接口(供共享电工 APP 确认完成)
- [worker_app.controller.ts](file:///F:/NewProject/鑫潼Git/smart_grid_iot/server/src/controller/worker_app.controller.ts) 新增 `@Post("/alarm-dispatches/:id/complete")`,注入 AlarmDispatch 仓储
- [worker_app.service.ts](file:///F:/NewProject/鑫潼Git/smart_grid_iot/server/src/service/worker_app.service.ts) 新增 `completeAlarmDispatch(workerId, id)`:
- 查派单:不存在 → 404;`workerId` 不归属当前电工 → 403
- status 已是 1 → 幂等提示「已完成」(不重复更新)
- 事务内更新 status→1、completedAt=new Date()
- 验证:curl 实测归属校验 / 完成更新 / 幂等(编译 + 接口)
- [x] Task 2: 后端 summary 改为 activeSevereIds(未派单完成的严重报警集合)
- [device_alarm.controller.ts](file:///F:/NewProject/鑫潼Git/smart_grid_iot/server/src/controller/device_alarm.controller.ts) `list()`:
- 查 `dispatchRepo.findAll({ where: { status: 1 }, attributes: ["alarmId"], raw: true })` 得已完成派单的 alarmId 集合
- `activeSevereIds` = grade=1、lineId 非空、id 不在已完成集合中的报警 id(alarmTime DESC limit 100)
- summary 返回 `activeSevereIds`(替换并删除原 `severeIds` 查询)
- 验证:接口返回 summary.activeSevereIds 为数组,且不含已完成派单的报警 id
- [x] Task 3: 前端悬浮立体警灯替换现有指示灯(样式独立可先行)
- [index.vue](file:///F:/NewProject/鑫潼Git/smart_grid_iot/client/src/views/device/alarm/index.vue) 删除 header-right 中现有 `.alarm-light` 指示灯(保留「订阅状态」按钮)
- 新增悬浮警灯:position: fixed 右上角 + z-index;CSS 3D 造型(警灯灯罩 + 红蓝双色灯芯 + 旋转/闪烁动画)
- 警灯可见/旋转条件:`activeSevereIds` 非空(由 Task 4 触发模型提供)
- 点击警灯:若 `route.path !== '/device/alarm'` 则 `router.push('/device/alarm')`
- 警灯旁加「重置报警提示」小按钮(tooltip:清空已通知集合,重新触发当前严重报警)
- [x] Task 4: 前端触发模型(依赖 Task 2 的 activeSevereIds)
- `scanSevereAlarms` 语义改为:新 id(不在已通知集合 `notifiedIds`)→ 即时触发一次;触发过的 id 追加进集合
- 警灯旋转条件:activeSevereIds 非空(而非「新触发」)
- 「重置报警提示」:清空 notifiedIds 后重新扫描当前 activeSevereIds 触发
- 30 秒列表轮询保持,每次同步 activeSevereIds;派单完成后报警移出集合即取消
- [x] Task 5: 警笛合成 + 即时响 + 3 分钟重复响(依赖 Task 4)
- 移除 doBeep(880Hz×3),新增 `playSiren(ctx)`:700Hz↔900Hz 高低音交替 2~3 轮(每轮 0.4s),gain 包络防爆音
- playBeep 逻辑保留(AudioContext 懒创建 + suspended resume + 静默降级),仅替换发声函数
- 新增 3 分钟定时器 `sirenTimer`(`setInterval` 180000ms):activeSevereIds 非空则播放警笛;onUnmounted 清理
- [x] Task 6: 编译验证
- 后端 `npx tsc --noEmit`(server/)
- 前端 `npx vue-tsc --noEmit`(client/)
- 接口实测:登录后 `GET /api/device-alarms` 返回 summary.activeSevereIds;完成接口归属/幂等实测
- [x] Task 7: 浏览器端到端验证
- 注入 grade=1 报警(无已完成派单)后:警灯出现并旋转(class/动画状态捕获)
- 点击警灯在非报警监控页跳转 `/device/alarm`
- 调用完成接口将该报警派单置 status=1 后:报警移出 activeSevereIds,警灯停止、重复响停止
- 该线路注入新严重报警:重新触发警灯/警笛
- 点击「重置报警提示」:当前未派单完成严重报警重新触发
- 3 分钟重复响逻辑(通过缩短定时器或代码检查确认)
# Task Dependencies
- Task 1、Task 2 相互独立可并行
- Task 3 样式部分不依赖 Task 2,可与 Task 1/2 并行;触发条件与 Task 4 联动
- Task 4 依赖 Task 2(activeSevereIds 数据源)
- Task 5 依赖 Task 4
- Task 6 / Task 7 依赖 Task 1-5