diff --git a/backend/src/main/java/com/yfd/platform/qgc_env/wq/controller/EnvWqDataController.java b/backend/src/main/java/com/yfd/platform/qgc_env/wq/controller/EnvWqDataController.java index 4157bcbe..496df412 100644 --- a/backend/src/main/java/com/yfd/platform/qgc_env/wq/controller/EnvWqDataController.java +++ b/backend/src/main/java/com/yfd/platform/qgc_env/wq/controller/EnvWqDataController.java @@ -23,6 +23,7 @@ public class EnvWqDataController { @Resource private EnvWqDataService envWqDataService; + @PostMapping("/GetKendoListCust") @Operation(summary = "水质统计分析") public ResponseResult getKendoListCust(@RequestBody DataSourceRequest dataSourceRequest) { @@ -106,4 +107,11 @@ public class EnvWqDataController { public ResponseResult getStcdInfo(@RequestParam String stcd) { return ResponseResult.successData(envWqDataService.getStcdInfo(stcd)); } + + + @PostMapping("/rule/GetKendoListCust") + @Operation(summary = "查询水质预警规则列表") + public ResponseResult getRuleKendoListCust(@RequestBody DataSourceRequest dataSourceRequest) { + return ResponseResult.successData(envWqDataService.getWqWarRuleList(dataSourceRequest)); + } } diff --git a/backend/src/main/java/com/yfd/platform/qgc_env/wq/entity/vo/MsWarnRuleDetailBVo.java b/backend/src/main/java/com/yfd/platform/qgc_env/wq/entity/vo/MsWarnRuleDetailBVo.java new file mode 100644 index 00000000..3186f812 --- /dev/null +++ b/backend/src/main/java/com/yfd/platform/qgc_env/wq/entity/vo/MsWarnRuleDetailBVo.java @@ -0,0 +1,96 @@ +package com.yfd.platform.qgc_env.wq.entity.vo; + +import io.swagger.v3.oas.annotations.media.Schema; +import lombok.Data; + +import java.math.BigDecimal; +import java.util.Date; + +@Data +@Schema(description = "水质预警规则明细") +public class MsWarnRuleDetailBVo { + + @Schema(description = "主键") + private String id; + + @Schema(description = "规则主键") + private String ruleId; + + @Schema(description = "监测表主键") + private String tbId; + + @Schema(description = "要素编码") + private String ys; + + @Schema(description = "生效时间") + private Date tm; + + @Schema(description = "开始月日") + private String beginTime; + + @Schema(description = "结束月日") + private String endTime; + + @Schema(description = "最小值") + private BigDecimal minVal; + + @Schema(description = "最大值") + private BigDecimal maxVal; + + @Schema(description = "等级") + private Integer lvl; + + @Schema(description = "等级描述") + private String lvlNote; + + @Schema(description = "站类标识") + private String stty; + + @Schema(description = "持续要求") + private Integer alwyrqst; + + @Schema(description = "环评要求") + private Integer elaeq; + + @Schema(description = "容差系数") + private BigDecimal qecsc; + + @Schema(description = "备注") + private String description; + + @Schema(description = "创建人") + private String recordUser; + + @Schema(description = "创建时间") + private Date recordTime; + + @Schema(description = "更新人") + private String modifyUser; + + @Schema(description = "更新时间") + private Date modifyTime; + + @Schema(description = "是否删除") + private Integer isDeleted; + + @Schema(description = "删除人") + private String deleteUser; + + @Schema(description = "删除时间") + private Date deleteTime; + + @Schema(description = "告警等级") + private Integer warnLevel; + + @Schema(description = "标注") + private String mark; + + @Schema(description = "数据来源") + private String vlsr; + + @Schema(description = "数据来源时间") + private Date vlsrTm; + + @Schema(description = "是否正序") + private Integer isAsc; +} diff --git a/backend/src/main/java/com/yfd/platform/qgc_env/wq/service/EnvWqDataService.java b/backend/src/main/java/com/yfd/platform/qgc_env/wq/service/EnvWqDataService.java index 3d084c72..7bc84531 100644 --- a/backend/src/main/java/com/yfd/platform/qgc_env/wq/service/EnvWqDataService.java +++ b/backend/src/main/java/com/yfd/platform/qgc_env/wq/service/EnvWqDataService.java @@ -24,6 +24,8 @@ public interface EnvWqDataService { DataSourceResult getWbsbList(DataSourceRequest dataSourceRequest); + DataSourceResult getWqWarRuleList(DataSourceRequest dataSourceRequest); + DataSourceResult getStTbYsBVoKendoListCust(String stcd, String tbCode, String startTime, String endTime); DataSourceResult getStTbYsBVoKendoListCust(DataSourceRequest dataSourceRequest); diff --git a/backend/src/main/java/com/yfd/platform/qgc_env/wq/service/impl/EnvWqDataServiceImpl.java b/backend/src/main/java/com/yfd/platform/qgc_env/wq/service/impl/EnvWqDataServiceImpl.java index aa826d93..2debcad5 100644 --- a/backend/src/main/java/com/yfd/platform/qgc_env/wq/service/impl/EnvWqDataServiceImpl.java +++ b/backend/src/main/java/com/yfd/platform/qgc_env/wq/service/impl/EnvWqDataServiceImpl.java @@ -1648,6 +1648,293 @@ public class EnvWqDataServiceImpl implements EnvWqDataService { return result; } + @Override + public DataSourceResult getWqWarRuleList(DataSourceRequest dataSourceRequest) { + DataSourceLoadOptionsBase loadOptions = dataSourceRequest == null ? null : dataSourceRequest.toDevRequest(); + StringBuilder sql = new StringBuilder(); + sql.append("SELECT ") + .append("d.ID AS id, ") + .append("d.RULE_ID AS ruleId, ") + .append("d.TB_ID AS tbId, ") + .append("d.YS AS ys, ") + .append("d.TM AS tm, ") + .append("d.BEGIN_TIME AS beginTime, ") + .append("d.END_TIME AS endTime, ") + .append("d.MIN_VAL AS minVal, ") + .append("d.MAX_VAL AS maxVal, ") + .append("d.LVL AS lvl, ") + .append("d.LVL_NOTE AS lvlNote, ") + .append("d.STTY AS stty, ") + .append("d.ALWYRQST AS alwyrqst, ") + .append("d.ELAEQ AS elaeq, ") + .append("d.QECSC AS qecsc, ") + .append("d.DESCRIPTION AS description, ") + .append("d.RECORD_USER AS recordUser, ") + .append("d.RECORD_TIME AS recordTime, ") + .append("d.MODIFY_USER AS modifyUser, ") + .append("d.MODIFY_TIME AS modifyTime, ") + .append("d.IS_DELETED AS isDeleted, ") + .append("d.DELETE_USER AS deleteUser, ") + .append("d.DELETE_TIME AS deleteTime, ") + .append("d.WARN_LEVEL AS warnLevel, ") + .append("d.MARK AS mark, ") + .append("d.VLSR AS vlsr, ") + .append("d.VLSR_TM AS vlsrTm ") + .append("FROM MS_WARN_RULE_DETAIL_B d ") + .append("WHERE NVL(d.IS_DELETED, 0) = 0 ") + .append(" AND d.TB_ID = (SELECT tb.ID FROM ST_TB_B tb ") + .append(" WHERE tb.TB_CODE = 'WQ_R' AND NVL(tb.IS_DELETED, 0) = 0 AND ROWNUM = 1) ") + .append(" AND d.RULE_ID = (SELECT r.ID FROM MS_WARN_RULE_B r ") + .append(" WHERE r.RULE_TYPE = 'WQLVL' AND NVL(r.IS_DELETED, 0) = 0 AND ROWNUM = 1) ") + .append(" AND d.LVL = (SELECT station.WWQTG FROM (") + .append(buildWqWarRuleStationSql()) + .append(") station WHERE 1 = 1 "); + + Map paramMap = new HashMap<>(); + String filterSql = buildWqWarRuleStationFilterCondition( + dataSourceRequest == null ? null : dataSourceRequest.getFilter(), + paramMap, + new int[]{0} + ); + if (StrUtil.isNotBlank(filterSql)) { + sql.append(" AND ").append(filterSql).append(" "); + } + sql.append(" AND station.WWQTG IS NOT NULL AND ROWNUM = 1) "); + sql.append(buildWqWarRuleOrderBySql(dataSourceRequest == null ? null : dataSourceRequest.getSort())); + + Page page = loadOptions == null ? null : QgcQueryWrapperUtil.buildPage(loadOptions, loadOptions.getSkip(), loadOptions.getTake()); + List list = microservicDynamicSQLMapper.pageAllListWithResultType( + page, + sql.toString(), + paramMap, + MsWarnRuleDetailBVo.class + ); + fillWqWarRuleSort(list); + + DataSourceResult result = new DataSourceResult<>(); + result.setData(list); + result.setTotal(page != null ? page.getTotal() : list.size()); + result.setAggregates(new HashMap<>()); + return result; + } + + private String buildWqWarRuleStationSql() { + return "SELECT " + + "t.WWQTG AS WWQTG, " + + "NVL(t.IS_DELETED, 0) AS ISDELETED, " + + "t.STTP AS STTPCODE, " + + "t.MWAY AS MWAY, " + + "t.DTIN_TYPE AS DTINTYPE, " + + "t.STCD AS STCD, " + + "t.STNM AS STNM, " + + "t.FHSTCD AS FHSTCD, " + + "t.DTIN AS DTIN, " + + "t.RSTCD AS RSTCD, " + + "eng.ENNM AS ENNM, " + + "eng.BASE_ID AS BASEID, " + + "eng.HBRVCD AS HBRVCD, " + + "eng.RVCD AS RVCD, " + + "eng.ADDVCD AS ADDVCD, " + + "t.TM AS TM, " + + "t.JCDT AS JCDT, " + + "t.WDDT AS WDDT, " + + "t.DTIN_TM AS DTINTM " + + "FROM SD_WQ_B_H t " + + "LEFT JOIN SD_ENGINFO_B_H eng ON eng.STCD = t.RSTCD AND NVL(eng.IS_DELETED, 0) = 0 " + + "WHERE NVL(t.IS_DELETED, 0) = 0 "; + } + + private String buildWqWarRuleStationFilterCondition(DataSourceRequest.FilterDescriptor filter, + Map paramMap, + int[] indexHolder) { + if (filter == null) { + return ""; + } + if (StrUtil.isNotBlank(filter.getField())) { + return buildWqWarRuleStationLeafCondition(filter, paramMap, indexHolder); + } + if (CollUtil.isEmpty(filter.getFilters())) { + return ""; + } + List conditions = new ArrayList<>(); + for (DataSourceRequest.FilterDescriptor child : filter.getFilters()) { + String childSql = buildWqWarRuleStationFilterCondition(child, paramMap, indexHolder); + if (StrUtil.isNotBlank(childSql)) { + conditions.add("(" + childSql + ")"); + } + } + if (conditions.isEmpty()) { + return ""; + } + String logic = "or".equalsIgnoreCase(filter.getLogic()) ? " OR " : " AND "; + return String.join(logic, conditions); + } + + private String buildWqWarRuleStationLeafCondition(DataSourceRequest.FilterDescriptor filter, + Map paramMap, + int[] indexHolder) { + String column = mapWqWarRuleStationColumn(filter.getField()); + if (StrUtil.isBlank(column)) { + return ""; + } + String operator = StrUtil.blankToDefault(filter.getOperator(), "eq").toLowerCase(); + Object value = filter.getValue(); + boolean dateField = isWqWarRuleDateField(filter.getField()); + + if ("isnull".equals(operator)) { + return column + " IS NULL"; + } + if ("isnotnull".equals(operator)) { + return column + " IS NOT NULL"; + } + if ("in".equals(operator)) { + List values = normalizeMsstbprptValues(value); + if (values.isEmpty()) { + return ""; + } + List placeholders = new ArrayList<>(); + for (Object item : values) { + String paramKey = "wqWarP" + indexHolder[0]++; + paramMap.put(paramKey, item); + placeholders.add(dateField + ? "TO_DATE(#{map." + paramKey + "}, 'YYYY-MM-DD HH24:MI:SS')" + : "#{map." + paramKey + "}"); + } + return column + " IN (" + String.join(", ", placeholders) + ")"; + } + + String paramKey = "wqWarP" + indexHolder[0]++; + switch (operator) { + case "eq": + paramMap.put(paramKey, value); + return dateField ? column + " = TO_DATE(#{map." + paramKey + "}, 'YYYY-MM-DD HH24:MI:SS')" : column + " = #{map." + paramKey + "}"; + case "neq": + paramMap.put(paramKey, value); + return dateField ? column + " <> TO_DATE(#{map." + paramKey + "}, 'YYYY-MM-DD HH24:MI:SS')" : column + " <> #{map." + paramKey + "}"; + case "contains": + paramMap.put(paramKey, "%" + value + "%"); + return column + " LIKE #{map." + paramKey + "}"; + case "startswith": + paramMap.put(paramKey, value + "%"); + return column + " LIKE #{map." + paramKey + "}"; + case "endswith": + paramMap.put(paramKey, "%" + value); + return column + " LIKE #{map." + paramKey + "}"; + case "gt": + paramMap.put(paramKey, value); + return dateField ? column + " > TO_DATE(#{map." + paramKey + "}, 'YYYY-MM-DD HH24:MI:SS')" : column + " > #{map." + paramKey + "}"; + case "gte": + paramMap.put(paramKey, value); + return dateField ? column + " >= TO_DATE(#{map." + paramKey + "}, 'YYYY-MM-DD HH24:MI:SS')" : column + " >= #{map." + paramKey + "}"; + case "lt": + paramMap.put(paramKey, value); + return dateField ? column + " < TO_DATE(#{map." + paramKey + "}, 'YYYY-MM-DD HH24:MI:SS')" : column + " < #{map." + paramKey + "}"; + case "lte": + paramMap.put(paramKey, value); + return dateField ? column + " <= TO_DATE(#{map." + paramKey + "}, 'YYYY-MM-DD HH24:MI:SS')" : column + " <= #{map." + paramKey + "}"; + default: + return ""; + } + } + + private String mapWqWarRuleStationColumn(String field) { + if (StrUtil.isBlank(field)) { + return null; + } + return switch (field) { + case "isDeleted" -> "station.ISDELETED"; + case "sttpCode" -> "station.STTPCODE"; + case "mway" -> "station.MWAY"; + case "dtinType" -> "station.DTINTYPE"; + case "stcd" -> "station.STCD"; + case "stnm" -> "station.STNM"; + case "fhstcd" -> "station.FHSTCD"; + case "baseId" -> "station.BASEID"; + case "dtin" -> "station.DTIN"; + case "rstcd" -> "station.RSTCD"; + case "ennm" -> "station.ENNM"; + case "hbrvcd" -> "station.HBRVCD"; + case "rvcd" -> "station.RVCD"; + case "addvcd" -> "station.ADDVCD"; + case "wwqtg" -> "station.WWQTG"; + case "tm" -> "station.TM"; + case "jcdt" -> "station.JCDT"; + case "wddt" -> "station.WDDT"; + case "dtinTm" -> "station.DTINTM"; + default -> null; + }; + } + + private boolean isWqWarRuleDateField(String field) { + if (StrUtil.isBlank(field)) { + return false; + } + return "tm".equalsIgnoreCase(field) + || "jcdt".equalsIgnoreCase(field) + || "wddt".equalsIgnoreCase(field) + || "dtinTm".equalsIgnoreCase(field); + } + + private String buildWqWarRuleOrderBySql(List sortList) { + if (CollUtil.isEmpty(sortList)) { + return " ORDER BY d.YS ASC, d.LVL ASC, d.TM DESC "; + } + List orderColumns = new ArrayList<>(); + for (DataSourceRequest.SortDescriptor sortDescriptor : sortList) { + if (sortDescriptor == null || StrUtil.isBlank(sortDescriptor.getField())) { + continue; + } + String column = switch (sortDescriptor.getField()) { + case "ys" -> "d.YS"; + case "lvl" -> "d.LVL"; + case "lvlNote" -> "d.LVL_NOTE"; + case "minVal" -> "d.MIN_VAL"; + case "maxVal" -> "d.MAX_VAL"; + case "tm" -> "d.TM"; + case "beginTime" -> "d.BEGIN_TIME"; + case "endTime" -> "d.END_TIME"; + case "warnLevel" -> "d.WARN_LEVEL"; + case "mark" -> "d.MARK"; + case "description" -> "d.DESCRIPTION"; + case "vlsrTm" -> "d.VLSR_TM"; + default -> null; + }; + if (StrUtil.isBlank(column)) { + continue; + } + String dir = "desc".equalsIgnoreCase(sortDescriptor.getDir()) || "des".equalsIgnoreCase(sortDescriptor.getDir()) ? "DESC" : "ASC"; + orderColumns.add(column + " " + dir + " NULLS LAST"); + } + if (orderColumns.isEmpty()) { + return " ORDER BY d.YS ASC, d.LVL ASC, d.TM DESC "; + } + return " ORDER BY " + String.join(", ", orderColumns) + " "; + } + + private void fillWqWarRuleSort(List list) { + if (CollUtil.isEmpty(list)) { + return; + } + String sql = "SELECT ys AS ys, CASE WHEN lvl = dr THEN 1 ELSE 0 END AS isAsc " + + "FROM ( " + + " SELECT T.ys AS ys, T.lvl AS lvl, DENSE_RANK() OVER (PARTITION BY T.ys ORDER BY T.MIN_VAL) AS dr " + + " FROM (SELECT * FROM MS_WARN_RULE_DETAIL_B " + + " WHERE NVL(IS_DELETED, 0) = 0 " + + " AND TB_ID = (SELECT ID FROM ST_TB_B WHERE TB = 'SD_WQ_R' AND TB_CODE = 'WQ_R' AND NVL(IS_DELETED, 0) = 0 AND ROWNUM = 1) " + + " AND RULE_ID = (SELECT ID FROM MS_WARN_RULE_B WHERE RULE_TYPE = 'WQLVL' AND NVL(IS_DELETED, 0) = 0 AND ROWNUM = 1) " + + " ) T " + + ") WHERE lvl = 1"; + List sortList = microservicDynamicSQLMapper.getAllListWithResultType( + sql, + new HashMap<>(), + MsWarnRuleDetailBVo.class + ); + Map ysRuleSortMap = sortList.stream() + .filter(item -> StrUtil.isNotBlank(item.getYs())) + .collect(Collectors.toMap(MsWarnRuleDetailBVo::getYs, MsWarnRuleDetailBVo::getIsAsc, (left, right) -> left)); + list.forEach(item -> item.setIsAsc(ysRuleSortMap.get(item.getYs()))); + } + private String buildVmsstbprptFilterCondition(DataSourceRequest.FilterDescriptor filter, Map paramMap, int[] indexHolder,