diff --git a/backend/src/main/java/com/yfd/platform/env/fh/controller/FhHabitatController.java b/backend/src/main/java/com/yfd/platform/env/fh/controller/FhHabitatController.java index e7b94d2..dcfac12 100644 --- a/backend/src/main/java/com/yfd/platform/env/fh/controller/FhHabitatController.java +++ b/backend/src/main/java/com/yfd/platform/env/fh/controller/FhHabitatController.java @@ -40,6 +40,18 @@ public class FhHabitatController { return ResponseResult.successData(fhHabitatService.getDefaultFhList(fhDefaultAo)); } + @PostMapping("/sdrvwts/GetKendoList") + @Operation(summary = "查询栖息地河道水温日统计数据") + public ResponseResult getSdrvwtsList(@RequestBody DataSourceRequest dataSourceRequest) { + return ResponseResult.successData(fhHabitatService.getSdrvwtsList(dataSourceRequest)); + } + + @PostMapping("/msstbprpt/GetKendoList") + @Operation(summary = "查询栖息地监测站点列表") + public ResponseResult getMsstbprptList(@RequestBody DataSourceRequest dataSourceRequest) { + return ResponseResult.successData(fhHabitatService.getMsstbprptList(dataSourceRequest)); + } + @PostMapping("/stTbYs/GetStTbYsBVoKendoListCust") @Operation(summary = "水质监测信息查询") public ResponseResult getStTbYsBVoKendoListCust(@RequestBody DataSourceRequest dataSourceRequest) { diff --git a/backend/src/main/java/com/yfd/platform/env/fh/entity/vo/FhMsstbprptVo.java b/backend/src/main/java/com/yfd/platform/env/fh/entity/vo/FhMsstbprptVo.java new file mode 100644 index 0000000..9ca7df5 --- /dev/null +++ b/backend/src/main/java/com/yfd/platform/env/fh/entity/vo/FhMsstbprptVo.java @@ -0,0 +1,80 @@ +package com.yfd.platform.env.fh.entity.vo; + +import io.swagger.v3.oas.annotations.media.Schema; +import lombok.Data; + +import java.io.Serializable; +import java.util.Date; + +@Data +@Schema(description = "栖息地关联监测站点") +public class FhMsstbprptVo implements Serializable { + + private static final long serialVersionUID = 1L; + + @Schema(description = "站码") + private String stcd; + + @Schema(description = "站名") + private String stnm; + + @Schema(description = "站类") + private String sttpCode; + + @Schema(description = "所属栖息地编码") + private String fhstcd; + + @Schema(description = "所属栖息地名称") + private String fhstnm; + + @Schema(description = "所属电站编码") + private String rstcd; + + @Schema(description = "所属电站名称") + private String ennm; + + @Schema(description = "基地编码") + private String baseId; + + @Schema(description = "基地名称") + private String baseName; + + @Schema(description = "基地流域编码") + private String hbrvcd; + + @Schema(description = "建成日期") + private Date jcdt; + + @Schema(description = "监测方式") + private Integer mway; + + @Schema(description = "数据是否接入") + private Integer dtin; + + @Schema(description = "数据接入来源") + private String dtinSrc; + + @Schema(description = "数据接入类型") + private Integer dtinType; + + @Schema(description = "数据接入开始时间") + private Date dtinTm; + + @Schema(description = "监测指标") + private String stindx; + + @Schema(description = "是否启用") + private Integer usfl; + + @Schema(description = "基地排序") + private Integer baseStepSort; + + @Schema(description = "流域排序") + private Integer rvcdStepSort; + + @Schema(description = "电站排序") + private Integer rstcdStepSort; + + @Schema(description = "站点排序") + private Integer siteStepSort; +} diff --git a/backend/src/main/java/com/yfd/platform/env/fh/entity/vo/FhSdrvwtsVo.java b/backend/src/main/java/com/yfd/platform/env/fh/entity/vo/FhSdrvwtsVo.java new file mode 100644 index 0000000..baafa01 --- /dev/null +++ b/backend/src/main/java/com/yfd/platform/env/fh/entity/vo/FhSdrvwtsVo.java @@ -0,0 +1,29 @@ +package com.yfd.platform.env.fh.entity.vo; + +import com.fasterxml.jackson.annotation.JsonFormat; +import io.swagger.v3.oas.annotations.media.Schema; +import lombok.Data; + +import java.io.Serializable; +import java.math.BigDecimal; +import java.util.Date; + +@Data +@Schema(description = "栖息地河道水温日统计数据") +public class FhSdrvwtsVo implements Serializable { + + private static final long serialVersionUID = 1L; + + @Schema(description = "主键ID") + private String id; + + @Schema(description = "站码") + private String stcd; + + @Schema(description = "时间") + @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss", timezone = "GMT+8") + private Date dt; + + @Schema(description = "水温") + private BigDecimal wt; +} diff --git a/backend/src/main/java/com/yfd/platform/env/fh/service/FhHabitatService.java b/backend/src/main/java/com/yfd/platform/env/fh/service/FhHabitatService.java index 9298fd8..d0d5d8d 100644 --- a/backend/src/main/java/com/yfd/platform/env/fh/service/FhHabitatService.java +++ b/backend/src/main/java/com/yfd/platform/env/fh/service/FhHabitatService.java @@ -14,5 +14,9 @@ public interface FhHabitatService { FhDefaultVo getDefaultFhList(FhDefaultAo fhDefaultAo); + DataSourceResult getSdrvwtsList(DataSourceRequest dataSourceRequest); + + DataSourceResult getMsstbprptList(DataSourceRequest dataSourceRequest); + DataSourceResult getStTbYsBVoKendoListCust(DataSourceRequest dataSourceRequest); } diff --git a/backend/src/main/java/com/yfd/platform/env/fh/service/impl/FhHabitatServiceImpl.java b/backend/src/main/java/com/yfd/platform/env/fh/service/impl/FhHabitatServiceImpl.java index b52d513..af55291 100644 --- a/backend/src/main/java/com/yfd/platform/env/fh/service/impl/FhHabitatServiceImpl.java +++ b/backend/src/main/java/com/yfd/platform/env/fh/service/impl/FhHabitatServiceImpl.java @@ -15,6 +15,8 @@ import com.yfd.platform.common.PageInfo; import com.yfd.platform.env.fh.entity.ao.FhDefaultAo; import com.yfd.platform.env.fh.entity.vo.FhDefaultVo; import com.yfd.platform.env.fh.entity.vo.HabitatVo; +import com.yfd.platform.env.fh.entity.vo.FhMsstbprptVo; +import com.yfd.platform.env.fh.entity.vo.FhSdrvwtsVo; import com.yfd.platform.env.fh.service.FhHabitatService; import com.yfd.platform.env.wq.entity.vo.StTbYsVo; import com.yfd.platform.utils.QgcQueryWrapperUtil; @@ -159,6 +161,55 @@ public class FhHabitatServiceImpl implements FhHabitatService { return result.get(0); } + @Override + public DataSourceResult getSdrvwtsList(DataSourceRequest dataSourceRequest) { + DataSourceLoadOptionsBase loadOptions = dataSourceRequest == null ? null : dataSourceRequest.toDevRequest(); + StringBuilder sql = new StringBuilder(); + sql.append("SELECT ") + .append("t.ID AS id, ") + .append("t.STCD AS stcd, ") + .append("t.DT AS dt, ") + .append("t.WT AS wt ") + .append("FROM SD_WTRVDAY_S t ") + .append("WHERE NVL(t.IS_DELETED, 0) = 0 "); + + Map paramMap = new HashMap<>(); + String filterSql = buildSdrvwtsFilterCondition( + dataSourceRequest == null ? null : dataSourceRequest.getFilter(), + paramMap, + new int[]{0} + ); + if (StrUtil.isNotBlank(filterSql)) { + sql.append(" AND ").append(filterSql).append(" "); + } + + GroupingInfo[] groups = loadOptions == null ? null : loadOptions.getGroup(); + if (groups != null && groups.length > 0) { + String groupSql = buildGroupSql(sql.toString(), groups); + List> groupRows = microservicDynamicSQLMapper.pageAllList(null, groupSql, paramMap); + DataSourceResult result = new DataSourceResult<>(); + if (Boolean.TRUE.equals(dataSourceRequest.getGroupResultFlat())) { + result.setData((List) (List) new GroupHelper().faltGroup(groupRows, Arrays.asList(groups))); + } else { + result.setData((List) (List) new GroupHelper().group(groupRows, Arrays.asList(groups))); + } + result.setTotal(0L); + result.setAggregates(new HashMap<>()); + return result; + } + + sql.append(buildSdrvwtsOrderBySql(dataSourceRequest == null ? null : dataSourceRequest.getSort())); + PageInfo pageInfo = loadOptions == null ? null : QgcQueryWrapperUtil.getPageInfo(loadOptions); + Page page = pageInfo != null && pageInfo.getHasPageInfo() ? pageInfo.getPage() : null; + List list = microservicDynamicSQLMapper.pageAllListWithResultType(page, sql.toString(), paramMap, FhSdrvwtsVo.class); + + DataSourceResult result = new DataSourceResult<>(); + result.setData(list); + result.setTotal(page != null ? page.getTotal() : list.size()); + result.setAggregates(new HashMap<>()); + return result; + } + private String buildDefaultFhListSql(FhDefaultAo fhDefaultAo) { String dateConditionWtrv = ""; String dateConditionZq = ""; @@ -870,6 +921,427 @@ public class FhHabitatServiceImpl implements FhHabitatService { return " ORDER BY " + String.join(", ", orderItems); } + @Override + public DataSourceResult getMsstbprptList(DataSourceRequest dataSourceRequest) { + DataSourceLoadOptionsBase loadOptions = dataSourceRequest == null ? null : dataSourceRequest.toDevRequest(); + String sttpCode = findFilterFieldValue(dataSourceRequest == null ? null : dataSourceRequest.getFilter(), "sttpCode"); + if (StrUtil.isBlank(sttpCode) && loadOptions != null) { + sttpCode = QgcQueryWrapperUtil.getFilterFieldValue(loadOptions, "sttpCode"); + } + + StringBuilder sql = new StringBuilder(buildFhMsstbprptBaseSql(sttpCode)); + Map paramMap = new HashMap<>(); + String filterSql = buildFhMsstbprptFilterCondition( + dataSourceRequest == null ? null : dataSourceRequest.getFilter(), + paramMap, + new int[]{0} + ); + if (StrUtil.isNotBlank(filterSql)) { + sql.append(" AND ").append(filterSql).append(" "); + } + + GroupingInfo[] groups = loadOptions == null ? null : loadOptions.getGroup(); + if (groups != null && groups.length > 0) { + String groupSql = buildGroupSql(sql.toString(), groups); + List> groupRows = microservicDynamicSQLMapper.pageAllList(null, groupSql, paramMap); + DataSourceResult result = new DataSourceResult(); + if (Boolean.TRUE.equals(dataSourceRequest.getGroupResultFlat())) { + result.setData(new GroupHelper().faltGroup(groupRows, Arrays.asList(groups))); + } else { + result.setData(new GroupHelper().group(groupRows, Arrays.asList(groups))); + } + result.setTotal(0L); + result.setAggregates(new HashMap<>()); + return result; + } + + sql.append(buildFhMsstbprptOrderBySql(dataSourceRequest == null ? null : dataSourceRequest.getSort())); + PageInfo pageInfo = loadOptions == null ? null : QgcQueryWrapperUtil.getPageInfo(loadOptions); + Page page = pageInfo != null && pageInfo.getHasPageInfo() ? pageInfo.getPage() : null; + List list = microservicDynamicSQLMapper.pageAllListWithResultType(page, sql.toString(), paramMap, FhMsstbprptVo.class); + + DataSourceResult result = new DataSourceResult<>(); + result.setData(list); + result.setTotal(page != null ? page.getTotal() : list.size()); + result.setAggregates(new HashMap<>()); + return result; + } + + private String buildFhMsstbprptBaseSql(String sttpCode) { + boolean onlyRiver = "ZQ".equalsIgnoreCase(StrUtil.trim(sttpCode)); + boolean onlyWtrv = "WTRV".equalsIgnoreCase(StrUtil.trim(sttpCode)); + StringBuilder sql = new StringBuilder(); + sql.append("SELECT * FROM ("); + if (!onlyWtrv) { + sql.append("SELECT river.STCD AS stcd, ") + .append("river.STNM AS stnm, ") + .append("'ZQ' AS sttpCode, ") + .append("river.FHSTCD AS fhstcd, ") + .append("fh.STNM AS fhstnm, ") + .append("river.RSTCD AS rstcd, ") + .append("eng.ENNM AS ennm, ") + .append("NVL(fh.BASE_ID, eng.BASE_ID) AS baseId, ") + .append("hb.BASENAME AS baseName, ") + .append("NVL(fh.HBRVCD, eng.HBRVCD) AS hbrvcd, ") + .append("river.JCDT AS jcdt, ") + .append("river.MWAY AS mway, ") + .append("river.DTIN AS dtin, ") + .append("river.DTIN_SRC AS dtinSrc, ") + .append("river.DTIN_TYPE AS dtinType, ") + .append("river.DTIN_TM AS dtinTm, ") + .append("river.STINDX AS stindx, ") + .append("river.USFL AS usfl, ") + .append("NVL(hb.ORDER_INDEX, 999999) AS baseStepSort, ") + .append("999999 AS rvcdStepSort, ") + .append("NVL(eng.ORDER_INDEX, 999999) AS rstcdStepSort, ") + .append("NVL(river.ORDER_INDEX, 999999) AS siteStepSort ") + .append("FROM SD_RIVER_B_H river ") + .append("LEFT JOIN SD_FHBT_B_H fh ON fh.STCD = river.FHSTCD AND NVL(fh.IS_DELETED, 0) = 0 ") + .append("LEFT JOIN SD_ENGINFO_B_H eng ON eng.STCD = river.RSTCD AND NVL(eng.IS_DELETED, 0) = 0 ") + .append("LEFT JOIN SD_HYDROBASE hb ON hb.BASEID = NVL(fh.BASE_ID, eng.BASE_ID) AND NVL(hb.IS_DELETED, 0) = 0 ") + .append("WHERE NVL(river.IS_DELETED, 0) = 0 ") + .append("AND river.STTP = 'ZQ' ") + .append("AND river.FHSTCD IS NOT NULL "); + } + if (!onlyRiver && !onlyWtrv) { + sql.append(" UNION ALL "); + } + if (!onlyRiver) { + sql.append("SELECT wt.STCD AS stcd, ") + .append("wt.STNM AS stnm, ") + .append("'WTRV' AS sttpCode, ") + .append("wt.FHSTCD AS fhstcd, ") + .append("fh.STNM AS fhstnm, ") + .append("wt.RSTCD AS rstcd, ") + .append("eng.ENNM AS ennm, ") + .append("NVL(fh.BASE_ID, eng.BASE_ID) AS baseId, ") + .append("hb.BASENAME AS baseName, ") + .append("NVL(fh.HBRVCD, eng.HBRVCD) AS hbrvcd, ") + .append("wt.JCDT AS jcdt, ") + .append("wt.MWAY AS mway, ") + .append("wt.DTIN AS dtin, ") + .append("wt.DTIN_SRC AS dtinSrc, ") + .append("wt.DTIN_TYPE AS dtinType, ") + .append("wt.DTIN_TM AS dtinTm, ") + .append("wt.STINDX AS stindx, ") + .append("wt.USFL AS usfl, ") + .append("NVL(hb.ORDER_INDEX, 999999) AS baseStepSort, ") + .append("999999 AS rvcdStepSort, ") + .append("NVL(eng.ORDER_INDEX, 999999) AS rstcdStepSort, ") + .append("NVL(wt.ORDER_INDEX, 999999) AS siteStepSort ") + .append("FROM SD_WT_B_H wt ") + .append("LEFT JOIN SD_FHBT_B_H fh ON fh.STCD = wt.FHSTCD AND NVL(fh.IS_DELETED, 0) = 0 ") + .append("LEFT JOIN SD_ENGINFO_B_H eng ON eng.STCD = wt.RSTCD AND NVL(eng.IS_DELETED, 0) = 0 ") + .append("LEFT JOIN SD_HYDROBASE hb ON hb.BASEID = NVL(fh.BASE_ID, eng.BASE_ID) AND NVL(hb.IS_DELETED, 0) = 0 ") + .append("WHERE NVL(wt.IS_DELETED, 0) = 0 ") + .append("AND wt.STTP = 'WTRV' ") + .append("AND wt.FHSTCD IS NOT NULL "); + } + sql.append(") t WHERE 1 = 1 "); + return sql.toString(); + } + + private String buildFhMsstbprptFilterCondition(DataSourceRequest.FilterDescriptor filter, + Map paramMap, + int[] indexHolder) { + if (filter == null) { + return ""; + } + if (StrUtil.isNotBlank(filter.getField())) { + return buildFhMsstbprptLeafCondition(filter, paramMap, indexHolder); + } + if (CollUtil.isEmpty(filter.getFilters())) { + return ""; + } + List conditions = new ArrayList<>(); + for (DataSourceRequest.FilterDescriptor child : filter.getFilters()) { + String childSql = buildFhMsstbprptFilterCondition(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 buildFhMsstbprptLeafCondition(DataSourceRequest.FilterDescriptor filter, + Map paramMap, + int[] indexHolder) { + String column = mapFhMsstbprptColumn(filter.getField()); + if (StrUtil.isBlank(column)) { + return ""; + } + String operator = StrUtil.blankToDefault(filter.getOperator(), "eq").toLowerCase(); + Object value = filter.getValue(); + if ("isnull".equals(operator)) { + return column + " IS NULL"; + } + if ("isnotnull".equals(operator)) { + return column + " IS NOT NULL"; + } + if ("in".equals(operator)) { + List values = normalizeFilterValues(value); + if (values.isEmpty()) { + return ""; + } + List placeholders = new ArrayList<>(); + for (Object item : values) { + String paramKey = "fhMsParam" + indexHolder[0]++; + paramMap.put(paramKey, item); + placeholders.add("#{map." + paramKey + "}"); + } + return column + " IN (" + String.join(", ", placeholders) + ")"; + } + String paramKey = "fhMsParam" + indexHolder[0]++; + switch (operator) { + case "eq": + paramMap.put(paramKey, value); + return column + " = #{map." + paramKey + "}"; + case "neq": + paramMap.put(paramKey, value); + return 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 column + " > #{map." + paramKey + "}"; + case "gte": + paramMap.put(paramKey, value); + return column + " >= #{map." + paramKey + "}"; + case "lt": + paramMap.put(paramKey, value); + return column + " < #{map." + paramKey + "}"; + case "lte": + paramMap.put(paramKey, value); + return column + " <= #{map." + paramKey + "}"; + default: + return ""; + } + } + + private String mapFhMsstbprptColumn(String field) { + if (StrUtil.isBlank(field)) { + return null; + } + return switch (field) { + case "stcd" -> "t.stcd"; + case "stnm" -> "t.stnm"; + case "sttpCode" -> "t.sttpCode"; + case "fhstcd" -> "t.fhstcd"; + case "fhstnm" -> "t.fhstnm"; + case "rstcd" -> "t.rstcd"; + case "ennm" -> "t.ennm"; + case "baseId" -> "t.baseId"; + case "baseName" -> "t.baseName"; + case "hbrvcd" -> "t.hbrvcd"; + case "jcdt" -> "t.jcdt"; + case "mway" -> "t.mway"; + case "dtin" -> "t.dtin"; + case "dtinSrc" -> "t.dtinSrc"; + case "dtinType" -> "t.dtinType"; + case "dtinTm" -> "t.dtinTm"; + case "stindx" -> "t.stindx"; + case "usfl", "enable" -> "t.usfl"; + case "baseStepSort" -> "t.baseStepSort"; + case "rvcdStepSort" -> "t.rvcdStepSort"; + case "rstcdStepSort" -> "t.rstcdStepSort"; + case "siteStepSort" -> "t.siteStepSort"; + default -> null; + }; + } + + private String buildFhMsstbprptOrderBySql(List sortList) { + if (CollUtil.isEmpty(sortList)) { + return " ORDER BY t.baseStepSort ASC, t.rvcdStepSort ASC, t.rstcdStepSort ASC, t.siteStepSort ASC, t.stcd ASC"; + } + List orders = new ArrayList<>(); + for (DataSourceRequest.SortDescriptor sortDescriptor : sortList) { + if (sortDescriptor == null || StrUtil.isBlank(sortDescriptor.getField())) { + continue; + } + String column = mapFhMsstbprptColumn(sortDescriptor.getField()); + if (StrUtil.isBlank(column)) { + continue; + } + String dir = ("desc".equalsIgnoreCase(sortDescriptor.getDir()) || "des".equalsIgnoreCase(sortDescriptor.getDir())) ? "DESC" : "ASC"; + orders.add(column + " " + dir); + } + if (orders.isEmpty()) { + return " ORDER BY t.baseStepSort ASC, t.rvcdStepSort ASC, t.rstcdStepSort ASC, t.siteStepSort ASC, t.stcd ASC"; + } + return " ORDER BY " + String.join(", ", orders); + } + + private String buildSdrvwtsFilterCondition(DataSourceRequest.FilterDescriptor filter, + Map paramMap, + int[] indexHolder) { + if (filter == null) { + return ""; + } + if (StrUtil.isNotBlank(filter.getField())) { + return buildSdrvwtsLeafCondition(filter, paramMap, indexHolder); + } + if (CollUtil.isEmpty(filter.getFilters())) { + return ""; + } + List conditions = new ArrayList<>(); + for (DataSourceRequest.FilterDescriptor child : filter.getFilters()) { + String childSql = buildSdrvwtsFilterCondition(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 buildSdrvwtsLeafCondition(DataSourceRequest.FilterDescriptor filter, + Map paramMap, + int[] indexHolder) { + String column = mapSdrvwtsColumn(filter.getField()); + if (StrUtil.isBlank(column)) { + return ""; + } + String operator = StrUtil.blankToDefault(filter.getOperator(), "eq").toLowerCase(); + Object value = filter.getValue(); + if ("isnull".equals(operator)) { + return column + " IS NULL"; + } + if ("isnotnull".equals(operator)) { + return column + " IS NOT NULL"; + } + boolean dateField = isSdrvwtsDateField(filter.getField()); + if ("in".equals(operator)) { + List values = normalizeFilterValues(value); + if (values.isEmpty()) { + return ""; + } + List placeholders = new ArrayList<>(); + for (Object item : values) { + String paramKey = "fhWtParam" + indexHolder[0]++; + paramMap.put(paramKey, item); + placeholders.add(buildSdrvwtsValueExpr(paramKey, dateField, item)); + } + return column + " IN (" + String.join(", ", placeholders) + ")"; + } + + String paramKey = "fhWtParam" + indexHolder[0]++; + String valueExpr = buildSdrvwtsValueExpr(paramKey, dateField, value); + switch (operator) { + case "eq": + paramMap.put(paramKey, value); + return column + " = " + valueExpr; + case "neq": + paramMap.put(paramKey, value); + return column + " <> " + valueExpr; + 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 column + " > " + valueExpr; + case "gte": + paramMap.put(paramKey, value); + return column + " >= " + valueExpr; + case "lt": + paramMap.put(paramKey, value); + return column + " < " + valueExpr; + case "lte": + paramMap.put(paramKey, value); + return column + " <= " + valueExpr; + default: + return ""; + } + } + + private String mapSdrvwtsColumn(String field) { + if (StrUtil.isBlank(field)) { + return null; + } + return switch (field) { + case "id" -> "t.ID"; + case "stcd" -> "t.STCD"; + case "dt" -> "t.DT"; + case "wt" -> "t.WT"; + default -> null; + }; + } + + private boolean isSdrvwtsDateField(String field) { + return "dt".equalsIgnoreCase(field); + } + + private String buildSdrvwtsValueExpr(String paramKey, boolean dateField, Object value) { + if (!dateField || value == null) { + return "#{map." + paramKey + "}"; + } + String text = String.valueOf(value).trim(); + if (text.length() <= 10) { + return "TO_DATE(#{map." + paramKey + "}, 'YYYY-MM-DD')"; + } + return "TO_DATE(#{map." + paramKey + "}, 'YYYY-MM-DD HH24:MI:SS')"; + } + + private String buildSdrvwtsOrderBySql(List sortList) { + if (CollUtil.isEmpty(sortList)) { + return " ORDER BY t.DT DESC, t.STCD ASC"; + } + List orders = new ArrayList<>(); + for (DataSourceRequest.SortDescriptor sortDescriptor : sortList) { + if (sortDescriptor == null || StrUtil.isBlank(sortDescriptor.getField())) { + continue; + } + String column = mapSdrvwtsColumn(sortDescriptor.getField()); + if (StrUtil.isBlank(column)) { + continue; + } + String dir = ("desc".equalsIgnoreCase(sortDescriptor.getDir()) || "des".equalsIgnoreCase(sortDescriptor.getDir())) ? "DESC" : "ASC"; + orders.add(column + " " + dir); + } + if (orders.isEmpty()) { + return " ORDER BY t.DT DESC, t.STCD ASC"; + } + return " ORDER BY " + String.join(", ", orders); + } + + private String findFilterFieldValue(DataSourceRequest.FilterDescriptor filter, String field) { + if (filter == null || StrUtil.isBlank(field)) { + return null; + } + if (field.equalsIgnoreCase(filter.getField()) && filter.getValue() != null) { + return String.valueOf(filter.getValue()); + } + if (CollUtil.isEmpty(filter.getFilters())) { + return null; + } + for (DataSourceRequest.FilterDescriptor child : filter.getFilters()) { + String value = findFilterFieldValue(child, field); + if (StrUtil.isNotBlank(value)) { + return value; + } + } + return null; + } + @Override public DataSourceResult getStTbYsBVoKendoListCust(DataSourceRequest dataSourceRequest) { StringBuilder sql = new StringBuilder(); diff --git a/backend/src/main/java/com/yfd/platform/env/wq/service/impl/EnvWqDataServiceImpl.java b/backend/src/main/java/com/yfd/platform/env/wq/service/impl/EnvWqDataServiceImpl.java index 94e9c55..883ca95 100644 --- a/backend/src/main/java/com/yfd/platform/env/wq/service/impl/EnvWqDataServiceImpl.java +++ b/backend/src/main/java/com/yfd/platform/env/wq/service/impl/EnvWqDataServiceImpl.java @@ -641,7 +641,7 @@ public class EnvWqDataServiceImpl implements EnvWqDataService { .append("wq.ORDER_INDEX AS siteStepSort ") .append("FROM SD_WQ_B_H wq ") .append("LEFT JOIN SD_ENGINFO_B_H eng ON eng.STCD = wq.RSTCD ") - .append("LEFT JOIN SD_HYDROBASE hb ON hb.BASEID = eng.BASE_ID AND NVL(hb.IS_DELETED, 0) = 0 ") + .append("LEFT JOIN SD_HYDROBASE hb ON hb.BASEID = wq.BASE_ID AND NVL(hb.IS_DELETED, 0) = 0 ") .append("LEFT JOIN (SELECT DISTINCT STCD FROM SD_WQ_R WHERE NVL(IS_DELETED, 0) = 0 AND TM >= SYSDATE - 1) recent ON recent.STCD = wq.STCD ") .append("WHERE NVL(wq.IS_DELETED, 0) = 0 "); }