From 8293a2f9f5a9bb6a9fc043106e8a114dcf3d03b7 Mon Sep 17 00:00:00 2001 From: tangwei Date: Wed, 20 May 2026 09:07:53 +0800 Subject: [PATCH] =?UTF-8?q?feat:=20=E8=8E=B7=E5=8F=96=E5=9E=82=E5=90=91?= =?UTF-8?q?=E6=B0=B4=E6=B8=A9=E6=9C=89=E6=95=B0=E6=8D=AE=E7=9A=84=E5=B9=B4?= =?UTF-8?q?=E4=BB=BD?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../SdDzChuiXiangListController.java | 36 -- .../controller/SdRvwtSInOutOneController.java | 41 -- .../env/controller/SdWTMonitorController.java | 66 ++- .../platform/env/entity/vo/FishSpawnVo.java | 21 + .../yfd/platform/env/entity/vo/WtFishVo.java | 21 + .../env/mapper/SdRvwtSInOutOneMapper.java | 10 +- .../env/mapper/SdWtMonitorMapper.java | 4 + .../env/service/AlongListService.java | 3 +- .../env/service/SdWtMonitorService.java | 4 + .../service/impl/AlongListServiceImpl.java | 209 +++++++ .../impl/SdRvwtSInOutOneServiceImpl.java | 2 +- .../service/impl/SdWtMonitorServiceImpl.java | 538 ++++++++++++++++++ 12 files changed, 867 insertions(+), 88 deletions(-) delete mode 100644 backend/src/main/java/com/yfd/platform/env/controller/SdDzChuiXiangListController.java delete mode 100644 backend/src/main/java/com/yfd/platform/env/controller/SdRvwtSInOutOneController.java create mode 100644 backend/src/main/java/com/yfd/platform/env/entity/vo/FishSpawnVo.java create mode 100644 backend/src/main/java/com/yfd/platform/env/entity/vo/WtFishVo.java diff --git a/backend/src/main/java/com/yfd/platform/env/controller/SdDzChuiXiangListController.java b/backend/src/main/java/com/yfd/platform/env/controller/SdDzChuiXiangListController.java deleted file mode 100644 index 2b8d028..0000000 --- a/backend/src/main/java/com/yfd/platform/env/controller/SdDzChuiXiangListController.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.SdDzChuiXiangListService; -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/dzCxList") -@Tag(name = "电站专题垂向水温一级面板") -@Validated -public class SdDzChuiXiangListController { - - @Resource - private SdDzChuiXiangListService sdDzChuiXiangListService; - - @PostMapping({"/GetKendoListCust"}) - @Operation(summary = "电站专题垂向水温一级面板数据列表") - public ResponseResult getKendoListCust(@RequestBody DataSourceRequest dataSourceRequest) { - return ResponseResult.successData(sdDzChuiXiangListService.processKendoList(dataSourceRequest)); - } -} diff --git a/backend/src/main/java/com/yfd/platform/env/controller/SdRvwtSInOutOneController.java b/backend/src/main/java/com/yfd/platform/env/controller/SdRvwtSInOutOneController.java deleted file mode 100644 index 0fcc63c..0000000 --- a/backend/src/main/java/com/yfd/platform/env/controller/SdRvwtSInOutOneController.java +++ /dev/null @@ -1,41 +0,0 @@ -package com.yfd.platform.env.controller; - -import com.yfd.platform.common.DataSourceRequest; -import com.yfd.platform.config.ResponseResult; -import com.yfd.platform.env.service.SdRvwtSInOutOneService; -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("/sw/inOutOne") -@Tag(name = "出入库水温一级折线图") -@Validated -public class SdRvwtSInOutOneController { - - @Resource - private SdRvwtSInOutOneService sdRvwtSInOutOneService; - - @PostMapping("/GetKendoListCust") - @Operation(summary = "查询出入库水温一级列表") - public ResponseResult getKendoListCust(@RequestBody DataSourceRequest dataSourceRequest) { - return ResponseResult.successData(sdRvwtSInOutOneService.processKendoList(dataSourceRequest)); - } - - @PostMapping("/details") - @Operation(summary = "一次性返回出库水温和入库水温详情") - public ResponseResult getDetails(@RequestBody DataSourceRequest dataSourceRequest) { - return ResponseResult.successData(sdRvwtSInOutOneService.getDetails(dataSourceRequest)); - } - - @PostMapping("/default/stcd") - @Operation(summary = "获取出入库水温默认有数据的电站") - public ResponseResult getDefaultStcd(@RequestBody DataSourceRequest dataSourceRequest) { - return ResponseResult.successData(sdRvwtSInOutOneService.getDefaultStcd(dataSourceRequest)); - } -} diff --git a/backend/src/main/java/com/yfd/platform/env/controller/SdWTMonitorController.java b/backend/src/main/java/com/yfd/platform/env/controller/SdWTMonitorController.java index cacba4d..e367a43 100644 --- a/backend/src/main/java/com/yfd/platform/env/controller/SdWTMonitorController.java +++ b/backend/src/main/java/com/yfd/platform/env/controller/SdWTMonitorController.java @@ -9,9 +9,7 @@ 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.AlongDetailService; -import com.yfd.platform.env.service.AlongListService; -import com.yfd.platform.env.service.SdWtMonitorService; +import com.yfd.platform.env.service.*; import com.yfd.platform.utils.QgcQueryWrapperUtil; import io.swagger.v3.oas.annotations.Operation; import io.swagger.v3.oas.annotations.tags.Tag; @@ -39,6 +37,15 @@ public class SdWTMonitorController { @Resource private SdWtMonitorService sdWtMonitorService; + @Resource + private SdRvwtSInOutOneService sdRvwtSInOutOneService; + + @Resource + private SdDzChuiXiangListService sdDzChuiXiangListService; + + @Resource + private SdWtvtRService sdWtvtRService; + @PostMapping("/alongDetail/GetKendoListCust") @Operation(summary = "查询沿程水温变化二级数据列表") @@ -121,7 +128,7 @@ public class SdWTMonitorController { @PostMapping({"/alongList/default/rvcd"}) @Operation(summary = "获取沿程水温变化默认有数据的河流") - public ResponseResult getDefaultStcd(@RequestBody DataSourceRequest dataSourceRequest) { + public ResponseResult getDefaultRVCD(@RequestBody DataSourceRequest dataSourceRequest) { return ResponseResult.successData(alongListService.getDefaultRvcd(dataSourceRequest)); } @@ -131,6 +138,12 @@ public class SdWTMonitorController { return ResponseResult.successData(this.alongListService.getALongKendoListCust(dataSourceRequest)); } + @PostMapping("/monthList/avgMon/GetKendoListCust") + @Operation(summary = "获取月平均水温历史对比数据") + public ResponseResult getMonthKendoListCust(@RequestBody DataSourceRequest dataSourceRequest) { + return ResponseResult.successData(this.alongListService.getMonthKendoListCust(dataSourceRequest)); + } + @PostMapping("/base/evnmAutoMonitor/GetKendoListCust") @Operation(summary = "查询水温监测数量") @@ -143,4 +156,49 @@ public class SdWTMonitorController { public ResponseResult getVmsstbprptList(@RequestBody DataSourceRequest dataSourceRequest) { return ResponseResult.successData(sdWtMonitorService.getVmsstbprptList(dataSourceRequest)); } + + @PostMapping("/cxDetail/GetKendoListCust") + @Operation(summary = "查询垂向水温明细") + public ResponseResult getCxDetailList(@RequestBody DataSourceRequest dataSourceRequest) { + return ResponseResult.successData(sdWtMonitorService.getCxDetailList(dataSourceRequest)); + } + + @PostMapping("/wtvt/defaultYear/GetKendoListCust") + @Operation(summary = "获取垂向水温有数据的年份") + public ResponseResult getWtrvDefaultYear(@RequestBody DataSourceRequest dataSourceRequest) { + return ResponseResult.successData(sdWtvtRService.getWtrvDefaultYear(dataSourceRequest)); + } + + @PostMapping("/wtrv/fish/GetKendoListCust") + @Operation(summary = "鱼类繁殖适宜性分析") + public ResponseResult getWtFishAnalysis(@RequestBody DataSourceRequest dataSourceRequest) { + return ResponseResult.successData(sdWtMonitorService.getWtFishAnalysis(dataSourceRequest)); + } + + + @PostMapping("/inOutOne/GetKendoListCust") + @Operation(summary = "查询出入库水温一级列表") + public ResponseResult getOneLevelCust(@RequestBody DataSourceRequest dataSourceRequest) { + return ResponseResult.successData(sdRvwtSInOutOneService.processKendoList(dataSourceRequest)); + } + + @PostMapping("/inOutOne/details") + @Operation(summary = "一次性返回出库水温和入库水温详情") + public ResponseResult getDetails(@RequestBody DataSourceRequest dataSourceRequest) { + return ResponseResult.successData(sdRvwtSInOutOneService.getDetails(dataSourceRequest)); + } + + @PostMapping("/inOutOne/default/stcd") + @Operation(summary = "获取出入库水温默认有数据的电站") + public ResponseResult getDefaultStcd(@RequestBody DataSourceRequest dataSourceRequest) { + return ResponseResult.successData(sdRvwtSInOutOneService.getDefaultStcd(dataSourceRequest)); + } + + + + @PostMapping({"/dzCxList/GetKendoListCust"}) + @Operation(summary = "电站专题垂向水温一级面板数据列表") + public ResponseResult getOneLevelListCust(@RequestBody DataSourceRequest dataSourceRequest) { + return ResponseResult.successData(sdDzChuiXiangListService.processKendoList(dataSourceRequest)); + } } diff --git a/backend/src/main/java/com/yfd/platform/env/entity/vo/FishSpawnVo.java b/backend/src/main/java/com/yfd/platform/env/entity/vo/FishSpawnVo.java new file mode 100644 index 0000000..0cd81a8 --- /dev/null +++ b/backend/src/main/java/com/yfd/platform/env/entity/vo/FishSpawnVo.java @@ -0,0 +1,21 @@ +package com.yfd.platform.env.entity.vo; + +import lombok.Data; + +import java.util.List; + +@Data +public class FishSpawnVo { + + private String id; + + private String name; + + private String spawnMonthStr; + + private List spawnMonth; + + private String pretempStr; + + private List pretemp; +} diff --git a/backend/src/main/java/com/yfd/platform/env/entity/vo/WtFishVo.java b/backend/src/main/java/com/yfd/platform/env/entity/vo/WtFishVo.java new file mode 100644 index 0000000..e068481 --- /dev/null +++ b/backend/src/main/java/com/yfd/platform/env/entity/vo/WtFishVo.java @@ -0,0 +1,21 @@ +package com.yfd.platform.env.entity.vo; + +import lombok.Data; + +import java.math.BigDecimal; +import java.util.Date; +import java.util.List; + +@Data +public class WtFishVo { + + private Date dt; + + private BigDecimal wt; + + private BigDecimal beforeWt; + + private String hbrvcd; + + private List fishList; +} diff --git a/backend/src/main/java/com/yfd/platform/env/mapper/SdRvwtSInOutOneMapper.java b/backend/src/main/java/com/yfd/platform/env/mapper/SdRvwtSInOutOneMapper.java index 8c695a1..fb61d66 100644 --- a/backend/src/main/java/com/yfd/platform/env/mapper/SdRvwtSInOutOneMapper.java +++ b/backend/src/main/java/com/yfd/platform/env/mapper/SdRvwtSInOutOneMapper.java @@ -23,10 +23,8 @@ public interface SdRvwtSInOutOneMapper extends BaseMapper { "SELECT * FROM (", " SELECT eng.STCD AS stcd, eng.ENNM AS stnm", " FROM SD_ENGINFO_B_H eng", - " INNER JOIN SD_PRWTRLTN_B rel ON rel.STCD = eng.STCD AND rel.IS_DELETED = 0", " WHERE eng.USFL = 1", " AND eng.DTIN = 1", - " AND (rel.ENG_IWT_CODE IS NOT NULL OR rel.ENG_DWT_CODE IS NOT NULL)", " ", " AND eng.BASE_ID IN", " ", @@ -41,9 +39,11 @@ public interface SdRvwtSInOutOneMapper extends BaseMapper { " ", " AND EXISTS (", " SELECT 1", - " FROM SD_WTRVDAY_S dayData", - " WHERE dayData.IS_DELETED = 0", - " AND (dayData.STCD = rel.ENG_IWT_CODE OR dayData.STCD = rel.ENG_DWT_CODE)", + " FROM SD_WTENGRLTN_B rel", + " INNER JOIN SD_WT_B_H wt ON wt.STCD = rel.STCD AND wt.IS_DELETED = 0 AND wt.STTP = 'WTRV'", + " INNER JOIN SD_WTRVDAY_S dayData ON dayData.STCD = rel.STCD AND dayData.IS_DELETED = 0", + " WHERE rel.IS_DELETED = 0", + " AND (rel.ENG_IWT_CODE = eng.STCD OR rel.ENG_DWT_CODE = eng.STCD)", " ", " AND dayData.DT BETWEEN #{startTime} AND #{endTime}", " ", diff --git a/backend/src/main/java/com/yfd/platform/env/mapper/SdWtMonitorMapper.java b/backend/src/main/java/com/yfd/platform/env/mapper/SdWtMonitorMapper.java index d28af1b..258a0f8 100644 --- a/backend/src/main/java/com/yfd/platform/env/mapper/SdWtMonitorMapper.java +++ b/backend/src/main/java/com/yfd/platform/env/mapper/SdWtMonitorMapper.java @@ -2,6 +2,7 @@ package com.yfd.platform.env.mapper; import com.yfd.platform.env.entity.vo.SdWtMonitorCountVO; import org.apache.ibatis.annotations.Mapper; +import org.apache.ibatis.annotations.Param; import org.apache.ibatis.annotations.Select; import java.util.List; @@ -19,4 +20,7 @@ public interface SdWtMonitorMapper { "FROM SD_WT_B_H " + "WHERE IS_DELETED = 0 AND STTP = 'WTVT' AND DTIN_TYPE = 0") List getMonitorCountList(); + + @Select("SELECT WT_DEVICE_TYPE FROM SD_WT_B_H WHERE STCD = #{stcd} AND IS_DELETED = 0") + Integer getWtDeviceTypeByStcd(@Param("stcd") String stcd); } diff --git a/backend/src/main/java/com/yfd/platform/env/service/AlongListService.java b/backend/src/main/java/com/yfd/platform/env/service/AlongListService.java index 8cb241d..eb77b65 100644 --- a/backend/src/main/java/com/yfd/platform/env/service/AlongListService.java +++ b/backend/src/main/java/com/yfd/platform/env/service/AlongListService.java @@ -18,4 +18,5 @@ public interface AlongListService { Map getWtLimit(DataSourceRequest dataSourceRequest); DataSourceResult getDefaultRvcd(@RequestBody DataSourceRequest dataSourceRequest); DataSourceResult getALongKendoListCust(DataSourceRequest dataSourceRequest); -} \ No newline at end of file + DataSourceResult getMonthKendoListCust(DataSourceRequest dataSourceRequest); +} 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 index 3f38c99..9150e8e 100644 --- a/backend/src/main/java/com/yfd/platform/env/service/SdWtMonitorService.java +++ b/backend/src/main/java/com/yfd/platform/env/service/SdWtMonitorService.java @@ -8,4 +8,8 @@ public interface SdWtMonitorService { DataSourceResult getEvnmAutoMonitorList(); DataSourceResult getVmsstbprptList(DataSourceRequest dataSourceRequest); + + DataSourceResult getCxDetailList(DataSourceRequest dataSourceRequest); + + DataSourceResult getWtFishAnalysis(DataSourceRequest dataSourceRequest); } diff --git a/backend/src/main/java/com/yfd/platform/env/service/impl/AlongListServiceImpl.java b/backend/src/main/java/com/yfd/platform/env/service/impl/AlongListServiceImpl.java index aeaa877..e23470b 100644 --- a/backend/src/main/java/com/yfd/platform/env/service/impl/AlongListServiceImpl.java +++ b/backend/src/main/java/com/yfd/platform/env/service/impl/AlongListServiceImpl.java @@ -1,11 +1,14 @@ package com.yfd.platform.env.service.impl; 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.DataSourceLoadOptionsBase; import com.yfd.platform.common.DataSourceRequest; import com.yfd.platform.common.DataSourceResult; 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.mapper.AlongListMapper; @@ -34,6 +37,8 @@ public class AlongListServiceImpl extends ServiceImpl(); + List filters = new ArrayList<>(); + collectFilters(dataSourceRequest.getFilter(), filters); + + String rvcd = null; + String baseId = null; + Object startTime = null; + Object endTime = null; + Integer year = null; + Integer month = null; + for (DataSourceRequest.FilterDescriptor filter : filters) { + if ("rvcd".equals(filter.getField())) { + rvcd = toStringValue(filter.getValue()); + } else if ("baseId".equals(filter.getField())) { + baseId = toStringValue(filter.getValue()); + } else if ("year".equals(filter.getField())) { + year = toIntegerValue(filter.getValue()); + } else if ("month".equals(filter.getField())) { + month = toIntegerValue(filter.getValue()); + } else if ("tm".equals(filter.getField()) && "gte".equalsIgnoreCase(filter.getOperator())) { + startTime = filter.getValue(); + } else if ("tm".equals(filter.getField()) && "lte".equalsIgnoreCase(filter.getOperator())) { + endTime = filter.getValue(); + } + } + + if (year == null || month == null) { + dataSourceResult.setData(new ArrayList<>()); + dataSourceResult.setTotal(0L); + return dataSourceResult; + } + + int beforeYear = year - 1; + StringBuilder sql = new StringBuilder(); + sql.append("SELECT t1.stcd, t1.rstcd, t1.sttp, t1.temperature, t1.tm, t1.stnm, t1.engDwtCode, ") + .append("W.WT AS actualTemp, M.WT AS lastTemp, R.WT AS naturalTemp ") + .append("FROM (") + .append("SELECT t.stcd, t.rstcd, t.rvcd, t.sttp, t.temperature, t.tm, t.rvcdSort, t.sort, t.stnm, t.engDwtCode, ") + .append("RANK() OVER (PARTITION BY t.stcd ORDER BY t.tm DESC NULLS LAST) AS rank ") + .append("FROM (") + .append("SELECT SARC.STCD AS stcd, ") + .append("SARC.RSTCD AS rstcd, ") + .append("MAB.RVCD AS rvcd, ") + .append("MAB.ORDER_INDEX AS rvcdSort, ") + .append("SARC.SORT AS sort, ") + .append("CASE WHEN SARC.STTP = 'ENG' THEN '1' WHEN SARC.STTP = 'WTRV' THEN '2' END AS sttp, ") + .append("SWR.WT AS temperature, ") + .append("SWR.TM AS tm, ") + .append("CASE WHEN SARC.STTP = 'ENG' THEN ENG.ENNM ELSE WT.STNM END AS stnm, ") + .append("REL.ENG_DWT_CODE AS engDwtCode ") + .append("FROM MS_ALONG_B MAB ") + .append("INNER JOIN MS_ALONGDET_B SARC ON MAB.ID = SARC.ALONG_ID ") + .append("LEFT JOIN SD_ENGINFO_B_H ENG ON ENG.STCD = SARC.STCD ") + .append("LEFT JOIN SD_WT_B_H WT ON WT.STCD = SARC.STCD AND WT.IS_DELETED = 0 AND WT.STTP = 'WTRV' ") + .append("LEFT JOIN SD_WTENGRLTN_B REL ON REL.STCD = SARC.STCD AND REL.IS_DELETED = 0 ") + .append("LEFT JOIN SD_WTRV_R SWR ON SWR.STCD = SARC.STCD AND SWR.IS_DELETED = 0 "); + if (startTime != null) { + sql.append("AND SWR.TM >= TO_DATE(#{map.startTime}, 'YYYY-MM-DD HH24:MI:SS') "); + } + if (endTime != null) { + sql.append("AND SWR.TM <= TO_DATE(#{map.endTime}, 'YYYY-MM-DD HH24:MI:SS') "); + } + sql.append("WHERE MAB.CODE = 'common' ") + .append("AND MAB.IS_DELETED = 0 ") + .append("AND SARC.IS_DELETED = 0 ") + .append("AND (SARC.STTP = 'ENG' OR (SARC.STTP = 'WTRV' AND REL.ENG_DWT_CODE IS NOT NULL)) "); + if (StrUtil.isNotBlank(rvcd)) { + sql.append("AND MAB.RVCD = #{map.rvcd} "); + } + if (StrUtil.isNotBlank(baseId)) { + sql.append("AND MAB.RVCD IN (SELECT HBRVCD FROM SD_HBRV_DIC WHERE IS_DELETED = 0 AND ENABLED = 1 AND BASEID = #{map.baseId}) "); + } + sql.append(") t ") + .append(") t1 ") + .append("LEFT JOIN (") + .append("SELECT s.STCD, s.WT ") + .append("FROM SD_WTRVDRTP_S s ") + .append("INNER JOIN SD_WT_B_H wtMon ON wtMon.STCD = s.STCD AND wtMon.IS_DELETED = 0 AND wtMon.STTP = 'WTRV' AND wtMon.USFL = 1 AND wtMon.MWAY = 2 ") + .append("WHERE s.IS_DELETED = 0 AND s.DRTP = 'MON' AND s.YEAR = #{map.year} AND s.MONTH = #{map.month}") + .append(") W ON t1.STCD = W.STCD ") + .append("LEFT JOIN (") + .append("SELECT s.STCD, s.WT ") + .append("FROM SD_WTRVDRTP_S s ") + .append("INNER JOIN SD_WT_B_H wtMon ON wtMon.STCD = s.STCD AND wtMon.IS_DELETED = 0 AND wtMon.STTP = 'WTRV' AND wtMon.USFL = 1 AND wtMon.MWAY = 2 ") + .append("WHERE s.IS_DELETED = 0 AND s.DRTP = 'MON' AND s.YEAR = #{map.beforeYear} AND s.MONTH = #{map.month}") + .append(") M ON t1.STCD = M.STCD ") + .append("LEFT JOIN (") + .append("SELECT STCD, WT FROM SD_WTNP_B WHERE IS_DELETED = 0 AND WTTP = 1 AND MNTH = #{map.month}") + .append(") R ON t1.STCD = R.STCD ") + .append("WHERE t1.rank = 1 ") + .append("ORDER BY t1.rvcdSort ASC, t1.sort ASC"); + + Map paramMap = new HashMap<>(); + paramMap.put("rvcd", rvcd); + paramMap.put("baseId", baseId); + paramMap.put("startTime", startTime); + paramMap.put("endTime", endTime); + paramMap.put("year", year); + paramMap.put("beforeYear", beforeYear); + paramMap.put("month", month); + + Page page = buildPage(dataSourceRequest.toDevRequest()); + List list = microservicDynamicSQLMapper.pageAllListWithResultType(page, sql.toString(), paramMap, SdAlongVO.class); + List resultList = rebuildMonthList(list); + dataSourceResult.setData(resultList); + dataSourceResult.setTotal(page != null ? page.getTotal() : (long) resultList.size()); + return dataSourceResult; + } + + private Page buildPage(DataSourceLoadOptionsBase loadOptions) { + PageInfo pageInfo = QgcQueryWrapperUtil.getPageInfo(loadOptions); + if (Boolean.TRUE.equals(pageInfo.getHasPageInfo())) { + return pageInfo.getPage(); + } + return null; + } + + + + + 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 List rebuildMonthList(List list) { + if (CollectionUtils.isEmpty(list)) { + return new ArrayList<>(); + } + List sttpList = list.stream().map(SdAlongVO::getSttp).collect(Collectors.toList()); + int firstEnvIndex = sttpList.indexOf(SdAlongVO.TYPE_ENV); + if (firstEnvIndex == -1) { + return new ArrayList<>(); + } + if (firstEnvIndex - 1 >= 0) { + list = new ArrayList<>(list.subList(firstEnvIndex - 1, list.size())); + sttpList = new ArrayList<>(sttpList.subList(firstEnvIndex - 1, sttpList.size())); + } + int lastEnvIndex = sttpList.lastIndexOf(SdAlongVO.TYPE_ENV); + if (lastEnvIndex != -1 && lastEnvIndex + 2 <= list.size()) { + list = new ArrayList<>(list.subList(0, lastEnvIndex + 2)); + } + + Set rstcdSet = list.stream() + .filter(sdAlongVO -> SdAlongVO.TYPE_ENV.equals(sdAlongVO.getSttp())) + .map(SdAlongVO::getRstcd) + .collect(Collectors.toSet()); + list = list.stream() + .filter(sdAlongVO -> SdAlongVO.TYPE_ENV.equals(sdAlongVO.getSttp()) || rstcdSet.contains(sdAlongVO.getStcd())) + .collect(Collectors.toList()); + + SdAlongVO maxTmVo = list.stream() + .filter(sdAlongVO -> StringUtils.isNotBlank(sdAlongVO.getTm())) + .max(Comparator.comparing(SdAlongVO::getTm)) + .orElse(null); + if (!CollectionUtils.isEmpty(list)) { + list.get(0).setMinTm(maxTmVo == null ? null : maxTmVo.getTm()); + } + + List engList = new ArrayList<>(); + List wtList = new ArrayList<>(); + for (SdAlongVO item : list) { + if (StringUtils.equals(SdAlongVO.TYPE_ENG, item.getSttp())) { + engList.add(item); + } else if (StringUtils.equals(SdAlongVO.TYPE_ENV, item.getSttp())) { + wtList.add(item); + } + } + + List result = new ArrayList<>(); + for (SdAlongVO engVo : engList) { + result.add(engVo); + for (SdAlongVO wtVo : wtList) { + if (StringUtils.equals(engVo.getStcd(), wtVo.getEngDwtCode())) { + result.add(wtVo); + } + } + } + return result; + } + } diff --git a/backend/src/main/java/com/yfd/platform/env/service/impl/SdRvwtSInOutOneServiceImpl.java b/backend/src/main/java/com/yfd/platform/env/service/impl/SdRvwtSInOutOneServiceImpl.java index 084a19f..9d1d37e 100644 --- a/backend/src/main/java/com/yfd/platform/env/service/impl/SdRvwtSInOutOneServiceImpl.java +++ b/backend/src/main/java/com/yfd/platform/env/service/impl/SdRvwtSInOutOneServiceImpl.java @@ -69,7 +69,7 @@ public class SdRvwtSInOutOneServiceImpl extends ServiceImpl getDefaultStcd(DataSourceRequest dataSourceRequest) { DataSourceLoadOptionsBase loadOptions = dataSourceRequest.toDevRequest(); - Date[] timeRange = parseTimeRange(QgcQueryWrapperUtil.getFilterFieldValue(loadOptions, "tm")); + Date[] timeRange = parseTimeRange(QgcQueryWrapperUtil.getFilterFieldValue(loadOptions, "dt")); List baseIdList = splitFilterValues(QgcQueryWrapperUtil.getFilterFieldValue(loadOptions, "baseId")); List rvcdList = splitFilterValues(QgcQueryWrapperUtil.getFilterFieldValue(loadOptions, "rvcd")); 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 index 8e83a91..fd48b4e 100644 --- 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 @@ -1,19 +1,31 @@ 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.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.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 { @@ -34,6 +46,86 @@ public class SdWtMonitorServiceImpl implements SdWtMonitorService { return result; } + @Override + public DataSourceResult getWtFishAnalysis(DataSourceRequest dataSourceRequest) { + List filters = new ArrayList<>(); + collectFilters(dataSourceRequest.getFilter(), filters); + + String stcd = null; + String startTime = null; + String endTime = null; + for (DataSourceRequest.FilterDescriptor filter : filters) { + if ("stcd".equals(filter.getField())) { + stcd = toStringValue(filter.getValue()); + } else if ("startTime".equals(filter.getField())) { + startTime = toStringValue(filter.getValue()); + } else if ("endTime".equals(filter.getField())) { + endTime = toStringValue(filter.getValue()); + } + } + + 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 ID, NAME, PRETEMP AS pretempStr, SPAWN_MONTH AS spawnMonthStr " + + "FROM SD_FISHDICTORY_B " + + "WHERE IS_DELETED = 0 AND ENABLE = 1 AND PRETEMP IS NOT NULL AND SPAWN_MONTH IS NOT NULL " + + "AND RVCD = #{map.hbrvcd} " + + "ORDER BY NVL(ORDER_INDEX, 999999), 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 getVmsstbprptList(DataSourceRequest dataSourceRequest) { DataSourceLoadOptionsBase loadOptions = dataSourceRequest.toDevRequest(); @@ -107,6 +199,258 @@ public class SdWtMonitorServiceImpl implements SdWtMonitorService { 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())) { @@ -144,4 +488,198 @@ public class SdWtMonitorServiceImpl implements SdWtMonitorService { 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; + } + } + + @Data + private static class WtCxDetailRow { + private String stcd; + private String dt; + private String stnm; + private String wthg; + private String vwt; + } + }