From cb3978f2f4f03143bd6e010106cb2b1d462b1122 Mon Sep 17 00:00:00 2001 From: tangwei Date: Thu, 21 May 2026 21:04:21 +0800 Subject: [PATCH 01/41] =?UTF-8?q?fix:=20=E4=BC=98=E5=8C=96=E9=80=BB?= =?UTF-8?q?=E8=BE=91=E6=B0=B4=E6=B8=A9=E7=9B=91=E6=B5=8B=E5=8C=85=E7=BB=93?= =?UTF-8?q?=E6=9E=84?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../com/yfd/platform/PlatformApplication.java | 2 +- .../yfd/platform/config/SwaggerConfig.java | 14 ++++++-- .../env/controller/SdWtvtRController.java | 36 ------------------- .../controller/SdWTMonitorController.java | 8 ++--- .../env/{ => wt}/entity/vo/FishSpawnVo.java | 2 +- .../{ => wt}/entity/vo/SdAlongDetailVO.java | 2 +- .../env/{ => wt}/entity/vo/SdAlongVO.java | 2 +- .../entity/vo/SdDzChuiXiangListVO.java | 2 +- .../env/{ => wt}/entity/vo/SdRvwtSVO.java | 2 +- .../{ => wt}/entity/vo/SdWtBaseInfoVO.java | 2 +- .../entity/vo/SdWtMonitorCountVO.java | 2 +- .../env/{ => wt}/entity/vo/SdWtvtYearVo.java | 4 +-- .../env/{ => wt}/entity/vo/SdYearListVO.java | 2 +- .../env/{ => wt}/entity/vo/StcdVo.java | 2 +- .../env/{ => wt}/entity/vo/WtFishVo.java | 2 +- .../env/{ => wt}/entity/vo/WtrvDataVo.java | 2 +- .../env/{ => wt}/entity/vo/WtrvInfo.java | 2 +- .../env/{ => wt}/entity/vo/WtrvVo.java | 3 +- .../{ => wt}/mapper/AlongDetailMapper.java | 6 ++-- .../env/{ => wt}/mapper/AlongListMapper.java | 4 +-- .../mapper/SdDzChuiXiangListMapper.java | 4 +-- .../mapper/SdRvwtSInOutOneMapper.java | 6 ++-- .../{ => wt}/mapper/SdWtMonitorMapper.java | 4 +-- .../{ => wt}/mapper/SdWtrvdrtpSMapper.java | 2 +- .../env/{ => wt}/mapper/SdWtvtRMapper.java | 4 +-- .../{ => wt}/service/AlongDetailService.java | 6 ++-- .../{ => wt}/service/AlongListService.java | 6 ++-- .../service/SdDzChuiXiangListService.java | 4 +-- .../service/SdRvwtSInOutOneService.java | 6 ++-- .../{ => wt}/service/SdWtMonitorService.java | 4 +-- .../env/{ => wt}/service/SdWtvtRService.java | 2 +- .../service/impl/AlongDetailServiceImpl.java | 10 +++--- .../service/impl/AlongListServiceImpl.java | 15 ++++---- .../impl/SdDzChuiXiangListServiceImpl.java | 9 +++-- .../impl/SdRvwtSInOutOneServiceImpl.java | 10 +++--- .../service/impl/SdWtMonitorServiceImpl.java | 16 ++++----- .../service/impl/SdWtvtRServiceImpl.java | 9 +++-- 37 files changed, 91 insertions(+), 127 deletions(-) delete mode 100644 backend/src/main/java/com/yfd/platform/env/controller/SdWtvtRController.java rename backend/src/main/java/com/yfd/platform/env/{ => wt}/controller/SdWTMonitorController.java (98%) rename backend/src/main/java/com/yfd/platform/env/{ => wt}/entity/vo/FishSpawnVo.java (86%) rename backend/src/main/java/com/yfd/platform/env/{ => wt}/entity/vo/SdAlongDetailVO.java (95%) rename backend/src/main/java/com/yfd/platform/env/{ => wt}/entity/vo/SdAlongVO.java (96%) rename backend/src/main/java/com/yfd/platform/env/{ => wt}/entity/vo/SdDzChuiXiangListVO.java (91%) rename backend/src/main/java/com/yfd/platform/env/{ => wt}/entity/vo/SdRvwtSVO.java (97%) rename backend/src/main/java/com/yfd/platform/env/{ => wt}/entity/vo/SdWtBaseInfoVO.java (96%) rename backend/src/main/java/com/yfd/platform/env/{ => wt}/entity/vo/SdWtMonitorCountVO.java (94%) rename backend/src/main/java/com/yfd/platform/env/{ => wt}/entity/vo/SdWtvtYearVo.java (84%) rename backend/src/main/java/com/yfd/platform/env/{ => wt}/entity/vo/SdYearListVO.java (95%) rename backend/src/main/java/com/yfd/platform/env/{ => wt}/entity/vo/StcdVo.java (90%) rename backend/src/main/java/com/yfd/platform/env/{ => wt}/entity/vo/WtFishVo.java (86%) rename backend/src/main/java/com/yfd/platform/env/{ => wt}/entity/vo/WtrvDataVo.java (93%) rename backend/src/main/java/com/yfd/platform/env/{ => wt}/entity/vo/WtrvInfo.java (97%) rename backend/src/main/java/com/yfd/platform/env/{ => wt}/entity/vo/WtrvVo.java (79%) rename backend/src/main/java/com/yfd/platform/env/{ => wt}/mapper/AlongDetailMapper.java (98%) rename backend/src/main/java/com/yfd/platform/env/{ => wt}/mapper/AlongListMapper.java (98%) rename backend/src/main/java/com/yfd/platform/env/{ => wt}/mapper/SdDzChuiXiangListMapper.java (89%) rename backend/src/main/java/com/yfd/platform/env/{ => wt}/mapper/SdRvwtSInOutOneMapper.java (94%) rename backend/src/main/java/com/yfd/platform/env/{ => wt}/mapper/SdWtMonitorMapper.java (91%) rename backend/src/main/java/com/yfd/platform/env/{ => wt}/mapper/SdWtrvdrtpSMapper.java (97%) rename backend/src/main/java/com/yfd/platform/env/{ => wt}/mapper/SdWtvtRMapper.java (89%) rename backend/src/main/java/com/yfd/platform/env/{ => wt}/service/AlongDetailService.java (91%) rename backend/src/main/java/com/yfd/platform/env/{ => wt}/service/AlongListService.java (84%) rename backend/src/main/java/com/yfd/platform/env/{ => wt}/service/SdDzChuiXiangListService.java (88%) rename backend/src/main/java/com/yfd/platform/env/{ => wt}/service/SdRvwtSInOutOneService.java (73%) rename backend/src/main/java/com/yfd/platform/env/{ => wt}/service/SdWtMonitorService.java (83%) rename backend/src/main/java/com/yfd/platform/env/{ => wt}/service/SdWtvtRService.java (91%) rename backend/src/main/java/com/yfd/platform/env/{ => wt}/service/impl/AlongDetailServiceImpl.java (98%) rename backend/src/main/java/com/yfd/platform/env/{ => wt}/service/impl/AlongListServiceImpl.java (97%) rename backend/src/main/java/com/yfd/platform/env/{ => wt}/service/impl/SdDzChuiXiangListServiceImpl.java (86%) rename backend/src/main/java/com/yfd/platform/env/{ => wt}/service/impl/SdRvwtSInOutOneServiceImpl.java (98%) rename backend/src/main/java/com/yfd/platform/env/{ => wt}/service/impl/SdWtMonitorServiceImpl.java (98%) rename backend/src/main/java/com/yfd/platform/env/{ => wt}/service/impl/SdWtvtRServiceImpl.java (85%) diff --git a/backend/src/main/java/com/yfd/platform/PlatformApplication.java b/backend/src/main/java/com/yfd/platform/PlatformApplication.java index 95442d3e..94785cf1 100644 --- a/backend/src/main/java/com/yfd/platform/PlatformApplication.java +++ b/backend/src/main/java/com/yfd/platform/PlatformApplication.java @@ -21,7 +21,7 @@ import org.springframework.web.bind.annotation.RestController; @RestController @EnableTransactionManagement @ServletComponentScan("com.yfd.platform.config") -@MapperScan(basePackages = {"com.yfd.platform.*.mapper", "com.yfd.platform.common"}) +@MapperScan(basePackages = {"com.yfd.platform.*.mapper","com.yfd.platform.*.*.mapper", "com.yfd.platform.common"}) //@ComponentScan("com.zny.dec") @SpringBootApplication(exclude= {DataSourceAutoConfiguration.class, DataRedisAutoConfiguration.class}) //@SpringBootApplication diff --git a/backend/src/main/java/com/yfd/platform/config/SwaggerConfig.java b/backend/src/main/java/com/yfd/platform/config/SwaggerConfig.java index 42bd3587..46cfb278 100644 --- a/backend/src/main/java/com/yfd/platform/config/SwaggerConfig.java +++ b/backend/src/main/java/com/yfd/platform/config/SwaggerConfig.java @@ -54,12 +54,20 @@ public class SwaggerConfig { } @Bean - public GroupedOpenApi groupEnvApi() { + public GroupedOpenApi groupEnvWTApi() { return GroupedOpenApi.builder() - .group("3. 全过程-生态环保数据服务") - .packagesToScan("com.yfd.platform.env.controller") + .group("3.1 全过程-生态环保数据服务-水温监测") + .packagesToScan("com.yfd.platform.env.wt.controller") .build(); } + @Bean + public GroupedOpenApi groupEnvWQApi() { + return GroupedOpenApi.builder() + .group("3.2 全过程-生态环保数据服务-水质监测") + .packagesToScan("com.yfd.platform.env.wq.controller") + .build(); + } + @Bean public GroupedOpenApi groupEngApi() { diff --git a/backend/src/main/java/com/yfd/platform/env/controller/SdWtvtRController.java b/backend/src/main/java/com/yfd/platform/env/controller/SdWtvtRController.java deleted file mode 100644 index 0eae5df4..00000000 --- a/backend/src/main/java/com/yfd/platform/env/controller/SdWtvtRController.java +++ /dev/null @@ -1,36 +0,0 @@ -package com.yfd.platform.env.controller; - -import com.yfd.platform.common.DataSourceRequest; -import com.yfd.platform.common.DataSourceResult; -import com.yfd.platform.config.ResponseResult; -import com.yfd.platform.env.service.SdWtvtRService; -import io.swagger.v3.oas.annotations.Operation; -import io.swagger.v3.oas.annotations.tags.Tag; -import jakarta.annotation.Resource; -import org.springframework.validation.annotation.Validated; -import org.springframework.web.bind.annotation.PostMapping; -import org.springframework.web.bind.annotation.RequestBody; -import org.springframework.web.bind.annotation.RequestMapping; -import org.springframework.web.bind.annotation.RestController; - -/** - * 垂向水温Controller - * - * @author - * @date 2023/04/18 19:22 - */ -@RestController -@RequestMapping("/sw/wtvt") -@Tag(name = "垂向水温") -@Validated -public class SdWtvtRController { - - @Resource - private SdWtvtRService sdWtvtRService; - - @PostMapping({"/defaultYear/GetKendoListCust"}) - @Operation(summary = "获取垂向水温有数据的年份") - public ResponseResult getWtrvDefaultYear(@RequestBody DataSourceRequest dataSourceRequest) { - return ResponseResult.successData(sdWtvtRService.getWtrvDefaultYear(dataSourceRequest)); - } -} diff --git a/backend/src/main/java/com/yfd/platform/env/controller/SdWTMonitorController.java b/backend/src/main/java/com/yfd/platform/env/wt/controller/SdWTMonitorController.java similarity index 98% rename from backend/src/main/java/com/yfd/platform/env/controller/SdWTMonitorController.java rename to backend/src/main/java/com/yfd/platform/env/wt/controller/SdWTMonitorController.java index c503cc28..e1e93745 100644 --- a/backend/src/main/java/com/yfd/platform/env/controller/SdWTMonitorController.java +++ b/backend/src/main/java/com/yfd/platform/env/wt/controller/SdWTMonitorController.java @@ -1,4 +1,4 @@ -package com.yfd.platform.env.controller; +package com.yfd.platform.env.wt.controller; import cn.hutool.core.util.StrUtil; import com.baomidou.mybatisplus.extension.plugins.pagination.Page; @@ -8,8 +8,8 @@ import com.yfd.platform.common.DataSourceResult; import com.yfd.platform.common.exception.BizException; import com.yfd.platform.config.ResponseResult; import com.yfd.platform.env.entity.vo.BatchDeleteAo; -import com.yfd.platform.env.entity.vo.WtrvInfo; -import com.yfd.platform.env.service.*; +import com.yfd.platform.env.wt.entity.vo.WtrvInfo; +import com.yfd.platform.env.wt.service.*; import com.yfd.platform.utils.QgcQueryWrapperUtil; import io.swagger.v3.oas.annotations.Operation; import io.swagger.v3.oas.annotations.tags.Tag; @@ -17,8 +17,6 @@ import jakarta.annotation.Resource; import org.springframework.validation.annotation.Validated; import org.springframework.web.bind.annotation.*; -import java.util.ArrayList; -import java.util.HashMap; import java.util.Map; @RestController diff --git a/backend/src/main/java/com/yfd/platform/env/entity/vo/FishSpawnVo.java b/backend/src/main/java/com/yfd/platform/env/wt/entity/vo/FishSpawnVo.java similarity index 86% rename from backend/src/main/java/com/yfd/platform/env/entity/vo/FishSpawnVo.java rename to backend/src/main/java/com/yfd/platform/env/wt/entity/vo/FishSpawnVo.java index 0cd81a86..4d1c9de6 100644 --- a/backend/src/main/java/com/yfd/platform/env/entity/vo/FishSpawnVo.java +++ b/backend/src/main/java/com/yfd/platform/env/wt/entity/vo/FishSpawnVo.java @@ -1,4 +1,4 @@ -package com.yfd.platform.env.entity.vo; +package com.yfd.platform.env.wt.entity.vo; import lombok.Data; diff --git a/backend/src/main/java/com/yfd/platform/env/entity/vo/SdAlongDetailVO.java b/backend/src/main/java/com/yfd/platform/env/wt/entity/vo/SdAlongDetailVO.java similarity index 95% rename from backend/src/main/java/com/yfd/platform/env/entity/vo/SdAlongDetailVO.java rename to backend/src/main/java/com/yfd/platform/env/wt/entity/vo/SdAlongDetailVO.java index 59ba7f78..6496d197 100644 --- a/backend/src/main/java/com/yfd/platform/env/entity/vo/SdAlongDetailVO.java +++ b/backend/src/main/java/com/yfd/platform/env/wt/entity/vo/SdAlongDetailVO.java @@ -1,4 +1,4 @@ -package com.yfd.platform.env.entity.vo; +package com.yfd.platform.env.wt.entity.vo; import com.fasterxml.jackson.annotation.JsonFormat; import io.swagger.v3.oas.annotations.media.Schema; diff --git a/backend/src/main/java/com/yfd/platform/env/entity/vo/SdAlongVO.java b/backend/src/main/java/com/yfd/platform/env/wt/entity/vo/SdAlongVO.java similarity index 96% rename from backend/src/main/java/com/yfd/platform/env/entity/vo/SdAlongVO.java rename to backend/src/main/java/com/yfd/platform/env/wt/entity/vo/SdAlongVO.java index 853478a5..d4a6a7c0 100644 --- a/backend/src/main/java/com/yfd/platform/env/entity/vo/SdAlongVO.java +++ b/backend/src/main/java/com/yfd/platform/env/wt/entity/vo/SdAlongVO.java @@ -1,4 +1,4 @@ -package com.yfd.platform.env.entity.vo; +package com.yfd.platform.env.wt.entity.vo; import io.swagger.v3.oas.annotations.media.Schema; import lombok.Getter; diff --git a/backend/src/main/java/com/yfd/platform/env/entity/vo/SdDzChuiXiangListVO.java b/backend/src/main/java/com/yfd/platform/env/wt/entity/vo/SdDzChuiXiangListVO.java similarity index 91% rename from backend/src/main/java/com/yfd/platform/env/entity/vo/SdDzChuiXiangListVO.java rename to backend/src/main/java/com/yfd/platform/env/wt/entity/vo/SdDzChuiXiangListVO.java index 7caa7bf9..90ec997e 100644 --- a/backend/src/main/java/com/yfd/platform/env/entity/vo/SdDzChuiXiangListVO.java +++ b/backend/src/main/java/com/yfd/platform/env/wt/entity/vo/SdDzChuiXiangListVO.java @@ -1,4 +1,4 @@ -package com.yfd.platform.env.entity.vo; +package com.yfd.platform.env.wt.entity.vo; import io.swagger.v3.oas.annotations.media.Schema; import lombok.Getter; diff --git a/backend/src/main/java/com/yfd/platform/env/entity/vo/SdRvwtSVO.java b/backend/src/main/java/com/yfd/platform/env/wt/entity/vo/SdRvwtSVO.java similarity index 97% rename from backend/src/main/java/com/yfd/platform/env/entity/vo/SdRvwtSVO.java rename to backend/src/main/java/com/yfd/platform/env/wt/entity/vo/SdRvwtSVO.java index 065ccafa..0e79bea0 100644 --- a/backend/src/main/java/com/yfd/platform/env/entity/vo/SdRvwtSVO.java +++ b/backend/src/main/java/com/yfd/platform/env/wt/entity/vo/SdRvwtSVO.java @@ -1,4 +1,4 @@ -package com.yfd.platform.env.entity.vo; +package com.yfd.platform.env.wt.entity.vo; import com.fasterxml.jackson.annotation.JsonFormat; import io.swagger.v3.oas.annotations.media.Schema; diff --git a/backend/src/main/java/com/yfd/platform/env/entity/vo/SdWtBaseInfoVO.java b/backend/src/main/java/com/yfd/platform/env/wt/entity/vo/SdWtBaseInfoVO.java similarity index 96% rename from backend/src/main/java/com/yfd/platform/env/entity/vo/SdWtBaseInfoVO.java rename to backend/src/main/java/com/yfd/platform/env/wt/entity/vo/SdWtBaseInfoVO.java index d3298609..572b2324 100644 --- a/backend/src/main/java/com/yfd/platform/env/entity/vo/SdWtBaseInfoVO.java +++ b/backend/src/main/java/com/yfd/platform/env/wt/entity/vo/SdWtBaseInfoVO.java @@ -1,4 +1,4 @@ -package com.yfd.platform.env.entity.vo; +package com.yfd.platform.env.wt.entity.vo; import io.swagger.v3.oas.annotations.media.Schema; import lombok.Data; diff --git a/backend/src/main/java/com/yfd/platform/env/entity/vo/SdWtMonitorCountVO.java b/backend/src/main/java/com/yfd/platform/env/wt/entity/vo/SdWtMonitorCountVO.java similarity index 94% rename from backend/src/main/java/com/yfd/platform/env/entity/vo/SdWtMonitorCountVO.java rename to backend/src/main/java/com/yfd/platform/env/wt/entity/vo/SdWtMonitorCountVO.java index 86e51ce5..3e05d905 100644 --- a/backend/src/main/java/com/yfd/platform/env/entity/vo/SdWtMonitorCountVO.java +++ b/backend/src/main/java/com/yfd/platform/env/wt/entity/vo/SdWtMonitorCountVO.java @@ -1,4 +1,4 @@ -package com.yfd.platform.env.entity.vo; +package com.yfd.platform.env.wt.entity.vo; import io.swagger.v3.oas.annotations.media.Schema; import lombok.Data; diff --git a/backend/src/main/java/com/yfd/platform/env/entity/vo/SdWtvtYearVo.java b/backend/src/main/java/com/yfd/platform/env/wt/entity/vo/SdWtvtYearVo.java similarity index 84% rename from backend/src/main/java/com/yfd/platform/env/entity/vo/SdWtvtYearVo.java rename to backend/src/main/java/com/yfd/platform/env/wt/entity/vo/SdWtvtYearVo.java index 8d10ac44..b63b2bd4 100644 --- a/backend/src/main/java/com/yfd/platform/env/entity/vo/SdWtvtYearVo.java +++ b/backend/src/main/java/com/yfd/platform/env/wt/entity/vo/SdWtvtYearVo.java @@ -1,12 +1,10 @@ -package com.yfd.platform.env.entity.vo; +package com.yfd.platform.env.wt.entity.vo; import io.swagger.v3.oas.annotations.media.Schema; import lombok.Getter; import lombok.Setter; import lombok.experimental.FieldNameConstants; -import java.math.BigDecimal; - @Getter @Setter @FieldNameConstants diff --git a/backend/src/main/java/com/yfd/platform/env/entity/vo/SdYearListVO.java b/backend/src/main/java/com/yfd/platform/env/wt/entity/vo/SdYearListVO.java similarity index 95% rename from backend/src/main/java/com/yfd/platform/env/entity/vo/SdYearListVO.java rename to backend/src/main/java/com/yfd/platform/env/wt/entity/vo/SdYearListVO.java index f123e9fc..570db59e 100644 --- a/backend/src/main/java/com/yfd/platform/env/entity/vo/SdYearListVO.java +++ b/backend/src/main/java/com/yfd/platform/env/wt/entity/vo/SdYearListVO.java @@ -1,4 +1,4 @@ -package com.yfd.platform.env.entity.vo; +package com.yfd.platform.env.wt.entity.vo; import io.swagger.v3.oas.annotations.media.Schema; import lombok.Getter; diff --git a/backend/src/main/java/com/yfd/platform/env/entity/vo/StcdVo.java b/backend/src/main/java/com/yfd/platform/env/wt/entity/vo/StcdVo.java similarity index 90% rename from backend/src/main/java/com/yfd/platform/env/entity/vo/StcdVo.java rename to backend/src/main/java/com/yfd/platform/env/wt/entity/vo/StcdVo.java index a2eea884..bd578063 100644 --- a/backend/src/main/java/com/yfd/platform/env/entity/vo/StcdVo.java +++ b/backend/src/main/java/com/yfd/platform/env/wt/entity/vo/StcdVo.java @@ -1,4 +1,4 @@ -package com.yfd.platform.env.entity.vo; +package com.yfd.platform.env.wt.entity.vo; import io.swagger.v3.oas.annotations.media.Schema; import lombok.Getter; diff --git a/backend/src/main/java/com/yfd/platform/env/entity/vo/WtFishVo.java b/backend/src/main/java/com/yfd/platform/env/wt/entity/vo/WtFishVo.java similarity index 86% rename from backend/src/main/java/com/yfd/platform/env/entity/vo/WtFishVo.java rename to backend/src/main/java/com/yfd/platform/env/wt/entity/vo/WtFishVo.java index e0684811..859a4d46 100644 --- a/backend/src/main/java/com/yfd/platform/env/entity/vo/WtFishVo.java +++ b/backend/src/main/java/com/yfd/platform/env/wt/entity/vo/WtFishVo.java @@ -1,4 +1,4 @@ -package com.yfd.platform.env.entity.vo; +package com.yfd.platform.env.wt.entity.vo; import lombok.Data; diff --git a/backend/src/main/java/com/yfd/platform/env/entity/vo/WtrvDataVo.java b/backend/src/main/java/com/yfd/platform/env/wt/entity/vo/WtrvDataVo.java similarity index 93% rename from backend/src/main/java/com/yfd/platform/env/entity/vo/WtrvDataVo.java rename to backend/src/main/java/com/yfd/platform/env/wt/entity/vo/WtrvDataVo.java index 17a01966..f788117f 100644 --- a/backend/src/main/java/com/yfd/platform/env/entity/vo/WtrvDataVo.java +++ b/backend/src/main/java/com/yfd/platform/env/wt/entity/vo/WtrvDataVo.java @@ -1,4 +1,4 @@ -package com.yfd.platform.env.entity.vo; +package com.yfd.platform.env.wt.entity.vo; import com.fasterxml.jackson.annotation.JsonFormat; import io.swagger.v3.oas.annotations.media.Schema; diff --git a/backend/src/main/java/com/yfd/platform/env/entity/vo/WtrvInfo.java b/backend/src/main/java/com/yfd/platform/env/wt/entity/vo/WtrvInfo.java similarity index 97% rename from backend/src/main/java/com/yfd/platform/env/entity/vo/WtrvInfo.java rename to backend/src/main/java/com/yfd/platform/env/wt/entity/vo/WtrvInfo.java index bfd6c112..43dc6c2c 100644 --- a/backend/src/main/java/com/yfd/platform/env/entity/vo/WtrvInfo.java +++ b/backend/src/main/java/com/yfd/platform/env/wt/entity/vo/WtrvInfo.java @@ -1,4 +1,4 @@ -package com.yfd.platform.env.entity.vo; +package com.yfd.platform.env.wt.entity.vo; import io.swagger.v3.oas.annotations.media.Schema; import lombok.Data; diff --git a/backend/src/main/java/com/yfd/platform/env/entity/vo/WtrvVo.java b/backend/src/main/java/com/yfd/platform/env/wt/entity/vo/WtrvVo.java similarity index 79% rename from backend/src/main/java/com/yfd/platform/env/entity/vo/WtrvVo.java rename to backend/src/main/java/com/yfd/platform/env/wt/entity/vo/WtrvVo.java index 8e2d88e7..1f4a30ed 100644 --- a/backend/src/main/java/com/yfd/platform/env/entity/vo/WtrvVo.java +++ b/backend/src/main/java/com/yfd/platform/env/wt/entity/vo/WtrvVo.java @@ -1,7 +1,6 @@ -package com.yfd.platform.env.entity.vo; +package com.yfd.platform.env.wt.entity.vo; import lombok.Data; -import lombok.experimental.FieldNameConstants; import java.math.BigDecimal; import java.util.Date; diff --git a/backend/src/main/java/com/yfd/platform/env/mapper/AlongDetailMapper.java b/backend/src/main/java/com/yfd/platform/env/wt/mapper/AlongDetailMapper.java similarity index 98% rename from backend/src/main/java/com/yfd/platform/env/mapper/AlongDetailMapper.java rename to backend/src/main/java/com/yfd/platform/env/wt/mapper/AlongDetailMapper.java index 16a3f3aa..486b6d8c 100644 --- a/backend/src/main/java/com/yfd/platform/env/mapper/AlongDetailMapper.java +++ b/backend/src/main/java/com/yfd/platform/env/wt/mapper/AlongDetailMapper.java @@ -1,8 +1,8 @@ -package com.yfd.platform.env.mapper; +package com.yfd.platform.env.wt.mapper; import com.baomidou.mybatisplus.core.mapper.BaseMapper; -import com.yfd.platform.env.entity.vo.SdAlongDetailVO; -import com.yfd.platform.env.entity.vo.WtrvInfo; +import com.yfd.platform.env.wt.entity.vo.SdAlongDetailVO; +import com.yfd.platform.env.wt.entity.vo.WtrvInfo; import org.apache.ibatis.annotations.Mapper; import org.apache.ibatis.annotations.Param; import org.apache.ibatis.annotations.Select; diff --git a/backend/src/main/java/com/yfd/platform/env/mapper/AlongListMapper.java b/backend/src/main/java/com/yfd/platform/env/wt/mapper/AlongListMapper.java similarity index 98% rename from backend/src/main/java/com/yfd/platform/env/mapper/AlongListMapper.java rename to backend/src/main/java/com/yfd/platform/env/wt/mapper/AlongListMapper.java index 71ad9f14..b5849c7c 100644 --- a/backend/src/main/java/com/yfd/platform/env/mapper/AlongListMapper.java +++ b/backend/src/main/java/com/yfd/platform/env/wt/mapper/AlongListMapper.java @@ -1,9 +1,9 @@ -package com.yfd.platform.env.mapper; +package com.yfd.platform.env.wt.mapper; import com.baomidou.mybatisplus.core.mapper.BaseMapper; -import com.yfd.platform.env.entity.vo.SdAlongVO; +import com.yfd.platform.env.wt.entity.vo.SdAlongVO; import org.apache.ibatis.annotations.Mapper; import org.apache.ibatis.annotations.Param; import org.apache.ibatis.annotations.Select; diff --git a/backend/src/main/java/com/yfd/platform/env/mapper/SdDzChuiXiangListMapper.java b/backend/src/main/java/com/yfd/platform/env/wt/mapper/SdDzChuiXiangListMapper.java similarity index 89% rename from backend/src/main/java/com/yfd/platform/env/mapper/SdDzChuiXiangListMapper.java rename to backend/src/main/java/com/yfd/platform/env/wt/mapper/SdDzChuiXiangListMapper.java index af0d5350..a9a46a9d 100644 --- a/backend/src/main/java/com/yfd/platform/env/mapper/SdDzChuiXiangListMapper.java +++ b/backend/src/main/java/com/yfd/platform/env/wt/mapper/SdDzChuiXiangListMapper.java @@ -1,7 +1,7 @@ -package com.yfd.platform.env.mapper; +package com.yfd.platform.env.wt.mapper; import com.baomidou.mybatisplus.core.mapper.BaseMapper; -import com.yfd.platform.env.entity.vo.SdDzChuiXiangListVO; +import com.yfd.platform.env.wt.entity.vo.SdDzChuiXiangListVO; import org.apache.ibatis.annotations.Mapper; import org.apache.ibatis.annotations.Param; import org.apache.ibatis.annotations.Select; diff --git a/backend/src/main/java/com/yfd/platform/env/mapper/SdRvwtSInOutOneMapper.java b/backend/src/main/java/com/yfd/platform/env/wt/mapper/SdRvwtSInOutOneMapper.java similarity index 94% rename from backend/src/main/java/com/yfd/platform/env/mapper/SdRvwtSInOutOneMapper.java rename to backend/src/main/java/com/yfd/platform/env/wt/mapper/SdRvwtSInOutOneMapper.java index fb61d666..c3298452 100644 --- a/backend/src/main/java/com/yfd/platform/env/mapper/SdRvwtSInOutOneMapper.java +++ b/backend/src/main/java/com/yfd/platform/env/wt/mapper/SdRvwtSInOutOneMapper.java @@ -1,8 +1,8 @@ -package com.yfd.platform.env.mapper; +package com.yfd.platform.env.wt.mapper; import com.baomidou.mybatisplus.core.mapper.BaseMapper; -import com.yfd.platform.env.entity.vo.SdRvwtSVO; -import com.yfd.platform.env.entity.vo.StcdVo; +import com.yfd.platform.env.wt.entity.vo.SdRvwtSVO; +import com.yfd.platform.env.wt.entity.vo.StcdVo; import org.apache.ibatis.annotations.Mapper; import org.apache.ibatis.annotations.Param; import org.apache.ibatis.annotations.Select; diff --git a/backend/src/main/java/com/yfd/platform/env/mapper/SdWtMonitorMapper.java b/backend/src/main/java/com/yfd/platform/env/wt/mapper/SdWtMonitorMapper.java similarity index 91% rename from backend/src/main/java/com/yfd/platform/env/mapper/SdWtMonitorMapper.java rename to backend/src/main/java/com/yfd/platform/env/wt/mapper/SdWtMonitorMapper.java index 258a0f8c..b17bdef0 100644 --- a/backend/src/main/java/com/yfd/platform/env/mapper/SdWtMonitorMapper.java +++ b/backend/src/main/java/com/yfd/platform/env/wt/mapper/SdWtMonitorMapper.java @@ -1,6 +1,6 @@ -package com.yfd.platform.env.mapper; +package com.yfd.platform.env.wt.mapper; -import com.yfd.platform.env.entity.vo.SdWtMonitorCountVO; +import com.yfd.platform.env.wt.entity.vo.SdWtMonitorCountVO; import org.apache.ibatis.annotations.Mapper; import org.apache.ibatis.annotations.Param; import org.apache.ibatis.annotations.Select; diff --git a/backend/src/main/java/com/yfd/platform/env/mapper/SdWtrvdrtpSMapper.java b/backend/src/main/java/com/yfd/platform/env/wt/mapper/SdWtrvdrtpSMapper.java similarity index 97% rename from backend/src/main/java/com/yfd/platform/env/mapper/SdWtrvdrtpSMapper.java rename to backend/src/main/java/com/yfd/platform/env/wt/mapper/SdWtrvdrtpSMapper.java index a8b50a5e..76ea5e53 100644 --- a/backend/src/main/java/com/yfd/platform/env/mapper/SdWtrvdrtpSMapper.java +++ b/backend/src/main/java/com/yfd/platform/env/wt/mapper/SdWtrvdrtpSMapper.java @@ -1,4 +1,4 @@ -package com.yfd.platform.env.mapper; +package com.yfd.platform.env.wt.mapper; import com.yfd.platform.env.entity.vo.DataParam; import org.apache.ibatis.annotations.Delete; diff --git a/backend/src/main/java/com/yfd/platform/env/mapper/SdWtvtRMapper.java b/backend/src/main/java/com/yfd/platform/env/wt/mapper/SdWtvtRMapper.java similarity index 89% rename from backend/src/main/java/com/yfd/platform/env/mapper/SdWtvtRMapper.java rename to backend/src/main/java/com/yfd/platform/env/wt/mapper/SdWtvtRMapper.java index 9aaaad88..4357f570 100644 --- a/backend/src/main/java/com/yfd/platform/env/mapper/SdWtvtRMapper.java +++ b/backend/src/main/java/com/yfd/platform/env/wt/mapper/SdWtvtRMapper.java @@ -1,7 +1,7 @@ -package com.yfd.platform.env.mapper; +package com.yfd.platform.env.wt.mapper; import com.baomidou.mybatisplus.core.mapper.BaseMapper; -import com.yfd.platform.env.entity.vo.SdWtvtYearVo; +import com.yfd.platform.env.wt.entity.vo.SdWtvtYearVo; import org.apache.ibatis.annotations.Mapper; import org.apache.ibatis.annotations.Param; import org.apache.ibatis.annotations.Select; diff --git a/backend/src/main/java/com/yfd/platform/env/service/AlongDetailService.java b/backend/src/main/java/com/yfd/platform/env/wt/service/AlongDetailService.java similarity index 91% rename from backend/src/main/java/com/yfd/platform/env/service/AlongDetailService.java rename to backend/src/main/java/com/yfd/platform/env/wt/service/AlongDetailService.java index 586c3523..7ff96690 100644 --- a/backend/src/main/java/com/yfd/platform/env/service/AlongDetailService.java +++ b/backend/src/main/java/com/yfd/platform/env/wt/service/AlongDetailService.java @@ -1,4 +1,4 @@ -package com.yfd.platform.env.service; +package com.yfd.platform.env.wt.service; import com.baomidou.mybatisplus.extension.plugins.pagination.Page; import com.baomidou.mybatisplus.extension.service.IService; @@ -6,8 +6,8 @@ import com.yfd.platform.common.DataSourceRequest; import com.yfd.platform.common.DataSourceResult; import com.yfd.platform.common.GroupResult; import com.yfd.platform.env.entity.vo.BatchDeleteAo; -import com.yfd.platform.env.entity.vo.SdAlongDetailVO; -import com.yfd.platform.env.entity.vo.WtrvInfo; +import com.yfd.platform.env.wt.entity.vo.SdAlongDetailVO; +import com.yfd.platform.env.wt.entity.vo.WtrvInfo; import java.util.Map; diff --git a/backend/src/main/java/com/yfd/platform/env/service/AlongListService.java b/backend/src/main/java/com/yfd/platform/env/wt/service/AlongListService.java similarity index 84% rename from backend/src/main/java/com/yfd/platform/env/service/AlongListService.java rename to backend/src/main/java/com/yfd/platform/env/wt/service/AlongListService.java index db1449fa..418fc40f 100644 --- a/backend/src/main/java/com/yfd/platform/env/service/AlongListService.java +++ b/backend/src/main/java/com/yfd/platform/env/wt/service/AlongListService.java @@ -1,10 +1,10 @@ -package com.yfd.platform.env.service; +package com.yfd.platform.env.wt.service; import com.yfd.platform.common.DataSourceRequest; import com.yfd.platform.common.DataSourceResult; -import com.yfd.platform.env.entity.vo.SdYearListVO; -import com.yfd.platform.env.entity.vo.StcdVo; +import com.yfd.platform.env.wt.entity.vo.SdYearListVO; +import com.yfd.platform.env.wt.entity.vo.StcdVo; import org.springframework.web.bind.annotation.RequestBody; import java.util.Map; diff --git a/backend/src/main/java/com/yfd/platform/env/service/SdDzChuiXiangListService.java b/backend/src/main/java/com/yfd/platform/env/wt/service/SdDzChuiXiangListService.java similarity index 88% rename from backend/src/main/java/com/yfd/platform/env/service/SdDzChuiXiangListService.java rename to backend/src/main/java/com/yfd/platform/env/wt/service/SdDzChuiXiangListService.java index 7da963e1..de4bbff4 100644 --- a/backend/src/main/java/com/yfd/platform/env/service/SdDzChuiXiangListService.java +++ b/backend/src/main/java/com/yfd/platform/env/wt/service/SdDzChuiXiangListService.java @@ -1,10 +1,8 @@ -package com.yfd.platform.env.service; +package com.yfd.platform.env.wt.service; import com.yfd.platform.common.DataSourceRequest; import com.yfd.platform.common.DataSourceResult; -import java.util.Map; - /** * 电站专题垂向水温一级面板Service接口 * diff --git a/backend/src/main/java/com/yfd/platform/env/service/SdRvwtSInOutOneService.java b/backend/src/main/java/com/yfd/platform/env/wt/service/SdRvwtSInOutOneService.java similarity index 73% rename from backend/src/main/java/com/yfd/platform/env/service/SdRvwtSInOutOneService.java rename to backend/src/main/java/com/yfd/platform/env/wt/service/SdRvwtSInOutOneService.java index dad16f7d..2bd09913 100644 --- a/backend/src/main/java/com/yfd/platform/env/service/SdRvwtSInOutOneService.java +++ b/backend/src/main/java/com/yfd/platform/env/wt/service/SdRvwtSInOutOneService.java @@ -1,9 +1,9 @@ -package com.yfd.platform.env.service; +package com.yfd.platform.env.wt.service; import com.yfd.platform.common.DataSourceRequest; import com.yfd.platform.common.DataSourceResult; -import com.yfd.platform.env.entity.vo.SdRvwtSVO; -import com.yfd.platform.env.entity.vo.StcdVo; +import com.yfd.platform.env.wt.entity.vo.SdRvwtSVO; +import com.yfd.platform.env.wt.entity.vo.StcdVo; public interface SdRvwtSInOutOneService { diff --git a/backend/src/main/java/com/yfd/platform/env/service/SdWtMonitorService.java b/backend/src/main/java/com/yfd/platform/env/wt/service/SdWtMonitorService.java similarity index 83% rename from backend/src/main/java/com/yfd/platform/env/service/SdWtMonitorService.java rename to backend/src/main/java/com/yfd/platform/env/wt/service/SdWtMonitorService.java index 1f4001ae..00db86f4 100644 --- a/backend/src/main/java/com/yfd/platform/env/service/SdWtMonitorService.java +++ b/backend/src/main/java/com/yfd/platform/env/wt/service/SdWtMonitorService.java @@ -1,8 +1,8 @@ -package com.yfd.platform.env.service; +package com.yfd.platform.env.wt.service; import com.yfd.platform.common.DataSourceRequest; import com.yfd.platform.common.DataSourceResult; -import com.yfd.platform.env.entity.vo.WtrvVo; +import com.yfd.platform.env.wt.entity.vo.WtrvVo; public interface SdWtMonitorService { diff --git a/backend/src/main/java/com/yfd/platform/env/service/SdWtvtRService.java b/backend/src/main/java/com/yfd/platform/env/wt/service/SdWtvtRService.java similarity index 91% rename from backend/src/main/java/com/yfd/platform/env/service/SdWtvtRService.java rename to backend/src/main/java/com/yfd/platform/env/wt/service/SdWtvtRService.java index 4ad1f921..9d0e7382 100644 --- a/backend/src/main/java/com/yfd/platform/env/service/SdWtvtRService.java +++ b/backend/src/main/java/com/yfd/platform/env/wt/service/SdWtvtRService.java @@ -1,4 +1,4 @@ -package com.yfd.platform.env.service; +package com.yfd.platform.env.wt.service; import com.yfd.platform.common.DataSourceRequest; import com.yfd.platform.common.DataSourceResult; diff --git a/backend/src/main/java/com/yfd/platform/env/service/impl/AlongDetailServiceImpl.java b/backend/src/main/java/com/yfd/platform/env/wt/service/impl/AlongDetailServiceImpl.java similarity index 98% rename from backend/src/main/java/com/yfd/platform/env/service/impl/AlongDetailServiceImpl.java rename to backend/src/main/java/com/yfd/platform/env/wt/service/impl/AlongDetailServiceImpl.java index 453c7546..5b356d3b 100644 --- a/backend/src/main/java/com/yfd/platform/env/service/impl/AlongDetailServiceImpl.java +++ b/backend/src/main/java/com/yfd/platform/env/wt/service/impl/AlongDetailServiceImpl.java @@ -1,4 +1,4 @@ -package com.yfd.platform.env.service.impl; +package com.yfd.platform.env.wt.service.impl; import cn.hutool.core.collection.CollUtil; import cn.hutool.core.date.DateUtil; @@ -9,9 +9,11 @@ import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; import com.yfd.platform.common.*; import com.yfd.platform.common.exception.BizException; import com.yfd.platform.env.entity.vo.*; -import com.yfd.platform.env.mapper.AlongDetailMapper; -import com.yfd.platform.env.mapper.SdWtrvdrtpSMapper; -import com.yfd.platform.env.service.AlongDetailService; +import com.yfd.platform.env.wt.mapper.AlongDetailMapper; +import com.yfd.platform.env.wt.mapper.SdWtrvdrtpSMapper; +import com.yfd.platform.env.wt.service.AlongDetailService; +import com.yfd.platform.env.wt.entity.vo.SdAlongDetailVO; +import com.yfd.platform.env.wt.entity.vo.WtrvInfo; import com.yfd.platform.utils.CollectionExtUtils; import com.yfd.platform.utils.QgcQueryWrapperUtil; import com.yfd.platform.utils.SecurityUtils; diff --git a/backend/src/main/java/com/yfd/platform/env/service/impl/AlongListServiceImpl.java b/backend/src/main/java/com/yfd/platform/env/wt/service/impl/AlongListServiceImpl.java similarity index 97% rename from backend/src/main/java/com/yfd/platform/env/service/impl/AlongListServiceImpl.java rename to backend/src/main/java/com/yfd/platform/env/wt/service/impl/AlongListServiceImpl.java index 6256ccbd..d3e9b21c 100644 --- a/backend/src/main/java/com/yfd/platform/env/service/impl/AlongListServiceImpl.java +++ b/backend/src/main/java/com/yfd/platform/env/wt/service/impl/AlongListServiceImpl.java @@ -1,4 +1,4 @@ -package com.yfd.platform.env.service.impl; +package com.yfd.platform.env.wt.service.impl; import cn.hutool.core.util.StrUtil; import com.baomidou.mybatisplus.extension.plugins.pagination.Page; @@ -10,13 +10,12 @@ import com.yfd.platform.common.DynamicSQLMapper; import com.yfd.platform.common.MicroservicDynamicSQLMapper; import com.yfd.platform.common.PageInfo; import com.yfd.platform.common.exception.BizException; -import com.yfd.platform.env.entity.vo.SdAlongVO; -import com.yfd.platform.env.entity.vo.SdYearListVO; -import com.yfd.platform.env.entity.vo.StcdVo; -import com.yfd.platform.env.mapper.AlongListMapper; -import com.yfd.platform.env.service.AlongListService; +import com.yfd.platform.env.wt.entity.vo.SdAlongVO; +import com.yfd.platform.env.wt.entity.vo.SdYearListVO; +import com.yfd.platform.env.wt.entity.vo.StcdVo; +import com.yfd.platform.env.wt.mapper.AlongListMapper; +import com.yfd.platform.env.wt.service.AlongListService; import com.yfd.platform.utils.QgcQueryWrapperUtil; -import com.yfd.platform.utils.QueryWrapperUtil; import com.yfd.platform.utils.SqlUtil; import jakarta.annotation.Resource; import org.apache.commons.lang3.StringUtils; @@ -72,7 +71,7 @@ public class AlongListServiceImpl extends ServiceImpl= #{tm} AND TM <= #{tm_1} AND WT IS NOT NULL ) t3 " + + "\t(SELECT STCD FROM SD_WTRV_R WHERE TM >= #{dt} AND TM <= #{dt_1} AND WT IS NOT NULL ) t3 " + "\tON t1.STCD = t3.STCD ORDER BY SORT ASC " + "\t) WHERE ROWNUM = 1 "; Map sqlWhereMap = new HashMap<>(); diff --git a/backend/src/main/java/com/yfd/platform/env/service/impl/SdDzChuiXiangListServiceImpl.java b/backend/src/main/java/com/yfd/platform/env/wt/service/impl/SdDzChuiXiangListServiceImpl.java similarity index 86% rename from backend/src/main/java/com/yfd/platform/env/service/impl/SdDzChuiXiangListServiceImpl.java rename to backend/src/main/java/com/yfd/platform/env/wt/service/impl/SdDzChuiXiangListServiceImpl.java index 25d931af..8fc876e7 100644 --- a/backend/src/main/java/com/yfd/platform/env/service/impl/SdDzChuiXiangListServiceImpl.java +++ b/backend/src/main/java/com/yfd/platform/env/wt/service/impl/SdDzChuiXiangListServiceImpl.java @@ -1,14 +1,13 @@ -package com.yfd.platform.env.service.impl; +package com.yfd.platform.env.wt.service.impl; import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; import com.yfd.platform.common.DataSourceLoadOptionsBase; import com.yfd.platform.common.DataSourceRequest; import com.yfd.platform.common.DataSourceResult; -import com.yfd.platform.env.entity.vo.SdDzChuiXiangListVO; -import com.yfd.platform.env.mapper.SdDzChuiXiangListMapper; -import com.yfd.platform.env.service.SdDzChuiXiangListService; +import com.yfd.platform.env.wt.entity.vo.SdDzChuiXiangListVO; +import com.yfd.platform.env.wt.mapper.SdDzChuiXiangListMapper; +import com.yfd.platform.env.wt.service.SdDzChuiXiangListService; import com.yfd.platform.utils.QgcQueryWrapperUtil; -import com.yfd.platform.utils.QueryWrapperUtil; import jakarta.annotation.Resource; import org.springframework.stereotype.Service; diff --git a/backend/src/main/java/com/yfd/platform/env/service/impl/SdRvwtSInOutOneServiceImpl.java b/backend/src/main/java/com/yfd/platform/env/wt/service/impl/SdRvwtSInOutOneServiceImpl.java similarity index 98% rename from backend/src/main/java/com/yfd/platform/env/service/impl/SdRvwtSInOutOneServiceImpl.java rename to backend/src/main/java/com/yfd/platform/env/wt/service/impl/SdRvwtSInOutOneServiceImpl.java index 9d1d37e2..68c98d69 100644 --- a/backend/src/main/java/com/yfd/platform/env/service/impl/SdRvwtSInOutOneServiceImpl.java +++ b/backend/src/main/java/com/yfd/platform/env/wt/service/impl/SdRvwtSInOutOneServiceImpl.java @@ -1,4 +1,4 @@ -package com.yfd.platform.env.service.impl; +package com.yfd.platform.env.wt.service.impl; import cn.hutool.core.date.DateUtil; import cn.hutool.core.util.ObjectUtil; @@ -6,10 +6,10 @@ import cn.hutool.core.util.StrUtil; import com.baomidou.mybatisplus.extension.plugins.pagination.Page; import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; import com.yfd.platform.common.*; -import com.yfd.platform.env.entity.vo.SdRvwtSVO; -import com.yfd.platform.env.entity.vo.StcdVo; -import com.yfd.platform.env.mapper.SdRvwtSInOutOneMapper; -import com.yfd.platform.env.service.SdRvwtSInOutOneService; +import com.yfd.platform.env.wt.entity.vo.SdRvwtSVO; +import com.yfd.platform.env.wt.entity.vo.StcdVo; +import com.yfd.platform.env.wt.mapper.SdRvwtSInOutOneMapper; +import com.yfd.platform.env.wt.service.SdRvwtSInOutOneService; import com.yfd.platform.utils.QgcQueryWrapperUtil; import jakarta.annotation.Resource; import org.springframework.stereotype.Service; diff --git a/backend/src/main/java/com/yfd/platform/env/service/impl/SdWtMonitorServiceImpl.java b/backend/src/main/java/com/yfd/platform/env/wt/service/impl/SdWtMonitorServiceImpl.java similarity index 98% rename from backend/src/main/java/com/yfd/platform/env/service/impl/SdWtMonitorServiceImpl.java rename to backend/src/main/java/com/yfd/platform/env/wt/service/impl/SdWtMonitorServiceImpl.java index 5313d493..13d950ab 100644 --- a/backend/src/main/java/com/yfd/platform/env/service/impl/SdWtMonitorServiceImpl.java +++ b/backend/src/main/java/com/yfd/platform/env/wt/service/impl/SdWtMonitorServiceImpl.java @@ -1,15 +1,15 @@ -package com.yfd.platform.env.service.impl; +package com.yfd.platform.env.wt.service.impl; import cn.hutool.core.util.StrUtil; import com.baomidou.mybatisplus.extension.plugins.pagination.Page; import com.yfd.platform.common.*; -import com.yfd.platform.env.entity.vo.FishSpawnVo; -import com.yfd.platform.env.entity.vo.SdWtMonitorCountVO; -import com.yfd.platform.env.entity.vo.SdWtBaseInfoVO; -import com.yfd.platform.env.entity.vo.WtrvVo; -import com.yfd.platform.env.entity.vo.WtFishVo; -import com.yfd.platform.env.mapper.SdWtMonitorMapper; -import com.yfd.platform.env.service.SdWtMonitorService; +import com.yfd.platform.env.wt.entity.vo.FishSpawnVo; +import com.yfd.platform.env.wt.entity.vo.SdWtMonitorCountVO; +import com.yfd.platform.env.wt.entity.vo.SdWtBaseInfoVO; +import com.yfd.platform.env.wt.entity.vo.WtrvVo; +import com.yfd.platform.env.wt.entity.vo.WtFishVo; +import com.yfd.platform.env.wt.mapper.SdWtMonitorMapper; +import com.yfd.platform.env.wt.service.SdWtMonitorService; import com.yfd.platform.utils.QgcQueryWrapperUtil; import jakarta.annotation.Resource; import lombok.Data; diff --git a/backend/src/main/java/com/yfd/platform/env/service/impl/SdWtvtRServiceImpl.java b/backend/src/main/java/com/yfd/platform/env/wt/service/impl/SdWtvtRServiceImpl.java similarity index 85% rename from backend/src/main/java/com/yfd/platform/env/service/impl/SdWtvtRServiceImpl.java rename to backend/src/main/java/com/yfd/platform/env/wt/service/impl/SdWtvtRServiceImpl.java index 8f8abcd7..04b05adb 100644 --- a/backend/src/main/java/com/yfd/platform/env/service/impl/SdWtvtRServiceImpl.java +++ b/backend/src/main/java/com/yfd/platform/env/wt/service/impl/SdWtvtRServiceImpl.java @@ -1,14 +1,13 @@ -package com.yfd.platform.env.service.impl; +package com.yfd.platform.env.wt.service.impl; import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; import com.yfd.platform.common.DataSourceLoadOptionsBase; import com.yfd.platform.common.DataSourceRequest; import com.yfd.platform.common.DataSourceResult; -import com.yfd.platform.env.entity.vo.SdWtvtYearVo; -import com.yfd.platform.env.mapper.SdWtvtRMapper; -import com.yfd.platform.env.service.SdWtvtRService; +import com.yfd.platform.env.wt.entity.vo.SdWtvtYearVo; +import com.yfd.platform.env.wt.mapper.SdWtvtRMapper; +import com.yfd.platform.env.wt.service.SdWtvtRService; import com.yfd.platform.utils.QgcQueryWrapperUtil; -import com.yfd.platform.utils.QueryWrapperUtil; import jakarta.annotation.Resource; import org.apache.commons.lang3.StringUtils; import org.springframework.stereotype.Service; From 67b0e4a8a3f8efdf2ece47aba4b48d10a59ed440 Mon Sep 17 00:00:00 2001 From: tangwei Date: Fri, 22 May 2026 09:13:16 +0800 Subject: [PATCH 02/41] =?UTF-8?q?feat:=20=E6=9F=A5=E8=AF=A2=E6=B0=B4?= =?UTF-8?q?=E8=B4=A8=E5=9F=BA=E7=A1=80=E7=AB=99=E7=82=B9=E5=88=86=E7=BB=84?= =?UTF-8?q?=E7=BB=9F=E8=AE=A1&=E6=A0=B9=E6=8D=AE=E7=AB=99=E7=A0=81?= =?UTF-8?q?=E6=9F=A5=E8=AF=A2=E5=8D=95=E6=9D=A1=E6=B0=B4=E8=B4=A8=E5=9F=BA?= =?UTF-8?q?=E7=A1=80=E6=95=B0=E6=8D=AE?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../yfd/platform/config/SecurityConfig.java | 1 + .../wq/controller/EnvWqDataController.java | 55 ++++ .../env/wq/entity/vo/EnvWqDataVo.java | 144 +++++++++++ .../platform/env/wq/entity/vo/EnvWqVo.java | 239 ++++++++++++++++++ .../platform/env/wq/entity/vo/WqAlongVo.java | 155 ++++++++++++ .../env/wq/entity/vo/WqBaseInfoVo.java | 152 +++++++++++ .../env/wq/service/EnvWqDataService.java | 16 ++ .../wq/service/impl/EnvWqDataServiceImpl.java | 120 +++++++++ 8 files changed, 882 insertions(+) create mode 100644 backend/src/main/java/com/yfd/platform/env/wq/controller/EnvWqDataController.java create mode 100644 backend/src/main/java/com/yfd/platform/env/wq/entity/vo/EnvWqDataVo.java create mode 100644 backend/src/main/java/com/yfd/platform/env/wq/entity/vo/EnvWqVo.java create mode 100644 backend/src/main/java/com/yfd/platform/env/wq/entity/vo/WqAlongVo.java create mode 100644 backend/src/main/java/com/yfd/platform/env/wq/entity/vo/WqBaseInfoVo.java create mode 100644 backend/src/main/java/com/yfd/platform/env/wq/service/EnvWqDataService.java create mode 100644 backend/src/main/java/com/yfd/platform/env/wq/service/impl/EnvWqDataServiceImpl.java diff --git a/backend/src/main/java/com/yfd/platform/config/SecurityConfig.java b/backend/src/main/java/com/yfd/platform/config/SecurityConfig.java index ba6eb188..fb55233f 100644 --- a/backend/src/main/java/com/yfd/platform/config/SecurityConfig.java +++ b/backend/src/main/java/com/yfd/platform/config/SecurityConfig.java @@ -60,6 +60,7 @@ public class SecurityConfig { .requestMatchers("/eng/**").permitAll() .requestMatchers("/env/**").permitAll() .requestMatchers("/wt/**").permitAll() + .requestMatchers("/wq/**").permitAll() .requestMatchers("/data/**").permitAll() .requestMatchers("/sms/**").permitAll() .requestMatchers(HttpMethod.GET, "/").permitAll() diff --git a/backend/src/main/java/com/yfd/platform/env/wq/controller/EnvWqDataController.java b/backend/src/main/java/com/yfd/platform/env/wq/controller/EnvWqDataController.java new file mode 100644 index 00000000..aa8428b9 --- /dev/null +++ b/backend/src/main/java/com/yfd/platform/env/wq/controller/EnvWqDataController.java @@ -0,0 +1,55 @@ +package com.yfd.platform.env.wq.controller; + +import com.yfd.platform.common.DataSourceRequest; +import com.yfd.platform.config.ResponseResult; +import com.yfd.platform.env.wq.service.EnvWqDataService; +import io.swagger.v3.oas.annotations.Operation; +import io.swagger.v3.oas.annotations.tags.Tag; +import jakarta.annotation.Resource; +import org.springframework.validation.annotation.Validated; +import org.springframework.web.bind.annotation.GetMapping; +import org.springframework.web.bind.annotation.PostMapping; +import org.springframework.web.bind.annotation.RequestBody; +import org.springframework.web.bind.annotation.RequestParam; +import org.springframework.web.bind.annotation.RequestMapping; +import org.springframework.web.bind.annotation.RestController; + +@RestController +@RequestMapping("/wq") +@Tag(name = "水质统计分析") +@Validated +public class EnvWqDataController { + + @Resource + private EnvWqDataService envWqDataService; + + @PostMapping("/GetKendoListCust") + @Operation(summary = "水质统计分析") + public ResponseResult getKendoListCust(@RequestBody DataSourceRequest dataSourceRequest) { + return ResponseResult.successData(envWqDataService.processKendoList(dataSourceRequest)); + } + + @PostMapping("/data/noAuth/GetKendoListCust") + @Operation(summary = "水质统计分析") + public ResponseResult getNoAuthKendoListCust(@RequestBody DataSourceRequest dataSourceRequest) { + return ResponseResult.successData(envWqDataService.processKendoList(dataSourceRequest)); + } + + @PostMapping("/along/qgc/GetKendoListCust") + @Operation(summary = "查询时间范围内沿程水质最新时间的数据") + public ResponseResult getAlongWqKendoListCust(@RequestBody DataSourceRequest dataSourceRequest) { + return ResponseResult.successData(envWqDataService.getAlongWqKendoListCust(dataSourceRequest)); + } + + @PostMapping("/msstbprpt/GetKendoList") + @Operation(summary = "查询水质基础站点分组统计") + public ResponseResult getMsstbprptList(@RequestBody DataSourceRequest dataSourceRequest) { + return ResponseResult.successData(envWqDataService.getMsstbprptList(dataSourceRequest)); + } + + @GetMapping("/msstbprpt/getStcdInfo") + @Operation(summary = "根据站码查询单条水质基础数据") + public ResponseResult getStcdInfo(@RequestParam String stcd) { + return ResponseResult.successData(envWqDataService.getStcdInfo(stcd)); + } +} diff --git a/backend/src/main/java/com/yfd/platform/env/wq/entity/vo/EnvWqDataVo.java b/backend/src/main/java/com/yfd/platform/env/wq/entity/vo/EnvWqDataVo.java new file mode 100644 index 00000000..4a60882e --- /dev/null +++ b/backend/src/main/java/com/yfd/platform/env/wq/entity/vo/EnvWqDataVo.java @@ -0,0 +1,144 @@ +package com.yfd.platform.env.wq.entity.vo; + +import io.swagger.v3.oas.annotations.media.Schema; +import lombok.Data; + +import java.math.BigDecimal; +import java.util.Date; +import java.util.List; +import java.util.Map; + +@Data +@Schema(description = "水质实时数据") +public class EnvWqDataVo { + @Schema(description = "测站编码") + private String stcd; + @Schema(description = "电站编码") + private String rstcd; + @Schema(description = "测站名称") + private String stnm; + @Schema(description = "栖息地编码") + private String stCode; + @Schema(description = "栖息地名称") + private String stName; + @Schema(description = "电站名称") + private String ennm; + @Schema(description = "数据时间") + private Date tm; + @Schema(description = "水温") + private BigDecimal wtmp; + @Schema(description = "pH") + private BigDecimal ph; + @Schema(description = "溶解氧") + private BigDecimal dox; + @Schema(description = "高锰酸盐指数") + private BigDecimal codmn; + @Schema(description = "化学需氧量") + private BigDecimal codcr; + @Schema(description = "五日生化需氧量") + private BigDecimal bod5; + @Schema(description = "氨氮") + private BigDecimal nh3n; + @Schema(description = "总磷") + private BigDecimal tp; + @Schema(description = "总氮") + private BigDecimal tn; + @Schema(description = "铜") + private BigDecimal cu; + @Schema(description = "锌") + private BigDecimal zn; + @Schema(description = "氟化物") + private BigDecimal f; + @Schema(description = "硒") + private BigDecimal se; + @Schema(description = "砷") + private BigDecimal ars; + @Schema(description = "汞") + private BigDecimal hg; + @Schema(description = "镉") + private BigDecimal cd; + @Schema(description = "六价铬") + private BigDecimal cr6; + @Schema(description = "铅") + private BigDecimal pb; + @Schema(description = "氰化物") + private BigDecimal cn; + @Schema(description = "挥发酚") + private BigDecimal vlph; + @Schema(description = "石油类") + private BigDecimal oil; + @Schema(description = "阴离子表面活性剂") + private BigDecimal las; + @Schema(description = "硫化物") + private BigDecimal s2; + @Schema(description = "粪大肠菌群") + private BigDecimal fcg; + @Schema(description = "氯化物") + private BigDecimal cl; + @Schema(description = "硫酸盐") + private BigDecimal so4; + @Schema(description = "硝酸盐氮") + private BigDecimal no3; + @Schema(description = "总硬度") + private BigDecimal thrd; + @Schema(description = "电导率") + private BigDecimal cond; + @Schema(description = "铁") + private BigDecimal fe; + @Schema(description = "锰") + private BigDecimal mn; + @Schema(description = "铝") + private BigDecimal al; + @Schema(description = "叶绿素a") + private BigDecimal chla; + @Schema(description = "透明度") + private BigDecimal clarity; + @Schema(description = "浊度") + private BigDecimal tu; + @Schema(description = "总需氧量") + private BigDecimal tod; + @Schema(description = "蓝绿藻") + private BigDecimal cyano; + @Schema(description = "实际水质等级") + private String wqgrd; + @Schema(description = "实际水质等级名称") + private String wqgrdName; + @Schema(description = "目标水质等级") + private String wwqtg; + @Schema(description = "目标水质等级名称") + private String wwqtgName; + @Schema(description = "是否达标") + private Integer sfdb; + @Schema(description = "是否达标名称") + private String sfdbName; + @Schema(description = "水质不达标的要素") + private String wqSfdbhnYs; + @Schema(description = "水质不达标的要素名称") + private String wqSfdbhnYsName; + @Schema(description = "基地编码") + private String baseId; + @Schema(description = "基地名称") + private String baseName; + @Schema(description = "流域名称") + private String rvcdName; + @Schema(description = "行政区名称") + private String addvcdName; + @Schema(description = "数据接入类型") + private String dtinType; + @Schema(description = "入库流量") + private BigDecimal qi; + @Schema(description = "出库流量") + private BigDecimal qo; + @Schema(description = "基地排序") + private Integer baseStepSort; + @Schema(description = "流域排序") + private Integer rvcdStepSort; + @Schema(description = "电站排序") + private Integer rstcdStepSort; + @Schema(description = "测站排序") + private Integer siteStepSort; + @Schema(description = "水质要素最小限值集合") + private List> min; + @Schema(description = "水质要素最大限值集合") + private List> max; +} diff --git a/backend/src/main/java/com/yfd/platform/env/wq/entity/vo/EnvWqVo.java b/backend/src/main/java/com/yfd/platform/env/wq/entity/vo/EnvWqVo.java new file mode 100644 index 00000000..47163bf7 --- /dev/null +++ b/backend/src/main/java/com/yfd/platform/env/wq/entity/vo/EnvWqVo.java @@ -0,0 +1,239 @@ +package com.yfd.platform.env.wq.entity.vo; + +import io.swagger.v3.oas.annotations.media.Schema; +import lombok.Data; + +import java.math.BigDecimal; +import java.util.Date; +import java.util.List; +import java.util.Map; + +@Data +@Schema(description = "水质统计分析结果") +public class EnvWqVo { + + @Schema(description = "主键") + private String id; + + @Schema(description = "测站编码") + private String stcd; + + @Schema(description = "测站名称") + private String stnm; + + @Schema(description = "电站编码") + private String rstcd; + + @Schema(description = "电站名称") + private String ennm; + + @Schema(description = "统计时间") + private Date tm; + + @Schema(description = "统计类型") + private String type; + + @Schema(description = "测站类型") + private String sttype; + + @Schema(description = "测站类型名称") + private String sttypeName; + + @Schema(description = "是否达标") + private Integer sfdb; + + @Schema(description = "是否达标名称") + private String sfdbName; + + @Schema(description = "月维度") + private String drMonth; + + @Schema(description = "年维度") + private String drYear; + + @Schema(description = "基地编码") + private String baseId; + + @Schema(description = "基地名称") + private String baseName; + + @Schema(description = "流域编码") + private String hbrvcd; + + @Schema(description = "流域名称") + private String hbrvcdName; + + @Schema(description = "河流名称") + private String rvcdName; + + @Schema(description = "行政区名称") + private String addvcdName; + + @Schema(description = "水质目标") + private String wwqtg; + + @Schema(description = "水质目标名称") + private String wwqtgName; + + @Schema(description = "水质等级") + private String wqGrd; + + @Schema(description = "水质等级名称") + private String wqGrdName; + + @Schema(description = "去年同期水质等级") + private String beforeWqGrd; + + @Schema(description = "去年同期水质等级名称") + private String beforeWqGrdName; + + @Schema(description = "水质达标率") + private String wqRate; + + @Schema(description = "位置") + private String lctn; + + @Schema(description = "计算标识") + private String calculateFlag; + + @Schema(description = "水温") + private BigDecimal wtmp; + + @Schema(description = "pH") + private BigDecimal ph; + + @Schema(description = "溶解氧") + private BigDecimal dox; + + @Schema(description = "高锰酸盐指数") + private BigDecimal codmn; + + @Schema(description = "化学需氧量") + private BigDecimal codcr; + + @Schema(description = "五日生化需氧量") + private BigDecimal bod5; + + @Schema(description = "氨氮") + private BigDecimal nh3n; + + @Schema(description = "总磷") + private BigDecimal tp; + + @Schema(description = "总氮") + private BigDecimal tn; + + @Schema(description = "铜") + private BigDecimal cu; + + @Schema(description = "锌") + private BigDecimal zn; + + @Schema(description = "氟化物") + private BigDecimal f; + + @Schema(description = "硒") + private BigDecimal se; + + @Schema(description = "砷") + private BigDecimal ars; + + @Schema(description = "汞") + private BigDecimal hg; + + @Schema(description = "镉") + private BigDecimal cd; + + @Schema(description = "六价铬") + private BigDecimal cr6; + + @Schema(description = "铅") + private BigDecimal pb; + + @Schema(description = "氰化物") + private BigDecimal cn; + + @Schema(description = "挥发酚") + private BigDecimal vlph; + + @Schema(description = "石油类") + private BigDecimal oil; + + @Schema(description = "阴离子表面活性剂") + private BigDecimal las; + + @Schema(description = "硫化物") + private BigDecimal s2; + + @Schema(description = "粪大肠菌群") + private BigDecimal fcg; + + @Schema(description = "氯化物") + private BigDecimal cl; + + @Schema(description = "硫酸盐") + private BigDecimal so4; + + @Schema(description = "硝酸盐氮") + private BigDecimal no3; + + @Schema(description = "总硬度") + private BigDecimal thrd; + + @Schema(description = "电导率") + private BigDecimal cond; + + @Schema(description = "铁") + private BigDecimal fe; + + @Schema(description = "锰") + private BigDecimal mn; + + @Schema(description = "铝") + private BigDecimal al; + + @Schema(description = "叶绿素a") + private BigDecimal chla; + + @Schema(description = "透明度") + private BigDecimal clarity; + + @Schema(description = "浊度") + private BigDecimal tu; + + @Schema(description = "总需氧量") + private BigDecimal tod; + + @Schema(description = "蓝绿藻") + private BigDecimal cyano; + + @Schema(description = "水质要素最小限值集合") + private List> min; + + @Schema(description = "水质要素最大限值集合") + private List> max; + + @Schema(description = "电站排序") + private Integer rstcdStepSort; + + @Schema(description = "流域排序") + private Integer rvcdStepSort; + + @Schema(description = "基地排序") + private Integer baseStepSort; + + @Schema(description = "测站排序") + private Integer siteStepSort; + + @Schema(description = "R表水质达标数") + private BigDecimal wqSfdbHy; + + @Schema(description = "R表水质不达标数") + private BigDecimal wqSfdbHn; + + @Schema(description = "R表水质统计数") + private BigDecimal wqSfdbCount; + + @Schema(description = "R表水质异常数") + private BigDecimal wqSfdbHo; +} diff --git a/backend/src/main/java/com/yfd/platform/env/wq/entity/vo/WqAlongVo.java b/backend/src/main/java/com/yfd/platform/env/wq/entity/vo/WqAlongVo.java new file mode 100644 index 00000000..ad5d38b2 --- /dev/null +++ b/backend/src/main/java/com/yfd/platform/env/wq/entity/vo/WqAlongVo.java @@ -0,0 +1,155 @@ +package com.yfd.platform.env.wq.entity.vo; + +import io.swagger.v3.oas.annotations.media.Schema; +import lombok.Data; + +import java.math.BigDecimal; +import java.util.Date; +import java.util.List; +import java.util.Map; + +@Data +@Schema(description = "沿程水质数据") +public class WqAlongVo { + + @Schema(description = "站码") + private String stcd; + + @Schema(description = "所属电站编码") + private String rstcd; + + @Schema(description = "站名") + private String stnm; + + @Schema(description = "站类") + private String sttp; + + @Schema(description = "采样时间") + private Date tm; + + @Schema(description = "最小时间") + private Date minTm; + + @Schema(description = "目标水质类别") + private String wwqtg; + + @Schema(description = "实际水质类别") + private String wqgrd; + + @Schema(description = "实际水质类别名称") + private String wqgrdName; + + @Schema(description = "水温") + private BigDecimal wtmp; + + @Schema(description = "PH") + private BigDecimal ph; + + @Schema(description = "溶解氧") + private BigDecimal dox; + + @Schema(description = "高锰酸盐指数") + private BigDecimal codmn; + + @Schema(description = "化学需氧量") + private BigDecimal codcr; + + @Schema(description = "五日生化需氧量") + private BigDecimal bod5; + + @Schema(description = "氨氮") + private BigDecimal nh3n; + + @Schema(description = "总磷") + private BigDecimal tp; + + @Schema(description = "总氮") + private BigDecimal tn; + + @Schema(description = "铜") + private BigDecimal cu; + + @Schema(description = "锌") + private BigDecimal zn; + + @Schema(description = "氟化物") + private BigDecimal f; + + @Schema(description = "硒") + private BigDecimal se; + + @Schema(description = "砷") + private BigDecimal ars; + + @Schema(description = "汞") + private BigDecimal hg; + + @Schema(description = "镉") + private BigDecimal cd; + + @Schema(description = "六价铬") + private BigDecimal cr6; + + @Schema(description = "铅") + private BigDecimal pb; + + @Schema(description = "氰化物") + private BigDecimal cn; + + @Schema(description = "挥发酚") + private BigDecimal vlph; + + @Schema(description = "石油类") + private BigDecimal oil; + + @Schema(description = "阴离子表面活性剂") + private BigDecimal las; + + @Schema(description = "硫化物") + private BigDecimal s2; + + @Schema(description = "粪大肠菌群") + private BigDecimal fcg; + + @Schema(description = "氯化物") + private BigDecimal cl; + + @Schema(description = "硫酸盐") + private BigDecimal so4; + + @Schema(description = "硝酸盐氮") + private BigDecimal no3; + + @Schema(description = "总硬度") + private BigDecimal thrd; + + @Schema(description = "电导率") + private BigDecimal cond; + + @Schema(description = "铁") + private BigDecimal fe; + + @Schema(description = "锰") + private BigDecimal mn; + + @Schema(description = "铝") + private BigDecimal al; + + @Schema(description = "叶绿素a") + private BigDecimal chla; + + @Schema(description = "透明度") + private BigDecimal clarity; + + @Schema(description = "浊度") + private BigDecimal tu; + + @Schema(description = "蓝绿藻") + private BigDecimal cyano; + + @Schema(description = "水质要素最小限值集合") + private List> min; + + @Schema(description = "水质要素最大限值集合") + private List> max; +} diff --git a/backend/src/main/java/com/yfd/platform/env/wq/entity/vo/WqBaseInfoVo.java b/backend/src/main/java/com/yfd/platform/env/wq/entity/vo/WqBaseInfoVo.java new file mode 100644 index 00000000..ac273d24 --- /dev/null +++ b/backend/src/main/java/com/yfd/platform/env/wq/entity/vo/WqBaseInfoVo.java @@ -0,0 +1,152 @@ +package com.yfd.platform.env.wq.entity.vo; + +import io.swagger.v3.oas.annotations.media.Schema; +import lombok.Data; + +import java.util.Date; + +@Data +@Schema(description = "水质基础站点信息") +public class WqBaseInfoVo { + + @Schema(description = "站码") + private String stcd; + + @Schema(description = "站名") + private String stnm; + + @Schema(description = "数据时间") + private Date tm; + + @Schema(description = "站类") + private String sttp; + + @Schema(description = "经度") + private Double lgtd; + + @Schema(description = "纬度") + private Double lttd; + + @Schema(description = "海拔") + private Double elev; + + @Schema(description = "站址") + private String stlc; + + @Schema(description = "水质目标") + private String wwqtg; + + @Schema(description = "水质建设类型") + private String wqtype; + + @Schema(description = "建成日期") + private Date jcdt; + + @Schema(description = "退役日期") + private Date wddt; + + @Schema(description = "建设状态分类") + private Integer bldsttCode; + + @Schema(description = "简介") + private String introduce; + + @Schema(description = "LOGO") + private String logo; + + @Schema(description = "介绍图片") + private String inffile; + + @Schema(description = "是否启用") + private Integer usfl; + + @Schema(description = "数据是否接入") + private Integer dtin; + + @Schema(description = "数据接入来源") + private String dtinSrc; + + @Schema(description = "数据接入类型") + private Integer dtinType; + + @Schema(description = "数据接入开始时间") + private Date dtinTm; + + @Schema(description = "监测方式") + private Integer mway; + + @Schema(description = "监测指标") + private String stindx; + + @Schema(description = "排序") + private Integer orderIndex; + + @Schema(description = "所属电站编码") + private String rstcd; + + @Schema(description = "所属电站名称") + private String ennm; + + @Schema(description = "所属基地编码") + private String baseId; + + @Schema(description = "所属基地名称") + private String baseName; + + @Schema(description = "基地流域编码") + private String hbrvcd; + + @Schema(description = "基地流域名称") + private String hbrvcdName; + + @Schema(description = "流域编码") + private String rvcd; + + @Schema(description = "流域名称") + private String rvcdName; + + @Schema(description = "行政区编码") + private String addvcd; + + @Schema(description = "行政区名称") + private String addvcdName; + + @Schema(description = "所属栖息地编码") + private String fhstcd; + + @Schema(description = "是否关联断面") + private Integer ispro; + + @Schema(description = "数据监测频次") + private Integer dtfrqcy; + + @Schema(description = "备注") + private String remark; + + @Schema(description = "数据来源") + private String vlsr; + + @Schema(description = "数据来源时间") + private Date vlsrTm; + + @Schema(description = "创建人") + private String recordUser; + + @Schema(description = "创建时间") + private Date recordTime; + + @Schema(description = "更新人") + private String modifyUser; + + @Schema(description = "更新时间") + private Date modifyTime; + + @Schema(description = "是否删除") + private Integer isDeleted; + + @Schema(description = "删除人") + private String deleteUser; + + @Schema(description = "删除时间") + private Date deleteTime; +} diff --git a/backend/src/main/java/com/yfd/platform/env/wq/service/EnvWqDataService.java b/backend/src/main/java/com/yfd/platform/env/wq/service/EnvWqDataService.java new file mode 100644 index 00000000..255fa4f9 --- /dev/null +++ b/backend/src/main/java/com/yfd/platform/env/wq/service/EnvWqDataService.java @@ -0,0 +1,16 @@ +package com.yfd.platform.env.wq.service; + +import com.yfd.platform.common.DataSourceRequest; +import com.yfd.platform.common.DataSourceResult; +import com.yfd.platform.env.wq.entity.vo.WqBaseInfoVo; + +public interface EnvWqDataService { + + DataSourceResult processKendoList(DataSourceRequest dataSourceRequest); + + DataSourceResult getAlongWqKendoListCust(DataSourceRequest dataSourceRequest); + + DataSourceResult getMsstbprptList(DataSourceRequest dataSourceRequest); + + WqBaseInfoVo getStcdInfo(String stcd); +} diff --git a/backend/src/main/java/com/yfd/platform/env/wq/service/impl/EnvWqDataServiceImpl.java b/backend/src/main/java/com/yfd/platform/env/wq/service/impl/EnvWqDataServiceImpl.java new file mode 100644 index 00000000..92e94014 --- /dev/null +++ b/backend/src/main/java/com/yfd/platform/env/wq/service/impl/EnvWqDataServiceImpl.java @@ -0,0 +1,120 @@ +package com.yfd.platform.env.wq.service.impl; + +import cn.hutool.core.util.StrUtil; +import com.yfd.platform.common.DataSourceRequest; +import com.yfd.platform.common.DataSourceResult; +import com.yfd.platform.common.MicroservicDynamicSQLMapper; +import com.yfd.platform.common.exception.BizException; +import com.yfd.platform.env.wq.entity.vo.WqBaseInfoVo; +import com.yfd.platform.env.wq.service.EnvWqDataService; +import jakarta.annotation.Resource; +import org.springframework.stereotype.Service; + +import java.util.ArrayList; +import java.util.HashMap; +import java.util.List; +import java.util.Map; + +@Service +public class EnvWqDataServiceImpl implements EnvWqDataService { + + @Resource + private MicroservicDynamicSQLMapper microservicDynamicSQLMapper; + + @Override + public DataSourceResult processKendoList(DataSourceRequest dataSourceRequest) { + return emptyResult(); + } + + @Override + public DataSourceResult getAlongWqKendoListCust(DataSourceRequest dataSourceRequest) { + return emptyResult(); + } + + @Override + public DataSourceResult getMsstbprptList(DataSourceRequest dataSourceRequest) { + return emptyResult(); + } + + @Override + public WqBaseInfoVo getStcdInfo(String stcd) { + if (StrUtil.isBlank(stcd)) { + throw new BizException("站点编码不能为空!"); + } + String sql = "SELECT " + + "t.STCD AS stcd, " + + "t.STNM AS stnm, " + + "t.TM AS tm, " + + "t.STTP AS sttp, " + + "t.LGTD AS lgtd, " + + "t.LTTD AS lttd, " + + "t.ELEV AS elev, " + + "t.STLC AS stlc, " + + "t.WWQTG AS wwqtg, " + + "t.WQTYPE AS wqtype, " + + "t.JCDT AS jcdt, " + + "t.WDDT AS wddt, " + + "t.BLDSTT_CODE AS bldsttCode, " + + "t.INTRODUCE AS introduce, " + + "t.LOGO AS logo, " + + "t.INFFILE AS inffile, " + + "t.USFL AS usfl, " + + "t.DTIN AS dtin, " + + "t.DTIN_SRC AS dtinSrc, " + + "t.DTIN_TYPE AS dtinType, " + + "t.DTIN_TM AS dtinTm, " + + "t.MWAY AS mway, " + + "t.STINDX AS stindx, " + + "t.ORDER_INDEX AS orderIndex, " + + "t.RSTCD AS rstcd, " + + "eng.ENNM AS ennm, " + + "eng.BASE_ID AS baseId, " + + "base.BASENAME AS baseName, " + + "eng.HBRVCD AS hbrvcd, " + + "hbrv.HBRVNM AS hbrvcdName, " + + "eng.RVCD AS rvcd, " + + "rv.RVNM AS rvcdName, " + + "eng.ADDVCD AS addvcd, " + + "addv.ADDVNM AS addvcdName, " + + "t.FHSTCD AS fhstcd, " + + "t.ISPRO AS ispro, " + + "t.DTFRQCY AS dtfrqcy, " + + "t.REMARK AS remark, " + + "t.VLSR AS vlsr, " + + "t.VLSR_TM AS vlsrTm, " + + "t.RECORD_USER AS recordUser, " + + "t.RECORD_TIME AS recordTime, " + + "t.MODIFY_USER AS modifyUser, " + + "t.MODIFY_TIME AS modifyTime, " + + "t.IS_DELETED AS isDeleted, " + + "t.DELETE_USER AS deleteUser, " + + "t.DELETE_TIME AS deleteTime " + + "FROM SD_WQ_B_H t " + + "LEFT JOIN SD_ENGINFO_B_H eng ON eng.STCD = t.RSTCD " + + "LEFT JOIN SD_HYDROBASE base ON base.BASEID = eng.BASE_ID AND NVL(base.IS_DELETED, 0) = 0 " + + "LEFT JOIN SD_HBRV_DIC hbrv ON hbrv.HBRVCD = eng.HBRVCD " + + " AND hbrv.BASEID = eng.BASE_ID " + + " AND NVL(hbrv.IS_DELETED, 0) = 0 " + + " AND NVL(hbrv.ENABLED, 1) = 1 " + + "LEFT JOIN SD_RVCD_DIC rv ON rv.RVCD = eng.RVCD " + + "LEFT JOIN SD_ADDVCD_DIC addv ON addv.ADDVCD = eng.ADDVCD " + + "WHERE t.STCD = #{map.stcd} " + + " AND NVL(t.IS_DELETED, 0) = 0 " + + " AND t.STTP = 'WQ'"; + Map paramMap = new HashMap<>(); + paramMap.put("stcd", stcd); + List list = microservicDynamicSQLMapper.getAllListWithResultType(sql, paramMap, WqBaseInfoVo.class); + if (list == null || list.isEmpty()) { + return null; + } + return list.get(0); + } + + private DataSourceResult emptyResult() { + DataSourceResult result = new DataSourceResult(); + result.setData(new ArrayList<>()); + result.setTotal(0L); + result.setAggregates(new HashMap<>()); + return result; + } +} From 355cd7f4a626af8673d3560a1cf9932a6edf2daf Mon Sep 17 00:00:00 2001 From: tangwei Date: Fri, 22 May 2026 09:44:44 +0800 Subject: [PATCH 03/41] =?UTF-8?q?feat:=20=E6=9F=A5=E8=AF=A2=E6=B0=B4?= =?UTF-8?q?=E7=94=B5=E5=9F=BA=E5=9C=B0=E5=88=97=E8=A1=A8?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../yfd/platform/config/SwaggerConfig.java | 8 ++ .../env/controller/SdHydrobaseController.java | 9 +- .../env/entity/vo/HydrobaseWbsVo.java | 39 +++++ .../env/service/ISdHydrobaseService.java | 7 +- .../service/impl/SdHydrobaseServiceImpl.java | 133 +++++++++++++++++- 5 files changed, 193 insertions(+), 3 deletions(-) create mode 100644 backend/src/main/java/com/yfd/platform/env/entity/vo/HydrobaseWbsVo.java diff --git a/backend/src/main/java/com/yfd/platform/config/SwaggerConfig.java b/backend/src/main/java/com/yfd/platform/config/SwaggerConfig.java index 46cfb278..6a096e46 100644 --- a/backend/src/main/java/com/yfd/platform/config/SwaggerConfig.java +++ b/backend/src/main/java/com/yfd/platform/config/SwaggerConfig.java @@ -53,6 +53,14 @@ public class SwaggerConfig { .build(); } + @Bean + public GroupedOpenApi groupEnvApi() { + return GroupedOpenApi.builder() + .group("3全过程-生态环保数据服务") + .packagesToScan("com.yfd.platform.env.controller") + .build(); + } + @Bean public GroupedOpenApi groupEnvWTApi() { return GroupedOpenApi.builder() diff --git a/backend/src/main/java/com/yfd/platform/env/controller/SdHydrobaseController.java b/backend/src/main/java/com/yfd/platform/env/controller/SdHydrobaseController.java index a48ba591..9ef89dfb 100644 --- a/backend/src/main/java/com/yfd/platform/env/controller/SdHydrobaseController.java +++ b/backend/src/main/java/com/yfd/platform/env/controller/SdHydrobaseController.java @@ -2,6 +2,7 @@ package com.yfd.platform.env.controller; import com.baomidou.mybatisplus.extension.plugins.pagination.Page; import com.yfd.platform.annotation.Log; +import com.yfd.platform.common.DataSourceRequest; import com.yfd.platform.config.ResponseResult; import com.yfd.platform.env.domain.SdHydrobase; import com.yfd.platform.env.service.ISdHydrobaseService; @@ -68,6 +69,12 @@ public class SdHydrobaseController { return ResponseResult.successData(hydrobaseService.selectForDropdown(basename)); } + @PostMapping("/wbsb/GetKendoList") + @Operation(summary = "水电基地列表") + public ResponseResult getWbsbKendoList(@RequestBody DataSourceRequest dataSourceRequest) { + return ResponseResult.successData(hydrobaseService.getWbsbKendoList(dataSourceRequest)); + } + // @Log(module = "基地管理", value = "新增基地") @PostMapping("/add") @Operation(summary = "新增基地") @@ -91,4 +98,4 @@ public class SdHydrobaseController { boolean result = hydrobaseService.deleteHydrobase(baseid); return result ? ResponseResult.success("删除成功") : ResponseResult.error("删除失败"); } -} \ No newline at end of file +} diff --git a/backend/src/main/java/com/yfd/platform/env/entity/vo/HydrobaseWbsVo.java b/backend/src/main/java/com/yfd/platform/env/entity/vo/HydrobaseWbsVo.java new file mode 100644 index 00000000..f08f9206 --- /dev/null +++ b/backend/src/main/java/com/yfd/platform/env/entity/vo/HydrobaseWbsVo.java @@ -0,0 +1,39 @@ +package com.yfd.platform.env.entity.vo; + +import io.swagger.v3.oas.annotations.media.Schema; +import lombok.Data; + +@Data +@Schema(description = "水电基地WBS列表") +public class HydrobaseWbsVo { + + @Schema(description = "WBS编码") + private String wbsCode; + + @Schema(description = "WBS名称") + private String wbsName; + + @Schema(description = "父级WBS编码") + private String pwbsCode; + + @Schema(description = "WBS类型") + private String wbsType; + + @Schema(description = "树级别") + private String treeLevel; + + @Schema(description = "树路径") + private String path; + + @Schema(description = "排序") + private Integer orderIndex; + + @Schema(description = "备注") + private String rmk; + + @Schema(description = "简介") + private String des; + + @Schema(description = "简称") + private String shortname; +} diff --git a/backend/src/main/java/com/yfd/platform/env/service/ISdHydrobaseService.java b/backend/src/main/java/com/yfd/platform/env/service/ISdHydrobaseService.java index 096bee53..9f16b1ab 100644 --- a/backend/src/main/java/com/yfd/platform/env/service/ISdHydrobaseService.java +++ b/backend/src/main/java/com/yfd/platform/env/service/ISdHydrobaseService.java @@ -1,8 +1,11 @@ package com.yfd.platform.env.service; import com.baomidou.mybatisplus.extension.plugins.pagination.Page; +import com.yfd.platform.common.DataSourceRequest; +import com.yfd.platform.common.DataSourceResult; import com.baomidou.mybatisplus.extension.service.IService; import com.yfd.platform.env.domain.SdHydrobase; +import com.yfd.platform.env.entity.vo.HydrobaseWbsVo; import java.util.List; import java.util.Set; @@ -34,6 +37,8 @@ public interface ISdHydrobaseService extends IService { */ List selectForDropdown(String basename); + DataSourceResult getWbsbKendoList(DataSourceRequest dataSourceRequest); + Set getUserAuthorizedStationCodes(); /** @@ -50,4 +55,4 @@ public interface ISdHydrobaseService extends IService { * 删除基地 */ boolean deleteHydrobase(String baseid); -} \ No newline at end of file +} diff --git a/backend/src/main/java/com/yfd/platform/env/service/impl/SdHydrobaseServiceImpl.java b/backend/src/main/java/com/yfd/platform/env/service/impl/SdHydrobaseServiceImpl.java index 1a0b4605..1cf1ec78 100644 --- a/backend/src/main/java/com/yfd/platform/env/service/impl/SdHydrobaseServiceImpl.java +++ b/backend/src/main/java/com/yfd/platform/env/service/impl/SdHydrobaseServiceImpl.java @@ -3,10 +3,13 @@ package com.yfd.platform.env.service.impl; import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; import com.baomidou.mybatisplus.extension.plugins.pagination.Page; import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; +import com.yfd.platform.common.DataSourceRequest; +import com.yfd.platform.common.DataSourceResult; import com.yfd.platform.data.domain.SysUserDataScope; import com.yfd.platform.data.mapper.SysUserDataScopeMapper; import com.yfd.platform.env.domain.SdEngInfoBH; import com.yfd.platform.env.domain.SdHydrobase; +import com.yfd.platform.env.entity.vo.HydrobaseWbsVo; import com.yfd.platform.env.mapper.SdEngInfoBHMapper; import com.yfd.platform.env.mapper.SdHydrobaseMapper; import com.yfd.platform.env.service.ISdHydrobaseService; @@ -16,8 +19,10 @@ import org.springframework.stereotype.Service; import org.springframework.util.StringUtils; import java.util.ArrayList; +import java.util.HashMap; import java.util.HashSet; import java.util.List; +import java.util.Map; import java.util.Set; import java.util.stream.Collectors; @@ -97,6 +102,64 @@ public class SdHydrobaseServiceImpl extends ServiceImpl getWbsbKendoList(DataSourceRequest dataSourceRequest) { + LambdaQueryWrapper wrapper = new LambdaQueryWrapper<>(); + List filters = new ArrayList<>(); + collectFilters(dataSourceRequest == null ? null : dataSourceRequest.getFilter(), filters); + + String wbsType = null; + String treeLevel = null; + for (DataSourceRequest.FilterDescriptor filter : filters) { + if (!"eq".equalsIgnoreCase(filter.getOperator()) || filter.getValue() == null) { + continue; + } + if ("wbsType".equals(filter.getField())) { + wbsType = String.valueOf(filter.getValue()); + } else if ("treeLevel".equals(filter.getField())) { + treeLevel = String.valueOf(filter.getValue()); + } + } + + DataSourceResult result = new DataSourceResult<>(); + result.setAggregates(new HashMap<>()); + + if (StringUtils.hasText(wbsType) && !"PSB".equalsIgnoreCase(wbsType)) { + result.setData(new ArrayList<>()); + result.setTotal(0L); + return result; + } + + if (StringUtils.hasText(treeLevel)) { + try { + wrapper.eq(SdHydrobase::getGrd, Integer.parseInt(treeLevel)); + } catch (NumberFormatException ignored) { + result.setData(new ArrayList<>()); + result.setTotal(0L); + return result; + } + } + + applySort(wrapper, dataSourceRequest == null ? null : dataSourceRequest.getSort()); + + List hydrobaseList; + if (dataSourceRequest != null && dataSourceRequest.getTake() > 0) { + Page page = new Page<>( + (long) (dataSourceRequest.getSkip() / dataSourceRequest.getTake() + 1), + dataSourceRequest.getTake() + ); + Page pageResult = this.page(page, wrapper); + hydrobaseList = pageResult.getRecords(); + result.setTotal(pageResult.getTotal()); + } else { + hydrobaseList = this.list(wrapper); + result.setTotal(hydrobaseList.size()); + } + + result.setData(hydrobaseList.stream().map(this::toHydrobaseWbsVo).collect(Collectors.toList())); + return result; + } + @Override public Set getUserAuthorizedStationCodes() { String userId = SecurityUtils.getUserId(); @@ -176,4 +239,72 @@ public class SdHydrobaseServiceImpl extends ServiceImpl filters) { + if (root == null) { + return; + } + if (StringUtils.hasText(root.getField())) { + filters.add(root); + return; + } + if (root.getFilters() == null || root.getFilters().isEmpty()) { + return; + } + for (DataSourceRequest.FilterDescriptor filter : root.getFilters()) { + collectFilters(filter, filters); + } + } + + private void applySort(LambdaQueryWrapper wrapper, List sortList) { + boolean hasSort = false; + if (sortList != null) { + for (DataSourceRequest.SortDescriptor sortDescriptor : sortList) { + if (sortDescriptor == null || !StringUtils.hasText(sortDescriptor.getField())) { + continue; + } + boolean asc = !"desc".equalsIgnoreCase(sortDescriptor.getDir()); + if ("orderIndex".equals(sortDescriptor.getField())) { + if (asc) { + wrapper.orderByAsc(SdHydrobase::getOrderIndex); + } else { + wrapper.orderByDesc(SdHydrobase::getOrderIndex); + } + hasSort = true; + } else if ("wbsCode".equals(sortDescriptor.getField())) { + if (asc) { + wrapper.orderByAsc(SdHydrobase::getBaseid); + } else { + wrapper.orderByDesc(SdHydrobase::getBaseid); + } + hasSort = true; + } else if ("wbsName".equals(sortDescriptor.getField())) { + if (asc) { + wrapper.orderByAsc(SdHydrobase::getBasename); + } else { + wrapper.orderByDesc(SdHydrobase::getBasename); + } + hasSort = true; + } + } + } + if (!hasSort) { + wrapper.orderByAsc(SdHydrobase::getOrderIndex); + } + } + + private HydrobaseWbsVo toHydrobaseWbsVo(SdHydrobase hydrobase) { + HydrobaseWbsVo vo = new HydrobaseWbsVo(); + vo.setWbsCode(hydrobase.getBaseid()); + vo.setWbsName(hydrobase.getBasename()); + vo.setPwbsCode(hydrobase.getPbaseid()); + vo.setWbsType("PSB"); + vo.setTreeLevel(hydrobase.getGrd() == null ? null : String.valueOf(hydrobase.getGrd())); + vo.setPath(hydrobase.getPath()); + vo.setOrderIndex(hydrobase.getOrderIndex()); + vo.setRmk(hydrobase.getRmk()); + vo.setDes(hydrobase.getDes()); + vo.setShortname(hydrobase.getShortname()); + return vo; + } +} From ce2b43d83c191a2932f5dc90cb2ac2a83fd34901 Mon Sep 17 00:00:00 2001 From: tangwei Date: Fri, 22 May 2026 10:07:01 +0800 Subject: [PATCH 04/41] =?UTF-8?q?feat:=20=E6=A0=B9=E6=8D=AE=E6=9D=A1?= =?UTF-8?q?=E4=BB=B6=E6=9F=A5=E8=AF=A2=E6=B0=B4=E8=B4=A8=E5=9F=BA=E7=A1=80?= =?UTF-8?q?=E7=AB=99=E7=82=B9=E6=95=B0=E6=8D=AE?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../wq/controller/EnvWqDataController.java | 6 + .../env/wq/entity/vo/WqVmsstbprptVo.java | 62 ++++++++++ .../env/wq/service/EnvWqDataService.java | 2 + .../wq/service/impl/EnvWqDataServiceImpl.java | 113 ++++++++++++++++++ 4 files changed, 183 insertions(+) create mode 100644 backend/src/main/java/com/yfd/platform/env/wq/entity/vo/WqVmsstbprptVo.java diff --git a/backend/src/main/java/com/yfd/platform/env/wq/controller/EnvWqDataController.java b/backend/src/main/java/com/yfd/platform/env/wq/controller/EnvWqDataController.java index aa8428b9..12e25f76 100644 --- a/backend/src/main/java/com/yfd/platform/env/wq/controller/EnvWqDataController.java +++ b/backend/src/main/java/com/yfd/platform/env/wq/controller/EnvWqDataController.java @@ -47,6 +47,12 @@ public class EnvWqDataController { return ResponseResult.successData(envWqDataService.getMsstbprptList(dataSourceRequest)); } + @PostMapping("/vmsstbprpt/GetKendoList") + @Operation(summary = "根据条件查询水质基础站点数据") + public ResponseResult getVmsstbprptList(@RequestBody DataSourceRequest dataSourceRequest) { + return ResponseResult.successData(envWqDataService.getVmsstbprptList(dataSourceRequest)); + } + @GetMapping("/msstbprpt/getStcdInfo") @Operation(summary = "根据站码查询单条水质基础数据") public ResponseResult getStcdInfo(@RequestParam String stcd) { diff --git a/backend/src/main/java/com/yfd/platform/env/wq/entity/vo/WqVmsstbprptVo.java b/backend/src/main/java/com/yfd/platform/env/wq/entity/vo/WqVmsstbprptVo.java new file mode 100644 index 00000000..ef6d4d1b --- /dev/null +++ b/backend/src/main/java/com/yfd/platform/env/wq/entity/vo/WqVmsstbprptVo.java @@ -0,0 +1,62 @@ +package com.yfd.platform.env.wq.entity.vo; + +import io.swagger.v3.oas.annotations.media.Schema; +import lombok.Data; + +import java.io.Serializable; +import java.util.Date; + +@Data +@Schema(description = "水质基础站点列表") +public class WqVmsstbprptVo implements Serializable { + + private static final long serialVersionUID = 1L; + + @Schema(description = "基地名称") + private String baseName; + + @Schema(description = "站名") + private String stnm; + + @Schema(description = "电站名称") + private String ennm; + + @Schema(description = "建成日期") + private Date jcdt; + + @Schema(description = "监测指标") + private String stindx; + + @Schema(description = "开展环保自动监测工作状态:1=正常 0=暂无数据") + private Integer coenvwState; + + @Schema(description = "站类") + private String sttpCode; + + @Schema(description = "站码") + private String stcd; + + @Schema(description = "所属电站编码") + private String rstcd; + + @Schema(description = "所属测站编码") + private String stCode; + + @Schema(description = "所属测站名称") + private String stName; + + @Schema(description = "开发方式") + private String dvtp; + + @Schema(description = "基地排序") + private Integer baseStepSort; + + @Schema(description = "基地流域编码") + private String hbrvcd; + + @Schema(description = "电站排序") + private Integer rstcdStepSort; + + @Schema(description = "站点排序") + private Integer siteStepSort; +} diff --git a/backend/src/main/java/com/yfd/platform/env/wq/service/EnvWqDataService.java b/backend/src/main/java/com/yfd/platform/env/wq/service/EnvWqDataService.java index 255fa4f9..8fd2445b 100644 --- a/backend/src/main/java/com/yfd/platform/env/wq/service/EnvWqDataService.java +++ b/backend/src/main/java/com/yfd/platform/env/wq/service/EnvWqDataService.java @@ -12,5 +12,7 @@ public interface EnvWqDataService { DataSourceResult getMsstbprptList(DataSourceRequest dataSourceRequest); + DataSourceResult getVmsstbprptList(DataSourceRequest dataSourceRequest); + WqBaseInfoVo getStcdInfo(String stcd); } diff --git a/backend/src/main/java/com/yfd/platform/env/wq/service/impl/EnvWqDataServiceImpl.java b/backend/src/main/java/com/yfd/platform/env/wq/service/impl/EnvWqDataServiceImpl.java index 92e94014..51dbdd91 100644 --- a/backend/src/main/java/com/yfd/platform/env/wq/service/impl/EnvWqDataServiceImpl.java +++ b/backend/src/main/java/com/yfd/platform/env/wq/service/impl/EnvWqDataServiceImpl.java @@ -1,12 +1,17 @@ package com.yfd.platform.env.wq.service.impl; import cn.hutool.core.util.StrUtil; +import com.baomidou.mybatisplus.extension.plugins.pagination.Page; +import com.yfd.platform.common.DataSourceLoadOptionsBase; import com.yfd.platform.common.DataSourceRequest; import com.yfd.platform.common.DataSourceResult; import com.yfd.platform.common.MicroservicDynamicSQLMapper; +import com.yfd.platform.common.PageInfo; import com.yfd.platform.common.exception.BizException; import com.yfd.platform.env.wq.entity.vo.WqBaseInfoVo; +import com.yfd.platform.env.wq.entity.vo.WqVmsstbprptVo; import com.yfd.platform.env.wq.service.EnvWqDataService; +import com.yfd.platform.utils.QgcQueryWrapperUtil; import jakarta.annotation.Resource; import org.springframework.stereotype.Service; @@ -36,6 +41,78 @@ public class EnvWqDataServiceImpl implements EnvWqDataService { return emptyResult(); } + @Override + public DataSourceResult getVmsstbprptList(DataSourceRequest dataSourceRequest) { + DataSourceLoadOptionsBase loadOptions = dataSourceRequest.toDevRequest(); + String mway = QgcQueryWrapperUtil.getFilterFieldValue(loadOptions, "mway"); + String sttpCode = QgcQueryWrapperUtil.getFilterFieldValue(loadOptions, "sttpCode"); + String dtinType = QgcQueryWrapperUtil.getFilterFieldValue(loadOptions, "dtinType"); + String rstcd = QgcQueryWrapperUtil.getFilterFieldValue(loadOptions, "rstcd"); + String stnm = QgcQueryWrapperUtil.getFilterFieldValue(loadOptions, "stnm"); + String coenvwState = QgcQueryWrapperUtil.getFilterFieldValue(loadOptions, "coenvwState"); + + StringBuilder sql = new StringBuilder(); + sql.append("SELECT ") + .append("hb.BASENAME AS baseName, ") + .append("wq.STNM AS stnm, ") + .append("eng.ENNM AS ennm, ") + .append("wq.JCDT AS jcdt, ") + .append("wq.STINDX AS stindx, ") + .append("CASE WHEN recent.STCD IS NOT NULL THEN 1 ELSE 0 END AS coenvwState, ") + .append("wq.STTP AS sttpCode, ") + .append("wq.STCD AS stcd, ") + .append("wq.RSTCD AS rstcd, ") + .append("NULL AS stCode, ") + .append("NULL AS stName, ") + .append("eng.DVTP AS dvtp, ") + .append("hb.ORDER_INDEX AS baseStepSort, ") + .append("eng.HBRVCD AS hbrvcd, ") + .append("eng.ORDER_INDEX AS rstcdStepSort, ") + .append("wq.ORDER_INDEX AS siteStepSort ") + .append("FROM SD_WQ_B_H wq ") + .append("LEFT JOIN SD_ENGINFO_B_H eng ON eng.STCD = wq.RSTCD ") + .append("LEFT JOIN SD_HYDROBASE hb ON hb.BASEID = eng.BASE_ID AND NVL(hb.IS_DELETED, 0) = 0 ") + .append("LEFT JOIN (SELECT DISTINCT STCD FROM SD_WQ_R WHERE NVL(IS_DELETED, 0) = 0 AND TM >= SYSDATE - 1) recent ON recent.STCD = wq.STCD ") + .append("WHERE NVL(wq.IS_DELETED, 0) = 0 "); + + Map paramMap = new HashMap<>(); + if (StrUtil.isNotBlank(mway)) { + paramMap.put("mway", mway); + sql.append("AND wq.MWAY = #{map.mway} "); + } + if (StrUtil.isNotBlank(sttpCode)) { + paramMap.put("sttpCode", sttpCode); + sql.append("AND wq.STTP = #{map.sttpCode} "); + } + if (StrUtil.isNotBlank(dtinType)) { + paramMap.put("dtinType", dtinType); + sql.append("AND wq.DTIN_TYPE = #{map.dtinType} "); + } + if (StrUtil.isNotBlank(rstcd)) { + paramMap.put("rstcd", rstcd); + sql.append("AND wq.RSTCD = #{map.rstcd} "); + } + if (StrUtil.isNotBlank(stnm)) { + paramMap.put("stnm", "%" + stnm + "%"); + sql.append("AND wq.STNM LIKE #{map.stnm} "); + } + if (StrUtil.isNotBlank(coenvwState)) { + paramMap.put("coenvwState", coenvwState); + sql.append("AND CASE WHEN recent.STCD IS NOT NULL THEN 1 ELSE 0 END = #{map.coenvwState} "); + } + + sql.append(buildVmsstbprptOrderBySql(dataSourceRequest.getSort())); + PageInfo pageInfo = QgcQueryWrapperUtil.getPageInfo(loadOptions); + Page page = pageInfo.getHasPageInfo() ? pageInfo.getPage() : null; + List list = microservicDynamicSQLMapper.pageAllListWithResultType(page, sql.toString(), paramMap, WqVmsstbprptVo.class); + + DataSourceResult result = new DataSourceResult<>(); + result.setData(list); + result.setTotal(page != null ? page.getTotal() : list.size()); + result.setAggregates(new HashMap<>()); + return result; + } + @Override public WqBaseInfoVo getStcdInfo(String stcd) { if (StrUtil.isBlank(stcd)) { @@ -117,4 +194,40 @@ public class EnvWqDataServiceImpl implements EnvWqDataService { result.setAggregates(new HashMap<>()); return result; } + + private String buildVmsstbprptOrderBySql(List sortList) { + if (sortList == null || sortList.isEmpty()) { + return " ORDER BY hb.ORDER_INDEX ASC, eng.HBRVCD ASC, eng.ORDER_INDEX ASC, wq.ORDER_INDEX ASC"; + } + StringBuilder sql = new StringBuilder(" ORDER BY "); + boolean appended = false; + for (DataSourceRequest.SortDescriptor sortDescriptor : sortList) { + if (sortDescriptor == null || StrUtil.isBlank(sortDescriptor.getField())) { + continue; + } + String column = switch (sortDescriptor.getField()) { + case "baseStepSort" -> "hb.ORDER_INDEX"; + case "hbrvcd" -> "eng.HBRVCD"; + case "rstcdStepSort" -> "eng.ORDER_INDEX"; + case "siteStepSort" -> "wq.ORDER_INDEX"; + case "stnm" -> "wq.STNM"; + case "ennm" -> "eng.ENNM"; + case "stcd" -> "wq.STCD"; + default -> null; + }; + if (column == null) { + continue; + } + if (appended) { + sql.append(", "); + } + sql.append(column).append(" ") + .append("desc".equalsIgnoreCase(sortDescriptor.getDir()) ? "DESC" : "ASC"); + appended = true; + } + if (!appended) { + return " ORDER BY hb.ORDER_INDEX ASC, eng.HBRVCD ASC, eng.ORDER_INDEX ASC, wq.ORDER_INDEX ASC"; + } + return sql.toString(); + } } From cf220b83263bd385306cf03620d6add54fce8327 Mon Sep 17 00:00:00 2001 From: tangwei Date: Mon, 25 May 2026 08:54:22 +0800 Subject: [PATCH 05/41] =?UTF-8?q?feat:=20=E4=BC=98=E5=8C=96=E9=80=BB?= =?UTF-8?q?=E8=BE=91?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../wq/controller/EnvWqDataController.java | 12 + .../wq/service/impl/EnvWqDataServiceImpl.java | 391 +++++++++++++++++- 2 files changed, 388 insertions(+), 15 deletions(-) diff --git a/backend/src/main/java/com/yfd/platform/env/wq/controller/EnvWqDataController.java b/backend/src/main/java/com/yfd/platform/env/wq/controller/EnvWqDataController.java index 12e25f76..ddff1bb4 100644 --- a/backend/src/main/java/com/yfd/platform/env/wq/controller/EnvWqDataController.java +++ b/backend/src/main/java/com/yfd/platform/env/wq/controller/EnvWqDataController.java @@ -29,6 +29,18 @@ public class EnvWqDataController { return ResponseResult.successData(envWqDataService.processKendoList(dataSourceRequest)); } + @PostMapping("/GetStbprpYsByStcd") + @Operation(summary = "水质统计分析") + public ResponseResult GetStbprpYsByStcd(@RequestBody DataSourceRequest dataSourceRequest) { + return ResponseResult.successData(null); + } + + @PostMapping("/GetStTbYsBVoKendoListCust") + @Operation(summary = "水质统计分析") + public ResponseResult GetStTbYsBVoKendoListCust(@RequestBody DataSourceRequest dataSourceRequest) { + return ResponseResult.successData(null); + } + @PostMapping("/data/noAuth/GetKendoListCust") @Operation(summary = "水质统计分析") public ResponseResult getNoAuthKendoListCust(@RequestBody DataSourceRequest dataSourceRequest) { diff --git a/backend/src/main/java/com/yfd/platform/env/wq/service/impl/EnvWqDataServiceImpl.java b/backend/src/main/java/com/yfd/platform/env/wq/service/impl/EnvWqDataServiceImpl.java index 51dbdd91..cce2aecb 100644 --- a/backend/src/main/java/com/yfd/platform/env/wq/service/impl/EnvWqDataServiceImpl.java +++ b/backend/src/main/java/com/yfd/platform/env/wq/service/impl/EnvWqDataServiceImpl.java @@ -1,21 +1,30 @@ package com.yfd.platform.env.wq.service.impl; +import cn.hutool.core.collection.CollUtil; import cn.hutool.core.util.StrUtil; import com.baomidou.mybatisplus.extension.plugins.pagination.Page; +import com.yfd.platform.common.CommonConstant; import com.yfd.platform.common.DataSourceLoadOptionsBase; import com.yfd.platform.common.DataSourceRequest; import com.yfd.platform.common.DataSourceResult; +import com.yfd.platform.common.GroupHelper; +import com.yfd.platform.common.GroupingInfo; import com.yfd.platform.common.MicroservicDynamicSQLMapper; import com.yfd.platform.common.PageInfo; import com.yfd.platform.common.exception.BizException; +import com.yfd.platform.env.wq.entity.vo.EnvWqVo; import com.yfd.platform.env.wq.entity.vo.WqBaseInfoVo; import com.yfd.platform.env.wq.entity.vo.WqVmsstbprptVo; import com.yfd.platform.env.wq.service.EnvWqDataService; +import com.yfd.platform.utils.KendoUtil; import com.yfd.platform.utils.QgcQueryWrapperUtil; +import com.yfd.platform.utils.RequestHolder; +import com.yfd.platform.utils.SecurityUtils; import jakarta.annotation.Resource; import org.springframework.stereotype.Service; import java.util.ArrayList; +import java.util.Arrays; import java.util.HashMap; import java.util.List; import java.util.Map; @@ -28,7 +37,50 @@ public class EnvWqDataServiceImpl implements EnvWqDataService { @Override public DataSourceResult processKendoList(DataSourceRequest dataSourceRequest) { - return emptyResult(); + boolean calculated = CommonConstant.CALCULATE_SUCCESS.equals( + RequestHolder.getHttpServletRequest().getParameter(CommonConstant.CALCULATE_FLAG) + ); + + StringBuilder sql = new StringBuilder(buildEnvWqProcessBaseSql(calculated)); + Map paramMap = new HashMap<>(); + if (calculated) { + paramMap.put("recordUser", SecurityUtils.getUserId()); + } + + String filterSql = buildEnvWqFilterCondition(dataSourceRequest == null ? null : dataSourceRequest.getFilter(), + paramMap, new int[]{0}); + if (StrUtil.isNotBlank(filterSql)) { + sql.append(" AND ").append(filterSql).append(" "); + } + + DataSourceLoadOptionsBase loadOptions = dataSourceRequest.toDevRequest(); + String groupBy = KendoUtil.getGroupBy(dataSourceRequest); + GroupingInfo[] groupInfos = loadOptions.getGroup(); + if (StrUtil.isNotBlank(groupBy) && groupInfos != null && groupInfos.length > 0) { + String groupedSql = buildEnvWqGroupSql(sql.toString(), dataSourceRequest, groupInfos); + List> list = microservicDynamicSQLMapper.pageAllList(null, groupedSql, paramMap); + DataSourceResult result = new DataSourceResult(); + if (Boolean.TRUE.equals(dataSourceRequest.getGroupResultFlat())) { + result.setData(new GroupHelper().faltGroup(list, Arrays.asList(groupInfos))); + } else { + result.setData(new GroupHelper().group(list, Arrays.asList(groupInfos))); + } + result.setTotal(0L); + result.setAggregates(new HashMap<>()); + return result; + } + + sql.append(buildEnvWqOrderBySql(dataSourceRequest.getSort())); + PageInfo pageInfo = QgcQueryWrapperUtil.getPageInfo(loadOptions); + Page page = pageInfo.getHasPageInfo() ? pageInfo.getPage() : null; + List list = microservicDynamicSQLMapper.pageAllListWithResultType(page, sql.toString(), paramMap, EnvWqVo.class); + fillEnvWqDerivedFields(list, calculated); + + DataSourceResult result = new DataSourceResult<>(); + result.setData(list); + result.setTotal(page != null ? page.getTotal() : list.size()); + result.setAggregates(new HashMap<>()); + return result; } @Override @@ -101,7 +153,7 @@ public class EnvWqDataServiceImpl implements EnvWqDataService { sql.append("AND CASE WHEN recent.STCD IS NOT NULL THEN 1 ELSE 0 END = #{map.coenvwState} "); } - sql.append(buildVmsstbprptOrderBySql(dataSourceRequest.getSort())); +// sql.append(buildEnvWqOrderBySql(dataSourceRequest.getSort())); PageInfo pageInfo = QgcQueryWrapperUtil.getPageInfo(loadOptions); Page page = pageInfo.getHasPageInfo() ? pageInfo.getPage() : null; List list = microservicDynamicSQLMapper.pageAllListWithResultType(page, sql.toString(), paramMap, WqVmsstbprptVo.class); @@ -187,6 +239,298 @@ public class EnvWqDataServiceImpl implements EnvWqDataService { return list.get(0); } + private String buildEnvWqProcessBaseSql(boolean calculated) { + StringBuilder sql = new StringBuilder(); + sql.append("SELECT ") + .append("T.STCD AS stcd, ") + .append("T.STNM AS stnm, ") + .append("T.RSTCD AS rstcd, ") + .append("T.ENNM AS ennm, ") + .append("T.DTINTYPE AS dtinType, ") + .append("T.BASE_ID AS baseId, ") + .append("T.BASE_NAME AS baseName, ") + .append("T.RVCD_NAME AS rvcdName, ") + .append("T.ADDVCD_NAME AS addvcdName, ") + .append("T.HBRVCD AS hbrvcd, ") + .append("T.HBRVCD_NAME AS hbrvcdName, ") + .append("T.WWQTG AS wwqtg, ") + .append("T.RSTCDSTEPSORT AS rstcdStepSort, ") + .append("T.BASESTEPSORT AS baseStepSort, ") + .append("T.RVCDSTEPSORT AS rvcdStepSort, ") + .append("T.SITESTEPSORT AS siteStepSort, ") + .append("T.ID AS id, ") + .append("T.TM AS tm, ") + .append("T.TYPE AS type, ") + .append("T.STTYPE AS sttype, ") + .append("T.SFDB AS sfdb, ") + .append("T.DR_MONTH AS drMonth, ") + .append("T.DR_YEAR AS drYear, ") + .append("T.WQ_SFDB_HY AS wqSfdbHy, ") + .append("T.WQ_SFDB_COUNT AS wqSfdbCount, ") + .append("T.WQ_SFDB_HO AS wqSfdbHo, ") + .append("T.WQ_RATE AS wqRate, ") + .append("T.WQ_SFDB_HN AS wqSfdbHn, ") + .append("T.WQGRD AS wqGrd, ") + .append("T.BEFOREWQGRD AS beforeWqGrd ") + .append("FROM (SELECT ") + .append("MSB.STCD, MSB.STNM, MSB.RSTCD, MSB.ENNM, MSB.DTIN_TYPE AS dtinType, ") + .append("MSB.BASE_ID, MSB.BASE_NAME, MSB.RVCD_NAME, MSB.ADDVCD_NAME, MSB.HBRVCD, MSB.HBRVCD_NAME, ") + .append("MSB.WWQTG, MSB.RSTCDSTEPSORT, MSB.BASESTEPSORT, MSB.RVCDSTEPSORT, MSB.SITESTEPSORT, ") + .append("MWT.ID, MWT.TM, MWT.TYPE, TO_CHAR(MWT.STTYPE) AS STTYPE, MWT.SFDB, MWT.DR_MONTH, MWT.DR_YEAR, ") + .append("MWT.WQ_SFDB_HY, MWT.WQ_SFDB_COUNT, MWT.WQ_SFDB_HO, MWT.WQ_RATE, MWT.WQ_SFDB_HN, "); + if (calculated) { + sql.append("CAST(NULL AS VARCHAR2(16)) AS WQGRD, CAST(NULL AS VARCHAR2(16)) AS BEFOREWQGRD "); + } else { + sql.append("WQD.WQGRD AS WQGRD, WQD2.WQGRD AS BEFOREWQGRD "); + } + sql.append("FROM (").append(buildStationBaseSql()).append(") MSB "); + if (calculated) { + sql.append("INNER JOIN MS_WQCALCULATION_T MWT ON MWT.STCD = MSB.STCD ") + .append("WHERE MWT.RECORD_USER = #{map.recordUser} "); + } else { + sql.append("INNER JOIN MS_WQ_T MWT ON MWT.STCD = MSB.STCD ") + .append("LEFT JOIN SD_WQDAY_S WQD ON WQD.DT = MWT.TM AND MSB.STCD = WQD.STCD AND NVL(WQD.IS_DELETED, 0) = 0 ") + .append("LEFT JOIN SD_WQDAY_S WQD2 ON ADD_MONTHS(WQD2.DT, 12) = WQD.DT AND WQD2.STCD = WQD.STCD AND NVL(WQD2.IS_DELETED, 0) = 0 "); + } + sql.append(") T WHERE 1 = 1 "); + return sql.toString(); + } + + private String buildStationBaseSql() { + return "SELECT " + + "wq.STCD, " + + "wq.STNM, " + + "wq.RSTCD, " + + "eng.ENNM, " + + "eng.BASE_ID, " + + "hb.BASENAME AS BASE_NAME, " + + "eng.HBRVCD, " + + "hbrv.HBRVNM AS HBRVCD_NAME, " + + "rv.RVNM AS RVCD_NAME, " + + "addv.ADDVNM AS ADDVCD_NAME, " + + "wq.WWQTG, " + + "wq.DTIN_TYPE, " + + "rstAlong.SORT AS RSTCDSTEPSORT, " + + "hb.ORDER_INDEX AS BASESTEPSORT, " + + "rvAlong.ORDER_INDEX AS RVCDSTEPSORT, " + + "siteAlong.SORT AS SITESTEPSORT " + + "FROM SD_WQ_B_H wq " + + "LEFT JOIN SD_ENGINFO_B_H eng ON eng.STCD = wq.RSTCD " + + "LEFT JOIN SD_HYDROBASE hb ON hb.BASEID = eng.BASE_ID AND NVL(hb.IS_DELETED, 0) = 0 " + + "LEFT JOIN SD_HBRV_DIC hbrv ON hbrv.HBRVCD = eng.HBRVCD AND hbrv.BASEID = eng.BASE_ID AND NVL(hbrv.IS_DELETED, 0) = 0 AND NVL(hbrv.ENABLED, 1) = 1 " + + "LEFT JOIN SD_RVCD_DIC rv ON rv.RVCD = eng.RVCD " + + "LEFT JOIN SD_ADDVCD_DIC addv ON addv.ADDVCD = eng.ADDVCD " + + "LEFT JOIN MS_ALONG_B rvAlong ON rvAlong.RVCD = eng.HBRVCD AND rvAlong.CODE = 'common' AND NVL(rvAlong.IS_DELETED, 0) = 0 " + + "LEFT JOIN (SELECT det.SORT, along.RVCD, det.STCD " + + " FROM MS_ALONGDET_B det " + + " INNER JOIN MS_ALONG_B along ON det.ALONG_ID = along.ID " + + " WHERE NVL(det.IS_DELETED, 0) = 0 AND NVL(along.IS_DELETED, 0) = 0 AND along.CODE = 'common') rstAlong " + + " ON rstAlong.RVCD = eng.HBRVCD AND rstAlong.STCD = wq.RSTCD " + + "LEFT JOIN (SELECT det.SORT, along.RVCD, det.STCD " + + " FROM MS_ALONGDET_B det " + + " INNER JOIN MS_ALONG_B along ON det.ALONG_ID = along.ID " + + " WHERE NVL(det.IS_DELETED, 0) = 0 AND NVL(along.IS_DELETED, 0) = 0 AND along.CODE = 'common') siteAlong " + + " ON siteAlong.RVCD = eng.HBRVCD AND siteAlong.STCD = wq.STCD " + + "WHERE wq.STTP = 'WQ' AND NVL(wq.IS_DELETED, 0) = 0"; + } + + private String buildEnvWqFilterCondition(DataSourceRequest.FilterDescriptor filter, + Map paramMap, + int[] indexHolder) { + if (filter == null) { + return ""; + } + if (StrUtil.isNotBlank(filter.getField())) { + return buildEnvWqLeafCondition(filter, paramMap, indexHolder); + } + if (CollUtil.isEmpty(filter.getFilters())) { + return ""; + } + List conditions = new ArrayList<>(); + for (DataSourceRequest.FilterDescriptor child : filter.getFilters()) { + String childSql = buildEnvWqFilterCondition(child, paramMap, indexHolder); + if (StrUtil.isNotBlank(childSql)) { + conditions.add(childSql); + } + } + if (conditions.isEmpty()) { + return ""; + } + String logic = "or".equalsIgnoreCase(filter.getLogic()) ? " OR " : " AND "; + return "(" + String.join(logic, conditions) + ")"; + } + + private String buildEnvWqLeafCondition(DataSourceRequest.FilterDescriptor filter, + Map paramMap, + int[] indexHolder) { + String column = mapEnvWqColumn(filter.getField()); + if (StrUtil.isBlank(column) || filter.getValue() == null) { + return ""; + } + String operator = StrUtil.blankToDefault(filter.getOperator(), "eq").toLowerCase(); + String key = "envWqParam" + indexHolder[0]++; + boolean isDateField = "tm".equals(filter.getField()); + switch (operator) { + case "eq": + paramMap.put(key, filter.getValue()); + return isDateField + ? column + " = TO_DATE(#{map." + key + "}, 'YYYY-MM-DD HH24:MI:SS')" + : column + " = #{map." + key + "}"; + case "neq": + paramMap.put(key, filter.getValue()); + return isDateField + ? column + " <> TO_DATE(#{map." + key + "}, 'YYYY-MM-DD HH24:MI:SS')" + : column + " <> #{map." + key + "}"; + case "gt": + paramMap.put(key, filter.getValue()); + return isDateField + ? column + " > TO_DATE(#{map." + key + "}, 'YYYY-MM-DD HH24:MI:SS')" + : column + " > #{map." + key + "}"; + case "gte": + paramMap.put(key, filter.getValue()); + return isDateField + ? column + " >= TO_DATE(#{map." + key + "}, 'YYYY-MM-DD HH24:MI:SS')" + : column + " >= #{map." + key + "}"; + case "lt": + paramMap.put(key, filter.getValue()); + return isDateField + ? column + " < TO_DATE(#{map." + key + "}, 'YYYY-MM-DD HH24:MI:SS')" + : column + " < #{map." + key + "}"; + case "lte": + paramMap.put(key, filter.getValue()); + return isDateField + ? column + " <= TO_DATE(#{map." + key + "}, 'YYYY-MM-DD HH24:MI:SS')" + : column + " <= #{map." + key + "}"; + case "contains": + paramMap.put(key, "%" + filter.getValue() + "%"); + return column + " LIKE #{map." + key + "}"; + default: + return ""; + } + } + + private String mapEnvWqColumn(String field) { + if (StrUtil.isBlank(field)) { + return null; + } + return switch (field) { + case "stcd" -> "T.STCD"; + case "stnm" -> "T.STNM"; + case "rstcd" -> "T.RSTCD"; + case "ennm" -> "T.ENNM"; + case "baseId" -> "T.BASE_ID"; + case "baseName" -> "T.BASE_NAME"; + case "rvcdName" -> "T.RVCD_NAME"; + case "addvcdName" -> "T.ADDVCD_NAME"; + case "hbrvcd" -> "T.HBRVCD"; + case "hbrvcdName" -> "T.HBRVCD_NAME"; + case "wwqtg" -> "T.WWQTG"; + case "id" -> "T.ID"; + case "tm" -> "T.TM"; + case "type" -> "T.TYPE"; + case "sttype" -> "T.STTYPE"; + case "sfdb" -> "T.SFDB"; + case "rstcdStepSort" -> "T.RSTCDSTEPSORT"; + case "baseStepSort" -> "T.BASESTEPSORT"; + case "rvcdStepSort" -> "T.RVCDSTEPSORT"; + case "siteStepSort" -> "T.SITESTEPSORT"; + case "drMonth" -> "T.DR_MONTH"; + case "drYear" -> "T.DR_YEAR"; + case "wqSfdbHy" -> "T.WQ_SFDB_HY"; + case "wqSfdbHn" -> "T.WQ_SFDB_HN"; + case "wqSfdbCount" -> "T.WQ_SFDB_COUNT"; + case "wqSfdbHo" -> "T.WQ_SFDB_HO"; + case "wqRate" -> "T.WQ_RATE"; + default -> null; + }; + } + + private String buildEnvWqGroupSql(String baseSql, + DataSourceRequest dataSourceRequest, + GroupingInfo[] groupInfos) { + List groupFields = new ArrayList<>(); + for (GroupingInfo item : groupInfos) { + if (item != null && StrUtil.isNotBlank(item.getSelector())) { + groupFields.add(item.getSelector()); + } + } + StringBuilder sql = new StringBuilder("SELECT "); + sql.append(String.join(", ", groupFields)); + + List aggregates = dataSourceRequest.getAggregate(); + boolean hasWqRateAggregate = CollUtil.isNotEmpty(aggregates) + && aggregates.stream().anyMatch(i -> "wqRate".equals(i.getField())); + if (hasWqRateAggregate && groupInfos.length > 0) { + sql.append(", CASE ") + .append("WHEN SUM(wqSfdbCount) = 0 THEN NULL ") + .append("WHEN SUM(wqSfdbCount) = SUM(wqSfdbHo) THEN NULL ") + .append("WHEN (SUM(wqSfdbHy) + SUM(wqSfdbHn)) = 0 THEN NULL ") + .append("ELSE (SUM(wqSfdbHy) / (SUM(wqSfdbHy) + SUM(wqSfdbHn))) * 100 END AS count_") + .append(groupInfos[groupInfos.length - 1].getSelector()).append(" "); + } else { + for (GroupingInfo item : groupInfos) { + sql.append(", COUNT(*) AS count_").append(item.getSelector()).append(" "); + } + } + sql.append("FROM (").append(baseSql).append(") T "); + String groupBy = KendoUtil.getGroupBy(dataSourceRequest); + if (StrUtil.isNotBlank(groupBy)) { + sql.append(groupBy); + } + return sql.toString(); + } + + private void fillEnvWqDerivedFields(List list, boolean calculated) { + for (EnvWqVo item : list) { + item.setCalculateFlag(calculated ? CommonConstant.CALCULATE_SUCCESS : "0"); + item.setWqGrdName(getWqLevelName(item.getWqGrd())); + item.setBeforeWqGrdName(getWqLevelName(item.getBeforeWqGrd())); + item.setWwqtgName(getWqLevelName(item.getWwqtg())); + item.setSttypeName(getSttypeName(item.getSttype())); + item.setSfdbName(getSfdbName(item.getSfdb())); + } + } + + private String getWqLevelName(String level) { + if (StrUtil.isBlank(level)) { + return null; + } + return switch (level) { + case "1" -> "I类"; + case "2" -> "II类"; + case "3" -> "III类"; + case "4" -> "IV类"; + case "5" -> "V类"; + case "6" -> "劣V类"; + case "0" -> "无数据"; + default -> null; + }; + } + + private String getSttypeName(String sttype) { + if (StrUtil.isBlank(sttype)) { + return null; + } + return switch (sttype) { + case "0" -> "自建站"; + case "1" -> "国家站"; + case "2" -> "人工站"; + default -> null; + }; + } + + private String getSfdbName(Integer sfdb) { + if (sfdb == null) { + return null; + } + return switch (sfdb) { + case 0 -> "不达标"; + case 1 -> "达标"; + case 2 -> "无数据"; + default -> null; + }; + } + private DataSourceResult emptyResult() { DataSourceResult result = new DataSourceResult(); result.setData(new ArrayList<>()); @@ -195,9 +539,9 @@ public class EnvWqDataServiceImpl implements EnvWqDataService { return result; } - private String buildVmsstbprptOrderBySql(List sortList) { + private String buildEnvWqOrderBySql(List sortList) { if (sortList == null || sortList.isEmpty()) { - return " ORDER BY hb.ORDER_INDEX ASC, eng.HBRVCD ASC, eng.ORDER_INDEX ASC, wq.ORDER_INDEX ASC"; + return ""; } StringBuilder sql = new StringBuilder(" ORDER BY "); boolean appended = false; @@ -206,13 +550,33 @@ public class EnvWqDataServiceImpl implements EnvWqDataService { continue; } String column = switch (sortDescriptor.getField()) { - case "baseStepSort" -> "hb.ORDER_INDEX"; - case "hbrvcd" -> "eng.HBRVCD"; - case "rstcdStepSort" -> "eng.ORDER_INDEX"; - case "siteStepSort" -> "wq.ORDER_INDEX"; - case "stnm" -> "wq.STNM"; - case "ennm" -> "eng.ENNM"; - case "stcd" -> "wq.STCD"; + case "stcd" -> "T.STCD"; + case "stnm" -> "T.STNM"; + case "rstcd" -> "T.RSTCD"; + case "ennm" -> "T.ENNM"; + case "baseId" -> "T.BASE_ID"; + case "baseName" -> "T.BASE_NAME"; + case "rvcdName" -> "T.RVCD_NAME"; + case "addvcdName" -> "T.ADDVCD_NAME"; + case "hbrvcd" -> "T.HBRVCD"; + case "hbrvcdName" -> "T.HBRVCD_NAME"; + case "wwqtg" -> "T.WWQTG"; + case "id" -> "T.ID"; + case "tm" -> "T.TM"; + case "type" -> "T.TYPE"; + case "sttype" -> "T.STTYPE"; + case "sfdb" -> "T.SFDB"; + case "rstcdStepSort" -> "T.RSTCDSTEPSORT"; + case "baseStepSort" -> "T.BASESTEPSORT"; + case "rvcdStepSort" -> "T.RVCDSTEPSORT"; + case "siteStepSort" -> "T.SITESTEPSORT"; + case "drMonth" -> "T.DR_MONTH"; + case "drYear" -> "T.DR_YEAR"; + case "wqSfdbHy" -> "T.WQ_SFDB_HY"; + case "wqSfdbHn" -> "T.WQ_SFDB_HN"; + case "wqSfdbCount" -> "T.WQ_SFDB_COUNT"; + case "wqSfdbHo" -> "T.WQ_SFDB_HO"; + case "wqRate" -> "T.WQ_RATE"; default -> null; }; if (column == null) { @@ -225,9 +589,6 @@ public class EnvWqDataServiceImpl implements EnvWqDataService { .append("desc".equalsIgnoreCase(sortDescriptor.getDir()) ? "DESC" : "ASC"); appended = true; } - if (!appended) { - return " ORDER BY hb.ORDER_INDEX ASC, eng.HBRVCD ASC, eng.ORDER_INDEX ASC, wq.ORDER_INDEX ASC"; - } - return sql.toString(); + return appended ? sql.toString() : ""; } } From 66a810ca3625fea2c133394991254695d2cd5be6 Mon Sep 17 00:00:00 2001 From: tangwei Date: Mon, 25 May 2026 10:17:01 +0800 Subject: [PATCH 06/41] =?UTF-8?q?fix:=20=E5=A2=9E=E5=8A=A0=E6=B0=B4?= =?UTF-8?q?=E8=B4=A8=E6=98=8E=E7=BB=86=E6=95=B0=E6=8D=AE=E6=9F=A5=E8=AF=A2?= =?UTF-8?q?=E6=8E=A5=E5=8F=A3?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../wq/controller/EnvWqDataController.java | 6 + .../wq/service/impl/EnvWqDataServiceImpl.java | 489 +++++++++++++++++- 2 files changed, 483 insertions(+), 12 deletions(-) diff --git a/backend/src/main/java/com/yfd/platform/env/wq/controller/EnvWqDataController.java b/backend/src/main/java/com/yfd/platform/env/wq/controller/EnvWqDataController.java index ddff1bb4..be6c3304 100644 --- a/backend/src/main/java/com/yfd/platform/env/wq/controller/EnvWqDataController.java +++ b/backend/src/main/java/com/yfd/platform/env/wq/controller/EnvWqDataController.java @@ -29,6 +29,12 @@ public class EnvWqDataController { return ResponseResult.successData(envWqDataService.processKendoList(dataSourceRequest)); } + @PostMapping("/data/GetKendoListCust") + @Operation(summary = "水质明细数据查询") + public ResponseResult getDataKendoListCust(@RequestBody DataSourceRequest dataSourceRequest) { + return ResponseResult.successData(envWqDataService.processKendoList(dataSourceRequest)); + } + @PostMapping("/GetStbprpYsByStcd") @Operation(summary = "水质统计分析") public ResponseResult GetStbprpYsByStcd(@RequestBody DataSourceRequest dataSourceRequest) { diff --git a/backend/src/main/java/com/yfd/platform/env/wq/service/impl/EnvWqDataServiceImpl.java b/backend/src/main/java/com/yfd/platform/env/wq/service/impl/EnvWqDataServiceImpl.java index cce2aecb..96932db2 100644 --- a/backend/src/main/java/com/yfd/platform/env/wq/service/impl/EnvWqDataServiceImpl.java +++ b/backend/src/main/java/com/yfd/platform/env/wq/service/impl/EnvWqDataServiceImpl.java @@ -12,6 +12,7 @@ import com.yfd.platform.common.GroupingInfo; import com.yfd.platform.common.MicroservicDynamicSQLMapper; import com.yfd.platform.common.PageInfo; import com.yfd.platform.common.exception.BizException; +import com.yfd.platform.env.wq.entity.vo.EnvWqDataVo; import com.yfd.platform.env.wq.entity.vo.EnvWqVo; import com.yfd.platform.env.wq.entity.vo.WqBaseInfoVo; import com.yfd.platform.env.wq.entity.vo.WqVmsstbprptVo; @@ -25,9 +26,14 @@ import org.springframework.stereotype.Service; import java.util.ArrayList; import java.util.Arrays; +import java.util.Comparator; import java.util.HashMap; +import java.util.LinkedHashMap; import java.util.List; import java.util.Map; +import java.math.BigDecimal; +import java.util.Set; +import java.util.stream.Collectors; @Service public class EnvWqDataServiceImpl implements EnvWqDataService { @@ -41,14 +47,13 @@ public class EnvWqDataServiceImpl implements EnvWqDataService { RequestHolder.getHttpServletRequest().getParameter(CommonConstant.CALCULATE_FLAG) ); - StringBuilder sql = new StringBuilder(buildEnvWqProcessBaseSql(calculated)); + StringBuilder sql = new StringBuilder(buildEnvWqDataBaseSql(calculated)); Map paramMap = new HashMap<>(); - if (calculated) { - paramMap.put("recordUser", SecurityUtils.getUserId()); - } - - String filterSql = buildEnvWqFilterCondition(dataSourceRequest == null ? null : dataSourceRequest.getFilter(), - paramMap, new int[]{0}); + String filterSql = buildEnvWqDataFilterCondition( + dataSourceRequest == null ? null : dataSourceRequest.getFilter(), + paramMap, + new int[]{0} + ); if (StrUtil.isNotBlank(filterSql)) { sql.append(" AND ").append(filterSql).append(" "); } @@ -57,7 +62,7 @@ public class EnvWqDataServiceImpl implements EnvWqDataService { String groupBy = KendoUtil.getGroupBy(dataSourceRequest); GroupingInfo[] groupInfos = loadOptions.getGroup(); if (StrUtil.isNotBlank(groupBy) && groupInfos != null && groupInfos.length > 0) { - String groupedSql = buildEnvWqGroupSql(sql.toString(), dataSourceRequest, groupInfos); + String groupedSql = buildEnvWqDataGroupSql(sql.toString(), groupBy, groupInfos); List> list = microservicDynamicSQLMapper.pageAllList(null, groupedSql, paramMap); DataSourceResult result = new DataSourceResult(); if (Boolean.TRUE.equals(dataSourceRequest.getGroupResultFlat())) { @@ -70,13 +75,14 @@ public class EnvWqDataServiceImpl implements EnvWqDataService { return result; } - sql.append(buildEnvWqOrderBySql(dataSourceRequest.getSort())); + sql.append(buildEnvWqDataOrderBySql(dataSourceRequest.getSort())); PageInfo pageInfo = QgcQueryWrapperUtil.getPageInfo(loadOptions); Page page = pageInfo.getHasPageInfo() ? pageInfo.getPage() : null; - List list = microservicDynamicSQLMapper.pageAllListWithResultType(page, sql.toString(), paramMap, EnvWqVo.class); - fillEnvWqDerivedFields(list, calculated); + List list = microservicDynamicSQLMapper.pageAllListWithResultType(page, sql.toString(), paramMap, EnvWqDataVo.class); + fillEnvWqDataDerivedFields(list); + fillEnvWqDataLimit(list); - DataSourceResult result = new DataSourceResult<>(); + DataSourceResult result = new DataSourceResult<>(); result.setData(list); result.setTotal(page != null ? page.getTotal() : list.size()); result.setAggregates(new HashMap<>()); @@ -239,6 +245,465 @@ public class EnvWqDataServiceImpl implements EnvWqDataService { return list.get(0); } + private String buildEnvWqDataBaseSql(boolean calculated) { + StringBuilder sql = new StringBuilder(); + sql.append("SELECT ") + .append("T.STCD AS stcd, ") + .append("T.RSTCD AS rstcd, ") + .append("T.STNM AS stnm, ") + .append("T.ST_CODE AS stCode, ") + .append("T.ST_NAME AS stName, ") + .append("T.ENNM AS ennm, ") + .append("T.TM AS tm, ") + .append("T.WTMP AS wtmp, ") + .append("T.PH AS ph, ") + .append("T.DOX AS dox, ") + .append("T.CODMN AS codmn, ") + .append("T.CODCR AS codcr, ") + .append("T.BOD5 AS bod5, ") + .append("T.NH3N AS nh3n, ") + .append("T.TP AS tp, ") + .append("T.TN AS tn, ") + .append("T.CU AS cu, ") + .append("T.ZN AS zn, ") + .append("T.F AS f, ") + .append("T.SE AS se, ") + .append("T.ARS AS ars, ") + .append("T.HG AS hg, ") + .append("T.CD AS cd, ") + .append("T.CR6 AS cr6, ") + .append("T.PB AS pb, ") + .append("T.CN AS cn, ") + .append("T.VLPH AS vlph, ") + .append("T.OIL AS oil, ") + .append("T.LAS AS las, ") + .append("T.S2 AS s2, ") + .append("T.FCG AS fcg, ") + .append("T.CL AS cl, ") + .append("T.SO4 AS so4, ") + .append("T.NO3 AS no3, ") + .append("T.THRD AS thrd, ") + .append("T.COND AS cond, ") + .append("T.FE AS fe, ") + .append("T.MN AS mn, ") + .append("T.AL AS al, ") + .append("T.CHLA AS chla, ") + .append("T.CLARITY AS clarity, ") + .append("T.TU AS tu, ") + .append("T.TOD AS tod, ") + .append("T.CYANO AS cyano, ") + .append("T.WQGRD AS wqgrd, ") + .append("T.WWQTG AS wwqtg, ") + .append("T.SFDB AS sfdb, ") + .append("T.WQ_SFDBHN_YS AS wqSfdbhnYs, ") + .append("T.BASE_ID AS baseId, ") + .append("T.BASE_NAME AS baseName, ") + .append("T.RVCD_NAME AS rvcdName, ") + .append("T.ADDVCD_NAME AS addvcdName, ") + .append("T.DTIN_TYPE AS dtinType, ") + .append("T.QI AS qi, ") + .append("T.QO AS qo, ") + .append("T.BASESTEPSORT AS baseStepSort, ") + .append("T.RVCDSTEPSORT AS rvcdStepSort, ") + .append("T.RSTCDSTEPSORT AS rstcdStepSort, ") + .append("T.SITESTEPSORT AS siteStepSort ") + .append("FROM (SELECT ") + .append("SWR.STCD, ") + .append("MSB.RSTCD, ") + .append("MSB.STNM, ") + .append("MSB.ST_CODE, ") + .append("MSB.ST_NAME, ") + .append("MSB.ENNM, ") + .append("SWR.TM, ") + .append("SWR.WTMP, SWR.PH, SWR.DOX, SWR.CODMN, SWR.CODCR, SWR.BOD5, ") + .append("SWR.NH3N, SWR.TP, SWR.TN, SWR.CU, SWR.ZN, SWR.F, SWR.SE, SWR.ARS, SWR.HG, SWR.CD, SWR.CR6, ") + .append("SWR.PB, SWR.CN, SWR.VLPH, SWR.OIL, SWR.LAS, SWR.S2, SWR.FCG, SWR.CL, SWR.SO4, SWR.NO3, SWR.THRD, ") + .append("SWR.COND, SWR.FE, SWR.MN, SWR.AL, SWR.CHLA, SWR.CLARITY, SWR.TU, SWR.TOD, SWR.CYANO, ") + .append("SWR.WQGRD, MSB.WWQTG, SWR.SFDB, SWR.WQ_SFDBHN_YS, ") + .append("MSB.BASE_ID, MSB.BASE_NAME, MSB.RVCD_NAME, MSB.ADDVCD_NAME, MSB.DTIN_TYPE, ") + .append("MSB.BASESTEPSORT, MSB.RVCDSTEPSORT, MSB.RSTCDSTEPSORT, MSB.SITESTEPSORT, ") + .append("MSB.TTPWR, MSB.STTP_CODE, "); + if (calculated) { + sql.append("CAST(NULL AS NUMBER(15,3)) AS QI, CAST(NULL AS NUMBER(15,3)) AS QO "); + } else { + sql.append("SHR.QI AS QI, SHR.QO AS QO "); + } + sql.append("FROM "); + if (calculated) { + sql.append("MS_WQCALCULATION_R SWR "); + } else { + sql.append("SD_WQ_R SWR "); + } + sql.append("INNER JOIN (").append(buildEnvWqDataStationBaseSql()).append(") MSB ON MSB.STCD = SWR.STCD "); + if (!calculated) { + sql.append("LEFT JOIN SD_HYDROPW_R SHR ON MSB.RSTCD = SHR.STCD AND SWR.TM = SHR.TM AND MSB.DTIN_TYPE = 0 ") + .append("WHERE SWR.TM <= SYSDATE ") + .append("AND (SWR.TASK_ID IS NULL OR SWR.TASK_ID = '' OR SWR.TASK_STATUS = 'Approved') "); + } else { + sql.append("WHERE 1 = 1 "); + } + sql.append(") T WHERE 1 = 1 "); + return sql.toString(); + } + + private String buildEnvWqDataStationBaseSql() { + return "SELECT " + + "wq.STCD, " + + "wq.RSTCD, " + + "wq.STNM, " + + "wq.FHSTCD AS ST_CODE, " + + "CAST(NULL AS VARCHAR2(200)) AS ST_NAME, " + + "eng.ENNM, " + + "eng.BASE_ID, " + + "hb.BASENAME AS BASE_NAME, " + + "rv.RVNM AS RVCD_NAME, " + + "addv.ADDVNM AS ADDVCD_NAME, " + + "wq.WWQTG, " + + "wq.DTIN_TYPE, " + + "siteAlong.SORT AS SITESTEPSORT, " + + "hb.ORDER_INDEX AS BASESTEPSORT, " + + "eng.TTPWR AS TTPWR, " + + "rstAlong.SORT AS RSTCDSTEPSORT, " + + "rvAlong.ORDER_INDEX AS RVCDSTEPSORT, " + + "wq.STTP AS STTP_CODE " + + "FROM SD_WQ_B_H wq " + + "LEFT JOIN SD_ENGINFO_B_H eng ON eng.STCD = wq.RSTCD " + + "LEFT JOIN SD_HYDROBASE hb ON hb.BASEID = eng.BASE_ID AND NVL(hb.IS_DELETED, 0) = 0 " + + "LEFT JOIN SD_RVCD_DIC rv ON rv.RVCD = eng.RVCD " + + "LEFT JOIN SD_ADDVCD_DIC addv ON addv.ADDVCD = eng.ADDVCD " + + "LEFT JOIN MS_ALONG_B rvAlong ON rvAlong.RVCD = eng.HBRVCD AND rvAlong.CODE = 'common' AND NVL(rvAlong.IS_DELETED, 0) = 0 " + + "LEFT JOIN (SELECT det.SORT, along.RVCD, det.STCD " + + " FROM MS_ALONGDET_B det " + + " INNER JOIN MS_ALONG_B along ON det.ALONG_ID = along.ID " + + " WHERE NVL(det.IS_DELETED, 0) = 0 AND NVL(along.IS_DELETED, 0) = 0 AND along.CODE = 'common') rstAlong " + + " ON rstAlong.RVCD = eng.HBRVCD AND rstAlong.STCD = wq.RSTCD " + + "LEFT JOIN (SELECT det.SORT, along.RVCD, det.STCD " + + " FROM MS_ALONGDET_B det " + + " INNER JOIN MS_ALONG_B along ON det.ALONG_ID = along.ID " + + " WHERE NVL(det.IS_DELETED, 0) = 0 AND NVL(along.IS_DELETED, 0) = 0 AND along.CODE = 'common') siteAlong " + + " ON siteAlong.RVCD = eng.HBRVCD AND siteAlong.STCD = wq.STCD " + + "WHERE wq.STTP = 'WQ' AND NVL(wq.IS_DELETED, 0) = 0"; + } + + private String buildEnvWqDataFilterCondition(DataSourceRequest.FilterDescriptor filter, + Map paramMap, + int[] indexHolder) { + if (filter == null) { + return ""; + } + if (StrUtil.isNotBlank(filter.getField())) { + return buildEnvWqDataLeafCondition(filter, paramMap, indexHolder); + } + if (CollUtil.isEmpty(filter.getFilters())) { + return ""; + } + List conditions = new ArrayList<>(); + for (DataSourceRequest.FilterDescriptor child : filter.getFilters()) { + String childSql = buildEnvWqDataFilterCondition(child, paramMap, indexHolder); + if (StrUtil.isNotBlank(childSql)) { + conditions.add(childSql); + } + } + if (conditions.isEmpty()) { + return ""; + } + String logic = "or".equalsIgnoreCase(filter.getLogic()) ? " OR " : " AND "; + return "(" + String.join(logic, conditions) + ")"; + } + + private String buildEnvWqDataLeafCondition(DataSourceRequest.FilterDescriptor filter, + Map paramMap, + int[] indexHolder) { + String column = mapEnvWqDataColumn(filter.getField()); + if (StrUtil.isBlank(column) || filter.getValue() == null) { + return ""; + } + String operator = StrUtil.blankToDefault(filter.getOperator(), "eq").toLowerCase(); + String key = "envWqDataParam" + indexHolder[0]++; + boolean dateField = "tm".equals(filter.getField()); + switch (operator) { + case "eq": + paramMap.put(key, filter.getValue()); + return dateField ? column + " = TO_DATE(#{map." + key + "}, 'YYYY-MM-DD HH24:MI:SS')" : column + " = #{map." + key + "}"; + case "neq": + paramMap.put(key, filter.getValue()); + return dateField ? column + " <> TO_DATE(#{map." + key + "}, 'YYYY-MM-DD HH24:MI:SS')" : column + " <> #{map." + key + "}"; + case "gt": + paramMap.put(key, filter.getValue()); + return dateField ? column + " > TO_DATE(#{map." + key + "}, 'YYYY-MM-DD HH24:MI:SS')" : column + " > #{map." + key + "}"; + case "gte": + paramMap.put(key, filter.getValue()); + return dateField ? column + " >= TO_DATE(#{map." + key + "}, 'YYYY-MM-DD HH24:MI:SS')" : column + " >= #{map." + key + "}"; + case "lt": + paramMap.put(key, filter.getValue()); + return dateField ? column + " < TO_DATE(#{map." + key + "}, 'YYYY-MM-DD HH24:MI:SS')" : column + " < #{map." + key + "}"; + case "lte": + paramMap.put(key, filter.getValue()); + return dateField ? column + " <= TO_DATE(#{map." + key + "}, 'YYYY-MM-DD HH24:MI:SS')" : column + " <= #{map." + key + "}"; + case "contains": + paramMap.put(key, "%" + filter.getValue() + "%"); + return column + " LIKE #{map." + key + "}"; + default: + return ""; + } + } + + private String mapEnvWqDataColumn(String field) { + if (StrUtil.isBlank(field)) { + return null; + } + return switch (field) { + case "baseName" -> "T.BASE_NAME"; + case "stnm" -> "T.STNM"; + case "wwqtg" -> "T.WWQTG"; + case "baseId" -> "T.BASE_ID"; + case "rstcd" -> "T.RSTCD"; + case "ennm" -> "T.ENNM"; + case "stCode" -> "T.ST_CODE"; + case "stName" -> "T.ST_NAME"; + case "stcd" -> "T.STCD"; + case "tm" -> "T.TM"; + case "wqgrd" -> "T.WQGRD"; + case "ph" -> "T.PH"; + case "dox" -> "T.DOX"; + case "codmn" -> "T.CODMN"; + case "codcr" -> "T.CODCR"; + case "bod5" -> "T.BOD5"; + case "nh3n" -> "T.NH3N"; + case "tp" -> "T.TP"; + case "tn" -> "T.TN"; + case "cu" -> "T.CU"; + case "zn" -> "T.ZN"; + case "f" -> "T.F"; + case "se" -> "T.SE"; + case "ars" -> "T.ARS"; + case "hg" -> "T.HG"; + case "cd" -> "T.CD"; + case "cr6" -> "T.CR6"; + case "pb" -> "T.PB"; + case "cn" -> "T.CN"; + case "vlph" -> "T.VLPH"; + case "oil" -> "T.OIL"; + case "las" -> "T.LAS"; + case "s2" -> "T.S2"; + case "fcg" -> "T.FCG"; + case "cl" -> "T.CL"; + case "so4" -> "T.SO4"; + case "no3" -> "T.NO3"; + case "thrd" -> "T.THRD"; + case "cond" -> "T.COND"; + case "fe" -> "T.FE"; + case "mn" -> "T.MN"; + case "al" -> "T.AL"; + case "chla" -> "T.CHLA"; + case "clarity" -> "T.CLARITY"; + case "tu" -> "T.TU"; + case "cyano" -> "T.CYANO"; + case "sfdb" -> "T.SFDB"; + case "wtmp" -> "T.WTMP"; + case "dtinType" -> "T.DTIN_TYPE"; + case "tod" -> "T.TOD"; + case "wqSfdbhnYs" -> "T.WQ_SFDBHN_YS"; + case "siteStepSort" -> "T.SITESTEPSORT"; + case "baseStepSort" -> "T.BASESTEPSORT"; + case "ttpwr" -> "T.TTPWR"; + case "rstcdStepSort" -> "T.RSTCDSTEPSORT"; + case "sttpCode" -> "T.STTP_CODE"; + default -> null; + }; + } + + private String buildEnvWqDataGroupSql(String baseSql, String groupBy, GroupingInfo[] groupInfos) { + StringBuilder sql = new StringBuilder("SELECT "); + List groupFields = new ArrayList<>(); + for (GroupingInfo item : groupInfos) { + if (item != null && StrUtil.isNotBlank(item.getSelector())) { + groupFields.add(item.getSelector()); + } + } + sql.append(String.join(", ", groupFields)); + for (GroupingInfo item : groupInfos) { + sql.append(", COUNT(*) AS count_").append(item.getSelector()).append(" "); + } + sql.append("FROM (").append(baseSql).append(") T ").append(groupBy); + return sql.toString(); + } + + private String buildEnvWqDataOrderBySql(List sortList) { + if (sortList == null || sortList.isEmpty()) { + return ""; + } + StringBuilder sql = new StringBuilder(" ORDER BY "); + boolean appended = false; + for (DataSourceRequest.SortDescriptor sortDescriptor : sortList) { + if (sortDescriptor == null || StrUtil.isBlank(sortDescriptor.getField())) { + continue; + } + String column = mapEnvWqDataColumn(sortDescriptor.getField()); + if (column == null) { + continue; + } + if (appended) { + sql.append(", "); + } + sql.append(column).append(" ") + .append("desc".equalsIgnoreCase(sortDescriptor.getDir()) ? "DESC" : "ASC"); + appended = true; + } + return appended ? sql.toString() : ""; + } + + private void fillEnvWqDataDerivedFields(List list) { + if (CollUtil.isEmpty(list)) { + return; + } + for (EnvWqDataVo item : list) { + item.setWqgrdName(getWqLevelName(item.getWqgrd())); + item.setWwqtgName(getWqLevelName(item.getWwqtg())); + item.setSfdbName(getSfdbName(item.getSfdb())); + item.setWqSfdbhnYsName(convertWqFactors(item.getWqSfdbhnYs())); + } + } + + private void fillEnvWqDataLimit(List list) { + if (CollUtil.isEmpty(list)) { + return; + } + String sql = "SELECT t2.YS AS ys, t2.MIN_VAL AS minVal, t2.MAX_VAL AS maxVal, t2.LVL AS lvl " + + "FROM MS_WARN_RULE_B t1 " + + "INNER JOIN MS_WARN_RULE_DETAIL_B t2 ON t1.ID = t2.RULE_ID " + + "WHERE t1.RULE_TYPE = 'WQLVL'"; + List> ruleList = microservicDynamicSQLMapper.pageAllList(null, sql, null); + if (CollUtil.isEmpty(ruleList)) { + return; + } + Map ruleDirectionMap = getWqLimitDirection(ruleList); + Map>> levelRuleMap = ruleList.stream() + .filter(item -> StrUtil.isNotBlank(asString(item.get("lvl")))) + .collect(Collectors.groupingBy(item -> asString(item.get("lvl")))); + + for (EnvWqDataVo item : list) { + if (StrUtil.isBlank(item.getWwqtg())) { + continue; + } + List> currentRules = levelRuleMap.get(item.getWwqtg()); + if (CollUtil.isEmpty(currentRules)) { + continue; + } + List> max = new ArrayList<>(); + List> min = new ArrayList<>(); + for (Map rule : currentRules) { + String ys = asString(rule.get("ys")); + Integer direction = ruleDirectionMap.get(ys); + Map maxMap = new LinkedHashMap<>(); + Map minMap = new LinkedHashMap<>(); + if (direction != null && direction == 2) { + maxMap.put(ys, rule.get("maxVal")); + minMap.put(ys, rule.get("minVal")); + max.add(maxMap); + min.add(minMap); + } else if (direction != null && direction == 1) { + minMap.put(ys, rule.get("minVal")); + min.add(minMap); + } else { + maxMap.put(ys, rule.get("maxVal")); + max.add(maxMap); + } + } + item.setMax(max); + item.setMin(min); + } + } + + private Map getWqLimitDirection(List> ruleList) { + Map>> grouped = ruleList.stream() + .collect(Collectors.groupingBy(item -> asString(item.get("ys")))); + Map result = new HashMap<>(); + for (Map.Entry>> entry : grouped.entrySet()) { + List> current = entry.getValue().stream() + .sorted(Comparator.comparing(item -> asBigDecimal(item.get("minVal")), Comparator.nullsLast(BigDecimal::compareTo))) + .collect(Collectors.toList()); + Set minSet = current.stream().map(item -> asBigDecimal(item.get("minVal"))).collect(Collectors.toSet()); + Set maxSet = current.stream().map(item -> asBigDecimal(item.get("maxVal"))).collect(Collectors.toSet()); + if (minSet.size() == 1 && maxSet.size() == 1) { + result.put(entry.getKey(), 2); + } else { + int first = Integer.parseInt(asString(current.get(0).get("lvl"))); + int last = Integer.parseInt(asString(current.get(current.size() - 1).get("lvl"))); + result.put(entry.getKey(), first > last ? 1 : 0); + } + } + return result; + } + + private String convertWqFactors(String raw) { + if (StrUtil.isBlank(raw)) { + return null; + } + Map factorMap = new LinkedHashMap<>(); + factorMap.put("WTMP", "水温"); + factorMap.put("PH", "pH"); + factorMap.put("DOX", "溶解氧"); + factorMap.put("CODMN", "高锰酸盐指数"); + factorMap.put("CODCR", "化学需氧量"); + factorMap.put("BOD5", "五日生化需氧量"); + factorMap.put("NH3N", "氨氮"); + factorMap.put("TP", "总磷"); + factorMap.put("TN", "总氮"); + factorMap.put("CU", "铜"); + factorMap.put("ZN", "锌"); + factorMap.put("F", "氟化物"); + factorMap.put("SE", "硒"); + factorMap.put("ARS", "砷"); + factorMap.put("HG", "汞"); + factorMap.put("CD", "镉"); + factorMap.put("CR6", "六价铬"); + factorMap.put("PB", "铅"); + factorMap.put("CN", "氰化物"); + factorMap.put("VLPH", "挥发酚"); + factorMap.put("OIL", "石油类"); + factorMap.put("LAS", "阴离子表面活性剂"); + factorMap.put("S2", "硫化物"); + factorMap.put("FCG", "粪大肠菌群"); + factorMap.put("CL", "氯化物"); + factorMap.put("SO4", "硫酸盐"); + factorMap.put("NO3", "硝酸盐氮"); + factorMap.put("THRD", "总硬度"); + factorMap.put("COND", "电导率"); + factorMap.put("FE", "铁"); + factorMap.put("MN", "锰"); + factorMap.put("AL", "铝"); + factorMap.put("CHLA", "叶绿素a"); + factorMap.put("CLARITY", "透明度"); + factorMap.put("TU", "浊度"); + factorMap.put("CYANO", "蓝绿藻"); + factorMap.put("TOD", "总需氧量"); + + List names = new ArrayList<>(); + for (String part : raw.split(",")) { + String key = StrUtil.trim(part).toUpperCase(); + if (StrUtil.isBlank(key)) { + continue; + } + names.add(factorMap.getOrDefault(key, key)); + } + return names.isEmpty() ? null : String.join(",", names); + } + + private String asString(Object value) { + return value == null ? null : String.valueOf(value); + } + + private BigDecimal asBigDecimal(Object value) { + if (value == null) { + return null; + } + if (value instanceof BigDecimal bigDecimal) { + return bigDecimal; + } + return new BigDecimal(String.valueOf(value)); + } + private String buildEnvWqProcessBaseSql(boolean calculated) { StringBuilder sql = new StringBuilder(); sql.append("SELECT ") From ed48fa661875f5fe3e639951afe170157a89b940 Mon Sep 17 00:00:00 2001 From: tangwei Date: Tue, 26 May 2026 11:23:53 +0800 Subject: [PATCH 07/41] =?UTF-8?q?feat:=20=E5=A2=9E=E5=8A=A0=E8=BF=87?= =?UTF-8?q?=E9=B1=BC=E8=AE=BE=E6=96=BD=E5=92=8C=E6=A0=96=E6=81=AF=E5=9C=B0?= =?UTF-8?q?=E6=8E=A5=E5=8F=A3?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../yfd/platform/config/SecurityConfig.java | 2 + .../yfd/platform/config/SwaggerConfig.java | 18 ++ .../fh/controller/FhHabitatController.java | 29 +++ .../env/fh/entity/ao/FhDefaultAo.java | 20 ++ .../env/fh/entity/vo/FhDefaultVo.java | 56 ++++++ .../env/fh/service/FhHabitatService.java | 9 + .../fh/service/impl/FhHabitatServiceImpl.java | 149 +++++++++++++++ .../env/fp/controller/FpRunController.java | 29 +++ .../platform/env/fp/entity/vo/FdFishVo.java | 15 ++ .../env/fp/entity/vo/FpRunPlanVo.java | 47 +++++ .../platform/env/fp/service/FpRunService.java | 10 + .../env/fp/service/impl/FpRunServiceImpl.java | 177 ++++++++++++++++++ .../wq/controller/EnvWqDataController.java | 6 +- .../wq/service/impl/EnvWqDataServiceImpl.java | 8 +- 14 files changed, 566 insertions(+), 9 deletions(-) create mode 100644 backend/src/main/java/com/yfd/platform/env/fh/controller/FhHabitatController.java create mode 100644 backend/src/main/java/com/yfd/platform/env/fh/entity/ao/FhDefaultAo.java create mode 100644 backend/src/main/java/com/yfd/platform/env/fh/entity/vo/FhDefaultVo.java create mode 100644 backend/src/main/java/com/yfd/platform/env/fh/service/FhHabitatService.java create mode 100644 backend/src/main/java/com/yfd/platform/env/fh/service/impl/FhHabitatServiceImpl.java create mode 100644 backend/src/main/java/com/yfd/platform/env/fp/controller/FpRunController.java create mode 100644 backend/src/main/java/com/yfd/platform/env/fp/entity/vo/FdFishVo.java create mode 100644 backend/src/main/java/com/yfd/platform/env/fp/entity/vo/FpRunPlanVo.java create mode 100644 backend/src/main/java/com/yfd/platform/env/fp/service/FpRunService.java create mode 100644 backend/src/main/java/com/yfd/platform/env/fp/service/impl/FpRunServiceImpl.java diff --git a/backend/src/main/java/com/yfd/platform/config/SecurityConfig.java b/backend/src/main/java/com/yfd/platform/config/SecurityConfig.java index fb55233f..8188f10f 100644 --- a/backend/src/main/java/com/yfd/platform/config/SecurityConfig.java +++ b/backend/src/main/java/com/yfd/platform/config/SecurityConfig.java @@ -61,6 +61,8 @@ public class SecurityConfig { .requestMatchers("/env/**").permitAll() .requestMatchers("/wt/**").permitAll() .requestMatchers("/wq/**").permitAll() + .requestMatchers("/fp/**").permitAll() + .requestMatchers("/fh/**").permitAll() .requestMatchers("/data/**").permitAll() .requestMatchers("/sms/**").permitAll() .requestMatchers(HttpMethod.GET, "/").permitAll() diff --git a/backend/src/main/java/com/yfd/platform/config/SwaggerConfig.java b/backend/src/main/java/com/yfd/platform/config/SwaggerConfig.java index 6a096e46..283b05d1 100644 --- a/backend/src/main/java/com/yfd/platform/config/SwaggerConfig.java +++ b/backend/src/main/java/com/yfd/platform/config/SwaggerConfig.java @@ -76,6 +76,24 @@ public class SwaggerConfig { .build(); } + @Bean + public GroupedOpenApi groupEnvFPApi() { + return GroupedOpenApi.builder() + .group("3.2 全过程-生态环保数据服务-过鱼设施") + .packagesToScan("com.yfd.platform.env.fp.controller") + .build(); + } + + @Bean + public GroupedOpenApi groupEnvFHApi() { + return GroupedOpenApi.builder() + .group("3.2 全过程-生态环保数据服务-栖息地") + .packagesToScan("com.yfd.platform.env.fh.controller") + .build(); + } + + + @Bean public GroupedOpenApi groupEngApi() { diff --git a/backend/src/main/java/com/yfd/platform/env/fh/controller/FhHabitatController.java b/backend/src/main/java/com/yfd/platform/env/fh/controller/FhHabitatController.java new file mode 100644 index 00000000..e881489a --- /dev/null +++ b/backend/src/main/java/com/yfd/platform/env/fh/controller/FhHabitatController.java @@ -0,0 +1,29 @@ +package com.yfd.platform.env.fh.controller; + +import com.yfd.platform.config.ResponseResult; +import com.yfd.platform.env.fh.entity.ao.FhDefaultAo; +import com.yfd.platform.env.fh.service.FhHabitatService; +import io.swagger.v3.oas.annotations.Operation; +import io.swagger.v3.oas.annotations.tags.Tag; +import jakarta.annotation.Resource; +import org.springframework.validation.annotation.Validated; +import org.springframework.web.bind.annotation.PostMapping; +import org.springframework.web.bind.annotation.RequestBody; +import org.springframework.web.bind.annotation.RequestMapping; +import org.springframework.web.bind.annotation.RestController; + +@RestController +@RequestMapping("/fh") +@Tag(name = "栖息地统计") +@Validated +public class FhHabitatController { + + @Resource + private FhHabitatService fhHabitatService; + + @PostMapping("/default/getFhList") + @Operation(summary = "获取默认有数据的栖息地站点信息") + public ResponseResult getDefaultFhList(@RequestBody FhDefaultAo fhDefaultAo) { + return ResponseResult.successData(fhHabitatService.getDefaultFhList(fhDefaultAo)); + } +} diff --git a/backend/src/main/java/com/yfd/platform/env/fh/entity/ao/FhDefaultAo.java b/backend/src/main/java/com/yfd/platform/env/fh/entity/ao/FhDefaultAo.java new file mode 100644 index 00000000..ab6309a2 --- /dev/null +++ b/backend/src/main/java/com/yfd/platform/env/fh/entity/ao/FhDefaultAo.java @@ -0,0 +1,20 @@ +package com.yfd.platform.env.fh.entity.ao; + +import io.swagger.v3.oas.annotations.media.Schema; +import lombok.Data; + +import java.util.Date; + +@Data +@Schema(description = "栖息地默认数据信息") +public class FhDefaultAo { + + @Schema(description = "基地编码") + private String baseId; + + @Schema(description = "开始时间") + private Date sdt; + + @Schema(description = "结束时间") + private Date edt; +} diff --git a/backend/src/main/java/com/yfd/platform/env/fh/entity/vo/FhDefaultVo.java b/backend/src/main/java/com/yfd/platform/env/fh/entity/vo/FhDefaultVo.java new file mode 100644 index 00000000..1aec0c8c --- /dev/null +++ b/backend/src/main/java/com/yfd/platform/env/fh/entity/vo/FhDefaultVo.java @@ -0,0 +1,56 @@ +package com.yfd.platform.env.fh.entity.vo; + +import io.swagger.v3.oas.annotations.media.Schema; +import lombok.Data; +import lombok.experimental.Accessors; + +@Data +@Accessors(chain = true) +@Schema(description = "栖息地默认数据结果") +public class FhDefaultVo { + + @Schema(description = "站点编码") + private String stcd; + + @Schema(description = "站点名称") + private String stnm; + + @Schema(description = "水温站编码") + private String wtstcd; + + @Schema(description = "水温站名称") + private String wtstnm; + + @Schema(description = "基地编码") + private String baseId; + + @Schema(description = "基地名称") + private String baseName; + + @Schema(description = "基地流域编码") + private String hbrvcd; + + @Schema(description = "基地流域名称") + private String hbrvcdName; + + @Schema(description = "栖息地编码") + private String fhstcd; + + @Schema(description = "栖息地名称") + private String fhstnm; + + @Schema(description = "数据数量") + private Integer dataStatus; + + @Schema(description = "站点类型编码") + private String sttpCode; + + @Schema(description = "站点类型名称") + private String sttpName; + + @Schema(description = "流量站编码") + private String zqstcd; + + @Schema(description = "流量站名称") + private String zqstnm; +} diff --git a/backend/src/main/java/com/yfd/platform/env/fh/service/FhHabitatService.java b/backend/src/main/java/com/yfd/platform/env/fh/service/FhHabitatService.java new file mode 100644 index 00000000..f4c287f8 --- /dev/null +++ b/backend/src/main/java/com/yfd/platform/env/fh/service/FhHabitatService.java @@ -0,0 +1,9 @@ +package com.yfd.platform.env.fh.service; + +import com.yfd.platform.env.fh.entity.ao.FhDefaultAo; +import com.yfd.platform.env.fh.entity.vo.FhDefaultVo; + +public interface FhHabitatService { + + FhDefaultVo getDefaultFhList(FhDefaultAo fhDefaultAo); +} diff --git a/backend/src/main/java/com/yfd/platform/env/fh/service/impl/FhHabitatServiceImpl.java b/backend/src/main/java/com/yfd/platform/env/fh/service/impl/FhHabitatServiceImpl.java new file mode 100644 index 00000000..1d6e8198 --- /dev/null +++ b/backend/src/main/java/com/yfd/platform/env/fh/service/impl/FhHabitatServiceImpl.java @@ -0,0 +1,149 @@ +package com.yfd.platform.env.fh.service.impl; + +import cn.hutool.core.bean.BeanUtil; +import cn.hutool.core.bean.copier.CopyOptions; +import cn.hutool.core.util.StrUtil; +import com.yfd.platform.common.MicroservicDynamicSQLMapper; +import com.yfd.platform.env.fh.entity.ao.FhDefaultAo; +import com.yfd.platform.env.fh.entity.vo.FhDefaultVo; +import com.yfd.platform.env.fh.service.FhHabitatService; +import jakarta.annotation.Resource; +import org.springframework.stereotype.Service; + +import java.util.ArrayList; +import java.util.LinkedHashMap; +import java.util.List; +import java.util.Map; + +@Service +public class FhHabitatServiceImpl implements FhHabitatService { + + @Resource + private MicroservicDynamicSQLMapper microservicDynamicSQLMapper; + + @Override + public FhDefaultVo getDefaultFhList(FhDefaultAo fhDefaultAo) { + Map paramMap = new LinkedHashMap<>(); + paramMap.put("baseId", fhDefaultAo == null ? null : fhDefaultAo.getBaseId()); + paramMap.put("sdt", fhDefaultAo == null ? null : fhDefaultAo.getSdt()); + paramMap.put("edt", fhDefaultAo == null ? null : fhDefaultAo.getEdt()); + + List> rows = microservicDynamicSQLMapper.getAllList(buildDefaultFhListSql(fhDefaultAo), paramMap); + if (rows == null || rows.isEmpty()) { + return new FhDefaultVo(); + } + + List list = new ArrayList<>(rows.size()); + for (Map row : rows) { + list.add(BeanUtil.fillBeanWithMap( + row, + new FhDefaultVo(), + CopyOptions.create().setIgnoreCase(true).setIgnoreError(true) + )); + } + + Map> groupByFh = new LinkedHashMap<>(); + for (FhDefaultVo item : list) { + groupByFh.computeIfAbsent(item.getFhstcd(), key -> new ArrayList<>()).add(item); + } + + List result = new ArrayList<>(); + for (Map.Entry> entry : groupByFh.entrySet()) { + List values = entry.getValue(); + FhDefaultVo merged = new FhDefaultVo(); + merged.setFhstcd(entry.getKey()) + .setFhstnm(values.get(0).getFhstnm()) + .setBaseId(values.get(0).getBaseId()) + .setBaseName(values.get(0).getBaseName()) + .setHbrvcd(values.get(0).getHbrvcd()) + .setHbrvcdName(values.get(0).getHbrvcdName()); + for (FhDefaultVo value : values) { + if ("WTRV".equals(value.getSttpCode())) { + merged.setWtstcd(value.getStcd()).setWtstnm(value.getStnm()); + } else if ("ZQ".equals(value.getSttpCode())) { + merged.setZqstcd(value.getStcd()).setZqstnm(value.getStnm()); + } + } + result.add(merged); + } + + for (FhDefaultVo item : result) { + if (StrUtil.isNotBlank(item.getWtstcd()) && StrUtil.isNotBlank(item.getZqstcd())) { + return item; + } + } + return result.get(0); + } + + private String buildDefaultFhListSql(FhDefaultAo fhDefaultAo) { + String dateConditionWtrv = ""; + String dateConditionZq = ""; + if (fhDefaultAo != null && fhDefaultAo.getSdt() != null && fhDefaultAo.getEdt() != null) { + dateConditionWtrv = " AND dayData.DT BETWEEN #{map.sdt} AND #{map.edt} "; + dateConditionZq = " AND riverDay.DT BETWEEN #{map.sdt} AND #{map.edt} "; + } + + StringBuilder sql = new StringBuilder(); + sql.append("SELECT * FROM ("); + sql.append(" SELECT wt.STCD AS stcd, "); + sql.append(" wt.STNM AS stnm, "); + sql.append(" eng.BASE_ID AS baseId, "); + sql.append(" hb.BASENAME AS baseName, "); + sql.append(" eng.HBRVCD AS hbrvcd, "); + sql.append(" hbrv.HBRVNM AS hbrvcdName, "); + sql.append(" fh.STCD AS fhstcd, "); + sql.append(" fh.STNM AS fhstnm, "); + sql.append(" 'WTRV' AS sttpCode, "); + sql.append(" '河道水温站' AS sttpName, "); + sql.append(" (SELECT COUNT(*) FROM SD_WTRVDAY_S dayData "); + sql.append(" WHERE dayData.STCD = wt.STCD "); + sql.append(" AND NVL(dayData.IS_DELETED, 0) = 0 "); + sql.append(dateConditionWtrv); + sql.append(" ) AS dataStatus "); + sql.append(" FROM SD_WT_B_H wt "); + sql.append(" INNER JOIN SD_FHBT_B_H fh ON fh.STCD = wt.FHSTCD AND NVL(fh.IS_DELETED, 0) = 0 "); + sql.append(" LEFT JOIN SD_ENGINFO_B_H eng ON eng.STCD = wt.RSTCD "); + sql.append(" LEFT JOIN SD_HYDROBASE hb ON hb.BASEID = NVL(fh.BASE_ID, eng.BASE_ID) "); + sql.append(" LEFT JOIN SD_HBRV_DIC hbrv ON hbrv.HBRVCD = NVL(fh.HBRVCD, eng.HBRVCD) "); + sql.append(" AND hbrv.BASEID = NVL(fh.BASE_ID, eng.BASE_ID) "); + sql.append(" AND NVL(hbrv.IS_DELETED, 0) = 0 "); + sql.append(" WHERE wt.STTP = 'WTRV' "); + sql.append(" AND NVL(wt.IS_DELETED, 0) = 0 "); + sql.append(" AND wt.FHSTCD IS NOT NULL "); + if (fhDefaultAo != null && StrUtil.isNotBlank(fhDefaultAo.getBaseId())) { + sql.append(" AND NVL(fh.BASE_ID, eng.BASE_ID) = #{map.baseId} "); + } + sql.append(" UNION ALL "); + sql.append(" SELECT river.STCD AS stcd, "); + sql.append(" river.STNM AS stnm, "); + sql.append(" eng.BASE_ID AS baseId, "); + sql.append(" hb.BASENAME AS baseName, "); + sql.append(" eng.HBRVCD AS hbrvcd, "); + sql.append(" hbrv.HBRVNM AS hbrvcdName, "); + sql.append(" fh.STCD AS fhstcd, "); + sql.append(" fh.STNM AS fhstnm, "); + sql.append(" 'ZQ' AS sttpCode, "); + sql.append(" '流量站' AS sttpName, "); + sql.append(" (SELECT COUNT(*) FROM SD_RIVERDAY_S riverDay "); + sql.append(" WHERE riverDay.STCD = river.STCD "); + sql.append(" AND NVL(riverDay.IS_DELETED, 0) = 0 "); + sql.append(dateConditionZq); + sql.append(" ) AS dataStatus "); + sql.append(" FROM SD_RIVER_B_H river "); + sql.append(" INNER JOIN SD_FHBT_B_H fh ON fh.STCD = river.FHSTCD AND NVL(fh.IS_DELETED, 0) = 0 "); + sql.append(" LEFT JOIN SD_ENGINFO_B_H eng ON eng.STCD = river.RSTCD "); + sql.append(" LEFT JOIN SD_HYDROBASE hb ON hb.BASEID = NVL(fh.BASE_ID, eng.BASE_ID) "); + sql.append(" LEFT JOIN SD_HBRV_DIC hbrv ON hbrv.HBRVCD = NVL(fh.HBRVCD, eng.HBRVCD) "); + sql.append(" AND hbrv.BASEID = NVL(fh.BASE_ID, eng.BASE_ID) "); + sql.append(" AND NVL(hbrv.IS_DELETED, 0) = 0 "); + sql.append(" WHERE river.STTP = 'ZQ' "); + sql.append(" AND NVL(river.IS_DELETED, 0) = 0 "); + sql.append(" AND river.FHSTCD IS NOT NULL "); + if (fhDefaultAo != null && StrUtil.isNotBlank(fhDefaultAo.getBaseId())) { + sql.append(" AND NVL(fh.BASE_ID, eng.BASE_ID) = #{map.baseId} "); + } + sql.append(") t WHERE t.dataStatus > 0 "); + sql.append("ORDER BY t.fhstcd, t.sttpCode, t.dataStatus DESC"); + return sql.toString(); + } +} diff --git a/backend/src/main/java/com/yfd/platform/env/fp/controller/FpRunController.java b/backend/src/main/java/com/yfd/platform/env/fp/controller/FpRunController.java new file mode 100644 index 00000000..fbcc43cf --- /dev/null +++ b/backend/src/main/java/com/yfd/platform/env/fp/controller/FpRunController.java @@ -0,0 +1,29 @@ +package com.yfd.platform.env.fp.controller; + +import com.yfd.platform.common.DataSourceRequest; +import com.yfd.platform.config.ResponseResult; +import com.yfd.platform.env.fp.service.FpRunService; +import io.swagger.v3.oas.annotations.Operation; +import io.swagger.v3.oas.annotations.tags.Tag; +import jakarta.annotation.Resource; +import org.springframework.validation.annotation.Validated; +import org.springframework.web.bind.annotation.PostMapping; +import org.springframework.web.bind.annotation.RequestBody; +import org.springframework.web.bind.annotation.RequestMapping; +import org.springframework.web.bind.annotation.RestController; + +@RestController +@RequestMapping("/fp/run") +@Tag(name = "过鱼设施建设及运行情况") +@Validated +public class FpRunController { + + @Resource + private FpRunService fpRunService; + + @PostMapping("/secondPlan/qgc/GetKendoListCust") + @Operation(summary = "环保部-建设及运行运行情况(二级级页面 已建设施运行情况-计划接口)") + public ResponseResult getQgcSecondPlanKendoListCust(@RequestBody DataSourceRequest dataSourceRequest) { + return ResponseResult.successData(fpRunService.processQgcSecondPlanKendoList(dataSourceRequest)); + } +} diff --git a/backend/src/main/java/com/yfd/platform/env/fp/entity/vo/FdFishVo.java b/backend/src/main/java/com/yfd/platform/env/fp/entity/vo/FdFishVo.java new file mode 100644 index 00000000..210e89b3 --- /dev/null +++ b/backend/src/main/java/com/yfd/platform/env/fp/entity/vo/FdFishVo.java @@ -0,0 +1,15 @@ +package com.yfd.platform.env.fp.entity.vo; + +import io.swagger.v3.oas.annotations.media.Schema; +import lombok.Data; + +@Data +@Schema(description = "过鱼鱼类信息") +public class FdFishVo { + + @Schema(description = "鱼类编码") + private String ftp; + + @Schema(description = "鱼类名称") + private String name; +} diff --git a/backend/src/main/java/com/yfd/platform/env/fp/entity/vo/FpRunPlanVo.java b/backend/src/main/java/com/yfd/platform/env/fp/entity/vo/FpRunPlanVo.java new file mode 100644 index 00000000..6f2c5455 --- /dev/null +++ b/backend/src/main/java/com/yfd/platform/env/fp/entity/vo/FpRunPlanVo.java @@ -0,0 +1,47 @@ +package com.yfd.platform.env.fp.entity.vo; + +import io.swagger.v3.oas.annotations.media.Schema; +import lombok.Data; + +import java.util.List; + +@Data +@Schema(description = "过鱼设施运行情况二级弹窗标题数据") +public class FpRunPlanVo { + + @Schema(description = "设施编码") + private String stcd; + + @Schema(description = "计划开始月份") + private String designStartDate; + + @Schema(description = "计划结束月份") + private String designEndDate; + + @Schema(description = "计划运行月数") + private Integer mon; + + @Schema(description = "计划运行频次") + private Integer pyRate; + + @Schema(description = "计划运行次数") + private Integer pycnt; + + @Schema(description = "设施类型编码") + private String sttpCode; + + @Schema(description = "过鱼类型 0鱼道 1过鱼机") + private Integer dwtp; + + @Schema(description = "计划过鱼种类") + private String planFtp; + + @Schema(description = "计划过鱼列表") + private List planList; + + @Schema(description = "设计过鱼列表") + private List designList; + + @Schema(description = "过鱼对象列表") + private List objList; +} diff --git a/backend/src/main/java/com/yfd/platform/env/fp/service/FpRunService.java b/backend/src/main/java/com/yfd/platform/env/fp/service/FpRunService.java new file mode 100644 index 00000000..b531a5c1 --- /dev/null +++ b/backend/src/main/java/com/yfd/platform/env/fp/service/FpRunService.java @@ -0,0 +1,10 @@ +package com.yfd.platform.env.fp.service; + +import com.yfd.platform.common.DataSourceRequest; +import com.yfd.platform.common.DataSourceResult; +import com.yfd.platform.env.fp.entity.vo.FpRunPlanVo; + +public interface FpRunService { + + DataSourceResult processQgcSecondPlanKendoList(DataSourceRequest dataSourceRequest); +} diff --git a/backend/src/main/java/com/yfd/platform/env/fp/service/impl/FpRunServiceImpl.java b/backend/src/main/java/com/yfd/platform/env/fp/service/impl/FpRunServiceImpl.java new file mode 100644 index 00000000..e06ec8ee --- /dev/null +++ b/backend/src/main/java/com/yfd/platform/env/fp/service/impl/FpRunServiceImpl.java @@ -0,0 +1,177 @@ +package com.yfd.platform.env.fp.service.impl; + +import cn.hutool.core.bean.BeanUtil; +import cn.hutool.core.bean.copier.CopyOptions; +import cn.hutool.core.convert.Convert; +import cn.hutool.core.util.StrUtil; +import com.yfd.platform.common.DataSourceLoadOptionsBase; +import com.yfd.platform.common.DataSourceRequest; +import com.yfd.platform.common.DataSourceResult; +import com.yfd.platform.common.MicroservicDynamicSQLMapper; +import com.yfd.platform.common.exception.BizException; +import com.yfd.platform.env.fp.entity.vo.FpRunPlanVo; +import com.yfd.platform.env.fp.service.FpRunService; +import com.yfd.platform.utils.QgcQueryWrapperUtil; +import jakarta.annotation.Resource; +import org.springframework.stereotype.Service; + +import java.math.BigDecimal; +import java.math.RoundingMode; +import java.util.Collections; +import java.util.HashMap; +import java.util.LinkedHashSet; +import java.util.Map; +import java.util.Set; +import java.util.regex.Matcher; +import java.util.regex.Pattern; + +@Service +public class FpRunServiceImpl implements FpRunService { + + private static final String FP_1 = "FP_1"; + private static final String FP_2 = "FP_2"; + private static final Pattern FISH_NAME_PATTERN = Pattern.compile("name\\s*[::]\\s*([^,,}\\]]+)"); + + @Resource + private MicroservicDynamicSQLMapper microservicDynamicSQLMapper; + + @Override + public DataSourceResult processQgcSecondPlanKendoList(DataSourceRequest dataSourceRequest) { + DataSourceLoadOptionsBase loadOptions = dataSourceRequest.toDevRequest(); + String stcd = QgcQueryWrapperUtil.getFilterFieldValue(loadOptions, "stcd"); + String yr = QgcQueryWrapperUtil.getFilterFieldValue(loadOptions, "yr"); + if (StrUtil.isBlank(stcd)) { + throw new BizException("设施编码(stcd)不能为空."); + } + if (StrUtil.isBlank(yr)) { + throw new BizException("年份(yr)不能为空."); + } + + Map paramMap = new HashMap<>(); + paramMap.put("stcd", stcd); + paramMap.put("yr", yr); + + Map row = microservicDynamicSQLMapper.getOneBySql(buildQgcSecondPlanSql(), paramMap); + FpRunPlanVo vo = row == null || row.isEmpty() + ? new FpRunPlanVo() + : BeanUtil.fillBeanWithMap( + row, + new FpRunPlanVo(), + CopyOptions.create().setIgnoreCase(true).setIgnoreError(true) + ); + + String fallbackFishJson = row == null ? null : Convert.toStr(row.get("fallbackFishJson"), null); + String fallbackFishText = row == null ? null : Convert.toStr(row.get("fallbackFishText"), null); + if (StrUtil.isBlank(vo.getPlanFtp())) { + vo.setPlanFtp(resolveFallbackFishText(fallbackFishJson, fallbackFishText)); + } + + if (StrUtil.isNotBlank(vo.getDesignStartDate()) && StrUtil.isNotBlank(vo.getDesignEndDate())) { + try { + int startMonth = Integer.parseInt(vo.getDesignStartDate()); + int endMonth = Integer.parseInt(vo.getDesignEndDate()); + vo.setMon(Math.abs(endMonth - startMonth) + 1); + } catch (Exception ignored) { + // Keep the old behavior: ignore invalid month format and return the raw values. + } + } + + if (FP_1.equals(vo.getSttpCode()) || FP_2.equals(vo.getSttpCode())) { + vo.setDwtp(0); + } else { + vo.setDwtp(1); + if (vo.getPycnt() != null && vo.getPycnt() != 0 && vo.getMon() != null && vo.getMon() != 0) { + vo.setPyRate(new BigDecimal(vo.getPycnt()) + .divide(new BigDecimal(vo.getMon()), 2, RoundingMode.HALF_UP) + .intValue()); + } + } + + DataSourceResult result = new DataSourceResult<>(); + result.setData(Collections.singletonList(vo)); + result.setTotal(1L); + result.setAggregates(new HashMap<>()); + return result; + } + + private String buildQgcSecondPlanSql() { + return "SELECT t.STCD AS stcd, " + + " t2.stm AS designStartDate, " + + " t2.edm AS designEndDate, " + + " t2.pycnt AS pycnt, " + + " NULL AS pyRate, " + + " t.STTP AS sttpCode, " + + " t1.planFtp AS planFtp, " + + " t.ZYGYDX AS fallbackFishJson, " + + " NVL(t.ZYGYDXMS, t.JGGYDXMS) AS fallbackFishText " + + "FROM SD_FPSS_B_H t " + + "LEFT JOIN ( " + + " SELECT a.STCD, " + + " REGEXP_REPLACE(LISTAGG(TO_CHAR(fish.NAME), ',') WITHIN GROUP (ORDER BY NVL(rel.ORDER_INDEX, 999999), a.FTP), '([^,]+)(,\\1)*(,|$)', '\\1\\3') AS planFtp " + + " FROM ( " + + " SELECT STCD, TRIM(REGEXP_SUBSTR(FTP, '[^,]+', 1, LEVEL)) AS FTP " + + " FROM ( " + + " SELECT STCD, FTP " + + " FROM SD_FPRUNPLAN_B " + + " WHERE (TASK_STATUS = 'Approved' OR TASK_STATUS IS NULL) " + + " AND IS_DELETED = 0 " + + " AND STCD = #{map.stcd} " + + " AND TO_CHAR(START_TIME, 'yyyy') = #{map.yr} " + + " ) " + + " CONNECT BY REGEXP_SUBSTR(FTP, '[^,]+', 1, LEVEL) IS NOT NULL " + + " AND PRIOR TO_CHAR(SYS_GUID()) IS NOT NULL " + + " AND PRIOR FTP = FTP " + + " AND PRIOR STCD = STCD " + + " ) a " + + " INNER JOIN SD_FPSS_B_H fpss ON fpss.STCD = a.STCD " + + " LEFT JOIN SD_ENGINFO_B_H eng ON eng.STCD = fpss.RSTCD " + + " LEFT JOIN SD_FISHDICTORY_RLTN_B rel ON rel.RVCD = eng.HBRVCD " + + " AND rel.FISH_ID = a.FTP " + + " AND rel.IS_DELETED = 0 " + + " LEFT JOIN SD_FISHDICTORY_B fish ON fish.ID = NVL(rel.ZY_FISH_ID, a.FTP) " + + " AND fish.IS_DELETED = 0 " + + " GROUP BY a.STCD " + + ") t1 ON t.STCD = t1.STCD " + + "LEFT JOIN ( " + + " SELECT a.STCD, MIN(a.stm) AS stm, MAX(a.edm) AS edm, MAX(a.pycnt) AS pycnt " + + " FROM ( " + + " SELECT STCD, TO_CHAR(START_TIME, 'mm') AS stm, TO_CHAR(END_TIME, 'mm') AS edm, PYCNT AS pycnt " + + " FROM SD_FPRUNPLAN_B " + + " WHERE (TASK_STATUS = 'Approved' OR TASK_STATUS IS NULL) " + + " AND IS_DELETED = 0 " + + " AND STCD = #{map.stcd} " + + " AND TO_CHAR(START_TIME, 'yyyy') = #{map.yr} " + + " UNION ALL " + + " SELECT STCD, STMONTH AS stm, ETMMONTH AS edm, FREQUENCY AS pycnt " + + " FROM SD_FPDESIGNSTAND_B " + + " WHERE IS_DELETED = 0 " + + " AND STCD = #{map.stcd} " + + " AND STCD NOT IN ( " + + " SELECT STCD " + + " FROM SD_FPRUNPLAN_B " + + " WHERE (TASK_STATUS = 'Approved' OR TASK_STATUS IS NULL) " + + " AND IS_DELETED = 0 " + + " AND STCD = #{map.stcd} " + + " AND TO_CHAR(START_TIME, 'yyyy') = #{map.yr} " + + " GROUP BY STCD " + + " ) " + + " ) a " + + " GROUP BY a.STCD " + + ") t2 ON t.STCD = t2.STCD " + + "WHERE t.STCD = #{map.stcd}"; + } + + private String resolveFallbackFishText(String fallbackFishJson, String fallbackFishText) { + if (StrUtil.isNotBlank(fallbackFishJson)) { + Set fishNames = new LinkedHashSet<>(); + Matcher matcher = FISH_NAME_PATTERN.matcher(fallbackFishJson); + while (matcher.find()) { + fishNames.add(StrUtil.trim(matcher.group(1))); + } + if (!fishNames.isEmpty()) { + return String.join(",", fishNames); + } + } + return StrUtil.blankToDefault(StrUtil.trim(fallbackFishText), null); + } +} diff --git a/backend/src/main/java/com/yfd/platform/env/wq/controller/EnvWqDataController.java b/backend/src/main/java/com/yfd/platform/env/wq/controller/EnvWqDataController.java index be6c3304..b0e00824 100644 --- a/backend/src/main/java/com/yfd/platform/env/wq/controller/EnvWqDataController.java +++ b/backend/src/main/java/com/yfd/platform/env/wq/controller/EnvWqDataController.java @@ -48,7 +48,7 @@ public class EnvWqDataController { } @PostMapping("/data/noAuth/GetKendoListCust") - @Operation(summary = "水质统计分析") + @Operation(summary = "水质统计分析(完成)") public ResponseResult getNoAuthKendoListCust(@RequestBody DataSourceRequest dataSourceRequest) { return ResponseResult.successData(envWqDataService.processKendoList(dataSourceRequest)); } @@ -66,13 +66,13 @@ public class EnvWqDataController { } @PostMapping("/vmsstbprpt/GetKendoList") - @Operation(summary = "根据条件查询水质基础站点数据") + @Operation(summary = "根据条件查询水质基础站点数据(完成)") public ResponseResult getVmsstbprptList(@RequestBody DataSourceRequest dataSourceRequest) { return ResponseResult.successData(envWqDataService.getVmsstbprptList(dataSourceRequest)); } @GetMapping("/msstbprpt/getStcdInfo") - @Operation(summary = "根据站码查询单条水质基础数据") + @Operation(summary = "根据站码查询单条水质基础数据(完成)") public ResponseResult getStcdInfo(@RequestParam String stcd) { return ResponseResult.successData(envWqDataService.getStcdInfo(stcd)); } diff --git a/backend/src/main/java/com/yfd/platform/env/wq/service/impl/EnvWqDataServiceImpl.java b/backend/src/main/java/com/yfd/platform/env/wq/service/impl/EnvWqDataServiceImpl.java index 96932db2..9a62d97b 100644 --- a/backend/src/main/java/com/yfd/platform/env/wq/service/impl/EnvWqDataServiceImpl.java +++ b/backend/src/main/java/com/yfd/platform/env/wq/service/impl/EnvWqDataServiceImpl.java @@ -322,7 +322,7 @@ public class EnvWqDataServiceImpl implements EnvWqDataService { .append("SWR.WQGRD, MSB.WWQTG, SWR.SFDB, SWR.WQ_SFDBHN_YS, ") .append("MSB.BASE_ID, MSB.BASE_NAME, MSB.RVCD_NAME, MSB.ADDVCD_NAME, MSB.DTIN_TYPE, ") .append("MSB.BASESTEPSORT, MSB.RVCDSTEPSORT, MSB.RSTCDSTEPSORT, MSB.SITESTEPSORT, ") - .append("MSB.TTPWR, MSB.STTP_CODE, "); + .append("MSB.STTP_CODE, "); if (calculated) { sql.append("CAST(NULL AS NUMBER(15,3)) AS QI, CAST(NULL AS NUMBER(15,3)) AS QO "); } else { @@ -337,8 +337,7 @@ public class EnvWqDataServiceImpl implements EnvWqDataService { sql.append("INNER JOIN (").append(buildEnvWqDataStationBaseSql()).append(") MSB ON MSB.STCD = SWR.STCD "); if (!calculated) { sql.append("LEFT JOIN SD_HYDROPW_R SHR ON MSB.RSTCD = SHR.STCD AND SWR.TM = SHR.TM AND MSB.DTIN_TYPE = 0 ") - .append("WHERE SWR.TM <= SYSDATE ") - .append("AND (SWR.TASK_ID IS NULL OR SWR.TASK_ID = '' OR SWR.TASK_STATUS = 'Approved') "); + .append("WHERE SWR.TM <= SYSDATE "); } else { sql.append("WHERE 1 = 1 "); } @@ -362,7 +361,6 @@ public class EnvWqDataServiceImpl implements EnvWqDataService { "wq.DTIN_TYPE, " + "siteAlong.SORT AS SITESTEPSORT, " + "hb.ORDER_INDEX AS BASESTEPSORT, " + - "eng.TTPWR AS TTPWR, " + "rstAlong.SORT AS RSTCDSTEPSORT, " + "rvAlong.ORDER_INDEX AS RVCDSTEPSORT, " + "wq.STTP AS STTP_CODE " + @@ -506,7 +504,6 @@ public class EnvWqDataServiceImpl implements EnvWqDataService { case "wqSfdbhnYs" -> "T.WQ_SFDBHN_YS"; case "siteStepSort" -> "T.SITESTEPSORT"; case "baseStepSort" -> "T.BASESTEPSORT"; - case "ttpwr" -> "T.TTPWR"; case "rstcdStepSort" -> "T.RSTCDSTEPSORT"; case "sttpCode" -> "T.STTP_CODE"; default -> null; @@ -899,7 +896,6 @@ public class EnvWqDataServiceImpl implements EnvWqDataService { case "baseStepSort" -> "T.BASESTEPSORT"; case "rvcdStepSort" -> "T.RVCDSTEPSORT"; case "siteStepSort" -> "T.SITESTEPSORT"; - case "drMonth" -> "T.DR_MONTH"; case "drYear" -> "T.DR_YEAR"; case "wqSfdbHy" -> "T.WQ_SFDB_HY"; case "wqSfdbHn" -> "T.WQ_SFDB_HN"; From 6a56b0ef1daa1dba1ed9d2bb6906c463f0784d60 Mon Sep 17 00:00:00 2001 From: tangwei Date: Tue, 26 May 2026 16:40:04 +0800 Subject: [PATCH 08/41] =?UTF-8?q?feat:=20=E5=A2=9E=E5=8A=A0=E6=A0=96?= =?UTF-8?q?=E6=81=AF=E5=9C=B0=E4=B8=BB=E5=88=97=E8=A1=A8=E6=8E=A5=E5=8F=A3?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../yfd/platform/config/SwaggerConfig.java | 4 +- .../fh/controller/FhHabitatController.java | 13 + .../platform/env/fh/entity/vo/HabitatVo.java | 114 +++ .../env/fh/service/FhHabitatService.java | 7 + .../fh/service/impl/FhHabitatServiceImpl.java | 747 ++++++++++++++++++ 5 files changed, 883 insertions(+), 2 deletions(-) create mode 100644 backend/src/main/java/com/yfd/platform/env/fh/entity/vo/HabitatVo.java diff --git a/backend/src/main/java/com/yfd/platform/config/SwaggerConfig.java b/backend/src/main/java/com/yfd/platform/config/SwaggerConfig.java index 283b05d1..453c5b0e 100644 --- a/backend/src/main/java/com/yfd/platform/config/SwaggerConfig.java +++ b/backend/src/main/java/com/yfd/platform/config/SwaggerConfig.java @@ -79,7 +79,7 @@ public class SwaggerConfig { @Bean public GroupedOpenApi groupEnvFPApi() { return GroupedOpenApi.builder() - .group("3.2 全过程-生态环保数据服务-过鱼设施") + .group("3.3 全过程-生态环保数据服务-过鱼设施") .packagesToScan("com.yfd.platform.env.fp.controller") .build(); } @@ -87,7 +87,7 @@ public class SwaggerConfig { @Bean public GroupedOpenApi groupEnvFHApi() { return GroupedOpenApi.builder() - .group("3.2 全过程-生态环保数据服务-栖息地") + .group("3.4 全过程-生态环保数据服务-栖息地") .packagesToScan("com.yfd.platform.env.fh.controller") .build(); } diff --git a/backend/src/main/java/com/yfd/platform/env/fh/controller/FhHabitatController.java b/backend/src/main/java/com/yfd/platform/env/fh/controller/FhHabitatController.java index e881489a..e33b271f 100644 --- a/backend/src/main/java/com/yfd/platform/env/fh/controller/FhHabitatController.java +++ b/backend/src/main/java/com/yfd/platform/env/fh/controller/FhHabitatController.java @@ -1,5 +1,6 @@ package com.yfd.platform.env.fh.controller; +import com.yfd.platform.common.DataSourceRequest; import com.yfd.platform.config.ResponseResult; import com.yfd.platform.env.fh.entity.ao.FhDefaultAo; import com.yfd.platform.env.fh.service.FhHabitatService; @@ -21,6 +22,18 @@ public class FhHabitatController { @Resource private FhHabitatService fhHabitatService; + @PostMapping("/GetKendoListCust") + @Operation(summary = "栖息地主列表") + public ResponseResult getKendoListCust(@RequestBody DataSourceRequest dataSourceRequest) { + return ResponseResult.successData(fhHabitatService.getKendoListCust(dataSourceRequest)); + } + + @PostMapping("/GetKendoListCustom") + @Operation(summary = "栖息地河段自动监测情况统计和二级页") + public ResponseResult getKendoListCustom(@RequestBody DataSourceRequest dataSourceRequest) { + return ResponseResult.successData(fhHabitatService.getKendoListCustom(dataSourceRequest)); + } + @PostMapping("/default/getFhList") @Operation(summary = "获取默认有数据的栖息地站点信息") public ResponseResult getDefaultFhList(@RequestBody FhDefaultAo fhDefaultAo) { diff --git a/backend/src/main/java/com/yfd/platform/env/fh/entity/vo/HabitatVo.java b/backend/src/main/java/com/yfd/platform/env/fh/entity/vo/HabitatVo.java new file mode 100644 index 00000000..876b478b --- /dev/null +++ b/backend/src/main/java/com/yfd/platform/env/fh/entity/vo/HabitatVo.java @@ -0,0 +1,114 @@ +package com.yfd.platform.env.fh.entity.vo; + +import io.swagger.v3.oas.annotations.media.Schema; +import lombok.Data; + +import java.math.BigDecimal; +import java.util.Date; + +@Data +@Schema(description = "栖息地河段自动监测情况") +public class HabitatVo { + + @Schema(description = "栖息地编码") + private String fhstcd; + + @Schema(description = "基地ID") + private String baseId; + + @Schema(description = "类型编码") + private String sttpCode; + + @Schema(description = "栖息地名称") + private String fhstnm; + + @Schema(description = "基地名称") + private String baseName; + + @Schema(description = "水电站名称") + private String ennm; + + @Schema(description = "基础对象编码") + private String stcd; + + @Schema(description = "电站编码") + private String rstcd; + + @Schema(description = "基础对象名称") + private String stnm; + + @Schema(description = "是否开展监测") + private Integer fhmonitor; + + @Schema(description = "建设阶段") + private Integer bldstt; + + @Schema(description = "保护对象") + private String qxdbhdx; + + @Schema(description = "保护范围") + private String qxdbhfw; + + @Schema(description = "保护长度") + private BigDecimal qxdbhcd; + + @Schema(description = "保护面积") + private BigDecimal qxdbhmj; + + @Schema(description = "保护河流") + private String bhhl; + + @Schema(description = "保护河段") + private String bhhd; + + @Schema(description = "保护措施") + private String bhcs; + + @Schema(description = "保护方式") + private String qxdbhfs; + + @Schema(description = "开工日期") + private Date ststdt; + + @Schema(description = "建成日期") + private Date esstdt; + + @Schema(description = "监测方式") + private Integer mway; + + @Schema(description = "是否接入") + private Integer dtin; + + @Schema(description = "数据来源") + private String vlsr; + + @Schema(description = "数据接入类型") + private Integer dtinType; + + @Schema(description = "是否启用") + private Integer enable; + + @Schema(description = "保护核心长度") + private BigDecimal qxdbhhxcd; + + @Schema(description = "保护外围长度") + private BigDecimal qxdbhwwcd; + + @Schema(description = "数据监测频次") + private Integer dtfrqcy; + + @Schema(description = "投资") + private BigDecimal qxdinv; + + @Schema(description = "基地排序") + private Integer baseStepSort; + + @Schema(description = "电站排序") + private Integer rstcdStepSort; + + @Schema(description = "站点排序") + private Integer siteStepSort; + + @Schema(description = "流域排序") + private Integer rvcdStepSort; +} diff --git a/backend/src/main/java/com/yfd/platform/env/fh/service/FhHabitatService.java b/backend/src/main/java/com/yfd/platform/env/fh/service/FhHabitatService.java index f4c287f8..2b6206c0 100644 --- a/backend/src/main/java/com/yfd/platform/env/fh/service/FhHabitatService.java +++ b/backend/src/main/java/com/yfd/platform/env/fh/service/FhHabitatService.java @@ -1,9 +1,16 @@ package com.yfd.platform.env.fh.service; +import com.yfd.platform.common.DataSourceRequest; +import com.yfd.platform.common.DataSourceResult; import com.yfd.platform.env.fh.entity.ao.FhDefaultAo; import com.yfd.platform.env.fh.entity.vo.FhDefaultVo; +import com.yfd.platform.env.fh.entity.vo.HabitatVo; public interface FhHabitatService { + DataSourceResult getKendoListCust(DataSourceRequest dataSourceRequest); + + DataSourceResult getKendoListCustom(DataSourceRequest dataSourceRequest); + FhDefaultVo getDefaultFhList(FhDefaultAo fhDefaultAo); } diff --git a/backend/src/main/java/com/yfd/platform/env/fh/service/impl/FhHabitatServiceImpl.java b/backend/src/main/java/com/yfd/platform/env/fh/service/impl/FhHabitatServiceImpl.java index 1d6e8198..9d49a571 100644 --- a/backend/src/main/java/com/yfd/platform/env/fh/service/impl/FhHabitatServiceImpl.java +++ b/backend/src/main/java/com/yfd/platform/env/fh/service/impl/FhHabitatServiceImpl.java @@ -2,18 +2,31 @@ package com.yfd.platform.env.fh.service.impl; import cn.hutool.core.bean.BeanUtil; import cn.hutool.core.bean.copier.CopyOptions; +import cn.hutool.core.collection.CollUtil; import cn.hutool.core.util.StrUtil; +import com.baomidou.mybatisplus.extension.plugins.pagination.Page; +import com.yfd.platform.common.DataSourceLoadOptionsBase; +import com.yfd.platform.common.DataSourceRequest; +import com.yfd.platform.common.DataSourceResult; +import com.yfd.platform.common.GroupHelper; +import com.yfd.platform.common.GroupingInfo; import com.yfd.platform.common.MicroservicDynamicSQLMapper; +import com.yfd.platform.common.PageInfo; import com.yfd.platform.env.fh.entity.ao.FhDefaultAo; import com.yfd.platform.env.fh.entity.vo.FhDefaultVo; +import com.yfd.platform.env.fh.entity.vo.HabitatVo; import com.yfd.platform.env.fh.service.FhHabitatService; +import com.yfd.platform.utils.QgcQueryWrapperUtil; import jakarta.annotation.Resource; import org.springframework.stereotype.Service; import java.util.ArrayList; +import java.util.Arrays; +import java.util.HashMap; import java.util.LinkedHashMap; import java.util.List; import java.util.Map; +import java.util.stream.Collectors; @Service public class FhHabitatServiceImpl implements FhHabitatService { @@ -21,6 +34,76 @@ public class FhHabitatServiceImpl implements FhHabitatService { @Resource private MicroservicDynamicSQLMapper microservicDynamicSQLMapper; + @Override + public DataSourceResult getKendoListCust(DataSourceRequest dataSourceRequest) { + DataSourceLoadOptionsBase loadOptions = dataSourceRequest.toDevRequest(); + StringBuilder sql = new StringBuilder(buildCustBaseSql()); + Map paramMap = new HashMap<>(); + appendCustFilterSql(sql, dataSourceRequest.getFilter(), paramMap); + + GroupingInfo[] groups = loadOptions.getGroup(); + if (groups != null && groups.length > 0) { + String groupSql = buildGroupSql(sql.toString(), groups); + List> groupRows = microservicDynamicSQLMapper.pageAllList(null, groupSql, paramMap); + DataSourceResult result = new DataSourceResult<>(); + if (Boolean.TRUE.equals(dataSourceRequest.getGroupResultFlat())) { + result.setData((List) (List) new GroupHelper().faltGroup(groupRows, Arrays.asList(groups))); + } else { + result.setData((List) (List) new GroupHelper().group(groupRows, Arrays.asList(groups))); + } + result.setTotal(0L); + result.setAggregates(new HashMap<>()); + return result; + } + + sql.append(buildCustOrderBySql(dataSourceRequest.getSort())); + PageInfo pageInfo = QgcQueryWrapperUtil.getPageInfo(loadOptions); + Page page = pageInfo.getHasPageInfo() ? pageInfo.getPage() : null; + List list = microservicDynamicSQLMapper.pageAllListWithResultType(page, sql.toString(), paramMap, HabitatVo.class); + + DataSourceResult result = new DataSourceResult<>(); + result.setData(list); + result.setTotal(page != null ? page.getTotal() : list.size()); + result.setAggregates(new HashMap<>()); + return result; + } + + @Override + public DataSourceResult getKendoListCustom(DataSourceRequest dataSourceRequest) { + DataSourceLoadOptionsBase loadOptions = dataSourceRequest.toDevRequest(); + StringBuilder sql = new StringBuilder(buildCustomBaseSql()); + Map paramMap = new HashMap<>(); + appendFilterSql(sql, dataSourceRequest.getFilter(), paramMap); + + GroupingInfo[] groups = loadOptions.getGroup(); + if (groups != null && groups.length > 0) { + String groupSql = buildGroupSql(sql.toString(), groups); + List> groupRows = microservicDynamicSQLMapper.pageAllList(null, groupSql, paramMap); + DataSourceResult result = new DataSourceResult<>(); + if (Boolean.TRUE.equals(dataSourceRequest.getGroupResultFlat())) { + result.setData((List) (List) new GroupHelper().faltGroup(groupRows, Arrays.asList(groups))); + } else { + result.setData((List) (List) new GroupHelper().group(groupRows, Arrays.asList(groups))); + } + result.setTotal(0L); + result.setAggregates(new HashMap<>()); + return result; + } + + sql.append(buildOrderBySql(dataSourceRequest.getSort())); + Page page = null; + if (QgcQueryWrapperUtil.getPageInfo(loadOptions).getHasPageInfo()) { + page = QgcQueryWrapperUtil.getPageInfo(loadOptions).getPage(); + } + + List list = microservicDynamicSQLMapper.pageAllListWithResultType(page, sql.toString(), paramMap, HabitatVo.class); + DataSourceResult result = new DataSourceResult<>(); + result.setData(list); + result.setTotal(page != null ? page.getTotal() : list.size()); + result.setAggregates(new HashMap<>()); + return result; + } + @Override public FhDefaultVo getDefaultFhList(FhDefaultAo fhDefaultAo) { Map paramMap = new LinkedHashMap<>(); @@ -146,4 +229,668 @@ public class FhHabitatServiceImpl implements FhHabitatService { sql.append("ORDER BY t.fhstcd, t.sttpCode, t.dataStatus DESC"); return sql.toString(); } + + private String buildCustomBaseSql() { + return "SELECT fh.STCD AS fhstcd, " + + " NVL(fh.BASE_ID, eng.BASE_ID) AS baseId, " + + " 'FH' AS sttpCode, " + + " fh.STNM AS fhstnm, " + + " hb.BASENAME AS baseName, " + + " eng.ENNM AS ennm, " + + " fh.STCD AS stcd, " + + " fh.RSTCD AS rstcd, " + + " fh.STNM AS stnm, " + + " CASE WHEN monitor.FHSTCD IS NULL THEN 0 ELSE 1 END AS fhmonitor, " + + " fh.BLPRD AS bldstt, " + + " fh.BHDX AS qxdbhdx, " + + " fh.BHFW AS qxdbhfw, " + + " fh.BHCD AS qxdbhcd, " + + " fh.BHMJ AS qxdbhmj, " + + " fh.BHHL AS bhhl, " + + " fh.BHHD AS bhhd, " + + " fh.BHCS AS bhcs, " + + " fh.BHFS AS qxdbhfs, " + + " fh.ATTM AS ststdt, " + + " fh.ATTM AS esstdt, " + + " CAST(NULL AS NUMBER(10)) AS mway, " + + " fh.DTIN AS dtin, " + + " fh.VLSR AS vlsr, " + + " CAST(NULL AS NUMBER(10)) AS dtinType, " + + " fh.USFL AS enable, " + + " fh.BHHXCD AS qxdbhhxcd, " + + " fh.BHWWCD AS qxdbhwwcd, " + + " fh.DTFRQCY AS dtfrqcy, " + + " fh.INV AS qxdinv, " + + " hb.ORDER_INDEX AS baseStepSort, " + + " rstAlong.SORT AS rstcdStepSort, " + + " fh.ORDER_INDEX AS siteStepSort, " + + " along.ORDER_INDEX AS rvcdStepSort " + + "FROM SD_FHBT_B_H fh " + + "LEFT JOIN SD_ENGINFO_B_H eng ON eng.STCD = fh.RSTCD " + + "LEFT JOIN SD_HYDROBASE hb ON hb.BASEID = NVL(fh.BASE_ID, eng.BASE_ID) " + + "LEFT JOIN MS_ALONG_B along ON along.RVCD = NVL(fh.HBRVCD, eng.HBRVCD) AND along.CODE = 'common' AND NVL(along.IS_DELETED, 0) = 0 " + + "LEFT JOIN ( " + + " SELECT det.SORT, a.RVCD, det.STCD " + + " FROM MS_ALONGDET_B det " + + " INNER JOIN MS_ALONG_B a ON a.ID = det.ALONG_ID " + + " WHERE NVL(det.IS_DELETED, 0) = 0 " + + " AND NVL(a.IS_DELETED, 0) = 0 " + + " AND a.CODE = 'common' " + + ") rstAlong ON rstAlong.RVCD = NVL(fh.HBRVCD, eng.HBRVCD) AND rstAlong.STCD = fh.RSTCD " + + "LEFT JOIN ( " + + " SELECT DISTINCT FHSTCD " + + " FROM ( " + + " SELECT FHSTCD FROM SD_RIVER_B_H WHERE STTP = 'ZQ' AND NVL(IS_DELETED, 0) = 0 AND FHSTCD IS NOT NULL " + + " UNION ALL " + + " SELECT FHSTCD FROM SD_WT_B_H WHERE STTP = 'WTRV' AND NVL(IS_DELETED, 0) = 0 AND FHSTCD IS NOT NULL " + + " UNION ALL " + + " SELECT FHSTCD FROM SD_WQ_B_H WHERE NVL(IS_DELETED, 0) = 0 AND FHSTCD IS NOT NULL " + + " ) t " + + ") monitor ON monitor.FHSTCD = fh.STCD " + + "WHERE NVL(fh.IS_DELETED, 0) = 0 "; + } + + private String buildCustBaseSql() { + String monitorSql = buildCustMonitorSql(); + return "SELECT t.FHSTCD AS fhstcd, " + + " t.BASE_ID AS baseId, " + + " t.STTP_CODE AS sttpCode, " + + " t.FHSTNM AS fhstnm, " + + " t.BASE_NAME AS baseName, " + + " t.ENNM AS ennm, " + + " t.STCD AS stcd, " + + " t.RSTCD AS rstcd, " + + " t.STNM AS stnm, " + + " t.FHMONITOR AS fhmonitor, " + + " t.BLDSTT AS bldstt, " + + " t.QXDBHDX AS qxdbhdx, " + + " t.QXDBHFW AS qxdbhfw, " + + " t.QXDBHCD AS qxdbhcd, " + + " t.QXDBHMJ AS qxdbhmj, " + + " t.BHHL AS bhhl, " + + " t.BHHD AS bhhd, " + + " t.BHCS AS bhcs, " + + " t.QXDBHFS AS qxdbhfs, " + + " t.STSTDT AS ststdt, " + + " t.ESSTDT AS esstdt, " + + " t.MWAY AS mway, " + + " t.DTIN AS dtin, " + + " t.VLSR AS vlsr, " + + " t.DTIN_TYPE AS dtinType, " + + " t.ENABLE AS enable, " + + " t.QXDBHHXCD AS qxdbhhxcd, " + + " t.QXDBHWWCD AS qxdbhwwcd, " + + " t.DTFRQCY AS dtfrqcy, " + + " t.QXDINV AS qxdinv, " + + " t.BASESTEPSORT AS baseStepSort, " + + " t.RSTCDSTEPSORT AS rstcdStepSort, " + + " t.SITESTEPSORT AS siteStepSort, " + + " t.RVCDSTEPSORT AS rvcdStepSort " + + "FROM ( " + + " SELECT child.STCD AS STCD, " + + " child.STNM AS STNM, " + + " fh.STNM AS FHSTNM, " + + " child.RSTCD AS RSTCD, " + + " fh.STCD AS FHSTCD, " + + " NVL(child.BASE_ID, fh.BASE_ID) AS BASE_ID, " + + " NVL(child.BASE_NAME, fhBase.BASENAME) AS BASE_NAME, " + + " NVL(child.BASESTEPSORT, fhBase.ORDER_INDEX) AS BASESTEPSORT, " + + " child.ENNM AS ENNM, " + + " child.BLDSTT AS BLDSTT, " + + " child.ESSTDT AS ESSTDT, " + + " fh.BHDX AS QXDBHDX, " + + " fh.BHFW AS QXDBHFW, " + + " fh.BHCD AS QXDBHCD, " + + " fh.BHMJ AS QXDBHMJ, " + + " fh.BHHL AS BHHL, " + + " fh.BHHD AS BHHD, " + + " fh.BHCS AS BHCS, " + + " fh.BHFS AS QXDBHFS, " + + " NVL(child.STSTDT, fh.ATTM) AS STSTDT, " + + " child.MWAY AS MWAY, " + + " child.DTIN AS DTIN, " + + " child.VLSR AS VLSR, " + + " child.DTIN_TYPE AS DTIN_TYPE, " + + " child.ENABLE AS ENABLE, " + + " fh.BHHXCD AS QXDBHHXCD, " + + " fh.BHWWCD AS QXDBHWWCD, " + + " fh.DTFRQCY AS DTFRQCY, " + + " fh.INV AS QXDINV, " + + " child.RSTCDSTEPSORT AS RSTCDSTEPSORT, " + + " child.SITESTEPSORT AS SITESTEPSORT, " + + " child.RVCDSTEPSORT AS RVCDSTEPSORT, " + + " child.STTP_CODE AS STTP_CODE, " + + " 1 AS FHMONITOR " + + " FROM SD_FHBT_B_H fh " + + " LEFT JOIN SD_HYDROBASE fhBase ON fhBase.BASEID = fh.BASE_ID " + + " INNER JOIN ( " + monitorSql + " ) child ON child.FHSTCD = fh.STCD " + + " WHERE NVL(fh.IS_DELETED, 0) = 0 " + + " AND NVL(fh.BASE_ID, 'other') <> 'other' " + + " UNION ALL " + + " SELECT fh.STCD AS STCD, " + + " fh.STNM AS STNM, " + + " fh.STNM AS FHSTNM, " + + " fh.RSTCD AS RSTCD, " + + " fh.STCD AS FHSTCD, " + + " NVL(fh.BASE_ID, eng.BASE_ID) AS BASE_ID, " + + " hb.BASENAME AS BASE_NAME, " + + " hb.ORDER_INDEX AS BASESTEPSORT, " + + " eng.ENNM AS ENNM, " + + " fh.BLPRD AS BLDSTT, " + + " fh.ATTM AS ESSTDT, " + + " fh.BHDX AS QXDBHDX, " + + " fh.BHFW AS QXDBHFW, " + + " fh.BHCD AS QXDBHCD, " + + " fh.BHMJ AS QXDBHMJ, " + + " fh.BHHL AS BHHL, " + + " fh.BHHD AS BHHD, " + + " fh.BHCS AS BHCS, " + + " fh.BHFS AS QXDBHFS, " + + " fh.ATTM AS STSTDT, " + + " CAST(NULL AS NUMBER(10)) AS MWAY, " + + " fh.DTIN AS DTIN, " + + " fh.VLSR AS VLSR, " + + " CAST(NULL AS NUMBER(10)) AS DTIN_TYPE, " + + " fh.USFL AS ENABLE, " + + " fh.BHHXCD AS QXDBHHXCD, " + + " fh.BHWWCD AS QXDBHWWCD, " + + " fh.DTFRQCY AS DTFRQCY, " + + " fh.INV AS QXDINV, " + + " rstAlong.SORT AS RSTCDSTEPSORT, " + + " fh.ORDER_INDEX AS SITESTEPSORT, " + + " along.ORDER_INDEX AS RVCDSTEPSORT, " + + " 'FH' AS STTP_CODE, " + + " 0 AS FHMONITOR " + + " FROM SD_FHBT_B_H fh " + + " LEFT JOIN SD_ENGINFO_B_H eng ON eng.STCD = fh.RSTCD " + + " LEFT JOIN SD_HYDROBASE hb ON hb.BASEID = NVL(fh.BASE_ID, eng.BASE_ID) " + + " LEFT JOIN MS_ALONG_B along ON along.RVCD = NVL(fh.HBRVCD, eng.HBRVCD) " + + " AND along.CODE = 'common' " + + " AND NVL(along.IS_DELETED, 0) = 0 " + + " LEFT JOIN ( " + + " SELECT det.SORT, a.RVCD, det.STCD " + + " FROM MS_ALONGDET_B det " + + " INNER JOIN MS_ALONG_B a ON a.ID = det.ALONG_ID " + + " WHERE NVL(det.IS_DELETED, 0) = 0 " + + " AND NVL(a.IS_DELETED, 0) = 0 " + + " AND a.CODE = 'common' " + + " ) rstAlong ON rstAlong.RVCD = NVL(fh.HBRVCD, eng.HBRVCD) AND rstAlong.STCD = fh.RSTCD " + + " WHERE NVL(fh.IS_DELETED, 0) = 0 " + + " AND NVL(fh.BASE_ID, 'other') <> 'other' " + + " AND NOT EXISTS ( " + + " SELECT 1 FROM ( " + monitorSql + " ) child WHERE child.FHSTCD = fh.STCD " + + " ) " + + ") t WHERE 1 = 1 "; + } + + private String buildCustMonitorSql() { + String alongSql = " LEFT JOIN MS_ALONG_B along ON along.RVCD = eng.HBRVCD " + + " AND along.CODE = 'common' " + + " AND NVL(along.IS_DELETED, 0) = 0 " + + " LEFT JOIN ( " + + " SELECT det.SORT, a.RVCD, det.STCD " + + " FROM MS_ALONGDET_B det " + + " INNER JOIN MS_ALONG_B a ON a.ID = det.ALONG_ID " + + " WHERE NVL(det.IS_DELETED, 0) = 0 " + + " AND NVL(a.IS_DELETED, 0) = 0 " + + " AND a.CODE = 'common' " + + " ) rstAlong ON rstAlong.RVCD = eng.HBRVCD AND rstAlong.STCD = childBase.RSTCD "; + return "SELECT childBase.STCD, " + + " childBase.STNM, " + + " childBase.FHSTCD, " + + " childBase.RSTCD, " + + " eng.BASE_ID, " + + " hb.BASENAME AS BASE_NAME, " + + " hb.ORDER_INDEX AS BASESTEPSORT, " + + " eng.ENNM, " + + " childBase.BLDSTT, " + + " childBase.ESSTDT, " + + " eng.PSTSTDT AS STSTDT, " + + " childBase.MWAY, " + + " childBase.DTIN, " + + " childBase.VLSR, " + + " childBase.DTIN_TYPE, " + + " childBase.ENABLE, " + + " rstAlong.SORT AS RSTCDSTEPSORT, " + + " childBase.SITESTEPSORT, " + + " along.ORDER_INDEX AS RVCDSTEPSORT, " + + " childBase.STTP_CODE " + + " FROM ( " + + " SELECT wt.STCD, wt.STNM, wt.FHSTCD, wt.RSTCD, wt.BLDSTT_CODE AS BLDSTT, wt.JCDT AS ESSTDT, " + + " wt.MWAY, wt.DTIN, wt.VLSR, wt.DTIN_TYPE, wt.USFL AS ENABLE, wt.ORDER_INDEX AS SITESTEPSORT, " + + " 'WTRV' AS STTP_CODE " + + " FROM SD_WT_B_H wt " + + " WHERE NVL(wt.IS_DELETED, 0) = 0 " + + " AND wt.STTP = 'WTRV' " + + " AND wt.FHSTCD IS NOT NULL " + + " UNION ALL " + + " SELECT river.STCD, river.STNM, river.FHSTCD, river.RSTCD, river.BLDSTT_CODE AS BLDSTT, river.JCDT AS ESSTDT, " + + " river.MWAY, river.DTIN, river.VLSR, river.DTIN_TYPE, river.USFL AS ENABLE, river.ORDER_INDEX AS SITESTEPSORT, " + + " 'ZQ' AS STTP_CODE " + + " FROM SD_RIVER_B_H river " + + " WHERE NVL(river.IS_DELETED, 0) = 0 " + + " AND river.STTP = 'ZQ' " + + " AND river.FHSTCD IS NOT NULL " + + " UNION ALL " + + " SELECT wq.STCD, wq.STNM, wq.FHSTCD, wq.RSTCD, wq.BLDSTT_CODE AS BLDSTT, wq.JCDT AS ESSTDT, " + + " wq.MWAY, wq.DTIN, wq.VLSR, wq.DTIN_TYPE, wq.USFL AS ENABLE, wq.ORDER_INDEX AS SITESTEPSORT, " + + " 'WQ' AS STTP_CODE " + + " FROM SD_WQ_B_H wq " + + " WHERE NVL(wq.IS_DELETED, 0) = 0 " + + " AND wq.FHSTCD IS NOT NULL " + + " ) childBase " + + " LEFT JOIN SD_ENGINFO_B_H eng ON eng.STCD = childBase.RSTCD " + + " LEFT JOIN SD_HYDROBASE hb ON hb.BASEID = eng.BASE_ID " + + alongSql; + } + + private void appendCustFilterSql(StringBuilder sql, + DataSourceRequest.FilterDescriptor filter, + Map paramMap) { + if (filter == null) { + return; + } + String condition = buildCustFilterCondition(filter, paramMap, new int[]{0}); + if (StrUtil.isNotBlank(condition)) { + sql.append(" AND ").append(condition); + } + } + + private String buildCustFilterCondition(DataSourceRequest.FilterDescriptor filter, + Map paramMap, + int[] indexHolder) { + if (filter == null) { + return ""; + } + if (StrUtil.isNotBlank(filter.getField())) { + return buildCustLeafCondition(filter, paramMap, indexHolder); + } + if (CollUtil.isEmpty(filter.getFilters())) { + return ""; + } + List conditions = new ArrayList<>(); + for (DataSourceRequest.FilterDescriptor child : filter.getFilters()) { + String childCondition = buildCustFilterCondition(child, paramMap, indexHolder); + if (StrUtil.isNotBlank(childCondition)) { + conditions.add("(" + childCondition + ")"); + } + } + if (conditions.isEmpty()) { + return ""; + } + String logic = StrUtil.blankToDefault(filter.getLogic(), "and").trim().toUpperCase(); + return String.join(" " + logic + " ", conditions); + } + + private String buildCustLeafCondition(DataSourceRequest.FilterDescriptor filter, + Map paramMap, + int[] indexHolder) { + String column = mapCustFilterColumn(filter.getField()); + if (column == null) { + return ""; + } + String operator = StrUtil.blankToDefault(filter.getOperator(), "eq").toLowerCase(); + Object value = filter.getValue(); + if ("isnull".equals(operator)) { + return column + " IS NULL"; + } + if ("isnotnull".equals(operator)) { + return column + " IS NOT NULL"; + } + if ("doesnotcontain".equals(operator)) { + String paramKey = "p" + indexHolder[0]++; + paramMap.put(paramKey, "%" + value + "%"); + return "(" + column + " IS NULL OR " + column + " NOT LIKE #{map." + paramKey + "})"; + } + if ("in".equals(operator) || "ni".equals(operator)) { + List values = normalizeFilterValues(value); + if (values.isEmpty()) { + return ""; + } + List placeholders = new ArrayList<>(); + for (Object item : values) { + String paramKey = "p" + indexHolder[0]++; + paramMap.put(paramKey, item); + placeholders.add("#{map." + paramKey + "}"); + } + String inSql = column + " IN (" + String.join(", ", placeholders) + ")"; + return "ni".equals(operator) ? "NOT (" + inSql + ")" : inSql; + } + + String paramKey = "p" + indexHolder[0]++; + switch (operator) { + case "eq": + paramMap.put(paramKey, value); + return column + " = #{map." + paramKey + "}"; + case "neq": + paramMap.put(paramKey, value); + return column + " <> #{map." + paramKey + "}"; + case "gt": + paramMap.put(paramKey, value); + return column + " > #{map." + paramKey + "}"; + case "gte": + paramMap.put(paramKey, value); + return column + " >= #{map." + paramKey + "}"; + case "lt": + paramMap.put(paramKey, value); + return column + " < #{map." + paramKey + "}"; + case "lte": + paramMap.put(paramKey, value); + return column + " <= #{map." + paramKey + "}"; + case "contains": + paramMap.put(paramKey, "%" + value + "%"); + return column + " LIKE #{map." + paramKey + "}"; + case "startswith": + paramMap.put(paramKey, value + "%"); + return column + " LIKE #{map." + paramKey + "}"; + case "endswith": + paramMap.put(paramKey, "%" + value); + return column + " LIKE #{map." + paramKey + "}"; + default: + return ""; + } + } + + private List normalizeFilterValues(Object value) { + if (value == null) { + return new ArrayList<>(); + } + if (value instanceof List list) { + return new ArrayList<>(list); + } + String valueStr = String.valueOf(value).trim(); + if (StrUtil.isBlank(valueStr)) { + return new ArrayList<>(); + } + if (valueStr.startsWith("[") && valueStr.endsWith("]")) { + valueStr = valueStr.substring(1, valueStr.length() - 1); + } + List values = new ArrayList<>(); + for (String item : valueStr.split(",")) { + String trimmed = StrUtil.trim(item); + if (StrUtil.isBlank(trimmed)) { + continue; + } + values.add(StrUtil.removeAll(trimmed, "\"")); + + } + return values; + } + + private String mapCustFilterColumn(String field) { + Map columnMap = new HashMap<>(); + columnMap.put("fhstcd", "t.FHSTCD"); + columnMap.put("stcd", "t.STCD"); + columnMap.put("stnm", "t.STNM"); + columnMap.put("sttpCode", "t.STTP_CODE"); + columnMap.put("baseId", "t.BASE_ID"); + columnMap.put("fhstnm", "t.FHSTNM"); + columnMap.put("baseName", "t.BASE_NAME"); + columnMap.put("ennm", "t.ENNM"); + columnMap.put("bldstt", "t.BLDSTT"); + columnMap.put("esstdt", "t.ESSTDT"); + columnMap.put("qxdbhdx", "t.QXDBHDX"); + columnMap.put("qxdbhfw", "t.QXDBHFW"); + columnMap.put("qxdbhcd", "t.QXDBHCD"); + columnMap.put("qxdbhmj", "t.QXDBHMJ"); + columnMap.put("bhhl", "t.BHHL"); + columnMap.put("bhhd", "t.BHHD"); + columnMap.put("bhcs", "t.BHCS"); + columnMap.put("qxdbhfs", "t.QXDBHFS"); + columnMap.put("ststdt", "t.STSTDT"); + columnMap.put("mway", "t.MWAY"); + columnMap.put("dtin", "t.DTIN"); + columnMap.put("vlsr", "t.VLSR"); + columnMap.put("dtinType", "t.DTIN_TYPE"); + columnMap.put("enable", "t.ENABLE"); + columnMap.put("qxdbhhxcd", "t.QXDBHHXCD"); + columnMap.put("qxdbhwwcd", "t.QXDBHWWCD"); + columnMap.put("dtfrqcy", "t.DTFRQCY"); + columnMap.put("qxdinv", "t.QXDINV"); + columnMap.put("fhmonitor", "t.FHMONITOR"); + columnMap.put("rstcdStepSort", "t.RSTCDSTEPSORT"); + columnMap.put("siteStepSort", "t.SITESTEPSORT"); + columnMap.put("rstcd", "t.RSTCD"); + columnMap.put("rvcdStepSort", "t.RVCDSTEPSORT"); + columnMap.put("baseStepSort", "t.BASESTEPSORT"); + return columnMap.get(field); + } + + private String buildCustOrderBySql(List sorts) { + if (CollUtil.isEmpty(sorts)) { + return " ORDER BY t.BASESTEPSORT ASC, t.RVCDSTEPSORT ASC, t.RSTCDSTEPSORT ASC, t.SITESTEPSORT ASC, t.STCD ASC"; + } + Map sortMap = new HashMap<>(); + sortMap.put("fhstcd", "t.FHSTCD"); + sortMap.put("stcd", "t.STCD"); + sortMap.put("stnm", "t.STNM"); + sortMap.put("sttpCode", "t.STTP_CODE"); + sortMap.put("baseId", "t.BASE_ID"); + sortMap.put("fhstnm", "t.FHSTNM"); + sortMap.put("baseName", "t.BASE_NAME"); + sortMap.put("ennm", "t.ENNM"); + sortMap.put("bldstt", "t.BLDSTT"); + sortMap.put("esstdt", "t.ESSTDT"); + sortMap.put("ststdt", "t.STSTDT"); + sortMap.put("mway", "t.MWAY"); + sortMap.put("dtin", "t.DTIN"); + sortMap.put("vlsr", "t.VLSR"); + sortMap.put("dtinType", "t.DTIN_TYPE"); + sortMap.put("enable", "t.ENABLE"); + sortMap.put("fhmonitor", "t.FHMONITOR"); + sortMap.put("dtfrqcy", "t.DTFRQCY"); + sortMap.put("qxdinv", "t.QXDINV"); + sortMap.put("rstcdStepSort", "t.RSTCDSTEPSORT"); + sortMap.put("siteStepSort", "t.SITESTEPSORT"); + sortMap.put("rstcd", "t.RSTCD"); + sortMap.put("rvcdStepSort", "t.RVCDSTEPSORT"); + sortMap.put("baseStepSort", "t.BASESTEPSORT"); + List orderItems = new ArrayList<>(); + for (DataSourceRequest.SortDescriptor sort : sorts) { + if (sort == null || !Boolean.TRUE.equals(sort.getNeedSortFlag())) { + continue; + } + String column = sortMap.get(sort.getField()); + if (column == null) { + continue; + } + String direction = "desc".equalsIgnoreCase(sort.getDir()) ? "DESC" : "ASC"; + orderItems.add(column + " " + direction); + } + if (orderItems.isEmpty()) { + return " ORDER BY t.BASESTEPSORT ASC, t.RVCDSTEPSORT ASC, t.RSTCDSTEPSORT ASC, t.SITESTEPSORT ASC, t.STCD ASC"; + } + return " ORDER BY " + String.join(", ", orderItems); + } + + private void appendFilterSql(StringBuilder sql, + DataSourceRequest.FilterDescriptor filter, + Map paramMap) { + if (filter == null) { + return; + } + String condition = buildFilterCondition(filter, paramMap, new int[]{0}); + if (StrUtil.isNotBlank(condition)) { + sql.append(" AND ").append(condition); + } + } + + private String buildFilterCondition(DataSourceRequest.FilterDescriptor filter, + Map paramMap, + int[] indexHolder) { + if (filter == null) { + return ""; + } + if (StrUtil.isNotBlank(filter.getField())) { + return buildLeafCondition(filter, paramMap, indexHolder); + } + if (CollUtil.isEmpty(filter.getFilters())) { + return ""; + } + List conditions = new ArrayList<>(); + for (DataSourceRequest.FilterDescriptor child : filter.getFilters()) { + String childCondition = buildFilterCondition(child, paramMap, indexHolder); + if (StrUtil.isNotBlank(childCondition)) { + conditions.add("(" + childCondition + ")"); + } + } + if (conditions.isEmpty()) { + return ""; + } + String logic = StrUtil.blankToDefault(filter.getLogic(), "and").trim().toUpperCase(); + return String.join(" " + logic + " ", conditions); + } + + private String buildLeafCondition(DataSourceRequest.FilterDescriptor filter, + Map paramMap, + int[] indexHolder) { + String column = mapFilterColumn(filter.getField()); + if (column == null) { + return ""; + } + String operator = StrUtil.blankToDefault(filter.getOperator(), "eq").toLowerCase(); + Object value = filter.getValue(); + String paramKey = "p" + indexHolder[0]++; + switch (operator) { + case "eq": + paramMap.put(paramKey, value); + return column + " = #{map." + paramKey + "}"; + case "neq": + paramMap.put(paramKey, value); + return column + " <> #{map." + paramKey + "}"; + case "gt": + paramMap.put(paramKey, value); + return column + " > #{map." + paramKey + "}"; + case "gte": + paramMap.put(paramKey, value); + return column + " >= #{map." + paramKey + "}"; + case "lt": + paramMap.put(paramKey, value); + return column + " < #{map." + paramKey + "}"; + case "lte": + paramMap.put(paramKey, value); + return column + " <= #{map." + paramKey + "}"; + case "contains": + paramMap.put(paramKey, "%" + value + "%"); + return column + " LIKE #{map." + paramKey + "}"; + case "startswith": + paramMap.put(paramKey, value + "%"); + return column + " LIKE #{map." + paramKey + "}"; + case "endswith": + paramMap.put(paramKey, "%" + value); + return column + " LIKE #{map." + paramKey + "}"; + case "isnull": + return column + " IS NULL"; + case "isnotnull": + return column + " IS NOT NULL"; + default: + return ""; + } + } + + private String mapFilterColumn(String field) { + Map columnMap = new HashMap<>(); + columnMap.put("fhstcd", "fh.STCD"); + columnMap.put("baseId", "NVL(fh.BASE_ID, eng.BASE_ID)"); + columnMap.put("sttpCode", "'FH'"); + columnMap.put("fhstnm", "fh.STNM"); + columnMap.put("baseName", "hb.BASENAME"); + columnMap.put("ennm", "eng.ENNM"); + columnMap.put("stcd", "fh.STCD"); + columnMap.put("rstcd", "fh.RSTCD"); + columnMap.put("stnm", "fh.STNM"); + columnMap.put("fhmonitor", "CASE WHEN monitor.FHSTCD IS NULL THEN 0 ELSE 1 END"); + columnMap.put("bldstt", "fh.BLPRD"); + columnMap.put("qxdbhdx", "fh.BHDX"); + columnMap.put("qxdbhfw", "fh.BHFW"); + columnMap.put("qxdbhcd", "fh.BHCD"); + columnMap.put("qxdbhmj", "fh.BHMJ"); + columnMap.put("bhhl", "fh.BHHL"); + columnMap.put("bhhd", "fh.BHHD"); + columnMap.put("bhcs", "fh.BHCS"); + columnMap.put("qxdbhfs", "fh.BHFS"); + columnMap.put("ststdt", "fh.ATTM"); + columnMap.put("esstdt", "fh.ATTM"); + columnMap.put("dtin", "fh.DTIN"); + columnMap.put("vlsr", "fh.VLSR"); + columnMap.put("enable", "fh.USFL"); + columnMap.put("qxdbhhxcd", "fh.BHHXCD"); + columnMap.put("qxdbhwwcd", "fh.BHWWCD"); + columnMap.put("dtfrqcy", "fh.DTFRQCY"); + columnMap.put("qxdinv", "fh.INV"); + columnMap.put("baseStepSort", "hb.ORDER_INDEX"); + columnMap.put("rstcdStepSort", "rstAlong.SORT"); + columnMap.put("siteStepSort", "fh.ORDER_INDEX"); + columnMap.put("rvcdStepSort", "along.ORDER_INDEX"); + return columnMap.get(field); + } + + private String buildOrderBySql(List sorts) { + if (CollUtil.isEmpty(sorts)) { + return " ORDER BY hb.ORDER_INDEX ASC, along.ORDER_INDEX ASC, rstAlong.SORT ASC, fh.ORDER_INDEX ASC, fh.STCD ASC"; + } + Map sortMap = new HashMap<>(); + sortMap.put("fhstcd", "fh.STCD"); + sortMap.put("baseId", "NVL(fh.BASE_ID, eng.BASE_ID)"); + sortMap.put("sttpCode", "'FH'"); + sortMap.put("fhstnm", "fh.STNM"); + sortMap.put("baseName", "hb.BASENAME"); + sortMap.put("ennm", "eng.ENNM"); + sortMap.put("stcd", "fh.STCD"); + sortMap.put("rstcd", "fh.RSTCD"); + sortMap.put("stnm", "fh.STNM"); + sortMap.put("fhmonitor", "CASE WHEN monitor.FHSTCD IS NULL THEN 0 ELSE 1 END"); + sortMap.put("bldstt", "fh.BLPRD"); + sortMap.put("ststdt", "fh.ATTM"); + sortMap.put("esstdt", "fh.ATTM"); + sortMap.put("dtin", "fh.DTIN"); + sortMap.put("enable", "fh.USFL"); + sortMap.put("dtfrqcy", "fh.DTFRQCY"); + sortMap.put("qxdinv", "fh.INV"); + sortMap.put("baseStepSort", "hb.ORDER_INDEX"); + sortMap.put("rstcdStepSort", "rstAlong.SORT"); + sortMap.put("siteStepSort", "fh.ORDER_INDEX"); + sortMap.put("rvcdStepSort", "along.ORDER_INDEX"); + List orderItems = new ArrayList<>(); + for (DataSourceRequest.SortDescriptor sort : sorts) { + if (sort == null || !Boolean.TRUE.equals(sort.getNeedSortFlag())) { + continue; + } + String column = sortMap.get(sort.getField()); + if (column == null) { + continue; + } + String direction = "desc".equalsIgnoreCase(sort.getDir()) ? "DESC" : "ASC"; + orderItems.add(column + " " + direction); + } + if (orderItems.isEmpty()) { + return " ORDER BY hb.ORDER_INDEX ASC, along.ORDER_INDEX ASC, rstAlong.SORT ASC, fh.ORDER_INDEX ASC, fh.STCD ASC"; + } + return " ORDER BY " + String.join(", ", orderItems); + } + + private String buildGroupSql(String baseSql, GroupingInfo[] groups) { + List fields = Arrays.stream(groups) + .map(GroupingInfo::getSelector) + .filter(StrUtil::isNotBlank) + .collect(Collectors.toList()); + StringBuilder sql = new StringBuilder("SELECT "); + for (int i = 0; i < fields.size(); i++) { + if (i > 0) { + sql.append(", "); + } + sql.append(fields.get(i)); + } + for (String field : fields) { + sql.append(", COUNT(*) AS count_").append(field); + } + sql.append(" FROM (").append(baseSql).append(") T GROUP BY "); + for (int i = 0; i < fields.size(); i++) { + if (i > 0) { + sql.append(", "); + } + sql.append(fields.get(i)); + } + return sql.toString(); + } } From 7999f88e33781a44a1cf52e3555f8b8291accfc6 Mon Sep 17 00:00:00 2001 From: tangwei Date: Tue, 26 May 2026 17:01:04 +0800 Subject: [PATCH 09/41] =?UTF-8?q?feat:=20=E5=A2=9E=E5=8A=A0=E8=BF=87?= =?UTF-8?q?=E9=B1=BC=E8=AE=BE=E6=96=BD=E5=BB=BA=E8=AE=BE=E5=8F=8A=E6=8E=A5?= =?UTF-8?q?=E5=85=A5=E6=83=85=E5=86=B5=E7=BB=9F=E8=AE=A1?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- ...roller.java => FishPassageController.java} | 17 ++++-- .../entity/vo/FpConstructionSituationVo.java | 30 +++++++++++ .../env/fp/service/FpBuildService.java | 10 ++++ .../fp/service/impl/FpBuildServiceImpl.java | 54 +++++++++++++++++++ 4 files changed, 108 insertions(+), 3 deletions(-) rename backend/src/main/java/com/yfd/platform/env/fp/controller/{FpRunController.java => FishPassageController.java} (67%) create mode 100644 backend/src/main/java/com/yfd/platform/env/fp/entity/vo/FpConstructionSituationVo.java create mode 100644 backend/src/main/java/com/yfd/platform/env/fp/service/FpBuildService.java create mode 100644 backend/src/main/java/com/yfd/platform/env/fp/service/impl/FpBuildServiceImpl.java diff --git a/backend/src/main/java/com/yfd/platform/env/fp/controller/FpRunController.java b/backend/src/main/java/com/yfd/platform/env/fp/controller/FishPassageController.java similarity index 67% rename from backend/src/main/java/com/yfd/platform/env/fp/controller/FpRunController.java rename to backend/src/main/java/com/yfd/platform/env/fp/controller/FishPassageController.java index fbcc43cf..e562d6f8 100644 --- a/backend/src/main/java/com/yfd/platform/env/fp/controller/FpRunController.java +++ b/backend/src/main/java/com/yfd/platform/env/fp/controller/FishPassageController.java @@ -2,6 +2,7 @@ package com.yfd.platform.env.fp.controller; import com.yfd.platform.common.DataSourceRequest; import com.yfd.platform.config.ResponseResult; +import com.yfd.platform.env.fp.service.FpBuildService; import com.yfd.platform.env.fp.service.FpRunService; import io.swagger.v3.oas.annotations.Operation; import io.swagger.v3.oas.annotations.tags.Tag; @@ -13,17 +14,27 @@ import org.springframework.web.bind.annotation.RequestMapping; import org.springframework.web.bind.annotation.RestController; @RestController -@RequestMapping("/fp/run") +@RequestMapping("/fp") @Tag(name = "过鱼设施建设及运行情况") @Validated -public class FpRunController { +public class FishPassageController { @Resource private FpRunService fpRunService; - @PostMapping("/secondPlan/qgc/GetKendoListCust") + + @Resource + private FpBuildService fpBuildService; + + @PostMapping("/run/secondPlan/qgc/GetKendoListCust") @Operation(summary = "环保部-建设及运行运行情况(二级级页面 已建设施运行情况-计划接口)") public ResponseResult getQgcSecondPlanKendoListCust(@RequestBody DataSourceRequest dataSourceRequest) { return ResponseResult.successData(fpRunService.processQgcSecondPlanKendoList(dataSourceRequest)); } + + @PostMapping("/build/GetKendoListCust") + @Operation(summary = "过鱼设施建设及接入情况统计") + public ResponseResult getKendoListCust(@RequestBody DataSourceRequest dataSourceRequest) { + return ResponseResult.successData(fpBuildService.processKendoList(dataSourceRequest)); + } } diff --git a/backend/src/main/java/com/yfd/platform/env/fp/entity/vo/FpConstructionSituationVo.java b/backend/src/main/java/com/yfd/platform/env/fp/entity/vo/FpConstructionSituationVo.java new file mode 100644 index 00000000..5f86411a --- /dev/null +++ b/backend/src/main/java/com/yfd/platform/env/fp/entity/vo/FpConstructionSituationVo.java @@ -0,0 +1,30 @@ +package com.yfd.platform.env.fp.entity.vo; + +import io.swagger.v3.oas.annotations.media.Schema; +import lombok.Data; + +@Data +@Schema(description = "过鱼设施建设及接入情况") +public class FpConstructionSituationVo { + + @Schema(description = "过鱼设施类型") + private String sttpCode; + + @Schema(description = "已接入") + private Integer bonusing; + + @Schema(description = "已建") + private Integer built; + + @Schema(description = "已建已接入") + private Integer builtConnected; + + @Schema(description = "在建") + private Integer building; + + @Schema(description = "在建已接入") + private Integer buildingConnected; + + @Schema(description = "规划") + private Integer noBuilt; +} diff --git a/backend/src/main/java/com/yfd/platform/env/fp/service/FpBuildService.java b/backend/src/main/java/com/yfd/platform/env/fp/service/FpBuildService.java new file mode 100644 index 00000000..bf470bf0 --- /dev/null +++ b/backend/src/main/java/com/yfd/platform/env/fp/service/FpBuildService.java @@ -0,0 +1,10 @@ +package com.yfd.platform.env.fp.service; + +import com.yfd.platform.common.DataSourceRequest; +import com.yfd.platform.common.DataSourceResult; +import com.yfd.platform.env.fp.entity.vo.FpConstructionSituationVo; + +public interface FpBuildService { + + DataSourceResult processKendoList(DataSourceRequest dataSourceRequest); +} diff --git a/backend/src/main/java/com/yfd/platform/env/fp/service/impl/FpBuildServiceImpl.java b/backend/src/main/java/com/yfd/platform/env/fp/service/impl/FpBuildServiceImpl.java new file mode 100644 index 00000000..c6dbadd1 --- /dev/null +++ b/backend/src/main/java/com/yfd/platform/env/fp/service/impl/FpBuildServiceImpl.java @@ -0,0 +1,54 @@ +package com.yfd.platform.env.fp.service.impl; + +import com.baomidou.mybatisplus.extension.plugins.pagination.Page; +import com.yfd.platform.common.DataSourceLoadOptionsBase; +import com.yfd.platform.common.DataSourceRequest; +import com.yfd.platform.common.DataSourceResult; +import com.yfd.platform.common.MicroservicDynamicSQLMapper; +import com.yfd.platform.common.PageInfo; +import com.yfd.platform.env.fp.entity.vo.FpConstructionSituationVo; +import com.yfd.platform.env.fp.service.FpBuildService; +import com.yfd.platform.utils.QgcQueryWrapperUtil; +import jakarta.annotation.Resource; +import org.springframework.stereotype.Service; + +import java.util.HashMap; +import java.util.List; + +@Service +public class FpBuildServiceImpl implements FpBuildService { + + @Resource + private MicroservicDynamicSQLMapper microservicDynamicSQLMapper; + + @Override + public DataSourceResult processKendoList(DataSourceRequest dataSourceRequest) { + DataSourceLoadOptionsBase loadOptions = dataSourceRequest.toDevRequest(); + PageInfo pageInfo = QgcQueryWrapperUtil.getPageInfo(loadOptions); + Page page = pageInfo.getHasPageInfo() ? pageInfo.getPage() : null; + + String sql = "SELECT t.STTP AS sttpCode, " + + " SUM(CASE WHEN t.DTIN = 1 THEN 1 ELSE 0 END) AS bonusing, " + + " SUM(CASE WHEN t.DTIN = 1 AND t.BLDSTT_CODE = 2 THEN 1 ELSE 0 END) AS builtConnected, " + + " SUM(CASE WHEN t.BLDSTT_CODE = 2 THEN 1 ELSE 0 END) AS built, " + + " SUM(CASE WHEN t.DTIN = 1 AND t.BLDSTT_CODE = 1 THEN 1 ELSE 0 END) AS buildingConnected, " + + " SUM(CASE WHEN t.BLDSTT_CODE = 1 THEN 1 ELSE 0 END) AS building, " + + " SUM(CASE WHEN NVL(t.BLDSTT_CODE, 0) = 0 THEN 1 ELSE 0 END) AS noBuilt " + + "FROM SD_FPSS_B_H t " + + "GROUP BY t.STTP " + + "ORDER BY t.STTP"; + + List list = microservicDynamicSQLMapper.pageAllListWithResultType( + page, + sql, + new HashMap<>(), + FpConstructionSituationVo.class + ); + + DataSourceResult result = new DataSourceResult<>(); + result.setData(list); + result.setTotal(page != null ? page.getTotal() : list.size()); + result.setAggregates(new HashMap<>()); + return result; + } +} From 33f00d90cd19a905dc13ced7001d991aefdb2f22 Mon Sep 17 00:00:00 2001 From: tangwei Date: Tue, 26 May 2026 17:19:55 +0800 Subject: [PATCH 10/41] =?UTF-8?q?feat:=20=E5=A2=9E=E5=8A=A0=E5=85=A8?= =?UTF-8?q?=E8=BF=87=E7=A8=8B=E8=BF=87=E9=B1=BC=E7=BB=9F=E8=AE=A1=E6=80=BB?= =?UTF-8?q?=E6=95=B0=EF=BC=8C=E6=A0=B9=E6=8D=AE=E5=9F=BA=E5=9C=B0=E5=88=86?= =?UTF-8?q?=E7=BB=84?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../fp/controller/FishPassageController.java | 8 +++ .../env/fp/entity/vo/FpFtpStatisticsVo.java | 24 +++++++ .../env/fp/entity/vo/YearFpStatisticsVo.java | 23 +++++++ .../platform/env/fp/service/FpRunService.java | 5 ++ .../env/fp/service/impl/FpRunServiceImpl.java | 65 +++++++++++++++++++ 5 files changed, 125 insertions(+) create mode 100644 backend/src/main/java/com/yfd/platform/env/fp/entity/vo/FpFtpStatisticsVo.java create mode 100644 backend/src/main/java/com/yfd/platform/env/fp/entity/vo/YearFpStatisticsVo.java diff --git a/backend/src/main/java/com/yfd/platform/env/fp/controller/FishPassageController.java b/backend/src/main/java/com/yfd/platform/env/fp/controller/FishPassageController.java index e562d6f8..4b4f1bae 100644 --- a/backend/src/main/java/com/yfd/platform/env/fp/controller/FishPassageController.java +++ b/backend/src/main/java/com/yfd/platform/env/fp/controller/FishPassageController.java @@ -8,8 +8,10 @@ import io.swagger.v3.oas.annotations.Operation; import io.swagger.v3.oas.annotations.tags.Tag; import jakarta.annotation.Resource; import org.springframework.validation.annotation.Validated; +import org.springframework.web.bind.annotation.GetMapping; import org.springframework.web.bind.annotation.PostMapping; import org.springframework.web.bind.annotation.RequestBody; +import org.springframework.web.bind.annotation.RequestParam; import org.springframework.web.bind.annotation.RequestMapping; import org.springframework.web.bind.annotation.RestController; @@ -37,4 +39,10 @@ public class FishPassageController { public ResponseResult getKendoListCust(@RequestBody DataSourceRequest dataSourceRequest) { return ResponseResult.successData(fpBuildService.processKendoList(dataSourceRequest)); } + + @GetMapping("/run/qgc/year/GetYearFpStatistics") + @Operation(summary = "全过程过鱼统计总数,根据基地分组") + public ResponseResult getYearFpStatic(@RequestParam("year") String year) { + return ResponseResult.successData(fpRunService.getYearFpStatic(year)); + } } diff --git a/backend/src/main/java/com/yfd/platform/env/fp/entity/vo/FpFtpStatisticsVo.java b/backend/src/main/java/com/yfd/platform/env/fp/entity/vo/FpFtpStatisticsVo.java new file mode 100644 index 00000000..8073de06 --- /dev/null +++ b/backend/src/main/java/com/yfd/platform/env/fp/entity/vo/FpFtpStatisticsVo.java @@ -0,0 +1,24 @@ +package com.yfd.platform.env.fp.entity.vo; + +import io.swagger.v3.oas.annotations.media.Schema; +import lombok.Data; + +@Data +@Schema(description = "按鱼种统计的过鱼数量") +public class FpFtpStatisticsVo { + + @Schema(description = "基地编码") + private String baseId; + + @Schema(description = "基地名称") + private String baseName; + + @Schema(description = "鱼种编码") + private String ftp; + + @Schema(description = "鱼种名称") + private String fishName; + + @Schema(description = "过鱼数量") + private Integer fcnt; +} diff --git a/backend/src/main/java/com/yfd/platform/env/fp/entity/vo/YearFpStatisticsVo.java b/backend/src/main/java/com/yfd/platform/env/fp/entity/vo/YearFpStatisticsVo.java new file mode 100644 index 00000000..ccbc42c3 --- /dev/null +++ b/backend/src/main/java/com/yfd/platform/env/fp/entity/vo/YearFpStatisticsVo.java @@ -0,0 +1,23 @@ +package com.yfd.platform.env.fp.entity.vo; + +import io.swagger.v3.oas.annotations.media.Schema; +import lombok.Data; + +import java.util.List; + +@Data +@Schema(description = "按基地分组的年度过鱼统计") +public class YearFpStatisticsVo { + + @Schema(description = "过鱼总数") + private Integer fpCount; + + @Schema(description = "基地编码") + private String baseId; + + @Schema(description = "基地名称") + private String baseName; + + @Schema(description = "按鱼种统计列表") + private List fpFtpStatitcsVos; +} diff --git a/backend/src/main/java/com/yfd/platform/env/fp/service/FpRunService.java b/backend/src/main/java/com/yfd/platform/env/fp/service/FpRunService.java index b531a5c1..da685715 100644 --- a/backend/src/main/java/com/yfd/platform/env/fp/service/FpRunService.java +++ b/backend/src/main/java/com/yfd/platform/env/fp/service/FpRunService.java @@ -2,9 +2,14 @@ package com.yfd.platform.env.fp.service; import com.yfd.platform.common.DataSourceRequest; import com.yfd.platform.common.DataSourceResult; +import com.yfd.platform.env.fp.entity.vo.YearFpStatisticsVo; import com.yfd.platform.env.fp.entity.vo.FpRunPlanVo; +import java.util.List; + public interface FpRunService { DataSourceResult processQgcSecondPlanKendoList(DataSourceRequest dataSourceRequest); + + List getYearFpStatic(String year); } diff --git a/backend/src/main/java/com/yfd/platform/env/fp/service/impl/FpRunServiceImpl.java b/backend/src/main/java/com/yfd/platform/env/fp/service/impl/FpRunServiceImpl.java index e06ec8ee..d2d0e9a6 100644 --- a/backend/src/main/java/com/yfd/platform/env/fp/service/impl/FpRunServiceImpl.java +++ b/backend/src/main/java/com/yfd/platform/env/fp/service/impl/FpRunServiceImpl.java @@ -9,7 +9,9 @@ import com.yfd.platform.common.DataSourceRequest; import com.yfd.platform.common.DataSourceResult; import com.yfd.platform.common.MicroservicDynamicSQLMapper; import com.yfd.platform.common.exception.BizException; +import com.yfd.platform.env.fp.entity.vo.FpFtpStatisticsVo; import com.yfd.platform.env.fp.entity.vo.FpRunPlanVo; +import com.yfd.platform.env.fp.entity.vo.YearFpStatisticsVo; import com.yfd.platform.env.fp.service.FpRunService; import com.yfd.platform.utils.QgcQueryWrapperUtil; import jakarta.annotation.Resource; @@ -17,9 +19,12 @@ import org.springframework.stereotype.Service; import java.math.BigDecimal; import java.math.RoundingMode; +import java.util.ArrayList; import java.util.Collections; import java.util.HashMap; +import java.util.LinkedHashMap; import java.util.LinkedHashSet; +import java.util.List; import java.util.Map; import java.util.Set; import java.util.regex.Matcher; @@ -94,6 +99,36 @@ public class FpRunServiceImpl implements FpRunService { return result; } + @Override + public List getYearFpStatic(String year) { + Map paramMap = new HashMap<>(); + paramMap.put("year", StrUtil.trim(year)); + List rows = microservicDynamicSQLMapper.getAllListWithResultType( + buildYearFpStatisticsSql(), + paramMap, + FpFtpStatisticsVo.class + ); + if (rows == null || rows.isEmpty()) { + return new ArrayList<>(); + } + + Map grouped = new LinkedHashMap<>(); + for (FpFtpStatisticsVo row : rows) { + String key = StrUtil.nullToDefault(row.getBaseId(), ""); + YearFpStatisticsVo yearVo = grouped.computeIfAbsent(key, k -> { + YearFpStatisticsVo item = new YearFpStatisticsVo(); + item.setBaseId(row.getBaseId()); + item.setBaseName(row.getBaseName()); + item.setFpCount(0); + item.setFpFtpStatitcsVos(new ArrayList<>()); + return item; + }); + yearVo.setFpCount(yearVo.getFpCount() + (row.getFcnt() == null ? 0 : row.getFcnt())); + yearVo.getFpFtpStatitcsVos().add(row); + } + return new ArrayList<>(grouped.values()); + } + private String buildQgcSecondPlanSql() { return "SELECT t.STCD AS stcd, " + " t2.stm AS designStartDate, " + @@ -161,6 +196,36 @@ public class FpRunServiceImpl implements FpRunService { "WHERE t.STCD = #{map.stcd}"; } + private String buildYearFpStatisticsSql() { + return "SELECT eng.BASE_ID AS baseId, " + + " hb.BASENAME AS baseName, " + + " a.FTP AS ftp, " + + " COALESCE(fishRv.NAME, relRv.FISH_NAME, fishZy.NAME, relZy.FISH_NAME, a.FTP) AS fishName, " + + " SUM(a.FCNT) AS fcnt " + + "FROM SD_FPSS_R a " + + "INNER JOIN ( " + + " SELECT STCD, MAX(RSTCD) AS RSTCD " + + " FROM SD_FPSS_B_H " + + " GROUP BY STCD " + + ") fpss ON fpss.STCD = a.STCD " + + "LEFT JOIN SD_ENGINFO_B_H eng ON eng.STCD = fpss.RSTCD " + + "LEFT JOIN SD_HYDROBASE hb ON hb.BASEID = eng.BASE_ID " + + "LEFT JOIN SD_FISHDICTORY_RLTN_B relRv ON relRv.FISH_ID = a.FTP " + + " AND relRv.RVCD = eng.HBRVCD " + + " AND relRv.IS_DELETED = 0 " + + "LEFT JOIN SD_FISHDICTORY_B fishRv ON fishRv.ID = NVL(relRv.ZY_FISH_ID, relRv.FISH_ID) " + + " AND fishRv.IS_DELETED = 0 " + + "LEFT JOIN SD_FISHDICTORY_RLTN_B relZy ON relZy.FISH_ID = a.FTP " + + " AND relZy.RVCD = 'ZY' " + + " AND relZy.IS_DELETED = 0 " + + "LEFT JOIN SD_FISHDICTORY_B fishZy ON fishZy.ID = NVL(relZy.ZY_FISH_ID, relZy.FISH_ID) " + + " AND fishZy.IS_DELETED = 0 " + + "WHERE NVL(a.IS_DELETED, 0) = 0 " + + " AND (#{map.year} IS NULL OR #{map.year} = '' OR TO_CHAR(a.STRDT, 'YYYY') = #{map.year}) " + + "GROUP BY eng.BASE_ID, hb.BASENAME, a.FTP, COALESCE(fishRv.NAME, relRv.FISH_NAME, fishZy.NAME, relZy.FISH_NAME, a.FTP) " + + "ORDER BY eng.BASE_ID, a.FTP"; + } + private String resolveFallbackFishText(String fallbackFishJson, String fallbackFishText) { if (StrUtil.isNotBlank(fallbackFishJson)) { Set fishNames = new LinkedHashSet<>(); From 9b681b2d8f005bbf9bcdbc3c8b111058cb09766c Mon Sep 17 00:00:00 2001 From: tangwei Date: Tue, 26 May 2026 19:02:25 +0800 Subject: [PATCH 11/41] =?UTF-8?q?fix:=20=E4=BC=98=E5=8C=96=E9=80=BB?= =?UTF-8?q?=E8=BE=91?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../platform/common/DataSourceRequest.java | 20 +++++++++++++------ .../com/yfd/platform/common/GroupHelper.java | 3 +++ .../wq/controller/EnvWqDataController.java | 10 ++++++++-- .../env/wq/entity/vo/WqMsstbprptGroupVo.java | 15 ++++++++++++++ .../env/wq/service/EnvWqDataService.java | 2 ++ .../wq/service/impl/EnvWqDataServiceImpl.java | 5 +++++ .../com/yfd/platform/utils/KendoUtil.java | 6 +++++- 7 files changed, 52 insertions(+), 9 deletions(-) create mode 100644 backend/src/main/java/com/yfd/platform/env/wq/entity/vo/WqMsstbprptGroupVo.java diff --git a/backend/src/main/java/com/yfd/platform/common/DataSourceRequest.java b/backend/src/main/java/com/yfd/platform/common/DataSourceRequest.java index bf9a79c6..ad4c5ea6 100644 --- a/backend/src/main/java/com/yfd/platform/common/DataSourceRequest.java +++ b/backend/src/main/java/com/yfd/platform/common/DataSourceRequest.java @@ -255,13 +255,17 @@ public class DataSourceRequest { for(SortDescriptor entry : sort) { String field = entry.getField(); String dir = entry.getDir(); + String normalizedDir = StringUtil.isBlank(dir) ? "" : dir.toLowerCase(); + if ("des".equals(normalizedDir)) { + normalizedDir = "desc"; + } SortingInfo sortingInfo = new SortingInfo(); sortingInfo.setSelector(field); - if (StringUtil.isBlank(dir)) { + if (StringUtil.isBlank(normalizedDir)) { sortingInfo.setDesc(false); - } else if (dir.equals("asc")) { + } else if (normalizedDir.equals("asc")) { sortingInfo.setDesc(false); - } else if (dir.equals("desc")) { + } else if (normalizedDir.equals("desc")) { sortingInfo.setDesc(true); } @@ -303,11 +307,15 @@ public class DataSourceRequest { GroupingInfo groupingInfo = new GroupingInfo(); groupingInfo.setSelector(groupDescriptor.getField()); String dir = groupDescriptor.getDir(); - if (StringUtil.isBlank(dir)) { + String normalizedDir = StringUtil.isBlank(dir) ? "" : dir.toLowerCase(); + if ("des".equals(normalizedDir)) { + normalizedDir = "desc"; + } + if (StringUtil.isBlank(normalizedDir)) { groupingInfo.setDesc(false); - } else if (dir.equals("asc")) { + } else if (normalizedDir.equals("asc")) { groupingInfo.setDesc(false); - } else if (dir.equals("desc")) { + } else if (normalizedDir.equals("desc")) { groupingInfo.setDesc(true); } diff --git a/backend/src/main/java/com/yfd/platform/common/GroupHelper.java b/backend/src/main/java/com/yfd/platform/common/GroupHelper.java index 7931e4a1..aaf612b5 100644 --- a/backend/src/main/java/com/yfd/platform/common/GroupHelper.java +++ b/backend/src/main/java/com/yfd/platform/common/GroupHelper.java @@ -102,6 +102,9 @@ public class GroupHelper { Group newGroup = new Group(); newGroup.setKey(groupKey); newGroup.setField(groupInfo.getSelector()); + newGroup.setKeyExt(new HashMap()); + newGroup.setSummary(new Object[0]); + newGroup.setAggregates(new HashMap()); if (tempCount != null) { newGroup.setCount(NumberUtil.parseInt(tempCount.toString())); } diff --git a/backend/src/main/java/com/yfd/platform/env/wq/controller/EnvWqDataController.java b/backend/src/main/java/com/yfd/platform/env/wq/controller/EnvWqDataController.java index b0e00824..8544b93c 100644 --- a/backend/src/main/java/com/yfd/platform/env/wq/controller/EnvWqDataController.java +++ b/backend/src/main/java/com/yfd/platform/env/wq/controller/EnvWqDataController.java @@ -32,7 +32,7 @@ public class EnvWqDataController { @PostMapping("/data/GetKendoListCust") @Operation(summary = "水质明细数据查询") public ResponseResult getDataKendoListCust(@RequestBody DataSourceRequest dataSourceRequest) { - return ResponseResult.successData(envWqDataService.processKendoList(dataSourceRequest)); + return ResponseResult.successData(envWqDataService.processDataKendoList(dataSourceRequest)); } @PostMapping("/GetStbprpYsByStcd") @@ -50,7 +50,7 @@ public class EnvWqDataController { @PostMapping("/data/noAuth/GetKendoListCust") @Operation(summary = "水质统计分析(完成)") public ResponseResult getNoAuthKendoListCust(@RequestBody DataSourceRequest dataSourceRequest) { - return ResponseResult.successData(envWqDataService.processKendoList(dataSourceRequest)); + return ResponseResult.successData(envWqDataService.processDataKendoList(dataSourceRequest)); } @PostMapping("/along/qgc/GetKendoListCust") @@ -65,6 +65,12 @@ public class EnvWqDataController { return ResponseResult.successData(envWqDataService.getMsstbprptList(dataSourceRequest)); } + @PostMapping("/base/msstbprpt/GetKendoList") + @Operation(summary = "查询水质基础站点分组统计") + public ResponseResult getBaseMsstbprptList(@RequestBody DataSourceRequest dataSourceRequest) { + return ResponseResult.successData(envWqDataService.getMsstbprptList(dataSourceRequest)); + } + @PostMapping("/vmsstbprpt/GetKendoList") @Operation(summary = "根据条件查询水质基础站点数据(完成)") public ResponseResult getVmsstbprptList(@RequestBody DataSourceRequest dataSourceRequest) { diff --git a/backend/src/main/java/com/yfd/platform/env/wq/entity/vo/WqMsstbprptGroupVo.java b/backend/src/main/java/com/yfd/platform/env/wq/entity/vo/WqMsstbprptGroupVo.java new file mode 100644 index 00000000..8ba1aeb1 --- /dev/null +++ b/backend/src/main/java/com/yfd/platform/env/wq/entity/vo/WqMsstbprptGroupVo.java @@ -0,0 +1,15 @@ +package com.yfd.platform.env.wq.entity.vo; + +import io.swagger.v3.oas.annotations.media.Schema; +import lombok.Data; + +@Data +@Schema(description = "水质基础站点分组统计") +public class WqMsstbprptGroupVo { + + @Schema(description = "数据接入类型") + private Integer dtinType; + + @Schema(description = "数据接入类型分组数量") + private Integer countDtinType; +} diff --git a/backend/src/main/java/com/yfd/platform/env/wq/service/EnvWqDataService.java b/backend/src/main/java/com/yfd/platform/env/wq/service/EnvWqDataService.java index 8fd2445b..2bd2f3bf 100644 --- a/backend/src/main/java/com/yfd/platform/env/wq/service/EnvWqDataService.java +++ b/backend/src/main/java/com/yfd/platform/env/wq/service/EnvWqDataService.java @@ -8,6 +8,8 @@ public interface EnvWqDataService { DataSourceResult processKendoList(DataSourceRequest dataSourceRequest); + DataSourceResult processDataKendoList(DataSourceRequest dataSourceRequest); + DataSourceResult getAlongWqKendoListCust(DataSourceRequest dataSourceRequest); DataSourceResult getMsstbprptList(DataSourceRequest dataSourceRequest); diff --git a/backend/src/main/java/com/yfd/platform/env/wq/service/impl/EnvWqDataServiceImpl.java b/backend/src/main/java/com/yfd/platform/env/wq/service/impl/EnvWqDataServiceImpl.java index 9a62d97b..4cf08ed5 100644 --- a/backend/src/main/java/com/yfd/platform/env/wq/service/impl/EnvWqDataServiceImpl.java +++ b/backend/src/main/java/com/yfd/platform/env/wq/service/impl/EnvWqDataServiceImpl.java @@ -89,6 +89,11 @@ public class EnvWqDataServiceImpl implements EnvWqDataService { return result; } + @Override + public DataSourceResult processDataKendoList(DataSourceRequest dataSourceRequest) { + return null; + } + @Override public DataSourceResult getAlongWqKendoListCust(DataSourceRequest dataSourceRequest) { return emptyResult(); diff --git a/backend/src/main/java/com/yfd/platform/utils/KendoUtil.java b/backend/src/main/java/com/yfd/platform/utils/KendoUtil.java index 8701ea0c..5967765e 100644 --- a/backend/src/main/java/com/yfd/platform/utils/KendoUtil.java +++ b/backend/src/main/java/com/yfd/platform/utils/KendoUtil.java @@ -44,9 +44,13 @@ public class KendoUtil extends ReflectUtil { DataSourceRequest.GroupDescriptor groupingInfo = (DataSourceRequest.GroupDescriptor)groupDescriptorList.get(i); String selector = groupingInfo.getField(); String dir = groupingInfo.getDir(); + String normalizedDir = StrUtil.blankToDefault(dir, "asc").toLowerCase(); + if ("des".equals(normalizedDir)) { + normalizedDir = "desc"; + } groupByBuilder.append(selector); if (groupingInfo.getNeedSortFlag()) { - if ("desc".equals(dir)) { + if ("desc".equals(normalizedDir)) { orderByBuilder.append(selector).append(" desc"); } else { orderByBuilder.append(selector).append(" asc"); From cb5d2edfaaa08f27134a13303a6e851352afb1d0 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E7=8E=8B=E5=85=B4=E5=87=AF?= <2448379534@qq.com> Date: Tue, 26 May 2026 19:30:22 +0800 Subject: [PATCH 12/41] =?UTF-8?q?=E6=B0=B4=E6=B8=A9=E6=8E=A5=E5=8F=A3-?= =?UTF-8?q?=E7=BA=BF=E4=B8=8A=E5=92=8C=E5=BC=B9=E6=A1=86?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- frontend/.env.development | 2 +- frontend/src/api/mapModal/index.ts | 8 + frontend/src/api/sw/index.ts | 88 + frontend/src/components/BasicTable/index.vue | 2 +- .../src/components/MapModal/column.config.ts | 4 +- .../MapModal/components/BasicInfo.vue | 6990 +---------------- .../MapModal/components/WaterTemperature.vue | 12 + .../components/WaterTemperatureContrast.vue | 653 ++ frontend/src/components/MapModal/index.vue | 21 +- .../src/components/MapModal/setting.config.ts | 39 +- .../src/components/SidePanelItem/index.vue | 371 +- .../carouselIntroduce/ArtsDetail.vue | 270 + .../chuixiangshuiwenChangeMod/index.vue | 102 +- .../churukushuiwenMod/churukushuiwen.vue | 378 + .../src/modules/churukushuiwenMod/index.vue | 95 +- ...eixingzuchengjijieruqingkuangTwoLayers.vue | 525 ++ .../index.vue | 251 +- .../index.vue | 497 +- .../monthlyAverage.vue | 835 ++ .../modules/sheshileixingjieshao/index.vue | 169 +- .../TwoLayers/yaerAverage.vue | 379 + .../src/modules/shuiWenNianNeiFenBu/index.vue | 413 +- .../index.vue | 37 +- .../shuiwenjiancegongzuoEJ.vue | 548 ++ .../yanchengshuiwenChangeMod/index.vue | 61 +- frontend/src/store/modules/model.ts | 6 +- frontend/src/styles/index.scss | 3 + frontend/src/utils/request.ts | 3 +- .../views/home/shuiDianKaiFaZhuangKuang.vue | 4 +- frontend/vite.config.ts | 10 + 30 files changed, 5437 insertions(+), 7339 deletions(-) create mode 100644 frontend/src/api/mapModal/index.ts create mode 100644 frontend/src/components/MapModal/components/WaterTemperature.vue create mode 100644 frontend/src/components/MapModal/components/WaterTemperatureContrast.vue create mode 100644 frontend/src/components/carouselIntroduce/ArtsDetail.vue create mode 100644 frontend/src/modules/churukushuiwenMod/churukushuiwen.vue create mode 100644 frontend/src/modules/diwenshuijianhuansheshileixingzuchengjijieruqingkuang/TwoLayers/diwenshuijianhuansheshileixingzuchengjijieruqingkuangTwoLayers.vue create mode 100644 frontend/src/modules/monthlyAvgWaterTemCompareHistory/monthlyAverage.vue create mode 100644 frontend/src/modules/shuiWenNianNeiFenBu/TwoLayers/yaerAverage.vue create mode 100644 frontend/src/modules/shuiwenjiancegongzuokaizhangqingkuang/shuiwenjiancegongzuoEJ.vue diff --git a/frontend/.env.development b/frontend/.env.development index 5ab3d705..c9ce1af6 100644 --- a/frontend/.env.development +++ b/frontend/.env.development @@ -9,7 +9,7 @@ VITE_APP_BASE_API = '/dev-api' # 本地环境 # VITE_APP_BASE_URL = 'http://localhost:8093' # 测试环境 -# VITE_APP_BASE_URL = 'http://172.16.21.142:8096' +# VITE_APP_BASE_URL = 'http://172.16.21.142:8093' # VITE_APP_BASE_URL = 'http://172.16.21.142:8096' # 汤伟 VITE_APP_BASE_URL = 'http://10.84.121.21:8093' diff --git a/frontend/src/api/mapModal/index.ts b/frontend/src/api/mapModal/index.ts new file mode 100644 index 00000000..2e80603d --- /dev/null +++ b/frontend/src/api/mapModal/index.ts @@ -0,0 +1,8 @@ +import request from '@/utils/request'; +export function getStcdDetail(url: string, stcd: string) { + return request({ + url: url, + method: 'get', + params: { stcd } + }); +} \ No newline at end of file diff --git a/frontend/src/api/sw/index.ts b/frontend/src/api/sw/index.ts index 02c35f3a..85d80a23 100644 --- a/frontend/src/api/sw/index.ts +++ b/frontend/src/api/sw/index.ts @@ -64,3 +64,91 @@ export function baseEvnmAutoMonitorGetKendoListCust(data: any) { data }); } +////水温监测工作开展情况弹框 +export function vmsstbprptGetKendoList(data: any) { + return request({ + url: '/api/dec-lygk-base-server/base/vmsstbprpt/GetKendoList', + method: 'post', + data + }); +} +//出入库水温打开弹框api/wmp-env-server/sw/inOutOne/details +export function inOutOneDetails(data: any) { + return request({ + url: '/api/wmp-env-server/sw/inOutOne/details', + method: 'post', + data + }); +} +//鱼类适宜性分析 - select +export function infoGetKendoListCust(data: any) { + return request({ + url: '/api/wmp-env-server/sw/wtrv/fish/info/GetKendoListCust', + method: 'post', + data + }); +} +//鱼类适宜性分析-图表和table +export function fishGetKendoListCust(data: any) { + return request({ + url: '/api/wmp-env-server/sw/wtrv/fish/GetKendoListCust', + method: 'post', + data + }); +} +//月平均水温历史对比 +export function avgMonGetKendoListCust(data: any) { + return request({ + url: '/api/wmp-env-server/sw/monthList/avgMon/GetKendoListCust', + method: 'post', + data + }); +} +//水温年内分布 +export function yearListGetKendoListCust(data: any) { + return request({ + url: '/api/wmp-env-server/sw/yearList/GetKendoListCust', + method: 'post', + data + }); +} +//设施类型介绍 +export function sttpbGetKendoList(data: any) { + return request({ + url: '/api/dec-lygk-base-server/base/sttpb/GetKendoList', + method: 'post', + data + }); +} +//设施类型及接入情况 +export function dwInfoGetKendoListCust(data: any) { + return request({ + url: '/api/dec-lygk-base-server/base/dwInfo/GetKendoListCust', + method: 'post', + data + }); +} +//月均水温对比,图表,表格 /api/wmp-env-server/sw/monthDetail/Det/GetKendoListCust +export function DetGetKendoListCust(data: any) { + return request({ + url: '/api/wmp-env-server/sw/monthDetail/Det/GetKendoListCust', + method: 'post', + data + }); +} +//水温年内分布 +export function yearDetailGetKendoListCust(data: any) { + return request({ + url: '/api/wmp-env-server/sw/yearDetail/GetKendoListCust', + method: 'post', + data + }); +} +//获取建设状态 +export function dictgetRemoteDictValue(data: any) { + return request({ + url: '/api/dec-modules-usm-springcloud-starter/usm/v1/dict/getRemoteDictValue', + method: 'get', + params: data + }); +} diff --git a/frontend/src/components/BasicTable/index.vue b/frontend/src/components/BasicTable/index.vue index 422bfee7..02644884 100644 --- a/frontend/src/components/BasicTable/index.vue +++ b/frontend/src/components/BasicTable/index.vue @@ -82,7 +82,7 @@ const scrollConfig = computed(() => { else if (tableScrollY.value > 0) { config.y = tableScrollY.value; } - console.log(tableScrollY.value); + console.log(config); return config; }); diff --git a/frontend/src/components/MapModal/column.config.ts b/frontend/src/components/MapModal/column.config.ts index add6b12c..0856aa04 100644 --- a/frontend/src/components/MapModal/column.config.ts +++ b/frontend/src/components/MapModal/column.config.ts @@ -2072,7 +2072,7 @@ const DwPointColumns: Array = [ }, { name: '站址', - filed: 'stlc', + filed: 'addvcdName', visible: true, type: 'select', url: '', @@ -2608,7 +2608,7 @@ const DwOnePointColumns: Array = [ url: '', }, { - name: '多层式进水口', + name: '夹岩双层取水', visible: false, ruleTips: '', type: '', diff --git a/frontend/src/components/MapModal/components/BasicInfo.vue b/frontend/src/components/MapModal/components/BasicInfo.vue index 2f46f99e..1ac4afc8 100644 --- a/frontend/src/components/MapModal/components/BasicInfo.vue +++ b/frontend/src/components/MapModal/components/BasicInfo.vue @@ -41,10 +41,13 @@ -
+ +
+
+
123 @@ -56,8 +59,10 @@ @@ -7077,7 +279,7 @@ onMounted(() => { justify-content: space-between; .img_box { - width: 20%; + // width: 20%; padding: 12px; box-sizing: border-box; border: 1px solid rgba(0, 127, 204, 0.65); @@ -7085,7 +287,7 @@ onMounted(() => { .img_box_img { width: 100%; - height: 100%; + // height: 100%; padding: 12px; box-sizing: border-box; border: 1px solid rgba(0, 127, 204, 0.65); @@ -7096,7 +298,7 @@ onMounted(() => { .ant-row { border-left: 1px solid rgba(0, 127, 204, 0.65); border-top: 1px solid rgba(0, 127, 204, 0.65); - + height: 100%; .ant-col:nth-last-child(-n + 2) { .col-left, diff --git a/frontend/src/components/MapModal/components/WaterTemperature.vue b/frontend/src/components/MapModal/components/WaterTemperature.vue new file mode 100644 index 00000000..17566ef4 --- /dev/null +++ b/frontend/src/components/MapModal/components/WaterTemperature.vue @@ -0,0 +1,12 @@ + + + + + diff --git a/frontend/src/components/MapModal/components/WaterTemperatureContrast.vue b/frontend/src/components/MapModal/components/WaterTemperatureContrast.vue new file mode 100644 index 00000000..62a838e3 --- /dev/null +++ b/frontend/src/components/MapModal/components/WaterTemperatureContrast.vue @@ -0,0 +1,653 @@ + + + + + diff --git a/frontend/src/components/MapModal/index.vue b/frontend/src/components/MapModal/index.vue index 0a9aa872..590459d7 100644 --- a/frontend/src/components/MapModal/index.vue +++ b/frontend/src/components/MapModal/index.vue @@ -1,19 +1,15 @@ @@ -39,6 +34,8 @@ import { ref, watch } from "vue"; // 导入预定义的 Tab 内容组件 import BasicInfo from "./components/BasicInfo.vue"; +import WaterTemperature from "./components/WaterTemperature.vue"; +import WaterTemperatureContrast from "./components/WaterTemperatureContrast.vue"; import { useModelStore } from "@/store/modules/model"; import { handleTabs } from "./setting.config"; diff --git a/frontend/src/components/MapModal/setting.config.ts b/frontend/src/components/MapModal/setting.config.ts index 387ab57a..4094836e 100644 --- a/frontend/src/components/MapModal/setting.config.ts +++ b/frontend/src/components/MapModal/setting.config.ts @@ -17,7 +17,7 @@ const ENGTabs: Array = [ name: '基础信息', key: 'basicInfo', type: 'basic', - url: '/bbi/siteBipc/getSiteBasicInfo', + url: '/api/dec-lygk-base-server/base/msstbprpt/getStcdInfo', default: true // 默认显示 }, { @@ -724,7 +724,7 @@ const WTTabs: Array = [ name: '基础信息', key: 'basicInfo', type: 'basic', - url: '/bbi/siteBipc/getSiteBasicInfo' + url: '/api/dec-lygk-base-server/base/msstbprpt/getStcdInfo' }, { name: '监测数据', @@ -767,23 +767,24 @@ const DWTabs: Array = [ key: 'basicInfo', type: 'basic', default: true, // 默认显示 + url: '/api/dec-lygk-base-server/base/msstbprpt/getStcdInfo' }, - { - name: '实时视频', - key: 'videoInfo', - type: 'video', - url: '/video/dataStcdFrame/getVideoMonitorList' - }, - { - name: '监测数据', - key: 'VerticalWaterTemperature', - type: 'VerticalWaterTemperature', - }, - { - name: '叠梁门运行AI识别', - key: 'AIYXSB', - type: 'AIYXSB', - } + // { + // name: '实时视频', + // key: 'videoInfo', + // type: 'video', + // url: '/video/dataStcdFrame/getVideoMonitorList' + // }, + // { + // name: '监测数据', + // key: 'VerticalWaterTemperature', + // type: 'VerticalWaterTemperature', + // }, + // { + // name: '叠梁门运行AI识别', + // key: 'AIYXSB', + // type: 'AIYXSB', + // } ] // //低温水减缓设施这是旧的 // const DWTabs2: Array = [ @@ -887,7 +888,7 @@ const DEVICETABS: Array = [ name: '基础信息', key: 'basicInfo', type: 'basic', - url: '/bbi/siteBipc/getSiteBasicInfo', + url: '/api/dec-lygk-base-server/base/msstbprpt/getStcdInfo', default: true, // 默认显示 }, ] diff --git a/frontend/src/components/SidePanelItem/index.vue b/frontend/src/components/SidePanelItem/index.vue index faaa076a..36e07e6d 100644 --- a/frontend/src/components/SidePanelItem/index.vue +++ b/frontend/src/components/SidePanelItem/index.vue @@ -16,8 +16,7 @@ - + @@ -26,52 +25,38 @@
+ @focus="handleFocus" @blur="handleBlur" @change="handleChange">
- + tree-node-filter-prop="label" popup-class-name="no-wrap-tree-select" @select="handleTreeSelect" + @expand="handleTreeExpand">
-
- + :format="scopeDate.format" :range-separator="' 至 '" :size="'small'" + :presets="computedScopeDatePresets" :disabledDate="createDisabledDateFn(scopeDate.picker)" />
图片
@@ -86,7 +71,7 @@ diff --git a/frontend/src/components/carouselIntroduce/ArtsDetail.vue b/frontend/src/components/carouselIntroduce/ArtsDetail.vue new file mode 100644 index 00000000..d10aba45 --- /dev/null +++ b/frontend/src/components/carouselIntroduce/ArtsDetail.vue @@ -0,0 +1,270 @@ + + + + + + \ No newline at end of file diff --git a/frontend/src/modules/chuixiangshuiwenChangeMod/index.vue b/frontend/src/modules/chuixiangshuiwenChangeMod/index.vue index 610f38c2..4f4f0603 100644 --- a/frontend/src/modules/chuixiangshuiwenChangeMod/index.vue +++ b/frontend/src/modules/chuixiangshuiwenChangeMod/index.vue @@ -21,7 +21,9 @@ import type { ECharts } from 'echarts'; import SidePanelItem from '@/components/SidePanelItem/index.vue'; import { useJidiSelectEventStore } from "@/store/modules/jidiSelectEvent"; import { getChuiXiangShuiWenTreeStcd, getCxswList } from "@/api/sw"; +import { useModelStore } from "@/store/modules/model"; +const modelStore = useModelStore(); const JidiSelectEventStore = useJidiSelectEventStore(); const baseid = ref(''); @@ -109,11 +111,26 @@ function arrMin(arr: number[]): number { /** * 将 API 返回的 aggregates 数据转换为图表数据格式 */ -function transformAggregatesToChartData(aggregates: Record): Array<{ +function transformAggregatesToChartData( + aggregates: Record, + stcd: string, + stnm: string +): Array<{ name: string; - dataXy: Array<[number, number]>; + dataXy: Array<{ + value: [number, number]; + stcd: string; + stnm: string; + }>; }> { - const result: Array<{ name: string; dataXy: Array<[number, number]> }> = []; + const result: Array<{ + name: string; + dataXy: Array<{ + value: [number, number]; + stcd: string; + stnm: string; + }>; + }> = []; for (let month = 1; month <= 12; month++) { const key = month.toString(); @@ -128,11 +145,19 @@ function transformAggregatesToChartData(aggregates: Record): Arra continue; } - // 转换数据格式:{ wthg, vwt } → [vwt, wthg] - const dataXy: Array<[number, number]> = monthData.map((item: any) => [ - parseFloat(item.vwt), // 温度 - parseInt(item.wthg) // 深度/高程 - ]); + // ✅ 转换数据格式:将数据点包装为对象,包含元信息 + const dataXy: Array<{ + value: [number, number]; + stcd: string; + stnm: string; + }> = monthData.map((item: any) => ({ + value: [ + parseFloat(item.vwt), // 温度 + parseInt(item.wthg) // 深度/高程 + ] as [number, number], // ✅ 显式声明为元组类型 + stcd: stcd, // 站点编码 + stnm: stnm // 站点名称 + })); result.push({ name: `${month}月`, @@ -336,8 +361,15 @@ const selectOptions = async () => { const chartRef = ref(null); let chartInstance: ECharts | null = null; -// 图表数据 -const chartData = ref }>>([]); +// 图表数据(对象型格式,包含站点元信息) +const chartData = ref; +}>>([]); // Y轴类型(1=水深,2=高程) const type = ref(1); @@ -386,8 +418,18 @@ const fetchChartData = async (stcd: string, year: string | number) => { const aggregates = res?.data?.aggregates; if (aggregates) { - // 转换数据 - chartData.value = transformAggregatesToChartData(aggregates); + // ✅ 获取当前选中的站点名称 + let currentStnm = ''; + select.value.options.forEach((station: any) => { + station.children?.forEach((child: any) => { + if (child.value === stcd) { + currentStnm = child.title; + } + }); + }); + + // ✅ 转换数据,传递 stcd 和 stnm + chartData.value = transformAggregatesToChartData(aggregates, stcd, currentStnm); // ✅ 修改:传入固定值 12,而非 chartData.value.length const { colors: newColors, selected: newSelected } = generateColorsAndVisibility( @@ -433,6 +475,30 @@ const initChart = () => { } chartInstance = echarts.init(chartRef.value); + + // 绑定点击事件(具体处理逻辑由用户自行实现) + chartInstance.on('click', (params: any) => { + console.log('图表数据点被点击:', params); + + // ✅ 直接从 params.data 中获取 stcd 和 stnm + const stcd = params.data?.stcd; + const stnm = params.data?.stnm; + const temperature = params.data?.value?.[0]; + const depth = params.data?.value?.[1]; + + console.log('站点编码:', stcd); + console.log('站点名称:', stnm); + console.log('水温:', temperature); + console.log('深度:', depth); + modelStore.modalVisible = true; + modelStore.params.sttp = "wt_point"; + modelStore.title = stnm + "详情信息"; + // modelStore.isBasicEdit = true; + modelStore.params.stcd = stcd; + + // TODO: 在此处添加您的业务逻辑 + }); + updateChart(); }; @@ -446,14 +512,15 @@ const updateChart = () => { chartData.value.forEach((item) => { if (item.dataXy.length > 0) { - xData.push(item.dataXy[0][0]); + // ✅ 从对象中提取 value[0](温度值) + xData.push(item.dataXy[0].value[0]); } legend.push(item.name); yData.push({ name: item.name, - data: item.dataXy, + data: item.dataXy, // ✅ 直接使用对象数组 type: 'line', smooth: true, connectNulls: true, @@ -483,8 +550,9 @@ const updateChart = () => { formatter: (params: any) => { if (!params || !params.seriesName) return ''; - const temperature = params.data[0]; - const depth = params.data[1]; + // ✅ 从对象格式中获取数据 + const temperature = params.data?.value?.[0]; + const depth = params.data?.value?.[1]; return `${params.seriesName}
水温(℃):${temperature}
@@ -649,7 +717,7 @@ const handlePanelChange1 = (data: any) => { flex: 1; width: 100%; min-height: 252px !important; - display: flex; + display: flex; justify-content: center; align-items: center; } diff --git a/frontend/src/modules/churukushuiwenMod/churukushuiwen.vue b/frontend/src/modules/churukushuiwenMod/churukushuiwen.vue new file mode 100644 index 00000000..b42352c4 --- /dev/null +++ b/frontend/src/modules/churukushuiwenMod/churukushuiwen.vue @@ -0,0 +1,378 @@ + + + + + \ No newline at end of file diff --git a/frontend/src/modules/churukushuiwenMod/index.vue b/frontend/src/modules/churukushuiwenMod/index.vue index 268aac30..89e15350 100644 --- a/frontend/src/modules/churukushuiwenMod/index.vue +++ b/frontend/src/modules/churukushuiwenMod/index.vue @@ -14,6 +14,15 @@
+ + + + + + @@ -24,7 +33,7 @@ import dayjs from 'dayjs'; import SidePanelItem from '@/components/SidePanelItem/index.vue'; import { getVmsstbprpt, inOutOneGetKendoListCust } from '@/api/sw'; import { useJidiSelectEventStore } from "@/store/modules/jidiSelectEvent"; - +import churukushuiwen from './churukushuiwen.vue' // ==================== 组件基础配置 ==================== // 定义组件名(便于调试和递归) defineOptions({ @@ -64,6 +73,9 @@ const scopeDate = ref({ // ==================== 业务变量 ==================== const baseid = ref(''); // 当前选中的基地ID +const modalVisible = ref(false); // 弹框显示状态 +const clickDataInfo = ref(null); // 点击的数据点信息 +const stationName = ref(''); // 站点名称 // ==================== 基地列表数据(硬编码) ==================== const jiDiList: any = ref([ @@ -201,7 +213,7 @@ function calculateYAxisRange(data: (number | null)[]) { // 上下各扩展0.2,避免曲线贴边 return { min: Number((min - 0.2).toFixed(1)), // 最小值减0.2 - max: Number((max + 0.2).toFixed(1)) // 最大值加0.2 + max: Number((max + 0.1).toFixed(1)) // 最大值加0.2 } } @@ -215,7 +227,7 @@ function calculateXAxisInterval(dateCount: number): number { if (dateCount <= 4) return 0 // 数据点≤4时,显示所有刻度 return Math.ceil(dateCount / 4) - 1 // 动态计算间隔,保证最多4个刻度 } -const paramsOne = ref({ +const paramsOne:any = ref({ value: '', tm: [currentMonth, currentMonth] }) @@ -225,14 +237,14 @@ const paramsOne = ref({ */ async function fetchChartData() { if (loading.value) return; // 防止重复请求 - + loading.value = true; // 开始请求前设置loading - + try { // 动态计算时间范围(考虑不同月份的实际天数) const startDate = paramsOne.value.tm[0] + '-01 00:00:00'; const endDate = dayjs(paramsOne.value.tm[1]).endOf('month').format('YYYY-MM-DD') + ' 23:59:59'; - + // 构建查询参数(固定参数,后续可扩展为动态) const params = { filter: { @@ -262,7 +274,7 @@ async function fetchChartData() { // 根据数据长度决定showemit if (rawData.length > 0) { showemit.value = true; // 有数据则显示图表 - + // 转换数据格式 const { dates, iwtData, dwtData } = transformChartData(rawData) @@ -275,7 +287,7 @@ async function fetchChartData() { } else { updateChart(dates, iwtData, dwtData, 0); // 已有实例则更新 } - + // 强制重绘,确保图表尺寸正确适配容器 setTimeout(() => { if (chartInstance) { @@ -307,13 +319,13 @@ async function fetchChartData() { */ const initChartWithData = (dates: string[], iwtData: (number | null)[], dwtData: (number | null)[]) => { if (!chartContainer.value) return; - + const containerHeight = chartContainer.value.offsetHeight; if (containerHeight === 0) { setTimeout(() => initChartWithData(dates, iwtData, dwtData), 100); return; } - + chartInstance = echarts.init(chartContainer.value); updateChart(dates, iwtData, dwtData, 0); }; @@ -528,6 +540,11 @@ function updateChart(dates: string[], iwtData: (number | null)[], dwtData: (numb // 应用配置到图表实例 chartInstance.setOption(option, true); // true表示完全替换配置 + + // 绑定点击事件监听器 + chartInstance.off('click'); // 先移除旧的事件监听 + chartInstance.on('click', handleChartClick); + console.log('图表更新成功') // 强制重绘,确保图表尺寸正确适配容器 @@ -582,6 +599,45 @@ const handleResize = () => { // ==================== 事件处理函数 ==================== +/** + * 图表数据点点击事件处理 + * @param params - ECharts点击事件参数 + */ +const handleChartClick = (params: any) => { + console.log('图表点击事件:', params); + + // 只处理数据系列的点击 + if (params.componentType === 'series') { + const { seriesName, name, value, dataIndex } = params; + + // 保存点击数据信息 + clickDataInfo.value = { + date: name, // 日期 + temperature: value, // 水温值 + type: seriesName, // 类型:入库水温/出库水温 + dataIndex: dataIndex // 数据索引 + }; + + // 获取站点名称(从下拉选项中查找) + // console.log('站点名称:', select.value.options, paramsOne.value.value); + const selectedStation = select.value.options + .flatMap((base: any) => base.children || []) + .find((station: any) => station.stcd === paramsOne.value.value); + stationName.value = selectedStation?.title || '未知站点'; + + // 打开弹框 + modalVisible.value = true; + } +}; + +/** + * 弹框关闭处理 + */ +const handleModalClose = () => { + modalVisible.value = false; + clickDataInfo.value = null; +}; + /** * SidePanelItem面板变化回调 * 处理下拉框和日期选择器的值变化 @@ -604,7 +660,7 @@ const handlePanelChange1 = (data: any) => { */ const getselsectData = async () => { loading.value = true; // 开始加载站点数据 - + try { let params = { "filter": { @@ -725,12 +781,19 @@ watch( .chart-container { width: 100%; height: 252px; - display: flex; - justify-content: center; - align-items: center; + display: flex; + justify-content: center; + align-items: center; /* 固定高度252px */ } -:deep(.ant-spin-nested-loading ){ - height: 252px !important; + +:deep(.ant-spin-nested-loading) { + height: 252px !important; +} + +/* 弹框内容样式 */ +.modal-content { + min-height: 100px; + padding: 16px 0; } \ No newline at end of file diff --git a/frontend/src/modules/diwenshuijianhuansheshileixingzuchengjijieruqingkuang/TwoLayers/diwenshuijianhuansheshileixingzuchengjijieruqingkuangTwoLayers.vue b/frontend/src/modules/diwenshuijianhuansheshileixingzuchengjijieruqingkuang/TwoLayers/diwenshuijianhuansheshileixingzuchengjijieruqingkuangTwoLayers.vue new file mode 100644 index 00000000..8ee5f4aa --- /dev/null +++ b/frontend/src/modules/diwenshuijianhuansheshileixingzuchengjijieruqingkuang/TwoLayers/diwenshuijianhuansheshileixingzuchengjijieruqingkuangTwoLayers.vue @@ -0,0 +1,525 @@ + + + + + \ No newline at end of file diff --git a/frontend/src/modules/diwenshuijianhuansheshileixingzuchengjijieruqingkuang/index.vue b/frontend/src/modules/diwenshuijianhuansheshileixingzuchengjijieruqingkuang/index.vue index e96ac64f..bc206e32 100644 --- a/frontend/src/modules/diwenshuijianhuansheshileixingzuchengjijieruqingkuang/index.vue +++ b/frontend/src/modules/diwenshuijianhuansheshileixingzuchengjijieruqingkuang/index.vue @@ -1,49 +1,42 @@ @@ -143,15 +253,24 @@ onMounted(() => { margin-top: 20px; font-size: 14px; color: #333; - .text_num{ + + .text_num { width: 100%; margin-top: 3px; text-align: center; // font-size: 16px; - color: #2f6b98; - font-size: 18px; + color: #2f6b98; + font-size: 18px; } } } } + +:deep(.ant-spin-nested-loading) { + height: 158px !important; +} + +.modal-content { + padding: 20px; +} \ No newline at end of file diff --git a/frontend/src/modules/monthlyAvgWaterTemCompareHistory/index.vue b/frontend/src/modules/monthlyAvgWaterTemCompareHistory/index.vue index b494d5fa..b91641fc 100644 --- a/frontend/src/modules/monthlyAvgWaterTemCompareHistory/index.vue +++ b/frontend/src/modules/monthlyAvgWaterTemCompareHistory/index.vue @@ -1,51 +1,429 @@ + + \ No newline at end of file diff --git a/frontend/src/modules/sheshileixingjieshao/index.vue b/frontend/src/modules/sheshileixingjieshao/index.vue index 39f863db..0a97b057 100644 --- a/frontend/src/modules/sheshileixingjieshao/index.vue +++ b/frontend/src/modules/sheshileixingjieshao/index.vue @@ -1,31 +1,46 @@ \ No newline at end of file diff --git a/frontend/src/modules/shuiWenNianNeiFenBu/TwoLayers/yaerAverage.vue b/frontend/src/modules/shuiWenNianNeiFenBu/TwoLayers/yaerAverage.vue new file mode 100644 index 00000000..3416ac8d --- /dev/null +++ b/frontend/src/modules/shuiWenNianNeiFenBu/TwoLayers/yaerAverage.vue @@ -0,0 +1,379 @@ + + + + + diff --git a/frontend/src/modules/shuiWenNianNeiFenBu/index.vue b/frontend/src/modules/shuiWenNianNeiFenBu/index.vue index 1ec6b599..34d4beac 100644 --- a/frontend/src/modules/shuiWenNianNeiFenBu/index.vue +++ b/frontend/src/modules/shuiWenNianNeiFenBu/index.vue @@ -1,28 +1,140 @@ \ No newline at end of file diff --git a/frontend/src/modules/shuiwenjiancegongzuokaizhangqingkuang/index.vue b/frontend/src/modules/shuiwenjiancegongzuokaizhangqingkuang/index.vue index 508477fa..f3f1a2dd 100644 --- a/frontend/src/modules/shuiwenjiancegongzuokaizhangqingkuang/index.vue +++ b/frontend/src/modules/shuiwenjiancegongzuokaizhangqingkuang/index.vue @@ -3,7 +3,8 @@
-
+
+ + @@ -33,7 +39,7 @@ import { ref, onMounted, watch } from "vue"; import SidePanelItem from "@/components/SidePanelItem/index.vue"; import { getKendoListCust, baseEvnmAutoMonitorGetKendoListCust } from "@/api/sw"; import { useJidiSelectEventStore } from "@/store/modules/jidiSelectEvent"; - +import ShuiwenjiancegongzuoEJ from "./shuiwenjiancegongzuoEJ.vue" const JidiSelectEventStore = useJidiSelectEventStore(); // 定义组件名(便于调试和递归) defineOptions({ @@ -46,21 +52,42 @@ const facilities = ref([ name: "表层水温", count: 0, icon: "icon iconfont icon-shuizhijiancezhan", + key:'26' }, { name: "垂向水温", count: 0, icon: "icon iconfont icon-diwenshuijianhuan", + key:'27' }, ]); // Loading 状态 const loading = ref(false); +// 弹框相关状态 +const modalVisible = ref(false); +const currentFacility = ref(null); + +// 点击处理函数 +const handleFacilityClick = (facility: any) => { + // console.log(facility); + currentFacility.value = facility; + modalVisible.value = true; + + +}; + +// 关闭弹框 +const handleCloseModal = () => { + modalVisible.value = false; + currentFacility.value = null; +}; + const init = async () => { // 防重复请求 if (loading.value) return; - + try { loading.value = true; const params = { @@ -79,8 +106,8 @@ const init = async () => { "field": "baseId", "operator": "eq", "value": baseid.value - }:null - ].filter(Boolean) + } : null + ].filter(Boolean) } } let res = await baseEvnmAutoMonitorGetKendoListCust(params); diff --git a/frontend/src/modules/shuiwenjiancegongzuokaizhangqingkuang/shuiwenjiancegongzuoEJ.vue b/frontend/src/modules/shuiwenjiancegongzuokaizhangqingkuang/shuiwenjiancegongzuoEJ.vue new file mode 100644 index 00000000..9d94fb55 --- /dev/null +++ b/frontend/src/modules/shuiwenjiancegongzuokaizhangqingkuang/shuiwenjiancegongzuoEJ.vue @@ -0,0 +1,548 @@ + + + + + diff --git a/frontend/src/modules/yanchengshuiwenChangeMod/index.vue b/frontend/src/modules/yanchengshuiwenChangeMod/index.vue index ffc8c8d8..25972d32 100644 --- a/frontend/src/modules/yanchengshuiwenChangeMod/index.vue +++ b/frontend/src/modules/yanchengshuiwenChangeMod/index.vue @@ -2,12 +2,12 @@ + + diff --git a/frontend/src/modules/monthlyAvgWaterTemCompareHistory/index.vue b/frontend/src/modules/monthlyAvgWaterTemCompareHistory/index.vue index b91641fc..feaae288 100644 --- a/frontend/src/modules/monthlyAvgWaterTemCompareHistory/index.vue +++ b/frontend/src/modules/monthlyAvgWaterTemCompareHistory/index.vue @@ -4,6 +4,9 @@ @update-values="handlePanelChange1">
+
+ 图表放大展示 +
@@ -11,24 +14,19 @@ - - + + + + + + + \ No newline at end of file diff --git a/frontend/src/modules/shuiWenNianNeiFenBu/TwoLayers/yaerAverage.vue b/frontend/src/modules/shuiWenNianNeiFenBu/TwoLayers/yaerAverage.vue index 3416ac8d..2ffe00b2 100644 --- a/frontend/src/modules/shuiWenNianNeiFenBu/TwoLayers/yaerAverage.vue +++ b/frontend/src/modules/shuiWenNianNeiFenBu/TwoLayers/yaerAverage.vue @@ -299,14 +299,15 @@ watch( formState.tm = newTm ? dayjs(newTm) : null formState.dataDimensionVal = newDataDimensionVal || '' formState.stcd = String(newStcd || '') - + // 如果基地发生变化,需要重新获取断面列表 if (newDataDimensionVal !== oldDataDimensionVal && newDataDimensionVal) { await fetchDmData() + // 请求数据 + handleSearch() } - - // 请求数据 - handleSearch() + + } }, { deep: true } @@ -370,10 +371,12 @@ defineExpose({ } } } -.text_hocer{ + +.text_hocer { color: #2f6b98; } -.text_hocer:hover{ + +.text_hocer:hover { color: #40a9ff; } diff --git a/frontend/src/modules/shuiWenNianNeiFenBu/index.vue b/frontend/src/modules/shuiWenNianNeiFenBu/index.vue index 34d4beac..b8e28cff 100644 --- a/frontend/src/modules/shuiWenNianNeiFenBu/index.vue +++ b/frontend/src/modules/shuiWenNianNeiFenBu/index.vue @@ -152,7 +152,7 @@ const getColorByCodeAndType = (_code: string[], _typeKey: string[]) => { // 处理图表数据点点击事件 const handleChartClick = (params: any) => { - if (!params || !params.dataIndex) return + if (!params || !String(params.dataIndex)) return // 获取点击的数据点索引 const dataIndex = params.dataIndex @@ -214,7 +214,7 @@ const getselectData = async () => { let data = res?.data?.date || res?.data || [] // 设置默认选中值(第一个站点的 stcd) if (res.data) { - select.value.value = data?.data[0]?.stcd + select.value.value = data?.data[0]?.stcd } else { select.value.value = '' } @@ -269,7 +269,6 @@ const getselectData = async () => { select.value.options = [...dataMapNameArr, ...otherArr] - // debugger // if (baseid.value == 'all') { // select.value.value = '008640202300001021' // } @@ -286,7 +285,11 @@ const getselectData = async () => { //水温年内分布 const getshuiwenList = async () => { if (loading.value) return; // 防止重复请求 - + if (!select.value.value) { + showemit.value = false + waterTempData.value = [] + return; + } loading.value = true; const params = { @@ -387,7 +390,8 @@ const getChartOption = () => { params.forEach((item: any) => { result += `
`; result += ``; - result += `${item.seriesName} ${item.value}${unit}`; + const displayValue = item.value !== null && item.value !== undefined ? item.value : '-'; + result += `${item.seriesName} ${displayValue}${unit}`; result += `
`; }); return result; @@ -556,11 +560,10 @@ const handleResize = () => { onMounted(() => { // 初始化图表 initChart() - // 加载初始数据 - if (select.value.value) { - getshuiwenList() - } + // if (select.value.value) { + // getshuiwenList() + // } }) onBeforeUnmount(() => { @@ -576,7 +579,9 @@ const handlePanelChange1 = (data) => { // 当选择器或日期变化时,重新加载图表数据 if (data.moreSelect || data.datetime) { - select.value.value = data.moreSelect + select.value.value = data.moreSelect + datetimePicker.value.value = data.datetime + // debugger getshuiwenList() } } diff --git a/frontend/src/modules/shuiwenjiancegongzuokaizhangqingkuang/shuiwenjiancegongzuoEJ.vue b/frontend/src/modules/shuiwenjiancegongzuokaizhangqingkuang/shuiwenjiancegongzuoEJ.vue index 9d94fb55..852e4159 100644 --- a/frontend/src/modules/shuiwenjiancegongzuokaizhangqingkuang/shuiwenjiancegongzuoEJ.vue +++ b/frontend/src/modules/shuiwenjiancegongzuokaizhangqingkuang/shuiwenjiancegongzuoEJ.vue @@ -51,7 +51,7 @@ @@ -79,6 +79,7 @@ const pagination = ref({ current: 1, pageSize: 20, total: 0, + size: 'small', showSizeChanger: true, showQuickJumper: true, showTotal: (total: number) => `共 ${total} 条`, @@ -322,7 +323,6 @@ const fetchData = async () => { // 数据处理 let total = res.data.total let records = res?.data?.data || res?.data - // debugger // if (Array.isArray(res?.data?.data)) { // records = res.data.data // total = res.data.data.length @@ -539,10 +539,12 @@ onMounted(() => { overflow: hidden; } } -.text_hocer{ + +.text_hocer { color: #2f6b98; } -.text_hocer:hover{ + +.text_hocer:hover { color: #40a9ff; } diff --git a/frontend/src/modules/yanchengshuiwenChangeMod/index.vue b/frontend/src/modules/yanchengshuiwenChangeMod/index.vue index 25972d32..484415a2 100644 --- a/frontend/src/modules/yanchengshuiwenChangeMod/index.vue +++ b/frontend/src/modules/yanchengshuiwenChangeMod/index.vue @@ -410,7 +410,6 @@ const init = async () => { //获取选择器配置参数 const getSelectConfig = async () => { loading.value = true; - try { let obj: any = {} if (baseid.value === 'all') { @@ -473,7 +472,6 @@ const getSelectConfig = async () => { } return { label: item.wbsName, value: item.wbsCode, baseId: objId, baseName: jiDiListMap[objId] } }) - // debugger let dataMapNameArr: any = [] Object.keys(dataMapNameMap).forEach((item: any) => { From de04f0ec497c58b77b65eb920859dae2274f956d Mon Sep 17 00:00:00 2001 From: tangwei Date: Thu, 28 May 2026 09:19:46 +0800 Subject: [PATCH 30/41] =?UTF-8?q?fix:=20=E4=BC=98=E5=8C=96=E9=80=BB?= =?UTF-8?q?=E8=BE=91?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../yfd/platform/env/wq/service/impl/EnvWqDataServiceImpl.java | 2 ++ 1 file changed, 2 insertions(+) diff --git a/backend/src/main/java/com/yfd/platform/env/wq/service/impl/EnvWqDataServiceImpl.java b/backend/src/main/java/com/yfd/platform/env/wq/service/impl/EnvWqDataServiceImpl.java index 1b598286..58ec668d 100644 --- a/backend/src/main/java/com/yfd/platform/env/wq/service/impl/EnvWqDataServiceImpl.java +++ b/backend/src/main/java/com/yfd/platform/env/wq/service/impl/EnvWqDataServiceImpl.java @@ -173,6 +173,7 @@ public class EnvWqDataServiceImpl implements EnvWqDataService { .append(groupColumn).append(" AS ").append(groupField.toUpperCase()).append(", ") .append("COUNT(*) AS COUNT_").append(groupField.toUpperCase()).append(" ") .append("FROM SD_WQ_B_H t ") + .append("LEFT JOIN SD_ENGINFO_B_H eng ON eng.STCD = t.RSTCD ") .append("WHERE NVL(t.IS_DELETED, 0) = 0 "); Map paramMap = new HashMap<>(); @@ -1487,6 +1488,7 @@ public class EnvWqDataServiceImpl implements EnvWqDataService { case "dtinType" -> "t.DTIN_TYPE"; case "stcd" -> "t.STCD"; case "stnm" -> "t.STNM"; + case "baseId" -> "eng.BASE_ID"; case "dtin" -> "t.DTIN"; default -> null; }; From c234d57ccd116ed4311bb6f911f5a70e4f3cb121 Mon Sep 17 00:00:00 2001 From: tangwei Date: Thu, 28 May 2026 10:06:20 +0800 Subject: [PATCH 31/41] =?UTF-8?q?fix:=20=E4=BC=98=E5=8C=96=E9=80=BB?= =?UTF-8?q?=E8=BE=91?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../wq/service/impl/EnvWqDataServiceImpl.java | 260 +++++++++++++++++- 1 file changed, 252 insertions(+), 8 deletions(-) diff --git a/backend/src/main/java/com/yfd/platform/env/wq/service/impl/EnvWqDataServiceImpl.java b/backend/src/main/java/com/yfd/platform/env/wq/service/impl/EnvWqDataServiceImpl.java index 58ec668d..26819e79 100644 --- a/backend/src/main/java/com/yfd/platform/env/wq/service/impl/EnvWqDataServiceImpl.java +++ b/backend/src/main/java/com/yfd/platform/env/wq/service/impl/EnvWqDataServiceImpl.java @@ -13,12 +13,7 @@ import com.yfd.platform.common.GroupingInfo; import com.yfd.platform.common.MicroservicDynamicSQLMapper; import com.yfd.platform.common.PageInfo; import com.yfd.platform.common.exception.BizException; -import com.yfd.platform.env.wq.entity.vo.EnvWqDataVo; -import com.yfd.platform.env.wq.entity.vo.EnvWqVo; -import com.yfd.platform.env.wq.entity.vo.StTbYsVo; -import com.yfd.platform.env.wq.entity.vo.WqBaseInfoVo; -import com.yfd.platform.env.wq.entity.vo.WqMsstbprptGroupVo; -import com.yfd.platform.env.wq.entity.vo.WqVmsstbprptVo; +import com.yfd.platform.env.wq.entity.vo.*; import com.yfd.platform.env.wq.service.EnvWqDataService; import com.yfd.platform.env.wt.entity.vo.WbsbVo; import com.yfd.platform.utils.KendoUtil; @@ -28,14 +23,15 @@ import com.yfd.platform.utils.SecurityUtils; import jakarta.annotation.Resource; import org.springframework.stereotype.Service; +import java.math.BigDecimal; import java.util.ArrayList; import java.util.Arrays; import java.util.Comparator; +import java.util.Date; import java.util.HashMap; import java.util.LinkedHashMap; import java.util.List; import java.util.Map; -import java.math.BigDecimal; import java.util.Set; import java.util.stream.Collectors; @@ -146,7 +142,255 @@ public class EnvWqDataServiceImpl implements EnvWqDataService { @Override public DataSourceResult getAlongWqKendoListCust(DataSourceRequest dataSourceRequest) { - return emptyResult(); + DataSourceLoadOptionsBase loadOptions = dataSourceRequest == null ? null : dataSourceRequest.toDevRequest(); + String rvcd = findFilterFieldValue(dataSourceRequest == null ? null : dataSourceRequest.getFilter(), "rvcd"); + if (StrUtil.isBlank(rvcd) && loadOptions != null) { + rvcd = QgcQueryWrapperUtil.getFilterFieldValue(loadOptions, "rvcd"); + } + String baseId = findFilterFieldValue(dataSourceRequest == null ? null : dataSourceRequest.getFilter(), "baseId"); + if (StrUtil.isBlank(baseId) && loadOptions != null) { + baseId = QgcQueryWrapperUtil.getFilterFieldValue(loadOptions, "baseId"); + } + String tm = findFilterFieldValue(dataSourceRequest == null ? null : dataSourceRequest.getFilter(), "tm"); + if (StrUtil.isBlank(tm) && loadOptions != null) { + tm = QgcQueryWrapperUtil.getFilterFieldValue(loadOptions, "tm"); + } + if (StrUtil.isBlank(tm)) { + throw new BizException("时间(tm)不能为空."); + } + + String[] tmRange = normalizeTmRange(tm); + Map maxTmParamMap = new HashMap<>(); + if (StrUtil.isNotBlank(rvcd)) { + maxTmParamMap.put("rvcd", rvcd); + } + if (StrUtil.isNotBlank(baseId)) { + maxTmParamMap.put("baseId", baseId); + } + if (tmRange != null) { + maxTmParamMap.put("startTime", tmRange[0]); + maxTmParamMap.put("endTime", tmRange[1]); + } + List> maxTmRows = microservicDynamicSQLMapper.pageAllList( + null, + buildAlongWqMaxTmSql(rvcd, baseId, tmRange != null), + maxTmParamMap + ); + Date maxTm = null; + if (CollUtil.isNotEmpty(maxTmRows)) { + Object value = maxTmRows.get(0).get("TM"); + if (value instanceof Date) { + maxTm = (Date) value; + } + } + + Map listParamMap = new HashMap<>(); + if (StrUtil.isNotBlank(rvcd)) { + listParamMap.put("rvcd", rvcd); + } + if (StrUtil.isNotBlank(baseId)) { + listParamMap.put("baseId", baseId); + } + if (maxTm != null) { + listParamMap.put("maxTm", maxTm); + } + List alongList = microservicDynamicSQLMapper.getAllListWithResultType( + buildAlongWqListSql(rvcd, baseId, maxTm != null), + listParamMap, + WqAlongVo.class + ); + if (CollUtil.isEmpty(alongList)) { + return emptyResult(); + } + + Set rstcdSet = alongList.stream() + .filter(item -> "WQ".equalsIgnoreCase(item.getSttp())) + .map(WqAlongVo::getRstcd) + .filter(StrUtil::isNotBlank) + .collect(Collectors.toSet()); + alongList = alongList.stream() + .filter(item -> "WQ".equalsIgnoreCase(item.getSttp()) || rstcdSet.contains(item.getStcd())) + .collect(Collectors.toList()); + + for (WqAlongVo item : alongList) { + item.setMinTm(maxTm); + item.setTm(maxTm); + item.setWqgrdName(getWqLevelName(item.getWqgrd())); + } + fillWqAlongLimit(alongList); + + DataSourceResult result = new DataSourceResult<>(); + result.setData(alongList); + result.setTotal((long) alongList.size()); + result.setAggregates(new HashMap<>()); + return result; + } + + private String[] normalizeTmRange(String tm) { + if (StrUtil.isBlank(tm)) { + return null; + } + String[] parts = tm.split(","); + if (parts.length != 2) { + return null; + } + String first = StrUtil.trim(parts[0]); + String second = StrUtil.trim(parts[1]); + if (StrUtil.isBlank(first) || StrUtil.isBlank(second)) { + return null; + } + return first.compareTo(second) <= 0 ? new String[]{first, second} : new String[]{second, first}; + } + + private String buildAlongWqMaxTmSql(String rvcd, String baseId, boolean hasTmRange) { + StringBuilder sql = new StringBuilder(); + sql.append("SELECT TM FROM (") + .append("SELECT swr.TM ") + .append("FROM MS_ALONG_B mab ") + .append("INNER JOIN MS_ALONGDET_B sab ON mab.ID = sab.ALONG_ID AND mab.CODE = 'common' ") + .append("INNER JOIN SD_WQ_B_H wq ON wq.STCD = sab.STCD AND wq.STTP = 'WQ' AND NVL(wq.IS_DELETED, 0) = 0 ") + .append("LEFT JOIN SD_ENGINFO_B_H eng ON eng.STCD = wq.RSTCD AND NVL(eng.IS_DELETED, 0) = 0 ") + .append("LEFT JOIN (SELECT * FROM SD_WQ_R WHERE NVL(IS_DELETED, 0) = 0 "); + if (hasTmRange) { + sql.append("AND TM BETWEEN TO_DATE(#{map.startTime}, 'YYYY-MM-DD HH24:MI:SS') ") + .append("AND TO_DATE(#{map.endTime}, 'YYYY-MM-DD HH24:MI:SS') "); + } + sql.append(") swr ON swr.STCD = sab.STCD ") + .append("WHERE sab.STTP = 'WQ' ") + .append("AND NVL(mab.IS_DELETED, 0) = 0 ") + .append("AND NVL(sab.IS_DELETED, 0) = 0 "); + if (StrUtil.isNotBlank(rvcd)) { + sql.append("AND mab.RVCD = #{map.rvcd} "); + } + if (StrUtil.isNotBlank(baseId)) { + sql.append("AND eng.BASE_ID = #{map.baseId} "); + } + sql.append("AND swr.TM IS NOT NULL ") + .append("ORDER BY NVL(mab.ORDER_INDEX, 999999) ASC, NVL(sab.SORT, 999999) ASC, swr.TM DESC") + .append(") WHERE ROWNUM = 1"); + return sql.toString(); + } + + private String buildAlongWqListSql(String rvcd, String baseId, boolean hasMaxTm) { + StringBuilder sql = new StringBuilder(); + sql.append("SELECT ") + .append("COALESCE(wq.STCD, engNode.STCD, sab.STCD) AS stcd, ") + .append("COALESCE(wq.RSTCD, sab.RSTCD, engNode.STCD) AS rstcd, ") + .append("COALESCE(wq.STNM, engNode.ENNM) AS stnm, ") + .append("sab.STTP AS sttp, ") + .append("swr.TM AS tm, ") + .append("swr.WTMP AS wtmp, ") + .append("swr.PH AS ph, ") + .append("swr.DOX AS dox, ") + .append("swr.CODMN AS codmn, ") + .append("swr.CODCR AS codcr, ") + .append("swr.BOD5 AS bod5, ") + .append("swr.NH3N AS nh3n, ") + .append("swr.TP AS tp, ") + .append("swr.TN AS tn, ") + .append("swr.CU AS cu, ") + .append("swr.ZN AS zn, ") + .append("swr.F AS f, ") + .append("swr.SE AS se, ") + .append("swr.ARS AS ars, ") + .append("swr.HG AS hg, ") + .append("swr.CD AS cd, ") + .append("swr.CR6 AS cr6, ") + .append("swr.PB AS pb, ") + .append("swr.CN AS cn, ") + .append("swr.VLPH AS vlph, ") + .append("swr.OIL AS oil, ") + .append("swr.LAS AS las, ") + .append("swr.S2 AS s2, ") + .append("swr.FCG AS fcg, ") + .append("swr.CL AS cl, ") + .append("swr.SO4 AS so4, ") + .append("swr.NO3 AS no3, ") + .append("swr.THRD AS thrd, ") + .append("swr.COND AS cond, ") + .append("swr.FE AS fe, ") + .append("swr.MN AS mn, ") + .append("swr.AL AS al, ") + .append("swr.CHLA AS chla, ") + .append("swr.CLARITY AS clarity, ") + .append("swr.TU AS tu, ") + .append("swr.CYANO AS cyano, ") + .append("TO_CHAR(wq.WWQTG) AS wwqtg, ") + .append("TO_CHAR(swr.WQGRD) AS wqgrd ") + .append("FROM MS_ALONG_B mab ") + .append("INNER JOIN MS_ALONGDET_B sab ON mab.ID = sab.ALONG_ID AND mab.CODE = 'common' ") + .append("LEFT JOIN SD_WQ_B_H wq ON wq.STCD = sab.STCD AND sab.STTP = 'WQ' AND NVL(wq.IS_DELETED, 0) = 0 ") + .append("LEFT JOIN SD_ENGINFO_B_H engNode ON engNode.STCD = sab.STCD AND sab.STTP = 'ENG' AND NVL(engNode.IS_DELETED, 0) = 0 ") + .append("LEFT JOIN SD_ENGINFO_B_H eng ON eng.STCD = COALESCE(wq.RSTCD, sab.RSTCD, engNode.STCD) AND NVL(eng.IS_DELETED, 0) = 0 ") + .append("LEFT JOIN (SELECT * FROM SD_WQ_R WHERE NVL(IS_DELETED, 0) = 0 "); + if (hasMaxTm) { + sql.append("AND TM = #{map.maxTm} "); + } else { + sql.append("AND 1 = 0 "); + } + sql.append(") swr ON swr.STCD = sab.STCD ") + .append("WHERE NVL(mab.IS_DELETED, 0) = 0 ") + .append("AND NVL(sab.IS_DELETED, 0) = 0 ") + .append("AND sab.STTP IN ('ENG', 'WQ') ") + .append("AND ((sab.STTP = 'WQ' AND wq.STCD IS NOT NULL) OR (sab.STTP = 'ENG' AND engNode.STCD IS NOT NULL)) "); + if (StrUtil.isNotBlank(rvcd)) { + sql.append("AND mab.RVCD = #{map.rvcd} "); + } + if (StrUtil.isNotBlank(baseId)) { + sql.append("AND eng.BASE_ID = #{map.baseId} "); + } + sql.append("ORDER BY NVL(mab.ORDER_INDEX, 999999) ASC, NVL(sab.SORT, 999999) ASC"); + return sql.toString(); + } + + private void fillWqAlongLimit(List list) { + if (CollUtil.isEmpty(list)) { + return; + } + String sql = "SELECT t2.YS AS ys, t2.MIN_VAL AS minVal, t2.MAX_VAL AS maxVal, t2.LVL AS lvl " + + "FROM MS_WARN_RULE_B t1 " + + "INNER JOIN MS_WARN_RULE_DETAIL_B t2 ON t1.ID = t2.RULE_ID " + + "WHERE t1.RULE_TYPE = 'WQLVL'"; + List> ruleList = microservicDynamicSQLMapper.pageAllList(null, sql, null); + if (CollUtil.isEmpty(ruleList)) { + return; + } + Map ruleDirectionMap = getWqLimitDirection(ruleList); + Map>> levelRuleMap = ruleList.stream() + .filter(item -> StrUtil.isNotBlank(asString(item.get("lvl")))) + .collect(Collectors.groupingBy(item -> asString(item.get("lvl")))); + + for (WqAlongVo item : list) { + if (StrUtil.isBlank(item.getWwqtg())) { + continue; + } + List> currentRules = levelRuleMap.get(item.getWwqtg()); + if (CollUtil.isEmpty(currentRules)) { + continue; + } + List> max = new ArrayList<>(); + List> min = new ArrayList<>(); + for (Map rule : currentRules) { + String ys = asString(rule.get("ys")); + Integer direction = ruleDirectionMap.get(ys); + Map maxMap = new LinkedHashMap<>(); + Map minMap = new LinkedHashMap<>(); + if (direction != null && direction == 2) { + maxMap.put(ys, rule.get("maxVal")); + minMap.put(ys, rule.get("minVal")); + max.add(maxMap); + min.add(minMap); + } else if (direction != null && direction == 1) { + minMap.put(ys, rule.get("minVal")); + min.add(minMap); + } else { + maxMap.put(ys, rule.get("maxVal")); + max.add(maxMap); + } + } + item.setMax(max); + item.setMin(min); + } } @Override From 8c2fb08efe3bb578b70d86bcd7bb721c9910dd7f Mon Sep 17 00:00:00 2001 From: tangwei Date: Thu, 28 May 2026 10:15:38 +0800 Subject: [PATCH 32/41] =?UTF-8?q?feat:=20=E8=8E=B7=E5=8F=96=E6=B0=B4?= =?UTF-8?q?=E8=B4=A8=E6=B2=BF=E7=A8=8B=E5=8F=98=E5=8C=96=E9=BB=98=E8=AE=A4?= =?UTF-8?q?=E6=9C=89=E6=95=B0=E6=8D=AE=E7=9A=84=E6=B2=B3=E6=B5=81?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../wq/controller/EnvWqDataController.java | 6 ++ .../env/wq/service/EnvWqDataService.java | 2 + .../wq/service/impl/EnvWqDataServiceImpl.java | 72 +++++++++++++++++++ 3 files changed, 80 insertions(+) diff --git a/backend/src/main/java/com/yfd/platform/env/wq/controller/EnvWqDataController.java b/backend/src/main/java/com/yfd/platform/env/wq/controller/EnvWqDataController.java index b2869313..cccb91d8 100644 --- a/backend/src/main/java/com/yfd/platform/env/wq/controller/EnvWqDataController.java +++ b/backend/src/main/java/com/yfd/platform/env/wq/controller/EnvWqDataController.java @@ -59,6 +59,12 @@ public class EnvWqDataController { return ResponseResult.successData(envWqDataService.getAlongWqKendoListCust(dataSourceRequest)); } + @PostMapping("/along/default/rvcd") + @Operation(summary = "获取水质沿程变化默认有数据的河流") + public ResponseResult getAlongDefaultRvcd(@RequestBody DataSourceRequest dataSourceRequest) { + return ResponseResult.successData(envWqDataService.getAlongDefaultRvcd(dataSourceRequest)); + } + @PostMapping("/msstbprpt/GetKendoList") @Operation(summary = "查询水质基础站点分组统计") public ResponseResult getMsstbprptList(@RequestBody DataSourceRequest dataSourceRequest) { diff --git a/backend/src/main/java/com/yfd/platform/env/wq/service/EnvWqDataService.java b/backend/src/main/java/com/yfd/platform/env/wq/service/EnvWqDataService.java index a479bd86..a2583f90 100644 --- a/backend/src/main/java/com/yfd/platform/env/wq/service/EnvWqDataService.java +++ b/backend/src/main/java/com/yfd/platform/env/wq/service/EnvWqDataService.java @@ -12,6 +12,8 @@ public interface EnvWqDataService { DataSourceResult getAlongWqKendoListCust(DataSourceRequest dataSourceRequest); + DataSourceResult getAlongDefaultRvcd(DataSourceRequest dataSourceRequest); + DataSourceResult getMsstbprptList(DataSourceRequest dataSourceRequest); DataSourceResult getVmsstbprptList(DataSourceRequest dataSourceRequest); diff --git a/backend/src/main/java/com/yfd/platform/env/wq/service/impl/EnvWqDataServiceImpl.java b/backend/src/main/java/com/yfd/platform/env/wq/service/impl/EnvWqDataServiceImpl.java index 26819e79..251334d4 100644 --- a/backend/src/main/java/com/yfd/platform/env/wq/service/impl/EnvWqDataServiceImpl.java +++ b/backend/src/main/java/com/yfd/platform/env/wq/service/impl/EnvWqDataServiceImpl.java @@ -226,6 +226,44 @@ public class EnvWqDataServiceImpl implements EnvWqDataService { return result; } + @Override + public DataSourceResult getAlongDefaultRvcd(DataSourceRequest dataSourceRequest) { + String baseId = findFilterFieldValue(dataSourceRequest == null ? null : dataSourceRequest.getFilter(), "baseId"); + String tm = findFilterFieldValue(dataSourceRequest == null ? null : dataSourceRequest.getFilter(), "tm"); + DataSourceLoadOptionsBase loadOptions = dataSourceRequest == null ? null : dataSourceRequest.toDevRequest(); + if (StrUtil.isBlank(baseId) && loadOptions != null) { + baseId = QgcQueryWrapperUtil.getFilterFieldValue(loadOptions, "baseId"); + } + if (StrUtil.isBlank(tm) && loadOptions != null) { + tm = QgcQueryWrapperUtil.getFilterFieldValue(loadOptions, "tm"); + } + if (StrUtil.isBlank(baseId)) { + return emptyResult(); + } + + Map paramMap = new HashMap<>(); + paramMap.put("baseId", baseId); + String sql; + if (StrUtil.isBlank(tm)) { + sql = buildAlongDefaultRvcdLatestSql(); + } else { + String[] tmRange = normalizeTmRange(tm); + if (tmRange == null) { + throw new BizException("时间(tm)格式错误."); + } + paramMap.put("startTime", tmRange[0]); + paramMap.put("endTime", tmRange[1]); + sql = buildAlongDefaultRvcdByRangeSql(); + } + + List> list = microservicDynamicSQLMapper.pageAllList(null, sql, paramMap); + DataSourceResult> result = new DataSourceResult<>(); + result.setData(list); + result.setTotal((long) list.size()); + result.setAggregates(new HashMap<>()); + return result; + } + private String[] normalizeTmRange(String tm) { if (StrUtil.isBlank(tm)) { return null; @@ -242,6 +280,40 @@ public class EnvWqDataServiceImpl implements EnvWqDataService { return first.compareTo(second) <= 0 ? new String[]{first, second} : new String[]{second, first}; } + private String buildAlongDefaultRvcdByRangeSql() { + return "SELECT rvcd FROM ( " + + "SELECT mab.RVCD AS rvcd " + + "FROM MS_ALONG_B mab " + + "INNER JOIN MS_ALONGDET_B sab ON sab.ALONG_ID = mab.ID " + + "INNER JOIN SD_WQ_B_H wq ON wq.STCD = sab.STCD AND wq.STTP = 'WQ' AND NVL(wq.IS_DELETED, 0) = 0 " + + "INNER JOIN SD_ENGINFO_B_H eng ON eng.STCD = wq.RSTCD AND NVL(eng.IS_DELETED, 0) = 0 " + + "INNER JOIN SD_WQ_R r ON r.STCD = sab.STCD AND NVL(r.IS_DELETED, 0) = 0 " + + "WHERE NVL(mab.IS_DELETED, 0) = 0 " + + " AND NVL(sab.IS_DELETED, 0) = 0 " + + " AND mab.CODE = 'common' " + + " AND eng.BASE_ID = #{map.baseId} " + + " AND r.TM >= TO_DATE(#{map.startTime}, 'YYYY-MM-DD HH24:MI:SS') " + + " AND r.TM <= TO_DATE(#{map.endTime}, 'YYYY-MM-DD HH24:MI:SS') " + + "ORDER BY NVL(mab.ORDER_INDEX, 999999) ASC, NVL(sab.SORT, 999999) ASC " + + ") WHERE ROWNUM = 1"; + } + + private String buildAlongDefaultRvcdLatestSql() { + return "SELECT rvcd, tm FROM ( " + + "SELECT mab.RVCD AS rvcd, TRUNC(r.TM, 'HH24') AS tm " + + "FROM MS_ALONG_B mab " + + "INNER JOIN MS_ALONGDET_B sab ON sab.ALONG_ID = mab.ID " + + "INNER JOIN SD_WQ_B_H wq ON wq.STCD = sab.STCD AND sab.STTP = 'WQ' AND NVL(wq.IS_DELETED, 0) = 0 " + + "INNER JOIN SD_ENGINFO_B_H eng ON eng.STCD = wq.RSTCD AND NVL(eng.IS_DELETED, 0) = 0 " + + "INNER JOIN SD_WQ_R r ON r.STCD = sab.STCD AND NVL(r.IS_DELETED, 0) = 0 " + + "WHERE NVL(mab.IS_DELETED, 0) = 0 " + + " AND NVL(sab.IS_DELETED, 0) = 0 " + + " AND mab.CODE = 'common' " + + " AND eng.BASE_ID = #{map.baseId} " + + "ORDER BY r.TM DESC " + + ") WHERE ROWNUM = 1"; + } + private String buildAlongWqMaxTmSql(String rvcd, String baseId, boolean hasTmRange) { StringBuilder sql = new StringBuilder(); sql.append("SELECT TM FROM (") From 652abf2cb22ddf1c0369e446af723b43699738c7 Mon Sep 17 00:00:00 2001 From: tangwei Date: Thu, 28 May 2026 10:30:40 +0800 Subject: [PATCH 33/41] =?UTF-8?q?fix:=20=E4=BC=98=E5=8C=96=E9=80=BB?= =?UTF-8?q?=E8=BE=91?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../env/wq/service/impl/EnvWqDataServiceImpl.java | 13 +++++++++++-- 1 file changed, 11 insertions(+), 2 deletions(-) diff --git a/backend/src/main/java/com/yfd/platform/env/wq/service/impl/EnvWqDataServiceImpl.java b/backend/src/main/java/com/yfd/platform/env/wq/service/impl/EnvWqDataServiceImpl.java index 251334d4..b7bc6abe 100644 --- a/backend/src/main/java/com/yfd/platform/env/wq/service/impl/EnvWqDataServiceImpl.java +++ b/backend/src/main/java/com/yfd/platform/env/wq/service/impl/EnvWqDataServiceImpl.java @@ -1908,11 +1908,11 @@ public class EnvWqDataServiceImpl implements EnvWqDataService { } - @Override public DataSourceResult getWbsbList(DataSourceRequest dataSourceRequest) { DataSourceLoadOptionsBase loadOptions = dataSourceRequest == null ? null : dataSourceRequest.toDevRequest(); String wbsType = loadOptions == null ? null : QgcQueryWrapperUtil.getFilterFieldValue(loadOptions, "wbsType"); + String objId = loadOptions == null ? null : QgcQueryWrapperUtil.getFilterFieldValue(loadOptions, "objId"); if (!"PSB_RVCD".equalsIgnoreCase(wbsType) && !"PSB".equalsIgnoreCase(wbsType)) { DataSourceResult emptyResult = new DataSourceResult<>(); emptyResult.setData(new ArrayList<>()); @@ -1922,6 +1922,7 @@ public class EnvWqDataServiceImpl implements EnvWqDataService { } StringBuilder sql = new StringBuilder(); + Map paramMap = new HashMap<>(); if ("PSB".equalsIgnoreCase(wbsType)) { sql.append("SELECT ") .append("t.BASEID AS id, ") @@ -1974,6 +1975,10 @@ public class EnvWqDataServiceImpl implements EnvWqDataService { .append("NULL AS displayDepartment ") .append("FROM SD_HYDROBASE t ") .append("WHERE NVL(t.IS_DELETED, 0) = 0 "); + if (StrUtil.isNotBlank(objId)) { + sql.append("AND t.BASEID = #{map.objId} "); + paramMap.put("objId", objId); + } sql.append("ORDER BY NVL(t.ORDER_INDEX, 999999), t.BASENAME ASC"); } else { sql.append("SELECT ") @@ -2028,9 +2033,13 @@ public class EnvWqDataServiceImpl implements EnvWqDataService { .append("NULL AS displayDepartment ") .append("FROM SD_HBRV_DIC t ") .append("WHERE NVL(t.IS_DELETED, 0) = 0 "); + if (StrUtil.isNotBlank(objId)) { + sql.append("AND t.BASEID = #{map.objId} "); + paramMap.put("objId", objId); + } sql.append("ORDER BY NVL(t.ORDER_INDEX, 999999), t.HBRVNM ASC"); } - List list = microservicDynamicSQLMapper.getAllListWithResultType(sql.toString(), new HashMap<>(), WbsbVo.class); + List list = microservicDynamicSQLMapper.getAllListWithResultType(sql.toString(), paramMap, WbsbVo.class); DataSourceResult result = new DataSourceResult<>(); result.setData(list); result.setTotal((long) list.size()); From 81cefa3ffbd59aea8b6df44d5a2d0c47dbbdfd6a Mon Sep 17 00:00:00 2001 From: tangwei Date: Thu, 28 May 2026 11:12:20 +0800 Subject: [PATCH 34/41] =?UTF-8?q?feat:=20=E6=B0=B4=E8=B4=A8=E7=9B=91?= =?UTF-8?q?=E6=B5=8B=E6=95=B0=E6=8D=AE=E6=9F=A5=E8=AF=A2?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../wq/controller/EnvWqDataController.java | 15 ++- .../platform/env/wq/entity/vo/StbprpYsVo.java | 65 +++++++++ .../env/wq/service/EnvWqDataService.java | 4 +- .../wq/service/impl/EnvWqDataServiceImpl.java | 127 ++++++++++++------ 4 files changed, 167 insertions(+), 44 deletions(-) create mode 100644 backend/src/main/java/com/yfd/platform/env/wq/entity/vo/StbprpYsVo.java diff --git a/backend/src/main/java/com/yfd/platform/env/wq/controller/EnvWqDataController.java b/backend/src/main/java/com/yfd/platform/env/wq/controller/EnvWqDataController.java index cccb91d8..1da75e39 100644 --- a/backend/src/main/java/com/yfd/platform/env/wq/controller/EnvWqDataController.java +++ b/backend/src/main/java/com/yfd/platform/env/wq/controller/EnvWqDataController.java @@ -36,15 +36,20 @@ public class EnvWqDataController { } @PostMapping("/GetStbprpYsByStcd") - @Operation(summary = "水质统计分析") + @Operation(summary = "水质监测数据查询") public ResponseResult GetStbprpYsByStcd(@RequestBody DataSourceRequest dataSourceRequest) { - return ResponseResult.successData(null); + return ResponseResult.successData(envWqDataService.getStbprpYsByStcd(dataSourceRequest)); } - @PostMapping("/stTbYs/GetStTbYsBVoKendoListCust") + + @GetMapping("/stTbYs/GetStTbYsBVoKendoListCust") @Operation(summary = "水质监测信息查询") - public ResponseResult getStTbYsBVoKendoListCust(@RequestBody DataSourceRequest dataSourceRequest) { - return ResponseResult.successData(envWqDataService.getStTbYsBVoKendoListCust(dataSourceRequest)); + public ResponseResult getStTbYsBVoKendoListCust( + @RequestParam String stcd, + @RequestParam String tbCode, + @RequestParam String startTime, + @RequestParam String endTime) { + return ResponseResult.successData(envWqDataService.getStTbYsBVoKendoListCust(stcd, tbCode, startTime, endTime)); } @PostMapping("/data/noAuth/GetKendoListCust") diff --git a/backend/src/main/java/com/yfd/platform/env/wq/entity/vo/StbprpYsVo.java b/backend/src/main/java/com/yfd/platform/env/wq/entity/vo/StbprpYsVo.java new file mode 100644 index 00000000..f5c5d413 --- /dev/null +++ b/backend/src/main/java/com/yfd/platform/env/wq/entity/vo/StbprpYsVo.java @@ -0,0 +1,65 @@ +package com.yfd.platform.env.wq.entity.vo; + +import io.swagger.v3.oas.annotations.media.Schema; +import lombok.Data; + +import java.math.BigDecimal; + +@Data +@Schema(description = "对象监测要素配置") +public class StbprpYsVo { + + @Schema(description = "对象编码") + private String stcd; + + @Schema(description = "要素编码") + private String ys; + + @Schema(description = "监测表ID") + private String tbId; + + @Schema(description = "要素显示名称") + private String ysShowName; + + @Schema(description = "显示控制") + private String showControl; + + @Schema(description = "是否启用") + private String enable; + + @Schema(description = "字段数据类型") + private String dataType; + + @Schema(description = "标准单位ID") + private String standardUomId; + + @Schema(description = "监测表名称") + private String tbName; + + @Schema(description = "实时表名") + private String tb; + + @Schema(description = "监测表编码") + private String tbCode; + + @Schema(description = "日统计表") + private String dayTb; + + @Schema(description = "时间维度统计表") + private String statTb; + + @Schema(description = "最新数据表") + private String lastTb; + + @Schema(description = "数据源ID") + private String dataSourceId; + + @Schema(description = "站类监测表要素关联ID") + private String sttpTbYsBId; + + @Schema(description = "最小值") + private BigDecimal minVal; + + @Schema(description = "最大值") + private BigDecimal maxVal; +} diff --git a/backend/src/main/java/com/yfd/platform/env/wq/service/EnvWqDataService.java b/backend/src/main/java/com/yfd/platform/env/wq/service/EnvWqDataService.java index a2583f90..15d7f2b3 100644 --- a/backend/src/main/java/com/yfd/platform/env/wq/service/EnvWqDataService.java +++ b/backend/src/main/java/com/yfd/platform/env/wq/service/EnvWqDataService.java @@ -10,6 +10,8 @@ public interface EnvWqDataService { DataSourceResult processDataKendoList(DataSourceRequest dataSourceRequest); + DataSourceResult getStbprpYsByStcd(DataSourceRequest dataSourceRequest); + DataSourceResult getAlongWqKendoListCust(DataSourceRequest dataSourceRequest); DataSourceResult getAlongDefaultRvcd(DataSourceRequest dataSourceRequest); @@ -22,5 +24,5 @@ public interface EnvWqDataService { DataSourceResult getWbsbList(DataSourceRequest dataSourceRequest); - DataSourceResult getStTbYsBVoKendoListCust(DataSourceRequest dataSourceRequest); + DataSourceResult getStTbYsBVoKendoListCust(String stcd, String tbCode, String startTime, String endTime); } diff --git a/backend/src/main/java/com/yfd/platform/env/wq/service/impl/EnvWqDataServiceImpl.java b/backend/src/main/java/com/yfd/platform/env/wq/service/impl/EnvWqDataServiceImpl.java index b7bc6abe..2cb54047 100644 --- a/backend/src/main/java/com/yfd/platform/env/wq/service/impl/EnvWqDataServiceImpl.java +++ b/backend/src/main/java/com/yfd/platform/env/wq/service/impl/EnvWqDataServiceImpl.java @@ -140,6 +140,83 @@ public class EnvWqDataServiceImpl implements EnvWqDataService { return result; } + @Override + public DataSourceResult getStbprpYsByStcd(DataSourceRequest dataSourceRequest) { + DataSourceLoadOptionsBase loadOptions = dataSourceRequest == null ? null : dataSourceRequest.toDevRequest(); + String stcd = resolveStringFilterValue(dataSourceRequest, loadOptions, "stcd"); + String tbCode = resolveStringFilterValue(dataSourceRequest, loadOptions, "tbCode"); + return queryStbprpYsByStcd(stcd, tbCode); + } + + private DataSourceResult queryStbprpYsByStcd(String stcd, String tbCode) { + if (StrUtil.isBlank(stcd)) { + throw new BizException("站点编码(stcd)不能为空."); + } + if (StrUtil.isBlank(tbCode)) { + throw new BizException("监测表编码(tbCode)不能为空."); + } + + StringBuilder sql = new StringBuilder(); + sql.append("SELECT ") + .append("t1.STCD AS stcd, ") + .append("t2.YS AS ys, ") + .append("t2.TB_ID AS tbId, ") + .append("NVL(t4.YS_SHOW_NAME, t2.YS) AS ysShowName, ") + .append("t4.SHOW_CONTROL AS showControl, ") + .append("TO_CHAR(NVL(t4.ENABLE, 0)) AS enable, ") + .append("CASE ") + .append(" WHEN utc.DATA_TYPE IN ('CHAR', 'NCHAR', 'VARCHAR2', 'NVARCHAR2', 'CLOB', 'NCLOB') THEN 'str' ") + .append(" WHEN utc.DATA_TYPE LIKE 'TIMESTAMP%' OR utc.DATA_TYPE = 'DATE' THEN 'datetime' ") + .append(" WHEN utc.DATA_TYPE IS NULL THEN NULL ") + .append(" ELSE 'number' ") + .append("END AS dataType, ") + .append("CAST(NULL AS VARCHAR2(36)) AS standardUomId, ") + .append("t3.TB_NAME AS tbName, ") + .append("t3.TB AS tb, ") + .append("t3.TB_CODE AS tbCode, ") + .append("t3.DAY_TB AS dayTb, ") + .append("t3.STAT_TB AS statTb, ") + .append("t3.LAST_TB AS lastTb, ") + .append("t3.DATA_SOURCE_ID AS dataSourceId, ") + .append("t1.STTP_TB_YS_B_ID AS sttpTbYsBId, ") + .append("CAST(NULL AS NUMBER(18,6)) AS minVal, ") + .append("CAST(NULL AS NUMBER(18,6)) AS maxVal ") + .append("FROM ST_STBPRP_YS_B t1 ") + .append("INNER JOIN ST_STTP_TB_YS_B t2 ON t2.ID = t1.STTP_TB_YS_B_ID ") + .append(" AND NVL(t2.IS_DELETED, 0) = 0 ") + .append(" AND NVL(t2.IS_SHOW, 1) = 1 ") + .append("INNER JOIN ST_TB_B t3 ON t3.ID = t2.TB_ID ") + .append(" AND NVL(t3.IS_DELETED, 0) = 0 ") + .append("LEFT JOIN ST_TB_YS_B t4 ON t4.TB_ID = t2.TB_ID ") + .append(" AND t4.YS = t2.YS ") + .append(" AND NVL(t4.IS_DELETED, 0) = 0 ") + .append("LEFT JOIN USER_TAB_COLUMNS utc ON utc.TABLE_NAME = UPPER(t3.TB) ") + .append(" AND utc.COLUMN_NAME = UPPER(t2.YS) ") + .append("WHERE t1.STCD = #{map.stcd} ") + .append(" AND t3.TB_CODE = #{map.tbCode} ") + .append(" AND NVL(t1.IS_DELETED, 0) = 0 ") + .append(" AND NVL(t1.IS_SHOW, 1) = 1 ") + .append("ORDER BY NVL(t1.ORDER_INDEX, 999999) ASC, ") + .append(" NVL(t2.ORDER_INDEX, 999999) ASC, ") + .append(" NVL(t4.ORDER_INDEX, 999999) ASC, ") + .append(" t2.YS ASC"); + + Map paramMap = new HashMap<>(); + paramMap.put("stcd", stcd); + paramMap.put("tbCode", tbCode); + List list = microservicDynamicSQLMapper.getAllListWithResultType( + sql.toString(), + paramMap, + StbprpYsVo.class + ); + + DataSourceResult result = new DataSourceResult<>(); + result.setData(list); + result.setTotal((long) list.size()); + result.setAggregates(new HashMap<>()); + return result; + } + @Override public DataSourceResult getAlongWqKendoListCust(DataSourceRequest dataSourceRequest) { DataSourceLoadOptionsBase loadOptions = dataSourceRequest == null ? null : dataSourceRequest.toDevRequest(); @@ -611,6 +688,16 @@ public class EnvWqDataServiceImpl implements EnvWqDataService { return null; } + private String resolveStringFilterValue(DataSourceRequest dataSourceRequest, + DataSourceLoadOptionsBase loadOptions, + String field) { + String value = findFilterFieldValue(dataSourceRequest == null ? null : dataSourceRequest.getFilter(), field); + if (StrUtil.isBlank(value) && loadOptions != null) { + value = QgcQueryWrapperUtil.getFilterFieldValue(loadOptions, field); + } + return StrUtil.trim(value); + } + @Override public WqBaseInfoVo getStcdInfo(String stcd) { if (StrUtil.isBlank(stcd)) { @@ -2048,44 +2135,8 @@ public class EnvWqDataServiceImpl implements EnvWqDataService { } @Override - public DataSourceResult getStTbYsBVoKendoListCust(DataSourceRequest dataSourceRequest) { - StringBuilder sql = new StringBuilder(); - sql.append("SELECT ") - .append("y.ID AS id, ") - .append("y.TB_ID AS tbId, ") - .append("t.TB_NAME AS tbName, ") - .append("t.TB_CODE AS tbCode, ") - .append("y.DESCRIPTION AS description, ") - .append("y.YS AS ys, ") - .append("y.YS_SHOW_NAME AS ysShowName, ") - .append("y.SHOW_CONTROL AS showControl, ") - .append("TO_CHAR(y.ENABLE) AS enable, ") - .append("y.ORDER_INDEX AS orderIndex ") - .append("FROM ST_TB_YS_B y ") - .append("INNER JOIN ST_TB_B t ON t.ID = y.TB_ID AND NVL(t.IS_DELETED, 0) = 0 ") - .append("WHERE NVL(y.IS_DELETED, 0) = 0 "); - - Map paramMap = new HashMap<>(); - String filterSql = buildStTbYsFilterCondition( - dataSourceRequest == null ? null : dataSourceRequest.getFilter(), - paramMap, - new int[]{0} - ); - if (StrUtil.isNotBlank(filterSql)) { - sql.append(" AND ").append(filterSql).append(" "); - } - sql.append(buildStTbYsOrderBySql(dataSourceRequest == null ? null : dataSourceRequest.getSort())); - - DataSourceLoadOptionsBase loadOptions = dataSourceRequest == null ? null : dataSourceRequest.toDevRequest(); - PageInfo pageInfo = loadOptions == null ? null : QgcQueryWrapperUtil.getPageInfo(loadOptions); - Page page = pageInfo != null && pageInfo.getHasPageInfo() ? pageInfo.getPage() : null; - List list = microservicDynamicSQLMapper.pageAllListWithResultType(page, sql.toString(), paramMap, StTbYsVo.class); - - DataSourceResult result = new DataSourceResult<>(); - result.setData(list); - result.setTotal(page != null ? page.getTotal() : list.size()); - result.setAggregates(new HashMap<>()); - return result; + public DataSourceResult getStTbYsBVoKendoListCust(String stcd, String tbCode, String startTime, String endTime) { + return queryStbprpYsByStcd(stcd, tbCode); } private String buildStTbYsFilterCondition(DataSourceRequest.FilterDescriptor root, From 77b77612b16e0ad59a030671b6c0dce5b60b208c Mon Sep 17 00:00:00 2001 From: tangwei Date: Thu, 28 May 2026 13:38:08 +0800 Subject: [PATCH 35/41] =?UTF-8?q?fix:=20=E4=BC=98=E5=8C=96=E5=88=86?= =?UTF-8?q?=E9=A1=B5=E5=B7=A5=E5=85=B7?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../wq/service/impl/EnvWqDataServiceImpl.java | 9 ++---- .../service/impl/SdWtMonitorServiceImpl.java | 23 +++++--------- .../platform/utils/QgcQueryWrapperUtil.java | 30 +++++++++++++++++++ 3 files changed, 41 insertions(+), 21 deletions(-) diff --git a/backend/src/main/java/com/yfd/platform/env/wq/service/impl/EnvWqDataServiceImpl.java b/backend/src/main/java/com/yfd/platform/env/wq/service/impl/EnvWqDataServiceImpl.java index 2cb54047..4f703676 100644 --- a/backend/src/main/java/com/yfd/platform/env/wq/service/impl/EnvWqDataServiceImpl.java +++ b/backend/src/main/java/com/yfd/platform/env/wq/service/impl/EnvWqDataServiceImpl.java @@ -80,8 +80,7 @@ public class EnvWqDataServiceImpl implements EnvWqDataService { } sql.append(buildEnvWqOrderBySql(dataSourceRequest.getSort())); - PageInfo pageInfo = QgcQueryWrapperUtil.getPageInfo(loadOptions); - Page page = pageInfo.getHasPageInfo() ? pageInfo.getPage() : null; + Page page = QgcQueryWrapperUtil.buildPage(loadOptions,loadOptions.getSkip(), loadOptions.getTake()); List list = microservicDynamicSQLMapper.pageAllListWithResultType(page, sql.toString(), paramMap, EnvWqVo.class); fillEnvWqDerivedFields(list, calculated); @@ -127,8 +126,7 @@ public class EnvWqDataServiceImpl implements EnvWqDataService { } sql.append(buildEnvWqDataOrderBySql(dataSourceRequest.getSort())); - PageInfo pageInfo = QgcQueryWrapperUtil.getPageInfo(loadOptions); - Page page = pageInfo.getHasPageInfo() ? pageInfo.getPage() : null; + Page page = QgcQueryWrapperUtil.buildPage(loadOptions,loadOptions.getSkip(), loadOptions.getTake()); List list = microservicDynamicSQLMapper.pageAllListWithResultType(page, sql.toString(), paramMap, EnvWqDataVo.class); fillEnvWqDataDerivedFields(list); fillEnvWqDataLimit(list); @@ -658,8 +656,7 @@ public class EnvWqDataServiceImpl implements EnvWqDataService { } sql.append(buildVmsstbprptOrderBySql(dataSourceRequest == null ? null : dataSourceRequest.getSort(), queryEngDirectly)); - PageInfo pageInfo = QgcQueryWrapperUtil.getPageInfo(loadOptions); - Page page = pageInfo.getHasPageInfo() ? pageInfo.getPage() : null; + Page page = QgcQueryWrapperUtil.buildPage(loadOptions,loadOptions.getSkip(), loadOptions.getTake()); List list = microservicDynamicSQLMapper.pageAllListWithResultType(page, sql.toString(), paramMap, WqVmsstbprptVo.class); DataSourceResult result = new DataSourceResult<>(); diff --git a/backend/src/main/java/com/yfd/platform/env/wt/service/impl/SdWtMonitorServiceImpl.java b/backend/src/main/java/com/yfd/platform/env/wt/service/impl/SdWtMonitorServiceImpl.java index f3d0e5d6..f9af2aa8 100644 --- a/backend/src/main/java/com/yfd/platform/env/wt/service/impl/SdWtMonitorServiceImpl.java +++ b/backend/src/main/java/com/yfd/platform/env/wt/service/impl/SdWtMonitorServiceImpl.java @@ -316,8 +316,8 @@ public class SdWtMonitorServiceImpl implements SdWtMonitorService { sql.append(" AND ").append(filterSql).append(" "); } sql.append(buildSttpInfoOrderBySql(dataSourceRequest == null ? null : dataSourceRequest.getSort())); - - Page page = buildPage(dataSourceRequest == null ? null : dataSourceRequest.toDevRequest()); + DataSourceLoadOptionsBase loadOptions = dataSourceRequest.toDevRequest(); + Page page = QgcQueryWrapperUtil.buildPage(loadOptions, loadOptions.getSkip(), loadOptions.getTake()); List list = microservicDynamicSQLMapper.pageAllListWithResultType(page, sql.toString(), paramMap, SttpInfoVo.class); DataSourceResult result = new DataSourceResult<>(); result.setData(list); @@ -348,7 +348,7 @@ public class SdWtMonitorServiceImpl implements SdWtMonitorService { } sql.append(buildYearDetailOrderBySql(dataSourceRequest == null ? null : dataSourceRequest.getSort())); - Page page = buildPage(loadOptions); + Page page = QgcQueryWrapperUtil.buildPage(loadOptions,loadOptions.getSkip(), loadOptions.getTake()); List list = microservicDynamicSQLMapper.pageAllListWithResultType(page, sql.toString(), paramMap, SdYearDetailVO.class); for (SdYearDetailVO vo : list) { vo.setActualTemp(vo.getWt()); @@ -393,7 +393,7 @@ public class SdWtMonitorServiceImpl implements SdWtMonitorService { } sql.append(buildMonthDetailOrderBySql(dataSourceRequest == null ? null : dataSourceRequest.getSort())); - Page page = buildPage(loadOptions); + Page page = QgcQueryWrapperUtil.buildPage(loadOptions,loadOptions.getSkip(), loadOptions.getTake()); List list = microservicDynamicSQLMapper.pageAllListWithResultType(page, sql.toString(), paramMap, SdMonthDetailVO.class); DataSourceResult result = new DataSourceResult<>(); result.setData(list); @@ -480,7 +480,7 @@ public class SdWtMonitorServiceImpl implements SdWtMonitorService { paramMap.put("baseId", baseId); } - Page page = buildPage(dataSourceRequest.toDevRequest()); + Page page = QgcQueryWrapperUtil.buildPage(loadOptions,loadOptions.getSkip(), loadOptions.getTake()); List wtFishVoList = microservicDynamicSQLMapper.pageAllListWithResultType(page, sql.toString(), paramMap, WtFishVo.class); String hbrvcd = wtFishVoList.isEmpty() ? null : wtFishVoList.get(0).getHbrvcd(); @@ -734,7 +734,7 @@ public class SdWtMonitorServiceImpl implements SdWtMonitorService { } sql.append(buildVmsstbprptOrderBySql(dataSourceRequest.getSort())); - Page page = buildPage(loadOptions); + Page page = QgcQueryWrapperUtil.buildPage(loadOptions,loadOptions.getSkip(), loadOptions.getTake()); List list = microservicDynamicSQLMapper.pageAllListWithResultType(page, sql.toString(), paramMap, SdWtBaseInfoVO.class); DataSourceResult result = new DataSourceResult<>(); @@ -944,7 +944,8 @@ public class SdWtMonitorServiceImpl implements SdWtMonitorService { } appendCxDetailOrderBy(sql, dataSourceRequest.getSort()); - Page page = buildPage(dataSourceRequest.toDevRequest()); + DataSourceLoadOptionsBase loadOptions = dataSourceRequest.toDevRequest(); + Page page = QgcQueryWrapperUtil.buildPage(loadOptions,loadOptions.getSkip(), loadOptions.getTake()); List rowList = microservicDynamicSQLMapper.pageAllListWithResultType(page, sql.toString(), paramMap, WtCxDetailRow.class); List verticalList = getVerticals(rowList, wtDeviceType); @@ -1777,14 +1778,6 @@ public class SdWtMonitorServiceImpl implements SdWtMonitorService { return " ORDER BY " + String.join(", ", orderColumns); } - private Page buildPage(DataSourceLoadOptionsBase loadOptions) { - PageInfo pageInfo = QgcQueryWrapperUtil.getPageInfo(loadOptions); - if (Boolean.TRUE.equals(pageInfo.getHasPageInfo())) { - return pageInfo.getPage(); - } - return null; - } - private String buildVmsstbprptOrderBySql(List sortList) { List orderColumns = new ArrayList<>(); if (sortList != null) { diff --git a/backend/src/main/java/com/yfd/platform/utils/QgcQueryWrapperUtil.java b/backend/src/main/java/com/yfd/platform/utils/QgcQueryWrapperUtil.java index 9db62f6e..3554573d 100644 --- a/backend/src/main/java/com/yfd/platform/utils/QgcQueryWrapperUtil.java +++ b/backend/src/main/java/com/yfd/platform/utils/QgcQueryWrapperUtil.java @@ -77,6 +77,36 @@ public class QgcQueryWrapperUtil { } } + /** + * 支持页码模式和偏移量模式的分页 + * 优先使用页码模式:当 page > 0 且 pageSize > 0 时,自动转换为 take/skip + * 否则回退到原有的 take/skip 偏移量模式 + */ + public static PageInfo getPageInfo(DataSourceLoadOptionsBase loadOptions, Integer page, Integer pageSize) { + if (page != null && page > 0 && pageSize != null && pageSize > 0) { + loadOptions.setTake(pageSize); + loadOptions.setSkip((page - 1) * pageSize); + } + return getPageInfo(loadOptions); + } + + + public static Page buildPage(DataSourceLoadOptionsBase loadOptions) { + PageInfo pageInfo = QgcQueryWrapperUtil.getPageInfo(loadOptions); + if (Boolean.TRUE.equals(pageInfo.getHasPageInfo())) { + return pageInfo.getPage(); + } + return null; + } + + public static Page buildPage(DataSourceLoadOptionsBase loadOptions, Integer page, Integer pageSize) { + PageInfo pageInfo = QgcQueryWrapperUtil.getPageInfo(loadOptions, page, pageSize); + if (Boolean.TRUE.equals(pageInfo.getHasPageInfo())) { + return pageInfo.getPage(); + } + return null; + } + private static void parseJArrayConditions(JsonArray jsonArray, String fieldName, StringBuffer fieldValue) { if (jsonArray != null && jsonArray.size() != 0) { if (jsonArray.get(0).isJsonPrimitive()) { From 389f49bb1d0776103d3321e19327335f186c4fc9 Mon Sep 17 00:00:00 2001 From: tangwei Date: Thu, 28 May 2026 13:56:37 +0800 Subject: [PATCH 36/41] =?UTF-8?q?fix:=20=E4=BC=98=E5=8C=96=E9=80=BB?= =?UTF-8?q?=E8=BE=91=E6=B0=B4=E8=B4=A8=E9=80=BB=E8=BE=91?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../wq/controller/EnvWqDataController.java | 8 +++- .../env/wq/service/EnvWqDataService.java | 2 + .../wq/service/impl/EnvWqDataServiceImpl.java | 44 +++++++++++++++++++ 3 files changed, 53 insertions(+), 1 deletion(-) diff --git a/backend/src/main/java/com/yfd/platform/env/wq/controller/EnvWqDataController.java b/backend/src/main/java/com/yfd/platform/env/wq/controller/EnvWqDataController.java index 1da75e39..7472649c 100644 --- a/backend/src/main/java/com/yfd/platform/env/wq/controller/EnvWqDataController.java +++ b/backend/src/main/java/com/yfd/platform/env/wq/controller/EnvWqDataController.java @@ -42,7 +42,7 @@ public class EnvWqDataController { } - @GetMapping("/stTbYs/GetStTbYsBVoKendoListCust") + @GetMapping("/stbprp/GetStbprpYsByStcd") @Operation(summary = "水质监测信息查询") public ResponseResult getStTbYsBVoKendoListCust( @RequestParam String stcd, @@ -52,6 +52,12 @@ public class EnvWqDataController { return ResponseResult.successData(envWqDataService.getStTbYsBVoKendoListCust(stcd, tbCode, startTime, endTime)); } + @PostMapping("/stTbYs/GetStTbYsBVoKendoListCust") + @Operation(summary = "水质监测信息查询") + public ResponseResult getStTbYsBVoKendoListCust(@RequestBody DataSourceRequest dataSourceRequest) { + return ResponseResult.successData(envWqDataService.getStTbYsBVoKendoListCust(dataSourceRequest)); + } + @PostMapping("/data/noAuth/GetKendoListCust") @Operation(summary = "水质统计分析(完成)") public ResponseResult getNoAuthKendoListCust(@RequestBody DataSourceRequest dataSourceRequest) { diff --git a/backend/src/main/java/com/yfd/platform/env/wq/service/EnvWqDataService.java b/backend/src/main/java/com/yfd/platform/env/wq/service/EnvWqDataService.java index 15d7f2b3..321901d7 100644 --- a/backend/src/main/java/com/yfd/platform/env/wq/service/EnvWqDataService.java +++ b/backend/src/main/java/com/yfd/platform/env/wq/service/EnvWqDataService.java @@ -25,4 +25,6 @@ public interface EnvWqDataService { DataSourceResult getWbsbList(DataSourceRequest dataSourceRequest); DataSourceResult getStTbYsBVoKendoListCust(String stcd, String tbCode, String startTime, String endTime); + + DataSourceResult getStTbYsBVoKendoListCust(DataSourceRequest dataSourceRequest); } diff --git a/backend/src/main/java/com/yfd/platform/env/wq/service/impl/EnvWqDataServiceImpl.java b/backend/src/main/java/com/yfd/platform/env/wq/service/impl/EnvWqDataServiceImpl.java index 4f703676..94e9c554 100644 --- a/backend/src/main/java/com/yfd/platform/env/wq/service/impl/EnvWqDataServiceImpl.java +++ b/backend/src/main/java/com/yfd/platform/env/wq/service/impl/EnvWqDataServiceImpl.java @@ -215,6 +215,8 @@ public class EnvWqDataServiceImpl implements EnvWqDataService { return result; } + + @Override public DataSourceResult getAlongWqKendoListCust(DataSourceRequest dataSourceRequest) { DataSourceLoadOptionsBase loadOptions = dataSourceRequest == null ? null : dataSourceRequest.toDevRequest(); @@ -2136,6 +2138,48 @@ public class EnvWqDataServiceImpl implements EnvWqDataService { return queryStbprpYsByStcd(stcd, tbCode); } + + @Override + public DataSourceResult getStTbYsBVoKendoListCust(DataSourceRequest dataSourceRequest) { + StringBuilder sql = new StringBuilder(); + sql.append("SELECT ") + .append("y.ID AS id, ") + .append("y.TB_ID AS tbId, ") + .append("t.TB_NAME AS tbName, ") + .append("t.TB_CODE AS tbCode, ") + .append("y.DESCRIPTION AS description, ") + .append("y.YS AS ys, ") + .append("y.YS_SHOW_NAME AS ysShowName, ") + .append("y.SHOW_CONTROL AS showControl, ") + .append("TO_CHAR(y.ENABLE) AS enable, ") + .append("y.ORDER_INDEX AS orderIndex ") + .append("FROM ST_TB_YS_B y ") + .append("INNER JOIN ST_TB_B t ON t.ID = y.TB_ID AND NVL(t.IS_DELETED, 0) = 0 ") + .append("WHERE NVL(y.IS_DELETED, 0) = 0 "); + + Map paramMap = new HashMap<>(); + String filterSql = buildStTbYsFilterCondition( + dataSourceRequest == null ? null : dataSourceRequest.getFilter(), + paramMap, + new int[]{0} + ); + if (StrUtil.isNotBlank(filterSql)) { + sql.append(" AND ").append(filterSql).append(" "); + } + sql.append(buildStTbYsOrderBySql(dataSourceRequest == null ? null : dataSourceRequest.getSort())); + + DataSourceLoadOptionsBase loadOptions = dataSourceRequest == null ? null : dataSourceRequest.toDevRequest(); + PageInfo pageInfo = loadOptions == null ? null : QgcQueryWrapperUtil.getPageInfo(loadOptions); + Page page = pageInfo != null && pageInfo.getHasPageInfo() ? pageInfo.getPage() : null; + List list = microservicDynamicSQLMapper.pageAllListWithResultType(page, sql.toString(), paramMap, StTbYsVo.class); + + DataSourceResult result = new DataSourceResult<>(); + result.setData(list); + result.setTotal(page != null ? page.getTotal() : list.size()); + result.setAggregates(new HashMap<>()); + return result; + } + private String buildStTbYsFilterCondition(DataSourceRequest.FilterDescriptor root, Map paramMap, int[] paramIndex) { From f75706029297e4ebc9a9b027eb0c1a5d85889d0a Mon Sep 17 00:00:00 2001 From: tangwei Date: Thu, 28 May 2026 14:00:40 +0800 Subject: [PATCH 37/41] =?UTF-8?q?feat:=20=E6=A0=96=E6=81=AF=E5=9C=B0?= =?UTF-8?q?=E5=A2=9E=E5=8A=A0=E7=9B=91=E6=B5=8B=E8=A1=A8=E6=95=B0=E6=8D=AE?= =?UTF-8?q?=E6=8E=A5=E5=8F=A3?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../fh/controller/FhHabitatController.java | 6 + .../env/fh/service/FhHabitatService.java | 2 + .../fh/service/impl/FhHabitatServiceImpl.java | 180 ++++++++++++++++++ 3 files changed, 188 insertions(+) diff --git a/backend/src/main/java/com/yfd/platform/env/fh/controller/FhHabitatController.java b/backend/src/main/java/com/yfd/platform/env/fh/controller/FhHabitatController.java index e33b271f..e7b94d2a 100644 --- a/backend/src/main/java/com/yfd/platform/env/fh/controller/FhHabitatController.java +++ b/backend/src/main/java/com/yfd/platform/env/fh/controller/FhHabitatController.java @@ -39,4 +39,10 @@ public class FhHabitatController { public ResponseResult getDefaultFhList(@RequestBody FhDefaultAo fhDefaultAo) { return ResponseResult.successData(fhHabitatService.getDefaultFhList(fhDefaultAo)); } + + @PostMapping("/stTbYs/GetStTbYsBVoKendoListCust") + @Operation(summary = "水质监测信息查询") + public ResponseResult getStTbYsBVoKendoListCust(@RequestBody DataSourceRequest dataSourceRequest) { + return ResponseResult.successData(fhHabitatService.getStTbYsBVoKendoListCust(dataSourceRequest)); + } } diff --git a/backend/src/main/java/com/yfd/platform/env/fh/service/FhHabitatService.java b/backend/src/main/java/com/yfd/platform/env/fh/service/FhHabitatService.java index 2b6206c0..9298fd85 100644 --- a/backend/src/main/java/com/yfd/platform/env/fh/service/FhHabitatService.java +++ b/backend/src/main/java/com/yfd/platform/env/fh/service/FhHabitatService.java @@ -13,4 +13,6 @@ public interface FhHabitatService { DataSourceResult getKendoListCustom(DataSourceRequest dataSourceRequest); FhDefaultVo getDefaultFhList(FhDefaultAo fhDefaultAo); + + DataSourceResult getStTbYsBVoKendoListCust(DataSourceRequest dataSourceRequest); } diff --git a/backend/src/main/java/com/yfd/platform/env/fh/service/impl/FhHabitatServiceImpl.java b/backend/src/main/java/com/yfd/platform/env/fh/service/impl/FhHabitatServiceImpl.java index 9d49a571..47c916d9 100644 --- a/backend/src/main/java/com/yfd/platform/env/fh/service/impl/FhHabitatServiceImpl.java +++ b/backend/src/main/java/com/yfd/platform/env/fh/service/impl/FhHabitatServiceImpl.java @@ -16,6 +16,7 @@ import com.yfd.platform.env.fh.entity.ao.FhDefaultAo; import com.yfd.platform.env.fh.entity.vo.FhDefaultVo; import com.yfd.platform.env.fh.entity.vo.HabitatVo; import com.yfd.platform.env.fh.service.FhHabitatService; +import com.yfd.platform.env.wq.entity.vo.StTbYsVo; import com.yfd.platform.utils.QgcQueryWrapperUtil; import jakarta.annotation.Resource; import org.springframework.stereotype.Service; @@ -869,6 +870,185 @@ public class FhHabitatServiceImpl implements FhHabitatService { return " ORDER BY " + String.join(", ", orderItems); } + @Override + public DataSourceResult getStTbYsBVoKendoListCust(DataSourceRequest dataSourceRequest) { + StringBuilder sql = new StringBuilder(); + sql.append("SELECT ") + .append("y.ID AS id, ") + .append("y.TB_ID AS tbId, ") + .append("t.TB_NAME AS tbName, ") + .append("t.TB_CODE AS tbCode, ") + .append("y.DESCRIPTION AS description, ") + .append("y.YS AS ys, ") + .append("y.YS_SHOW_NAME AS ysShowName, ") + .append("y.SHOW_CONTROL AS showControl, ") + .append("TO_CHAR(y.ENABLE) AS enable, ") + .append("y.ORDER_INDEX AS orderIndex ") + .append("FROM ST_TB_YS_B y ") + .append("INNER JOIN ST_TB_B t ON t.ID = y.TB_ID AND NVL(t.IS_DELETED, 0) = 0 ") + .append("WHERE NVL(y.IS_DELETED, 0) = 0 "); + + Map paramMap = new HashMap<>(); + String filterSql = buildStTbYsFilterCondition( + dataSourceRequest == null ? null : dataSourceRequest.getFilter(), + paramMap, + new int[]{0} + ); + if (StrUtil.isNotBlank(filterSql)) { + sql.append(" AND ").append(filterSql).append(" "); + } + sql.append(buildStTbYsOrderBySql(dataSourceRequest == null ? null : dataSourceRequest.getSort())); + + DataSourceLoadOptionsBase loadOptions = dataSourceRequest == null ? null : dataSourceRequest.toDevRequest(); + PageInfo pageInfo = loadOptions == null ? null : QgcQueryWrapperUtil.getPageInfo(loadOptions); + Page page = pageInfo != null && pageInfo.getHasPageInfo() ? pageInfo.getPage() : null; + List list = microservicDynamicSQLMapper.pageAllListWithResultType(page, sql.toString(), paramMap, StTbYsVo.class); + + DataSourceResult result = new DataSourceResult<>(); + result.setData(list); + result.setTotal(page != null ? page.getTotal() : list.size()); + result.setAggregates(new HashMap<>()); + return result; + } + + private String buildStTbYsFilterCondition(DataSourceRequest.FilterDescriptor root, + Map paramMap, + int[] paramIndex) { + if (root == null) { + return ""; + } + if (StrUtil.isNotBlank(root.getField())) { + return buildStTbYsLeafCondition(root, paramMap, paramIndex); + } + if (CollUtil.isEmpty(root.getFilters())) { + return ""; + } + List parts = new ArrayList<>(); + for (DataSourceRequest.FilterDescriptor child : root.getFilters()) { + String sql = buildStTbYsFilterCondition(child, paramMap, paramIndex); + if (StrUtil.isNotBlank(sql)) { + parts.add("(" + sql + ")"); + } + } + if (parts.isEmpty()) { + return ""; + } + String logic = "or".equalsIgnoreCase(root.getLogic()) ? " OR " : " AND "; + return String.join(logic, parts); + } + + private String buildStTbYsLeafCondition(DataSourceRequest.FilterDescriptor descriptor, + Map paramMap, + int[] paramIndex) { + String column = mapStTbYsColumn(descriptor.getField()); + if (StrUtil.isBlank(column)) { + return ""; + } + String operator = StrUtil.blankToDefault(descriptor.getOperator(), "eq").toLowerCase(); + Object value = descriptor.getValue(); + if ("isnull".equals(operator)) { + return column + " IS NULL"; + } + if ("isnotnull".equals(operator)) { + return column + " IS NOT NULL"; + } + String paramName = "stTbYsParam" + paramIndex[0]++; + switch (operator) { + case "eq": + paramMap.put(paramName, value); + return column + " = #{map." + paramName + "}"; + case "neq": + paramMap.put(paramName, value); + return column + " <> #{map." + paramName + "}"; + case "contains": + paramMap.put(paramName, "%" + value + "%"); + return column + " LIKE #{map." + paramName + "}"; + case "startswith": + paramMap.put(paramName, value + "%"); + return column + " LIKE #{map." + paramName + "}"; + case "endswith": + paramMap.put(paramName, "%" + value); + return column + " LIKE #{map." + paramName + "}"; + case "gt": + paramMap.put(paramName, value); + return column + " > #{map." + paramName + "}"; + case "gte": + paramMap.put(paramName, value); + return column + " >= #{map." + paramName + "}"; + case "lt": + paramMap.put(paramName, value); + return column + " < #{map." + paramName + "}"; + case "lte": + paramMap.put(paramName, value); + return column + " <= #{map." + paramName + "}"; + case "in": + if (!(value instanceof List) || CollUtil.isEmpty((List) value)) { + return ""; + } + List placeholders = new ArrayList<>(); + int idx = 0; + for (Object item : (List) value) { + String inParam = paramName + "_" + idx++; + paramMap.put(inParam, item); + placeholders.add("#{map." + inParam + "}"); + } + return column + " IN (" + String.join(", ", placeholders) + ")"; + default: + return ""; + } + } + + + + private String buildStTbYsOrderBySql(List sortList) { + if (CollUtil.isEmpty(sortList)) { + return " ORDER BY LOWER(t.TB_NAME) ASC, NVL(y.ORDER_INDEX, 999999) ASC, y.YS ASC"; + } + List orders = new ArrayList<>(); + for (DataSourceRequest.SortDescriptor sortDescriptor : sortList) { + String column = mapStTbYsColumn(sortDescriptor.getField()); + if (StrUtil.isBlank(column)) { + continue; + } + orders.add(column + " " + ("desc".equalsIgnoreCase(sortDescriptor.getDir()) ? "DESC" : "ASC")); + } + if (orders.isEmpty()) { + return " ORDER BY LOWER(t.TB_NAME) ASC, NVL(y.ORDER_INDEX, 999999) ASC, y.YS ASC"; + } + return " ORDER BY " + String.join(", ", orders); + } + + private String mapStTbYsColumn(String field) { + if (StrUtil.isBlank(field)) { + return null; + } + switch (field) { + case "id": + return "y.ID"; + case "tbId": + return "y.TB_ID"; + case "tbName": + return "t.TB_NAME"; + case "tbCode": + return "t.TB_CODE"; + case "description": + return "y.DESCRIPTION"; + case "ys": + return "y.YS"; + case "ysShowName": + return "y.YS_SHOW_NAME"; + case "showControl": + return "y.SHOW_CONTROL"; + case "enable": + return "y.ENABLE"; + case "orderIndex": + return "y.ORDER_INDEX"; + default: + return null; + } + } + + private String buildGroupSql(String baseSql, GroupingInfo[] groups) { List fields = Arrays.stream(groups) .map(GroupingInfo::getSelector) From ec15fabda42bf746d625deb2960d87113d3b94a1 Mon Sep 17 00:00:00 2001 From: tangwei Date: Thu, 28 May 2026 14:20:22 +0800 Subject: [PATCH 38/41] =?UTF-8?q?fix:=20=E4=BC=98=E5=8C=96=E6=A0=96?= =?UTF-8?q?=E6=81=AF=E5=9C=B0=E9=80=BB=E8=BE=91?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../env/fh/service/impl/FhHabitatServiceImpl.java | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/backend/src/main/java/com/yfd/platform/env/fh/service/impl/FhHabitatServiceImpl.java b/backend/src/main/java/com/yfd/platform/env/fh/service/impl/FhHabitatServiceImpl.java index 47c916d9..b52d5131 100644 --- a/backend/src/main/java/com/yfd/platform/env/fh/service/impl/FhHabitatServiceImpl.java +++ b/backend/src/main/java/com/yfd/platform/env/fh/service/impl/FhHabitatServiceImpl.java @@ -366,7 +366,7 @@ public class FhHabitatServiceImpl implements FhHabitatService { " LEFT JOIN SD_HYDROBASE fhBase ON fhBase.BASEID = fh.BASE_ID " + " INNER JOIN ( " + monitorSql + " ) child ON child.FHSTCD = fh.STCD " + " WHERE NVL(fh.IS_DELETED, 0) = 0 " + - " AND NVL(fh.BASE_ID, 'other') <> 'other' " + +// " AND NVL(fh.BASE_ID, 'other') <> 'other' " + " UNION ALL " + " SELECT fh.STCD AS STCD, " + " fh.STNM AS STNM, " + @@ -417,10 +417,10 @@ public class FhHabitatServiceImpl implements FhHabitatService { " AND a.CODE = 'common' " + " ) rstAlong ON rstAlong.RVCD = NVL(fh.HBRVCD, eng.HBRVCD) AND rstAlong.STCD = fh.RSTCD " + " WHERE NVL(fh.IS_DELETED, 0) = 0 " + - " AND NVL(fh.BASE_ID, 'other') <> 'other' " + - " AND NOT EXISTS ( " + - " SELECT 1 FROM ( " + monitorSql + " ) child WHERE child.FHSTCD = fh.STCD " + - " ) " + +// " AND NVL(fh.BASE_ID, 'other') <> 'other' " + +// " AND NOT EXISTS ( " + +// " SELECT 1 FROM ( " + monitorSql + " ) child WHERE child.FHSTCD = fh.STCD " + +// " ) " + ") t WHERE 1 = 1 "; } From c35842d671062d2a8f5060f587bf062e3bb1adf4 Mon Sep 17 00:00:00 2001 From: tangwei Date: Thu, 28 May 2026 15:25:07 +0800 Subject: [PATCH 39/41] =?UTF-8?q?feat:=20=E6=9F=A5=E8=AF=A2=E6=A0=96?= =?UTF-8?q?=E6=81=AF=E5=9C=B0=E6=B2=B3=E9=81=93=E6=B0=B4=E6=B8=A9=E6=97=A5?= =?UTF-8?q?=E7=BB=9F=E8=AE=A1=E6=95=B0=E6=8D=AE=E5=92=8C=E6=9F=A5=E8=AF=A2?= =?UTF-8?q?=E6=A0=96=E6=81=AF=E5=9C=B0=E7=9B=91=E6=B5=8B=E7=AB=99=E7=82=B9?= =?UTF-8?q?=E5=88=97=E8=A1=A8?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../fh/controller/FhHabitatController.java | 12 + .../env/fh/entity/vo/FhMsstbprptVo.java | 80 +++ .../env/fh/entity/vo/FhSdrvwtsVo.java | 29 ++ .../env/fh/service/FhHabitatService.java | 4 + .../fh/service/impl/FhHabitatServiceImpl.java | 472 ++++++++++++++++++ .../wq/service/impl/EnvWqDataServiceImpl.java | 2 +- 6 files changed, 598 insertions(+), 1 deletion(-) create mode 100644 backend/src/main/java/com/yfd/platform/env/fh/entity/vo/FhMsstbprptVo.java create mode 100644 backend/src/main/java/com/yfd/platform/env/fh/entity/vo/FhSdrvwtsVo.java diff --git a/backend/src/main/java/com/yfd/platform/env/fh/controller/FhHabitatController.java b/backend/src/main/java/com/yfd/platform/env/fh/controller/FhHabitatController.java index e7b94d2a..dcfac12c 100644 --- a/backend/src/main/java/com/yfd/platform/env/fh/controller/FhHabitatController.java +++ b/backend/src/main/java/com/yfd/platform/env/fh/controller/FhHabitatController.java @@ -40,6 +40,18 @@ public class FhHabitatController { return ResponseResult.successData(fhHabitatService.getDefaultFhList(fhDefaultAo)); } + @PostMapping("/sdrvwts/GetKendoList") + @Operation(summary = "查询栖息地河道水温日统计数据") + public ResponseResult getSdrvwtsList(@RequestBody DataSourceRequest dataSourceRequest) { + return ResponseResult.successData(fhHabitatService.getSdrvwtsList(dataSourceRequest)); + } + + @PostMapping("/msstbprpt/GetKendoList") + @Operation(summary = "查询栖息地监测站点列表") + public ResponseResult getMsstbprptList(@RequestBody DataSourceRequest dataSourceRequest) { + return ResponseResult.successData(fhHabitatService.getMsstbprptList(dataSourceRequest)); + } + @PostMapping("/stTbYs/GetStTbYsBVoKendoListCust") @Operation(summary = "水质监测信息查询") public ResponseResult getStTbYsBVoKendoListCust(@RequestBody DataSourceRequest dataSourceRequest) { diff --git a/backend/src/main/java/com/yfd/platform/env/fh/entity/vo/FhMsstbprptVo.java b/backend/src/main/java/com/yfd/platform/env/fh/entity/vo/FhMsstbprptVo.java new file mode 100644 index 00000000..9ca7df5e --- /dev/null +++ b/backend/src/main/java/com/yfd/platform/env/fh/entity/vo/FhMsstbprptVo.java @@ -0,0 +1,80 @@ +package com.yfd.platform.env.fh.entity.vo; + +import io.swagger.v3.oas.annotations.media.Schema; +import lombok.Data; + +import java.io.Serializable; +import java.util.Date; + +@Data +@Schema(description = "栖息地关联监测站点") +public class FhMsstbprptVo implements Serializable { + + private static final long serialVersionUID = 1L; + + @Schema(description = "站码") + private String stcd; + + @Schema(description = "站名") + private String stnm; + + @Schema(description = "站类") + private String sttpCode; + + @Schema(description = "所属栖息地编码") + private String fhstcd; + + @Schema(description = "所属栖息地名称") + private String fhstnm; + + @Schema(description = "所属电站编码") + private String rstcd; + + @Schema(description = "所属电站名称") + private String ennm; + + @Schema(description = "基地编码") + private String baseId; + + @Schema(description = "基地名称") + private String baseName; + + @Schema(description = "基地流域编码") + private String hbrvcd; + + @Schema(description = "建成日期") + private Date jcdt; + + @Schema(description = "监测方式") + private Integer mway; + + @Schema(description = "数据是否接入") + private Integer dtin; + + @Schema(description = "数据接入来源") + private String dtinSrc; + + @Schema(description = "数据接入类型") + private Integer dtinType; + + @Schema(description = "数据接入开始时间") + private Date dtinTm; + + @Schema(description = "监测指标") + private String stindx; + + @Schema(description = "是否启用") + private Integer usfl; + + @Schema(description = "基地排序") + private Integer baseStepSort; + + @Schema(description = "流域排序") + private Integer rvcdStepSort; + + @Schema(description = "电站排序") + private Integer rstcdStepSort; + + @Schema(description = "站点排序") + private Integer siteStepSort; +} diff --git a/backend/src/main/java/com/yfd/platform/env/fh/entity/vo/FhSdrvwtsVo.java b/backend/src/main/java/com/yfd/platform/env/fh/entity/vo/FhSdrvwtsVo.java new file mode 100644 index 00000000..baafa011 --- /dev/null +++ b/backend/src/main/java/com/yfd/platform/env/fh/entity/vo/FhSdrvwtsVo.java @@ -0,0 +1,29 @@ +package com.yfd.platform.env.fh.entity.vo; + +import com.fasterxml.jackson.annotation.JsonFormat; +import io.swagger.v3.oas.annotations.media.Schema; +import lombok.Data; + +import java.io.Serializable; +import java.math.BigDecimal; +import java.util.Date; + +@Data +@Schema(description = "栖息地河道水温日统计数据") +public class FhSdrvwtsVo implements Serializable { + + private static final long serialVersionUID = 1L; + + @Schema(description = "主键ID") + private String id; + + @Schema(description = "站码") + private String stcd; + + @Schema(description = "时间") + @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss", timezone = "GMT+8") + private Date dt; + + @Schema(description = "水温") + private BigDecimal wt; +} diff --git a/backend/src/main/java/com/yfd/platform/env/fh/service/FhHabitatService.java b/backend/src/main/java/com/yfd/platform/env/fh/service/FhHabitatService.java index 9298fd85..d0d5d8d7 100644 --- a/backend/src/main/java/com/yfd/platform/env/fh/service/FhHabitatService.java +++ b/backend/src/main/java/com/yfd/platform/env/fh/service/FhHabitatService.java @@ -14,5 +14,9 @@ public interface FhHabitatService { FhDefaultVo getDefaultFhList(FhDefaultAo fhDefaultAo); + DataSourceResult getSdrvwtsList(DataSourceRequest dataSourceRequest); + + DataSourceResult getMsstbprptList(DataSourceRequest dataSourceRequest); + DataSourceResult getStTbYsBVoKendoListCust(DataSourceRequest dataSourceRequest); } diff --git a/backend/src/main/java/com/yfd/platform/env/fh/service/impl/FhHabitatServiceImpl.java b/backend/src/main/java/com/yfd/platform/env/fh/service/impl/FhHabitatServiceImpl.java index b52d5131..af552913 100644 --- a/backend/src/main/java/com/yfd/platform/env/fh/service/impl/FhHabitatServiceImpl.java +++ b/backend/src/main/java/com/yfd/platform/env/fh/service/impl/FhHabitatServiceImpl.java @@ -15,6 +15,8 @@ import com.yfd.platform.common.PageInfo; import com.yfd.platform.env.fh.entity.ao.FhDefaultAo; import com.yfd.platform.env.fh.entity.vo.FhDefaultVo; import com.yfd.platform.env.fh.entity.vo.HabitatVo; +import com.yfd.platform.env.fh.entity.vo.FhMsstbprptVo; +import com.yfd.platform.env.fh.entity.vo.FhSdrvwtsVo; import com.yfd.platform.env.fh.service.FhHabitatService; import com.yfd.platform.env.wq.entity.vo.StTbYsVo; import com.yfd.platform.utils.QgcQueryWrapperUtil; @@ -159,6 +161,55 @@ public class FhHabitatServiceImpl implements FhHabitatService { return result.get(0); } + @Override + public DataSourceResult getSdrvwtsList(DataSourceRequest dataSourceRequest) { + DataSourceLoadOptionsBase loadOptions = dataSourceRequest == null ? null : dataSourceRequest.toDevRequest(); + StringBuilder sql = new StringBuilder(); + sql.append("SELECT ") + .append("t.ID AS id, ") + .append("t.STCD AS stcd, ") + .append("t.DT AS dt, ") + .append("t.WT AS wt ") + .append("FROM SD_WTRVDAY_S t ") + .append("WHERE NVL(t.IS_DELETED, 0) = 0 "); + + Map paramMap = new HashMap<>(); + String filterSql = buildSdrvwtsFilterCondition( + dataSourceRequest == null ? null : dataSourceRequest.getFilter(), + paramMap, + new int[]{0} + ); + if (StrUtil.isNotBlank(filterSql)) { + sql.append(" AND ").append(filterSql).append(" "); + } + + GroupingInfo[] groups = loadOptions == null ? null : loadOptions.getGroup(); + if (groups != null && groups.length > 0) { + String groupSql = buildGroupSql(sql.toString(), groups); + List> groupRows = microservicDynamicSQLMapper.pageAllList(null, groupSql, paramMap); + DataSourceResult result = new DataSourceResult<>(); + if (Boolean.TRUE.equals(dataSourceRequest.getGroupResultFlat())) { + result.setData((List) (List) new GroupHelper().faltGroup(groupRows, Arrays.asList(groups))); + } else { + result.setData((List) (List) new GroupHelper().group(groupRows, Arrays.asList(groups))); + } + result.setTotal(0L); + result.setAggregates(new HashMap<>()); + return result; + } + + sql.append(buildSdrvwtsOrderBySql(dataSourceRequest == null ? null : dataSourceRequest.getSort())); + PageInfo pageInfo = loadOptions == null ? null : QgcQueryWrapperUtil.getPageInfo(loadOptions); + Page page = pageInfo != null && pageInfo.getHasPageInfo() ? pageInfo.getPage() : null; + List list = microservicDynamicSQLMapper.pageAllListWithResultType(page, sql.toString(), paramMap, FhSdrvwtsVo.class); + + DataSourceResult result = new DataSourceResult<>(); + result.setData(list); + result.setTotal(page != null ? page.getTotal() : list.size()); + result.setAggregates(new HashMap<>()); + return result; + } + private String buildDefaultFhListSql(FhDefaultAo fhDefaultAo) { String dateConditionWtrv = ""; String dateConditionZq = ""; @@ -870,6 +921,427 @@ public class FhHabitatServiceImpl implements FhHabitatService { return " ORDER BY " + String.join(", ", orderItems); } + @Override + public DataSourceResult getMsstbprptList(DataSourceRequest dataSourceRequest) { + DataSourceLoadOptionsBase loadOptions = dataSourceRequest == null ? null : dataSourceRequest.toDevRequest(); + String sttpCode = findFilterFieldValue(dataSourceRequest == null ? null : dataSourceRequest.getFilter(), "sttpCode"); + if (StrUtil.isBlank(sttpCode) && loadOptions != null) { + sttpCode = QgcQueryWrapperUtil.getFilterFieldValue(loadOptions, "sttpCode"); + } + + StringBuilder sql = new StringBuilder(buildFhMsstbprptBaseSql(sttpCode)); + Map paramMap = new HashMap<>(); + String filterSql = buildFhMsstbprptFilterCondition( + dataSourceRequest == null ? null : dataSourceRequest.getFilter(), + paramMap, + new int[]{0} + ); + if (StrUtil.isNotBlank(filterSql)) { + sql.append(" AND ").append(filterSql).append(" "); + } + + GroupingInfo[] groups = loadOptions == null ? null : loadOptions.getGroup(); + if (groups != null && groups.length > 0) { + String groupSql = buildGroupSql(sql.toString(), groups); + List> groupRows = microservicDynamicSQLMapper.pageAllList(null, groupSql, paramMap); + DataSourceResult result = new DataSourceResult(); + if (Boolean.TRUE.equals(dataSourceRequest.getGroupResultFlat())) { + result.setData(new GroupHelper().faltGroup(groupRows, Arrays.asList(groups))); + } else { + result.setData(new GroupHelper().group(groupRows, Arrays.asList(groups))); + } + result.setTotal(0L); + result.setAggregates(new HashMap<>()); + return result; + } + + sql.append(buildFhMsstbprptOrderBySql(dataSourceRequest == null ? null : dataSourceRequest.getSort())); + PageInfo pageInfo = loadOptions == null ? null : QgcQueryWrapperUtil.getPageInfo(loadOptions); + Page page = pageInfo != null && pageInfo.getHasPageInfo() ? pageInfo.getPage() : null; + List list = microservicDynamicSQLMapper.pageAllListWithResultType(page, sql.toString(), paramMap, FhMsstbprptVo.class); + + DataSourceResult result = new DataSourceResult<>(); + result.setData(list); + result.setTotal(page != null ? page.getTotal() : list.size()); + result.setAggregates(new HashMap<>()); + return result; + } + + private String buildFhMsstbprptBaseSql(String sttpCode) { + boolean onlyRiver = "ZQ".equalsIgnoreCase(StrUtil.trim(sttpCode)); + boolean onlyWtrv = "WTRV".equalsIgnoreCase(StrUtil.trim(sttpCode)); + StringBuilder sql = new StringBuilder(); + sql.append("SELECT * FROM ("); + if (!onlyWtrv) { + sql.append("SELECT river.STCD AS stcd, ") + .append("river.STNM AS stnm, ") + .append("'ZQ' AS sttpCode, ") + .append("river.FHSTCD AS fhstcd, ") + .append("fh.STNM AS fhstnm, ") + .append("river.RSTCD AS rstcd, ") + .append("eng.ENNM AS ennm, ") + .append("NVL(fh.BASE_ID, eng.BASE_ID) AS baseId, ") + .append("hb.BASENAME AS baseName, ") + .append("NVL(fh.HBRVCD, eng.HBRVCD) AS hbrvcd, ") + .append("river.JCDT AS jcdt, ") + .append("river.MWAY AS mway, ") + .append("river.DTIN AS dtin, ") + .append("river.DTIN_SRC AS dtinSrc, ") + .append("river.DTIN_TYPE AS dtinType, ") + .append("river.DTIN_TM AS dtinTm, ") + .append("river.STINDX AS stindx, ") + .append("river.USFL AS usfl, ") + .append("NVL(hb.ORDER_INDEX, 999999) AS baseStepSort, ") + .append("999999 AS rvcdStepSort, ") + .append("NVL(eng.ORDER_INDEX, 999999) AS rstcdStepSort, ") + .append("NVL(river.ORDER_INDEX, 999999) AS siteStepSort ") + .append("FROM SD_RIVER_B_H river ") + .append("LEFT JOIN SD_FHBT_B_H fh ON fh.STCD = river.FHSTCD AND NVL(fh.IS_DELETED, 0) = 0 ") + .append("LEFT JOIN SD_ENGINFO_B_H eng ON eng.STCD = river.RSTCD AND NVL(eng.IS_DELETED, 0) = 0 ") + .append("LEFT JOIN SD_HYDROBASE hb ON hb.BASEID = NVL(fh.BASE_ID, eng.BASE_ID) AND NVL(hb.IS_DELETED, 0) = 0 ") + .append("WHERE NVL(river.IS_DELETED, 0) = 0 ") + .append("AND river.STTP = 'ZQ' ") + .append("AND river.FHSTCD IS NOT NULL "); + } + if (!onlyRiver && !onlyWtrv) { + sql.append(" UNION ALL "); + } + if (!onlyRiver) { + sql.append("SELECT wt.STCD AS stcd, ") + .append("wt.STNM AS stnm, ") + .append("'WTRV' AS sttpCode, ") + .append("wt.FHSTCD AS fhstcd, ") + .append("fh.STNM AS fhstnm, ") + .append("wt.RSTCD AS rstcd, ") + .append("eng.ENNM AS ennm, ") + .append("NVL(fh.BASE_ID, eng.BASE_ID) AS baseId, ") + .append("hb.BASENAME AS baseName, ") + .append("NVL(fh.HBRVCD, eng.HBRVCD) AS hbrvcd, ") + .append("wt.JCDT AS jcdt, ") + .append("wt.MWAY AS mway, ") + .append("wt.DTIN AS dtin, ") + .append("wt.DTIN_SRC AS dtinSrc, ") + .append("wt.DTIN_TYPE AS dtinType, ") + .append("wt.DTIN_TM AS dtinTm, ") + .append("wt.STINDX AS stindx, ") + .append("wt.USFL AS usfl, ") + .append("NVL(hb.ORDER_INDEX, 999999) AS baseStepSort, ") + .append("999999 AS rvcdStepSort, ") + .append("NVL(eng.ORDER_INDEX, 999999) AS rstcdStepSort, ") + .append("NVL(wt.ORDER_INDEX, 999999) AS siteStepSort ") + .append("FROM SD_WT_B_H wt ") + .append("LEFT JOIN SD_FHBT_B_H fh ON fh.STCD = wt.FHSTCD AND NVL(fh.IS_DELETED, 0) = 0 ") + .append("LEFT JOIN SD_ENGINFO_B_H eng ON eng.STCD = wt.RSTCD AND NVL(eng.IS_DELETED, 0) = 0 ") + .append("LEFT JOIN SD_HYDROBASE hb ON hb.BASEID = NVL(fh.BASE_ID, eng.BASE_ID) AND NVL(hb.IS_DELETED, 0) = 0 ") + .append("WHERE NVL(wt.IS_DELETED, 0) = 0 ") + .append("AND wt.STTP = 'WTRV' ") + .append("AND wt.FHSTCD IS NOT NULL "); + } + sql.append(") t WHERE 1 = 1 "); + return sql.toString(); + } + + private String buildFhMsstbprptFilterCondition(DataSourceRequest.FilterDescriptor filter, + Map paramMap, + int[] indexHolder) { + if (filter == null) { + return ""; + } + if (StrUtil.isNotBlank(filter.getField())) { + return buildFhMsstbprptLeafCondition(filter, paramMap, indexHolder); + } + if (CollUtil.isEmpty(filter.getFilters())) { + return ""; + } + List conditions = new ArrayList<>(); + for (DataSourceRequest.FilterDescriptor child : filter.getFilters()) { + String childSql = buildFhMsstbprptFilterCondition(child, paramMap, indexHolder); + if (StrUtil.isNotBlank(childSql)) { + conditions.add("(" + childSql + ")"); + } + } + if (conditions.isEmpty()) { + return ""; + } + String logic = "or".equalsIgnoreCase(filter.getLogic()) ? " OR " : " AND "; + return String.join(logic, conditions); + } + + private String buildFhMsstbprptLeafCondition(DataSourceRequest.FilterDescriptor filter, + Map paramMap, + int[] indexHolder) { + String column = mapFhMsstbprptColumn(filter.getField()); + if (StrUtil.isBlank(column)) { + return ""; + } + String operator = StrUtil.blankToDefault(filter.getOperator(), "eq").toLowerCase(); + Object value = filter.getValue(); + if ("isnull".equals(operator)) { + return column + " IS NULL"; + } + if ("isnotnull".equals(operator)) { + return column + " IS NOT NULL"; + } + if ("in".equals(operator)) { + List values = normalizeFilterValues(value); + if (values.isEmpty()) { + return ""; + } + List placeholders = new ArrayList<>(); + for (Object item : values) { + String paramKey = "fhMsParam" + indexHolder[0]++; + paramMap.put(paramKey, item); + placeholders.add("#{map." + paramKey + "}"); + } + return column + " IN (" + String.join(", ", placeholders) + ")"; + } + String paramKey = "fhMsParam" + indexHolder[0]++; + switch (operator) { + case "eq": + paramMap.put(paramKey, value); + return column + " = #{map." + paramKey + "}"; + case "neq": + paramMap.put(paramKey, value); + return column + " <> #{map." + paramKey + "}"; + case "contains": + paramMap.put(paramKey, "%" + value + "%"); + return column + " LIKE #{map." + paramKey + "}"; + case "startswith": + paramMap.put(paramKey, value + "%"); + return column + " LIKE #{map." + paramKey + "}"; + case "endswith": + paramMap.put(paramKey, "%" + value); + return column + " LIKE #{map." + paramKey + "}"; + case "gt": + paramMap.put(paramKey, value); + return column + " > #{map." + paramKey + "}"; + case "gte": + paramMap.put(paramKey, value); + return column + " >= #{map." + paramKey + "}"; + case "lt": + paramMap.put(paramKey, value); + return column + " < #{map." + paramKey + "}"; + case "lte": + paramMap.put(paramKey, value); + return column + " <= #{map." + paramKey + "}"; + default: + return ""; + } + } + + private String mapFhMsstbprptColumn(String field) { + if (StrUtil.isBlank(field)) { + return null; + } + return switch (field) { + case "stcd" -> "t.stcd"; + case "stnm" -> "t.stnm"; + case "sttpCode" -> "t.sttpCode"; + case "fhstcd" -> "t.fhstcd"; + case "fhstnm" -> "t.fhstnm"; + case "rstcd" -> "t.rstcd"; + case "ennm" -> "t.ennm"; + case "baseId" -> "t.baseId"; + case "baseName" -> "t.baseName"; + case "hbrvcd" -> "t.hbrvcd"; + case "jcdt" -> "t.jcdt"; + case "mway" -> "t.mway"; + case "dtin" -> "t.dtin"; + case "dtinSrc" -> "t.dtinSrc"; + case "dtinType" -> "t.dtinType"; + case "dtinTm" -> "t.dtinTm"; + case "stindx" -> "t.stindx"; + case "usfl", "enable" -> "t.usfl"; + case "baseStepSort" -> "t.baseStepSort"; + case "rvcdStepSort" -> "t.rvcdStepSort"; + case "rstcdStepSort" -> "t.rstcdStepSort"; + case "siteStepSort" -> "t.siteStepSort"; + default -> null; + }; + } + + private String buildFhMsstbprptOrderBySql(List sortList) { + if (CollUtil.isEmpty(sortList)) { + return " ORDER BY t.baseStepSort ASC, t.rvcdStepSort ASC, t.rstcdStepSort ASC, t.siteStepSort ASC, t.stcd ASC"; + } + List orders = new ArrayList<>(); + for (DataSourceRequest.SortDescriptor sortDescriptor : sortList) { + if (sortDescriptor == null || StrUtil.isBlank(sortDescriptor.getField())) { + continue; + } + String column = mapFhMsstbprptColumn(sortDescriptor.getField()); + if (StrUtil.isBlank(column)) { + continue; + } + String dir = ("desc".equalsIgnoreCase(sortDescriptor.getDir()) || "des".equalsIgnoreCase(sortDescriptor.getDir())) ? "DESC" : "ASC"; + orders.add(column + " " + dir); + } + if (orders.isEmpty()) { + return " ORDER BY t.baseStepSort ASC, t.rvcdStepSort ASC, t.rstcdStepSort ASC, t.siteStepSort ASC, t.stcd ASC"; + } + return " ORDER BY " + String.join(", ", orders); + } + + private String buildSdrvwtsFilterCondition(DataSourceRequest.FilterDescriptor filter, + Map paramMap, + int[] indexHolder) { + if (filter == null) { + return ""; + } + if (StrUtil.isNotBlank(filter.getField())) { + return buildSdrvwtsLeafCondition(filter, paramMap, indexHolder); + } + if (CollUtil.isEmpty(filter.getFilters())) { + return ""; + } + List conditions = new ArrayList<>(); + for (DataSourceRequest.FilterDescriptor child : filter.getFilters()) { + String childSql = buildSdrvwtsFilterCondition(child, paramMap, indexHolder); + if (StrUtil.isNotBlank(childSql)) { + conditions.add("(" + childSql + ")"); + } + } + if (conditions.isEmpty()) { + return ""; + } + String logic = "or".equalsIgnoreCase(filter.getLogic()) ? " OR " : " AND "; + return String.join(logic, conditions); + } + + private String buildSdrvwtsLeafCondition(DataSourceRequest.FilterDescriptor filter, + Map paramMap, + int[] indexHolder) { + String column = mapSdrvwtsColumn(filter.getField()); + if (StrUtil.isBlank(column)) { + return ""; + } + String operator = StrUtil.blankToDefault(filter.getOperator(), "eq").toLowerCase(); + Object value = filter.getValue(); + if ("isnull".equals(operator)) { + return column + " IS NULL"; + } + if ("isnotnull".equals(operator)) { + return column + " IS NOT NULL"; + } + boolean dateField = isSdrvwtsDateField(filter.getField()); + if ("in".equals(operator)) { + List values = normalizeFilterValues(value); + if (values.isEmpty()) { + return ""; + } + List placeholders = new ArrayList<>(); + for (Object item : values) { + String paramKey = "fhWtParam" + indexHolder[0]++; + paramMap.put(paramKey, item); + placeholders.add(buildSdrvwtsValueExpr(paramKey, dateField, item)); + } + return column + " IN (" + String.join(", ", placeholders) + ")"; + } + + String paramKey = "fhWtParam" + indexHolder[0]++; + String valueExpr = buildSdrvwtsValueExpr(paramKey, dateField, value); + switch (operator) { + case "eq": + paramMap.put(paramKey, value); + return column + " = " + valueExpr; + case "neq": + paramMap.put(paramKey, value); + return column + " <> " + valueExpr; + case "contains": + paramMap.put(paramKey, "%" + value + "%"); + return column + " LIKE #{map." + paramKey + "}"; + case "startswith": + paramMap.put(paramKey, value + "%"); + return column + " LIKE #{map." + paramKey + "}"; + case "endswith": + paramMap.put(paramKey, "%" + value); + return column + " LIKE #{map." + paramKey + "}"; + case "gt": + paramMap.put(paramKey, value); + return column + " > " + valueExpr; + case "gte": + paramMap.put(paramKey, value); + return column + " >= " + valueExpr; + case "lt": + paramMap.put(paramKey, value); + return column + " < " + valueExpr; + case "lte": + paramMap.put(paramKey, value); + return column + " <= " + valueExpr; + default: + return ""; + } + } + + private String mapSdrvwtsColumn(String field) { + if (StrUtil.isBlank(field)) { + return null; + } + return switch (field) { + case "id" -> "t.ID"; + case "stcd" -> "t.STCD"; + case "dt" -> "t.DT"; + case "wt" -> "t.WT"; + default -> null; + }; + } + + private boolean isSdrvwtsDateField(String field) { + return "dt".equalsIgnoreCase(field); + } + + private String buildSdrvwtsValueExpr(String paramKey, boolean dateField, Object value) { + if (!dateField || value == null) { + return "#{map." + paramKey + "}"; + } + String text = String.valueOf(value).trim(); + if (text.length() <= 10) { + return "TO_DATE(#{map." + paramKey + "}, 'YYYY-MM-DD')"; + } + return "TO_DATE(#{map." + paramKey + "}, 'YYYY-MM-DD HH24:MI:SS')"; + } + + private String buildSdrvwtsOrderBySql(List sortList) { + if (CollUtil.isEmpty(sortList)) { + return " ORDER BY t.DT DESC, t.STCD ASC"; + } + List orders = new ArrayList<>(); + for (DataSourceRequest.SortDescriptor sortDescriptor : sortList) { + if (sortDescriptor == null || StrUtil.isBlank(sortDescriptor.getField())) { + continue; + } + String column = mapSdrvwtsColumn(sortDescriptor.getField()); + if (StrUtil.isBlank(column)) { + continue; + } + String dir = ("desc".equalsIgnoreCase(sortDescriptor.getDir()) || "des".equalsIgnoreCase(sortDescriptor.getDir())) ? "DESC" : "ASC"; + orders.add(column + " " + dir); + } + if (orders.isEmpty()) { + return " ORDER BY t.DT DESC, t.STCD ASC"; + } + return " ORDER BY " + String.join(", ", orders); + } + + private String findFilterFieldValue(DataSourceRequest.FilterDescriptor filter, String field) { + if (filter == null || StrUtil.isBlank(field)) { + return null; + } + if (field.equalsIgnoreCase(filter.getField()) && filter.getValue() != null) { + return String.valueOf(filter.getValue()); + } + if (CollUtil.isEmpty(filter.getFilters())) { + return null; + } + for (DataSourceRequest.FilterDescriptor child : filter.getFilters()) { + String value = findFilterFieldValue(child, field); + if (StrUtil.isNotBlank(value)) { + return value; + } + } + return null; + } + @Override public DataSourceResult getStTbYsBVoKendoListCust(DataSourceRequest dataSourceRequest) { StringBuilder sql = new StringBuilder(); diff --git a/backend/src/main/java/com/yfd/platform/env/wq/service/impl/EnvWqDataServiceImpl.java b/backend/src/main/java/com/yfd/platform/env/wq/service/impl/EnvWqDataServiceImpl.java index 94e9c554..883ca95a 100644 --- a/backend/src/main/java/com/yfd/platform/env/wq/service/impl/EnvWqDataServiceImpl.java +++ b/backend/src/main/java/com/yfd/platform/env/wq/service/impl/EnvWqDataServiceImpl.java @@ -641,7 +641,7 @@ public class EnvWqDataServiceImpl implements EnvWqDataService { .append("wq.ORDER_INDEX AS siteStepSort ") .append("FROM SD_WQ_B_H wq ") .append("LEFT JOIN SD_ENGINFO_B_H eng ON eng.STCD = wq.RSTCD ") - .append("LEFT JOIN SD_HYDROBASE hb ON hb.BASEID = eng.BASE_ID AND NVL(hb.IS_DELETED, 0) = 0 ") + .append("LEFT JOIN SD_HYDROBASE hb ON hb.BASEID = wq.BASE_ID AND NVL(hb.IS_DELETED, 0) = 0 ") .append("LEFT JOIN (SELECT DISTINCT STCD FROM SD_WQ_R WHERE NVL(IS_DELETED, 0) = 0 AND TM >= SYSDATE - 1) recent ON recent.STCD = wq.STCD ") .append("WHERE NVL(wq.IS_DELETED, 0) = 0 "); } From 38a53ec7daaa6bd14e2da6ec63d36bb8a3db62dd Mon Sep 17 00:00:00 2001 From: tangwei Date: Thu, 28 May 2026 15:39:34 +0800 Subject: [PATCH 40/41] =?UTF-8?q?feat:=20=E6=9F=A5=E8=AF=A2=E6=A0=96?= =?UTF-8?q?=E6=81=AF=E5=9C=B0=E6=B5=81=E9=87=8F=E7=AB=99=E6=97=A5=E7=BB=9F?= =?UTF-8?q?=E8=AE=A1=E6=95=B0=E6=8D=AE?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../fh/controller/FhHabitatController.java | 6 + .../env/fh/entity/vo/FhSdriverdayVo.java | 38 ++++ .../env/fh/service/FhHabitatService.java | 2 + .../fh/service/impl/FhHabitatServiceImpl.java | 197 ++++++++++++++++++ 4 files changed, 243 insertions(+) create mode 100644 backend/src/main/java/com/yfd/platform/env/fh/entity/vo/FhSdriverdayVo.java diff --git a/backend/src/main/java/com/yfd/platform/env/fh/controller/FhHabitatController.java b/backend/src/main/java/com/yfd/platform/env/fh/controller/FhHabitatController.java index dcfac12c..ddaa23a3 100644 --- a/backend/src/main/java/com/yfd/platform/env/fh/controller/FhHabitatController.java +++ b/backend/src/main/java/com/yfd/platform/env/fh/controller/FhHabitatController.java @@ -46,6 +46,12 @@ public class FhHabitatController { return ResponseResult.successData(fhHabitatService.getSdrvwtsList(dataSourceRequest)); } + @PostMapping("/zq/sdriverdays/GetKendoList") + @Operation(summary = "查询栖息地流量站日统计数据") + public ResponseResult getSdriverdaysList(@RequestBody DataSourceRequest dataSourceRequest) { + return ResponseResult.successData(fhHabitatService.getSdriverdaysList(dataSourceRequest)); + } + @PostMapping("/msstbprpt/GetKendoList") @Operation(summary = "查询栖息地监测站点列表") public ResponseResult getMsstbprptList(@RequestBody DataSourceRequest dataSourceRequest) { diff --git a/backend/src/main/java/com/yfd/platform/env/fh/entity/vo/FhSdriverdayVo.java b/backend/src/main/java/com/yfd/platform/env/fh/entity/vo/FhSdriverdayVo.java new file mode 100644 index 00000000..f81decd4 --- /dev/null +++ b/backend/src/main/java/com/yfd/platform/env/fh/entity/vo/FhSdriverdayVo.java @@ -0,0 +1,38 @@ +package com.yfd.platform.env.fh.entity.vo; + +import com.fasterxml.jackson.annotation.JsonFormat; +import io.swagger.v3.oas.annotations.media.Schema; +import lombok.Data; + +import java.io.Serializable; +import java.math.BigDecimal; +import java.util.Date; + +@Data +@Schema(description = "栖息地流量站日统计数据") +public class FhSdriverdayVo implements Serializable { + + private static final long serialVersionUID = 1L; + + @Schema(description = "主键ID") + private String id; + + @Schema(description = "站码") + private String stcd; + + @Schema(description = "时间") + @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss", timezone = "GMT+8") + private Date dt; + + @Schema(description = "水位") + private BigDecimal z; + + @Schema(description = "流量") + private BigDecimal q; + + @Schema(description = "流速") + private BigDecimal v; + + @Schema(description = "测流方法") + private String msqmt; +} diff --git a/backend/src/main/java/com/yfd/platform/env/fh/service/FhHabitatService.java b/backend/src/main/java/com/yfd/platform/env/fh/service/FhHabitatService.java index d0d5d8d7..92b600db 100644 --- a/backend/src/main/java/com/yfd/platform/env/fh/service/FhHabitatService.java +++ b/backend/src/main/java/com/yfd/platform/env/fh/service/FhHabitatService.java @@ -16,6 +16,8 @@ public interface FhHabitatService { DataSourceResult getSdrvwtsList(DataSourceRequest dataSourceRequest); + DataSourceResult getSdriverdaysList(DataSourceRequest dataSourceRequest); + DataSourceResult getMsstbprptList(DataSourceRequest dataSourceRequest); DataSourceResult getStTbYsBVoKendoListCust(DataSourceRequest dataSourceRequest); diff --git a/backend/src/main/java/com/yfd/platform/env/fh/service/impl/FhHabitatServiceImpl.java b/backend/src/main/java/com/yfd/platform/env/fh/service/impl/FhHabitatServiceImpl.java index af552913..752ca7d5 100644 --- a/backend/src/main/java/com/yfd/platform/env/fh/service/impl/FhHabitatServiceImpl.java +++ b/backend/src/main/java/com/yfd/platform/env/fh/service/impl/FhHabitatServiceImpl.java @@ -16,6 +16,7 @@ import com.yfd.platform.env.fh.entity.ao.FhDefaultAo; import com.yfd.platform.env.fh.entity.vo.FhDefaultVo; import com.yfd.platform.env.fh.entity.vo.HabitatVo; import com.yfd.platform.env.fh.entity.vo.FhMsstbprptVo; +import com.yfd.platform.env.fh.entity.vo.FhSdriverdayVo; import com.yfd.platform.env.fh.entity.vo.FhSdrvwtsVo; import com.yfd.platform.env.fh.service.FhHabitatService; import com.yfd.platform.env.wq.entity.vo.StTbYsVo; @@ -210,6 +211,58 @@ public class FhHabitatServiceImpl implements FhHabitatService { return result; } + @Override + public DataSourceResult getSdriverdaysList(DataSourceRequest dataSourceRequest) { + DataSourceLoadOptionsBase loadOptions = dataSourceRequest == null ? null : dataSourceRequest.toDevRequest(); + StringBuilder sql = new StringBuilder(); + sql.append("SELECT ") + .append("t.ID AS id, ") + .append("t.STCD AS stcd, ") + .append("t.DT AS dt, ") + .append("t.Z AS z, ") + .append("t.Q AS q, ") + .append("t.V AS v, ") + .append("t.MSQMT AS msqmt ") + .append("FROM SD_RIVERDAY_S t ") + .append("WHERE NVL(t.IS_DELETED, 0) = 0 "); + + Map paramMap = new HashMap<>(); + String filterSql = buildSdriverdaysFilterCondition( + dataSourceRequest == null ? null : dataSourceRequest.getFilter(), + paramMap, + new int[]{0} + ); + if (StrUtil.isNotBlank(filterSql)) { + sql.append(" AND ").append(filterSql).append(" "); + } + + GroupingInfo[] groups = loadOptions == null ? null : loadOptions.getGroup(); + if (groups != null && groups.length > 0) { + String groupSql = buildGroupSql(sql.toString(), groups); + List> groupRows = microservicDynamicSQLMapper.pageAllList(null, groupSql, paramMap); + DataSourceResult result = new DataSourceResult<>(); + if (Boolean.TRUE.equals(dataSourceRequest.getGroupResultFlat())) { + result.setData((List) (List) new GroupHelper().faltGroup(groupRows, Arrays.asList(groups))); + } else { + result.setData((List) (List) new GroupHelper().group(groupRows, Arrays.asList(groups))); + } + result.setTotal(0L); + result.setAggregates(new HashMap<>()); + return result; + } + + sql.append(buildSdriverdaysOrderBySql(dataSourceRequest == null ? null : dataSourceRequest.getSort())); + PageInfo pageInfo = loadOptions == null ? null : QgcQueryWrapperUtil.getPageInfo(loadOptions); + Page page = pageInfo != null && pageInfo.getHasPageInfo() ? pageInfo.getPage() : null; + List list = microservicDynamicSQLMapper.pageAllListWithResultType(page, sql.toString(), paramMap, FhSdriverdayVo.class); + + DataSourceResult result = new DataSourceResult<>(); + result.setData(list); + result.setTotal(page != null ? page.getTotal() : list.size()); + result.setAggregates(new HashMap<>()); + return result; + } + private String buildDefaultFhListSql(FhDefaultAo fhDefaultAo) { String dateConditionWtrv = ""; String dateConditionZq = ""; @@ -1323,6 +1376,150 @@ public class FhHabitatServiceImpl implements FhHabitatService { return " ORDER BY " + String.join(", ", orders); } + private String buildSdriverdaysFilterCondition(DataSourceRequest.FilterDescriptor filter, + Map paramMap, + int[] indexHolder) { + if (filter == null) { + return ""; + } + if (StrUtil.isNotBlank(filter.getField())) { + return buildSdriverdaysLeafCondition(filter, paramMap, indexHolder); + } + if (CollUtil.isEmpty(filter.getFilters())) { + return ""; + } + List conditions = new ArrayList<>(); + for (DataSourceRequest.FilterDescriptor child : filter.getFilters()) { + String childSql = buildSdriverdaysFilterCondition(child, paramMap, indexHolder); + if (StrUtil.isNotBlank(childSql)) { + conditions.add("(" + childSql + ")"); + } + } + if (conditions.isEmpty()) { + return ""; + } + String logic = "or".equalsIgnoreCase(filter.getLogic()) ? " OR " : " AND "; + return String.join(logic, conditions); + } + + private String buildSdriverdaysLeafCondition(DataSourceRequest.FilterDescriptor filter, + Map paramMap, + int[] indexHolder) { + String column = mapSdriverdaysColumn(filter.getField()); + if (StrUtil.isBlank(column)) { + return ""; + } + String operator = StrUtil.blankToDefault(filter.getOperator(), "eq").toLowerCase(); + Object value = filter.getValue(); + if ("isnull".equals(operator)) { + return column + " IS NULL"; + } + if ("isnotnull".equals(operator)) { + return column + " IS NOT NULL"; + } + boolean dateField = isSdriverdaysDateField(filter.getField()); + if ("in".equals(operator)) { + List values = normalizeFilterValues(value); + if (values.isEmpty()) { + return ""; + } + List placeholders = new ArrayList<>(); + for (Object item : values) { + String paramKey = "fhRiverParam" + indexHolder[0]++; + paramMap.put(paramKey, item); + placeholders.add(buildSdriverdaysValueExpr(paramKey, dateField, item)); + } + return column + " IN (" + String.join(", ", placeholders) + ")"; + } + + String paramKey = "fhRiverParam" + indexHolder[0]++; + String valueExpr = buildSdriverdaysValueExpr(paramKey, dateField, value); + switch (operator) { + case "eq": + paramMap.put(paramKey, value); + return column + " = " + valueExpr; + case "neq": + paramMap.put(paramKey, value); + return column + " <> " + valueExpr; + case "contains": + paramMap.put(paramKey, "%" + value + "%"); + return column + " LIKE #{map." + paramKey + "}"; + case "startswith": + paramMap.put(paramKey, value + "%"); + return column + " LIKE #{map." + paramKey + "}"; + case "endswith": + paramMap.put(paramKey, "%" + value); + return column + " LIKE #{map." + paramKey + "}"; + case "gt": + paramMap.put(paramKey, value); + return column + " > " + valueExpr; + case "gte": + paramMap.put(paramKey, value); + return column + " >= " + valueExpr; + case "lt": + paramMap.put(paramKey, value); + return column + " < " + valueExpr; + case "lte": + paramMap.put(paramKey, value); + return column + " <= " + valueExpr; + default: + return ""; + } + } + + private String mapSdriverdaysColumn(String field) { + if (StrUtil.isBlank(field)) { + return null; + } + return switch (field.toLowerCase()) { + case "id" -> "t.ID"; + case "stcd" -> "t.STCD"; + case "dt" -> "t.DT"; + case "z" -> "t.Z"; + case "q" -> "t.Q"; + case "v" -> "t.V"; + case "msqmt" -> "t.MSQMT"; + default -> null; + }; + } + + private boolean isSdriverdaysDateField(String field) { + return "dt".equalsIgnoreCase(field); + } + + private String buildSdriverdaysValueExpr(String paramKey, boolean dateField, Object value) { + if (!dateField || value == null) { + return "#{map." + paramKey + "}"; + } + String text = String.valueOf(value).trim(); + if (text.length() <= 10) { + return "TO_DATE(#{map." + paramKey + "}, 'YYYY-MM-DD')"; + } + return "TO_DATE(#{map." + paramKey + "}, 'YYYY-MM-DD HH24:MI:SS')"; + } + + private String buildSdriverdaysOrderBySql(List sortList) { + if (CollUtil.isEmpty(sortList)) { + return " ORDER BY t.DT DESC, t.STCD ASC"; + } + List orders = new ArrayList<>(); + for (DataSourceRequest.SortDescriptor sortDescriptor : sortList) { + if (sortDescriptor == null || StrUtil.isBlank(sortDescriptor.getField())) { + continue; + } + String column = mapSdriverdaysColumn(sortDescriptor.getField()); + if (StrUtil.isBlank(column)) { + continue; + } + String dir = ("desc".equalsIgnoreCase(sortDescriptor.getDir()) || "des".equalsIgnoreCase(sortDescriptor.getDir())) ? "DESC" : "ASC"; + orders.add(column + " " + dir); + } + if (orders.isEmpty()) { + return " ORDER BY t.DT DESC, t.STCD ASC"; + } + return " ORDER BY " + String.join(", ", orders); + } + private String findFilterFieldValue(DataSourceRequest.FilterDescriptor filter, String field) { if (filter == null || StrUtil.isBlank(field)) { return null; From ac32e8c026b8882a122cd1e0974ff0ccc05add46 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E7=8E=8B=E5=85=B4=E5=87=AF?= <2448379534@qq.com> Date: Mon, 1 Jun 2026 08:37:38 +0800 Subject: [PATCH 41/41] =?UTF-8?q?=E6=B0=B4=E8=B4=A8=E6=8E=A5=E5=8F=A3?= =?UTF-8?q?=E5=AF=B9=E6=8E=A5-=E9=83=A8=E5=88=86?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- frontend/.env.development | 4 +- frontend/src/api/sz/index.ts | 50 + .../src/components/MapModal/column.config.ts | 32 +- .../components/WaterTemperatureContrast.vue | 17 +- .../src/components/MapModal/setting.config.ts | 2 +- .../src/components/SidePanelItem/index.vue | 54 +- .../EnvironmentalQualityTwoLayers.vue | 844 +++++++++++++++++ .../modules/EnvironmentalQuality/index.vue | 859 ++++++++++++++++-- ...eixingzuchengjijieruqingkuangTwoLayers.vue | 22 +- .../index.vue | 13 +- .../index.vue | 41 +- .../src/modules/shuiWenNianNeiFenBu/index.vue | 2 +- .../shuiwenjiancegongzuoEJ.vue | 72 +- .../modules/shuizhijiancegongzuoQK/index.vue | 239 ++++- .../shuiwenjiancegongzuoEJ.vue | 636 +++++++++++++ frontend/src/modules/waterQuality/index.vue | 500 +++++++++- .../yanchengshuiwenChangeMod/index.vue | 11 +- frontend/src/utils/request.ts | 2 +- .../shuiHuanJingZhiLiangZhuangKuang.vue | 3 +- 19 files changed, 3180 insertions(+), 223 deletions(-) create mode 100644 frontend/src/api/sz/index.ts create mode 100644 frontend/src/modules/EnvironmentalQuality/TwoLayers/EnvironmentalQualityTwoLayers.vue create mode 100644 frontend/src/modules/shuizhijiancegongzuoQK/shuiwenjiancegongzuoEJ.vue diff --git a/frontend/.env.development b/frontend/.env.development index c9ce1af6..3c90805a 100644 --- a/frontend/.env.development +++ b/frontend/.env.development @@ -7,12 +7,12 @@ VITE_APP_TITLE = '水电水利建设项目全过程环境管理信息平台' VITE_APP_PORT = 3000 VITE_APP_BASE_API = '/dev-api' # 本地环境 -# VITE_APP_BASE_URL = 'http://localhost:8093' +VITE_APP_BASE_URL = 'http://localhost:8093' # 测试环境 # VITE_APP_BASE_URL = 'http://172.16.21.142:8093' # VITE_APP_BASE_URL = 'http://172.16.21.142:8096' # 汤伟 -VITE_APP_BASE_URL = 'http://10.84.121.21:8093' +# VITE_APP_BASE_URL = 'http://10.84.121.21:8093' # VITE_APP_BASE_URL = 'http://192.168.1.162:8093' # 测试环境线上 diff --git a/frontend/src/api/sz/index.ts b/frontend/src/api/sz/index.ts new file mode 100644 index 00000000..3433aa41 --- /dev/null +++ b/frontend/src/api/sz/index.ts @@ -0,0 +1,50 @@ +import request from '@/utils/request'; +//水质监测工作开展情况 +export function msstbprptGetKendoList(data: any) { + return request({ + url: '/api/dec-lygk-base-server/base/msstbprpt/GetKendoList', + method: 'post', + data + }); +} +////水温监测工作开展情况弹框 +export function vmsstbprptGetKendoList(data: any) { + return request({ + url: '/wq/vmsstbprpt/GetKendoList', + method: 'post', + data + }); +} +//地表水水质达标率 +export function wqGetKendoListCust(data: any) { + return request({ + url: '/api/wmp-env-server/env/wq/GetKendoListCust', + method: 'post', + data + }); +} + +//环境质量满足度 - 表格数据列表 +export function wqGetKendoList(data: any) { + return request({ + url: '/api/wmp-env-server/env/wq/GetKendoListCust', + method: 'post', + data + }); +} +//沿程水质变化_ 图表数据 +export function qgcGetKendoListCust(data: any) { + return request({ + url: '/api/wmp-env-server/env/wq/along/qgc/GetKendoListCust', + method: 'post', + data + }); +} +//沿程水质变化_ 根据流域获取河段 https://211.99.26.225:12122 +export function wbsbGetKendoList(data: any) { + return request({ + url: '/api/dec-lygk-base-server/base/wbsb/GetKendoList', + method: 'post', + data + }); +} \ No newline at end of file diff --git a/frontend/src/components/MapModal/column.config.ts b/frontend/src/components/MapModal/column.config.ts index 0856aa04..975b9a94 100644 --- a/frontend/src/components/MapModal/column.config.ts +++ b/frontend/src/components/MapModal/column.config.ts @@ -1455,7 +1455,7 @@ const FPPointColumns: Array = [ filed: 'inv', visible: true, type: 'number', - toFixed: 4, + toFixed: 6, url: '', }, { @@ -1629,7 +1629,7 @@ const FBPointColumns: Array = [ filed: 'inv', visible: true, type: 'number', - toFixed: 4, + toFixed: 6, url: '', }, { @@ -1760,7 +1760,7 @@ const VaPointColumns: Array = [ filed: 'inv', visible: true, type: 'number', - toFixed: 4, + toFixed: 6, url: '', }, { @@ -2149,6 +2149,7 @@ const DwPointColumns: Array = [ filed: 'nrmxavwt', visible: true, type: 'number', + toFixed: 1, url: '', }, { @@ -2156,6 +2157,7 @@ const DwPointColumns: Array = [ filed: 'nrmnavwt', visible: true, type: 'number', + toFixed: 1, url: '', }, { @@ -2163,6 +2165,7 @@ const DwPointColumns: Array = [ filed: 'dnavwt', visible: true, type: 'number', + toFixed: 1, url: '', }, { @@ -2170,6 +2173,7 @@ const DwPointColumns: Array = [ filed: 'dnmxavwt', visible: true, type: 'number', + toFixed: 1, url: '', }, { @@ -2177,6 +2181,7 @@ const DwPointColumns: Array = [ filed: 'dnwnavwt', visible: true, type: 'number', + toFixed: 1, url: '', }, { @@ -2200,7 +2205,7 @@ const DwPointColumns: Array = [ filed: 'inv', visible: true, type: 'number', - toFixed: 4, + toFixed: 6, url: '', }, { @@ -2336,6 +2341,7 @@ const DwFivePointColumns: Array = [ filed: 'nrmxavwt', visible: true, type: 'number', + toFixed: 1, url: '', }, { @@ -2343,6 +2349,7 @@ const DwFivePointColumns: Array = [ filed: 'nrmnavwt', visible: true, type: 'number', + toFixed: 1, url: '', }, { @@ -2350,6 +2357,7 @@ const DwFivePointColumns: Array = [ filed: 'dnavwt', visible: true, type: 'number', + toFixed: 1, url: '', }, { @@ -2357,6 +2365,7 @@ const DwFivePointColumns: Array = [ filed: 'dnmxavwt', visible: true, type: 'number', + toFixed: 1, url: '', }, { @@ -2364,6 +2373,7 @@ const DwFivePointColumns: Array = [ filed: 'dnwnavwt', visible: true, type: 'number', + toFixed: 1, url: '', }, @@ -2372,7 +2382,7 @@ const DwFivePointColumns: Array = [ filed: 'inv', visible: true, type: 'number', - toFixed: 4, + toFixed: 6, url: '', }, { @@ -2627,7 +2637,7 @@ const DwOnePointColumns: Array = [ filed: 'nrmxavwt', visible: true, type: 'number', - toFixed: 2, + toFixed: 1, url: '', }, { @@ -2635,7 +2645,7 @@ const DwOnePointColumns: Array = [ filed: 'nrmnavwt', visible: true, type: 'number', - toFixed: 2, + toFixed: 1, url: '', }, { @@ -2643,7 +2653,7 @@ const DwOnePointColumns: Array = [ filed: 'dnavwt', visible: true, type: 'number', - toFixed: 2, + toFixed: 1, url: '', }, { @@ -2651,7 +2661,7 @@ const DwOnePointColumns: Array = [ filed: 'dnmxavwt', visible: true, type: 'number', - toFixed: 2, + toFixed: 1, url: '', }, { @@ -2659,7 +2669,7 @@ const DwOnePointColumns: Array = [ filed: 'dnmnavwt', visible: true, type: 'number', - toFixed: 2, + toFixed: 1, url: '', }, { @@ -2667,7 +2677,7 @@ const DwOnePointColumns: Array = [ filed: 'inv', visible: true, type: 'number', - toFixed: 4, + toFixed: 6, url: '', }, { diff --git a/frontend/src/components/MapModal/components/WaterTemperatureContrast.vue b/frontend/src/components/MapModal/components/WaterTemperatureContrast.vue index 6837ef96..16f4feff 100644 --- a/frontend/src/components/MapModal/components/WaterTemperatureContrast.vue +++ b/frontend/src/components/MapModal/components/WaterTemperatureContrast.vue @@ -392,11 +392,12 @@ const getChartOption = computed(() => { params.forEach((param: any) => { const dataIndex = param.dataIndex; const record = data[dataIndex]; + const value = param.value != null ? param.value : '-'; html += `
- ${param.seriesName}: ${param.value}°C + ${param.seriesName}: ${value}°C
`; @@ -433,7 +434,19 @@ const getChartOption = computed(() => { show: false }, axisLabel: { - interval: xAxisData.length > 7 ? Math.floor((xAxisData.length - 1) / 7) : 0, + interval: (() => { + const dataLen = xAxisData.length; + if (dataLen <= 8) return 0; // 数据少时全部显示 + + // 计算最大允许的间隔,确保首尾都能显示 + // 需要显示的首尾2个 + 中间最多6个 = 总共8个标签 + const maxLabels = 8; + const minInterval = Math.ceil((dataLen - 1) / (maxLabels - 1)); + + // 如果原有计算的间隔更大,使用原有逻辑;否则使用最小间隔 + const calculatedInterval = Math.floor((dataLen - 1) / 7); + return Math.max(calculatedInterval, minInterval); + })(), fontSize: 12, rotate: 0, margin: 10 diff --git a/frontend/src/components/MapModal/setting.config.ts b/frontend/src/components/MapModal/setting.config.ts index 4094836e..a868bd18 100644 --- a/frontend/src/components/MapModal/setting.config.ts +++ b/frontend/src/components/MapModal/setting.config.ts @@ -661,7 +661,7 @@ const WQFBTabs: Array = [ name: '基础信息', key: 'basicInfo', type: 'basic', - url: '/bbi/siteBipc/getSiteBasicInfo' + url: '/api/dec-lygk-base-server/base/msstbprpt/getStcdInfo' }, { name: '监测数据', diff --git a/frontend/src/components/SidePanelItem/index.vue b/frontend/src/components/SidePanelItem/index.vue index 36e07e6d..c23835e2 100644 --- a/frontend/src/components/SidePanelItem/index.vue +++ b/frontend/src/components/SidePanelItem/index.vue @@ -71,7 +71,7 @@ diff --git a/frontend/src/modules/EnvironmentalQuality/index.vue b/frontend/src/modules/EnvironmentalQuality/index.vue index 79d2c83e..d6dff2ec 100644 --- a/frontend/src/modules/EnvironmentalQuality/index.vue +++ b/frontend/src/modules/EnvironmentalQuality/index.vue @@ -1,81 +1,574 @@ diff --git a/frontend/src/modules/waterQuality/index.vue b/frontend/src/modules/waterQuality/index.vue index 8d8e6cbf..3261e932 100644 --- a/frontend/src/modules/waterQuality/index.vue +++ b/frontend/src/modules/waterQuality/index.vue @@ -1,22 +1,37 @@ diff --git a/frontend/src/modules/yanchengshuiwenChangeMod/index.vue b/frontend/src/modules/yanchengshuiwenChangeMod/index.vue index 484415a2..e2152a82 100644 --- a/frontend/src/modules/yanchengshuiwenChangeMod/index.vue +++ b/frontend/src/modules/yanchengshuiwenChangeMod/index.vue @@ -199,9 +199,11 @@ const initChart = () => { formatter: (params: any) => { if (params && params.length > 0) { const data = params[0]; - // 过滤掉 null 值的数据点 - if (data.value !== null && data.value !== undefined) { + // 根据项目规范:空值统一显示为短横线 `-` + if (data.value != null) { return `${currentTime.value}
${data.name}:${data.value}°C`; + } else { + return `${currentTime.value}
${data.name}:-`; } } return ""; @@ -288,6 +290,7 @@ const initChart = () => { smooth: true, symbol: "circle", symbolSize: 6, + connectNulls: true, // 连接空值两侧的线段,避免折线断开 lineStyle: { color: "#6ca4f7", width: 2, @@ -347,8 +350,8 @@ const init = async () => { logic: "and", filters: [ { field: "rvcd", operator: "eq", dataType: "string", value: paramsOne.rvcd }, - { field: "tm", operator: "gte", dataType: "date", value: paramsOne.tm[0] }, - { field: "tm", operator: "lte", dataType: "date", value: paramsOne.tm[1] }, + { field: "tm", operator: "gte", dataType: "date", value: paramsOne.tm[1] }, + { field: "tm", operator: "lte", dataType: "date", value: paramsOne.tm[0] }, ], }, sort: [{ field: "sort", dir: "asc" }], diff --git a/frontend/src/utils/request.ts b/frontend/src/utils/request.ts index 1960cdb4..b3e6d7ad 100644 --- a/frontend/src/utils/request.ts +++ b/frontend/src/utils/request.ts @@ -31,7 +31,7 @@ service.interceptors.request.use( config.headers._sysid = '10EC2E0B-AEA9-4757-83A2-201BA1BC54E9'; config.headers.authorization = - 'bearer a385ef90-a17d-429f-817f-7d961594020c'; + 'bearer 3f010383-deb5-464c-9198-b42af9c5c839'; config.baseURL = '/'; } else { const user = useUserStoreHook(); diff --git a/frontend/src/views/shuiZhiJianCe/shuiHuanJingZhiLiangZhuangKuang.vue b/frontend/src/views/shuiZhiJianCe/shuiHuanJingZhiLiangZhuangKuang.vue index a2840847..33661117 100644 --- a/frontend/src/views/shuiZhiJianCe/shuiHuanJingZhiLiangZhuangKuang.vue +++ b/frontend/src/views/shuiZhiJianCe/shuiHuanJingZhiLiangZhuangKuang.vue @@ -12,9 +12,10 @@ watch( () => JidiSelectEventStore.selectedItem, (newVal) => { console.log(newVal); + // debugger wbsCode.value = newVal.wbsCode; }, - { deep: true } + { deep: true, immediate: true } );