From 90a074ff93bfcd9075b7d8b0b9e3505a936cca6d Mon Sep 17 00:00:00 2001 From: tangwei Date: Fri, 12 Jun 2026 17:37:09 +0800 Subject: [PATCH] =?UTF-8?q?feat:=20=E4=BF=AE=E6=94=B9=E6=B0=B4=E8=B4=A8?= =?UTF-8?q?=E5=B0=8F=E6=97=B6=E6=95=B0=E6=8D=AE&=E5=88=A0=E9=99=A4?= =?UTF-8?q?=E6=B0=B4=E8=B4=A8=E5=B0=8F=E6=97=B6/=E6=97=A5/=E6=9C=88?= =?UTF-8?q?=E6=95=B0=E6=8D=AE?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../wq/controller/EnvWqDataController.java | 17 + .../qgc_env/wq/service/EnvWqDataService.java | 7 + .../wq/service/impl/EnvWqDataServiceImpl.java | 523 ++++++++++++++++++ 3 files changed, 547 insertions(+) diff --git a/backend/src/main/java/com/yfd/platform/qgc_env/wq/controller/EnvWqDataController.java b/backend/src/main/java/com/yfd/platform/qgc_env/wq/controller/EnvWqDataController.java index 682a1104..6d0a35b7 100644 --- a/backend/src/main/java/com/yfd/platform/qgc_env/wq/controller/EnvWqDataController.java +++ b/backend/src/main/java/com/yfd/platform/qgc_env/wq/controller/EnvWqDataController.java @@ -2,6 +2,7 @@ package com.yfd.platform.qgc_env.wq.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.wq.service.EnvWqDataService; 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.RequestParam; import org.springframework.web.bind.annotation.RequestMapping; import org.springframework.web.bind.annotation.RestController; +import java.util.Map; + @RestController @RequestMapping("/wq") @Tag(name = "水质统计分析") @@ -54,6 +57,20 @@ public class EnvWqDataController { return ResponseResult.successData(envWqDataService.getDrtpKendoListCust(dataSourceRequest)); } + @PostMapping("/updateWqRsData") + @Operation(summary = "修改水质小时数据") + public ResponseResult updateWqRsData(@RequestBody Map updateData) { + envWqDataService.updateWqRsData(updateData); + return ResponseResult.success(); + } + + @PostMapping("/removeKendoByIds") + @Operation(summary = "删除水质小时/日/月数据") + public ResponseResult removeKendoByIds(@RequestBody BatchDeleteAo batchDeleteAo) { + envWqDataService.removeKendoByIds(batchDeleteAo); + return ResponseResult.success(); + } + @PostMapping("/GetStbprpYsByStcd") @Operation(summary = "水质监测数据查询") public ResponseResult GetStbprpYsByStcd(@RequestBody DataSourceRequest dataSourceRequest) { diff --git a/backend/src/main/java/com/yfd/platform/qgc_env/wq/service/EnvWqDataService.java b/backend/src/main/java/com/yfd/platform/qgc_env/wq/service/EnvWqDataService.java index fba7baa5..f23a3931 100644 --- a/backend/src/main/java/com/yfd/platform/qgc_env/wq/service/EnvWqDataService.java +++ b/backend/src/main/java/com/yfd/platform/qgc_env/wq/service/EnvWqDataService.java @@ -2,8 +2,11 @@ package com.yfd.platform.qgc_env.wq.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.wq.entity.vo.WqBaseInfoVo; +import java.util.Map; + public interface EnvWqDataService { DataSourceResult processKendoList(DataSourceRequest dataSourceRequest); @@ -35,4 +38,8 @@ public interface EnvWqDataService { DataSourceResult getStTbYsBVoKendoListCust(String stcd, String tbCode, String startTime, String endTime); DataSourceResult getStTbYsBVoKendoListCust(DataSourceRequest dataSourceRequest); + + boolean updateWqRsData(Map updateData); + + boolean removeKendoByIds(BatchDeleteAo batchDeleteAo); } diff --git a/backend/src/main/java/com/yfd/platform/qgc_env/wq/service/impl/EnvWqDataServiceImpl.java b/backend/src/main/java/com/yfd/platform/qgc_env/wq/service/impl/EnvWqDataServiceImpl.java index 942d42a6..c984ae0c 100644 --- a/backend/src/main/java/com/yfd/platform/qgc_env/wq/service/impl/EnvWqDataServiceImpl.java +++ b/backend/src/main/java/com/yfd/platform/qgc_env/wq/service/impl/EnvWqDataServiceImpl.java @@ -13,6 +13,8 @@ import com.yfd.platform.common.GroupingInfo; import com.yfd.platform.common.MicroservicDynamicSQLMapper; import com.yfd.platform.common.PageInfo; import com.yfd.platform.common.exception.BizException; +import com.yfd.platform.qgc_base.entity.vo.BatchDeleteAo; +import com.yfd.platform.qgc_base.entity.vo.DataParam; import com.yfd.platform.qgc_env.wq.entity.vo.*; import com.yfd.platform.qgc_env.wq.service.EnvWqDataService; import com.yfd.platform.qgc_env.wt.entity.vo.WbsbVo; @@ -22,13 +24,17 @@ import com.yfd.platform.utils.RequestHolder; import com.yfd.platform.utils.SecurityUtils; import jakarta.annotation.Resource; import org.springframework.stereotype.Service; +import org.springframework.transaction.annotation.Transactional; +import org.springframework.jdbc.core.JdbcTemplate; import java.math.BigDecimal; import java.util.ArrayList; import java.util.Arrays; +import java.util.Calendar; import java.util.Comparator; import java.util.Date; import java.util.HashMap; +import java.util.HashSet; import java.util.LinkedHashMap; import java.util.List; import java.util.Map; @@ -41,6 +47,9 @@ public class EnvWqDataServiceImpl implements EnvWqDataService { @Resource private MicroservicDynamicSQLMapper microservicDynamicSQLMapper; + @Resource + private JdbcTemplate jdbcTemplate; + @Override public DataSourceResult processKendoList(DataSourceRequest dataSourceRequest) { boolean calculated = CommonConstant.CALCULATE_SUCCESS.equals( @@ -3637,4 +3646,518 @@ public class EnvWqDataServiceImpl implements EnvWqDataService { } return " ORDER BY " + String.join(", ", orders); } + + @Override + @Transactional(rollbackFor = Exception.class) + public boolean updateWqRsData(Map updateData) { + if (updateData == null || updateData.isEmpty()) { + return true; + } + updateWqHourData(updateData); + updateWqTargetIfNeeded(updateData); + + String stcd = asString(updateData.get("stcd")); + String tm = 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]); + String startDate = year + "-" + String.format("%02d", month) + "-01"; + String endDate = getMonthEndDate(year, month); + statisticsMonthDataFromDay(stcd, startDate, endDate); + } + } + return true; + } + + @Override + @Transactional(rollbackFor = Exception.class) + public boolean removeKendoByIds(BatchDeleteAo batchDeleteAo) { + List dataList = batchDeleteAo == null ? null : batchDeleteAo.getDataList(); + if (CollUtil.isEmpty(dataList)) { + return true; + } + String dataType = StrUtil.blankToDefault(batchDeleteAo.getDataType(), "").toUpperCase(); + 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".equals(dataType)) { + softDeleteWqMonthData(subList); + } + if ("DATE".equals(dataType)) { + softDeleteWqDayData(subList); + } + if ("TIME".equals(dataType)) { + deleteWqHourData(subList); + + Map dateRangeMap = new HashMap<>(); + Map monthRangeMap = new HashMap<>(); + for (DataParam param : subList) { + String stcd = param == null ? null : param.getId(); + String tm = param == null ? null : param.getTm(); + if (StrUtil.isBlank(stcd) || StrUtil.isBlank(tm) || tm.length() < 10) { + continue; + } + String dateStr = tm.substring(0, 10); + dateRangeMap.compute(stcd, (key, range) -> { + 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; + }); + + 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); + monthRangeMap.putIfAbsent(stcd + "_" + year + "_" + month, + 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]); + } + } + } + } + return true; + } + + private void updateWqHourData(Map updateData) { + LinkedHashMap columnMap = new LinkedHashMap<>(); + columnMap.put("wtmp", "WTMP"); + columnMap.put("ph", "PH"); + columnMap.put("dox", "DOX"); + columnMap.put("codmn", "CODMN"); + columnMap.put("codcr", "CODCR"); + columnMap.put("bod5", "BOD5"); + columnMap.put("nh3n", "NH3N"); + columnMap.put("tp", "TP"); + columnMap.put("tn", "TN"); + columnMap.put("cu", "CU"); + columnMap.put("zn", "ZN"); + columnMap.put("f", "F"); + columnMap.put("se", "SE"); + columnMap.put("ars", "ARS"); + columnMap.put("hg", "HG"); + columnMap.put("cd", "CD"); + columnMap.put("cr6", "CR6"); + columnMap.put("pb", "PB"); + columnMap.put("cn", "CN"); + columnMap.put("vlph", "VLPH"); + columnMap.put("oil", "OIL"); + columnMap.put("las", "LAS"); + columnMap.put("s2", "S2"); + columnMap.put("fcg", "FCG"); + columnMap.put("cl", "CL"); + columnMap.put("so4", "SO4"); + columnMap.put("no3", "NO3"); + columnMap.put("thrd", "THRD"); + columnMap.put("cond", "COND"); + columnMap.put("fe", "FE"); + columnMap.put("mn", "MN"); + columnMap.put("al", "AL"); + columnMap.put("chla", "CHLA"); + columnMap.put("clarity", "CLARITY"); + columnMap.put("tu", "TU"); + columnMap.put("cyano", "CYANO"); + columnMap.put("wqgrd", "WQGRD"); + columnMap.put("sfdb", "SFDB"); + columnMap.put("wqSfdbhnYs", "WQ_SFDBHN_YS"); + + List setClauses = new ArrayList<>(); + List params = new ArrayList<>(); + for (Map.Entry entry : columnMap.entrySet()) { + if (updateData.containsKey(entry.getKey())) { + setClauses.add(entry.getValue() + " = ?"); + params.add(updateData.get(entry.getKey())); + } + } + if (setClauses.isEmpty()) { + return; + } + + String stcd = asString(updateData.get("stcd")); + String tm = asString(updateData.get("tm")); + if (StrUtil.isBlank(stcd) || StrUtil.isBlank(tm)) { + throw new BizException("站点编码和时间不能为空"); + } + + String sql = "UPDATE SD_WQ_R SET " + String.join(", ", setClauses) + + " WHERE STCD = ? AND TM = TO_DATE(?, 'YYYY-MM-DD HH24:MI:SS')"; + params.add(stcd); + params.add(tm); + jdbcTemplate.update(sql, params.toArray()); + } + + private void updateWqTargetIfNeeded(Map updateData) { + if (!updateData.containsKey("wwqtg")) { + return; + } + String stcd = asString(updateData.get("stcd")); + if (StrUtil.isBlank(stcd)) { + return; + } + jdbcTemplate.update( + "UPDATE SD_WQ_B_H SET WWQTG = ?, MODIFY_USER = ?, MODIFY_TIME = SYSDATE " + + "WHERE STCD = ? AND NVL(IS_DELETED, 0) = 0", + updateData.get("wwqtg"), + SecurityUtils.getUserId(), + stcd + ); + } + + private void softDeleteWqMonthData(List dataParamList) { + if (CollUtil.isEmpty(dataParamList)) { + return; + } + StringBuilder sql = new StringBuilder("MERGE INTO SD_WQDRTP_S target USING ("); + List params = new ArrayList<>(); + for (int i = 0; i < dataParamList.size(); i++) { + if (i > 0) { + sql.append(" UNION ALL "); + } + sql.append("SELECT ? AS STCD, ? AS DRTP, ? AS YEAR, ? AS MONTH FROM DUAL"); + DataParam item = dataParamList.get(i); + params.add(item == null ? null : item.getId()); + params.add(item == null ? null : item.getDrtp()); + params.add(item == null ? null : item.getYear()); + params.add(item == null ? null : item.getMonth()); + } + sql.append(") source ON (target.STCD = source.STCD AND target.DRTP = source.DRTP ") + .append("AND target.YEAR = source.YEAR AND target.MONTH = source.MONTH) ") + .append("WHEN MATCHED THEN UPDATE SET target.IS_DELETED = 1, target.DELETE_TIME = SYSDATE"); + jdbcTemplate.update(sql.toString(), params.toArray()); + } + + private void softDeleteWqDayData(List dataParamList) { + if (CollUtil.isEmpty(dataParamList)) { + return; + } + StringBuilder sql = new StringBuilder("MERGE INTO SD_WQDAY_S target USING ("); + List params = new ArrayList<>(); + for (int i = 0; i < dataParamList.size(); i++) { + if (i > 0) { + sql.append(" UNION ALL "); + } + sql.append("SELECT ? AS STCD, TO_DATE(?, 'YYYY-MM-DD HH24:MI:SS') AS DT FROM DUAL"); + DataParam item = dataParamList.get(i); + params.add(item == null ? null : item.getId()); + params.add(item == null ? null : item.getDt()); + } + sql.append(") source ON (target.STCD = source.STCD AND target.DT = source.DT) ") + .append("WHEN MATCHED THEN UPDATE SET target.IS_DELETED = 1, target.DELETE_TIME = SYSDATE"); + jdbcTemplate.update(sql.toString(), params.toArray()); + } + + private void deleteWqHourData(List dataParamList) { + if (CollUtil.isEmpty(dataParamList)) { + return; + } + StringBuilder sql = new StringBuilder("DELETE FROM SD_WQ_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(?, 'YYYY-MM-DD HH24:MI:SS'))"); + DataParam item = dataParamList.get(i); + params.add(item == null ? null : item.getId()); + params.add(item == null ? null : item.getTm()); + } + 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_WQDAY_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_WQ_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 S.IS_DELETED = 0)"; + jdbcTemplate.update(deleteSql, stcd, startDate, endDate, startDate, endDate); + + String mergeSql = "MERGE INTO SD_WQDAY_S T " + + "USING ( " + + " SELECT " + + " STCD, " + + " TRUNC(TM) AS DT, " + + " AVG(WTMP) AS WTMP, " + + " AVG(PH) AS PH, " + + " AVG(DOX) AS DOX, " + + " AVG(CODMN) AS CODMN, " + + " AVG(CODCR) AS CODCR, " + + " AVG(BOD5) AS BOD5, " + + " AVG(NH3N) AS NH3N, " + + " AVG(TP) AS TP, " + + " AVG(TN) AS TN, " + + " AVG(CU) AS CU, " + + " AVG(ZN) AS ZN, " + + " AVG(F) AS F, " + + " AVG(SE) AS SE, " + + " AVG(ARS) AS ARS, " + + " AVG(HG) AS HG, " + + " AVG(CD) AS CD, " + + " AVG(CR6) AS CR6, " + + " AVG(PB) AS PB, " + + " AVG(CN) AS CN, " + + " AVG(VLPH) AS VLPH, " + + " AVG(OIL) AS OIL, " + + " AVG(LAS) AS LAS, " + + " AVG(S2) AS S2, " + + " AVG(FCG) AS FCG, " + + " AVG(CL) AS CL, " + + " AVG(SO4) AS SO4, " + + " AVG(NO3) AS NO3, " + + " AVG(THRD) AS THRD, " + + " AVG(COND) AS COND, " + + " AVG(FE) AS FE, " + + " AVG(MN) AS MN, " + + " AVG(AL) AS AL, " + + " AVG(CHLA) AS CHLA, " + + " AVG(CLARITY) AS CLARITY, " + + " AVG(TU) AS TU, " + + " AVG(CYANO) AS CYANO, " + + " AVG(SS) AS SS, " + + " AVG(NO2) AS NO2, " + + " MIN(WQGRD) AS WQGRD, " + + " MIN(SFDB) AS SFDB " + + " FROM SD_WQ_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) " + + ") S " + + "ON (T.STCD = S.STCD AND T.DT = S.DT) " + + "WHEN MATCHED THEN UPDATE SET " + + " T.WTMP = S.WTMP, " + + " T.PH = S.PH, " + + " T.DOX = S.DOX, " + + " T.CODMN = S.CODMN, " + + " T.CODCR = S.CODCR, " + + " T.BOD5 = S.BOD5, " + + " T.NH3N = S.NH3N, " + + " T.TP = S.TP, " + + " T.TN = S.TN, " + + " T.CU = S.CU, " + + " T.ZN = S.ZN, " + + " T.F = S.F, " + + " T.SE = S.SE, " + + " T.ARS = S.ARS, " + + " T.HG = S.HG, " + + " T.CD = S.CD, " + + " T.CR6 = S.CR6, " + + " T.PB = S.PB, " + + " T.CN = S.CN, " + + " T.VLPH = S.VLPH, " + + " T.OIL = S.OIL, " + + " T.LAS = S.LAS, " + + " T.S2 = S.S2, " + + " T.FCG = S.FCG, " + + " T.CL = S.CL, " + + " T.SO4 = S.SO4, " + + " T.NO3 = S.NO3, " + + " T.THRD = S.THRD, " + + " T.COND = S.COND, " + + " T.FE = S.FE, " + + " T.MN = S.MN, " + + " T.AL = S.AL, " + + " T.CHLA = S.CHLA, " + + " T.CLARITY = S.CLARITY, " + + " T.TU = S.TU, " + + " T.CYANO = S.CYANO, " + + " T.SS = S.SS, " + + " T.NO2 = S.NO2, " + + " T.WQGRD = S.WQGRD, " + + " T.SFDB = S.SFDB, " + + " 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, WQGRD, WTMP, PH, DOX, CODMN, CODCR, BOD5, " + + " NH3N, TP, TN, CU, ZN, F, SE, ARS, HG, CD, CR6, PB, CN, VLPH, " + + " OIL, LAS, S2, FCG, CL, SO4, NO3, THRD, COND, FE, MN, AL, CHLA, " + + " CLARITY, TU, CYANO, SFDB, SS, NO2, " + + " RECORD_TIME, IS_DELETED " + + ") VALUES ( " + + " SYS_GUID(), S.STCD, S.DT, S.WQGRD, S.WTMP, S.PH, S.DOX, S.CODMN, S.CODCR, S.BOD5, " + + " S.NH3N, S.TP, S.TN, S.CU, S.ZN, S.F, S.SE, S.ARS, S.HG, S.CD, S.CR6, S.PB, S.CN, S.VLPH, " + + " S.OIL, S.LAS, S.S2, S.FCG, S.CL, S.SO4, S.NO3, S.THRD, S.COND, S.FE, S.MN, S.AL, S.CHLA, " + + " S.CLARITY, S.TU, S.CYANO, S.SFDB, S.SS, S.NO2, " + + " 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_WQDRTP_S T " + + "WHERE T.DRTP = 'MON' " + + "AND T.STCD = ? " + + "AND T.YEAR = ? " + + "AND T.MONTH BETWEEN ? AND ? " + + "AND NOT EXISTS ( " + + " SELECT 1 FROM SD_WQDAY_S D " + + " WHERE D.STCD = T.STCD " + + " 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)"; + jdbcTemplate.update(deleteSql, stcd, startYearInt, startMonthInt, endMonthInt, startDate, endDate); + + String mergeSql = "MERGE INTO SD_WQDRTP_S T " + + "USING ( " + + " SELECT " + + " STCD, " + + " EXTRACT(YEAR FROM DT) AS YEAR, " + + " EXTRACT(MONTH FROM DT) AS MONTH, " + + " 'MON' AS DRTP, " + + " AVG(WTMP) AS WTMP, " + + " AVG(PH) AS PH, " + + " AVG(DOX) AS DOX, " + + " AVG(CODMN) AS CODMN, " + + " AVG(CODCR) AS CODCR, " + + " AVG(BOD5) AS BOD5, " + + " AVG(NH3N) AS NH3N, " + + " AVG(TP) AS TP, " + + " AVG(TN) AS TN, " + + " AVG(CU) AS CU, " + + " AVG(ZN) AS ZN, " + + " AVG(F) AS F, " + + " AVG(SE) AS SE, " + + " AVG(ARS) AS ARS, " + + " AVG(HG) AS HG, " + + " AVG(CD) AS CD, " + + " AVG(CR6) AS CR6, " + + " AVG(PB) AS PB, " + + " AVG(CN) AS CN, " + + " AVG(VLPH) AS VLPH, " + + " AVG(OIL) AS OIL, " + + " AVG(LAS) AS LAS, " + + " AVG(S2) AS S2, " + + " AVG(FCG) AS FCG, " + + " AVG(CL) AS CL, " + + " AVG(SO4) AS SO4, " + + " AVG(NO3) AS NO3, " + + " AVG(THRD) AS THRD, " + + " AVG(COND) AS COND, " + + " AVG(FE) AS FE, " + + " AVG(MN) AS MN, " + + " AVG(AL) AS AL, " + + " AVG(CHLA) AS CHLA, " + + " AVG(CLARITY) AS CLARITY, " + + " AVG(TU) AS TU, " + + " AVG(CYANO) AS CYANO, " + + " AVG(SFDB) AS SFDB, " + + " AVG(SS) AS SS, " + + " AVG(NO2) AS NO2, " + + " MIN(WQGRD) AS WQGRD " + + " FROM SD_WQDAY_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) " + + ") 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.WQGRD = S.WQGRD, " + + " T.WTMP = S.WTMP, " + + " T.PH = S.PH, " + + " T.DOX = S.DOX, " + + " T.CODMN = S.CODMN, " + + " T.CODCR = S.CODCR, " + + " T.BOD5 = S.BOD5, " + + " T.NH3N = S.NH3N, " + + " T.TP = S.TP, " + + " T.TN = S.TN, " + + " T.CU = S.CU, " + + " T.ZN = S.ZN, " + + " T.F = S.F, " + + " T.SE = S.SE, " + + " T.ARS = S.ARS, " + + " T.HG = S.HG, " + + " T.CD = S.CD, " + + " T.CR6 = S.CR6, " + + " T.PB = S.PB, " + + " T.CN = S.CN, " + + " T.VLPH = S.VLPH, " + + " T.OIL = S.OIL, " + + " T.LAS = S.LAS, " + + " T.S2 = S.S2, " + + " T.FCG = S.FCG, " + + " T.CL = S.CL, " + + " T.SO4 = S.SO4, " + + " T.NO3 = S.NO3, " + + " T.THRD = S.THRD, " + + " T.COND = S.COND, " + + " T.FE = S.FE, " + + " T.MN = S.MN, " + + " T.AL = S.AL, " + + " T.CHLA = S.CHLA, " + + " T.CLARITY = S.CLARITY, " + + " T.TU = S.TU, " + + " T.CYANO = S.CYANO, " + + " T.SFDB = S.SFDB, " + + " T.SS = S.SS, " + + " T.NO2 = S.NO2, " + + " T.IS_DELETED = 0, " + + " T.DELETE_TIME = NULL, " + + " T.MODIFY_TIME = SYSDATE, " + + " T.TM = SYSDATE " + + "WHEN NOT MATCHED THEN INSERT ( " + + " ID, STCD, DRTP, YEAR, MONTH, WQGRD, " + + " WTMP, PH, DOX, CODMN, CODCR, BOD5, NH3N, TP, TN, " + + " CU, ZN, F, SE, ARS, HG, CD, CR6, PB, CN, VLPH, " + + " OIL, LAS, S2, FCG, CL, SO4, NO3, THRD, COND, " + + " FE, MN, AL, CHLA, CLARITY, TU, CYANO, SFDB, SS, NO2, " + + " RECORD_TIME, IS_DELETED, TM " + + ") VALUES ( " + + " SYS_GUID(), S.STCD, 'MON', S.YEAR, S.MONTH, S.WQGRD, " + + " S.WTMP, S.PH, S.DOX, S.CODMN, S.CODCR, S.BOD5, S.NH3N, S.TP, S.TN, " + + " S.CU, S.ZN, S.F, S.SE, S.ARS, S.HG, S.CD, S.CR6, S.PB, S.CN, S.VLPH, " + + " S.OIL, S.LAS, S.S2, S.FCG, S.CL, S.SO4, S.NO3, S.THRD, S.COND, " + + " S.FE, S.MN, S.AL, S.CHLA, S.CLARITY, S.TU, S.CYANO, S.SFDB, S.SS, S.NO2, " + + " SYSDATE, 0, SYSDATE " + + ")"; + jdbcTemplate.update(mergeSql, stcd, startDate, endDate); + } }