From de480e3e1923fc51f6c64e4cf6b20468e4dd155d Mon Sep 17 00:00:00 2001 From: tangwei Date: Fri, 26 Jun 2026 11:35:07 +0800 Subject: [PATCH] =?UTF-8?q?feat:=20=E4=BF=9D=E5=AD=98=E4=BF=AE=E6=AD=A3?= =?UTF-8?q?=E5=90=8E=E7=9A=84=E6=B2=B3=E9=81=93=E6=B0=B4=E6=B8=A9=E6=97=A5?= =?UTF-8?q?=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 | 9 +++ .../qgc_env/wt/entity/vo/WtrvAmendSaveVo.java | 20 +++++ .../wt/service/SdWtMonitorService.java | 3 + .../service/impl/SdWtMonitorServiceImpl.java | 76 +++++++++++++++++++ 4 files changed, 108 insertions(+) create mode 100644 backend/src/main/java/com/yfd/platform/qgc_env/wt/entity/vo/WtrvAmendSaveVo.java 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 e6c18c3a..6dccdf94 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 @@ -9,6 +9,7 @@ import com.yfd.platform.common.exception.BizException; import com.yfd.platform.config.ResponseResult; import com.yfd.platform.qgc_base.entity.vo.BatchDeleteAo; import com.yfd.platform.qgc_env.wt.entity.vo.WtrvInfo; +import com.yfd.platform.qgc_env.wt.entity.vo.WtrvAmendSaveVo; import com.yfd.platform.qgc_env.wt.service.*; import com.yfd.platform.utils.QgcQueryWrapperUtil; import io.swagger.v3.oas.annotations.Operation; @@ -17,6 +18,7 @@ import jakarta.annotation.Resource; import org.springframework.validation.annotation.Validated; import org.springframework.web.bind.annotation.*; +import java.util.List; import java.util.Map; @RestController @@ -209,6 +211,13 @@ public class SdWTMonitorController { return ResponseResult.successData(sdWtMonitorService.getWtrvAmendDayList(dataSourceRequest)); } + @PostMapping("/wtrvAmend/dayAmend/saveAmendData") + @Operation(summary = "保存修正后的河道水温日数据") + public ResponseResult saveWtrvAmendData(@RequestBody List amendDataList) { + sdWtMonitorService.saveWtrvAmendData(amendDataList); + 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/wt/entity/vo/WtrvAmendSaveVo.java b/backend/src/main/java/com/yfd/platform/qgc_env/wt/entity/vo/WtrvAmendSaveVo.java new file mode 100644 index 00000000..29482d0c --- /dev/null +++ b/backend/src/main/java/com/yfd/platform/qgc_env/wt/entity/vo/WtrvAmendSaveVo.java @@ -0,0 +1,20 @@ +package com.yfd.platform.qgc_env.wt.entity.vo; + +import io.swagger.v3.oas.annotations.media.Schema; +import lombok.Data; + +import java.math.BigDecimal; + +@Data +@Schema(description = "河道水温日修正保存入参") +public class WtrvAmendSaveVo { + + @Schema(description = "站点编码") + private String stcd; + + @Schema(description = "日期,支持 yyyy-MM-dd 或 yyyy-MM-dd HH:mm:ss") + private String dt; + + @Schema(description = "修正后水温") + private BigDecimal wt; +} diff --git a/backend/src/main/java/com/yfd/platform/qgc_env/wt/service/SdWtMonitorService.java b/backend/src/main/java/com/yfd/platform/qgc_env/wt/service/SdWtMonitorService.java index f4639357..c6d44008 100644 --- a/backend/src/main/java/com/yfd/platform/qgc_env/wt/service/SdWtMonitorService.java +++ b/backend/src/main/java/com/yfd/platform/qgc_env/wt/service/SdWtMonitorService.java @@ -10,6 +10,7 @@ import com.yfd.platform.qgc_env.wt.entity.vo.SdYearDetailVO; import com.yfd.platform.qgc_env.wt.entity.vo.SttpInfoVo; import com.yfd.platform.qgc_env.wt.entity.vo.WbsbVo; import com.yfd.platform.qgc_env.wt.entity.vo.WtBaseInfoVo; +import com.yfd.platform.qgc_env.wt.entity.vo.WtrvAmendSaveVo; import com.yfd.platform.qgc_env.wt.entity.vo.WtrvVo; import com.yfd.platform.qgc_env.wt.entity.vo.WtrvAmendResultVo; @@ -27,6 +28,8 @@ public interface SdWtMonitorService { DataSourceResult getWtrvAmendDayList(DataSourceRequest dataSourceRequest); + void saveWtrvAmendData(List amendDataList); + WtBaseInfoVo getStcdInfo(String stcd); DataSourceResult getCxDetailList(DataSourceRequest dataSourceRequest); 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 b34a64a1..fa485604 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 @@ -1,5 +1,6 @@ package com.yfd.platform.qgc_env.wt.service.impl; +import cn.hutool.core.date.DateUtil; import cn.hutool.core.util.StrUtil; import com.baomidou.mybatisplus.extension.plugins.pagination.Page; import com.yfd.platform.common.*; @@ -17,13 +18,16 @@ import com.yfd.platform.qgc_env.wt.entity.vo.WtBaseInfoVo; import com.yfd.platform.qgc_env.wt.entity.vo.WtFishVo; import com.yfd.platform.qgc_env.wt.entity.vo.WtTreeStcdVo; import com.yfd.platform.qgc_env.wt.entity.vo.WtrvAmendResultVo; +import com.yfd.platform.qgc_env.wt.entity.vo.WtrvAmendSaveVo; import com.yfd.platform.qgc_env.wt.entity.vo.WtrvVo; import com.yfd.platform.qgc_env.wt.mapper.SdWtMonitorMapper; import com.yfd.platform.qgc_env.wt.service.SdWtMonitorService; import com.yfd.platform.utils.QgcQueryWrapperUtil; import jakarta.annotation.Resource; import lombok.Data; +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; @@ -47,6 +51,9 @@ public class SdWtMonitorServiceImpl implements SdWtMonitorService { @Resource private MicroservicDynamicSQLMapper microservicDynamicSQLMapper; + @Resource + private JdbcTemplate jdbcTemplate; + @Override public DataSourceResult getEvnmAutoMonitorList(DataSourceRequest dataSourceRequest) { DataSourceLoadOptionsBase loadOptions = dataSourceRequest == null ? null : dataSourceRequest.toDevRequest(); @@ -929,6 +936,19 @@ public class SdWtMonitorServiceImpl implements SdWtMonitorService { return result; } + @Override + @Transactional(rollbackFor = Exception.class) + public void saveWtrvAmendData(List amendDataList) { + if (amendDataList == null || amendDataList.isEmpty()) { + throw new BizException("数据不能为空"); + } + int batchSize = 500; + for (int i = 0; i < amendDataList.size(); i += batchSize) { + List subList = amendDataList.subList(i, Math.min(i + batchSize, amendDataList.size())); + mergeWtrvAmendDataBatch(subList, i); + } + } + @Override public DataSourceResult getCxDetailList(DataSourceRequest dataSourceRequest) { List filters = new ArrayList<>(); @@ -2089,6 +2109,62 @@ public class SdWtMonitorServiceImpl implements SdWtMonitorService { return Collections.singletonList(value); } + private void mergeWtrvAmendDataBatch(List amendDataList, int startIndex) { + StringBuilder sql = new StringBuilder("MERGE INTO SD_WTRVAMEND_S target USING ("); + List params = new ArrayList<>(); + for (int i = 0; i < amendDataList.size(); i++) { + WtrvAmendSaveVo item = amendDataList.get(i); + int rowNo = startIndex + i + 1; + String stcd = item == null ? null : StrUtil.trimToNull(item.getStcd()); + if (StrUtil.isBlank(stcd)) { + throw new BizException("第" + rowNo + "条数据站点编码不能为空"); + } + String dt = normalizeWtrvAmendDate(item.getDt()); + if (StrUtil.isBlank(dt)) { + throw new BizException("第" + rowNo + "条数据日期格式不正确"); + } + if (i > 0) { + sql.append(" UNION ALL "); + } + sql.append("SELECT ? AS STCD, TO_DATE(?, 'YYYY-MM-DD HH24:MI:SS') AS DT, ? AS WT FROM DUAL"); + params.add(stcd); + params.add(dt); + params.add(item.getWt()); + } + sql.append(") source ON (target.STCD = source.STCD AND target.DT = source.DT) ") + .append("WHEN MATCHED THEN UPDATE SET ") + .append("target.WT = source.WT, ") + .append("target.IS_DELETED = 0, ") + .append("target.DELETE_USER = NULL, ") + .append("target.DELETE_TIME = NULL, ") + .append("target.MODIFY_TIME = SYSDATE ") + .append("WHEN NOT MATCHED THEN INSERT (ID, STCD, DT, WT, RECORD_TIME, IS_DELETED) ") + .append("VALUES (SYS_GUID(), source.STCD, source.DT, source.WT, SYSDATE, 0)"); + jdbcTemplate.update(sql.toString(), params.toArray()); + } + + private String normalizeWtrvAmendDate(String value) { + if (StrUtil.isBlank(value)) { + return null; + } + String text = value.trim().replace('T', ' '); + try { + if (text.length() <= 10) { + return DateUtil.formatDateTime(DateUtil.parse(text.substring(0, 10), "yyyy-MM-dd").toJdkDate()); + } + if (text.length() >= 19) { + return DateUtil.formatDateTime(DateUtil.parse(text.substring(0, 19), "yyyy-MM-dd HH:mm:ss").toJdkDate()); + } + return DateUtil.formatDateTime(DateUtil.parse(text, "yyyy-MM-dd HH:mm").toJdkDate()); + } catch (Exception ex) { + try { + return DateUtil.formatDateTime(DateUtil.parse(value.trim()).toJdkDate()); + } catch (Exception ignore) { + return null; + } + } + } + private String buildSttpInfoFilterCondition(DataSourceRequest.FilterDescriptor filter, Map paramMap, int[] indexHolder) {