From 337da0c4455dfe308de103bb02b75d84afdf8b82 Mon Sep 17 00:00:00 2001 From: tangwei Date: Wed, 15 Apr 2026 11:26:15 +0800 Subject: [PATCH] =?UTF-8?q?feat:=20=E6=96=B0=E5=A2=9E=E6=B0=B4=E6=B8=A9?= =?UTF-8?q?=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