目录
一、研究目的
二、研究意义
三、国外研究现状分析
四、研究内容
需求分析
可行性分析
功能分析
六、数据库设计
数据库表结构
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 | ||
| 邮箱 | 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 ;



