news 2026/2/9 17:29:07

【课程6.5】架构设计:水利数据中枢对接(水质传感器→数据清洗→预警模块)

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
【课程6.5】架构设计:水利数据中枢对接(水质传感器→数据清洗→预警模块)

严格基于指定水利水务相关文件(核心为《06行业应用系统功能设计-02水利水务.docx》简称《06-02水利》、《03智慧城市一网统管平台-系统数据库表.docx》简称《03数据库表》、《05智慧城市一网统管平台 数据中枢系统功能设计.docx》简称《05数据中枢》、《01智慧城市一网统管平台-系统总体架构及其功能要点-20251018修订.docx》简称《01总体架构》、《02数据库表设计命名规范及英文简称对照表.docx》简称《02命名规范》),拆解“水质传感器→数据清洗→预警模块”的全链路对接逻辑,所有架构节点、数据流转、模块关联均来自文件原文,不涉及外部信息。

一、架构对接总览:文件依据与核心目标

根据《05数据中枢》20.7节“设备管理”、20.8节“运行监测”、20.9节“预警告警”及《06-02水利》3.2节“水资源监测”描述,水利数据中枢对接的核心目标是实现“水质数据实时接入、标准化清洗、异常自动预警”,解决传统“传感器数据碎片化、清洗无标准、预警响应慢”痛点(《01总体架构》P11“数据驱动闭环”要求)。

核心架构链路(基于文件的三层流转):

graph LR A[水质传感器层] -->|实时采集| B[数据中枢处理层(清洗/存储)] B -->|异常判定| C[预警模块层(触发/推送)] C -->|处置反馈| B[数据中枢处理层(结果归档)]

关键文件支撑:

  • 《05数据中枢》:提供“设备接入网关、数据清洗引擎、预警规则引擎”三大核心模块,是链路中枢;

  • 《03数据库表》:按“基础层(sys_)→业务层(biz_)→统计层(stat_*)”存储各环节数据,符合《02命名规范》;

  • 《06-02水利》:明确水质传感器类型、清洗标准(如pH值范围6.5-8.5)、预警阈值,定义对接边界。

二、第一层:水质传感器层——数据采集源头(文件定义的设备与接入规则)

2.1 传感器类型与数据内容(《06-02水利》《05数据中枢》)

根据《06-02水利》3.2节“水质在线监测”要求,需接入4类核心水质传感器,每类传感器对应明确的数据采集内容,均需关联《03数据库表》的设备基础信息:

传感器类别具体设备(文件依据)采集数据内容(对应《03数据库表》字段)采集频率(文件要求)
pH值传感器在线pH监测仪(《06-02水利》3.2.2节)pH值(ph_value)→ 存储至biz_device_telemetry_data/biz_water_qual_mon实时(10秒/次)
浊度传感器激光浊度仪(《06-02水利》3.2.2节)浊度(turbidity,单位:NTU)→ 存储至上述两表实时(10秒/次)
溶解氧传感器荧光法溶解氧仪(《06-02水利》3.2.4节“生态监测”)溶解氧(dissolved_oxygen,单位:mg/L)→ 存储至上述两表定时(1分钟/次)
余氯传感器在线余氯监测仪(《06-02水利》3.4节“供水保障”)余氯(residual_chlorine,单位:mg/L)→ 存储至上述两表定时(1分钟/次)

2.2 传感器接入规则(《05数据中枢》《01总体架构》)

  1. 接入协议:所有传感器需通过MQTT协议接入《05数据中枢》20.7.3节“设备接入网关”(文件明确协议要求),数据格式为JSON,字段命名需符合《02命名规范》(snake_case),如“pH值”字段名必须为ph_value

  2. 设备注册:传感器需先在《03数据库表》sys_device表完成注册(录入device_code设备编码、device_type=02(水质传感器)、area_code所属区域、fac_id关联监测点),未注册设备数据将被中枢拦截(《05数据中枢》20.7.1节“设备注册管理”);

  3. 数据预处理:传感器采集数据需经过“格式校验+范围初筛”(如pH值需在0-14之间),无效数据(如超出范围、字段缺失)暂存至biz_device_invalid_data(设备无效数据表),并触发“设备数据无效”预警(《05数据中枢》20.7.4节“数据预处理”)。

