|
|
@@ -0,0 +1,570 @@
|
|
|
1
|
+# 智慧水务管理系统 — 系统设计文档
|
|
|
2
|
+
|
|
|
3
|
+> 版本:v1.0 | 日期:2026-06-14 | 作者:bot_pm
|
|
|
4
|
+
|
|
|
5
|
+---
|
|
|
6
|
+
|
|
|
7
|
+## 一、技术选型
|
|
|
8
|
+
|
|
|
9
|
+### 1.1 总体技术栈
|
|
|
10
|
+
|
|
|
11
|
+| 层次 | 技术 | 版本要求 | 选型理由 |
|
|
|
12
|
+|------|------|----------|----------|
|
|
|
13
|
+| 后端框架 | Spring Cloud Alibaba | 2024.x | 微服务生态成熟,Nacos 服务治理 |
|
|
|
14
|
+| 单体可回退 | Spring Boot 3.x | 3.3+ | 小规模可单体启动,渐进式拆分 |
|
|
|
15
|
+| 前端框架 | Vue 3 + TypeScript | 3.5+ | 生态丰富,GIS 组件支持好 |
|
|
|
16
|
+| 前端 UI | Element Plus + ECharts | 最新 | 大屏可视化 + 中后台表单 |
|
|
|
17
|
+| 移动端 | Flutter 3.x | 3.24+ | 一套代码 Android/iOS |
|
|
|
18
|
+| 网关 | Spring Cloud Gateway | 匹配 SC | 统一入口、限流、鉴权 |
|
|
|
19
|
+| 服务注册/配置 | Nacos | 2.4+ | 服务发现 + 配置中心一体化 |
|
|
|
20
|
+| 认证授权 | Sa-Token + OAuth2 | 最新 | 轻量级 RBAC,支持 SSO |
|
|
|
21
|
+| 数据库 | PostgreSQL 16 + PostGIS | 16+ | 空间数据原生支持,替代 Oracle Spatial |
|
|
|
22
|
+| 时序数据库 | TDengine 3.x | 3.3+ | 物联网时序数据写入性能优,SQL 兼容 |
|
|
|
23
|
+| 缓存 | Redis 7 + Redisson | 7.2+ | 缓存 + 分布式锁 |
|
|
|
24
|
+| 消息队列 | Apache Kafka | 3.8+ | IoT 高吞吐实时流 |
|
|
|
25
|
+| 搜索引擎 | Elasticsearch | 8.x | 日志/文档全文检索 |
|
|
|
26
|
+| 流程引擎 | Camunda 7 / Flowable | 最新 | BPMN 2.0,用户量大 |
|
|
|
27
|
+| 对象存储 | MinIO / 阿里云 OSS | 最新 | 文件、视频存储 |
|
|
|
28
|
+| 容器编排 | Docker Compose → K8s | 最新 | 分步过渡 |
|
|
|
29
|
+
|
|
|
30
|
+### 1.2 选型对比与决策
|
|
|
31
|
+
|
|
|
32
|
+#### GIS 引擎选型
|
|
|
33
|
+
|
|
|
34
|
+| 方案 | 优势 | 劣势 | 推荐场景 |
|
|
|
35
|
+|------|------|------|----------|
|
|
|
36
|
+| **超图 iServer** | 国内水利项目标配,二三维一体化 | 授权费高(15-30万) | 预算充足 |
|
|
|
37
|
+| **开源 MapServer+GeoServer** | 免费 | 功能较弱,三维支持差 | 预算有限 |
|
|
|
38
|
+| **Leaflet + Cesium** | 前端轻量三维 | 瓦片服务需另配 | 推荐混合方案 |
|
|
|
39
|
+
|
|
|
40
|
+**推荐**:短期 GeoServer + Leaflet/Cesium;长期按甲方要求替换为超图。
|
|
|
41
|
+
|
|
|
42
|
+#### 视频 AI 引擎
|
|
|
43
|
+
|
|
|
44
|
+| 方案 | 优势 | 劣势 |
|
|
|
45
|
+|------|------|------|
|
|
|
46
|
+| **自研训练(YOLOv8)** | 可定制 | 需标注数据+3-5人月训练 |
|
|
|
47
|
+| **采购成熟产品** | 开箱即用 | 10-20万授权费 |
|
|
|
48
|
+| **对接现有视频平台 SDK** | 复用已有投资 | 依赖厂商API |
|
|
|
49
|
+
|
|
|
50
|
+**推荐**:优先对接甲方现有视频平台;人员闯入模型采用预训练 YOLO + 少量迁移学习。
|
|
|
51
|
+
|
|
|
52
|
+---
|
|
|
53
|
+
|
|
|
54
|
+## 二、系统架构
|
|
|
55
|
+
|
|
|
56
|
+### 2.1 整体架构图
|
|
|
57
|
+
|
|
|
58
|
+```
|
|
|
59
|
+┌─────────────────────────────────────────────────────────────┐
|
|
|
60
|
+│ 接入层 (Gateway) │
|
|
|
61
|
+│ Nginx → Spring Cloud Gateway (限流/鉴权/路由) │
|
|
|
62
|
+│ 统一入口: Web / Flutter APP / 微信小程序 / OpenAPI │
|
|
|
63
|
+├─────────────────────────────────────────────────────────────┤
|
|
|
64
|
+│ 应用服务层 │
|
|
|
65
|
+│ ┌──────────┐ ┌──────────┐ ┌──────────┐ ┌──────────────┐ │
|
|
|
66
|
+│ │供水生产 │ │营业收费 │ │巡检管理 │ │大数据分析 │ │
|
|
|
67
|
+│ │管理服务 │ │服务 │ │服务 │ │服务 │ │
|
|
|
68
|
+│ ├──────────┤ ├──────────┤ ├──────────┤ ├──────────────┤ │
|
|
|
69
|
+│ │总览/监测 │ │营收/报装 │ │任务/轨迹 │ │BI看板/报表 │ │
|
|
|
70
|
+│ │水质/调度 │ │表务/客服 │ │统计/设置 │ │决策模型 │ │
|
|
|
71
|
+│ │报警/数据 │ │微信/集抄 │ │巡检APP │ │大屏展示 │ │
|
|
|
72
|
+│ └──────────┘ └──────────┘ └──────────┘ └──────────────┘ │
|
|
|
73
|
+│ ┌──────────────────────────────────────────────────────┐ │
|
|
|
74
|
+│ │ 流程引擎服务 │ │
|
|
|
75
|
+│ │ Camunda BPMN → 流程定义/编排/监控 │ │
|
|
|
76
|
+│ └──────────────────────────────────────────────────────┘ │
|
|
|
77
|
+├─────────────────────────────────────────────────────────────┤
|
|
|
78
|
+│ 能力层 (中台) │
|
|
|
79
|
+│ ┌──────────┐ ┌──────────┐ ┌──────────┐ ┌──────────────┐ │
|
|
|
80
|
+│ │物联网平台│ │数据引擎 │ │工单引擎 │ │消息通知 │ │
|
|
|
81
|
+│ │设备接入 │ │汇聚/治理 │ │任务流转 │ │短信/推送/WS │ │
|
|
|
82
|
+│ │协议适配 │ │服务/目录 │ │跟踪/统计 │ │邮件/订阅 │ │
|
|
|
83
|
+│ └──────────┘ └──────────┘ └──────────┘ └──────────────┘ │
|
|
|
84
|
+│ ┌──────────────────────────────────────────────────────┐ │
|
|
|
85
|
+│ │ 基础服务平台 │ │
|
|
|
86
|
+│ │ 认证授权(Sa-Token) / 用户管理 / 部门管理 / 日志 │ │
|
|
|
87
|
+│ └──────────────────────────────────────────────────────┘ │
|
|
|
88
|
+├─────────────────────────────────────────────────────────────┤
|
|
|
89
|
+│ 数据存储层 │
|
|
|
90
|
+│ ┌──────────┐ ┌──────────┐ ┌──────────┐ ┌──────────────┐ │
|
|
|
91
|
+│ │PostgreSQL│ │ TDengine │ │ Redis │ │Elasticsearch │ │
|
|
|
92
|
+│ │+PostGIS │ │ 时序数据 │ │ 缓存/锁 │ │ 搜索/日志 │ │
|
|
|
93
|
+│ └──────────┘ └──────────┘ └──────────┘ └──────────────┘ │
|
|
|
94
|
+│ ┌──────────┐ ┌──────────┐ │
|
|
|
95
|
+│ │ MinIO │ │ Kafka │ │
|
|
|
96
|
+│ │ 文件存储 │ │ 消息队列 │ │
|
|
|
97
|
+│ └──────────┘ └──────────┘ │
|
|
|
98
|
+├─────────────────────────────────────────────────────────────┤
|
|
|
99
|
+│ 外部集成层 │
|
|
|
100
|
+│ ┌────────┐ ┌────────┐ ┌──────────┐ ┌────────┐ ┌────────┐ │
|
|
|
101
|
+│ │ SCADA │ │ 视频 │ │ 支付宝 │ │ 微信 │ │GIS地图 │ │
|
|
|
102
|
+│ │ 对接 │ │ 平台 │ │ 生活缴费 │ │ 支付 │ │ 服务 │ │
|
|
|
103
|
+│ └────────┘ └────────┘ └──────────┘ └────────┘ └────────┘ │
|
|
|
104
|
+└─────────────────────────────────────────────────────────────┘
|
|
|
105
|
+```
|
|
|
106
|
+
|
|
|
107
|
+### 2.2 微服务拆分
|
|
|
108
|
+
|
|
|
109
|
+| 微服务 | 端口 | 职责 | 拆分优先级 |
|
|
|
110
|
+|--------|:----:|------|:----------:|
|
|
|
111
|
+| `wm-gateway` | 8080 | API 网关/鉴权/限流 | P0 |
|
|
|
112
|
+| `wm-base` | 8081 | 用户/角色/菜单/部门/日志 | P0 |
|
|
|
113
|
+| `wm-iot` | 8082 | 物联网平台:设备接入/协议适配/设备管理 | P0 |
|
|
|
114
|
+| `wm-data-engine` | 8083 | 数据引擎:汇聚/治理/服务/目录 | P0 |
|
|
|
115
|
+| `wm-bpm` | 8084 | 流程引擎:Camunda 封装 | P0 |
|
|
|
116
|
+| `wm-production` | 8085 | 供水生产管理平台全部模块 | P1 |
|
|
|
117
|
+| `wm-revenue` | 8086 | 营业收费系统全部模块 | P1 |
|
|
|
118
|
+| `wm-patrol` | 8087 | 巡检管理系统 | P2 |
|
|
|
119
|
+| `wm-bi` | 8088 | 大数据分析/BI | P2 |
|
|
|
120
|
+| `wm-notify` | 8089 | 消息通知:短信/极光推送/WebSocket | P1 |
|
|
|
121
|
+| `wm-job` | 8090 | 定时任务调度(XXL-Job) | P1 |
|
|
|
122
|
+
|
|
|
123
|
+---
|
|
|
124
|
+
|
|
|
125
|
+## 三、关键模块设计
|
|
|
126
|
+
|
|
|
127
|
+### 3.1 物联网平台
|
|
|
128
|
+
|
|
|
129
|
+```
|
|
|
130
|
+设备 → [MQTT Broker(EMQX)] → [Kafka] → [wm-iot]
|
|
|
131
|
+ ↑ 设备认证 ↑ 规则引擎路由 ↑ 设备管理/影子/OTA
|
|
|
132
|
+```
|
|
|
133
|
+
|
|
|
134
|
+**协议适配器模式**:
|
|
|
135
|
+
|
|
|
136
|
+```
|
|
|
137
|
+wm-iot/adapters/
|
|
|
138
|
+├── MqttAdapter.java # MQTT 适配
|
|
|
139
|
+├── CoapAdapter.java # CoAP 适配
|
|
|
140
|
+├── ModbusAdapter.java # Modbus TCP/RTU
|
|
|
141
|
+├── HttpAdapter.java # HTTP 直连
|
|
|
142
|
+└── DeviceModelMapper.java # 统一设备模型转换
|
|
|
143
|
+```
|
|
|
144
|
+
|
|
|
145
|
+- **设备影子**:Redis 存储设备期望/上报状态,断线自动同步
|
|
|
146
|
+- **OTA 升级**:MinIO 存储固件,设备心跳拉取更新
|
|
|
147
|
+- **数据路由**:EMQX 规则引擎 → Kafka Topic 分流(`iot.raw.{deviceType}`)
|
|
|
148
|
+
|
|
|
149
|
+### 3.2 数据引擎
|
|
|
150
|
+
|
|
|
151
|
+**数据流转**:
|
|
|
152
|
+
|
|
|
153
|
+```
|
|
|
154
|
+数据源 → 采集适配 → Kafka → 实时流(Flink) → TDengine(时序)
|
|
|
155
|
+ ↘ ↘
|
|
|
156
|
+ 批量(Spark) → PostgreSQL(业务数据)
|
|
|
157
|
+ → Elasticsearch(全文)
|
|
|
158
|
+```
|
|
|
159
|
+
|
|
|
160
|
+**治理流水线**:
|
|
|
161
|
+
|
|
|
162
|
+```
|
|
|
163
|
+原始数据 → 标准化 → 清洗 → 质控 → 关联 → 入仓
|
|
|
164
|
+ (水利标准映射) (缺失/异常) (质量评分) (血缘) (增量/全量)
|
|
|
165
|
+```
|
|
|
166
|
+
|
|
|
167
|
+### 3.3 GIS 集成
|
|
|
168
|
+
|
|
|
169
|
+```
|
|
|
170
|
+前端: Vue3 + Leaflet(2D) / Cesium(3D)
|
|
|
171
|
+ ↕ WMS/WMTS/TMS
|
|
|
172
|
+后端: GeoServer(瓦片服务) ← PostGIS(空间数据库)
|
|
|
173
|
+ ↑
|
|
|
174
|
+ 空间数据: 管网矢量(shp→PostGIS)、监测点位(动态图层)
|
|
|
175
|
+```
|
|
|
176
|
+
|
|
|
177
|
+### 3.4 报警引擎
|
|
|
178
|
+
|
|
|
179
|
+```
|
|
|
180
|
+IoT数据 → Kafka → wm-iot(数据消费)
|
|
|
181
|
+ ↓
|
|
|
182
|
+ 规则引擎(阈值判断)
|
|
|
183
|
+ ↓
|
|
|
184
|
+ Redis(去重窗口)
|
|
|
185
|
+ ↓
|
|
|
186
|
+ wm-notify(通知分发)
|
|
|
187
|
+ ↓
|
|
|
188
|
+ ┌───────┼────────┐
|
|
|
189
|
+ 短信 APP推送 WebSocket(实时弹窗)
|
|
|
190
|
+```
|
|
|
191
|
+
|
|
|
192
|
+**报警等级**:🟢 提示 → 🟡 一般 → 🟠 严重 → 🔴 紧急
|
|
|
193
|
+
|
|
|
194
|
+**去重策略**:同一设备+同一类型+N分钟内只告警一次。
|
|
|
195
|
+
|
|
|
196
|
+### 3.5 调度推演引擎
|
|
|
197
|
+
|
|
|
198
|
+```
|
|
|
199
|
+预案模板库 → 参数填充 → 管网水力模型(EPANET) → 调度策略生成
|
|
|
200
|
+ ↓
|
|
|
201
|
+ 指令下发 → 执行跟踪 → 效果评估
|
|
|
202
|
+```
|
|
|
203
|
+
|
|
|
204
|
+- 爆管模拟:阀门关闭策略 → 影响区域分析 → 应急供水方案
|
|
|
205
|
+- 水质异常:污染物扩散模拟 → 排放方案
|
|
|
206
|
+
|
|
|
207
|
+---
|
|
|
208
|
+
|
|
|
209
|
+## 四、数据库设计(核心表)
|
|
|
210
|
+
|
|
|
211
|
+### 4.1 用户权限体系
|
|
|
212
|
+
|
|
|
213
|
+```sql
|
|
|
214
|
+-- 部门表
|
|
|
215
|
+CREATE TABLE sys_dept (
|
|
|
216
|
+ id BIGINT PRIMARY KEY,
|
|
|
217
|
+ parent_id BIGINT,
|
|
|
218
|
+ dept_name VARCHAR(100),
|
|
|
219
|
+ dept_type VARCHAR(20), -- water_bureau(水利局)/water_company(水务公司)/ops(运维)
|
|
|
220
|
+ sort_order INT,
|
|
|
221
|
+ status TINYINT DEFAULT 1,
|
|
|
222
|
+ created_at TIMESTAMP DEFAULT NOW()
|
|
|
223
|
+);
|
|
|
224
|
+
|
|
|
225
|
+-- 用户表
|
|
|
226
|
+CREATE TABLE sys_user (
|
|
|
227
|
+ id BIGINT PRIMARY KEY,
|
|
|
228
|
+ dept_id BIGINT REFERENCES sys_dept(id),
|
|
|
229
|
+ username VARCHAR(50) UNIQUE NOT NULL,
|
|
|
230
|
+ password VARCHAR(255) NOT NULL,
|
|
|
231
|
+ real_name VARCHAR(50),
|
|
|
232
|
+ phone VARCHAR(20),
|
|
|
233
|
+ email VARCHAR(100),
|
|
|
234
|
+ role_type VARCHAR(30), -- admin/leader/manager/operator/tech
|
|
|
235
|
+ status TINYINT DEFAULT 1,
|
|
|
236
|
+ created_at TIMESTAMP DEFAULT NOW()
|
|
|
237
|
+);
|
|
|
238
|
+
|
|
|
239
|
+-- 角色表
|
|
|
240
|
+CREATE TABLE sys_role (
|
|
|
241
|
+ id BIGINT PRIMARY KEY,
|
|
|
242
|
+ role_name VARCHAR(50) UNIQUE,
|
|
|
243
|
+ role_key VARCHAR(50) UNIQUE, -- admin/supervisor/biz_manager/field_ops/tech_maintain
|
|
|
244
|
+ data_scope VARCHAR(20), -- ALL/DEPT/SELF
|
|
|
245
|
+ description VARCHAR(200),
|
|
|
246
|
+ created_at TIMESTAMP DEFAULT NOW()
|
|
|
247
|
+);
|
|
|
248
|
+
|
|
|
249
|
+-- 角色-用户关联
|
|
|
250
|
+CREATE TABLE sys_user_role (
|
|
|
251
|
+ user_id BIGINT REFERENCES sys_user(id),
|
|
|
252
|
+ role_id BIGINT REFERENCES sys_role(id),
|
|
|
253
|
+ PRIMARY KEY (user_id, role_id)
|
|
|
254
|
+);
|
|
|
255
|
+```
|
|
|
256
|
+
|
|
|
257
|
+### 4.2 设备管理(物联网)
|
|
|
258
|
+
|
|
|
259
|
+```sql
|
|
|
260
|
+-- 设备模型定义
|
|
|
261
|
+CREATE TABLE iot_device_model (
|
|
|
262
|
+ id BIGINT PRIMARY KEY,
|
|
|
263
|
+ model_key VARCHAR(50) UNIQUE, -- 比如 water_meter_dn15
|
|
|
264
|
+ model_name VARCHAR(100), -- DN15远传水表
|
|
|
265
|
+ vendor VARCHAR(100), -- 厂商
|
|
|
266
|
+ protocol VARCHAR(20), -- MQTT/Modbus/CoAP
|
|
|
267
|
+ properties JSONB, -- 属性定义 [{key, name, unit, data_type, range}]
|
|
|
268
|
+ commands JSONB, -- 支持指令 [{key, name, params}]
|
|
|
269
|
+ created_at TIMESTAMP DEFAULT NOW()
|
|
|
270
|
+);
|
|
|
271
|
+
|
|
|
272
|
+-- 设备实例
|
|
|
273
|
+CREATE TABLE iot_device (
|
|
|
274
|
+ id BIGINT PRIMARY KEY,
|
|
|
275
|
+ device_sn VARCHAR(100) UNIQUE, -- 设备序列号
|
|
|
276
|
+ device_name VARCHAR(200),
|
|
|
277
|
+ model_id BIGINT REFERENCES iot_device_model(id),
|
|
|
278
|
+ device_type VARCHAR(30), -- flow_meter/pressure/valve/water_quality/level
|
|
|
279
|
+ position_type VARCHAR(20), -- water_plant/pressure_station/pipe_network/village
|
|
|
280
|
+ loc_lng DOUBLE PRECISION, -- 经度
|
|
|
281
|
+ loc_lat DOUBLE PRECISION, -- 纬度
|
|
|
282
|
+ geom GEOMETRY(Point, 4326), -- PostGIS 空间坐标
|
|
|
283
|
+ area VARCHAR(50), -- 所属片区
|
|
|
284
|
+ station_id BIGINT, -- 所属站点
|
|
|
285
|
+ status VARCHAR(20), -- online/offline/maintenance/fault
|
|
|
286
|
+ last_report_time TIMESTAMP,
|
|
|
287
|
+ created_at TIMESTAMP DEFAULT NOW()
|
|
|
288
|
+);
|
|
|
289
|
+```
|
|
|
290
|
+
|
|
|
291
|
+### 4.3 时序数据(TDengine)
|
|
|
292
|
+
|
|
|
293
|
+```sql
|
|
|
294
|
+-- TDengine 超级表:设备遥测数据
|
|
|
295
|
+CREATE STABLE iot_telemetry (
|
|
|
296
|
+ ts TIMESTAMP,
|
|
|
297
|
+ device_sn NCHAR(100),
|
|
|
298
|
+ metric_key NCHAR(50),
|
|
|
299
|
+ metric_value DOUBLE,
|
|
|
300
|
+ quality TINYINT
|
|
|
301
|
+) TAGS (
|
|
|
302
|
+ device_type NCHAR(30),
|
|
|
303
|
+ area NCHAR(50)
|
|
|
304
|
+);
|
|
|
305
|
+
|
|
|
306
|
+-- 按设备类型创建子表
|
|
|
307
|
+CREATE TABLE flow_data USING iot_telemetry TAGS('flow_meter', '精芒片区');
|
|
|
308
|
+CREATE TABLE press_data USING iot_telemetry TAGS('pressure', '托里片区');
|
|
|
309
|
+CREATE TABLE wq_data USING iot_telemetry TAGS('water_quality', '一体化水厂');
|
|
|
310
|
+```
|
|
|
311
|
+
|
|
|
312
|
+### 4.4 营业收费
|
|
|
313
|
+
|
|
|
314
|
+```sql
|
|
|
315
|
+-- 用水户
|
|
|
316
|
+CREATE TABLE rev_customer (
|
|
|
317
|
+ id BIGINT PRIMARY KEY,
|
|
|
318
|
+ customer_no VARCHAR(30) UNIQUE, -- 户号
|
|
|
319
|
+ customer_name VARCHAR(100),
|
|
|
320
|
+ customer_type VARCHAR(20), -- residential/business/enterprise/institution
|
|
|
321
|
+ area VARCHAR(50),
|
|
|
322
|
+ address VARCHAR(300),
|
|
|
323
|
+ phone VARCHAR(20),
|
|
|
324
|
+ id_card VARCHAR(18),
|
|
|
325
|
+ contract_no VARCHAR(50),
|
|
|
326
|
+ status VARCHAR(20) DEFAULT 'active',
|
|
|
327
|
+ created_at TIMESTAMP DEFAULT NOW()
|
|
|
328
|
+);
|
|
|
329
|
+
|
|
|
330
|
+-- 水表档案
|
|
|
331
|
+CREATE TABLE rev_meter (
|
|
|
332
|
+ id BIGINT PRIMARY KEY,
|
|
|
333
|
+ meter_no VARCHAR(50) UNIQUE,
|
|
|
334
|
+ customer_id BIGINT REFERENCES rev_customer(id),
|
|
|
335
|
+ device_id BIGINT REFERENCES iot_device(id), -- 关联IoT设备
|
|
|
336
|
+ caliber VARCHAR(10), -- DN15/DN20/DN40...
|
|
|
337
|
+ meter_type VARCHAR(20), -- mechanical/ultrasonic/electromagnetic
|
|
|
338
|
+ initial_reading DECIMAL(10,2),
|
|
|
339
|
+ install_date DATE,
|
|
|
340
|
+ status VARCHAR(20), -- active/dismantled/scrapped/repaired
|
|
|
341
|
+ created_at TIMESTAMP DEFAULT NOW()
|
|
|
342
|
+);
|
|
|
343
|
+
|
|
|
344
|
+-- 抄表记录
|
|
|
345
|
+CREATE TABLE rev_reading (
|
|
|
346
|
+ id BIGINT PRIMARY KEY,
|
|
|
347
|
+ meter_id BIGINT REFERENCES rev_meter(id),
|
|
|
348
|
+ reading_date DATE,
|
|
|
349
|
+ prev_reading DECIMAL(10,2),
|
|
|
350
|
+ curr_reading DECIMAL(10,2),
|
|
|
351
|
+ consumption DECIMAL(10,2), -- 用水量
|
|
|
352
|
+ read_type VARCHAR(20), -- manual/remote/estimate
|
|
|
353
|
+ reader_id BIGINT,
|
|
|
354
|
+ photo_url VARCHAR(500),
|
|
|
355
|
+ verified TINYINT DEFAULT 0,
|
|
|
356
|
+ created_at TIMESTAMP DEFAULT NOW()
|
|
|
357
|
+);
|
|
|
358
|
+
|
|
|
359
|
+-- 水费账单
|
|
|
360
|
+CREATE TABLE rev_bill (
|
|
|
361
|
+ id BIGINT PRIMARY KEY,
|
|
|
362
|
+ customer_id BIGINT REFERENCES rev_customer(id),
|
|
|
363
|
+ bill_period VARCHAR(10), -- 2026-06
|
|
|
364
|
+ consumption DECIMAL(10,2),
|
|
|
365
|
+ water_fee DECIMAL(10,2),
|
|
|
366
|
+ sewage_fee DECIMAL(10,2),
|
|
|
367
|
+ total_fee DECIMAL(10,2),
|
|
|
368
|
+ paid_fee DECIMAL(10,2) DEFAULT 0,
|
|
|
369
|
+ status VARCHAR(20), -- pending/partial/paid/overdue
|
|
|
370
|
+ due_date DATE,
|
|
|
371
|
+ paid_at TIMESTAMP,
|
|
|
372
|
+ created_at TIMESTAMP DEFAULT NOW()
|
|
|
373
|
+);
|
|
|
374
|
+```
|
|
|
375
|
+
|
|
|
376
|
+### 4.5 巡检系统
|
|
|
377
|
+
|
|
|
378
|
+```sql
|
|
|
379
|
+-- 巡检路线
|
|
|
380
|
+CREATE TABLE patrol_route (
|
|
|
381
|
+ id BIGINT PRIMARY KEY,
|
|
|
382
|
+ route_name VARCHAR(100),
|
|
|
383
|
+ area VARCHAR(50),
|
|
|
384
|
+ route_points JSONB, -- [{seq, lng, lat, name, device_ids}]
|
|
|
385
|
+ estim_duration INT, -- 预计时长(分钟)
|
|
|
386
|
+ status TINYINT DEFAULT 1,
|
|
|
387
|
+ created_at TIMESTAMP DEFAULT NOW()
|
|
|
388
|
+);
|
|
|
389
|
+
|
|
|
390
|
+-- 巡检任务
|
|
|
391
|
+CREATE TABLE patrol_task (
|
|
|
392
|
+ id BIGINT PRIMARY KEY,
|
|
|
393
|
+ route_id BIGINT REFERENCES patrol_route(id),
|
|
|
394
|
+ assignee_id BIGINT REFERENCES sys_user(id),
|
|
|
395
|
+ task_date DATE,
|
|
|
396
|
+ plan_start TIME,
|
|
|
397
|
+ plan_end TIME,
|
|
|
398
|
+ actual_start TIMESTAMP,
|
|
|
399
|
+ actual_end TIMESTAMP,
|
|
|
400
|
+ status VARCHAR(20), -- pending/in_progress/completed/expired
|
|
|
401
|
+ distance DECIMAL(8,2),
|
|
|
402
|
+ created_at TIMESTAMP DEFAULT NOW()
|
|
|
403
|
+);
|
|
|
404
|
+
|
|
|
405
|
+-- 巡检记录
|
|
|
406
|
+CREATE TABLE patrol_record (
|
|
|
407
|
+ id BIGINT PRIMARY KEY,
|
|
|
408
|
+ task_id BIGINT REFERENCES patrol_task(id),
|
|
|
409
|
+ point_seq INT,
|
|
|
410
|
+ device_id BIGINT REFERENCES iot_device(id),
|
|
|
411
|
+ check_items JSONB, -- [{item, result, value, photo_url, remark}]
|
|
|
412
|
+ gps_lng DOUBLE PRECISION,
|
|
|
413
|
+ gps_lat DOUBLE PRECISION,
|
|
|
414
|
+ record_time TIMESTAMP,
|
|
|
415
|
+ created_at TIMESTAMP DEFAULT NOW()
|
|
|
416
|
+);
|
|
|
417
|
+```
|
|
|
418
|
+
|
|
|
419
|
+### 4.6 报警管理
|
|
|
420
|
+
|
|
|
421
|
+```sql
|
|
|
422
|
+CREATE TABLE alert_rule (
|
|
|
423
|
+ id BIGINT PRIMARY KEY,
|
|
|
424
|
+ rule_name VARCHAR(100),
|
|
|
425
|
+ device_type VARCHAR(30),
|
|
|
426
|
+ metric_key VARCHAR(50),
|
|
|
427
|
+ alert_level VARCHAR(10), -- info/warning/critical/emergency
|
|
|
428
|
+ condition_expr VARCHAR(200), -- "> 0.5" 或 "ABS_DELTA > 10"
|
|
|
429
|
+ threshold_value VARCHAR(50),
|
|
|
430
|
+ debounce_sec INT DEFAULT 300, -- 去重窗口(秒)
|
|
|
431
|
+ notify_scheme_id BIGINT,
|
|
|
432
|
+ enabled TINYINT DEFAULT 1,
|
|
|
433
|
+ created_at TIMESTAMP DEFAULT NOW()
|
|
|
434
|
+);
|
|
|
435
|
+
|
|
|
436
|
+CREATE TABLE alert_event (
|
|
|
437
|
+ id BIGINT PRIMARY KEY,
|
|
|
438
|
+ rule_id BIGINT REFERENCES alert_rule(id),
|
|
|
439
|
+ device_id BIGINT REFERENCES iot_device(id),
|
|
|
440
|
+ device_sn VARCHAR(100),
|
|
|
441
|
+ metric_key VARCHAR(50),
|
|
|
442
|
+ metric_value DOUBLE,
|
|
|
443
|
+ threshold VARCHAR(50),
|
|
|
444
|
+ alert_level VARCHAR(10),
|
|
|
445
|
+ message VARCHAR(500),
|
|
|
446
|
+ confirmed_by BIGINT,
|
|
|
447
|
+ confirmed_at TIMESTAMP,
|
|
|
448
|
+ dispatched TINYINT DEFAULT 0, -- 是否已派单
|
|
|
449
|
+ resolved_at TIMESTAMP,
|
|
|
450
|
+ created_at TIMESTAMP DEFAULT NOW()
|
|
|
451
|
+);
|
|
|
452
|
+```
|
|
|
453
|
+
|
|
|
454
|
+---
|
|
|
455
|
+
|
|
|
456
|
+## 五、接口设计规范
|
|
|
457
|
+
|
|
|
458
|
+### 5.1 RESTful API 规范
|
|
|
459
|
+
|
|
|
460
|
+```
|
|
|
461
|
+GET /api/v1/{resource} # 列表查询
|
|
|
462
|
+GET /api/v1/{resource}/{id} # 详情查询
|
|
|
463
|
+POST /api/v1/{resource} # 创建
|
|
|
464
|
+PUT /api/v1/{resource}/{id} # 全量更新
|
|
|
465
|
+PATCH /api/v1/{resource}/{id} # 部分更新
|
|
|
466
|
+DELETE /api/v1/{resource}/{id} # 删除
|
|
|
467
|
+```
|
|
|
468
|
+
|
|
|
469
|
+### 5.2 统一响应格式
|
|
|
470
|
+
|
|
|
471
|
+```json
|
|
|
472
|
+{
|
|
|
473
|
+ "code": 200,
|
|
|
474
|
+ "message": "success",
|
|
|
475
|
+ "data": {},
|
|
|
476
|
+ "timestamp": 1718340000000
|
|
|
477
|
+}
|
|
|
478
|
+```
|
|
|
479
|
+
|
|
|
480
|
+### 5.3 错误码规范
|
|
|
481
|
+
|
|
|
482
|
+| 范围 | 说明 |
|
|
|
483
|
+|:----:|------|
|
|
|
484
|
+| 200 | 成功 |
|
|
|
485
|
+| 400-499 | 客户端错误(参数/权限/资源) |
|
|
|
486
|
+| 500-599 | 服务端错误 |
|
|
|
487
|
+| 10001-10099 | 物联网相关 |
|
|
|
488
|
+| 20001-20099 | 营业收费相关 |
|
|
|
489
|
+| 30001-30099 | 供水生产相关 |
|
|
|
490
|
+
|
|
|
491
|
+---
|
|
|
492
|
+
|
|
|
493
|
+## 六、部署方案
|
|
|
494
|
+
|
|
|
495
|
+### 6.1 开发环境
|
|
|
496
|
+
|
|
|
497
|
+```
|
|
|
498
|
+Docker Compose 单机部署
|
|
|
499
|
+├── PostgreSQL 16 + PostGIS
|
|
|
500
|
+├── TDengine 3.x
|
|
|
501
|
+├── Redis 7
|
|
|
502
|
+├── Kafka (单节点)
|
|
|
503
|
+├── Elasticsearch
|
|
|
504
|
+├── MinIO
|
|
|
505
|
+├── EMQX
|
|
|
506
|
+├── Nacos
|
|
|
507
|
+└── 各微服务 JAR
|
|
|
508
|
+```
|
|
|
509
|
+
|
|
|
510
|
+### 6.2 生产环境
|
|
|
511
|
+
|
|
|
512
|
+```
|
|
|
513
|
+K8s 集群 (3 master + 5 worker)
|
|
|
514
|
+├── ingress-nginx (LB)
|
|
|
515
|
+├── Spring Cloud Gateway (ClusterIP)
|
|
|
516
|
+├── 微服务 Pods (HPA自动扩缩)
|
|
|
517
|
+├── PostgreSQL (主从)
|
|
|
518
|
+├── TDengine Cluster (3节点)
|
|
|
519
|
+├── Redis Cluster (6节点)
|
|
|
520
|
+├── Kafka Cluster (3节点)
|
|
|
521
|
+├── Elasticsearch Cluster (3节点)
|
|
|
522
|
+├── MinIO (分布式 4节点)
|
|
|
523
|
+└── EMQX Cluster (3节点)
|
|
|
524
|
+```
|
|
|
525
|
+
|
|
|
526
|
+### 6.3 监控体系
|
|
|
527
|
+
|
|
|
528
|
+| 组件 | 用途 |
|
|
|
529
|
+|------|------|
|
|
|
530
|
+| Prometheus + Grafana | 系统指标 + 业务指标 |
|
|
|
531
|
+| SkyWalking | 分布式链路追踪 |
|
|
|
532
|
+| ELK (ES + Logstash + Filebeat) | 日志收集分析 |
|
|
|
533
|
+| AlertManager | 告警管理 |
|
|
|
534
|
+
|
|
|
535
|
+---
|
|
|
536
|
+
|
|
|
537
|
+## 七、安全设计
|
|
|
538
|
+
|
|
|
539
|
+| 层面 | 措施 |
|
|
|
540
|
+|------|------|
|
|
|
541
|
+| 传输安全 | HTTPS/TLS 1.3,MQTT over TLS |
|
|
|
542
|
+| 认证 | JWT + Sa-Token,设备端 X.509证书 |
|
|
|
543
|
+| 授权 | RBAC + 数据权限(片区隔离) |
|
|
|
544
|
+| 审计 | 全操作日志(登录/操作/异常),不可删除 |
|
|
|
545
|
+| 数据安全 | 敏感字段 AES 加密,数据库连接 SSL |
|
|
|
546
|
+| 等保 | 不低于等保二级,关键业务等保三级 |
|
|
|
547
|
+| 防护 | SQL注入/ XSS/ CSRF/ DDoS限流 |
|
|
|
548
|
+
|
|
|
549
|
+---
|
|
|
550
|
+
|
|
|
551
|
+## 八、关键技术决策记录
|
|
|
552
|
+
|
|
|
553
|
+| # | 决策 | 方案 | 理由 |
|
|
|
554
|
+|---|------|------|------|
|
|
|
555
|
+| 1 | GIS引擎 | GeoServer + Leaflet/Cesium | 开源可控,支持标准WMS/WMTS,可平滑迁移超图 |
|
|
|
556
|
+| 2 | 时序库 | TDengine 3.x | 物联网写入性能优(亿级/天),SQL兼容,运维简单 |
|
|
|
557
|
+| 3 | 消息队列 | Kafka | IoT 高吞吐实时流,Exactly-Once 语义 |
|
|
|
558
|
+| 4 | 流程引擎 | Camunda 7 | BPMN 2.0 标准,Java 原生嵌入,中文社区 |
|
|
|
559
|
+| 5 | 移动端 | Flutter | 一套代码双端,GIS 地图插件成熟 |
|
|
|
560
|
+| 6 | 微服务框架 | Spring Cloud Alibaba | Nacos注册配置一体化,Sentinel限流 |
|
|
|
561
|
+| 7 | API规范 | RESTful + WebSocket(实时) | 前后端分离标准,WS 用于实时监测和报警推送 |
|
|
|
562
|
+| 8 | 视频AI | 预训练 YOLOv8 + 迁移学习 | 人员闯入场景单一,少量标注即可达到85%+精度 |
|
|
|
563
|
+
|
|
|
564
|
+---
|
|
|
565
|
+
|
|
|
566
|
+## 文档版本
|
|
|
567
|
+
|
|
|
568
|
+| 版本 | 日期 | 修订 | 修订人 |
|
|
|
569
|
+|------|------|------|--------|
|
|
|
570
|
+| v1.0 | 2026-06-14 | 初始版本:技术选型/架构/数据库/部署 | bot_pm |
|