feat: 查询水质预警规则列表

This commit is contained in:
tangwei 2026-06-01 20:23:45 +08:00
parent 81b3b8b981
commit 75bbb0a65e
4 changed files with 393 additions and 0 deletions

View File

@ -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));
}
}

View File

@ -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;
}

View File

@ -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);

View File

@ -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<String, Object> 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<MsWarnRuleDetailBVo> list = microservicDynamicSQLMapper.pageAllListWithResultType(
page,
sql.toString(),
paramMap,
MsWarnRuleDetailBVo.class
);
fillWqWarRuleSort(list);
DataSourceResult<MsWarnRuleDetailBVo> 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<String, Object> paramMap,
int[] indexHolder) {
if (filter == null) {
return "";
}
if (StrUtil.isNotBlank(filter.getField())) {
return buildWqWarRuleStationLeafCondition(filter, paramMap, indexHolder);
}
if (CollUtil.isEmpty(filter.getFilters())) {
return "";
}
List<String> 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<String, Object> 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<Object> values = normalizeMsstbprptValues(value);
if (values.isEmpty()) {
return "";
}
List<String> 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<DataSourceRequest.SortDescriptor> sortList) {
if (CollUtil.isEmpty(sortList)) {
return " ORDER BY d.YS ASC, d.LVL ASC, d.TM DESC ";
}
List<String> 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<MsWarnRuleDetailBVo> 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<MsWarnRuleDetailBVo> sortList = microservicDynamicSQLMapper.getAllListWithResultType(
sql,
new HashMap<>(),
MsWarnRuleDetailBVo.class
);
Map<String, Integer> 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<String, Object> paramMap,
int[] indexHolder,