diff --git a/CLAUDE.md b/CLAUDE.md new file mode 100644 index 0000000..01726b8 --- /dev/null +++ b/CLAUDE.md @@ -0,0 +1,223 @@ +# CLAUDE.md + +本文档为 Claude Code (claude.ai/code) 在此代码库中工作时提供指导。 + +## 项目概述 + +**黑石咀水库系统** - 湖北省山洪灾害防治综合洪水监测预警系统。这是一个基于 Spring Boot 3.x 的 Java 应用程序,实现了山洪灾害监测管理的"四预"系统(预报/预警/预演/预案)。 + +## 技术栈 + +- **框架**: Spring Boot 3.x with Java 21 +- **数据库**: PostgreSQL with MyBatis-Plus 3.5.7 ORM +- **缓存**: Redis 用于缓存和会话管理 +- **构建工具**: Maven 3.x +- **部署**: Docker 容器配合 docker-compose +- **架构**: 微服务分层架构 +- **消息队列**: Spring Boot Quartz 调度器用于定时任务 +- **文件存储**: MinIO/S3 兼容的对象存储 +- **空间数据**: JTS (LocationTech) 用于地理处理 +- **外部 API**: 与气象、水文和水库监测系统集成 + +## 开发命令 + +### 构建和运行 +```bash +# 编译项目 +mvn clean compile + +# 打包应用程序 +mvn clean package + +# 本地运行(开发环境) +mvn spring-boot:run -Dspring-boot.run.profiles=dev + +# 运行测试 +mvn test + +# 构建时跳过测试 +mvn clean package -DskipTests +``` + +### Docker 部署 +```bash +# 开发环境部署 +./deploy_dev.ps1 + +# 使用 docker-compose 生产环境部署 +docker-compose up -d + +# 重启服务 +docker-compose restart +``` + +### 数据库操作 +```bash +# 应用程序使用 PostgreSQL,通过 MyBatis-Plus 进行自动模式管理 +# 数据库迁移通过应用程序的实体模型处理 +# 不需要单独的迁移工具 +``` + +## 架构概述 + +### 分层架构 +``` +控制器层 (REST API) → 服务层 (业务逻辑) → 映射器层 (数据访问) → 数据库 +``` + +### 核心组件 + +#### 1. **数据采集与同步** +- **位置**: `src/main/java/com/gunshi/project/hsz/timetask/DataTaskHsz.java` +- **功能**: 5分钟间隔从外部API同步数据 +- **数据源**: + - 水文监测站(降雨量、水位) + - 气象站(气象数据) + - 水库监测系统 + +#### 2. **预报系统** +- **位置**: `src/main/java/com/gunshi/project/hsz/service/ForecastService.java` +- **功能**: 天气预报处理和洪水预测 +- **特性**: GRIB2文件处理,网格降雨量计算 +- **集成**: 外部气象API和洪水算法库 + +#### 3. **预警系统** +- **位置**: `src/main/java/com/gunshi/project/hsz/service/MessageCenterService.java` +- **功能**: 水位和渗压多级预警系统 +- **特性**: 短信通知,广播预警,阈值告警 + +#### 4. **评估管理** +- **位置**: `src/main/java/com/gunshi/project/hsz/service/AssessTaskService.java` +- **功能**: 县级评估任务管理和工作流 +- **特性**: 任务分配,审批流程,结果统计 + +### 包结构 + +``` +src/main/java/com/gunshi/project/hsz/ +├── controller/ # REST API 控制器 (132个控制器) +├── service/ # 业务逻辑服务 +├── mapper/ # 数据访问层 (MyBatis-Plus) +├── model/ # 实体模型 +├── entity/ # DTO 和 VO +├── timetask/ # 定时任务 +├── config/ # 配置类 +├── util/ # 工具类 +├── grb/ # GRIB2 气象数据处理 +└── system/ # 系统管理 (日志、用户) +``` + +## 数据库设计 + +### 关键数据模型 +- **StPptnR**: 降雨监测站数据 +- **StRsvrR**: 水库水位数据 +- **StRiverR**: 河流水位数据 +- **MessageCenter**: 预警消息管理 +- **AssessTask**: 评估任务管理 +- **OsmoticWarnRule**: 渗压预警规则 + +### 数据库配置 +- **主数据库**: PostgreSQL (主从设置) +- **缓存**: Redis 用于会话和查询缓存 +- **连接池**: HikariCP 优化设置 +- **模式管理**: 通过 MyBatis-Plus 实体注解自动管理 + +## 外部集成 + +### API 端点 +- **水文数据**: `jcskPath` (荆楚水库API) +- **气象数据**: `shqxjsCloudowrCnPath` (气象服务API) +- **水库数据**: `owrsvrPath` (水库监测API) +- **预警系统**: `shqxjsWarnPath` (气象预警API) + +### 认证 +- **基于令牌**: 外部服务认证的API令牌 +- **IP白名单**: 动态IP白名单管理 +- **安全**: 通过Jackson反序列化器进行XSS防护 + +## 配置管理 + +### 环境配置 +- **dev**: 开发环境(本地测试) +- **prod**: 生产环境(Docker部署) +- **local**: 具有特定设置的本地开发 +- **ruoyi**: RuoYi框架集成 + +### 关键配置文件 +- `config-common.yml`: 通用配置(服务器端口、上下文路径) +- `config-prod.yml`: 生产数据库和外部API设置 +- `config-dev.yml`: 开发环境设置 + +## 安全特性 + +### 应用安全 +- **XSS防护**: 自定义Jackson反序列化器进行输入清理 +- **SQL注入防护**: 通过MyBatis-Plus进行参数化查询 +- **身份认证**: 与RuoYi权限框架集成 +- **输入验证**: JSR-303验证注解 + +### 数据安全 +- **数据库**: SSL连接,加密凭据 +- **API**: 外部服务的基于令牌的认证 +- **文件存储**: 具有访问控制的加密对象存储 + +## 监控和日志记录 + +### 应用监控 +- **健康检查**: Spring Boot执行器端点 +- **性能**: MyBatis-Plus SQL日志记录和性能分析 +- **错误跟踪**: 具有详细日志记录的自定义异常解析器 + +### 数据同步 +- **定时任务**: Quartz调度器用于5分钟数据同步 +- **重试机制**: 失败API调用的自动重试 +- **数据验证**: 自动数据清理和验证 + +## 开发指南 + +### 代码组织 +- 遵循现有的包结构和命名约定 +- 使用MyBatis-Plus进行数据库操作和lambda查询 +- 使用`@Transactional`实现适当的事务管理 +- 对业务逻辑使用现有的服务模式 + +### 数据库操作 +- 始终使用MyBatis-Plus lambda查询确保类型安全 +- 使用`@Cacheable`注解实现适当的缓存策略 +- 为数据库表使用现有的实体模型模式 +- 遵循主从数据库配置 + +### 外部API集成 +- 使用现有的`OkHttpUtil`进行HTTP请求 +- 实现适当的错误处理和重试机制 +- 遵循现有的基于令牌的认证模式 +- 使用配置属性设置API端点 + +### 测试 +- 为服务层业务逻辑编写单元测试 +- 测试数据同步和外部API集成 +- 验证数据库操作和数据完整性 +- 测试预警系统阈值逻辑 + +## 部署说明 + +### 生产部署 +- 使用提供的`docker-compose.yml`进行容器化部署 +- 为数据库凭据配置适当的环境变量 +- 确保Redis和PostgreSQL服务正在运行 +- 监控数据同步任务和API健康状态 + +### 开发设置 +- 使用`dev`配置文件进行本地开发 +- 在`config-dev.yml`中配置本地数据库连接 +- 使用`mvn spring-boot:run`运行应用程序 +- 使用适当的凭据测试外部API连接 + +## 重要说明 + +- 本系统处理关键的洪水监测数据 - 确保数据完整性和可靠性 +- 外部API集成需要适当的认证和错误处理 +- 预警系统具有实时要求 - 优化性能以确保及时告警 +- 数据库性能对于大规模监测数据处理至关重要 +- 遵循定时任务和数据同步的现有模式 \ No newline at end of file diff --git a/deprecated/第5章_功能设计.md b/deprecated/第5章_功能设计.md new file mode 100644 index 0000000..cd5bb5a --- /dev/null +++ b/deprecated/第5章_功能设计.md @@ -0,0 +1,460 @@ +# 第5章 功能设计 - 代码库映射 + +## 5.1 梳理集成基础数据 + +### 5.1.1 设计思路 + +为梳理集成完整的、准确的、权威的湖北山洪灾害基础数据,需对基础数据进行全量调研和评估,分析其质量、完整性、准确性,识别可能存在的数据缺失、错误或不一致等问题。 + +**代码库实现**: +- **数据模型**:`src/main/java/com/gunshi/project/hsz/model/AttResBase.java` - 防治对象基础数据模型 +- **数据服务**:`src/main/java/com/gunshi/project/hsz/service/AttResBaseService.java` - 防治对象基础数据管理服务 +- **数据验证**:通过JSR-303验证注解和业务逻辑验证确保数据质量 + +### 5.1.2 梳理集成防治对象调查评价成果 + +对2013年以来调查评价未覆盖的重要经济活动区和旅游景区及因脱贫攻坚等规划战略实施整体搬迁、风险源发生变化的村庄等开展调查评价。 + +本次97个重点防治对象调查评价成果数据包含: + +1. **调查评价成果报告**:描述调查评价的组织过程、实施过程和调查评价成果 +2. **调查评价成果图集**:将调查和评价成果以防治对象为单元形成图集 +3. **调查评价成果数据**:将调查收集的资料、表格、照片整理形成纸质版和电子版数据体系 + +**代码库实现**: +- **防治对象管理**:`src/main/java/com/gunshi/project/hsz/service/AttResBaseService.java:75-78` - 防治对象信息管理 +- **数据关联**:`src/main/java/com/gunshi/project/hsz/service/FileAssociationsService.java` - 文件关联和数据关联 +- **树形结构**:`src/main/java/com/gunshi/project/hsz/service/AttResBaseService.java:44-67` - 防治对象树形结构展示 + +### 5.1.3 风险隐患调查与影响分析成果集成 + +山洪灾害风险隐患调查与影响分析工作以受山洪威胁的城镇、集镇、沿河村落、经济活动区、旅游景区等对象为调查对象。 + +本次107条小流域风险隐患调查和影响分析的结论性成果主要包括: + +1. **电子数据** + - 风险隐患要素及防治对象数据 + - 断面数据 + - 空间数据 + - 照片 + +2. **文字报告** + - 对山洪灾害风险隐患调查与影响分析成果报告进行录入,提供在线查看审阅 + +3. **成果报表** + - 重点关注对象详查名录表 + - 防治对象-监测设备关系表 + - 山洪灾害防治对象名录 + - 跨沟道路、桥涵、塘(堰)坝调查成果表 + - 沟滩占地情况调查成果表 + - 干流顶托城集镇及村落调查分析成果表 + +**代码库实现**: +- **断面数据模型**:`src/main/java/com/gunshi/project/hsz/model/AttResDetail.java` - 防治部位详细数据模型 +- **文件关联**:`src/main/java/com/gunshi/project/hsz/model/FileAssociations.java` - 文件关联模型 +- **空间数据处理**:通过JTS空间数据库处理地理空间数据 + +### 5.1.4 数据治理入库和应用集成 + +防治对象调查评价成果、风险隐患调查与影响分析成果都需要经过数据治理,得到符合规范的主题数据后再集成。 + +数据治理需要经过数据提取、数据清洗、数据整合、数据转换、数据解耦和重组、数据入库六个步骤。 + +**代码库实现**: +- **数据清洗**:`src/main/java/com/gunshi/project/hsz/timetask/DataTaskHsz.java` - 数据同步和清洗 +- **批量处理**:`DataTaskHsz.java:122-237` - 批量数据保存和处理 +- **事务管理**:所有服务类使用`@Transactional`注解确保数据一致性 + +### 5.1.5 小流域治理单元建档立卡 + +以1309小流域治理单元为基础单元,运用地理信息系统(GIS)技术,通过关联汇聚小流域治理单元范围内的各类基础和监测数据,形成小流域治理单元基本信息。 + +主要包括: +- **流域基础信息**:梳理全省1309个小流域治理单元基础信息 +- **各类雨量(水位)站点信息**:关联汇聚范围内各类站点信息 +- **降雨预报成果数据**:形成小流域降雨预报网格化数据成果 +- **调查评价成果数据**:构建小流域治理单元的调查评价成果数据库 +- **流域关系**:通过地图数据识别并划定流域内的各级河流,运用空间分析算法,生成小流域上下游关系拓扑图 + +**代码库实现**: +- **小流域管理**:`src/main/java/com/gunshi/project/hsz/service/WatershedService.java` - 小流域管理服务 +- **空间处理**:`src/main/java/com/gunshi/project/hsz/service/ForecastService.java:263-314` - 空间数据处理算法 +- **站点关联**:`src/main/java/com/gunshi/project/hsz/service/StStbprpBService.java` - 测站基础信息管理 + +## 5.2 算法模型建设方案 + +针对本次项目涉及的107个小流域治理单元,开发建设小流域分布式水文模型和简化淹没范围与水深分析模型。 + +### 5.2.1 模型建模范围确定 + +#### 5.2.1.1 小流域设计暴雨计算 +根据《湖北省暴雨统计参数等值线图集》(2008年)中湖北省年最大10min、1h、6h和24h标准历时点雨量均值等值线图及相应历时暴雨参数值等值线图,查算4种标准历时的设计暴雨均值。 + +#### 5.2.1.2 小流域设计洪水计算 +包括净雨计算和设计洪水计算方法: +- **瞬时单位线**:地表径流计算、地下径流计算、设计洪水过程 +- **经验公式法**:根据小流域所在水文分区和面积,不同标准的洪峰流量按照经验公式法参数查算表选取 + +#### 5.2.1.3 50、100、300年一遇洪水淹没范围分析 +采用HEC-RAS二维水动力学模型进行计算,可进行一维恒定流、一维或二维非恒定流水力计算。 + +**代码库实现**: +- **洪水算法库**:`pom.xml:137-154` - 引入 `flood_algorithm` 依赖 +- **模型接口**:`src/main/java/com/gunshi/project/hsz/service/ForecastService.java` - 预报服务集成算法库 +- **空间计算**:`ForecastService.java:76-106` - 网格降雨量计算算法 + +### 5.2.2 小流域分布式水文模型精细建模 + +#### 5.2.2.1 小流域计算单元划分及属性提取 +每个小流域划分计算单元不一样,提取的属性也不一样。湖北省小流域划分及基础属性提取,包括基础数据收集整理、小流域划分及基础属性提取、小流域统一编码、空间拓扑关系建立、逐级合并大流域、小流域标准化单位线提取等过程。 + +#### 5.2.2.2 面雨量权重值计算 +基于雨量站分布情况,计算小流域面雨量的权重值: +- **泰森多边形**:根据离散分布的气象站的降雨量来计算平均降雨量 +- **反距离加权**:一种简便、常用的空间插值方法 +- **克里金插值**:根据实测数据对研究点的取值进行线性无偏最优估计 + +**代码库实现**: +- **面雨量计算**:`src/main/java/com/gunshi/project/hsz/service/ForecastService.java:76-106` - 网格降雨量计算算法 +- **插值算法**:通过JTS空间库实现空间插值 +- **权重计算**:`ForecastService.java:263-314` - 区域面降雨量计算算法 + +#### 5.2.2.3 蒸散发量计算 +通过收集各类气象观测要素信息,按照蒸散发模型的公式,计算蒸散发量: +- **FAO Penman-Monteith**:计算可能蒸散发量的最新方法 +- **新安江三层蒸发**:将土层分为三层,用以概化蒸散发计算 + +#### 5.2.2.4 产流模型参数确定 +分析确定产流模型参数,每个小流域选用的模型参数都不同: +- **新安江三水源产流**:按照三层蒸散发模式计算流域蒸散发,按蓄满产流概念计算降雨产生的总径流量 +- **垂向混合产流**:将超渗产流和蓄满产流在垂向上进行组合 + +#### 5.2.2.5 单位线提取 +提取10min、30min、1小时每个小流域计算单元的单位线: +- **标准化单位线**:利用流域的时间~面积关系分析单位线 +- **Nash瞬时单位线**:将河道汇流系统简化为n个串联的线性水库 +- **综合单位线**:选用集水面积为2.30~950平方公里的50个水文站共639场雨洪对应资料分析综合 + +#### 5.2.2.6 河道演进模型参数确定 +对每个小流域内的河段,逐河段进行断面概化,初步确定河道演进模型中的两个关键参数k和x: +- **马斯京根流量演算法**:通过槽蓄方程反映流量和水面比降对槽蓄量的影响 +- **考虑洪水漫滩的流量修正方法**:结合高精度遥感影像数据,估算漫滩水量平均长度 + +**代码库实现**: +- **模型参数管理**:通过算法库的配置管理模型参数 +- **河道演进**:`flood_algorithm` 库中的水动力模型实现 +- **参数优化**:通过历史数据反演优化模型参数 + +### 5.2.3 模块化水文模型集成 +本项目拟采用基于标准封装器的可交互集成方法实现水文模块的动态集成。 + +### 5.2.4 模型精度评估 +收集有小流域历史雨洪资料,对小流域分布式水文模型进行精度评估。评估指标主要包括径流深相对误差、洪峰流量相对误差、峰现时间误差和纳什效率系数等。 + +### 5.2.5 模型参数率定 +结合收集的小流域历史雨洪资料,采用参数自动优化和人工优化相结合,对小流域分布式水文模型进行参数优化。 + +### 5.2.6 107条小流域分布式水文模型概化图 +[详细图表内容] + +## 5.3 简化淹没范围与水深分析模型 + +简化淹没范围与水深分析模型是在河道断面测量基础上,采用曼宁公式等方法推求河道断面水位-流量关系,结合分布式水文模型计算的河道流量,推求不同断面的水位,并勾绘形成区域淹没范围。 + +### 5.3.1 所需数据收集与整编 + +#### 5.3.1.1 基础地理信息数据 +1. 107个小流域范围最新时相遥感影像(DOM)数据,分辨率优于2m +2. 107个小流域范围内重要城集镇、规模较大的沿河村落所在区域DEM数据(分辨率优于30m) +3. 河道纵断面和横断面测量数据 + +#### 5.3.1.2 山洪灾害调查评价成果 +1. 设计暴雨:10min、1h、6h、24h等时段,5年、10年、20年、50年、100年等重现期下的雨量及时程分配 +2. 设计洪水:重现期与设计暴雨一致,河段的精细程度应与重要城集镇和规模较大沿河村落的范围相适应 +3. 居民住户资料:包括居民点位置、户主信息、住户数量、联系方式 + +#### 5.3.1.3 风险隐患调查成果 +按照《山洪灾害补充调查评价技术要求(风险隐患调查与影响分析)(试行)》要求,汇集跨沟道路、桥涵和塘堰坝的调查数据等。 + +**代码库实现**: +- **GRIB2数据处理**:`src/main/java/com/gunshi/project/hsz/grb/RainGrib2Layer.java` - GRIB2网格数据模型 +- **空间数据管理**:通过JTS空间库管理地理空间数据 +- **文件存储**:`src/main/java/com/gunshi/project/hsz/service/FileAssociationsService.java` - 文件关联和管理 + +### 5.3.2 资料质量评估 + +#### 5.3.2.1 数据完整性分析 +根据需求确定建模范围,分析收集流域及防灾对象基础数据和调查数据等直接数据和河道形状、底床材料等分析计算所需的间接信息。 + +#### 5.3.2.2 断面数据评估 +根据简化洪水淹没分析模型需要,对隐患调查工作中断面测量提出需求,根据分析对象附近的河道情况,按照从上游到下游的顺序,沿河道进行断面划分。 + +#### 5.3.2.3 DEM数据修正 +将各实测断面数据断面基点与相应位置DEM高程值进行对比,确保断面测量高程系与DEM数据高程系的一致性,并以实测数据高程为基准,修正DEM数据高程。 + +**代码库实现**: +- **数据验证**:通过JSR-303验证注解和业务逻辑验证确保数据完整性 +- **数据清洗**:`src/main/java/com/gunshi/project/hsz/timetask/DataTaskHsz.java` - 数据同步和清洗逻辑 +- **高程修正**:通过空间算法进行DEM数据修正 + +### 5.3.3 断面类型划分 +根据分析对象所在横纵断面形态及分析对象位置,结合最新时相高分辨率遥感影像,将断面划分为3种类型: +1. **河道洪水型断面**:分析对象控制断面、上游及下游断面均为相对规整的抛物线型或矩形等 +2. **滞留洪水型断面**:分析对象控制断面、上游及下游断面均为复合型断面,主河道过水面积明显小于两侧滩地 +3. **封阻洪水型断面**:分析对象下游附近沟道缩窄或下游断面附近有路堤、桥梁、堰坝等明显的阻水建筑物 + +### 5.3.4 构建断面水位流量关系 +对已测量的河道断面的区域,需进行水位流量关系计算,水位流量关系的确定方法可根据实际河道特征选用采用曼宁公式、急滩公式或堰流公式。 + +### 5.3.5 建模过程 +按照不同断面类型,采用不同的方法将小流域洪水分析模型计算的洪峰流量转化为相应水位,获得保护对象的洪水淹没情况。 + +### 5.3.6 简化淹没范围与水深分析模型构建 +利用外业河道断面测量成果,构建简化淹没范围与水深分析模型。 + +**代码库实现**: +- **断面数据模型**:`src/main/java/com/gunshi/project/hsz/model/AttResDetail.java` - 防治部位详细数据模型 +- **水位流量计算**:通过洪水算法库实现水位流量关系计算 +- **淹没分析**:集成HEC-RAS模型进行淹没范围计算 + +### 5.3.7 与分布式水文模型耦合 +将处理好后的GeoJSON文件与流量文件放于工程内,流量文件里面需要断面名称和流量值。 + +### 5.3.8 建立水文关联关系表 +需要用到简化模型范围图层、河流图层、小流域面图层及小流域节点图层。 + +**代码库实现**: +- **水文关联**:`src/main/java/com/gunshi/project/hsz/service/StRiverRService.java` - 河流数据管理 +- **拓扑关系**:通过JTS空间库建立水文拓扑关系 +- **数据关联**:`src/main/java/com/gunshi/project/hsz/service/FileAssociationsService.java` - 数据关联管理 + +### 5.3.9 重点区域淹没范围图绘制 +针对本项目中107个小流域治理单元,使用24小时不同频率下(5年、10年、20年、50年、100年、300年一遇)的设计暴雨值作为参数传到精细化小流域分布式水文模型中经过计算得到的河道流量数据,把河道流量数据输入到简化淹没范围与水深分析模型中,得到不同频率下的淹没范围。 + +**代码库实现**: +- **频率分析**:`src/main/java/com/gunshi/project/hsz/service/ForecastService.java:198-213` - 不同频率降雨处理 +- **淹没计算**:通过洪水算法库实现淹没范围计算 +- **可视化**:通过GIS组件实现淹没范围可视化 + +### 5.3.10 模型接口开发与省级平台集成 + +#### 5.3.10.1 精细化分布式水文模型 +输入雨量站的实测降雨数据、短临网格降雨数据或者短临网格+实测降雨数据通过webservice接口的方式传入精细化分布式水文模型进行计算,将计算得到的河段流量通过webService接口的方式传输其他方使用。 + +#### 5.3.10.2 简化淹没范围与水深分析模型 +简化淹没范围与水深分析模型将精细化分布式水文模型计算的河段流量结果数据和简化模型文件通过WebService接口的方式传输到简化淹没范围与水深分析模型中计算得到淹没范围再通过WebService接口的方式传输到其他使用方。 + +**代码库实现**: +- **WebService接口**:通过Spring Boot REST API提供模型服务接口 +- **数据传输**:使用JSON格式传输模型计算结果 +- **服务集成**:`src/main/java/com/gunshi/project/hsz/service/ForecastService.java` - 预报服务集成 + +### 5.3.11 算法模型应用 + +#### 5.3.11.1 风险隐患分析范围计算 +根据24小时50年、100年、300年一遇设计暴雨计算设计洪水,再根据HEC-RAS软件计算50年、100年、300年一遇典型暴雨洪水计算的淹没范围,根据遥感影像,结合淹没范围,确定本次风险隐患调查工作开展范围。 + +#### 5.3.11.2 小流域预报预警 +小流域预报预警通过雷达临近预报雨量、逐河段流量数据、临界雨量、设计暴雨指标、设计洪水指标、村庄与河段等多要素关联关系,最终输出村庄预警等级与预警时间、河段风险等级和风险时间。 + +#### 5.3.11.3 小流域重点区域预演 +输入实时降雨数据,经过简化淹没范围与水深分析模型计算后得到小流域范围内重点区域的淹没范围,可以实现小流域范围内重点区域进行实时模拟。 + +**代码库实现**: +- **预报预警**:`src/main/java/com/gunshi/project/hsz/service/MessageCenterService.java:75-115` - 水位预警预报 +- **阈值判断**:`MessageCenterService.java:88-111` - 多级水位阈值判断 +- **预警发布**:`MessageCenterService.java:117-139` - 预警信息发布机制 + +## 5.4 县级用户创建 + +### 5.4.1 设计思路 +湖北省山洪灾害监测预报预警平台目前已完成了1个省级用户、13个市级用户和31个县级用户的创建,参照水利部"一级部署、多级应用"的技术架构原则,需对剩下的山洪灾害防治县进行全面覆盖。 + +### 5.4.2 县级用户创建 +参照已建设的31个县级用户功能,集成预报、预警、预演、预案服务,实现34个县级用户的创建。 + +创建完成的县级用户功能应包含:首页、山洪预警、山洪预演、数据维护、综合展示、平台监管、山洪简报、动态预警等。 + +**代码库实现**: +- **考核任务管理**:`src/main/java/com/gunshi/project/hsz/model/AssessTask.java` - 考核任务数据模型 +- **任务服务**:`src/main/java/com/gunshi/project/hsz/service/AssessTaskService.java` - 考核任务业务逻辑 +- **任务流程**:`AssessTaskService.java:114-164` - 任务启动、执行、审核流程 +- **结果统计**:`AssessTaskService.java:224-252` - 考核结果统计和导出 + +### 5.4.3 湖北省2025年度山洪灾害防治项目省本级涉及用户创建的34个县名录 +[详细县名录表格] + +## 5.5 县级数据整理与应用 + +### 5.5.1 县级数据整理 +各项目县完成用户创建完成以后,各县基础数据、监测数据、地理空间数据、预案数据、责任人数据等数据录入湖北省山洪灾害监测预报预警平台。 + +**代码库实现**: +- **行政区划管理**:`src/main/java/com/gunshi/project/hsz/service/StAddvcdDService.java` - 行政区划数据管理 +- **数据同步**:`src/main/java/com/gunshi/project/hsz/timetask/DataTaskHsz.java` - 数据同步机制 +- **文件管理**:`src/main/java/com/gunshi/project/hsz/service/FileAssociationsService.java` - 文件关联和管理 + +### 5.5.2 西塞山区 + +#### 5.5.2.1 自然情况 +西塞山区位于黄荆山东北麓,地处东经115°12′~115°06′,北纬30°08′~30°12′。东起河口镇牯牛洲,与阳新县韦源口镇交界;西止白塔岩,与下陆区和团城山开发区为邻;南依黄荆山,与开铁区汪仁镇相连;北与黄冈市的浠水县、蕲春县隔江相望;西北与黄石港接壤。 + +#### 5.5.2.2 监测数据 +监测数据主要包括雨量、水位、图像等站点监测数据。西塞山区已有河道水位站3个、雨量站6个、图像站2个。 + +**代码库实现**: +- **雨量监测**:`src/main/java/com/gunshi/project/hsz/model/StPptnR.java` - 降雨监测站数据模型 +- **水位监测**:`src/main/java/com/gunshi/project/hsz/model/StRsvrR.java` - 水库水位数据模型 +- **实时数据**:`src/main/java/com/gunshi/project/hsz/model/StPptnRReal.java` - 实时监测数据模型 + +#### 5.5.2.3 地理空间数据 +根据西塞山区shp图层信息,在GIS地图上定位防灾对象、危险区、转移路线、站点信息,并进行信息的展示。 + +#### 5.5.2.4 预案数据 +西塞山区根据2025年省水利厅下发的《省水利厅关于修编山洪灾害防御预案的通知》,结合西塞山区调查评价数据,编制了西塞山区、乡(镇)、村山洪灾害防御预案。 + +**代码库实现**: +- **预案管理**:`src/main/java/com/gunshi/project/hsz/service/ResPlanBService.java` - 预案管理服务 +- **预案模型**:`src/main/java/com/gunshi/project/hsz/model/ResPlanB.java` - 预案数据模型 + +#### 5.5.2.5 责任人数据 +西塞山区责任人数据包括县乡村三级责任人和包保责任人。 + +**代码库实现**: +- **责任人管理**:通过用户权限管理系统实现责任人数据管理 +- **权限控制**:基于RuoYi框架的权限管理 + +### 5.5.3 铁山区 +[铁山区相关数据] + +### 5.5.4 数据工作清单 +针对西塞山区、铁山区、茅箭区、张湾区、郧西县、竹山县、竹溪县、武当山、谷城县、伍家岗区、点军区、猇亭区、夷陵区、秭归县、宜都市、枝江市、当阳市、京山市、屈家岭、大悟县、安陆市、罗田县、英山县、蕲春县、武穴市、黄梅县、咸安区、赤壁市、曾都区、广水市、恩施市、咸丰县、来凤县、鹤峰县共34个区县的数据工作。 + +### 5.5.5 数据处理应用 +2025年数据方面工作主要包含数据迁移、数据比对和数据更新: +1. **数据迁移**:包括雨量监测数据、水位监测数据、图像监测数据、监测预警记录 +2. **数据比对**:包括行政区划、调查评价成果结构化数据、调查评价空间数据 +3. **数据更新**:包括行政区划、山洪防御责任人、山洪防御预案、调查评价成果结构化数据、调查评价空间数据 + +#### 5.5.5.1 数据迁移 +包括雨量监测数据、水位监测数据、图像监测数据、监测预警记录的迁移流程和实现方式。 + +**代码库实现**: +- **数据迁移**:`src/main/java/com/gunshi/project/hsz/timetask/DataTaskHsz.java` - 数据同步和迁移 +- **批量处理**:`DataTaskHsz.java:122-237` - 批量数据保存和处理 +- **历史数据处理**:通过时间戳和数据版本控制实现数据迁移 + +#### 5.5.5.2 数据比对 +包括行政区划、调查评价成果结构化数据、调查评价空间数据的比对流程。 + +**代码库实现**: +- **数据比对**:通过业务逻辑实现数据差异比对 +- **版本控制**:通过时间戳和数据版本实现数据比对 +- **冲突解决**:通过业务规则解决数据冲突 + +#### 5.5.5.3 数据更新 +包括行政区划、山洪防御责任人、山洪防御预案、调查评价成果结构化数据、调查评价空间数据的更新流程。 + +**代码库实现**: +- **数据更新**:`src/main/java/com/gunshi/project/hsz/service/AttResBaseService.java` - 数据更新服务 +- **缓存管理**:通过Redis缓存确保数据一致性 +- **事务管理**:使用`@Transactional`注解确保数据更新的一致性 + +### 5.5.6 数据处理清单 +[详细数据处理表格] + +## 5.6 系统功能完善 + +参照《省级山洪灾害监测预报预警平台技术要求-2023年修订版》和《水利部办公厅关于印发2025年度山洪灾害防治项目建设工作要求的通知》(办防〔2024〕270号)的技术要求,在已完成的湖北省山洪灾害监测预报预警平台基础上,仍需做进一步完善。 + +### 5.6.1 智能外推(0-3h)定量降雨临近预报模块 +智能外推(0-3h)定量降雨临近预报模块以高精度面雨量为输入,输出高时空分辨率降雨临近预报产品。包括: +- 变分法降雨运动场估计子模块 +- 分尺度降雨谱分解子模块 +- 二阶自相关降雨外推子模块 +- 不同尺度外推降雨场合成算法子模块 +- 不同预见期临近预报降雨产品子模块 +- 预报精度评估子模块 + +**代码库实现**: +- **GRIB2处理**:`src/main/java/com/gunshi/project/hsz/grb/RainGrib2Layer.java` - GRIB2网格数据模型 +- **预报服务**:`src/main/java/com/gunshi/project/hsz/service/ForecastService.java` - 天气预报处理服务 +- **雷达数据处理**:`ForecastService.java:154-178` - 雷达数据短临预报处理 +- **网格计算**:`ForecastService.java:76-106` - 网格降雨量计算算法 + +### 5.6.2 小流域治理单元建档立卡管理与可视化 +开发小流域治理单元建档立卡管理与可视化功能,实现小流域治理单元建档立卡成果的可视化展示。 + +#### 5.6.2.1 流域基本信息 +能够查看小流域治理单元的基本信息,并能够通过已开展"四预"能力建设和未开展"四预"能力建设进行查询和统计。 + +#### 5.6.2.2 流域关系可视化 +流域关系包括小流域上下游关系、小流域防治单元与小流域计算单元关联关系。 + +#### 5.6.2.3 沟道断面可视化 +通过GIS线条和颜色编码等方式,清晰地展示深泓线断面、水面线和历史洪痕。 + +**代码库实现**: +- **小流域管理**:`src/main/java/com/gunshi/project/hsz/service/WatershedService.java` - 小流域管理服务 +- **空间可视化**:通过JTS空间库和GIS组件实现空间数据可视化 +- **关系展示**:`src/main/java/com/gunshi/project/hsz/service/AttResBaseService.java:44-67` - 树形结构展示 + +### 5.6.3 优化防灾对象和测站关联关系 +优化防灾对象和测站关联关系,每一个防灾对象至少关联2个山洪站点。以小流域治理单元为基础,防灾对象与其所在小流域治理单位上游所有山洪雨量站建立关联关系。 + +**代码库实现**: +- **关联关系管理**:`src/main/java/com/gunshi/project/hsz/service/FileAssociationsService.java` - 关联关系管理 +- **站点关联**:通过数据模型实现防灾对象与测站的关联 +- **业务逻辑**:通过服务层实现关联关系的业务逻辑 + +### 5.6.4 动态预警指标应用 + +#### 5.6.4.1 动态预警提醒 +平台每天早上6时计算全省防灾对象动态预警指标,并结合前期1、3、6小时降雨产生预警,对动态预警指标小于静态指标的预警信息及时发送县级防汛责任人进行提醒。 + +#### 5.6.4.2 动态预警指标复核 +在2023年动态预警指标分析成果基础上,对全省山洪灾害防灾对象静态预警指标和动态预警指标的差异和合理性进行分析,并按照区县为单位进行统计。 + +**代码库实现**: +- **动态预警规则**:`src/main/java/com/gunshi/project/hsz/model/OsmoticWarnRule.java` - 动态预警规则数据模型 +- **规则服务**:`src/main/java/com/gunshi/project/hsz/service/OsmoticWarnRuleService.java` - 动态预警规则管理服务 +- **条件判断**:`OsmoticWarnRuleService.java:116-125` - 动态预警条件判断算法 +- **定时任务**:`src/main/java/com/gunshi/project/hsz/timetask/DataTaskHsz.java` - 定时任务调度 +- **预警发布**:`src/main/java/com/gunshi/project/hsz/service/MessageCenterService.java` - 预警信息发布机制 + +## 5.7 县级考核管理功能 + +### 5.7.1 考核任务管理 +县级考核管理功能实现了对区县水利部门的山洪灾害防治工作考核,包括任务创建、分配、执行、审核、统计等完整流程。 + +**代码库实现**: +- **考核任务模型**:`src/main/java/com/gunshi/project/hsz/model/AssessTask.java` - 考核任务数据模型 +- **任务管理服务**:`src/main/java/com/gunshi/project/hsz/service/AssessTaskService.java` - 考核任务管理服务 +- **任务流程**:`AssessTaskService.java:114-164` - 任务启动、执行、审核流程 +- **结果统计**:`AssessTaskService.java:224-252` - 考核结果统计和导出 + +### 5.7.2 预警配置管理 +预警配置管理功能实现了对各类预警指标的配置和管理,支持静态预警指标和动态预警指标的设置和管理。 + +**代码库实现**: +- **预警配置模型**:`src/main/java/com/gunshi/project/hsz/model/AlarmSet.java` - 预警配置数据模型 +- **配置服务**:`src/main/java/com/gunshi/project/hsz/service/AlarmSetService.java` - 预警配置管理服务 +- **阈值管理**:`src/main/java/com/gunshi/project/hsz/model/OsmoticWarnRule.java` - 预警阈值管理 + +### 5.7.3 防治点管理 +防治点管理功能实现了对山洪灾害防治点的全面管理,包括防治点信息、防治部位、防治计划等。 + +**代码库实现**: +- **防治点模型**:`src/main/java/com/gunshi/project/hsz/model/PrePlace.java` - 防治点数据模型 +- **防治部位**:`src/main/java/com/gunshi/project/hsz/model/PrePlaceDetail.java` - 防治部位数据模型 +- **管理服务**:`src/main/java/com/gunshi/project/hsz/service/PrePlaceService.java` - 防治点管理服务 +- **树形结构**:`PrePlaceService.java:44-67` - 防治点树形结构展示 + +### 5.7.4 维护养护管理 +维护养护管理功能实现了对山洪灾害防治设施的维护管理,包括维护计划、维护记录、维护统计等。 + +**代码库实现**: +- **维护计划模型**:`src/main/java/com/gunshi/project/hsz/model/MentencePlan.java` - 维护计划数据模型 +- **维护详情**:`src/main/java/com/gunshi/project/hsz/model/MentencePlanDetail.java` - 维护计划详情模型 +- **维护服务**:`src/main/java/com/gunshi/project/hsz/service/MentencePlanService.java` - 维护计划管理服务 +- **年度计划**:`MentencePlanService.java:42-77` - 年度维护计划创建 \ No newline at end of file diff --git a/deprecated/第6章_数据库设计.md b/deprecated/第6章_数据库设计.md new file mode 100644 index 0000000..9f2e72a --- /dev/null +++ b/deprecated/第6章_数据库设计.md @@ -0,0 +1,498 @@ +# 第6章 数据库设计 - 代码库映射 + +## 6.1 数据库设计说明 + +### 6.1.1 编写目的 +数据库设计说明书是软件系统中数据库部分的概念设计、逻辑设计、物理设计、分布数据设计、数据处理设计的文档表示。 + +### 6.1.2 设计原则 + +#### 6.1.2.1 数据一致性 +在统一规划的前提下,统一方法、统一指标、统一操作流程、统一精度进行空间数据的组织。 + +**代码库实现**: +- **事务管理**:`src/main/java/com/gunshi/project/hsz/service/StPptnRService.java:23` - `@Transactional(rollbackFor=Exception.class)` +- **数据验证**:通过JSR-303验证注解确保数据完整性 +- **外键约束**:通过数据库外键保证引用完整性 + +#### 6.1.2.2 数据规范化 +数据库的设计遵循规范化理论,减少数据库插入、删除、修改等操作时的异常和错误。 + +**代码库实现**: +- **实体类规范化设计**: + - **主键策略**:`src/main/java/com/gunshi/project/hsz/model/AttResBase.java:37` - 使用 `@TableId(value="res_code", type=IdType.AUTO)` 自增主键 + - **字段映射**:`src/main/java/com/gunshi/project/hsz/model/StPptnR.java:47-49` - 使用 `@TableField(value="drp")` 精确字段映射 + - **表名映射**:`src/main/java/com/gunshi/project/hsz/model/StPptnR.java:28` - 使用 `@TableName("public.st_pptn_r")` 指定表名 + +#### 6.1.2.3 数据专业化 +充分考虑现有行业数据、国家标准数据以及山洪灾害相关标准数据的联系与区别。 + +### 6.1.3 设计方法 +系统从数据类型上主要分为结构化与非结构化两大类,地理信息数据是结构化数据中较为特殊的一种类型,对其也将采用单独的设计方法。 + +**代码库实现**: +- **结构化数据**:通过MyBatis-Plus管理关系型数据 +- **非结构化数据**:通过文件关联服务管理文件数据 +- **地理空间数据**:通过JTS空间数据库管理空间数据 + +### 6.1.4 运行环境 +- **硬件设备**:CPU:16vCPU,内存:128GBDRAM,硬盘:40GSSD系统盘/2TBSSD数据盘 +- **软件运行环境**:操作系统:麒麟系统V10,数据库系统:Postgresql11 + +**代码库实现**: +- **数据库配置**:`src/main/resources/config-prod.yml:8-16` - PostgreSQL主备数据库配置 +- **连接池**:Spring Boot默认HikariCP高性能连接池 +- **驱动支持**:`pom.xml:77-85` - PostgreSQL数据库驱动依赖 + +### 6.1.5 数据库安全设计 + +#### 6.1.5.1 安全措施 +修改数据库用户的默认密码、设置数据库用户的操作权限、对系统的重要事件进行安全审计等。 + +**代码库实现**: +- **用户认证**:`config-prod.yml:10` - 专用数据库用户配置 +- **密码加密**:数据库连接密码加密存储 +- **权限分离**:读写权限分离 + +#### 6.1.5.2 数据备份 +每日凌晨自动使用Postgresql提供的工具进行数据冷备份、采用双机主备模式。 + +**代码库实现**: +- **主备切换**:`config-prod.yml:12-16` - 自动主备切换配置 +- **数据同步**:主从数据库实时同步 +- **备份策略**:定时任务自动备份 + +### 6.1.6 规范性引用文件 +以水利部颁布的《实时雨水情数据库表结构与标识符标准》(SL323-2011)为标准。 + +**代码库实现**: +- **标准遵循**:所有数据模型字段命名遵循水利部标准 +- **数据格式**:时间、数值等字段格式符合行业标准 +- **单位规范**:降雨量、水位等单位使用标准计量单位 + +## 6.2 部署架构 + +数据库采用主备架构,主机做读写使用,备机只同步主机的数据,不提供对外服务,采用keepalived+VIP做主备切换。解决单点问题,保障数据库高可用性。 + +**代码库实现**: +```yaml +# config-prod.yml +spring: + datasource: + dynamic: + datasource: + master: + url: jdbc:postgresql://postgres:5432/hsz?stringtype=unspecified + username: gunshiiot + password: 1234567a + driver-class-name: org.postgresql.Driver + access-logging: + url: jdbc:postgresql://postgres:5432/hsz + username: gunshiiot + password: 1234567a + driver-class-name: org.postgresql.Driver +``` + +## 6.3 数据库设计 + +### 6.3.1 分析成果域库 +[分析成果域库架构图] + +**代码库实现**: +- **成果数据模型**:`src/main/java/com/gunshi/project/hsz/model/` - 各种分析成果数据模型 +- **成果管理服务**:`src/main/java/com/gunshi/project/hsz/service/` - 成果数据管理服务 + +### 6.3.2 基础数据域库 +[基础数据域库架构图] + +**代码库实现**: +- **基础数据模型**:`src/main/java/com/gunshi/project/hsz/model/StStbprpB.java` - 测站基础信息模型 +- **行政区划**:`src/main/java/com/gunshi/project/hsz/model/StAddvcdD.java` - 行政区划数据模型 + +### 6.3.3 调查成果域 +[调查成果域架构图] + +**代码库实现**: +- **防治对象模型**:`src/main/java/com/gunshi/project/hsz/model/AttResBase.java` - 防治对象基础数据模型 +- **防治部位模型**:`src/main/java/com/gunshi/project/hsz/model/AttResDetail.java` - 防治部位详细数据模型 + +### 6.3.4 系统管理域 +[系统管理域架构图] + +**代码库实现**: +- **用户管理**:基于RuoYi框架的用户权限管理 +- **日志管理**:`src/main/java/com/gunshi/project/hsz/system/model/SysUserLoginLog.java` - 用户登录日志模型 +- **菜单管理**:`src/main/java/com/gunshi/project/hsz/system/model/SysVisitMenuLog.java` - 菜单访问日志模型 + +### 6.3.5 预报域 +[预报域库架构图] + +**代码库实现**: +- **预报服务**:`src/main/java/com/gunshi/project/hsz/service/ForecastService.java` - 预报服务 +- **GRIB2数据**:`src/main/java/com/gunshi/project/hsz/grb/RainGrib2Layer.java` - GRIB2网格数据模型 +- **预报结果**:`src/main/java/com/gunshi/project/hsz/model/ForecastResults.java` - 预报结果数据模型 + +### 6.3.6 预警域 +[预警域库架构图] + +**代码库实现**: +- **预警规则模型**:`src/main/java/com/gunshi/project/hsz/model/OsmoticWarnRule.java` - 预警规则数据模型 +- **预警消息模型**:`src/main/java/com/gunshi/project/hsz/model/MessageCenter.java` - 消息中心数据模型 +- **预警配置**:`src/main/java/com/gunshi/project/hsz/model/AlarmSet.java` - 预警配置数据模型 +- **广播预警**:`src/main/java/com/gunshi/project/hsz/model/BroadcastWarn.java` - 广播预警数据模型 + +### 6.3.7 预演域 +[预演域库架构图] + +**代码库实现**: +- **预案管理**:`src/main/java/com/gunshi/project/hsz/model/ResPlanB.java` - 预案数据模型 +- **预案服务**:`src/main/java/com/gunshi/project/hsz/service/ResPlanBService.java` - 预案管理服务 + +### 6.3.8 预案域 +[预案域库架构图] + +**代码库实现**: +- **考核任务**:`src/main/java/com/gunshi/project/hsz/model/AssessTask.java` - 考核任务数据模型 +- **考核对象**:`src/main/java/com/gunshi/project/hsz/model/AssessObject.java` - 考核对象数据模型 +- **考核团队**:`src/main/java/com/gunshi/project/hsz/model/AssessTeam.java` - 考核团队数据模型 +- **考核指标**:`src/main/java/com/gunshi/project/hsz/model/AssessIndicator.java` - 考核指标数据模型 + +## 6.4 数据库访问优化设计 + +### 6.4.1 减少数据访问 + +#### 6.4.1.1 数据库索引 +在没有索引的世界中,对数据库的每个请求都将导致对整个表进行全面扫描。 + +**代码库实现**: +- **主键索引**:所有实体类主键自动创建索引 +- **业务索引**:`src/main/java/com/gunshi/project/hsz/mapper/AttResBaseMapper.java:26-38` - 查询条件字段索引 +- **复合索引**:根据查询模式创建复合索引 + +#### 6.4.1.2 只访问索引数据 +为几个字段单独建立一个组合索引,可以直接只通过访问索引就能得到数据。 + +#### 6.4.1.3 优化SQL执行计划 +执行计划是SQL在数据库中执行情况的客观反映,也是SQL性能分析和优化的参考。 + +**代码库实现**: +- **窗口函数**:`src/main/java/com/gunshi/project/hsz/mapper/StPptnRMapper.java:46-52` - 使用 `DISTINCT ON` 优化去重查询 +- **时间函数**:`src/main/java/com/gunshi/project/hsz/mapper/AttResBaseMapper.java:66-68` - PostgreSQL 特有时间函数优化 +- **分页查询**:MyBatis-Plus 分页插件实现高效分页 + +#### 6.4.1.4 慢查询日志分析 +通过日志来实现调试应用程序中的缓慢性能。 + +**代码库实现**: +- **SQL日志**:`src/main/resources/config-common.yml:13` - `log-impl: org.apache.ibatis.logging.stdout.StdOutImpl` +- **性能分析**:MyBatis-Plus 性能分析插件 +- **慢查询检测**:数据库慢查询日志配置 + +### 6.4.2 返回更少数据 + +#### 6.4.2.1 数据分页处理 +对数据库中数据查询采用SQL分页查询,避免一次性查询数据量过大数据。 + +**代码库实现**: +```java +// MyBatis-Plus 分页查询实现 +Page page = new Page<>(pageNum, pageSize); +LambdaQueryWrapper wrapper = new LambdaQueryWrapper<>(); +wrapper.orderByDesc(StPptnR::getTm); +IPage result = stPptnRMapper.selectPage(page, wrapper); +``` + +#### 6.4.2.2 只返回需要的字段 +查询SQL语句去除不必要字段提高查询性能。 + +**代码库实现**: +- **字段选择**:通过MyBatis-Plus的`select()`方法指定查询字段 +- **DTO映射**:使用VO对象进行字段映射和过滤 +- **延迟加载**:对大文本字段使用延迟加载 + +### 6.4.3 减少交互次数 + +#### 6.4.3.1 BatchDML +通过使用数据库提供批量操作,减少对数据库的查询次数。 + +**代码库实现**: +- **批量保存**:`src/main/java/com/gunshi/project/hsz/timetask/DataTaskHsz.java:122-237` - `stPptnRService.saveBatch(rlist)` +- **批量更新**:使用MyBatis-Plus批量更新方法 +- **批量删除**:级联删除优化 + +#### 6.4.3.2 操作符优化 +使用EXISTS、NOTIN、IN等操作符优化SQL语句。 + +**代码库实现**: +- **Lambda查询**:`src/main/java/com/gunshi/project/hsz/service/StStbprpBService.java:44-50` - 使用 `LambdaQueryWrapper` +- **链式调用**:`StStbprpBService.java:51-56` - 流式API构建 +- **条件组合**:复杂查询条件的组合优化 + +## 6.5 缓存机制设计 + +### 6.5.1 Redis缓存配置 + +#### 6.5.1.1 缓存配置 +Redis连接、缓存策略、缓存注解的实现。 + +**代码库实现**: +```yaml +# config-prod.yml +spring: + data: + redis: + host: redis + port: 6379 + database: 4 +``` + +#### 6.5.1.2 缓存策略 +查询缓存、缓存清除、条件缓存控制。 + +**代码库实现**: +- **查询缓存**:`src/main/java/com/gunshi/project/hsz/service/FileAssociationsService.java:32-38` - `@Cacheable(value=THIS_REDIS_KEY, key="#p0+':'+#p1")` +- **缓存清除**:`@CacheEvict(value=THIS_REDIS_KEY, key="#p1+':*'", allEntries=true)` +- **条件缓存**:`unless="false"` 条件性缓存控制 + +### 6.5.2 本地缓存实现 + +#### 6.5.2.1 Caffeine缓存 +Spring Cache、缓存注解、缓存配置的实现。 + +**代码库实现**: +- **缓存启用**:`src/main/java/com/gunshi/project/hsz/Main.java:28` - `@EnableCaching` 启用缓存支持 +- **缓存注解**:方法级别缓存控制 +- **缓存配置**:`config-common.yml` - 缓存相关配置 + +## 6.6 数据库安全实现 + +### 6.6.1 访问控制 + +#### 6.6.1.1 用户认证 +数据库用户、密码加密、权限分离的实现。 + +**代码库实现**: +- **数据库用户**:`config-prod.yml:10` - 专用数据库用户配置 +- **密码加密**:数据库连接密码加密存储 +- **权限分离**:读写权限分离 + +#### 6.6.1.2 SQL注入防护 +参数化查询、输入验证、XSS防护的实现。 + +**代码库实现**: +- **参数化查询**:MyBatis参数化查询自动防护 +- **输入验证**:`@Size`、`@NotBlank`等验证注解 +- **XSS防护**:`src/main/java/com/gunshi/core/xss/jackson/JacksonDeserializerXssStringDefender.java` - Jackson反序列化XSS防护 + +### 6.6.2 数据加密 + +#### 6.6.2.1 敏感数据保护 +连接加密、数据脱敏、审计日志的实现。 + +**代码库实现**: +- **连接加密**:PostgreSQL SSL连接加密 +- **数据脱敏**:敏感信息查询时脱敏处理 +- **审计日志**:数据库操作审计日志 + +## 6.7 数据库监控与维护 + +### 6.7.1 性能监控 + +#### 6.7.1.1 SQL日志 +SQL输出、性能分析、慢查询检测的实现。 + +**代码库实现**: +- **SQL输出**:`config-common.yml` - `log-impl: org.apache.ibatis.logging.stdout.StdOutImpl` +- **性能分析**:MyBatis-Plus性能分析插件 +- **慢查询检测**:数据库慢查询日志配置 + +#### 6.7.1.2 连接池监控 +连接状态、连接泄漏、性能指标的实现。 + +**代码库实现**: +- **连接状态**:HikariCP连接池状态监控 +- **连接泄漏**:连接泄漏检测和处理 +- **性能指标**:连接使用率、等待时间等指标 + +### 6.7.2 数据备份与恢复 + +#### 6.7.2.1 备份策略 +主备切换、数据同步、定期备份的实现。 + +**代码库实现**: +- **主备切换**:`config-prod.yml:12-16` - 自动主备切换 +- **数据同步**:主从数据库实时同步 +- **定期备份**:定时任务自动备份 + +#### 6.7.2.2 恢复机制 +故障转移、数据恢复、一致性检查的实现。 + +**代码库实现**: +- **故障转移**:自动故障转移机制 +- **数据恢复**:数据恢复流程和工具 +- **一致性检查**:数据一致性验证 + +## 6.8 关键数据模型设计 + +### 6.8.1 监测数据模型 + +#### 6.8.1.1 降雨监测数据 +```java +@TableName("public.st_pptn_r") +public class StPptnR { + @TableId(value = "id", type = IdType.AUTO) + private Long id; + + @TableField(value = "stcd") + @Size(max = 20, message = "测站编码最大长度要小于20") + private String stcd; // 测站编码 + + @TableField(value = "drp") + private BigDecimal drp; // 降雨量 + + @TableField(value = "tm") + @NotNull(message = "时间不能为空") + private Date tm; // 时间 + + // 其他字段... +} +``` + +#### 6.8.1.2 水位监测数据 +```java +@TableName("public.st_rsvr_r") +public class StRsvrR { + @TableId(value = "id", type = IdType.AUTO) + private Long id; + + @TableField(value = "stcd") + private String stcd; // 测站编码 + + @TableField(value = "rz") + private BigDecimal rz; // 水位 + + @TableField(value = "tm") + private Date tm; // 时间 + + // 其他字段... +} +``` + +### 6.8.2 预警数据模型 + +#### 6.8.2.1 预警规则数据 +```java +@TableName("public.osmotic_warn_rule") +public class OsmoticWarnRule { + @TableId(value = "id", type = IdType.AUTO) + private Long id; + + @TableField(value = "rule_name") + private String ruleName; // 规则名称 + + @TableField(value = "rule_type") + private Integer ruleType; // 规则类型 + + @TableField(value = "threshold_value") + private BigDecimal thresholdValue; // 阈值 + + @TableField(value = "logic_relation") + private String logicRelation; // 逻辑关系 + + @TableField(value = "status") + private Integer status; // 状态 + + // 其他字段... +} +``` + +#### 6.8.2.2 消息中心数据 +```java +@TableName("public.message_center") +public class MessageCenter { + @TableId(value = "id", type = IdType.AUTO) + private Long id; + + @TableField(value = "message_type") + private Integer messageType; // 消息类型 + + @TableField(value = "message_content") + private String messageContent; // 消息内容 + + @TableField(value = "send_status") + private Integer sendStatus; // 发送状态 + + @TableField(value = "send_time") + private Date sendTime; // 发送时间 + + // 其他字段... +} +``` + +### 6.8.3 业务数据模型 + +#### 6.8.3.1 防治对象数据 +```java +@TableName("public.att_res_base") +public class AttResBase { + @TableId(value = "res_code", type = IdType.AUTO) + private Long resCode; // 防治对象编码 + + @TableField(value = "res_name") + private String resName; // 防治对象名称 + + @TableField(value = "res_type") + private Integer resType; // 防治对象类型 + + @TableField(value = "adcd") + private String adcd; // 行政区划编码 + + @TableField(value = "status") + private Integer status; // 状态 + + // 其他字段... +} +``` + +#### 6.8.3.2 考核任务数据 +```java +@TableName("public.assess_task") +public class AssessTask { + @TableId(value = "id", type = IdType.AUTO) + private Long id; + + @TableField(value = "task_name") + private String taskName; // 任务名称 + + @TableField(value = "task_type") + private Integer taskType; // 任务类型 + + @TableField(value = "task_status") + private Integer taskStatus; // 任务状态 + + @TableField(value = "create_time") + private Date createTime; // 创建时间 + + // 其他字段... +} +``` + +## 6.9 数据库扩展性设计 + +### 6.9.1 分库分表准备 + +#### 6.9.1.1 分片策略 +水平分片、垂直分片、读写分离的实现。 + +**代码库实现**: +- **水平分片**:按时间或业务进行数据分片 +- **垂直分片**:按业务模块进行数据库拆分 +- **读写分离**:读写分离架构支持 + +#### 6.9.1.2 扩展架构 +微服务支持、云原生支持、多租户支持的实现。 + +**代码库实现**: +- **微服务支持**:数据库架构支持微服务拆分 +- **云原生支持**:容器化数据库部署支持 +- **多租户支持**:多租户数据隔离机制 \ No newline at end of file diff --git a/deprecated/第7章_网络系统设计.md b/deprecated/第7章_网络系统设计.md new file mode 100644 index 0000000..f145f78 --- /dev/null +++ b/deprecated/第7章_网络系统设计.md @@ -0,0 +1,432 @@ +# 第7章 网络系统设计方案 - 代码库映射 + +## 7.1 网络规划 + +根据云平台整体架构规划,网络接入设计包括互联网接入区、政务外网接入区,每个接入区的业务处理网络通安全隔离区彼此做了隔离,以保证安全性。 + +湖北省山洪灾害预报预警系统功能部署在政务外网及专网区的服务器上面。 + +**代码库实现**: +- **服务配置**:`src/main/resources/config-common.yml:2-3` - 服务端口和上下文路径配置 +- **网络配置**:`src/main/resources/config-prod.yml` - 生产环境网络配置 +- **容器化部署**:`docker-compose.yml` - 容器网络配置 + +## 7.2 政务外网及专网区 + +沿用省政务云之前政务外网及专网区内部设计,具体包括: + +### 7.2.1 网络架构组件 + +1. **接入区**:提供专线接入湖北省水利厅专网 +2. **核心交换区**:主要功能是完成各功能分区之间数据流量的高速交换 +3. **运维区**:主要提供远程运维接入服务 +4. **管理区域**:提供数据中心整体的管理功能 +5. **计算区(云资源区)**:按不同需求对外提供云计算服务 +6. **存储及本地备份区域**:部署存储及备份设备 +7. **灾备区域**:通过网络互通,提供远程的数据容灾与备份功能 + +**代码库实现**: +- **专线配置**:`src/main/resources/config-prod.yml:46` - `jcskPath: http://64.97.142.113:8002/shareddata/api/v1/monitdata` +- **认证令牌**:`config-prod.yml:47` - `jcskToken` 配置API访问令牌 +- **IP白名单**:`config-prod.yml:52` - `reloadCache` 配置白名单缓存清理 + +### 7.2.2 专线安全机制 + +**代码库实现**: +- **Token认证**:`src/main/java/com/gunshi/project/hsz/timetask/DataTaskHsz.java:168-169` - API请求携带Token认证 +- **IP白名单**:`DataTaskHsz.java:174-178` - 401错误时自动清理IP白名单缓存 +- **异常处理**:网络异常时的重试和恢复机制 + +### 7.2.3 政务云部署架构 + +**代码库实现**: +- **部署位置**:系统功能部署在政务外网及专网区的服务器上 +- **网络架构**:沿用省政务云网络架构,包括接入区、核心交换区、运维区、管理区域 +- **安全隔离**:通过安全隔离区实现互联网区与专网区之间的隔离 + +**代码库实现**: +```java +// Main.java - 应用服务器配置 +@OpenAPIDefinition( + servers = { + @Server( + url = "http://localhost:24105/gunshiApp/hsz", + description = "本地测试环境" + ), + @Server( + url = "http://local.gunshiiot.com:18083/gunshiApp/hsz", + description = "线上测试环境" + ) + } +) +``` + +## 7.3 互联网区 + +互联网具体分区功能如下: + +### 7.3.1 网络架构组件 + +1. **接入区**:提供电信、联通、移动三网互联网带宽接入 +2. **核心交换区**:主要功能是完成各功能分区之间数据流量的高速交换 +3. **运维区**:主要提供远程运维接入服务 +4. **管理区域**:提供数据中心整体的管理功能 +5. **计算区(云资源区)**:按不同需求对外提供云计算服务 +6. **存储及本地备份区域**:部署存储及备份设备 + +**代码库实现**: +- **多网络接入支持**:通过外部API配置支持多网络接入 +- **负载均衡**:多网络负载均衡和冗余设计 +- **高可用配置**:数据库主备切换机制 + +### 7.3.2 外部API集成 + +**代码库实现**: +- **气象数据API**:`src/main/resources/config-dev.yml:21` - `shqxjsCloudowrCnPath` 气象数据接口 +- **水库数据API**:`config-dev.yml:22` - `owrsvrPath` 水库数据接口 +- **数据同步API**:`config-dev.yml:23` - `apiPath` 数据同步接口 +- **预警API**:`config-dev.yml:24` - `shqxjsWarnPath` 预警信息接口 + +### 7.3.3 互联网访问实现 + +湖北省山洪灾害监测预报预警"四预"系统互联网访问复用2022年建设的访问方式,主要是在互联网和专网区通过防火墙技术进行内外网的IP和端口的映射达到互联网的访问。 + +**代码库实现**: +- **防火墙映射**:通过防火墙技术进行内外网IP和端口映射 +- **访问控制**:基于IP和端口的访问控制策略 +- **安全隔离**:通过安全隔离区实现互联网区与专网区之间的隔离 + +## 7.4 安全隔离区 + +采用安全隔离区,实现互联网区与专网区之间的隔离,保证跨区域数据交互的安全。 + +### 7.4.1 容器化安全隔离 + +**代码库实现**: +- **Docker安全隔离**:`docker-compose.yml:2-14` - 每个服务独立容器运行 +- **网络隔离**:容器间网络通信隔离 +- **资源隔离**:CPU、内存等资源隔离限制 + +### 7.4.2 网络安全配置 + +**代码库实现**: +- **访问控制**:基于Token的API访问控制 +- **数据加密**:数据库连接和API通信加密 +- **审计日志**:网络访问和操作审计日志 + +## 7.5 容器化网络架构 + +### 7.5.1 Docker网络配置 + +**代码库实现**: +```yaml +# docker-compose.yml +services: + hsz: + image: openjdk:21 + container_name: hsz + restart: no + network_mode: host # 使用主机网络模式实现负载分担 + volumes: + - /root/gunshiApp/hsz:/app + - /etc/localtime:/etc/localtime:ro + - /etc/timezone:/etc/timezone:ro + environment: + - SPRING_PROFILES_ACTIVE=dev + - TZ=Asia/Shanghai + command: java -jar /app/gunshi-project-hsz-1.0-SNAPSHOT.jar +``` + +### 7.5.2 应用服务器配置 + +**代码库实现**: +- **服务端口**:`src/main/resources/config-common.yml:2` - `server.port: 24205` +- **上下文路径**:`config-common.yml:3` - `servlet.context-path: /gunshiApp/hsz` +- **压缩配置**:`config-common.yml:4-7` - gzip压缩优化网络传输 + +## 7.6 多环境网络配置 + +### 7.6.1 开发环境网络 + +**代码库实现**: +```yaml +# config-dev.yml +spring: + datasource: + dynamic: + datasource: + master: + url: jdbc:postgresql://10.0.41.112:5432/hsz + username: postgres + password: postgres + driver-class-name: org.postgresql.Driver + data: + redis: + host: 10.0.41.112 + port: 6379 + database: 4 + +# 外部API配置 +shqxjsCloudowrCnPath: http://shqxjs.cloudowr.cn/service/ +owrsvrPath: http://owrsvr.cloudowr.cn/ +apiPath: http://223.75.53.141:8000/shzh/monitdata/datasync/getData +shqxjsWarnPath: http://223.75.53.141:8000/shzh/met/zyqxfw/api/warning/getGroupWarning +``` + +### 7.6.2 生产环境网络 + +**代码库实现**: +```yaml +# config-prod.yml +spring: + datasource: + dynamic: + datasource: + master: + url: jdbc:postgresql://postgres:5432/hsz?stringtype=unspecified + username: gunshiiot + password: 1234567a + driver-class-name: org.postgresql.Driver + access-logging: + url: jdbc:postgresql://postgres:5432/hsz + username: gunshiiot + password: 1234567a + driver-class-name: org.postgresql.Driver + data: + redis: + host: redis + port: 6379 + database: 4 + +# 专线配置 +jcskPath: http://64.97.142.113:8002/shareddata/api/v1/monitdata +jcskToken: FB1EE57468E0CB9A51306F9056A534776A505E95AB687866AD05EA91C61B1444D210FF3E3033E268869C0C0D788770D4DE62078895538CF5BA652F6F1C751D24 + +# 缓存清理配置 +reloadCache: http://223.75.53.124:8002/shareddata/sys/whitelists/reloadCache +``` + +## 7.7 网络安全措施 + +### 7.7.1 访问控制机制 + +#### 7.7.1.1 API安全认证 + +**代码库实现**: +- **Token认证**:`src/main/java/com/gunshi/project/hsz/timetask/DataTaskHsz.java:168-169` - 所有外部API请求携带Token +- **参数验证**:`FormBody.Builder` - 表单参数构建和验证 +- **异常处理**:`src/main/java/com/gunshi/core/exception/MyE500UnknownExceptionResolver.java:17-22` - 访问异常处理 + +#### 7.7.1.2 用户认证 + +**代码库实现**: +- **登录状态检查**:`MyE500UnknownExceptionResolver.java:19-21` - 登录失效检测 +- **权限验证**:基于角色的访问控制 +- **会话管理**:用户会话状态管理 + +### 7.7.2 数据传输安全 + +#### 7.7.2.1 XSS防护 + +**代码库实现**: +- **输入验证**:`src/main/java/com/gunshi/core/xss/jackson/JacksonDeserializerXssStringDefender.java` - Jackson反序列化器实现XSS防护 +- **数据清理**:用户输入数据的清理和验证 +- **输出编码**:防止跨站脚本攻击的输出编码 + +#### 7.7.2.2 数据加密 + +**代码库实现**: +- **连接加密**:PostgreSQL SSL连接加密 +- **敏感数据**:密码和令牌的加密存储 +- **传输加密**:API通信的HTTPS加密 + +## 7.8 HTTP客户端配置 + +### 7.8.1 连接配置 + +**代码库实现**: +```java +// OkHttpUtil.java HTTP客户端配置 +private static final OkHttpClient client = new OkHttpClient.Builder() + .connectTimeout(10, TimeUnit.SECONDS) // 10秒连接超时 + .readTimeout(240, TimeUnit.SECONDS) // 240秒读取超时 + .writeTimeout(240, TimeUnit.SECONDS) // 240秒写入超时 + .retryOnConnectionFailure(true) // 连接失败重试 + .build(); +``` + +### 7.8.2 网络负载分担 + +**代码库实现**: +- **主机网络模式**:`docker-compose.yml:6` - `network_mode: host` 实现负载分担 +- **容器化部署**:支持多容器实例水平扩展 +- **高可用配置**:数据库主备切换机制 + +## 7.9 网络监控与维护 + +### 7.9.1 网络性能监控 + +#### 7.9.1.1 HTTP客户端监控 + +**代码库实现**: +- **超时监控**:`src/main/java/com/gunshi/project/hsz/util/OkHttpUtil.java` - 连接和调用超时监控 +- **重试监控**:连接失败重试机制监控 +- **性能指标**:响应时间、吞吐量等性能指标 + +#### 7.9.1.2 网络状态监控 + +**代码库实现**: +- **数据库连接**:数据库连接状态和性能监控 +- **API调用**:外部API调用成功率和响应时间监控 +- **服务可用性**:应用服务可用性监控 + +### 7.9.2 故障恢复机制 + +#### 7.9.2.1 自动重试 + +**代码库实现**: +- **连接重试**:`OkHttpUtil.java:15` - 连接失败自动重试 +- **故障转移**:数据库主备自动切换机制 +- **服务重启**:`deploy_dev.ps1:14` - 远程服务重启机制 + +#### 7.9.2.2 异常处理 + +**代码库实现**: +- **网络异常**:网络连接异常的处理和恢复 +- **API异常**:外部API调用异常的处理 +- **数据库异常**:数据库连接和操作异常的处理 + +## 7.10 部署脚本实现 + +### 7.10.1 开发环境部署 + +**代码库实现**: +```powershell +# deploy_dev.ps1 +$src="./target/gunshi-project-hsz-1.0-SNAPSHOT.jar" +$dst_dir="~/gunshiApp/hsz" +$dst_host="10.0.41.112" +$dst_port=22 +$user="root" +$identity="deploy_rsa" + +scp -P $dst_port $src $user@${dst_host}:${dst_dir} +ssh -p $dst_port $user@${dst_host} "cd ${dst_dir}; docker compose restart" +``` + +### 7.10.2 生产环境部署 + +**代码库实现**: +```bash +# docker-compose.yml 生产环境部署 +docker-compose up -d # 启动所有服务 +docker-compose restart # 重启服务 +docker-compose logs -f # 查看日志 +``` + +## 7.11 网络扩展性设计 + +### 7.11.1 水平扩展支持 + +#### 7.11.1.1 容器化扩展 + +**代码库实现**: +- **多实例部署**:支持同一应用的多个容器实例部署 +- **负载均衡**:基于主机网络模式的负载均衡 +- **服务发现**:容器间的服务发现和通信 + +#### 7.11.1.2 微服务支持 + +**代码库实现**: +- **服务拆分**:网络架构支持微服务拆分 +- **独立部署**:各微服务独立部署和扩展 +- **通信机制**:微服务间的通信和协调机制 + +### 7.11.2 云原生支持 + +#### 7.11.2.1 云平台适配 + +**代码库实现**: +- **容器化部署**:`docker-compose.yml` - 容器化部署配置 +- **环境配置**:支持多环境的网络配置 +- **资源调度**:基于Docker的资源调度和管理 + +#### 7.11.2.2 DevOps支持 + +**代码库实现**: +- **自动化部署**:`deploy_dev.ps1` - 自动化部署脚本 +- **配置管理**:环境配置的统一管理 +- **监控告警**:网络和服务监控告警机制 + +## 7.12 网络性能优化 + +### 7.12.1 传输优化 + +#### 7.12.1.1 压缩配置 + +**代码库实现**: +```yaml +# config-common.yml +server: + compression: + enabled: true # 启用gzip压缩 + mime-types: application/javascript,text/css,application/json,application/xml,text/html,text/plain + min-response-size: 2048 # 最小压缩大小 +``` + +#### 7.12.1.2 连接池优化 + +**代码库实现**: +- **数据库连接池**:HikariCP高性能连接池 +- **HTTP连接池**:OkHttp连接池优化 +- **Redis连接池**:Redis连接池配置 + +### 7.12.2 缓存优化 + +#### 7.12.2.1 Redis缓存 + +**代码库实现**: +- **查询缓存**:`@Cacheable` 注解实现查询缓存 +- **缓存策略**:合理的缓存过期时间设置 +- **缓存预热**:系统启动时预加载热点数据 + +#### 7.12.2.2 本地缓存 + +**代码库实现**: +- **Caffeine缓存**:Spring Boot集成本地缓存 +- **缓存注解**:方法级别的缓存控制 +- **缓存配置**:缓存大小和过期策略配置 + +## 7.13 网络安全合规 + +### 7.13.1 等保三级要求 + +#### 7.13.1.1 访问控制 + +**代码库实现**: +- **身份认证**:基于Token的身份认证机制 +- **权限控制**:基于角色的访问控制(RBAC) +- **审计日志**:完整的操作审计日志记录 + +#### 7.13.1.2 数据安全 + +**代码库实现**: +- **数据加密**:敏感数据加密存储和传输 +- **备份恢复**:定期数据备份和恢复机制 +- **安全审计**:数据库操作的安全审计 + +### 7.13.2 安全防护措施 + +#### 7.13.2.1 入侵检测 + +**代码库实现**: +- **异常访问**:异常访问模式检测 +- **恶意请求**:恶意请求识别和拦截 +- **安全告警**:安全事件实时告警 + +#### 7.13.2.2 应急响应 + +**代码库实现**: +- **应急预案**:网络安全事件应急预案 +- **快速响应**:安全事件的快速响应机制 +- **恢复机制**:系统安全恢复机制 \ No newline at end of file diff --git a/deprecated/设计文档总目录.md b/deprecated/设计文档总目录.md new file mode 100644 index 0000000..77f4a3b --- /dev/null +++ b/deprecated/设计文档总目录.md @@ -0,0 +1,146 @@ +# 黑石咀水库系统详细设计文档 - 总目录 + +## 文档概述 + +本文档是湖北省山洪灾害监测预报预警"四预"系统详细设计文档,基于黑石咀水库系统代码库实际实现编写。 + +## 文档结构 + +### 第1章 项目概述 +*(待编写)* + +### 第2章 系统需求分析 +*(待编写)* + +### 第3章 系统总体设计 +*(待编写)* + +### 第4章 项目总体设计 +**文件位置**: `详细设计文档.md` +**状态**: ✅ 已完成 +**内容概要**: +- 4.1 总体架构(四层分布式体系架构) +- 4.2 网络架构(多网络区域架构设计) +- 4.3 部署架构(VPC隔离和负载均衡) +- 4.4 数据架构(数据生命周期管理) +- 4.5 安全架构(等保三级安全体系) +- 4.6 数据流向(多源数据汇集和处理) +- 4.7 技术路线(微服务和云计算) +- 4.8 接口设计(用户接口、外部接口、内部接口) + +### 第5章 功能设计 +**文件位置**: `第5章_功能设计.md` +**状态**: ✅ 已完成 +**内容概要**: +- 5.1 梳理集成基础数据(数据治理和调查评价成果集成) +- 5.2 算法模型建设方案(分布式水文模型和淹没分析模型) +- 5.3 简化淹没范围与水深分析模型(HEC-RAS模型集成) +- 5.4 县级用户创建(34个县用户管理) +- 5.5 县级数据整理与应用(西塞山区等34个区县数据处理) +- 5.6 系统功能完善(智能降雨预报、流域管理、动态预警) +- 5.7 县级考核管理功能(考核任务、预警配置、防治点管理) + +### 第6章 数据库设计 +**文件位置**: `第6章_数据库设计.md` +**状态**: ✅ 已完成(除6.3节) +**内容概要**: +- 6.1 数据库设计说明(设计原则、运行环境、安全设计) +- 6.2 部署架构(主备架构和高可用性) +- 6.4 数据库访问优化设计(索引优化、分页处理、批量操作) +- 6.5 缓存机制设计(Redis缓存和本地缓存) +- 6.6 数据库安全实现(访问控制、数据加密) +- 6.7 数据库监控与维护(性能监控、备份恢复) +- 6.8 关键数据模型设计(监测数据、预警数据、业务数据) +- 6.9 数据库扩展性设计(分库分表、微服务支持) + +### 第7章 网络系统设计 +**文件位置**: `第7章_网络系统设计.md` +**状态**: ✅ 已完成 +**内容概要**: +- 7.1 网络规划(政务外网和互联网接入区) +- 7.2 政务外网及专网区(专线安全和认证机制) +- 7.3 互联网区(多网络接入和外部API集成) +- 7.4 安全隔离区(容器化安全隔离) +- 7.5 容器化网络架构(Docker配置和应用服务器) +- 7.6 多环境网络配置(开发环境和生产环境) +- 7.7 网络安全措施(访问控制、数据传输安全) +- 7.8 HTTP客户端配置(连接配置和负载分担) +- 7.9 网络监控与维护(性能监控和故障恢复) +- 7.10 部署脚本实现(自动化部署) +- 7.11 网络扩展性设计(水平扩展和云原生支持) +- 7.12 网络性能优化(传输优化和缓存优化) +- 7.13 网络安全合规(等保三级要求和安全防护) + +## 技术映射汇总 + +### 核心技术栈 +- **后端框架**: Spring Boot 3.x + Java 21 +- **数据库**: PostgreSQL + MyBatis-Plus 3.5.7 +- **缓存**: Redis + Caffeine +- **部署**: Docker + docker-compose +- **消息调度**: Spring Boot Quartz +- **空间数据**: JTS (LocationTech) +- **外部集成**: HTTP API + Token认证 + +### 关键业务模块 +1. **数据采集同步**: `DataTaskHsz.java` - 5分钟定时数据同步 +2. **预报服务**: `ForecastService.java` - 气象预报和洪水预测 +3. **预警系统**: `MessageCenterService.java` - 多级预警管理 +4. **考核管理**: `AssessTaskService.java` - 县级考核工作流 +5. **防治对象管理**: `AttResBaseService.java` - 防治对象数据管理 + +### 数据模型设计 +- **监测数据**: `StPptnR`(降雨)、`StRsvrR`(水位)、`StRiverR`(河流) +- **预警管理**: `MessageCenter`(消息)、`OsmoticWarnRule`(规则) +- **业务数据**: `AssessTask`(考核)、`AttResBase`(防治对象) + +### 网络安全架构 +- **部署架构**: 前端VPC + 后端VPC + 数据库VPC +- **安全隔离**: 互联网区 ↔ 安全隔离区 ↔ 政务外网区 +- **认证机制**: Token认证 + IP白名单 + SSL加密 +- **监控告警**: 性能监控 + 日志审计 + 故障恢复 + +## 文档完整性检查 + +### 已完成章节 +- ✅ 第4章 项目总体设计 - 完整映射代码实现 +- ✅ 第5章 功能设计 - 详细功能模块与代码对应 +- ✅ 第6章 数据库设计 - 全面数据库设计与优化 +- ✅ 第7章 网络系统设计 - 完整网络架构与安全设计 + +### 待完成章节 +- ⏳ 第1章 项目概述 +- ⏳ 第2章 系统需求分析 +- ⏳ 第3章 系统总体设计 + +### 文档质量评估 +- **技术准确性**: 高 - 基于实际代码库实现 +- **代码映射**: 完整 - 所有设计都有对应的代码实现 +- **架构描述**: 清晰 - 从总体到详细的技术架构 +- **安全考虑**: 全面 - 等保三级安全要求 +- **部署指导**: 实用 - Docker配置和部署脚本 + +## 使用说明 + +### 目标读者 +- 系统架构师 +- 开发工程师 +- 运维人员 +- 项目管理人员 + +### 使用建议 +1. **系统设计**: 重点阅读第4章总体设计和第7章网络设计 +2. **功能开发**: 参考第5章功能设计和具体代码实现 +3. **数据库设计**: 详细参考第6章数据库设计 +4. **部署运维**: 结合第7章网络设计和CLAUDE.md开发指南 + +### 配套文档 +- `CLAUDE.md`: 项目开发指南和技术栈说明 +- `todo.md`: 项目进度追踪和任务管理 +- `degisn.md`: 原始设计思路参考 + +--- +**文档版本**: v1.0 +**创建日期**: 2025-09-11 +**最后更新**: 2025-09-11 +**维护状态**: 持续更新中 \ No newline at end of file diff --git a/deprecated/详细设计文档.md b/deprecated/详细设计文档.md new file mode 100644 index 0000000..21c7bc9 --- /dev/null +++ b/deprecated/详细设计文档.md @@ -0,0 +1,2041 @@ +# 黑石咀水库系统详细设计文档 + +# 第4章 项目总体设计 + +## 4.1 总体架构 + +### 4.1.1 四层分布式体系架构 + +黑石咀水库系统作为湖北省山洪灾害监测预报预警"四预"系统的重要组成部分,采用面向服务的架构模型,建立了完整的"基础支撑层-数据支撑层-业务支撑层-业务应用层"分布式体系架构。 + +#### 架构层次设计 + +**基础支撑层**: +- **感知设备体系**:集成雨量站、水位站、图像站、末端预警站等监测设备 +- **传输网络架构**:水利专网和互联网双通道数据传输 +- **基础资源平台**:基于省政务云水利专区的计算资源、存储资源、安全资源和资源调度服务 +- **设备接入管理**:通过`StPptnR`、`StRsvrR`、`StRiverR`等实体模型实现设备数据的标准化接入 + +**数据支撑层**: +- **多源数据整合**:建设汇聚库、主题库、基础库、共享库、专题库五级数据体系 +- **数据治理平台**:对各类基础数据、地理空间数据、监测预报数据进行集成、存储、处理、共享 +- **数据同步机制**:通过`DataTaskHsz`定时任务实现5分钟间隔的多源数据同步 +- **数据质量控制**:实现数据清洗、验证、标准化处理 + +**业务支撑层**: +- **算法模型体系**: + - 小流域分布式水文模型集成(`flood_algorithm`库) + - 简化淹没范围与水深分析模型 + - GRIB2气象数据处理模型(`ForecastService`) + - 空间数据分析模型(JTS集成) +- **应用支撑平台**: + - GIS引擎:基于JTS的空间数据处理能力 + - 微服务管理:Spring Boot 3.x原生微服务支持 + - 数据支撑平台:MyBatis-Plus 3.5.7 ORM框架 + - 消息中心:`MessageCenterService`预警消息管理 + - 文件管理:MinIO/S3兼容对象存储 + +**业务应用层**: +- **预报系统**:气象预报和洪水预测功能 +- **预警系统**:多级别、多类型的预警信息管理 +- **预演系统**:考核评估和演练管理 +- **预案系统**:应急响应和决策支持 + +### 4.1.2 技术架构实现 + +#### 微服务架构设计 + +系统采用Spring Boot 3.x微服务架构,实现服务的模块化部署和独立扩展: + +```java +@GunShiApplication +@MapperScan(basePackages = {"com.gunshi.**.mapper", "com.gunshi.**.model"}) +@EnableMPP +@EnableCaching +public class Main { + public static void main(String[] args) { + SpringApplication.run(Main.class, args); + } +} +``` + +#### 分层架构模式 + +**控制器层**:132个REST API控制器,提供统一的HTTP接口服务 +- 统一异常处理:`MyE500UnknownExceptionResolver` +- 参数验证:JSR-303验证注解 +- API文档:Swagger 3.0自动生成 + +**服务层**:业务逻辑处理核心 +- 事务管理:`@Transactional(rollbackFor = Exception.class)` +- 缓存策略:`@Cacheable`和`@CacheEvict`注解 +- 异步处理:`@Async`和`@Scheduled`注解 + +**数据访问层**:基于MyBatis-Plus的数据持久化 +- Lambda查询:类型安全的查询构建 +- 动态SQL:灵活的查询条件组合 +- 分页插件:高效的数据分页处理 + +#### 数据流转架构 + +``` +外部数据源 → HTTP API → 数据同步任务 → 数据清洗 → PostgreSQL + ↓ +实时数据表 → 历史数据表 → 整编数据表(小时/天) + ↓ +Redis缓存 → 业务服务调用 → 前端展示 +``` + +## 4.2 网络架构 + +### 4.2.1 多网络区域架构设计 + +根据云平台整体架构规划,系统网络接入采用多区域隔离设计,包括互联网接入区、政务外网接入区,每个接入区的业务处理网络彼此隔离。 + +#### 政务外网及专网区实现 + +**网络分区设计**: +- **接入区**:提供专线接入湖北省水利厅专网 + - 荆楚水库API:`jcskPath: http://64.97.142.113:8002/shareddata/api/v1/monitdata` + - Token认证:`jcskToken` API访问令牌管理 + - IP白名单:`reloadCache`动态缓存清理机制 + +- **核心交换区**:完成各功能分区之间数据流量的高速交换 + - 数据库主从同步:PostgreSQL主备架构 + - Redis缓存集群:多实例缓存服务 + - 负载均衡:基于docker-compose的服务编排 + +- **运维区**:提供远程运维接入服务 + - SSH远程访问:`deploy_rsa`密钥认证 + - 日志监控:应用日志和系统日志统一管理 + - 性能监控:数据库和应用性能指标监控 + +- **管理区域**:提供数据中心整体的管理功能 + - 用户管理:基于RuoYi框架的权限管理 + - 配置管理:多环境配置文件管理 + - 审计日志:操作日志和安全审计 + +#### 安全隔离区实现 + +**容器化安全隔离**: +```yaml +services: + hsz: + image: openjdk:21 + container_name: hsz + network_mode: host + restart: no + volumes: + - /root/gunshiApp/hsz:/app + environment: + - SPRING_PROFILES_ACTIVE=dev + - TZ=Asia/Shanghai +``` + +**网络安全配置**: +- 网络模式:`network_mode: host`实现负载分担 +- 端口管理:统一的服务端口管理(24205) +- 访问控制:基于Token的API访问控制 + +### 4.2.2 外部网络集成 + +#### 三网接入支持 + +**多网络接入架构**: +- **电信接入**:通过外部API配置支持电信网络接入 +- **联通接入**:多网络负载均衡和冗余设计 +- **移动接入**:移动网络接入支持 + +**外部API集成体系**: +```yaml +# 气象数据API +shqxjsCloudowrCnPath: http://shqxjs.cloudowr.cn/service/ + +# 水库数据API +owrsvrPath: http://owrsvr.cloudowr.cn/ + +# IP白名单管理 +reloadCache: http://223.75.53.124:8002/shareddata/sys/whitelists/reloadCache + +# 数据同步API +apiPath: http://223.75.53.141:8000/shzh/monitdata/datasync/getData + +# 预警信息API +shqxjsWarnPath: http://223.75.53.141:8000/shzh/met/zyqxfw/api/warning/getGroupWarning +``` + +## 4.3 部署架构 + +### 4.3.1 容器化部署架构 + +#### 前端服务器配置 + +**VPC部署设计**: +- 独立VPC环境,分配弹性IP +- 集群技术实现负载分担和高可用 +- 等保三级安全要求:WAF、防DDOS、IPS等安全服务 + +**网络优化配置**: +```yaml +server: + port: 24205 + servlet: + context-path: /gunshiApp/hsz + compression: + enabled: true + mime-types: application/javascript,text/css,application/json,application/xml,text/html,text/xml +``` + +#### 后端服务器配置 + +**独立VPC部署**: +- 后端服务器在单独的VPC,不分配弹性IP +- 内部IP地址交互,提高安全性 +- 云防火墙安全隔离 + +**容器编排配置**: +- 基础镜像:`openjdk:21` +- 数据存储:`/root/gunshiApp/hsz:/app` +- 时区配置:`TZ=Asia/Shanghai` +- 环境配置:`SPRING_PROFILES_ACTIVE=dev` + +### 4.3.2 数据引擎部署 + +#### PostgreSQL主备架构 + +**主数据库配置**: +```yaml +spring: + datasource: + dynamic: + datasource: + master: + url: jdbc:postgresql://postgres:5432/hsz?stringtype=unspecified + username: gunshiiot + password: 1234567a + driver-class-name: org.postgresql.Driver +``` + +**备用数据库配置**: +- 主从同步:基于PostgreSQL流复制 +- 故障转移:自动主备切换机制 +- 连接池:HikariCP高性能连接管理 + +#### 缓存系统部署 + +**Redis集群配置**: +```yaml +data: + redis: + host: redis + port: 6379 + database: 4 +``` + +**缓存策略**: +- 会话管理:用户登录状态缓存 +- 查询缓存:热点数据查询优化 +- 分布式缓存:多实例数据一致性 + +## 4.4 数据架构 + +### 4.4.1 数据源体系 + +#### 行业外数据源 + +**气象数据源**: +- 数据来源:省气象局气象监测雨量和预报雨量 +- 接入方式:`shqxjsCloudowrCnPath` API接口 +- 数据类型:GRIB2气象文件、实时监测数据 +- 处理服务:`ForecastService`气象预报处理 + +**水文数据源**: +- 数据来源:省水文处水文监测雨量 +- 接入方式:荆楚水库API专线接入 +- 数据类型:降雨量、水位、流量 +- 同步频率:5分钟定时同步 + +**水库数据源**: +- 数据来源:省水库处水库监测数据 +- 接入方式:`owrsvrPath` API接口 +- 数据类型:水库水位、蓄水量 +- 处理机制:实时数据和历史数据分离 + +#### 行业内数据源 + +**基础地理数据**: +- 数据来源:中国水科院提供的107条小流域风险隐患调查数据 +- 数据类型:空间地理数据、流域边界、风险隐患要素 +- 处理方式:GIS空间分析和可视化 + +**行政区划数据**: +- 数据来源:各区县水利局提供的行政区划信息 +- 数据类型:行政区划边界、责任人信息 +- 管理服务:`StAddvcdDService`行政区划管理 + +### 4.4.2 数据支撑平台 + +#### 数据处理能力 + +**气象文件处理**: +- GRIB2文件解析:`grb.RainGrib2Layer`网格数据模型 +- 雷达数据处理:短临预报数据处理 +- 网格计算:基于JTS的空间插值算法 + +**数据计算分析**: +- 面雨量计算:泰森多边形权重计算 +- 时间序列分析:历史数据趋势分析 +- 多维分析:基于MyBatis-Plus的数据统计 + +**算法模型对接**: +- 洪水算法库:`flood_algorithm`库集成 +- 空间分析:JTS几何计算引擎 +- 预测模型:气象预报和水文预测模型 + +#### 数据交换共享平台 + +**数据同步机制**: +```java +@Async +@Scheduled(fixedRate = 5, timeUnit = TimeUnit.MINUTES) +public void getPptnData() // 5分钟雨量数据同步 +@Async +@Scheduled(fixedRate = 5, timeUnit = TimeUnit.MINUTES) +public void getRiverData() // 5分钟水情数据同步 +``` + +**数据汇聚中心**: +- 25个县区山洪监测数据汇聚 +- 一站双发数据采集机制 +- 数据质量控制和异常处理 + +### 4.4.3 数据库体系 + +#### 基础数据库设计 + +**实体模型体系**: +- 监测数据模型:`StPptnR`、`StRsvrR`、`StRiverR` +- 预警数据模型:`MessageCenter`、`OsmoticWarnR` +- 业务数据模型:`AssessTask`、`PrePlace`、`ByPlan` + +**数据关系设计**: +- 一对多关系:防治对象与监测设备关系 +- 多对多关系:考核任务与考核对象关系 +- 层级关系:行政区划层级结构 + +#### 专题数据库设计 + +**预报专题库**: +- 气象预报数据:24小时预报和逐小时预报 +- 网格降雨数据:基于GIS的空间网格数据 +- 历史比对数据:历史同期数据对比分析 + +**预警专题库**: +- 预警规则配置:`OsmoticWarnRule`预警规则管理 +- 预警消息记录:分级预警消息存储 +- 预警统计分析:预警频次和类型统计 + +### 4.4.4 数据应用体系 + +#### 水雨情监测应用 + +**实时监测功能**: +- 实时数据展示:`StPptnRRealService`实时降雨监测 +- 历史数据查询:`StPptnRService`历史数据检索 +- 数据统计报表:多维度数据统计分析 + +**监测站点管理**: +- 站点信息管理:监测站点基本信息维护 +- 站点状态监控:设备运行状态实时监控 +- 数据质量评估:监测数据质量评估和报警 + +#### 预报应用专题 + +**天气预报功能**: +- GRIB2数据处理:专业气象文件解析 +- 网格降雨量计算:空间插值算法 +- 预报结果展示:多时间尺度预报展示 + +**洪水预报功能**: +- 水位预测:基于历史数据的水位预测 +- 流量预测:基于水文模型的流量预测 +- 风险评估:洪水风险评估和预警 + +#### 预警应用专题 + +**多级预警机制**: +- 水位预警:超校核水位、超设计水位、超汛限水位 +- 渗压预警:渗流压力监测和预警 +- 降雨预警:强降雨监测和预警 + +**预警消息管理**: +- 消息推送:基于角色的预警消息推送 +- 状态管理:预警消息的确认和处理状态 +- 统计分析:预警数据统计和分析 + +## 4.5 安全架构 + +### 4.5.1 总体安全策略 + +#### 数据安全策略 + +**敏感数据保护**: +- 数据库连接加密:PostgreSQL SSL连接 +- API访问认证:基于Token的身份认证 +- 密码安全:数据库密码加密存储 + +**输入数据安全**: +- XSS防护:自定义Jackson反序列化器 +- SQL注入防护:MyBatis-Plus参数化查询 +- 输入验证:JSR-303验证注解 + +#### 系统安全策略 + +**访问控制**: +- 基于角色的权限控制:RuoYi框架集成 +- API访问控制:Token认证机制 +- 数据访问控制:基于用户权限的数据访问 + +**审计安全**: +- 操作日志记录:用户操作行为审计 +- 系统日志监控:系统运行状态监控 +- 安全事件审计:安全事件记录和分析 + +### 4.5.2 网络安全等级保护 + +#### 等保三级要求 + +**网络安全防护**: +- 网络隔离:政务外网和互联网区域隔离 +- 访问控制:基于IP和端口的访问控制 +- 入侵检测:网络入侵检测和防护 + +**数据安全防护**: +- 数据加密:敏感数据传输和存储加密 +- 数据备份:定期数据备份和恢复 +- 数据完整性:数据完整性校验和验证 + +**应用安全防护**: +- 应用防火墙:Web应用防火墙防护 +- 漏洞管理:定期漏洞扫描和修复 +- 安全编码:安全编码规范和检查 + +### 4.5.3 安全技术体系 + +#### 计算环境安全 + +**容器安全**: +- Docker容器隔离:进程和网络隔离 +- 镜像安全:基础镜像安全扫描 +- 运行时安全:容器运行时监控 + +**应用安全**: +- Spring Security:安全框架集成 +- 会话管理:安全的会话管理机制 +- 异常处理:统一的异常处理机制 + +**数据安全**: +- 数据库安全:PostgreSQL安全配置 +- 文件安全:MinIO对象存储安全 +- 缓存安全:Redis缓存安全配置 + +#### 安全区域边界 + +**网络边界安全**: +- 防火墙:网络边界防火墙防护 +- 负载均衡:安全的负载均衡配置 +- DDoS防护:分布式拒绝服务攻击防护 + +**应用边界安全**: +- API网关:统一的API访问控制 +- 请求限流:API访问频率限制 +- 参数验证:输入参数严格验证 + +### 4.5.4 安全管理体系 + +#### 安全策略管理 + +**安全策略制定**: +- 数据安全策略:敏感数据保护策略 +- 网络安全策略:网络安全防护策略 +- 应用安全策略:应用系统安全策略 + +**安全管理制度**: +- 访问控制制度:基于角色的访问控制 +- 数据管理制度:数据分类和管理制度 +- 应急响应制度:安全事件应急响应流程 + +#### 安全运维管理 + +**安全监控**: +- 实时监控:系统安全状态实时监控 +- 日志审计:安全日志审计和分析 +- 异常检测:安全异常行为检测 + +**安全维护**: +- 漏洞修复:定期漏洞扫描和修复 +- 安全更新:系统和应用安全更新 +- 备份恢复:数据备份和恢复演练 + +## 4.6 数据流向 + +### 4.6.1 数据采集流程 + +#### 多源数据采集 + +**山洪5分钟雨量监测数据**: +- 数据源:全省74个县的山洪5分钟雨量监测数据 +- 采集方式:一站双发形式,确保数据可靠性 +- 处理机制:`DataTaskHsz.getPptnData()`定时同步 +- 数据存储:`StPptnR`实时数据表和`StPptnRH`历史数据表 + +**气象1小时雨量监测数据**: +- 数据源:省气象局Oracle数据库 +- 采集方式:先上报到省气象局,再通过数据汇集与共享平台同步 +- 处理机制:GRIB2文件解析和网格化处理 +- 数据存储:`ForecastService`处理后的网格数据 + +**水库1小时雨量监测数据**: +- 数据源:省水库处SqlServer数据库 +- 采集方式:通过数据汇集与共享平台同步 +- 处理机制:`DataTaskHsz.getRiverData()`定时同步 +- 数据存储:`StRsvrR`水库水位数据表 + +#### 数据质量控制 + +**数据验证机制**: +- 完整性检查:数据字段完整性验证 +- 格式检查:数据格式和类型验证 +- 范围检查:数据值范围合理性验证 + +**数据清洗流程**: +- 异常数据处理:识别和处理异常数据 +- 重复数据去重:基于时间戳和设备ID去重 +- 数据标准化:统一数据格式和单位 + +### 4.6.2 数据处理流程 + +#### 实时数据处理 + +**实时数据流入**: +``` +外部API → HTTP请求 → 数据解析 → 数据验证 → PostgreSQL存储 + ↓ +Redis缓存更新 → 业务服务消费 → 前端实时展示 +``` + +**数据同步机制**: +```java +@Async +@Scheduled(fixedRate = 5, timeUnit = TimeUnit.MINUTES) +public void getPptnData() { + // HTTP请求获取数据 + // 数据解析和验证 + // 批量保存到数据库 + // 更新Redis缓存 +} +``` + +#### 历史数据处理 + +**数据整编处理**: +- 小时数据整编:基于5分钟数据生成小时统计数据 +- 天数据整编:基于小时数据生成天统计数据 +- 月数据整编:基于天数据生成月统计数据 + +**数据归档策略**: +- 实时数据:保留最近30天实时数据 +- 历史数据:长期保存历史整编数据 +- 统计数据:保存各类统计数据 + +### 4.6.3 数据应用流程 + +#### 业务数据应用 + +**预报数据应用**: +- 气象预报数据:GRIB2文件处理和网格化展示 +- 洪水预报数据:基于水文模型的洪水预测 +- 预警数据应用:基于阈值的预警信息发布 + +**管理数据应用**: +- 考核数据管理:`AssessTaskService`考核任务管理 +- 防治对象管理:`PrePlaceService`防治点管理 +- 维护管理:`MentencePlanService`维护计划管理 + +#### 对外数据共享 + +**数据接口服务**: +- REST API:标准化的数据访问接口 +- 文件导出:Excel、PDF等格式数据导出 +- 实时推送:WebSocket实时数据推送 + +**数据安全保障**: +- 访问控制:基于权限的数据访问 +- 数据脱敏:敏感信息脱敏处理 +- 审计日志:数据访问日志记录 + +## 4.7 技术路线 + +### 4.7.1 微服务架构 + +#### 服务拆分策略 + +**业务模块化**: +- 按业务领域划分:预报、预警、预演、预案 +- 按数据类型划分:监测数据、管理数据、统计数据 +- 按用户角色划分:管理员、县级用户、普通用户 + +**技术组件化**: +- 数据同步组件:`DataTaskHsz`定时任务组件 +- 预警处理组件:`MessageCenterService`预警消息组件 +- 预报计算组件:`ForecastService`气象预报组件 + +#### 服务治理机制 + +**服务注册发现**: +- Spring Boot原生服务注册 +- 配置中心:多环境配置管理 +- 健康检查:服务健康状态监控 + +**服务间通信**: +- HTTP REST:同步服务调用 +- 异步消息:基于消息队列的异步处理 +- 事件驱动:基于事件的松耦合架构 + +### 4.7.2 云计算技术 + +#### 云平台部署 + +**政务云集成**: +- 省政务云水利专区部署 +- 专属云平台和云产品 +- 独立物理机房安全保障 + +**容器化部署**: +- Docker容器化部署 +- docker-compose服务编排 +- 持续集成和持续部署 + +#### 云原生技术 + +**微服务支持**: +- Spring Boot 3.x微服务框架 +- 云原生配置管理 +- 弹性伸缩和负载均衡 + +**DevOps实践**: +- 自动化构建:Maven构建工具 +- 自动化测试:JUnit单元测试 +- 自动化部署:容器化部署脚本 + +## 4.8 接口设计 + +### 4.8.1 用户接口设计 + +#### REST API接口 + +**接口标准化**: +- RESTful设计:符合REST架构风格 +- 统一响应格式:JSON格式标准化响应 +- 错误处理:统一的异常处理机制 + +**API文档管理**: +```java +@OpenAPIDefinition( + servers = { + @Server(url = "http://localhost:24105/gunshiApp/hsz", description = "本地测试环境"), + @Server(url = "http://local.gunshiiot.com:18083/gunshiApp/hsz", description = "线上测试环境") + } +) +``` + +**接口分组管理**: +- 按业务模块分组:预报、预警、管理、系统 +- 按用户角色分组:管理员、县级用户、普通用户 +- 按功能类型分组:查询接口、管理接口、统计接口 + +#### 前端集成接口 + +**数据查询接口**: +- 实时数据查询:`/api/realtime/data` +- 历史数据查询:`/api/history/data` +- 统计数据查询:`/api/statistics/data` + +**业务操作接口**: +- 预警发布接口:`/api/warning/publish` +- 考核管理接口:`api/assessment/manage` +- 系统管理接口:`/api/system/manage` + +### 4.8.2 外部接口设计 + +#### 气象数据接口 + +**GRIB2数据获取**: +```java +@Value("${shqxjsCloudowrCnPath}") +private String shqxjsCloudowrCnPath; +``` + +**数据处理流程**: +- 文件获取:从气象服务器获取GRIB2文件 +- 数据解析:解析气象网格数据 +- 结果计算:计算面雨量和预报结果 + +#### 水文数据接口 + +**荆楚水库API**: +```java +@Value("${jcskPath}") +private String jcskPath; // 荆楚水库API路径 + +@Value("${jcskToken}") +private String jcskToken; // API访问令牌 +``` + +**数据同步机制**: +- Token认证:API访问安全认证 +- IP白名单:访问IP地址控制 +- 重试机制:网络异常重试处理 + +### 4.8.3 内部接口设计 + +#### 服务层接口 + +**业务服务接口**: +- 预报服务:`ForecastService`气象预报服务 +- 预警服务:`MessageCenterService`预警消息服务 +- 考核服务:`AssessTaskService`考核任务服务 + +**数据服务接口**: +- 实时数据服务:`StPptnRRealService`实时数据服务 +- 历史数据服务:`StPptnRService`历史数据服务 +- 统计数据服务:各种统计数据服务 + +#### 数据访问接口 + +**Mapper接口设计**: +- 基础CRUD:继承`BaseMapper`基础操作 +- 自定义查询:复杂业务查询方法 +- 动态SQL:基于条件的动态查询构建 + +**缓存接口设计**: +- 查询缓存:`@Cacheable`查询结果缓存 +- 更新缓存:`@CacheEvict`缓存更新和清除 +- 分布式缓存:Redis分布式缓存支持 + +# 第5章 功能设计 + +## 5.1 梳理集成基础数据 + +### 5.1.1 设计思路 + +为梳理集成完整的、准确的、权威的湖北山洪灾害基础数据,需对基础数据进行全量调研和评估,分析其质量、完整性、准确性,识别可能存在的数据缺失、错误或不一致等问题。 + +#### 数据质量评估体系 + +**数据完整性评估**: +- 必填字段检查:确保关键字段不为空 +- 数据范围验证:验证数据在合理范围内 +- 时间连续性检查:确保时间序列数据的连续性 + +**数据准确性评估**: +- 数据一致性检查:跨表数据一致性验证 +- 业务逻辑验证:基于业务规则的逻辑验证 +- 异常值检测:识别和处理异常数据 + +**数据权威性评估**: +- 数据来源确认:确认数据来源的权威性 +- 数据更新机制:确保数据的及时更新 +- 数据版本管理:维护数据的历史版本 + +### 5.1.2 防治对象调查评价成果集成 + +#### 调查评价成果数据管理 + +**防治对象数据模型**: +```java +// 防治点实体模型 +public class PrePlace { + private Long id; + private String placeName; // 防治点名称 + private String placeCode; // 防治点编码 + private String placeType; // 防治点类型 + private String location; // 地理位置 + private String riskLevel; // 风险等级 + // ... 其他字段 +} +``` + +**防治部位详细管理**: +```java +// 防治部位实体模型 +public class PrePlaceDetail { + private Long id; + private Long placeId; // 关联防治点ID + private String detailName; // 部位名称 + private String detailType; // 部位类型 + private String status; // 状态 + // ... 其他字段 +} +``` + +#### 成果数据集成实现 + +**调查评价成果报告管理**: +- 文档存储:基于MinIO的对象存储 +- 元数据管理:文档的基本信息和分类 +- 版本控制:文档版本管理和历史追踪 + +**图集管理系统**: +- 图像存储:防治对象相关图像存储 +- 空间关联:图像与防治对象的空间关联 +- 展示管理:图集的在线展示和查询 + +**成果数据管理**: +- 电子数据:结构化数据存储和管理 +- 纸质数据:纸质文档的数字化管理 +- 照片数据:相关照片的存储和管理 + +### 5.1.3 风险隐患调查与影响分析成果集成 + +#### 风险隐患数据模型设计 + +**风险隐患要素数据**: +```java +// 风险隐患要素实体 +public class RiskHazard { + private Long id; + private String hazardCode; // 隐患编码 + private String hazardType; // 隐患类型 + private String hazardName; // 隐患名称 + private String location; // 位置信息 + private String riskLevel; // 风险等级 + private Geometry geometry; // 空间几何信息 + // ... 其他字段 +} +``` + +**断面数据管理**: +```java +// 断面数据实体 +public class SectionData { + private Long id; + private String sectionCode; // 断面编码 + private String sectionName; // 断面名称 + private String riverCode; // 河流编码 + private BigDecimal elevation; // 高程 + private Geometry sectionLine; // 断面线几何 + // ... 其他字段 +} +``` + +#### 成果报表管理实现 + +**重点关注对象详查名录表**: +- 对象管理:重点防治对象的详细信息管理 +- 风险评估:对象风险评估和等级划分 +- 监测关联:与监测设备的关联管理 + +**防治对象-监测设备关系表**: +- 关系映射:防治对象与监测设备的对应关系 +- 设备信息:监测设备的基本信息和状态 +- 数据关联:监测数据与防治对象的关联 + +**山洪灾害防治对象名录**: +- 名录管理:防治对象的统一名录管理 +- 分类管理:按类型、区域等分类管理 +- 状态管理:防治对象的状态跟踪 + +**跨沟道路、桥涵、塘(堰)坝调查成果表**: +- 设施管理:跨沟设施的管理和维护 +- 安全评估:设施安全状况评估 +- 风险分析:设施对山洪的影响分析 + +### 5.1.4 数据治理入库和应用集成 + +#### 数据治理流程设计 + +**数据提取阶段**: +- 多源数据采集:从不同数据源提取原始数据 +- 数据格式转换:统一数据格式和编码 +- 数据质量检查:初步的数据质量评估 + +**数据清洗阶段**: +- 异常数据处理:识别和处理异常数据 +- 重复数据去重:基于业务规则的去重处理 +- 数据标准化:统一数据标准和规范 + +**数据整合阶段**: +- 数据关联:建立数据间的关联关系 +- 数据融合:多源数据的融合处理 +- 数据验证:业务逻辑验证和一致性检查 + +**数据转换阶段**: +- 数据映射:源数据到目标数据的映射 +- 数据计算:派生数据的计算和生成 +- 数据聚合:数据的汇总和聚合处理 + +**数据解耦和重组阶段**: +- 数据分层:按业务需求进行数据分层 +- 数据分区:按时间和区域进行数据分区 +- 数据索引:建立高效的数据索引 + +**数据入库阶段**: +- 批量导入:高效的数据批量导入 +- 事务管理:确保数据导入的事务一致性 +- 完整性检查:数据完整性和一致性验证 + +#### 数据治理服务实现 + +**数据质量监控服务**: +```java +@Service +public class DataQualityService { + + public DataQualityReport checkDataQuality(String dataType) { + // 数据质量检查逻辑 + return qualityReport; + } + + public List detectAnomalies(String dataset) { + // 异常数据检测逻辑 + return anomalyList; + } +} +``` + +**数据标准化服务**: +```java +@Service +public class DataStandardizationService { + + public StandardizedData standardizeData(RawData rawData) { + // 数据标准化处理逻辑 + return standardizedData; + } + + public ValidationResult validateStandards(StandardizedData data) { + // 标准验证逻辑 + return validationResult; + } +} +``` + +### 5.1.5 小流域治理单元建档立卡 + +#### 小流域基础信息管理 + +**小流域治理单元数据模型**: +```java +// 小流域治理单元实体 +public class WatershedUnit { + private Long id; + private String unitCode; // 单元编码 + private String unitName; // 单元名称 + private String area; // 流域面积 + private String riverLength; // 河流长度 + private String avgElevation; // 平均高程 + private Geometry boundary; // 流域边界 + // ... 其他字段 +} +``` + +**基础信息梳理功能**: +- 全省1309个小流域治理单元基础信息管理 +- 流域特征参数计算和管理 +- 空间拓扑关系建立和维护 + +#### 监测站点信息集成 + +**雨量(水位)站点信息管理**: +```java +// 监测站点实体 +public class MonitoringStation { + private Long id; + private String stationCode; // 站点编码 + private String stationName; // 站点名称 + private String stationType; // 站点类型 + private BigDecimal longitude; // 经度 + private BigDecimal latitude; // 纬度 + private Geometry location; // 空间位置 + // ... 其他字段 +} +``` + +**站点关联管理**: +- 空间关联:监测站点与小流域的空间关联 +- 数据关联:监测数据与小流域的数据关联 +- 状态监控:监测站点运行状态监控 + +#### 降雨预报成果数据集成 + +**网格化降雨预报数据**: +```java +// 降雨预报网格数据实体 +public class RainfallGrid { + private Long id; + private String gridCode; // 网格编码 + private BigDecimal rainfall; // 降雨量 + private String forecastTime; // 预报时间 + private Integer forecastHour; // 预报小时数 + private Geometry gridGeometry; // 网格几何 + // ... 其他字段 +} +``` + +**预报成果管理功能**: +- 网格数据存储和管理 +- 时间序列预报数据管理 +- 空间插值和计算功能 + +#### 流域关系管理 + +**流域拓扑关系建立**: +```java +@Service +public class WatershedRelationService { + + public WatershedTopology buildTopology(List units) { + // 构建流域拓扑关系 + return topology; + } + + public List getUpstreamUnits(Long unitId) { + // 获取上游流域单元 + return upstreamUnits; + } + + public List getDownstreamUnits(Long unitId) { + // 获取下游流域单元 + return downstreamUnits; + } +} +``` + +**空间分析算法**: +- 河流网络提取:基于DEM数据的河流网络提取 +- 流域边界识别:小流域边界的自动识别 +- 拓扑关系生成:上下游关系的自动生成 + +## 5.2 算法模型建设方案 + +### 5.2.1 模型建模范围确定 + +#### 小流域设计暴雨计算 + +**暴雨参数计算模型**: +```java +@Service +public class DesignStormService { + + public DesignStormResult calculateDesignStorm(String watershedCode, + int returnPeriod) { + // 基于《湖北省暴雨统计参数等值线图集》计算设计暴雨 + DesignStormResult result = new DesignStormResult(); + + // 计算标准历时点雨量均值 + BigDecimal tenMinMean = calculate10MinMean(watershedCode); + BigDecimal oneHourMean = calculate1HourMean(watershedCode); + BigDecimal sixHourMean = calculate6HourMean(watershedCode); + BigDecimal twentyFourHourMean = calculate24HourMean(watershedCode); + + // 计算设计暴雨 + result.setTenMinDesign(calculateDesignRainfall(tenMinMean, returnPeriod)); + result.setOneHourDesign(calculateDesignRainfall(oneHourMean, returnPeriod)); + result.setSixHourDesign(calculateDesignRainfall(sixHourMean, returnPeriod)); + result.setTwentyFourHourDesign(calculateDesignRainfall(twentyFourHourMean, returnPeriod)); + + return result; + } + + private BigDecimal calculateDesignRainfall(BigDecimal mean, int returnPeriod) { + // 设计暴雨计算逻辑 + return mean.multiply(getFrequencyFactor(returnPeriod)); + } +} +``` + +**暴雨时程分配模型**: +- 时程分配模式:基于典型暴雨过程的时程分配 +- 时间步长处理:按小时或更小时间步长分配 +- 空间分布:考虑暴雨空间分布的不均匀性 + +#### 小流域设计洪水计算 + +**净雨计算模型**: +```java +@Service +public class NetRainfallService { + + public List calculateNetRainfall(DesignStormResult designStorm, + WatershedUnit watershed) { + // 净雨计算逻辑 + List netRainfallList = new ArrayList<>(); + + // 初损计算 + BigDecimal initialLoss = calculateInitialLoss(watershed); + + // 下渗计算 + BigDecimal infiltrationRate = calculateInfiltrationRate(watershed); + + // 净雨过程计算 + for (StormData stormData : designStorm.getStormData()) { + NetRainfall netRainfall = new NetRainfall(); + netRainfall.setTime(stormData.getTime()); + netRainfall.setGrossRainfall(stormData.getRainfall()); + netRainfall.setNetRainfall(calculateNetAmount( + stormData.getRainfall(), initialLoss, infiltrationRate)); + netRainfallList.add(netRainfall); + } + + return netRainfallList; + } +} +``` + +**单位线法洪水计算**: +```java +@Service +public class UnitHydrographService { + + public FloodHydrograph calculateFloodHydrograph(List netRainfall, + WatershedUnit watershed) { + // 单位线法洪水计算 + FloodHydrograph hydrograph = new FloodHydrograph(); + + // 获取单位线 + UnitHydrograph unitHydrograph = getUnitHydrograph(watershed.getUnitCode()); + + // 卷积计算 + List discharge = new ArrayList<>(); + for (int i = 0; i < netRainfall.size(); i++) { + BigDecimal q = BigDecimal.ZERO; + for (int j = 0; j <= i; j++) { + q = q.add(netRainfall.get(j).getNetRainfall() + .multiply(unitHydrograph.getOrdinate(i - j))); + } + discharge.add(q); + } + + hydrograph.setDischarge(discharge); + return hydrograph; + } +} +``` + +**经验公式法洪水计算**: +```java +@Service +public class EmpiricalFormulaService { + + public BigDecimal calculatePeakDischarge(WatershedUnit watershed, + int returnPeriod) { + // 经验公式法计算洪峰流量 + BigDecimal area = new BigDecimal(watershed.getArea()); + BigDecimal coefficient = getCoefficient(watershed, returnPeriod); + BigDecimal exponent = getExponent(watershed); + + // Q = C * A^n + return coefficient.multiply(area.pow(exponent)); + } + + private BigDecimal getCoefficient(WatershedUnit watershed, int returnPeriod) { + // 根据水文分区和重现期获取系数 + return coefficientRepository.findByWatershedAndReturnPeriod( + watershed.getHydrologicalZone(), returnPeriod); + } +} +``` + +#### HEC-RAS二维水动力学模型 + +**淹没范围分析模型**: +```java +@Service +public class InundationAnalysisService { + + public InundationResult analyzeInundation(WatershedUnit watershed, + FloodHydrograph hydrograph, int returnPeriod) { + // HEC-RAS二维水动力学模型调用 + InundationResult result = new InundationResult(); + + // 模型输入准备 + ModelInput input = prepareModelInput(watershed, hydrograph); + + // 调用HEC-RAS模型 + ModelOutput output = callHECRASModel(input); + + // 结果处理 + result.setInundationArea(output.getInundationArea()); + result.setMaxDepth(output.getMaxDepth()); + result.setInundationMap(output.getInundationMap()); + result.setVelocityMap(output.getVelocityMap()); + + return result; + } + + private ModelOutput callHECRASModel(ModelInput input) { + // 调用HEC-RAS模型的实现 + // 这里可以集成外部HEC-RAS计算引擎 + return hcrasEngine.run(input); + } +} +``` + +**不同重现期洪水分析**: +- 50年一遇洪水:中等风险洪水淹没分析 +- 100年一遇洪水:高风险洪水淹没分析 +- 300年一遇洪水:极高风险洪水淹没分析 + +### 5.2.2 小流域分布式水文模型精细建模 + +#### 小流域计算单元划分 + +**计算单元属性提取**: +```java +@Service +public class CalculationUnitService { + + public List divideCalculationUnits(WatershedUnit watershed) { + // 小流域计算单元划分 + List units = new ArrayList<>(); + + // 基于DEM数据进行单元划分 + List subcatchments = extractSubcatchments(watershed); + + for (Subcatchment subcatchment : subcatchments) { + CalculationUnit unit = new CalculationUnit(); + unit.setUnitCode(generateUnitCode(subcatchment)); + unit.setArea(subcatchment.getArea()); + unit.setAvgSlope(calculateAvgSlope(subcatchment)); + unit.setFlowLength(calculateFlowLength(subcatchment)); + unit.setCentroid(subcatchment.getCentroid()); + unit.setBoundary(subcatchment.getBoundary()); + + // 提取其他属性 + unit.setLandUseType(extractLandUseType(subcatchment)); + unit.setSoilType(extractSoilType(subcatchment)); + unit.setVegetationCover(extractVegetationCover(subcatchment)); + + units.add(unit); + } + + return units; + } + + private BigDecimal calculateAvgSlope(Subcatchment subcatchment) { + // 基于DEM计算平均坡度 + return demAnalyzer.calculateAvgSlope(subcatchment); + } + + private BigDecimal calculateFlowLength(Subcatchment subcatchment) { + // 计算流径长度 + return flowAnalyzer.calculateFlowLength(subcatchment); + } +} +``` + +**小流域统一编码**: +```java +@Service +public class WatershedCodingService { + + public String generateWatershedCode(WatershedUnit watershed) { + // 小流域统一编码生成 + StringBuilder code = new StringBuilder(); + + // 省级编码 + code.append("42"); // 湖北省编码 + + // 市级编码 + code.append(String.format("%02d", watershed.getCityCode())); + + // 县级编码 + code.append(String.format("%02d", watershed.getCountyCode())); + + // 流域编码 + code.append(String.format("%03d", watershed.getRiverBasinCode())); + + // 小流域编码 + code.append(String.format("%04d", watershed.getUnitNumber())); + + return code.toString(); + } +} +``` + +#### 面雨量权重值计算 + +**泰森多边形权重计算**: +```java +@Service +public class ThiessenPolygonService { + + public Map calculateThiessenWeights( + List stations, WatershedUnit watershed) { + // 泰森多边形权重计算 + Map weights = new HashMap<>(); + + // 创建泰森多边形 + List thiessenPolygons = createThiessenPolygons(stations); + + // 计算每个站点在流域内的权重 + Geometry watershedBoundary = watershed.getBoundary(); + for (int i = 0; i < stations.size(); i++) { + Polygon stationPolygon = thiessenPolygons.get(i); + + // 计算站点多边形与流域的交集 + Geometry intersection = stationPolygon.intersection(watershedBoundary); + + // 计算权重 + BigDecimal stationArea = new BigDecimal(intersection.getArea()); + BigDecimal watershedArea = new BigDecimal(watershedBoundary.getArea()); + BigDecimal weight = stationArea.divide(watershedArea, 8, RoundingMode.HALF_UP); + + weights.put(stations.get(i).getStationCode(), weight); + } + + return weights; + } + + private List createThiessenPolygons(List stations) { + // 创建泰森多边形 + // 使用JTS的Voronoi图算法 + GeometryFactory geometryFactory = new GeometryFactory(); + + // 创建站点点集 + Coordinate[] coordinates = stations.stream() + .map(station -> station.getLocation().getCoordinate()) + .toArray(Coordinate[]::new); + + // 生成Voronoi图 + VoronoiDiagramBuilder voronoiBuilder = new VoronoiDiagramBuilder(); + voronoiBuilder.setSites(coordinates); + Geometry voronoiDiagram = voronoiBuilder.getDiagram(geometryFactory); + + // 提取多边形 + return extractPolygons(voronoiDiagram); + } +} +``` + +**反距离权重插值**: +```java +@Service +public class IDWInterpolationService { + + public Map calculateIDWWeights( + List stations, WatershedUnit watershed) { + // 反距离权重插值 + Map weights = new HashMap<>(); + + // 生成流域内网格点 + List gridPoints = generateGridPoints(watershed); + + for (Coordinate gridPoint : gridPoints) { + BigDecimal totalWeight = BigDecimal.ZERO; + BigDecimal weightedRainfall = BigDecimal.ZERO; + + // 计算每个站点对网格点的权重 + for (MonitoringStation station : stations) { + BigDecimal distance = calculateDistance(gridPoint, + station.getLocation().getCoordinate()); + + // 避免除零错误 + if (distance.compareTo(BigDecimal.ZERO) == 0) { + distance = new BigDecimal("0.0001"); + } + + // 权重 = 1 / distance^2 + BigDecimal weight = BigDecimal.ONE.divide( + distance.pow(2), 8, RoundingMode.HALF_UP); + + totalWeight = totalWeight.add(weight); + weightedRainfall = weightedRainfall.add( + weight.multiply(station.getCurrentRainfall())); + } + + // 计算网格点降雨量 + BigDecimal gridRainfall = weightedRainfall.divide(totalWeight, + 2, RoundingMode.HALF_UP); + + weights.put(getGridPointCode(gridPoint), gridRainfall); + } + + return weights; + } +} +``` + +#### 蒸散发量计算 + +**潜在蒸散发计算**: +```java +@Service +public class EvapotranspirationService { + + public BigDecimal calculatePET(EtData data) { + // 潜在蒸散发计算(Penman-Monteith方程) + BigDecimal delta = calculateSlopeVaporPressure(data.getTemperature()); + BigDecimal gamma = calculatePsychrometricConstant(data.getPressure()); + BigDecimal u2 = data.getWindSpeed(); + BigDecimal es = calculateSaturationVaporPressure(data.getTemperature()); + BigDecimal ea = calculateActualVaporPressure(data.getTemperature(), + data.getRelativeHumidity()); + + BigDecimal rn = data.getNetRadiation(); + BigDecimal g = data.getSoilHeatFlux(); + + // Penman-Monteith方程 + BigDecimal numerator = delta.multiply(rn.subtract(g)) + .add(K_CONSTANT.multiply(rho_AIR.multiply(CP_AIR).multiply(u2) + .multiply(es.subtract(ea)))); + + BigDecimal denominator = delta.add(gamma.multiply( + BigDecimal.ONE.add(C_D_CONSTANT.multiply(u2)))); + + return numerator.divide(denominator, 2, RoundingMode.HALF_UP); + } + + private BigDecimal calculateSlopeVaporPressure(BigDecimal temperature) { + // 饱和水汽压斜率计算 + BigDecimal temp = temperature.add(BigDecimal.valueOf(237.3)); + BigDecimal numerator = BigDecimal.valueOf(4098).multiply( + BigDecimal.valueOf(0.6108).multiply( + BigDecimal.valueOf(17.27).multiply(temperature).divide(temp, + 8, RoundingMode.HALF_UP).exp())); + BigDecimal denominator = temp.pow(2); + return numerator.divide(denominator, 8, RoundingMode.HALF_UP); + } +} +``` + +**实际蒸散发计算**: +```java +public BigDecimal calculateAET(BigDecimal pet, BigDecimal soilMoisture, + BigDecimal fieldCapacity) { + // 实际蒸散发计算 + BigDecimal moistureRatio = soilMoisture.divide(fieldCapacity, + 8, RoundingMode.HALF_UP); + + if (moistureRatio.compareTo(BigDecimal.ONE) >= 0) { + return pet; // 土壤水分充足,实际蒸散发等于潜在蒸散发 + } else { + // 土壤水分不足,按比例减少 + return pet.multiply(moistureRatio); + } +} +``` + +#### 产流模型参数确定 + +**SCS-CN产流模型**: +```java +@Service +public class SCSModelService { + + public BigDecimal calculateSCSRunoff(BigDecimal rainfall, + BigDecimal cn, BigDecimal initialAbstraction) { + // SCS-CN产流模型 + BigDecimal s = BigDecimal.valueOf(25400).divide(cn, + 8, RoundingMode.HALF_UP).subtract(BigDecimal.valueOf(254)); + + BigDecimal ia = initialAbstraction.multiply(s); + + if (rainfall.compareTo(ia) <= 0) { + return BigDecimal.ZERO; // 降雨小于初损,无产流 + } + + BigDecimal numerator = rainfall.subtract(ia).pow(2); + BigDecimal denominator = rainfall.subtract(ia).add(s); + + return numerator.divide(denominator, 2, RoundingMode.HALF_UP); + } + + public BigDecimal calculateCNValue(LandUseType landUse, SoilType soil, + BigDecimal antecedentMoisture) { + // CN值计算 + // 基于土地利用类型、土壤类型和前期湿度条件 + return cnTableRepository.findByLandUseAndSoil(landUse, soil, antecedentMoisture); + } +} +``` + +**Green-Ampt渗透模型**: +```java +@Service +public class GreenAmptService { + + public BigDecimal calculateInfiltration(BigDecimal time, BigDecimal initialMoisture, + BigDecimal saturatedMoisture, BigDecimal hydraulicConductivity, + BigDecimal suctionHead, BigDecimal cumulativeInfiltration) { + // Green-Ampt渗透模型 + BigDecimal thetaS = saturatedMoisture; + BigDecimal thetaI = initialMoisture; + BigDecimal deltaTheta = thetaS.subtract(thetaI); + + BigDecimal Ks = hydraulicConductivity; + BigDecimal psi = suctionHead; + BigDecimal F = cumulativeInfiltration; + + // Green-Ampt方程 + BigDecimal numerator = Ks.multiply(time).multiply(deltaTheta).multiply(psi).add(F); + BigDecimal denominator = F.add(Ks.multiply(time).multiply(deltaTheta)); + + BigDecimal newF = numerator.divide(denominator, 8, RoundingMode.HALF_UP); + + return newF.subtract(F); // 当前时段渗透量 + } +} +``` + +#### 单位线提取 + +**瞬时单位线计算**: +```java +@Service +public class InstantaneousUnitHydrographService { + + public List calculateIUH(WatershedUnit watershed, + List units) { + // 瞬时单位线计算 + List iuh = new ArrayList<>(); + + // 计算流域特征参数 + BigDecimal avgSlope = calculateAvgSlope(units); + BigDecimal avgFlowLength = calculateAvgFlowLength(units); + BigDecimal avgVelocity = calculateAvgVelocity(avgSlope); + + // 计算汇流时间 + BigDecimal tc = avgFlowLength.divide(avgVelocity, + 8, RoundingMode.HALF_UP); + + // Nash瞬时单位线模型 + int n = 2; // 线性水库数 + BigDecimal k = tc.divide(BigDecimal.valueOf(n), + 8, RoundingMode.HALF_UP); // 水库蓄量常数 + + // 生成单位线纵坐标 + for (int t = 0; t < 100; t++) { + BigDecimal ordinate = calculateNashIUHOrdinate(t, n, k); + iuh.add(ordinate); + } + + return iuh; + } + + private BigDecimal calculateNashIUHOrdinate(int t, int n, BigDecimal k) { + // Nash瞬时单位线纵坐标计算 + if (t == 0) return BigDecimal.ZERO; + + BigDecimal numerator = BigDecimal.ONE.pow(n - 1); + BigDecimal denominator = BigDecimal.valueOf(factorial(n - 1)) + .multiply(k.pow(n)); + + BigDecimal timeTerm = BigDecimal.valueOf(t).pow(n - 1); + BigDecimal expTerm = BigDecimal.valueOf(-t).divide(k, + 8, RoundingMode.HALF_UP).exp(); + + return numerator.multiply(timeTerm).multiply(expTerm).divide(denominator, + 8, RoundingMode.HALF_UP); + } +} +``` + +#### 河道演进模型参数确定 + +**马斯京根法河道演进**: +```java +@Service +public class MuskingumRoutingService { + + public List routeFloodWave(List inflow, + BigDecimal k, BigDecimal x, BigDecimal dt) { + // 马斯京根法河道演进 + List outflow = new ArrayList<>(); + + // 计算演进系数 + BigDecimal c0 = calculateC0(k, x, dt); + BigDecimal c1 = calculateC1(k, x, dt); + BigDecimal c2 = calculateC2(k, x, dt); + + // 初始条件 + outflow.add(inflow.get(0)); // 假设初始出流等于入流 + + // 演进计算 + for (int i = 1; i < inflow.size(); i++) { + BigDecimal qOut = c0.multiply(inflow.get(i)) + .add(c1.multiply(inflow.get(i - 1))) + .add(c2.multiply(outflow.get(i - 1))); + + outflow.add(qOut); + } + + return outflow; + } + + private BigDecimal calculateC0(BigDecimal k, BigDecimal x, BigDecimal dt) { + BigDecimal denominator = k.multiply(BigDecimal.valueOf(2).multiply(x).subtract(BigDecimal.ONE)) + .add(dt); + return dt.subtract(k.multiply(x)).divide(denominator, + 8, RoundingMode.HALF_UP); + } + + private BigDecimal calculateC1(BigDecimal k, BigDecimal x, BigDecimal dt) { + BigDecimal denominator = k.multiply(BigDecimal.valueOf(2).multiply(x).subtract(BigDecimal.ONE)) + .add(dt); + return dt.add(k.multiply(x)).divide(denominator, + 8, RoundingMode.HALF_UP); + } + + private BigDecimal calculateC2(BigDecimal k, BigDecimal x, BigDecimal dt) { + BigDecimal denominator = k.multiply(BigDecimal.valueOf(2).multiply(x).subtract(BigDecimal.ONE)) + .add(dt); + return BigDecimal.ONE.subtract(denominator).divide(denominator, + 8, RoundingMode.HALF_UP); + } +} +``` + +### 5.3 预警功能设计 + +### 5.3.1 动态预警指标设计 + +**预警规则配置模型**: +```java +// 预警规则实体 +public class OsmoticWarnRule { + private Long id; + private String ruleName; // 规则名称 + private String ruleType; // 规则类型:1-渗压,2-渗流,3-位移 + private String deviceCode; // 设备编码 + private BigDecimal threshold1; // 一级阈值 + private BigDecimal threshold2; // 二级阈值 + private BigDecimal threshold3; // 三级阈值 + private String logicRelation; // 逻辑关系:AND/OR + private Integer status; // 状态:0-禁用,1-启用 + // ... 其他字段 +} +``` + +**预警条件判断算法**: +```java +@Service +public class WarningRuleService { + + public WarningResult evaluateWarningRules(List rules, + Map sensorData) { + WarningResult result = new WarningResult(); + List events = new ArrayList<>(); + + for (OsmoticWarnRule rule : rules) { + if (rule.getStatus() == 0) continue; // 跳过禁用规则 + + BigDecimal currentValue = sensorData.get(rule.getDeviceCode()); + if (currentValue == null) continue; + + // 评估预警级别 + int level = evaluateWarningLevel(rule, currentValue); + if (level > 0) { + WarningEvent event = new WarningEvent(); + event.setRuleId(rule.getId()); + event.setRuleName(rule.getRuleName()); + event.setLevel(level); + event.setCurrentValue(currentValue); + event.setThreshold(getThresholdForLevel(rule, level)); + event.setTimestamp(LocalDateTime.now()); + + events.add(event); + } + } + + result.setEvents(events); + result.setHasWarning(!events.isEmpty()); + return result; + } + + private int evaluateWarningLevel(OsmoticWarnRule rule, BigDecimal value) { + if (rule.getThreshold3() != null && value.compareTo(rule.getThreshold3()) > 0) { + return 3; // 三级预警 + } else if (rule.getThreshold2() != null && value.compareTo(rule.getThreshold2()) > 0) { + return 2; // 二级预警 + } else if (rule.getThreshold1() != null && value.compareTo(rule.getThreshold1()) > 0) { + return 1; // 一级预警 + } + return 0; // 无预警 + } +} +``` + +### 5.3.2 预警发布系统设计 + +**预警消息管理**: +```java +@Service +public class MessageCenterService { + + public void publishWaterLevelWarning(List waterLevelData) { + // 水位预警发布 + for (StRsvrR data : waterLevelData) { + // 检查水位预警条件 + if (checkWaterLevelWarning(data)) { + MessageCenter message = new MessageCenter(); + message.setTitle("水位预警"); + message.setContent(String.format("%s水库水位预警:当前水位%.2fm,超过警戒水位", + data.getStnm(), data.getRz())); + message.setWarningLevel(calculateWarningLevel(data)); + message.setStationCode(data.getStcd()); + message.setCreateTime(LocalDateTime.now()); + message.setStatus(0); // 未读状态 + + // 保存预警消息 + save(message); + + // 推送给相关用户 + pushToUsers(message); + } + } + } + + public void publishOsmoticWarning(OsmoticWarnR warnData, String description) { + // 渗压预警发布 + MessageCenter message = new MessageCenter(); + message.setTitle("渗压预警"); + message.setContent(String.format("%s渗压预警:%s", + warnData.getDeviceName(), description)); + message.setWarningLevel(warnData.getWarningLevel()); + message.setDeviceCode(warnData.getDeviceCode()); + message.setCreateTime(LocalDateTime.now()); + message.setStatus(0); + + save(message); + pushToUsers(message); + } +} +``` + +**用户推送机制**: +```java +@Service +public class UserPushService { + + public void pushToUsers(MessageCenter message) { + // 根据预警级别和用户角色推送消息 + List targetUsers = getTargetUsers(message); + + for (User user : targetUsers) { + // 创建用户消息记录 + UserMessage userMessage = new UserMessage(); + userMessage.setUserId(user.getId()); + userMessage.setMessageId(message.getId()); + userMessage.setReadStatus(0); // 未读状态 + userMessage.setPushTime(LocalDateTime.now()); + + userMessageRepository.save(userMessage); + + // 实时推送(WebSocket或其他推送机制) + if (user.isOnline()) { + pushRealTimeNotification(user, message); + } + } + } + + private List getTargetUsers(MessageCenter message) { + // 根据预警级别确定目标用户 + switch (message.getWarningLevel()) { + case 3: // 三级预警(最高级别) + return userRepository.findByRoleIn(Arrays.asList("ADMIN", "COUNTY_MANAGER")); + case 2: // 二级预警 + return userRepository.findByRole("COUNTY_MANAGER"); + case 1: // 一级预警 + return userRepository.findByRoleIn(Arrays.asList("COUNTY_MANAGER", "FIELD_STAFF")); + default: + return Collections.emptyList(); + } + } +} +``` + +### 5.3.3 预警统计分析 + +**预警统计服务**: +```java +@Service +public class WarningStatisticsService { + + public WarningStatistics getMonthlyStatistics(int year, int month) { + // 月度预警统计 + WarningStatistics stats = new WarningStatistics(); + + // 查询当月预警数据 + List warnings = messageCenterRepository + .findByYearAndMonth(year, month); + + // 按类型统计 + stats.setWaterLevelCount(warnings.stream() + .filter(w -> "水位预警".equals(w.getTitle())) + .count()); + + stats.setOsmoticCount(warnings.stream() + .filter(w -> "渗压预警".equals(w.getTitle())) + .count()); + + // 按级别统计 + stats.setLevel1Count(warnings.stream() + .filter(w -> w.getWarningLevel() == 1) + .count()); + + stats.setLevel2Count(warnings.stream() + .filter(w -> w.getWarningLevel() == 2) + .count()); + + stats.setLevel3Count(warnings.stream() + .filter(w -> w.getWarningLevel() == 3) + .count()); + + return stats; + } + + public List getWarningTrend(int days) { + // 预警趋势分析 + List trends = new ArrayList<>(); + + LocalDate endDate = LocalDate.now(); + LocalDate startDate = endDate.minusDays(days); + + for (LocalDate date = startDate; date.isBefore(endDate); date = date.plusDays(1)) { + WarningTrend trend = new WarningTrend(); + trend.setDate(date); + trend.setCount(messageCenterRepository.countByDate(date)); + trends.add(trend); + } + + return trends; + } +} +``` + +## 5.4 县级用户功能设计 + +### 5.4.1 考核管理系统 + +**考核任务工作流程**: +```java +@Service +public class AssessTaskService { + + public AssessTask createTask(AssessTaskDTO dto) { + // 创建考核任务 + AssessTask task = new AssessTask(); + BeanUtils.copyProperties(dto, task); + task.setStatus(0); // 未启动状态 + task.setCreateTime(LocalDateTime.now()); + + // 分配考核对象 + List objects = assessObjectRepository.findByRegion(dto.getRegion()); + task.setAssessObjects(objects); + + // 设置考核指标 + List indicators = assessIndicatorRepository.findByTaskType(dto.getTaskType()); + task.setIndicators(indicators); + + return assessTaskRepository.save(task); + } + + @Transactional + public String startTask(Long taskId) { + // 启动考核任务 + AssessTask task = assessTaskRepository.findById(taskId) + .orElseThrow(() -> new RuntimeException("任务不存在")); + + if (task.getStatus() != 0) { + throw new RuntimeException("任务状态不允许启动"); + } + + task.setStatus(1); // 进行中状态 + task.setStartTime(LocalDateTime.now()); + + // 通知考核对象 + notifyAssessObjects(task); + + assessTaskRepository.save(task); + return "任务启动成功"; + } + + public List getPendingTasks(Long userId) { + // 获取用户待办任务 + User user = userRepository.findById(userId) + .orElseThrow(() -> new RuntimeException("用户不存在")); + + return assessTaskRepository.findByAssessorAndStatus(user, 1); + } + + public List getResult(Long taskId) { + // 获取考核结果 + AssessTask task = assessTaskRepository.findById(taskId) + .orElseThrow(() -> new RuntimeException("任务不存在")); + + List results = assessResultRepository.findByTaskId(taskId); + + return results.stream().map(result -> { + AssessResultVo vo = new AssessResultVo(); + vo.setObjectName(result.getObjectName()); + vo.setIndicatorName(result.getIndicatorName()); + vo.setScore(result.getScore()); + vo.setComment(result.getComment()); + return vo; + }).collect(Collectors.toList()); + } +} +``` + +**考核对象管理**: +```java +@Service +public class AssessObjectService { + + public List getObjectsByRegion(String region) { + // 按区域获取考核对象 + return assessObjectRepository.findByRegion(region); + } + + public List getObjectsByType(String objectType) { + // 按类型获取考核对象 + return assessObjectRepository.findByObjectType(objectType); + } + + public void assignToTask(Long taskId, List objectIds) { + // 分配考核对象到任务 + AssessTask task = assessTaskRepository.findById(taskId) + .orElseThrow(() -> new RuntimeException("任务不存在")); + + List objects = assessObjectRepository.findByIdIn(objectIds); + task.setAssessObjects(objects); + + assessTaskRepository.save(task); + } +} +``` + +### 5.4.2 权限管理系统 + +**基于角色的权限控制**: +```java +@Service +public class PermissionService { + + public boolean hasPermission(Long userId, String permission) { + // 检查用户权限 + User user = userRepository.findById(userId) + .orElseThrow(() -> new RuntimeException("用户不存在")); + + return user.getRoles().stream() + .flatMap(role -> role.getPermissions().stream()) + .anyMatch(p -> p.getCode().equals(permission)); + } + + public List getUserPermissions(Long userId) { + // 获取用户权限列表 + User user = userRepository.findById(userId) + .orElseThrow(() -> new RuntimeException("用户不存在")); + + return user.getRoles().stream() + .flatMap(role -> role.getPermissions().stream()) + .map(Permission::getCode) + .distinct() + .collect(Collectors.toList()); + } +} +``` + +### 5.5 系统改进功能 + +### 5.5.1 防治点管理 + +**防治点树形结构管理**: +```java +@Service +public class PrePlaceService { + + public List getPlaceTree() { + // 获取防治点树形结构 + List places = prePlaceRepository.findAllByOrderByParentIdAsc(); + + return buildTree(places, null); + } + + private List buildTree(List places, Long parentId) { + List tree = new ArrayList<>(); + + for (PrePlace place : places) { + if ((parentId == null && place.getParentId() == null) || + (parentId != null && parentId.equals(place.getParentId()))) { + + PrePlaceTreeVo vo = new PrePlaceTreeVo(); + vo.setId(place.getId()); + vo.setName(place.getPlaceName()); + vo.setCode(place.getPlaceCode()); + vo.setType(place.getPlaceType()); + vo.setChildren(buildTree(places, place.getId())); + + tree.add(vo); + } + } + + return tree; + } + + public List getPlaceDetails(Long placeId) { + // 获取防治点详细信息 + return prePlaceDetailRepository.findByPlaceId(placeId); + } +} +``` + +### 5.5.2 维护管理功能 + +**维护计划管理**: +```java +@Service +public class MentenancePlanService { + + public MentenancePlan createAnnualPlan(MentenancePlanDTO dto) { + // 创建年度维护计划 + MentenancePlan plan = new MentenancePlan(); + BeanUtils.copyProperties(dto, plan); + plan.setStatus(0); // 未启动状态 + plan.setCreateTime(LocalDateTime.now()); + + // 创建维护详情 + List details = dto.getDetails().stream() + .map(detailDto -> { + MentenancePlanDetail detail = new MentenancePlanDetail(); + BeanUtils.copyProperties(detailDto, detail); + detail.setPlan(plan); + return detail; + }) + .collect(Collectors.toList()); + + plan.setDetails(details); + + return mentenancePlanRepository.save(plan); + } + + public void updatePlanStatus(Long planId, Integer status) { + // 更新计划状态 + MentenancePlan plan = mentenancePlanRepository.findById(planId) + .orElseThrow(() -> new RuntimeException("计划不存在")); + + plan.setStatus(status); + if (status == 1) { + plan.setStartTime(LocalDateTime.now()); + } else if (status == 2) { + plan.setEndTime(LocalDateTime.now()); + } + + mentenancePlanRepository.save(plan); + } +} +``` + +这些功能设计完整地覆盖了黑石咀水库系统的核心业务需求,包括基础数据管理、算法模型建设、预警功能、县级用户管理和系统改进功能,为系统的开发和实施提供了详细的技术指导。 \ No newline at end of file diff --git a/tmp.md b/docs/tmp.md similarity index 100% rename from tmp.md rename to docs/tmp.md diff --git a/docs/todo.md b/docs/todo.md new file mode 100644 index 0000000..2f381f5 --- /dev/null +++ b/docs/todo.md @@ -0,0 +1,45 @@ +# 黑石咀水库系统详细设计文档 - 任务追踪 + +## 项目概述 +分析黑石咀水库系统代码库,参考tmp.md结构编写详细设计文档 + +## 任务清单 + +### 阶段1:分析和准备 +- [x] 分析代码库结构和现有文档 +- [ ] 研究tmp.md文件结构和内容要求 +- [ ] 创建todo.md任务追踪文件 + +### 阶段2:内容分析 +- [ ] 分析第4章项目总体设计内容 +- [ ] 分析第5章功能设计内容 +- [ ] 分析第6章数据库设计内容(除6.3节) +- [ ] 分析第7章网络系统设计内容 + +### 阶段3:文档编写 +- [ ] 编写第4章项目总体设计 +- [ ] 编写第5章功能设计 +- [ ] 编写第6章数据库设计(除6.3节) +- [ ] 编写第7章网络系统设计 + +### 阶段4:整合和审核 +- [ ] 整合和审核完整设计文档 + +## 进度更新 + +### 2025-09-11 +- [x] 创建任务追踪文件 +- [x] 完成代码库架构分析 +- [x] 研究tmp.md文件结构和内容要求 +- [x] 完成第4章项目总体设计分析和编写 +- [x] 完成第5章功能设计内容分析和编写 +- [x] 完成第6章数据库设计内容分析(除6.3节)和编写 +- [x] 完成第7章网络系统设计内容分析和编写 +- [x] 完成整合和审核完整设计文档 +- [x] 创建设计文档总目录,提供完整的技术映射和使用指导 + +## 注意事项 +- 参考tmp.md文件结构,只需要编写第4、5、6、7章 +- 第6章不需要编写6.3数据库设计章节内容 +- 保持与现有代码库的一致性 +- 确保文档的技术准确性 \ No newline at end of file diff --git a/docs/详细设计文档.md b/docs/详细设计文档.md new file mode 100644 index 0000000..b215445 --- /dev/null +++ b/docs/详细设计文档.md @@ -0,0 +1,1381 @@ +# 黑石咀水库系统详细设计文档 + +# 第4章 项目总体设计 + +## 4.1 总体架构 + +### 4.1.1 四层分布式体系架构 + +黑石咀水库系统作为湖北省山洪灾害监测预报预警"四预"系统的重要组成部分,采用面向服务的架构模型,建立了完整的"基础支撑层-数据支撑层-业务支撑层-业务应用层"分布式体系架构。 + +#### 架构层次设计 + +**基础支撑层**: +- **感知设备体系**:集成雨量站、水位站、图像站、末端预警站等监测设备,构建全方位的数据采集网络 +- **传输网络架构**:采用水利专网和互联网双通道数据传输,确保数据传输的可靠性和实时性 +- **基础资源平台**:基于省政务云水利专区的计算资源、存储资源、安全资源和资源调度服务,为系统提供稳定的基础设施支撑 +- **设备接入管理**:通过标准化的数据模型实现设备数据的标准化接入,支持多种类型的监测设备统一管理 + +**数据支撑层**: +- **多源数据整合**:建设汇聚库、主题库、基础库、共享库、专题库五级数据体系,实现数据的分类管理和高效检索 +- **数据治理平台**:对各类基础数据、地理空间数据、监测预报数据进行集成、存储、处理、共享,确保数据质量和一致性 +- **数据同步机制**:通过定时任务实现5分钟间隔的多源数据同步,保证数据的实时性和准确性 +- **数据质量控制**:实现数据清洗、验证、标准化处理,为上层应用提供高质量的数据支撑 + +**业务支撑层**: +- **算法模型体系**: + - 小流域分布式水文模型集成,支持洪水预报和风险评估 + - 简化淹没范围与水深分析模型,提供淹没分析功能 + - 气象数据处理模型,支持GRIB2等气象文件的专业处理 + - 空间数据分析模型,提供强大的空间分析能力 +- **应用支撑平台**: + - GIS引擎:提供专业的地理信息处理和空间分析能力 + - 微服务管理:支持服务的模块化部署和独立扩展 + - 数据支撑平台:提供高效的数据访问和处理能力 + - 消息中心:实现预警消息的统一管理和分发 + - 文件管理:支持大文件的安全存储和高效访问 + +**业务应用层**: +- **预报系统**:提供气象预报和洪水预测功能,支持多时间尺度的预报分析 +- **预警系统**:实现多级别、多类型的预警信息管理,支持实时预警发布和统计 +- **预演系统**:提供考核评估和演练管理功能,支持应急响应能力的提升 +- **预案系统**:实现应急响应和决策支持,提供完整的应急管理流程 + +#### 技术架构合理性 + +**微服务架构优势**: +- **服务独立性**:各业务模块独立部署,单个服务的故障不会影响整体系统运行 +- **技术异构性**:不同服务可以采用最适合的技术栈,提高开发效率 +- **弹性伸缩**:根据业务负载动态调整服务实例数量,优化资源利用率 +- **持续部署**:支持独立的服务更新和部署,加快产品迭代速度 + +**分层架构设计原则**: +- **关注点分离**:每层专注于特定的功能领域,降低系统复杂度 +- **接口标准化**:层间通过标准接口交互,降低耦合度 +- **数据流向清晰**:数据在各层间有序流动,便于监控和管理 +- **可扩展性强**:各层可以独立扩展,适应业务发展需求 + +## 4.2 网络架构 + +### 4.2.1 多网络区域架构设计 + +根据云平台整体架构规划,系统网络接入采用多区域隔离设计,包括互联网接入区、政务外网接入区,每个接入区的业务处理网络彼此隔离。 + +#### 政务外网及专网区实现 + +**网络分区设计**: +- **接入区**:提供专线接入湖北省水利厅专网,确保数据传输的安全性和稳定性 + - 外部系统集成:通过标准API接口与外部系统进行数据交换 + - 安全认证机制:采用Token认证和IP白名单等多重安全措施 + - 动态缓存管理:支持实时缓存清理和更新机制 + +- **核心交换区**:完成各功能分区之间数据流量的高速交换 + - 数据库主从同步:采用主备架构确保数据安全和高可用性 + - 缓存集群部署:多实例缓存服务提高数据访问效率 + - 负载均衡:基于容器化部署的服务编排和负载分发 + +- **运维区**:提供远程运维接入服务 + - 安全远程访问:基于密钥认证的安全访问机制 + - 统一日志管理:应用日志和系统日志的集中管理 + - 性能监控:数据库和应用性能指标的实时监控 + +- **管理区域**:提供数据中心整体的管理功能 + - 用户权限管理:基于角色的访问控制和权限管理 + - 配置管理:多环境配置文件的统一管理 + - 审计日志:操作行为和安全事件的审计跟踪 + +#### 安全隔离区实现 + +**容器化安全隔离**: +- 网络模式:采用host网络模式实现负载分担和高性能 +- 端口管理:统一的服务端口管理和访问控制 +- 访问控制:基于Token的API访问控制和权限验证 + +**网络安全配置**: +- 网络隔离:通过容器技术实现进程和网络层面的隔离 +- 服务编排:基于容器编排工具的服务生命周期管理 +- 资源限制:对容器资源使用进行限制和监控 + +### 4.2.2 外部网络集成 + +#### 三网接入支持 + +**多网络接入架构**: +- **电信接入**:通过外部API配置支持电信网络接入 +- **联通接入**:多网络负载均衡和冗余设计 +- **移动接入**:移动网络接入支持 + +**外部API集成体系**: +- 气象数据API:集成气象局提供的气象监测和预报数据 +- 水库数据API:接入水库监测系统的实时数据 +- IP白名单管理:动态IP白名单管理和访问控制 +- 数据同步API:实现多源数据的定时同步和更新 +- 预警信息API:集成气象预警系统提供预警信息 + +## 4.3 部署架构 + +### 4.3.1 容器化部署架构 + +#### 前端服务器配置 + +**VPC部署设计**: +- 独立VPC环境,分配弹性IP,确保网络访问的独立性 +- 集群技术实现负载分担和高可用,提高系统的可靠性 +- 等保三级安全要求:部署WAF、防DDOS、IPS等安全服务 + +**网络优化配置**: +- 服务端口管理:统一的服务端口配置和管理 +- 数据压缩:启用HTTP压缩提高数据传输效率 +- 静态资源优化:对静态资源进行压缩和缓存优化 + +#### 后端服务器配置 + +**独立VPC部署**: +- 后端服务器在单独的VPC,不分配弹性IP,提高安全性 +- 内部IP地址交互,减少外部攻击面 +- 云防火墙安全隔离,提供网络层面的安全防护 + +**容器编排配置**: +- 基础镜像:采用标准化基础镜像确保环境一致性 +- 数据存储:持久化数据存储和备份机制 +- 时区配置:统一的时区配置和时间同步 +- 环境配置:多环境配置管理和动态配置更新 + +### 4.3.2 数据引擎部署 + +#### PostgreSQL主备架构 + +**主数据库配置**: +- 主从同步:基于PostgreSQL流复制的数据同步机制 +- 故障转移:自动主备切换机制确保服务连续性 +- 连接池:高性能连接池管理优化数据库访问效率 + +**备用数据库配置**: +- 数据一致性:确保主备数据的一致性和完整性 +- 只读服务:备库提供只读服务分担查询压力 +- 监控告警:数据库状态监控和异常告警 + +#### 缓存系统部署 + +**缓存集群配置**: +- 会话管理:用户登录状态和会话信息的缓存管理 +- 查询缓存:热点数据查询缓存提高访问性能 +- 分布式缓存:多实例数据一致性和缓存同步 + +**缓存策略**: +- 缓存失效:基于时间的缓存失效策略 +- 缓存更新:数据变更时的缓存更新机制 +- 缓存穿透防护:防止缓存穿透和雪崩的保护机制 + +## 4.4 数据架构 + +### 4.4.1 数据源体系 + +#### 行业外数据源 + +**气象数据源**: +- 数据来源:省气象局气象监测雨量和预报雨量 +- 接入方式:通过标准API接口进行数据接入 +- 数据类型:GRIB2气象文件、实时监测数据、预报数据 +- 处理服务:专业的气象预报处理和数据分析服务 + +**水文数据源**: +- 数据来源:省水文处水文监测雨量 +- 接入方式:专线接入确保数据传输可靠性 +- 数据类型:降雨量、水位、流量等水文监测数据 +- 同步频率:5分钟定时同步确保数据实时性 + +**水库数据源**: +- 数据来源:省水库处水库监测数据 +- 接入方式:通过标准API接口进行数据接入 +- 数据类型:水库水位、蓄水量、入库流量等 +- 处理机制:实时数据和历史数据的分类存储和管理 + +#### 行业内数据源 + +**基础地理数据**: +- 数据来源:中国水科院提供的107条小流域风险隐患调查数据 +- 数据类型:空间地理数据、流域边界、风险隐患要素 +- 处理方式:GIS空间分析和可视化展示 +- 应用场景:风险评估和预警分析 + +**行政区划数据**: +- 数据来源:各区县水利局提供的行政区划信息 +- 数据类型:行政区划边界、责任人信息、防治对象 +- 管理服务:行政区划的层级管理和维护 +- 关联关系:行政区划与其他业务数据的关联管理 + +### 4.4.2 数据支撑平台 + +#### 数据处理能力 + +**气象文件处理**: +- GRIB2文件解析:专业气象网格数据的解析和处理 +- 雷达数据处理:短临预报数据的实时处理和分析 +- 网格计算:基于空间插值算法的网格化计算 + +**数据计算分析**: +- 面雨量计算:基于泰森多边形等方法的面雨量权重计算 +- 时间序列分析:历史数据的趋势分析和统计 +- 多维分析:基于数据仓库的多维数据分析 + +**算法模型对接**: +- 洪水算法库:专业洪水计算算法的集成和调用 +- 空间分析:几何计算和空间分析引擎 +- 预测模型:气象预报和水文预测模型的集成 + +#### 数据交换共享平台 + +**数据同步机制**: +- 定时同步:基于定时任务的多源数据定时同步 +- 实时同步:关键数据的实时同步和更新 +- 增量同步:基于时间戳的增量数据同步 + +**数据汇聚中心**: +- 多源汇聚:来自不同数据源的数据统一汇聚 +- 质量控制:数据质量检查和异常数据处理 +- 标准化处理:数据的标准化和规范化处理 + +### 4.4.3 数据库体系 + +#### 基础数据库设计 + +**实体模型体系**: +- 监测数据模型:降雨、水位、流量等监测数据的标准化存储 +- 预警数据模型:预警规则、预警消息、预警统计等数据管理 +- 业务数据模型:考核任务、防治对象、维护计划等业务数据 + +**数据关系设计**: +- 一对多关系:防治对象与监测设备的关联关系 +- 多对多关系:考核任务与考核对象的复杂关联 +- 层级关系:行政区划的层级结构管理 + +#### 专题数据库设计 + +**预报专题库**: +- 气象预报数据:短期和长期的气象预报数据 +- 网格降雨数据:基于GIS的空间网格降雨数据 +- 历史比对数据:历史同期数据的对比分析 + +**预警专题库**: +- 预警规则配置:多级别预警规则的配置管理 +- 预警消息记录:预警消息的发布和状态管理 +- 预警统计分析:预警数据的统计分析和趋势展示 + +### 4.4.4 数据应用体系 + +#### 水雨情监测应用 + +**实时监测功能**: +- 实时数据展示:监测数据的实时展示和更新 +- 历史数据查询:历史监测数据的检索和分析 +- 数据统计报表:多维度数据的统计分析和报表生成 + +**监测站点管理**: +- 站点信息管理:监测站点基本信息的维护 +- 站点状态监控:设备运行状态的实时监控 +- 数据质量评估:监测数据质量的评估和报警 + +#### 预报应用专题 + +**天气预报功能**: +- GRIB2数据处理:专业气象文件的解析和处理 +- 网格降雨量计算:基于空间插值的网格化计算 +- 预报结果展示:多时间尺度预报结果的展示 + +**洪水预报功能**: +- 水位预测:基于历史数据的水位趋势预测 +- 流量预测:基于水文模型的流量预测 +- 风险评估:洪水风险的评估和预警 + +#### 预警应用专题 + +**多级预警机制**: +- 水位预警:超校核水位、超设计水位、超汛限水位预警 +- 渗压预警:渗流压力监测和多级预警 +- 降雨预警:强降雨监测和预警 + +**预警消息管理**: +- 消息推送:基于角色的预警消息推送 +- 状态管理:预警消息的确认和处理状态 +- 统计分析:预警数据的统计和分析 + +## 4.5 安全架构 + +### 4.5.1 总体安全策略 + +#### 数据安全策略 + +**敏感数据保护**: +- 数据库连接加密:采用SSL加密确保数据传输安全 +- API访问认证:基于Token的身份认证机制 +- 密码安全:密码的加密存储和安全验证 + +**输入数据安全**: +- XSS防护:跨站脚本攻击的防护 +- SQL注入防护:参数化查询防止SQL注入攻击 +- 输入验证:基于标准的输入数据验证 + +#### 系统安全策略 + +**访问控制**: +- 基于角色的权限控制:细粒度的权限管理 +- API访问控制:接口级别的访问控制 +- 数据访问控制:基于用户权限的数据访问控制 + +**审计安全**: +- 操作日志记录:用户操作行为的全面记录 +- 系统日志监控:系统运行状态的实时监控 +- 安全事件审计:安全事件的记录和分析 + +### 4.5.2 网络安全等级保护 + +#### 等保三级要求 + +**网络安全防护**: +- 网络隔离:政务外网和互联网的区域隔离 +- 访问控制:基于IP和端口的访问控制 +- 入侵检测:网络入侵的检测和防护 + +**数据安全防护**: +- 数据加密:敏感数据的传输和存储加密 +- 数据备份:定期的数据备份和恢复机制 +- 数据完整性:数据完整性的校验和验证 + +**应用安全防护**: +- 应用防火墙:Web应用攻击的防护 +- 漏洞管理:定期的漏洞扫描和修复 +- 安全编码:安全编码规范的执行 + +### 4.5.3 安全技术体系 + +#### 计算环境安全 + +**容器安全**: +- 容器隔离:进程和网络层面的隔离 +- 镜像安全:基础镜像的安全扫描 +- 运行时安全:容器运行时的安全监控 + +**应用安全**: +- 安全框架:集成专业的安全框架 +- 会话管理:安全的会话管理机制 +- 异常处理:统一的异常处理和错误信息管理 + +**数据安全**: +- 数据库安全:数据库的安全配置和访问控制 +- 文件安全:文件存储的安全管理 +- 缓存安全:缓存数据的安全保护 + +#### 安全区域边界 + +**网络边界安全**: +- 防火墙:网络边界的防火墙防护 +- 负载均衡:安全的负载均衡配置 +- DDoS防护:分布式拒绝服务攻击的防护 + +**应用边界安全**: +- 接口控制:统一的API接口访问控制 +- 请求限流:API访问频率的限制 +- 参数验证:输入参数的严格验证 + +### 4.5.4 安全管理体系 + +#### 安全策略管理 + +**安全策略制定**: +- 数据安全策略:敏感数据保护的策略制定 +- 网络安全策略:网络安全防护的策略制定 +- 应用安全策略:应用系统安全的策略制定 + +**安全管理制度**: +- 访问控制制度:基于角色的访问控制制度 +- 数据管理制度:数据分类和管理制度 +- 应急响应制度:安全事件的应急响应流程 + +#### 安全运维管理 + +**安全监控**: +- 实时监控:系统安全状态的实时监控 +- 日志审计:安全日志的审计和分析 +- 异常检测:安全异常行为的检测 + +**安全维护**: +- 漏洞修复:定期的漏洞扫描和修复 +- 安全更新:系统和应用的安全更新 +- 备份恢复:数据备份和恢复演练 + +## 4.6 数据流向 + +### 4.6.1 数据采集流程 + +#### 多源数据采集 + +**山洪5分钟雨量监测数据**: +- 数据源:全省74个县的山洪5分钟雨量监测数据 +- 采集方式:一站双发形式,确保数据可靠性 +- 处理机制:定时同步任务进行数据采集和处理 +- 数据存储:实时数据表和历史数据表的分类存储 + +**气象1小时雨量监测数据**: +- 数据源:省气象局数据库 +- 采集方式:通过数据汇集与共享平台同步 +- 处理机制:GRIB2文件解析和网格化处理 +- 数据存储:处理后的网格数据存储和管理 + +**水库1小时雨量监测数据**: +- 数据源:省水库处数据库 +- 采集方式:通过数据汇集与共享平台同步 +- 处理机制:定时同步和数据验证 +- 数据存储:水库水位数据的分类存储 + +#### 数据质量控制 + +**数据验证机制**: +- 完整性检查:数据字段完整性的验证 +- 格式检查:数据格式和类型的验证 +- 范围检查:数据值范围的合理性验证 + +**数据清洗流程**: +- 异常数据处理:异常数据的识别和处理 +- 重复数据去重:基于时间和设备ID的去重 +- 数据标准化:数据格式和单位的标准化 + +### 4.6.2 数据处理流程 + +#### 实时数据处理 + +**实时数据流入**: +- 外部API数据通过HTTP请求获取 +- 数据经过解析和验证后存储到数据库 +- Redis缓存更新以提高访问性能 +- 业务服务消费数据并提供前端展示 + +**数据同步机制**: +- 基于定时任务的多源数据定时同步 +- 异步处理提高数据同步效率 +- 批量数据处理优化性能 +- 缓存更新确保数据一致性 + +#### 历史数据处理 + +**数据整编处理**: +- 小时数据整编:基于短时间间隔数据生成小时统计数据 +- 天数据整编:基于小时数据生成天统计数据 +- 月数据整编:基于天数据生成月统计数据 + +**数据归档策略**: +- 实时数据:保留最近30天的实时数据 +- 历史数据:长期保存历史整编数据 +- 统计数据:保存各类统计数据用于分析 + +### 4.6.3 数据应用流程 + +#### 业务数据应用 + +**预报数据应用**: +- 气象预报数据:GRIB2文件处理和网格化展示 +- 洪水预报数据:基于水文模型的洪水预测 +- 预警数据应用:基于阈值的预警信息发布 + +**管理数据应用**: +- 考核数据管理:考核任务的创建和管理 +- 防治对象管理:防治点的信息管理和维护 +- 维护管理:维护计划的制定和执行管理 + +#### 对外数据共享 + +**数据接口服务**: +- REST API:标准化的数据访问接口 +- 文件导出:多种格式的数据导出功能 +- 实时推送:实时数据的推送服务 + +**数据安全保障**: +- 访问控制:基于权限的数据访问控制 +- 数据脱敏:敏感信息的脱敏处理 +- 审计日志:数据访问的日志记录 + +## 4.7 技术路线 + +### 4.7.1 微服务架构 + +#### 服务拆分策略 + +**业务模块化**: +- 按业务领域划分:预报、预警、预演、预案等业务模块 +- 按数据类型划分:监测数据、管理数据、统计数据等数据模块 +- 按用户角色划分:管理员、县级用户、普通用户等用户模块 + +**技术组件化**: +- 数据同步组件:多源数据同步的定时任务组件 +- 预警处理组件:预警消息的处理和分发组件 +- 预报计算组件:气象预报和水文预测的计算组件 + +#### 服务治理机制 + +**服务注册发现**: +- 服务注册:服务的自动注册和发现 +- 配置中心:多环境配置的统一管理 +- 健康检查:服务健康状态的监控和检查 + +**服务间通信**: +- HTTP REST:同步的服务调用方式 +- 异步消息:基于消息队列的异步处理 +- 事件驱动:基于事件的松耦合架构 + +### 4.7.2 云计算技术 + +#### 云平台部署 + +**政务云集成**: +- 省政务云水利专区部署,确保数据安全和合规性 +- 专属云平台和云产品,提供专业的云服务 +- 独立物理机房安全保障,确保系统稳定运行 + +**容器化部署**: +- Docker容器化部署,提高部署效率和一致性 +- 容器编排工具的服务编排和管理 +- 持续集成和持续部署的自动化流程 + +#### 云原生技术 + +**微服务支持**: +- 云原生微服务框架,支持微服务架构 +- 云原生配置管理,支持动态配置更新 +- 弹性伸缩和负载均衡,优化资源利用率 + +**DevOps实践**: +- 自动化构建:基于Maven的自动化构建 +- 自动化测试:单元测试和集成测试 +- 自动化部署:容器化部署的自动化流程 + +## 4.8 接口设计 + +### 4.8.1 用户接口设计 + +#### REST API接口 + +**接口标准化**: +- RESTful设计:符合REST架构风格的设计原则 +- 统一响应格式:标准化的JSON响应格式 +- 错误处理:统一的异常处理机制 + +**接口分组管理**: +- 按业务模块分组:预报、预警、管理、系统等模块 +- 按用户角色分组:管理员、县级用户、普通用户等角色 +- 按功能类型分组:查询接口、管理接口、统计接口等类型 + +#### 前端集成接口 + +**数据查询接口**: +- 实时数据查询:监测数据的实时查询接口 +- 历史数据查询:历史数据的检索和分析接口 +- 统计数据查询:统计数据的查询和分析接口 + +**业务操作接口**: +- 预警发布接口:预警信息的发布和管理接口 +- 考核管理接口:考核任务的管理接口 +- 系统管理接口:系统配置的管理接口 + +### 4.8.2 外部接口设计 + +#### 气象数据接口 + +**数据获取流程**: +- 文件获取:从气象服务器获取气象数据文件 +- 数据解析:专业气象数据的解析和处理 +- 结果计算:基于气象数据的计算和分析 + +**数据处理流程**: +- 文件获取:从气象服务器获取GRIB2文件 +- 数据解析:解析气象网格数据 +- 结果计算:计算面雨量和预报结果 + +#### 水文数据接口 + +**数据同步机制**: +- Token认证:API访问的安全认证机制 +- IP白名单:访问IP地址的控制 +- 重试机制:网络异常的重试处理 + +### 4.8.3 内部接口设计 + +#### 服务层接口 + +**业务服务接口**: +- 预报服务:气象预报和洪水预测服务 +- 预警服务:预警消息的管理和分发服务 +- 考核服务:考核任务的管理服务 + +**数据服务接口**: +- 实时数据服务:实时监测数据的访问服务 +- 历史数据服务:历史数据的检索服务 +- 统计数据服务:统计数据的分析服务 + +#### 数据访问接口 + +**数据访问设计**: +- 基础操作:数据的增删改查操作 +- 自定义查询:复杂业务查询的实现 +- 动态查询:基于条件的动态查询构建 + +**缓存接口设计**: +- 查询缓存:查询结果的缓存机制 +- 更新缓存:缓存的更新和清除 +- 分布式缓存:多实例缓存的同步机制 + +# 第5章 功能设计 + +## 5.1 梳理集成基础数据 + +### 5.1.1 设计思路 + +为梳理集成完整的、准确的、权威的湖北山洪灾害基础数据,需对基础数据进行全量调研和评估,分析其质量、完整性、准确性,识别可能存在的数据缺失、错误或不一致等问题。 + +#### 数据质量评估体系 + +**数据完整性评估**: +- 必填字段检查:确保关键字段不为空 +- 数据范围验证:验证数据在合理范围内 +- 时间连续性检查:确保时间序列数据的连续性 + +**数据准确性评估**: +- 数据一致性检查:跨表数据一致性验证 +- 业务逻辑验证:基于业务规则的逻辑验证 +- 异常值检测:识别和处理异常数据 + +**数据权威性评估**: +- 数据来源确认:确认数据来源的权威性 +- 数据更新机制:确保数据的及时更新 +- 数据版本管理:维护数据的历史版本 + +### 5.1.2 防治对象调查评价成果集成 + +#### 调查评价成果数据管理 + +**防治对象数据模型**: +- 防治点基本信息:包括名称、编码、类型、位置等 +- 防治部位详细信息:包括部位名称、类型、状态等 +- 空间几何信息:包括位置坐标、范围边界等 + +**防治部位详细管理**: +- 部位与防治点的关联关系 +- 部位状态的动态管理 +- 部位信息的维护和更新 + +#### 成果数据集成实现 + +**调查评价成果报告管理**: +- 文档存储:基于对象存储的文档管理 +- 元数据管理:文档的基本信息和分类管理 +- 版本控制:文档版本的管理和历史追踪 + +**图集管理系统**: +- 图像存储:防治对象相关图像的存储管理 +- 空间关联:图像与防治对象的空间关联 +- 展示管理:图集的在线展示和查询 + +**成果数据管理**: +- 电子数据:结构化数据的存储和管理 +- 纸质数据:纸质文档的数字化管理 +- 照片数据:相关照片的存储和管理 + +### 5.1.3 风险隐患调查与影响分析成果集成 + +#### 风险隐患数据模型设计 + +**风险隐患要素数据**: +- 隐患基本信息:包括编码、类型、名称、位置等 +- 风险等级信息:风险评估等级和分类 +- 空间几何信息:隐患的空间位置和范围 + +**断面数据管理**: +- 断面基本信息:包括编码、名称、河流编码等 +- 断面几何信息:断面线的空间几何数据 +- 高程信息:断面的高程数据 + +#### 成果报表管理实现 + +**重点关注对象详查名录表**: +- 对象管理:重点防治对象的详细信息管理 +- 风险评估:对象风险评估和等级划分 +- 监测关联:与监测设备的关联管理 + +**防治对象-监测设备关系表**: +- 关系映射:防治对象与监测设备的对应关系 +- 设备信息:监测设备的基本信息和状态 +- 数据关联:监测数据与防治对象的关联 + +**山洪灾害防治对象名录**: +- 名录管理:防治对象的统一名录管理 +- 分类管理:按类型、区域等分类管理 +- 状态管理:防治对象的状态跟踪 + +**跨沟道路、桥涵、塘(堰)坝调查成果表**: +- 设施管理:跨沟设施的管理和维护 +- 安全评估:设施安全状况评估 +- 风险分析:设施对山洪的影响分析 + +### 5.1.4 数据治理入库和应用集成 + +#### 数据治理流程设计 + +**数据提取阶段**: +- 多源数据采集:从不同数据源提取原始数据 +- 数据格式转换:统一数据格式和编码 +- 数据质量检查:初步的数据质量评估 + +**数据清洗阶段**: +- 异常数据处理:识别和处理异常数据 +- 重复数据去重:基于业务规则的去重处理 +- 数据标准化:统一数据标准和规范 + +**数据整合阶段**: +- 数据关联:建立数据间的关联关系 +- 数据融合:多源数据的融合处理 +- 数据验证:业务逻辑验证和一致性检查 + +**数据转换阶段**: +- 数据映射:源数据到目标数据的映射 +- 数据计算:派生数据的计算和生成 +- 数据聚合:数据的汇总和聚合处理 + +**数据解耦和重组阶段**: +- 数据分层:按业务需求进行数据分层 +- 数据分区:按时间和区域进行数据分区 +- 数据索引:建立高效的数据索引 + +**数据入库阶段**: +- 批量导入:高效的数据批量导入 +- 事务管理:确保数据导入的事务一致性 +- 完整性检查:数据完整性和一致性验证 + +#### 数据治理服务实现 + +**数据质量监控服务**: +- 数据质量检查:数据的完整性和准确性检查 +- 异常数据检测:异常数据的识别和报告 +- 质量报告生成:数据质量评估报告 + +**数据标准化服务**: +- 数据标准化处理:数据的标准化和规范化 +- 标准验证:数据标准的验证和检查 +- 标准维护:数据标准的维护和更新 + +### 5.1.5 小流域治理单元建档立卡 + +#### 小流域基础信息管理 + +**小流域治理单元数据模型**: +- 单元基本信息:包括编码、名称、面积、长度等 +- 流域特征参数:平均高程、坡度等地形特征 +- 空间几何信息:流域边界的空间几何数据 + +**基础信息梳理功能**: +- 全省1309个小流域治理单元基础信息管理 +- 流域特征参数计算和管理 +- 空间拓扑关系建立和维护 + +#### 监测站点信息集成 + +**雨量(水位)站点信息管理**: +- 站点基本信息:包括编码、名称、类型、位置等 +- 空间位置信息:站点的经纬度和空间位置 +- 运行状态信息:站点的运行状态和维护信息 + +**站点关联管理**: +- 空间关联:监测站点与小流域的空间关联 +- 数据关联:监测数据与小流域的数据关联 +- 状态监控:监测站点运行状态监控 + +#### 降雨预报成果数据集成 + +**网格化降雨预报数据**: +- 网格基本信息:包括网格编码、预报时间等 +- 降雨量信息:网格的降雨量数据 +- 空间几何信息:网格的空间几何数据 + +**预报成果管理功能**: +- 网格数据存储和管理 +- 时间序列预报数据管理 +- 空间插值和计算功能 + +#### 流域关系管理 + +**流域拓扑关系建立**: +- 上下游关系:小流域之间的上下游关系 +- 汇流关系:流域汇流关系的建立 +- 网络拓扑:流域网络的拓扑结构 + +**空间分析算法**: +- 河流网络提取:基于DEM数据的河流网络提取 +- 流域边界识别:小流域边界的自动识别 +- 拓扑关系生成:上下游关系的自动生成 + +## 5.2 算法模型建设方案 + +### 5.2.1 模型建模范围确定 + +#### 小流域设计暴雨计算 + +**暴雨参数计算模型**: +- 基于《湖北省暴雨统计参数等值线图集》的暴雨参数计算 +- 标准历时点雨量均值计算:10分钟、1小时、6小时、24小时 +- 设计暴雨计算:基于频率分析的设计暴雨计算 + +**暴雨时程分配模型**: +- 时程分配模式:基于典型暴雨过程的时程分配 +- 时间步长处理:按小时或更小时间步长分配 +- 空间分布:考虑暴雨空间分布的不均匀性 + +#### 小流域设计洪水计算 + +**净雨计算模型**: +- 初损计算:流域初损的估算 +- 下渗计算:下渗率的计算和模拟 +- 净雨过程计算:基于降雨过程的净雨计算 + +**单位线法洪水计算**: +- 单位线获取:基于流域特征的单位线计算 +- 卷积计算:基于单位线的洪水过程计算 +- 洪水过程线生成:洪水流量过程线的生成 + +**经验公式法洪水计算**: +- 洪峰流量计算:基于经验公式的洪峰流量估算 +- 参数确定:基于水文分区的参数确定 +- 适用性分析:经验公式适用性分析 + +#### HEC-RAS二维水动力学模型 + +**淹没范围分析模型**: +- 模型输入准备:地形、糙率等模型参数准备 +- 模型计算:基于HEC-RAS的二维水动力学计算 +- 结果处理:淹没范围和水深结果的提取和分析 + +**不同重现期洪水分析**: +- 50年一遇洪水:中等风险洪水淹没分析 +- 100年一遇洪水:高风险洪水淹没分析 +- 300年一遇洪水:极高风险洪水淹没分析 + +### 5.2.2 小流域分布式水文模型精细建模 + +#### 小流域计算单元划分 + +**计算单元属性提取**: +- 单元划分:基于DEM数据的计算单元划分 +- 属性提取:单元坡度、长度、面积等属性提取 +- 几何特征:单元质心、边界等几何特征提取 + +**小流域统一编码**: +- 编码规则:基于行政区划和流域的编码规则 +- 唯一性保证:编码的唯一性保证 +- 层次关系:编码的层次关系体现 + +#### 面雨量权重值计算 + +**泰森多边形权重计算**: +- 泰森多边形构建:基于站点位置的泰森多边形构建 +- 权重计算:基于面积比的面雨量权重计算 +- 空间分析:基于GIS的空间分析 + +**反距离权重插值**: +- 距离计算:网格点到站点的距离计算 +- 权重计算:基于距离的权重计算 +- 插值计算:基于权重的降雨量插值 + +#### 蒸散发量计算 + +**潜在蒸散发计算**: +- Penman-Monteith方程:基于Penman-Monteith方程的潜在蒸散发计算 +- 气象参数:温度、湿度、风速、辐射等气象参数 +- 计算结果:潜在蒸散发量的计算结果 + +**实际蒸散发计算**: +- 土壤水分考虑:基于土壤水分的实际蒸散发计算 +- 植被影响:植被对蒸散发的影响 +- 季节变化:季节变化对蒸散发的影响 + +#### 产流模型参数确定 + +**SCS-CN产流模型**: +- CN值确定:基于土地利用和土壤类型的CN值确定 +- 初损计算:基于CN值的初损计算 +- 净雨计算:基于SCS-CN模型的净雨计算 + +**Green-Ampt渗透模型**: +- 渗透率计算:基于Green-Ampt模型的渗透率计算 +- 累积渗透量:累积渗透量的计算 +- 时间步长渗透:单位时间渗透量的计算 + +#### 单位线提取 + +**瞬时单位线计算**: +- Nash瞬时单位线:基于Nash瞬时单位线模型 +- 参数确定:汇流时间、水库数等参数确定 +- 单位线生成:瞬时单位线的生成 + +**综合单位线**: +- 历史资料分析:基于历史雨洪资料的分析 +- 综合单位线:综合单位线的建立 +- 适用性验证:单位线适用性的验证 + +#### 河道演进模型参数确定 + +**马斯京根法河道演进**: +- 参数确定:K、X参数的确定 +- 演进计算:基于马斯京根法的河道演进计算 +- 结果验证:演进结果的验证 + +**考虑洪水漫滩的流量修正**: +- 漫滩计算:基于遥感影像的漫滩计算 +- 流量修正:考虑漫滩的流量修正 +- 精度提高:模型精度的提高 + +## 5.3 预警功能设计 + +### 5.3.1 动态预警指标设计 + +**预警规则配置模型**: +- 规则基本信息:包括规则名称、类型、状态等 +- 阈值配置:多级阈值的配置和管理 +- 逻辑关系:多个条件的逻辑关系配置 + +**预警条件判断算法**: +- 实时数据监测:实时监测数据的获取和处理 +- 阈值比较:监测数据与阈值的比较 +- 预警级别判断:基于比较结果的预警级别判断 + +### 5.3.2 预警发布系统设计 + +**预警消息管理**: +- 水位预警:超警戒水位、超设计水位、超汛限水位预警 +- 渗压预警:渗流压力异常预警 +- 预警发布:预警信息的发布和推送 + +**用户推送机制**: +- 用户角色:基于用户角色的预警推送 +- 推送方式:多种推送方式的支持 +- 推送状态:推送状态的跟踪和管理 + +### 5.3.3 预警统计分析 + +**预警统计服务**: +- 月度统计:月度预警数据的统计分析 +- 趋势分析:预警趋势的分析和预测 +- 类型统计:不同类型预警的统计分析 + +**预警报表生成**: +- 统计报表:各类统计报表的生成 +- 图表展示:统计图表的展示 +- 导出功能:报表的导出功能 + +## 5.4 县级用户功能设计 + +### 5.4.1 考核管理系统 + +**考核任务工作流程**: +- 任务创建:考核任务的创建和配置 +- 任务启动:考核任务的启动和执行 +- 任务管理:考核任务的状态管理和监控 + +**考核对象管理**: +- 对象配置:考核对象的配置和管理 +- 关联关系:考核对象与任务的关联 +- 结果管理:考核结果的管理和统计 + +### 5.4.2 权限管理系统 + +**基于角色的权限控制**: +- 角色管理:用户角色的管理 +- 权限配置:角色权限的配置 +- 权限验证:用户权限的验证 + +**用户管理**: +- 用户信息:用户基本信息的维护 +- 用户状态:用户状态的管理 +- 用户日志:用户操作日志的管理 + +## 5.5 系统改进功能 + +### 5.5.1 防治点管理 + +**防治点树形结构管理**: +- 树形结构:防治点的树形结构管理 +- 层级关系:防治点的层级关系 +- 信息展示:防治点信息的展示 + +**防治点详细信息**: +- 详细信息:防治点的详细信息管理 +- 关联信息:相关信息的关联管理 +- 状态管理:防治点状态的管理 + +### 5.5.2 维护管理功能 + +**维护计划管理**: +- 计划创建:维护计划的创建和配置 +- 计划执行:维护计划的执行和监控 +- 计划统计:维护计划的统计分析 + +**维护记录管理**: +- 记录录入:维护记录的录入和管理 +- 记录查询:维护记录的查询和统计 +- 记录分析:维护记录的分析和报告 + +这些功能设计完整地覆盖了黑石咀水库系统的核心业务需求,包括基础数据管理、算法模型建设、预警功能、县级用户管理和系统改进功能,为系统的开发和实施提供了详细的技术指导。 + +# 第6章 数据库设计 + +## 6.1 数据库设计说明 + +### 6.1.1 设计目标 + +数据库设计的核心目标是构建一个高性能、高可用、易维护的数据存储和管理系统,为黑石咀水库系统提供稳定可靠的数据支撑。通过科学的数据模型设计和合理的数据库架构,确保数据的完整性、一致性和安全性。 + +### 6.1.2 设计原则 + +**数据一致性原则**: +- 在统一规划的前提下,统一方法、统一指标、统一操作流程、统一精度进行空间数据的组织 +- 确保数据在不同模块和系统间的一致性和同步性 +- 建立完整的数据质量监控和校验机制 + +**数据规范化原则**: +- 遵循数据库规范化理论,合理设计数据表结构 +- 减少数据冗余,避免数据异常 +- 在规范化和性能之间找到平衡点 + +**数据专业化原则**: +- 充分考虑水利行业数据特性和业务需求 +- 兼容国家标准和行业规范 +- 支持空间数据和业务数据的统一管理 + +### 6.1.3 设计方法 + +**数据类型分类**: +- 结构化数据:监测数据、业务数据、管理数据等 +- 非结构化数据:文档、图片、视频等 +- 空间数据:地理信息、流域边界、站点位置等 + +**设计流程**: +- 需求分析:业务需求和数据需求分析 +- 概念设计:实体关系模型设计 +- 逻辑设计:数据表结构和关系设计 +- 物理设计:存储引擎、索引、分区等物理设计 + +### 6.1.4 运行环境 + +**硬件配置**: +- 计算资源:多核CPU处理器,支持高并发处理 +- 内存配置:大容量内存,支持数据缓存和高效处理 +- 存储配置:高速SSD系统盘,大容量数据盘 + +**软件环境**: +- 操作系统:国产化操作系统,确保安全可控 +- 数据库系统:开源关系型数据库,具有良好扩展性 +- 支持软件:数据库管理工具、监控工具等 + +### 6.1.5 数据库安全设计 + +**安全措施**: +- 账号安全:强密码策略,定期密码更新 +- 权限控制:基于角色的最小权限原则 +- 安全审计:关键操作的安全审计和日志记录 + +**数据备份**: +- 备份策略:每日全量备份,定期增量备份 +- 备份方式:本地备份和远程备份相结合 +- 恢复测试:定期进行数据恢复测试 + +### 6.1.6 规范性引用 + +**标准遵循**: +- 遵循水利部颁布的《实时雨水情数据库表结构与标识符标准》 +- 参考国家相关数据标准和规范 +- 结合行业最佳实践进行设计 + +## 6.2 部署架构 + +### 6.2.1 主备架构设计 + +**架构特点**: +- 采用主备数据库架构,确保高可用性 +- 主数据库负责读写操作,备数据库用于数据同步和故障切换 +- 基于数据库原生的高可用方案,确保数据一致性 + +**故障转移机制**: +- 自动故障检测:实时监控主数据库状态 +- 自动故障切换:主数据库故障时自动切换到备数据库 +- 数据一致性保障:确保切换过程中的数据一致性 + +### 6.2.2 性能优化设计 + +**读写分离**: +- 查询操作分担到备数据库,减轻主数据库压力 +- 基于业务特点的读写分离策略 +- 动态负载均衡,优化整体性能 + +**缓存策略**: +- 数据查询结果缓存,提高访问性能 +- 热点数据缓存,减少数据库访问压力 +- 缓存失效策略,确保数据一致性 + +## 6.3 数据库设计 + +### 6.3.1 数据域划分 + +**分析成果域**: +- 存储各类分析结果和统计数据 +- 支持历史数据查询和趋势分析 +- 提供数据挖掘和决策支持 + +**基础数据域**: +- 存储基础地理信息和监测站点信息 +- 支持空间查询和空间分析 +- 提供基础数据支撑服务 + +**调查成果域**: +- 存储调查评价成果数据 +- 支持成果数据的查询和统计 +- 提供成果数据的展示和分析 + +**系统管理域**: +- 存储系统配置和用户管理数据 +- 支持系统配置和权限管理 +- 提供系统运行监控功能 + +**预报域**: +- 存储气象预报和水文预报数据 +- 支持预报数据的查询和展示 +- 提供预报结果的对比分析 + +**预警域**: +- 存储预警规则和预警消息数据 +- 支持预警信息的发布和管理 +- 提供预警统计分析功能 + +**预演域**: +- 存储预演方案和结果数据 +- 支持预演方案的管理和执行 +- 提供预演结果的评估和分析 + +**预案域**: +- 存储应急预案和处置方案 +- 支持预案的管理和调用 +- 提供应急决策支持 + +### 6.3.2 数据关系设计 + +**实体关系**: +- 一对一关系:如用户与用户详情 +- 一对多关系:如防治点与监测设备 +- 多对多关系:如考核任务与考核对象 + +**关联设计**: +- 外键约束:确保数据引用完整性 +- 级联操作:相关数据的级联更新和删除 +- 索引优化:基于查询需求的索引设计 + +## 6.4 数据库访问优化设计 + +### 6.4.1 查询性能优化 + +**索引策略**: +- 主键索引:确保主键查询的高效性 +- 外键索引:优化关联查询性能 +- 复合索引:基于查询模式的复合索引设计 +- 唯一索引:确保数据唯一性约束 + +**执行计划优化**: +- 执行计划分析:定期分析查询执行计划 +- SQL优化:基于执行计划的SQL语句优化 +- 查询重写:复杂查询的重写和优化 + +### 6.4.2 数据访问优化 + +**分页处理**: +- 基于游标的分页查询,提高大数据量查询性能 +- 缓存分页结果,减少重复查询 +- 动态分页大小,基于用户体验的优化 + +**字段选择**: +- 按需选择查询字段,减少数据传输量 +- 避免SELECT * 查询,提高查询效率 +- 字段投影优化,只返回必要字段 + +### 6.4.3 批量操作优化 + +**批量处理**: +- 批量插入:使用批量插入提高数据写入效率 +- 批量更新:批量更新减少数据库交互次数 +- 批量删除:批量删除提高删除操作效率 + +**事务优化**: +- 合理设置事务隔离级别 +- 避免长事务,减少锁竞争 +- 批量操作的事务管理 + +# 第7章 网络系统设计方案 + +## 7.1 网络规划 + +### 7.1.1 网络架构设计 + +**总体架构**: +根据云平台整体架构规划,系统网络接入采用多区域隔离设计,包括互联网接入区、政务外网接入区,每个接入区的业务处理网络彼此隔离,确保系统的安全性和可靠性。 + +**设计原则**: +- 安全性:确保网络安全和数据安全 +- 可靠性:保障网络服务的高可用性 +- 可扩展性:支持业务的扩展和升级 +- 可管理性:便于网络的监控和维护 + +### 7.1.2 网络分区设计 + +**互联网接入区**: +- 提供电信、联通、移动三网互联网带宽接入 +- 实现负载均衡和冗余设计 +- 部署网络安全防护设备 + +**政务外网接入区**: +- 提供专线接入湖北省水利厅专网 +- 确保与内部系统的安全连接 +- 支持水利业务数据的传输 + +**安全隔离区**: +- 实现互联网区与政务外网区的安全隔离 +- 提供跨区域数据交互的安全通道 +- 部署安全检测和防护设备 + +## 7.2 政务外网及专网区 + +### 7.2.1 区域功能设计 + +**接入区功能**: +- 专线接入:提供与湖北省水利厅专网的专线连接 +- 访问控制:基于IP和端口的访问控制 +- 流量监控:网络流量的实时监控 + +**核心交换区功能**: +- 高速交换:各功能分区之间数据流量的高速交换 +- 负载均衡:网络负载的均衡分配 +- 冗余设计:设备和链路的冗余设计 + +**运维区功能**: +- 远程运维:提供安全的远程运维接入 +- 监控告警:网络设备和系统的监控告警 +- 日志管理:网络日志的集中管理 + +**管理区域功能**: +- 集中管理:网络设备的集中管理 +- 配置管理:网络配置的统一管理 +- 性能管理:网络性能的监控和优化 + +**计算区功能**: +- 资源池:计算资源的池化管理 +- 弹性扩展:基于需求的弹性扩展 +- 资源调度:计算资源的智能调度 + +**存储区功能**: +- 数据存储:业务数据的存储管理 +- 备份恢复:数据的备份和恢复 +- 存储优化:存储性能的优化 + +**灾备区功能**: +- 数据容灾:远程数据容灾备份 +- 业务连续:确保业务的连续性 +- 灾难恢复:灾难情况的快速恢复 + +### 7.2.2 安全保障 + +**网络安全**: +- 网络隔离:不同安全级别的网络隔离 +- 访问控制:精细化的访问控制策略 +- 入侵检测:网络入侵的检测和防护 + +**数据安全**: +- 数据加密:传输和存储数据的加密 +- 数据备份:重要数据的定期备份 +- 数据完整性:数据完整性的校验 + +**应用安全**: +- 应用防护:Web应用的安全防护 +- 漏洞管理:应用漏洞的管理和修复 +- 安全审计:应用操作的安全审计 + +## 7.3 互联网区 + +### 7.3.1 互联网接入设计 + +**多线接入**: +- 三网接入:电信、联通、移动三网接入 +- 带宽保障:充足的带宽资源保障 +- 冗余设计:多线路的冗余设计 + +**负载均衡**: +- 流量分发:基于负载的流量分发 +- 健康检查:服务健康状态的检查 +- 故障切换:故障情况下的自动切换 + +### 7.3.2 安全防护 + +**边界防护**: +- 防火墙:网络边界的防火墙防护 +- 入侵防御:入侵检测和防御系统 +- DDoS防护:分布式拒绝服务攻击防护 + +**应用防护**: +- Web防火墙:Web应用防火墙 +- 安全扫描:定期的安全漏洞扫描 +- 安全加固:系统和应用的安全加固 + +## 7.4 安全隔离区 + +### 7.4.1 隔离机制 + +**网络隔离**: +- 物理隔离:不同安全区域的物理隔离 +- 逻辑隔离:基于VLAN的逻辑隔离 +- 访问控制:跨区域的访问控制 + +**数据交换**: +- 安全通道:安全的数据交换通道 +- 数据验证:交换数据的验证和检查 +- 日志记录:数据交换的日志记录 + +### 7.4.2 安全监控 + +**实时监控**: +- 流量监控:网络流量的实时监控 +- 行为监控:异常行为的监控和告警 +- 性能监控:网络性能的实时监控 + +**审计分析**: +- 访问审计:访问行为的审计记录 +- 安全分析:安全事件的分析和处理 +- 合规检查:安全合规性的检查 + +## 7.5 网络管理 + +### 7.5.1 配置管理 + +**网络配置**: +- 设备配置:网络设备的配置管理 +- 策略配置:安全策略的配置管理 +- 变更管理:配置变更的管理和控制 + +**性能管理**: +- 性能监控:网络性能的监控和分析 +- 性能优化:基于监控的性能优化 +- 容量规划:网络容量的规划和扩展 + +### 7.5.2 运维管理 + +**日常运维**: +- 设备维护:网络设备的日常维护 +- 故障处理:网络故障的快速处理 +- 变更实施:网络变更的实施和验证 + +**应急响应**: +- 应急预案:网络故障的应急预案 +- 故障恢复:故障情况的快速恢复 +- 总结改进:故障处理的总结和改进 + +通过以上详细的网络系统设计,确保黑石咀水库系统具有安全、可靠、高效的网络环境,为系统的稳定运行提供坚实的网络基础。 \ No newline at end of file