From cb3978f2f4f03143bd6e010106cb2b1d462b1122 Mon Sep 17 00:00:00 2001 From: tangwei Date: Thu, 21 May 2026 21:04:21 +0800 Subject: [PATCH 01/38] =?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 95442d3..94785cf 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 42bd358..46cfb27 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 0eae5df..0000000 --- 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 c503cc2..e1e9374 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 0cd81a8..4d1c9de 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 59ba7f7..6496d19 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 853478a..d4a6a7c 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 7caa7bf..90ec997 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 065ccaf..0e79bea 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 d329860..572b232 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 86e51ce..3e05d90 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 8d10ac4..b63b2bd 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 f123e9f..570db59 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 a2eea88..bd57806 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 e068481..859a4d4 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 17a0196..f788117 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 bfd6c11..43dc6c2 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 8e2d88e..1f4a30e 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 16a3f3a..486b6d8 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 71ad9f1..b5849c7 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 af0d535..a9a46a9 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 fb61d66..c329845 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 258a0f8..b17bdef 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 a8b50a5..76ea5e5 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 9aaaad8..4357f57 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 586c352..7ff9669 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 db1449f..418fc40 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 7da963e..de4bbff 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 dad16f7..2bd0991 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 1f4001a..00db86f 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 4ad1f92..9d0e738 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 453c754..5b356d3 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 6256ccb..d3e9b21 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 25d931a..8fc876e 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 9d1d37e..68c98d6 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 5313d49..13d950a 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 8f8abcd..04b05ad 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/38] =?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 ba6eb18..fb55233 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 0000000..aa8428b --- /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 0000000..4a60882 --- /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 0000000..47163bf --- /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 0000000..ad5d38b --- /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 0000000..ac273d2 --- /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 0000000..255fa4f --- /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 0000000..92e9401 --- /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/38] =?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 46cfb27..6a096e4 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 a48ba59..9ef89df 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 0000000..f08f920 --- /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 096bee5..9f16b1a 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 1a0b460..1cf1ec7 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/38] =?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 aa8428b..12e25f7 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 0000000..ef6d4d1 --- /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 255fa4f..8fd2445 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 92e9401..51dbdd9 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/38] =?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 12e25f7..ddff1bb 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 51dbdd9..cce2aec 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/38] =?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 ddff1bb..be6c330 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 cce2aec..96932db 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/38] =?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 fb55233..8188f10 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 6a096e4..283b05d 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 0000000..e881489 --- /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 0000000..ab6309a --- /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 0000000..1aec0c8 --- /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 0000000..f4c287f --- /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 0000000..1d6e819 --- /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 0000000..fbcc43c --- /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 0000000..210e89b --- /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 0000000..6f2c545 --- /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 0000000..b531a5c --- /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 0000000..e06ec8e --- /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 be6c330..b0e0082 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 96932db..9a62d97 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/38] =?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 283b05d..453c5b0 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 e881489..e33b271 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 0000000..876b478 --- /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 f4c287f..2b6206c 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 1d6e819..9d49a57 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/38] =?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 fbcc43c..e562d6f 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 0000000..5f86411 --- /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 0000000..bf470bf --- /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 0000000..c6dbadd --- /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/38] =?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 e562d6f..4b4f1ba 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 0000000..8073de0 --- /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 0000000..ccbc42c --- /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 b531a5c..da68571 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 e06ec8e..d2d0e9a 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/38] =?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 bf9a79c..ad4c5ea 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 7931e4a..aaf612b 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 b0e0082..8544b93 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 0000000..8ba1aeb --- /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 8fd2445..2bd2f3b 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 9a62d97..4cf08ed 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 8701ea0..5967765 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 2a20b09b6f928be26bcac495fc6a76cda989a8d0 Mon Sep 17 00:00:00 2001 From: tangwei Date: Tue, 26 May 2026 19:32:53 +0800 Subject: [PATCH 12/38] =?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 | 45 ++++++++++++++++++- 1 file changed, 44 insertions(+), 1 deletion(-) 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 4cf08ed..5246a5c 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 @@ -91,7 +91,50 @@ public class EnvWqDataServiceImpl implements EnvWqDataService { @Override public DataSourceResult processDataKendoList(DataSourceRequest dataSourceRequest) { - return null; + boolean calculated = CommonConstant.CALCULATE_SUCCESS.equals( + RequestHolder.getHttpServletRequest().getParameter(CommonConstant.CALCULATE_FLAG) + ); + + StringBuilder sql = new StringBuilder(buildEnvWqDataBaseSql(calculated)); + Map paramMap = new HashMap<>(); + String filterSql = buildEnvWqDataFilterCondition( + 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 = buildEnvWqDataGroupSql(sql.toString(), groupBy, 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(buildEnvWqDataOrderBySql(dataSourceRequest.getSort())); + PageInfo pageInfo = QgcQueryWrapperUtil.getPageInfo(loadOptions); + Page page = pageInfo.getHasPageInfo() ? pageInfo.getPage() : null; + List list = microservicDynamicSQLMapper.pageAllListWithResultType(page, sql.toString(), paramMap, EnvWqDataVo.class); + fillEnvWqDataDerivedFields(list); + fillEnvWqDataLimit(list); + + DataSourceResult result = new DataSourceResult<>(); + result.setData(list); + result.setTotal(page != null ? page.getTotal() : list.size()); + result.setAggregates(new HashMap<>()); + return result; } @Override From 30d0522a9cca80649e1842de25671b670449c60a Mon Sep 17 00:00:00 2001 From: tangwei Date: Wed, 27 May 2026 08:56:15 +0800 Subject: [PATCH 13/38] =?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 | 102 ++++++++++++++++-- 1 file changed, 93 insertions(+), 9 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 5246a5c..2236da4 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 @@ -7,6 +7,7 @@ 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.Group; import com.yfd.platform.common.GroupHelper; import com.yfd.platform.common.GroupingInfo; import com.yfd.platform.common.MicroservicDynamicSQLMapper; @@ -47,9 +48,12 @@ public class EnvWqDataServiceImpl implements EnvWqDataService { RequestHolder.getHttpServletRequest().getParameter(CommonConstant.CALCULATE_FLAG) ); - StringBuilder sql = new StringBuilder(buildEnvWqDataBaseSql(calculated)); + StringBuilder sql = new StringBuilder(buildEnvWqProcessBaseSql(calculated)); Map paramMap = new HashMap<>(); - String filterSql = buildEnvWqDataFilterCondition( + if (calculated) { + paramMap.put("recordUser", SecurityUtils.getUserId()); + } + String filterSql = buildEnvWqFilterCondition( dataSourceRequest == null ? null : dataSourceRequest.getFilter(), paramMap, new int[]{0} @@ -62,27 +66,27 @@ 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 = buildEnvWqDataGroupSql(sql.toString(), groupBy, groupInfos); + String groupedSql = buildEnvWqGroupSql(sql.toString(), dataSourceRequest, groupInfos); List> list = microservicDynamicSQLMapper.pageAllList(null, groupedSql, paramMap); + list = filterInvalidEnvWqGroupRows(list, groupInfos); 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.setData(toLegacyGroupResult(new GroupHelper().group(list, Arrays.asList(groupInfos)), 0)); } result.setTotal(0L); result.setAggregates(new HashMap<>()); return result; } - sql.append(buildEnvWqDataOrderBySql(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, EnvWqDataVo.class); - fillEnvWqDataDerivedFields(list); - fillEnvWqDataLimit(list); + List list = microservicDynamicSQLMapper.pageAllListWithResultType(page, sql.toString(), paramMap, EnvWqVo.class); + fillEnvWqDerivedFields(list, calculated); - DataSourceResult result = new DataSourceResult<>(); + DataSourceResult result = new DataSourceResult<>(); result.setData(list); result.setTotal(page != null ? page.getTotal() : list.size()); result.setAggregates(new HashMap<>()); @@ -940,10 +944,12 @@ public class EnvWqDataServiceImpl implements EnvWqDataService { case "type" -> "T.TYPE"; case "sttype" -> "T.STTYPE"; case "sfdb" -> "T.SFDB"; + case "dtinType" -> "T.DTINTYPE"; 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"; @@ -954,6 +960,84 @@ public class EnvWqDataServiceImpl implements EnvWqDataService { }; } + private List> filterInvalidEnvWqGroupRows(List> rows, + GroupingInfo[] groupInfos) { + if (rows == null || rows.isEmpty() || groupInfos == null || groupInfos.length == 0) { + return rows; + } + boolean containsBaseGroup = false; + for (GroupingInfo groupInfo : groupInfos) { + if (groupInfo == null || StrUtil.isBlank(groupInfo.getSelector())) { + continue; + } + String selector = groupInfo.getSelector(); + if ("baseStepSort".equals(selector) || "baseId".equals(selector) || "baseName".equals(selector)) { + containsBaseGroup = true; + break; + } + } + if (!containsBaseGroup) { + return rows; + } + List> filtered = new ArrayList<>(); + for (Map row : rows) { + Object baseStepSort = readGroupValue(row, "baseStepSort"); + Object baseId = readGroupValue(row, "baseId"); + Object baseName = readGroupValue(row, "baseName"); + if (!isBlankGroupValue(baseStepSort) || !isBlankGroupValue(baseId) || !isBlankGroupValue(baseName)) { + filtered.add(row); + } + } + return filtered; + } + + private List> toLegacyGroupResult(List groups, int depth) { + if (groups == null) { + return null; + } + List> result = new ArrayList<>(); + for (Group group : groups) { + if (group == null) { + continue; + } + Map item = new LinkedHashMap<>(); + if (depth > 0 && group.getField() != null) { + item.put("field", group.getField()); + } + item.put("key", group.getKey()); + item.put("keyName", group.getKeyName()); + item.put("keyExt", group.getKeyExt() == null ? new HashMap<>() : group.getKeyExt()); + item.put("count", group.getCount()); + item.put("summary", group.getSummary() == null ? new Object[0] : group.getSummary()); + item.put("aggregates", group.getAggregates() == null ? new HashMap<>() : group.getAggregates()); + if (group.getItems() != null && !group.getItems().isEmpty() && group.getItems().get(0) instanceof Group) { + item.put("items", toLegacyGroupResult(group.getItems(), depth + 1)); + } else { + item.put("items", group.getItems()); + } + result.add(item); + } + return result; + } + + private Object readGroupValue(Map row, String field) { + Object value = row.get(field); + if (value == null) { + value = row.get(field.toUpperCase()); + } + return value; + } + + private boolean isBlankGroupValue(Object value) { + if (value == null) { + return true; + } + if (value instanceof String str) { + return StrUtil.isBlank(str); + } + return false; + } + private String buildEnvWqGroupSql(String baseSql, DataSourceRequest dataSourceRequest, GroupingInfo[] groupInfos) { From 88a2d81953185e4c1c83734a2492f284be7468c9 Mon Sep 17 00:00:00 2001 From: tangwei Date: Wed, 27 May 2026 09:30:23 +0800 Subject: [PATCH 14/38] =?UTF-8?q?fix:=20=E4=BC=98=E5=8C=96=E6=B0=B4?= =?UTF-8?q?=E6=B8=A9=E6=A8=A1=E5=9D=97=E6=8E=A5=E5=8F=A3=E9=80=BB=E8=BE=91?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../wq/service/impl/EnvWqDataServiceImpl.java | 96 +++++++++----- .../wt/controller/SdWTMonitorController.java | 2 +- .../service/impl/SdWtMonitorServiceImpl.java | 117 ++++++++++++------ 3 files changed, 150 insertions(+), 65 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 2236da4..0f7310c 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 @@ -162,53 +162,93 @@ public class EnvWqDataServiceImpl implements EnvWqDataService { 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 "); + boolean queryEngDirectly = "ENG".equalsIgnoreCase(sttpCode); + if (queryEngDirectly) { + sql.append("SELECT ") + .append("hb.BASENAME AS baseName, ") + .append("eng.ENNM AS stnm, ") + .append("eng.ENNM AS ennm, ") + .append("eng.JCDT AS jcdt, ") + .append("NULL AS stindx, ") + .append("CASE WHEN NVL(eng.DTIN, 0) = 1 THEN 1 ELSE 0 END AS coenvwState, ") + .append("'ENG' AS sttpCode, ") + .append("eng.STCD AS stcd, ") + .append("eng.STCD 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("eng.ORDER_INDEX AS siteStepSort ") + .append("FROM SD_ENGINFO_B_H eng ") + .append("LEFT JOIN SD_HYDROBASE hb ON hb.BASEID = eng.BASE_ID AND NVL(hb.IS_DELETED, 0) = 0 ") + .append("WHERE 1 = 1 "); + } else { + 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)) { + if (!queryEngDirectly && StrUtil.isNotBlank(mway)) { paramMap.put("mway", mway); sql.append("AND wq.MWAY = #{map.mway} "); } - if (StrUtil.isNotBlank(sttpCode)) { + if (!queryEngDirectly && 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 (queryEngDirectly) { + sql.append("AND NVL(eng.DTIN, 0) = #{map.dtinType} "); + } else { + sql.append("AND wq.DTIN_TYPE = #{map.dtinType} "); + } } if (StrUtil.isNotBlank(rstcd)) { paramMap.put("rstcd", rstcd); - sql.append("AND wq.RSTCD = #{map.rstcd} "); + if (queryEngDirectly) { + sql.append("AND eng.STCD = #{map.rstcd} "); + } else { + sql.append("AND wq.RSTCD = #{map.rstcd} "); + } } if (StrUtil.isNotBlank(stnm)) { paramMap.put("stnm", "%" + stnm + "%"); - sql.append("AND wq.STNM LIKE #{map.stnm} "); + if (queryEngDirectly) { + sql.append("AND eng.ENNM LIKE #{map.stnm} "); + } else { + 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} "); + if (queryEngDirectly) { + sql.append("AND CASE WHEN NVL(eng.DTIN, 0) = 1 THEN 1 ELSE 0 END = #{map.coenvwState} "); + } else { + sql.append("AND CASE WHEN recent.STCD IS NOT NULL THEN 1 ELSE 0 END = #{map.coenvwState} "); + } } // sql.append(buildEnvWqOrderBySql(dataSourceRequest.getSort())); diff --git a/backend/src/main/java/com/yfd/platform/env/wt/controller/SdWTMonitorController.java b/backend/src/main/java/com/yfd/platform/env/wt/controller/SdWTMonitorController.java index e1e9374..7e4ce26 100644 --- a/backend/src/main/java/com/yfd/platform/env/wt/controller/SdWTMonitorController.java +++ b/backend/src/main/java/com/yfd/platform/env/wt/controller/SdWTMonitorController.java @@ -161,7 +161,7 @@ public class SdWTMonitorController { return ResponseResult.successData(sdWtMonitorService.getEvnmAutoMonitorList()); } - @PostMapping("/base/vmsstbprpt/GetKendoList") + @PostMapping("/vmsstbprpt/GetKendoList") @Operation(summary = "根据类型查询水温表基本数据") public ResponseResult getVmsstbprptList(@RequestBody DataSourceRequest dataSourceRequest) { return ResponseResult.successData(sdWtMonitorService.getVmsstbprptList(dataSourceRequest)); 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 13d950a..42da46a 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 @@ -155,58 +155,103 @@ public class SdWtMonitorServiceImpl implements SdWtMonitorService { String rstcd = QgcQueryWrapperUtil.getFilterFieldValue(loadOptions, "rstcd"); String stnm = QgcQueryWrapperUtil.getFilterFieldValue(loadOptions, "stnm"); String coenvwState = QgcQueryWrapperUtil.getFilterFieldValue(loadOptions, "coenvwState"); - + String dtin = QgcQueryWrapperUtil.getFilterFieldValue(loadOptions, "dtin"); StringBuilder sql = new StringBuilder(); - sql.append("SELECT ") - .append("hb.BASENAME AS baseName, ") - .append("wt.STNM AS stnm, ") - .append("eng.ENNM AS ennm, ") - .append("wt.JCDT AS jcdt, ") - .append("wt.STINDX AS stindx, ") - .append("CASE ") - .append("WHEN wt.STTP = 'WTRV' AND rvRecent.STCD IS NOT NULL THEN 1 ") - .append("WHEN wt.STTP = 'WTVT' AND vtRecent.STCD IS NOT NULL THEN 1 ") - .append("ELSE 0 END AS coenvwState, ") - .append("wt.STTP AS sttpCode, ") - .append("wt.STCD AS stcd, ") - .append("wt.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("wt.ORDER_INDEX AS siteStepSort ") - .append("FROM SD_WT_B_H wt ") - .append("LEFT JOIN SD_ENGINFO_B_H eng ON eng.STCD = wt.RSTCD ") - .append("LEFT JOIN SD_HYDROBASE hb ON hb.BASEID = eng.BASE_ID ") - .append("LEFT JOIN (SELECT DISTINCT STCD FROM SD_WTRV_R WHERE IS_DELETED = 0 AND TM >= SYSDATE - 1) rvRecent ON rvRecent.STCD = wt.STCD ") - .append("LEFT JOIN (SELECT DISTINCT STCD FROM SD_WTVT_R WHERE IS_DELETED = 0 AND TM >= SYSDATE - 1) vtRecent ON vtRecent.STCD = wt.STCD ") - .append("WHERE wt.IS_DELETED = 0 AND wt.DTIN_TYPE = 0 "); + boolean queryEngDirectly = "ENG".equalsIgnoreCase(sttpCode); + if (queryEngDirectly) { + sql.append("SELECT ") + .append("hb.BASENAME AS baseName, ") + .append("eng.ENNM AS stnm, ") + .append("eng.ENNM AS ennm, ") + .append("eng.JCDT AS jcdt, ") + .append("NULL AS stindx, ") + .append("CASE WHEN NVL(eng.DTIN, 0) = 1 THEN 1 ELSE 0 END AS coenvwState, ") + .append("'ENG' AS sttpCode, ") + .append("eng.STCD AS stcd, ") + .append("eng.STCD 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("eng.ORDER_INDEX AS siteStepSort ") + .append("FROM SD_ENGINFO_B_H eng ") + .append("LEFT JOIN SD_HYDROBASE hb ON hb.BASEID = eng.BASE_ID ") + .append("WHERE 1=1 "); + } else { + sql.append("SELECT ") + .append("hb.BASENAME AS baseName, ") + .append("wt.STNM AS stnm, ") + .append("eng.ENNM AS ennm, ") + .append("wt.JCDT AS jcdt, ") + .append("wt.STINDX AS stindx, ") + .append("CASE ") + .append("WHEN wt.STTP = 'WTRV' AND rvRecent.STCD IS NOT NULL THEN 1 ") + .append("WHEN wt.STTP = 'WTVT' AND vtRecent.STCD IS NOT NULL THEN 1 ") + .append("ELSE 0 END AS coenvwState, ") + .append("wt.STTP AS sttpCode, ") + .append("wt.STCD AS stcd, ") + .append("wt.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("wt.ORDER_INDEX AS siteStepSort ") + .append("FROM SD_WT_B_H wt ") + .append("LEFT JOIN SD_ENGINFO_B_H eng ON eng.STCD = wt.RSTCD ") + .append("LEFT JOIN SD_HYDROBASE hb ON hb.BASEID = eng.BASE_ID ") + .append("LEFT JOIN (SELECT DISTINCT STCD FROM SD_WTRV_R WHERE IS_DELETED = 0 AND TM >= SYSDATE - 1) rvRecent ON rvRecent.STCD = wt.STCD ") + .append("LEFT JOIN (SELECT DISTINCT STCD FROM SD_WTVT_R WHERE IS_DELETED = 0 AND TM >= SYSDATE - 1) vtRecent ON vtRecent.STCD = wt.STCD ") + .append("WHERE wt.IS_DELETED = 0 AND wt.DTIN_TYPE = 0 "); + } Map paramMap = new HashMap<>(); - if (mway != null && !mway.isBlank()) { + if (!queryEngDirectly && mway != null && !mway.isBlank()) { paramMap.put("mway", mway); sql.append("AND wt.MWAY = #{map.mway} "); } - if (sttpCode != null && !sttpCode.isBlank()) { + if (!queryEngDirectly && sttpCode != null && !sttpCode.isBlank()) { paramMap.put("sttpCode", sttpCode); sql.append("AND wt.STTP = #{map.sttpCode} "); } if (rstcd != null && !rstcd.isBlank()) { paramMap.put("rstcd", rstcd); - sql.append("AND wt.RSTCD = #{map.rstcd} "); + if (queryEngDirectly) { + sql.append("AND eng.STCD = #{map.rstcd} "); + } else { + sql.append("AND wt.RSTCD = #{map.rstcd} "); + } } if (stnm != null && !stnm.isBlank()) { paramMap.put("stnm", "%" + stnm + "%"); - sql.append("AND wt.STNM LIKE #{map.stnm} "); + if (queryEngDirectly) { + sql.append("AND eng.ENNM LIKE #{map.stnm} "); + } else { + sql.append("AND wt.STNM LIKE #{map.stnm} "); + } + } + + if (StrUtil.isNotBlank(dtin)) { + paramMap.put("dtin", dtin); + if (queryEngDirectly) { + sql.append("AND NVL(eng.DTIN, 0) = #{map.dtin} "); + } else { + sql.append("AND wt.DTIN = #{map.dtin} "); + } } if (coenvwState != null && !coenvwState.isBlank()) { paramMap.put("coenvwState", coenvwState); - sql.append("AND CASE ") - .append("WHEN wt.STTP = 'WTRV' AND rvRecent.STCD IS NOT NULL THEN 1 ") - .append("WHEN wt.STTP = 'WTVT' AND vtRecent.STCD IS NOT NULL THEN 1 ") - .append("ELSE 0 END = #{map.coenvwState} "); + if (queryEngDirectly) { + sql.append("AND CASE WHEN NVL(eng.DTIN, 0) = 1 THEN 1 ELSE 0 END = #{map.coenvwState} "); + } else { + sql.append("AND CASE ") + .append("WHEN wt.STTP = 'WTRV' AND rvRecent.STCD IS NOT NULL THEN 1 ") + .append("WHEN wt.STTP = 'WTVT' AND vtRecent.STCD IS NOT NULL THEN 1 ") + .append("ELSE 0 END = #{map.coenvwState} "); + } } sql.append(buildVmsstbprptOrderBySql(dataSourceRequest.getSort())); @@ -493,7 +538,7 @@ public class SdWtMonitorServiceImpl implements SdWtMonitorService { } else if ("rstcdStepSort".equals(field)) { orderColumns.add("NVL(eng.ORDER_INDEX, 999999) " + dir); } else if ("siteStepSort".equals(field)) { - orderColumns.add("NVL(wt.ORDER_INDEX, 999999) " + dir); +// orderColumns.add("NVL(wt.ORDER_INDEX, 999999) " + dir); } else if ("stnm".equals(field)) { orderColumns.add("wt.STNM " + dir); } else if ("ennm".equals(field)) { From 684eb621e43c2b2ca0ad9704f7e70fefcaca7aac Mon Sep 17 00:00:00 2001 From: tangwei Date: Wed, 27 May 2026 09:55:19 +0800 Subject: [PATCH 15/38] =?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=E6=B5=81=E5=9F=9F=E5=AD=97=E5=85=B8?= =?UTF-8?q?=E5=88=97=E8=A1=A8?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../wt/controller/SdWTMonitorController.java | 8 +- .../yfd/platform/env/wt/entity/vo/WbsbVo.java | 60 +++++++++++++++ .../env/wt/service/SdWtMonitorService.java | 5 ++ .../service/impl/SdWtMonitorServiceImpl.java | 76 +++++++++++++++++++ 4 files changed, 148 insertions(+), 1 deletion(-) create mode 100644 backend/src/main/java/com/yfd/platform/env/wt/entity/vo/WbsbVo.java diff --git a/backend/src/main/java/com/yfd/platform/env/wt/controller/SdWTMonitorController.java b/backend/src/main/java/com/yfd/platform/env/wt/controller/SdWTMonitorController.java index 7e4ce26..b2c0c22 100644 --- a/backend/src/main/java/com/yfd/platform/env/wt/controller/SdWTMonitorController.java +++ b/backend/src/main/java/com/yfd/platform/env/wt/controller/SdWTMonitorController.java @@ -155,7 +155,7 @@ public class SdWTMonitorController { } - @PostMapping("/base/evnmAutoMonitor/GetKendoListCust") + @PostMapping("/evnmAutoMonitor/GetKendoListCust") @Operation(summary = "查询水温监测数量") public ResponseResult getWTDataCount(@RequestBody(required = false) DataSourceRequest dataSourceRequest) { return ResponseResult.successData(sdWtMonitorService.getEvnmAutoMonitorList()); @@ -167,6 +167,12 @@ public class SdWTMonitorController { return ResponseResult.successData(sdWtMonitorService.getVmsstbprptList(dataSourceRequest)); } + @PostMapping("/wbsb/GetKendoList") + @Operation(summary = "查询水电基地流域字典列表") + public ResponseResult getWbsbList(@RequestBody DataSourceRequest dataSourceRequest) { + return ResponseResult.successData(sdWtMonitorService.getWbsbList(dataSourceRequest)); + } + @PostMapping("/cxDetail/GetKendoListCust") @Operation(summary = "查询垂向水温明细") public ResponseResult getCxDetailList(@RequestBody DataSourceRequest dataSourceRequest) { diff --git a/backend/src/main/java/com/yfd/platform/env/wt/entity/vo/WbsbVo.java b/backend/src/main/java/com/yfd/platform/env/wt/entity/vo/WbsbVo.java new file mode 100644 index 0000000..f205081 --- /dev/null +++ b/backend/src/main/java/com/yfd/platform/env/wt/entity/vo/WbsbVo.java @@ -0,0 +1,60 @@ +package com.yfd.platform.env.wt.entity.vo; + +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 WbsbVo implements Serializable { + + private static final long serialVersionUID = 1L; + + private String id; + private String recordUser; + private Date recordTime; + private Date modifyTime; + private String displayRecordUser; + private String isolateType; + private String wbsType; + private String wbsCode; + private String wbsName; + private String wbsSname; + private String wbsNameEn; + private String wbsSnameEn; + private Integer enable; + private String description; + private String parentId; + private String parentCode; + private Integer treeLevel; + private Integer hasChildren; + private String objId; + private String topWbsType; + private String fullPath; + private Integer internal; + private BigDecimal lgtd; + private BigDecimal lttd; + private BigDecimal area; + private BigDecimal perimeter; + private String synopsis; + private String introduce; + private String logo; + private String inffile; + private Integer orderIndex; + private String filterContent; + private String departmentId; + private String systemId; + private String platformId; + private String reachWwqtg; + private BigDecimal maxElev; + private BigDecimal minElev; + private String datTp; + private String rvAg; + private Integer ifInnRv; + private String showControl; + private String stcd; + private String displayDepartment; +} diff --git a/backend/src/main/java/com/yfd/platform/env/wt/service/SdWtMonitorService.java b/backend/src/main/java/com/yfd/platform/env/wt/service/SdWtMonitorService.java index 00db86f..8f3dbc5 100644 --- a/backend/src/main/java/com/yfd/platform/env/wt/service/SdWtMonitorService.java +++ b/backend/src/main/java/com/yfd/platform/env/wt/service/SdWtMonitorService.java @@ -2,8 +2,11 @@ package com.yfd.platform.env.wt.service; import com.yfd.platform.common.DataSourceRequest; import com.yfd.platform.common.DataSourceResult; +import com.yfd.platform.env.wt.entity.vo.WbsbVo; import com.yfd.platform.env.wt.entity.vo.WtrvVo; +import java.util.List; + public interface SdWtMonitorService { DataSourceResult getEvnmAutoMonitorList(); @@ -15,4 +18,6 @@ public interface SdWtMonitorService { DataSourceResult getWtFishAnalysis(DataSourceRequest dataSourceRequest); WtrvVo getFlagByStcd(String stcd); + + DataSourceResult getWbsbList(DataSourceRequest dataSourceRequest); } 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 42da46a..6223eef 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 @@ -6,6 +6,7 @@ import com.yfd.platform.common.*; 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.WbsbVo; 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; @@ -47,6 +48,81 @@ public class SdWtMonitorServiceImpl implements SdWtMonitorService { return result; } + @Override + public DataSourceResult getWbsbList(DataSourceRequest dataSourceRequest) { + DataSourceLoadOptionsBase loadOptions = dataSourceRequest == null ? null : dataSourceRequest.toDevRequest(); + String wbsType = loadOptions == null ? null : QgcQueryWrapperUtil.getFilterFieldValue(loadOptions, "wbsType"); + if (!"PSB_RVCD".equalsIgnoreCase(wbsType)) { + DataSourceResult emptyResult = new DataSourceResult<>(); + emptyResult.setData(new ArrayList<>()); + emptyResult.setTotal(0L); + emptyResult.setAggregates(new HashMap<>()); + return emptyResult; + } + + StringBuilder sql = new StringBuilder(); + sql.append("SELECT ") + .append("t.HBRVCD || '_' || t.BASEID AS id, ") + .append("t.RECORD_USER AS recordUser, ") + .append("t.RECORD_TIME AS recordTime, ") + .append("t.MODIFY_TIME AS modifyTime, ") + .append("NULL AS displayRecordUser, ") + .append("NULL AS isolateType, ") + .append("'PSB_RVCD' AS wbsType, ") + .append("t.HBRVCD AS wbsCode, ") + .append("t.HBRVNM AS wbsName, ") + .append("NULL AS wbsSname, ") + .append("NULL AS wbsNameEn, ") + .append("NULL AS wbsSnameEn, ") + .append("t.ENABLED AS enable, ") + .append("t.REMARK AS description, ") + .append("CASE WHEN t.PHBRVCD IS NULL OR t.PHBRVCD = '0' THEN NULL ELSE t.PHBRVCD || '_' || t.BASEID END AS parentId, ") + .append("CASE WHEN t.PHBRVCD IS NULL OR t.PHBRVCD = '0' THEN NULL ELSE t.PHBRVCD END AS parentCode, ") + .append("t.GRD AS treeLevel, ") + .append("CASE WHEN EXISTS (") + .append(" SELECT 1 FROM SD_HBRV_DIC c ") + .append(" WHERE c.PHBRVCD = t.HBRVCD ") + .append(" AND c.BASEID = t.BASEID ") + .append(" AND NVL(c.IS_DELETED, 0) = 0") + .append(") THEN 1 ELSE 0 END AS hasChildren, ") + .append("t.BASEID AS objId, ") + .append("'PSB' AS topWbsType, ") + .append("t.PATH AS fullPath, ") + .append("0 AS internal, ") + .append("NULL AS lgtd, ") + .append("NULL AS lttd, ") + .append("NULL AS area, ") + .append("NULL AS perimeter, ") + .append("NULL AS synopsis, ") + .append("NULL AS introduce, ") + .append("NULL AS logo, ") + .append("NULL AS inffile, ") + .append("t.ORDER_INDEX AS orderIndex, ") + .append("NULL AS filterContent, ") + .append("NULL AS departmentId, ") + .append("NULL AS systemId, ") + .append("NULL AS platformId, ") + .append("NULL AS reachWwqtg, ") + .append("NULL AS maxElev, ") + .append("NULL AS minElev, ") + .append("NULL AS datTp, ") + .append("NULL AS rvAg, ") + .append("NULL AS ifInnRv, ") + .append("NULL AS showControl, ") + .append("NULL AS stcd, ") + .append("NULL AS displayDepartment ") + .append("FROM SD_HBRV_DIC t ") + .append("WHERE NVL(t.IS_DELETED, 0) = 0 "); + + sql.append("ORDER BY NVL(t.ORDER_INDEX, 999999), t.HBRVNM ASC"); + List list = microservicDynamicSQLMapper.getAllListWithResultType(sql.toString(), new HashMap<>(), WbsbVo.class); + DataSourceResult result = new DataSourceResult<>(); + result.setData(list); + result.setTotal((long) list.size()); + result.setAggregates(new HashMap<>()); + return result; + } + @Override public WtrvVo getFlagByStcd(String stcd) { String sql = "SELECT wt.STCD AS stcd, " + From b6f6c6e8d30a3fa92c6a23bfd8a253546bbae626 Mon Sep 17 00:00:00 2001 From: tangwei Date: Wed, 27 May 2026 11:02:23 +0800 Subject: [PATCH 16/38] =?UTF-8?q?feat:=20=E6=9F=A5=E8=AF=A2=E6=B0=B4?= =?UTF-8?q?=E6=B8=A9=E6=8C=87=E5=AE=9A=E6=97=B6=E9=97=B4=E6=9C=89=E6=95=B0?= =?UTF-8?q?=E6=8D=AE=E7=9A=84=E7=AB=99=E7=82=B9-=E6=A0=91=E5=BD=A2?= =?UTF-8?q?=E7=BB=93=E6=9E=84?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../wt/controller/SdWTMonitorController.java | 6 + .../env/wt/entity/vo/RstcdTreeInfoVo.java | 24 ++ .../env/wt/entity/vo/WtTreeStcdVo.java | 58 ++++ .../env/wt/service/SdWtMonitorService.java | 3 + .../service/impl/SdWtMonitorServiceImpl.java | 288 +++++++++++++++++- 5 files changed, 377 insertions(+), 2 deletions(-) create mode 100644 backend/src/main/java/com/yfd/platform/env/wt/entity/vo/RstcdTreeInfoVo.java create mode 100644 backend/src/main/java/com/yfd/platform/env/wt/entity/vo/WtTreeStcdVo.java diff --git a/backend/src/main/java/com/yfd/platform/env/wt/controller/SdWTMonitorController.java b/backend/src/main/java/com/yfd/platform/env/wt/controller/SdWTMonitorController.java index b2c0c22..6398dbc 100644 --- a/backend/src/main/java/com/yfd/platform/env/wt/controller/SdWTMonitorController.java +++ b/backend/src/main/java/com/yfd/platform/env/wt/controller/SdWTMonitorController.java @@ -185,6 +185,12 @@ public class SdWTMonitorController { return ResponseResult.successData(sdWtvtRService.getWtrvDefaultYear(dataSourceRequest)); } + @PostMapping("/sdrvwts/default/treeStcd") + @Operation(summary = "查询水温指定时间有数据的站点-树形结构") + public ResponseResult getWtvtDefaultTreeStcd(@RequestBody DataSourceRequest dataSourceRequest) { + return ResponseResult.successData(sdWtMonitorService.getWtvtDefaultTreeStcd(dataSourceRequest)); + } + @PostMapping("/wtrv/fish/GetKendoListCust") @Operation(summary = "鱼类繁殖适宜性分析") public ResponseResult getWtFishAnalysis(@RequestBody DataSourceRequest dataSourceRequest) { diff --git a/backend/src/main/java/com/yfd/platform/env/wt/entity/vo/RstcdTreeInfoVo.java b/backend/src/main/java/com/yfd/platform/env/wt/entity/vo/RstcdTreeInfoVo.java new file mode 100644 index 0000000..d62cab4 --- /dev/null +++ b/backend/src/main/java/com/yfd/platform/env/wt/entity/vo/RstcdTreeInfoVo.java @@ -0,0 +1,24 @@ +package com.yfd.platform.env.wt.entity.vo; + +import io.swagger.v3.oas.annotations.media.Schema; +import lombok.Data; + +import java.io.Serializable; +import java.util.ArrayList; +import java.util.List; + +@Data +@Schema(description = "电站-站点树形结构") +public class RstcdTreeInfoVo implements Serializable { + + private static final long serialVersionUID = 1L; + + @Schema(description = "电站编码") + private String rstcd; + + @Schema(description = "电站名称") + private String ennm; + + @Schema(description = "测站数据") + private List stcdVo = new ArrayList<>(); +} diff --git a/backend/src/main/java/com/yfd/platform/env/wt/entity/vo/WtTreeStcdVo.java b/backend/src/main/java/com/yfd/platform/env/wt/entity/vo/WtTreeStcdVo.java new file mode 100644 index 0000000..541514b --- /dev/null +++ b/backend/src/main/java/com/yfd/platform/env/wt/entity/vo/WtTreeStcdVo.java @@ -0,0 +1,58 @@ +package com.yfd.platform.env.wt.entity.vo; + +import io.swagger.v3.oas.annotations.media.Schema; +import lombok.Data; + +import java.io.Serializable; + +@Data +@Schema(description = "垂向水温树形站点") +public class WtTreeStcdVo implements Serializable { + + private static final long serialVersionUID = 1L; + + @Schema(description = "站码") + private String stcd; + + @Schema(description = "站名") + private String stnm; + + @Schema(description = "电站排序") + private Integer rstcdStepSort; + + @Schema(description = "所属电站编码") + private String rstcd; + + @Schema(description = "所属电站名称") + private String ennm; + + @Schema(description = "经度") + private String lgtd; + + @Schema(description = "纬度") + private String lttd; + + @Schema(description = "监测方式") + private Integer mway; + + @Schema(description = "垂向水温类型:1=浮动式 2=固定式") + private Integer wtDeviceType; + + @Schema(description = "所属流域") + private String hbrvcd; + + @Schema(description = "站点排序") + private Integer orderIndex; + + @Schema(description = "基地编码") + private String baseId; + + @Schema(description = "基地排序") + private Integer baseStepSort; + + @Schema(description = "站点排序") + private Integer siteStepSort; + + @Schema(description = "范围内是否有日数据") + private Integer sort; +} diff --git a/backend/src/main/java/com/yfd/platform/env/wt/service/SdWtMonitorService.java b/backend/src/main/java/com/yfd/platform/env/wt/service/SdWtMonitorService.java index 8f3dbc5..f4b2059 100644 --- a/backend/src/main/java/com/yfd/platform/env/wt/service/SdWtMonitorService.java +++ b/backend/src/main/java/com/yfd/platform/env/wt/service/SdWtMonitorService.java @@ -2,6 +2,7 @@ package com.yfd.platform.env.wt.service; import com.yfd.platform.common.DataSourceRequest; import com.yfd.platform.common.DataSourceResult; +import com.yfd.platform.env.wt.entity.vo.RstcdTreeInfoVo; import com.yfd.platform.env.wt.entity.vo.WbsbVo; import com.yfd.platform.env.wt.entity.vo.WtrvVo; @@ -20,4 +21,6 @@ public interface SdWtMonitorService { WtrvVo getFlagByStcd(String stcd); DataSourceResult getWbsbList(DataSourceRequest dataSourceRequest); + + List getWtvtDefaultTreeStcd(DataSourceRequest dataSourceRequest); } 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 6223eef..2588eeb 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 @@ -4,11 +4,13 @@ import cn.hutool.core.util.StrUtil; import com.baomidou.mybatisplus.extension.plugins.pagination.Page; import com.yfd.platform.common.*; 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.RstcdTreeInfoVo; import com.yfd.platform.env.wt.entity.vo.SdWtBaseInfoVO; +import com.yfd.platform.env.wt.entity.vo.SdWtMonitorCountVO; import com.yfd.platform.env.wt.entity.vo.WbsbVo; -import com.yfd.platform.env.wt.entity.vo.WtrvVo; import com.yfd.platform.env.wt.entity.vo.WtFishVo; +import com.yfd.platform.env.wt.entity.vo.WtTreeStcdVo; +import com.yfd.platform.env.wt.entity.vo.WtrvVo; import com.yfd.platform.env.wt.mapper.SdWtMonitorMapper; import com.yfd.platform.env.wt.service.SdWtMonitorService; import com.yfd.platform.utils.QgcQueryWrapperUtil; @@ -593,6 +595,282 @@ public class SdWtMonitorServiceImpl implements SdWtMonitorService { return result; } + @Override + public List getWtvtDefaultTreeStcd(DataSourceRequest dataSourceRequest) { + List stationList = queryWtvtDefaultStations(dataSourceRequest); + return buildWtvtRstcdTree(stationList); + } + + private List queryWtvtDefaultStations(DataSourceRequest dataSourceRequest) { + DataSourceLoadOptionsBase loadOptions = dataSourceRequest == null ? null : dataSourceRequest.toDevRequest(); + String tm = loadOptions == null ? null : QgcQueryWrapperUtil.getFilterFieldValue(loadOptions, "tm"); + String mway = loadOptions == null ? null : QgcQueryWrapperUtil.getFilterFieldValue(loadOptions, "mway"); + String baseId = loadOptions == null ? null : QgcQueryWrapperUtil.getFilterFieldValue(loadOptions, "baseId"); + String rstcd = loadOptions == null ? null : QgcQueryWrapperUtil.getFilterFieldValue(loadOptions, "rstcd"); + String year = loadOptions == null ? null : QgcQueryWrapperUtil.getFilterFieldValue(loadOptions, "year"); + + Map paramMap = new HashMap<>(); + String sql; + if (StrUtil.isNotBlank(year)) { + paramMap.put("year", year); + if (StrUtil.isNotBlank(mway)) { + paramMap.put("mway", mway); + } + if (StrUtil.isNotBlank(baseId)) { + paramMap.put("baseId", baseId); + } + if (StrUtil.isNotBlank(rstcd)) { + paramMap.put("rstcd", rstcd); + } + sql = buildWtvtDefaultYearSql(paramMap); + } else { + List tmRange = parseTmRange(tm); + if (tmRange.size() == 2) { + paramMap.put("startTime", tmRange.get(0)); + paramMap.put("endTime", tmRange.get(1)); + } + if (StrUtil.isNotBlank(mway)) { + paramMap.put("mway", mway); + } + if (StrUtil.isNotBlank(baseId)) { + paramMap.put("baseId", baseId); + } + sql = buildWtvtDefaultRangeSql(paramMap); + } + return microservicDynamicSQLMapper.getAllListWithResultType(sql, paramMap, WtTreeStcdVo.class); + } + + private String buildWtvtDefaultYearSql(Map paramMap) { + StringBuilder sql = new StringBuilder(); + sql.append("SELECT DISTINCT ") + .append("wt.STCD AS stcd, ") + .append("wt.STNM AS stnm, ") + .append("NVL(rstSort.SORT, eng.ORDER_INDEX) AS rstcdStepSort, ") + .append("wt.RSTCD AS rstcd, ") + .append("eng.ENNM AS ennm, ") + .append("TO_CHAR(wt.LGTD) AS lgtd, ") + .append("TO_CHAR(wt.LTTD) AS lttd, ") + .append("wt.MWAY AS mway, ") + .append("wt.WT_DEVICE_TYPE AS wtDeviceType, ") + .append("eng.HBRVCD AS hbrvcd, ") + .append("wt.ORDER_INDEX AS orderIndex, ") + .append("eng.BASE_ID AS baseId, ") + .append("hb.ORDER_INDEX AS baseStepSort, ") + .append("NVL(siteSort.SORT, wt.ORDER_INDEX) AS siteStepSort, ") + .append("1 AS sort ") + .append("FROM SD_WT_B_H wt ") + .append("INNER JOIN SD_WTVTDRTP_S drtp ON drtp.STCD = wt.STCD ") + .append("LEFT JOIN SD_ENGINFO_B_H eng ON eng.STCD = wt.RSTCD ") + .append("LEFT JOIN SD_HYDROBASE hb ON hb.BASEID = eng.BASE_ID AND NVL(hb.IS_DELETED, 0) = 0 ") + .append("LEFT JOIN (") + .append(" SELECT det.STCD, det.SORT, along.RVCD ") + .append(" FROM MS_ALONGDET_B det ") + .append(" INNER JOIN MS_ALONG_B along ON along.ID = det.ALONG_ID ") + .append(" WHERE NVL(det.IS_DELETED, 0) = 0 ") + .append(" AND NVL(along.IS_DELETED, 0) = 0 ") + .append(" AND along.CODE = 'common'") + .append(") rstSort ON rstSort.STCD = wt.RSTCD AND rstSort.RVCD = eng.HBRVCD ") + .append("LEFT JOIN (") + .append(" SELECT det.STCD, det.SORT, along.RVCD ") + .append(" FROM MS_ALONGDET_B det ") + .append(" INNER JOIN MS_ALONG_B along ON along.ID = det.ALONG_ID ") + .append(" WHERE NVL(det.IS_DELETED, 0) = 0 ") + .append(" AND NVL(along.IS_DELETED, 0) = 0 ") + .append(" AND along.CODE = 'common'") + .append(") siteSort ON siteSort.STCD = wt.STCD AND siteSort.RVCD = eng.HBRVCD ") + .append("WHERE NVL(wt.IS_DELETED, 0) = 0 ") + .append(" AND wt.STTP = 'WTVT' ") + .append(" AND NVL(wt.USFL, 0) = 1 ") + .append(" AND NVL(drtp.IS_DELETED, 0) = 0 ") + .append(" AND drtp.DRTP = 'YEAR' ") + .append(" AND drtp.YEAR = #{map.year} ") + .append(" AND drtp.WTHG IS NOT NULL ") + .append(" AND drtp.VWT IS NOT NULL "); + if (paramMap.containsKey("mway")) { + sql.append(" AND wt.MWAY = #{map.mway} "); + } + if (paramMap.containsKey("baseId")) { + sql.append(" AND eng.BASE_ID = #{map.baseId} "); + } + if (paramMap.containsKey("rstcd")) { + sql.append(" AND wt.RSTCD = #{map.rstcd} "); + } + sql.append("ORDER BY NVL(hb.ORDER_INDEX, 999999) ASC, ") + .append("NVL(NVL(rstSort.SORT, eng.ORDER_INDEX), 999999) ASC, ") + .append("NVL(NVL(siteSort.SORT, wt.ORDER_INDEX), 999999) ASC"); + return sql.toString(); + } + + private String buildWtvtDefaultRangeSql(Map paramMap) { + StringBuilder sql = new StringBuilder(); + sql.append("SELECT * FROM (") + .append("SELECT ") + .append("wt.STCD AS stcd, ") + .append("wt.STNM AS stnm, ") + .append("NVL(rstSort.SORT, eng.ORDER_INDEX) AS rstcdStepSort, ") + .append("wt.RSTCD AS rstcd, ") + .append("eng.ENNM AS ennm, ") + .append("TO_CHAR(wt.LGTD) AS lgtd, ") + .append("TO_CHAR(wt.LTTD) AS lttd, ") + .append("wt.MWAY AS mway, ") + .append("wt.WT_DEVICE_TYPE AS wtDeviceType, ") + .append("eng.HBRVCD AS hbrvcd, ") + .append("wt.ORDER_INDEX AS orderIndex, ") + .append("eng.BASE_ID AS baseId, ") + .append("hb.ORDER_INDEX AS baseStepSort, ") + .append("NVL(siteSort.SORT, wt.ORDER_INDEX) AS siteStepSort, ") + .append("CASE WHEN "); + if (paramMap.containsKey("startTime") && paramMap.containsKey("endTime")) { + sql.append("EXISTS (") + .append("SELECT 1 FROM SD_WTVTDAY_S dayData ") + .append("WHERE dayData.STCD = wt.STCD ") + .append(" AND NVL(dayData.IS_DELETED, 0) = 0 ") + .append(" AND dayData.DT >= TO_DATE(#{map.startTime}, 'YYYY-MM-DD HH24:MI:SS') ") + .append(" AND dayData.DT <= TO_DATE(#{map.endTime}, 'YYYY-MM-DD HH24:MI:SS') ") + .append(" AND dayData.WTHG IS NOT NULL ") + .append(" AND dayData.VWT IS NOT NULL") + .append(") "); + } else { + sql.append("1 = 0 "); + } + sql.append("THEN 1 ELSE -1 END AS sort ") + .append("FROM SD_WT_B_H wt ") + .append("LEFT JOIN SD_ENGINFO_B_H eng ON eng.STCD = wt.RSTCD ") + .append("LEFT JOIN SD_HYDROBASE hb ON hb.BASEID = eng.BASE_ID AND NVL(hb.IS_DELETED, 0) = 0 ") + .append("LEFT JOIN (") + .append(" SELECT det.STCD, det.SORT, along.RVCD ") + .append(" FROM MS_ALONGDET_B det ") + .append(" INNER JOIN MS_ALONG_B along ON along.ID = det.ALONG_ID ") + .append(" WHERE NVL(det.IS_DELETED, 0) = 0 ") + .append(" AND NVL(along.IS_DELETED, 0) = 0 ") + .append(" AND along.CODE = 'common'") + .append(") rstSort ON rstSort.STCD = wt.RSTCD AND rstSort.RVCD = eng.HBRVCD ") + .append("LEFT JOIN (") + .append(" SELECT det.STCD, det.SORT, along.RVCD ") + .append(" FROM MS_ALONGDET_B det ") + .append(" INNER JOIN MS_ALONG_B along ON along.ID = det.ALONG_ID ") + .append(" WHERE NVL(det.IS_DELETED, 0) = 0 ") + .append(" AND NVL(along.IS_DELETED, 0) = 0 ") + .append(" AND along.CODE = 'common'") + .append(") siteSort ON siteSort.STCD = wt.STCD AND siteSort.RVCD = eng.HBRVCD ") + .append("WHERE NVL(wt.IS_DELETED, 0) = 0 ") + .append(" AND wt.STTP = 'WTVT' ") + .append(" AND NVL(wt.USFL, 0) = 1 ") + .append(" AND EXISTS (") + .append(" SELECT 1 FROM SD_WTVTDRTP_S yearData ") + .append(" WHERE yearData.STCD = wt.STCD ") + .append(" AND NVL(yearData.IS_DELETED, 0) = 0 ") + .append(" AND yearData.DRTP = 'YEAR' ") + .append(" AND yearData.WTHG IS NOT NULL ") + .append(" AND yearData.VWT IS NOT NULL") + .append(" ) "); + if (paramMap.containsKey("mway")) { + sql.append(" AND wt.MWAY = #{map.mway} "); + } + if (paramMap.containsKey("baseId")) { + sql.append(" AND eng.BASE_ID = #{map.baseId} "); + } + sql.append(") ") + .append("ORDER BY NVL(baseStepSort, 999999) ASC, ") + .append("NVL(rstcdStepSort, 999999) ASC, ") + .append("NVL(siteStepSort, 999999) ASC, ") + .append("sort DESC"); + return sql.toString(); + } + + private List parseTmRange(String tm) { + if (StrUtil.isBlank(tm)) { + return Collections.emptyList(); + } + String[] split = tm.split(","); + List result = new ArrayList<>(); + for (String item : split) { + if (StrUtil.isNotBlank(item)) { + result.add(item.trim()); + } + } + return result; + } + + private List buildWtvtRstcdTree(List stationList) { + if (stationList == null || stationList.isEmpty()) { + return new ArrayList<>(); + } + LinkedHashMap treeMap = new LinkedHashMap<>(); + List otherStations = new ArrayList<>(); + for (WtTreeStcdVo station : stationList) { + List rstcdCodes = splitRstcdCodes(station.getRstcd()); + if (rstcdCodes.isEmpty()) { + otherStations.add(station); + continue; + } + for (String rstcdCode : rstcdCodes) { + RstcdTreeInfoVo treeInfo = treeMap.computeIfAbsent(rstcdCode, key -> { + RstcdTreeInfoVo vo = new RstcdTreeInfoVo(); + vo.setRstcd(key); + vo.setEnnm(station.getEnnm()); + return vo; + }); + if (StrUtil.isBlank(treeInfo.getEnnm()) && StrUtil.isNotBlank(station.getEnnm())) { + treeInfo.setEnnm(station.getEnnm()); + } + boolean exists = treeInfo.getStcdVo().stream() + .anyMatch(item -> StrUtil.equals(item.getStcd(), station.getStcd())); + if (!exists) { + treeInfo.getStcdVo().add(station); + } + } + } + fillMissingTreeEnnm(treeMap); + List result = new ArrayList<>(treeMap.values()); + if (!otherStations.isEmpty()) { + RstcdTreeInfoVo other = new RstcdTreeInfoVo(); + other.setRstcd("other"); + other.setEnnm("其它"); + other.setStcdVo(otherStations); + result.add(other); + } + return result; + } + + private List splitRstcdCodes(String rstcd) { + if (StrUtil.isBlank(rstcd)) { + return Collections.emptyList(); + } + List result = new ArrayList<>(); + for (String item : rstcd.split(",")) { + if (StrUtil.isNotBlank(item)) { + result.add(item.trim()); + } + } + return result; + } + + private void fillMissingTreeEnnm(LinkedHashMap treeMap) { + List missingCodes = treeMap.values().stream() + .filter(item -> StrUtil.isNotBlank(item.getRstcd()) && StrUtil.isBlank(item.getEnnm())) + .map(RstcdTreeInfoVo::getRstcd) + .distinct() + .collect(Collectors.toList()); + if (missingCodes.isEmpty()) { + return; + } + String inSql = missingCodes.stream() + .map(code -> "'" + code.replace("'", "''") + "'") + .collect(Collectors.joining(",")); + String sql = "SELECT STCD AS stcd, ENNM AS ennm FROM SD_ENGINFO_B_H " + + "WHERE NVL(IS_DELETED, 0) = 0 AND STCD IN (" + inSql + ")"; + List rowList = microservicDynamicSQLMapper.getAllListWithResultType(sql, new HashMap<>(), WtTreeNodeEnnmRow.class); + Map ennmMap = rowList.stream() + .filter(item -> StrUtil.isNotBlank(item.getStcd())) + .collect(Collectors.toMap(WtTreeNodeEnnmRow::getStcd, WtTreeNodeEnnmRow::getEnnm, (left, right) -> left)); + for (Map.Entry entry : treeMap.entrySet()) { + if (StrUtil.isBlank(entry.getValue().getEnnm())) { + entry.getValue().setEnnm(ennmMap.get(entry.getKey())); + } + } + } + private Page buildPage(DataSourceLoadOptionsBase loadOptions) { PageInfo pageInfo = QgcQueryWrapperUtil.getPageInfo(loadOptions); if (Boolean.TRUE.equals(pageInfo.getHasPageInfo())) { @@ -846,4 +1124,10 @@ public class SdWtMonitorServiceImpl implements SdWtMonitorService { private String vwt; } + @Data + private static class WtTreeNodeEnnmRow { + private String stcd; + private String ennm; + } + } From 8c2cc3b00aba9001c66fede3497f330f5ad009a8 Mon Sep 17 00:00:00 2001 From: tangwei Date: Wed, 27 May 2026 14:16:04 +0800 Subject: [PATCH 17/38] =?UTF-8?q?feat:=20=E6=B0=B4=E6=B8=A9=E5=B9=B4?= =?UTF-8?q?=E5=86=85=E5=88=86=E5=B8=83=E4=BA=8C=E7=BA=A7=E5=88=97=E8=A1=A8?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../wt/controller/SdWTMonitorController.java | 6 + .../env/wt/entity/vo/SdYearDetailVO.java | 50 ++++ .../env/wt/service/SdWtMonitorService.java | 3 + .../service/impl/SdWtMonitorServiceImpl.java | 265 ++++++++++++++++++ 4 files changed, 324 insertions(+) create mode 100644 backend/src/main/java/com/yfd/platform/env/wt/entity/vo/SdYearDetailVO.java diff --git a/backend/src/main/java/com/yfd/platform/env/wt/controller/SdWTMonitorController.java b/backend/src/main/java/com/yfd/platform/env/wt/controller/SdWTMonitorController.java index 6398dbc..8256fe6 100644 --- a/backend/src/main/java/com/yfd/platform/env/wt/controller/SdWTMonitorController.java +++ b/backend/src/main/java/com/yfd/platform/env/wt/controller/SdWTMonitorController.java @@ -154,6 +154,12 @@ public class SdWTMonitorController { return ResponseResult.successData(this.alongListService.getYearList(dataSourceRequest)); } + @PostMapping("/yearDetail/GetKendoListCust") + @Operation(summary = "水温年内分布二级列表") + public ResponseResult getYearDetailList(@RequestBody DataSourceRequest dataSourceRequest) { + return ResponseResult.successData(sdWtMonitorService.getYearDetailList(dataSourceRequest)); + } + @PostMapping("/evnmAutoMonitor/GetKendoListCust") @Operation(summary = "查询水温监测数量") diff --git a/backend/src/main/java/com/yfd/platform/env/wt/entity/vo/SdYearDetailVO.java b/backend/src/main/java/com/yfd/platform/env/wt/entity/vo/SdYearDetailVO.java new file mode 100644 index 0000000..1ba9314 --- /dev/null +++ b/backend/src/main/java/com/yfd/platform/env/wt/entity/vo/SdYearDetailVO.java @@ -0,0 +1,50 @@ +package com.yfd.platform.env.wt.entity.vo; + +import io.swagger.v3.oas.annotations.media.Schema; +import lombok.Getter; +import lombok.Setter; + +import java.math.BigDecimal; +import java.util.Date; + +@Getter +@Setter +@Schema(description = "水温年内分布二级列表") +public class SdYearDetailVO { + + @Schema(description = "站码") + private String stcd; + + @Schema(description = "站名") + private String stnm; + + @Schema(description = "时间") + private Date dt; + + @Schema(description = "月份排序值") + private Integer monthInt; + + @Schema(description = "月份") + private String month; + + @Schema(description = "实测值水温") + private BigDecimal actualTemp; + + @Schema(description = "水温") + private BigDecimal wt; + + @Schema(description = "天然水温") + private BigDecimal naturalTemp; + + @Schema(description = "天然水温累计值") + private BigDecimal sumVal; + + @Schema(description = "天然水温累计条数") + private Integer sumCount; + + @Schema(description = "类型") + private String sttp; + + @Schema(description = "去年同期") + private BigDecimal beforeWt; +} diff --git a/backend/src/main/java/com/yfd/platform/env/wt/service/SdWtMonitorService.java b/backend/src/main/java/com/yfd/platform/env/wt/service/SdWtMonitorService.java index f4b2059..e1f417b 100644 --- a/backend/src/main/java/com/yfd/platform/env/wt/service/SdWtMonitorService.java +++ b/backend/src/main/java/com/yfd/platform/env/wt/service/SdWtMonitorService.java @@ -3,6 +3,7 @@ package com.yfd.platform.env.wt.service; import com.yfd.platform.common.DataSourceRequest; import com.yfd.platform.common.DataSourceResult; import com.yfd.platform.env.wt.entity.vo.RstcdTreeInfoVo; +import com.yfd.platform.env.wt.entity.vo.SdYearDetailVO; import com.yfd.platform.env.wt.entity.vo.WbsbVo; import com.yfd.platform.env.wt.entity.vo.WtrvVo; @@ -22,5 +23,7 @@ public interface SdWtMonitorService { DataSourceResult getWbsbList(DataSourceRequest dataSourceRequest); + DataSourceResult getYearDetailList(DataSourceRequest dataSourceRequest); + List getWtvtDefaultTreeStcd(DataSourceRequest dataSourceRequest); } 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 2588eeb..468b4b5 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 @@ -5,6 +5,7 @@ import com.baomidou.mybatisplus.extension.plugins.pagination.Page; import com.yfd.platform.common.*; import com.yfd.platform.env.wt.entity.vo.FishSpawnVo; import com.yfd.platform.env.wt.entity.vo.RstcdTreeInfoVo; +import com.yfd.platform.env.wt.entity.vo.SdYearDetailVO; import com.yfd.platform.env.wt.entity.vo.SdWtBaseInfoVO; import com.yfd.platform.env.wt.entity.vo.SdWtMonitorCountVO; import com.yfd.platform.env.wt.entity.vo.WbsbVo; @@ -125,6 +126,48 @@ public class SdWtMonitorServiceImpl implements SdWtMonitorService { return result; } + @Override + public DataSourceResult getYearDetailList(DataSourceRequest dataSourceRequest) { + DataSourceLoadOptionsBase loadOptions = dataSourceRequest == null ? null : dataSourceRequest.toDevRequest(); + String dt = loadOptions == null ? null : QgcQueryWrapperUtil.getFilterFieldValue(loadOptions, "dt"); + Integer month = extractMonth(dt); + + Map paramMap = new HashMap<>(); + if (month != null) { + paramMap.put("month", month); + } + + StringBuilder sql = new StringBuilder(buildYearDetailBaseSql(month != null)); + String filterSql = buildYearDetailFilterCondition( + dataSourceRequest == null ? null : dataSourceRequest.getFilter(), + paramMap, + new int[]{0} + ); + if (StrUtil.isNotBlank(filterSql)) { + sql.append(" AND ").append(filterSql).append(" "); + } + sql.append(buildYearDetailOrderBySql(dataSourceRequest == null ? null : dataSourceRequest.getSort())); + + Page page = buildPage(loadOptions); + List list = microservicDynamicSQLMapper.pageAllListWithResultType(page, sql.toString(), paramMap, SdYearDetailVO.class); + for (SdYearDetailVO vo : list) { + vo.setActualTemp(vo.getWt()); + if (vo.getDt() != null) { + Calendar calendar = Calendar.getInstance(); + calendar.setTime(vo.getDt()); + int monthInt = calendar.get(Calendar.MONTH) + 1; + vo.setMonthInt(monthInt); + vo.setMonth(monthInt + "月"); + } + } + + DataSourceResult result = new DataSourceResult<>(); + result.setData(list); + result.setTotal(page != null ? page.getTotal() : list.size()); + result.setAggregates(new HashMap<>()); + return result; + } + @Override public WtrvVo getFlagByStcd(String stcd) { String sql = "SELECT wt.STCD AS stcd, " + @@ -871,6 +914,228 @@ public class SdWtMonitorServiceImpl implements SdWtMonitorService { } } + private Integer extractMonth(String dt) { + if (StrUtil.isBlank(dt) || dt.length() < 7) { + return null; + } + try { + return Integer.parseInt(dt.substring(5, 7)); + } catch (Exception ignored) { + return null; + } + } + + private String buildYearDetailBaseSql(boolean hasMonth) { + StringBuilder sql = new StringBuilder(); + sql.append("SELECT t.STCD AS stcd, ") + .append("t.STNM AS stnm, ") + .append("t.DT AS dt, ") + .append("t.WT AS wt, ") + .append("t.STTP AS sttp, ") + .append("t.SUMVAL AS sumVal, ") + .append("t.SUMCOUNT AS sumCount, ") + .append("t.BEFOREWT AS beforeWt, ") + .append("t.NATURALTEMP AS naturalTemp ") + .append("FROM (") + .append(" SELECT dayData.STCD, ") + .append(" wt.STNM, ") + .append(" wt.RSTCD, ") + .append(" dayData.DT, ") + .append(" dayData.WT, ") + .append(" np.WT AS naturalTemp, ") + .append(" 'WT' AS sttp, ") + .append(" (SELECT SUM(np2.WT) FROM SD_WTNP_B np2 ") + .append(" WHERE NVL(np2.IS_DELETED, 0) = 0 ") + .append(" AND np2.STCD = dayData.STCD) AS sumVal, ") + .append(" (SELECT COUNT(1) FROM SD_WTNP_B np2 ") + .append(" WHERE NVL(np2.IS_DELETED, 0) = 0 ") + .append(" AND np2.STCD = dayData.STCD) AS sumCount, ") + .append(" (SELECT prev.WT FROM SD_WTRVDAY_S prev ") + .append(" WHERE NVL(prev.IS_DELETED, 0) = 0 ") + .append(" AND prev.STCD = dayData.STCD ") + .append(" AND prev.DT = ADD_MONTHS(dayData.DT, -12)) AS beforeWt ") + .append(" FROM SD_WTRVDAY_S dayData ") + .append(" INNER JOIN SD_WT_B_H wt ON wt.STCD = dayData.STCD ") + .append(" AND wt.STTP = 'WTRV' ") + .append(" AND NVL(wt.IS_DELETED, 0) = 0 ") + .append(" LEFT JOIN ("); + if (hasMonth) { + sql.append("SELECT STCD, WT FROM SD_WTNP_B ") + .append("WHERE NVL(IS_DELETED, 0) = 0 ") + .append(" AND WTTP = 1 ") + .append(" AND MNTH = #{map.month}"); + } else { + sql.append("SELECT CAST(NULL AS VARCHAR2(36)) AS STCD, CAST(NULL AS NUMBER(15,2)) AS WT FROM DUAL WHERE 1 = 2"); + } + sql.append(") np ON wt.RSTCD = np.STCD ") + .append(" WHERE NVL(dayData.IS_DELETED, 0) = 0 ") + .append(") t WHERE 1 = 1 "); + return sql.toString(); + } + + private String buildYearDetailFilterCondition(DataSourceRequest.FilterDescriptor filter, + Map paramMap, + int[] indexHolder) { + if (filter == null) { + return ""; + } + if (filter.getFilters() == null || filter.getFilters().isEmpty()) { + return buildYearDetailLeafCondition(filter, paramMap, indexHolder); + } + List parts = new ArrayList<>(); + for (DataSourceRequest.FilterDescriptor child : filter.getFilters()) { + String childSql = buildYearDetailFilterCondition(child, paramMap, indexHolder); + if (StrUtil.isNotBlank(childSql)) { + parts.add("(" + childSql + ")"); + } + } + if (parts.isEmpty()) { + return ""; + } + String logic = "or".equalsIgnoreCase(filter.getLogic()) ? " OR " : " AND "; + return String.join(logic, parts); + } + + private String buildYearDetailLeafCondition(DataSourceRequest.FilterDescriptor filter, + Map paramMap, + int[] indexHolder) { + String column = mapYearDetailColumn(filter.getField()); + if (StrUtil.isBlank(column)) { + return ""; + } + String operator = StrUtil.blankToDefault(filter.getOperator(), "eq").toLowerCase(); + String paramKey = "yearDetailParam" + indexHolder[0]++; + Object value = filter.getValue(); + if ("contains".equals(operator) || "startswith".equals(operator) || "endswith".equals(operator)) { + if (value == null) { + return ""; + } + String text = String.valueOf(value); + if ("contains".equals(operator)) { + paramMap.put(paramKey, "%" + text + "%"); + } else if ("startswith".equals(operator)) { + paramMap.put(paramKey, text + "%"); + } else { + paramMap.put(paramKey, "%" + text); + } + return column + " LIKE #{map." + paramKey + "}"; + } + if ("in".equals(operator)) { + List values = splitFilterValues(value); + if (values.isEmpty()) { + return ""; + } + List placeholders = new ArrayList<>(); + for (String item : values) { + String itemKey = paramKey + "_" + placeholders.size(); + paramMap.put(itemKey, item); + placeholders.add("#{map." + itemKey + "}"); + } + return column + " IN (" + String.join(", ", placeholders) + ")"; + } + + paramMap.put(paramKey, value); + boolean dateField = "dt".equalsIgnoreCase(filter.getField()); + if ("eq".equals(operator)) { + return dateField + ? "TRUNC(" + column + ") = TO_DATE(SUBSTR(#{map." + paramKey + "}, 1, 10), 'YYYY-MM-DD')" + : column + " = #{map." + paramKey + "}"; + } + if ("neq".equals(operator)) { + return dateField + ? "TRUNC(" + column + ") <> TO_DATE(SUBSTR(#{map." + paramKey + "}, 1, 10), 'YYYY-MM-DD')" + : column + " <> #{map." + paramKey + "}"; + } + if ("gt".equals(operator)) { + return dateField + ? column + " > TO_DATE(SUBSTR(#{map." + paramKey + "}, 1, 10), 'YYYY-MM-DD')" + : column + " > #{map." + paramKey + "}"; + } + if ("gte".equals(operator)) { + return dateField + ? column + " >= TO_DATE(SUBSTR(#{map." + paramKey + "}, 1, 10), 'YYYY-MM-DD')" + : column + " >= #{map." + paramKey + "}"; + } + if ("lt".equals(operator)) { + return dateField + ? column + " < TO_DATE(SUBSTR(#{map." + paramKey + "}, 1, 10), 'YYYY-MM-DD')" + : column + " < #{map." + paramKey + "}"; + } + if ("lte".equals(operator)) { + return dateField + ? column + " <= TO_DATE(SUBSTR(#{map." + paramKey + "}, 1, 10), 'YYYY-MM-DD')" + : column + " <= #{map." + paramKey + "}"; + } + return ""; + } + + private List splitFilterValues(Object value) { + if (value == null) { + return Collections.emptyList(); + } + if (value instanceof List listValue) { + List result = new ArrayList<>(); + for (Object item : listValue) { + if (item != null && StrUtil.isNotBlank(String.valueOf(item))) { + result.add(String.valueOf(item)); + } + } + return result; + } + String text = String.valueOf(value).trim(); + if (StrUtil.isBlank(text)) { + return Collections.emptyList(); + } + if (text.startsWith("[") && text.endsWith("]")) { + text = text.substring(1, text.length() - 1); + } + List result = new ArrayList<>(); + for (String item : text.split(",")) { + String trimmed = item == null ? null : item.trim(); + if (StrUtil.isNotBlank(trimmed)) { + result.add(trimmed.replace("'", "")); + } + } + return result; + } + + private String mapYearDetailColumn(String field) { + if (StrUtil.isBlank(field)) { + return null; + } + return switch (field) { + case "stcd" -> "t.STCD"; + case "stnm" -> "t.STNM"; + case "dt" -> "t.DT"; + case "wt", "actualTemp" -> "t.WT"; + case "sttp" -> "t.STTP"; + case "sumVal" -> "t.SUMVAL"; + case "sumCount" -> "t.SUMCOUNT"; + case "beforeWt" -> "t.BEFOREWT"; + case "naturalTemp" -> "t.NATURALTEMP"; + case "rstcd" -> "t.RSTCD"; + default -> null; + }; + } + + private String buildYearDetailOrderBySql(List sortList) { + List orderColumns = new ArrayList<>(); + if (sortList != null) { + for (DataSourceRequest.SortDescriptor sortDescriptor : sortList) { + String column = mapYearDetailColumn(sortDescriptor.getField()); + if (StrUtil.isBlank(column)) { + continue; + } + String dir = "desc".equalsIgnoreCase(sortDescriptor.getDir()) ? "DESC" : "ASC"; + orderColumns.add(column + " " + dir); + } + } + if (orderColumns.isEmpty()) { + return " ORDER BY t.DT DESC"; + } + return " ORDER BY " + String.join(", ", orderColumns); + } + private Page buildPage(DataSourceLoadOptionsBase loadOptions) { PageInfo pageInfo = QgcQueryWrapperUtil.getPageInfo(loadOptions); if (Boolean.TRUE.equals(pageInfo.getHasPageInfo())) { From 584f1fa7f8960fdc8344319ab3e900bc9c939886 Mon Sep 17 00:00:00 2001 From: tangwei Date: Wed, 27 May 2026 14:31:24 +0800 Subject: [PATCH 18/38] =?UTF-8?q?feat:=20=E6=9F=A5=E8=AF=A2=E4=BD=8E?= =?UTF-8?q?=E6=B8=A9=E6=B0=B4=E5=87=8F=E7=BC=93=E8=AE=BE=E6=96=BD=E6=95=B0?= =?UTF-8?q?=E9=87=8F?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../wt/controller/SdWTMonitorController.java | 6 +++ .../wt/entity/vo/DfltkwFacilityCountVo.java | 29 +++++++++++ .../env/wt/service/SdWtMonitorService.java | 3 ++ .../service/impl/SdWtMonitorServiceImpl.java | 50 +++++++++++++++++++ 4 files changed, 88 insertions(+) create mode 100644 backend/src/main/java/com/yfd/platform/env/wt/entity/vo/DfltkwFacilityCountVo.java diff --git a/backend/src/main/java/com/yfd/platform/env/wt/controller/SdWTMonitorController.java b/backend/src/main/java/com/yfd/platform/env/wt/controller/SdWTMonitorController.java index 8256fe6..8c337b5 100644 --- a/backend/src/main/java/com/yfd/platform/env/wt/controller/SdWTMonitorController.java +++ b/backend/src/main/java/com/yfd/platform/env/wt/controller/SdWTMonitorController.java @@ -167,6 +167,12 @@ public class SdWTMonitorController { return ResponseResult.successData(sdWtMonitorService.getEvnmAutoMonitorList()); } + @PostMapping("/dwInfo/GetKendoListCust") + @Operation(summary = "查询低温水减缓设施数量") + public ResponseResult getDfltkwFacilityCount(@RequestBody DataSourceRequest dataSourceRequest) { + return ResponseResult.successData(sdWtMonitorService.getDfltkwFacilityCount(dataSourceRequest)); + } + @PostMapping("/vmsstbprpt/GetKendoList") @Operation(summary = "根据类型查询水温表基本数据") public ResponseResult getVmsstbprptList(@RequestBody DataSourceRequest dataSourceRequest) { diff --git a/backend/src/main/java/com/yfd/platform/env/wt/entity/vo/DfltkwFacilityCountVo.java b/backend/src/main/java/com/yfd/platform/env/wt/entity/vo/DfltkwFacilityCountVo.java new file mode 100644 index 0000000..5ed8480 --- /dev/null +++ b/backend/src/main/java/com/yfd/platform/env/wt/entity/vo/DfltkwFacilityCountVo.java @@ -0,0 +1,29 @@ +package com.yfd.platform.env.wt.entity.vo; + +import io.swagger.v3.oas.annotations.media.Schema; +import lombok.Data; + +import java.io.Serializable; + +@Data +@Schema(description = "低温水减缓设施数量统计") +public class DfltkwFacilityCountVo implements Serializable { + + @Schema(description = "类型编码") + private String dwtp; + + @Schema(description = "类型名称") + private String name; + + @Schema(description = "已接入数量") + private Integer accessNum; + + @Schema(description = "已建数量") + private Integer buildNum; + + @Schema(description = "在建数量") + private Integer zjNum; + + @Schema(description = "总数量") + private Integer totalNum; +} diff --git a/backend/src/main/java/com/yfd/platform/env/wt/service/SdWtMonitorService.java b/backend/src/main/java/com/yfd/platform/env/wt/service/SdWtMonitorService.java index e1f417b..044da0a 100644 --- a/backend/src/main/java/com/yfd/platform/env/wt/service/SdWtMonitorService.java +++ b/backend/src/main/java/com/yfd/platform/env/wt/service/SdWtMonitorService.java @@ -2,6 +2,7 @@ package com.yfd.platform.env.wt.service; import com.yfd.platform.common.DataSourceRequest; import com.yfd.platform.common.DataSourceResult; +import com.yfd.platform.env.wt.entity.vo.DfltkwFacilityCountVo; import com.yfd.platform.env.wt.entity.vo.RstcdTreeInfoVo; import com.yfd.platform.env.wt.entity.vo.SdYearDetailVO; import com.yfd.platform.env.wt.entity.vo.WbsbVo; @@ -23,6 +24,8 @@ public interface SdWtMonitorService { DataSourceResult getWbsbList(DataSourceRequest dataSourceRequest); + DataSourceResult getDfltkwFacilityCount(DataSourceRequest dataSourceRequest); + DataSourceResult getYearDetailList(DataSourceRequest dataSourceRequest); List getWtvtDefaultTreeStcd(DataSourceRequest dataSourceRequest); 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 468b4b5..e7b09a2 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 @@ -3,6 +3,7 @@ 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.wt.entity.vo.DfltkwFacilityCountVo; import com.yfd.platform.env.wt.entity.vo.FishSpawnVo; import com.yfd.platform.env.wt.entity.vo.RstcdTreeInfoVo; import com.yfd.platform.env.wt.entity.vo.SdYearDetailVO; @@ -126,6 +127,55 @@ public class SdWtMonitorServiceImpl implements SdWtMonitorService { return result; } + @Override + public DataSourceResult getDfltkwFacilityCount(DataSourceRequest dataSourceRequest) { + String sql = """ + SELECT c.dwtp AS dwtp, + c.name AS name, + NVL(s.accessNum, 0) AS accessNum, + NVL(s.buildNum, 0) AS buildNum, + NVL(s.zjNum, 0) AS zjNum, + NVL(s.totalNum, 0) AS totalNum + FROM ( + SELECT '1' AS dwtp, '叠梁门' AS name, 1 AS sortOrder FROM DUAL + UNION ALL + SELECT '2' AS dwtp, '前置挡墙' AS name, 2 AS sortOrder FROM DUAL + UNION ALL + SELECT '3' AS dwtp, '隔水幕墙' AS name, 3 AS sortOrder FROM DUAL + UNION ALL + SELECT '4' AS dwtp, '其它' AS name, 4 AS sortOrder FROM DUAL + ) c + LEFT JOIN ( + SELECT CASE + WHEN t.STTP = 'DW_2' THEN '1' + WHEN t.STTP = 'DW_5' THEN '2' + WHEN t.STTP = 'DW_6' THEN '3' + ELSE '4' + END AS dwtp, + COUNT(1) AS totalNum, + SUM(CASE WHEN NVL(t.DTIN, 0) = 1 THEN 1 ELSE 0 END) AS accessNum, + SUM(CASE WHEN NVL(t.BLDSTT_CODE, 0) = 2 THEN 1 ELSE 0 END) AS buildNum, + SUM(CASE WHEN NVL(t.BLDSTT_CODE, 0) = 1 THEN 1 ELSE 0 END) AS zjNum + FROM SD_DFLTKW_B_H t + WHERE NVL(t.IS_DELETED, 0) = 0 + GROUP BY CASE + WHEN t.STTP = 'DW_2' THEN '1' + WHEN t.STTP = 'DW_5' THEN '2' + WHEN t.STTP = 'DW_6' THEN '3' + ELSE '4' + END + ) s + ON s.dwtp = c.dwtp + ORDER BY c.sortOrder + """; + List list = microservicDynamicSQLMapper.getAllListWithResultType(sql, new HashMap<>(), DfltkwFacilityCountVo.class); + DataSourceResult result = new DataSourceResult<>(); + result.setData(list); + result.setTotal((long) list.size()); + result.setAggregates(new HashMap<>()); + return result; + } + @Override public DataSourceResult getYearDetailList(DataSourceRequest dataSourceRequest) { DataSourceLoadOptionsBase loadOptions = dataSourceRequest == null ? null : dataSourceRequest.toDevRequest(); From c85e2d916d1be2946a39433f7be7f1ce1d325dcf Mon Sep 17 00:00:00 2001 From: tangwei Date: Wed, 27 May 2026 14:47:28 +0800 Subject: [PATCH 19/38] =?UTF-8?q?feat:=20=E6=9F=A5=E8=AF=A2=E6=B0=B4?= =?UTF-8?q?=E5=87=8F=E7=BC=93=E8=AE=BE=E6=96=BD=E7=B1=BB=E5=9E=8B=E4=BB=8B?= =?UTF-8?q?=E7=BB=8D?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../wt/controller/SdWTMonitorController.java | 6 + .../platform/env/wt/entity/vo/SttpInfoVo.java | 41 +++++ .../env/wt/service/SdWtMonitorService.java | 3 + .../service/impl/SdWtMonitorServiceImpl.java | 164 ++++++++++++++++++ 4 files changed, 214 insertions(+) create mode 100644 backend/src/main/java/com/yfd/platform/env/wt/entity/vo/SttpInfoVo.java diff --git a/backend/src/main/java/com/yfd/platform/env/wt/controller/SdWTMonitorController.java b/backend/src/main/java/com/yfd/platform/env/wt/controller/SdWTMonitorController.java index 8c337b5..fde5676 100644 --- a/backend/src/main/java/com/yfd/platform/env/wt/controller/SdWTMonitorController.java +++ b/backend/src/main/java/com/yfd/platform/env/wt/controller/SdWTMonitorController.java @@ -173,6 +173,12 @@ public class SdWTMonitorController { return ResponseResult.successData(sdWtMonitorService.getDfltkwFacilityCount(dataSourceRequest)); } + @PostMapping("/sttpb/GetKendoList") + @Operation(summary = "查询水减缓设施类型介绍") + public ResponseResult getSttpbList(@RequestBody DataSourceRequest dataSourceRequest) { + return ResponseResult.successData(sdWtMonitorService.getSttpbList(dataSourceRequest)); + } + @PostMapping("/vmsstbprpt/GetKendoList") @Operation(summary = "根据类型查询水温表基本数据") public ResponseResult getVmsstbprptList(@RequestBody DataSourceRequest dataSourceRequest) { diff --git a/backend/src/main/java/com/yfd/platform/env/wt/entity/vo/SttpInfoVo.java b/backend/src/main/java/com/yfd/platform/env/wt/entity/vo/SttpInfoVo.java new file mode 100644 index 0000000..681f9e7 --- /dev/null +++ b/backend/src/main/java/com/yfd/platform/env/wt/entity/vo/SttpInfoVo.java @@ -0,0 +1,41 @@ +package com.yfd.platform.env.wt.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 SttpInfoVo implements Serializable { + + private String id; + private String recordUser; + private Date recordTime; + private Date modifyTime; + private String displayRecordUser; + private String isolateType; + private Integer stbprpCnt; + private String recordUserName; + private String modifyUserName; + private String displayDepartment; + private String sttpCode; + private String sttpName; + private String description; + private String parentId; + private Integer enable; + private Integer treeLevel; + private Integer hasChildren; + private String fullPath; + private Integer internal; + private String introduce; + private String logo; + private String inffile; + private Integer orderIndex; + private String filterContent; + private Integer isTempStorage; + private String departmentId; + private String systemId; + private String platformId; +} diff --git a/backend/src/main/java/com/yfd/platform/env/wt/service/SdWtMonitorService.java b/backend/src/main/java/com/yfd/platform/env/wt/service/SdWtMonitorService.java index 044da0a..d93d0aa 100644 --- a/backend/src/main/java/com/yfd/platform/env/wt/service/SdWtMonitorService.java +++ b/backend/src/main/java/com/yfd/platform/env/wt/service/SdWtMonitorService.java @@ -5,6 +5,7 @@ import com.yfd.platform.common.DataSourceResult; import com.yfd.platform.env.wt.entity.vo.DfltkwFacilityCountVo; import com.yfd.platform.env.wt.entity.vo.RstcdTreeInfoVo; import com.yfd.platform.env.wt.entity.vo.SdYearDetailVO; +import com.yfd.platform.env.wt.entity.vo.SttpInfoVo; import com.yfd.platform.env.wt.entity.vo.WbsbVo; import com.yfd.platform.env.wt.entity.vo.WtrvVo; @@ -26,6 +27,8 @@ public interface SdWtMonitorService { DataSourceResult getDfltkwFacilityCount(DataSourceRequest dataSourceRequest); + DataSourceResult getSttpbList(DataSourceRequest dataSourceRequest); + DataSourceResult getYearDetailList(DataSourceRequest dataSourceRequest); List getWtvtDefaultTreeStcd(DataSourceRequest dataSourceRequest); 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 e7b09a2..cfc2f4d 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 @@ -9,6 +9,7 @@ import com.yfd.platform.env.wt.entity.vo.RstcdTreeInfoVo; import com.yfd.platform.env.wt.entity.vo.SdYearDetailVO; import com.yfd.platform.env.wt.entity.vo.SdWtBaseInfoVO; import com.yfd.platform.env.wt.entity.vo.SdWtMonitorCountVO; +import com.yfd.platform.env.wt.entity.vo.SttpInfoVo; import com.yfd.platform.env.wt.entity.vo.WbsbVo; import com.yfd.platform.env.wt.entity.vo.WtFishVo; import com.yfd.platform.env.wt.entity.vo.WtTreeStcdVo; @@ -176,6 +177,56 @@ public class SdWtMonitorServiceImpl implements SdWtMonitorService { return result; } + @Override + public DataSourceResult getSttpbList(DataSourceRequest dataSourceRequest) { + StringBuilder sql = new StringBuilder(); + sql.append("SELECT ") + .append("t.ID AS id, ") + .append("t.RECORD_USER AS recordUser, ") + .append("t.RECORD_TIME AS recordTime, ") + .append("t.MODIFY_TIME AS modifyTime, ") + .append("NULL AS displayRecordUser, ") + .append("NULL AS isolateType, ") + .append("NULL AS stbprpCnt, ") + .append("NULL AS recordUserName, ") + .append("NULL AS modifyUserName, ") + .append("NULL AS displayDepartment, ") + .append("t.STTP_CODE AS sttpCode, ") + .append("t.STTP_NAME AS sttpName, ") + .append("t.DESCRIPTION AS description, ") + .append("t.PARENT_ID AS parentId, ") +// .append("t.ENABLED AS enable, ") + .append("t.TREE_LEVEL AS treeLevel, ") + .append("t.HAS_CHILDREN AS hasChildren, ") + .append("t.FULL_PATH AS fullPath, ") + .append("t.INTERNAL AS internal, ") + .append("t.INTRODUCE AS introduce, ") + .append("t.LOGO AS logo, ") + .append("t.INFFILE AS inffile, ") + .append("t.ORDER_INDEX AS orderIndex, ") + .append("NULL AS filterContent, ") + .append("NULL AS isTempStorage, ") + .append("NULL AS departmentId, ") + .append("NULL AS systemId, ") + .append("NULL AS platformId ") + .append("FROM SD_STTP_B t ") + .append("WHERE NVL(t.IS_DELETED, 0) = 0 "); + Map paramMap = new HashMap<>(); + String filterSql = buildSttpInfoFilterCondition(dataSourceRequest == null ? null : dataSourceRequest.getFilter(), paramMap, new int[]{0}); + if (StrUtil.isNotBlank(filterSql)) { + sql.append(" AND ").append(filterSql).append(" "); + } + sql.append(buildSttpInfoOrderBySql(dataSourceRequest == null ? null : dataSourceRequest.getSort())); + + Page page = buildPage(dataSourceRequest == null ? null : dataSourceRequest.toDevRequest()); + List list = microservicDynamicSQLMapper.pageAllListWithResultType(page, sql.toString(), paramMap, SttpInfoVo.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 getYearDetailList(DataSourceRequest dataSourceRequest) { DataSourceLoadOptionsBase loadOptions = dataSourceRequest == null ? null : dataSourceRequest.toDevRequest(); @@ -1186,6 +1237,119 @@ public class SdWtMonitorServiceImpl implements SdWtMonitorService { return " ORDER BY " + String.join(", ", orderColumns); } + private String buildSttpInfoFilterCondition(DataSourceRequest.FilterDescriptor filter, + Map paramMap, + int[] indexHolder) { + if (filter == null) { + return ""; + } + if (StrUtil.isNotBlank(filter.getField())) { + return buildSttpInfoLeafCondition(filter, paramMap, indexHolder); + } + if (filter.getFilters() == null || filter.getFilters().isEmpty()) { + return ""; + } + List conditions = new ArrayList<>(); + for (DataSourceRequest.FilterDescriptor child : filter.getFilters()) { + String childCondition = buildSttpInfoFilterCondition(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 buildSttpInfoLeafCondition(DataSourceRequest.FilterDescriptor filter, + Map paramMap, + int[] indexHolder) { + String column = mapSttpInfoColumn(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 = "sttpP" + indexHolder[0]++; + paramMap.put(paramKey, "%" + value + "%"); + return "(" + column + " IS NULL OR " + column + " NOT LIKE #{map." + paramKey + "})"; + } + + String paramKey = "sttpP" + 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 + "}"; + default: + return ""; + } + } + + private String mapSttpInfoColumn(String field) { + if (StrUtil.isBlank(field)) { + return null; + } + return switch (field) { + case "id" -> "t.ID"; + case "sttpCode" -> "t.STTP_CODE"; + case "sttpName" -> "t.STTP_NAME"; + case "description" -> "t.DESCRIPTION"; + case "parentId" -> "t.PARENT_ID"; +// case "enable" -> "t.ENABLED"; + case "treeLevel" -> "t.TREE_LEVEL"; + case "hasChildren" -> "t.HAS_CHILDREN"; + case "fullPath" -> "t.FULL_PATH"; + case "internal" -> "t.INTERNAL"; + case "introduce" -> "t.INTRODUCE"; + case "logo" -> "t.LOGO"; + case "inffile" -> "t.INFFILE"; + case "orderIndex" -> "t.ORDER_INDEX"; + case "recordUser" -> "t.RECORD_USER"; + case "recordTime" -> "t.RECORD_TIME"; + case "modifyTime" -> "t.MODIFY_TIME"; + default -> null; + }; + } + + private String buildSttpInfoOrderBySql(List sortList) { + List orderColumns = new ArrayList<>(); + if (sortList != null) { + for (DataSourceRequest.SortDescriptor sortDescriptor : sortList) { + String column = mapSttpInfoColumn(sortDescriptor.getField()); + if (StrUtil.isBlank(column)) { + continue; + } + String dir = "desc".equalsIgnoreCase(sortDescriptor.getDir()) ? "DESC" : "ASC"; + orderColumns.add(column + " " + dir); + } + } + if (orderColumns.isEmpty()) { + return " ORDER BY NVL(t.ORDER_INDEX, 999999), t.STTP_CODE"; + } + return " ORDER BY " + String.join(", ", orderColumns); + } + private Page buildPage(DataSourceLoadOptionsBase loadOptions) { PageInfo pageInfo = QgcQueryWrapperUtil.getPageInfo(loadOptions); if (Boolean.TRUE.equals(pageInfo.getHasPageInfo())) { From 28b7d003efb1e7f4a49007b1f8aedd7129a59597 Mon Sep 17 00:00:00 2001 From: tangwei Date: Wed, 27 May 2026 15:48:52 +0800 Subject: [PATCH 20/38] =?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/controller/EnvWqDataController.java | 15 +- .../env/wq/service/EnvWqDataService.java | 2 + .../wq/service/impl/EnvWqDataServiceImpl.java | 349 +++++++++++++++++- .../service/impl/SdWtMonitorServiceImpl.java | 172 ++++++--- 4 files changed, 474 insertions(+), 64 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 8544b93..2283d36 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 @@ -65,10 +65,17 @@ 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("/base/msstbprpt/GetKendoList") +// @Operation(summary = "查询水质基础站点分组统计") +// public ResponseResult getBaseMsstbprptList(@RequestBody DataSourceRequest dataSourceRequest) { +// return ResponseResult.successData(envWqDataService.getMsstbprptList(dataSourceRequest)); +// } + + + @PostMapping("/wbsb/GetKendoList") + @Operation(summary = "查询水电基地流域字典列表") + public ResponseResult getWbsbList(@RequestBody DataSourceRequest dataSourceRequest) { + return ResponseResult.successData(envWqDataService.getWbsbList(dataSourceRequest)); } @PostMapping("/vmsstbprpt/GetKendoList") 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 2bd2f3b..29ab953 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 @@ -17,4 +17,6 @@ public interface EnvWqDataService { DataSourceResult getVmsstbprptList(DataSourceRequest dataSourceRequest); WqBaseInfoVo getStcdInfo(String stcd); + + DataSourceResult getWbsbList(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 0f7310c..59c7f5d 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 @@ -16,8 +16,10 @@ 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.WqMsstbprptGroupVo; import com.yfd.platform.env.wq.entity.vo.WqVmsstbprptVo; import com.yfd.platform.env.wq.service.EnvWqDataService; +import com.yfd.platform.env.wt.entity.vo.WbsbVo; import com.yfd.platform.utils.KendoUtil; import com.yfd.platform.utils.QgcQueryWrapperUtil; import com.yfd.platform.utils.RequestHolder; @@ -148,7 +150,48 @@ public class EnvWqDataServiceImpl implements EnvWqDataService { @Override public DataSourceResult getMsstbprptList(DataSourceRequest dataSourceRequest) { - return emptyResult(); + String groupField = "dtinType"; + String groupColumn = "t.DTIN_TYPE"; + String groupDir = "ASC"; + if (CollUtil.isNotEmpty(dataSourceRequest.getGroup())) { + DataSourceRequest.GroupDescriptor groupDescriptor = dataSourceRequest.getGroup().get(0); + if (groupDescriptor != null && StrUtil.isNotBlank(groupDescriptor.getField())) { + groupField = groupDescriptor.getField(); + String mappedColumn = mapMsstbprptColumn(groupField); + if (StrUtil.isNotBlank(mappedColumn)) { + groupColumn = mappedColumn; + } + if ("desc".equalsIgnoreCase(groupDescriptor.getDir()) || "des".equalsIgnoreCase(groupDescriptor.getDir())) { + groupDir = "DESC"; + } + } + } + + StringBuilder sql = new StringBuilder(); + sql.append("SELECT ") + .append(groupColumn).append(" AS ").append(groupField.toUpperCase()).append(", ") + .append("COUNT(*) AS COUNT_").append(groupField.toUpperCase()).append(" ") + .append("FROM SD_WQ_B_H t ") + .append("WHERE NVL(t.IS_DELETED, 0) = 0 "); + + Map paramMap = new HashMap<>(); + String filterSql = buildMsstbprptFilterCondition( + dataSourceRequest == null ? null : dataSourceRequest.getFilter(), + paramMap, + new int[]{0} + ); + if (StrUtil.isNotBlank(filterSql)) { + sql.append(" AND ").append(filterSql).append(" "); + } + sql.append("GROUP BY ").append(groupColumn).append(" ") + .append("ORDER BY ").append(groupColumn).append(" ").append(groupDir); + + List> rows = microservicDynamicSQLMapper.pageAllList(null, sql.toString(), paramMap); + DataSourceResult result = new DataSourceResult(); + result.setData(toMsstbprptLegacyGroups(rows, groupField)); + result.setTotal((long) rows.size()); + result.setAggregates(new HashMap<>()); + return result; } @Override @@ -1172,6 +1215,179 @@ public class EnvWqDataServiceImpl implements EnvWqDataService { return result; } + private String buildMsstbprptFilterCondition(DataSourceRequest.FilterDescriptor filter, + Map paramMap, + int[] indexHolder) { + if (filter == null) { + return ""; + } + if (StrUtil.isNotBlank(filter.getField())) { + return buildMsstbprptLeafCondition(filter, paramMap, indexHolder); + } + if (CollUtil.isEmpty(filter.getFilters())) { + return ""; + } + List conditions = new ArrayList<>(); + for (DataSourceRequest.FilterDescriptor child : filter.getFilters()) { + String childSql = buildMsstbprptFilterCondition(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 buildMsstbprptLeafCondition(DataSourceRequest.FilterDescriptor filter, + Map paramMap, + int[] indexHolder) { + String column = mapMsstbprptColumn(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 = normalizeMsstbprptValues(value); + if (values.isEmpty()) { + return ""; + } + List placeholders = new ArrayList<>(); + for (Object item : values) { + String paramKey = "msstbprptP" + indexHolder[0]++; + paramMap.put(paramKey, item); + placeholders.add("#{map." + paramKey + "}"); + } + return column + " IN (" + String.join(", ", placeholders) + ")"; + } + + String paramKey = "msstbprptP" + 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 List normalizeMsstbprptValues(Object value) { + if (value == null) { + return new ArrayList<>(); + } + if (value instanceof List list) { + return new ArrayList<>(list); + } + String text = String.valueOf(value).trim(); + if (StrUtil.isBlank(text)) { + return new ArrayList<>(); + } + if (text.startsWith("[") && text.endsWith("]")) { + text = text.substring(1, text.length() - 1); + } + List values = new ArrayList<>(); + for (String item : text.split(",")) { + String trimmed = StrUtil.trim(item); + if (StrUtil.isNotBlank(trimmed)) { + values.add(StrUtil.removeAll(trimmed, "\"")); + } + } + return values; + } + + private String mapMsstbprptColumn(String field) { + if (StrUtil.isBlank(field)) { + return null; + } + return switch (field) { + case "isDeleted" -> "NVL(t.IS_DELETED, 0)"; + case "sttpCode" -> "t.STTP"; + case "mway" -> "t.MWAY"; + case "dtinType" -> "t.DTIN_TYPE"; + case "stcd" -> "t.STCD"; + case "stnm" -> "t.STNM"; + case "dtin" -> "t.DTIN"; + default -> null; + }; + } + + private List> toMsstbprptLegacyGroups(List> rows, String groupField) { + List> result = new ArrayList<>(); + if (rows == null) { + return result; + } + String upperField = groupField == null ? "DTINTYPE" : groupField.toUpperCase(); + String countField = "COUNT_" + upperField; + String aggregateKey = "count_" + groupField; + for (Map row : rows) { + Object key = row.get(upperField); + if (key == null) { + key = row.get(groupField); + } + Object countValue = row.get(countField); + if (countValue == null) { + countValue = row.get("count_" + upperField); + } + long count = 0L; + if (countValue instanceof Number number) { + count = number.longValue(); + } else if (countValue != null) { + count = Long.parseLong(String.valueOf(countValue)); + } + + Map item = new LinkedHashMap<>(); + item.put("key", key); + item.put("keyName", null); + item.put("keyExt", new HashMap<>()); + + Map detail = new LinkedHashMap<>(); + detail.put(upperField, key); + detail.put(countField, count); + item.put("items", List.of(detail)); + item.put("count", count); + item.put("summary", new Object[0]); + + Map aggregates = new LinkedHashMap<>(); + aggregates.put(aggregateKey, count); + item.put("aggregates", aggregates); + result.add(item); + } + return result; + } + private String buildEnvWqOrderBySql(List sortList) { if (sortList == null || sortList.isEmpty()) { return ""; @@ -1224,4 +1440,135 @@ public class EnvWqDataServiceImpl implements EnvWqDataService { } return appended ? sql.toString() : ""; } + + + + @Override + public DataSourceResult getWbsbList(DataSourceRequest dataSourceRequest) { + DataSourceLoadOptionsBase loadOptions = dataSourceRequest == null ? null : dataSourceRequest.toDevRequest(); + String wbsType = loadOptions == null ? null : QgcQueryWrapperUtil.getFilterFieldValue(loadOptions, "wbsType"); + if (!"PSB_RVCD".equalsIgnoreCase(wbsType) && !"PSB".equalsIgnoreCase(wbsType)) { + DataSourceResult emptyResult = new DataSourceResult<>(); + emptyResult.setData(new ArrayList<>()); + emptyResult.setTotal(0L); + emptyResult.setAggregates(new HashMap<>()); + return emptyResult; + } + + StringBuilder sql = new StringBuilder(); + if ("PSB".equalsIgnoreCase(wbsType)) { + sql.append("SELECT ") + .append("t.BASEID AS id, ") + .append("t.RECORD_USER AS recordUser, ") + .append("t.RECORD_TIME AS recordTime, ") + .append("t.MODIFY_TIME AS modifyTime, ") + .append("NULL AS displayRecordUser, ") + .append("NULL AS isolateType, ") + .append("'PSB' AS wbsType, ") + .append("t.BASEID AS wbsCode, ") + .append("t.BASENAME AS wbsName, ") + .append("t.SHORTNAME AS wbsSname, ") + .append("NULL AS wbsNameEn, ") + .append("NULL AS wbsSnameEn, ") + .append("t.ENABLED AS enable, ") + .append("t.RMK AS description, ") + .append("CASE WHEN t.PBASEID = '0' THEN NULL ELSE t.PBASEID END AS parentId, ") + .append("CASE WHEN t.PBASEID = '0' THEN NULL ELSE t.PBASEID END AS parentCode, ") + .append("t.GRD AS treeLevel, ") + .append("CASE WHEN EXISTS (") + .append(" SELECT 1 FROM SD_HYDROBASE c ") + .append(" WHERE c.PBASEID = t.BASEID ") + .append(" AND NVL(c.IS_DELETED, 0) = 0") + .append(") THEN 1 ELSE 0 END AS hasChildren, ") + .append("t.BASEID AS objId, ") + .append("'PSB' AS topWbsType, ") + .append("t.PATH AS fullPath, ") + .append("0 AS internal, ") + .append("NULL AS lgtd, ") + .append("NULL AS lttd, ") + .append("NULL AS area, ") + .append("NULL AS perimeter, ") + .append("t.DES AS synopsis, ") + .append("t.DES AS introduce, ") + .append("NULL AS logo, ") + .append("NULL AS inffile, ") + .append("t.ORDER_INDEX AS orderIndex, ") + .append("NULL AS filterContent, ") + .append("NULL AS departmentId, ") + .append("NULL AS systemId, ") + .append("NULL AS platformId, ") + .append("NULL AS reachWwqtg, ") + .append("NULL AS maxElev, ") + .append("NULL AS minElev, ") + .append("NULL AS datTp, ") + .append("NULL AS rvAg, ") + .append("NULL AS ifInnRv, ") + .append("NULL AS showControl, ") + .append("NULL AS stcd, ") + .append("NULL AS displayDepartment ") + .append("FROM SD_HYDROBASE t ") + .append("WHERE NVL(t.IS_DELETED, 0) = 0 "); + sql.append("ORDER BY NVL(t.ORDER_INDEX, 999999), t.BASENAME ASC"); + } else { + sql.append("SELECT ") + .append("t.HBRVCD || '_' || t.BASEID AS id, ") + .append("t.RECORD_USER AS recordUser, ") + .append("t.RECORD_TIME AS recordTime, ") + .append("t.MODIFY_TIME AS modifyTime, ") + .append("NULL AS displayRecordUser, ") + .append("NULL AS isolateType, ") + .append("'PSB_RVCD' AS wbsType, ") + .append("t.HBRVCD AS wbsCode, ") + .append("t.HBRVNM AS wbsName, ") + .append("NULL AS wbsSname, ") + .append("NULL AS wbsNameEn, ") + .append("NULL AS wbsSnameEn, ") + .append("t.ENABLED AS enable, ") + .append("t.REMARK AS description, ") + .append("CASE WHEN t.PHBRVCD IS NULL OR t.PHBRVCD = '0' THEN NULL ELSE t.PHBRVCD || '_' || t.BASEID END AS parentId, ") + .append("CASE WHEN t.PHBRVCD IS NULL OR t.PHBRVCD = '0' THEN NULL ELSE t.PHBRVCD END AS parentCode, ") + .append("t.GRD AS treeLevel, ") + .append("CASE WHEN EXISTS (") + .append(" SELECT 1 FROM SD_HBRV_DIC c ") + .append(" WHERE c.PHBRVCD = t.HBRVCD ") + .append(" AND c.BASEID = t.BASEID ") + .append(" AND NVL(c.IS_DELETED, 0) = 0") + .append(") THEN 1 ELSE 0 END AS hasChildren, ") + .append("t.BASEID AS objId, ") + .append("'PSB' AS topWbsType, ") + .append("t.PATH AS fullPath, ") + .append("0 AS internal, ") + .append("NULL AS lgtd, ") + .append("NULL AS lttd, ") + .append("NULL AS area, ") + .append("NULL AS perimeter, ") + .append("NULL AS synopsis, ") + .append("NULL AS introduce, ") + .append("NULL AS logo, ") + .append("NULL AS inffile, ") + .append("t.ORDER_INDEX AS orderIndex, ") + .append("NULL AS filterContent, ") + .append("NULL AS departmentId, ") + .append("NULL AS systemId, ") + .append("NULL AS platformId, ") + .append("NULL AS reachWwqtg, ") + .append("NULL AS maxElev, ") + .append("NULL AS minElev, ") + .append("NULL AS datTp, ") + .append("NULL AS rvAg, ") + .append("NULL AS ifInnRv, ") + .append("NULL AS showControl, ") + .append("NULL AS stcd, ") + .append("NULL AS displayDepartment ") + .append("FROM SD_HBRV_DIC t ") + .append("WHERE NVL(t.IS_DELETED, 0) = 0 "); + sql.append("ORDER BY NVL(t.ORDER_INDEX, 999999), t.HBRVNM ASC"); + } + List list = microservicDynamicSQLMapper.getAllListWithResultType(sql.toString(), new HashMap<>(), WbsbVo.class); + DataSourceResult result = new DataSourceResult<>(); + result.setData(list); + result.setTotal((long) list.size()); + result.setAggregates(new HashMap<>()); + return result; + } } 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 cfc2f4d..ab8de73 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 @@ -57,7 +57,7 @@ public class SdWtMonitorServiceImpl implements SdWtMonitorService { public DataSourceResult getWbsbList(DataSourceRequest dataSourceRequest) { DataSourceLoadOptionsBase loadOptions = dataSourceRequest == null ? null : dataSourceRequest.toDevRequest(); String wbsType = loadOptions == null ? null : QgcQueryWrapperUtil.getFilterFieldValue(loadOptions, "wbsType"); - if (!"PSB_RVCD".equalsIgnoreCase(wbsType)) { + if (!"PSB_RVCD".equalsIgnoreCase(wbsType) && !"PSB".equalsIgnoreCase(wbsType)) { DataSourceResult emptyResult = new DataSourceResult<>(); emptyResult.setData(new ArrayList<>()); emptyResult.setTotal(0L); @@ -66,60 +66,114 @@ public class SdWtMonitorServiceImpl implements SdWtMonitorService { } StringBuilder sql = new StringBuilder(); - sql.append("SELECT ") - .append("t.HBRVCD || '_' || t.BASEID AS id, ") - .append("t.RECORD_USER AS recordUser, ") - .append("t.RECORD_TIME AS recordTime, ") - .append("t.MODIFY_TIME AS modifyTime, ") - .append("NULL AS displayRecordUser, ") - .append("NULL AS isolateType, ") - .append("'PSB_RVCD' AS wbsType, ") - .append("t.HBRVCD AS wbsCode, ") - .append("t.HBRVNM AS wbsName, ") - .append("NULL AS wbsSname, ") - .append("NULL AS wbsNameEn, ") - .append("NULL AS wbsSnameEn, ") - .append("t.ENABLED AS enable, ") - .append("t.REMARK AS description, ") - .append("CASE WHEN t.PHBRVCD IS NULL OR t.PHBRVCD = '0' THEN NULL ELSE t.PHBRVCD || '_' || t.BASEID END AS parentId, ") - .append("CASE WHEN t.PHBRVCD IS NULL OR t.PHBRVCD = '0' THEN NULL ELSE t.PHBRVCD END AS parentCode, ") - .append("t.GRD AS treeLevel, ") - .append("CASE WHEN EXISTS (") - .append(" SELECT 1 FROM SD_HBRV_DIC c ") - .append(" WHERE c.PHBRVCD = t.HBRVCD ") - .append(" AND c.BASEID = t.BASEID ") - .append(" AND NVL(c.IS_DELETED, 0) = 0") - .append(") THEN 1 ELSE 0 END AS hasChildren, ") - .append("t.BASEID AS objId, ") - .append("'PSB' AS topWbsType, ") - .append("t.PATH AS fullPath, ") - .append("0 AS internal, ") - .append("NULL AS lgtd, ") - .append("NULL AS lttd, ") - .append("NULL AS area, ") - .append("NULL AS perimeter, ") - .append("NULL AS synopsis, ") - .append("NULL AS introduce, ") - .append("NULL AS logo, ") - .append("NULL AS inffile, ") - .append("t.ORDER_INDEX AS orderIndex, ") - .append("NULL AS filterContent, ") - .append("NULL AS departmentId, ") - .append("NULL AS systemId, ") - .append("NULL AS platformId, ") - .append("NULL AS reachWwqtg, ") - .append("NULL AS maxElev, ") - .append("NULL AS minElev, ") - .append("NULL AS datTp, ") - .append("NULL AS rvAg, ") - .append("NULL AS ifInnRv, ") - .append("NULL AS showControl, ") - .append("NULL AS stcd, ") - .append("NULL AS displayDepartment ") - .append("FROM SD_HBRV_DIC t ") - .append("WHERE NVL(t.IS_DELETED, 0) = 0 "); - - sql.append("ORDER BY NVL(t.ORDER_INDEX, 999999), t.HBRVNM ASC"); + if ("PSB".equalsIgnoreCase(wbsType)) { + sql.append("SELECT ") + .append("t.BASEID AS id, ") + .append("t.RECORD_USER AS recordUser, ") + .append("t.RECORD_TIME AS recordTime, ") + .append("t.MODIFY_TIME AS modifyTime, ") + .append("NULL AS displayRecordUser, ") + .append("NULL AS isolateType, ") + .append("'PSB' AS wbsType, ") + .append("t.BASEID AS wbsCode, ") + .append("t.BASENAME AS wbsName, ") + .append("t.SHORTNAME AS wbsSname, ") + .append("NULL AS wbsNameEn, ") + .append("NULL AS wbsSnameEn, ") + .append("t.ENABLED AS enable, ") + .append("t.RMK AS description, ") + .append("CASE WHEN t.PBASEID = '0' THEN NULL ELSE t.PBASEID END AS parentId, ") + .append("CASE WHEN t.PBASEID = '0' THEN NULL ELSE t.PBASEID END AS parentCode, ") + .append("t.GRD AS treeLevel, ") + .append("CASE WHEN EXISTS (") + .append(" SELECT 1 FROM SD_HYDROBASE c ") + .append(" WHERE c.PBASEID = t.BASEID ") + .append(" AND NVL(c.IS_DELETED, 0) = 0") + .append(") THEN 1 ELSE 0 END AS hasChildren, ") + .append("t.BASEID AS objId, ") + .append("'PSB' AS topWbsType, ") + .append("t.PATH AS fullPath, ") + .append("0 AS internal, ") + .append("NULL AS lgtd, ") + .append("NULL AS lttd, ") + .append("NULL AS area, ") + .append("NULL AS perimeter, ") + .append("t.DES AS synopsis, ") + .append("t.DES AS introduce, ") + .append("NULL AS logo, ") + .append("NULL AS inffile, ") + .append("t.ORDER_INDEX AS orderIndex, ") + .append("NULL AS filterContent, ") + .append("NULL AS departmentId, ") + .append("NULL AS systemId, ") + .append("NULL AS platformId, ") + .append("NULL AS reachWwqtg, ") + .append("NULL AS maxElev, ") + .append("NULL AS minElev, ") + .append("NULL AS datTp, ") + .append("NULL AS rvAg, ") + .append("NULL AS ifInnRv, ") + .append("NULL AS showControl, ") + .append("NULL AS stcd, ") + .append("NULL AS displayDepartment ") + .append("FROM SD_HYDROBASE t ") + .append("WHERE NVL(t.IS_DELETED, 0) = 0 "); + sql.append("ORDER BY NVL(t.ORDER_INDEX, 999999), t.BASENAME ASC"); + } else { + sql.append("SELECT ") + .append("t.HBRVCD || '_' || t.BASEID AS id, ") + .append("t.RECORD_USER AS recordUser, ") + .append("t.RECORD_TIME AS recordTime, ") + .append("t.MODIFY_TIME AS modifyTime, ") + .append("NULL AS displayRecordUser, ") + .append("NULL AS isolateType, ") + .append("'PSB_RVCD' AS wbsType, ") + .append("t.HBRVCD AS wbsCode, ") + .append("t.HBRVNM AS wbsName, ") + .append("NULL AS wbsSname, ") + .append("NULL AS wbsNameEn, ") + .append("NULL AS wbsSnameEn, ") + .append("t.ENABLED AS enable, ") + .append("t.REMARK AS description, ") + .append("CASE WHEN t.PHBRVCD IS NULL OR t.PHBRVCD = '0' THEN NULL ELSE t.PHBRVCD || '_' || t.BASEID END AS parentId, ") + .append("CASE WHEN t.PHBRVCD IS NULL OR t.PHBRVCD = '0' THEN NULL ELSE t.PHBRVCD END AS parentCode, ") + .append("t.GRD AS treeLevel, ") + .append("CASE WHEN EXISTS (") + .append(" SELECT 1 FROM SD_HBRV_DIC c ") + .append(" WHERE c.PHBRVCD = t.HBRVCD ") + .append(" AND c.BASEID = t.BASEID ") + .append(" AND NVL(c.IS_DELETED, 0) = 0") + .append(") THEN 1 ELSE 0 END AS hasChildren, ") + .append("t.BASEID AS objId, ") + .append("'PSB' AS topWbsType, ") + .append("t.PATH AS fullPath, ") + .append("0 AS internal, ") + .append("NULL AS lgtd, ") + .append("NULL AS lttd, ") + .append("NULL AS area, ") + .append("NULL AS perimeter, ") + .append("NULL AS synopsis, ") + .append("NULL AS introduce, ") + .append("NULL AS logo, ") + .append("NULL AS inffile, ") + .append("t.ORDER_INDEX AS orderIndex, ") + .append("NULL AS filterContent, ") + .append("NULL AS departmentId, ") + .append("NULL AS systemId, ") + .append("NULL AS platformId, ") + .append("NULL AS reachWwqtg, ") + .append("NULL AS maxElev, ") + .append("NULL AS minElev, ") + .append("NULL AS datTp, ") + .append("NULL AS rvAg, ") + .append("NULL AS ifInnRv, ") + .append("NULL AS showControl, ") + .append("NULL AS stcd, ") + .append("NULL AS displayDepartment ") + .append("FROM SD_HBRV_DIC t ") + .append("WHERE NVL(t.IS_DELETED, 0) = 0 "); + sql.append("ORDER BY NVL(t.ORDER_INDEX, 999999), t.HBRVNM ASC"); + } List list = microservicDynamicSQLMapper.getAllListWithResultType(sql.toString(), new HashMap<>(), WbsbVo.class); DataSourceResult result = new DataSourceResult<>(); result.setData(list); @@ -420,8 +474,8 @@ public class SdWtMonitorServiceImpl implements SdWtMonitorService { .append("eng.DVTP AS dvtp, ") .append("hb.ORDER_INDEX AS baseStepSort, ") .append("eng.HBRVCD AS hbrvcd, ") - .append("eng.ORDER_INDEX AS rstcdStepSort, ") - .append("wt.ORDER_INDEX AS siteStepSort ") + .append("eng.ORDER_INDEX AS rstcdStepSort ") +// .append("wt.ORDER_INDEX AS siteStepSort ") .append("FROM SD_WT_B_H wt ") .append("LEFT JOIN SD_ENGINFO_B_H eng ON eng.STCD = wt.RSTCD ") .append("LEFT JOIN SD_HYDROBASE hb ON hb.BASEID = eng.BASE_ID ") @@ -859,7 +913,7 @@ public class SdWtMonitorServiceImpl implements SdWtMonitorService { .append("wt.MWAY AS mway, ") .append("wt.WT_DEVICE_TYPE AS wtDeviceType, ") .append("eng.HBRVCD AS hbrvcd, ") - .append("wt.ORDER_INDEX AS orderIndex, ") +// .append("wt.ORDER_INDEX AS orderIndex, ") .append("eng.BASE_ID AS baseId, ") .append("hb.ORDER_INDEX AS baseStepSort, ") .append("NVL(siteSort.SORT, wt.ORDER_INDEX) AS siteStepSort, ") @@ -1382,7 +1436,7 @@ public class SdWtMonitorServiceImpl implements SdWtMonitorService { } } if (orderColumns.isEmpty()) { - return " ORDER BY NVL(hb.ORDER_INDEX, 999999) ASC, NVL(eng.HBRVCD, '~') ASC, NVL(eng.ORDER_INDEX, 999999) ASC, NVL(wt.ORDER_INDEX, 999999) ASC"; + return " ORDER BY NVL(hb.ORDER_INDEX, 999999) ASC, NVL(eng.HBRVCD, '~') ASC, NVL(eng.ORDER_INDEX, 999999) ASC"; } return " ORDER BY " + String.join(", ", orderColumns); } From 5cb83d039d23affb1418d29d77b3a6377f5725e7 Mon Sep 17 00:00:00 2001 From: tangwei Date: Wed, 27 May 2026 16:03:13 +0800 Subject: [PATCH 21/38] =?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 --- .../java/com/yfd/platform/env/wq/entity/vo/WqVmsstbprptVo.java | 3 +++ .../yfd/platform/env/wq/service/impl/EnvWqDataServiceImpl.java | 2 ++ .../java/com/yfd/platform/env/wt/entity/vo/SdWtBaseInfoVO.java | 2 ++ .../platform/env/wt/service/impl/SdWtMonitorServiceImpl.java | 2 ++ 4 files changed, 9 insertions(+) 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 index ef6d4d1..0a46130 100644 --- 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 @@ -12,6 +12,9 @@ public class WqVmsstbprptVo implements Serializable { private static final long serialVersionUID = 1L; + @Schema(description = "基地Id") + private String baseId; + @Schema(description = "基地名称") private String baseName; 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 59c7f5d..5819f58 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 @@ -209,6 +209,7 @@ public class EnvWqDataServiceImpl implements EnvWqDataService { if (queryEngDirectly) { sql.append("SELECT ") .append("hb.BASENAME AS baseName, ") + .append("hb.BASEID AS baseID, ") .append("eng.ENNM AS stnm, ") .append("eng.ENNM AS ennm, ") .append("eng.JCDT AS jcdt, ") @@ -230,6 +231,7 @@ public class EnvWqDataServiceImpl implements EnvWqDataService { } else { sql.append("SELECT ") .append("hb.BASENAME AS baseName, ") + .append("hb.BASEID AS baseID, ") .append("wq.STNM AS stnm, ") .append("eng.ENNM AS ennm, ") .append("wq.JCDT AS jcdt, ") diff --git a/backend/src/main/java/com/yfd/platform/env/wt/entity/vo/SdWtBaseInfoVO.java b/backend/src/main/java/com/yfd/platform/env/wt/entity/vo/SdWtBaseInfoVO.java index 572b232..4100526 100644 --- a/backend/src/main/java/com/yfd/platform/env/wt/entity/vo/SdWtBaseInfoVO.java +++ b/backend/src/main/java/com/yfd/platform/env/wt/entity/vo/SdWtBaseInfoVO.java @@ -12,6 +12,8 @@ public class SdWtBaseInfoVO implements Serializable { private static final long serialVersionUID = 1L; + @Schema(description = "基地Id") + private String baseId; @Schema(description = "基地名称") private String baseName; 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 ab8de73..9061096 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 @@ -437,6 +437,7 @@ public class SdWtMonitorServiceImpl implements SdWtMonitorService { if (queryEngDirectly) { sql.append("SELECT ") .append("hb.BASENAME AS baseName, ") + .append("hb.BASEID AS baseId, ") .append("eng.ENNM AS stnm, ") .append("eng.ENNM AS ennm, ") .append("eng.JCDT AS jcdt, ") @@ -458,6 +459,7 @@ public class SdWtMonitorServiceImpl implements SdWtMonitorService { } else { sql.append("SELECT ") .append("hb.BASENAME AS baseName, ") + .append("hb.BASEID AS baseId, ") .append("wt.STNM AS stnm, ") .append("eng.ENNM AS ennm, ") .append("wt.JCDT AS jcdt, ") From 767a7ac8a53173dcb4be03e0e22e3841340084eb Mon Sep 17 00:00:00 2001 From: tangwei Date: Wed, 27 May 2026 16:27:49 +0800 Subject: [PATCH 22/38] =?UTF-8?q?feat:=20=E5=85=A8=E8=BF=87=E7=A8=8B?= =?UTF-8?q?=E6=9C=88=E5=B9=B3=E5=9D=87=E6=B0=B4=E6=B8=A9=E5=8E=86=E5=8F=B2?= =?UTF-8?q?=E5=AF=B9=E6=AF=94=E4=BA=8C=E7=BA=A7=E6=95=B0=E6=8D=AE=E6=8E=A5?= =?UTF-8?q?=E5=8F=A3?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../wt/controller/SdWTMonitorController.java | 12 + .../env/wt/entity/vo/SdMonthDetailVO.java | 38 +++ .../env/wt/service/SdWtMonitorService.java | 6 + .../service/impl/SdWtMonitorServiceImpl.java | 259 ++++++++++++++++++ 4 files changed, 315 insertions(+) create mode 100644 backend/src/main/java/com/yfd/platform/env/wt/entity/vo/SdMonthDetailVO.java diff --git a/backend/src/main/java/com/yfd/platform/env/wt/controller/SdWTMonitorController.java b/backend/src/main/java/com/yfd/platform/env/wt/controller/SdWTMonitorController.java index fde5676..df94029 100644 --- a/backend/src/main/java/com/yfd/platform/env/wt/controller/SdWTMonitorController.java +++ b/backend/src/main/java/com/yfd/platform/env/wt/controller/SdWTMonitorController.java @@ -142,6 +142,12 @@ public class SdWTMonitorController { return ResponseResult.successData(this.alongListService.getMonthKendoListCust(dataSourceRequest)); } + @PostMapping("/monthDetail/Det/GetKendoListCust") + @Operation(summary = "全过程月平均水温历史对比二级数据接口") + public ResponseResult getMonthDetailList(@RequestBody DataSourceRequest dataSourceRequest) { + return ResponseResult.successData(sdWtMonitorService.getMonthDetailList(dataSourceRequest)); + } + @PostMapping("/yearList/default/stcd") @Operation(summary = "获取水温年内分布默认有数据的电站") public ResponseResult getYearDefaultStcd(@RequestBody DataSourceRequest dataSourceRequest) { @@ -215,6 +221,12 @@ public class SdWTMonitorController { return ResponseResult.successData(sdWtMonitorService.getWtFishAnalysis(dataSourceRequest)); } + @PostMapping("/wtrv/fish/info/GetKendoListCust") + @Operation(summary = "鱼类产卵月份和适宜水温") + public ResponseResult getWtFishInfo(@RequestBody DataSourceRequest dataSourceRequest) { + return ResponseResult.successData(sdWtMonitorService.getWtFishInfo(dataSourceRequest)); + } + @GetMapping("/wtrv/getIoWtrvFlag") @Operation(summary = "根据站点编码判断是否出入水温站且关联的电站是否有垂向水温站") public ResponseResult getFlagByStcd(@RequestParam String stcd) { diff --git a/backend/src/main/java/com/yfd/platform/env/wt/entity/vo/SdMonthDetailVO.java b/backend/src/main/java/com/yfd/platform/env/wt/entity/vo/SdMonthDetailVO.java new file mode 100644 index 0000000..bd26e14 --- /dev/null +++ b/backend/src/main/java/com/yfd/platform/env/wt/entity/vo/SdMonthDetailVO.java @@ -0,0 +1,38 @@ +package com.yfd.platform.env.wt.entity.vo; + +import io.swagger.v3.oas.annotations.media.Schema; +import lombok.Getter; +import lombok.Setter; + +import java.math.BigDecimal; +import java.util.Date; + +@Getter +@Setter +@Schema(description = "月平均水温历史对比二级列表") +public class SdMonthDetailVO { + + @Schema(description = "站码") + private String stcd; + + @Schema(description = "日期") + private Date dt; + + @Schema(description = "日均水温实测值") + private BigDecimal wt; + + @Schema(description = "日均水温去年同期") + private BigDecimal beforeWt; + + @Schema(description = "天然值") + private BigDecimal actualTemp; + + @Schema(description = "站点类型") + private String sttp; + + @Schema(description = "站点类型编码") + private String sttpCode; + + @Schema(description = "站名") + private String stnm; +} diff --git a/backend/src/main/java/com/yfd/platform/env/wt/service/SdWtMonitorService.java b/backend/src/main/java/com/yfd/platform/env/wt/service/SdWtMonitorService.java index d93d0aa..7f6c164 100644 --- a/backend/src/main/java/com/yfd/platform/env/wt/service/SdWtMonitorService.java +++ b/backend/src/main/java/com/yfd/platform/env/wt/service/SdWtMonitorService.java @@ -3,7 +3,9 @@ package com.yfd.platform.env.wt.service; import com.yfd.platform.common.DataSourceRequest; import com.yfd.platform.common.DataSourceResult; import com.yfd.platform.env.wt.entity.vo.DfltkwFacilityCountVo; +import com.yfd.platform.env.wt.entity.vo.FishSpawnVo; import com.yfd.platform.env.wt.entity.vo.RstcdTreeInfoVo; +import com.yfd.platform.env.wt.entity.vo.SdMonthDetailVO; import com.yfd.platform.env.wt.entity.vo.SdYearDetailVO; import com.yfd.platform.env.wt.entity.vo.SttpInfoVo; import com.yfd.platform.env.wt.entity.vo.WbsbVo; @@ -21,6 +23,8 @@ public interface SdWtMonitorService { DataSourceResult getWtFishAnalysis(DataSourceRequest dataSourceRequest); + DataSourceResult getWtFishInfo(DataSourceRequest dataSourceRequest); + WtrvVo getFlagByStcd(String stcd); DataSourceResult getWbsbList(DataSourceRequest dataSourceRequest); @@ -31,5 +35,7 @@ public interface SdWtMonitorService { DataSourceResult getYearDetailList(DataSourceRequest dataSourceRequest); + DataSourceResult getMonthDetailList(DataSourceRequest dataSourceRequest); + List getWtvtDefaultTreeStcd(DataSourceRequest dataSourceRequest); } 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 9061096..c4d43c1 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 @@ -6,6 +6,7 @@ import com.yfd.platform.common.*; import com.yfd.platform.env.wt.entity.vo.DfltkwFacilityCountVo; import com.yfd.platform.env.wt.entity.vo.FishSpawnVo; import com.yfd.platform.env.wt.entity.vo.RstcdTreeInfoVo; +import com.yfd.platform.env.wt.entity.vo.SdMonthDetailVO; import com.yfd.platform.env.wt.entity.vo.SdYearDetailVO; import com.yfd.platform.env.wt.entity.vo.SdWtBaseInfoVO; import com.yfd.platform.env.wt.entity.vo.SdWtMonitorCountVO; @@ -323,6 +324,40 @@ public class SdWtMonitorServiceImpl implements SdWtMonitorService { return result; } + @Override + public DataSourceResult getMonthDetailList(DataSourceRequest dataSourceRequest) { + DataSourceLoadOptionsBase loadOptions = dataSourceRequest == null ? null : dataSourceRequest.toDevRequest(); + String startTime = loadOptions == null ? null : QgcQueryWrapperUtil.getFilterFieldValue(loadOptions, "startTime"); + String endTime = loadOptions == null ? null : QgcQueryWrapperUtil.getFilterFieldValue(loadOptions, "endTime"); + String stcd = loadOptions == null ? null : QgcQueryWrapperUtil.getFilterFieldValue(loadOptions, "stcd"); + Integer month = extractMonth(startTime); + + StringBuilder sql = new StringBuilder(buildMonthDetailBaseSql()); + Map paramMap = new HashMap<>(); + paramMap.put("startTime", startTime); + paramMap.put("endTime", endTime); + paramMap.put("stcd", stcd); + paramMap.put("month", month); + + String filterSql = buildMonthDetailFilterCondition( + dataSourceRequest == null ? null : dataSourceRequest.getFilter(), + paramMap, + new int[]{0} + ); + if (StrUtil.isNotBlank(filterSql)) { + sql.append(" AND ").append(filterSql).append(" "); + } + sql.append(buildMonthDetailOrderBySql(dataSourceRequest == null ? null : dataSourceRequest.getSort())); + + Page page = buildPage(loadOptions); + List list = microservicDynamicSQLMapper.pageAllListWithResultType(page, sql.toString(), paramMap, SdMonthDetailVO.class); + DataSourceResult result = new DataSourceResult<>(); + result.setData(list); + result.setTotal(page != null ? page.getTotal() : list.size()); + result.setAggregates(new HashMap<>()); + return result; + } + @Override public WtrvVo getFlagByStcd(String stcd) { String sql = "SELECT wt.STCD AS stcd, " + @@ -423,6 +458,43 @@ public class SdWtMonitorServiceImpl implements SdWtMonitorService { return result; } + @Override + public DataSourceResult getWtFishInfo(DataSourceRequest dataSourceRequest) { + DataSourceResult result = new DataSourceResult<>(); + DataSourceLoadOptionsBase loadOptions = dataSourceRequest == null ? null : dataSourceRequest.toDevRequest(); + String stcd = loadOptions == null ? null : QgcQueryWrapperUtil.getFilterFieldValue(loadOptions, "stcd"); + if (StrUtil.isBlank(stcd)) { + result.setData(new ArrayList<>()); + result.setTotal(0L); + result.setAggregates(new HashMap<>()); + return result; + } + + String sql = "SELECT " + + "t2.ID AS id, " + + "t2.NAME AS name, " + + "t2.PRETEMP AS pretempStr, " + + "t2.SPAWN_MONTH AS spawnMonthStr " + + "FROM SD_WT_B_H t1 " + + "INNER JOIN SD_ENGINFO_B_H eng ON eng.STCD = t1.RSTCD " + + "INNER JOIN SD_FISHDICTORY_RLTN_B t3 ON eng.HBRVCD = t3.RVCD AND NVL(t3.IS_DELETED, 0) = 0 " + + "INNER JOIN SD_FISHDICTORY_B t2 ON t2.ID = t3.ZY_FISH_ID AND NVL(t2.IS_DELETED, 0) = 0 " + + "WHERE NVL(t1.IS_DELETED, 0) = 0 " + + " AND t1.STCD = #{map.stcd} " + + " AND t1.STTP = 'WTRV' " + + " AND t2.PRETEMP IS NOT NULL " + + " AND t2.SPAWN_MONTH IS NOT NULL " + + "ORDER BY NVL(t3.ORDER_INDEX, 999999), NVL(t2.ORDER_INDEX, 999999), t2.NAME"; + Map paramMap = new HashMap<>(); + paramMap.put("stcd", stcd); + List list = microservicDynamicSQLMapper.getAllListWithResultType(sql, paramMap, FishSpawnVo.class); + fillFishSpawnInfo(list); + result.setData(list); + result.setTotal((long) list.size()); + result.setAggregates(new HashMap<>()); + return result; + } + @Override public DataSourceResult getVmsstbprptList(DataSourceRequest dataSourceRequest) { DataSourceLoadOptionsBase loadOptions = dataSourceRequest.toDevRequest(); @@ -1082,6 +1154,56 @@ public class SdWtMonitorServiceImpl implements SdWtMonitorService { } } + private String buildMonthDetailBaseSql() { + return "SELECT t.STCD AS stcd, " + + "t.STNM AS stnm, " + + "t.DT AS dt, " + + "t.WT AS wt, " + + "t.STTP AS sttp, " + + "t.STTPCODE AS sttpCode, " + + "t.BEFOREWT AS beforeWt, " + + "t.ACTUALTEMP AS actualTemp " + + "FROM ( " + + " SELECT t1.DT, " + + " t2.WT AS wt, " + + " 'WT' AS sttp, " + + " wt.STTP AS sttpCode, " + + " wt.STCD AS stcd, " + + " wt.STNM AS stnm, " + + " t3.WT AS beforeWt, " + + " np.WT AS actualTemp " + + " FROM (SELECT TRUNC(TO_DATE(#{map.startTime}, 'YYYY-MM-DD HH24:MI:SS')) + LEVEL - 1 AS DT " + + " FROM DUAL " + + " CONNECT BY TRUNC(TO_DATE(#{map.startTime}, 'YYYY-MM-DD HH24:MI:SS')) + LEVEL - 1 <= TRUNC(TO_DATE(#{map.endTime}, 'YYYY-MM-DD HH24:MI:SS'))) t1 " + + " LEFT JOIN (SELECT STCD, WT, DT " + + " FROM SD_WTRVDAY_S " + + " WHERE NVL(IS_DELETED, 0) = 0 " + + " AND STCD = #{map.stcd} " + + " AND DT >= TO_DATE(#{map.startTime}, 'YYYY-MM-DD HH24:MI:SS') " + + " AND DT <= TO_DATE(#{map.endTime}, 'YYYY-MM-DD HH24:MI:SS')) t2 " + + " ON t1.DT = t2.DT " + + " LEFT JOIN (SELECT STCD, WT, DT " + + " FROM SD_WTRVDAY_S " + + " WHERE NVL(IS_DELETED, 0) = 0 " + + " AND STCD = #{map.stcd} " + + " AND DT >= ADD_MONTHS(TO_DATE(#{map.startTime}, 'YYYY-MM-DD HH24:MI:SS'), -12) " + + " AND DT <= ADD_MONTHS(TO_DATE(#{map.endTime}, 'YYYY-MM-DD HH24:MI:SS'), -12)) t3 " + + " ON t1.DT = ADD_MONTHS(t3.DT, 12) " + + " LEFT JOIN SD_WT_B_H wt " + + " ON wt.STCD = #{map.stcd} " + + " AND wt.STTP = 'WTRV' " + + " AND NVL(wt.IS_DELETED, 0) = 0 " + + " LEFT JOIN (SELECT STCD, WT " + + " FROM SD_WTNP_B " + + " WHERE NVL(IS_DELETED, 0) = 0 " + + " AND WTTP = 1 " + + " AND MNTH = #{map.month}) np " + + " ON np.STCD = wt.RSTCD " + + " WHERE t1.DT <= SYSDATE " + + " AND (t2.WT IS NOT NULL OR t3.WT IS NOT NULL) " + + ") t WHERE 1 = 1 "; + } + private String buildYearDetailBaseSql(boolean hasMonth) { StringBuilder sql = new StringBuilder(); sql.append("SELECT t.STCD AS stcd, ") @@ -1293,6 +1415,110 @@ public class SdWtMonitorServiceImpl implements SdWtMonitorService { return " ORDER BY " + String.join(", ", orderColumns); } + private String buildMonthDetailFilterCondition(DataSourceRequest.FilterDescriptor filter, + Map paramMap, + int[] indexHolder) { + if (filter == null) { + return ""; + } + if (filter.getFilters() == null || filter.getFilters().isEmpty()) { + return buildMonthDetailLeafCondition(filter, paramMap, indexHolder); + } + List parts = new ArrayList<>(); + for (DataSourceRequest.FilterDescriptor child : filter.getFilters()) { + String childSql = buildMonthDetailFilterCondition(child, paramMap, indexHolder); + if (StrUtil.isNotBlank(childSql)) { + parts.add("(" + childSql + ")"); + } + } + if (parts.isEmpty()) { + return ""; + } + String logic = "or".equalsIgnoreCase(filter.getLogic()) ? " OR " : " AND "; + return String.join(logic, parts); + } + + private String buildMonthDetailLeafCondition(DataSourceRequest.FilterDescriptor filter, + Map paramMap, + int[] indexHolder) { + String field = filter.getField(); + if (StrUtil.isBlank(field) || "startTime".equals(field) || "endTime".equals(field) || "stcd".equals(field)) { + return ""; + } + String column = mapMonthDetailColumn(field); + 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"; + } + String paramKey = "monthDetailP" + 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 "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 mapMonthDetailColumn(String field) { + if (StrUtil.isBlank(field)) { + return null; + } + return switch (field) { + case "dt" -> "t.DT"; + case "wt" -> "t.WT"; + case "beforeWt" -> "t.BEFOREWT"; + case "actualTemp" -> "t.ACTUALTEMP"; + case "sttp" -> "t.STTP"; + case "sttpCode" -> "t.STTPCODE"; + case "stnm" -> "t.STNM"; + default -> null; + }; + } + + private String buildMonthDetailOrderBySql(List sortList) { + List orderColumns = new ArrayList<>(); + if (sortList != null) { + for (DataSourceRequest.SortDescriptor sortDescriptor : sortList) { + String column = mapMonthDetailColumn(sortDescriptor.getField()); + if (StrUtil.isBlank(column)) { + continue; + } + String dir = "desc".equalsIgnoreCase(sortDescriptor.getDir()) ? "DESC" : "ASC"; + orderColumns.add(column + " " + dir); + } + } + if (orderColumns.isEmpty()) { + return ""; + } + return " ORDER BY " + String.join(", ", orderColumns); + } + private String buildSttpInfoFilterCondition(DataSourceRequest.FilterDescriptor filter, Map paramMap, int[] indexHolder) { @@ -1594,6 +1820,22 @@ public class SdWtMonitorServiceImpl implements SdWtMonitorService { } } + private void fillFishSpawnInfo(List fishSpawnVoList) { + if (fishSpawnVoList == null || fishSpawnVoList.isEmpty()) { + return; + } + for (FishSpawnVo fishSpawnVo : fishSpawnVoList) { + BigDecimal[] range = parsePretempRange(fishSpawnVo.getPretempStr()); + if (range != null) { + List pretemp = new ArrayList<>(); + pretemp.add(range[0].stripTrailingZeros().toPlainString()); + pretemp.add(range[1].stripTrailingZeros().toPlainString()); + fishSpawnVo.setPretemp(pretemp); + } + fishSpawnVo.setSpawnMonth(parseSpawnMonthList(fishSpawnVo.getSpawnMonthStr())); + } + } + private boolean matchSpawnMonth(String spawnMonthStr, int month) { if (StrUtil.isBlank(spawnMonthStr)) { return false; @@ -1612,6 +1854,23 @@ public class SdWtMonitorServiceImpl implements SdWtMonitorService { return false; } + private List parseSpawnMonthList(String spawnMonthStr) { + List result = new ArrayList<>(); + if (StrUtil.isBlank(spawnMonthStr)) { + return result; + } + for (String monthStr : spawnMonthStr.split(",")) { + if (StrUtil.isBlank(monthStr)) { + continue; + } + try { + result.add(String.format("%02d", Integer.parseInt(monthStr.trim()))); + } catch (NumberFormatException ignored) { + } + } + return result; + } + private BigDecimal[] parsePretempRange(String pretempStr) { if (StrUtil.isBlank(pretempStr)) { return null; From 914a3b68d8a94d6835a8c85caab490719f94c695 Mon Sep 17 00:00:00 2001 From: tangwei Date: Wed, 27 May 2026 17:17:18 +0800 Subject: [PATCH 23/38] =?UTF-8?q?fix:=20=E4=BC=98=E5=8C=96=E6=B0=B4?= =?UTF-8?q?=E8=B4=A8=E6=8E=A5=E5=8F=A3?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../wq/service/impl/EnvWqDataServiceImpl.java | 239 ++++++++++++++---- 1 file changed, 192 insertions(+), 47 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 5819f58..f9ffeca 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 @@ -197,13 +197,10 @@ public class EnvWqDataServiceImpl implements EnvWqDataService { @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"); - + String sttpCode = findFilterFieldValue(dataSourceRequest == null ? null : dataSourceRequest.getFilter(), "sttpCode"); + if (StrUtil.isBlank(sttpCode)) { + sttpCode = QgcQueryWrapperUtil.getFilterFieldValue(loadOptions, "sttpCode"); + } StringBuilder sql = new StringBuilder(); boolean queryEngDirectly = "ENG".equalsIgnoreCase(sttpCode); if (queryEngDirectly) { @@ -255,48 +252,17 @@ public class EnvWqDataServiceImpl implements EnvWqDataService { } Map paramMap = new HashMap<>(); - if (!queryEngDirectly && StrUtil.isNotBlank(mway)) { - paramMap.put("mway", mway); - sql.append("AND wq.MWAY = #{map.mway} "); - } - if (!queryEngDirectly && StrUtil.isNotBlank(sttpCode)) { - paramMap.put("sttpCode", sttpCode); - sql.append("AND wq.STTP = #{map.sttpCode} "); - } - if (StrUtil.isNotBlank(dtinType)) { - paramMap.put("dtinType", dtinType); - if (queryEngDirectly) { - sql.append("AND NVL(eng.DTIN, 0) = #{map.dtinType} "); - } else { - sql.append("AND wq.DTIN_TYPE = #{map.dtinType} "); - } - } - if (StrUtil.isNotBlank(rstcd)) { - paramMap.put("rstcd", rstcd); - if (queryEngDirectly) { - sql.append("AND eng.STCD = #{map.rstcd} "); - } else { - sql.append("AND wq.RSTCD = #{map.rstcd} "); - } - } - if (StrUtil.isNotBlank(stnm)) { - paramMap.put("stnm", "%" + stnm + "%"); - if (queryEngDirectly) { - sql.append("AND eng.ENNM LIKE #{map.stnm} "); - } else { - sql.append("AND wq.STNM LIKE #{map.stnm} "); - } - } - if (StrUtil.isNotBlank(coenvwState)) { - paramMap.put("coenvwState", coenvwState); - if (queryEngDirectly) { - sql.append("AND CASE WHEN NVL(eng.DTIN, 0) = 1 THEN 1 ELSE 0 END = #{map.coenvwState} "); - } else { - sql.append("AND CASE WHEN recent.STCD IS NOT NULL THEN 1 ELSE 0 END = #{map.coenvwState} "); - } + String filterSql = buildVmsstbprptFilterCondition( + dataSourceRequest == null ? null : dataSourceRequest.getFilter(), + paramMap, + new int[]{0}, + queryEngDirectly + ); + if (StrUtil.isNotBlank(filterSql)) { + sql.append(" AND ").append(filterSql).append(" "); } + sql.append(buildVmsstbprptOrderBySql(dataSourceRequest == null ? null : dataSourceRequest.getSort(), queryEngDirectly)); -// 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); @@ -308,6 +274,25 @@ public class EnvWqDataServiceImpl implements EnvWqDataService { return result; } + 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 WqBaseInfoVo getStcdInfo(String stcd) { if (StrUtil.isBlank(stcd)) { @@ -1217,6 +1202,166 @@ public class EnvWqDataServiceImpl implements EnvWqDataService { return result; } + private String buildVmsstbprptFilterCondition(DataSourceRequest.FilterDescriptor filter, + Map paramMap, + int[] indexHolder, + boolean queryEngDirectly) { + if (filter == null) { + return ""; + } + if (StrUtil.isNotBlank(filter.getField())) { + return buildVmsstbprptLeafCondition(filter, paramMap, indexHolder, queryEngDirectly); + } + if (CollUtil.isEmpty(filter.getFilters())) { + return ""; + } + List conditions = new ArrayList<>(); + for (DataSourceRequest.FilterDescriptor child : filter.getFilters()) { + String childSql = buildVmsstbprptFilterCondition(child, paramMap, indexHolder, queryEngDirectly); + 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 buildVmsstbprptLeafCondition(DataSourceRequest.FilterDescriptor filter, + Map paramMap, + int[] indexHolder, + boolean queryEngDirectly) { + String column = mapVmsstbprptColumn(filter.getField(), queryEngDirectly); + if (StrUtil.isBlank(column)) { + return ""; + } + String operator = StrUtil.blankToDefault(filter.getOperator(), "eq").toLowerCase(); + Object value = filter.getValue(); + boolean dateField = "jcdt".equalsIgnoreCase(filter.getField()); + + if ("isnull".equals(operator)) { + return column + " IS NULL"; + } + if ("isnotnull".equals(operator)) { + return column + " IS NOT NULL"; + } + if ("in".equals(operator)) { + List values = normalizeMsstbprptValues(value); + if (values.isEmpty()) { + return ""; + } + List placeholders = new ArrayList<>(); + for (Object item : values) { + String paramKey = "vmsP" + indexHolder[0]++; + paramMap.put(paramKey, item); + placeholders.add("#{map." + paramKey + "}"); + } + return column + " IN (" + String.join(", ", placeholders) + ")"; + } + + String key = "vmsP" + indexHolder[0]++; + switch (operator) { + case "eq": + paramMap.put(key, value); + return dateField ? column + " = TO_DATE(#{map." + key + "}, 'YYYY-MM-DD HH24:MI:SS')" : column + " = #{map." + key + "}"; + case "neq": + paramMap.put(key, value); + return dateField ? column + " <> TO_DATE(#{map." + key + "}, 'YYYY-MM-DD HH24:MI:SS')" : column + " <> #{map." + key + "}"; + case "gt": + paramMap.put(key, value); + return dateField ? column + " > TO_DATE(#{map." + key + "}, 'YYYY-MM-DD HH24:MI:SS')" : column + " > #{map." + key + "}"; + case "gte": + paramMap.put(key, value); + return dateField ? column + " >= TO_DATE(#{map." + key + "}, 'YYYY-MM-DD HH24:MI:SS')" : column + " >= #{map." + key + "}"; + case "lt": + paramMap.put(key, value); + return dateField ? column + " < TO_DATE(#{map." + key + "}, 'YYYY-MM-DD HH24:MI:SS')" : column + " < #{map." + key + "}"; + case "lte": + paramMap.put(key, value); + return dateField ? column + " <= TO_DATE(#{map." + key + "}, 'YYYY-MM-DD HH24:MI:SS')" : column + " <= #{map." + key + "}"; + case "contains": + paramMap.put(key, "%" + value + "%"); + return column + " LIKE #{map." + key + "}"; + case "startswith": + paramMap.put(key, value + "%"); + return column + " LIKE #{map." + key + "}"; + case "endswith": + paramMap.put(key, "%" + value); + return column + " LIKE #{map." + key + "}"; + default: + return ""; + } + } + + private String mapVmsstbprptColumn(String field, boolean queryEngDirectly) { + if (StrUtil.isBlank(field)) { + return null; + } + if (queryEngDirectly) { + return switch (field) { + case "baseName" -> "hb.BASENAME"; + case "baseId" -> "hb.BASEID"; + case "stnm", "ennm" -> "eng.ENNM"; + case "jcdt" -> "eng.JCDT"; + case "stindx" -> "NULL"; + case "coenvwState", "dtin", "dtinType" -> "CASE WHEN NVL(eng.DTIN, 0) = 1 THEN 1 ELSE 0 END"; + case "sttpCode" -> "'ENG'"; + case "stcd", "rstcd" -> "eng.STCD"; + case "dvtp" -> "eng.DVTP"; + case "baseStepSort" -> "hb.ORDER_INDEX"; + case "hbrvcd" -> "eng.HBRVCD"; + case "rstcdStepSort", "siteStepSort" -> "eng.ORDER_INDEX"; + default -> null; + }; + } + return switch (field) { + case "baseName" -> "hb.BASENAME"; + case "baseId" -> "hb.BASEID"; + case "stnm" -> "wq.STNM"; + case "ennm" -> "eng.ENNM"; + case "jcdt" -> "wq.JCDT"; + case "stindx" -> "wq.STINDX"; + case "coenvwState" -> "CASE WHEN recent.STCD IS NOT NULL THEN 1 ELSE 0 END"; + case "sttpCode" -> "wq.STTP"; + case "stcd" -> "wq.STCD"; + case "rstcd" -> "wq.RSTCD"; + case "dvtp" -> "eng.DVTP"; + case "baseStepSort" -> "hb.ORDER_INDEX"; + case "hbrvcd" -> "eng.HBRVCD"; + case "rstcdStepSort" -> "eng.ORDER_INDEX"; + case "siteStepSort" -> "wq.ORDER_INDEX"; + case "mway" -> "wq.MWAY"; + case "dtinType" -> "wq.DTIN_TYPE"; + case "dtin" -> "wq.DTIN"; + case "isDeleted" -> "NVL(wq.IS_DELETED, 0)"; + default -> null; + }; + } + + private String buildVmsstbprptOrderBySql(List sortList, boolean queryEngDirectly) { + List orderColumns = new ArrayList<>(); + if (sortList != null) { + for (DataSourceRequest.SortDescriptor sortDescriptor : sortList) { + if (sortDescriptor == null || StrUtil.isBlank(sortDescriptor.getField())) { + continue; + } + String column = mapVmsstbprptColumn(sortDescriptor.getField(), queryEngDirectly); + if (StrUtil.isBlank(column) || "NULL".equalsIgnoreCase(column)) { + continue; + } + String dir = ("desc".equalsIgnoreCase(sortDescriptor.getDir()) || "des".equalsIgnoreCase(sortDescriptor.getDir())) ? "DESC" : "ASC"; + orderColumns.add(column + " " + dir); + } + } + if (orderColumns.isEmpty()) { + return " ORDER BY hb.ORDER_INDEX ASC NULLS LAST, eng.HBRVCD ASC NULLS LAST, eng.ORDER_INDEX ASC NULLS LAST" + + (queryEngDirectly ? ", eng.ORDER_INDEX ASC NULLS LAST" : ", wq.ORDER_INDEX ASC NULLS LAST"); + } + return " ORDER BY " + String.join(", ", orderColumns); + } + private String buildMsstbprptFilterCondition(DataSourceRequest.FilterDescriptor filter, Map paramMap, int[] indexHolder) { From 2090e6c7fe7901853445eff0e10a53d3df426b10 Mon Sep 17 00:00:00 2001 From: tangwei Date: Wed, 27 May 2026 17:38:36 +0800 Subject: [PATCH 24/38] =?UTF-8?q?fix:=20=E4=BC=98=E5=8C=96=E6=B0=B4?= =?UTF-8?q?=E6=B8=A9=E6=8E=A5=E5=8F=A3?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../env/wt/service/impl/SdWtMonitorServiceImpl.java | 9 +++++++++ 1 file changed, 9 insertions(+) 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 c4d43c1..324e338 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 @@ -500,6 +500,7 @@ public class SdWtMonitorServiceImpl implements SdWtMonitorService { DataSourceLoadOptionsBase loadOptions = dataSourceRequest.toDevRequest(); String mway = QgcQueryWrapperUtil.getFilterFieldValue(loadOptions, "mway"); String sttpCode = QgcQueryWrapperUtil.getFilterFieldValue(loadOptions, "sttpCode"); + String stcd = QgcQueryWrapperUtil.getFilterFieldValue(loadOptions, "stcd"); String rstcd = QgcQueryWrapperUtil.getFilterFieldValue(loadOptions, "rstcd"); String stnm = QgcQueryWrapperUtil.getFilterFieldValue(loadOptions, "stnm"); String coenvwState = QgcQueryWrapperUtil.getFilterFieldValue(loadOptions, "coenvwState"); @@ -575,6 +576,14 @@ public class SdWtMonitorServiceImpl implements SdWtMonitorService { sql.append("AND wt.RSTCD = #{map.rstcd} "); } } + if (stcd != null && !stcd.isBlank()) { + paramMap.put("stcd", stcd); + if (queryEngDirectly) { + sql.append("AND eng.STCD = #{map.stcd} "); + } else { + sql.append("AND wt.STCD = #{map.stcd} "); + } + } if (stnm != null && !stnm.isBlank()) { paramMap.put("stnm", "%" + stnm + "%"); if (queryEngDirectly) { From 3c01a787afa2f3125086a2ff501719b87d7915e7 Mon Sep 17 00:00:00 2001 From: tangwei Date: Wed, 27 May 2026 19:00:17 +0800 Subject: [PATCH 25/38] =?UTF-8?q?fix:=20=E4=BC=98=E5=8C=96=E6=B0=B4?= =?UTF-8?q?=E6=B8=A9=E6=8E=A5=E5=8F=A3?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../wt/controller/SdWTMonitorController.java | 2 +- .../env/wt/entity/vo/SdWtBaseInfoVO.java | 21 ++ .../env/wt/service/SdWtMonitorService.java | 2 +- .../service/impl/AlongDetailServiceImpl.java | 7 + .../wt/service/impl/AlongListServiceImpl.java | 4 + .../impl/SdDzChuiXiangListServiceImpl.java | 28 +++ .../service/impl/SdWtMonitorServiceImpl.java | 191 ++++++++++++++++-- .../wt/service/impl/SdWtvtRServiceImpl.java | 27 +++ 8 files changed, 260 insertions(+), 22 deletions(-) diff --git a/backend/src/main/java/com/yfd/platform/env/wt/controller/SdWTMonitorController.java b/backend/src/main/java/com/yfd/platform/env/wt/controller/SdWTMonitorController.java index df94029..ebad618 100644 --- a/backend/src/main/java/com/yfd/platform/env/wt/controller/SdWTMonitorController.java +++ b/backend/src/main/java/com/yfd/platform/env/wt/controller/SdWTMonitorController.java @@ -170,7 +170,7 @@ public class SdWTMonitorController { @PostMapping("/evnmAutoMonitor/GetKendoListCust") @Operation(summary = "查询水温监测数量") public ResponseResult getWTDataCount(@RequestBody(required = false) DataSourceRequest dataSourceRequest) { - return ResponseResult.successData(sdWtMonitorService.getEvnmAutoMonitorList()); + return ResponseResult.successData(sdWtMonitorService.getEvnmAutoMonitorList(dataSourceRequest)); } @PostMapping("/dwInfo/GetKendoListCust") diff --git a/backend/src/main/java/com/yfd/platform/env/wt/entity/vo/SdWtBaseInfoVO.java b/backend/src/main/java/com/yfd/platform/env/wt/entity/vo/SdWtBaseInfoVO.java index 4100526..4965624 100644 --- a/backend/src/main/java/com/yfd/platform/env/wt/entity/vo/SdWtBaseInfoVO.java +++ b/backend/src/main/java/com/yfd/platform/env/wt/entity/vo/SdWtBaseInfoVO.java @@ -17,6 +17,18 @@ public class SdWtBaseInfoVO implements Serializable { @Schema(description = "基地名称") private String baseName; + @Schema(description = "基地排序") + private Integer baseStepSort; + + @Schema(description = "流域排序") + private Integer rvcdStepSort; + + @Schema(description = "电站排序") + private Integer rstcdStepSort; + + @Schema(description = "站点排序") + private Integer siteStepSort; + @Schema(description = "站名") private String stnm; @@ -35,6 +47,12 @@ public class SdWtBaseInfoVO implements Serializable { @Schema(description = "站类") private String sttpCode; + @Schema(description = "站类名称") + private String sttpName; + + @Schema(description = "站类全路径") + private String sttpFullPath; + @Schema(description = "站码") private String stcd; @@ -49,4 +67,7 @@ public class SdWtBaseInfoVO implements Serializable { @Schema(description = "开发方式") private String dvtp; + + @Schema(description = "基地流域编码") + private String hbrvcd; } diff --git a/backend/src/main/java/com/yfd/platform/env/wt/service/SdWtMonitorService.java b/backend/src/main/java/com/yfd/platform/env/wt/service/SdWtMonitorService.java index 7f6c164..804d4a2 100644 --- a/backend/src/main/java/com/yfd/platform/env/wt/service/SdWtMonitorService.java +++ b/backend/src/main/java/com/yfd/platform/env/wt/service/SdWtMonitorService.java @@ -15,7 +15,7 @@ import java.util.List; public interface SdWtMonitorService { - DataSourceResult getEvnmAutoMonitorList(); + DataSourceResult getEvnmAutoMonitorList(DataSourceRequest dataSourceRequest); DataSourceResult getVmsstbprptList(DataSourceRequest dataSourceRequest); diff --git a/backend/src/main/java/com/yfd/platform/env/wt/service/impl/AlongDetailServiceImpl.java b/backend/src/main/java/com/yfd/platform/env/wt/service/impl/AlongDetailServiceImpl.java index 5b356d3..c52dff2 100644 --- a/backend/src/main/java/com/yfd/platform/env/wt/service/impl/AlongDetailServiceImpl.java +++ b/backend/src/main/java/com/yfd/platform/env/wt/service/impl/AlongDetailServiceImpl.java @@ -52,6 +52,7 @@ public class AlongDetailServiceImpl extends ServiceImpl list = this.microservicDynamicSQLMapper.pageAllListWithResultType(currentPage, sql.toString(), map, SdAlongDetailVO.class); diff --git a/backend/src/main/java/com/yfd/platform/env/wt/service/impl/AlongListServiceImpl.java b/backend/src/main/java/com/yfd/platform/env/wt/service/impl/AlongListServiceImpl.java index d3e9b21..aa5e216 100644 --- a/backend/src/main/java/com/yfd/platform/env/wt/service/impl/AlongListServiceImpl.java +++ b/backend/src/main/java/com/yfd/platform/env/wt/service/impl/AlongListServiceImpl.java @@ -311,6 +311,7 @@ public class AlongListServiceImpl extends ServiceImpl paramMap = new HashMap<>(); paramMap.put("stcd", stcd); paramMap.put("year", year); + paramMap.put("baseId", baseId); Page page = buildPage(loadOptions); List voList = microservicDynamicSQLMapper.pageAllListWithResultType(page, sql.toString(), paramMap, SdYearListVO.class); for (SdYearListVO vo : voList) { diff --git a/backend/src/main/java/com/yfd/platform/env/wt/service/impl/SdDzChuiXiangListServiceImpl.java b/backend/src/main/java/com/yfd/platform/env/wt/service/impl/SdDzChuiXiangListServiceImpl.java index 8fc876e..9ee64c9 100644 --- a/backend/src/main/java/com/yfd/platform/env/wt/service/impl/SdDzChuiXiangListServiceImpl.java +++ b/backend/src/main/java/com/yfd/platform/env/wt/service/impl/SdDzChuiXiangListServiceImpl.java @@ -4,6 +4,7 @@ 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.common.MicroservicDynamicSQLMapper; 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; @@ -14,6 +15,7 @@ import org.springframework.stereotype.Service; import java.util.LinkedHashMap; import java.util.List; import java.util.Map; +import java.util.HashMap; /** * 电站专题垂向水温一级面板Service实现类 @@ -27,12 +29,23 @@ public class SdDzChuiXiangListServiceImpl extends ServiceImpl(); DataSourceLoadOptionsBase loadOptions = dataSourceRequest.toDevRequest(); String stcd = QgcQueryWrapperUtil.getFilterFieldValue(loadOptions, "stcd"); String year = QgcQueryWrapperUtil.getFilterFieldValue(loadOptions, "year"); + String baseId = QgcQueryWrapperUtil.getFilterFieldValue(loadOptions, "baseId"); + + if (baseId != null && !baseId.isBlank() && !matchWtvtBaseId(stcd, baseId)) { + dataSourceResult.setData(null); + dataSourceResult.setTotal(0); + dataSourceResult.setAggregates(new LinkedHashMap<>()); + return dataSourceResult; + } int m = 12; Map> map = new LinkedHashMap<>(); @@ -45,4 +58,19 @@ public class SdDzChuiXiangListServiceImpl extends ServiceImpl paramMap = new HashMap<>(); + paramMap.put("stcd", stcd); + paramMap.put("baseId", baseId); + List> result = microservicDynamicSQLMapper.pageAllList(null, sql, paramMap); + return result != null && !result.isEmpty(); + } } 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 324e338..6a0467b 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 @@ -45,8 +45,32 @@ public class SdWtMonitorServiceImpl implements SdWtMonitorService { private MicroservicDynamicSQLMapper microservicDynamicSQLMapper; @Override - public DataSourceResult getEvnmAutoMonitorList() { - List list = sdWtMonitorMapper.getMonitorCountList(); + public DataSourceResult getEvnmAutoMonitorList(DataSourceRequest dataSourceRequest) { + DataSourceLoadOptionsBase loadOptions = dataSourceRequest == null ? null : dataSourceRequest.toDevRequest(); + String baseId = loadOptions == null ? null : QgcQueryWrapperUtil.getFilterFieldValue(loadOptions, "baseId"); + + StringBuilder sql = new StringBuilder(); + Map paramMap = new HashMap<>(); + sql.append("SELECT COUNT(1) AS cnt, 26 AS orderInx, '26' AS orderInxName, ") + .append("'ENV,ENVM,WT,' AS sttpFullPath, NULL AS sttpCode, '表层水温监测' AS sttpName ") + .append("FROM SD_WT_B_H wt ") + .append("LEFT JOIN SD_ENGINFO_B_H eng ON eng.STCD = wt.RSTCD ") + .append("WHERE NVL(wt.IS_DELETED, 0) = 0 AND wt.STTP = 'WTRV' AND wt.DTIN_TYPE = 0 "); + if (StrUtil.isNotBlank(baseId)) { + sql.append("AND eng.BASE_ID = #{map.baseId} "); + paramMap.put("baseId", baseId); + } + sql.append("UNION ALL ") + .append("SELECT COUNT(1) AS cnt, 27 AS orderInx, '27' AS orderInxName, ") + .append("'ENV,ENVM,WT,' AS sttpFullPath, NULL AS sttpCode, '垂向水温监测' AS sttpName ") + .append("FROM SD_WT_B_H wt ") + .append("LEFT JOIN SD_ENGINFO_B_H eng ON eng.STCD = wt.RSTCD ") + .append("WHERE NVL(wt.IS_DELETED, 0) = 0 AND wt.STTP = 'WTVT' AND wt.DTIN_TYPE = 0 "); + if (StrUtil.isNotBlank(baseId)) { + sql.append("AND eng.BASE_ID = #{map.baseId} "); + } + + List list = microservicDynamicSQLMapper.getAllListWithResultType(sql.toString(), paramMap, SdWtMonitorCountVO.class); DataSourceResult result = new DataSourceResult<>(); result.setData(list); result.setTotal(list == null ? 0 : list.size()); @@ -58,6 +82,7 @@ public class SdWtMonitorServiceImpl implements SdWtMonitorService { 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<>()); @@ -67,6 +92,7 @@ public class SdWtMonitorServiceImpl implements SdWtMonitorService { } StringBuilder sql = new StringBuilder(); + Map paramMap = new HashMap<>(); if ("PSB".equalsIgnoreCase(wbsType)) { sql.append("SELECT ") .append("t.BASEID AS id, ") @@ -119,6 +145,10 @@ public class SdWtMonitorServiceImpl implements SdWtMonitorService { .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 ") @@ -173,9 +203,13 @@ public class SdWtMonitorServiceImpl implements SdWtMonitorService { .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()); @@ -185,6 +219,8 @@ public class SdWtMonitorServiceImpl implements SdWtMonitorService { @Override public DataSourceResult getDfltkwFacilityCount(DataSourceRequest dataSourceRequest) { + DataSourceLoadOptionsBase loadOptions = dataSourceRequest == null ? null : dataSourceRequest.toDevRequest(); + String baseId = loadOptions == null ? null : QgcQueryWrapperUtil.getFilterFieldValue(loadOptions, "baseId"); String sql = """ SELECT c.dwtp AS dwtp, c.name AS name, @@ -213,7 +249,11 @@ public class SdWtMonitorServiceImpl implements SdWtMonitorService { SUM(CASE WHEN NVL(t.BLDSTT_CODE, 0) = 2 THEN 1 ELSE 0 END) AS buildNum, SUM(CASE WHEN NVL(t.BLDSTT_CODE, 0) = 1 THEN 1 ELSE 0 END) AS zjNum FROM SD_DFLTKW_B_H t + LEFT JOIN SD_ENGINFO_B_H eng ON eng.STCD = t.RSTCD WHERE NVL(t.IS_DELETED, 0) = 0 + """ + (StrUtil.isNotBlank(baseId) ? """ + AND eng.BASE_ID LIKE #{map.baseId} + """ : "") + """ GROUP BY CASE WHEN t.STTP = 'DW_2' THEN '1' WHEN t.STTP = 'DW_5' THEN '2' @@ -224,7 +264,11 @@ public class SdWtMonitorServiceImpl implements SdWtMonitorService { ON s.dwtp = c.dwtp ORDER BY c.sortOrder """; - List list = microservicDynamicSQLMapper.getAllListWithResultType(sql, new HashMap<>(), DfltkwFacilityCountVo.class); + Map paramMap = new HashMap<>(); + if (StrUtil.isNotBlank(baseId)) { + paramMap.put("baseId", "%" + baseId + "%"); + } + List list = microservicDynamicSQLMapper.getAllListWithResultType(sql, paramMap, DfltkwFacilityCountVo.class); DataSourceResult result = new DataSourceResult<>(); result.setData(list); result.setTotal((long) list.size()); @@ -389,6 +433,7 @@ public class SdWtMonitorServiceImpl implements SdWtMonitorService { String startTime = QgcQueryWrapperUtil.getFilterFieldValue(loadOptions, "startTime"); String endTime = QgcQueryWrapperUtil.getFilterFieldValue(loadOptions, "endTime"); String stcd = QgcQueryWrapperUtil.getFilterFieldValue(loadOptions, "stcd"); + String baseId = QgcQueryWrapperUtil.getFilterFieldValue(loadOptions, "baseId"); DataSourceResult result = new DataSourceResult<>(); if (StrUtil.isBlank(stcd) || StrUtil.isBlank(startTime) || StrUtil.isBlank(endTime)) { result.setData(new ArrayList<>()); @@ -421,13 +466,19 @@ public class SdWtMonitorServiceImpl implements SdWtMonitorService { .append("LEFT JOIN SD_WT_B_H wt ON wt.STCD = #{map.stcd} AND wt.IS_DELETED = 0 AND wt.STTP = 'WTRV' ") .append("LEFT JOIN SD_ENGINFO_B_H eng ON eng.STCD = wt.RSTCD ") .append("WHERE (t2.WT IS NOT NULL OR t3.WT IS NOT NULL) ") - .append(" AND t1.DT <= SYSDATE ") - .append("ORDER BY t1.DT DESC"); + .append(" AND t1.DT <= SYSDATE "); + if (StrUtil.isNotBlank(baseId)) { + sql.append(" AND eng.BASE_ID = #{map.baseId} "); + } + sql.append("ORDER BY t1.DT DESC"); Map paramMap = new HashMap<>(); paramMap.put("stcd", stcd); paramMap.put("startTime", startTime); paramMap.put("endTime", endTime); + if (StrUtil.isNotBlank(baseId)) { + paramMap.put("baseId", baseId); + } Page page = buildPage(dataSourceRequest.toDevRequest()); List wtFishVoList = microservicDynamicSQLMapper.pageAllListWithResultType(page, sql.toString(), paramMap, WtFishVo.class); @@ -463,6 +514,7 @@ public class SdWtMonitorServiceImpl implements SdWtMonitorService { DataSourceResult result = new DataSourceResult<>(); DataSourceLoadOptionsBase loadOptions = dataSourceRequest == null ? null : dataSourceRequest.toDevRequest(); String stcd = loadOptions == null ? null : QgcQueryWrapperUtil.getFilterFieldValue(loadOptions, "stcd"); + String baseId = loadOptions == null ? null : QgcQueryWrapperUtil.getFilterFieldValue(loadOptions, "baseId"); if (StrUtil.isBlank(stcd)) { result.setData(new ArrayList<>()); result.setTotal(0L); @@ -482,11 +534,15 @@ public class SdWtMonitorServiceImpl implements SdWtMonitorService { "WHERE NVL(t1.IS_DELETED, 0) = 0 " + " AND t1.STCD = #{map.stcd} " + " AND t1.STTP = 'WTRV' " + + (StrUtil.isNotBlank(baseId) ? " AND eng.BASE_ID = #{map.baseId} " : "") + " AND t2.PRETEMP IS NOT NULL " + " AND t2.SPAWN_MONTH IS NOT NULL " + "ORDER BY NVL(t3.ORDER_INDEX, 999999), NVL(t2.ORDER_INDEX, 999999), t2.NAME"; Map paramMap = new HashMap<>(); paramMap.put("stcd", stcd); + if (StrUtil.isNotBlank(baseId)) { + paramMap.put("baseId", baseId); + } List list = microservicDynamicSQLMapper.getAllListWithResultType(sql, paramMap, FishSpawnVo.class); fillFishSpawnInfo(list); result.setData(list); @@ -500,6 +556,8 @@ public class SdWtMonitorServiceImpl implements SdWtMonitorService { DataSourceLoadOptionsBase loadOptions = dataSourceRequest.toDevRequest(); String mway = QgcQueryWrapperUtil.getFilterFieldValue(loadOptions, "mway"); String sttpCode = QgcQueryWrapperUtil.getFilterFieldValue(loadOptions, "sttpCode"); + String sttpFullPath = QgcQueryWrapperUtil.getFilterFieldValue(loadOptions, "sttpFullPath"); + String baseId = QgcQueryWrapperUtil.getFilterFieldValue(loadOptions, "baseId"); String stcd = QgcQueryWrapperUtil.getFilterFieldValue(loadOptions, "stcd"); String rstcd = QgcQueryWrapperUtil.getFilterFieldValue(loadOptions, "rstcd"); String stnm = QgcQueryWrapperUtil.getFilterFieldValue(loadOptions, "stnm"); @@ -507,6 +565,7 @@ public class SdWtMonitorServiceImpl implements SdWtMonitorService { String dtin = QgcQueryWrapperUtil.getFilterFieldValue(loadOptions, "dtin"); StringBuilder sql = new StringBuilder(); boolean queryEngDirectly = "ENG".equalsIgnoreCase(sttpCode); + boolean queryDwDirectly = StrUtil.isNotBlank(sttpCode) && sttpCode.toUpperCase().startsWith("DW_"); if (queryEngDirectly) { sql.append("SELECT ") .append("hb.BASENAME AS baseName, ") @@ -529,10 +588,42 @@ public class SdWtMonitorServiceImpl implements SdWtMonitorService { .append("FROM SD_ENGINFO_B_H eng ") .append("LEFT JOIN SD_HYDROBASE hb ON hb.BASEID = eng.BASE_ID ") .append("WHERE 1=1 "); + } else if (queryDwDirectly) { + sql.append("SELECT ") + .append("hb.BASENAME AS baseName, ") + .append("hb.BASEID AS baseId, ") + .append("hb.ORDER_INDEX AS baseStepSort, ") +// .append("NVL(hbrv.ORDER_INDEX, 999999) AS rvcdStepSort, ") + .append("eng.ORDER_INDEX AS rstcdStepSort, ") + .append("dw.ORDER_INDEX AS siteStepSort, ") + .append("dw.STNM AS stnm, ") + .append("eng.ENNM AS ennm, ") + .append("dw.JCDT AS jcdt, ") + .append("NULL AS stindx, ") + .append("CASE WHEN NVL(dw.DTIN, 0) = 1 THEN 1 ELSE 0 END AS coenvwState, ") + .append("dw.STTP AS sttpCode, ") + .append("sttp.STTP_NAME AS sttpName, ") + .append("sttp.FULL_PATH AS sttpFullPath, ") + .append("dw.STCD AS stcd, ") + .append("dw.RSTCD AS rstcd, ") + .append("NULL AS stCode, ") + .append("NULL AS stName, ") + .append("eng.DVTP AS dvtp, ") + .append("eng.HBRVCD AS hbrvcd ") + .append("FROM SD_DFLTKW_B_H dw ") + .append("LEFT JOIN SD_ENGINFO_B_H eng ON eng.STCD = dw.RSTCD AND NVL(eng.IS_DELETED, 0) = 0 ") + .append("LEFT JOIN SD_HYDROBASE hb ON hb.BASEID = eng.BASE_ID AND NVL(hb.IS_DELETED, 0) = 0 ") + .append("LEFT JOIN SD_HBRV_DIC hbrv ON hbrv.HBRVCD = eng.HBRVCD AND hbrv.BASEID = eng.BASE_ID AND NVL(hbrv.IS_DELETED, 0) = 0 ") + .append("LEFT JOIN SD_STTP_B sttp ON sttp.STTP_CODE = dw.STTP AND NVL(sttp.IS_DELETED, 0) = 0 ") + .append("WHERE NVL(dw.IS_DELETED, 0) = 0 "); } else { sql.append("SELECT ") .append("hb.BASENAME AS baseName, ") .append("hb.BASEID AS baseId, ") + .append("hb.ORDER_INDEX AS baseStepSort, ") + .append("NVL(hbrv.ORDER_INDEX, 999999) AS rvcdStepSort, ") + .append("eng.ORDER_INDEX AS rstcdStepSort, ") + .append("wt.ORDER_INDEX AS siteStepSort, ") .append("wt.STNM AS stnm, ") .append("eng.ENNM AS ennm, ") .append("wt.JCDT AS jcdt, ") @@ -542,44 +633,61 @@ public class SdWtMonitorServiceImpl implements SdWtMonitorService { .append("WHEN wt.STTP = 'WTVT' AND vtRecent.STCD IS NOT NULL THEN 1 ") .append("ELSE 0 END AS coenvwState, ") .append("wt.STTP AS sttpCode, ") + .append("sttp.STTP_NAME AS sttpName, ") + .append("sttp.FULL_PATH AS sttpFullPath, ") .append("wt.STCD AS stcd, ") .append("wt.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("wt.ORDER_INDEX AS siteStepSort ") + .append("eng.HBRVCD AS hbrvcd ") .append("FROM SD_WT_B_H wt ") .append("LEFT JOIN SD_ENGINFO_B_H eng ON eng.STCD = wt.RSTCD ") .append("LEFT JOIN SD_HYDROBASE hb ON hb.BASEID = eng.BASE_ID ") + .append("LEFT JOIN SD_HBRV_DIC hbrv ON hbrv.HBRVCD = eng.HBRVCD AND hbrv.BASEID = eng.BASE_ID AND NVL(hbrv.IS_DELETED, 0) = 0 ") + .append("LEFT JOIN SD_STTP_B sttp ON sttp.STTP_CODE = wt.STTP AND NVL(sttp.IS_DELETED, 0) = 0 ") .append("LEFT JOIN (SELECT DISTINCT STCD FROM SD_WTRV_R WHERE IS_DELETED = 0 AND TM >= SYSDATE - 1) rvRecent ON rvRecent.STCD = wt.STCD ") .append("LEFT JOIN (SELECT DISTINCT STCD FROM SD_WTVT_R WHERE IS_DELETED = 0 AND TM >= SYSDATE - 1) vtRecent ON vtRecent.STCD = wt.STCD ") .append("WHERE wt.IS_DELETED = 0 AND wt.DTIN_TYPE = 0 "); } Map paramMap = new HashMap<>(); - if (!queryEngDirectly && mway != null && !mway.isBlank()) { + if (!queryEngDirectly && !queryDwDirectly && mway != null && !mway.isBlank()) { paramMap.put("mway", mway); sql.append("AND wt.MWAY = #{map.mway} "); } - if (!queryEngDirectly && sttpCode != null && !sttpCode.isBlank()) { + if (!queryEngDirectly && !queryDwDirectly && sttpCode != null && !sttpCode.isBlank()) { paramMap.put("sttpCode", sttpCode); sql.append("AND wt.STTP = #{map.sttpCode} "); } + if (queryDwDirectly && sttpCode != null && !sttpCode.isBlank()) { + paramMap.put("sttpCode", sttpCode); + sql.append("AND dw.STTP = #{map.sttpCode} "); + } if (rstcd != null && !rstcd.isBlank()) { paramMap.put("rstcd", rstcd); if (queryEngDirectly) { sql.append("AND eng.STCD = #{map.rstcd} "); + } else if (queryDwDirectly) { + sql.append("AND dw.RSTCD = #{map.rstcd} "); } else { sql.append("AND wt.RSTCD = #{map.rstcd} "); } } + if (baseId != null && !baseId.isBlank()) { + paramMap.put("baseId", baseId); + sql.append("AND eng.BASE_ID = #{map.baseId} "); + } + if (!queryEngDirectly && StrUtil.isNotBlank(sttpFullPath)) { + paramMap.put("sttpFullPath", "%" + sttpFullPath + "%"); + sql.append("AND sttp.FULL_PATH LIKE #{map.sttpFullPath} "); + } if (stcd != null && !stcd.isBlank()) { paramMap.put("stcd", stcd); if (queryEngDirectly) { sql.append("AND eng.STCD = #{map.stcd} "); + } else if (queryDwDirectly) { + sql.append("AND dw.STCD = #{map.stcd} "); } else { sql.append("AND wt.STCD = #{map.stcd} "); } @@ -588,6 +696,8 @@ public class SdWtMonitorServiceImpl implements SdWtMonitorService { paramMap.put("stnm", "%" + stnm + "%"); if (queryEngDirectly) { sql.append("AND eng.ENNM LIKE #{map.stnm} "); + } else if (queryDwDirectly) { + sql.append("AND dw.STNM LIKE #{map.stnm} "); } else { sql.append("AND wt.STNM LIKE #{map.stnm} "); } @@ -597,6 +707,8 @@ public class SdWtMonitorServiceImpl implements SdWtMonitorService { paramMap.put("dtin", dtin); if (queryEngDirectly) { sql.append("AND NVL(eng.DTIN, 0) = #{map.dtin} "); + } else if (queryDwDirectly) { + sql.append("AND NVL(dw.DTIN, 0) = #{map.dtin} "); } else { sql.append("AND wt.DTIN = #{map.dtin} "); } @@ -605,6 +717,8 @@ public class SdWtMonitorServiceImpl implements SdWtMonitorService { paramMap.put("coenvwState", coenvwState); if (queryEngDirectly) { sql.append("AND CASE WHEN NVL(eng.DTIN, 0) = 1 THEN 1 ELSE 0 END = #{map.coenvwState} "); + } else if (queryDwDirectly) { + sql.append("AND CASE WHEN NVL(dw.DTIN, 0) = 1 THEN 1 ELSE 0 END = #{map.coenvwState} "); } else { sql.append("AND CASE ") .append("WHEN wt.STTP = 'WTRV' AND rvRecent.STCD IS NOT NULL THEN 1 ") @@ -630,6 +744,7 @@ public class SdWtMonitorServiceImpl implements SdWtMonitorService { collectFilters(dataSourceRequest.getFilter(), filters); String stcd = null; + String baseId = null; String drtp = null; Object startTime = null; Object endTime = null; @@ -643,6 +758,8 @@ public class SdWtMonitorServiceImpl implements SdWtMonitorService { for (DataSourceRequest.FilterDescriptor filter : filters) { if ("stcd".equals(filter.getField())) { stcd = toStringValue(filter.getValue()); + } else if ("baseId".equals(filter.getField())) { + baseId = toStringValue(filter.getValue()); } else if ("drtp".equals(filter.getField())) { drtp = toStringValue(filter.getValue()); } else if ("tm".equals(filter.getField()) && "gte".equals(filter.getOperator())) { @@ -669,6 +786,9 @@ public class SdWtMonitorServiceImpl implements SdWtMonitorService { } Integer wtDeviceType = sdWtMonitorMapper.getWtDeviceTypeByStcd(stcd); + if (StrUtil.isNotBlank(baseId) && !matchWtStationBaseId(stcd, baseId, "WTVT")) { + return emptyCxDetailResult(wtDeviceType, drtp); + } StringBuilder sql = new StringBuilder(); Map paramMap = new HashMap<>(); paramMap.put("stcd", stcd); @@ -1170,6 +1290,7 @@ public class SdWtMonitorServiceImpl implements SdWtMonitorService { "t.WT AS wt, " + "t.STTP AS sttp, " + "t.STTPCODE AS sttpCode, " + + "t.BASEID AS baseId, " + "t.BEFOREWT AS beforeWt, " + "t.ACTUALTEMP AS actualTemp " + "FROM ( " + @@ -1177,6 +1298,7 @@ public class SdWtMonitorServiceImpl implements SdWtMonitorService { " t2.WT AS wt, " + " 'WT' AS sttp, " + " wt.STTP AS sttpCode, " + + " eng.BASE_ID AS baseId, " + " wt.STCD AS stcd, " + " wt.STNM AS stnm, " + " t3.WT AS beforeWt, " + @@ -1202,6 +1324,9 @@ public class SdWtMonitorServiceImpl implements SdWtMonitorService { " ON wt.STCD = #{map.stcd} " + " AND wt.STTP = 'WTRV' " + " AND NVL(wt.IS_DELETED, 0) = 0 " + + " LEFT JOIN SD_ENGINFO_B_H eng " + + " ON eng.STCD = wt.RSTCD " + +// " AND NVL(eng.IS_DELETED, 0) = 0 " + " LEFT JOIN (SELECT STCD, WT " + " FROM SD_WTNP_B " + " WHERE NVL(IS_DELETED, 0) = 0 " + @@ -1220,6 +1345,7 @@ public class SdWtMonitorServiceImpl implements SdWtMonitorService { .append("t.DT AS dt, ") .append("t.WT AS wt, ") .append("t.STTP AS sttp, ") + .append("t.BASEID AS baseId, ") .append("t.SUMVAL AS sumVal, ") .append("t.SUMCOUNT AS sumCount, ") .append("t.BEFOREWT AS beforeWt, ") @@ -1228,6 +1354,7 @@ public class SdWtMonitorServiceImpl implements SdWtMonitorService { .append(" SELECT dayData.STCD, ") .append(" wt.STNM, ") .append(" wt.RSTCD, ") + .append(" eng.BASE_ID AS baseId, ") .append(" dayData.DT, ") .append(" dayData.WT, ") .append(" np.WT AS naturalTemp, ") @@ -1246,6 +1373,7 @@ public class SdWtMonitorServiceImpl implements SdWtMonitorService { .append(" INNER JOIN SD_WT_B_H wt ON wt.STCD = dayData.STCD ") .append(" AND wt.STTP = 'WTRV' ") .append(" AND NVL(wt.IS_DELETED, 0) = 0 ") + .append(" LEFT JOIN SD_ENGINFO_B_H eng ON eng.STCD = wt.RSTCD ") .append(" LEFT JOIN ("); if (hasMonth) { sql.append("SELECT STCD, WT FROM SD_WTNP_B ") @@ -1394,6 +1522,7 @@ public class SdWtMonitorServiceImpl implements SdWtMonitorService { return switch (field) { case "stcd" -> "t.STCD"; case "stnm" -> "t.STNM"; + case "baseId" -> "t.BASEID"; case "dt" -> "t.DT"; case "wt", "actualTemp" -> "t.WT"; case "sttp" -> "t.STTP"; @@ -1506,6 +1635,7 @@ public class SdWtMonitorServiceImpl implements SdWtMonitorService { case "sttp" -> "t.STTP"; case "sttpCode" -> "t.STTPCODE"; case "stnm" -> "t.STNM"; + case "baseId" -> "t.BASEID"; default -> null; }; } @@ -1656,24 +1786,26 @@ public class SdWtMonitorServiceImpl implements SdWtMonitorService { String field = sortDescriptor.getField(); String dir = "desc".equalsIgnoreCase(sortDescriptor.getDir()) ? "DESC" : "ASC"; if ("baseStepSort".equals(field)) { - orderColumns.add("NVL(hb.ORDER_INDEX, 999999) " + dir); + orderColumns.add("NVL(baseStepSort, 999999) " + dir); + } else if ("rvcdStepSort".equals(field)) { +// orderColumns.add("NVL(rvcdStepSort, 999999) " + dir); } else if ("hbrvcd".equals(field)) { - orderColumns.add("NVL(eng.HBRVCD, '~') " + dir); + orderColumns.add("NVL(hbrvcd, '~') " + dir); } else if ("rstcdStepSort".equals(field)) { - orderColumns.add("NVL(eng.ORDER_INDEX, 999999) " + dir); + orderColumns.add("NVL(rstcdStepSort, 999999) " + dir); } else if ("siteStepSort".equals(field)) { -// orderColumns.add("NVL(wt.ORDER_INDEX, 999999) " + dir); + orderColumns.add("NVL(siteStepSort, 999999) " + dir); } else if ("stnm".equals(field)) { - orderColumns.add("wt.STNM " + dir); + orderColumns.add("NVL(stnm, '~') " + dir); } else if ("ennm".equals(field)) { - orderColumns.add("eng.ENNM " + dir); + orderColumns.add("NVL(ennm, '~') " + dir); } else if ("stcd".equals(field)) { - orderColumns.add("wt.STCD " + dir); + orderColumns.add("NVL(stcd, '~') " + dir); } } } if (orderColumns.isEmpty()) { - return " ORDER BY NVL(hb.ORDER_INDEX, 999999) ASC, NVL(eng.HBRVCD, '~') ASC, NVL(eng.ORDER_INDEX, 999999) ASC"; + return " ORDER BY NVL(baseStepSort, 999999) ASC, NVL(rstcdStepSort, 999999) ASC"; } return " ORDER BY " + String.join(", ", orderColumns); } @@ -1798,6 +1930,25 @@ public class SdWtMonitorServiceImpl implements SdWtMonitorService { .collect(Collectors.toList()); } + private boolean matchWtStationBaseId(String stcd, String baseId, String sttp) { + if (StrUtil.isBlank(stcd) || StrUtil.isBlank(baseId)) { + return true; + } + String sql = "SELECT 1 AS flag " + + "FROM SD_WT_B_H wt " + + "INNER JOIN SD_ENGINFO_B_H eng ON eng.STCD = wt.RSTCD " + + "WHERE NVL(wt.IS_DELETED, 0) = 0 " + + " AND wt.STCD = #{map.stcd} " + + " AND wt.STTP = #{map.sttp} " + + " AND eng.BASE_ID = #{map.baseId}"; + Map paramMap = new HashMap<>(); + paramMap.put("stcd", stcd); + paramMap.put("sttp", sttp); + paramMap.put("baseId", baseId); + List> list = microservicDynamicSQLMapper.pageAllList(null, sql, paramMap); + return list != null && !list.isEmpty(); + } + private void fillFishList(List wtFishVoList, List fishSpawnVoList) { if (wtFishVoList == null || wtFishVoList.isEmpty() || fishSpawnVoList == null || fishSpawnVoList.isEmpty()) { return; diff --git a/backend/src/main/java/com/yfd/platform/env/wt/service/impl/SdWtvtRServiceImpl.java b/backend/src/main/java/com/yfd/platform/env/wt/service/impl/SdWtvtRServiceImpl.java index 04b05ad..22d2868 100644 --- a/backend/src/main/java/com/yfd/platform/env/wt/service/impl/SdWtvtRServiceImpl.java +++ b/backend/src/main/java/com/yfd/platform/env/wt/service/impl/SdWtvtRServiceImpl.java @@ -4,6 +4,7 @@ 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.common.MicroservicDynamicSQLMapper; 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; @@ -12,7 +13,9 @@ import jakarta.annotation.Resource; import org.apache.commons.lang3.StringUtils; import org.springframework.stereotype.Service; +import java.util.HashMap; import java.util.List; +import java.util.Map; /** * 垂向水温Service实现类 @@ -26,21 +29,45 @@ public class SdWtvtRServiceImpl extends ServiceImpl @Resource private SdWtvtRMapper sdWtvtRMapper; + @Resource + private MicroservicDynamicSQLMapper microservicDynamicSQLMapper; + @Override public DataSourceResult getWtrvDefaultYear(DataSourceRequest dataSourceRequest) { DataSourceResult dataSourceResult = new DataSourceResult<>(); DataSourceLoadOptionsBase loadOptionsBase = dataSourceRequest.toDevRequest(); String stcd = QgcQueryWrapperUtil.getFilterFieldValue(loadOptionsBase, "stcd"); + String baseId = QgcQueryWrapperUtil.getFilterFieldValue(loadOptionsBase, "baseId"); if (StringUtils.isNotBlank(stcd)) { stcd = stcd.replaceAll("\\[", "") .replaceAll("]", "") .replaceAll("\"", ""); } + if (StringUtils.isNotBlank(baseId) && !matchWtvtBaseId(stcd, baseId)) { + dataSourceResult.setTotal(0L); + dataSourceResult.setData(List.of()); + return dataSourceResult; + } List result = sdWtvtRMapper.getWtrvDefaultYear(stcd); dataSourceResult.setTotal(result.size()); dataSourceResult.setData(result); return dataSourceResult; } + + private boolean matchWtvtBaseId(String stcd, String baseId) { + String sql = "SELECT 1 AS flag " + + "FROM SD_WT_B_H wt " + + "INNER JOIN SD_ENGINFO_B_H eng ON eng.STCD = wt.RSTCD " + + "WHERE NVL(wt.IS_DELETED, 0) = 0 " + + " AND wt.STTP = 'WTVT' " + + " AND wt.STCD = #{map.stcd} " + + " AND eng.BASE_ID = #{map.baseId}"; + Map paramMap = new HashMap<>(); + paramMap.put("stcd", stcd); + paramMap.put("baseId", baseId); + List> result = microservicDynamicSQLMapper.pageAllList(null, sql, paramMap); + return result != null && !result.isEmpty(); + } } From e47787771de211f426fa8816a3ebcb5293e53bae Mon Sep 17 00:00:00 2001 From: tangwei Date: Wed, 27 May 2026 19:13:04 +0800 Subject: [PATCH 26/38] =?UTF-8?q?fix:=20=E4=BC=98=E5=8C=96=E6=B0=B4?= =?UTF-8?q?=E6=B8=A9=E6=8E=A5=E5=8F=A3?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../yfd/platform/env/wt/entity/vo/SdWtBaseInfoVO.java | 9 +++++++++ .../env/wt/service/impl/SdWtMonitorServiceImpl.java | 6 ++++++ 2 files changed, 15 insertions(+) diff --git a/backend/src/main/java/com/yfd/platform/env/wt/entity/vo/SdWtBaseInfoVO.java b/backend/src/main/java/com/yfd/platform/env/wt/entity/vo/SdWtBaseInfoVO.java index 4965624..8513915 100644 --- a/backend/src/main/java/com/yfd/platform/env/wt/entity/vo/SdWtBaseInfoVO.java +++ b/backend/src/main/java/com/yfd/platform/env/wt/entity/vo/SdWtBaseInfoVO.java @@ -38,6 +38,15 @@ public class SdWtBaseInfoVO implements Serializable { @Schema(description = "建成日期") private Date jcdt; + @Schema(description = "开工日期") + private Date ststdt; + + @Schema(description = "建设状态") + private String bldsttCcodeName; + + @Schema(description = "接入状态") + private String dtinName; + @Schema(description = "监测指标") private String stindx; 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 6a0467b..f3d0e5d 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 @@ -592,6 +592,7 @@ public class SdWtMonitorServiceImpl implements SdWtMonitorService { sql.append("SELECT ") .append("hb.BASENAME AS baseName, ") .append("hb.BASEID AS baseId, ") + .append("dw.SWDT AS ststdt, ") .append("hb.ORDER_INDEX AS baseStepSort, ") // .append("NVL(hbrv.ORDER_INDEX, 999999) AS rvcdStepSort, ") .append("eng.ORDER_INDEX AS rstcdStepSort, ") @@ -609,6 +610,11 @@ public class SdWtMonitorServiceImpl implements SdWtMonitorService { .append("NULL AS stCode, ") .append("NULL AS stName, ") .append("eng.DVTP AS dvtp, ") + .append("CASE WHEN NVL(dw.DTIN, 0) = 1 THEN '已接入' ELSE '未接入' END AS dtinName, ") + .append("CASE ") + .append("WHEN dw.BLDSTT_CODE IN ('1', '10', '11') THEN '已建' ") + .append("WHEN dw.BLDSTT_CODE IN ('2', '7', '8') THEN '在建' ") + .append("ELSE '未建/规划' END AS bldsttCcodeName, ") .append("eng.HBRVCD AS hbrvcd ") .append("FROM SD_DFLTKW_B_H dw ") .append("LEFT JOIN SD_ENGINFO_B_H eng ON eng.STCD = dw.RSTCD AND NVL(eng.IS_DELETED, 0) = 0 ") From 2b471d58d7f93ecbfaff044f44429c6a5331b3fd Mon Sep 17 00:00:00 2001 From: tangwei Date: Thu, 28 May 2026 08:31:51 +0800 Subject: [PATCH 27/38] =?UTF-8?q?feat:=20=E6=B0=B4=E8=B4=A8=E7=9B=91?= =?UTF-8?q?=E6=B5=8B=E4=BF=A1=E6=81=AF=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 | 8 +- .../platform/env/wq/entity/vo/StTbYsVo.java | 39 ++++ .../env/wq/service/EnvWqDataService.java | 2 + .../wq/service/impl/EnvWqDataServiceImpl.java | 177 ++++++++++++++++++ 4 files changed, 222 insertions(+), 4 deletions(-) create mode 100644 backend/src/main/java/com/yfd/platform/env/wq/entity/vo/StTbYsVo.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 2283d36..b286931 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 @@ -41,10 +41,10 @@ public class EnvWqDataController { return ResponseResult.successData(null); } - @PostMapping("/GetStTbYsBVoKendoListCust") - @Operation(summary = "水质统计分析") - public ResponseResult GetStTbYsBVoKendoListCust(@RequestBody DataSourceRequest dataSourceRequest) { - return ResponseResult.successData(null); + @PostMapping("/stTbYs/GetStTbYsBVoKendoListCust") + @Operation(summary = "水质监测信息查询") + public ResponseResult getStTbYsBVoKendoListCust(@RequestBody DataSourceRequest dataSourceRequest) { + return ResponseResult.successData(envWqDataService.getStTbYsBVoKendoListCust(dataSourceRequest)); } @PostMapping("/data/noAuth/GetKendoListCust") diff --git a/backend/src/main/java/com/yfd/platform/env/wq/entity/vo/StTbYsVo.java b/backend/src/main/java/com/yfd/platform/env/wq/entity/vo/StTbYsVo.java new file mode 100644 index 0000000..21b3251 --- /dev/null +++ b/backend/src/main/java/com/yfd/platform/env/wq/entity/vo/StTbYsVo.java @@ -0,0 +1,39 @@ +package com.yfd.platform.env.wq.entity.vo; + +import io.swagger.v3.oas.annotations.media.Schema; +import lombok.Data; + +@Data +@Schema(description = "监测表要素配置") +public class StTbYsVo { + + @Schema(description = "主键") + private String id; + + @Schema(description = "所属监测表ID") + private String tbId; + + @Schema(description = "监测表名称") + private String tbName; + + @Schema(description = "监测表编码") + private String tbCode; + + @Schema(description = "备注") + private String description; + + @Schema(description = "要素编码") + private String ys; + + @Schema(description = "要素显示名称") + private String ysShowName; + + @Schema(description = "显示控制") + private String showControl; + + @Schema(description = "是否启用") + private String enable; + + @Schema(description = "排序") + private Integer orderIndex; +} 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 29ab953..a479bd8 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 @@ -19,4 +19,6 @@ public interface EnvWqDataService { WqBaseInfoVo getStcdInfo(String stcd); DataSourceResult getWbsbList(DataSourceRequest dataSourceRequest); + + 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 f9ffeca..1b59828 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 @@ -15,6 +15,7 @@ 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; @@ -1718,4 +1719,180 @@ public class EnvWqDataServiceImpl implements EnvWqDataService { result.setAggregates(new HashMap<>()); return result; } + + @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 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 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); + } } From de04f0ec497c58b77b65eb920859dae2274f956d Mon Sep 17 00:00:00 2001 From: tangwei Date: Thu, 28 May 2026 09:19:46 +0800 Subject: [PATCH 28/38] =?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 1b59828..58ec668 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 29/38] =?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 58ec668..26819e7 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 30/38] =?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 b286931..cccb91d 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 a479bd8..a2583f9 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 26819e7..251334d 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 31/38] =?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 251334d..b7bc6ab 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 32/38] =?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 cccb91d..1da75e3 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 0000000..f5c5d41 --- /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 a2583f9..15d7f2b 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 b7bc6ab..2cb5404 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 33/38] =?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 2cb5404..4f70367 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 f3d0e5d..f9af2aa 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 9db62f6..3554573 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 34/38] =?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 1da75e3..7472649 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 15d7f2b..321901d 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 4f70367..94e9c55 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 35/38] =?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 e33b271..e7b94d2 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 2b6206c..9298fd8 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 9d49a57..47c916d 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 36/38] =?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 47c916d..b52d513 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 37/38] =?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 e7b94d2..dcfac12 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 0000000..9ca7df5 --- /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 0000000..baafa01 --- /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 9298fd8..d0d5d8d 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 b52d513..af55291 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 94e9c55..883ca95 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 38/38] =?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 dcfac12..ddaa23a 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 0000000..f81decd --- /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 d0d5d8d..92b600d 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 af55291..752ca7d 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;