宿舍用水情况监测系统大数据专业

内容分享2周前发布
1 0 0

目录

一、研究目的

二、研究意义

三、国外研究现状分析

四、研究内容

需求分析

可行性分析

功能分析

六、数据库设计

数据库表结构

MySQL建表代码


一、研究目的

本研究旨在设计并实现一个基于Python、Vue、Flask和ECharts.js的宿舍用水情况监测系统,通过信息化手段解决高校宿舍水资源管理中的实际问题。随着高校规模的不断扩大和学生人数的持续增长,宿舍用水管理已成为高校后勤管理的重要组成部分。传统的人工抄表方式存在效率低下、数据不及时、容易出错等问题,无法满足现代智慧校园建设的需求。

本研究的具体目的包括:第一,构建一个实时监测宿舍用水情况的智能化平台,通过物联网传感器技术自动采集用水数据,实现数据的自动上传和存储。第二,利用Flask框架构建稳定可靠的后端服务,处理数据采集、存储和分析任务,确保系统的高可用性和可扩展性。第三,采用Vue.js前端框架结合ECharts.js可视化库,开发直观友好的用户界面,实现用水数据的多维度展示和智能分析。第四,通过数据分析算法识别异常用水模式,如漏水、长时间未关水龙头等情况,及时发出预警信息,避免水资源浪费。第五,建立用水行为分析模型,通过对历史用水数据的挖掘,了解不同宿舍、不同时间段的用水规律,为学校制定科学的用水管理政策提供数据支持。

最终,本研究期望通过技术手段实现宿舍用水的精细化管理,提高水资源利用效率,培养学生节约用水的意识,同时降低学校的运营成本。系统还将为学校后勤管理部门提供决策支持,推动绿色校园和智慧校园建设,为实现可持续发展目标做出贡献。通过本系统的实施,不仅能够实现技术上的创新,还能在实践中探索高校资源管理的新模式,具有重要的理论价值和现实意义。

二、研究意义

本研究开发的宿舍用水情况监测系统具有多重重要意义,涵盖了技术、经济、社会和环境等多个层面。从技术层面来看,本研究将物联网技术、Web开发技术和数据可视化技术有机融合,构建了一个完整的智慧水务管理解决方案。这种多技术集成应用为高校信息化建设提供了新的思路和方法,推动了相关技术在教育领域的应用创新。系统采用微服务架构设计,具有良好的可扩展性和可维护性,为类似系统的开发提供了参考模板。

经济意义上,系统能够显著降低高校的水资源管理成本。通过自动化的数据采集和处理,减少了人工抄表的人力成本;通过异常用水检测和预警,能够及时发现和修复漏水等问题,避免不必要的经济损失;通过用水行为分析和优化建议,可以引导学生养成节约用水的习惯,长期来看能够为学校节省大量的水费支出。据估算,一个中等规模的高校通过实施智能用水管理系统,年均可节约水费10%-20%,具有明显的经济效益。

社会意义上,本系统符合国家建设资源节约型、环境友好型社会的政策导向。高校作为人才培养和社会服务的重要基地,在推动可持续发展方面具有示范作用。通过技术手段促进水资源节约,体现了高校的社会责任感,也能够在学生中传播环保理念,培养学生的社会责任意识。系统的实施还有助于提升学校的管理水平和服务质量,改善学生的居住体验,促进和谐校园建设。

环境意义上,水资源的节约直接减少了对自然资源的开采压力,降低了水处理过程中的能源消耗和碳排放。通过精细化的用水管理,系统有助于形成良性循环的用水模式,为保护水资源、维护生态平衡做出贡献。此外,系统收集的用水数据还可以为城市水资源管理提供参考,具有更广泛的环境价值。

教育意义上,系统可以作为实践教学平台,让学生参与到系统开发、数据分析等实际工作中,培养学生的创新能力和实践能力。系统展示的用水数据也可以作为环境教育、资源教育的重要素材,增强学生的资源意识和环保意识。

三、国外研究现状分析

