55 lines
4.1 KiB
Markdown
55 lines
4.1 KiB
Markdown
# 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
|