三、第二层:数据中枢处理层——数据清洗与存储(文件定义的“清洗→关联→存储”闭环)

数据中枢是链路核心,基于《05数据中枢》20.8节“运行监测”模块,实现数据“标准化清洗→多表关联→分层存储”,每环节均关联《03数据库表》。

3.1 第一步:数据清洗(解决“格式不统一、数据异常”)

(1)核心模块:数据清洗引擎(《05数据中枢》20.8.2节)
  • 清洗规则(文件依据)

    1. 格式统一:将传感器上报的非标准单位数据转换为《06-02水利》要求的标准单位(如浊度统一为NTU,溶解氧统一为mg/L);

    2. 异常值剔除:删除超出“水质标准范围”的数据(如pH<6.5或>8.5、浊度>5NTU,标准来自《生活饮用水卫生标准》GB 5749-2022,《06-02水利》P39引用),标记为“异常数据”存入biz_water_qual_abnormal(水质异常数据表);

    3. 冗余去重:删除10秒内同一传感器上报的重复数据(如连续两次pH值均为7.2),保留最新一条;

  • 文件支撑:《05数据中枢》20.8.2节“清洗规则配置”、《06-02水利》3.2节“水质监测标准”。

(2)代码逻辑片段(适配文件表结构)
// 数据清洗Service层(基于Spring Boot+MyBatis-Plus) @Service public class WaterQualCleanService { @Autowired private BizDeviceTelemetryDataMapper telemetryMapper; @Autowired private BizWaterQualMonMapper qualMonMapper; @Autowired private BizWaterQualAbnormalMapper abnormalMapper; /** * 水质数据清洗:格式统一+异常剔除+冗余去重 */ public void cleanWaterQualData(String deviceCode, JSONObject sensorData) { // 1. 格式统一:单位转换(示例:若传感器上报ppm,转换为mg/L) BigDecimal phValue = sensorData.getBigDecimal("ph_value"); BigDecimal turbidity = sensorData.getBigDecimal("turbidity"); // 浊度单位转换(若为度,转换为NTU:1度≈1NTU) if (sensorData.getString("turbidity_unit").equals("degree")) { turbidity = turbidity.multiply(new BigDecimal("1.0")); } // 2. 异常值剔除(基于《06-02水利》水质标准) List<String> abnormalReasons = new ArrayList<>(); if (phValue.compareTo(new BigDecimal("6.5")) < 0 || phValue.compareTo(new BigDecimal("8.5")) > 0) { abnormalReasons.add("pH值超出标准范围(6.5-8.5)"); } if (turbidity.compareTo(new BigDecimal("5")) > 0) { abnormalReasons.add("浊度超出标准范围(≤5NTU)"); } // 3. 异常数据处理:存入异常表并返回 if (!abnormalReasons.isEmpty()) { BizWaterQualAbnormal abnormal = new BizWaterQualAbnormal(); abnormal.setId(UUID.randomUUID().toString()); abnormal.setDeviceCode(deviceCode); abnormal.setAbnormalData(sensorData.toJSONString()); abnormal.setAbnormalReason(String.join(";", abnormalReasons)); abnormal.setCreateTime(new Date()); abnormalMapper.insert(abnormal); return; } // 4. 冗余去重:查询10秒内是否有重复数据 LambdaQueryWrapper<BizDeviceTelemetryData> wrapper = new LambdaQueryWrapper<>(); wrapper.eq(BizDeviceTelemetryData::getDeviceCode, deviceCode) .ge(BizDeviceTelemetryData::getTelemetryTime, DateUtils.addSeconds(new Date(), -10)) .last("limit 1"); if (telemetryMapper.selectCount(wrapper) > 0) { return; // 存在重复数据,不存储 } // 5. 清洗后数据存储(关联《03数据库表》) saveCleanData(deviceCode, phValue, turbidity, sensorData); } // 存储清洗后数据至业务表 private void saveCleanData(String deviceCode, BigDecimal phValue, BigDecimal turbidity, JSONObject sensorData) { // 1. 存储设备遥测表(biz_device_telemetry_data) BizDeviceTelemetryData telemetry = new BizDeviceTelemetryData(); telemetry.setId(UUID.randomUUID().toString()); telemetry.setDeviceCode(deviceCode); telemetry.setPhValue(phValue); telemetry.setTurbidity(turbidity); telemetry.setTelemetryTime(new Date()); telemetryMapper.insert(telemetry); // 2. 关联监测点,存储水质监测表(biz_water_qual_mon) SysDevice device = SpringContextHolder.getBean(SysDeviceMapper.class) .selectOne(new LambdaQueryWrapper<SysDevice>().eq(SysDevice::getDeviceCode, deviceCode)); BizWaterQualMon qualMon = new BizWaterQualMon(); qualMon.setQualId(UUID.randomUUID().toString()); qualMon.setFacId(device.getFacId()); // 关联监测点设施ID qualMon.setPhValue(phValue); qualMon.setTurbidity(turbidity); qualMon.setMonitorTime(new Date()); qualMon.setQualStatus(1); // 1=达标(清洗后无异常) qualMonMapper.insert(qualMon); } }

