feat: 获取垂向水温有数据的年份

This commit is contained in:
tangwei 2026-05-20 09:07:53 +08:00
parent e75bb27492
commit 8293a2f9f5
12 changed files with 867 additions and 88 deletions

View File

@ -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));
}
}

View File

@ -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));
}
}

View File

@ -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));
}
}

View File

@ -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<String> spawnMonth;
private String pretempStr;
private List<String> pretemp;
}

View File

@ -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<FishSpawnVo> fishList;
}

View File

@ -23,10 +23,8 @@ public interface SdRvwtSInOutOneMapper extends BaseMapper<SdRvwtSVO> {
"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)",
" <if test='baseIdList != null and baseIdList.size() > 0'>",
" AND eng.BASE_ID IN",
" <foreach collection='baseIdList' item='baseId' open='(' separator=',' close=')'>",
@ -41,9 +39,11 @@ public interface SdRvwtSInOutOneMapper extends BaseMapper<SdRvwtSVO> {
" </if>",
" 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)",
" <if test='startTime != null and endTime != null'>",
" AND dayData.DT BETWEEN #{startTime} AND #{endTime}",
" </if>",

View File

@ -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<SdWtMonitorCountVO> getMonitorCountList();
@Select("SELECT WT_DEVICE_TYPE FROM SD_WT_B_H WHERE STCD = #{stcd} AND IS_DELETED = 0")
Integer getWtDeviceTypeByStcd(@Param("stcd") String stcd);
}

View File

@ -18,4 +18,5 @@ public interface AlongListService {
Map<String,Object> getWtLimit(DataSourceRequest dataSourceRequest);
DataSourceResult getDefaultRvcd(@RequestBody DataSourceRequest dataSourceRequest);
DataSourceResult getALongKendoListCust(DataSourceRequest dataSourceRequest);
DataSourceResult getMonthKendoListCust(DataSourceRequest dataSourceRequest);
}

View File

@ -8,4 +8,8 @@ public interface SdWtMonitorService {
DataSourceResult getEvnmAutoMonitorList();
DataSourceResult getVmsstbprptList(DataSourceRequest dataSourceRequest);
DataSourceResult getCxDetailList(DataSourceRequest dataSourceRequest);
DataSourceResult getWtFishAnalysis(DataSourceRequest dataSourceRequest);
}

View File

@ -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<AlongListMapper, SdAlongVO
private DynamicSQLMapper dynamicSQLMapper;
@Resource
private AlongListMapper alongListMapper;
@Resource
private MicroservicDynamicSQLMapper microservicDynamicSQLMapper;
@ -144,4 +149,208 @@ public class AlongListServiceImpl extends ServiceImpl<AlongListMapper, SdAlongVO
return dataSourceResult;
}
@Override
public DataSourceResult getMonthKendoListCust(DataSourceRequest dataSourceRequest) {
DataSourceResult dataSourceResult = new DataSourceResult<>();
List<DataSourceRequest.FilterDescriptor> 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<String, Object> 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<SdAlongVO> list = microservicDynamicSQLMapper.pageAllListWithResultType(page, sql.toString(), paramMap, SdAlongVO.class);
List<SdAlongVO> 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<DataSourceRequest.FilterDescriptor> 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<SdAlongVO> rebuildMonthList(List<SdAlongVO> list) {
if (CollectionUtils.isEmpty(list)) {
return new ArrayList<>();
}
List<String> 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<String> 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<SdAlongVO> engList = new ArrayList<>();
List<SdAlongVO> 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<SdAlongVO> 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;
}
}

View File

@ -69,7 +69,7 @@ public class SdRvwtSInOutOneServiceImpl extends ServiceImpl<SdRvwtSInOutOneMappe
@Override
public DataSourceResult<StcdVo> getDefaultStcd(DataSourceRequest dataSourceRequest) {
DataSourceLoadOptionsBase loadOptions = dataSourceRequest.toDevRequest();
Date[] timeRange = parseTimeRange(QgcQueryWrapperUtil.getFilterFieldValue(loadOptions, "tm"));
Date[] timeRange = parseTimeRange(QgcQueryWrapperUtil.getFilterFieldValue(loadOptions, "dt"));
List<String> baseIdList = splitFilterValues(QgcQueryWrapperUtil.getFilterFieldValue(loadOptions, "baseId"));
List<String> rvcdList = splitFilterValues(QgcQueryWrapperUtil.getFilterFieldValue(loadOptions, "rvcd"));

View File

@ -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<DataSourceRequest.FilterDescriptor> 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<WtFishVo> 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<String, Object> paramMap = new HashMap<>();
paramMap.put("stcd", stcd);
paramMap.put("startTime", startTime);
paramMap.put("endTime", endTime);
Page<?> page = buildPage(dataSourceRequest.toDevRequest());
List<WtFishVo> 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<String, Object> fishParamMap = new HashMap<>();
fishParamMap.put("hbrvcd", hbrvcd);
List<FishSpawnVo> 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<DataSourceRequest.FilterDescriptor> 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<String, Object> 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<WtCxDetailRow> rowList = microservicDynamicSQLMapper.pageAllListWithResultType(page, sql.toString(), paramMap, WtCxDetailRow.class);
List<Double> verticalList = getVerticals(rowList, wtDeviceType);
List<Map<String, Object>> resultData = new ArrayList<>();
for (WtCxDetailRow row : rowList) {
Map<String, Object> result = new LinkedHashMap<>();
result.put("stcd", row.getStcd());
result.put("stnm", row.getStnm());
result.put("dt", row.getDt());
Map<String, Object> dataList = new LinkedHashMap<>();
for (Double vertical : verticalList) {
dataList.put(Double.toString(vertical), "-");
}
List<String> wthgList = splitValue(row.getWthg());
List<String> 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<Map<String, Object>> 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<String, Object> table = new LinkedHashMap<>();
table.put("columns", columns);
table.put("dataSource", resultData);
table.put("wtDeviceType", wtDeviceType);
DataSourceResult<Map<String, Object>> 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<DataSourceRequest.FilterDescriptor> 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<DataSourceRequest.SortDescriptor> sortList) {
if (sortList == null || sortList.isEmpty()) {
return;
}
List<String> 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<Map<String, Object>> emptyTableList(Integer wtDeviceType, String drtp) {
List<Map<String, Object>> 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<String, Object> 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<Map<String, Object>> result = new DataSourceResult<>();
result.setData(emptyTableList(wtDeviceType, drtp));
result.setTotal(0);
result.setAggregates(new HashMap<>());
return result;
}
private Map<String, Object> buildColumn(String dataIndex,
String title,
boolean visible,
String key,
boolean merge,
String dataType,
String dataFormat) {
Map<String, Object> 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<String> splitValue(String value) {
if (StrUtil.isBlank(value)) {
return Collections.emptyList();
}
String[] values = value.split(",");
List<String> result = new ArrayList<>(values.length);
for (String item : values) {
result.add(item == null ? null : item.trim());
}
return result;
}
private List<Double> getVerticals(List<WtCxDetailRow> rowList, Integer wtDeviceType) {
List<Double> 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<WtFishVo> wtFishVoList, List<FishSpawnVo> fishSpawnVoList) {
if (wtFishVoList == null || wtFishVoList.isEmpty() || fishSpawnVoList == null || fishSpawnVoList.isEmpty()) {
return;
}
for (WtFishVo wtFishVo : wtFishVoList) {
List<FishSpawnVo> 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;
}
}