feat(alarm): ICC 报警事件订阅与设备报警监控/报警派单 - 重建 device_alarm 表(迁移20261024_icc_event_alarm.sql:alarm_code 唯一、uuid、line 关联、客户、等级、事件标记、alarm_time 等 19 字段与 4 索引)并新建 alarm_dispatch 派单表(15 字段);订阅服务 IccEventSubscribeService 复用 OAuth2 鉴权向 ICC 注册报警事件回调(POST subscribe/mqinfo,monitor 带 token、同名覆盖保活),每 30 分钟保活任务(sys_job 种子);回调 POST /api/icc-event/callback 无鉴权仅 URL token 校验,兼容单条/数组事件解析、按 alarmCode 幂等 upsert、匹配 electric_line.line_code 回填线路客户;新增 GET /api/device-alarms(列表+今日/严重/未派单统计+客户/等级/关键词筛选)与 POST /api/device-alarms/:id/dispatch(AD 派单号、同报警重复派单拦截、电工在岗审核校验、NoticeService 站内通知);GET /api/alarm-dispatches 台账(联电工/客户名);前端设备报警监控页(统计卡/筛选/表格/发起报警派单弹窗/30 秒轮询+严重报警红灯闪烁与 Web Audio 蜂鸣/订阅状态弹窗)与报警派单台账页+路由;菜单 63/64、role_menu、sys_job 种子;同步 db_init/db_seed 与设计文档;端到端验证通过

Co-Authored-By: Claude Sonnet 4.6 noreply@anthropic.com
This commit is contained in:
wkandClaude Sonnet 4.6 noreply@anthropic.com authored and trae-solo-agent committed 2026-10-24 16:59:02 +08:00
1 parent c8a4330f3b
commit 44fc9a1d54
24 files changed
+2825 -126

No files matched your search