3.2 第二步:数据关联(解决“数据孤立、无上下文”)

  • 核心逻辑:关联“传感器数据-监测点-行政区划”,补充数据上下文,支撑后续预警与指标计算;

  • 关联关系(《03数据库表》)

    1. 传感器→监测点:通过sys_devicefac_id关联sys_water_fac(水利设施表),获取监测点名称、位置(coord_x/coord_y);

    2. 监测点→行政区划:通过sys_water_facarea_code关联sys_area(行政区划表),获取区域名称(如“杭州市西湖区”);

  • 文件依据:《05数据中枢》20.8.3节“数据关联规则”、《06-02水利》3.2节“监测点区域归属”。

3.3 第三步:分层存储(符合《02命名规范》)

清洗关联后的数据按《03数据库表》分层存储,支撑预警模块调用与后续业务应用:

存储层级对应数据表(《03数据库表》)存储数据类型支撑场景(文件依据)
业务层(biz_*)biz_device_telemetry_data(设备遥测)、biz_water_qual_mon(水质监测)传感器实时清洗后数据、水质监测达标状态预警模块实时异常判定(《05数据中枢》20.9节)、水质达标率计算(6.3节)
业务层(biz_*)biz_water_qual_abnormal(水质异常)清洗剔除的异常数据(如pH<6.5)异常数据追溯、传感器故障排查(《06-02水利》3.2.2节)
统计层(stat_*)stat_water_qual_hour(水质小时统计)每小时水质数据平均值(如pH小时均值、浊度小时均值)水质趋势分析、大屏展示(《07全局总览》)

四、第三层:预警模块层——异常触发与推送(文件定义的“规则判定→预警生成→推送”)

基于《05数据中枢》20.9节“预警告警”模块,实现“水质异常→预警触发→多端推送”,预警逻辑与阈值均来自《06-02水利》。

4.1 预警规则配置(《06-02水利》《05数据中枢》)

(1)预警阈值(文件明确标准)
预警类型触发条件(《06-02水利》P39-P40)预警等级(《03数据库表》sys_dict_warn_level)
pH值异常预警pH<6.5或pH>8.5(持续10秒)高优(1级,红色预警)
浊度异常预警浊度>5NTU(持续30秒)中优(2级,黄色预警)
溶解氧异常预警溶解氧<2mg/L(持续1分钟,生态风险)高优(1级,红色预警)
余氯异常预警余氯<0.2mg/L或>4mg/L(持续1分钟,供水安全)中优(2级,黄色预警)
(2)规则存储(《03数据库表》)