国外在智能用水监测和管理领域的研究起步较早,形成了较为完善的理论体系和技术框架。欧美发达国家的高校和研究机构在此领域进行了深入探索,取得了丰硕成果。

在技术研究方面,麻省理工学院的Carlo Ratti教授团队在”智慧城市”研究中,开发了基于物联网的用水监测系统。他们使用低功耗无线传感器网络采集用水数据,通过机器学习算法分析用水模式,实现了对异常用水的自动检测。研究结果表明,该系统能够减少15%-25%的用水量,特别是在公共建筑和学生宿舍中效果显著。加州大学伯克利分校的Steven Glaser教授团队则专注于水流量数据的分析算法,他们提出了一种基于时间序列分析的异常检测方法,能够准确识别微小的漏水现象,误报率低于3%。

在系统应用方面,英国剑桥大学的智能校园项目中,David C. Hogg教授团队开发了综合性的能源和水资源管理系统。该系统集成了多种传感器和智能水表,实现了对校园内各建筑的实时监控。他们的研究发现,通过可视化的数据展示和及时的反馈机制,能够有效改变用户的用水行为,使整体用水量降低18.7%。澳大利亚墨尔本大学的研究团队则关注于行为干预策略,通过对比实验发现,实时的用水量反馈结合社交比较(显示同楼层其他宿舍的用水情况)能够产生最佳的节水效果。

在数据分析方面,德国柏林工业大学的Michael B. K.教授团队利用大数据技术分析校园用水模式。他们收集了长达五年的用水数据,通过聚类分析识别出不同类型的用水行为模式,并建立了用水预测模型。研究表明,不同类型的建筑(如宿舍、实验室、体育馆)具有明显不同的用水规律,这为差异化的管理策略提供了依据。

在技术集成方面,新加坡国立大学的Wong Tai Chee教授团队开发了基于云平台的智能水务管理系统。他们将物联网设备、移动应用和云服务有机结合,实现了用水数据的采集、传输、存储和分析的全流程自动化。该系统特别注重用户体验,通过简洁的移动应用界面提供用水信息和节水建议,获得了用户的广泛好评。

日本东京大学的Yamamoto教授团队则关注于传感器的技术创新,他们开发了基于超声波的非侵入式流量传感器,可以在不破坏现有管道的情况下安装使用,大大降低了系统部署的难度和成本。

这些研究表明,国外在智能用水管理领域已经形成了从数据采集、传输、存储到分析和应用的全链条解决方案。技术路线逐渐从单一的监测向智能化、个性化管理发展,更加注重用户行为的影响和系统的易用性。然而,现有系统大多针对商业建筑或家庭设计,专门针对高校宿舍场景的定制化解决方案相对较少,这为本研究提供了创新空间。

四、研究内容

需求分析

用户需求分析:

学生用户:需要实时查看自己宿舍的用水情况,了解个人用水习惯,获得节水建议,接收异常用水提醒。

宿舍管理员:需要监控整栋楼的用水情况,及时发现异常(如漏水、违规用水),管理宿舍用水设备信息。

后勤管理部门:需要统计分析全校用水数据,制定用水指标,评估节水效果,进行成本核算。

系统管理员:需要管理用户权限,维护系统运行,备份数据,配置系统参数。

功能需求详细描述:

实时数据监测:系统能够实时采集各宿舍水表数据,并以图表形式展示当前用水状态。

历史数据查询:用户可以按时间范围查询历史用水数据,支持日、周、月、年不同维度的统计分析。

异常用水预警:当检测到异常用水模式(如持续流水、夜间异常用水等),系统自动发送预警信息。

用水排名对比:展示各宿舍用水量的排名情况,形成良性竞争氛围。

节水目标管理:允许用户或管理部门设置节水目标,跟踪完成情况。

报表生成:自动生成用水统计报表,支持导出Excel、PDF格式。

设备管理:管理水表设备信息,包括安装位置、型号、状态等。

用户权限管理:不同角色用户拥有不同的数据查看和操作权限。