+33 -34
View File
@@ -196,7 +196,7 @@ footer p{text-align:center;font-size:13px;color:var(--muted)}
<div class="dom-body">
<div class="tbl"><span class="tn">fault_type</span><span class="tc">报警故障类型</span></div>
<div class="tbl"><span class="tn">fault_type_detail</span><span class="tc">故障类型明细</span></div>
<div class="tbl"><span class="tn">device_alarm</span><span class="tc">设备报警(ICC 拉取)</span></div>
<div class="tbl"><span class="tn">device_alarm</span><span class="tc">设备报警(ICC 事件订阅)</span></div>
<div class="tbl"><span class="tn">alarm_dispatch</span><span class="tc">报警派单</span></div>
</div>
</div>
@@ -732,49 +732,44 @@ erDiagram
<tr><td><code>created_at</code></td><td>TIMESTAMPTZ</td><td></td><td>创建时间</td></tr>
</tbody></table></div>
<div class="tbl-title"><code>device_alarm</code><span class="td">— 设备报警信息表(ICC 拉取)</span></div>
<div class="tbl-title"><code>device_alarm</code><span class="td">— 设备报警信息表(ICC 事件订阅)</span></div>
<div class="table-wrap"><table><thead><tr><th>字段</th><th>类型</th><th>键</th><th>说明</th></tr></thead><tbody>
<tr><td><code>id</code></td><td>BIGSERIAL</td><td><span class="pill p-pk">PK</span></td><td>自增主键</td></tr>
<tr><td><code>alarm_code</code></td><td>VARCHAR(128)</td><td>UNIQUE</td><td>报警编码</td></tr>
<tr><td><code>line_id</code></td><td>BIGINT</td><td><span class="pill p-pi">IDX</span></td><td>线路 ID</td></tr>
<tr><td><code>equip_id</code></td><td>BIGINT</td><td></td><td>客户设备 ID</td></tr>
<tr><td><code>icc_device_code</code></td><td>VARCHAR(128)</td><td></td><td>ICC 设备编号</td></tr>
<tr><td><code>alarm_code</code></td><td>VARCHAR(128)</td><td>UNIQUE</td><td>ICC 报警编码(幂等键)</td></tr>
<tr><td><code>uuid</code></td><td>VARCHAR(128)</td><td></td><td>ICC 事件 uuid</td></tr>
<tr><td><code>line_id</code></td><td>BIGINT</td><td><span class="pill p-pi">IDX</span></td><td>智电线路 ID(→ electric_line)</td></tr>
<tr><td><code>line_code</code></td><td>VARCHAR(64)</td><td></td><td>线路编码(electric_line.line_code)</td></tr>
<tr><td><code>line_name</code></td><td>VARCHAR(128)</td><td></td><td>线路名称</td></tr>
<tr><td><code>customer_id</code></td><td>BIGINT</td><td><span class="pill p-pi">IDX</span></td><td>客户 ID</td></tr>
<tr><td><code>building_id</code></td><td>BIGINT</td><td></td><td>所属建筑 ID</td></tr>
<tr><td><code>floor_no</code></td><td>VARCHAR(16)</td><td></td><td>所在楼层</td></tr>
<tr><td><code>location</code></td><td>VARCHAR(256)</td><td></td><td>所在位置</td></tr>
<tr><td><code>alarm_date</code></td><td>DATE</td><td><span class="pill p-pi">IDX</span></td><td>报警日期</td></tr>
<tr><td><code>fault_type</code></td><td>VARCHAR(128)</td><td></td><td>ICC 预警类型</td></tr>
<tr><td><code>alarm_value</code></td><td>NUMERIC(14,2)</td><td></td><td>报警数值</td></tr>
<tr><td><code>history_count</code></td><td>INT</td><td></td><td>历史出现次数</td></tr>
<tr><td><code>synced_at</code></td><td>TIMESTAMPTZ</td><td></td><td>ICC 同步时间</td></tr>
<tr><td><code>customer_id</code></td><td>BIGINT</td><td><span class="pill p-pi">IDX</span></td><td>客户 ID(由 line_id 联出)</td></tr>
<tr><td><code>node_code</code></td><td>VARCHAR(64)</td><td></td><td>探测器节点编码(info.nodeCode)</td></tr>
<tr><td><code>device_code</code></td><td>VARCHAR(64)</td><td></td><td>设备编码(info.deviceCode)</td></tr>
<tr><td><code>device_name</code></td><td>VARCHAR(128)</td><td></td><td>设备名称(info.deviceName)</td></tr>
<tr><td><code>org_code</code></td><td>VARCHAR(64)</td><td></td><td>组织编码(info.orgCode)</td></tr>
<tr><td><code>org_name</code></td><td>VARCHAR(128)</td><td></td><td>组织名称(info.orgName)</td></tr>
<tr><td><code>alarm_type</code></td><td>INT</td><td></td><td>报警类型(info.alarmType)</td></tr>
<tr><td><code>alarm_grade</code></td><td>SMALLINT</td><td><span class="pill p-pi">IDX</span></td><td>报警等级 1/2/3(1 最严重)</td></tr>
<tr><td><code>alarm_stat</code></td><td>SMALLINT</td><td></td><td>报警状态(info.alarmStat)</td></tr>
<tr><td><code>is_event</code></td><td>BOOLEAN</td><td></td><td>是否事件(info.isEvent)</td></tr>
<tr><td><code>alarm_time</code></td><td>TIMESTAMPTZ</td><td><span class="pill p-pi">IDX</span></td><td>报警发生时间(info.alarmDate 秒级时间戳)</td></tr>
<tr><td><code>alarm_value</code></td><td>NUMERIC(14,4)</td><td></td><td>报警数值(部分事件带值,可空)</td></tr>
<tr><td><code>synced_at</code></td><td>TIMESTAMPTZ</td><td></td><td>入库时间</td></tr>
</tbody></table></div>
<div class="tbl-title"><code>alarm_dispatch</code><span class="td">— 报警派单信息表</span></div>
<div class="table-wrap"><table><thead><tr><th>字段</th><th>类型</th><th>键</th><th>说明</th></tr></thead><tbody>
<tr><td><code>id</code></td><td>BIGSERIAL</td><td><span class="pill p-pk">PK</span></td><td>自增主键</td></tr>
<tr><td><code>dispatch_no</code></td><td>VARCHAR(64)</td><td>UNIQUE</td><td>报警派单号</td></tr>
<tr><td><code>alarm_id</code></td><td>BIGINT</td><td><span class="pill p-fk">FK</span></td><td>报警 ID(→ device_alarm)</td></tr>
<tr><td><code>dispatch_no</code></td><td>VARCHAR(64)</td><td>UNIQUE</td><td>报警派单号(如 AD20261024001)</td></tr>
<tr><td><code>alarm_id</code></td><td>BIGINT</td><td><span class="pill p-pi">IDX</span></td><td>报警 ID(→ device_alarm)</td></tr>
<tr><td><code>line_id</code></td><td>BIGINT</td><td></td><td>线路 ID</td></tr>
<tr><td><code>equip_id</code></td><td>BIGINT</td><td></td><td>客户设备 ID</td></tr>
<tr><td><code>icc_device_code</code></td><td>VARCHAR(128)</td><td></td><td>ICC 设备编号</td></tr>
<tr><td><code>line_code</code></td><td>VARCHAR(64)</td><td></td><td>线路编码</td></tr>
<tr><td><code>line_name</code></td><td>VARCHAR(128)</td><td></td><td>线路名称</td></tr>
<tr><td><code>customer_id</code></td><td>BIGINT</td><td><span class="pill p-fk">FK</span></td><td>客户 ID</td></tr>
<tr><td><code>contact_person</code></td><td>VARCHAR(64)</td><td></td><td>联系人</td></tr>
<tr><td><code>contact_phone</code></td><td>VARCHAR(20)</td><td></td><td>电话</td></tr>
<tr><td><code>building_id</code></td><td>BIGINT</td><td></td><td>建筑 ID</td></tr>
<tr><td><code>floor_no</code></td><td>VARCHAR(16)</td><td></td><td>所在楼层</td></tr>
<tr><td><code>location</code></td><td>VARCHAR(256)</td><td></td><td>所在位置</td></tr>
<tr><td><code>fault_type_id</code></td><td>BIGINT</td><td><span class="pill p-fk">FK</span></td><td>故障类型 ID(→ fault_type)</td></tr>
<tr><td><code>fault_desc</code></td><td>TEXT</td><td></td><td>故障事项(类型+数值)</td></tr>
<tr><td><code>dispatcher</code></td><td>VARCHAR(64)</td><td></td><td>派发人</td></tr>
<tr><td><code>fault_reason</code></td><td>TEXT</td><td></td><td>故障原因(来自明细)</td></tr>
<tr><td><code>process_flow</code></td><td>TEXT</td><td></td><td>处理流程(来自明细)</td></tr>
<tr><td><code>worker_id</code></td><td>BIGINT</td><td><span class="pill p-pi">IDX</span></td><td>共享电工 ID</td></tr>
<tr><td><code>customer_id</code></td><td>BIGINT</td><td><span class="pill p-fk">FK</span></td><td>客户 ID(→ customer)</td></tr>
<tr><td><code>alarm_time</code></td><td>TIMESTAMPTZ</td><td></td><td>报警时间(快照)</td></tr>
<tr><td><code>alarm_grade</code></td><td>SMALLINT</td><td></td><td>报警等级(快照)</td></tr>
<tr><td><code>fault_desc</code></td><td>TEXT</td><td></td><td>故障事项(报警类型描述)</td></tr>
<tr><td><code>dispatcher</code></td><td>VARCHAR(64)</td><td></td><td>派发人(当前登录用户 realName)</td></tr>
<tr><td><code>worker_id</code></td><td>BIGINT</td><td><span class="pill p-pi">IDX</span></td><td>共享电工 ID(→ worker)</td></tr>
<tr><td><code>status</code></td><td>SMALLINT</td><td><span class="pill p-pi">IDX</span></td><td>状态:0已派发 1已处理</td></tr>
<tr><td><code>process_photos</code></td><td>JSONB</td><td></td><td>报警处理照片(多张)</td></tr>
<tr><td><code>rating</code></td><td>SMALLINT</td><td></td><td>派单处理评分</td></tr>
<tr><td><code>created_at</code></td><td>TIMESTAMPTZ</td><td></td><td>创建时间</td></tr>
<tr><td><code>completed_at</code></td><td>TIMESTAMPTZ</td><td></td><td>完成时间</td></tr>
</tbody></table></div>
@@ -971,9 +966,13 @@ erDiagram
<tr><td>electric_line</td><td><code>idx_line_customer</code></td><td>B-Tree</td><td>按客户查线路(逻辑隔离)</td></tr>
<tr><td>electric_line</td><td><code>idx_line_icc</code></td><td>B-Tree</td><td>ICC 设备码匹配同步</td></tr>
<tr><td>electricity_data</td><td><code>idx_ed_customer_time</code></td><td>B-Tree 组合</td><td>按客户+时间查用电(月报核心查询)</td></tr>
<tr><td>device_alarm</td><td><code>idx_alarm_date</code></td><td>B-Tree</td><td>按报警日期查询</td></tr>
<tr><td>device_alarm</td><td><code>idx_alarm_time</code></td><td>B-Tree DESC</td><td>按报警时间倒序(列表默认排序)</td></tr>
<tr><td>device_alarm</td><td><code>idx_alarm_line</code></td><td>B-Tree</td><td>按线路查报警</td></tr>
<tr><td>device_alarm</td><td><code>idx_alarm_customer</code></td><td>B-Tree</td><td>按客户查报警</td></tr>
<tr><td>device_alarm</td><td><code>idx_alarm_grade</code></td><td>B-Tree</td><td>按报警等级过滤(严重报警)</td></tr>
<tr><td>alarm_dispatch</td><td><code>idx_alarm_disp_status</code></td><td>B-Tree</td><td>按派单状态过滤</td></tr>
<tr><td>alarm_dispatch</td><td><code>idx_alarm_disp_worker</code></td><td>B-Tree</td><td>电工查自己的派单(接口数据权限)</td></tr>
<tr><td>alarm_dispatch</td><td><code>idx_alarm_disp_alarm</code></td><td>B-Tree</td><td>按报警查派单</td></tr>
<tr><td>repair_dispatch</td><td><code>idx_repair_disp_worker</code></td><td>B-Tree</td><td>电工查报修派单</td></tr>
<tr><td>sys_dict</td><td><code>idx_sys_dict_type</code></td><td>B-Tree</td><td>按字典类型查询</td></tr>
<tr><td>icc_sync_log</td><td><code>idx_icc_sync_time</code></td><td>B-Tree</td><td>按时间查同步日志</td></tr>