From fa7b9b8e69485db58e814663455b7166ae3e2624 Mon Sep 17 00:00:00 2001 From: tangwei Date: Mon, 15 Jun 2026 14:18:48 +0800 Subject: [PATCH] =?UTF-8?q?feat:=20=E5=88=A0=E9=99=A4=E6=B5=81=E9=87=8F?= =?UTF-8?q?=E7=AB=99=E5=B0=8F=E6=97=B6/=E6=97=A5/=E6=9C=88=E6=95=B0?= =?UTF-8?q?=E6=8D=AE&=E4=BF=AE=E6=94=B9=E6=B5=81=E9=87=8F=E7=AB=99?= =?UTF-8?q?=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";