智慧水务管理系统 - 精河县供水工程综合管理平台

architecture.md 22KB

智慧水务管理系统 — 系统设计文档

版本:v1.0 | 日期:2026-06-14 | 作者:bot_pm


一、技术选型

1.1 总体技术栈

层次 技术 版本要求 选型理由
后端框架 Spring Cloud Alibaba 2024.x 微服务生态成熟,Nacos 服务治理
单体可回退 Spring Boot 3.x 3.3+ 小规模可单体启动,渐进式拆分
前端框架 Vue 3 + TypeScript 3.5+ 生态丰富,GIS 组件支持好
前端 UI Element Plus + ECharts 最新 大屏可视化 + 中后台表单
移动端 Flutter 3.x 3.24+ 一套代码 Android/iOS
网关 Spring Cloud Gateway 匹配 SC 统一入口、限流、鉴权
服务注册/配置 Nacos 2.4+ 服务发现 + 配置中心一体化
认证授权 Sa-Token + OAuth2 最新 轻量级 RBAC,支持 SSO
数据库 PostgreSQL 16 + PostGIS 16+ 空间数据原生支持,替代 Oracle Spatial
时序数据库 TDengine 3.x 3.3+ 物联网时序数据写入性能优,SQL 兼容
缓存 Redis 7 + Redisson 7.2+ 缓存 + 分布式锁
消息队列 Apache Kafka 3.8+ IoT 高吞吐实时流
搜索引擎 Elasticsearch 8.x 日志/文档全文检索
流程引擎 Camunda 7 / Flowable 最新 BPMN 2.0,用户量大
对象存储 MinIO / 阿里云 OSS 最新 文件、视频存储
容器编排 Docker Compose → K8s 最新 分步过渡

1.2 选型对比与决策

GIS 引擎选型

方案 优势 劣势 推荐场景
超图 iServer 国内水利项目标配,二三维一体化 授权费高(15-30万) 预算充足
开源 MapServer+GeoServer 免费 功能较弱,三维支持差 预算有限
Leaflet + Cesium 前端轻量三维 瓦片服务需另配 推荐混合方案

推荐:短期 GeoServer + Leaflet/Cesium;长期按甲方要求替换为超图。

视频 AI 引擎

方案 优势 劣势
自研训练(YOLOv8) 可定制 需标注数据+3-5人月训练
采购成熟产品 开箱即用 10-20万授权费
对接现有视频平台 SDK 复用已有投资 依赖厂商API

推荐:优先对接甲方现有视频平台;人员闯入模型采用预训练 YOLO + 少量迁移学习。


二、系统架构

2.1 整体架构图

┌─────────────────────────────────────────────────────────────┐
│                      接入层 (Gateway)                        │
│   Nginx → Spring Cloud Gateway (限流/鉴权/路由)              │
│   统一入口: Web / Flutter APP / 微信小程序 / OpenAPI         │
├─────────────────────────────────────────────────────────────┤
│                      应用服务层                              │
│ ┌──────────┐ ┌──────────┐ ┌──────────┐ ┌──────────────┐   │
│ │供水生产  │ │营业收费  │ │巡检管理  │ │大数据分析    │   │
│ │管理服务  │ │服务      │ │服务      │ │服务          │   │
│ ├──────────┤ ├──────────┤ ├──────────┤ ├──────────────┤   │
│ │总览/监测 │ │营收/报装 │ │任务/轨迹 │ │BI看板/报表   │   │
│ │水质/调度 │ │表务/客服 │ │统计/设置 │ │决策模型      │   │
│ │报警/数据 │ │微信/集抄 │ │巡检APP   │ │大屏展示      │   │
│ └──────────┘ └──────────┘ └──────────┘ └──────────────┘   │
│ ┌──────────────────────────────────────────────────────┐   │
│ │                   流程引擎服务                        │   │
│ │   Camunda BPMN → 流程定义/编排/监控                  │   │
│ └──────────────────────────────────────────────────────┘   │
├─────────────────────────────────────────────────────────────┤
│                      能力层 (中台)                           │
│ ┌──────────┐ ┌──────────┐ ┌──────────┐ ┌──────────────┐   │
│ │物联网平台│ │数据引擎  │ │工单引擎  │ │消息通知      │   │
│ │设备接入  │ │汇聚/治理 │ │任务流转  │ │短信/推送/WS  │   │
│ │协议适配  │ │服务/目录 │ │跟踪/统计 │ │邮件/订阅     │   │
│ └──────────┘ └──────────┘ └──────────┘ └──────────────┘   │
│ ┌──────────────────────────────────────────────────────┐   │
│ │                   基础服务平台                        │   │
│ │   认证授权(Sa-Token) / 用户管理 / 部门管理 / 日志    │   │
│ └──────────────────────────────────────────────────────┘   │
├─────────────────────────────────────────────────────────────┤
│                      数据存储层                              │
│ ┌──────────┐ ┌──────────┐ ┌──────────┐ ┌──────────────┐   │
│ │PostgreSQL│ │ TDengine │ │  Redis   │ │Elasticsearch │   │
│ │+PostGIS  │ │ 时序数据 │ │ 缓存/锁  │ │ 搜索/日志    │   │
│ └──────────┘ └──────────┘ └──────────┘ └──────────────┘   │
│ ┌──────────┐ ┌──────────┐                                 │
│ │  MinIO   │ │  Kafka   │                                 │
│ │ 文件存储 │ │ 消息队列 │                                 │
│ └──────────┘ └──────────┘                                 │
├─────────────────────────────────────────────────────────────┤
│                      外部集成层                              │
│ ┌────────┐ ┌────────┐ ┌──────────┐ ┌────────┐ ┌────────┐ │
│ │ SCADA  │ │ 视频   │ │ 支付宝   │ │ 微信   │ │GIS地图 │ │
│ │ 对接   │ │ 平台   │ │ 生活缴费 │ │ 支付   │ │ 服务   │ │
│ └────────┘ └────────┘ └──────────┘ └────────┘ └────────┘ │
└─────────────────────────────────────────────────────────────┘

