# 智慧水务管理系统 — 系统设计文档 > 版本: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 用户权限体系 ```sql -- 部门表 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 设备管理(物联网) ```sql -- 设备模型定义 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) ```sql -- 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 营业收费 ```sql -- 用水户 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 巡检系统 ```sql -- 巡检路线 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 报警管理 ```sql 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 统一响应格式 ```json { "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 |