预警规则配置在biz_early_warn_rule(预警规则表),字段如下:

字段名字段含义示例值(pH 异常预警)建议字段类型补充约束 / 说明
rule_id规则唯一标识 IDWARN_RULE_WATER_PH_001VARCHAR(64)主键、非空、唯一,建议按 “业务_类型_序号” 命名
warn_type预警类型(枚举值,标识预警业务场景)WATER_QUAL_PHVARCHAR(32)非空,需关联预警类型字典表(如 WATER_QUAL_PH = 水质 pH 异常)
trigger_condition预警触发条件(可执行的 SQL 条件片段,仅包含指标 + 运算符 + 阈值)ph_value < 6.5 OR ph_value > 8.5TEXT非空,避免复杂函数 / 子查询,统一指标字段命名
trigger_duration触发持续时间(秒,指标满足触发条件的持续时长达标才触发预警)10INT非空、≥0,默认值 0(即时触发)
warn_level预警等级(1 - 高优,2 - 中优,3 - 低优)1TINYINT非空,仅允许 1/2/3 枚举值
fac_type关联设施类型编码(关联设施类型字典表)2VARCHAR(16)非空,如 02 = 水质监测点、01 = 污水泵站

4.2 预警触发与生成(《05数据中枢》20.9.4节)

  • 核心模块:预警规则引擎,定时(10秒/次)查询biz_water_qual_mon的实时数据,匹配biz_early_warn_rule的触发条件;

  • 触发逻辑

    1. biz_water_qual_monph_value持续10秒<6.5,规则引擎判定“pH异常”,生成预警单(biz_early_warn_alert);

    2. 预警单关联fac_id(监测点)、area_code(区域),补充“预警内容”(如“西湖区XX监测点pH值5.8,低于标准6.5”);

  • 文件依据:《05数据中枢》20.9.4节“预警生成逻辑”、《06-02水利》3.2节“水质异常响应”。

4.3 预警推送(多端适配,《04工作台》《07全局总览》)

根据《05数据中枢》20.9.5节“预警推送”要求,预警需推送至3类终端,确保责任人员及时响应:

推送终端推送方式(文件依据)数据来源(《03数据库表》)交互逻辑(文件要求)
《04工作台》WebSocket实时推送至“我的预警”模块(《04工作台》1.4节“消息中心”)biz_early_warn_alert(预警单)、sys_user(责任用户)预警条目标红,点击查看“异常数据曲线+关联监测点地图”
水利指挥大屏弹窗+声光提醒(《07全局总览》3.1节“预警展示”)biz_early_warn_alertstat_water_qual_hour(统计数据)预警弹窗显示“区域+异常指标+处置建议”,地图对应监测点闪烁
责任人员APP推送通知(《06-02水利》3.2节“移动端响应”)biz_early_warn_alertsys_user_role(用户角色)通知含“预警等级+点击处理”按钮,跳转至工单处置页

4.4 预警处置反馈(闭环管理,《01总体架构》P11)

  • 处置流程:责任人员通过《04工作台》接收预警后,生成“水质异常处置工单”(biz_water_dispatch_wo),处置完成后更新工单状态(deal_status=2,已结案);

  • 反馈逻辑:工单结案后,系统自动更新biz_early_warn_alerthandle_status(处置状态=2,已解除),并将处置结果归档至stat_early_warn_handle(预警处置统计表);

  • 文件依据:《05数据中枢》20.10节“指挥协调”、《06-02水利》3.2节“水质异常处置闭环”。

五、架构对接验证:文件合规性与实战适配

