From 337da0c4455dfe308de103bb02b75d84afdf8b82 Mon Sep 17 00:00:00 2001 From: tangwei Date: Wed, 15 Apr 2026 11:26:15 +0800 Subject: [PATCH 1/2] =?UTF-8?q?feat:=20=E6=96=B0=E5=A2=9E=E6=B0=B4?= =?UTF-8?q?=E6=B8=A9=E6=8E=A5=E5=8F=A3?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../yfd/platform/common/CommonConstant.java | 59 +++++++ .../yfd/platform/common/CommonConstants.java | 110 +++++++++++++ .../baseInterface/ILogicalDeleteEntity.java | 19 +++ .../entity/baseInterface/IModifyEntity.java | 13 ++ .../entity/baseInterface/IRecordEntity.java | 13 ++ .../platform/common/enums/ResultCodeEnum.java | 73 +++++++++ .../common/exception/BizException.java | 55 +++++++ .../common/exception/DecException.java | 109 +++++++++++++ .../common/exception/IResultCode.java | 16 ++ .../yfd/platform/config/SecurityConfig.java | 2 + .../env/controller/SdAlongListController.java | 51 ++++++ .../yfd/platform/env/entity/vo/SdAlongVO.java | 54 +++++++ .../platform/env/mapper/AlongListMapper.java | 105 +++++++++++++ .../env/service/AlongListService.java | 21 +++ .../service/impl/AlongListServiceImpl.java | 147 ++++++++++++++++++ .../java/com/yfd/platform/utils/SqlUtil.java | 127 +++++++++++++++ 16 files changed, 974 insertions(+) create mode 100644 backend/src/main/java/com/yfd/platform/common/CommonConstant.java create mode 100644 backend/src/main/java/com/yfd/platform/common/CommonConstants.java create mode 100644 backend/src/main/java/com/yfd/platform/common/entity/baseInterface/ILogicalDeleteEntity.java create mode 100644 backend/src/main/java/com/yfd/platform/common/entity/baseInterface/IModifyEntity.java create mode 100644 backend/src/main/java/com/yfd/platform/common/entity/baseInterface/IRecordEntity.java create mode 100644 backend/src/main/java/com/yfd/platform/common/enums/ResultCodeEnum.java create mode 100644 backend/src/main/java/com/yfd/platform/common/exception/BizException.java create mode 100644 backend/src/main/java/com/yfd/platform/common/exception/DecException.java create mode 100644 backend/src/main/java/com/yfd/platform/common/exception/IResultCode.java create mode 100644 backend/src/main/java/com/yfd/platform/env/controller/SdAlongListController.java create mode 100644 backend/src/main/java/com/yfd/platform/env/entity/vo/SdAlongVO.java create mode 100644 backend/src/main/java/com/yfd/platform/env/mapper/AlongListMapper.java create mode 100644 backend/src/main/java/com/yfd/platform/env/service/AlongListService.java create mode 100644 backend/src/main/java/com/yfd/platform/env/service/impl/AlongListServiceImpl.java create mode 100644 backend/src/main/java/com/yfd/platform/utils/SqlUtil.java diff --git a/backend/src/main/java/com/yfd/platform/common/CommonConstant.java b/backend/src/main/java/com/yfd/platform/common/CommonConstant.java new file mode 100644 index 0000000..47e3859 --- /dev/null +++ b/backend/src/main/java/com/yfd/platform/common/CommonConstant.java @@ -0,0 +1,59 @@ +package com.yfd.platform.common; + +/** + * 通用常量 + * + * @author zwl + * @date 2023/07/13 + */ +public interface CommonConstant { + + /** + * kendo 默认分组 + */ + String DEFAULT = "default"; + + + /** + * 计算标识 + */ + String CALCULATE_FLAG = "calculateFlag"; + + /** + * 计算成功 + */ + String CALCULATE_SUCCESS = "1"; + + + /** + * 时 + */ + String HOUR = "HOUR"; + + + /** + * 天 + */ + String DAY = "DAY"; + + /** + * 旬 + */ + String TEN = "TEN"; + + /** + * 月 + */ + String MON = "MON"; + + /** + * 季 + */ + String QUA = "QUA"; + + /** + * 年 + */ + String YEAR = "YEAR"; + +} diff --git a/backend/src/main/java/com/yfd/platform/common/CommonConstants.java b/backend/src/main/java/com/yfd/platform/common/CommonConstants.java new file mode 100644 index 0000000..e8db091 --- /dev/null +++ b/backend/src/main/java/com/yfd/platform/common/CommonConstants.java @@ -0,0 +1,110 @@ +// +// Source code recreated from a .class file by IntelliJ IDEA +// (powered by FernFlower decompiler) +// + +package com.yfd.platform.common; + +public interface CommonConstants { + String UTF_8 = "UTF-8"; + String CONTENT_TYPE_NAME = "Content-type"; + String CONTENT_TYPE = "application/json;charset=utf-8"; + String TENANT_ID = "_TenantId"; + String SYSTEM_ID = "_SysId"; + String PROJECT_GROUP_ID = "_PgId"; + String BELOND_PROJECT_ID = "_ProjectId"; + String OLD_BELOND_PROJECT_ID = "_LoginProjectId"; + String APPLICATION_ID = "_AppId"; + String PLATFORM_ID = "_PlatformId"; + String ISOLATE_LEVEL_CODE = "_IsolateLevelCode"; + String ISOLATE_ID = "_IsolateId"; + String TEMPLATE_ID = "_TemplateId"; + String VERSION = "VERSION"; + String DEFAULT_TENANT_ID = "00000000-0000-0000-0000-000000000000"; + String DEFAULT_BELONG_PROJECT_ID = "00000000-0000-0000-0000-000000000000"; + String DEFAULT_GUID = "00000000-0000-0000-0000-000000000000"; + String STATUS_DEL = "1"; + String STATUS_NORMAL = "0"; + String DB_NOT_DELETED = "0"; + String DB_IS_DELETED = "1"; + String LOG_NORMAL_TYPE = "1"; + String STATUS_LOCK = "9"; + String MENU = "0"; + Integer MENU_TREE_ROOT_ID = -1; + String UTF8 = "UTF-8"; + String FRONT_END_PROJECT = "dec-ui"; + String BACK_END_PROJECT = "dec"; + String DEC_PUBLIC_PARAM_KEY = "DEC_PUBLIC_PARAM_KEY"; + Integer SUCCESS = 0; + Integer FAIL = 1; + Integer YES = 1; + Integer NO = 0; + String BUCKET_NAME = "dec"; + String DEFAULT_CROWN_CODE = "+86"; + String DEFAULT_TIME_ZONE = "GMT+8"; + + public interface Symbol { + String SIGH = "!"; + String AT = "@"; + String WELL = "#"; + String DOLLAR = "$"; + String RMB = "¥"; + String SPACE = " "; + String LB = System.getProperty("line.separator"); + String PERCENTAGE = "%"; + String AND = "&"; + String STAR = "*"; + String MIDDLE_LINE = "-"; + String LOWER_LINE = "_"; + String EQUAL = "="; + String PLUS = "+"; + String COLON = ":"; + String SEMICOLON = ";"; + String COMMA = ","; + String POINT = "."; + String SLASH = "/"; + String VERTICAL_BAR = "|"; + String DOUBLE_SLASH = "//"; + String BACKSLASH = "\\"; + String QUESTION = "?"; + String LEFT_BIG_BRACE = "{"; + String RIGHT_BIG_BRACE = "}"; + String LEFT_MIDDLE_BRACE = "["; + String RIGHT_MIDDLE_BRACE = "]"; + String BACKQUOTE = "`"; + } + + public interface Digital { + int NEGATIVE_ONE = -1; + int ZERO = 0; + int ONE = 1; + int TWO = 2; + int FOUR = 4; + int EIGHT = 8; + int SIXTEEN = 16; + } + + public interface Pattern { + String DATE = "yyyy-MM-dd"; + String DATETIME = "yyyy-MM-dd HH:mm:ss"; + String DATETIME_MM = "yyyy-MM-dd HH:mm"; + String DATETIME_SSS = "yyyy-MM-dd HH:mm:ss.SSS"; + String TIME = "HH:mm"; + String TIME_SS = "HH:mm:ss"; + String SYS_DATE = "yyyy/MM/dd"; + String SYS_DATETIME = "yyyy/MM/dd HH:mm:ss"; + String SYS_DATETIME_MM = "yyyy/MM/dd HH:mm"; + String SYS_DATETIME_SSS = "yyyy/MM/dd HH:mm:ss.SSS"; + String NONE_DATE = "yyyyMMdd"; + String NONE_DATETIME = "yyyyMMddHHmmss"; + String NONE_DATETIME_MM = "yyyyMMddHHmm"; + String NONE_DATETIME_SSS = "yyyyMMddHHmmssSSS"; + String CST_DATETIME = "EEE MMM dd HH:mm:ss 'CST' yyyy"; + String NONE_DECIMAL = "0"; + String ONE_DECIMAL = "0.0"; + String TWO_DECIMAL = "0.00"; + String TB_NONE_DECIMAL = "#,##0"; + String TB_ONE_DECIMAL = "#,##0.0"; + String TB_TWO_DECIMAL = "#,##0.00"; + } +} diff --git a/backend/src/main/java/com/yfd/platform/common/entity/baseInterface/ILogicalDeleteEntity.java b/backend/src/main/java/com/yfd/platform/common/entity/baseInterface/ILogicalDeleteEntity.java new file mode 100644 index 0000000..e75b361 --- /dev/null +++ b/backend/src/main/java/com/yfd/platform/common/entity/baseInterface/ILogicalDeleteEntity.java @@ -0,0 +1,19 @@ +package com.yfd.platform.common.entity.baseInterface; + +import java.util.Date; + +public interface ILogicalDeleteEntity { + Boolean isDeleted(); + + Integer getIsDeleted(); + + void setIsDeleted(Integer isDeleted); + + TKey getDeleteUser(); + + void setDeleteUser(TKey deleteUser); + + Date getDeleteTime(); + + void setDeleteTime(Date deleteTime); +} diff --git a/backend/src/main/java/com/yfd/platform/common/entity/baseInterface/IModifyEntity.java b/backend/src/main/java/com/yfd/platform/common/entity/baseInterface/IModifyEntity.java new file mode 100644 index 0000000..217604e --- /dev/null +++ b/backend/src/main/java/com/yfd/platform/common/entity/baseInterface/IModifyEntity.java @@ -0,0 +1,13 @@ +package com.yfd.platform.common.entity.baseInterface; + +import java.util.Date; + +public interface IModifyEntity { + TKey getModifyUser(); + + void setModifyUser(TKey modifyUser); + + Date getModifyTime(); + + void setModifyTime(Date modifyTime); +} diff --git a/backend/src/main/java/com/yfd/platform/common/entity/baseInterface/IRecordEntity.java b/backend/src/main/java/com/yfd/platform/common/entity/baseInterface/IRecordEntity.java new file mode 100644 index 0000000..05fc09a --- /dev/null +++ b/backend/src/main/java/com/yfd/platform/common/entity/baseInterface/IRecordEntity.java @@ -0,0 +1,13 @@ +package com.yfd.platform.common.entity.baseInterface; + +import java.util.Date; + +public interface IRecordEntity { + TKey getRecordUser(); + + void setRecordUser(TKey recordUser); + + Date getRecordTime(); + + void setRecordTime(Date recordTime); +} diff --git a/backend/src/main/java/com/yfd/platform/common/enums/ResultCodeEnum.java b/backend/src/main/java/com/yfd/platform/common/enums/ResultCodeEnum.java new file mode 100644 index 0000000..24fe1dc --- /dev/null +++ b/backend/src/main/java/com/yfd/platform/common/enums/ResultCodeEnum.java @@ -0,0 +1,73 @@ +package com.yfd.platform.common.enums; + +import com.yfd.platform.common.exception.IResultCode; +import lombok.AllArgsConstructor; +import lombok.Getter; + +/** + * 通用结果码枚举 + */ +@Getter +@AllArgsConstructor +public enum ResultCodeEnum implements IResultCode { + + /** + * 成功 + */ + SUCCESS(200, "success", "操作成功"), + + /** + * 失败 + */ + FAILED(500, "failed", "操作失败"), + + /** + * 参数错误 + */ + PARAM_ERROR(400, "param_error", "参数错误"), + + /** + * 未授权 + */ + UNAUTHORIZED(401, "unauthorized", "未授权"), + + /** + * 禁止访问 + */ + FORBIDDEN(403, "forbidden", "禁止访问"), + + /** + * 资源不存在 + */ + NOT_FOUND(404, "not_found", "资源不存在"), + + /** + * 业务异常 + */ + BIZ_ERROR(500, "biz_error", "业务异常"), + + /** + * 系统异常 + */ + SYSTEM_ERROR(500, "system_error", "系统异常"), + + /** + * 服务不可用 + */ + SERVICE_UNAVAILABLE(503, "service_unavailable", "服务不可用"); + + /** + * 错误码 + */ + private final int code; + + /** + * 错误key + */ + private final String errorKey; + + /** + * 错误消息 + */ + private final String message; +} diff --git a/backend/src/main/java/com/yfd/platform/common/exception/BizException.java b/backend/src/main/java/com/yfd/platform/common/exception/BizException.java new file mode 100644 index 0000000..c83a5d7 --- /dev/null +++ b/backend/src/main/java/com/yfd/platform/common/exception/BizException.java @@ -0,0 +1,55 @@ +package com.yfd.platform.common.exception; + +/** + * 业务异常类 + */ +public class BizException extends DecException { + + private static final long serialVersionUID = 1L; + + private static final String DEFAULT_ERR_CODE = "biz_error"; + + public BizException(String message) { + super(DEFAULT_ERR_CODE, message); + } + + public BizException(String message, Object... parameters) { + super(DEFAULT_ERR_CODE, message, parameters); + } + + public BizException(int errorCode, Object... parameters) { + super(errorCode, DEFAULT_ERR_CODE, parameters); + } + + public BizException(int errorCode, String message) { + super(errorCode, DEFAULT_ERR_CODE, message); + } + + public BizException(String errorKey, String message) { + super(errorKey, message); + } + + public BizException(IResultCode resultCode) { + super(resultCode); + } + + public BizException(IResultCode resultCode, Throwable cause) { + super(resultCode, cause); + } + + public BizException(Throwable cause) { + super(cause); + } + + public BizException(String message, Throwable cause) { + super(DEFAULT_ERR_CODE, message, cause); + } + + public BizException(String errorKey, String message, Throwable cause) { + super(errorKey, message, cause); + } + + public BizException(String message, Throwable cause, boolean enableSuppression, boolean writableStackTrace) { + super(message, cause, enableSuppression, writableStackTrace); + } +} diff --git a/backend/src/main/java/com/yfd/platform/common/exception/DecException.java b/backend/src/main/java/com/yfd/platform/common/exception/DecException.java new file mode 100644 index 0000000..4e960f1 --- /dev/null +++ b/backend/src/main/java/com/yfd/platform/common/exception/DecException.java @@ -0,0 +1,109 @@ +package com.yfd.platform.common.exception; + +import com.yfd.platform.common.CommonConstants; +import lombok.Getter; + +/** + * 基础异常类 + */ +@Getter +public class DecException extends RuntimeException { + + private static final long serialVersionUID = 1L; + + /** + * 错误码 + */ + private int errorCode; + + /** + * 错误key + */ + private String errorKey; + + /** + * 错误消息 + */ + private String message; + + public DecException(String errorKey, String message) { + super(message); + this.errorKey = errorKey; + this.message = message; + this.errorCode = CommonConstants.FAIL; + } + + public DecException(String errorKey, String message, Object... parameters) { + super(formatMessage(message, parameters)); + this.errorKey = errorKey; + this.message = formatMessage(message, parameters); + this.errorCode = CommonConstants.FAIL; + } + + public DecException(int errorCode, String errorKey, Object... parameters) { + super(errorKey); + this.errorCode = errorCode; + this.errorKey = errorKey; + this.message = formatMessage(errorKey, parameters); + } + + public DecException(int errorCode, String errorKey, String message) { + super(message); + this.errorCode = errorCode; + this.errorKey = errorKey; + this.message = message; + } + + public DecException(IResultCode resultCode) { + super(resultCode.getMessage()); + this.errorCode = resultCode.getCode(); + this.errorKey = resultCode.getErrorKey(); + this.message = resultCode.getMessage(); + } + + public DecException(IResultCode resultCode, Throwable cause) { + super(resultCode.getMessage(), cause); + this.errorCode = resultCode.getCode(); + this.errorKey = resultCode.getErrorKey(); + this.message = resultCode.getMessage(); + } + + public DecException(Throwable cause) { + super(cause); + this.errorCode = 500; + this.errorKey = "system_error"; + this.message = cause.getMessage(); + } + + public DecException(String errorKey, String message, Throwable cause) { + super(message, cause); + this.errorKey = errorKey; + this.message = message; + this.errorCode = 500; + } + + public DecException(String message, Throwable cause, boolean enableSuppression, boolean writableStackTrace) { + super(message, cause, enableSuppression, writableStackTrace); + this.errorKey = "system_error"; + this.message = message; + this.errorCode = 500; + } + + /** + * 格式化消息 + * @param message 消息模板 + * @param parameters 参数 + * @return 格式化后的消息 + */ + private static String formatMessage(String message, Object... parameters) { + if (parameters == null || parameters.length == 0) { + return message; + } + + String result = message; + for (Object param : parameters) { + result = result.replaceFirst("\\{\\}", String.valueOf(param != null ? param : "null")); + } + return result; + } +} diff --git a/backend/src/main/java/com/yfd/platform/common/exception/IResultCode.java b/backend/src/main/java/com/yfd/platform/common/exception/IResultCode.java new file mode 100644 index 0000000..673d3e8 --- /dev/null +++ b/backend/src/main/java/com/yfd/platform/common/exception/IResultCode.java @@ -0,0 +1,16 @@ +// +// Source code recreated from a .class file by IntelliJ IDEA +// (powered by FernFlower decompiler) +// + +package com.yfd.platform.common.exception; + +import java.io.Serializable; + +public interface IResultCode extends Serializable { + String getMessage(); + + int getCode(); + + String getErrorKey(); +} diff --git a/backend/src/main/java/com/yfd/platform/config/SecurityConfig.java b/backend/src/main/java/com/yfd/platform/config/SecurityConfig.java index 7efd8be..3ff643e 100644 --- a/backend/src/main/java/com/yfd/platform/config/SecurityConfig.java +++ b/backend/src/main/java/com/yfd/platform/config/SecurityConfig.java @@ -54,6 +54,8 @@ public class SecurityConfig { .requestMatchers("/user/login").anonymous() .requestMatchers("/user/code").permitAll() .requestMatchers("/eng/**").permitAll() + .requestMatchers("/env/**").permitAll() + .requestMatchers("/sw/**").permitAll() .requestMatchers(HttpMethod.GET, "/").permitAll() .requestMatchers(HttpMethod.GET, "/*.html", diff --git a/backend/src/main/java/com/yfd/platform/env/controller/SdAlongListController.java b/backend/src/main/java/com/yfd/platform/env/controller/SdAlongListController.java new file mode 100644 index 0000000..a169ad3 --- /dev/null +++ b/backend/src/main/java/com/yfd/platform/env/controller/SdAlongListController.java @@ -0,0 +1,51 @@ +package com.yfd.platform.env.controller; + +import com.yfd.platform.common.DataSourceRequest; +import com.yfd.platform.common.DataSourceResult; +import com.yfd.platform.config.ResponseResult; +import com.yfd.platform.env.service.AlongListService; +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; + +/** + * 沿程水温变化一级折线图 + * + * @author lyl + * @date 2023/04/18 19:22 + */ +@RestController +@RequestMapping("/sw/alongList") +@Tag(name = "沿程水温变化一级折线图") +@Validated +public class SdAlongListController{ + + @Resource + private AlongListService alongListService; + + + @PostMapping({"/limit"}) + @Operation(summary = "获取流域沿程水温限值") + public ResponseResult getWtLimit(@RequestBody DataSourceRequest dataSourceRequest) { + return ResponseResult.successData(alongListService.getWtLimit(dataSourceRequest)); + } + + @PostMapping({"/default/rvcd"}) + @Operation(summary = "获取沿程水温变化默认有数据的河流") + public ResponseResult getDefaultStcd(@RequestBody DataSourceRequest dataSourceRequest) { + + return ResponseResult.successData(alongListService.getDefaultRvcd(dataSourceRequest)); + } + + @PostMapping({"/qgc/GetKendoListCust"}) + @Operation(summary = "按时间范围查询沿程水温站最新数据时间的数据") + public ResponseResult getALongKendoListCust(@RequestBody DataSourceRequest dataSourceRequest) { + return ResponseResult.successData(this.alongListService.getALongKendoListCust(dataSourceRequest)); + } + +} \ No newline at end of file diff --git a/backend/src/main/java/com/yfd/platform/env/entity/vo/SdAlongVO.java b/backend/src/main/java/com/yfd/platform/env/entity/vo/SdAlongVO.java new file mode 100644 index 0000000..853478a --- /dev/null +++ b/backend/src/main/java/com/yfd/platform/env/entity/vo/SdAlongVO.java @@ -0,0 +1,54 @@ +package com.yfd.platform.env.entity.vo; + +import io.swagger.v3.oas.annotations.media.Schema; +import lombok.Getter; +import lombok.Setter; +import lombok.experimental.FieldNameConstants; + +import java.math.BigDecimal; + +@Getter +@Setter +@FieldNameConstants +@Schema(description = "沿程水温变化一级折线图VO") +public class SdAlongVO { + + @Schema(description = "站码") + private String stcd; + + @Schema(description = "站名") + private String stnm; + + @Schema(description = "电站编码") + private String rstcd; + + @Schema(description = "水温") + private BigDecimal temperature; + + @Schema(description = "类型:1:电站 2:测站") + private String sttp; + + @Schema(description = "时间") + private String tm; + + @Schema(description = "最小时间") + private String minTm; + + @Schema(description = "实测值水温") + private BigDecimal actualTemp; + + @Schema(description = "去年同期水温") + private BigDecimal lastTemp; + + @Schema(description = "天然水温") + private BigDecimal naturalTemp; + + @Schema(description = "电站水温出库站") + private String engDwtCode; + + @Schema(hidden = true) + public static final String TYPE_ENG = "1"; + + @Schema(hidden = true) + public static final String TYPE_ENV = "2"; +} diff --git a/backend/src/main/java/com/yfd/platform/env/mapper/AlongListMapper.java b/backend/src/main/java/com/yfd/platform/env/mapper/AlongListMapper.java new file mode 100644 index 0000000..c16dcf3 --- /dev/null +++ b/backend/src/main/java/com/yfd/platform/env/mapper/AlongListMapper.java @@ -0,0 +1,105 @@ +package com.yfd.platform.env.mapper; + + + +import com.baomidou.mybatisplus.core.mapper.BaseMapper; +import com.yfd.platform.env.entity.vo.SdAlongVO; +import org.apache.ibatis.annotations.Mapper; +import org.apache.ibatis.annotations.Param; +import org.apache.ibatis.annotations.Select; + +import java.util.Date; +import java.util.List; + +/** + * 沿程水温变化一级数据接口 + * + * @author + * @since 2023-04-23 09:32:10 + */ +@Mapper +public interface AlongListMapper extends BaseMapper { + + @Select("") + String getAlongLatestTm(@Param("rvcd") String rvcd); + + @Select("") + List getAlongListData(@Param("rvcd") String rvcd,@Param("baseId") String baseId,@Param("maxTime") Date maxTime); + + @Select("") + Date getMaxTime(@Param("rvcd") String rvcd,@Param("baseId") String baseId,@Param("startTime") Date startTime,@Param("endTime") Date endTime); + +// List getAvgAlongListData(@Param("rvcd") String rvcd,@Param("baseId") String baseId,@Param("startTime") Date startTime,@Param("endTime") Date endTime); +} diff --git a/backend/src/main/java/com/yfd/platform/env/service/AlongListService.java b/backend/src/main/java/com/yfd/platform/env/service/AlongListService.java new file mode 100644 index 0000000..8cb241d --- /dev/null +++ b/backend/src/main/java/com/yfd/platform/env/service/AlongListService.java @@ -0,0 +1,21 @@ +package com.yfd.platform.env.service; + + +import com.yfd.platform.common.DataSourceRequest; +import com.yfd.platform.common.DataSourceResult; +import org.springframework.web.bind.annotation.RequestBody; + +import java.util.Map; + +/** + * 沿程水温变化一级折线图服务 + * + * @author + * @since 2023-04-23 09:32:10 + */ +public interface AlongListService { + + Map getWtLimit(DataSourceRequest dataSourceRequest); + DataSourceResult getDefaultRvcd(@RequestBody DataSourceRequest dataSourceRequest); + DataSourceResult getALongKendoListCust(DataSourceRequest dataSourceRequest); +} \ No newline at end of file diff --git a/backend/src/main/java/com/yfd/platform/env/service/impl/AlongListServiceImpl.java b/backend/src/main/java/com/yfd/platform/env/service/impl/AlongListServiceImpl.java new file mode 100644 index 0000000..367c52e --- /dev/null +++ b/backend/src/main/java/com/yfd/platform/env/service/impl/AlongListServiceImpl.java @@ -0,0 +1,147 @@ +package com.yfd.platform.env.service.impl; + +import cn.hutool.core.util.StrUtil; +import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; +import com.yfd.platform.common.DataSourceLoadOptionsBase; +import com.yfd.platform.common.DataSourceRequest; +import com.yfd.platform.common.DataSourceResult; +import com.yfd.platform.common.DynamicSQLMapper; +import com.yfd.platform.common.exception.BizException; +import com.yfd.platform.env.entity.vo.SdAlongVO; +import com.yfd.platform.env.mapper.AlongListMapper; +import com.yfd.platform.env.service.AlongListService; +import com.yfd.platform.utils.QgcQueryWrapperUtil; +import com.yfd.platform.utils.QueryWrapperUtil; +import com.yfd.platform.utils.SqlUtil; +import jakarta.annotation.Resource; +import org.apache.commons.lang3.StringUtils; +import org.springframework.stereotype.Service; +import org.springframework.util.CollectionUtils; + +import java.text.SimpleDateFormat; +import java.util.*; +import java.util.stream.Collectors; + +/** + * 沿程水温一级数据接口服务 + * + * @author + * @since 2023-04-23 09:32:10 + */ +@Service +public class AlongListServiceImpl extends ServiceImpl implements AlongListService { + @Resource + private DynamicSQLMapper dynamicSQLMapper; + @Resource + private AlongListMapper alongListMapper; + + + + @Override + public Map getWtLimit(DataSourceRequest dataSourceRequest) { + String sql = "SELECT\n" + + "\tt2.MIN_VAL AS min,\n" + + "\tt2.MAX_VAL AS max\n" + + "FROM\n" + + "\tMS_WARN_RULE_B t1\n" + + "INNER JOIN MS_WARN_RULE_DETAIL_B t2 ON\n" + + "\tt1.ID = t2.RULE_ID\n" + + "WHERE\n" + + "\tt1.RULE_TYPE = 'WTMN'"; + List> resultList = dynamicSQLMapper.getAllList(sql, null); + if(!CollectionUtils.isEmpty(resultList)){ + return resultList.get(0); + } + return null; + } + + @Override + public DataSourceResult getDefaultRvcd(DataSourceRequest dataSourceRequest) { + DataSourceResult> dataSourceResult = new DataSourceResult<>(); + String sqlTemplate ="\tSELECT RVCD FROM " + + "\t( SELECT RVCD,SORT FROM " + + "\t(select MAB.RVCD,SAB.STCD,CASE WHEN MAB.RVCD #{rvcd} THEN 0 ELSE 1 END AS SORT from MS_ALONG_B MAB inner join MS_ALONGDET_B SAB on SAB.ALONG_ID = MAB.ID WHERE SAB.IS_DELETED =0 AND MAB.IS_DELETED =0 AND SAB.STTP IN ('WTRV', 'ENG') and MAB.CODE='common') t1 " + + "\tINNER JOIN " + + "\t(SELECT WBS_CODE FROM SD_WBS_B WHERE wbs_type = 'PSB_RVCD' #{full_path} AND WBS_NAME IS NOT NULL) t2 " + + "\tON t1.RVCD = t2.WBS_CODE " + + "\tINNER JOIN " + + "\t(SELECT STCD FROM SD_WTRV_R WHERE TM >= #{tm} AND TM <= #{tm_1} AND WT IS NOT NULL ) t3 " + + "\tON t1.STCD = t3.STCD ORDER BY SORT ASC " + + "\t) WHERE ROWNUM = 1 "; + Map sqlWhereMap = new HashMap<>(); + SqlUtil.getWhereCondition(dataSourceRequest,sqlWhereMap); + Object full_path = sqlWhereMap.get("full_path"); + if(full_path !=null){ + String fullPathStr = full_path.toString(); + if(fullPathStr.startsWith("'") && fullPathStr.endsWith("'")){ + fullPathStr = fullPathStr.substring(1,fullPathStr.length()-1); + } + sqlWhereMap.put("full_path","AND OBJ_ID = '"+fullPathStr+"'"); + }else{ + sqlWhereMap.put("full_path"," "); + } + Object rvcd = sqlWhereMap.get("rvcd"); + if(rvcd == null || StringUtils.isBlank(rvcd.toString())){ + sqlWhereMap.put("rvcd"," IS NOT NULL "); + }else{ + sqlWhereMap.put("rvcd"," = "+rvcd); + } + String sql = SqlUtil.getSqlByTemplate(sqlTemplate, sqlWhereMap); + List> list = dynamicSQLMapper.pageAllList(null, sql, null); + dataSourceResult.setData(list); + dataSourceResult.setTotal(list.size()); + return dataSourceResult; + } + + @Override + public DataSourceResult getALongKendoListCust(DataSourceRequest dataSourceRequest) { + DataSourceResult dataSourceResult = new DataSourceResult<>(); + DataSourceLoadOptionsBase loadOptionsBase = dataSourceRequest.toDevRequest(); + String rvcd = QgcQueryWrapperUtil.getFilterFieldValue(loadOptionsBase, "rvcd"); + String baseId = QgcQueryWrapperUtil.getFilterFieldValue(loadOptionsBase,"baseId"); + String tm = QgcQueryWrapperUtil.getFilterFieldValue(loadOptionsBase,"tm"); + if(StrUtil.isBlank(tm)){ + throw new BizException("时间(tm)不能为空."); + } + SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss"); + Date startTime = null; + Date endTime = null; + if(StrUtil.isNotBlank(tm)){ + String[] ll=tm.split(","); + if(ll.length==2){ + try{ + Date st = sdf.parse(ll[0]); + Date et = sdf.parse(ll[1]); + if(st.after(et)){ + startTime= et; + endTime=st; + }else { + startTime =st;endTime=et; + } + }catch (Exception ex){ + log.error("日期格式错误! {}",ex); + } + } + } + + Date maxTm = this.alongListMapper.getMaxTime(rvcd,baseId,startTime,endTime); + String maxTmStr; + if(maxTm!=null){ + maxTmStr = sdf.format(maxTm); + } else { + maxTmStr = null; + } + List alongVOList = this.alongListMapper.getAlongListData(rvcd,baseId,maxTm); + //过滤掉无水温测站关联的电站 + Set rstcdSet = alongVOList.stream().filter(sdAlongVO -> SdAlongVO.TYPE_ENV.equals(sdAlongVO.getSttp())).map(SdAlongVO::getRstcd).collect(Collectors.toSet()); + alongVOList =alongVOList.stream().filter(sdAlongVO -> SdAlongVO.TYPE_ENV.equals(sdAlongVO.getSttp()) || rstcdSet.contains(sdAlongVO.getStcd())).collect(Collectors.toList()); + alongVOList.forEach(it->{ + it.setMinTm(maxTmStr); + it.setTm(maxTmStr); + }); + dataSourceResult.setTotal(alongVOList.size()); + dataSourceResult.setData(alongVOList); + return dataSourceResult; + } + +} \ No newline at end of file diff --git a/backend/src/main/java/com/yfd/platform/utils/SqlUtil.java b/backend/src/main/java/com/yfd/platform/utils/SqlUtil.java new file mode 100644 index 0000000..219ef3f --- /dev/null +++ b/backend/src/main/java/com/yfd/platform/utils/SqlUtil.java @@ -0,0 +1,127 @@ +package com.yfd.platform.utils; + +import cn.hutool.core.map.MapUtil; +import cn.hutool.core.util.StrUtil; +import com.yfd.platform.common.DataSourceRequest; +import org.apache.commons.lang3.StringUtils; + +import java.util.Arrays; +import java.util.List; +import java.util.Map; + +public class SqlUtil { + + + public static StringBuilder getWhereCondition(DataSourceRequest dataSourceRequest, Map sqlWhereMap) { + + StringBuilder sb = new StringBuilder(); + DataSourceRequest.FilterDescriptor filterDescriptor = dataSourceRequest.getFilter(); + String logic = filterDescriptor.getLogic(); + for (DataSourceRequest.FilterDescriptor filter : filterDescriptor.getFilters()) { + StringBuilder keyStr = new StringBuilder(); + String field = filter.getField(); + field = StrUtil.toUnderlineCase(field); + Object value = filter.getValue(); + String operator = filter.getOperator(); + String dataType = filter.getDataType(); + if (StringUtils.isBlank(dataType)) { + dataType = "string"; + } + //value值不为空并且operator不是isnull和isnotnull,则忽略。 + if ((value == null || StringUtils.isBlank(value.toString())) && !("isnull").equals(operator) && !("isnotnull").equals(operator)) { + continue; + } + keyStr.append(String.format(" %s %s", logic, field)); + if ("date".equals(dataType)) { + if (String.valueOf(value).length() == 10) { + value = value + " 00:00:00"; + } + value = "TO_DATE('" + value + "'," + "'YYYY-MM-DD HH24:MI:SS'" + ")"; + } + if ("string".equals(dataType)) { + value = "'" + value + "'"; + } + switch (filter.getOperator()) { + case "eq": + operator = "="; + break; + case "ne": + operator = "!="; + break; + case "isnull": + operator = "is null"; + break; + case "isnotnull": + operator = "is not null"; + break; + case "lt": + operator = "<"; + break; + case "lte": + operator = "<="; + break; + case "ge": + operator = ">"; + break; + case "gte": + operator = ">="; + break; + case "contains": + operator = "like"; + value = "'%" + filter.getValue() + "%'"; + break; + case "in": + operator = "in"; + value = "(" + getInCondition(filter.getValue().toString()) + ")"; + default: + } + keyStr.append(String.format(" %s ", operator)); + StringBuffer sqlBuffer = new StringBuffer(); + sqlBuffer.append(keyStr).append(value); + if ("or".equalsIgnoreCase(filterDescriptor.getLogic())) { + sb.append(String.format("%s%s%s", " or (", sqlBuffer, ")")); + } else { + sb.append(sqlBuffer); + if (sqlWhereMap != null) { + if (sqlWhereMap.containsKey(field)) { + field = field + "_1"; + } + sqlWhereMap.put(field, value); + } + } + } + return sb; + } + + private static String getInCondition(String value) { + if (value.startsWith("[") && value.endsWith("]")) { + value = value.substring(1, value.length() - 1); + } + List valueList = Arrays.asList(value.split(",")); + StringBuilder sb = new StringBuilder(); + for (int i = 0; i < valueList.size(); i++) { + sb.append("'").append(valueList.get(i).trim()).append("'"); + if (i != valueList.size() - 1) { + sb.append(","); + } + } + return sb.toString(); + } + + public static String getSqlByTemplate(String sqlTemplate, Map paramMap) { + if (StringUtils.isBlank(sqlTemplate) || MapUtil.isEmpty(paramMap)) { + return sqlTemplate; + } + for(String key : paramMap.keySet()){ + String value = paramMap.get(key).toString(); + String replcaeKey = "#{"+key+"}"; + sqlTemplate = sqlTemplate.replace(replcaeKey,value); + + } + return sqlTemplate; + } + + public static String getDateFormat(String date){ + return " TO_DATE('"+date+"','YYYY-MM-DD HH24:MI:SS') "; + } +} \ No newline at end of file From 410c5268c12598a7fbf0b486edaf606cc3ad9924 Mon Sep 17 00:00:00 2001 From: tangwei Date: Mon, 20 Apr 2026 11:40:28 +0800 Subject: [PATCH 2/2] =?UTF-8?q?feat:=20=E6=96=B0=E5=A2=9E=E6=8E=A5?= =?UTF-8?q?=E5=8F=A3?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../controller/SdAlongDetailController.java | 83 +++ .../platform/env/entity/vo/BatchDeleteAo.java | 20 + .../yfd/platform/env/entity/vo/DataParam.java | 20 + .../env/entity/vo/SdAlongDetailVO.java | 39 ++ .../platform/env/entity/vo/WtrvDataVo.java | 25 + .../yfd/platform/env/entity/vo/WtrvInfo.java | 66 ++ .../env/mapper/AlongDetailMapper.java | 143 +++++ .../env/mapper/SdWtrvdrtpSMapper.java | 36 ++ .../env/service/AlongDetailService.java | 48 ++ .../service/impl/AlongDetailServiceImpl.java | 597 ++++++++++++++++++ .../platform/utils/CollectionExtUtils.java | 257 ++++++++ .../src/main/resources/application-devtw.yml | 8 +- 12 files changed, 1338 insertions(+), 4 deletions(-) create mode 100644 backend/src/main/java/com/yfd/platform/env/controller/SdAlongDetailController.java create mode 100644 backend/src/main/java/com/yfd/platform/env/entity/vo/BatchDeleteAo.java create mode 100644 backend/src/main/java/com/yfd/platform/env/entity/vo/DataParam.java create mode 100644 backend/src/main/java/com/yfd/platform/env/entity/vo/SdAlongDetailVO.java create mode 100644 backend/src/main/java/com/yfd/platform/env/entity/vo/WtrvDataVo.java create mode 100644 backend/src/main/java/com/yfd/platform/env/entity/vo/WtrvInfo.java create mode 100644 backend/src/main/java/com/yfd/platform/env/mapper/AlongDetailMapper.java create mode 100644 backend/src/main/java/com/yfd/platform/env/mapper/SdWtrvdrtpSMapper.java create mode 100644 backend/src/main/java/com/yfd/platform/env/service/AlongDetailService.java create mode 100644 backend/src/main/java/com/yfd/platform/env/service/impl/AlongDetailServiceImpl.java create mode 100644 backend/src/main/java/com/yfd/platform/utils/CollectionExtUtils.java diff --git a/backend/src/main/java/com/yfd/platform/env/controller/SdAlongDetailController.java b/backend/src/main/java/com/yfd/platform/env/controller/SdAlongDetailController.java new file mode 100644 index 0000000..4be5593 --- /dev/null +++ b/backend/src/main/java/com/yfd/platform/env/controller/SdAlongDetailController.java @@ -0,0 +1,83 @@ +package com.yfd.platform.env.controller; + +import com.baomidou.mybatisplus.extension.plugins.pagination.Page; +import com.yfd.platform.common.DataSourceRequest; +import com.yfd.platform.common.DataSourceResult; +import com.yfd.platform.config.ResponseResult; +import com.yfd.platform.env.entity.vo.BatchDeleteAo; +import com.yfd.platform.env.entity.vo.WtrvInfo; +import com.yfd.platform.env.service.AlongDetailService; +import 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.*; + +import java.util.Map; + +@RestController +@RequestMapping("/sw/alongDetail") +@Tag(name = "沿程水温变化二级数据接口") +@Validated +public class SdAlongDetailController { + + @Resource + private AlongDetailService alongDetailService; + + + @PostMapping("/GetKendoListCust") + @Operation(summary = "查询沿程水温变化二级数据列表") + public ResponseResult getKendoListCust(@RequestBody DataSourceRequest dataSourceRequest) { + DataSourceResult result = alongDetailService.processKendoList(dataSourceRequest, null, new Page<>()); + return ResponseResult.successData(result); + } + + @PostMapping("/updateWtrvRData") + @Operation(summary = "修改表层水温日数据") + public ResponseResult updateWtrvRData(@RequestBody Map updateData) { + alongDetailService.updateWtrvRData(updateData); + return ResponseResult.success(); + } + + @PostMapping("/day/GetKendoListCust") + @Operation(summary = "查询出库水温日数据") + public ResponseResult getKendoDayListCust(@RequestBody DataSourceRequest dataSourceRequest) { + DataSourceResult result = alongDetailService.processDayKendoList(dataSourceRequest, null, new Page<>(), null); + return ResponseResult.successData(result); + } + + @PostMapping("/drtp/GetKendoListCust") + @Operation(summary = "查询出库水温周旬月季年数据") + public ResponseResult getKendoDrtpListCust(@RequestBody DataSourceRequest dataSourceRequest) { + DataSourceResult result = alongDetailService.processDrtpKendoList(dataSourceRequest, null, new Page<>(), null); + return ResponseResult.successData(result); + } + + @PostMapping("/drtp/removeKendoByIds") + @Operation(summary = "删除出库水温周旬月季年数据") + public ResponseResult removeKendoByIds(@RequestBody BatchDeleteAo batchDeleteAo) { + alongDetailService.removeKendoByIds(batchDeleteAo); + return ResponseResult.success(); + } + +// @PostMapping("/qgc/GetKendoListCust") +// @Operation(summary = "环保部查询出入库水温、出入库流量、入库水温、天然水温、降雨、气温数据") +// public ResponseResult getQgcKendoListCust(@RequestBody DataSourceRequest dataSourceRequest) { +// DataSourceResult result = alongDetailService.getQgcKendoListCust(dataSourceRequest); +// return ResponseResult.successData(result); +// } + + @GetMapping("/qgc/stcdCheck") + @Operation(summary = "判断出库水温站、垂向水温站或者低温水减缓设施所属的电站是否有出库水温站、垂向水温站和低温水减缓设施") + public ResponseResult getQgcStcdCheck(@RequestParam String stcd) { + WtrvInfo result = alongDetailService.getWtrvInfoByStcd2(stcd); + return ResponseResult.successData(result); + } + + @GetMapping("/qgc/stcdCheck2") + @Operation(summary = "判断出库水温站、垂向水温站所属的电站是否有出库水温站、垂向水温站") + public ResponseResult getQgcStcdCheck2(@RequestParam String stcd) { + WtrvInfo result = alongDetailService.getWtrvInfoByStcd3(stcd); + return ResponseResult.successData(result); + } +} diff --git a/backend/src/main/java/com/yfd/platform/env/entity/vo/BatchDeleteAo.java b/backend/src/main/java/com/yfd/platform/env/entity/vo/BatchDeleteAo.java new file mode 100644 index 0000000..f4dfafb --- /dev/null +++ b/backend/src/main/java/com/yfd/platform/env/entity/vo/BatchDeleteAo.java @@ -0,0 +1,20 @@ +package com.yfd.platform.env.entity.vo; + +import io.swagger.v3.oas.annotations.media.Schema; +import lombok.Data; + +import java.io.Serializable; +import java.util.List; + +@Data +@Schema(description = "批量删除参数") +public class BatchDeleteAo implements Serializable { + + private static final long serialVersionUID = 1L; + + @Schema(description = "数据类型") + private String dataType; + + @Schema(description = "删除数据列表") + private List dataList; +} diff --git a/backend/src/main/java/com/yfd/platform/env/entity/vo/DataParam.java b/backend/src/main/java/com/yfd/platform/env/entity/vo/DataParam.java new file mode 100644 index 0000000..88b5bac --- /dev/null +++ b/backend/src/main/java/com/yfd/platform/env/entity/vo/DataParam.java @@ -0,0 +1,20 @@ +package com.yfd.platform.env.entity.vo; + +import lombok.Data; + +@Data +public class DataParam { + + + private String dt; + + private String tm; + + private String month; + + private String year; + + private String drtp; + + private String id; +} \ No newline at end of file diff --git a/backend/src/main/java/com/yfd/platform/env/entity/vo/SdAlongDetailVO.java b/backend/src/main/java/com/yfd/platform/env/entity/vo/SdAlongDetailVO.java new file mode 100644 index 0000000..59ba7f7 --- /dev/null +++ b/backend/src/main/java/com/yfd/platform/env/entity/vo/SdAlongDetailVO.java @@ -0,0 +1,39 @@ +package com.yfd.platform.env.entity.vo; + +import com.fasterxml.jackson.annotation.JsonFormat; +import io.swagger.v3.oas.annotations.media.Schema; +import lombok.Getter; +import lombok.Setter; +import lombok.experimental.FieldNameConstants; + +import java.io.Serializable; +import java.math.BigDecimal; +import java.util.Date; + +@Getter +@Setter +@FieldNameConstants +@Schema(description = "沿程水温变化二级数据VO") +public class SdAlongDetailVO implements Serializable { + + private static final long serialVersionUID = 1L; + + @Schema(description = "时间") + @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss", timezone = "GMT+8") + private Date tm; + + @Schema(description = "月份") + private Integer mon; + + @Schema(description = "站码") + private String stcd; + + @Schema(description = "水温") + private BigDecimal wt; + + @Schema(description = "站名") + private String stnm; + + @Schema(description = "基地名称") + private String baseName; +} diff --git a/backend/src/main/java/com/yfd/platform/env/entity/vo/WtrvDataVo.java b/backend/src/main/java/com/yfd/platform/env/entity/vo/WtrvDataVo.java new file mode 100644 index 0000000..17a0196 --- /dev/null +++ b/backend/src/main/java/com/yfd/platform/env/entity/vo/WtrvDataVo.java @@ -0,0 +1,25 @@ +package com.yfd.platform.env.entity.vo; + +import com.fasterxml.jackson.annotation.JsonFormat; +import io.swagger.v3.oas.annotations.media.Schema; +import lombok.Data; +import lombok.EqualsAndHashCode; + +import java.io.Serializable; +import java.math.BigDecimal; +import java.util.Date; + +@Data +@EqualsAndHashCode(callSuper = true) +@Schema(description = "出入库水温数据") +public class WtrvDataVo extends WtrvInfo implements Serializable { + + private static final long serialVersionUID = 1L; + + @Schema(description = "时间") + @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss", timezone = "GMT+8") + private Date tm; + + @Schema(description = "水温") + private BigDecimal wt; +} diff --git a/backend/src/main/java/com/yfd/platform/env/entity/vo/WtrvInfo.java b/backend/src/main/java/com/yfd/platform/env/entity/vo/WtrvInfo.java new file mode 100644 index 0000000..bfd6c11 --- /dev/null +++ b/backend/src/main/java/com/yfd/platform/env/entity/vo/WtrvInfo.java @@ -0,0 +1,66 @@ +package com.yfd.platform.env.entity.vo; + +import io.swagger.v3.oas.annotations.media.Schema; +import lombok.Data; + +import java.io.Serializable; + +@Data +@Schema(description = "水温站点信息") +public class WtrvInfo implements Serializable { + + private static final long serialVersionUID = 1L; + + @Schema(description = "出入库标识:1-入库水温,2-出库水温,3-非出入库水温") + private Integer type; + + @Schema(description = "类型名称") + private String typeName; + + @Schema(description = "站码") + private String stcd; + + @Schema(description = "站名") + private String stnm; + + @Schema(description = "站点类型编码") + private String sttpCode; + + @Schema(description = "关联电站编码") + private String rstcd; + + @Schema(description = "关联电站名称") + private String ennm; + + @Schema(description = "垂向水温站站码") + private String vtStcd; + + @Schema(description = "垂向水温站站名") + private String vtStnm; + + @Schema(description = "低温水减缓设施站码") + private String dwStcd; + + @Schema(description = "低温水减缓设施站名") + private String dwStnm; + + public String getTypeName() { + if (type == null) { + return "未知类型"; + } + switch (type) { + case 1: + return "入库水温"; + case 2: + return "出库水温"; + case 3: + return "河道水温"; + default: + return "未知类型"; + } + } + + public void setTypeName(String typeName) { + this.typeName = typeName; + } +} diff --git a/backend/src/main/java/com/yfd/platform/env/mapper/AlongDetailMapper.java b/backend/src/main/java/com/yfd/platform/env/mapper/AlongDetailMapper.java new file mode 100644 index 0000000..2e997a2 --- /dev/null +++ b/backend/src/main/java/com/yfd/platform/env/mapper/AlongDetailMapper.java @@ -0,0 +1,143 @@ +package com.yfd.platform.env.mapper; + +import com.baomidou.mybatisplus.core.mapper.BaseMapper; +import com.yfd.platform.env.entity.vo.SdAlongDetailVO; +import com.yfd.platform.env.entity.vo.WtrvInfo; +import org.apache.ibatis.annotations.Mapper; +import org.apache.ibatis.annotations.Param; +import org.apache.ibatis.annotations.Select; + +import java.util.Date; +import java.util.List; +import java.util.Map; + +/** + * 沿程水温变化二级数据接口 + * + * @author + * @since 2023-04-23 09:32:10 + */ +@Mapper +public interface AlongDetailMapper extends BaseMapper { + + WtrvInfo getWtrvInfoByStcd(@Param("stcd") String stcd); + //电站数据 + @Select("SELECT AVG(a.QI) AS qi, AVG(a.QO) AS qo, a.tm, AVG(a.RZ) AS rz, AVG(a.DZ) AS dz " + + "FROM SD_HYDROPW_R a " + + "INNER JOIN MS_STBPRP_T b ON a.STCD = b.RSTCD " + + "WHERE b.IS_DELETED = 0 AND a.IS_DELETED = 0 " + + "AND b.STCD = #{stcd} AND a.TM BETWEEN #{startTime} AND #{endTime} " + + "GROUP BY a.TM") + List> getHydropwDataList(@Param("stcd") String stcd, + @Param("startTime") Date startTime, + @Param("endTime") Date endTime); + //天然水温 + @Select("") + List> getNatureTmpDataList(@Param("rstcd") String rstcd,@Param("monnth") Integer month); + //入库水温 + @Select("") + List> getIwtrvDataList(@Param("stcd")String stcd,@Param("rstcd")String rstcd, @Param("startTime") Date startTime, @Param("endTime") Date endTime); + //出库水温 + @Select("") + List> getDwtrvDataList(@Param("stcd")String stcd,@Param("rstcd")String rstcd, @Param("startTime") Date startTime, @Param("endTime") Date endTime); + //降雨量 + @Select("SELECT a.TM, AVG(a.DRP) AS DRP " + + "FROM SD_PPTN_R a " + + "INNER JOIN MS_STBPRP_T b ON a.STCD = b.STCD " + + "WHERE b.STTP_CODE = 'MM' " + + "AND a.IS_DELETED = 0 AND b.IS_DELETED = 0 " + + "AND b.RSTCD = (SELECT RSTCD FROM MS_STBPRP_T WHERE STCD = #{stcd}) " + + "AND a.TM BETWEEN #{startTime} AND #{endTime} " + + "GROUP BY a.TM") + List> getPptnDataList(@Param("stcd")String stcd, @Param("startTime") Date startTime, @Param("endTime") Date endTime); + //气象站数据 + @Select("SELECT a.TM, AVG(a.AT) AS AT " + + "FROM SD_TMP_R a " + + "INNER JOIN MS_STBPRP_T b ON a.STCD = b.STCD " + + "WHERE b.STTP_CODE = 'MM' AND a.IS_DELETED = 0 AND b.IS_DELETED = 0 " + + "AND b.RSTCD = (SELECT RSTCD FROM MS_STBPRP_T WHERE STCD = #{stcd}) " + + "AND a.TM BETWEEN #{startTime} AND #{endTime} " + + "GROUP BY a.TM") + List> getTmpDataList(@Param("stcd")String stcd, @Param("startTime") Date startTime, @Param("endTime") Date endTime); + + @Select("SELECT * FROM (" + + "SELECT TM, WTHG, ROUND(AVG(VWT), 2) AS VWT " + + "FROM SD_WTVT_R " + + "WHERE STCD IN (" + + " SELECT STCD FROM MS_STBPRP_T " + + " WHERE RSTCD = #{rstcd} AND STTP_CODE = 'WTVT' AND IS_DELETED = 0" + + ") " + + "AND TO_CHAR(TM, 'mi') = 0 AND IS_DELETED = 0 " + + "AND TM BETWEEN #{startTime} AND #{endTime} " + + "GROUP BY TM, WTHG" + + ") ORDER BY TM ASC, VWT ASC") + List> getWtvtDataList(@Param("stcd")String stcd,@Param("rstcd")String rstcd, @Param("startTime") Date startTime, @Param("endTime") Date endTime); + + @Select("SELECT a.STCD AS rstcd, a.STNM AS ennm, " + + "REGEXP_REPLACE(LISTAGG(TO_CHAR(b.STCD), ',') WITHIN GROUP (ORDER BY b.STCD), '([^,]+)(,\\1)*(,|$)', '\\1\\3') AS stcd, " + + "REGEXP_REPLACE(LISTAGG(TO_CHAR(b.STNM), ',') WITHIN GROUP (ORDER BY b.STCD), '([^,]+)(,\\1)*(,|$)', '\\1\\3') AS stnm, " + + "REGEXP_REPLACE(LISTAGG(TO_CHAR(c.STCD), ',') WITHIN GROUP (ORDER BY c.STCD), '([^,]+)(,\\1)*(,|$)', '\\1\\3') AS vtStcd, " + + "REGEXP_REPLACE(LISTAGG(TO_CHAR(c.STNM), ',') WITHIN GROUP (ORDER BY c.STCD), '([^,]+)(,\\1)*(,|$)', '\\1\\3') AS vtStnm, " + + "REGEXP_REPLACE(LISTAGG(TO_CHAR(d.STCD), ',') WITHIN GROUP (ORDER BY d.STCD), '([^,]+)(,\\1)*(,|$)', '\\1\\3') AS dwStcd, " + + "REGEXP_REPLACE(LISTAGG(TO_CHAR(d.STNM), ',') WITHIN GROUP (ORDER BY d.STCD), '([^,]+)(,\\1)*(,|$)', '\\1\\3') AS dwStnm " + + "FROM MS_STBPRP_T a " + + "LEFT JOIN MS_STBPRP_T b ON a.STCD = b.RSTCD AND b.STTP_CODE = 'WTRV' AND b.IS_DELETED = 0 AND b.MWAY = 2 AND b.DTIN_TYPE = 0 " + + "LEFT JOIN MS_STBPRP_T c ON a.STCD = c.RSTCD AND c.STTP_CODE = 'WTVT' AND c.IS_DELETED = 0 AND c.MWAY = 2 " + + "LEFT JOIN MS_STBPRP_T d ON a.STCD = d.RSTCD AND d.STTP_CODE LIKE 'DW_%' AND d.IS_DELETED = 0 " + + "WHERE a.STTP_CODE = 'ENG' AND a.IS_DELETED = 0 " + + "AND b.STCD IS NOT NULL AND c.STCD IS NOT NULL AND d.STCD IS NOT NULL AND b.ENG_DWT_CODE IS NOT NULL " + + "AND (d.STCD = #{stcd} OR b.STCD = #{stcd} OR c.STCD = #{stcd} OR a.STCD = #{stcd}) " + + "AND a.STCD = b.ENG_DWT_CODE " + + "GROUP BY a.STCD, a.STNM") + WtrvInfo getWtrvInfoByStcd2(@Param("stcd") String stcd); + + @Select("SELECT a.STCD AS rstcd, a.STNM AS ennm, " + + "REGEXP_REPLACE(LISTAGG(TO_CHAR(b.STCD), ',') WITHIN GROUP (ORDER BY b.STCD), '([^,]+)(,\\1)*(,|$)', '\\1\\3') AS stcd, " + + "REGEXP_REPLACE(LISTAGG(TO_CHAR(b.STNM), ',') WITHIN GROUP (ORDER BY b.STCD), '([^,]+)(,\\1)*(,|$)', '\\1\\3') AS stnm, " + + "REGEXP_REPLACE(LISTAGG(TO_CHAR(c.STCD), ',') WITHIN GROUP (ORDER BY c.STCD), '([^,]+)(,\\1)*(,|$)', '\\1\\3') AS vtStcd, " + + "REGEXP_REPLACE(LISTAGG(TO_CHAR(c.STNM), ',') WITHIN GROUP (ORDER BY c.STCD), '([^,]+)(,\\1)*(,|$)', '\\1\\3') AS vtStnm " + + "FROM MS_STBPRP_T a " + + "LEFT JOIN MS_STBPRP_T b ON a.STCD = b.RSTCD AND b.STTP_CODE = 'WTRV' AND b.IS_DELETED = 0 AND b.MWAY = 2 AND b.DTIN_TYPE = 0 " + + "LEFT JOIN MS_STBPRP_T c ON a.STCD = c.RSTCD AND c.STTP_CODE = 'WTVT' AND c.IS_DELETED = 0 AND c.MWAY = 2 " + + "WHERE a.STTP_CODE = 'ENG' AND a.IS_DELETED = 0 " + + "AND b.STCD IS NOT NULL AND c.STCD IS NOT NULL AND b.ENG_DWT_CODE IS NOT NULL " + + "AND (b.STCD = #{stcd} OR c.STCD = #{stcd} OR a.STCD = #{stcd}) " + + "AND a.STCD = b.ENG_DWT_CODE " + + "GROUP BY a.STCD, a.STNM") + WtrvInfo getWtrvInfoByStcd3(@Param("stcd") String stcd); +} diff --git a/backend/src/main/java/com/yfd/platform/env/mapper/SdWtrvdrtpSMapper.java b/backend/src/main/java/com/yfd/platform/env/mapper/SdWtrvdrtpSMapper.java new file mode 100644 index 0000000..a8b50a5 --- /dev/null +++ b/backend/src/main/java/com/yfd/platform/env/mapper/SdWtrvdrtpSMapper.java @@ -0,0 +1,36 @@ +package com.yfd.platform.env.mapper; + +import com.yfd.platform.env.entity.vo.DataParam; +import org.apache.ibatis.annotations.Delete; +import org.apache.ibatis.annotations.Mapper; +import org.apache.ibatis.annotations.Param; +import org.apache.ibatis.annotations.Update; + +import java.util.List; +import java.util.Map; + +@Mapper +public interface SdWtrvdrtpSMapper { + void deleteWtrvMonthData(@Param("ids") List ids, @Param("deleteTime") String deleteTime); + + @Delete("") + void deleteWtrvRData(@Param("dataParamList") List dataParamList, @Param("deleteTime") String deleteTime, @Param("userID") String userID); + + @Update("") + void updateWtrvRData(@Param("updateData") Map updateData); + +// void updateWtvtRData(@Param("updateData") Map updateData); + +} diff --git a/backend/src/main/java/com/yfd/platform/env/service/AlongDetailService.java b/backend/src/main/java/com/yfd/platform/env/service/AlongDetailService.java new file mode 100644 index 0000000..586c352 --- /dev/null +++ b/backend/src/main/java/com/yfd/platform/env/service/AlongDetailService.java @@ -0,0 +1,48 @@ +package com.yfd.platform.env.service; + +import com.baomidou.mybatisplus.extension.plugins.pagination.Page; +import com.baomidou.mybatisplus.extension.service.IService; +import com.yfd.platform.common.DataSourceRequest; +import com.yfd.platform.common.DataSourceResult; +import com.yfd.platform.common.GroupResult; +import com.yfd.platform.env.entity.vo.BatchDeleteAo; +import com.yfd.platform.env.entity.vo.SdAlongDetailVO; +import com.yfd.platform.env.entity.vo.WtrvInfo; + + +import java.util.Map; + +/** + * 沿程水温变化二级数据接口服务 + * + * @author + * @since 2023-04-23 09:32:10 + */ +public interface AlongDetailService extends IService { + /** + * 处理kendo列表 + * + * @param dataSourceRequest 数据源请求 + * @param filterResult 筛选结果 + * @param page 页面 + * @return {@link DataSourceResult}<{@link SdMonthListVO}> + */ + DataSourceResult processKendoList(DataSourceRequest dataSourceRequest, Map filterResult, Page page); + + DataSourceResult processDayKendoList(DataSourceRequest dataSourceRequest, Map filterResult, Page page, String groupBy); + + DataSourceResult processDrtpKendoList(DataSourceRequest dataSourceRequest, Map filterResult, Page page, String groupBy); + + DataSourceResult processQgcKendList(DataSourceResult dataSourceResult, WtrvInfo wtrvInfo); + + WtrvInfo getWtrvInfoByStcd(String stcd); + + WtrvInfo getWtrvInfoByStcd2(String stcd); + + WtrvInfo getWtrvInfoByStcd3(String stcd); + + boolean removeKendoByIds(BatchDeleteAo batchDeleteAo); + + void updateWtrvRData(Map updateData); + +} \ No newline at end of file diff --git a/backend/src/main/java/com/yfd/platform/env/service/impl/AlongDetailServiceImpl.java b/backend/src/main/java/com/yfd/platform/env/service/impl/AlongDetailServiceImpl.java new file mode 100644 index 0000000..3320d89 --- /dev/null +++ b/backend/src/main/java/com/yfd/platform/env/service/impl/AlongDetailServiceImpl.java @@ -0,0 +1,597 @@ +package com.yfd.platform.env.service.impl; + +import cn.hutool.core.collection.CollUtil; +import cn.hutool.core.date.DateUtil; +import cn.hutool.core.util.ObjectUtil; +import cn.hutool.core.util.StrUtil; +import com.baomidou.mybatisplus.extension.plugins.pagination.Page; +import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; +import com.yfd.platform.common.*; +import com.yfd.platform.env.entity.vo.*; +import com.yfd.platform.env.mapper.AlongDetailMapper; +import com.yfd.platform.env.mapper.SdWtrvdrtpSMapper; +import com.yfd.platform.env.service.AlongDetailService; +import com.yfd.platform.utils.CollectionExtUtils; +import com.yfd.platform.utils.SecurityUtils; +import jakarta.annotation.Resource; +import org.springframework.jdbc.core.JdbcTemplate; +import org.springframework.stereotype.Service; +import java.math.BigDecimal; +import java.math.RoundingMode; +import java.util.*; +import java.util.function.Function; +import java.util.stream.Collectors; + +/** + * 沿程水温二级数据接口服务 + * + * @author + * @since 2023-04-23 09:32:10 + */ +@Service +public class AlongDetailServiceImpl extends ServiceImpl implements AlongDetailService { + @Resource + private DynamicSQLMapper dynamicSQLMapper; + @Resource + private AlongDetailMapper alongDetailMapper; + + @Resource + private SdWtrvdrtpSMapper sdWtrvdrtpSMapper; + + @Resource + private JdbcTemplate jdbcTemplate; + + @Override + public DataSourceResult processKendoList(DataSourceRequest dataSourceRequest, Map filterResult, Page page) { + DataSourceResult dataSourceResult = new DataSourceResult(); + StringBuilder sql = new StringBuilder("SELECT t.tm,t.mon, t.stcd, t.wt, t.stnm, t.basename,t.mway,t.rstcd\n" + + "FROM (SELECT DISTINCT r.tm,to_char(r.tm,'MM') mon, r.stcd, r.WT,r.TASK_ID,r.TASK_STATUS ,t2.stnm,t2.BASE_Id AS baseId, t2.BASE_NAME baseName,t2.MWAY AS mway, t2.rstcd\n" + + " FROM SD_WTRV_R r\n" + + //" inner join MS_ALONGDET_B b on r.stcd=b.stcd and b.is_deleted=0 inner join MS_ALONG_B a on a.ID=b.ALONG_ID and a.code='common' " + + " LEFT JOIN MS_STBPRP_T t2 ON r.STCD = t2.STCD \n" + + " WHERE r.is_deleted=0 and t2.is_deleted=0 " + + " order by r.tm DESC, r.stcd) t where 1=1 "); + + sql. append(" AND (TASK_ID IS NULL OR TASK_ID ='' OR TASK_STATUS ='Approved') "); + if (ObjectUtil.isNotEmpty(filterResult.get(CommonConstant.DEFAULT))) { + if (StrUtil.isNotBlank(filterResult.get(CommonConstant.DEFAULT).getGroupSql())) { + sql.append(" and ").append(filterResult.get(CommonConstant.DEFAULT).getGroupSql()); + } + + if (StrUtil.isNotBlank(filterResult.get(CommonConstant.DEFAULT).getOrderBySql())) { + sql.append(" ").append(filterResult.get(CommonConstant.DEFAULT).getOrderBySql()); + } + } + Map map = new HashMap(); + Iterator iterator = filterResult.keySet().iterator(); + + while (iterator.hasNext()) { + String key = (String) iterator.next(); + map.putAll(filterResult.get(key).getParamMap()); + } + List list = this.dynamicSQLMapper.pageAllListWithResultType(page, sql.toString(), map, SdAlongDetailVO.class); + dataSourceResult.setData(list); + dataSourceResult.setTotal(ObjectUtil.isNotEmpty(page) ? page.getTotal() : (long) list.size()); + return dataSourceResult; + } + + @Override + public DataSourceResult processDayKendoList(DataSourceRequest dataSourceRequest, Map filterResult, Page page, String groupBy) { + DataSourceResult dataSourceResult = new DataSourceResult(); + StringBuilder sql = new StringBuilder(); + + if(StrUtil.isNotBlank(filterResult.get("default").getSelectSql())){ + sql.append(filterResult.get("default").getSelectSql()); + sql.append(" from "); + sql.append(" SD_WTRVDAY_S a inner join MS_STBPRP_T b on a.STCD=b.STCD and b.STTP_CODE='WTRV' "); + sql.append(" where 1=1 "); + if (ObjectUtil.isNotEmpty(filterResult.get(CommonConstant.DEFAULT))) { + if (StrUtil.isNotBlank(filterResult.get(CommonConstant.DEFAULT).getGroupSql())) { + sql.append(" and ").append(filterResult.get(CommonConstant.DEFAULT).getGroupSql()); + } + + if (StrUtil.isNotBlank(filterResult.get(CommonConstant.DEFAULT).getOrderBySql())) { + sql.append(" ").append(filterResult.get(CommonConstant.DEFAULT).getOrderBySql()); + } + } + } + Map map = new HashMap(); + Iterator iterator = filterResult.keySet().iterator(); + while (iterator.hasNext()) { + String key = (String) iterator.next(); + map.putAll(filterResult.get(key).getParamMap()); + } + List< Map> resultList = this.dynamicSQLMapper.pageAllList(page, sql.toString(), map); + dataSourceResult.setData(resultList); + dataSourceResult.setTotal(ObjectUtil.isNotEmpty(page) ? page.getTotal() : (long) resultList.size()); + return dataSourceResult; + } + + @Override + public DataSourceResult processDrtpKendoList(DataSourceRequest dataSourceRequest, Map filterResult, Page page, String groupBy) { + DataSourceResult dataSourceResult = new DataSourceResult(); + StringBuilder sql = new StringBuilder(); + if(StrUtil.isNotBlank(filterResult.get(CommonConstant.DEFAULT).getSelectSql())){ + sql.append(filterResult.get(CommonConstant.DEFAULT).getSelectSql()); + sql.append(" from "); + sql.append(" SD_WTRVDRTP_S a inner join MS_STBPRP_T b on a.STCD=b.STCD and b.STTP_CODE='WTRV' "); + sql.append(" where 1=1 "); + if (ObjectUtil.isNotEmpty(filterResult.get(CommonConstant.DEFAULT))) { + if (StrUtil.isNotBlank(filterResult.get(CommonConstant.DEFAULT).getGroupSql())) { + sql.append(" and ").append(filterResult.get(CommonConstant.DEFAULT).getGroupSql()); + } + + if (StrUtil.isNotBlank(filterResult.get(CommonConstant.DEFAULT).getOrderBySql())) { + sql.append(" ").append(filterResult.get(CommonConstant.DEFAULT).getOrderBySql()); + } + } + } + Map map = new HashMap(); + Iterator iterator = filterResult.keySet().iterator(); + + while (iterator.hasNext()) { + String key = (String) iterator.next(); + map.putAll(filterResult.get(key).getParamMap()); + } + List> resultList = this.dynamicSQLMapper.pageAllList(page, sql.toString(), map); + dataSourceResult.setData(resultList); + dataSourceResult.setTotal(ObjectUtil.isNotEmpty(page) ? page.getTotal() : (long) resultList.size()); + return dataSourceResult; + } + + @Override + public DataSourceResult processQgcKendList(DataSourceResult dataSourceResult, WtrvInfo wtrvInfo) { + DataSourceResult dr = new DataSourceResult(); + List> list = (List>) dataSourceResult.getData(); + + if (list == null || list.isEmpty()) { + dr.setData(new ArrayList<>()); + dr.setTotal(0); + return dr; + } + + Date startTime = (Date) list.get(0).get("tm"); + Date endTime = (Date) list.get(list.size() - 1).get("tm"); + + if (startTime.compareTo(endTime) > 0) { + Date tmpDate = startTime; + startTime = endTime; + endTime = tmpDate; + } + + List> iwtDataVoList = new ArrayList<>(); + List> dwtDataVoList = new ArrayList<>(); + List> wtvtDataVoList = new ArrayList<>(); + List> hydropwDataVoList = new ArrayList<>(); + List> pptnDataVoList = new ArrayList<>(); + List> tmpDataVoList = new ArrayList<>(); + List> wtnpDataVoList; + + if (wtrvInfo.getType() == 1) { + dwtDataVoList.addAll(this.alongDetailMapper.getDwtrvDataList(wtrvInfo.getStcd(), null, startTime, endTime)); + } + + Map>> wtvtDataVoMap; + if (wtrvInfo.getType() == 2) { + iwtDataVoList.addAll(this.alongDetailMapper.getIwtrvDataList(wtrvInfo.getStcd(), null, startTime, endTime)); + wtvtDataVoList.addAll(this.alongDetailMapper.getWtvtDataList(null, wtrvInfo.getRstcd(), startTime, endTime)); + wtvtDataVoMap = wtvtDataVoList.stream() + .filter(it -> it.get("tm") != null) + .collect(Collectors.groupingBy(it -> (Date) it.get("tm"))); + } else { + wtvtDataVoMap = null; + } + + Map> iwtDataMap = iwtDataVoList.stream() + .collect(Collectors.toMap(it -> (Date) it.get("tm"), Function.identity())); + Map> dwtDataMap = dwtDataVoList.stream() + .collect(Collectors.toMap(it -> (Date) it.get("tm"), Function.identity())); + + hydropwDataVoList.addAll(this.alongDetailMapper.getHydropwDataList(wtrvInfo.getStcd(), startTime, endTime)); + Map> hydropwDataMap = hydropwDataVoList.stream() + .collect(Collectors.toMap(it -> (Date) it.get("tm"), Function.identity())); + + pptnDataVoList.addAll(this.alongDetailMapper.getPptnDataList(wtrvInfo.getStcd(), startTime, endTime)); + Map> pptnDataMap = pptnDataVoList.stream() + .collect(Collectors.toMap(it -> (Date) it.get("tm"), Function.identity())); + + tmpDataVoList.addAll(this.alongDetailMapper.getTmpDataList(wtrvInfo.getStcd(), startTime, endTime)); + Map> tmpDataMap = tmpDataVoList.stream() + .collect(Collectors.toMap(it -> (Date) it.get("tm"), Function.identity())); + + Map wtnpDataMap = new HashMap<>(); + if (StrUtil.isNotBlank(wtrvInfo.getRstcd())) { + wtnpDataVoList = this.alongDetailMapper.getNatureTmpDataList(wtrvInfo.getRstcd(), null); + wtnpDataMap.putAll(wtnpDataVoList.stream() + .filter(it -> it.get("mnth") != null) + .collect(Collectors.toMap( + it -> (Integer) it.get("mnth"), + it -> (BigDecimal) it.get("wt") + ))); + } + + List> qgcWtrvDataVoList = new ArrayList<>(); + list.forEach(it -> { + Map vo = new HashMap<>(); + vo.put("stcd", it.get("stcd")); + vo.put("stnm", it.get("stnm")); + vo.put("wt", it.get("wt")); + vo.put("tm", it.get("tm")); + vo.put("ennm", wtrvInfo.getEnnm()); + vo.put("rstcd", wtrvInfo.getRstcd()); + vo.put("type", wtrvInfo.getType()); + vo.put("natureTmp", wtnpDataMap.get(it.get("mon"))); + vo.put("hydropwDataVo", hydropwDataMap.get(it.get("tm"))); + vo.put("pptnDataVo", pptnDataMap.get(it.get("tm"))); + vo.put("tmpDataVo", tmpDataMap.get(it.get("tm"))); + + if (wtrvInfo.getType() == 1) { + Map iwtVo = new HashMap<>(); + iwtVo.put("tm", it.get("tm")); + iwtVo.put("wt", it.get("wt")); + vo.put("iwtDataVo", iwtVo); + vo.put("dwtDataVo", dwtDataMap.get(it.get("tm"))); + } + + if (wtrvInfo.getType() == 2) { + Map dwtVo = new HashMap<>(); + dwtVo.put("tm", it.get("tm")); + dwtVo.put("wt", it.get("wt")); + vo.put("dwtDataVo", dwtVo); + vo.put("iwtDataVo", iwtDataMap.get(it.get("tm"))); + + if (it.get("wt") != null && wtvtDataVoMap != null) { + List> vtList = wtvtDataVoMap.get(it.get("tm")); + if (vtList != null) { + Map>> vtMap = vtList.stream() + .filter(tt -> tt.get("vwt") != null) + .collect(Collectors.groupingBy(tt -> (BigDecimal) tt.get("vwt"))); + + if (vtMap.containsKey(it.get("wt"))) { + vo.put("wtvtDataVo", vtMap.get(it.get("wt")).get(0)); + qgcWtrvDataVoList.add(vo); + return; + } + + BigDecimal leftVt = null; + BigDecimal rightVt = null; + Map leftVo = null; + Map rightVo = null; + + List sortVt = new ArrayList<>(vtMap.keySet()).stream() + .sorted() + .collect(Collectors.toList()); + + BigDecimal[] lrValue = CollectionExtUtils.findNeighbors(sortVt, (BigDecimal) it.get("wt")); + if (lrValue.length == 2) { + leftVt = lrValue[0]; + rightVt = lrValue[1]; + } + + Map vo1 = new HashMap<>(); + if (leftVt != null) { + leftVo = vtMap.get(leftVt).get(0); + vo1.put("leftWtvtData", leftVo); + } + if (rightVt != null) { + rightVo = vtMap.get(rightVt).get(0); + vo1.put("rightWtvtData", rightVo); + } + + if (leftVt != null && rightVt != null) { + BigDecimal currentWt = (BigDecimal) it.get("wt"); + BigDecimal wthg = ((rightVt.subtract(currentWt)).multiply((BigDecimal) leftVo.get("wthg")) + .add((currentWt.subtract(leftVt)).multiply((BigDecimal) rightVo.get("wthg")))) + .divide((rightVt.subtract(currentWt)).add(currentWt.subtract(leftVt)), RoundingMode.HALF_UP); + vo1.put("wthg", wthg); + vo1.put("vwt", currentWt); + } + vo.put("wtvtDataVo", vo1); + } + } + } + qgcWtrvDataVoList.add(vo); + }); + + dr.setData(qgcWtrvDataVoList); + dr.setTotal(dataSourceResult.getTotal()); + return dr; + } + + + @Override + public WtrvInfo getWtrvInfoByStcd(String stcd) { + return this.alongDetailMapper.getWtrvInfoByStcd(stcd); + } + + @Override + public WtrvInfo getWtrvInfoByStcd2(String stcd) { + return this.alongDetailMapper.getWtrvInfoByStcd2(stcd); + } + + @Override + public WtrvInfo getWtrvInfoByStcd3(String stcd) { + return this.alongDetailMapper.getWtrvInfoByStcd3(stcd); + } + + @Override + public boolean removeKendoByIds(BatchDeleteAo batchDeleteAo) { + String dataType = batchDeleteAo.getDataType(); + List dataList = 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".equals(dataType)) { + //删除月数据 + + } + if ("DATE".equals(dataType)) { + //删除日数据 + + } + if ("TIME".equals(dataType)) { + sdWtrvdrtpSMapper.deleteWtrvRData(subList, DateUtil.now(), SecurityUtils.getCurrentUsername()); + + // 删除小时数据后,需要重新统计对应的日数据和月数据 + Map dateRangeMap = new HashMap<>(); + Map monthRangeMap = new HashMap<>(); + + for (DataParam param : subList) { + if (param.getId() != null && param.getDt() != null) { + 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 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; + if (!monthRangeMap.containsKey(monthKey)) { + monthRangeMap.put(monthKey, new String[]{stcd, monthStart, monthEnd}); + } + } + } + } + + // 统计日数据(从小时数据)- 按测站和日期范围批量统计 + for (Map.Entry entry : dateRangeMap.entrySet()) { + String stcd = entry.getKey(); + String[] range = entry.getValue(); + statisticsDayDataFromHour(stcd, range[0], range[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; + } + + /** + * 获取指定年月的最后一天 + */ + 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); + } + + /** + * 从小时水温数据统计日数据(支持日期范围) + * @param stcd 测站编码 + * @param startDate 开始日期 yyyy-MM-dd + * @param endDate 结束日期 yyyy-MM-dd + */ + private void statisticsDayDataFromHour(String stcd, String startDate, String endDate) { + // 第一步:标记没有对应小时数据的日记录为删除 + String deleteSql = "DELETE FROM SD_WTRVDAY_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_WTRV_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)"; +// String deleteSql = "UPDATE SD_WTRVDAY_S T " + +// "SET T.IS_DELETED = 1, " + +// "T.DELETE_TIME = SYSDATE, " + +// "T.MODIFY_TIME = SYSDATE " + +// "WHERE T.STCD = ? " + +// "AND T.DT BETWEEN TO_DATE(?, 'YYYY-MM-DD') " + +// "AND TO_DATE(?, 'YYYY-MM-DD') " + +// "AND T.IS_DELETED = 0 " + +// "AND NOT EXISTS ( " + +// "SELECT 1 FROM SD_WTRV_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_WTRVDAY_S T " + + "USING ( " + + " SELECT " + + " STCD, " + + " TRUNC(TM) AS DT, " + + " AVG(WT) AS WT " + + " FROM SD_WTRV_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.WT = S.WT, " + + " T.IS_DELETED = 0, " + + " T.DELETE_TIME = NULL, " + + " T.MODIFY_TIME = SYSDATE " + + "WHEN NOT MATCHED THEN INSERT ( " + + " ID, STCD, DT, WT, RECORD_TIME, IS_DELETED " + + ") VALUES ( " + + " SYS_GUID(), S.STCD, S.DT, S.WT, SYSDATE, 0 " + + ")"; + + jdbcTemplate.update(mergeSql, stcd, startDate, endDate); + } + + /** + * 从日水温数据统计月数据(支持日期范围) + * @param stcd 测站编码 + * @param startDate 开始日期 yyyy-MM-dd + * @param endDate 结束日期 yyyy-MM-dd + */ + private void statisticsMonthDataFromDay(String stcd, String startDate, String endDate) { + // 解析年月 + String startYear = startDate.substring(0, 4); + String startMonth = startDate.substring(5, 7); + String endYear = endDate.substring(0, 4); + String endMonth = endDate.substring(5, 7); + + Integer startYearInt = Integer.parseInt(startYear); + Integer startMonthInt = Integer.parseInt(startMonth); + Integer endMonthInt = Integer.parseInt(endMonth); + + // 第一步:标记没有对应日数据的月记录为删除 +// String deleteSql = "UPDATE SD_WTRVDRTP_S T " + +// "SET T.IS_DELETED = 1, " + +// "T.DELETE_TIME = SYSDATE, " + +// "T.MODIFY_TIME = SYSDATE " + +// "WHERE T.DRTP = 'MON' " + +// "AND T.STCD = ? " + +// "AND T.YEAR = ? " + +// "AND T.MONTH BETWEEN ? AND ? " + +// "AND T.IS_DELETED = 0 " + +// "AND NOT EXISTS ( " + +// " SELECT 1 FROM SD_WTRVDAY_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)"; + + String deleteSql = "DELETE FROM SD_WTRVDRTP_S T " + + "WHERE T.DRTP = 'MON' " + + "AND T.STCD = ? " + + "AND T.YEAR = ? " + + "AND T.MONTH BETWEEN ? AND ? " + + "AND NOT EXISTS ( " + + " SELECT 1 FROM SD_WTRVDAY_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_WTRVDRTP_S T " + + "USING ( " + + " SELECT " + + " STCD, " + + " EXTRACT(YEAR FROM DT) AS YEAR, " + + " EXTRACT(MONTH FROM DT) AS MONTH, " + + " 'MON' AS DRTP, " + + " AVG(WT) AS WT " + + " FROM SD_WTRVDAY_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.WT = S.WT, " + + " 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, WT, DRTP, YEAR, MONTH, DR, RECORD_TIME, IS_DELETED, TM " + + ") VALUES ( " + + " SYS_GUID(), S.STCD, S.WT, 'MON', S.YEAR, S.MONTH, NULL, SYSDATE, 0, SYSDATE " + + ")"; + + jdbcTemplate.update(mergeSql, stcd, startDate, endDate); + } + + + @Override + public void updateWtrvRData(Map updateData) { + sdWtrvdrtpSMapper.updateWtrvRData(updateData); + + // 获取测站编码和时间 + String stcd = (String) updateData.get("stcd"); + String tm = (String) updateData.get("dt"); + + if (StrUtil.isNotBlank(stcd) && StrUtil.isNotBlank(tm)) { + // 提取日期部分(yyyy-MM-dd) + String dateStr = tm.substring(0, 10); + + // 从小时水温数据统计日数据 + statisticsDayDataFromHour(stcd, dateStr, dateStr); + + // 从日水温数据统计月数据(统计该日期所在月份) + String yearMonth = dateStr.substring(0, 7); + String[] ym = yearMonth.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); + } + } + } +} \ No newline at end of file diff --git a/backend/src/main/java/com/yfd/platform/utils/CollectionExtUtils.java b/backend/src/main/java/com/yfd/platform/utils/CollectionExtUtils.java new file mode 100644 index 0000000..dc49148 --- /dev/null +++ b/backend/src/main/java/com/yfd/platform/utils/CollectionExtUtils.java @@ -0,0 +1,257 @@ +package com.yfd.platform.utils; + +import com.google.common.base.Objects; +import com.google.common.collect.Maps; +import org.apache.commons.lang3.StringUtils; + +import java.math.BigDecimal; +import java.util.*; + +/** + * description: + *
+ *      template
+ * 
+ * + * @author supeng + * @date 2018 -08-30 14:53 + */ +@SuppressWarnings({"WeakerAccess", "unused"}) +public class CollectionExtUtils { + + /** + * 内存分页 + * + * @param // + * @param datas // + * @param row // + * @param page // + * @return // + */ + public static List getBatch(Collection datas, Integer row, Integer page) { + List> batchCollection = getBatch(datas, row); + if (batchCollection.isEmpty()) { + return new ArrayList<>(); + } + page = (page == null || page < 1) ? 1 : page; + if (batchCollection.size() >= page) { + return (List) batchCollection.get(page - 1); + } else { + return (List) batchCollection.get(batchCollection.size() - 1); + } + } + + /** + * 对集合数据, 进行批次 + * + * @param // + * @param datas // + * @param row // + * @return // + */ + public static List> getBatch(Collection datas, Integer row) { + List> result = new ArrayList<>(); + if (datas == null || datas.isEmpty()) { + return result; + } + //批量每次最多条数, 默认:100 + row = (row == null || row < 1) ? 100 : row; + int sourListSize = datas.size(); + int subCount = (sourListSize % row == 0) ? sourListSize / row : sourListSize / row + 1; + int startIndex = 0; + int stopIndex = 0; + List collectionDataList = new ArrayList<>(datas); + for (int i = 0; i < subCount; i++) { + stopIndex = ((i == subCount - 1) && (sourListSize % row != 0)) ? stopIndex + sourListSize % row : stopIndex + row; + List es = collectionDataList.subList(startIndex, stopIndex); + result.add(es); + startIndex = stopIndex; + } + return result; + } + + /** + * List 2 iterator array iterator. + * + * @param list the list + * @return the iterator + */ + public static Iterator convertIteratorArray(List list) { + List dataToBeReturned = new ArrayList<>(); + for (Object item : list) { + dataToBeReturned.add(new Object[]{item}); + } + return dataToBeReturned.iterator(); + } + + /** + * Gets map key by value. + * + * @param findValue the find value + * @param map the map + * @return the map key by value + */ + public static Object getMapKey(Object findValue, Map map) { + if (!map.containsValue(findValue)) { + return null; + } + for (Map.Entry entry : map.entrySet()) { + if (findValue.equals(entry.getValue())) { + return entry.getKey(); + } + } + return null; + } + + public static V getMapKey(Object findValue, Map map, Class valType) { + Object mapKey = getMapKey(findValue, map); + //noinspection unchecked + return mapKey == null ? null : (V) mapKey; + } + + /** + * 移除map中空key或者value空值 + * + * @param map // + */ + public static void removeNullEntry(Map map) { + removeNullKey(map); + removeNullValue(map); + } + + /** + * 移除map的空key + * + * @param map // + * @return // + */ + public static void removeNullKey(Map map) { + Set set = map.keySet(); + for (Iterator iterator = set.iterator(); iterator.hasNext(); ) { + Object obj = (Object) iterator.next(); + remove(obj, iterator); + } + } + + /** + * 移除map中的value空值 + * + * @param map + * @return + */ + public static void removeNullValue(Map map) { + Set set = map.keySet(); + for (Iterator iterator = set.iterator(); iterator.hasNext(); ) { + Object obj = (Object) iterator.next(); + Object value = (Object) map.get(obj); + remove(value, iterator); + } + } + + /** + * 移除map中的空值 + *

+ * Iterator 是工作在一个独立的线程中, 并且拥有一个 mutex 锁. Iterator + * 被创建之后会建立一个指向原来对象的单链索引表, 当原来的对象数量发生变化时, 这个索引表的内容不会同步改变, + * 所以当索引指针往后移动的时候就找不到要迭代的对象, 所以按照 fail-fast 原则 Iterator 会马上抛出 + * java.util.ConcurrentModificationException 异常. 所以 Iterator + * 在工作的时候是不允许被迭代的对象被改变的. 但你可以使用 Iterator 本身的方法 remove() 来删除对象, Iterator.remove() + * 方法会在删除当前迭代对象的同时维护索引的一致性. + * + * @param obj + * @param iterator + */ + private static void remove(Object obj, Iterator iterator) { + if (obj instanceof String) { + String str = (String) obj; + if (StringUtils.isEmpty(str)) { // 过滤掉为null和""的值 主函数输出结果map:{2=BB, 1=AA, 5=CC, 8= } +// if("".equals(str.trim())){ //过滤掉为null、""和" "的值 主函数输出结果map:{2=BB, 1=AA, 5=CC} + iterator.remove(); + } + + } else if (obj instanceof Collection) { + Collection col = (Collection) obj; + if (col == null || col.isEmpty()) { + iterator.remove(); + } + + } else if (obj instanceof Map) { + Map temp = (Map) obj; + if (temp == null || temp.isEmpty()) { + iterator.remove(); + } + + } else if (obj instanceof Object[]) { + Object[] array = (Object[]) obj; + if (array == null || array.length <= 0) { + iterator.remove(); + } + } else { + if (obj == null) { + iterator.remove(); + } + } + } + + /** + * 过滤未修改的数据 主键不过滤 + * + * @param map + * @return + */ + public static Map cleanModifyMap(Map map) { + Map mapModify = Maps.newHashMap(); + if (null == map || null == map.get("modifyKeys")) { + return null; + } + //只修改数据来源不提交 +// if(null != map.get("modifyKeys") && (Objects.equal(map.get("modifyKeys").toString(), "[vlsr]") || Objects.equal(map.get("modifyKeys").toString(), "[valuesr]"))) { +// return null; +// } + String modifyKeys = map.get("modifyKeys").toString().replace("[", "").replace("]", ""); + String[] modifyKeyStr = modifyKeys.split(","); + + for (Map.Entry mapEntry : map.entrySet()) { + //非key的字段不过滤 + if (Objects.equal(mapEntry.getKey(), "stcd") || Objects.equal(mapEntry.getKey(), "blprd") || + Objects.equal(mapEntry.getKey(), "spcd") || Objects.equal(mapEntry.getKey(), "mchgrno") || Objects.equal(mapEntry.getKey(), "vlsr")) { + mapModify.put(mapEntry.getKey(), mapEntry.getValue()); + } + for (int i = 0; i < modifyKeyStr.length; i++) { + //主键不过滤 + if (Objects.equal(modifyKeyStr[i].trim(), mapEntry.getKey())) { + mapModify.put(mapEntry.getKey(), mapEntry.getValue()); + } + } + } + return mapModify; + } + + /** + * 根据给定值,获取其前后的数值 + * @param list + * @param target + * @return + */ + public static BigDecimal[] findNeighbors(List list, BigDecimal target) { + int index = list.indexOf(target); + // 如果找到了目标数字 + if (index >= 0) { + BigDecimal before = (index > 0) ? list.get(index - 1) : null; // 前一个数字 + BigDecimal after = (index < list.size() - 1) ? list.get(index + 1) : null; // 后一个数字 + return new BigDecimal[]{before, after}; + } else { + for(int i = 0; i < list.size(); i++){ + //找到比target大的位置 + if(target.compareTo(list.get(i))<0){ + index=i; + break; + } + } + //取前后的值 + BigDecimal before = (index <= 0) ? null: list.get(index-1); // 前一个数字 + BigDecimal after = (index < 0 || index == list.size()-1)?null:(list.get(index)); // 后一个数字 + return new BigDecimal[]{before, after}; + } + } +} \ No newline at end of file diff --git a/backend/src/main/resources/application-devtw.yml b/backend/src/main/resources/application-devtw.yml index d571469..a2533b1 100644 --- a/backend/src/main/resources/application-devtw.yml +++ b/backend/src/main/resources/application-devtw.yml @@ -11,13 +11,13 @@ spring: master: driverClassName: oracle.jdbc.OracleDriver url: "${DB_MASTER_URL:jdbc:oracle:thin:@172.16.21.134:1521/SDLYZ}" - username: "${DB_MASTER_USERNAME:QGC}" - password: "${DB_MASTER_PASSWORD:ar6Yr7Vxo5}" + username: "${DB_MASTER_USERNAME:QGC_REFA}" + password: "${DB_MASTER_PASSWORD:Y4M4K1oCkL8U}" slave: driverClassName: oracle.jdbc.OracleDriver url: "${DB_SLAVE_URL:jdbc:oracle:thin:@172.16.21.134:1521/SDLYZ}" - username: "${DB_SLAVE_USERNAME:QGC}" - password: "${DB_SLAVE_PASSWORD:ar6Yr7Vxo5}" + username: "${DB_SLAVE_USERNAME:QGC_REFA}" + password: "${DB_SLAVE_PASSWORD:Y4M4K1oCkL8U}" mvc: pathmatch: