Просмотр исходного кода

feat(water): complete monitoring data source integration (#8)

Kazerin 2 дней назад
Родитель
Сommit
bf10005a59

+ 112 - 6
pipe-network-service/CONTEXT.md

@@ -1,11 +1,72 @@
 # 管网业务服务
 
-该上下文承载城市生命线中的管网业务。当前词汇表聚焦供水安全运行监测,覆盖供水设施、监测设备、监测报警和工单处置。
+该上下文承载“城市地下管网及设施建设改造智能化系统项目”软件平台中“地下管网管控平台”的管网业务。当前交付边界聚焦供水子系统“供水管网安全运行监测系统”,覆盖供水设施、监测设备、运行监测、监测报警和工单处置;供水前端与管理端后端共同构成该子系统的完整业务体验。
+
+## Product Boundary
+
+**供水管网安全运行监测系统**:地下管网管控平台中的供水业务子系统,覆盖首页、供水设施管理、监测设备管理、运行监测、监测报警及其关联的查询、统计、GIS、报警和工单操作。
+_Avoid_:把供水子系统等同于单一的报警页面,或把监测设备等同于供水设施
+
+## 供水子系统功能需求结构
+
+以下结构描述供水管网安全运行监测系统的业务能力边界,并与已确认的菜单层级保持一致。供水系统的设备台账、异常、监测和工单页面只处理设备类型树判定为“供水”的对象;设备类型未知或未归属时不得静默归入供水。
+
+清单、查询和统计页面不各自嵌入 GIS 联动定位;设施、监测设备和报警的定位与空间详情分别集中在本组的 GIS 一张图中。批量导出属于各清单或统计能力的一部分,但不改变 GIS 集中承载规则。
+
+### 1. 供水设施管理
+
+1.1 **管网信息查询**:清单化展示供水管线和管点,支持按管材、管径、建设年代、所属区域及关键字进行多条件查询和批量导出。
+
+1.2 **水厂信息查询**:提供水厂信息的关键字和分类查询,以及批量导出。
+
+1.3 **泵站信息查询**:提供泵站信息的分类查询和批量导出。
+
+1.4 **水源地信息查询**:提供水源地信息的分类查询和批量导出。
+
+1.5 **用水户信息查询**:面向居民、工业、商业、行政事业等全部用水户,提供多维分类查询和批量导出。
+
+1.6 **管网数据统计分析**:对供水管网数据进行多维统计分析,以柱状图、饼图、表格等形式展示,并支持结果下载导出。
+
+1.7 **供水设施 GIS 一张图**:在同一地图中展示水源地、水厂、泵站、供水管线和用水户,支持设施搜索、定位和详情查看;本功能范围不包含消火栓。
+
+### 2. 监测设备管理
+
+2.1 **设备台账管理**:对供水监测设备进行台账化管理,提供分类统计、查询和批量导出。
+
+2.2 **设备异常管理**:集中展示当前运行异常的供水监测设备,提供异常分类查询、处置状态跟踪和批量导出;可从异常设备进入故障维修工单派发,但本页面的主要职责是异常态势和台账管理。
+
+2.3 **设备维修派单**:面向已判定运行故障且不存在适用未结束同类工单的供水监测设备,创建并派发 `1-故障维修` 工单。
+
+2.4 **设备维修记录**:管理设备历史维修记录,支持多维查询、修改、删除、批量导入和批量导出。
+
+2.5 **监测设备 GIS 一张图**:在地图中展示各类供水监测设备及其监测点位,支持设备搜索、定位和详情查看。
+
+### 3. 运行监测
+
+3.1 **流量监测**:接入既有流量计监测数据,清单化展示流量监测点位,支持多条件查询和批量导出。
+
+3.2 **压力监测**:接入既有压力计监测数据,清单化展示压力监测点位,支持多条件查询和批量导出。
+
+3.3 **漏失监测**:接入新建漏失声波监测数据,清单化展示漏失监测点位,支持多条件查询和批量导出。
+
+### 4. 监测报警
+
+4.1 **报警管理**:依据各类监测设备的阈值规则和其他自动报警规则触发报警,展示报警等级、设备报警状态、报警记录状态及关联工单;报警记录进入工单处置流程时生成不指定责任人的待派单故障维修工单,本页面可发起责任人派发但不承载后续完整处置。不同报警类型可形成不同工单;同一设备同一报警类型同时只能存在一个未结束的同类报警工单。
+
+4.2 **报警审核**:提供报警审核或解除结果、意见和附件录入,并跟踪报警关联工单的完整处置流程;在供水系统内,该入口重点承载供水设备故障维修工单的派发、接单、处理、提交验收、验收、驳回和结案。
+
+4.3 **阈值管理**:支持按传感器分类批量设置阈值、设置分时阈值并查询已配置点位的阈值详情。
+
+4.4 **监测报警一张图**:在地图中展示供水各类报警点位,按报警级别以一级红色、二级橙色、三级蓝色、四级绿色突出显示,支持报警搜索、定位和详情查看。
+
+### 工单视图分工
+
+统一工单视图集中检索和处置所有供水类型工单,包括 `1-故障维修`、`2-日常巡检` 和 `3-设备保养`;报警审核视图聚焦供水故障维修工单。巡检或保养工单即使由其他系统派发给供水用户,仍可在统一工单视图中继续接单、处理和验收。
 
 ## 供水设施
 
 **供水设施**:
-构成供水系统并被登记、查询、统计或在地图上展示的业务对象,包括水源地、水厂、泵站、供水管线和用水户。
+构成供水系统并被登记、查询、统计或在地图上展示的业务对象,包括水源地、水厂、泵站、供水管线和用水户;水厂、泵站等是设施,不是监测设备
 _Avoid_:把监测设备统称为供水设施
 
 **水源地**:
@@ -17,13 +78,18 @@ _Avoid_:水源、水源点
 _Avoid_:供水厂、制水厂
 
 **泵站**:
-通过水泵为供水过程提供输送或增压能力的设施
+通过水泵为输水过程提供输送或增压能力的设施。泵站为供水/排水共用对象,物理表 `app_user.pump_station`(由 `water_pump_station` 迁移改名)以 `station_type` 区分:`water_supply`=供水泵站、`drainage`=排水泵站;各系统只读写本系统类型的行,类型由后端按入口强制写入(ADR-0007)
 _Avoid_:加压站
+_规则_:查询、统计、GIS、回收站与导入导出必须带 `station_type` 归属条件;禁止出现"一张泵站表两个系统共用却不过滤"的查询。
 
 **供水管线**:
 连接供水设施并输送水的线性设施。
 _Avoid_:管网、管道(指单条设施时)
 
+**管点**:
+供水管线上的节点或点状设施,作为管网查询、统计和空间展示的独立业务对象。
+_Avoid_:监测点(指监测设备所在位置时)
+
 **用水户**:
 接受供水服务的居民、工业、商业或行政事业主体。
 _Avoid_:大用水户(除非明确指满足特定用水量或重要性标准的子集)、用户
@@ -32,12 +98,32 @@ _Avoid_:大用水户(除非明确指满足特定用水量或重要性标准
 持久化表 `water_user_info` 及其 `user_*` 字段均表示“用水户”,覆盖居民、工业、商业和
 行政事业等全部类型。为保持现有接口与数据兼容,这些技术标识继续保留,不表示“大用水户”子集。
 
+**契约缺口**:
+当前五类供水设施实体、查询服务签名和 KingbaseES DDL 均未定义 `region`/所属区域字段;在字段和数据来源确认前,不得为区域筛选臆造数据库列或查询条件。区域筛选需另行完成 REST、模型和数据库契约评审。
+
 ## 运行监测
 
+**驾驶舱事件等级展示颜色**:
+面向城市生命线驾驶舱的预警/报警事件展示统一使用 1 级红色、2 级黄色、3 级蓝色、4 级绿色;该展示约定不改变后端等级数值的业务含义,也不等同于监测点主图标的正常/预警/报警/工单/离线状态色。
+_Avoid_:将历史预警颜色配置直接当作驾驶舱点位状态色
+
+**驾驶舱地图摘要接口**:
+面向 UE/大屏只读展示的分页接口,返回监测点、关联设备摘要和未关联设备摘要,以及后端解析后的点位状态、原因、统计、新鲜度和快照时间。专用接口 JSON 字段统一使用驼峰命名,包括 `deviceCode`、`pointCode`、`pointStatus` 和 `snapshotAt`。默认分页大小为 500,最大 1000;UE 不通过拼接管理接口自行计算点位状态。
+
+**驾驶舱设备详情聚合接口**:
+按数据库设备编码 `equipment_base.equipment_code` 查询并以 `deviceCode` 返回设备基础档案、类别、当前状态、最新监测数据、预警、报警、工单当前状态、工单状态时间线和最新设备图片的只读接口。内部可以联查多张表,但对 UE 暴露稳定聚合契约。
+
+**驾驶舱监测点详情聚合接口**:
+按 `point_code` 返回监测点基础信息、坐标校验、所属管网、点位状态、关联设备摘要及关联异常说明的只读接口。管理端监测点接口不自动等同于驾驶舱契约。
+
 **监测设备**:
-用于采集供水运行数据的设备,例如水位、压力或流量监测设备;它与被监测的供水设施是不同业务对象。
+用于采集供水运行数据的带传感器智能设备,例如水位、压力或流量监测设备;带传感器的井盖也属于监测设备。它与被监测的供水设施是不同业务对象。
 _Avoid_:供水设施、监测点(指设备本身时)
 
+**设备编码**:
+平台内监测设备的唯一业务标识,格式为“区域-类型-YYYYMMDD+4位流水号”。区域取 CN/CB/TC,业务类型取 RQ/GS/PS/YJ,排水可再细分为 YS/WS;例如 CN-GS-202609020001、TC-PS-YS-202609020012。设备编码用于跨系统定位设备,不承载设备当前状态或报警语义。
+_Avoid_:数据库主键、报警编号、工单编号
+
 **设备异常**:
 监测设备当前处于报警或维修状态的统称,可由一个或多个报警记录或处置过程造成。
 _Avoid_:报警记录(指一次事件时)、故障(原因尚未确认时)
@@ -70,18 +156,30 @@ _Avoid_:直接清警、工单验收
 运行系统确认设备的所有有效报警原因均已消除后,将设备报警状态从报警恢复为正常;任一报警原因仍有效时不得清警。
 _Avoid_:工单结案、报警记录已处理
 
+**报警转工单**:
+报警记录进入工单处置流程时生成待派单的故障维修工单,生成时不指定接单责任人;后续派发和处置由工单流程完成。
+_Avoid_:报警派单、报警处理
+
 ## 工单处置
 
 **工单**:
-对设备故障、日常巡检或设备保养进行分派、执行和跟踪的统一处置载体。
+对设备故障、日常巡检或设备保养进行分派、执行和跟踪的跨系统统一处置载体;供水、排水、燃气、窨井等系统通过关联设备类型区分业务归属,共享工单生命周期
 _Avoid_:维修任务、报警工单(作为独立于工单的概念)
 
+**工单系统归属**:
+工单所属系统由关联设备的设备类型树确定,而不是由前端页面名称或单独的“报警工单”概念确定;未知或未归属设备不得被静默归入某个系统。
+_Avoid_:用页面入口、工单标题或报警记录状态推断系统归属
+
 **故障维修工单**:
 用于核实并修复设备故障的工单,工单类型为 `1`;由设备维修需求或监测报警转入的处置都属于此类型。
 _Avoid_:维修任务、报警工单
 
+**同类报警工单**:
+同一设备针对同一报警类型建立的故障维修工单;同一设备同一报警类型同时只能存在一个未结束的同类报警工单。
+_Avoid_:同一报警记录、同设备全部工单
+
 **工单派发**:
-用户针对报警或异常设备创建故障维修工单并指定后续处置责任人的活动;可从设备维修派单、设备异常管理或报警管理入口发起。
+为待派单工单指定唯一接单责任人的活动;可从设备维修派单、设备异常管理或报警管理入口进入,但报警转工单本身不等同于派发。
 _Avoid_:报警处理、报警审核
 
 **工单处置**:
@@ -92,6 +190,14 @@ _Avoid_:报警审核(指工单后续操作时)、报警记录已处理
 对工单处置结果是否满足要求进行确认的活动;验收通过可以使工单结案,但不直接清除设备报警状态。
 _Avoid_:报警审核、自动清警
 
+**工单处置证据**:
+与工单处置阶段关联的说明和图片,至少区分处理前与处置后,用于责任人处理、验收审核和历史追溯。
+_Avoid_:把处置证据等同于报警记录状态或设备当前状态
+
+**随同修复**:
+一次故障维修同时消除了同一设备其他有效报警原因的处置结果;设备是否清警仍由运行系统复核有效报警原因决定,相关工单记录继续保留并按各自流程验收结案。
+_Avoid_:自动结案、重复维修
+
 **日常巡检工单**:
 用于执行计划内或临时巡查的工单,工单类型为 `2`。
 _Avoid_:巡检任务

+ 20 - 0
pipe-network-service/sql/migration_monitoring_device_code_length.sql

@@ -0,0 +1,20 @@
+-- 运行监测设备编码长度迁移(KingbaseES)
+-- 目标:
+--   1. 将 app_user.radar_data.device_code 长度扩展为 varchar(50)
+--   2. 将 app_user.telemetry_data.device_code 长度扩展为 varchar(50)
+-- 说明:
+--   设备编码遵循“区域-类型-YYYYMMDD+4位流水号”规范,长度可达 17 位;
+--   原测量表 device_code 为 varchar(10),无法承载完整编码,导致运行监测页面无法匹配设备。
+-- 可重复执行;不删除任何业务数据。
+
+ALTER TABLE app_user.radar_data ALTER COLUMN device_code TYPE varchar(50);
+ALTER TABLE app_user.telemetry_data ALTER COLUMN device_code TYPE varchar(50);
+
+COMMENT ON COLUMN app_user.radar_data.device_code IS '雷达流量计设备编码,关联 equipment_base.equipment_code';
+COMMENT ON COLUMN app_user.telemetry_data.device_code IS '遥测终端设备编码,关联 equipment_base.equipment_code';
+
+SELECT table_name, column_name, data_type, character_maximum_length
+FROM information_schema.columns
+WHERE table_schema = 'app_user'
+AND table_name IN ('radar_data', 'telemetry_data')
+AND column_name = 'device_code';

+ 58 - 56
pipe-network-service/sql/water_supply_monitoring_test_data.sql

@@ -1,21 +1,23 @@
 -- ============================================================
 -- 供水管网 T4 运行监测 测试数据脚本(KingbaseES)
 -- 说明:
---   1. 所有测试数据均使用 WS-TEST- 前缀,可重复执行。
---   2. 本脚本只初始化测试行,不创建监测业务表;执行前请确认以下表已存在:
+--   1. 测试主键均使用 WS-TEST- 前缀,可重复执行;设备编码遵循新命名规范。
+--   2. 设备编码遵循“区域-类型-YYYYMMDD+4位流水号”规范。
+--   3. 本脚本只初始化测试行,不创建监测业务表;执行前请确认以下表已存在:
 --      app_user.equipment_type、app_user.equipment_base、app_user.radar_data、
 --      app_user.telemetry_data、app_user.firefighting_pressure、app_user.noise_info
---   3. 覆盖场景:雷达流量、遥测流量、压力、漏失、无数据设备、
+--      如测量表 device_code 仍为 varchar(10),请先执行 migration_monitoring_device_code_length.sql。
+--   4. 覆盖场景:雷达流量、遥测流量、压力、漏失、无数据设备、
 --      非供水设备排除、数值范围过滤、时间范围过滤与近24小时之外的旧趋势点。
 -- ============================================================
 
 -- ------------------------------------------------------------
 -- 0. 清理历史测试数据(先清测量值,再清设备;不删除生产设备类型)
 -- ------------------------------------------------------------
-DELETE FROM app_user.radar_data WHERE device_code LIKE 'WS-TEST-%';
-DELETE FROM app_user.telemetry_data WHERE device_code LIKE 'WS-TEST-%';
-DELETE FROM app_user.firefighting_pressure WHERE telemetering_station LIKE 'WS-TEST-%';
-DELETE FROM app_user.noise_info WHERE encode LIKE 'WS-TEST-%';
+DELETE FROM app_user.radar_data WHERE id LIKE 'WS-TEST-%';
+DELETE FROM app_user.telemetry_data WHERE id LIKE 'WS-TEST-%';
+DELETE FROM app_user.firefighting_pressure WHERE id LIKE 'WS-TEST-%';
+DELETE FROM app_user.noise_info WHERE encode LIKE 'WS-TEST-%' OR encode LIKE 'CB-GS-20260902000%' OR encode LIKE 'TC-GS-20260902000%';
 DELETE FROM app_user.equipment_base WHERE equipment_id LIKE 'WS-TEST-EQ-%';
 
 -- ------------------------------------------------------------
@@ -51,83 +53,83 @@ INSERT INTO app_user.equipment_base
      longitude, latitude, equipment_location, maintainer, maintainer_phone,
      ownership_unit, remark, create_time, update_time, del_flag, district)
 VALUES
-    ('WS-TEST-EQ-FLOW-RADAR', 'WS-TEST-FLOW-RADAR', '测试雷达流量监测点', 'RADAR-FLOW-TEST',
+    ('WS-TEST-EQ-FLOW-RADAR', 'CN-GS-202609020001', '测试雷达流量监测点', 'RADAR-FLOW-TEST',
      (SELECT id FROM app_user.equipment_type WHERE type_id = 'ws_flow' AND parent_type_id = '1' LIMIT 1), 113.28000000, 23.12000000, '供水测试大道1号',
      '供水测试维护员', '13800000001', '供水测试公司', '供水T4运行监测测试数据',
      now() - interval '7 days', now(), '0', '供水测试区'),
-    ('WS-TEST-EQ-FLOW-TELEMETRY', 'WS-TEST-FLOW-TELEMETRY', '测试遥测终端流量监测点', 'TELEMETRY-FLOW-TEST',
+    ('WS-TEST-EQ-FLOW-TELEMETRY', 'CN-GS-202609020002', '测试遥测终端流量监测点', 'TELEMETRY-FLOW-TEST',
      (SELECT id FROM app_user.equipment_type WHERE type_id = 'ws_flow' AND parent_type_id = '1' LIMIT 1), 113.29000000, 23.13000000, '供水测试大道2号',
      '供水测试维护员', '13800000002', '供水测试公司', '供水T4运行监测测试数据',
      now() - interval '7 days', now(), '0', '供水测试区'),
-    ('WS-TEST-EQ-PRESSURE', 'WS-TEST-PRESSURE', '测试压力监测点', 'PRESSURE-TEST',
+    ('WS-TEST-EQ-PRESSURE', 'CB-GS-202609020001', '测试压力监测点', 'PRESSURE-TEST',
      (SELECT id FROM app_user.equipment_type WHERE type_id = 'ws_pressure' AND parent_type_id = '1' LIMIT 1), 113.30000000, 23.14000000, '供水测试大道3号',
      '供水测试维护员', '13800000003', '供水测试公司', '供水T4运行监测测试数据',
      now() - interval '7 days', now(), '0', '供水测试区'),
-    ('WS-TEST-EQ-LEAKAGE', 'WS-TEST-LEAKAGE', '测试漏失监测点', 'LEAKAGE-TEST',
+    ('WS-TEST-EQ-LEAKAGE', 'TC-GS-202609020001', '测试漏失监测点', 'LEAKAGE-TEST',
      (SELECT id FROM app_user.equipment_type WHERE type_id = 'ws_leak' AND parent_type_id = '1' LIMIT 1), 113.31000000, 23.15000000, '供水测试大道4号',
      '供水测试维护员', '13800000004', '供水测试公司', '供水T4运行监测测试数据',
      now() - interval '7 days', now(), '0', '供水测试区'),
-    ('WS-TEST-EQ-FLOW-EMPTY', 'WS-TEST-FLOW-EMPTY', '测试无测量流量监测点', 'FLOW-EMPTY-TEST',
+    ('WS-TEST-EQ-FLOW-EMPTY', 'CN-GS-202609020003', '测试无测量流量监测点', 'FLOW-EMPTY-TEST',
      (SELECT id FROM app_user.equipment_type WHERE type_id = 'ws_flow' AND parent_type_id = '1' LIMIT 1), 113.32000000, 23.16000000, '供水测试大道5号',
      '供水测试维护员', '13800000005', '供水测试公司', '供水T4运行监测无数据测试设备',
      now() - interval '7 days', now(), '0', '供水测试区'),
-    ('WS-TEST-EQ-FLOW-003', 'WS-TEST-FLOW-003', '测试流量监测点03', 'FLOW-TEST-003',
+    ('WS-TEST-EQ-FLOW-003', 'CN-GS-202609020004', '测试流量监测点03', 'FLOW-TEST-003',
      (SELECT id FROM app_user.equipment_type WHERE type_id = 'ws_flow' AND parent_type_id = '1' LIMIT 1), 113.34000000, 23.18000000, '供水测试大道7号',
      '供水测试维护员', '13800000007', '供水测试公司', '供水T4流量分页测试设备',
      now() - interval '7 days', now(), '0', '供水测试区'),
-    ('WS-TEST-EQ-FLOW-004', 'WS-TEST-FLOW-004', '测试流量监测点04', 'FLOW-TEST-004',
+    ('WS-TEST-EQ-FLOW-004', 'CN-GS-202609020005', '测试流量监测点04', 'FLOW-TEST-004',
      (SELECT id FROM app_user.equipment_type WHERE type_id = 'ws_flow' AND parent_type_id = '1' LIMIT 1), 113.35000000, 23.19000000, '供水测试大道8号',
      '供水测试维护员', '13800000008', '供水测试公司', '供水T4流量分页测试设备',
      now() - interval '7 days', now(), '0', '供水测试区'),
-    ('WS-TEST-EQ-FLOW-005', 'WS-TEST-FLOW-005', '测试流量监测点05', 'FLOW-TEST-005',
+    ('WS-TEST-EQ-FLOW-005', 'CN-GS-202609020006', '测试流量监测点05', 'FLOW-TEST-005',
      (SELECT id FROM app_user.equipment_type WHERE type_id = 'ws_flow' AND parent_type_id = '1' LIMIT 1), 113.36000000, 23.20000000, '供水测试大道9号',
      '供水测试维护员', '13800000009', '供水测试公司', '供水T4流量分页测试设备',
      now() - interval '7 days', now(), '0', '供水测试区'),
-    ('WS-TEST-EQ-FLOW-006', 'WS-TEST-FLOW-006', '测试流量监测点06', 'FLOW-TEST-006',
+    ('WS-TEST-EQ-FLOW-006', 'CN-GS-202609020007', '测试流量监测点06', 'FLOW-TEST-006',
      (SELECT id FROM app_user.equipment_type WHERE type_id = 'ws_flow' AND parent_type_id = '1' LIMIT 1), 113.37000000, 23.21000000, '供水测试大道10号',
      '供水测试维护员', '13800000010', '供水测试公司', '供水T4流量分页测试设备',
      now() - interval '7 days', now(), '0', '供水测试区'),
-    ('WS-TEST-EQ-FLOW-007', 'WS-TEST-FLOW-007', '测试流量监测点07', 'FLOW-TEST-007',
+    ('WS-TEST-EQ-FLOW-007', 'CN-GS-202609020008', '测试流量监测点07', 'FLOW-TEST-007',
      (SELECT id FROM app_user.equipment_type WHERE type_id = 'ws_flow' AND parent_type_id = '1' LIMIT 1), 113.38000000, 23.22000000, '供水测试大道11号',
      '供水测试维护员', '13800000011', '供水测试公司', '供水T4流量分页测试设备',
      now() - interval '7 days', now(), '0', '供水测试区'),
-    ('WS-TEST-EQ-FLOW-008', 'WS-TEST-FLOW-008', '测试流量监测点08', 'FLOW-TEST-008',
+    ('WS-TEST-EQ-FLOW-008', 'CN-GS-202609020009', '测试流量监测点08', 'FLOW-TEST-008',
      (SELECT id FROM app_user.equipment_type WHERE type_id = 'ws_flow' AND parent_type_id = '1' LIMIT 1), 113.39000000, 23.23000000, '供水测试大道12号',
      '供水测试维护员', '13800000012', '供水测试公司', '供水T4流量分页测试设备',
      now() - interval '7 days', now(), '0', '供水测试区'),
-    ('WS-TEST-EQ-FLOW-009', 'WS-TEST-FLOW-009', '测试流量监测点09', 'FLOW-TEST-009',
+    ('WS-TEST-EQ-FLOW-009', 'CN-GS-202609020010', '测试流量监测点09', 'FLOW-TEST-009',
      (SELECT id FROM app_user.equipment_type WHERE type_id = 'ws_flow' AND parent_type_id = '1' LIMIT 1), 113.40000000, 23.24000000, '供水测试大道13号',
      '供水测试维护员', '13800000013', '供水测试公司', '供水T4流量分页测试设备',
      now() - interval '7 days', now(), '0', '供水测试区'),
-    ('WS-TEST-EQ-FLOW-010', 'WS-TEST-FLOW-010', '测试流量监测点10', 'FLOW-TEST-010',
+    ('WS-TEST-EQ-FLOW-010', 'CN-GS-202609020011', '测试流量监测点10', 'FLOW-TEST-010',
      (SELECT id FROM app_user.equipment_type WHERE type_id = 'ws_flow' AND parent_type_id = '1' LIMIT 1), 113.41000000, 23.25000000, '供水测试大道14号',
      '供水测试维护员', '13800000014', '供水测试公司', '供水T4流量分页测试设备',
      now() - interval '7 days', now(), '0', '供水测试区'),
-    ('WS-TEST-EQ-FLOW-011', 'WS-TEST-FLOW-011', '测试流量监测点11', 'FLOW-TEST-011',
+    ('WS-TEST-EQ-FLOW-011', 'CN-GS-202609020012', '测试流量监测点11', 'FLOW-TEST-011',
      (SELECT id FROM app_user.equipment_type WHERE type_id = 'ws_flow' AND parent_type_id = '1' LIMIT 1), 113.42000000, 23.26000000, '供水测试大道15号',
      '供水测试维护员', '13800000015', '供水测试公司', '供水T4流量分页测试设备',
      now() - interval '7 days', now(), '0', '供水测试区'),
-    ('WS-TEST-EQ-FLOW-012', 'WS-TEST-FLOW-012', '测试流量监测点12', 'FLOW-TEST-012',
+    ('WS-TEST-EQ-FLOW-012', 'CN-GS-202609020013', '测试流量监测点12', 'FLOW-TEST-012',
      (SELECT id FROM app_user.equipment_type WHERE type_id = 'ws_flow' AND parent_type_id = '1' LIMIT 1), 113.43000000, 23.27000000, '供水测试大道16号',
      '供水测试维护员', '13800000016', '供水测试公司', '供水T4流量分页测试设备',
      now() - interval '7 days', now(), '0', '供水测试区'),
-    ('WS-TEST-EQ-PRESSURE-002', 'WS-TEST-PRESSURE-002', '测试压力监测点02', 'PRESSURE-TEST-002',
+    ('WS-TEST-EQ-PRESSURE-002', 'CB-GS-202609020002', '测试压力监测点02', 'PRESSURE-TEST-002',
      (SELECT id FROM app_user.equipment_type WHERE type_id = 'ws_pressure' AND parent_type_id = '1' LIMIT 1), 113.44000000, 23.28000000, '供水测试大道17号',
      '供水测试维护员', '13800000017', '供水测试公司', '供水T4压力分页测试设备',
      now() - interval '7 days', now(), '0', '供水测试区'),
-    ('WS-TEST-EQ-PRESSURE-003', 'WS-TEST-PRESSURE-003', '测试压力监测点03', 'PRESSURE-TEST-003',
+    ('WS-TEST-EQ-PRESSURE-003', 'CB-GS-202609020003', '测试压力监测点03', 'PRESSURE-TEST-003',
      (SELECT id FROM app_user.equipment_type WHERE type_id = 'ws_pressure' AND parent_type_id = '1' LIMIT 1), 113.45000000, 23.29000000, '供水测试大道18号',
      '供水测试维护员', '13800000018', '供水测试公司', '供水T4压力分页测试设备',
      now() - interval '7 days', now(), '0', '供水测试区'),
-    ('WS-TEST-EQ-LEAKAGE-002', 'WS-TEST-LEAKAGE-002', '测试漏失监测点02', 'LEAKAGE-TEST-002',
+    ('WS-TEST-EQ-LEAKAGE-002', 'TC-GS-202609020002', '测试漏失监测点02', 'LEAKAGE-TEST-002',
      (SELECT id FROM app_user.equipment_type WHERE type_id = 'ws_leak' AND parent_type_id = '1' LIMIT 1), 113.46000000, 23.30000000, '供水测试大道19号',
      '供水测试维护员', '13800000019', '供水测试公司', '供水T4漏失分页测试设备',
      now() - interval '7 days', now(), '0', '供水测试区'),
-    ('WS-TEST-EQ-LEAKAGE-003', 'WS-TEST-LEAKAGE-003', '测试漏失监测点03', 'LEAKAGE-TEST-003',
+    ('WS-TEST-EQ-LEAKAGE-003', 'TC-GS-202609020003', '测试漏失监测点03', 'LEAKAGE-TEST-003',
      (SELECT id FROM app_user.equipment_type WHERE type_id = 'ws_leak' AND parent_type_id = '1' LIMIT 1), 113.47000000, 23.31000000, '供水测试大道20号',
      '供水测试维护员', '13800000020', '供水测试公司', '供水T4漏失分页测试设备',
      now() - interval '7 days', now(), '0', '供水测试区'),
-    ('WS-TEST-EQ-OTHER-FLOW', 'WS-TEST-OTHER-FLOW', '测试非供水流量监测点', 'OTHER-FLOW-TEST',
+    ('WS-TEST-EQ-OTHER-FLOW', 'CN-RQ-202609020001', '测试非供水流量监测点', 'OTHER-FLOW-TEST',
      (SELECT id FROM app_user.equipment_type
        WHERE id <> '1' AND type_id NOT IN ('water_supply', 'ws_flow', 'ws_pressure', 'ws_leak')
        LIMIT 1), 113.33000000, 23.17000000, '其他系统测试大道6号',
@@ -142,18 +144,18 @@ VALUES
 INSERT INTO app_user.radar_data
     (id, system_identifier, device_code, meter1_instant_flow, flow_speed, create_time)
 VALUES
-    ('WS-TEST-RADAR-FLOW-001', 'WS-TEST-SYSTEM', 'WS-TEST-FLOW-RADAR', '30', '1.20',
+    ('WS-TEST-RADAR-FLOW-001', 'WS-TEST-SYSTEM', 'CN-GS-202609020001', '30', '1.20',
      now() - interval '3 hours'),
-    ('WS-TEST-RADAR-FLOW-002', 'WS-TEST-SYSTEM', 'WS-TEST-FLOW-RADAR', '120', '3.50',
+    ('WS-TEST-RADAR-FLOW-002', 'WS-TEST-SYSTEM', 'CN-GS-202609020001', '120', '3.50',
      now() - interval '1 hour'),
-    ('WS-TEST-RADAR-FLOW-003', 'WS-TEST-SYSTEM', 'WS-TEST-FLOW-RADAR', '18', '0.80',
+    ('WS-TEST-RADAR-FLOW-003', 'WS-TEST-SYSTEM', 'CN-GS-202609020001', '18', '0.80',
      now() - interval '5 days'),
-    ('WS-TEST-RADAR-FLOW-004', 'WS-TEST-SYSTEM', 'WS-TEST-FLOW-003', '25', '1.00', now() - interval '1 hour'),
-    ('WS-TEST-RADAR-FLOW-005', 'WS-TEST-SYSTEM', 'WS-TEST-FLOW-004', '35', '1.10', now() - interval '2 hours'),
-    ('WS-TEST-RADAR-FLOW-006', 'WS-TEST-SYSTEM', 'WS-TEST-FLOW-005', '45', '1.20', now() - interval '3 hours'),
-    ('WS-TEST-RADAR-FLOW-007', 'WS-TEST-SYSTEM', 'WS-TEST-FLOW-006', '55', '1.30', now() - interval '4 hours'),
-    ('WS-TEST-RADAR-FLOW-008', 'WS-TEST-SYSTEM', 'WS-TEST-FLOW-007', '65', '1.40', now() - interval '5 hours'),
-    ('WS-TEST-RADAR-OTHER-FLOW-001', 'WS-TEST-SYSTEM', 'WS-TEST-OTHER-FLOW', '66', '2.00',
+    ('WS-TEST-RADAR-FLOW-004', 'WS-TEST-SYSTEM', 'CN-GS-202609020004', '25', '1.00', now() - interval '1 hour'),
+    ('WS-TEST-RADAR-FLOW-005', 'WS-TEST-SYSTEM', 'CN-GS-202609020005', '35', '1.10', now() - interval '2 hours'),
+    ('WS-TEST-RADAR-FLOW-006', 'WS-TEST-SYSTEM', 'CN-GS-202609020006', '45', '1.20', now() - interval '3 hours'),
+    ('WS-TEST-RADAR-FLOW-007', 'WS-TEST-SYSTEM', 'CN-GS-202609020007', '55', '1.30', now() - interval '4 hours'),
+    ('WS-TEST-RADAR-FLOW-008', 'WS-TEST-SYSTEM', 'CN-GS-202609020008', '65', '1.40', now() - interval '5 hours'),
+    ('WS-TEST-RADAR-OTHER-FLOW-001', 'WS-TEST-SYSTEM', 'CN-RQ-202609020001', '66', '2.00',
      now() - interval '1 hour');
 
 -- ------------------------------------------------------------
@@ -163,21 +165,21 @@ INSERT INTO app_user.telemetry_data
     (id, system_identifier, device_code, meter1_instant_flow, meter1_positive_total,
      flow_speed, temperature, create_time)
 VALUES
-    ('WS-TEST-TELEMETRY-001', 'WS-TEST-SYSTEM', 'WS-TEST-FLOW-TELEMETRY', '42', '12345',
+    ('WS-TEST-TELEMETRY-001', 'WS-TEST-SYSTEM', 'CN-GS-202609020002', '42', '12345',
      '1.80', '24.50', now() - interval '2 hours'),
-    ('WS-TEST-TELEMETRY-002', 'WS-TEST-SYSTEM', 'WS-TEST-FLOW-TELEMETRY', '36', '12300',
+    ('WS-TEST-TELEMETRY-002', 'WS-TEST-SYSTEM', 'CN-GS-202609020002', '36', '12300',
      '1.50', '24.00', now() - interval '4 hours'),
-    ('WS-TEST-TELEMETRY-003', 'WS-TEST-SYSTEM', 'WS-TEST-FLOW-TELEMETRY', '20', '12200',
+    ('WS-TEST-TELEMETRY-003', 'WS-TEST-SYSTEM', 'CN-GS-202609020002', '20', '12200',
      '0.90', '23.50', now() - interval '5 days');
 INSERT INTO app_user.telemetry_data
     (id, system_identifier, device_code, meter1_instant_flow, meter1_positive_total,
      flow_speed, temperature, create_time)
 VALUES
-    ('WS-TEST-TELEMETRY-004', 'WS-TEST-SYSTEM', 'WS-TEST-FLOW-008', '18', '10008', '0.80', '23.80', now() - interval '1 hour'),
-    ('WS-TEST-TELEMETRY-005', 'WS-TEST-SYSTEM', 'WS-TEST-FLOW-009', '28', '10009', '0.90', '23.90', now() - interval '2 hours'),
-    ('WS-TEST-TELEMETRY-006', 'WS-TEST-SYSTEM', 'WS-TEST-FLOW-010', '38', '10010', '1.00', '24.10', now() - interval '3 hours'),
-    ('WS-TEST-TELEMETRY-007', 'WS-TEST-SYSTEM', 'WS-TEST-FLOW-011', '48', '10011', '1.10', '24.20', now() - interval '4 hours'),
-    ('WS-TEST-TELEMETRY-008', 'WS-TEST-SYSTEM', 'WS-TEST-FLOW-012', '58', '10012', '1.20', '24.30', now() - interval '5 hours');
+    ('WS-TEST-TELEMETRY-004', 'WS-TEST-SYSTEM', 'CN-GS-202609020009', '18', '10008', '0.80', '23.80', now() - interval '1 hour'),
+    ('WS-TEST-TELEMETRY-005', 'WS-TEST-SYSTEM', 'CN-GS-202609020010', '28', '10009', '0.90', '23.90', now() - interval '2 hours'),
+    ('WS-TEST-TELEMETRY-006', 'WS-TEST-SYSTEM', 'CN-GS-202609020011', '38', '10010', '1.00', '24.10', now() - interval '3 hours'),
+    ('WS-TEST-TELEMETRY-007', 'WS-TEST-SYSTEM', 'CN-GS-202609020012', '48', '10011', '1.10', '24.20', now() - interval '4 hours'),
+    ('WS-TEST-TELEMETRY-008', 'WS-TEST-SYSTEM', 'CN-GS-202609020013', '58', '10012', '1.20', '24.30', now() - interval '5 hours');
 
 -- ------------------------------------------------------------
 -- 4. 消防压力数据(telemetering_station 与 equipment_base.equipment_code 关联)
@@ -186,19 +188,19 @@ INSERT INTO app_user.firefighting_pressure
     (id, central_station, telemetering_station, sending_time, observed_time,
      pressure_value, create_time)
 VALUES
-    ('WS-TEST-PRESSURE-001', 'WS-TEST-CENTER', 'WS-TEST-PRESSURE',
+    ('WS-TEST-PRESSURE-001', 'WS-TEST-CENTER', 'CB-GS-202609020001',
      now() - interval '3 hours', now() - interval '3 hours', 0.42, now() - interval '3 hours'),
-    ('WS-TEST-PRESSURE-002', 'WS-TEST-CENTER', 'WS-TEST-PRESSURE',
+    ('WS-TEST-PRESSURE-002', 'WS-TEST-CENTER', 'CB-GS-202609020001',
      now() - interval '1 hour', now() - interval '1 hour', 0.95, now() - interval '1 hour'),
-    ('WS-TEST-PRESSURE-003', 'WS-TEST-CENTER', 'WS-TEST-PRESSURE',
+    ('WS-TEST-PRESSURE-003', 'WS-TEST-CENTER', 'CB-GS-202609020001',
      now() - interval '5 days', now() - interval '5 days', 0.20, now() - interval '5 days');
 INSERT INTO app_user.firefighting_pressure
     (id, central_station, telemetering_station, sending_time, observed_time,
      pressure_value, create_time)
 VALUES
-    ('WS-TEST-PRESSURE-004', 'WS-TEST-CENTER', 'WS-TEST-PRESSURE-002',
+    ('WS-TEST-PRESSURE-004', 'WS-TEST-CENTER', 'CB-GS-202609020002',
      now() - interval '2 hours', now() - interval '2 hours', 0.55, now() - interval '2 hours'),
-    ('WS-TEST-PRESSURE-005', 'WS-TEST-CENTER', 'WS-TEST-PRESSURE-003',
+    ('WS-TEST-PRESSURE-005', 'WS-TEST-CENTER', 'CB-GS-202609020003',
      now() - interval '1 hour', now() - interval '1 hour', 0.75, now() - interval '1 hour');
 
 -- ------------------------------------------------------------
@@ -207,22 +209,22 @@ VALUES
 INSERT INTO app_user.noise_info
     (encode, power, gain, rms, center_frequency, ts, create_time, update_time)
 VALUES
-    ('WS-TEST-LEAKAGE', 12.00, 2.00, 120, 800.00,
+    ('TC-GS-202609020001', 12.00, 2.00, 120, 800.00,
      to_char(now() - interval '2 hours', 'YYYY-MM-DD HH24:MI:SS'),
      now() - interval '2 hours', now() - interval '2 hours'),
-    ('WS-TEST-LEAKAGE', 9.00, 2.00, 100, 780.00,
+    ('TC-GS-202609020001', 9.00, 2.00, 100, 780.00,
      to_char(now() - interval '4 hours', 'YYYY-MM-DD HH24:MI:SS'),
      now() - interval '4 hours', now() - interval '4 hours'),
-    ('WS-TEST-LEAKAGE', 5.00, 1.00, 80, 700.00,
+    ('TC-GS-202609020001', 5.00, 1.00, 80, 700.00,
      to_char(now() - interval '5 days', 'YYYY-MM-DD HH24:MI:SS'),
      now() - interval '5 days', now() - interval '5 days');
 INSERT INTO app_user.noise_info
     (encode, power, gain, rms, center_frequency, ts, create_time, update_time)
 VALUES
-    ('WS-TEST-LEAKAGE-002', 15.00, 2.50, 125, 820.00,
+    ('TC-GS-202609020002', 15.00, 2.50, 125, 820.00,
      to_char(now() - interval '1 hour', 'YYYY-MM-DD HH24:MI:SS'),
      now() - interval '1 hour', now() - interval '1 hour'),
-    ('WS-TEST-LEAKAGE-003', 18.00, 3.00, 130, 840.00,
+    ('TC-GS-202609020003', 18.00, 3.00, 130, 840.00,
      to_char(now() - interval '2 hours', 'YYYY-MM-DD HH24:MI:SS'),
      now() - interval '2 hours', now() - interval '2 hours');
 
@@ -233,6 +235,6 @@ VALUES
 --   流量分页 flowMin=20&flowMax=40:符合范围的雷达/遥测点共7条(含回退到雷达30、遥测36);
 --   压力分页 pressureMin=0.30&pressureMax=0.60:0.42、0.55,共2条;
 --   漏失分页 powerMin=8&powerMax=15:12、15,共2条;
---   WS-TEST-FLOW-EMPTY 无测量数据,不应出现在任何监测页。
---   WS-TEST-OTHER-FLOW 如数据库存在其他系统类型则带入该类型;不在供水规范子类型内,不应出现在监测页。
+--   CN-GS-202609020003 无测量数据,不应出现在任何监测页。
+--   CN-RQ-202609020001 如数据库存在其他系统类型则带入该类型;不在供水规范子类型内,不应出现在监测页。
 -- ============================================================