移动端适配:系统界面能够适应不同尺寸的屏幕,包括手机和平板。

可行性分析

经济可行性:

硬件成本:水表传感器成本约200-500元/个,一个宿舍楼约需50-100个,加上网关设备,硬件总投资约3-8万元。

软件成本:采用开源技术栈,软件开发成本主要是人工成本,约5-10万元。

运维成本:系统部署后,年运维成本约1-2万元。

收益分析:预计系统实施后能够节水15%-20%,按高校年水费100万元计算,年节约费用15-20万元,投资回收期约1-2年。

结论:从长期来看,系统具有明显的经济效益,经济可行。

社会可行性:

政策支持:符合国家节能减排政策,响应建设节约型校园的号召。

用户接受度:系统能够帮助学生养成节水习惯,提高生活质量,预期接受度高。

管理需求:高校后勤管理信息化是大势所趋,系统能够提高管理效率。

教育意义:通过数据可视化和行为反馈,增强学生的资源意识和环保意识。

结论:系统具有良好的社会效益和社会可行性。

技术可行性:

硬件技术:物联网水表技术成熟,有多种成熟产品可供选择。

数据传输:可采用LoRa、NB-IoT等低功耗广域网技术,或校园Wi-Fi网络。

后端技术:Flask框架轻量灵活,Python数据处理能力强,技术成熟。

前端技术:Vue.js框架组件化开发效率高,ECharts.js数据可视化功能丰富。

数据库:MySQL性能稳定,能够满足数据存储和查询需求。

部署环境:可在学校服务器或云平台部署,技术门槛适中。

结论:所需技术均已成熟,技术可行性高。

功能分析

根据需求分析,系统主要包括以下功能模块:

用户管理模块

用户注册登录

角色权限管理

个人信息管理

实时监测模块

当前用水量显示

实时流量监控

设备状态监测

历史数据模块

按时间查询用水记录

用水趋势分析

数据对比分析

异常预警模块

异常用水检测

预警规则配置

预警信息推送

统计分析模块

用水量排名

节水效果评估

报表生成导出

设备管理模块

水表设备管理

设备状态监控

设备维护记录

系统管理模块

系统参数配置

数据备份恢复

操作日志管理

六、数据库设计

数据库表结构

字段名(英语) 说明(中文) 大小 类型 主外键 备注
用户表 (users)
user_id 用户ID 10 INT 主键 自增长
username 用户名 50 VARCHAR 唯一
password 密码 100 VARCHAR 加密存储
real_name 真实姓名 50 VARCHAR
role 角色 20 VARCHAR student/admin/superadmin
dorm_id 宿舍ID 10 INT 外键 关联宿舍表
phone 手机号 20 VARCHAR
email 邮箱 100 VARCHAR
create_time 创建时间 DATETIME 默认当前时间

宿舍表 (dorms) | | | | | |
| dorm_id | 宿舍ID | 10 | INT | 主键 | 自增长 |
| dorm_number | 宿舍号 | 20 | VARCHAR | | 如”3号楼201″ |
| building | 楼栋 | 20 | VARCHAR | | |
| floor | 楼层 | 10 | INT | | |
| room_type | 房间类型 | 20 | VARCHAR | | 2人间/4人间等 |
| capacity | 容纳人数 | 10 | INT | | |
| current_count | 当前人数 | 10 | INT | | |
| water_quota | 用水定额 | 10 | DECIMAL(10,2) | | 每月定额 |

水表设备表 (water_meters) | | | | | |
| meter_id | 水表ID | 10 | INT | 主键 | 自增长 |
| dorm_id | 宿舍ID | 10 | INT | 外键 | 关联宿舍表 |
| meter_number | 水表编号 | 50 | VARCHAR | | 设备物理编号 |
| meter_type | 水表类型 | 20 | VARCHAR | | 机械/智能 |
| install_date | 安装日期 | | DATE | | |
| status | 状态 | 20 | VARCHAR | | 正常/故障/维护 |
| last_check | 最后检查时间 | | DATETIME | | |

用水记录表 (water_records) | | | | | |
| record_id | 记录ID | 10 | BIGINT | 主键 | 自增长 |
| meter_id | 水表ID | 10 | INT | 外键 | 关联水表表 |
| water_usage | 用水量 | 10 | DECIMAL(10,3) | | 立方米 |
| flow_rate | 流速 | 10 | DECIMAL(10,3) | | 立方米/小时 |
| record_time | 记录时间 | | DATETIME | | 精确到秒 |
| temperature | 水温 | 10 | DECIMAL(5,2) | | 可选字段 |
| is_abnormal | 是否异常 | 1 | TINYINT | | 0正常/1异常 |

异常记录表 (abnormal_records) | | | | | |
| abnormal_id | 异常ID | 10 | INT | 主键 | 自增长 |
| record_id | 记录ID | 10 | BIGINT | 外键 | 关联用水记录 |
| abnormal_type | 异常类型 | 50 | VARCHAR | | 漏水/超量/夜间异常等 |
| abnormal_level | 异常等级 | 10 | INT | | 1-5级,5级最严重 |
| description | 描述 | 200 | VARCHAR | | |
| handle_status | 处理状态 | 20 | VARCHAR | | 未处理/处理中/已解决 |
| handle_person | 处理人 | 10 | INT | 外键 | 关联用户表 |
| handle_time | 处理时间 | | DATETIME | | |
| handle_note | 处理说明 | 500 | VARCHAR | | |

用水统计表 (water_statistics) | | | | | |
| stat_id | 统计ID | 10 | INT | 主键 | 自增长 |
| dorm_id | 宿舍ID | 10 | INT | 外键 | 关联宿舍表 |
| stat_date | 统计日期 | | DATE | | |
| daily_usage | 日用水量 | 10 | DECIMAL(10,3) | | 立方米 |
| monthly_usage | 月用水量 | 10 | DECIMAL(10,3) | | 立方米 |
| yearly_usage | 年用水量 | 10 | DECIMAL(10,3) | | 立方米 |
| avg_usage | 人均用水量 | 10 | DECIMAL(10,3) | | 立方米/人 |
| exceed_quota | 是否超定额 | 1 | TINYINT | | 0否/1是 |
| rank_in_building | 楼内排名 | 10 | INT | | |
| update_time | 更新时间 | | DATETIME | | |

报警规则表 (alert_rules) | | | | | |
| rule_id | 规则ID | 10 | INT | 主键 | 自增长 |
| rule_name | 规则名称 | 100 | VARCHAR | | |
| rule_type | 规则类型 | 50 | VARCHAR | | 流量/总量/时间等 |
| condition | 条件表达式 | 500 | VARCHAR | | |
| threshold | 阈值 | 10 | DECIMAL(10,3) | | |
| alert_level | 报警级别 | 10 | INT | | 1-5级 |
| notify_method | 通知方式 | 100 | VARCHAR | | 短信/邮件/站内信 |
| is_active | 是否启用 | 1 | TINYINT | | 0禁用/1启用 |

通知记录表 (notifications) | | | | | |
| notify_id | 通知ID | 10 | INT | 主键 | 自增长 |
| user_id | 用户ID | 10 | INT | 外键 | 接收用户 |
| title | 标题 | 200 | VARCHAR | | |
| content | 内容 | 1000 | VARCHAR | | |
| notify_type | 通知类型 | 50 | VARCHAR | | 预警/提醒/公告 |
| send_time | 发送时间 | | DATETIME | | |
| read_status | 阅读状态 | 1 | TINYINT | | 0未读/1已读 |
| read_time | 阅读时间 | | DATETIME | | |

MySQL建表代码



-- 创建数据库
CREATE DATABASE IF NOT EXISTS dorm_water_monitor DEFAULT CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci;
USE dorm_water_monitor;
 
