From c9badec4ae1f814d02ba69e1b525e2d8ad91ec09 Mon Sep 17 00:00:00 2001 From: tangwei Date: Mon, 15 Jun 2026 07:55:42 +0800 Subject: [PATCH 1/9] =?UTF-8?q?fix:=20=E4=BC=98=E5=8C=96=E6=8A=A5=E9=94=99?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../qgc_env/wt/service/impl/SdWtMonitorServiceImpl.java | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/backend/src/main/java/com/yfd/platform/qgc_env/wt/service/impl/SdWtMonitorServiceImpl.java b/backend/src/main/java/com/yfd/platform/qgc_env/wt/service/impl/SdWtMonitorServiceImpl.java index 1a67c0b7..c026f262 100644 --- a/backend/src/main/java/com/yfd/platform/qgc_env/wt/service/impl/SdWtMonitorServiceImpl.java +++ b/backend/src/main/java/com/yfd/platform/qgc_env/wt/service/impl/SdWtMonitorServiceImpl.java @@ -671,6 +671,7 @@ public class SdWtMonitorServiceImpl implements SdWtMonitorService { .append("hb.ORDER_INDEX AS baseStepSort, ") .append("eng.HBRVCD AS hbrvcd, ") .append("eng.ORDER_INDEX AS rstcdStepSort, ") + .append("hb.ORDER_INDEX AS rvcdStepSort, ") .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 ") @@ -715,7 +716,7 @@ public class SdWtMonitorServiceImpl implements SdWtMonitorService { .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("NVL(hbrv.ORDER_INDEX, 999999) AS rvcdStepSort, ") .append("eng.ORDER_INDEX AS rstcdStepSort, ") .append("wt.ORDER_INDEX AS siteStepSort, ") .append("wt.STNM AS stnm, ") From e612bb3b6b9213bdc2248e35168b39ebf76c28cb Mon Sep 17 00:00:00 2001 From: tangwei Date: Mon, 15 Jun 2026 08:54:29 +0800 Subject: [PATCH 2/9] =?UTF-8?q?feat:=20=E5=88=A0=E9=99=A4=E5=9E=82?= =?UTF-8?q?=E5=90=91=E6=B0=B4=E6=B8=A9=E6=95=B0=E6=8D=AE&=E4=BF=AE?= =?UTF-8?q?=E6=94=B9=E5=9E=82=E5=90=91=E6=B0=B4=E6=B8=A9=E6=95=B0=E6=8D=AE?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../wt/controller/SdWTMonitorController.java | 14 + .../qgc_env/wt/service/SdWtvtRService.java | 7 + .../service/impl/AlongDetailServiceImpl.java | 4 +- .../service/impl/SdWtMonitorServiceImpl.java | 4 +- .../wt/service/impl/SdWtvtRServiceImpl.java | 293 ++++++++++++++++++ 5 files changed, 317 insertions(+), 5 deletions(-) diff --git a/backend/src/main/java/com/yfd/platform/qgc_env/wt/controller/SdWTMonitorController.java b/backend/src/main/java/com/yfd/platform/qgc_env/wt/controller/SdWTMonitorController.java index b1bf235c..e1bc5b59 100644 --- a/backend/src/main/java/com/yfd/platform/qgc_env/wt/controller/SdWTMonitorController.java +++ b/backend/src/main/java/com/yfd/platform/qgc_env/wt/controller/SdWTMonitorController.java @@ -215,6 +215,20 @@ public class SdWTMonitorController { return ResponseResult.successData(sdWtMonitorService.getCxDetailList(dataSourceRequest)); } + @PostMapping("/cxDetail/removeKendoByIds") + @Operation(summary = "删除垂向水温数据") + public ResponseResult removeCxDetailByIds(@RequestBody BatchDeleteAo batchDeleteAo) { + sdWtvtRService.removeKendoByIds(batchDeleteAo); + return ResponseResult.success(); + } + + @PostMapping("/cxDetail/updateWtvtRData") + @Operation(summary = "修改垂向水温数据") + public ResponseResult updateWtvtRData(@RequestBody Map updateData) { + sdWtvtRService.updateWtvtRData(updateData); + return ResponseResult.success(); + } + @PostMapping("/wtvt/defaultYear/GetKendoListCust") @Operation(summary = "获取垂向水温有数据的年份") public ResponseResult getWtrvDefaultYear(@RequestBody DataSourceRequest dataSourceRequest) { diff --git a/backend/src/main/java/com/yfd/platform/qgc_env/wt/service/SdWtvtRService.java b/backend/src/main/java/com/yfd/platform/qgc_env/wt/service/SdWtvtRService.java index f820339c..2b62f2b3 100644 --- a/backend/src/main/java/com/yfd/platform/qgc_env/wt/service/SdWtvtRService.java +++ b/backend/src/main/java/com/yfd/platform/qgc_env/wt/service/SdWtvtRService.java @@ -2,6 +2,9 @@ package com.yfd.platform.qgc_env.wt.service; import com.yfd.platform.common.DataSourceRequest; import com.yfd.platform.common.DataSourceResult; +import com.yfd.platform.qgc_base.entity.vo.BatchDeleteAo; + +import java.util.Map; /** * 垂向水温Service接口 @@ -18,4 +21,8 @@ public interface SdWtvtRService { * @return 数据源结果 */ DataSourceResult getWtrvDefaultYear(DataSourceRequest dataSourceRequest); + + boolean removeKendoByIds(BatchDeleteAo batchDeleteAo); + + void updateWtvtRData(Map updateData); } diff --git a/backend/src/main/java/com/yfd/platform/qgc_env/wt/service/impl/AlongDetailServiceImpl.java b/backend/src/main/java/com/yfd/platform/qgc_env/wt/service/impl/AlongDetailServiceImpl.java index 6e8c530c..009f7cf6 100644 --- a/backend/src/main/java/com/yfd/platform/qgc_env/wt/service/impl/AlongDetailServiceImpl.java +++ b/backend/src/main/java/com/yfd/platform/qgc_env/wt/service/impl/AlongDetailServiceImpl.java @@ -816,9 +816,7 @@ public class AlongDetailServiceImpl extends ServiceImpl dateRangeMap = new HashMap<>(); Map monthRangeMap = new HashMap<>(); diff --git a/backend/src/main/java/com/yfd/platform/qgc_env/wt/service/impl/SdWtMonitorServiceImpl.java b/backend/src/main/java/com/yfd/platform/qgc_env/wt/service/impl/SdWtMonitorServiceImpl.java index c026f262..823cf486 100644 --- a/backend/src/main/java/com/yfd/platform/qgc_env/wt/service/impl/SdWtMonitorServiceImpl.java +++ b/backend/src/main/java/com/yfd/platform/qgc_env/wt/service/impl/SdWtMonitorServiceImpl.java @@ -944,8 +944,8 @@ public class SdWtMonitorServiceImpl implements SdWtMonitorService { .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.DT <= TO_DATE(#{map.endTime}, 'YYYY-MM-DD HH24:MI:SS') ") + .append("AND t1.DT >= 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.DT, t1.STCD, wt.STNM "); diff --git a/backend/src/main/java/com/yfd/platform/qgc_env/wt/service/impl/SdWtvtRServiceImpl.java b/backend/src/main/java/com/yfd/platform/qgc_env/wt/service/impl/SdWtvtRServiceImpl.java index bb59d92e..737f982c 100644 --- a/backend/src/main/java/com/yfd/platform/qgc_env/wt/service/impl/SdWtvtRServiceImpl.java +++ b/backend/src/main/java/com/yfd/platform/qgc_env/wt/service/impl/SdWtvtRServiceImpl.java @@ -1,21 +1,33 @@ package com.yfd.platform.qgc_env.wt.service.impl; +import cn.hutool.core.collection.CollUtil; import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; import com.yfd.platform.common.DataSourceLoadOptionsBase; import com.yfd.platform.common.DataSourceRequest; import com.yfd.platform.common.DataSourceResult; import com.yfd.platform.common.MicroservicDynamicSQLMapper; +import com.yfd.platform.qgc_base.entity.vo.BatchDeleteAo; +import com.yfd.platform.qgc_base.entity.vo.DataParam; import com.yfd.platform.qgc_env.wt.entity.vo.SdWtvtYearVo; import com.yfd.platform.qgc_env.wt.mapper.SdWtvtRMapper; import com.yfd.platform.qgc_env.wt.service.SdWtvtRService; import com.yfd.platform.utils.QgcQueryWrapperUtil; +import com.yfd.platform.utils.SecurityUtils; import jakarta.annotation.Resource; import org.apache.commons.lang3.StringUtils; +import org.springframework.jdbc.core.JdbcTemplate; import org.springframework.stereotype.Service; +import org.springframework.transaction.annotation.Transactional; +import java.math.BigDecimal; +import java.util.ArrayList; +import java.util.Calendar; +import java.util.HashSet; import java.util.HashMap; import java.util.List; +import java.util.LinkedHashMap; import java.util.Map; +import java.util.Set; /** * 垂向水温Service实现类 @@ -32,6 +44,9 @@ public class SdWtvtRServiceImpl extends ServiceImpl @Resource private MicroservicDynamicSQLMapper microservicDynamicSQLMapper; + @Resource + private JdbcTemplate jdbcTemplate; + @Override public DataSourceResult getWtrvDefaultYear(DataSourceRequest dataSourceRequest) { DataSourceResult dataSourceResult = new DataSourceResult<>(); @@ -70,4 +85,282 @@ public class SdWtvtRServiceImpl extends ServiceImpl List> result = microservicDynamicSQLMapper.pageAllList(null, sql, paramMap); return result != null && !result.isEmpty(); } + + @Override + @Transactional(rollbackFor = Exception.class) + public boolean removeKendoByIds(BatchDeleteAo batchDeleteAo) { + String dataType = batchDeleteAo == null ? null : batchDeleteAo.getDataType(); + List dataList = batchDeleteAo == null ? null : batchDeleteAo.getDataList(); + if (CollUtil.isEmpty(dataList)) { + return true; + } + int batchSize = 500; + for (int i = 0; i < dataList.size(); i += batchSize) { + List subList = dataList.subList(i, Math.min(i + batchSize, dataList.size())); + if ("MON".equalsIgnoreCase(dataType)) { + continue; + } + if ("DATE".equalsIgnoreCase(dataType)) { + continue; + } + if ("TIME".equalsIgnoreCase(dataType)) { + deleteWtvtRData(subList); + Map dateRangeMap = new HashMap<>(); + Map monthRangeMap = new HashMap<>(); + for (DataParam param : subList) { + if (param == null || param.getId() == null || param.getDt() == null || param.getDt().length() < 10) { + continue; + } + String stcd = param.getId(); + String tm = param.getDt(); + String dateStr = tm.substring(0, 10); + if (!dateRangeMap.containsKey(stcd)) { + dateRangeMap.put(stcd, new String[]{dateStr, dateStr}); + } else { + String[] range = dateRangeMap.get(stcd); + if (dateStr.compareTo(range[0]) < 0) { + range[0] = dateStr; + } + if (dateStr.compareTo(range[1]) > 0) { + range[1] = dateStr; + } + } + + String[] ym = tm.substring(0, 7).split("-"); + if (ym.length == 2) { + Integer year = Integer.parseInt(ym[0]); + Integer month = Integer.parseInt(ym[1]); + String monthStart = year + "-" + String.format("%02d", month) + "-01"; + String monthEnd = getMonthEndDate(year, month); + String monthKey = stcd + "_" + year + "_" + month; + if (!monthRangeMap.containsKey(monthKey)) { + monthRangeMap.put(monthKey, new String[]{stcd, monthStart, monthEnd}); + } + } + } + + for (Map.Entry entry : dateRangeMap.entrySet()) { + statisticsDayDataFromHour(entry.getKey(), entry.getValue()[0], entry.getValue()[1]); + } + Set processedMonths = new HashSet<>(); + for (String[] values : monthRangeMap.values()) { + String stcd = values[0]; + String startDate = values[1]; + String endDate = values[2]; + String monthKey = stcd + "_" + startDate; + if (!processedMonths.contains(monthKey)) { + statisticsMonthDataFromDay(stcd, startDate, endDate); + processedMonths.add(monthKey); + } + } + } + } + return true; + } + + @Override + @Transactional(rollbackFor = Exception.class) + public void updateWtvtRData(Map updateData) { + if (updateData == null || updateData.isEmpty()) { + return; + } + String stcd = asString(updateData.get("stcd")); + String dt = asString(updateData.get("dt")); + Object mapObj = updateData.get("map"); + if (StringUtils.isBlank(stcd) || StringUtils.isBlank(dt) || !(mapObj instanceof Map rawMap)) { + return; + } + + List> dataList = new ArrayList<>(); + rawMap.forEach((wthgObj, vwtObj) -> { + if (wthgObj == null) { + return; + } + String wthgStr = String.valueOf(wthgObj).trim(); + if (StringUtils.isBlank(wthgStr) || vwtObj == null) { + return; + } + String vwtStr = String.valueOf(vwtObj).trim(); + if ("-".equals(vwtStr) || "".equals(vwtStr)) { + vwtStr = null; + } + Map item = new HashMap<>(); + item.put("stcd", stcd); + item.put("tm", dt); + item.put("wthg", parseBigDecimal(wthgStr)); + item.put("vwt", parseBigDecimal(vwtStr)); + item.put("recordUser", "admin"); +// item.put("recordUser", SecurityUtils.getUserId()); + dataList.add(item); + }); + + if (dataList.isEmpty()) { + return; + } + batchUpdateWtvtRData(dataList); + + String dateStr = dt.substring(0, 10); + statisticsDayDataFromHour(stcd, dateStr, dateStr); + + String[] ym = dateStr.substring(0, 7).split("-"); + if (ym.length == 2) { + Integer year = Integer.parseInt(ym[0]); + Integer month = Integer.parseInt(ym[1]); + String startDate = year + "-" + String.format("%02d", month) + "-01"; + String endDate = getMonthEndDate(year, month); + statisticsMonthDataFromDay(stcd, startDate, endDate); + } + } + + private void deleteWtvtRData(List dataParamList) { + if (CollUtil.isEmpty(dataParamList)) { + return; + } + StringBuilder sql = new StringBuilder("DELETE FROM SD_WTVT_R WHERE "); + List params = new ArrayList<>(); + for (int i = 0; i < dataParamList.size(); i++) { + if (i > 0) { + sql.append(" OR "); + } + sql.append("(STCD = ? AND TM = TO_DATE(SUBSTR(?, 1, 19), 'YYYY-MM-DD HH24:MI:SS'))"); + DataParam item = dataParamList.get(i); + params.add(item == null ? null : item.getId()); + params.add(item == null ? null : item.getDt()); + } + jdbcTemplate.update(sql.toString(), params.toArray()); + } + + private void batchUpdateWtvtRData(List> dataList) { + if (CollUtil.isEmpty(dataList)) { + return; + } + StringBuilder sql = new StringBuilder("MERGE INTO SD_WTVT_R target USING ("); + List params = new ArrayList<>(); + for (int i = 0; i < dataList.size(); i++) { + if (i > 0) { + sql.append(" UNION ALL "); + } + sql.append("SELECT ? AS STCD, ? AS VWT, ? AS RECORD_USER, ? AS WTHG, ") + .append("TO_DATE(SUBSTR(?, 1, 19), 'YYYY-MM-DD HH24:MI:SS') AS TM FROM DUAL"); + Map item = dataList.get(i); + params.add(item.get("stcd")); + params.add(item.get("vwt")); + params.add(item.get("recordUser")); + params.add(item.get("wthg")); + params.add(item.get("tm")); + } + sql.append(") source ON (target.STCD = source.STCD AND target.TM = source.TM AND target.WTHG = source.WTHG) ") + .append("WHEN MATCHED THEN UPDATE SET target.VWT = source.VWT, target.MODIFY_USER = source.RECORD_USER, target.MODIFY_TIME = SYSDATE ") + .append("WHEN NOT MATCHED THEN INSERT (STCD, VWT, WTHG, TM, RECORD_USER, RECORD_TIME, IS_DELETED) ") + .append("VALUES (source.STCD, source.VWT, source.WTHG, source.TM, source.RECORD_USER, SYSDATE, 0)"); + jdbcTemplate.update(sql.toString(), params.toArray()); + } + + private String getMonthEndDate(Integer year, Integer month) { + Calendar calendar = Calendar.getInstance(); + calendar.set(year, month - 1, 1); + int lastDay = calendar.getActualMaximum(Calendar.DAY_OF_MONTH); + return year + "-" + String.format("%02d", month) + "-" + String.format("%02d", lastDay); + } + + private void statisticsDayDataFromHour(String stcd, String startDate, String endDate) { + String deleteSql = "DELETE FROM SD_WTVTDAY_S T " + + "WHERE T.STCD = ? " + + "AND T.DT BETWEEN TO_DATE(?, 'YYYY-MM-DD') " + + "AND TO_DATE(?, 'YYYY-MM-DD') " + + "AND NOT EXISTS ( " + + " SELECT 1 FROM SD_WTVT_R S " + + " WHERE S.STCD = T.STCD " + + " AND S.WTHG = T.WTHG " + + " AND TRUNC(S.TM) = T.DT " + + " AND S.TM >= TO_DATE(? || ' 00:00:00', 'YYYY-MM-DD HH24:MI:SS') " + + " AND S.TM <= TO_DATE(? || ' 23:59:59', 'YYYY-MM-DD HH24:MI:SS') " + + " AND S.IS_DELETED = 0)"; + jdbcTemplate.update(deleteSql, stcd, startDate, endDate, startDate, endDate); + + String mergeSql = "MERGE INTO SD_WTVTDAY_S T " + + "USING ( " + + " SELECT STCD, TRUNC(TM) AS DT, WTHG, AVG(VWT) AS VWT " + + " FROM SD_WTVT_R " + + " WHERE STCD = ? " + + " AND TM >= TO_DATE(? || ' 00:00:00', 'YYYY-MM-DD HH24:MI:SS') " + + " AND TM <= TO_DATE(? || ' 23:59:59', 'YYYY-MM-DD HH24:MI:SS') " + + " AND IS_DELETED = 0 " + + " GROUP BY STCD, TRUNC(TM), WTHG " + + ") S " + + "ON (T.STCD = S.STCD AND T.DT = S.DT AND T.WTHG = S.WTHG) " + + "WHEN MATCHED THEN UPDATE SET " + + " T.VWT = S.VWT, " + + " T.IS_DELETED = 0, " + + " T.DELETE_USER = NULL, " + + " T.DELETE_TIME = NULL, " + + " T.MODIFY_TIME = SYSDATE " + + "WHEN NOT MATCHED THEN INSERT (ID, STCD, DT, WTHG, VWT, RECORD_TIME, IS_DELETED) " + + "VALUES (SYS_GUID(), S.STCD, S.DT, S.WTHG, S.VWT, SYSDATE, 0)"; + jdbcTemplate.update(mergeSql, stcd, startDate, endDate); + } + + private void statisticsMonthDataFromDay(String stcd, String startDate, String endDate) { + Integer startYearInt = Integer.parseInt(startDate.substring(0, 4)); + Integer startMonthInt = Integer.parseInt(startDate.substring(5, 7)); + Integer endMonthInt = Integer.parseInt(endDate.substring(5, 7)); + + String deleteSql = "DELETE FROM SD_WTVTDRTP_S T " + + "WHERE T.DRTP = 'MON' " + + "AND T.STCD = ? " + + "AND T.YEAR = ? " + + "AND T.MONTH BETWEEN ? AND ? " + + "AND EXISTS ( " + + " SELECT 1 " + + " FROM SD_WTVTDAY_S D " + + " WHERE D.STCD = T.STCD " + + " AND D.WTHG = T.WTHG " + + " AND D.IS_DELETED = 0 " + + " AND EXTRACT(YEAR FROM D.DT) = T.YEAR " + + " AND EXTRACT(MONTH FROM D.DT) = T.MONTH " + + " AND D.DT >= TO_DATE(?, 'YYYY-MM-DD') " + + " AND D.DT < TO_DATE(?, 'YYYY-MM-DD') + 1 " + + " GROUP BY D.STCD, EXTRACT(YEAR FROM D.DT), EXTRACT(MONTH FROM D.DT), D.WTHG " + + " HAVING AVG(D.VWT) IS NULL)"; + jdbcTemplate.update(deleteSql, stcd, startYearInt, startMonthInt, endMonthInt, startDate, endDate); + + String mergeSql = "MERGE INTO SD_WTVTDRTP_S T " + + "USING ( " + + " SELECT STCD, EXTRACT(YEAR FROM DT) AS YEAR, EXTRACT(MONTH FROM DT) AS MONTH, WTHG, 'MON' AS DRTP, AVG(VWT) AS VWT " + + " FROM SD_WTVTDAY_S " + + " WHERE STCD = ? " + + " AND DT >= TO_DATE(?, 'YYYY-MM-DD') " + + " AND DT < TO_DATE(?, 'YYYY-MM-DD') + 1 " + + " AND IS_DELETED = 0 " + + " GROUP BY STCD, EXTRACT(YEAR FROM DT), EXTRACT(MONTH FROM DT), WTHG " + + " HAVING AVG(VWT) IS NOT NULL " + + ") S " + + "ON (T.STCD = S.STCD AND T.DRTP = 'MON' AND T.YEAR = S.YEAR AND T.MONTH = S.MONTH AND T.WTHG = S.WTHG) " + + "WHEN MATCHED THEN UPDATE SET " + + " T.VWT = S.VWT, " + + " T.IS_DELETED = 0, " + + " T.DELETE_USER = NULL, " + + " T.DELETE_TIME = NULL, " + + " T.MODIFY_USER = USER, " + + " T.MODIFY_TIME = SYSDATE, " + + " T.TM = SYSDATE " + + "WHEN NOT MATCHED THEN INSERT (ID, STCD, VWT, DRTP, YEAR, MONTH, DR, WTHG, TM, RECORD_USER, RECORD_TIME, IS_DELETED) " + + "VALUES (SYS_GUID(), S.STCD, S.VWT, 'MON', S.YEAR, S.MONTH, NULL, S.WTHG, SYSDATE, USER, SYSDATE, 0)"; + jdbcTemplate.update(mergeSql, stcd, startDate, endDate); + } + + private BigDecimal parseBigDecimal(String str) { + try { + if (StringUtils.isBlank(str)) { + return null; + } + return new BigDecimal(str); + } catch (NumberFormatException e) { + return null; + } + } + + private String asString(Object value) { + return value == null ? null : String.valueOf(value); + } } From bd6c3661535c4387ace898dab4b80927c024ba51 Mon Sep 17 00:00:00 2001 From: tangwei Date: Mon, 15 Jun 2026 09:24:47 +0800 Subject: [PATCH 3/9] =?UTF-8?q?feat:=20=E5=85=A8=E8=BF=87=E7=A8=8B?= =?UTF-8?q?=E8=BF=87=E9=B1=BC=E8=87=AA=E5=8A=A8=E4=B8=8E=E4=BA=BA=E5=B7=A5?= =?UTF-8?q?=E7=9B=91=E6=B5=8B=E6=95=B0=E6=8D=AE=E6=9F=A5=E8=AF=A2?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../fp/controller/FishPassageController.java | 6 + .../qgc_env/fp/entity/vo/FpFpssrlQueryVo.java | 107 ++++ .../qgc_env/fp/service/FpRunService.java | 3 + .../fp/service/impl/FpRunServiceImpl.java | 510 ++++++++++++++++++ 4 files changed, 626 insertions(+) create mode 100644 backend/src/main/java/com/yfd/platform/qgc_env/fp/entity/vo/FpFpssrlQueryVo.java diff --git a/backend/src/main/java/com/yfd/platform/qgc_env/fp/controller/FishPassageController.java b/backend/src/main/java/com/yfd/platform/qgc_env/fp/controller/FishPassageController.java index a803fd10..af4d66ff 100644 --- a/backend/src/main/java/com/yfd/platform/qgc_env/fp/controller/FishPassageController.java +++ b/backend/src/main/java/com/yfd/platform/qgc_env/fp/controller/FishPassageController.java @@ -40,6 +40,12 @@ public class FishPassageController { return ResponseResult.successData(fpRunService.processQgcSdfpssrKendoList(dataSourceRequest)); } + @PostMapping("/query/qgc/GetKendoListCust") + @Operation(summary = "全过程过鱼自动与人工监测数据查询") + public ResponseResult getQgcFpssrlQueryKendoListCust(@RequestBody DataSourceRequest dataSourceRequest) { + return ResponseResult.successData(fpRunService.processQgcFpssrlQueryKendoList(dataSourceRequest)); + } + @PostMapping("/fpssTable/qgc/GetKendoListCust") @Operation(summary = "过鱼设施监测数据查询") public ResponseResult getQgcFpssTableKendoListCust(@RequestBody DataSourceRequest dataSourceRequest) { diff --git a/backend/src/main/java/com/yfd/platform/qgc_env/fp/entity/vo/FpFpssrlQueryVo.java b/backend/src/main/java/com/yfd/platform/qgc_env/fp/entity/vo/FpFpssrlQueryVo.java new file mode 100644 index 00000000..5094b292 --- /dev/null +++ b/backend/src/main/java/com/yfd/platform/qgc_env/fp/entity/vo/FpFpssrlQueryVo.java @@ -0,0 +1,107 @@ +package com.yfd.platform.qgc_env.fp.entity.vo; + +import io.swagger.v3.oas.annotations.media.Schema; +import lombok.Data; + +import java.util.Date; + +@Data +@Schema(description = "全过程过鱼自动/人工监测合并查询数据") +public class FpFpssrlQueryVo { + + @Schema(description = "数据ID") + private String id; + + @Schema(description = "过鱼年份") + private String yr; + + @Schema(description = "过鱼设施编码") + private String stcd; + + @Schema(description = "设施名称") + private String stnm; + + @Schema(description = "基地编码") + private String baseId; + + @Schema(description = "基地名称") + private String baseName; + + @Schema(description = "电站编码") + private String rstcd; + + @Schema(description = "电站名称") + private String ennm; + + @Schema(description = "基地流域编码") + private String hbrvcd; + + @Schema(description = "基地排序") + private Integer baseStepSort; + + @Schema(description = "流域排序") + private Integer rvcdStepSort; + + @Schema(description = "站点排序") + private Integer siteStepSort; + + @Schema(description = "电站排序") + private Integer rstcdStepSort; + + @Schema(description = "时间") + private Date tm; + + @Schema(description = "鱼类名称") + private String ftp; + + @Schema(description = "鱼类编码") + private String fishId; + + @Schema(description = "大小") + private String fsz; + + @Schema(description = "长度") + private String length; + + @Schema(description = "宽度") + private String width; + + @Schema(description = "鱼速") + private String fishspeed; + + @Schema(description = "游向") + private String direction; + + @Schema(description = "水温") + private String temperature; + + @Schema(description = "流速") + private String speed; + + @Schema(description = "通道") + private String channelno; + + @Schema(description = "数量") + private String fcnt; + + @Schema(description = "图片") + private String firstimgurl; + + @Schema(description = "视频") + private String videourl; + + @Schema(description = "监测方式") + private Integer mway; + + @Schema(description = "人工开始时间") + private Date strdt; + + @Schema(description = "人工结束时间") + private Date enddt; + + @Schema(description = "站点分类编码") + private String stCode; + + @Schema(description = "站点分类名称") + private String stName; +} diff --git a/backend/src/main/java/com/yfd/platform/qgc_env/fp/service/FpRunService.java b/backend/src/main/java/com/yfd/platform/qgc_env/fp/service/FpRunService.java index 4611c100..7a1bff34 100644 --- a/backend/src/main/java/com/yfd/platform/qgc_env/fp/service/FpRunService.java +++ b/backend/src/main/java/com/yfd/platform/qgc_env/fp/service/FpRunService.java @@ -3,6 +3,7 @@ package com.yfd.platform.qgc_env.fp.service; import com.yfd.platform.common.DataSourceRequest; import com.yfd.platform.common.DataSourceResult; import com.yfd.platform.qgc_env.fp.entity.vo.FpFishSelectVo; +import com.yfd.platform.qgc_env.fp.entity.vo.FpFpssrlQueryVo; import com.yfd.platform.qgc_env.fp.entity.vo.FpRunAnalysisTableVo; import com.yfd.platform.qgc_env.fp.entity.vo.FpSdfpssrVo; import com.yfd.platform.qgc_env.fp.entity.vo.FpTableVo; @@ -17,6 +18,8 @@ public interface FpRunService { DataSourceResult processQgcSdfpssrKendoList(DataSourceRequest dataSourceRequest); + DataSourceResult processQgcFpssrlQueryKendoList(DataSourceRequest dataSourceRequest); + DataSourceResult processQgcFpssTableKendoList(DataSourceRequest dataSourceRequest); DataSourceResult getAnalysisData(DataSourceRequest dataSourceRequest); diff --git a/backend/src/main/java/com/yfd/platform/qgc_env/fp/service/impl/FpRunServiceImpl.java b/backend/src/main/java/com/yfd/platform/qgc_env/fp/service/impl/FpRunServiceImpl.java index 9f0266a2..718ecfde 100644 --- a/backend/src/main/java/com/yfd/platform/qgc_env/fp/service/impl/FpRunServiceImpl.java +++ b/backend/src/main/java/com/yfd/platform/qgc_env/fp/service/impl/FpRunServiceImpl.java @@ -14,6 +14,7 @@ import com.yfd.platform.common.GroupingInfo; import com.yfd.platform.common.MicroservicDynamicSQLMapper; import com.yfd.platform.common.exception.BizException; import com.yfd.platform.qgc_env.fp.entity.vo.FpFishSelectVo; +import com.yfd.platform.qgc_env.fp.entity.vo.FpFpssrlQueryVo; import com.yfd.platform.qgc_env.fp.entity.vo.FpFtpStatisticsVo; import com.yfd.platform.qgc_env.fp.entity.vo.FpRunAnalysisHeadColumnVo; import com.yfd.platform.qgc_env.fp.entity.vo.FpRunAnalysisTableVo; @@ -119,6 +120,15 @@ public class FpRunServiceImpl implements FpRunService { return queryQgcSdfpssrGroupList(dataSourceRequest, loadOptions); } + @Override + public DataSourceResult processQgcFpssrlQueryKendoList(DataSourceRequest dataSourceRequest) { + DataSourceLoadOptionsBase loadOptions = dataSourceRequest == null ? null : dataSourceRequest.toDevRequest(); + if (CollUtil.isEmpty(dataSourceRequest == null ? null : dataSourceRequest.getGroup())) { + return queryQgcFpssrlDetailList(dataSourceRequest, loadOptions); + } + return queryQgcFpssrlGroupList(dataSourceRequest, loadOptions); + } + @Override public DataSourceResult processQgcFpssTableKendoList(DataSourceRequest dataSourceRequest) { DataSourceLoadOptionsBase loadOptions = dataSourceRequest == null ? null : dataSourceRequest.toDevRequest(); @@ -783,6 +793,106 @@ public class FpRunServiceImpl implements FpRunService { return result; } + private DataSourceResult queryQgcFpssrlDetailList(DataSourceRequest dataSourceRequest, + DataSourceLoadOptionsBase loadOptions) { + StringBuilder sql = new StringBuilder(); + sql.append("SELECT ") + .append(buildQgcFpssrlDetailSelectSql(dataSourceRequest == null ? null : dataSourceRequest.getSelect())) + .append(" FROM (") + .append(buildQgcFpssrlCoreSql()) + .append(") t WHERE 1 = 1 "); + + Map paramMap = new HashMap<>(); + String filterSql = buildQgcFpssrlFilterCondition(dataSourceRequest == null ? null : dataSourceRequest.getFilter(), paramMap, new int[]{0}); + if (StrUtil.isNotBlank(filterSql)) { + sql.append(" AND ").append(filterSql).append(" "); + } + sql.append(buildQgcFpssrlOrderBySql(dataSourceRequest == null ? null : dataSourceRequest.getSort())); + + Page page = loadOptions == null ? null : QgcQueryWrapperUtil.buildPage(loadOptions, loadOptions.getSkip(), loadOptions.getTake()); + List list = microservicDynamicSQLMapper.pageAllListWithResultType( + page, sql.toString(), paramMap, FpFpssrlQueryVo.class + ); + DataSourceResult result = new DataSourceResult<>(); + result.setData(list); + result.setTotal(page != null ? page.getTotal() : list.size()); + result.setAggregates(new HashMap<>()); + return result; + } + + private DataSourceResult queryQgcFpssrlGroupList(DataSourceRequest dataSourceRequest, + DataSourceLoadOptionsBase loadOptions) { + List groups = dataSourceRequest.getGroup(); + GroupingInfo[] groupInfos = loadOptions == null ? new GroupingInfo[0] : loadOptions.getGroup(); + + StringBuilder sql = new StringBuilder("SELECT "); + List selectItems = new ArrayList<>(); + for (DataSourceRequest.GroupDescriptor descriptor : groups) { + if (descriptor == null || StrUtil.isBlank(descriptor.getField())) { + continue; + } + String column = mapQgcFpssrlColumn(descriptor.getField()); + if (StrUtil.isBlank(column)) { + continue; + } + selectItems.add(column + " AS " + descriptor.getField().toUpperCase()); + selectItems.add("COUNT(*) AS COUNT_" + descriptor.getField().toUpperCase()); + if (CollUtil.isNotEmpty(descriptor.getAggregates())) { + for (DataSourceRequest.AggregateDescriptor aggregate : descriptor.getAggregates()) { + String aggregateColumn = mapQgcFpssrlColumn(aggregate.getField()); + if (StrUtil.isBlank(aggregateColumn) || StrUtil.isBlank(aggregate.getAggregate())) { + continue; + } + String aggregateSql = buildAggregateSql(aggregate.getAggregate(), aggregateColumn, aggregate.getField()); + if (StrUtil.isNotBlank(aggregateSql)) { + selectItems.add(aggregateSql); + } + } + } + } + if (selectItems.isEmpty()) { + selectItems.add("t.STCD AS STCD"); + selectItems.add("COUNT(*) AS COUNT_STCD"); + } + + sql.append(String.join(", ", selectItems)) + .append(" FROM (") + .append(buildQgcFpssrlCoreSql()) + .append(") t WHERE 1 = 1 "); + + Map paramMap = new HashMap<>(); + String filterSql = buildQgcFpssrlFilterCondition(dataSourceRequest == null ? null : dataSourceRequest.getFilter(), paramMap, new int[]{0}); + if (StrUtil.isNotBlank(filterSql)) { + sql.append(" AND ").append(filterSql).append(" "); + } + + List groupByColumns = new ArrayList<>(); + for (DataSourceRequest.GroupDescriptor descriptor : groups) { + if (descriptor == null || StrUtil.isBlank(descriptor.getField())) { + continue; + } + String column = mapQgcFpssrlColumn(descriptor.getField()); + if (StrUtil.isNotBlank(column)) { + groupByColumns.add(column); + } + } + if (!groupByColumns.isEmpty()) { + sql.append(" GROUP BY ").append(String.join(", ", groupByColumns)).append(" "); + } + sql.append(buildQgcFpssrlGroupOrderBySql(groups)); + + List> rows = microservicDynamicSQLMapper.pageAllList(null, sql.toString(), paramMap); + DataSourceResult result = new DataSourceResult<>(); + if (Boolean.TRUE.equals(dataSourceRequest.getGroupResultFlat())) { + result.setData((List) (List) new GroupHelper().faltGroup(rows, Arrays.asList(groupInfos))); + } else { + result.setData((List) (List) new GroupHelper().group(rows, Arrays.asList(groupInfos))); + } + result.setTotal(0L); + result.setAggregates(new HashMap<>()); + return result; + } + private DataSourceResult queryQgcSdfpssrGroupList(DataSourceRequest dataSourceRequest, DataSourceLoadOptionsBase loadOptions) { List groups = dataSourceRequest.getGroup(); @@ -911,6 +1021,160 @@ public class FpRunServiceImpl implements FpRunService { "WHERE NVL(t.IS_DELETED, 0) = 0"; } + private String buildQgcFpssrlCoreSql() { + return "SELECT " + + "src.ID AS id, " + + "src.STCD AS stcd, " + + "src.STNM AS stnm, " + + "src.BASEID AS baseId, " + + "src.BASENAME AS baseName, " + + "src.RSTCD AS rstcd, " + + "src.ENNM AS ennm, " + + "src.HBRVCD AS hbrvcd, " + + "src.BASESTEPSORT AS baseStepSort, " + + "src.RVCDSTEPSORT AS rvcdStepSort, " + + "src.SITESTEPSORT AS siteStepSort, " + + "src.RSTCDSTEPSORT AS rstcdStepSort, " + + "src.TM AS tm, " + + "src.YR AS yr, " + + "src.FTP AS ftp, " + + "src.FISHID AS fishId, " + + "src.FSZ AS fsz, " + + "src.LENGTH AS length, " + + "src.WIDTH AS width, " + + "src.FISHSPEED AS fishspeed, " + + "src.DIRECTION AS direction, " + + "src.TEMPERATURE AS temperature, " + + "src.SPEED AS speed, " + + "src.CHANNELNO AS channelno, " + + "src.FCNT AS fcnt, " + + "src.FIRSTIMGURL AS firstimgurl, " + + "src.VIDEOURL AS videourl, " + + "src.MWAY AS mway, " + + "src.STRDT AS strdt, " + + "src.ENDDT AS enddt, " + + "src.STCODE AS stCode, " + + "src.STNAME AS stName " + + "FROM ( " + + " SELECT t.ID AS ID, " + + " t.STCD AS STCD, " + + " fp.STNM AS STNM, " + + " eng.BASE_ID AS BASEID, " + + " hb.BASENAME AS BASENAME, " + + " fp.RSTCD AS RSTCD, " + + " eng.ENNM AS ENNM, " + + " eng.HBRVCD AS HBRVCD, " + + " NVL(hb.ORDER_INDEX, 999999) AS BASESTEPSORT, " + + " NVL(hbrv.ORDER_INDEX, 999999) AS RVCDSTEPSORT, " + + " NVL(fp.ORDER_INDEX, 999999) AS SITESTEPSORT, " + + " NVL(eng.ORDER_INDEX, 999999) AS RSTCDSTEPSORT, " + + " t.TM AS TM, " + + " TO_CHAR(t.TM, 'YYYY') AS YR, " + + " COALESCE(fishRv.NAME, relRv.FISH_NAME, fishZy.NAME, relZy.FISH_NAME, fishDirect.NAME, t.FTP) AS FTP, " + + " t.FTP AS FISHID, " + + " t.FSZ AS FSZ, " + + " TO_CHAR(t.LENGTH) AS LENGTH, " + + " TO_CHAR(t.WIDTH) AS WIDTH, " + + " TO_CHAR(t.FISHSPEED) AS FISHSPEED, " + + " TO_CHAR(t.DIRECTION) AS DIRECTION, " + + " TO_CHAR(t.TEMPERATURE) AS TEMPERATURE, " + + " TO_CHAR(t.SPEED) AS SPEED, " + + " t.CHANNELNO AS CHANNELNO, " + + " TO_CHAR(t.FCNT) AS FCNT, " + + " t.FIRSTIMGURL AS FIRSTIMGURL, " + + " t.VIDEOURL AS VIDEOURL, " + + " 2 AS MWAY, " + + " CAST(NULL AS DATE) AS STRDT, " + + " CAST(NULL AS DATE) AS ENDDT, " + + " fp.STTP AS STCODE, " + + " sttp.STTP_NAME AS STNAME " + + " FROM SD_FPSSRL_R t " + + " INNER JOIN SD_FPSS_B_H fp ON fp.STCD = t.STCD " + + " LEFT JOIN SD_STTP_B sttp ON sttp.STTP_CODE = fp.STTP AND NVL(sttp.IS_DELETED, 0) = 0 AND NVL(sttp.ENABLE, 1) = 1 " + + " LEFT JOIN SD_ENGINFO_B_H eng ON eng.STCD = fp.RSTCD AND NVL(eng.IS_DELETED, 0) = 0 " + + " 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_FISHDICTORY_RLTN_B relRv ON relRv.FISH_ID = t.FTP " + + " AND relRv.RVCD = eng.HBRVCD " + + " AND NVL(relRv.IS_DELETED, 0) = 0 " + + " LEFT JOIN SD_FISHDICTORY_B fishRv ON fishRv.ID = relRv.ZY_FISH_ID " + + " AND NVL(fishRv.IS_DELETED, 0) = 0 " + + " AND NVL(fishRv.ENABLE, 1) = 1 " + + " LEFT JOIN SD_FISHDICTORY_RLTN_B relZy ON relZy.FISH_ID = t.FTP " + + " AND relZy.RVCD = 'ZY' " + + " AND NVL(relZy.IS_DELETED, 0) = 0 " + + " LEFT JOIN SD_FISHDICTORY_B fishZy ON fishZy.ID = relZy.ZY_FISH_ID " + + " AND NVL(fishZy.IS_DELETED, 0) = 0 " + + " AND NVL(fishZy.ENABLE, 1) = 1 " + + " LEFT JOIN SD_FISHDICTORY_B fishDirect ON fishDirect.ID = t.FTP " + + " AND NVL(fishDirect.IS_DELETED, 0) = 0 " + + " AND NVL(fishDirect.ENABLE, 1) = 1 " + + " WHERE NVL(t.IS_DELETED, 0) = 0 " + + " UNION ALL " + + " SELECT t.ID AS ID, " + + " t.STCD AS STCD, " + + " fp.STNM AS STNM, " + + " eng.BASE_ID AS BASEID, " + + " hb.BASENAME AS BASENAME, " + + " fp.RSTCD AS RSTCD, " + + " eng.ENNM AS ENNM, " + + " eng.HBRVCD AS HBRVCD, " + + " NVL(hb.ORDER_INDEX, 999999) AS BASESTEPSORT, " + + " NVL(hbrv.ORDER_INDEX, 999999) AS RVCDSTEPSORT, " + + " NVL(fp.ORDER_INDEX, 999999) AS SITESTEPSORT, " + + " NVL(eng.ORDER_INDEX, 999999) AS RSTCDSTEPSORT, " + + " t.STRDT AS TM, " + + " TO_CHAR(t.STRDT, 'YYYY') AS YR, " + + " COALESCE(fishRv.NAME, relRv.FISH_NAME, fishZy.NAME, relZy.FISH_NAME, fishDirect.NAME, t.FTP) AS FTP, " + + " t.FTP AS FISHID, " + + " t.FSZ AS FSZ, " + + " CAST(NULL AS VARCHAR2(50)) AS LENGTH, " + + " CAST(NULL AS VARCHAR2(50)) AS WIDTH, " + + " CAST(NULL AS VARCHAR2(50)) AS FISHSPEED, " + + " TO_CHAR(t.DIRECTION) AS DIRECTION, " + + " CAST(NULL AS VARCHAR2(50)) AS TEMPERATURE, " + + " CAST(NULL AS VARCHAR2(50)) AS SPEED, " + + " CAST(NULL AS VARCHAR2(100)) AS CHANNELNO, " + + " TO_CHAR(t.FCNT) AS FCNT, " + + " t.PICPTH AS FIRSTIMGURL, " + + " t.VDPTH AS VIDEOURL, " + + " 1 AS MWAY, " + + " t.STRDT AS STRDT, " + + " t.ENDDT AS ENDDT, " + + " fp.STTP AS STCODE, " + + " sttp.STTP_NAME AS STNAME " + + " FROM SD_FPSS_R t " + + " INNER JOIN SD_FPSS_B_H fp ON fp.STCD = t.STCD " + + " LEFT JOIN SD_STTP_B sttp ON sttp.STTP_CODE = fp.STTP AND NVL(sttp.IS_DELETED, 0) = 0 AND NVL(sttp.ENABLE, 1) = 1 " + + " LEFT JOIN SD_ENGINFO_B_H eng ON eng.STCD = fp.RSTCD AND NVL(eng.IS_DELETED, 0) = 0 " + + " 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_FISHDICTORY_RLTN_B relRv ON relRv.FISH_ID = t.FTP " + + " AND relRv.RVCD = eng.HBRVCD " + + " AND NVL(relRv.IS_DELETED, 0) = 0 " + + " LEFT JOIN SD_FISHDICTORY_B fishRv ON fishRv.ID = relRv.ZY_FISH_ID " + + " AND NVL(fishRv.IS_DELETED, 0) = 0 " + + " AND NVL(fishRv.ENABLE, 1) = 1 " + + " LEFT JOIN SD_FISHDICTORY_RLTN_B relZy ON relZy.FISH_ID = t.FTP " + + " AND relZy.RVCD = 'ZY' " + + " AND NVL(relZy.IS_DELETED, 0) = 0 " + + " LEFT JOIN SD_FISHDICTORY_B fishZy ON fishZy.ID = relZy.ZY_FISH_ID " + + " AND NVL(fishZy.IS_DELETED, 0) = 0 " + + " AND NVL(fishZy.ENABLE, 1) = 1 " + + " LEFT JOIN SD_FISHDICTORY_B fishDirect ON fishDirect.ID = t.FTP " + + " AND NVL(fishDirect.IS_DELETED, 0) = 0 " + + " AND NVL(fishDirect.ENABLE, 1) = 1 " + + " WHERE NVL(t.IS_DELETED, 0) = 0 " + +// " AND (t.TASK_STATUS = 'Approved' OR t.TASK_STATUS IS NULL) " + + ") src"; + } + private String buildQgcSdfpssrDetailSelectSql(List selectFields) { Map selectMap = new LinkedHashMap<>(); selectMap.put("stcd", "t.stcd AS stcd"); @@ -957,6 +1221,57 @@ public class FpRunServiceImpl implements FpRunService { return String.join(", ", actualColumns); } + private String buildQgcFpssrlDetailSelectSql(List selectFields) { + Map selectMap = new LinkedHashMap<>(); + selectMap.put("id", "t.id AS id"); + selectMap.put("yr", "t.yr AS yr"); + selectMap.put("stcd", "t.stcd AS stcd"); + selectMap.put("stnm", "CASE WHEN t.stName IS NULL THEN t.stnm ELSE t.stName || t.stnm END AS stnm"); + selectMap.put("baseId", "t.baseId AS baseId"); + selectMap.put("baseName", "t.baseName AS baseName"); + selectMap.put("rstcd", "t.rstcd AS rstcd"); + selectMap.put("ennm", "t.ennm AS ennm"); + selectMap.put("hbrvcd", "t.hbrvcd AS hbrvcd"); + selectMap.put("baseStepSort", "t.baseStepSort AS baseStepSort"); + selectMap.put("rvcdStepSort", "t.rvcdStepSort AS rvcdStepSort"); + selectMap.put("siteStepSort", "t.siteStepSort AS siteStepSort"); + selectMap.put("rstcdStepSort", "t.rstcdStepSort AS rstcdStepSort"); + selectMap.put("tm", "t.tm AS tm"); + selectMap.put("ftp", "t.ftp AS ftp"); + selectMap.put("fishId", "t.fishId AS fishId"); + selectMap.put("fsz", "t.fsz AS fsz"); + selectMap.put("length", "t.length AS length"); + selectMap.put("width", "t.width AS width"); + selectMap.put("fishspeed", "t.fishspeed AS fishspeed"); + selectMap.put("direction", "t.direction AS direction"); + selectMap.put("temperature", "t.temperature AS temperature"); + selectMap.put("speed", "t.speed AS speed"); + selectMap.put("channelno", "t.channelno AS channelno"); + selectMap.put("fcnt", "t.fcnt AS fcnt"); + selectMap.put("firstimgurl", "t.firstimgurl AS firstimgurl"); + selectMap.put("videourl", "t.videourl AS videourl"); + selectMap.put("mway", "t.mway AS mway"); + selectMap.put("strdt", "t.strdt AS strdt"); + selectMap.put("enddt", "t.enddt AS enddt"); + selectMap.put("stCode", "t.stCode AS stCode"); + selectMap.put("stName", "t.stName AS stName"); + + if (CollUtil.isEmpty(selectFields)) { + return String.join(", ", selectMap.values()); + } + List actualColumns = new ArrayList<>(); + for (String field : selectFields) { + String column = selectMap.get(field); + if (StrUtil.isNotBlank(column)) { + actualColumns.add(column); + } + } + if (actualColumns.isEmpty()) { + actualColumns.addAll(selectMap.values()); + } + return String.join(", ", actualColumns); + } + private String buildQgcSdfpssrFilterCondition(DataSourceRequest.FilterDescriptor filter, Map paramMap, int[] indexHolder) { @@ -1070,6 +1385,119 @@ public class FpRunServiceImpl implements FpRunService { }; } + private String buildQgcFpssrlFilterCondition(DataSourceRequest.FilterDescriptor filter, + Map paramMap, + int[] indexHolder) { + if (filter == null) { + return ""; + } + if (StrUtil.isNotBlank(filter.getField())) { + return buildQgcFpssrlLeafCondition(filter, paramMap, indexHolder); + } + if (CollUtil.isEmpty(filter.getFilters())) { + return ""; + } + List conditions = new ArrayList<>(); + for (DataSourceRequest.FilterDescriptor child : filter.getFilters()) { + String childSql = buildQgcFpssrlFilterCondition(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 buildQgcFpssrlLeafCondition(DataSourceRequest.FilterDescriptor filter, + Map paramMap, + int[] indexHolder) { + String field = filter.getField(); + String operator = StrUtil.blankToDefault(filter.getOperator(), "eq").toLowerCase(); + Object value = filter.getValue(); + + if ("keyword".equalsIgnoreCase(field)) { + if (value == null || StrUtil.isBlank(String.valueOf(value))) { + return ""; + } + String key = "fpFpssrlP" + indexHolder[0]++; + paramMap.put(key, "%" + String.valueOf(value).trim() + "%"); + return "(t.STNM LIKE #{map." + key + "} OR t.BASENAME LIKE #{map." + key + "} OR t.ENNM LIKE #{map." + key + "} OR t.FTP LIKE #{map." + key + "} OR t.FISHID LIKE #{map." + key + "})"; + } + + String column = mapQgcFpssrlColumn(field); + if (StrUtil.isBlank(column)) { + return ""; + } + if ("isnull".equals(operator)) { + return column + " IS NULL"; + } + if ("isnotnull".equals(operator)) { + return column + " IS NOT NULL"; + } + boolean dateField = "tm".equalsIgnoreCase(field) || "strdt".equalsIgnoreCase(field) || "enddt".equalsIgnoreCase(field); + if ("in".equals(operator)) { + List values = normalizeValues(value); + if (values.isEmpty()) { + return ""; + } + List placeholders = new ArrayList<>(); + for (Object item : values) { + String key = "fpFpssrlP" + indexHolder[0]++; + paramMap.put(key, item); + placeholders.add(buildValueExpr(key, dateField, item)); + } + return column + " IN (" + String.join(", ", placeholders) + ")"; + } + if (value == null) { + return ""; + } + + String key = "fpFpssrlP" + indexHolder[0]++; + String valueExpr = buildValueExpr(key, dateField, value); + return switch (operator) { + case "eq" -> { + paramMap.put(key, value); + yield column + " = " + valueExpr; + } + case "neq" -> { + paramMap.put(key, value); + yield column + " <> " + valueExpr; + } + case "contains" -> { + paramMap.put(key, "%" + value + "%"); + yield column + " LIKE #{map." + key + "}"; + } + case "startswith" -> { + paramMap.put(key, value + "%"); + yield column + " LIKE #{map." + key + "}"; + } + case "endswith" -> { + paramMap.put(key, "%" + value); + yield column + " LIKE #{map." + key + "}"; + } + case "gt" -> { + paramMap.put(key, value); + yield column + " > " + valueExpr; + } + case "gte" -> { + paramMap.put(key, value); + yield column + " >= " + valueExpr; + } + case "lt" -> { + paramMap.put(key, value); + yield column + " < " + valueExpr; + } + case "lte" -> { + paramMap.put(key, value); + yield column + " <= " + valueExpr; + } + default -> ""; + }; + } + private String mapQgcSdfpssrColumn(String field) { if (StrUtil.isBlank(field)) { return null; @@ -1106,6 +1534,47 @@ public class FpRunServiceImpl implements FpRunService { }; } + private String mapQgcFpssrlColumn(String field) { + if (StrUtil.isBlank(field)) { + return null; + } + return switch (field) { + case "id" -> "t.ID"; + case "yr" -> "t.YR"; + case "stcd" -> "t.STCD"; + case "stnm" -> "t.STNM"; + case "baseId" -> "t.BASEID"; + case "baseName" -> "t.BASENAME"; + case "rstcd" -> "t.RSTCD"; + case "ennm" -> "t.ENNM"; + case "hbrvcd" -> "t.HBRVCD"; + case "baseStepSort" -> "t.BASESTEPSORT"; + case "rvcdStepSort" -> "t.RVCDSTEPSORT"; + case "siteStepSort" -> "t.SITESTEPSORT"; + case "rstcdStepSort" -> "t.RSTCDSTEPSORT"; + case "tm" -> "t.TM"; + case "ftp" -> "t.FTP"; + case "fishId" -> "t.FISHID"; + case "fsz" -> "t.FSZ"; + case "length" -> "t.LENGTH"; + case "width" -> "t.WIDTH"; + case "fishspeed" -> "t.FISHSPEED"; + case "direction" -> "t.DIRECTION"; + case "temperature" -> "t.TEMPERATURE"; + case "speed" -> "t.SPEED"; + case "channelno" -> "t.CHANNELNO"; + case "fcnt" -> "t.FCNT"; + case "firstimgurl" -> "t.FIRSTIMGURL"; + case "videourl" -> "t.VIDEOURL"; + case "mway" -> "t.MWAY"; + case "strdt" -> "t.STRDT"; + case "enddt" -> "t.ENDDT"; + case "stCode" -> "t.STCODE"; + case "stName" -> "t.STNAME"; + default -> null; + }; + } + private String buildQgcSdfpssrOrderBySql(List sortList) { if (CollUtil.isEmpty(sortList)) { return " ORDER BY t.STRDT ASC, t.STCD ASC"; @@ -1128,6 +1597,28 @@ public class FpRunServiceImpl implements FpRunService { return " ORDER BY " + String.join(", ", orderColumns); } + private String buildQgcFpssrlOrderBySql(List sortList) { + if (CollUtil.isEmpty(sortList)) { + return " ORDER BY t.TM DESC NULLS LAST, t.STCD ASC"; + } + List orderColumns = new ArrayList<>(); + for (DataSourceRequest.SortDescriptor sortDescriptor : sortList) { + if (sortDescriptor == null || StrUtil.isBlank(sortDescriptor.getField())) { + continue; + } + String column = mapQgcFpssrlColumn(sortDescriptor.getField()); + if (StrUtil.isBlank(column)) { + continue; + } + String dir = "desc".equalsIgnoreCase(sortDescriptor.getDir()) || "des".equalsIgnoreCase(sortDescriptor.getDir()) ? "DESC" : "ASC"; + orderColumns.add(column + " " + dir + " NULLS LAST"); + } + if (orderColumns.isEmpty()) { + return " ORDER BY t.TM DESC NULLS LAST, t.STCD ASC"; + } + return " ORDER BY " + String.join(", ", orderColumns); + } + private String buildQgcSdfpssrGroupOrderBySql(List groups) { if (CollUtil.isEmpty(groups)) { return ""; @@ -1147,6 +1638,25 @@ public class FpRunServiceImpl implements FpRunService { return orders.isEmpty() ? "" : " ORDER BY " + String.join(", ", orders); } + private String buildQgcFpssrlGroupOrderBySql(List groups) { + if (CollUtil.isEmpty(groups)) { + return ""; + } + List orders = new ArrayList<>(); + for (DataSourceRequest.GroupDescriptor descriptor : groups) { + if (descriptor == null || StrUtil.isBlank(descriptor.getField())) { + continue; + } + String column = mapQgcFpssrlColumn(descriptor.getField()); + if (StrUtil.isBlank(column)) { + continue; + } + String dir = "desc".equalsIgnoreCase(descriptor.getDir()) || "des".equalsIgnoreCase(descriptor.getDir()) ? "DESC" : "ASC"; + orders.add(column + " " + dir); + } + return orders.isEmpty() ? "" : " ORDER BY " + String.join(", ", orders); + } + private String buildAggregateSql(String aggregate, String column, String field) { String normalized = aggregate == null ? "" : aggregate.toLowerCase(); return switch (normalized) { From d9f58678d8ed95f13542c724aea98e8e353931b7 Mon Sep 17 00:00:00 2001 From: tangwei Date: Mon, 15 Jun 2026 10:33:43 +0800 Subject: [PATCH 4/9] =?UTF-8?q?feat:=20=E5=85=A8=E8=BF=87=E7=A8=8B?= =?UTF-8?q?=E9=B1=BC=E7=B1=BB=E6=94=BE=E6=B5=81=E8=BF=90=E8=A1=8C=E6=95=B0?= =?UTF-8?q?=E6=8D=AE=E6=9F=A5=E8=AF=A2?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../fp/controller/FishRunController.java | 29 ++ .../qgc_env/fp/entity/vo/FbFishRunVo.java | 54 +++ .../qgc_env/fp/service/FpRunService.java | 3 + .../fp/service/impl/FpRunServiceImpl.java | 392 ++++++++++++++++++ 4 files changed, 478 insertions(+) create mode 100644 backend/src/main/java/com/yfd/platform/qgc_env/fp/controller/FishRunController.java create mode 100644 backend/src/main/java/com/yfd/platform/qgc_env/fp/entity/vo/FbFishRunVo.java diff --git a/backend/src/main/java/com/yfd/platform/qgc_env/fp/controller/FishRunController.java b/backend/src/main/java/com/yfd/platform/qgc_env/fp/controller/FishRunController.java new file mode 100644 index 00000000..df436016 --- /dev/null +++ b/backend/src/main/java/com/yfd/platform/qgc_env/fp/controller/FishRunController.java @@ -0,0 +1,29 @@ +package com.yfd.platform.qgc_env.fp.controller; + +import com.yfd.platform.common.DataSourceRequest; +import com.yfd.platform.config.ResponseResult; +import com.yfd.platform.qgc_env.fp.service.FpRunService; +import io.swagger.v3.oas.annotations.Operation; +import io.swagger.v3.oas.annotations.tags.Tag; +import jakarta.annotation.Resource; +import org.springframework.validation.annotation.Validated; +import org.springframework.web.bind.annotation.PostMapping; +import org.springframework.web.bind.annotation.RequestBody; +import org.springframework.web.bind.annotation.RequestMapping; +import org.springframework.web.bind.annotation.RestController; + +@RestController +@RequestMapping("/fp/fishrun") +@Tag(name = "鱼类运行数据") +@Validated +public class FishRunController { + + @Resource + private FpRunService fpRunService; + + @PostMapping("/qgc/GetKendoListCust") + @Operation(summary = "全过程鱼类放流运行数据查询") + public ResponseResult getQgcKendoListCust(@RequestBody DataSourceRequest dataSourceRequest) { + return ResponseResult.successData(fpRunService.processFbFishRunQgcKendoList(dataSourceRequest)); + } +} diff --git a/backend/src/main/java/com/yfd/platform/qgc_env/fp/entity/vo/FbFishRunVo.java b/backend/src/main/java/com/yfd/platform/qgc_env/fp/entity/vo/FbFishRunVo.java new file mode 100644 index 00000000..b2904c6a --- /dev/null +++ b/backend/src/main/java/com/yfd/platform/qgc_env/fp/entity/vo/FbFishRunVo.java @@ -0,0 +1,54 @@ +package com.yfd.platform.qgc_env.fp.entity.vo; + +import io.swagger.v3.oas.annotations.media.Schema; +import lombok.Data; + +@Data +@Schema(description = "鱼类放流运行数据") +public class FbFishRunVo { + + @Schema(description = "电站编码") + private String stcd; + + @Schema(description = "电站名称") + private String stnm; + + @Schema(description = "鱼类编码") + private String ftp; + + @Schema(description = "鱼类名称") + private String ftpName; + + @Schema(description = "基地编码") + private String baseId; + + @Schema(description = "基地名称") + private String baseName; + + @Schema(description = "年份") + private String flyr; + + @Schema(description = "放鱼数") + private Long fcnt; + + @Schema(description = "放鱼总数") + private Long totalFcnt; + + @Schema(description = "文件ids") + private String fid; + + @Schema(description = "放流来源") + private String release; + + @Schema(description = "基地排序") + private Integer baseStepSort; + + @Schema(description = "站点排序") + private Integer siteStepSort; + + @Schema(description = "流域排序") + private Integer rvcdStepSort; + + @Schema(description = "电站排序") + private Integer rstcdStepSort; +} diff --git a/backend/src/main/java/com/yfd/platform/qgc_env/fp/service/FpRunService.java b/backend/src/main/java/com/yfd/platform/qgc_env/fp/service/FpRunService.java index 7a1bff34..a3706df7 100644 --- a/backend/src/main/java/com/yfd/platform/qgc_env/fp/service/FpRunService.java +++ b/backend/src/main/java/com/yfd/platform/qgc_env/fp/service/FpRunService.java @@ -2,6 +2,7 @@ package com.yfd.platform.qgc_env.fp.service; import com.yfd.platform.common.DataSourceRequest; import com.yfd.platform.common.DataSourceResult; +import com.yfd.platform.qgc_env.fp.entity.vo.FbFishRunVo; import com.yfd.platform.qgc_env.fp.entity.vo.FpFishSelectVo; import com.yfd.platform.qgc_env.fp.entity.vo.FpFpssrlQueryVo; import com.yfd.platform.qgc_env.fp.entity.vo.FpRunAnalysisTableVo; @@ -18,6 +19,8 @@ public interface FpRunService { DataSourceResult processQgcSdfpssrKendoList(DataSourceRequest dataSourceRequest); + DataSourceResult processFbFishRunQgcKendoList(DataSourceRequest dataSourceRequest); + DataSourceResult processQgcFpssrlQueryKendoList(DataSourceRequest dataSourceRequest); DataSourceResult processQgcFpssTableKendoList(DataSourceRequest dataSourceRequest); diff --git a/backend/src/main/java/com/yfd/platform/qgc_env/fp/service/impl/FpRunServiceImpl.java b/backend/src/main/java/com/yfd/platform/qgc_env/fp/service/impl/FpRunServiceImpl.java index 718ecfde..deb7abe9 100644 --- a/backend/src/main/java/com/yfd/platform/qgc_env/fp/service/impl/FpRunServiceImpl.java +++ b/backend/src/main/java/com/yfd/platform/qgc_env/fp/service/impl/FpRunServiceImpl.java @@ -13,6 +13,7 @@ import com.yfd.platform.common.GroupHelper; import com.yfd.platform.common.GroupingInfo; import com.yfd.platform.common.MicroservicDynamicSQLMapper; import com.yfd.platform.common.exception.BizException; +import com.yfd.platform.qgc_env.fp.entity.vo.FbFishRunVo; import com.yfd.platform.qgc_env.fp.entity.vo.FpFishSelectVo; import com.yfd.platform.qgc_env.fp.entity.vo.FpFpssrlQueryVo; import com.yfd.platform.qgc_env.fp.entity.vo.FpFtpStatisticsVo; @@ -33,6 +34,7 @@ import java.math.RoundingMode; import java.util.ArrayList; import java.util.Arrays; import java.util.Collections; +import java.util.Comparator; import java.util.HashMap; import java.util.LinkedHashMap; import java.util.LinkedHashSet; @@ -120,6 +122,95 @@ public class FpRunServiceImpl implements FpRunService { return queryQgcSdfpssrGroupList(dataSourceRequest, loadOptions); } + @Override + public DataSourceResult processFbFishRunQgcKendoList(DataSourceRequest dataSourceRequest) { + DataSourceLoadOptionsBase loadOptions = dataSourceRequest == null ? null : dataSourceRequest.toDevRequest(); + String flyr = loadOptions == null ? null : QgcQueryWrapperUtil.getFilterFieldValue(loadOptions, "flyr"); + List yearList = new ArrayList<>(); + if (StrUtil.isNotBlank(flyr) && flyr.contains(",")) { + String[] split = flyr.split(","); + if (split.length == 2) { + String time1 = split[0].trim(); + String time2 = split[1].trim(); + String startTime = time1.compareTo(time2) > 0 ? time2 : time1; + String endTime = time1.compareTo(time2) > 0 ? time1 : time2; + try { + int startYear = Integer.parseInt(startTime.substring(0, 4)); + int endYear = Integer.parseInt(endTime.substring(0, 4)); + for (int i = startYear; i <= endYear; i++) { + yearList.add(i); + } + } catch (Exception ignored) { + // Keep old behavior: ignore invalid year range and return actual query result. + } + } + } + + StringBuilder sql = new StringBuilder(); + sql.append("SELECT ") + .append(buildFbFishRunSelectSql(dataSourceRequest == null ? null : dataSourceRequest.getSelect())) + .append(" FROM (") + .append(buildFbFishRunCoreSql()) + .append(") t WHERE 1 = 1 "); + + Map paramMap = new HashMap<>(); + String filterSql = buildFbFishRunFilterCondition(dataSourceRequest == null ? null : dataSourceRequest.getFilter(), paramMap, new int[]{0}); + if (StrUtil.isNotBlank(filterSql)) { + sql.append(" AND ").append(filterSql).append(" "); + } + sql.append(buildFbFishRunOrderBySql(dataSourceRequest == null ? null : dataSourceRequest.getSort())); + + Page page = loadOptions == null ? null : QgcQueryWrapperUtil.buildPage(loadOptions, loadOptions.getSkip(), loadOptions.getTake()); + List list = microservicDynamicSQLMapper.pageAllListWithResultType(page, sql.toString(), paramMap, FbFishRunVo.class); + if (CollUtil.isNotEmpty(list)) { + for (FbFishRunVo fishRun : list) { + if (StrUtil.isNotBlank(fishRun.getFid())) { + LinkedHashSet fidSet = Arrays.stream(fishRun.getFid().split(",")) + .map(String::trim) + .filter(StrUtil::isNotBlank) + .collect(java.util.stream.Collectors.toCollection(LinkedHashSet::new)); + fishRun.setFid(fidSet.isEmpty() ? null : String.join(",", fidSet)); + } + if (StrUtil.isNotBlank(fishRun.getRelease()) && fishRun.getRelease().contains(",")) { + LinkedHashSet releaseSet = Arrays.stream(fishRun.getRelease().split(",")) + .map(String::trim) + .filter(StrUtil::isNotBlank) + .collect(java.util.stream.Collectors.toCollection(LinkedHashSet::new)); + fishRun.setRelease(releaseSet.isEmpty() ? null : String.join(",", releaseSet)); + } + if (StrUtil.isNotBlank(fishRun.getFlyr())) { + try { + Integer year = Integer.parseInt(fishRun.getFlyr()); + yearList.remove(year); + } catch (Exception ignored) { + // Ignore invalid year text and keep current result row. + } + } + } + } + + for (Integer year : yearList) { + FbFishRunVo fishRun = new FbFishRunVo(); + fishRun.setFlyr(String.valueOf(year)); + fishRun.setFcnt(0L); + fishRun.setTotalFcnt(0L); + if (page == null) { + list.add(fishRun); + } + } + if (page == null && CollUtil.isNotEmpty(list)) { + list = list.stream() + .sorted(Comparator.comparing(FbFishRunVo::getFlyr, Comparator.nullsLast(String::compareTo))) + .toList(); + } + + DataSourceResult result = new DataSourceResult<>(); + result.setData(list); + result.setTotal(page != null ? page.getTotal() : list.size()); + result.setAggregates(new HashMap<>()); + return result; + } + @Override public DataSourceResult processQgcFpssrlQueryKendoList(DataSourceRequest dataSourceRequest) { DataSourceLoadOptionsBase loadOptions = dataSourceRequest == null ? null : dataSourceRequest.toDevRequest(); @@ -793,6 +884,307 @@ public class FpRunServiceImpl implements FpRunService { return result; } + private String buildFbFishRunCoreSql() { + return "SELECT " + + " fishAgg.STCD AS STCD, " + + " NVL(eng.ENNM, fishAgg.STCD) AS STNM, " + + " eng.BASE_ID AS BASEID, " + + " hb.BASENAME AS BASENAME, " + + " NVL(hb.ORDER_INDEX, 999999) AS BASESTEPSORT, " + + " NVL(eng.ORDER_INDEX, 999999) AS SITESTEPSORT, " + + " NVL(hbrv.ORDER_INDEX, 999999) AS RVCDSTEPSORT, " + + " NVL(eng.ORDER_INDEX, 999999) AS RSTCDSTEPSORT, " + + " fishAgg.FLYR AS FLYR, " + + " fishAgg.FLYR_DATE AS FLYR_DATE, " + + " fishAgg.FTP AS FTP, " + + " fishView.NAME AS FTPNAME, " + + " fishAgg.FCNT AS FCNT, " + + " totalAgg.TOTALFCNT AS TOTALFCNT, " + + " fishAgg.FID AS FID, " + + " fishAgg.RELEASE AS RELEASE " + + "FROM ( " + + " SELECT " + + " e.STCD AS STCD, " + + " TO_CHAR(e.TM, 'YYYY') AS FLYR, " + + " TRUNC(e.TM, 'YYYY') AS FLYR_DATE, " + + " f.FTP AS FTP, " + + " SUM(f.FCNT) AS FCNT, " + + " MAX(e.FPRFID) || ',' || MAX(e.FLRFID) || ',' || MAX(e.BRRFID) || ',' || MAX(e.BRFFID) AS FID, " + + " REGEXP_REPLACE(LISTAGG(COALESCE(releaseEng.ENNM, e.RSTCD), ',') WITHIN GROUP (ORDER BY NVL(releaseEng.ORDER_INDEX, 999999), e.RSTCD), '([^,]+)(,\\1)+', '\\1') AS RELEASE " + + " FROM SD_RPIMNFISH_R f " + + " LEFT JOIN SD_ENGFR_R e ON e.ID = f.RPIMN_ID " + + " LEFT JOIN SD_ENGINFO_B_H releaseEng ON releaseEng.STCD = e.RSTCD AND NVL(releaseEng.IS_DELETED, 0) = 0 " + + " WHERE f.FTP IS NOT NULL " + + " AND NVL(f.IS_DELETED, 0) = 0 " + + " AND NVL(e.IS_DELETED, 0) = 0 " + + " GROUP BY e.STCD, TO_CHAR(e.TM, 'YYYY'), TRUNC(e.TM, 'YYYY'), f.FTP " + + ") fishAgg " + + "LEFT JOIN ( " + + " SELECT " + + " e.STCD AS STCD, " + + " TO_CHAR(e.TM, 'YYYY') AS FLYR, " + + " SUM(f.FCNT) AS TOTALFCNT " + + " FROM SD_RPIMNFISH_R f " + + " LEFT JOIN SD_ENGFR_R e ON e.ID = f.RPIMN_ID " + + " WHERE f.FTP IS NOT NULL " + + " AND NVL(f.IS_DELETED, 0) = 0 " + + " AND NVL(e.IS_DELETED, 0) = 0 " + + " GROUP BY e.STCD, TO_CHAR(e.TM, 'YYYY') " + + ") totalAgg ON totalAgg.STCD = fishAgg.STCD AND totalAgg.FLYR = fishAgg.FLYR " + + "LEFT JOIN SD_ENGINFO_B_H eng ON eng.STCD = fishAgg.STCD AND NVL(eng.IS_DELETED, 0) = 0 " + + "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.BASEID = eng.BASE_ID AND hbrv.HBRVCD = eng.HBRVCD " + + " AND NVL(hbrv.IS_DELETED, 0) = 0 AND NVL(hbrv.ENABLED, 1) = 1 " + + "LEFT JOIN V_SD_FISHDICTORY_B fishView ON fishAgg.FTP = fishView.FISH_ID " + + " AND (fishView.RVCD = eng.HBRVCD OR fishView.RVCD = 'ZY') "; + } + + private String buildFbFishRunSelectSql(List selectFields) { + Map selectMap = new LinkedHashMap<>(); + selectMap.put("stcd", "t.stcd AS stcd"); + selectMap.put("stnm", "t.stnm AS stnm"); + selectMap.put("ftp", "t.ftp AS ftp"); + selectMap.put("ftpName", "t.ftpName AS ftpName"); + selectMap.put("baseId", "t.baseId AS baseId"); + selectMap.put("baseName", "t.baseName AS baseName"); + selectMap.put("flyr", "t.flyr AS flyr"); + selectMap.put("fcnt", "t.fcnt AS fcnt"); + selectMap.put("totalFcnt", "t.totalFcnt AS totalFcnt"); + selectMap.put("fid", "t.fid AS fid"); + selectMap.put("release", "t.release AS release"); + selectMap.put("baseStepSort", "t.baseStepSort AS baseStepSort"); + selectMap.put("siteStepSort", "t.siteStepSort AS siteStepSort"); + selectMap.put("rvcdStepSort", "t.rvcdStepSort AS rvcdStepSort"); + selectMap.put("rstcdStepSort", "t.rstcdStepSort AS rstcdStepSort"); + + if (CollUtil.isEmpty(selectFields)) { + return String.join(", ", selectMap.values()); + } + List actualColumns = new ArrayList<>(); + for (String field : selectFields) { + String column = selectMap.get(field); + if (StrUtil.isNotBlank(column)) { + actualColumns.add(column); + } + } + if (actualColumns.isEmpty()) { + actualColumns.addAll(selectMap.values()); + } + return String.join(", ", actualColumns); + } + + private String buildFbFishRunFilterCondition(DataSourceRequest.FilterDescriptor filter, + Map paramMap, + int[] indexHolder) { + if (filter == null) { + return ""; + } + if (StrUtil.isNotBlank(filter.getField())) { + return buildFbFishRunLeafCondition(filter, paramMap, indexHolder); + } + if (CollUtil.isEmpty(filter.getFilters())) { + return ""; + } + List conditions = new ArrayList<>(); + for (DataSourceRequest.FilterDescriptor child : filter.getFilters()) { + String childSql = buildFbFishRunFilterCondition(child, paramMap, indexHolder); + if (StrUtil.isNotBlank(childSql)) { + conditions.add("(" + childSql + ")"); + } + } + if (conditions.isEmpty()) { + return ""; + } + return String.join("or".equalsIgnoreCase(filter.getLogic()) ? " OR " : " AND ", conditions); + } + + private String buildFbFishRunLeafCondition(DataSourceRequest.FilterDescriptor filter, + Map paramMap, + int[] indexHolder) { + String field = filter.getField(); + String operator = StrUtil.blankToDefault(filter.getOperator(), "eq").toLowerCase(); + Object value = filter.getValue(); + + if ("keyword".equalsIgnoreCase(field)) { + if (value == null || StrUtil.isBlank(String.valueOf(value))) { + return ""; + } + String key = "fbFishRunP" + indexHolder[0]++; + paramMap.put(key, "%" + String.valueOf(value).trim() + "%"); + return "(t.STNM LIKE #{map." + key + "} OR t.BASENAME LIKE #{map." + key + "} OR t.FTPNAME LIKE #{map." + key + "} OR t.RELEASE LIKE #{map." + key + "})"; + } + + if ("flyr".equalsIgnoreCase(field)) { + return buildFbFishRunYearCondition(filter, paramMap, indexHolder); + } + if ("rstcd".equalsIgnoreCase(field)) { + field = "stcd"; + } + + String column = mapFbFishRunColumn(field); + if (StrUtil.isBlank(column)) { + return ""; + } + if ("isnull".equals(operator)) { + return column + " IS NULL"; + } + if ("isnotnull".equals(operator)) { + return column + " IS NOT NULL"; + } + if ("in".equals(operator)) { + List values = normalizeValues(value); + if (values.isEmpty()) { + return ""; + } + List placeholders = new ArrayList<>(); + for (Object item : values) { + String key = "fbFishRunP" + indexHolder[0]++; + paramMap.put(key, item); + placeholders.add("#{map." + key + "}"); + } + return column + " IN (" + String.join(", ", placeholders) + ")"; + } + if (value == null) { + return ""; + } + + String key = "fbFishRunP" + indexHolder[0]++; + return switch (operator) { + case "eq" -> { + paramMap.put(key, value); + yield column + " = #{map." + key + "}"; + } + case "neq" -> { + paramMap.put(key, value); + yield column + " <> #{map." + key + "}"; + } + case "contains" -> { + paramMap.put(key, "%" + value + "%"); + yield column + " LIKE #{map." + key + "}"; + } + case "startswith" -> { + paramMap.put(key, value + "%"); + yield column + " LIKE #{map." + key + "}"; + } + case "endswith" -> { + paramMap.put(key, "%" + value); + yield column + " LIKE #{map." + key + "}"; + } + case "gt" -> { + paramMap.put(key, value); + yield column + " > #{map." + key + "}"; + } + case "gte" -> { + paramMap.put(key, value); + yield column + " >= #{map." + key + "}"; + } + case "lt" -> { + paramMap.put(key, value); + yield column + " < #{map." + key + "}"; + } + case "lte" -> { + paramMap.put(key, value); + yield column + " <= #{map." + key + "}"; + } + default -> ""; + }; + } + + private String buildFbFishRunYearCondition(DataSourceRequest.FilterDescriptor filter, + Map paramMap, + int[] indexHolder) { + Object value = filter.getValue(); + String operator = StrUtil.blankToDefault(filter.getOperator(), "eq").toLowerCase(); + if (value == null) { + return ""; + } + String text = String.valueOf(value).trim(); + if (text.contains(",") && text.contains("-")) { + String[] split = text.split(","); + if (split.length == 2) { + String startKey = "fbFishRunP" + indexHolder[0]++; + String endKey = "fbFishRunP" + indexHolder[0]++; + paramMap.put(startKey, split[0].trim()); + paramMap.put(endKey, split[1].trim()); + return "t.FLYR_DATE >= " + buildValueExpr(startKey, true, split[0].trim()) + + " AND t.FLYR_DATE <= " + buildValueExpr(endKey, true, split[1].trim()); + } + } + if ("in".equals(operator)) { + List values = normalizeValues(value); + if (values.isEmpty()) { + return ""; + } + List placeholders = new ArrayList<>(); + for (Object item : values) { + String key = "fbFishRunP" + indexHolder[0]++; + paramMap.put(key, item); + placeholders.add("#{map." + key + "}"); + } + return "t.FLYR IN (" + String.join(", ", placeholders) + ")"; + } + String key = "fbFishRunP" + indexHolder[0]++; + paramMap.put(key, text); + return switch (operator) { + case "eq" -> "t.FLYR = TO_CHAR(TO_DATE(#{map." + key + "}, 'YYYY-MM-DD HH24:MI:SS'), 'YYYY')"; + case "neq" -> "t.FLYR <> TO_CHAR(TO_DATE(#{map." + key + "}, 'YYYY-MM-DD HH24:MI:SS'), 'YYYY')"; + case "gt" -> "t.FLYR > TO_CHAR(TO_DATE(#{map." + key + "}, 'YYYY-MM-DD HH24:MI:SS'), 'YYYY')"; + case "gte" -> "t.FLYR >= TO_CHAR(TO_DATE(#{map." + key + "}, 'YYYY-MM-DD HH24:MI:SS'), 'YYYY')"; + case "lt" -> "t.FLYR < TO_CHAR(TO_DATE(#{map." + key + "}, 'YYYY-MM-DD HH24:MI:SS'), 'YYYY')"; + case "lte" -> "t.FLYR <= TO_CHAR(TO_DATE(#{map." + key + "}, 'YYYY-MM-DD HH24:MI:SS'), 'YYYY')"; + default -> ""; + }; + } + + private String mapFbFishRunColumn(String field) { + if (StrUtil.isBlank(field)) { + return null; + } + return switch (field) { + case "stcd" -> "t.STCD"; + case "stnm" -> "t.STNM"; + case "ftp" -> "t.FTP"; + case "ftpName" -> "t.FTPNAME"; + case "baseId" -> "t.BASEID"; + case "baseName" -> "t.BASENAME"; + case "fcnt" -> "t.FCNT"; + case "totalFcnt" -> "t.TOTALFCNT"; + case "fid" -> "t.FID"; + case "release" -> "t.RELEASE"; + case "baseStepSort" -> "t.BASESTEPSORT"; + case "siteStepSort" -> "t.SITESTEPSORT"; + case "rvcdStepSort" -> "t.RVCDSTEPSORT"; + case "rstcdStepSort" -> "t.RSTCDSTEPSORT"; + default -> null; + }; + } + + private String buildFbFishRunOrderBySql(List sortList) { + if (CollUtil.isEmpty(sortList)) { + return " ORDER BY t.FLYR ASC, t.STCD ASC, t.FTP ASC"; + } + List orderColumns = new ArrayList<>(); + for (DataSourceRequest.SortDescriptor sortDescriptor : sortList) { + if (sortDescriptor == null || StrUtil.isBlank(sortDescriptor.getField())) { + continue; + } + String field = sortDescriptor.getField(); + if ("rstcd".equalsIgnoreCase(field)) { + field = "stcd"; + } + String column = "flyr".equalsIgnoreCase(field) ? "t.FLYR" : mapFbFishRunColumn(field); + if (StrUtil.isBlank(column)) { + continue; + } + String dir = "desc".equalsIgnoreCase(sortDescriptor.getDir()) || "des".equalsIgnoreCase(sortDescriptor.getDir()) ? "DESC" : "ASC"; + orderColumns.add(column + " " + dir + " NULLS LAST"); + } + if (orderColumns.isEmpty()) { + return " ORDER BY t.FLYR ASC, t.STCD ASC, t.FTP ASC"; + } + return " ORDER BY " + String.join(", ", orderColumns); + } + private DataSourceResult queryQgcFpssrlDetailList(DataSourceRequest dataSourceRequest, DataSourceLoadOptionsBase loadOptions) { StringBuilder sql = new StringBuilder(); From d88f34c549a921a1d274c7008bb003e9961d908a Mon Sep 17 00:00:00 2001 From: tangwei Date: Mon, 15 Jun 2026 11:02:06 +0800 Subject: [PATCH 5/9] =?UTF-8?q?feat:=20=E6=A0=B9=E6=8D=AE=E6=9D=A1?= =?UTF-8?q?=E4=BB=B6=E6=9F=A5=E8=AF=A2=E6=B0=B4=E6=96=87=E6=B5=81=E9=87=8F?= =?UTF-8?q?=E7=AB=99=E5=9F=BA=E7=A1=80=E6=95=B0=E6=8D=AE(=E5=B7=A5?= =?UTF-8?q?=E7=A8=8B=E4=B8=93=E9=A2=98=E8=AF=A2?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../zq/controller/ZqMonitorController.java | 6 ++++++ .../qgc_env/zq/entity/vo/ZqBaseInfoVo.java | 3 +++ .../qgc_env/zq/service/ZqMonitorService.java | 2 ++ .../zq/service/impl/ZqMonitorServiceImpl.java | 20 +++++++++++++++++++ 4 files changed, 31 insertions(+) diff --git a/backend/src/main/java/com/yfd/platform/qgc_env/zq/controller/ZqMonitorController.java b/backend/src/main/java/com/yfd/platform/qgc_env/zq/controller/ZqMonitorController.java index 534b6b8b..b08b9126 100644 --- a/backend/src/main/java/com/yfd/platform/qgc_env/zq/controller/ZqMonitorController.java +++ b/backend/src/main/java/com/yfd/platform/qgc_env/zq/controller/ZqMonitorController.java @@ -29,6 +29,12 @@ public class ZqMonitorController { return ResponseResult.successData(zqMonitorService.getMsstbprptList(dataSourceRequest)); } + @PostMapping("/msstbprpt/eng/GetKendoList") + @Operation(summary = "根据条件查询水文流量站基础数据(工程专题)") + public ResponseResult getEngMsstbprptList(@RequestBody DataSourceRequest dataSourceRequest) { + return ResponseResult.successData(zqMonitorService.getEngMsstbprptList(dataSourceRequest)); + } + @PostMapping("/river/GetKendoListCust") @Operation(summary = "查询流量站实时数据") public ResponseResult getRiverKendoListCust(@RequestBody DataSourceRequest dataSourceRequest) { diff --git a/backend/src/main/java/com/yfd/platform/qgc_env/zq/entity/vo/ZqBaseInfoVo.java b/backend/src/main/java/com/yfd/platform/qgc_env/zq/entity/vo/ZqBaseInfoVo.java index 0dfcbd38..ed88d45b 100644 --- a/backend/src/main/java/com/yfd/platform/qgc_env/zq/entity/vo/ZqBaseInfoVo.java +++ b/backend/src/main/java/com/yfd/platform/qgc_env/zq/entity/vo/ZqBaseInfoVo.java @@ -30,6 +30,9 @@ public class ZqBaseInfoVo { @Schema(description = "纬度") private Double lttd; + @Schema(description = "水温设备类型") + private Integer wtDeviceType; + @Schema(description = "海拔") private Double elev; diff --git a/backend/src/main/java/com/yfd/platform/qgc_env/zq/service/ZqMonitorService.java b/backend/src/main/java/com/yfd/platform/qgc_env/zq/service/ZqMonitorService.java index 1eff40a1..9c5aff7a 100644 --- a/backend/src/main/java/com/yfd/platform/qgc_env/zq/service/ZqMonitorService.java +++ b/backend/src/main/java/com/yfd/platform/qgc_env/zq/service/ZqMonitorService.java @@ -9,6 +9,8 @@ public interface ZqMonitorService { DataSourceResult getMsstbprptList(DataSourceRequest dataSourceRequest); + DataSourceResult getEngMsstbprptList(DataSourceRequest dataSourceRequest); + DataSourceResult getRiverKendoListCust(DataSourceRequest dataSourceRequest); ZqBaseInfoVo getStcdInfo(String stcd); diff --git a/backend/src/main/java/com/yfd/platform/qgc_env/zq/service/impl/ZqMonitorServiceImpl.java b/backend/src/main/java/com/yfd/platform/qgc_env/zq/service/impl/ZqMonitorServiceImpl.java index af6eb22c..b95f56e2 100644 --- a/backend/src/main/java/com/yfd/platform/qgc_env/zq/service/impl/ZqMonitorServiceImpl.java +++ b/backend/src/main/java/com/yfd/platform/qgc_env/zq/service/impl/ZqMonitorServiceImpl.java @@ -33,6 +33,17 @@ public class ZqMonitorServiceImpl implements ZqMonitorService { @Override public DataSourceResult getMsstbprptList(DataSourceRequest dataSourceRequest) { + return getMsstbprptListInternal(dataSourceRequest, false); + } + + @Override + public DataSourceResult getEngMsstbprptList(DataSourceRequest dataSourceRequest) { + DataSourceRequest request = dataSourceRequest == null ? new DataSourceRequest() : dataSourceRequest; + request.setSelect(Arrays.asList("stcd", "stnm", "wtDeviceType", "dtinType", "mway")); + return getMsstbprptListInternal(request, true); + } + + private DataSourceResult getMsstbprptListInternal(DataSourceRequest dataSourceRequest, boolean onlyZq) { DataSourceLoadOptionsBase loadOptions = dataSourceRequest == null ? null : dataSourceRequest.toDevRequest(); if (CollUtil.isEmpty(dataSourceRequest == null ? null : dataSourceRequest.getGroup())) { StringBuilder sql = new StringBuilder(); @@ -48,6 +59,9 @@ public class ZqMonitorServiceImpl implements ZqMonitorService { .append("LEFT JOIN SD_RVCD_DIC rv ON rv.RVCD = eng.RVCD ") .append("LEFT JOIN SD_ADDVCD_DIC addv ON addv.ADDVCD = eng.ADDVCD ") .append("WHERE NVL(t.IS_DELETED, 0) = 0 "); + if (onlyZq) { + sql.append("AND t.STTP = 'ZQ' "); + } Map paramMap = new HashMap<>(); String filterSql = buildMsstbprptFilterCondition(dataSourceRequest == null ? null : dataSourceRequest.getFilter(), paramMap, new int[]{0}); @@ -89,6 +103,9 @@ public class ZqMonitorServiceImpl implements ZqMonitorService { .append("FROM SD_RIVER_B_H t ") .append("LEFT JOIN SD_ENGINFO_B_H eng ON eng.STCD = t.RSTCD AND NVL(eng.IS_DELETED, 0) = 0 ") .append("WHERE NVL(t.IS_DELETED, 0) = 0 "); + if (onlyZq) { + sql.append("AND t.STTP = 'ZQ' "); + } Map paramMap = new HashMap<>(); String filterSql = buildMsstbprptFilterCondition(dataSourceRequest == null ? null : dataSourceRequest.getFilter(), paramMap, new int[]{0}); @@ -778,6 +795,7 @@ public class ZqMonitorServiceImpl implements ZqMonitorService { } return switch (field) { case "isDeleted" -> "NVL(t.IS_DELETED, 0)"; + case "sttpFullPath" -> null; case "sttpCode" -> "t.STTP"; case "mway" -> "t.MWAY"; case "dtinType" -> "t.DTIN_TYPE"; @@ -800,6 +818,7 @@ public class ZqMonitorServiceImpl implements ZqMonitorService { selectMap.put("sttpCode", "t.STTP AS sttpCode"); selectMap.put("lgtd", "t.LGTD AS lgtd"); selectMap.put("lttd", "t.LTTD AS lttd"); + selectMap.put("wtDeviceType", "CAST(NULL AS NUMBER(10,0)) AS wtDeviceType"); selectMap.put("elev", "t.ELEV AS elev"); selectMap.put("stlc", "t.STLC AS stlc"); selectMap.put("jcdt", "t.JCDT AS jcdt"); @@ -921,6 +940,7 @@ public class ZqMonitorServiceImpl implements ZqMonitorService { case "sttp", "sttpCode" -> "t.STTP"; case "lgtd" -> "t.LGTD"; case "lttd" -> "t.LTTD"; + case "wtDeviceType" -> "CAST(NULL AS NUMBER(10,0))"; case "elev" -> "t.ELEV"; case "stlc" -> "t.STLC"; case "jcdt" -> "t.JCDT"; From 007b7df459b9e5af6479ced875f4a6aad1075652 Mon Sep 17 00:00:00 2001 From: tangwei Date: Mon, 15 Jun 2026 11:11:54 +0800 Subject: [PATCH 6/9] =?UTF-8?q?feat:=20=E6=9F=A5=E8=AF=A2=E6=B5=81?= =?UTF-8?q?=E9=87=8F=E7=AB=99=E6=97=A5=E6=95=B0=E6=8D=AE?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../zq/controller/ZqMonitorController.java | 6 + .../zq/entity/vo/ZqRiverDayDataVo.java | 77 ++++ .../qgc_env/zq/service/ZqMonitorService.java | 3 + .../zq/service/impl/ZqMonitorServiceImpl.java | 362 ++++++++++++++++++ 4 files changed, 448 insertions(+) create mode 100644 backend/src/main/java/com/yfd/platform/qgc_env/zq/entity/vo/ZqRiverDayDataVo.java diff --git a/backend/src/main/java/com/yfd/platform/qgc_env/zq/controller/ZqMonitorController.java b/backend/src/main/java/com/yfd/platform/qgc_env/zq/controller/ZqMonitorController.java index b08b9126..bfbe270a 100644 --- a/backend/src/main/java/com/yfd/platform/qgc_env/zq/controller/ZqMonitorController.java +++ b/backend/src/main/java/com/yfd/platform/qgc_env/zq/controller/ZqMonitorController.java @@ -41,6 +41,12 @@ public class ZqMonitorController { return ResponseResult.successData(zqMonitorService.getRiverKendoListCust(dataSourceRequest)); } + @PostMapping("/river/day/GetKendoListCust") + @Operation(summary = "查询流量站日数据") + public ResponseResult getRiverDayKendoListCust(@RequestBody DataSourceRequest dataSourceRequest) { + return ResponseResult.successData(zqMonitorService.getRiverDayKendoListCust(dataSourceRequest)); + } + @GetMapping("/msstbprpt/getStcdInfo") @Operation(summary = "根据站码查询单条水文站基础数据") public ResponseResult getStcdInfo(@RequestParam String stcd) { diff --git a/backend/src/main/java/com/yfd/platform/qgc_env/zq/entity/vo/ZqRiverDayDataVo.java b/backend/src/main/java/com/yfd/platform/qgc_env/zq/entity/vo/ZqRiverDayDataVo.java new file mode 100644 index 00000000..6a448b64 --- /dev/null +++ b/backend/src/main/java/com/yfd/platform/qgc_env/zq/entity/vo/ZqRiverDayDataVo.java @@ -0,0 +1,77 @@ +package com.yfd.platform.qgc_env.zq.entity.vo; + +import com.fasterxml.jackson.annotation.JsonFormat; +import io.swagger.v3.oas.annotations.media.Schema; +import lombok.Data; + +import java.math.BigDecimal; +import java.util.Date; + +@Data +@Schema(description = "流量站日数据") +public class ZqRiverDayDataVo { + + @Schema(description = "主键ID") + private String id; + + @Schema(description = "站码") + private String stcd; + + @Schema(description = "所属电站编码") + private String rstcd; + + @Schema(description = "所属电站名称") + private String ennm; + + @Schema(description = "站点名称") + private String stnm; + + @Schema(description = "基地编码") + private String baseId; + + @Schema(description = "基地名称") + private String baseName; + + @JsonFormat(pattern = "yyyy-MM-dd", timezone = "GMT+8") + @Schema(description = "日期") + private Date dt; + + @Schema(description = "水位") + private BigDecimal z; + + @Schema(description = "流量") + private BigDecimal q; + + @Schema(description = "流速") + private BigDecimal v; + + @Schema(description = "测流方法") + private String msqmt; + + @Schema(description = "站址") + private String stlc; + + @Schema(description = "创建人") + private String recordUser; + + @Schema(description = "创建时间") + private Date recordTime; + + @Schema(description = "更新人") + private String modifyUser; + + @Schema(description = "更新时间") + private Date modifyTime; + + @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/qgc_env/zq/service/ZqMonitorService.java b/backend/src/main/java/com/yfd/platform/qgc_env/zq/service/ZqMonitorService.java index 9c5aff7a..983ec39e 100644 --- a/backend/src/main/java/com/yfd/platform/qgc_env/zq/service/ZqMonitorService.java +++ b/backend/src/main/java/com/yfd/platform/qgc_env/zq/service/ZqMonitorService.java @@ -3,6 +3,7 @@ package com.yfd.platform.qgc_env.zq.service; import com.yfd.platform.common.DataSourceRequest; import com.yfd.platform.common.DataSourceResult; import com.yfd.platform.qgc_env.zq.entity.vo.ZqBaseInfoVo; +import com.yfd.platform.qgc_env.zq.entity.vo.ZqRiverDayDataVo; import com.yfd.platform.qgc_env.zq.entity.vo.ZqRiverDataVo; public interface ZqMonitorService { @@ -13,5 +14,7 @@ public interface ZqMonitorService { DataSourceResult getRiverKendoListCust(DataSourceRequest dataSourceRequest); + DataSourceResult getRiverDayKendoListCust(DataSourceRequest dataSourceRequest); + ZqBaseInfoVo getStcdInfo(String stcd); } diff --git a/backend/src/main/java/com/yfd/platform/qgc_env/zq/service/impl/ZqMonitorServiceImpl.java b/backend/src/main/java/com/yfd/platform/qgc_env/zq/service/impl/ZqMonitorServiceImpl.java index b95f56e2..90d475a6 100644 --- a/backend/src/main/java/com/yfd/platform/qgc_env/zq/service/impl/ZqMonitorServiceImpl.java +++ b/backend/src/main/java/com/yfd/platform/qgc_env/zq/service/impl/ZqMonitorServiceImpl.java @@ -12,6 +12,7 @@ import com.yfd.platform.common.MicroservicDynamicSQLMapper; import com.yfd.platform.common.exception.BizException; import com.yfd.platform.qgc_env.fh.entity.vo.HabitatVo; import com.yfd.platform.qgc_env.zq.entity.vo.ZqBaseInfoVo; +import com.yfd.platform.qgc_env.zq.entity.vo.ZqRiverDayDataVo; import com.yfd.platform.qgc_env.zq.entity.vo.ZqRiverDataVo; import com.yfd.platform.qgc_env.zq.service.ZqMonitorService; import com.yfd.platform.utils.QgcQueryWrapperUtil; @@ -132,6 +133,15 @@ public class ZqMonitorServiceImpl implements ZqMonitorService { return queryRiverGroupList(dataSourceRequest, loadOptions); } + @Override + public DataSourceResult getRiverDayKendoListCust(DataSourceRequest dataSourceRequest) { + DataSourceLoadOptionsBase loadOptions = dataSourceRequest == null ? null : dataSourceRequest.toDevRequest(); + if (CollUtil.isEmpty(dataSourceRequest == null ? null : dataSourceRequest.getGroup())) { + return queryRiverDayDetailList(dataSourceRequest, loadOptions); + } + return queryRiverDayGroupList(dataSourceRequest, loadOptions); + } + @Override public ZqBaseInfoVo getStcdInfo(String stcd) { if (StrUtil.isBlank(stcd)) { @@ -232,6 +242,100 @@ public class ZqMonitorServiceImpl implements ZqMonitorService { return result; } + private DataSourceResult queryRiverDayDetailList(DataSourceRequest dataSourceRequest, + DataSourceLoadOptionsBase loadOptions) { + StringBuilder sql = new StringBuilder(); + sql.append("SELECT ") + .append(buildRiverDayDetailSelectSql(dataSourceRequest == null ? null : dataSourceRequest.getSelect())) + .append(" FROM (") + .append(buildRiverDayCoreSql()) + .append(") t WHERE 1 = 1 "); + + Map paramMap = new HashMap<>(); + String filterSql = buildRiverDayFilterCondition(dataSourceRequest == null ? null : dataSourceRequest.getFilter(), paramMap, new int[]{0}); + if (StrUtil.isNotBlank(filterSql)) { + sql.append(" AND ").append(filterSql).append(" "); + } + sql.append(buildRiverDayOrderBySql(dataSourceRequest == null ? null : dataSourceRequest.getSort())); + + Page page = loadOptions == null ? null : QgcQueryWrapperUtil.buildPage(loadOptions, loadOptions.getSkip(), loadOptions.getTake()); + List list = microservicDynamicSQLMapper.pageAllListWithResultType(page, sql.toString(), paramMap, ZqRiverDayDataVo.class); + DataSourceResult result = new DataSourceResult<>(); + result.setData(list); + result.setTotal(page != null ? page.getTotal() : list.size()); + result.setAggregates(new HashMap<>()); + return result; + } + + private DataSourceResult queryRiverDayGroupList(DataSourceRequest dataSourceRequest, + DataSourceLoadOptionsBase loadOptions) { + List groups = dataSourceRequest.getGroup(); + GroupingInfo[] groupInfos = loadOptions == null ? new GroupingInfo[0] : loadOptions.getGroup(); + + StringBuilder sql = new StringBuilder("SELECT "); + List selectItems = new ArrayList<>(); + for (DataSourceRequest.GroupDescriptor descriptor : groups) { + if (descriptor == null || StrUtil.isBlank(descriptor.getField())) { + continue; + } + String column = mapRiverDayColumn(descriptor.getField()); + if (StrUtil.isBlank(column)) { + continue; + } + selectItems.add(column + " AS " + descriptor.getField().toUpperCase()); + selectItems.add("COUNT(*) AS COUNT_" + descriptor.getField().toUpperCase()); + if (CollUtil.isNotEmpty(descriptor.getAggregates())) { + for (DataSourceRequest.AggregateDescriptor aggregate : descriptor.getAggregates()) { + String aggregateColumn = mapRiverDayColumn(aggregate.getField()); + if (StrUtil.isBlank(aggregateColumn) || StrUtil.isBlank(aggregate.getAggregate())) { + continue; + } + selectItems.add(buildRiverAggregateSql(aggregate.getAggregate(), aggregateColumn, aggregate.getField())); + } + } + } + if (selectItems.isEmpty()) { + selectItems.add("t.STCD AS STCD"); + selectItems.add("COUNT(*) AS COUNT_STCD"); + } + sql.append(String.join(", ", selectItems)) + .append(" FROM (") + .append(buildRiverDayCoreSql()) + .append(") t WHERE 1 = 1 "); + + Map paramMap = new HashMap<>(); + String filterSql = buildRiverDayFilterCondition(dataSourceRequest == null ? null : dataSourceRequest.getFilter(), paramMap, new int[]{0}); + if (StrUtil.isNotBlank(filterSql)) { + sql.append(" AND ").append(filterSql).append(" "); + } + + List groupByColumns = new ArrayList<>(); + for (DataSourceRequest.GroupDescriptor descriptor : groups) { + if (descriptor == null || StrUtil.isBlank(descriptor.getField())) { + continue; + } + String column = mapRiverDayColumn(descriptor.getField()); + if (StrUtil.isNotBlank(column)) { + groupByColumns.add(column); + } + } + if (!groupByColumns.isEmpty()) { + sql.append(" GROUP BY ").append(String.join(", ", groupByColumns)).append(" "); + } + sql.append(buildRiverDayGroupOrderBySql(groups)); + + List> rows = microservicDynamicSQLMapper.pageAllList(null, sql.toString(), paramMap); + DataSourceResult result = new DataSourceResult(); + if (Boolean.TRUE.equals(dataSourceRequest.getGroupResultFlat())) { + result.setData(new GroupHelper().faltGroup(rows, Arrays.asList(groupInfos))); + } else { + result.setData(new GroupHelper().group(rows, Arrays.asList(groupInfos))); + } + result.setTotal(0L); + result.setAggregates(new HashMap<>()); + return result; + } + private DataSourceResult queryRiverGroupList(DataSourceRequest dataSourceRequest, DataSourceLoadOptionsBase loadOptions) { List groups = dataSourceRequest.getGroup(); @@ -379,6 +483,49 @@ public class ZqMonitorServiceImpl implements ZqMonitorService { "eng.RVCD, rv.RVNM, eng.HBRVCD, hbrv.HBRVNM, rb.BLDSTT_CODE, hb.ORDER_INDEX, along.ORDER_INDEX, rstSort.SORT, siteSort.SORT"; } + private String buildRiverDayCoreSql() { + return "SELECT " + + "day.ID AS id, " + + "day.STCD AS stcd, " + + "rb.RSTCD AS rstcd, " + + "eng.ENNM AS ennm, " + + "rb.STNM AS stnm, " + + "eng.BASE_ID AS baseId, " + + "hb.BASENAME AS baseName, " + + "day.DT AS dt, " + + "day.Z AS z, " + + "day.Q AS q, " + + "day.V AS v, " + + "day.MSQMT AS msqmt, " + + "rb.STLC AS stlc, " + + "day.RECORD_USER AS recordUser, " + + "day.RECORD_TIME AS recordTime, " + + "day.MODIFY_USER AS modifyUser, " + + "day.MODIFY_TIME AS modifyTime, " + + "NVL(hb.ORDER_INDEX, 999999) AS baseStepSort, " + + "NVL(along.ORDER_INDEX, 999999) AS rvcdStepSort, " + + "NVL(rstSort.SORT, 999999) AS rstcdStepSort, " + + "NVL(siteSort.SORT, 999999) AS siteStepSort " + + "FROM SD_RIVERDAY_S day " + + "INNER JOIN SD_RIVER_B_H rb ON rb.STCD = day.STCD AND rb.STTP = 'ZQ' AND NVL(rb.IS_DELETED, 0) = 0 " + + "LEFT JOIN SD_ENGINFO_B_H eng ON eng.STCD = rb.RSTCD AND NVL(eng.IS_DELETED, 0) = 0 " + + "LEFT JOIN SD_HYDROBASE hb ON hb.BASEID = eng.BASE_ID AND NVL(hb.IS_DELETED, 0) = 0 " + + "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, cfg.RVCD, det.STCD " + + " FROM MS_ALONGDET_B det " + + " INNER JOIN MS_ALONG_B cfg ON det.ALONG_ID = cfg.ID " + + " WHERE NVL(det.IS_DELETED, 0) = 0 AND NVL(cfg.IS_DELETED, 0) = 0 AND cfg.CODE = 'common' " + + ") rstSort ON rstSort.RVCD = eng.HBRVCD AND rstSort.STCD = rb.RSTCD " + + "LEFT JOIN ( " + + " SELECT det.SORT, cfg.RVCD, det.STCD " + + " FROM MS_ALONGDET_B det " + + " INNER JOIN MS_ALONG_B cfg ON det.ALONG_ID = cfg.ID " + + " WHERE NVL(det.IS_DELETED, 0) = 0 AND NVL(cfg.IS_DELETED, 0) = 0 AND cfg.CODE = 'common' " + + ") siteSort ON siteSort.RVCD = eng.HBRVCD AND siteSort.STCD = rb.STCD " + + "WHERE NVL(day.IS_DELETED, 0) = 0 "; + } + private String buildRiverFilterCondition(DataSourceRequest.FilterDescriptor filter, Map paramMap, int[] indexHolder) { @@ -405,6 +552,32 @@ public class ZqMonitorServiceImpl implements ZqMonitorService { return String.join(logic, conditions); } + private String buildRiverDayFilterCondition(DataSourceRequest.FilterDescriptor filter, + Map paramMap, + int[] indexHolder) { + if (filter == null) { + return ""; + } + if (StrUtil.isNotBlank(filter.getField())) { + return buildRiverDayLeafCondition(filter, paramMap, indexHolder); + } + if (CollUtil.isEmpty(filter.getFilters())) { + return ""; + } + List conditions = new ArrayList<>(); + for (DataSourceRequest.FilterDescriptor child : filter.getFilters()) { + String childSql = buildRiverDayFilterCondition(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 buildRiverLeafCondition(DataSourceRequest.FilterDescriptor filter, Map paramMap, int[] indexHolder) { @@ -486,6 +659,83 @@ public class ZqMonitorServiceImpl implements ZqMonitorService { }; } + private String buildRiverDayLeafCondition(DataSourceRequest.FilterDescriptor filter, + Map paramMap, + int[] indexHolder) { + String field = filter.getField(); + String operator = StrUtil.blankToDefault(filter.getOperator(), "eq").toLowerCase(); + Object value = filter.getValue(); + String column = mapRiverDayColumn(field); + if (StrUtil.isBlank(column)) { + return ""; + } + if ("isnull".equals(operator)) { + return column + " IS NULL"; + } + if ("isnotnull".equals(operator)) { + return column + " IS NOT NULL"; + } + boolean dateField = "dt".equalsIgnoreCase(field) || "DT".equals(field) || "recordTime".equalsIgnoreCase(field) || "modifyTime".equalsIgnoreCase(field); + if ("in".equals(operator)) { + List values = normalizeRiverValues(value); + if (values.isEmpty()) { + return ""; + } + List placeholders = new ArrayList<>(); + for (Object item : values) { + String key = "zqRiverDayP" + indexHolder[0]++; + paramMap.put(key, item); + placeholders.add(buildRiverValueExpr(key, dateField, item)); + } + return column + " IN (" + String.join(", ", placeholders) + ")"; + } + if (value == null) { + return ""; + } + + String key = "zqRiverDayP" + indexHolder[0]++; + String valueExpr = buildRiverValueExpr(key, dateField, value); + return switch (operator) { + case "eq" -> { + paramMap.put(key, value); + yield column + " = " + valueExpr; + } + case "neq" -> { + paramMap.put(key, value); + yield column + " <> " + valueExpr; + } + case "contains" -> { + paramMap.put(key, "%" + value + "%"); + yield column + " LIKE #{map." + key + "}"; + } + case "startswith" -> { + paramMap.put(key, value + "%"); + yield column + " LIKE #{map." + key + "}"; + } + case "endswith" -> { + paramMap.put(key, "%" + value); + yield column + " LIKE #{map." + key + "}"; + } + case "gt" -> { + paramMap.put(key, value); + yield column + " > " + valueExpr; + } + case "gte" -> { + paramMap.put(key, value); + yield column + " >= " + valueExpr; + } + case "lt" -> { + paramMap.put(key, value); + yield column + " < " + valueExpr; + } + case "lte" -> { + paramMap.put(key, value); + yield column + " <= " + valueExpr; + } + default -> ""; + }; + } + private String buildRiverVdidCondition(String operator, Object value, Map paramMap, @@ -582,6 +832,36 @@ public class ZqMonitorServiceImpl implements ZqMonitorService { }; } + private String mapRiverDayColumn(String field) { + if (StrUtil.isBlank(field)) { + return null; + } + return switch (field) { + case "id" -> "t.ID"; + case "stcd" -> "t.STCD"; + case "rstcd" -> "t.RSTCD"; + case "ennm" -> "t.ENNM"; + case "stnm" -> "t.STNM"; + case "baseId" -> "t.BASEID"; + case "baseName" -> "t.BASENAME"; + case "dt", "DT" -> "t.DT"; + case "z" -> "t.Z"; + case "q" -> "t.Q"; + case "v" -> "t.V"; + case "msqmt" -> "t.MSQMT"; + case "stlc" -> "t.STLC"; + case "recordUser" -> "t.RECORDUSER"; + case "recordTime" -> "t.RECORDTIME"; + case "modifyUser" -> "t.MODIFYUSER"; + case "modifyTime" -> "t.MODIFYTIME"; + case "baseStepSort" -> "t.BASESTEPSORT"; + case "rvcdStepSort" -> "t.RVCDSTEPSORT"; + case "rstcdStepSort" -> "t.RSTCDSTEPSORT"; + case "siteStepSort" -> "t.SITESTEPSORT"; + default -> null; + }; + } + private String buildRiverDetailSelectSql(List selectFields) { Map selectMap = new LinkedHashMap<>(); selectMap.put("q", "t.Q AS q"); @@ -626,6 +906,47 @@ public class ZqMonitorServiceImpl implements ZqMonitorService { return String.join(", ", actualColumns); } + private String buildRiverDayDetailSelectSql(List selectFields) { + Map selectMap = new LinkedHashMap<>(); + selectMap.put("id", "t.ID AS id"); + selectMap.put("stcd", "t.STCD AS stcd"); + selectMap.put("rstcd", "t.RSTCD AS rstcd"); + selectMap.put("ennm", "t.ENNM AS ennm"); + selectMap.put("stnm", "t.STNM AS stnm"); + selectMap.put("baseId", "t.BASEID AS baseId"); + selectMap.put("baseName", "t.BASENAME AS baseName"); + selectMap.put("dt", "t.DT AS dt"); +// selectMap.put("DT", "t.DT AS dt"); + selectMap.put("z", "t.Z AS z"); + selectMap.put("q", "t.Q AS q"); + selectMap.put("v", "t.V AS v"); + selectMap.put("msqmt", "t.MSQMT AS msqmt"); + selectMap.put("stlc", "t.STLC AS stlc"); + selectMap.put("recordUser", "t.RECORDUSER AS recordUser"); + selectMap.put("recordTime", "t.RECORDTIME AS recordTime"); + selectMap.put("modifyUser", "t.MODIFYUSER AS modifyUser"); + selectMap.put("modifyTime", "t.MODIFYTIME AS modifyTime"); + selectMap.put("baseStepSort", "t.BASESTEPSORT AS baseStepSort"); + selectMap.put("rvcdStepSort", "t.RVCDSTEPSORT AS rvcdStepSort"); + selectMap.put("rstcdStepSort", "t.RSTCDSTEPSORT AS rstcdStepSort"); + selectMap.put("siteStepSort", "t.SITESTEPSORT AS siteStepSort"); + + if (CollUtil.isEmpty(selectFields)) { + return String.join(", ", selectMap.values()); + } + List actualColumns = new ArrayList<>(); + for (String selectField : selectFields) { + String column = selectMap.get(selectField); + if (StrUtil.isNotBlank(column)) { + actualColumns.add(column); + } + } + if (actualColumns.isEmpty()) { + actualColumns.addAll(selectMap.values()); + } + return String.join(", ", actualColumns); + } + private String buildRiverOrderBySql(List sortList) { if (CollUtil.isEmpty(sortList)) { return " ORDER BY t.BASESTEPSORT ASC, t.RVCDSTEPSORT ASC, t.RSTCDSTEPSORT ASC, t.SITESTEPSORT ASC, t.STCD ASC, t.TM DESC"; @@ -648,6 +969,28 @@ public class ZqMonitorServiceImpl implements ZqMonitorService { return " ORDER BY " + String.join(", ", orderColumns); } + private String buildRiverDayOrderBySql(List sortList) { + if (CollUtil.isEmpty(sortList)) { + return " ORDER BY t.DT ASC, t.STCD ASC"; + } + List orderColumns = new ArrayList<>(); + for (DataSourceRequest.SortDescriptor sortDescriptor : sortList) { + if (sortDescriptor == null || StrUtil.isBlank(sortDescriptor.getField())) { + continue; + } + String column = mapRiverDayColumn(sortDescriptor.getField()); + if (StrUtil.isBlank(column)) { + continue; + } + String dir = "desc".equalsIgnoreCase(sortDescriptor.getDir()) || "des".equalsIgnoreCase(sortDescriptor.getDir()) ? "DESC" : "ASC"; + orderColumns.add(column + " " + dir + " NULLS LAST"); + } + if (orderColumns.isEmpty()) { + return " ORDER BY t.DT ASC, t.STCD ASC"; + } + return " ORDER BY " + String.join(", ", orderColumns); + } + private String buildRiverGroupOrderBySql(List groups) { if (CollUtil.isEmpty(groups)) { return ""; @@ -667,6 +1010,25 @@ public class ZqMonitorServiceImpl implements ZqMonitorService { return orders.isEmpty() ? "" : " ORDER BY " + String.join(", ", orders); } + private String buildRiverDayGroupOrderBySql(List groups) { + if (CollUtil.isEmpty(groups)) { + return ""; + } + List orders = new ArrayList<>(); + for (DataSourceRequest.GroupDescriptor descriptor : groups) { + if (descriptor == null || StrUtil.isBlank(descriptor.getField())) { + continue; + } + String column = mapRiverDayColumn(descriptor.getField()); + if (StrUtil.isBlank(column)) { + continue; + } + String dir = "desc".equalsIgnoreCase(descriptor.getDir()) || "des".equalsIgnoreCase(descriptor.getDir()) ? "DESC" : "ASC"; + orders.add(column + " " + dir); + } + return orders.isEmpty() ? "" : " ORDER BY " + String.join(", ", orders); + } + private String buildRiverAggregateSql(String aggregate, String column, String field) { String normalized = aggregate == null ? "" : aggregate.toLowerCase(); return switch (normalized) { From 45467b37d657c45fd37ffeae2332e5ec7e695439 Mon Sep 17 00:00:00 2001 From: tangwei Date: Mon, 15 Jun 2026 11:20:28 +0800 Subject: [PATCH 7/9] =?UTF-8?q?feat:=20=E6=9F=A5=E8=AF=A2=E6=B5=81?= =?UTF-8?q?=E9=87=8F=E7=AB=99=E5=91=A8=E6=97=AC=E6=9C=88=E5=AD=A3=E5=B9=B4?= =?UTF-8?q?=E6=95=B0=E6=8D=AE?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../zq/controller/ZqMonitorController.java | 6 + .../zq/entity/vo/ZqRiverDrtpDataVo.java | 87 ++++ .../qgc_env/zq/service/ZqMonitorService.java | 3 + .../zq/service/impl/ZqMonitorServiceImpl.java | 373 ++++++++++++++++++ 4 files changed, 469 insertions(+) create mode 100644 backend/src/main/java/com/yfd/platform/qgc_env/zq/entity/vo/ZqRiverDrtpDataVo.java diff --git a/backend/src/main/java/com/yfd/platform/qgc_env/zq/controller/ZqMonitorController.java b/backend/src/main/java/com/yfd/platform/qgc_env/zq/controller/ZqMonitorController.java index bfbe270a..cfc9ab83 100644 --- a/backend/src/main/java/com/yfd/platform/qgc_env/zq/controller/ZqMonitorController.java +++ b/backend/src/main/java/com/yfd/platform/qgc_env/zq/controller/ZqMonitorController.java @@ -47,6 +47,12 @@ public class ZqMonitorController { return ResponseResult.successData(zqMonitorService.getRiverDayKendoListCust(dataSourceRequest)); } + @PostMapping("/river/drtp/GetKendoListCust") + @Operation(summary = "查询流量站周旬月季年数据") + public ResponseResult getRiverDrtpKendoListCust(@RequestBody DataSourceRequest dataSourceRequest) { + return ResponseResult.successData(zqMonitorService.getRiverDrtpKendoListCust(dataSourceRequest)); + } + @GetMapping("/msstbprpt/getStcdInfo") @Operation(summary = "根据站码查询单条水文站基础数据") public ResponseResult getStcdInfo(@RequestParam String stcd) { diff --git a/backend/src/main/java/com/yfd/platform/qgc_env/zq/entity/vo/ZqRiverDrtpDataVo.java b/backend/src/main/java/com/yfd/platform/qgc_env/zq/entity/vo/ZqRiverDrtpDataVo.java new file mode 100644 index 00000000..134810ce --- /dev/null +++ b/backend/src/main/java/com/yfd/platform/qgc_env/zq/entity/vo/ZqRiverDrtpDataVo.java @@ -0,0 +1,87 @@ +package com.yfd.platform.qgc_env.zq.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 ZqRiverDrtpDataVo { + + @Schema(description = "主键ID") + private String id; + + @Schema(description = "站码") + private String stcd; + + @Schema(description = "所属电站编码") + private String rstcd; + + @Schema(description = "所属电站名称") + private String ennm; + + @Schema(description = "站点名称") + private String stnm; + + @Schema(description = "基地编码") + private String baseId; + + @Schema(description = "基地名称") + private String baseName; + + @Schema(description = "数据时间") + private Date tm; + + @Schema(description = "水位") + private BigDecimal z; + + @Schema(description = "流量") + private BigDecimal q; + + @Schema(description = "流速") + private BigDecimal v; + + @Schema(description = "月") + private Integer month; + + @Schema(description = "年") + private Integer year; + + @Schema(description = "维度类型") + private String drtp; + + @Schema(description = "时段类型") + private Integer dr; + + @Schema(description = "测流方法") + private String msqmt; + + @Schema(description = "站址") + private String stlc; + + @Schema(description = "创建人") + private String recordUser; + + @Schema(description = "创建时间") + private Date recordTime; + + @Schema(description = "更新人") + private String modifyUser; + + @Schema(description = "更新时间") + private Date modifyTime; + + @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/qgc_env/zq/service/ZqMonitorService.java b/backend/src/main/java/com/yfd/platform/qgc_env/zq/service/ZqMonitorService.java index 983ec39e..2bad93de 100644 --- a/backend/src/main/java/com/yfd/platform/qgc_env/zq/service/ZqMonitorService.java +++ b/backend/src/main/java/com/yfd/platform/qgc_env/zq/service/ZqMonitorService.java @@ -4,6 +4,7 @@ import com.yfd.platform.common.DataSourceRequest; import com.yfd.platform.common.DataSourceResult; import com.yfd.platform.qgc_env.zq.entity.vo.ZqBaseInfoVo; import com.yfd.platform.qgc_env.zq.entity.vo.ZqRiverDayDataVo; +import com.yfd.platform.qgc_env.zq.entity.vo.ZqRiverDrtpDataVo; import com.yfd.platform.qgc_env.zq.entity.vo.ZqRiverDataVo; public interface ZqMonitorService { @@ -16,5 +17,7 @@ public interface ZqMonitorService { DataSourceResult getRiverDayKendoListCust(DataSourceRequest dataSourceRequest); + DataSourceResult getRiverDrtpKendoListCust(DataSourceRequest dataSourceRequest); + ZqBaseInfoVo getStcdInfo(String stcd); } diff --git a/backend/src/main/java/com/yfd/platform/qgc_env/zq/service/impl/ZqMonitorServiceImpl.java b/backend/src/main/java/com/yfd/platform/qgc_env/zq/service/impl/ZqMonitorServiceImpl.java index 90d475a6..ccec0b0f 100644 --- a/backend/src/main/java/com/yfd/platform/qgc_env/zq/service/impl/ZqMonitorServiceImpl.java +++ b/backend/src/main/java/com/yfd/platform/qgc_env/zq/service/impl/ZqMonitorServiceImpl.java @@ -13,6 +13,7 @@ import com.yfd.platform.common.exception.BizException; import com.yfd.platform.qgc_env.fh.entity.vo.HabitatVo; import com.yfd.platform.qgc_env.zq.entity.vo.ZqBaseInfoVo; import com.yfd.platform.qgc_env.zq.entity.vo.ZqRiverDayDataVo; +import com.yfd.platform.qgc_env.zq.entity.vo.ZqRiverDrtpDataVo; import com.yfd.platform.qgc_env.zq.entity.vo.ZqRiverDataVo; import com.yfd.platform.qgc_env.zq.service.ZqMonitorService; import com.yfd.platform.utils.QgcQueryWrapperUtil; @@ -142,6 +143,15 @@ public class ZqMonitorServiceImpl implements ZqMonitorService { return queryRiverDayGroupList(dataSourceRequest, loadOptions); } + @Override + public DataSourceResult getRiverDrtpKendoListCust(DataSourceRequest dataSourceRequest) { + DataSourceLoadOptionsBase loadOptions = dataSourceRequest == null ? null : dataSourceRequest.toDevRequest(); + if (CollUtil.isEmpty(dataSourceRequest == null ? null : dataSourceRequest.getGroup())) { + return queryRiverDrtpDetailList(dataSourceRequest, loadOptions); + } + return queryRiverDrtpGroupList(dataSourceRequest, loadOptions); + } + @Override public ZqBaseInfoVo getStcdInfo(String stcd) { if (StrUtil.isBlank(stcd)) { @@ -336,6 +346,100 @@ public class ZqMonitorServiceImpl implements ZqMonitorService { return result; } + private DataSourceResult queryRiverDrtpDetailList(DataSourceRequest dataSourceRequest, + DataSourceLoadOptionsBase loadOptions) { + StringBuilder sql = new StringBuilder(); + sql.append("SELECT ") + .append(buildRiverDrtpDetailSelectSql(dataSourceRequest == null ? null : dataSourceRequest.getSelect())) + .append(" FROM (") + .append(buildRiverDrtpCoreSql()) + .append(") t WHERE 1 = 1 "); + + Map paramMap = new HashMap<>(); + String filterSql = buildRiverDrtpFilterCondition(dataSourceRequest == null ? null : dataSourceRequest.getFilter(), paramMap, new int[]{0}); + if (StrUtil.isNotBlank(filterSql)) { + sql.append(" AND ").append(filterSql).append(" "); + } + sql.append(buildRiverDrtpOrderBySql(dataSourceRequest == null ? null : dataSourceRequest.getSort())); + + Page page = loadOptions == null ? null : QgcQueryWrapperUtil.buildPage(loadOptions, loadOptions.getSkip(), loadOptions.getTake()); + List list = microservicDynamicSQLMapper.pageAllListWithResultType(page, sql.toString(), paramMap, ZqRiverDrtpDataVo.class); + DataSourceResult result = new DataSourceResult<>(); + result.setData(list); + result.setTotal(page != null ? page.getTotal() : list.size()); + result.setAggregates(new HashMap<>()); + return result; + } + + private DataSourceResult queryRiverDrtpGroupList(DataSourceRequest dataSourceRequest, + DataSourceLoadOptionsBase loadOptions) { + List groups = dataSourceRequest.getGroup(); + GroupingInfo[] groupInfos = loadOptions == null ? new GroupingInfo[0] : loadOptions.getGroup(); + + StringBuilder sql = new StringBuilder("SELECT "); + List selectItems = new ArrayList<>(); + for (DataSourceRequest.GroupDescriptor descriptor : groups) { + if (descriptor == null || StrUtil.isBlank(descriptor.getField())) { + continue; + } + String column = mapRiverDrtpColumn(descriptor.getField()); + if (StrUtil.isBlank(column)) { + continue; + } + selectItems.add(column + " AS " + descriptor.getField().toUpperCase()); + selectItems.add("COUNT(*) AS COUNT_" + descriptor.getField().toUpperCase()); + if (CollUtil.isNotEmpty(descriptor.getAggregates())) { + for (DataSourceRequest.AggregateDescriptor aggregate : descriptor.getAggregates()) { + String aggregateColumn = mapRiverDrtpColumn(aggregate.getField()); + if (StrUtil.isBlank(aggregateColumn) || StrUtil.isBlank(aggregate.getAggregate())) { + continue; + } + selectItems.add(buildRiverAggregateSql(aggregate.getAggregate(), aggregateColumn, aggregate.getField())); + } + } + } + if (selectItems.isEmpty()) { + selectItems.add("t.STCD AS STCD"); + selectItems.add("COUNT(*) AS COUNT_STCD"); + } + sql.append(String.join(", ", selectItems)) + .append(" FROM (") + .append(buildRiverDrtpCoreSql()) + .append(") t WHERE 1 = 1 "); + + Map paramMap = new HashMap<>(); + String filterSql = buildRiverDrtpFilterCondition(dataSourceRequest == null ? null : dataSourceRequest.getFilter(), paramMap, new int[]{0}); + if (StrUtil.isNotBlank(filterSql)) { + sql.append(" AND ").append(filterSql).append(" "); + } + + List groupByColumns = new ArrayList<>(); + for (DataSourceRequest.GroupDescriptor descriptor : groups) { + if (descriptor == null || StrUtil.isBlank(descriptor.getField())) { + continue; + } + String column = mapRiverDrtpColumn(descriptor.getField()); + if (StrUtil.isNotBlank(column)) { + groupByColumns.add(column); + } + } + if (!groupByColumns.isEmpty()) { + sql.append(" GROUP BY ").append(String.join(", ", groupByColumns)).append(" "); + } + sql.append(buildRiverDrtpGroupOrderBySql(groups)); + + List> rows = microservicDynamicSQLMapper.pageAllList(null, sql.toString(), paramMap); + DataSourceResult result = new DataSourceResult(); + if (Boolean.TRUE.equals(dataSourceRequest.getGroupResultFlat())) { + result.setData(new GroupHelper().faltGroup(rows, Arrays.asList(groupInfos))); + } else { + result.setData(new GroupHelper().group(rows, Arrays.asList(groupInfos))); + } + result.setTotal(0L); + result.setAggregates(new HashMap<>()); + return result; + } + private DataSourceResult queryRiverGroupList(DataSourceRequest dataSourceRequest, DataSourceLoadOptionsBase loadOptions) { List groups = dataSourceRequest.getGroup(); @@ -526,6 +630,53 @@ public class ZqMonitorServiceImpl implements ZqMonitorService { "WHERE NVL(day.IS_DELETED, 0) = 0 "; } + private String buildRiverDrtpCoreSql() { + return "SELECT " + + "drtp.ID AS id, " + + "drtp.STCD AS stcd, " + + "rb.RSTCD AS rstcd, " + + "eng.ENNM AS ennm, " + + "rb.STNM AS stnm, " + + "eng.BASE_ID AS baseId, " + + "hb.BASENAME AS baseName, " + + "drtp.TM AS tm, " + + "drtp.Z AS z, " + + "drtp.Q AS q, " + + "drtp.V AS v, " + + "drtp.MONTH AS month, " + + "drtp.YEAR AS year, " + + "drtp.DRTP AS drtp, " + + "drtp.DR AS dr, " + + "drtp.MSQMT AS msqmt, " + + "rb.STLC AS stlc, " + + "drtp.RECORD_USER AS recordUser, " + + "drtp.RECORD_TIME AS recordTime, " + + "drtp.MODIFY_USER AS modifyUser, " + + "drtp.MODIFY_TIME AS modifyTime, " + + "NVL(hb.ORDER_INDEX, 999999) AS baseStepSort, " + + "NVL(along.ORDER_INDEX, 999999) AS rvcdStepSort, " + + "NVL(rstSort.SORT, 999999) AS rstcdStepSort, " + + "NVL(siteSort.SORT, 999999) AS siteStepSort " + + "FROM SD_RIVERDRTP_S drtp " + + "INNER JOIN SD_RIVER_B_H rb ON rb.STCD = drtp.STCD AND rb.STTP = 'ZQ' AND NVL(rb.IS_DELETED, 0) = 0 " + + "LEFT JOIN SD_ENGINFO_B_H eng ON eng.STCD = rb.RSTCD AND NVL(eng.IS_DELETED, 0) = 0 " + + "LEFT JOIN SD_HYDROBASE hb ON hb.BASEID = eng.BASE_ID AND NVL(hb.IS_DELETED, 0) = 0 " + + "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, cfg.RVCD, det.STCD " + + " FROM MS_ALONGDET_B det " + + " INNER JOIN MS_ALONG_B cfg ON det.ALONG_ID = cfg.ID " + + " WHERE NVL(det.IS_DELETED, 0) = 0 AND NVL(cfg.IS_DELETED, 0) = 0 AND cfg.CODE = 'common' " + + ") rstSort ON rstSort.RVCD = eng.HBRVCD AND rstSort.STCD = rb.RSTCD " + + "LEFT JOIN ( " + + " SELECT det.SORT, cfg.RVCD, det.STCD " + + " FROM MS_ALONGDET_B det " + + " INNER JOIN MS_ALONG_B cfg ON det.ALONG_ID = cfg.ID " + + " WHERE NVL(det.IS_DELETED, 0) = 0 AND NVL(cfg.IS_DELETED, 0) = 0 AND cfg.CODE = 'common' " + + ") siteSort ON siteSort.RVCD = eng.HBRVCD AND siteSort.STCD = rb.STCD " + + "WHERE NVL(drtp.IS_DELETED, 0) = 0 "; + } + private String buildRiverFilterCondition(DataSourceRequest.FilterDescriptor filter, Map paramMap, int[] indexHolder) { @@ -578,6 +729,32 @@ public class ZqMonitorServiceImpl implements ZqMonitorService { return String.join(logic, conditions); } + private String buildRiverDrtpFilterCondition(DataSourceRequest.FilterDescriptor filter, + Map paramMap, + int[] indexHolder) { + if (filter == null) { + return ""; + } + if (StrUtil.isNotBlank(filter.getField())) { + return buildRiverDrtpLeafCondition(filter, paramMap, indexHolder); + } + if (CollUtil.isEmpty(filter.getFilters())) { + return ""; + } + List conditions = new ArrayList<>(); + for (DataSourceRequest.FilterDescriptor child : filter.getFilters()) { + String childSql = buildRiverDrtpFilterCondition(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 buildRiverLeafCondition(DataSourceRequest.FilterDescriptor filter, Map paramMap, int[] indexHolder) { @@ -736,6 +913,83 @@ public class ZqMonitorServiceImpl implements ZqMonitorService { }; } + private String buildRiverDrtpLeafCondition(DataSourceRequest.FilterDescriptor filter, + Map paramMap, + int[] indexHolder) { + String field = filter.getField(); + String operator = StrUtil.blankToDefault(filter.getOperator(), "eq").toLowerCase(); + Object value = filter.getValue(); + String column = mapRiverDrtpColumn(field); + if (StrUtil.isBlank(column)) { + return ""; + } + if ("isnull".equals(operator)) { + return column + " IS NULL"; + } + if ("isnotnull".equals(operator)) { + return column + " IS NOT NULL"; + } + boolean dateField = "tm".equalsIgnoreCase(field) || "recordTime".equalsIgnoreCase(field) || "modifyTime".equalsIgnoreCase(field); + if ("in".equals(operator)) { + List values = normalizeRiverValues(value); + if (values.isEmpty()) { + return ""; + } + List placeholders = new ArrayList<>(); + for (Object item : values) { + String key = "zqRiverDrtpP" + indexHolder[0]++; + paramMap.put(key, item); + placeholders.add(buildRiverValueExpr(key, dateField, item)); + } + return column + " IN (" + String.join(", ", placeholders) + ")"; + } + if (value == null) { + return ""; + } + + String key = "zqRiverDrtpP" + indexHolder[0]++; + String valueExpr = buildRiverValueExpr(key, dateField, value); + return switch (operator) { + case "eq" -> { + paramMap.put(key, value); + yield column + " = " + valueExpr; + } + case "neq" -> { + paramMap.put(key, value); + yield column + " <> " + valueExpr; + } + case "contains" -> { + paramMap.put(key, "%" + value + "%"); + yield column + " LIKE #{map." + key + "}"; + } + case "startswith" -> { + paramMap.put(key, value + "%"); + yield column + " LIKE #{map." + key + "}"; + } + case "endswith" -> { + paramMap.put(key, "%" + value); + yield column + " LIKE #{map." + key + "}"; + } + case "gt" -> { + paramMap.put(key, value); + yield column + " > " + valueExpr; + } + case "gte" -> { + paramMap.put(key, value); + yield column + " >= " + valueExpr; + } + case "lt" -> { + paramMap.put(key, value); + yield column + " < " + valueExpr; + } + case "lte" -> { + paramMap.put(key, value); + yield column + " <= " + valueExpr; + } + default -> ""; + }; + } + private String buildRiverVdidCondition(String operator, Object value, Map paramMap, @@ -862,6 +1116,40 @@ public class ZqMonitorServiceImpl implements ZqMonitorService { }; } + private String mapRiverDrtpColumn(String field) { + if (StrUtil.isBlank(field)) { + return null; + } + return switch (field) { + case "id" -> "t.ID"; + case "stcd" -> "t.STCD"; + case "rstcd" -> "t.RSTCD"; + case "ennm" -> "t.ENNM"; + case "stnm" -> "t.STNM"; + case "baseId" -> "t.BASEID"; + case "baseName" -> "t.BASENAME"; + case "tm" -> "t.TM"; + case "z" -> "t.Z"; + case "q" -> "t.Q"; + case "v" -> "t.V"; + case "month" -> "t.MONTH"; + case "year" -> "t.YEAR"; + case "drtp" -> "t.DRTP"; + case "dr" -> "t.DR"; + case "msqmt" -> "t.MSQMT"; + case "stlc" -> "t.STLC"; + case "recordUser" -> "t.RECORDUSER"; + case "recordTime" -> "t.RECORDTIME"; + case "modifyUser" -> "t.MODIFYUSER"; + case "modifyTime" -> "t.MODIFYTIME"; + case "baseStepSort" -> "t.BASESTEPSORT"; + case "rvcdStepSort" -> "t.RVCDSTEPSORT"; + case "rstcdStepSort" -> "t.RSTCDSTEPSORT"; + case "siteStepSort" -> "t.SITESTEPSORT"; + default -> null; + }; + } + private String buildRiverDetailSelectSql(List selectFields) { Map selectMap = new LinkedHashMap<>(); selectMap.put("q", "t.Q AS q"); @@ -947,6 +1235,50 @@ public class ZqMonitorServiceImpl implements ZqMonitorService { return String.join(", ", actualColumns); } + private String buildRiverDrtpDetailSelectSql(List selectFields) { + Map selectMap = new LinkedHashMap<>(); + selectMap.put("id", "t.ID AS id"); + selectMap.put("stcd", "t.STCD AS stcd"); + selectMap.put("rstcd", "t.RSTCD AS rstcd"); + selectMap.put("ennm", "t.ENNM AS ennm"); + selectMap.put("stnm", "t.STNM AS stnm"); + selectMap.put("baseId", "t.BASEID AS baseId"); + selectMap.put("baseName", "t.BASENAME AS baseName"); + selectMap.put("tm", "t.TM AS tm"); + selectMap.put("z", "t.Z AS z"); + selectMap.put("q", "t.Q AS q"); + selectMap.put("v", "t.V AS v"); + selectMap.put("month", "t.MONTH AS month"); + selectMap.put("year", "t.YEAR AS year"); + selectMap.put("drtp", "t.DRTP AS drtp"); + selectMap.put("dr", "t.DR AS dr"); + selectMap.put("msqmt", "t.MSQMT AS msqmt"); + selectMap.put("stlc", "t.STLC AS stlc"); + selectMap.put("recordUser", "t.RECORDUSER AS recordUser"); + selectMap.put("recordTime", "t.RECORDTIME AS recordTime"); + selectMap.put("modifyUser", "t.MODIFYUSER AS modifyUser"); + selectMap.put("modifyTime", "t.MODIFYTIME AS modifyTime"); + selectMap.put("baseStepSort", "t.BASESTEPSORT AS baseStepSort"); + selectMap.put("rvcdStepSort", "t.RVCDSTEPSORT AS rvcdStepSort"); + selectMap.put("rstcdStepSort", "t.RSTCDSTEPSORT AS rstcdStepSort"); + selectMap.put("siteStepSort", "t.SITESTEPSORT AS siteStepSort"); + + if (CollUtil.isEmpty(selectFields)) { + return String.join(", ", selectMap.values()); + } + List actualColumns = new ArrayList<>(); + for (String selectField : selectFields) { + String column = selectMap.get(selectField); + if (StrUtil.isNotBlank(column)) { + actualColumns.add(column); + } + } + if (actualColumns.isEmpty()) { + actualColumns.addAll(selectMap.values()); + } + return String.join(", ", actualColumns); + } + private String buildRiverOrderBySql(List sortList) { if (CollUtil.isEmpty(sortList)) { return " ORDER BY t.BASESTEPSORT ASC, t.RVCDSTEPSORT ASC, t.RSTCDSTEPSORT ASC, t.SITESTEPSORT ASC, t.STCD ASC, t.TM DESC"; @@ -991,6 +1323,28 @@ public class ZqMonitorServiceImpl implements ZqMonitorService { return " ORDER BY " + String.join(", ", orderColumns); } + private String buildRiverDrtpOrderBySql(List sortList) { + if (CollUtil.isEmpty(sortList)) { + return " ORDER BY t.YEAR DESC, t.MONTH DESC NULLS LAST, t.DRTP ASC, t.DR ASC NULLS LAST, t.STCD ASC"; + } + List orderColumns = new ArrayList<>(); + for (DataSourceRequest.SortDescriptor sortDescriptor : sortList) { + if (sortDescriptor == null || StrUtil.isBlank(sortDescriptor.getField())) { + continue; + } + String column = mapRiverDrtpColumn(sortDescriptor.getField()); + if (StrUtil.isBlank(column)) { + continue; + } + String dir = "desc".equalsIgnoreCase(sortDescriptor.getDir()) || "des".equalsIgnoreCase(sortDescriptor.getDir()) ? "DESC" : "ASC"; + orderColumns.add(column + " " + dir + " NULLS LAST"); + } + if (orderColumns.isEmpty()) { + return " ORDER BY t.YEAR DESC, t.MONTH DESC NULLS LAST, t.DRTP ASC, t.DR ASC NULLS LAST, t.STCD ASC"; + } + return " ORDER BY " + String.join(", ", orderColumns); + } + private String buildRiverGroupOrderBySql(List groups) { if (CollUtil.isEmpty(groups)) { return ""; @@ -1029,6 +1383,25 @@ public class ZqMonitorServiceImpl implements ZqMonitorService { return orders.isEmpty() ? "" : " ORDER BY " + String.join(", ", orders); } + private String buildRiverDrtpGroupOrderBySql(List groups) { + if (CollUtil.isEmpty(groups)) { + return ""; + } + List orders = new ArrayList<>(); + for (DataSourceRequest.GroupDescriptor descriptor : groups) { + if (descriptor == null || StrUtil.isBlank(descriptor.getField())) { + continue; + } + String column = mapRiverDrtpColumn(descriptor.getField()); + if (StrUtil.isBlank(column)) { + continue; + } + String dir = "desc".equalsIgnoreCase(descriptor.getDir()) || "des".equalsIgnoreCase(descriptor.getDir()) ? "DESC" : "ASC"; + orders.add(column + " " + dir); + } + return orders.isEmpty() ? "" : " ORDER BY " + String.join(", ", orders); + } + private String buildRiverAggregateSql(String aggregate, String column, String field) { String normalized = aggregate == null ? "" : aggregate.toLowerCase(); return switch (normalized) { From fa7b9b8e69485db58e814663455b7166ae3e2624 Mon Sep 17 00:00:00 2001 From: tangwei Date: Mon, 15 Jun 2026 14:18:48 +0800 Subject: [PATCH 8/9] =?UTF-8?q?feat:=20=E5=88=A0=E9=99=A4=E6=B5=81?= =?UTF-8?q?=E9=87=8F=E7=AB=99=E5=B0=8F=E6=97=B6/=E6=97=A5/=E6=9C=88?= =?UTF-8?q?=E6=95=B0=E6=8D=AE&=E4=BF=AE=E6=94=B9=E6=B5=81=E9=87=8F?= =?UTF-8?q?=E7=AB=99=E5=B0=8F=E6=97=B6=E6=95=B0=E6=8D=AE?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../fp/service/impl/FpBuildServiceImpl.java | 12 +- .../impl/VpConstructionServiceImpl.java | 20 +- .../vd/service/impl/VdMonitorServiceImpl.java | 7 +- .../service/impl/SdWtMonitorServiceImpl.java | 9 +- .../wt/service/impl/SdWtvtRServiceImpl.java | 4 +- .../zq/controller/ZqMonitorController.java | 17 + .../qgc_env/zq/service/ZqMonitorService.java | 5 + .../zq/service/impl/ZqMonitorServiceImpl.java | 320 +++++++++++++++++- 8 files changed, 379 insertions(+), 15 deletions(-) diff --git a/backend/src/main/java/com/yfd/platform/qgc_env/fp/service/impl/FpBuildServiceImpl.java b/backend/src/main/java/com/yfd/platform/qgc_env/fp/service/impl/FpBuildServiceImpl.java index 4f6aa743..e3eabcb7 100644 --- a/backend/src/main/java/com/yfd/platform/qgc_env/fp/service/impl/FpBuildServiceImpl.java +++ b/backend/src/main/java/com/yfd/platform/qgc_env/fp/service/impl/FpBuildServiceImpl.java @@ -141,8 +141,9 @@ public class FpBuildServiceImpl implements FpBuildService { .append("fp.DTIN_TM AS dtinTm, ") .append("fp.BLDSTT_CODE AS bldsttCcode, ") .append("CASE ") - .append("WHEN fp.BLDSTT_CODE IN (1, 10, 11) THEN '已建' ") - .append("WHEN fp.BLDSTT_CODE IN (2, 7, 8) THEN '在建' ") + .append("WHEN fp.BLDSTT_CODE = 0 THEN '未建/规划' ") + .append("WHEN fp.BLDSTT_CODE = 1 THEN '在建' ") + .append("WHEN fp.BLDSTT_CODE = 2 THEN '已建' ") .append("ELSE '未建/规划' END AS bldsttCcodeName, ") .append("fp.STDSDT AS stdsdt, ") .append("fp.PSTSTDT AS pststdt, ") @@ -462,7 +463,12 @@ public class FpBuildServiceImpl implements FpBuildService { columnMap.put("dtinName", "CASE WHEN NVL(fp.DTIN, 0) = 1 THEN '已接入' ELSE '未接入' END"); columnMap.put("dtinTm", "fp.DTIN_TM"); columnMap.put("bldsttCcode", "fp.BLDSTT_CODE"); - columnMap.put("bldsttCcodeName", "CASE WHEN fp.BLDSTT_CODE IN (1, 10, 11) THEN '已建' WHEN fp.BLDSTT_CODE IN (2, 7, 8) THEN '在建' ELSE '未建/规划' END"); + columnMap.put("bldsttCcodeName", + "CASE WHEN fp.BLDSTT_CODE = 0 THEN '未建/规划' " + + "WHEN fp.BLDSTT_CODE = 1 THEN '在建' " + + "WHEN fp.BLDSTT_CODE = 2 THEN '已建' " + + "ELSE '未知' END"); +// columnMap.put("bldsttCcodeName", "CASE WHEN fp.BLDSTT_CODE IN (1, 10, 11) THEN '已建' WHEN fp.BLDSTT_CODE IN (2, 7, 8) THEN '在建' ELSE '未建/规划' END"); columnMap.put("stdsdt", "fp.STDSDT"); columnMap.put("pststdt", "fp.PSTSTDT"); columnMap.put("pesstdt", "fp.PESSTDT"); diff --git a/backend/src/main/java/com/yfd/platform/qgc_env/vap/service/impl/VpConstructionServiceImpl.java b/backend/src/main/java/com/yfd/platform/qgc_env/vap/service/impl/VpConstructionServiceImpl.java index e7323320..14a36f2a 100644 --- a/backend/src/main/java/com/yfd/platform/qgc_env/vap/service/impl/VpConstructionServiceImpl.java +++ b/backend/src/main/java/com/yfd/platform/qgc_env/vap/service/impl/VpConstructionServiceImpl.java @@ -787,8 +787,10 @@ public class VpConstructionServiceImpl implements VpConstructionService { "vb.HBRVCD AS hbrvcd, " + "hbrv.HBRVNM AS hbrvcdName, " + "TO_CHAR(vb.BLDSTT_CODE) AS bldsttCcode, " + - "CASE WHEN vb.BLDSTT_CODE IN (1, 10, 11) THEN '已建' " + - "WHEN vb.BLDSTT_CODE IN (2, 7, 8) THEN '在建' ELSE '未建/规划' END AS bldsttCcodeName, " + + "CASE WHEN vb.BLDSTT_CODE = 1 THEN '在建' " + + "WHEN vb.BLDSTT_CODE = 2 THEN '已建' ELSE '未建/规划' END AS bldsttCcodeName, " + +// "CASE WHEN vb.BLDSTT_CODE IN (1, 10, 11) THEN '已建' " + +// "WHEN vb.BLDSTT_CODE IN (2, 7, 8) THEN '在建' ELSE '未建/规划' END AS bldsttCcodeName, " + "va.TETP AS tetp, " + "va.TECNT AS tecnt, " + "va.STLC AS stlc, " + @@ -989,7 +991,12 @@ public class VpConstructionServiceImpl implements VpConstructionService { columnMap.put("hbrvcdName", "hbrv.HBRVNM"); columnMap.put("bldsttCcode", "vb.BLDSTT_CODE"); columnMap.put("bldsttCcodeName", - "CASE WHEN vb.BLDSTT_CODE IN (1, 10, 11) THEN '已建' WHEN vb.BLDSTT_CODE IN (2, 7, 8) THEN '在建' ELSE '未建/规划' END"); + "CASE WHEN vb.BLDSTT_CODE = 0 THEN '未建/规划' " + + "WHEN vb.BLDSTT_CODE = 1 THEN '在建' " + + "WHEN vb.BLDSTT_CODE = 2 THEN '已建' " + + "ELSE '未知' END"); +// columnMap.put("bldsttCcodeName", +// "CASE WHEN vb.BLDSTT_CODE IN (1, 10, 11) THEN '已建' WHEN vb.BLDSTT_CODE IN (2, 7, 8) THEN '在建' ELSE '未建/规划' END"); columnMap.put("tetp", "va.TETP"); columnMap.put("tecnt", "va.TECNT"); columnMap.put("stlc", "va.STLC"); @@ -1717,7 +1724,12 @@ public class VpConstructionServiceImpl implements VpConstructionService { columnMap.put("bldstt", "vp.BLPRD"); columnMap.put("bldsttCcode", "vp.BLDSTT_CODE"); columnMap.put("bldsttName", "CASE WHEN vp.BLDSTT_CODE IN (1, 10, 11) THEN '已建' WHEN vp.BLDSTT_CODE IN (2, 7, 8) THEN '在建' ELSE '未建/规划' END"); - columnMap.put("bldsttCcodeName", "CASE WHEN vp.BLDSTT_CODE IN (1, 10, 11) THEN '已建' WHEN vp.BLDSTT_CODE IN (2, 7, 8) THEN '在建' ELSE '未建/规划' END"); +// columnMap.put("bldsttCcodeName", "CASE WHEN vp.BLDSTT_CODE IN (1, 10, 11) THEN '已建' WHEN vp.BLDSTT_CODE IN (2, 7, 8) THEN '在建' ELSE '未建/规划' END"); + columnMap.put("bldsttCcodeName", + "CASE WHEN vp.BLDSTT_CODE = 0 THEN '未建/规划' " + + "WHEN vp.BLDSTT_CODE = 1 THEN '在建' " + + "WHEN vp.BLDSTT_CODE = 2 THEN '已建' " + + "ELSE '未知' END"); columnMap.put("stdsdt", "vp.STDSDT"); columnMap.put("ststdt", "vp.STDSDT"); columnMap.put("pststdt", "vp.PSTSTDT"); diff --git a/backend/src/main/java/com/yfd/platform/qgc_env/vd/service/impl/VdMonitorServiceImpl.java b/backend/src/main/java/com/yfd/platform/qgc_env/vd/service/impl/VdMonitorServiceImpl.java index f5113e3a..3c4cc27f 100644 --- a/backend/src/main/java/com/yfd/platform/qgc_env/vd/service/impl/VdMonitorServiceImpl.java +++ b/backend/src/main/java/com/yfd/platform/qgc_env/vd/service/impl/VdMonitorServiceImpl.java @@ -211,7 +211,12 @@ public class VdMonitorServiceImpl implements VdMonitorService { selectMap.put("dtinName", "CASE WHEN NVL(t.dtin, 0) = 1 THEN '已接入' ELSE '未接入' END AS dtinName"); selectMap.put("usfl", "t.usfl AS usfl"); selectMap.put("bldsttCcode", "t.bldsttCcode AS bldsttCcode"); - selectMap.put("bldsttCcodeName", "CASE WHEN t.bldsttCcode IN (1, 10, 11) THEN '已建' WHEN t.bldsttCcode IN (2, 7, 8) THEN '在建' ELSE '未建/规划' END AS bldsttCcodeName"); + selectMap.put("bldsttCcodeName", + "CASE WHEN t.bldsttCcode = 0 THEN '未建/规划' " + + "WHEN t.bldsttCcode = 1 THEN '在建' " + + "WHEN t.bldsttCcode = 2 THEN '已建' " + + "ELSE '未知' END"); +// selectMap.put("bldsttCcodeName", "CASE WHEN t.bldsttCcode IN (1, 10, 11) THEN '已建' WHEN t.bldsttCcode IN (2, 7, 8) THEN '在建' ELSE '未建/规划' END AS bldsttCcodeName"); selectMap.put("stindx", "t.stindx AS stindx"); selectMap.put("introduce", "t.introduce AS introduce"); selectMap.put("logo", "t.logo AS logo"); diff --git a/backend/src/main/java/com/yfd/platform/qgc_env/wt/service/impl/SdWtMonitorServiceImpl.java b/backend/src/main/java/com/yfd/platform/qgc_env/wt/service/impl/SdWtMonitorServiceImpl.java index 823cf486..d737184a 100644 --- a/backend/src/main/java/com/yfd/platform/qgc_env/wt/service/impl/SdWtMonitorServiceImpl.java +++ b/backend/src/main/java/com/yfd/platform/qgc_env/wt/service/impl/SdWtMonitorServiceImpl.java @@ -104,7 +104,7 @@ public class SdWtMonitorServiceImpl implements SdWtMonitorService { "t.JCDT AS jcdt, " + "t.WDDT AS wddt, " + "t.BLDSTT_CODE AS bldsttCode, " + - "CASE WHEN t.BLDSTT_CODE IN ('1', '10', '11') THEN '已建' WHEN t.BLDSTT_CODE IN ('2', '7', '8') THEN '在建' ELSE '未建/规划' END AS bldsttCcodeName, "+ + "CASE WHEN t.BLDSTT_CODE =2 THEN '已建' WHEN t.BLDSTT_CODE =1 THEN '在建' ELSE '未建/规划' END AS bldsttCcodeName, "+ "t.INV AS inv, " + "t.INVINMN AS invinmn, " + "t.INTRODUCE AS introduce, " + @@ -2003,7 +2003,12 @@ public class SdWtMonitorServiceImpl implements SdWtMonitorService { columnMap.put("stcd", "wt.STCD AS stcd"); columnMap.put("fhstcd", "wt.FHSTCD AS fhstcd"); columnMap.put("rstcd", "wt.RSTCD AS rstcd"); - columnMap.put("bldsttCcodeName", "CASE WHEN wt.BLDSTT_CODE IN ('1', '10', '11') THEN '已建' WHEN wt.BLDSTT_CODE IN ('2', '7', '8') THEN '在建' ELSE '未建/规划' END AS bldsttCcodeName"); +// columnMap.put("bldsttCcodeName", "CASE WHEN wt.BLDSTT_CODE IN ('1', '10', '11') THEN '已建' WHEN wt.BLDSTT_CODE IN ('2', '7', '8') THEN '在建' ELSE '未建/规划' END AS bldsttCcodeName"); + columnMap.put("bldsttCcodeName", + "CASE WHEN wt.BLDSTT_CODE = 0 THEN '未建/规划' " + + "WHEN wt.BLDSTT_CODE = 1 THEN '在建' " + + "WHEN wt.BLDSTT_CODE = 2 THEN '已建' " + + "ELSE '未知' END"); columnMap.put("bldsttCcode", "wt.BLDSTT_CODE AS bldsttCcode"); columnMap.put("stCode", "NULL AS stCode"); columnMap.put("stName", "NULL AS stName"); diff --git a/backend/src/main/java/com/yfd/platform/qgc_env/wt/service/impl/SdWtvtRServiceImpl.java b/backend/src/main/java/com/yfd/platform/qgc_env/wt/service/impl/SdWtvtRServiceImpl.java index 737f982c..c91fcda6 100644 --- a/backend/src/main/java/com/yfd/platform/qgc_env/wt/service/impl/SdWtvtRServiceImpl.java +++ b/backend/src/main/java/com/yfd/platform/qgc_env/wt/service/impl/SdWtvtRServiceImpl.java @@ -189,8 +189,8 @@ public class SdWtvtRServiceImpl extends ServiceImpl item.put("tm", dt); item.put("wthg", parseBigDecimal(wthgStr)); item.put("vwt", parseBigDecimal(vwtStr)); - item.put("recordUser", "admin"); -// item.put("recordUser", SecurityUtils.getUserId()); +// item.put("recordUser", "admin"); + item.put("recordUser", SecurityUtils.getUserId()); dataList.add(item); }); diff --git a/backend/src/main/java/com/yfd/platform/qgc_env/zq/controller/ZqMonitorController.java b/backend/src/main/java/com/yfd/platform/qgc_env/zq/controller/ZqMonitorController.java index cfc9ab83..91cd4c78 100644 --- a/backend/src/main/java/com/yfd/platform/qgc_env/zq/controller/ZqMonitorController.java +++ b/backend/src/main/java/com/yfd/platform/qgc_env/zq/controller/ZqMonitorController.java @@ -2,6 +2,7 @@ package com.yfd.platform.qgc_env.zq.controller; import com.yfd.platform.common.DataSourceRequest; import com.yfd.platform.config.ResponseResult; +import com.yfd.platform.qgc_base.entity.vo.BatchDeleteAo; import com.yfd.platform.qgc_env.zq.service.ZqMonitorService; import io.swagger.v3.oas.annotations.Operation; import io.swagger.v3.oas.annotations.tags.Tag; @@ -14,6 +15,8 @@ import org.springframework.web.bind.annotation.RequestMapping; import org.springframework.web.bind.annotation.RequestParam; import org.springframework.web.bind.annotation.RestController; +import java.util.Map; + @RestController @RequestMapping("/zq") @Tag(name = "水文流量站监测") @@ -53,6 +56,20 @@ public class ZqMonitorController { return ResponseResult.successData(zqMonitorService.getRiverDrtpKendoListCust(dataSourceRequest)); } + @PostMapping("/river/removeKendoByIds") + @Operation(summary = "删除流量站小时/日/月数据") + public ResponseResult removeKendoByIds(@RequestBody BatchDeleteAo batchDeleteAo) { + zqMonitorService.removeKendoByIds(batchDeleteAo); + return ResponseResult.success(); + } + + @PostMapping("/river/updateRiverRData") + @Operation(summary = "修改流量站小时数据") + public ResponseResult updateRiverRData(@RequestBody Map updateData) { + zqMonitorService.updateRiverRData(updateData); + return ResponseResult.success(); + } + @GetMapping("/msstbprpt/getStcdInfo") @Operation(summary = "根据站码查询单条水文站基础数据") public ResponseResult getStcdInfo(@RequestParam String stcd) { diff --git a/backend/src/main/java/com/yfd/platform/qgc_env/zq/service/ZqMonitorService.java b/backend/src/main/java/com/yfd/platform/qgc_env/zq/service/ZqMonitorService.java index 2bad93de..8dcdd5c7 100644 --- a/backend/src/main/java/com/yfd/platform/qgc_env/zq/service/ZqMonitorService.java +++ b/backend/src/main/java/com/yfd/platform/qgc_env/zq/service/ZqMonitorService.java @@ -2,6 +2,7 @@ package com.yfd.platform.qgc_env.zq.service; import com.yfd.platform.common.DataSourceRequest; import com.yfd.platform.common.DataSourceResult; +import com.yfd.platform.qgc_base.entity.vo.BatchDeleteAo; import com.yfd.platform.qgc_env.zq.entity.vo.ZqBaseInfoVo; import com.yfd.platform.qgc_env.zq.entity.vo.ZqRiverDayDataVo; import com.yfd.platform.qgc_env.zq.entity.vo.ZqRiverDrtpDataVo; @@ -19,5 +20,9 @@ public interface ZqMonitorService { DataSourceResult getRiverDrtpKendoListCust(DataSourceRequest dataSourceRequest); + boolean removeKendoByIds(BatchDeleteAo batchDeleteAo); + + boolean updateRiverRData(java.util.Map updateData); + ZqBaseInfoVo getStcdInfo(String stcd); } diff --git a/backend/src/main/java/com/yfd/platform/qgc_env/zq/service/impl/ZqMonitorServiceImpl.java b/backend/src/main/java/com/yfd/platform/qgc_env/zq/service/impl/ZqMonitorServiceImpl.java index ccec0b0f..ee6173d7 100644 --- a/backend/src/main/java/com/yfd/platform/qgc_env/zq/service/impl/ZqMonitorServiceImpl.java +++ b/backend/src/main/java/com/yfd/platform/qgc_env/zq/service/impl/ZqMonitorServiceImpl.java @@ -10,6 +10,8 @@ import com.yfd.platform.common.GroupHelper; import com.yfd.platform.common.GroupingInfo; import com.yfd.platform.common.MicroservicDynamicSQLMapper; import com.yfd.platform.common.exception.BizException; +import com.yfd.platform.qgc_base.entity.vo.BatchDeleteAo; +import com.yfd.platform.qgc_base.entity.vo.DataParam; import com.yfd.platform.qgc_env.fh.entity.vo.HabitatVo; import com.yfd.platform.qgc_env.zq.entity.vo.ZqBaseInfoVo; import com.yfd.platform.qgc_env.zq.entity.vo.ZqRiverDayDataVo; @@ -19,13 +21,18 @@ import com.yfd.platform.qgc_env.zq.service.ZqMonitorService; import com.yfd.platform.utils.QgcQueryWrapperUtil; import jakarta.annotation.Resource; import org.springframework.stereotype.Service; +import org.springframework.transaction.annotation.Transactional; +import org.springframework.jdbc.core.JdbcTemplate; import java.util.ArrayList; import java.util.Arrays; +import java.util.Calendar; +import java.util.HashSet; import java.util.LinkedHashMap; import java.util.HashMap; import java.util.List; import java.util.Map; +import java.util.Set; @Service public class ZqMonitorServiceImpl implements ZqMonitorService { @@ -33,6 +40,9 @@ public class ZqMonitorServiceImpl implements ZqMonitorService { @Resource private MicroservicDynamicSQLMapper microservicDynamicSQLMapper; + @Resource + private JdbcTemplate jdbcTemplate; + @Override public DataSourceResult getMsstbprptList(DataSourceRequest dataSourceRequest) { return getMsstbprptListInternal(dataSourceRequest, false); @@ -152,6 +162,81 @@ public class ZqMonitorServiceImpl implements ZqMonitorService { return queryRiverDrtpGroupList(dataSourceRequest, loadOptions); } + @Override + @Transactional(rollbackFor = Exception.class) + public boolean removeKendoByIds(BatchDeleteAo batchDeleteAo) { + if (batchDeleteAo == null || CollUtil.isEmpty(batchDeleteAo.getDataList())) { + return true; + } + String dataType = batchDeleteAo.getDataType(); + List dataList = batchDeleteAo.getDataList(); + int batchSize = 500; + for (int i = 0; i < dataList.size(); i += batchSize) { + List subList = dataList.subList(i, Math.min(i + batchSize, dataList.size())); + if ("TIME".equals(dataType)) { + deleteRiverRData(subList); + Map dateRangeMap = new HashMap<>(); + Map monthRangeMap = new HashMap<>(); + for (DataParam param : subList) { + if (param == null || StrUtil.isBlank(param.getId()) || StrUtil.isBlank(param.getTm()) || param.getTm().length() < 10) { + continue; + } + String stcd = param.getId(); + String tm = param.getTm(); + String dateStr = tm.substring(0, 10); + dateRangeMap.compute(stcd, (k, range) -> mergeDateRange(range, dateStr)); + + String yearMonth = tm.substring(0, 7); + String[] ym = yearMonth.split("-"); + if (ym.length == 2) { + Integer year = Integer.parseInt(ym[0]); + Integer month = Integer.parseInt(ym[1]); + String monthStart = year + "-" + String.format("%02d", month) + "-01"; + String monthEnd = getMonthEndDate(year, month); + String monthKey = stcd + "_" + year + "_" + month; + monthRangeMap.putIfAbsent(monthKey, new String[]{stcd, monthStart, monthEnd}); + } + } + for (Map.Entry entry : dateRangeMap.entrySet()) { + statisticsDayDataFromHour(entry.getKey(), entry.getValue()[0], entry.getValue()[1]); + } + Set processedMonths = new HashSet<>(); + for (String[] values : monthRangeMap.values()) { + String monthKey = values[0] + "_" + values[1]; + if (processedMonths.add(monthKey)) { + statisticsMonthDataFromDay(values[0], values[1], values[2]); + } + } + } + if ("DATE".equals(dataType)) { + deleteRiverDayData(subList); + } + if ("MON".equals(dataType)) { + deleteRiverMonthData(subList); + } + } + return true; + } + + @Override + @Transactional(rollbackFor = Exception.class) + public boolean updateRiverRData(Map updateData) { + updateRiverHourData(updateData); + String stcd = updateData == null ? null : asString(updateData.get("stcd")); + String tm = updateData == null ? null : asString(updateData.get("tm")); + if (StrUtil.isNotBlank(stcd) && StrUtil.isNotBlank(tm) && tm.length() >= 10) { + String dateStr = tm.substring(0, 10); + statisticsDayDataFromHour(stcd, dateStr, dateStr); + String[] ym = dateStr.substring(0, 7).split("-"); + if (ym.length == 2) { + Integer year = Integer.parseInt(ym[0]); + Integer month = Integer.parseInt(ym[1]); + statisticsMonthDataFromDay(stcd, year + "-" + String.format("%02d", month) + "-01", getMonthEndDate(year, month)); + } + } + return true; + } + @Override public ZqBaseInfoVo getStcdInfo(String stcd) { if (StrUtil.isBlank(stcd)) { @@ -169,7 +254,7 @@ public class ZqMonitorServiceImpl implements ZqMonitorService { "t.JCDT AS jcdt, " + "t.WDDT AS wddt, " + "t.BLDSTT_CODE AS bldsttCode, " + - "CASE WHEN t.BLDSTT_CODE IN ('1', '10', '11') THEN '已建' WHEN t.BLDSTT_CODE IN ('2', '7', '8') THEN '在建' ELSE '未建/规划' END AS bldsttCcodeName, " + + "CASE WHEN t.BLDSTT_CODE = 2 THEN '已建' WHEN t.BLDSTT_CODE =1 THEN '在建' ELSE '未建/规划' END AS bldsttCcodeName, " + "t.INTRODUCE AS introduce, " + "t.LOGO AS logo, " + "t.INFFILE AS inffile, " + @@ -1402,6 +1487,235 @@ public class ZqMonitorServiceImpl implements ZqMonitorService { return orders.isEmpty() ? "" : " ORDER BY " + String.join(", ", orders); } + private void deleteRiverRData(List list) { + if (CollUtil.isEmpty(list)) { + return; + } + StringBuilder sql = new StringBuilder("DELETE FROM SD_RIVER_R WHERE "); + List args = new ArrayList<>(); + appendRiverDeleteConditions(sql, args, list, false, false); + if (!args.isEmpty()) { + jdbcTemplate.update(sql.toString(), args.toArray()); + } + } + + private void deleteRiverDayData(List list) { + if (CollUtil.isEmpty(list)) { + return; + } + StringBuilder sql = new StringBuilder("DELETE FROM SD_RIVERDAY_S WHERE "); + List args = new ArrayList<>(); + appendRiverDeleteConditions(sql, args, list, true, false); + if (!args.isEmpty()) { + jdbcTemplate.update(sql.toString(), args.toArray()); + } + } + + private void deleteRiverMonthData(List list) { + if (CollUtil.isEmpty(list)) { + return; + } + StringBuilder sql = new StringBuilder("DELETE FROM SD_RIVERDRTP_S WHERE "); + List conditions = new ArrayList<>(); + List args = new ArrayList<>(); + for (DataParam item : list) { + if (item == null || StrUtil.isBlank(item.getId()) || StrUtil.isBlank(item.getDrtp()) + || StrUtil.isBlank(item.getYear()) || StrUtil.isBlank(item.getMonth())) { + continue; + } + conditions.add("(STCD = ? AND DRTP = ? AND YEAR = ? AND MONTH = ?)"); + args.add(item.getId()); + args.add(item.getDrtp()); + args.add(Integer.parseInt(item.getYear())); + args.add(Integer.parseInt(item.getMonth())); + } + if (!conditions.isEmpty()) { + sql.append(String.join(" OR ", conditions)); + jdbcTemplate.update(sql.toString(), args.toArray()); + } + } + + private void appendRiverDeleteConditions(StringBuilder sql, + List args, + List list, + boolean dayTable, + boolean includeSeconds) { + List conditions = new ArrayList<>(); + for (DataParam item : list) { + if (item == null || StrUtil.isBlank(item.getId())) { + continue; + } + String timeValue = dayTable ? item.getDt() : item.getTm(); + if (StrUtil.isBlank(timeValue)) { + continue; + } + String pattern = dayTable ? "yyyy-MM-dd HH24:mi:ss" : "yyyy-MM-dd HH24:mi:ss"; + String column = dayTable ? "DT" : "TM"; + conditions.add("(STCD = ? AND " + column + " = TO_DATE(?, '" + pattern + "'))"); + args.add(item.getId()); + args.add(timeValue); + } + if (!conditions.isEmpty()) { + sql.append(String.join(" OR ", conditions)); + } + } + + private void updateRiverHourData(Map updateData) { + if (updateData == null || StrUtil.isBlank(asString(updateData.get("stcd"))) || StrUtil.isBlank(asString(updateData.get("tm")))) { + return; + } + List setParts = new ArrayList<>(); + List args = new ArrayList<>(); + if (updateData.containsKey("z")) { + setParts.add("Z = ?"); + args.add(updateData.get("z")); + } + if (updateData.containsKey("q")) { + setParts.add("Q = ?"); + args.add(updateData.get("q")); + } + if (updateData.containsKey("v")) { + setParts.add("V = ?"); + args.add(updateData.get("v")); + } + if (setParts.isEmpty()) { + return; + } + String sql = "UPDATE SD_RIVER_R SET " + String.join(", ", setParts) + + " WHERE STCD = ? AND TM = TO_DATE(?, 'yyyy-MM-dd HH24:mi:ss')"; + args.add(asString(updateData.get("stcd"))); + args.add(asString(updateData.get("tm"))); + jdbcTemplate.update(sql, args.toArray()); + } + + private String[] mergeDateRange(String[] range, String dateStr) { + if (range == null) { + return new String[]{dateStr, dateStr}; + } + if (dateStr.compareTo(range[0]) < 0) { + range[0] = dateStr; + } + if (dateStr.compareTo(range[1]) > 0) { + range[1] = dateStr; + } + return range; + } + + private String getMonthEndDate(Integer year, Integer month) { + Calendar calendar = Calendar.getInstance(); + calendar.set(year, month - 1, 1); + int lastDay = calendar.getActualMaximum(Calendar.DAY_OF_MONTH); + return year + "-" + String.format("%02d", month) + "-" + String.format("%02d", lastDay); + } + + private String asString(Object value) { + return value == null ? null : String.valueOf(value); + } + + private void statisticsDayDataFromHour(String stcd, String startDate, String endDate) { + String deleteSql = "DELETE FROM SD_RIVERDAY_S T " + + "WHERE T.STCD = ? " + + "AND T.DT BETWEEN TO_DATE(?, 'YYYY-MM-DD') " + + "AND TO_DATE(?, 'YYYY-MM-DD') " + + "AND NOT EXISTS ( " + + "SELECT 1 FROM SD_RIVER_R S " + + "WHERE S.STCD = T.STCD " + + "AND TRUNC(S.TM) = T.DT " + + "AND S.TM >= TO_DATE(? || ' 00:00:00', 'YYYY-MM-DD HH24:MI:SS') " + + "AND S.TM <= TO_DATE(? || ' 23:59:59', 'YYYY-MM-DD HH24:MI:SS') " + + "AND NVL(S.IS_DELETED, 0) = 0)"; + jdbcTemplate.update(deleteSql, stcd, startDate, endDate, startDate, endDate); + + String mergeSql = "MERGE INTO SD_RIVERDAY_S T " + + "USING ( " + + " SELECT STCD, " + + " TRUNC(TM) AS DT, " + + " AVG(Z) AS Z, " + + " AVG(Q) AS Q, " + + " AVG(V) AS V, " + + " MIN(MSQMT) AS MSQMT " + + " FROM SD_RIVER_R " + + " WHERE STCD = ? " + + " AND TM >= TO_DATE(? || ' 00:00:00', 'YYYY-MM-DD HH24:MI:SS') " + + " AND TM <= TO_DATE(? || ' 23:59:59', 'YYYY-MM-DD HH24:MI:SS') " + + " AND NVL(IS_DELETED, 0) = 0 " + + " GROUP BY STCD, TRUNC(TM) " + + ") S " + + "ON (T.STCD = S.STCD AND T.DT = S.DT) " + + "WHEN MATCHED THEN UPDATE SET " + + " T.Z = S.Z, " + + " T.Q = S.Q, " + + " T.V = S.V, " + + " T.MSQMT = S.MSQMT, " + + " T.IS_DELETED = 0, " + + " T.DELETE_USER = NULL, " + + " T.DELETE_TIME = NULL, " + + " T.MODIFY_USER = NULL, " + + " T.MODIFY_TIME = SYSDATE " + + "WHEN NOT MATCHED THEN INSERT ( " + + " ID, STCD, DT, Z, Q, V, MSQMT, RECORD_TIME, IS_DELETED " + + ") VALUES ( " + + " SYS_GUID(), S.STCD, S.DT, S.Z, S.Q, S.V, S.MSQMT, SYSDATE, 0 " + + ")"; + jdbcTemplate.update(mergeSql, stcd, startDate, endDate); + } + + private void statisticsMonthDataFromDay(String stcd, String startDate, String endDate) { + Integer startYearInt = Integer.parseInt(startDate.substring(0, 4)); + Integer startMonthInt = Integer.parseInt(startDate.substring(5, 7)); + Integer endMonthInt = Integer.parseInt(endDate.substring(5, 7)); + + String deleteSql = "DELETE FROM SD_RIVERDRTP_S T " + + "WHERE T.DRTP = 'MON' " + + "AND T.STCD = ? " + + "AND T.YEAR = ? " + + "AND T.MONTH BETWEEN ? AND ? " + + "AND NOT EXISTS ( " + + " SELECT 1 FROM SD_RIVERDAY_S D " + + " WHERE D.STCD = T.STCD " + + " AND NVL(D.IS_DELETED, 0) = 0 " + + " AND EXTRACT(YEAR FROM D.DT) = T.YEAR " + + " AND EXTRACT(MONTH FROM D.DT) = T.MONTH " + + " AND D.DT >= TO_DATE(?, 'YYYY-MM-DD') " + + " AND D.DT < TO_DATE(?, 'YYYY-MM-DD') + 1)"; + jdbcTemplate.update(deleteSql, stcd, startYearInt, startMonthInt, endMonthInt, startDate, endDate); + + String mergeSql = "MERGE INTO SD_RIVERDRTP_S T " + + "USING ( " + + " SELECT STCD, " + + " EXTRACT(YEAR FROM DT) AS YEAR, " + + " EXTRACT(MONTH FROM DT) AS MONTH, " + + " 'MON' AS DRTP, " + + " AVG(Z) AS Z, " + + " AVG(Q) AS Q, " + + " AVG(V) AS V, " + + " MIN(MSQMT) AS MSQMT " + + " FROM SD_RIVERDAY_S " + + " WHERE STCD = ? " + + " AND DT >= TO_DATE(?, 'YYYY-MM-DD') " + + " AND DT < TO_DATE(?, 'YYYY-MM-DD') + 1 " + + " AND NVL(IS_DELETED, 0) = 0 " + + " GROUP BY STCD, EXTRACT(YEAR FROM DT), EXTRACT(MONTH FROM DT) " + + ") S " + + "ON (T.STCD = S.STCD AND T.DRTP = 'MON' AND T.YEAR = S.YEAR AND T.MONTH = S.MONTH) " + + "WHEN MATCHED THEN UPDATE SET " + + " T.Z = S.Z, " + + " T.Q = S.Q, " + + " T.V = S.V, " + + " T.MSQMT = S.MSQMT, " + + " T.IS_DELETED = 0, " + + " T.DELETE_TIME = NULL, " + + " T.MODIFY_TIME = SYSDATE, " + + " T.TM = TO_DATE(S.YEAR || '-' || LPAD(S.MONTH, 2, '0') || '-01', 'YYYY-MM-DD') " + + "WHEN NOT MATCHED THEN INSERT ( " + + " ID, STCD, DRTP, YEAR, MONTH, Z, Q, V, MSQMT, RECORD_TIME, IS_DELETED, TM " + + ") VALUES ( " + + " SYS_GUID(), S.STCD, 'MON', S.YEAR, S.MONTH, S.Z, S.Q, S.V, S.MSQMT, SYSDATE, 0, " + + " TO_DATE(S.YEAR || '-' || LPAD(S.MONTH, 2, '0') || '-01', 'YYYY-MM-DD') " + + ")"; + jdbcTemplate.update(mergeSql, stcd, startDate, endDate); + } + private String buildRiverAggregateSql(String aggregate, String column, String field) { String normalized = aggregate == null ? "" : aggregate.toLowerCase(); return switch (normalized) { @@ -1559,7 +1873,7 @@ public class ZqMonitorServiceImpl implements ZqMonitorService { selectMap.put("jcdt", "t.JCDT AS jcdt"); selectMap.put("wddt", "t.WDDT AS wddt"); selectMap.put("bldsttCode", "t.BLDSTT_CODE AS bldsttCode"); - selectMap.put("bldsttCcodeName", "CASE WHEN t.BLDSTT_CODE IN ('1', '10', '11') THEN '已建' WHEN t.BLDSTT_CODE IN ('2', '7', '8') THEN '在建' ELSE '未建/规划' END AS bldsttCcodeName"); + selectMap.put("bldsttCcodeName", "CASE WHEN t.BLDSTT_CODE =2 THEN '已建' WHEN t.BLDSTT_CODE =1 THEN '在建' ELSE '未建/规划' END AS bldsttCcodeName"); selectMap.put("introduce", "t.INTRODUCE AS introduce"); selectMap.put("logo", "t.LOGO AS logo"); selectMap.put("inffile", "t.INFFILE AS inffile"); @@ -1681,7 +1995,7 @@ public class ZqMonitorServiceImpl implements ZqMonitorService { case "jcdt" -> "t.JCDT"; case "wddt" -> "t.WDDT"; case "bldsttCode", "bldsttCcode" -> "t.BLDSTT_CODE"; - case "bldsttCcodeName" -> "CASE WHEN t.BLDSTT_CODE IN ('1', '10', '11') THEN '已建' WHEN t.BLDSTT_CODE IN ('2', '7', '8') THEN '在建' ELSE '未建/规划' END"; + case "bldsttCcodeName" -> "CASE WHEN t.BLDSTT_CODE =2 THEN '已建' WHEN t.BLDSTT_CODE =1 THEN '在建' ELSE '未建/规划' END"; case "introduce" -> "t.INTRODUCE"; case "logo" -> "t.LOGO"; case "inffile" -> "t.INFFILE"; From 67dc13039d504c28c16f8a6667ee769b725e8551 Mon Sep 17 00:00:00 2001 From: tangwei Date: Mon, 15 Jun 2026 14:48:33 +0800 Subject: [PATCH 9/9] =?UTF-8?q?fix:=20=E4=BC=98=E5=8C=96=E9=80=BB=E8=BE=91?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../fp/service/impl/FpRunServiceImpl.java | 19 +++++++++---------- 1 file changed, 9 insertions(+), 10 deletions(-) diff --git a/backend/src/main/java/com/yfd/platform/qgc_env/fp/service/impl/FpRunServiceImpl.java b/backend/src/main/java/com/yfd/platform/qgc_env/fp/service/impl/FpRunServiceImpl.java index deb7abe9..f94e7cfd 100644 --- a/backend/src/main/java/com/yfd/platform/qgc_env/fp/service/impl/FpRunServiceImpl.java +++ b/backend/src/main/java/com/yfd/platform/qgc_env/fp/service/impl/FpRunServiceImpl.java @@ -264,14 +264,14 @@ public class FpRunServiceImpl implements FpRunService { stationParamMap ); String rstcd = stationContext == null ? null : Convert.toStr(stationContext.get("rstcd"), null); - String hbrvcd = stationContext == null ? null : Convert.toStr(stationContext.get("hbrvcd"), null); - +// String hbrvcd = stationContext == null ? null : Convert.toStr(stationContext.get("hbrvcd"), null); + String rvcd = stationContext == null ? null : Convert.toStr(stationContext.get("rvcd"), null); String wtrvStcd = null; String wqStcd = null; - if (StrUtil.isNotBlank(rstcd) && StrUtil.isNotBlank(hbrvcd)) { + if (StrUtil.isNotBlank(rstcd) && StrUtil.isNotBlank(rvcd)) { Map alongParamMap = new HashMap<>(); alongParamMap.put("rstcd", rstcd); - alongParamMap.put("hbrvcd", hbrvcd); + alongParamMap.put("rvcd", rvcd); List> alongRows = microservicDynamicSQLMapper.pageAllList( null, buildQgcFpRunAnalysisAlongSql(), @@ -294,14 +294,13 @@ public class FpRunServiceImpl implements FpRunService { paramMap.put("startTime", StrUtil.trim(tmArr[0])); paramMap.put("endTime", StrUtil.trim(tmArr[1])); paramMap.put("rstcd", rstcd); - paramMap.put("hbrvcd", hbrvcd); + paramMap.put("hbrvcd", rvcd); paramMap.put("wtrvStcd", wtrvStcd); paramMap.put("wqStcd", wqStcd); - + String sql = buildQgcFpRunAnalysisDataSql(dataSourceRequest == null ? null : dataSourceRequest.getSort()); Page page = loadOptions == null ? null : QgcQueryWrapperUtil.buildPage(loadOptions); List rows = microservicDynamicSQLMapper.pageAllListWithResultType( - page, - buildQgcFpRunAnalysisDataSql(dataSourceRequest == null ? null : dataSourceRequest.getSort()), + page,sql, paramMap, FpRunAnalysisVo.class ); @@ -2059,7 +2058,7 @@ public class FpRunServiceImpl implements FpRunService { } private String buildQgcFpRunAnalysisStationSql() { - return "SELECT fp.RSTCD AS rstcd, eng.HBRVCD AS hbrvcd " + + return "SELECT fp.RSTCD AS \"rstcd\",eng.RVCD AS \"rvcd\", eng.HBRVCD AS \"hbrvcd\" " + "FROM SD_FPSS_B_H fp " + "LEFT JOIN SD_ENGINFO_B_H eng ON eng.STCD = fp.RSTCD AND NVL(eng.IS_DELETED, 0) = 0 " + "WHERE fp.STCD = #{map.stcd} " + @@ -2071,7 +2070,7 @@ public class FpRunServiceImpl implements FpRunService { "FROM MS_ALONG_B t1 " + "INNER JOIN MS_ALONGDET_B t2 ON t1.ID = t2.ALONG_ID " + "WHERE t1.CODE = 'common' " + - " AND t1.RVCD = #{map.hbrvcd} " + + " AND t1.RVCD = #{map.rvcd} " + " AND t2.RSTCD = #{map.rstcd} " + " AND t2.STTP IN ('WTRV', 'WQ') " + " AND NVL(t1.IS_DELETED, 0) = 0 " +