diff --git a/backend/src/main/java/com/yfd/platform/qgc_env/zq/controller/ZqMonitorController.java b/backend/src/main/java/com/yfd/platform/qgc_env/zq/controller/ZqMonitorController.java index b08b9126..bfbe270a 100644 --- a/backend/src/main/java/com/yfd/platform/qgc_env/zq/controller/ZqMonitorController.java +++ b/backend/src/main/java/com/yfd/platform/qgc_env/zq/controller/ZqMonitorController.java @@ -41,6 +41,12 @@ public class ZqMonitorController { return ResponseResult.successData(zqMonitorService.getRiverKendoListCust(dataSourceRequest)); } + @PostMapping("/river/day/GetKendoListCust") + @Operation(summary = "查询流量站日数据") + public ResponseResult getRiverDayKendoListCust(@RequestBody DataSourceRequest dataSourceRequest) { + return ResponseResult.successData(zqMonitorService.getRiverDayKendoListCust(dataSourceRequest)); + } + @GetMapping("/msstbprpt/getStcdInfo") @Operation(summary = "根据站码查询单条水文站基础数据") public ResponseResult getStcdInfo(@RequestParam String stcd) { diff --git a/backend/src/main/java/com/yfd/platform/qgc_env/zq/entity/vo/ZqRiverDayDataVo.java b/backend/src/main/java/com/yfd/platform/qgc_env/zq/entity/vo/ZqRiverDayDataVo.java new file mode 100644 index 00000000..6a448b64 --- /dev/null +++ b/backend/src/main/java/com/yfd/platform/qgc_env/zq/entity/vo/ZqRiverDayDataVo.java @@ -0,0 +1,77 @@ +package com.yfd.platform.qgc_env.zq.entity.vo; + +import com.fasterxml.jackson.annotation.JsonFormat; +import io.swagger.v3.oas.annotations.media.Schema; +import lombok.Data; + +import java.math.BigDecimal; +import java.util.Date; + +@Data +@Schema(description = "流量站日数据") +public class ZqRiverDayDataVo { + + @Schema(description = "主键ID") + private String id; + + @Schema(description = "站码") + private String stcd; + + @Schema(description = "所属电站编码") + private String rstcd; + + @Schema(description = "所属电站名称") + private String ennm; + + @Schema(description = "站点名称") + private String stnm; + + @Schema(description = "基地编码") + private String baseId; + + @Schema(description = "基地名称") + private String baseName; + + @JsonFormat(pattern = "yyyy-MM-dd", timezone = "GMT+8") + @Schema(description = "日期") + private Date dt; + + @Schema(description = "水位") + private BigDecimal z; + + @Schema(description = "流量") + private BigDecimal q; + + @Schema(description = "流速") + private BigDecimal v; + + @Schema(description = "测流方法") + private String msqmt; + + @Schema(description = "站址") + private String stlc; + + @Schema(description = "创建人") + private String recordUser; + + @Schema(description = "创建时间") + private Date recordTime; + + @Schema(description = "更新人") + private String modifyUser; + + @Schema(description = "更新时间") + private Date modifyTime; + + @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/qgc_env/zq/service/ZqMonitorService.java b/backend/src/main/java/com/yfd/platform/qgc_env/zq/service/ZqMonitorService.java index 9c5aff7a..983ec39e 100644 --- a/backend/src/main/java/com/yfd/platform/qgc_env/zq/service/ZqMonitorService.java +++ b/backend/src/main/java/com/yfd/platform/qgc_env/zq/service/ZqMonitorService.java @@ -3,6 +3,7 @@ package com.yfd.platform.qgc_env.zq.service; import com.yfd.platform.common.DataSourceRequest; import com.yfd.platform.common.DataSourceResult; import com.yfd.platform.qgc_env.zq.entity.vo.ZqBaseInfoVo; +import com.yfd.platform.qgc_env.zq.entity.vo.ZqRiverDayDataVo; import com.yfd.platform.qgc_env.zq.entity.vo.ZqRiverDataVo; public interface ZqMonitorService { @@ -13,5 +14,7 @@ public interface ZqMonitorService { DataSourceResult getRiverKendoListCust(DataSourceRequest dataSourceRequest); + DataSourceResult getRiverDayKendoListCust(DataSourceRequest dataSourceRequest); + ZqBaseInfoVo getStcdInfo(String stcd); } diff --git a/backend/src/main/java/com/yfd/platform/qgc_env/zq/service/impl/ZqMonitorServiceImpl.java b/backend/src/main/java/com/yfd/platform/qgc_env/zq/service/impl/ZqMonitorServiceImpl.java index b95f56e2..90d475a6 100644 --- a/backend/src/main/java/com/yfd/platform/qgc_env/zq/service/impl/ZqMonitorServiceImpl.java +++ b/backend/src/main/java/com/yfd/platform/qgc_env/zq/service/impl/ZqMonitorServiceImpl.java @@ -12,6 +12,7 @@ import com.yfd.platform.common.MicroservicDynamicSQLMapper; import com.yfd.platform.common.exception.BizException; import com.yfd.platform.qgc_env.fh.entity.vo.HabitatVo; import com.yfd.platform.qgc_env.zq.entity.vo.ZqBaseInfoVo; +import com.yfd.platform.qgc_env.zq.entity.vo.ZqRiverDayDataVo; import com.yfd.platform.qgc_env.zq.entity.vo.ZqRiverDataVo; import com.yfd.platform.qgc_env.zq.service.ZqMonitorService; import com.yfd.platform.utils.QgcQueryWrapperUtil; @@ -132,6 +133,15 @@ public class ZqMonitorServiceImpl implements ZqMonitorService { return queryRiverGroupList(dataSourceRequest, loadOptions); } + @Override + public DataSourceResult getRiverDayKendoListCust(DataSourceRequest dataSourceRequest) { + DataSourceLoadOptionsBase loadOptions = dataSourceRequest == null ? null : dataSourceRequest.toDevRequest(); + if (CollUtil.isEmpty(dataSourceRequest == null ? null : dataSourceRequest.getGroup())) { + return queryRiverDayDetailList(dataSourceRequest, loadOptions); + } + return queryRiverDayGroupList(dataSourceRequest, loadOptions); + } + @Override public ZqBaseInfoVo getStcdInfo(String stcd) { if (StrUtil.isBlank(stcd)) { @@ -232,6 +242,100 @@ public class ZqMonitorServiceImpl implements ZqMonitorService { return result; } + private DataSourceResult queryRiverDayDetailList(DataSourceRequest dataSourceRequest, + DataSourceLoadOptionsBase loadOptions) { + StringBuilder sql = new StringBuilder(); + sql.append("SELECT ") + .append(buildRiverDayDetailSelectSql(dataSourceRequest == null ? null : dataSourceRequest.getSelect())) + .append(" FROM (") + .append(buildRiverDayCoreSql()) + .append(") t WHERE 1 = 1 "); + + Map paramMap = new HashMap<>(); + String filterSql = buildRiverDayFilterCondition(dataSourceRequest == null ? null : dataSourceRequest.getFilter(), paramMap, new int[]{0}); + if (StrUtil.isNotBlank(filterSql)) { + sql.append(" AND ").append(filterSql).append(" "); + } + sql.append(buildRiverDayOrderBySql(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, ZqRiverDayDataVo.class); + DataSourceResult result = new DataSourceResult<>(); + result.setData(list); + result.setTotal(page != null ? page.getTotal() : list.size()); + result.setAggregates(new HashMap<>()); + return result; + } + + private DataSourceResult queryRiverDayGroupList(DataSourceRequest dataSourceRequest, + DataSourceLoadOptionsBase loadOptions) { + List groups = dataSourceRequest.getGroup(); + GroupingInfo[] groupInfos = loadOptions == null ? new GroupingInfo[0] : loadOptions.getGroup(); + + StringBuilder sql = new StringBuilder("SELECT "); + List selectItems = new ArrayList<>(); + for (DataSourceRequest.GroupDescriptor descriptor : groups) { + if (descriptor == null || StrUtil.isBlank(descriptor.getField())) { + continue; + } + String column = mapRiverDayColumn(descriptor.getField()); + if (StrUtil.isBlank(column)) { + continue; + } + selectItems.add(column + " AS " + descriptor.getField().toUpperCase()); + selectItems.add("COUNT(*) AS COUNT_" + descriptor.getField().toUpperCase()); + if (CollUtil.isNotEmpty(descriptor.getAggregates())) { + for (DataSourceRequest.AggregateDescriptor aggregate : descriptor.getAggregates()) { + String aggregateColumn = mapRiverDayColumn(aggregate.getField()); + if (StrUtil.isBlank(aggregateColumn) || StrUtil.isBlank(aggregate.getAggregate())) { + continue; + } + selectItems.add(buildRiverAggregateSql(aggregate.getAggregate(), aggregateColumn, aggregate.getField())); + } + } + } + if (selectItems.isEmpty()) { + selectItems.add("t.STCD AS STCD"); + selectItems.add("COUNT(*) AS COUNT_STCD"); + } + sql.append(String.join(", ", selectItems)) + .append(" FROM (") + .append(buildRiverDayCoreSql()) + .append(") t WHERE 1 = 1 "); + + Map paramMap = new HashMap<>(); + String filterSql = buildRiverDayFilterCondition(dataSourceRequest == null ? null : dataSourceRequest.getFilter(), paramMap, new int[]{0}); + if (StrUtil.isNotBlank(filterSql)) { + sql.append(" AND ").append(filterSql).append(" "); + } + + List groupByColumns = new ArrayList<>(); + for (DataSourceRequest.GroupDescriptor descriptor : groups) { + if (descriptor == null || StrUtil.isBlank(descriptor.getField())) { + continue; + } + String column = mapRiverDayColumn(descriptor.getField()); + if (StrUtil.isNotBlank(column)) { + groupByColumns.add(column); + } + } + if (!groupByColumns.isEmpty()) { + sql.append(" GROUP BY ").append(String.join(", ", groupByColumns)).append(" "); + } + sql.append(buildRiverDayGroupOrderBySql(groups)); + + List> rows = microservicDynamicSQLMapper.pageAllList(null, sql.toString(), paramMap); + DataSourceResult result = new DataSourceResult(); + if (Boolean.TRUE.equals(dataSourceRequest.getGroupResultFlat())) { + result.setData(new GroupHelper().faltGroup(rows, Arrays.asList(groupInfos))); + } else { + result.setData(new GroupHelper().group(rows, Arrays.asList(groupInfos))); + } + result.setTotal(0L); + result.setAggregates(new HashMap<>()); + return result; + } + private DataSourceResult queryRiverGroupList(DataSourceRequest dataSourceRequest, DataSourceLoadOptionsBase loadOptions) { List groups = dataSourceRequest.getGroup(); @@ -379,6 +483,49 @@ public class ZqMonitorServiceImpl implements ZqMonitorService { "eng.RVCD, rv.RVNM, eng.HBRVCD, hbrv.HBRVNM, rb.BLDSTT_CODE, hb.ORDER_INDEX, along.ORDER_INDEX, rstSort.SORT, siteSort.SORT"; } + private String buildRiverDayCoreSql() { + return "SELECT " + + "day.ID AS id, " + + "day.STCD AS stcd, " + + "rb.RSTCD AS rstcd, " + + "eng.ENNM AS ennm, " + + "rb.STNM AS stnm, " + + "eng.BASE_ID AS baseId, " + + "hb.BASENAME AS baseName, " + + "day.DT AS dt, " + + "day.Z AS z, " + + "day.Q AS q, " + + "day.V AS v, " + + "day.MSQMT AS msqmt, " + + "rb.STLC AS stlc, " + + "day.RECORD_USER AS recordUser, " + + "day.RECORD_TIME AS recordTime, " + + "day.MODIFY_USER AS modifyUser, " + + "day.MODIFY_TIME AS modifyTime, " + + "NVL(hb.ORDER_INDEX, 999999) AS baseStepSort, " + + "NVL(along.ORDER_INDEX, 999999) AS rvcdStepSort, " + + "NVL(rstSort.SORT, 999999) AS rstcdStepSort, " + + "NVL(siteSort.SORT, 999999) AS siteStepSort " + + "FROM SD_RIVERDAY_S day " + + "INNER JOIN SD_RIVER_B_H rb ON rb.STCD = day.STCD AND rb.STTP = 'ZQ' AND NVL(rb.IS_DELETED, 0) = 0 " + + "LEFT JOIN SD_ENGINFO_B_H eng ON eng.STCD = rb.RSTCD AND NVL(eng.IS_DELETED, 0) = 0 " + + "LEFT JOIN SD_HYDROBASE hb ON hb.BASEID = eng.BASE_ID AND NVL(hb.IS_DELETED, 0) = 0 " + + "LEFT JOIN MS_ALONG_B along ON along.RVCD = eng.HBRVCD AND along.CODE = 'common' AND NVL(along.IS_DELETED, 0) = 0 " + + "LEFT JOIN ( " + + " SELECT det.SORT, cfg.RVCD, det.STCD " + + " FROM MS_ALONGDET_B det " + + " INNER JOIN MS_ALONG_B cfg ON det.ALONG_ID = cfg.ID " + + " WHERE NVL(det.IS_DELETED, 0) = 0 AND NVL(cfg.IS_DELETED, 0) = 0 AND cfg.CODE = 'common' " + + ") rstSort ON rstSort.RVCD = eng.HBRVCD AND rstSort.STCD = rb.RSTCD " + + "LEFT JOIN ( " + + " SELECT det.SORT, cfg.RVCD, det.STCD " + + " FROM MS_ALONGDET_B det " + + " INNER JOIN MS_ALONG_B cfg ON det.ALONG_ID = cfg.ID " + + " WHERE NVL(det.IS_DELETED, 0) = 0 AND NVL(cfg.IS_DELETED, 0) = 0 AND cfg.CODE = 'common' " + + ") siteSort ON siteSort.RVCD = eng.HBRVCD AND siteSort.STCD = rb.STCD " + + "WHERE NVL(day.IS_DELETED, 0) = 0 "; + } + private String buildRiverFilterCondition(DataSourceRequest.FilterDescriptor filter, Map paramMap, int[] indexHolder) { @@ -405,6 +552,32 @@ public class ZqMonitorServiceImpl implements ZqMonitorService { return String.join(logic, conditions); } + private String buildRiverDayFilterCondition(DataSourceRequest.FilterDescriptor filter, + Map paramMap, + int[] indexHolder) { + if (filter == null) { + return ""; + } + if (StrUtil.isNotBlank(filter.getField())) { + return buildRiverDayLeafCondition(filter, paramMap, indexHolder); + } + if (CollUtil.isEmpty(filter.getFilters())) { + return ""; + } + List conditions = new ArrayList<>(); + for (DataSourceRequest.FilterDescriptor child : filter.getFilters()) { + String childSql = buildRiverDayFilterCondition(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 buildRiverLeafCondition(DataSourceRequest.FilterDescriptor filter, Map paramMap, int[] indexHolder) { @@ -486,6 +659,83 @@ public class ZqMonitorServiceImpl implements ZqMonitorService { }; } + private String buildRiverDayLeafCondition(DataSourceRequest.FilterDescriptor filter, + Map paramMap, + int[] indexHolder) { + String field = filter.getField(); + String operator = StrUtil.blankToDefault(filter.getOperator(), "eq").toLowerCase(); + Object value = filter.getValue(); + String column = mapRiverDayColumn(field); + if (StrUtil.isBlank(column)) { + return ""; + } + if ("isnull".equals(operator)) { + return column + " IS NULL"; + } + if ("isnotnull".equals(operator)) { + return column + " IS NOT NULL"; + } + boolean dateField = "dt".equalsIgnoreCase(field) || "DT".equals(field) || "recordTime".equalsIgnoreCase(field) || "modifyTime".equalsIgnoreCase(field); + if ("in".equals(operator)) { + List values = normalizeRiverValues(value); + if (values.isEmpty()) { + return ""; + } + List placeholders = new ArrayList<>(); + for (Object item : values) { + String key = "zqRiverDayP" + indexHolder[0]++; + paramMap.put(key, item); + placeholders.add(buildRiverValueExpr(key, dateField, item)); + } + return column + " IN (" + String.join(", ", placeholders) + ")"; + } + if (value == null) { + return ""; + } + + String key = "zqRiverDayP" + indexHolder[0]++; + String valueExpr = buildRiverValueExpr(key, dateField, value); + return switch (operator) { + case "eq" -> { + paramMap.put(key, value); + yield column + " = " + valueExpr; + } + case "neq" -> { + paramMap.put(key, value); + yield column + " <> " + valueExpr; + } + case "contains" -> { + paramMap.put(key, "%" + value + "%"); + yield column + " LIKE #{map." + key + "}"; + } + case "startswith" -> { + paramMap.put(key, value + "%"); + yield column + " LIKE #{map." + key + "}"; + } + case "endswith" -> { + paramMap.put(key, "%" + value); + yield column + " LIKE #{map." + key + "}"; + } + case "gt" -> { + paramMap.put(key, value); + yield column + " > " + valueExpr; + } + case "gte" -> { + paramMap.put(key, value); + yield column + " >= " + valueExpr; + } + case "lt" -> { + paramMap.put(key, value); + yield column + " < " + valueExpr; + } + case "lte" -> { + paramMap.put(key, value); + yield column + " <= " + valueExpr; + } + default -> ""; + }; + } + private String buildRiverVdidCondition(String operator, Object value, Map paramMap, @@ -582,6 +832,36 @@ public class ZqMonitorServiceImpl implements ZqMonitorService { }; } + private String mapRiverDayColumn(String field) { + if (StrUtil.isBlank(field)) { + return null; + } + return switch (field) { + case "id" -> "t.ID"; + case "stcd" -> "t.STCD"; + case "rstcd" -> "t.RSTCD"; + case "ennm" -> "t.ENNM"; + case "stnm" -> "t.STNM"; + case "baseId" -> "t.BASEID"; + case "baseName" -> "t.BASENAME"; + case "dt", "DT" -> "t.DT"; + case "z" -> "t.Z"; + case "q" -> "t.Q"; + case "v" -> "t.V"; + case "msqmt" -> "t.MSQMT"; + case "stlc" -> "t.STLC"; + case "recordUser" -> "t.RECORDUSER"; + case "recordTime" -> "t.RECORDTIME"; + case "modifyUser" -> "t.MODIFYUSER"; + case "modifyTime" -> "t.MODIFYTIME"; + case "baseStepSort" -> "t.BASESTEPSORT"; + case "rvcdStepSort" -> "t.RVCDSTEPSORT"; + case "rstcdStepSort" -> "t.RSTCDSTEPSORT"; + case "siteStepSort" -> "t.SITESTEPSORT"; + default -> null; + }; + } + private String buildRiverDetailSelectSql(List selectFields) { Map selectMap = new LinkedHashMap<>(); selectMap.put("q", "t.Q AS q"); @@ -626,6 +906,47 @@ public class ZqMonitorServiceImpl implements ZqMonitorService { return String.join(", ", actualColumns); } + private String buildRiverDayDetailSelectSql(List selectFields) { + Map selectMap = new LinkedHashMap<>(); + selectMap.put("id", "t.ID AS id"); + selectMap.put("stcd", "t.STCD AS stcd"); + selectMap.put("rstcd", "t.RSTCD AS rstcd"); + selectMap.put("ennm", "t.ENNM AS ennm"); + selectMap.put("stnm", "t.STNM AS stnm"); + selectMap.put("baseId", "t.BASEID AS baseId"); + selectMap.put("baseName", "t.BASENAME AS baseName"); + selectMap.put("dt", "t.DT AS dt"); +// selectMap.put("DT", "t.DT AS dt"); + selectMap.put("z", "t.Z AS z"); + selectMap.put("q", "t.Q AS q"); + selectMap.put("v", "t.V AS v"); + selectMap.put("msqmt", "t.MSQMT AS msqmt"); + selectMap.put("stlc", "t.STLC AS stlc"); + selectMap.put("recordUser", "t.RECORDUSER AS recordUser"); + selectMap.put("recordTime", "t.RECORDTIME AS recordTime"); + selectMap.put("modifyUser", "t.MODIFYUSER AS modifyUser"); + selectMap.put("modifyTime", "t.MODIFYTIME AS modifyTime"); + selectMap.put("baseStepSort", "t.BASESTEPSORT AS baseStepSort"); + selectMap.put("rvcdStepSort", "t.RVCDSTEPSORT AS rvcdStepSort"); + selectMap.put("rstcdStepSort", "t.RSTCDSTEPSORT AS rstcdStepSort"); + selectMap.put("siteStepSort", "t.SITESTEPSORT AS siteStepSort"); + + if (CollUtil.isEmpty(selectFields)) { + return String.join(", ", selectMap.values()); + } + List actualColumns = new ArrayList<>(); + for (String selectField : selectFields) { + String column = selectMap.get(selectField); + if (StrUtil.isNotBlank(column)) { + actualColumns.add(column); + } + } + if (actualColumns.isEmpty()) { + actualColumns.addAll(selectMap.values()); + } + return String.join(", ", actualColumns); + } + private String buildRiverOrderBySql(List sortList) { if (CollUtil.isEmpty(sortList)) { return " ORDER BY t.BASESTEPSORT ASC, t.RVCDSTEPSORT ASC, t.RSTCDSTEPSORT ASC, t.SITESTEPSORT ASC, t.STCD ASC, t.TM DESC"; @@ -648,6 +969,28 @@ public class ZqMonitorServiceImpl implements ZqMonitorService { return " ORDER BY " + String.join(", ", orderColumns); } + private String buildRiverDayOrderBySql(List sortList) { + if (CollUtil.isEmpty(sortList)) { + return " ORDER BY t.DT ASC, t.STCD ASC"; + } + List orderColumns = new ArrayList<>(); + for (DataSourceRequest.SortDescriptor sortDescriptor : sortList) { + if (sortDescriptor == null || StrUtil.isBlank(sortDescriptor.getField())) { + continue; + } + String column = mapRiverDayColumn(sortDescriptor.getField()); + 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 t.DT ASC, t.STCD ASC"; + } + return " ORDER BY " + String.join(", ", orderColumns); + } + private String buildRiverGroupOrderBySql(List groups) { if (CollUtil.isEmpty(groups)) { return ""; @@ -667,6 +1010,25 @@ public class ZqMonitorServiceImpl implements ZqMonitorService { return orders.isEmpty() ? "" : " ORDER BY " + String.join(", ", orders); } + private String buildRiverDayGroupOrderBySql(List groups) { + if (CollUtil.isEmpty(groups)) { + return ""; + } + List orders = new ArrayList<>(); + for (DataSourceRequest.GroupDescriptor descriptor : groups) { + if (descriptor == null || StrUtil.isBlank(descriptor.getField())) { + continue; + } + String column = mapRiverDayColumn(descriptor.getField()); + if (StrUtil.isBlank(column)) { + continue; + } + String dir = "desc".equalsIgnoreCase(descriptor.getDir()) || "des".equalsIgnoreCase(descriptor.getDir()) ? "DESC" : "ASC"; + orders.add(column + " " + dir); + } + return orders.isEmpty() ? "" : " ORDER BY " + String.join(", ", orders); + } + private String buildRiverAggregateSql(String aggregate, String column, String field) { String normalized = aggregate == null ? "" : aggregate.toLowerCase(); return switch (normalized) {