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/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/config/SecurityConfig.java b/backend/src/main/java/com/yfd/platform/config/SecurityConfig.java index ba6eb18..8188f10 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,9 @@ public class SecurityConfig { .requestMatchers("/eng/**").permitAll() .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 42bd358..453c5b0 100644 --- a/backend/src/main/java/com/yfd/platform/config/SwaggerConfig.java +++ b/backend/src/main/java/com/yfd/platform/config/SwaggerConfig.java @@ -56,11 +56,45 @@ public class SwaggerConfig { @Bean public GroupedOpenApi groupEnvApi() { return GroupedOpenApi.builder() - .group("3. 全过程-生态环保数据服务") + .group("3全过程-生态环保数据服务") .packagesToScan("com.yfd.platform.env.controller") .build(); } + @Bean + public GroupedOpenApi groupEnvWTApi() { + return GroupedOpenApi.builder() + .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 groupEnvFPApi() { + return GroupedOpenApi.builder() + .group("3.3 全过程-生态环保数据服务-过鱼设施") + .packagesToScan("com.yfd.platform.env.fp.controller") + .build(); + } + + @Bean + public GroupedOpenApi groupEnvFHApi() { + return GroupedOpenApi.builder() + .group("3.4 全过程-生态环保数据服务-栖息地") + .packagesToScan("com.yfd.platform.env.fh.controller") + .build(); + } + + + + @Bean public GroupedOpenApi groupEngApi() { 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/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/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/fh/controller/FhHabitatController.java b/backend/src/main/java/com/yfd/platform/env/fh/controller/FhHabitatController.java new file mode 100644 index 0000000..ddaa23a --- /dev/null +++ b/backend/src/main/java/com/yfd/platform/env/fh/controller/FhHabitatController.java @@ -0,0 +1,66 @@ +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; +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("/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) { + return ResponseResult.successData(fhHabitatService.getDefaultFhList(fhDefaultAo)); + } + + @PostMapping("/sdrvwts/GetKendoList") + @Operation(summary = "查询栖息地河道水温日统计数据") + public ResponseResult getSdrvwtsList(@RequestBody DataSourceRequest dataSourceRequest) { + 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) { + return ResponseResult.successData(fhHabitatService.getMsstbprptList(dataSourceRequest)); + } + + @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/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/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/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/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/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 new file mode 100644 index 0000000..92b600d --- /dev/null +++ b/backend/src/main/java/com/yfd/platform/env/fh/service/FhHabitatService.java @@ -0,0 +1,24 @@ +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); + + 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 new file mode 100644 index 0000000..752ca7d --- /dev/null +++ b/backend/src/main/java/com/yfd/platform/env/fh/service/impl/FhHabitatServiceImpl.java @@ -0,0 +1,1745 @@ +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.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; +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 { + + @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<>(); + 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); + } + + @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; + } + + @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 = ""; + 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(); + } + + 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); + } + + @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 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; + } + 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(); + 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) + .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(); + } +} 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 new file mode 100644 index 0000000..4b4f1ba --- /dev/null +++ b/backend/src/main/java/com/yfd/platform/env/fp/controller/FishPassageController.java @@ -0,0 +1,48 @@ +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; +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("/fp") +@Tag(name = "过鱼设施建设及运行情况") +@Validated +public class FishPassageController { + + @Resource + private FpRunService fpRunService; + + + @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)); + } + + @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/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/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/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/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/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/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/FpRunService.java b/backend/src/main/java/com/yfd/platform/env/fp/service/FpRunService.java new file mode 100644 index 0000000..da68571 --- /dev/null +++ b/backend/src/main/java/com/yfd/platform/env/fp/service/FpRunService.java @@ -0,0 +1,15 @@ +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/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; + } +} 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..d2d0e9a --- /dev/null +++ b/backend/src/main/java/com/yfd/platform/env/fp/service/impl/FpRunServiceImpl.java @@ -0,0 +1,242 @@ +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.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; +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; +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; + } + + @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, " + + " 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 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<>(); + 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/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/SdWtMonitorService.java b/backend/src/main/java/com/yfd/platform/env/service/SdWtMonitorService.java deleted file mode 100644 index 0b25e78..0000000 --- a/backend/src/main/java/com/yfd/platform/env/service/SdWtMonitorService.java +++ /dev/null @@ -1,21 +0,0 @@ -package com.yfd.platform.env.service; - -import com.yfd.platform.common.DataSourceRequest; -import com.yfd.platform.common.DataSourceResult; -import com.yfd.platform.env.entity.vo.FishSpawnVo; -import com.yfd.platform.env.entity.vo.WtrvVo; - -public interface SdWtMonitorService { - - DataSourceResult getEvnmAutoMonitorList(); - - DataSourceResult getVmsstbprptList(DataSourceRequest dataSourceRequest); - - DataSourceResult getCxDetailList(DataSourceRequest dataSourceRequest); - - DataSourceResult getWtFishAnalysis(DataSourceRequest dataSourceRequest); - - DataSourceResult getWtFishInfo(DataSourceRequest dataSourceRequest); - - WtrvVo getFlagByStcd(String stcd); -} 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; + } +} diff --git a/backend/src/main/java/com/yfd/platform/env/service/impl/SdWtMonitorServiceImpl.java b/backend/src/main/java/com/yfd/platform/env/service/impl/SdWtMonitorServiceImpl.java deleted file mode 100644 index 0cba35b..0000000 --- a/backend/src/main/java/com/yfd/platform/env/service/impl/SdWtMonitorServiceImpl.java +++ /dev/null @@ -1,800 +0,0 @@ -package com.yfd.platform.env.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.utils.QgcQueryWrapperUtil; -import jakarta.annotation.Resource; -import lombok.Data; -import org.springframework.stereotype.Service; - -import java.math.BigDecimal; -import java.util.ArrayList; -import java.util.Arrays; -import java.util.Calendar; -import java.util.Collections; -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.util.Objects; -import java.util.stream.Collectors; - -@Service -public class SdWtMonitorServiceImpl implements SdWtMonitorService { - - @Resource - private SdWtMonitorMapper sdWtMonitorMapper; - - @Resource - private MicroservicDynamicSQLMapper microservicDynamicSQLMapper; - - @Override - public DataSourceResult getEvnmAutoMonitorList() { - List list = sdWtMonitorMapper.getMonitorCountList(); - DataSourceResult result = new DataSourceResult<>(); - result.setData(list); - result.setTotal(list == null ? 0 : list.size()); - result.setAggregates(new HashMap<>()); - return result; - } - - @Override - public WtrvVo getFlagByStcd(String stcd) { - String sql = "SELECT wt.STCD AS stcd, " + - "CASE WHEN rel.ENG_IWT_CODE IS NOT NULL OR rel.ENG_DWT_CODE IS NOT NULL THEN 1 ELSE 0 END AS isIoWtrv, " + - "CASE WHEN EXISTS ( " + - " SELECT 1 FROM SD_WT_B_H vt " + - " WHERE vt.RSTCD = wt.RSTCD " + - " AND vt.STTP = 'WTVT' " + - " AND vt.IS_DELETED = 0 " + - " AND vt.MWAY = 2" + - ") THEN 1 ELSE 0 END AS hasRstcdWtvt " + - "FROM SD_WT_B_H wt " + - "LEFT JOIN SD_WTENGRLTN_B rel ON rel.STCD = wt.STCD AND rel.IS_DELETED = 0 " + - "WHERE wt.STCD = #{map.stcd} " + - " AND wt.STTP = 'WTRV' " + - " AND wt.IS_DELETED = 0"; - Map paramMap = new HashMap<>(); - paramMap.put("stcd", stcd); - WtrvVo vo = (WtrvVo) microservicDynamicSQLMapper.getOneBySqlWithResultType(sql, paramMap, WtrvVo.class); - if (vo == null ) { - return buildDefaultWtrvVo(stcd); - } - return vo; - } - - @Override - public DataSourceResult getWtFishAnalysis(DataSourceRequest dataSourceRequest) { - DataSourceLoadOptionsBase loadOptions = dataSourceRequest.toDevRequest(); - String startTime = QgcQueryWrapperUtil.getFilterFieldValue(loadOptions, "startTime"); - String endTime = QgcQueryWrapperUtil.getFilterFieldValue(loadOptions, "endTime"); - String stcd = QgcQueryWrapperUtil.getFilterFieldValue(loadOptions, "stcd"); - DataSourceResult result = new DataSourceResult<>(); - if (StrUtil.isBlank(stcd) || StrUtil.isBlank(startTime) || StrUtil.isBlank(endTime)) { - result.setData(new ArrayList<>()); - result.setTotal(0L); - result.setAggregates(new HashMap<>()); - return result; - } - - StringBuilder sql = new StringBuilder(); - sql.append("SELECT ") - .append("t1.DT AS dt, ") - .append("t2.WT AS wt, ") - .append("eng.HBRVCD AS hbrvcd, ") - .append("t3.WT AS beforeWt ") - .append("FROM (SELECT TRUNC(TO_DATE(#{map.startTime}, 'YYYY-MM-DD HH24:MI:SS')) + LEVEL - 1 AS DT ") - .append(" FROM DUAL ") - .append(" 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 ") - .append("LEFT JOIN (SELECT STCD, WT, DT FROM SD_WTRVDAY_S ") - .append(" WHERE IS_DELETED = 0 ") - .append(" AND STCD = #{map.stcd} ") - .append(" AND DT >= TO_DATE(#{map.startTime}, 'YYYY-MM-DD HH24:MI:SS') ") - .append(" AND DT <= TO_DATE(#{map.endTime}, 'YYYY-MM-DD HH24:MI:SS')) t2 ") - .append(" ON t1.DT = t2.DT ") - .append("LEFT JOIN (SELECT STCD, WT, DT FROM SD_WTRVDAY_S ") - .append(" WHERE IS_DELETED = 0 ") - .append(" AND STCD = #{map.stcd} ") - .append(" AND DT >= ADD_MONTHS(TO_DATE(#{map.startTime}, 'YYYY-MM-DD HH24:MI:SS'), -12) ") - .append(" AND DT <= ADD_MONTHS(TO_DATE(#{map.endTime}, 'YYYY-MM-DD HH24:MI:SS'), -12)) t3 ") - .append(" ON t1.DT = ADD_MONTHS(t3.DT, 12) ") - .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"); - - Map paramMap = new HashMap<>(); - paramMap.put("stcd", stcd); - paramMap.put("startTime", startTime); - paramMap.put("endTime", endTime); - - Page page = buildPage(dataSourceRequest.toDevRequest()); - List wtFishVoList = microservicDynamicSQLMapper.pageAllListWithResultType(page, sql.toString(), paramMap, WtFishVo.class); - String hbrvcd = wtFishVoList.isEmpty() ? null : wtFishVoList.get(0).getHbrvcd(); - - if (StrUtil.isNotBlank(hbrvcd)) { - String fishSql = "SELECT t1.ID AS id, " + - "t1.NAME AS name, " + - "t1.PRETEMP AS pretempStr, " + - "t1.SPAWN_MONTH AS spawnMonthStr " + - "FROM SD_FISHDICTORY_B t1 " + - "INNER JOIN SD_FISHDICTORY_RLTN_B t2 ON t1.ID = t2.ZY_FISH_ID " + - "WHERE t1.IS_DELETED = 0 " + - " AND t2.IS_DELETED = 0 " + - " AND t2.RVCD = #{map.hbrvcd} " + - " AND t1.PRETEMP IS NOT NULL " + - " AND t1.SPAWN_MONTH IS NOT NULL " + - "ORDER BY NVL(t2.ORDER_INDEX, 999999), NVL(t1.ORDER_INDEX, 999999), t1.NAME"; - Map fishParamMap = new HashMap<>(); - fishParamMap.put("hbrvcd", hbrvcd); - List fishSpawnVoList = microservicDynamicSQLMapper.getAllListWithResultType(fishSql, fishParamMap, FishSpawnVo.class); - fillFishList(wtFishVoList, fishSpawnVoList); - } - - result.setData(wtFishVoList); - result.setTotal(page != null ? page.getTotal() : wtFishVoList.size()); - result.setAggregates(new HashMap<>()); - return result; - } - - @Override - public DataSourceResult getWtFishInfo(DataSourceRequest dataSourceRequest) { - DataSourceLoadOptionsBase loadOptions = dataSourceRequest.toDevRequest(); - String stcd = QgcQueryWrapperUtil.getFilterFieldValue(loadOptions, "stcd"); - - DataSourceResult result = new DataSourceResult<>(); - if (StrUtil.isBlank(stcd)) { - result.setData(new ArrayList<>()); - result.setTotal(0L); - result.setAggregates(new HashMap<>()); - return result; - } - - String sql = "SELECT DISTINCT " + - "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 " + - "INNER JOIN SD_FISHDICTORY_B t2 ON t2.ID = t3.ZY_FISH_ID " + - "WHERE t1.STCD = #{map.stcd} " + - " AND t1.IS_DELETED = 0 " + - " AND t1.STTP = 'WTRV' " + - " AND t2.IS_DELETED = 0 " + - " AND t3.IS_DELETED = 0 " + - " AND t2.PRETEMP IS NOT NULL " + - " AND t2.SPAWN_MONTH IS NOT NULL"; - Map paramMap = new HashMap<>(); - paramMap.put("stcd", stcd); - List list = microservicDynamicSQLMapper.getAllListWithResultType(sql, paramMap, FishSpawnVo.class); - for (FishSpawnVo fishSpawnVo : list) { - fillFishSpawnMeta(fishSpawnVo); - } - result.setData(list); - result.setTotal((long) list.size()); - result.setAggregates(new HashMap<>()); - return result; - } - - @Override - public DataSourceResult getVmsstbprptList(DataSourceRequest dataSourceRequest) { - DataSourceLoadOptionsBase loadOptions = dataSourceRequest.toDevRequest(); - String mway = QgcQueryWrapperUtil.getFilterFieldValue(loadOptions, "mway"); - String sttpCode = QgcQueryWrapperUtil.getFilterFieldValue(loadOptions, "sttpCode"); - 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("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()) { - paramMap.put("mway", mway); - sql.append("AND wt.MWAY = #{map.mway} "); - } - if (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 (stnm != null && !stnm.isBlank()) { - paramMap.put("stnm", "%" + stnm + "%"); - sql.append("AND wt.STNM LIKE #{map.stnm} "); - } - 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} "); - } - - sql.append(buildVmsstbprptOrderBySql(dataSourceRequest.getSort())); - Page page = buildPage(loadOptions); - List list = microservicDynamicSQLMapper.pageAllListWithResultType(page, sql.toString(), paramMap, SdWtBaseInfoVO.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 getCxDetailList(DataSourceRequest dataSourceRequest) { - List filters = new ArrayList<>(); - collectFilters(dataSourceRequest.getFilter(), filters); - - String stcd = null; - String drtp = null; - Object startTime = null; - Object endTime = null; - Integer startYear = null; - Integer endYear = null; - Integer startMonth = null; - Integer endMonth = null; - Integer startDr = null; - Integer endDr = null; - - for (DataSourceRequest.FilterDescriptor filter : filters) { - if ("stcd".equals(filter.getField())) { - stcd = toStringValue(filter.getValue()); - } else if ("drtp".equals(filter.getField())) { - drtp = toStringValue(filter.getValue()); - } else if ("tm".equals(filter.getField()) && "gte".equals(filter.getOperator())) { - startTime = filter.getValue(); - } else if ("tm".equals(filter.getField()) && "lte".equals(filter.getOperator())) { - endTime = filter.getValue(); - } else if ("startYear".equals(filter.getField()) && "gte".equals(filter.getOperator())) { - startYear = toIntegerValue(filter.getValue()); - } else if ("endYear".equals(filter.getField()) && "lte".equals(filter.getOperator())) { - endYear = toIntegerValue(filter.getValue()); - } else if ("startMonth".equals(filter.getField()) && "gte".equals(filter.getOperator())) { - startMonth = toIntegerValue(filter.getValue()); - } else if ("endMonth".equals(filter.getField()) && "lte".equals(filter.getOperator())) { - endMonth = toIntegerValue(filter.getValue()); - } else if ("startDr".equals(filter.getField()) && "gte".equals(filter.getOperator())) { - startDr = toIntegerValue(filter.getValue()); - } else if ("endDr".equals(filter.getField()) && "lte".equals(filter.getOperator())) { - endDr = toIntegerValue(filter.getValue()); - } - } - - if (StrUtil.isBlank(stcd)) { - return null; - } - - Integer wtDeviceType = sdWtMonitorMapper.getWtDeviceTypeByStcd(stcd); - StringBuilder sql = new StringBuilder(); - Map paramMap = new HashMap<>(); - paramMap.put("stcd", stcd); - - if ("DAY".equals(drtp)) { - if (startTime == null || endTime == null) { - return emptyCxDetailResult(wtDeviceType, drtp); - } - sql.append("SELECT t1.STCD AS stcd, ") - .append("wt.STNM AS stnm, ") - .append("TO_CHAR(t1.DT, 'YYYY-MM-DD') AS dt, ") - .append("LISTAGG(TO_CHAR(t1.WTHG), ',') WITHIN GROUP(ORDER BY t1.VWT) AS wthg, ") - .append("LISTAGG(TO_CHAR(t1.VWT), ',') WITHIN GROUP(ORDER BY t1.VWT) AS vwt ") - .append("FROM SD_WTVTDAY_S t1 ") - .append("INNER JOIN SD_WT_B_H wt ON t1.STCD = wt.STCD ") - .append("WHERE t1.STCD = #{map.stcd} ") - .append("AND t1.IS_DELETED = 0 ") - .append("AND wt.IS_DELETED = 0 ") - .append("AND wt.STTP = 'WTVT' ") - .append("AND t1.DT <= #{map.endTime} ") - .append("AND t1.DT >= #{map.startTime} ") - .append("AND t1.WTHG IS NOT NULL ") - .append("AND t1.VWT IS NOT NULL ") - .append("GROUP BY t1.DT, t1.STCD, wt.STNM "); - paramMap.put("startTime", startTime); - paramMap.put("endTime", endTime); - } else if ("HOUR".equals(drtp)) { - if (startTime == null || endTime == null) { - return emptyCxDetailResult(wtDeviceType, drtp); - } - sql.append("SELECT t1.STCD AS stcd, ") - .append("wt.STNM AS stnm, ") - .append("TO_CHAR(t1.TM, 'YYYY-MM-DD HH24:MI:SS') AS dt, ") - .append("LISTAGG(TO_CHAR(t1.WTHG), ',') WITHIN GROUP(ORDER BY t1.WTHG) AS wthg, ") - .append("LISTAGG(TO_CHAR(t1.VWT), ',') WITHIN GROUP(ORDER BY t1.WTHG) AS vwt ") - .append("FROM SD_WTVT_R t1 ") - .append("INNER JOIN SD_WT_B_H wt ON t1.STCD = wt.STCD ") - .append("WHERE t1.STCD = #{map.stcd} ") - .append("AND t1.IS_DELETED = 0 ") - .append("AND wt.IS_DELETED = 0 ") - .append("AND wt.STTP = 'WTVT' ") - .append("AND t1.TM <= TO_DATE(#{map.endTime}, 'YYYY-MM-DD HH24:MI:SS') ") - .append("AND t1.TM >= TO_DATE(#{map.startTime}, 'YYYY-MM-DD HH24:MI:SS') ") - .append("AND t1.WTHG IS NOT NULL ") - .append("AND t1.VWT IS NOT NULL ") - .append("GROUP BY t1.TM, t1.STCD, wt.STNM "); - paramMap.put("startTime", startTime); - paramMap.put("endTime", endTime); - } else if ("YEAR".equals(drtp)) { - if (startYear == null || endYear == null) { - return emptyCxDetailResult(wtDeviceType, drtp); - } - sql.append("SELECT t1.STCD AS stcd, ") - .append("wt.STNM AS stnm, ") - .append("t1.YEAR || '年' AS dt, ") - .append("LISTAGG(TO_CHAR(t1.WTHG), ',') WITHIN GROUP(ORDER BY t1.WTHG) AS wthg, ") - .append("LISTAGG(TO_CHAR(t1.VWT), ',') WITHIN GROUP(ORDER BY t1.WTHG) AS vwt ") - .append("FROM SD_WTVTDRTP_S t1 ") - .append("LEFT JOIN SD_WT_B_H wt ON t1.STCD = wt.STCD ") - .append("WHERE t1.DRTP = 'YEAR' ") - .append("AND t1.STCD = #{map.stcd} ") - .append("AND t1.IS_DELETED = 0 ") - .append("AND wt.IS_DELETED = 0 ") - .append("AND wt.STTP = 'WTVT' ") - .append("AND t1.YEAR >= #{map.startYear} ") - .append("AND t1.YEAR <= #{map.endYear} ") - .append("GROUP BY t1.STCD, wt.STNM, t1.YEAR "); - paramMap.put("startYear", startYear); - paramMap.put("endYear", endYear); - } else if ("MON".equals(drtp)) { - if (startYear == null || endYear == null || startMonth == null || endMonth == null) { - return emptyCxDetailResult(wtDeviceType, drtp); - } - sql.append("SELECT t1.STCD AS stcd, ") - .append("wt.STNM AS stnm, ") - .append("t1.YEAR || '-' || LPAD(t1.MONTH, 2, '0') AS dt, ") - .append("LISTAGG(TO_CHAR(t1.WTHG), ',') WITHIN GROUP(ORDER BY t1.WTHG) AS wthg, ") - .append("LISTAGG(TO_CHAR(t1.VWT), ',') WITHIN GROUP(ORDER BY t1.WTHG) AS vwt ") - .append("FROM SD_WTVTDRTP_S t1 ") - .append("LEFT JOIN SD_WT_B_H wt ON t1.STCD = wt.STCD ") - .append("WHERE t1.DRTP = 'MON' ") - .append("AND t1.STCD = #{map.stcd} ") - .append("AND t1.IS_DELETED = 0 ") - .append("AND wt.IS_DELETED = 0 ") - .append("AND wt.STTP = 'WTVT' ") - .append("AND TO_DATE(t1.YEAR || '-' || t1.MONTH, 'YYYY-MM') >= TO_DATE(#{map.startYearMonth}, 'YYYY-MM') ") - .append("AND TO_DATE(t1.YEAR || '-' || t1.MONTH, 'YYYY-MM') <= TO_DATE(#{map.endYearMonth}, 'YYYY-MM') ") - .append("GROUP BY t1.STCD, wt.STNM, t1.YEAR, t1.MONTH "); - paramMap.put("startYearMonth", startYear + "-" + startMonth); - paramMap.put("endYearMonth", endYear + "-" + endMonth); - } else if ("QUA".equals(drtp)) { - if (startYear == null || endYear == null || startDr == null || endDr == null) { - return emptyCxDetailResult(wtDeviceType, drtp); - } - sql.append("SELECT t1.STCD AS stcd, ") - .append("wt.STNM AS stnm, ") - .append("t1.YEAR || '年' || t1.DR || '季度' AS dt, ") - .append("LISTAGG(TO_CHAR(t1.WTHG), ',') WITHIN GROUP(ORDER BY t1.WTHG) AS wthg, ") - .append("LISTAGG(TO_CHAR(t1.VWT), ',') WITHIN GROUP(ORDER BY t1.WTHG) AS vwt ") - .append("FROM SD_WTVTDRTP_S t1 ") - .append("LEFT JOIN SD_WT_B_H wt ON t1.STCD = wt.STCD ") - .append("WHERE t1.DRTP = 'QUA' ") - .append("AND t1.STCD = #{map.stcd} ") - .append("AND t1.IS_DELETED = 0 ") - .append("AND wt.IS_DELETED = 0 ") - .append("AND wt.STTP = 'WTVT' ") - .append("AND t1.YEAR >= #{map.startYear} ") - .append("AND t1.YEAR <= #{map.endYear} ") - .append("AND t1.DR >= #{map.startDr} ") - .append("AND t1.DR <= #{map.endDr} ") - .append("GROUP BY t1.STCD, wt.STNM, t1.YEAR, t1.DR "); - paramMap.put("startYear", startYear); - paramMap.put("endYear", endYear); - paramMap.put("startDr", startDr); - paramMap.put("endDr", endDr); - } else if ("TEN".equals(drtp)) { - if (startYear == null || endYear == null || startMonth == null || endMonth == null || startDr == null || endDr == null) { - return emptyCxDetailResult(wtDeviceType, drtp); - } - sql.append("SELECT t1.STCD AS stcd, ") - .append("wt.STNM AS stnm, ") - .append("t1.YEAR || '年' || t1.MONTH || '月' || CASE t1.DR WHEN 1 THEN '上' WHEN 2 THEN '中' WHEN 3 THEN '下' ELSE '' END || '旬' AS dt, ") - .append("LISTAGG(TO_CHAR(t1.WTHG), ',') WITHIN GROUP(ORDER BY t1.WTHG) AS wthg, ") - .append("LISTAGG(TO_CHAR(t1.VWT), ',') WITHIN GROUP(ORDER BY t1.WTHG) AS vwt ") - .append("FROM SD_WTVTDRTP_S t1 ") - .append("LEFT JOIN SD_WT_B_H wt ON t1.STCD = wt.STCD ") - .append("WHERE t1.DRTP = 'TEN' ") - .append("AND t1.STCD = #{map.stcd} ") - .append("AND t1.IS_DELETED = 0 ") - .append("AND wt.IS_DELETED = 0 ") - .append("AND wt.STTP = 'WTVT' ") - .append("AND t1.YEAR >= #{map.startYear} ") - .append("AND t1.YEAR <= #{map.endYear} ") - .append("AND t1.MONTH >= #{map.startMonth} ") - .append("AND t1.MONTH <= #{map.endMonth} ") - .append("AND t1.DR >= #{map.startDr} ") - .append("AND t1.DR <= #{map.endDr} ") - .append("GROUP BY t1.STCD, wt.STNM, t1.YEAR, t1.MONTH, t1.DR "); - paramMap.put("startYear", startYear); - paramMap.put("endYear", endYear); - paramMap.put("startMonth", startMonth); - paramMap.put("endMonth", endMonth); - paramMap.put("startDr", startDr); - paramMap.put("endDr", endDr); - } else { - return emptyCxDetailResult(wtDeviceType, drtp); - } - - appendCxDetailOrderBy(sql, dataSourceRequest.getSort()); - Page page = buildPage(dataSourceRequest.toDevRequest()); - List rowList = microservicDynamicSQLMapper.pageAllListWithResultType(page, sql.toString(), paramMap, WtCxDetailRow.class); - - List verticalList = getVerticals(rowList, wtDeviceType); - List> resultData = new ArrayList<>(); - for (WtCxDetailRow row : rowList) { - Map result = new LinkedHashMap<>(); - result.put("stcd", row.getStcd()); - result.put("stnm", row.getStnm()); - result.put("dt", row.getDt()); - - Map dataList = new LinkedHashMap<>(); - for (Double vertical : verticalList) { - dataList.put(Double.toString(vertical), "-"); - } - - List wthgList = splitValue(row.getWthg()); - List vwtList = splitValue(row.getVwt()); - for (int i = 0; i < wthgList.size(); i++) { - try { - Double wthg = Double.parseDouble(wthgList.get(i)); - String key = Double.toString(wthg); - String vwt = i < vwtList.size() ? vwtList.get(i) : null; - dataList.put(key, vwt); - } catch (NumberFormatException ignored) { - } - } - result.put("dataList", dataList); - resultData.add(result); - } - - List> columns = new ArrayList<>(); - columns.add(buildColumn("stnm", "测站名称", true, "stnm", false, null, null)); - String dateFormat = "yyyy-MM-dd HH:mm"; - if ("DAY".equals(drtp)) { - dateFormat = "yyyy-MM-dd"; - } else if ("MON".equals(drtp)) { - dateFormat = "yyyy-MM"; - } - columns.add(buildColumn("dt", "时间", true, "dt", false, "date", dateFormat)); - for (Double vertical : verticalList) { - String key = Double.toString(vertical); - String title = (wtDeviceType == null || wtDeviceType == 1) ? "水深" + vertical + "m(℃)" : "高程" + vertical + "m(℃)"; - columns.add(buildColumn(key, title, true, key, false, null, null)); - } - - Map table = new LinkedHashMap<>(); - table.put("columns", columns); - table.put("dataSource", resultData); - table.put("wtDeviceType", wtDeviceType); - - DataSourceResult> result = new DataSourceResult<>(); - result.setData(Collections.singletonList(table)); - result.setTotal(page != null ? page.getTotal() : rowList.size()); - result.setAggregates(new HashMap<>()); - return result; - } - - 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) { - for (DataSourceRequest.SortDescriptor sortDescriptor : sortList) { - String field = sortDescriptor.getField(); - String dir = "desc".equalsIgnoreCase(sortDescriptor.getDir()) ? "DESC" : "ASC"; - if ("baseStepSort".equals(field)) { - orderColumns.add("NVL(hb.ORDER_INDEX, 999999) " + dir); - } else if ("hbrvcd".equals(field)) { - orderColumns.add("NVL(eng.HBRVCD, '~') " + dir); - } 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); - } else if ("stnm".equals(field)) { - orderColumns.add("wt.STNM " + dir); - } else if ("ennm".equals(field)) { - orderColumns.add("eng.ENNM " + dir); - } else if ("stcd".equals(field)) { - orderColumns.add("wt.STCD " + dir); - } - } - } - 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 " + String.join(", ", orderColumns); - } - - private void collectFilters(DataSourceRequest.FilterDescriptor filter, List result) { - if (filter == null) { - return; - } - if (filter.getFilters() == null || filter.getFilters().isEmpty()) { - if (StrUtil.isNotBlank(filter.getField())) { - result.add(filter); - } - return; - } - for (DataSourceRequest.FilterDescriptor child : filter.getFilters()) { - collectFilters(child, result); - } - } - - private String toStringValue(Object value) { - return value == null ? null : String.valueOf(value); - } - - private Integer toIntegerValue(Object value) { - if (value == null || StrUtil.isBlank(String.valueOf(value))) { - return null; - } - return Integer.parseInt(String.valueOf(value)); - } - - private void appendCxDetailOrderBy(StringBuilder sql, List sortList) { - if (sortList == null || sortList.isEmpty()) { - return; - } - List orderColumns = new ArrayList<>(); - for (DataSourceRequest.SortDescriptor sortDescriptor : sortList) { - String dir = "desc".equalsIgnoreCase(sortDescriptor.getDir()) ? "DESC" : "ASC"; - if ("dt".equals(sortDescriptor.getField())) { - orderColumns.add("dt " + dir); - } else if ("stcd".equals(sortDescriptor.getField())) { - orderColumns.add("stcd " + dir); - } else if ("stnm".equals(sortDescriptor.getField())) { - orderColumns.add("stnm " + dir); - } - } - if (!orderColumns.isEmpty()) { - sql.append(" ORDER BY ").append(String.join(", ", orderColumns)); - } - } - - private List> emptyTableList(Integer wtDeviceType, String drtp) { - List> columns = new ArrayList<>(); - columns.add(buildColumn("stnm", "测站名称", true, "stnm", false, null, null)); - String dateFormat = "yyyy-MM-dd HH:mm"; - if ("DAY".equals(drtp)) { - dateFormat = "yyyy-MM-dd"; - } else if ("MON".equals(drtp)) { - dateFormat = "yyyy-MM"; - } - columns.add(buildColumn("dt", "时间", true, "dt", false, "date", dateFormat)); - Map table = new LinkedHashMap<>(); - table.put("columns", columns); - table.put("dataSource", new ArrayList<>()); - table.put("wtDeviceType", wtDeviceType); - return Collections.singletonList(table); - } - - private DataSourceResult emptyCxDetailResult(Integer wtDeviceType, String drtp) { - DataSourceResult> result = new DataSourceResult<>(); - result.setData(emptyTableList(wtDeviceType, drtp)); - result.setTotal(0); - result.setAggregates(new HashMap<>()); - return result; - } - - private Map buildColumn(String dataIndex, - String title, - boolean visible, - String key, - boolean merge, - String dataType, - String dataFormat) { - Map column = new LinkedHashMap<>(); - column.put("dataIndex", dataIndex); - column.put("title", title); - column.put("visible", visible); - column.put("key", key); - column.put("unit", null); - column.put("merge", merge); - column.put("dataType", dataType); - column.put("dataFormat", dataFormat); - column.put("children", new ArrayList<>()); - return column; - } - - private List splitValue(String value) { - if (StrUtil.isBlank(value)) { - return Collections.emptyList(); - } - String[] values = value.split(","); - List result = new ArrayList<>(values.length); - for (String item : values) { - result.add(item == null ? null : item.trim()); - } - return result; - } - - private List getVerticals(List rowList, Integer wtDeviceType) { - List verticals = new ArrayList<>(); - for (WtCxDetailRow row : rowList) { - for (String wthg : splitValue(row.getWthg())) { - try { - verticals.add(Double.parseDouble(wthg)); - } catch (NumberFormatException ignored) { - } - } - } - return verticals.stream() - .filter(Objects::nonNull) - .distinct() - .sorted((wtDeviceType == null || wtDeviceType == 1) ? Comparator.naturalOrder() : Comparator.reverseOrder()) - .collect(Collectors.toList()); - } - - private void fillFishList(List wtFishVoList, List fishSpawnVoList) { - if (wtFishVoList == null || wtFishVoList.isEmpty() || fishSpawnVoList == null || fishSpawnVoList.isEmpty()) { - return; - } - for (WtFishVo wtFishVo : wtFishVoList) { - List fishList = new ArrayList<>(); - Date dt = wtFishVo.getDt(); - BigDecimal wt = wtFishVo.getWt(); - if (dt == null || wt == null) { - wtFishVo.setFishList(fishList); - continue; - } - Calendar calendar = Calendar.getInstance(); - calendar.setTime(dt); - int month = calendar.get(Calendar.MONTH) + 1; - for (FishSpawnVo fishSpawnVo : fishSpawnVoList) { - if (!matchSpawnMonth(fishSpawnVo.getSpawnMonthStr(), month)) { - continue; - } - BigDecimal[] range = parsePretempRange(fishSpawnVo.getPretempStr()); - if (range == null) { - continue; - } - if (wt.compareTo(range[0]) >= 0 && wt.compareTo(range[1]) <= 0) { - fishList.add(fishSpawnVo); - } - } - wtFishVo.setFishList(fishList); - } - } - - private boolean matchSpawnMonth(String spawnMonthStr, int month) { - if (StrUtil.isBlank(spawnMonthStr)) { - return false; - } - for (String monthStr : spawnMonthStr.split(",")) { - if (StrUtil.isBlank(monthStr)) { - continue; - } - try { - if (Integer.parseInt(monthStr.trim()) == month) { - return true; - } - } catch (NumberFormatException ignored) { - } - } - return false; - } - - private BigDecimal[] parsePretempRange(String pretempStr) { - if (StrUtil.isBlank(pretempStr)) { - return null; - } - String temp = pretempStr.replace("℃", "").trim(); - String[] split = temp.contains("~") ? temp.split("~") : temp.split("~"); - if (split.length != 2) { - return null; - } - try { - return new BigDecimal[]{new BigDecimal(split[0].trim()), new BigDecimal(split[1].trim())}; - } catch (Exception ignored) { - return null; - } - } - - private void fillFishSpawnMeta(FishSpawnVo fishSpawnVo) { - if (fishSpawnVo == null) { - return; - } - BigDecimal[] range = parsePretempRange(fishSpawnVo.getPretempStr()); - if (range != null) { - List preTempList = new ArrayList<>(2); - preTempList.add(range[0].stripTrailingZeros().toPlainString()); - preTempList.add(range[1].stripTrailingZeros().toPlainString()); - fishSpawnVo.setPretemp(preTempList); - } - if (StrUtil.isNotBlank(fishSpawnVo.getSpawnMonthStr())) { - List spawnList = new ArrayList<>(); - for (String str : Arrays.asList(fishSpawnVo.getSpawnMonthStr().split(","))) { - if (StrUtil.isBlank(str)) { - continue; - } - String month = str.trim(); - try { - if (Integer.parseInt(month) < 10 && month.length() == 1) { - month = "0" + month; - } - } catch (NumberFormatException ignored) { - } - spawnList.add(month); - } - fishSpawnVo.setSpawnMonth(spawnList); - } - } - - private WtrvVo buildDefaultWtrvVo(String stcd) { - WtrvVo vo = new WtrvVo(); - vo.setStcd(stcd); - vo.setIsIoWtrv(false); - vo.setHasRstcdWtvt(false); - return vo; - } - - private Boolean toBooleanValue(Object value) { - if (value == null) { - return false; - } - if (value instanceof Boolean boolValue) { - return boolValue; - } - if (value instanceof Number number) { - return number.intValue() != 0; - } - String strValue = String.valueOf(value).trim(); - return "1".equals(strValue) || "true".equalsIgnoreCase(strValue) || "Y".equalsIgnoreCase(strValue); - } - - @Data - private static class WtCxDetailRow { - private String stcd; - private String dt; - private String stnm; - private String wthg; - private String vwt; - } - -} 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..7472649 --- /dev/null +++ b/backend/src/main/java/com/yfd/platform/env/wq/controller/EnvWqDataController.java @@ -0,0 +1,109 @@ +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/GetKendoListCust") + @Operation(summary = "水质明细数据查询") + public ResponseResult getDataKendoListCust(@RequestBody DataSourceRequest dataSourceRequest) { + return ResponseResult.successData(envWqDataService.processDataKendoList(dataSourceRequest)); + } + + @PostMapping("/GetStbprpYsByStcd") + @Operation(summary = "水质监测数据查询") + public ResponseResult GetStbprpYsByStcd(@RequestBody DataSourceRequest dataSourceRequest) { + return ResponseResult.successData(envWqDataService.getStbprpYsByStcd(dataSourceRequest)); + } + + + @GetMapping("/stbprp/GetStbprpYsByStcd") + @Operation(summary = "水质监测信息查询") + 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("/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) { + return ResponseResult.successData(envWqDataService.processDataKendoList(dataSourceRequest)); + } + + @PostMapping("/along/qgc/GetKendoListCust") + @Operation(summary = "查询时间范围内沿程水质最新时间的数据") + public ResponseResult getAlongWqKendoListCust(@RequestBody DataSourceRequest dataSourceRequest) { + 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) { + 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") + @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) { + 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/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/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/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/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/entity/vo/SdWtBaseInfoVO.java b/backend/src/main/java/com/yfd/platform/env/wq/entity/vo/WqVmsstbprptVo.java similarity index 63% rename from backend/src/main/java/com/yfd/platform/env/entity/vo/SdWtBaseInfoVO.java rename to backend/src/main/java/com/yfd/platform/env/wq/entity/vo/WqVmsstbprptVo.java index d329860..0a46130 100644 --- a/backend/src/main/java/com/yfd/platform/env/entity/vo/SdWtBaseInfoVO.java +++ b/backend/src/main/java/com/yfd/platform/env/wq/entity/vo/WqVmsstbprptVo.java @@ -1,4 +1,4 @@ -package com.yfd.platform.env.entity.vo; +package com.yfd.platform.env.wq.entity.vo; import io.swagger.v3.oas.annotations.media.Schema; import lombok.Data; @@ -7,11 +7,14 @@ import java.io.Serializable; import java.util.Date; @Data -@Schema(description = "水温表基本数据") -public class SdWtBaseInfoVO implements Serializable { +@Schema(description = "水质基础站点列表") +public class WqVmsstbprptVo implements Serializable { private static final long serialVersionUID = 1L; + @Schema(description = "基地Id") + private String baseId; + @Schema(description = "基地名称") private String baseName; @@ -27,7 +30,7 @@ public class SdWtBaseInfoVO implements Serializable { @Schema(description = "监测指标") private String stindx; - @Schema(description = "开展环保自动检测工作状态:1=正常 0=暂无数据") + @Schema(description = "开展环保自动监测工作状态:1=正常 0=暂无数据") private Integer coenvwState; @Schema(description = "站类") @@ -47,4 +50,16 @@ public class SdWtBaseInfoVO implements Serializable { @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 new file mode 100644 index 0000000..321901d --- /dev/null +++ b/backend/src/main/java/com/yfd/platform/env/wq/service/EnvWqDataService.java @@ -0,0 +1,30 @@ +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 processDataKendoList(DataSourceRequest dataSourceRequest); + + DataSourceResult getStbprpYsByStcd(DataSourceRequest dataSourceRequest); + + DataSourceResult getAlongWqKendoListCust(DataSourceRequest dataSourceRequest); + + DataSourceResult getAlongDefaultRvcd(DataSourceRequest dataSourceRequest); + + DataSourceResult getMsstbprptList(DataSourceRequest dataSourceRequest); + + DataSourceResult getVmsstbprptList(DataSourceRequest dataSourceRequest); + + WqBaseInfoVo getStcdInfo(String stcd); + + 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 new file mode 100644 index 0000000..883ca95 --- /dev/null +++ b/backend/src/main/java/com/yfd/platform/env/wq/service/impl/EnvWqDataServiceImpl.java @@ -0,0 +1,2317 @@ +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.Group; +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.*; +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; +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.util.Set; +import java.util.stream.Collectors; + +@Service +public class EnvWqDataServiceImpl implements EnvWqDataService { + + @Resource + private MicroservicDynamicSQLMapper microservicDynamicSQLMapper; + + @Override + public DataSourceResult processKendoList(DataSourceRequest dataSourceRequest) { + 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); + 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(toLegacyGroupResult(new GroupHelper().group(list, Arrays.asList(groupInfos)), 0)); + } + result.setTotal(0L); + result.setAggregates(new HashMap<>()); + return result; + } + + sql.append(buildEnvWqOrderBySql(dataSourceRequest.getSort())); + Page page = QgcQueryWrapperUtil.buildPage(loadOptions,loadOptions.getSkip(), loadOptions.getTake()); + 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 + public DataSourceResult processDataKendoList(DataSourceRequest dataSourceRequest) { + 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())); + Page page = QgcQueryWrapperUtil.buildPage(loadOptions,loadOptions.getSkip(), loadOptions.getTake()); + 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 + 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(); + 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; + } + + @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; + } + 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 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 (") + .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 + public DataSourceResult getMsstbprptList(DataSourceRequest dataSourceRequest) { + 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("LEFT JOIN SD_ENGINFO_B_H eng ON eng.STCD = t.RSTCD ") + .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 + public DataSourceResult getVmsstbprptList(DataSourceRequest dataSourceRequest) { + DataSourceLoadOptionsBase loadOptions = dataSourceRequest.toDevRequest(); + 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) { + 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, ") + .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("hb.BASEID AS baseID, ") + .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 = 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 "); + } + + Map paramMap = new HashMap<>(); + 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)); + + Page page = QgcQueryWrapperUtil.buildPage(loadOptions,loadOptions.getSkip(), loadOptions.getTake()); + 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; + } + + 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; + } + + 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)) { + 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 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.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 "); + } 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, " + + "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 "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 ") + .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 "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"; + case "wqSfdbCount" -> "T.WQ_SFDB_COUNT"; + case "wqSfdbHo" -> "T.WQ_SFDB_HO"; + case "wqRate" -> "T.WQ_RATE"; + default -> null; + }; + } + + 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) { + 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<>()); + result.setTotal(0L); + result.setAggregates(new HashMap<>()); + 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) { + 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 "baseId" -> "eng.BASE_ID"; + 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 ""; + } + 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 "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) { + continue; + } + if (appended) { + sql.append(", "); + } + sql.append(column).append(" ") + .append("desc".equalsIgnoreCase(sortDescriptor.getDir()) ? "DESC" : "ASC"); + appended = true; + } + 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"); + 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<>()); + emptyResult.setTotal(0L); + emptyResult.setAggregates(new HashMap<>()); + return emptyResult; + } + + StringBuilder sql = new StringBuilder(); + Map paramMap = new HashMap<>(); + 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 "); + 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 ") + .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 "); + 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(), paramMap, WbsbVo.class); + DataSourceResult result = new DataSourceResult<>(); + result.setData(list); + result.setTotal((long) list.size()); + result.setAggregates(new HashMap<>()); + return result; + } + + @Override + public DataSourceResult getStTbYsBVoKendoListCust(String stcd, String tbCode, String startTime, String endTime) { + 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) { + 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); + } +} 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 82% 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 76bd7f0..ebad618 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 @@ -144,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) { @@ -156,19 +160,43 @@ public class SdWTMonitorController { return ResponseResult.successData(this.alongListService.getYearList(dataSourceRequest)); } - - @PostMapping("/base/evnmAutoMonitor/GetKendoListCust") - @Operation(summary = "查询水温监测数量") - public ResponseResult getWTDataCount(@RequestBody(required = false) DataSourceRequest dataSourceRequest) { - return ResponseResult.successData(sdWtMonitorService.getEvnmAutoMonitorList()); + @PostMapping("/yearDetail/GetKendoListCust") + @Operation(summary = "水温年内分布二级列表") + public ResponseResult getYearDetailList(@RequestBody DataSourceRequest dataSourceRequest) { + return ResponseResult.successData(sdWtMonitorService.getYearDetailList(dataSourceRequest)); } - @PostMapping("/base/vmsstbprpt/GetKendoList") + + @PostMapping("/evnmAutoMonitor/GetKendoListCust") + @Operation(summary = "查询水温监测数量") + public ResponseResult getWTDataCount(@RequestBody(required = false) DataSourceRequest dataSourceRequest) { + return ResponseResult.successData(sdWtMonitorService.getEvnmAutoMonitorList(dataSourceRequest)); + } + + @PostMapping("/dwInfo/GetKendoListCust") + @Operation(summary = "查询低温水减缓设施数量") + public ResponseResult getDfltkwFacilityCount(@RequestBody DataSourceRequest dataSourceRequest) { + 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) { 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) { @@ -181,6 +209,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/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/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/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/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/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/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/wt/entity/vo/SdWtBaseInfoVO.java b/backend/src/main/java/com/yfd/platform/env/wt/entity/vo/SdWtBaseInfoVO.java new file mode 100644 index 0000000..8513915 --- /dev/null +++ b/backend/src/main/java/com/yfd/platform/env/wt/entity/vo/SdWtBaseInfoVO.java @@ -0,0 +1,82 @@ +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 SdWtBaseInfoVO implements Serializable { + + private static final long serialVersionUID = 1L; + + @Schema(description = "基地Id") + private String baseId; + @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; + + @Schema(description = "电站名称") + private String ennm; + + @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; + + @Schema(description = "开展环保自动检测工作状态:1=正常 0=暂无数据") + private Integer coenvwState; + + @Schema(description = "站类") + private String sttpCode; + + @Schema(description = "站类名称") + private String sttpName; + + @Schema(description = "站类全路径") + private String sttpFullPath; + + @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 String hbrvcd; +} 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/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/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/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/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/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/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/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/wt/service/SdWtMonitorService.java b/backend/src/main/java/com/yfd/platform/env/wt/service/SdWtMonitorService.java new file mode 100644 index 0000000..804d4a2 --- /dev/null +++ b/backend/src/main/java/com/yfd/platform/env/wt/service/SdWtMonitorService.java @@ -0,0 +1,41 @@ +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; +import com.yfd.platform.env.wt.entity.vo.WtrvVo; + +import java.util.List; + +public interface SdWtMonitorService { + + DataSourceResult getEvnmAutoMonitorList(DataSourceRequest dataSourceRequest); + + DataSourceResult getVmsstbprptList(DataSourceRequest dataSourceRequest); + + DataSourceResult getCxDetailList(DataSourceRequest dataSourceRequest); + + DataSourceResult getWtFishAnalysis(DataSourceRequest dataSourceRequest); + + DataSourceResult getWtFishInfo(DataSourceRequest dataSourceRequest); + + WtrvVo getFlagByStcd(String stcd); + + DataSourceResult getWbsbList(DataSourceRequest dataSourceRequest); + + DataSourceResult getDfltkwFacilityCount(DataSourceRequest dataSourceRequest); + + DataSourceResult getSttpbList(DataSourceRequest dataSourceRequest); + + DataSourceResult getYearDetailList(DataSourceRequest dataSourceRequest); + + DataSourceResult getMonthDetailList(DataSourceRequest dataSourceRequest); + + List getWtvtDefaultTreeStcd(DataSourceRequest dataSourceRequest); +} 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 97% 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..c52dff2 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; @@ -50,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/service/impl/AlongListServiceImpl.java b/backend/src/main/java/com/yfd/platform/env/wt/service/impl/AlongListServiceImpl.java similarity index 96% 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..aa5e216 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<>(); @@ -312,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/service/impl/SdDzChuiXiangListServiceImpl.java b/backend/src/main/java/com/yfd/platform/env/wt/service/impl/SdDzChuiXiangListServiceImpl.java similarity index 53% 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..9ee64c9 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,20 +1,21 @@ -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.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; import com.yfd.platform.utils.QgcQueryWrapperUtil; -import com.yfd.platform.utils.QueryWrapperUtil; import jakarta.annotation.Resource; import org.springframework.stereotype.Service; import java.util.LinkedHashMap; import java.util.List; import java.util.Map; +import java.util.HashMap; /** * 电站专题垂向水温一级面板Service实现类 @@ -28,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<>(); @@ -46,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/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/wt/service/impl/SdWtMonitorServiceImpl.java b/backend/src/main/java/com/yfd/platform/env/wt/service/impl/SdWtMonitorServiceImpl.java new file mode 100644 index 0000000..f9af2aa --- /dev/null +++ b/backend/src/main/java/com/yfd/platform/env/wt/service/impl/SdWtMonitorServiceImpl.java @@ -0,0 +1,2086 @@ +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.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; +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; +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; +import jakarta.annotation.Resource; +import lombok.Data; +import org.springframework.stereotype.Service; + +import java.math.BigDecimal; +import java.util.ArrayList; +import java.util.Calendar; +import java.util.Collections; +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.util.Objects; +import java.util.stream.Collectors; + +@Service +public class SdWtMonitorServiceImpl implements SdWtMonitorService { + + @Resource + private SdWtMonitorMapper sdWtMonitorMapper; + + @Resource + private MicroservicDynamicSQLMapper microservicDynamicSQLMapper; + + @Override + 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()); + result.setAggregates(new HashMap<>()); + return result; + } + + @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<>()); + emptyResult.setTotal(0L); + emptyResult.setAggregates(new HashMap<>()); + return emptyResult; + } + + StringBuilder sql = new StringBuilder(); + Map paramMap = new HashMap<>(); + 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 "); + 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 ") + .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 "); + 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(), paramMap, WbsbVo.class); + DataSourceResult result = new DataSourceResult<>(); + result.setData(list); + result.setTotal((long) list.size()); + result.setAggregates(new HashMap<>()); + return result; + } + + @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, + 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 + 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' + WHEN t.STTP = 'DW_6' THEN '3' + ELSE '4' + END + ) s + ON s.dwtp = c.dwtp + ORDER BY c.sortOrder + """; + 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()); + result.setAggregates(new HashMap<>()); + 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())); + 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); + 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(); + 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 = 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()); + 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 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 = QgcQueryWrapperUtil.buildPage(loadOptions,loadOptions.getSkip(), loadOptions.getTake()); + 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, " + + "CASE WHEN rel.ENG_IWT_CODE IS NOT NULL OR rel.ENG_DWT_CODE IS NOT NULL THEN 1 ELSE 0 END AS isIoWtrv, " + + "CASE WHEN EXISTS ( " + + " SELECT 1 FROM SD_WT_B_H vt " + + " WHERE vt.RSTCD = wt.RSTCD " + + " AND vt.STTP = 'WTVT' " + + " AND vt.IS_DELETED = 0 " + + " AND vt.MWAY = 2" + + ") THEN 1 ELSE 0 END AS hasRstcdWtvt " + + "FROM SD_WT_B_H wt " + + "LEFT JOIN SD_WTENGRLTN_B rel ON rel.STCD = wt.STCD AND rel.IS_DELETED = 0 " + + "WHERE wt.STCD = #{map.stcd} " + + " AND wt.STTP = 'WTRV' " + + " AND wt.IS_DELETED = 0"; + Map paramMap = new HashMap<>(); + paramMap.put("stcd", stcd); + WtrvVo vo = (WtrvVo) microservicDynamicSQLMapper.getOneBySqlWithResultType(sql, paramMap, WtrvVo.class); + if (vo == null ) { + return buildDefaultWtrvVo(stcd); + } + return vo; + } + + @Override + public DataSourceResult getWtFishAnalysis(DataSourceRequest dataSourceRequest) { + DataSourceLoadOptionsBase loadOptions = dataSourceRequest.toDevRequest(); + 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<>()); + result.setTotal(0L); + result.setAggregates(new HashMap<>()); + return result; + } + + StringBuilder sql = new StringBuilder(); + sql.append("SELECT ") + .append("t1.DT AS dt, ") + .append("t2.WT AS wt, ") + .append("eng.HBRVCD AS hbrvcd, ") + .append("t3.WT AS beforeWt ") + .append("FROM (SELECT TRUNC(TO_DATE(#{map.startTime}, 'YYYY-MM-DD HH24:MI:SS')) + LEVEL - 1 AS DT ") + .append(" FROM DUAL ") + .append(" 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 ") + .append("LEFT JOIN (SELECT STCD, WT, DT FROM SD_WTRVDAY_S ") + .append(" WHERE IS_DELETED = 0 ") + .append(" AND STCD = #{map.stcd} ") + .append(" AND DT >= TO_DATE(#{map.startTime}, 'YYYY-MM-DD HH24:MI:SS') ") + .append(" AND DT <= TO_DATE(#{map.endTime}, 'YYYY-MM-DD HH24:MI:SS')) t2 ") + .append(" ON t1.DT = t2.DT ") + .append("LEFT JOIN (SELECT STCD, WT, DT FROM SD_WTRVDAY_S ") + .append(" WHERE IS_DELETED = 0 ") + .append(" AND STCD = #{map.stcd} ") + .append(" AND DT >= ADD_MONTHS(TO_DATE(#{map.startTime}, 'YYYY-MM-DD HH24:MI:SS'), -12) ") + .append(" AND DT <= ADD_MONTHS(TO_DATE(#{map.endTime}, 'YYYY-MM-DD HH24:MI:SS'), -12)) t3 ") + .append(" ON t1.DT = ADD_MONTHS(t3.DT, 12) ") + .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 "); + 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 = 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(); + + if (StrUtil.isNotBlank(hbrvcd)) { + String fishSql = "SELECT t1.ID AS id, " + + "t1.NAME AS name, " + + "t1.PRETEMP AS pretempStr, " + + "t1.SPAWN_MONTH AS spawnMonthStr " + + "FROM SD_FISHDICTORY_B t1 " + + "INNER JOIN SD_FISHDICTORY_RLTN_B t2 ON t1.ID = t2.ZY_FISH_ID " + + "WHERE t1.IS_DELETED = 0 " + + " AND t2.IS_DELETED = 0 " + + " AND t2.RVCD = #{map.hbrvcd} " + + " AND t1.PRETEMP IS NOT NULL " + + " AND t1.SPAWN_MONTH IS NOT NULL " + + "ORDER BY NVL(t2.ORDER_INDEX, 999999), NVL(t1.ORDER_INDEX, 999999), t1.NAME"; + Map fishParamMap = new HashMap<>(); + fishParamMap.put("hbrvcd", hbrvcd); + List fishSpawnVoList = microservicDynamicSQLMapper.getAllListWithResultType(fishSql, fishParamMap, FishSpawnVo.class); + fillFishList(wtFishVoList, fishSpawnVoList); + } + + result.setData(wtFishVoList); + result.setTotal(page != null ? page.getTotal() : wtFishVoList.size()); + result.setAggregates(new HashMap<>()); + 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"); + String baseId = loadOptions == null ? null : QgcQueryWrapperUtil.getFilterFieldValue(loadOptions, "baseId"); + 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' " + + (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); + result.setTotal((long) list.size()); + result.setAggregates(new HashMap<>()); + return result; + } + + @Override + public DataSourceResult getVmsstbprptList(DataSourceRequest dataSourceRequest) { + 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"); + String coenvwState = QgcQueryWrapperUtil.getFilterFieldValue(loadOptions, "coenvwState"); + 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, ") + .append("hb.BASEID AS baseId, ") + .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 if (queryDwDirectly) { + 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, ") + .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("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 ") + .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, ") + .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("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("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 && !queryDwDirectly && mway != null && !mway.isBlank()) { + paramMap.put("mway", mway); + sql.append("AND wt.MWAY = #{map.mway} "); + } + 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} "); + } + } + if (stnm != null && !stnm.isBlank()) { + 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} "); + } + } + + if (StrUtil.isNotBlank(dtin)) { + 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} "); + } + } + if (coenvwState != null && !coenvwState.isBlank()) { + 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 ") + .append("WHEN wt.STTP = 'WTVT' AND vtRecent.STCD IS NOT NULL THEN 1 ") + .append("ELSE 0 END = #{map.coenvwState} "); + } + } + + sql.append(buildVmsstbprptOrderBySql(dataSourceRequest.getSort())); + Page page = QgcQueryWrapperUtil.buildPage(loadOptions,loadOptions.getSkip(), loadOptions.getTake()); + List list = microservicDynamicSQLMapper.pageAllListWithResultType(page, sql.toString(), paramMap, SdWtBaseInfoVO.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 getCxDetailList(DataSourceRequest dataSourceRequest) { + List filters = new ArrayList<>(); + collectFilters(dataSourceRequest.getFilter(), filters); + + String stcd = null; + String baseId = null; + String drtp = null; + Object startTime = null; + Object endTime = null; + Integer startYear = null; + Integer endYear = null; + Integer startMonth = null; + Integer endMonth = null; + Integer startDr = null; + Integer endDr = null; + + 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())) { + startTime = filter.getValue(); + } else if ("tm".equals(filter.getField()) && "lte".equals(filter.getOperator())) { + endTime = filter.getValue(); + } else if ("startYear".equals(filter.getField()) && "gte".equals(filter.getOperator())) { + startYear = toIntegerValue(filter.getValue()); + } else if ("endYear".equals(filter.getField()) && "lte".equals(filter.getOperator())) { + endYear = toIntegerValue(filter.getValue()); + } else if ("startMonth".equals(filter.getField()) && "gte".equals(filter.getOperator())) { + startMonth = toIntegerValue(filter.getValue()); + } else if ("endMonth".equals(filter.getField()) && "lte".equals(filter.getOperator())) { + endMonth = toIntegerValue(filter.getValue()); + } else if ("startDr".equals(filter.getField()) && "gte".equals(filter.getOperator())) { + startDr = toIntegerValue(filter.getValue()); + } else if ("endDr".equals(filter.getField()) && "lte".equals(filter.getOperator())) { + endDr = toIntegerValue(filter.getValue()); + } + } + + if (StrUtil.isBlank(stcd)) { + return null; + } + + 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); + + if ("DAY".equals(drtp)) { + if (startTime == null || endTime == null) { + return emptyCxDetailResult(wtDeviceType, drtp); + } + sql.append("SELECT t1.STCD AS stcd, ") + .append("wt.STNM AS stnm, ") + .append("TO_CHAR(t1.DT, 'YYYY-MM-DD') AS dt, ") + .append("LISTAGG(TO_CHAR(t1.WTHG), ',') WITHIN GROUP(ORDER BY t1.VWT) AS wthg, ") + .append("LISTAGG(TO_CHAR(t1.VWT), ',') WITHIN GROUP(ORDER BY t1.VWT) AS vwt ") + .append("FROM SD_WTVTDAY_S t1 ") + .append("INNER JOIN SD_WT_B_H wt ON t1.STCD = wt.STCD ") + .append("WHERE t1.STCD = #{map.stcd} ") + .append("AND t1.IS_DELETED = 0 ") + .append("AND wt.IS_DELETED = 0 ") + .append("AND wt.STTP = 'WTVT' ") + .append("AND t1.DT <= #{map.endTime} ") + .append("AND t1.DT >= #{map.startTime} ") + .append("AND t1.WTHG IS NOT NULL ") + .append("AND t1.VWT IS NOT NULL ") + .append("GROUP BY t1.DT, t1.STCD, wt.STNM "); + paramMap.put("startTime", startTime); + paramMap.put("endTime", endTime); + } else if ("HOUR".equals(drtp)) { + if (startTime == null || endTime == null) { + return emptyCxDetailResult(wtDeviceType, drtp); + } + sql.append("SELECT t1.STCD AS stcd, ") + .append("wt.STNM AS stnm, ") + .append("TO_CHAR(t1.TM, 'YYYY-MM-DD HH24:MI:SS') AS dt, ") + .append("LISTAGG(TO_CHAR(t1.WTHG), ',') WITHIN GROUP(ORDER BY t1.WTHG) AS wthg, ") + .append("LISTAGG(TO_CHAR(t1.VWT), ',') WITHIN GROUP(ORDER BY t1.WTHG) AS vwt ") + .append("FROM SD_WTVT_R t1 ") + .append("INNER JOIN SD_WT_B_H wt ON t1.STCD = wt.STCD ") + .append("WHERE t1.STCD = #{map.stcd} ") + .append("AND t1.IS_DELETED = 0 ") + .append("AND wt.IS_DELETED = 0 ") + .append("AND wt.STTP = 'WTVT' ") + .append("AND t1.TM <= TO_DATE(#{map.endTime}, 'YYYY-MM-DD HH24:MI:SS') ") + .append("AND t1.TM >= TO_DATE(#{map.startTime}, 'YYYY-MM-DD HH24:MI:SS') ") + .append("AND t1.WTHG IS NOT NULL ") + .append("AND t1.VWT IS NOT NULL ") + .append("GROUP BY t1.TM, t1.STCD, wt.STNM "); + paramMap.put("startTime", startTime); + paramMap.put("endTime", endTime); + } else if ("YEAR".equals(drtp)) { + if (startYear == null || endYear == null) { + return emptyCxDetailResult(wtDeviceType, drtp); + } + sql.append("SELECT t1.STCD AS stcd, ") + .append("wt.STNM AS stnm, ") + .append("t1.YEAR || '年' AS dt, ") + .append("LISTAGG(TO_CHAR(t1.WTHG), ',') WITHIN GROUP(ORDER BY t1.WTHG) AS wthg, ") + .append("LISTAGG(TO_CHAR(t1.VWT), ',') WITHIN GROUP(ORDER BY t1.WTHG) AS vwt ") + .append("FROM SD_WTVTDRTP_S t1 ") + .append("LEFT JOIN SD_WT_B_H wt ON t1.STCD = wt.STCD ") + .append("WHERE t1.DRTP = 'YEAR' ") + .append("AND t1.STCD = #{map.stcd} ") + .append("AND t1.IS_DELETED = 0 ") + .append("AND wt.IS_DELETED = 0 ") + .append("AND wt.STTP = 'WTVT' ") + .append("AND t1.YEAR >= #{map.startYear} ") + .append("AND t1.YEAR <= #{map.endYear} ") + .append("GROUP BY t1.STCD, wt.STNM, t1.YEAR "); + paramMap.put("startYear", startYear); + paramMap.put("endYear", endYear); + } else if ("MON".equals(drtp)) { + if (startYear == null || endYear == null || startMonth == null || endMonth == null) { + return emptyCxDetailResult(wtDeviceType, drtp); + } + sql.append("SELECT t1.STCD AS stcd, ") + .append("wt.STNM AS stnm, ") + .append("t1.YEAR || '-' || LPAD(t1.MONTH, 2, '0') AS dt, ") + .append("LISTAGG(TO_CHAR(t1.WTHG), ',') WITHIN GROUP(ORDER BY t1.WTHG) AS wthg, ") + .append("LISTAGG(TO_CHAR(t1.VWT), ',') WITHIN GROUP(ORDER BY t1.WTHG) AS vwt ") + .append("FROM SD_WTVTDRTP_S t1 ") + .append("LEFT JOIN SD_WT_B_H wt ON t1.STCD = wt.STCD ") + .append("WHERE t1.DRTP = 'MON' ") + .append("AND t1.STCD = #{map.stcd} ") + .append("AND t1.IS_DELETED = 0 ") + .append("AND wt.IS_DELETED = 0 ") + .append("AND wt.STTP = 'WTVT' ") + .append("AND TO_DATE(t1.YEAR || '-' || t1.MONTH, 'YYYY-MM') >= TO_DATE(#{map.startYearMonth}, 'YYYY-MM') ") + .append("AND TO_DATE(t1.YEAR || '-' || t1.MONTH, 'YYYY-MM') <= TO_DATE(#{map.endYearMonth}, 'YYYY-MM') ") + .append("GROUP BY t1.STCD, wt.STNM, t1.YEAR, t1.MONTH "); + paramMap.put("startYearMonth", startYear + "-" + startMonth); + paramMap.put("endYearMonth", endYear + "-" + endMonth); + } else if ("QUA".equals(drtp)) { + if (startYear == null || endYear == null || startDr == null || endDr == null) { + return emptyCxDetailResult(wtDeviceType, drtp); + } + sql.append("SELECT t1.STCD AS stcd, ") + .append("wt.STNM AS stnm, ") + .append("t1.YEAR || '年' || t1.DR || '季度' AS dt, ") + .append("LISTAGG(TO_CHAR(t1.WTHG), ',') WITHIN GROUP(ORDER BY t1.WTHG) AS wthg, ") + .append("LISTAGG(TO_CHAR(t1.VWT), ',') WITHIN GROUP(ORDER BY t1.WTHG) AS vwt ") + .append("FROM SD_WTVTDRTP_S t1 ") + .append("LEFT JOIN SD_WT_B_H wt ON t1.STCD = wt.STCD ") + .append("WHERE t1.DRTP = 'QUA' ") + .append("AND t1.STCD = #{map.stcd} ") + .append("AND t1.IS_DELETED = 0 ") + .append("AND wt.IS_DELETED = 0 ") + .append("AND wt.STTP = 'WTVT' ") + .append("AND t1.YEAR >= #{map.startYear} ") + .append("AND t1.YEAR <= #{map.endYear} ") + .append("AND t1.DR >= #{map.startDr} ") + .append("AND t1.DR <= #{map.endDr} ") + .append("GROUP BY t1.STCD, wt.STNM, t1.YEAR, t1.DR "); + paramMap.put("startYear", startYear); + paramMap.put("endYear", endYear); + paramMap.put("startDr", startDr); + paramMap.put("endDr", endDr); + } else if ("TEN".equals(drtp)) { + if (startYear == null || endYear == null || startMonth == null || endMonth == null || startDr == null || endDr == null) { + return emptyCxDetailResult(wtDeviceType, drtp); + } + sql.append("SELECT t1.STCD AS stcd, ") + .append("wt.STNM AS stnm, ") + .append("t1.YEAR || '年' || t1.MONTH || '月' || CASE t1.DR WHEN 1 THEN '上' WHEN 2 THEN '中' WHEN 3 THEN '下' ELSE '' END || '旬' AS dt, ") + .append("LISTAGG(TO_CHAR(t1.WTHG), ',') WITHIN GROUP(ORDER BY t1.WTHG) AS wthg, ") + .append("LISTAGG(TO_CHAR(t1.VWT), ',') WITHIN GROUP(ORDER BY t1.WTHG) AS vwt ") + .append("FROM SD_WTVTDRTP_S t1 ") + .append("LEFT JOIN SD_WT_B_H wt ON t1.STCD = wt.STCD ") + .append("WHERE t1.DRTP = 'TEN' ") + .append("AND t1.STCD = #{map.stcd} ") + .append("AND t1.IS_DELETED = 0 ") + .append("AND wt.IS_DELETED = 0 ") + .append("AND wt.STTP = 'WTVT' ") + .append("AND t1.YEAR >= #{map.startYear} ") + .append("AND t1.YEAR <= #{map.endYear} ") + .append("AND t1.MONTH >= #{map.startMonth} ") + .append("AND t1.MONTH <= #{map.endMonth} ") + .append("AND t1.DR >= #{map.startDr} ") + .append("AND t1.DR <= #{map.endDr} ") + .append("GROUP BY t1.STCD, wt.STNM, t1.YEAR, t1.MONTH, t1.DR "); + paramMap.put("startYear", startYear); + paramMap.put("endYear", endYear); + paramMap.put("startMonth", startMonth); + paramMap.put("endMonth", endMonth); + paramMap.put("startDr", startDr); + paramMap.put("endDr", endDr); + } else { + return emptyCxDetailResult(wtDeviceType, drtp); + } + + appendCxDetailOrderBy(sql, dataSourceRequest.getSort()); + 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); + List> resultData = new ArrayList<>(); + for (WtCxDetailRow row : rowList) { + Map result = new LinkedHashMap<>(); + result.put("stcd", row.getStcd()); + result.put("stnm", row.getStnm()); + result.put("dt", row.getDt()); + + Map dataList = new LinkedHashMap<>(); + for (Double vertical : verticalList) { + dataList.put(Double.toString(vertical), "-"); + } + + List wthgList = splitValue(row.getWthg()); + List vwtList = splitValue(row.getVwt()); + for (int i = 0; i < wthgList.size(); i++) { + try { + Double wthg = Double.parseDouble(wthgList.get(i)); + String key = Double.toString(wthg); + String vwt = i < vwtList.size() ? vwtList.get(i) : null; + dataList.put(key, vwt); + } catch (NumberFormatException ignored) { + } + } + result.put("dataList", dataList); + resultData.add(result); + } + + List> columns = new ArrayList<>(); + columns.add(buildColumn("stnm", "测站名称", true, "stnm", false, null, null)); + String dateFormat = "yyyy-MM-dd HH:mm"; + if ("DAY".equals(drtp)) { + dateFormat = "yyyy-MM-dd"; + } else if ("MON".equals(drtp)) { + dateFormat = "yyyy-MM"; + } + columns.add(buildColumn("dt", "时间", true, "dt", false, "date", dateFormat)); + for (Double vertical : verticalList) { + String key = Double.toString(vertical); + String title = (wtDeviceType == null || wtDeviceType == 1) ? "水深" + vertical + "m(℃)" : "高程" + vertical + "m(℃)"; + columns.add(buildColumn(key, title, true, key, false, null, null)); + } + + Map table = new LinkedHashMap<>(); + table.put("columns", columns); + table.put("dataSource", resultData); + table.put("wtDeviceType", wtDeviceType); + + DataSourceResult> result = new DataSourceResult<>(); + result.setData(Collections.singletonList(table)); + result.setTotal(page != null ? page.getTotal() : rowList.size()); + result.setAggregates(new HashMap<>()); + 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 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 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.BASEID AS baseId, " + + "t.BEFOREWT AS beforeWt, " + + "t.ACTUALTEMP AS actualTemp " + + "FROM ( " + + " SELECT t1.DT, " + + " 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, " + + " 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 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 " + + " 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, ") + .append("t.STNM AS stnm, ") + .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, ") + .append("t.NATURALTEMP AS naturalTemp ") + .append("FROM (") + .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, ") + .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 SD_ENGINFO_B_H eng ON eng.STCD = wt.RSTCD ") + .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 "baseId" -> "t.BASEID"; + 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 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"; + case "baseId" -> "t.BASEID"; + 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) { + 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 String buildVmsstbprptOrderBySql(List sortList) { + List orderColumns = new ArrayList<>(); + if (sortList != null) { + for (DataSourceRequest.SortDescriptor sortDescriptor : sortList) { + String field = sortDescriptor.getField(); + String dir = "desc".equalsIgnoreCase(sortDescriptor.getDir()) ? "DESC" : "ASC"; + if ("baseStepSort".equals(field)) { + 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(hbrvcd, '~') " + dir); + } else if ("rstcdStepSort".equals(field)) { + orderColumns.add("NVL(rstcdStepSort, 999999) " + dir); + } else if ("siteStepSort".equals(field)) { + orderColumns.add("NVL(siteStepSort, 999999) " + dir); + } else if ("stnm".equals(field)) { + orderColumns.add("NVL(stnm, '~') " + dir); + } else if ("ennm".equals(field)) { + orderColumns.add("NVL(ennm, '~') " + dir); + } else if ("stcd".equals(field)) { + orderColumns.add("NVL(stcd, '~') " + dir); + } + } + } + if (orderColumns.isEmpty()) { + return " ORDER BY NVL(baseStepSort, 999999) ASC, NVL(rstcdStepSort, 999999) ASC"; + } + return " ORDER BY " + String.join(", ", orderColumns); + } + + private void collectFilters(DataSourceRequest.FilterDescriptor filter, List result) { + if (filter == null) { + return; + } + if (filter.getFilters() == null || filter.getFilters().isEmpty()) { + if (StrUtil.isNotBlank(filter.getField())) { + result.add(filter); + } + return; + } + for (DataSourceRequest.FilterDescriptor child : filter.getFilters()) { + collectFilters(child, result); + } + } + + private String toStringValue(Object value) { + return value == null ? null : String.valueOf(value); + } + + private Integer toIntegerValue(Object value) { + if (value == null || StrUtil.isBlank(String.valueOf(value))) { + return null; + } + return Integer.parseInt(String.valueOf(value)); + } + + private void appendCxDetailOrderBy(StringBuilder sql, List sortList) { + if (sortList == null || sortList.isEmpty()) { + return; + } + List orderColumns = new ArrayList<>(); + for (DataSourceRequest.SortDescriptor sortDescriptor : sortList) { + String dir = "desc".equalsIgnoreCase(sortDescriptor.getDir()) ? "DESC" : "ASC"; + if ("dt".equals(sortDescriptor.getField())) { + orderColumns.add("dt " + dir); + } else if ("stcd".equals(sortDescriptor.getField())) { + orderColumns.add("stcd " + dir); + } else if ("stnm".equals(sortDescriptor.getField())) { + orderColumns.add("stnm " + dir); + } + } + if (!orderColumns.isEmpty()) { + sql.append(" ORDER BY ").append(String.join(", ", orderColumns)); + } + } + + private List> emptyTableList(Integer wtDeviceType, String drtp) { + List> columns = new ArrayList<>(); + columns.add(buildColumn("stnm", "测站名称", true, "stnm", false, null, null)); + String dateFormat = "yyyy-MM-dd HH:mm"; + if ("DAY".equals(drtp)) { + dateFormat = "yyyy-MM-dd"; + } else if ("MON".equals(drtp)) { + dateFormat = "yyyy-MM"; + } + columns.add(buildColumn("dt", "时间", true, "dt", false, "date", dateFormat)); + Map table = new LinkedHashMap<>(); + table.put("columns", columns); + table.put("dataSource", new ArrayList<>()); + table.put("wtDeviceType", wtDeviceType); + return Collections.singletonList(table); + } + + private DataSourceResult emptyCxDetailResult(Integer wtDeviceType, String drtp) { + DataSourceResult> result = new DataSourceResult<>(); + result.setData(emptyTableList(wtDeviceType, drtp)); + result.setTotal(0); + result.setAggregates(new HashMap<>()); + return result; + } + + private Map buildColumn(String dataIndex, + String title, + boolean visible, + String key, + boolean merge, + String dataType, + String dataFormat) { + Map column = new LinkedHashMap<>(); + column.put("dataIndex", dataIndex); + column.put("title", title); + column.put("visible", visible); + column.put("key", key); + column.put("unit", null); + column.put("merge", merge); + column.put("dataType", dataType); + column.put("dataFormat", dataFormat); + column.put("children", new ArrayList<>()); + return column; + } + + private List splitValue(String value) { + if (StrUtil.isBlank(value)) { + return Collections.emptyList(); + } + String[] values = value.split(","); + List result = new ArrayList<>(values.length); + for (String item : values) { + result.add(item == null ? null : item.trim()); + } + return result; + } + + private List getVerticals(List rowList, Integer wtDeviceType) { + List verticals = new ArrayList<>(); + for (WtCxDetailRow row : rowList) { + for (String wthg : splitValue(row.getWthg())) { + try { + verticals.add(Double.parseDouble(wthg)); + } catch (NumberFormatException ignored) { + } + } + } + return verticals.stream() + .filter(Objects::nonNull) + .distinct() + .sorted((wtDeviceType == null || wtDeviceType == 1) ? Comparator.naturalOrder() : Comparator.reverseOrder()) + .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; + } + for (WtFishVo wtFishVo : wtFishVoList) { + List fishList = new ArrayList<>(); + Date dt = wtFishVo.getDt(); + BigDecimal wt = wtFishVo.getWt(); + if (dt == null || wt == null) { + wtFishVo.setFishList(fishList); + continue; + } + Calendar calendar = Calendar.getInstance(); + calendar.setTime(dt); + int month = calendar.get(Calendar.MONTH) + 1; + for (FishSpawnVo fishSpawnVo : fishSpawnVoList) { + if (!matchSpawnMonth(fishSpawnVo.getSpawnMonthStr(), month)) { + continue; + } + BigDecimal[] range = parsePretempRange(fishSpawnVo.getPretempStr()); + if (range == null) { + continue; + } + if (wt.compareTo(range[0]) >= 0 && wt.compareTo(range[1]) <= 0) { + fishList.add(fishSpawnVo); + } + } + wtFishVo.setFishList(fishList); + } + } + + 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; + } + for (String monthStr : spawnMonthStr.split(",")) { + if (StrUtil.isBlank(monthStr)) { + continue; + } + try { + if (Integer.parseInt(monthStr.trim()) == month) { + return true; + } + } catch (NumberFormatException ignored) { + } + } + 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; + } + String temp = pretempStr.replace("℃", "").trim(); + String[] split = temp.contains("~") ? temp.split("~") : temp.split("~"); + if (split.length != 2) { + return null; + } + try { + return new BigDecimal[]{new BigDecimal(split[0].trim()), new BigDecimal(split[1].trim())}; + } catch (Exception ignored) { + return null; + } + } + + private WtrvVo buildDefaultWtrvVo(String stcd) { + WtrvVo vo = new WtrvVo(); + vo.setStcd(stcd); + vo.setIsIoWtrv(false); + vo.setHasRstcdWtvt(false); + return vo; + } + + private Boolean toBooleanValue(Object value) { + if (value == null) { + return false; + } + if (value instanceof Boolean boolValue) { + return boolValue; + } + if (value instanceof Number number) { + return number.intValue() != 0; + } + String strValue = String.valueOf(value).trim(); + return "1".equals(strValue) || "true".equalsIgnoreCase(strValue) || "Y".equalsIgnoreCase(strValue); + } + + @Data + private static class WtCxDetailRow { + private String stcd; + private String dt; + private String stnm; + private String wthg; + private String vwt; + } + + @Data + private static class WtTreeNodeEnnmRow { + private String stcd; + private String ennm; + } + +} 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 50% 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..22d2868 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,19 +1,21 @@ -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.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; 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; +import java.util.HashMap; import java.util.List; +import java.util.Map; /** * 垂向水温Service实现类 @@ -27,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(); + } } 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"); 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()) {