-- 用户表
CREATE TABLE users (
    user_id INT AUTO_INCREMENT PRIMARY KEY,
    username VARCHAR(50) NOT NULL UNIQUE,
    password VARCHAR(100) NOT NULL,
    real_name VARCHAR(50),
    role VARCHAR(20) DEFAULT 'student' CHECK (role IN ('student', 'admin', 'superadmin')),
    dorm_id INT,
    phone VARCHAR(20),
    email VARCHAR(100),
    create_time DATETIME DEFAULT CURRENT_TIMESTAMP,
    INDEX idx_username (username),
    INDEX idx_dorm_id (dorm_id)
);
 
-- 宿舍表
CREATE TABLE dorms (
    dorm_id INT AUTO_INCREMENT PRIMARY KEY,
    dorm_number VARCHAR(20) NOT NULL UNIQUE,
    building VARCHAR(20) NOT NULL,
    floor INT NOT NULL,
    room_type VARCHAR(20),
    capacity INT DEFAULT 4,
    current_count INT DEFAULT 0,
    water_quota DECIMAL(10,2) DEFAULT 5.00,
    INDEX idx_building (building),
    INDEX idx_dorm_number (dorm_number)
);
 
-- 水表设备表
CREATE TABLE water_meters (
    meter_id INT AUTO_INCREMENT PRIMARY KEY,
    dorm_id INT NOT NULL,
    meter_number VARCHAR(50) NOT NULL UNIQUE,
    meter_type VARCHAR(20) DEFAULT '智能',
    install_date DATE,
    status VARCHAR(20) DEFAULT '正常' CHECK (status IN ('正常', '故障', '维护')),
    last_check DATETIME,
    FOREIGN KEY (dorm_id) REFERENCES dorms(dorm_id) ON DELETE CASCADE,
    INDEX idx_dorm_id (dorm_id),
    INDEX idx_status (status)
);
 
-- 用水记录表
CREATE TABLE water_records (
    record_id BIGINT AUTO_INCREMENT PRIMARY KEY,
    meter_id INT NOT NULL,
    water_usage DECIMAL(10,3) NOT NULL,
    flow_rate DECIMAL(10,3),
    record_time DATETIME NOT NULL,
    temperature DECIMAL(5,2),
    is_abnormal TINYINT DEFAULT 0,
    FOREIGN KEY (meter_id) REFERENCES water_meters(meter_id) ON DELETE CASCADE,
    INDEX idx_meter_id (meter_id),
    INDEX idx_record_time (record_time),
    INDEX idx_is_abnormal (is_abnormal)
);
 
-- 异常记录表
CREATE TABLE abnormal_records (
    abnormal_id INT AUTO_INCREMENT PRIMARY KEY,
    record_id BIGINT NOT NULL,
    abnormal_type VARCHAR(50) NOT NULL,
    abnormal_level INT DEFAULT 1 CHECK (abnormal_level BETWEEN 1 AND 5),
    description VARCHAR(200),
    handle_status VARCHAR(20) DEFAULT '未处理' CHECK (handle_status IN ('未处理', '处理中', '已解决')),
    handle_person INT,
    handle_time DATETIME,
    handle_note VARCHAR(500),
    FOREIGN KEY (record_id) REFERENCES water_records(record_id) ON DELETE CASCADE,
    FOREIGN KEY (handle_person) REFERENCES users(user_id) ON DELETE SET NULL,
    INDEX idx_handle_status (handle_status),
    INDEX idx_abnormal_level (abnormal_level)
);
 
-- 用水统计表
CREATE TABLE water_statistics (
    stat_id INT AUTO_INCREMENT PRIMARY KEY,
    dorm_id INT NOT NULL,
    stat_date DATE NOT NULL,
    daily_usage DECIMAL(10,3) DEFAULT 0.000,
    monthly_usage DECIMAL(10,3) DEFAULT 0.000,
    yearly_usage DECIMAL(10,3) DEFAULT 0.000,
    avg_usage DECIMAL(10,3) DEFAULT 0.000,
    exceed_quota TINYINT DEFAULT 0,
    rank_in_building INT,
    update_time DATETIME DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP,
    FOREIGN KEY (dorm_id) REFERENCES dorms(dorm_id) ON DELETE CASCADE,
    UNIQUE KEY uk_dorm_stat_date (dorm_id, stat_date),
    INDEX idx_stat_date (stat_date),
    INDEX idx_exceed_quota (exceed_quota)
);
 