根据《06-02水利》3.2节“水质监测验收标准”,需通过3类验证确保对接合规:

验证场景验证步骤预期结果(文件依据)
pH异常预警触发1. 模拟传感器上报pH=5.8(持续10秒);2. 查看预警模块1. 生成pH异常预警单(biz_early_warn_alert);2. 《04工作台》“我的预警”实时接收,地图监测点闪烁(《05数据中枢》20.9节)
数据清洗有效性1. 传感器上报浊度=6NTU(超标准);2. 查看数据表1. 数据存入biz_water_qual_abnormal(异常表);2.biz_water_qual_mon无该数据(《05数据中枢》20.8节)
预警推送及时性1. 触发预警;2. 记录推送时间差推送至《04工作台》延迟≤10秒(《01总体架构》“实时响应”要求)

六、总结:架构对接的文件闭环

“水质传感器→数据清洗→预警模块”的架构对接,完全基于指定文件构建:

  • 数据层:依赖《03数据库表》的sys_*(基础)、biz_*(业务)表,字段命名符合《02命名规范》;

  • 逻辑层:传感器接入、数据清洗、预警触发均遵循《05数据中枢》的模块职责与《06-02水利》的业务标准;

  • 应用层:预警推送适配《04工作台》《07全局总览》,处置反馈形成“监测→预警→处置→归档”闭环,符合《01总体架构》“数据驱动治理”目标。

所有对接节点无外部依赖,仅针对指定文件,确保与一网统管平台整体架构完全兼容。

版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/2/6 3:38:08

Focal Loss入门指南:从理论到简单实现

快速体验 打开 InsCode(快马)平台 https://www.inscode.net输入框内输入如下内容&#xff1a; 在快马平台创建一个面向新手的Focal Loss教学项目。要求&#xff1a;1. 使用Python实现一个简单的二分类神经网络&#xff1b;2. 逐步解释Focal Loss的数学公式&#xff1b;3. 在合…

作者头像 李华
网站建设 2026/2/8 0:12:50

5分钟用快马搭建B树可视化原型

快速体验 打开 InsCode(快马)平台 https://www.inscode.net输入框内输入如下内容&#xff1a; 快速生成一个B树可视化原型&#xff1a;1. 使用React框架 2. 实现动态插入/删除节点功能 3. 实时渲染树形结构 4. 支持缩放和平移视图 5. 提供简单的控制面板。要求代码结构清晰&a…

作者头像 李华
网站建设 2026/2/9 8:20:17

AI助力微PE工具箱:智能脚本编写与自动化维护

快速体验 打开 InsCode(快马)平台 https://www.inscode.net输入框内输入如下内容&#xff1a; 开发一个基于微PE工具箱的AI辅助插件&#xff0c;能够根据用户描述的系统问题自动生成修复脚本。功能包括&#xff1a;1. 自然语言识别用户输入的系统故障描述 2. 自动匹配最佳解决…

作者头像 李华
网站建设 2026/2/6 23:03:52

零基础入门:Figma中文插件安装使用全指南

快速体验 打开 InsCode(快马)平台 https://www.inscode.net输入框内输入如下内容&#xff1a; 制作一个Figma中文插件新手教程&#xff0c;内容包括&#xff1a;1. 插件安装步骤截图指南&#xff1b;2. 基础功能图文详解&#xff1b;3. 常见问题解答&#xff1b;4. 实用技巧小…

作者头像 李华
网站建设 2026/2/7 0:07:11

零基础入门:魔兽世界宏命令制作5分钟教程

快速体验 打开 InsCode(快马)平台 https://www.inscode.net输入框内输入如下内容&#xff1a; 制作一个交互式魔兽世界宏命令新手教程&#xff0c;通过分步引导教用户创建第一个宏。包含&#xff1a;1) 宏界面位置指引动画 2) 拖拽式命令块组装界面 3) 5个基础宏模板&#xf…

作者头像 李华