2.2 微服务拆分

微服务 端口 职责 拆分优先级
wm-gateway 8080 API 网关/鉴权/限流 P0
wm-base 8081 用户/角色/菜单/部门/日志 P0
wm-iot 8082 物联网平台:设备接入/协议适配/设备管理 P0
wm-data-engine 8083 数据引擎:汇聚/治理/服务/目录 P0
wm-bpm 8084 流程引擎:Camunda 封装 P0
wm-production 8085 供水生产管理平台全部模块 P1
wm-revenue 8086 营业收费系统全部模块 P1
wm-patrol 8087 巡检管理系统 P2
wm-bi 8088 大数据分析/BI P2
wm-notify 8089 消息通知:短信/极光推送/WebSocket P1
wm-job 8090 定时任务调度(XXL-Job) P1

三、关键模块设计

3.1 物联网平台

设备 → [MQTT Broker(EMQX)] → [Kafka] → [wm-iot]
           ↑ 设备认证        ↑ 规则引擎路由    ↑ 设备管理/影子/OTA

协议适配器模式

wm-iot/adapters/
├── MqttAdapter.java        # MQTT 适配
├── CoapAdapter.java        # CoAP 适配
├── ModbusAdapter.java      # Modbus TCP/RTU
├── HttpAdapter.java        # HTTP 直连
└── DeviceModelMapper.java  # 统一设备模型转换
  • 设备影子:Redis 存储设备期望/上报状态,断线自动同步
  • OTA 升级:MinIO 存储固件,设备心跳拉取更新
  • 数据路由:EMQX 规则引擎 → Kafka Topic 分流(iot.raw.{deviceType}

3.2 数据引擎

数据流转

数据源 → 采集适配 → Kafka → 实时流(Flink) → TDengine(时序)
                   ↘              ↘
                    批量(Spark)  → PostgreSQL(业务数据)
                                → Elasticsearch(全文)

治理流水线

原始数据 → 标准化 → 清洗 → 质控 → 关联 → 入仓
          (水利标准映射) (缺失/异常) (质量评分) (血缘) (增量/全量)

3.3 GIS 集成

前端: Vue3 + Leaflet(2D) / Cesium(3D)
         ↕ WMS/WMTS/TMS
后端: GeoServer(瓦片服务) ← PostGIS(空间数据库)
         ↑
      空间数据: 管网矢量(shp→PostGIS)、监测点位(动态图层)

3.4 报警引擎

IoT数据 → Kafka → wm-iot(数据消费)
                     ↓
              规则引擎(阈值判断)
                     ↓
              Redis(去重窗口)
                     ↓
              wm-notify(通知分发)
                     ↓
        ┌───────┼────────┐
       短信    APP推送    WebSocket(实时弹窗)

报警等级:🟢 提示 → 🟡 一般 → 🟠 严重 → 🔴 紧急

去重策略:同一设备+同一类型+N分钟内只告警一次。

3.5 调度推演引擎

预案模板库 → 参数填充 → 管网水力模型(EPANET) → 调度策略生成
                                              ↓
                                         指令下发 → 执行跟踪 → 效果评估
  • 爆管模拟:阀门关闭策略 → 影响区域分析 → 应急供水方案
  • 水质异常:污染物扩散模拟 → 排放方案

四、数据库设计(核心表)

4.1 用户权限体系

-- 部门表
CREATE TABLE sys_dept (
    id BIGINT PRIMARY KEY,
    parent_id BIGINT,
    dept_name VARCHAR(100),
    dept_type VARCHAR(20),  -- water_bureau(水利局)/water_company(水务公司)/ops(运维)
    sort_order INT,
    status TINYINT DEFAULT 1,
    created_at TIMESTAMP DEFAULT NOW()
);

-- 用户表
CREATE TABLE sys_user (
    id BIGINT PRIMARY KEY,
    dept_id BIGINT REFERENCES sys_dept(id),
    username VARCHAR(50) UNIQUE NOT NULL,
    password VARCHAR(255) NOT NULL,
    real_name VARCHAR(50),
    phone VARCHAR(20),
    email VARCHAR(100),
    role_type VARCHAR(30),  -- admin/leader/manager/operator/tech
    status TINYINT DEFAULT 1,
    created_at TIMESTAMP DEFAULT NOW()
);

-- 角色表
CREATE TABLE sys_role (
    id BIGINT PRIMARY KEY,
    role_name VARCHAR(50) UNIQUE,
    role_key VARCHAR(50) UNIQUE,  -- admin/supervisor/biz_manager/field_ops/tech_maintain
    data_scope VARCHAR(20),       -- ALL/DEPT/SELF
    description VARCHAR(200),
    created_at TIMESTAMP DEFAULT NOW()
);

-- 角色-用户关联
CREATE TABLE sys_user_role (
    user_id BIGINT REFERENCES sys_user(id),
    role_id BIGINT REFERENCES sys_role(id),
    PRIMARY KEY (user_id, role_id)
);

4.2 设备管理(物联网)

-- 设备模型定义
CREATE TABLE iot_device_model (
    id BIGINT PRIMARY KEY,
    model_key VARCHAR(50) UNIQUE,   -- 比如 water_meter_dn15
    model_name VARCHAR(100),        -- DN15远传水表
    vendor VARCHAR(100),            -- 厂商
    protocol VARCHAR(20),           -- MQTT/Modbus/CoAP
    properties JSONB,               -- 属性定义 [{key, name, unit, data_type, range}]
    commands JSONB,                 -- 支持指令 [{key, name, params}]
    created_at TIMESTAMP DEFAULT NOW()
);

-- 设备实例
CREATE TABLE iot_device (
    id BIGINT PRIMARY KEY,
    device_sn VARCHAR(100) UNIQUE,  -- 设备序列号
    device_name VARCHAR(200),
    model_id BIGINT REFERENCES iot_device_model(id),
    device_type VARCHAR(30),        -- flow_meter/pressure/valve/water_quality/level
    position_type VARCHAR(20),      -- water_plant/pressure_station/pipe_network/village
    loc_lng DOUBLE PRECISION,       -- 经度
    loc_lat DOUBLE PRECISION,       -- 纬度
    geom GEOMETRY(Point, 4326),     -- PostGIS 空间坐标
    area VARCHAR(50),               -- 所属片区
    station_id BIGINT,              -- 所属站点
    status VARCHAR(20),             -- online/offline/maintenance/fault
    last_report_time TIMESTAMP,
    created_at TIMESTAMP DEFAULT NOW()
);

4.3 时序数据(TDengine)

-- TDengine 超级表:设备遥测数据
CREATE STABLE iot_telemetry (
    ts TIMESTAMP,
    device_sn NCHAR(100),
    metric_key NCHAR(50),
    metric_value DOUBLE,
    quality TINYINT
) TAGS (
    device_type NCHAR(30),
    area NCHAR(50)
);

-- 按设备类型创建子表
CREATE TABLE flow_data USING iot_telemetry TAGS('flow_meter', '精芒片区');
CREATE TABLE press_data USING iot_telemetry TAGS('pressure', '托里片区');
CREATE TABLE wq_data USING iot_telemetry TAGS('water_quality', '一体化水厂');

4.4 营业收费

-- 用水户
CREATE TABLE rev_customer (
    id BIGINT PRIMARY KEY,
    customer_no VARCHAR(30) UNIQUE,     -- 户号
    customer_name VARCHAR(100),
    customer_type VARCHAR(20),          -- residential/business/enterprise/institution
    area VARCHAR(50),
    address VARCHAR(300),
    phone VARCHAR(20),
    id_card VARCHAR(18),
    contract_no VARCHAR(50),
    status VARCHAR(20) DEFAULT 'active',
    created_at TIMESTAMP DEFAULT NOW()
);

-- 水表档案
CREATE TABLE rev_meter (
    id BIGINT PRIMARY KEY,
    meter_no VARCHAR(50) UNIQUE,
    customer_id BIGINT REFERENCES rev_customer(id),
    device_id BIGINT REFERENCES iot_device(id),  -- 关联IoT设备
    caliber VARCHAR(10),                          -- DN15/DN20/DN40...
    meter_type VARCHAR(20),                       -- mechanical/ultrasonic/electromagnetic
    initial_reading DECIMAL(10,2),
    install_date DATE,
    status VARCHAR(20),                           -- active/dismantled/scrapped/repaired
    created_at TIMESTAMP DEFAULT NOW()
);

-- 抄表记录
CREATE TABLE rev_reading (
    id BIGINT PRIMARY KEY,
    meter_id BIGINT REFERENCES rev_meter(id),
    reading_date DATE,
    prev_reading DECIMAL(10,2),
    curr_reading DECIMAL(10,2),
    consumption DECIMAL(10,2),       -- 用水量
    read_type VARCHAR(20),           -- manual/remote/estimate
    reader_id BIGINT,
    photo_url VARCHAR(500),
    verified TINYINT DEFAULT 0,
    created_at TIMESTAMP DEFAULT NOW()
);

-- 水费账单
CREATE TABLE rev_bill (
    id BIGINT PRIMARY KEY,
    customer_id BIGINT REFERENCES rev_customer(id),
    bill_period VARCHAR(10),         -- 2026-06
    consumption DECIMAL(10,2),
    water_fee DECIMAL(10,2),
    sewage_fee DECIMAL(10,2),
    total_fee DECIMAL(10,2),
    paid_fee DECIMAL(10,2) DEFAULT 0,
    status VARCHAR(20),              -- pending/partial/paid/overdue
    due_date DATE,
    paid_at TIMESTAMP,
    created_at TIMESTAMP DEFAULT NOW()
);

4.5 巡检系统

-- 巡检路线
CREATE TABLE patrol_route (
    id BIGINT PRIMARY KEY,
    route_name VARCHAR(100),
    area VARCHAR(50),
    route_points JSONB,                -- [{seq, lng, lat, name, device_ids}]
    estim_duration INT,                -- 预计时长(分钟)
    status TINYINT DEFAULT 1,
    created_at TIMESTAMP DEFAULT NOW()
);

-- 巡检任务
CREATE TABLE patrol_task (
    id BIGINT PRIMARY KEY,
    route_id BIGINT REFERENCES patrol_route(id),
    assignee_id BIGINT REFERENCES sys_user(id),
    task_date DATE,
    plan_start TIME,
    plan_end TIME,
    actual_start TIMESTAMP,
    actual_end TIMESTAMP,
    status VARCHAR(20),               -- pending/in_progress/completed/expired
    distance DECIMAL(8,2),
    created_at TIMESTAMP DEFAULT NOW()
);

-- 巡检记录
CREATE TABLE patrol_record (
    id BIGINT PRIMARY KEY,
    task_id BIGINT REFERENCES patrol_task(id),
    point_seq INT,
    device_id BIGINT REFERENCES iot_device(id),
    check_items JSONB,                 -- [{item, result, value, photo_url, remark}]
    gps_lng DOUBLE PRECISION,
    gps_lat DOUBLE PRECISION,
    record_time TIMESTAMP,
    created_at TIMESTAMP DEFAULT NOW()
);

4.6 报警管理

CREATE TABLE alert_rule (
    id BIGINT PRIMARY KEY,
    rule_name VARCHAR(100),
    device_type VARCHAR(30),
    metric_key VARCHAR(50),
    alert_level VARCHAR(10),           -- info/warning/critical/emergency
    condition_expr VARCHAR(200),       -- "> 0.5" 或 "ABS_DELTA > 10"
    threshold_value VARCHAR(50),
    debounce_sec INT DEFAULT 300,      -- 去重窗口(秒)
    notify_scheme_id BIGINT,
    enabled TINYINT DEFAULT 1,
    created_at TIMESTAMP DEFAULT NOW()
);

CREATE TABLE alert_event (
    id BIGINT PRIMARY KEY,
    rule_id BIGINT REFERENCES alert_rule(id),
    device_id BIGINT REFERENCES iot_device(id),
    device_sn VARCHAR(100),
    metric_key VARCHAR(50),
    metric_value DOUBLE,
    threshold VARCHAR(50),
    alert_level VARCHAR(10),
    message VARCHAR(500),
    confirmed_by BIGINT,
    confirmed_at TIMESTAMP,
    dispatched TINYINT DEFAULT 0,     -- 是否已派单
    resolved_at TIMESTAMP,
    created_at TIMESTAMP DEFAULT NOW()
);

五、接口设计规范

5.1 RESTful API 规范

GET    /api/v1/{resource}           # 列表查询
GET    /api/v1/{resource}/{id}      # 详情查询
POST   /api/v1/{resource}           # 创建
PUT    /api/v1/{resource}/{id}      # 全量更新
PATCH  /api/v1/{resource}/{id}      # 部分更新
DELETE /api/v1/{resource}/{id}      # 删除

5.2 统一响应格式

{
  "code": 200,
  "message": "success",
  "data": {},
  "timestamp": 1718340000000
}

5.3 错误码规范

范围 说明
200 成功
400-499 客户端错误(参数/权限/资源)
500-599 服务端错误
10001-10099 物联网相关
20001-20099 营业收费相关
30001-30099 供水生产相关

六、部署方案

6.1 开发环境

Docker Compose 单机部署
├── PostgreSQL 16 + PostGIS
├── TDengine 3.x
├── Redis 7
├── Kafka (单节点)
├── Elasticsearch
├── MinIO
├── EMQX
├── Nacos
└── 各微服务 JAR

6.2 生产环境

K8s 集群 (3 master + 5 worker)
├── ingress-nginx (LB)
├── Spring Cloud Gateway (ClusterIP)
├── 微服务 Pods (HPA自动扩缩)
├── PostgreSQL (主从)
├── TDengine Cluster (3节点)
├── Redis Cluster (6节点)
├── Kafka Cluster (3节点)
├── Elasticsearch Cluster (3节点)
├── MinIO (分布式 4节点)
└── EMQX Cluster (3节点)

6.3 监控体系

组件 用途
Prometheus + Grafana 系统指标 + 业务指标
SkyWalking 分布式链路追踪
ELK (ES + Logstash + Filebeat) 日志收集分析
AlertManager 告警管理

七、安全设计

层面 措施
传输安全 HTTPS/TLS 1.3,MQTT over TLS
认证 JWT + Sa-Token,设备端 X.509证书
授权 RBAC + 数据权限(片区隔离)
审计 全操作日志(登录/操作/异常),不可删除
数据安全 敏感字段 AES 加密,数据库连接 SSL
等保 不低于等保二级,关键业务等保三级
防护 SQL注入/ XSS/ CSRF/ DDoS限流

八、关键技术决策记录

# 决策 方案 理由
1 GIS引擎 GeoServer + Leaflet/Cesium 开源可控,支持标准WMS/WMTS,可平滑迁移超图
2 时序库 TDengine 3.x 物联网写入性能优(亿级/天),SQL兼容,运维简单
3 消息队列 Kafka IoT 高吞吐实时流,Exactly-Once 语义
4 流程引擎 Camunda 7 BPMN 2.0 标准,Java 原生嵌入,中文社区
5 移动端 Flutter 一套代码双端,GIS 地图插件成熟
6 微服务框架 Spring Cloud Alibaba Nacos注册配置一体化,Sentinel限流
7 API规范 RESTful + WebSocket(实时) 前后端分离标准,WS 用于实时监测和报警推送
8 视频AI 预训练 YOLOv8 + 迁移学习 人员闯入场景单一,少量标注即可达到85%+精度

文档版本

版本 日期 修订 修订人
v1.0 2026-06-14 初始版本:技术选型/架构/数据库/部署 bot_pm