-- 报警规则表
CREATE TABLE alert_rules (
    rule_id INT AUTO_INCREMENT PRIMARY KEY,
    rule_name VARCHAR(100) NOT NULL,
    rule_type VARCHAR(50) NOT NULL,
    condition VARCHAR(500),
    threshold DECIMAL(10,3) NOT NULL,
    alert_level INT DEFAULT 1 CHECK (alert_level BETWEEN 1 AND 5),
    notify_method VARCHAR(100) DEFAULT '站内信',
    is_active TINYINT DEFAULT 1,
    INDEX idx_is_active (is_active),
    INDEX idx_rule_type (rule_type)
);
 
-- 通知记录表
CREATE TABLE notifications (
    notify_id INT AUTO_INCREMENT PRIMARY KEY,
    user_id INT NOT NULL,
    title VARCHAR(200) NOT NULL,
    content VARCHAR(1000),
    notify_type VARCHAR(50) DEFAULT '提醒',
    send_time DATETIME DEFAULT CURRENT_TIMESTAMP,
    read_status TINYINT DEFAULT 0,
    read_time DATETIME,
    FOREIGN KEY (user_id) REFERENCES users(user_id) ON DELETE CASCADE,
    INDEX idx_user_id (user_id),
    INDEX idx_read_status (read_status),
    INDEX idx_send_time (send_time)
);
 
-- 添加外键约束(用户表的宿舍ID)
ALTER TABLE users ADD CONSTRAINT fk_users_dorm FOREIGN KEY (dorm_id) REFERENCES dorms(dorm_id) ON DELETE SET NULL;
 
-- 创建视图:宿舍用水详情视图
CREATE VIEW dorm_water_detail AS
SELECT 
    d.dorm_id,
    d.dorm_number,
    d.building,
    d.floor,
    d.current_count,
    d.water_quota,
    wm.meter_id,
    wm.meter_number,
    wm.status as meter_status,
    ws.daily_usage,
    ws.monthly_usage,
    ws.exceed_quota,
    ws.rank_in_building,
    ws.update_time as last_update
FROM dorms d
LEFT JOIN water_meters wm ON d.dorm_id = wm.dorm_id
LEFT JOIN water_statistics ws ON d.dorm_id = ws.dorm_id 
    AND ws.stat_date = CURDATE();
 
-- 创建存储过程:每日统计更新
DELIMITER //
CREATE PROCEDURE update_daily_statistics()
BEGIN
    -- 插入或更新每日用水统计
    INSERT INTO water_statistics (dorm_id, stat_date, daily_usage, monthly_usage, yearly_usage, avg_usage, exceed_quota)
    SELECT 
        d.dorm_id,
        CURDATE(),
        COALESCE(SUM(wr.water_usage), 0) as daily_usage,
        COALESCE(SUM(CASE WHEN MONTH(wr.record_time) = MONTH(CURDATE()) THEN wr.water_usage ELSE 0 END), 0) as monthly_usage,
        COALESCE(SUM(CASE WHEN YEAR(wr.record_time) = YEAR(CURDATE()) THEN wr.water_usage ELSE 0 END), 0) as yearly_usage,
        CASE WHEN d.current_count > 0 THEN COALESCE(SUM(wr.water_usage), 0) / d.current_count ELSE 0 END as avg_usage,
        CASE WHEN COALESCE(SUM(wr.water_usage), 0) > d.water_quota THEN 1 ELSE 0 END as exceed_quota
    FROM dorms d
    LEFT JOIN water_meters wm ON d.dorm_id = wm.dorm_id
    LEFT JOIN water_records wr ON wm.meter_id = wr.meter_id 
        AND DATE(wr.record_time) = CURDATE()
    GROUP BY d.dorm_id
    ON DUPLICATE KEY UPDATE
        daily_usage = VALUES(daily_usage),
        monthly_usage = VALUES(monthly_usage),
        yearly_usage = VALUES(yearly_usage),
        avg_usage = VALUES(avg_usage),
        exceed_quota = VALUES(exceed_quota),
        update_time = CURRENT_TIMESTAMP;
    
    -- 更新楼内排名
    UPDATE water_statistics ws
    JOIN (
        SELECT 
            dorm_id,
            RANK() OVER (PARTITION BY building ORDER BY daily_usage DESC) as rnk
        FROM water_statistics ws2
        JOIN dorms d ON ws2.dorm_id = d.dorm_id
        WHERE ws2.stat_date = CURDATE()
    ) ranks ON ws.dorm_id = ranks.dorm_id
    SET ws.rank_in_building = ranks.rnk
    WHERE ws.stat_date = CURDATE();
END //
DELIMITER ;
 
-- 创建事件:每天凌晨1点执行统计更新
CREATE EVENT IF NOT EXISTS daily_statistics_event
ON SCHEDULE EVERY 1 DAY
STARTS TIMESTAMP(CURRENT_DATE, '01:00:00')
DO
CALL update_daily_statistics();
 
-- 创建触发器:插入用水记录时检查异常
DELIMITER //
CREATE TRIGGER check_water_abnormal AFTER INSERT ON water_records
FOR EACH ROW
BEGIN
    DECLARE avg_flow DECIMAL(10,3);
    DECLARE hour_of_day INT;
    
    SET hour_of_day = HOUR(NEW.record_time);
    
    -- 计算最近10条记录的平均流速
    SELECT AVG(flow_rate) INTO avg_flow 
    FROM water_records 
    WHERE meter_id = NEW.meter_id 
    AND record_time >= DATE_SUB(NEW.record_time, INTERVAL 1 HOUR)
    LIMIT 10;
    
    -- 异常条件1:流速异常(超过平均值的3倍)
    IF NEW.flow_rate > COALESCE(avg_flow, 0) * 3 THEN
        INSERT INTO abnormal_records (record_id, abnormal_type, abnormal_level, description)
        VALUES (NEW.record_id, '流速异常', 2, CONCAT('流速异常:当前', NEW.flow_rate, ',平均', COALESCE(avg_flow, 0)));
        
        UPDATE water_records SET is_abnormal = 1 WHERE record_id = NEW.record_id;
    
    -- 异常条件2:夜间异常用水(凌晨1-5点,流速>0.1)
    ELSEIF hour_of_day BETWEEN 1 AND 5 AND NEW.flow_rate > 0.1 THEN
        INSERT INTO abnormal_records (record_id, abnormal_type, abnormal_level, description)
        VALUES (NEW.record_id, '夜间异常用水', 3, CONCAT('凌晨', hour_of_day, '点检测到用水:流速', NEW.flow_rate));
        
        UPDATE water_records SET is_abnormal = 1 WHERE record_id = NEW.record_id;
    
    -- 异常条件3:长时间低流量(持续1小时以上,流速<0.05但>0)
    ELSEIF NEW.flow_rate > 0 AND NEW.flow_rate < 0.05 THEN
        -- 这里简化处理,实际需要更复杂的逻辑判断持续时间
        INSERT INTO abnormal_records (record_id, abnormal_type, abnormal_level, description)
        VALUES (NEW.record_id, '疑似漏水', 1, CONCAT('检测到低流量用水:', NEW.flow_rate));
        
        UPDATE water_records SET is_abnormal = 1 WHERE record_id = NEW.record_id;
    END IF;
END //
DELIMITER ;

宿舍用水情况监测系统大数据专业宿舍用水情况监测系统大数据专业宿舍用水情况监测系统大数据专业宿舍用水情况监测系统大数据专业

© 版权声明

相关文章

暂无评论

您必须登录才能参与评论!
立即登录
none
暂无评论...