diff --git a/backend/src/main/java/com/yfd/platform/qgc_base/controller/SdEngMonitorController.java b/backend/src/main/java/com/yfd/platform/qgc_base/controller/SdEngMonitorController.java index 2b4a003b..b0bf0bcf 100644 --- a/backend/src/main/java/com/yfd/platform/qgc_base/controller/SdEngMonitorController.java +++ b/backend/src/main/java/com/yfd/platform/qgc_base/controller/SdEngMonitorController.java @@ -38,4 +38,10 @@ public class SdEngMonitorController { public ResponseResult getEiaapprovalKendoList(@RequestBody DataSourceRequest dataSourceRequest) { return ResponseResult.successData(engInfoBHService.getEiaapprovalKendoList(dataSourceRequest)); } + + @PostMapping("/operat/GetKendoListCust") + @Operation(summary = "首页-环保设施运行状况") + public ResponseResult getOperatKendoList(@RequestBody DataSourceRequest dataSourceRequest) { + return ResponseResult.successData(engInfoBHService.getOperatKendoList(dataSourceRequest)); + } } diff --git a/backend/src/main/java/com/yfd/platform/qgc_base/domain/vo/EngOperatVo.java b/backend/src/main/java/com/yfd/platform/qgc_base/domain/vo/EngOperatVo.java new file mode 100644 index 00000000..7e2ba7f2 --- /dev/null +++ b/backend/src/main/java/com/yfd/platform/qgc_base/domain/vo/EngOperatVo.java @@ -0,0 +1,32 @@ +package com.yfd.platform.qgc_base.domain.vo; + +import io.swagger.v3.oas.annotations.media.Schema; +import lombok.Data; + +import java.io.Serializable; + +@Data +@Schema(description = "环保设施运行状况") +public class EngOperatVo implements Serializable { + + private static final long serialVersionUID = 1L; + + private String repCode; + private String sttpCode; + private String pcode; + private String pname; + private String stcd; + private String ennm; + private String stnm; + private String addvcdName; + private String rvcdName; + private String sttpName; + private String baseId; + private Integer dtin; + private Integer runState; + private Integer stdState; + private Integer runSstate; + private Integer bldsttCcode; + private Integer yr; + private Integer count; +} diff --git a/backend/src/main/java/com/yfd/platform/qgc_base/service/ISdEngInfoBHService.java b/backend/src/main/java/com/yfd/platform/qgc_base/service/ISdEngInfoBHService.java index 88ec4792..e9128874 100644 --- a/backend/src/main/java/com/yfd/platform/qgc_base/service/ISdEngInfoBHService.java +++ b/backend/src/main/java/com/yfd/platform/qgc_base/service/ISdEngInfoBHService.java @@ -8,6 +8,7 @@ import com.yfd.platform.qgc_base.domain.SdEngInfoBH; import com.yfd.platform.qgc_base.domain.SdEngInfoBHRequest; import com.yfd.platform.qgc_base.domain.vo.EngBaseInfoVo; import com.yfd.platform.qgc_base.domain.vo.EngEiaapprovalVo; +import com.yfd.platform.qgc_base.domain.vo.EngOperatVo; import com.yfd.platform.qgc_base.domain.vo.EngStInfoResultVo; import com.yfd.platform.qgc_base.domain.vo.EngVmsstbprptVo; @@ -81,4 +82,6 @@ public interface ISdEngInfoBHService extends IService { DataSourceResult getEiaapprovalKendoList(DataSourceRequest dataSourceRequest); DataSourceResult getVmsstbprptKendoList(DataSourceRequest dataSourceRequest); + + DataSourceResult getOperatKendoList(DataSourceRequest dataSourceRequest); } diff --git a/backend/src/main/java/com/yfd/platform/qgc_base/service/impl/SdEngInfoBHServiceImpl.java b/backend/src/main/java/com/yfd/platform/qgc_base/service/impl/SdEngInfoBHServiceImpl.java index c170ed57..315005fd 100644 --- a/backend/src/main/java/com/yfd/platform/qgc_base/service/impl/SdEngInfoBHServiceImpl.java +++ b/backend/src/main/java/com/yfd/platform/qgc_base/service/impl/SdEngInfoBHServiceImpl.java @@ -26,6 +26,7 @@ import com.yfd.platform.qgc_base.domain.SdEngInfoBH; import com.yfd.platform.qgc_base.domain.SdEngInfoBHRequest; import com.yfd.platform.qgc_base.domain.vo.EngBaseInfoVo; import com.yfd.platform.qgc_base.domain.vo.EngEiaapprovalVo; +import com.yfd.platform.qgc_base.domain.vo.EngOperatVo; import com.yfd.platform.qgc_base.domain.vo.EngStBaseInfoVo; import com.yfd.platform.qgc_base.domain.vo.EngStInfoResultVo; import com.yfd.platform.qgc_base.domain.vo.EngVmsstbprptVo; @@ -691,6 +692,132 @@ public class SdEngInfoBHServiceImpl extends ServiceImpl getOperatKendoList(DataSourceRequest dataSourceRequest) { + DataSourceResult result = new DataSourceResult<>(); + result.setAggregates(new HashMap<>()); + if (dataSourceRequest == null) { + result.setData(new ArrayList<>()); + result.setTotal(0L); + return result; + } + + DataSourceLoadOptionsBase loadOptions = dataSourceRequest.toDevRequest(); + if (CollUtil.isEmpty(dataSourceRequest.getGroup())) { + return queryOperatSummaryList(dataSourceRequest, loadOptions); + } + return queryOperatGroupList(dataSourceRequest, loadOptions); + } + + private DataSourceResult queryOperatSummaryList(DataSourceRequest dataSourceRequest, + DataSourceLoadOptionsBase loadOptions) { + StringBuilder sql = new StringBuilder(); + sql.append("SELECT ") + .append(buildOperatSummarySelectSql(dataSourceRequest.getSelect())) + .append(" FROM (") + .append(buildOperatCategorySql()) + .append(") cat ") + .append("LEFT JOIN (SELECT * FROM (") + .append(buildOperatBaseViewSql()) + .append(") t WHERE 1 = 1 "); + + Map paramMap = new HashMap<>(); + String filterSql = buildOperatBaseFilterCondition(dataSourceRequest.getFilter(), paramMap, new int[]{0}); + if (StringUtils.hasText(filterSql)) { + sql.append(" AND ").append(filterSql); + } + sql.append(") src ON cat.repCode = src.repCode ") + .append("GROUP BY cat.repCode, cat.sttpName, cat.orderIndex ") + .append(buildOperatSummaryOrderBySql(dataSourceRequest.getSort())); + + Page page = loadOptions == null ? null + : QgcQueryWrapperUtil.buildPage(loadOptions, loadOptions.getSkip(), loadOptions.getTake()); + List list = microservicDynamicSQLMapper.pageAllListWithResultType( + page, sql.toString(), paramMap, EngOperatVo.class); + + DataSourceResult result = new DataSourceResult<>(); + result.setData(list); + result.setTotal(page == null ? list.size() : page.getTotal()); + result.setAggregates(new HashMap<>()); + return result; + } + + private DataSourceResult queryOperatGroupList(DataSourceRequest dataSourceRequest, + DataSourceLoadOptionsBase loadOptions) { + List groups = dataSourceRequest.getGroup(); + GroupingInfo[] groupInfos = loadOptions == null ? new GroupingInfo[0] : loadOptions.getGroup(); + List selectItems = new ArrayList<>(); + for (DataSourceRequest.GroupDescriptor descriptor : groups) { + if (descriptor == null || !StringUtils.hasText(descriptor.getField())) { + continue; + } + String column = mapOperatGroupColumn(descriptor.getField()); + if (!StringUtils.hasText(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 = mapOperatGroupColumn(aggregate.getField()); + if (!StringUtils.hasText(aggregateColumn) || !StringUtils.hasText(aggregate.getAggregate())) { + continue; + } + String aggregateSql = buildAggregateSql(aggregate.getAggregate(), aggregateColumn, aggregate.getField()); + if (StringUtils.hasText(aggregateSql)) { + selectItems.add(aggregateSql); + } + } + } + } + if (selectItems.isEmpty()) { + selectItems.add("t.STCD AS STCD"); + selectItems.add("COUNT(*) AS COUNT_STCD"); + } + + StringBuilder sql = new StringBuilder(); + sql.append("SELECT ") + .append(String.join(", ", selectItems)) + .append(" FROM (") + .append(buildOperatStateViewSql()) + .append(") t WHERE 1 = 1 "); + + Map paramMap = new HashMap<>(); + if (!containsOperatYearFilter(dataSourceRequest.getFilter())) { + sql.append(" AND t.yr = ").append(new Date().getYear() + 1900); + } + String filterSql = buildOperatGroupFilterCondition(dataSourceRequest.getFilter(), paramMap, new int[]{0}); + if (StringUtils.hasText(filterSql)) { + sql.append(" AND ").append(filterSql); + } + + List groupByColumns = new ArrayList<>(); + for (DataSourceRequest.GroupDescriptor descriptor : groups) { + if (descriptor == null || !StringUtils.hasText(descriptor.getField())) { + continue; + } + String column = mapOperatGroupColumn(descriptor.getField()); + if (StringUtils.hasText(column)) { + groupByColumns.add(column); + } + } + if (!groupByColumns.isEmpty()) { + sql.append(" GROUP BY ").append(String.join(", ", groupByColumns)); + } + sql.append(buildOperatGroupOrderBySql(groups)); + + List> rows = microservicDynamicSQLMapper.pageAllList(null, sql.toString(), paramMap); + DataSourceResult result = new DataSourceResult<>(); + if (Boolean.TRUE.equals(dataSourceRequest.getGroupResultFlat())) { + result.setData((List) (List) new GroupHelper().faltGroup(rows, Arrays.asList(groupInfos))); + } else { + result.setData((List) (List) new GroupHelper().group(rows, Arrays.asList(groupInfos))); + } + result.setTotal(0L); + result.setAggregates(new HashMap<>()); + return result; + } + @Override public DataSourceResult getEiaapprovalKendoList(DataSourceRequest dataSourceRequest) { DataSourceResult result = new DataSourceResult<>(); @@ -953,6 +1080,7 @@ public class SdEngInfoBHServiceImpl extends ServiceImpl 0 THEN SUBSTR(" + sttpExpr + ", 1, INSTR(" + sttpExpr + ", '_') - 1) ELSE " + sttpExpr + " END AS repCode, " + + dtinExpr + " AS dtin, " + + bldsttExpr + " AS bldsttCcode, " + + baseIdExpr + " AS baseId, " + + hbrvcdExpr + " AS hbrvcd, " + + rvcdExpr + " AS rvcd, " + + rvcdNameExpr + " AS rvcdName, " + + addvcdNameExpr + " AS addvcdName, " + + rstcdExpr + " AS rstcd, " + + ennmExpr + " AS ennm " + + "FROM " + fromSql + " " + + joinSql + " WHERE " + whereSql; + } + + private String buildOperatStateViewSql() { + return "SELECT " + + "src.repCode AS repCode, " + + "src.sttpCode AS sttpCode, " + + "src.repCode AS pcode, " + + "parent.STTP_NAME AS pname, " + + "child.STTP_NAME AS sttpName, " + + "src.stcd AS stcd, " + + "src.ennm AS ennm, " + + "src.stnm AS stnm, " + + "src.addvcdName AS addvcdName, " + + "src.rvcdName AS rvcdName, " + + "src.baseId AS baseId, " + + "src.dtin AS dtin, " + + "src.bldsttCcode AS bldsttCcode, " + + "state.RUN_STATE AS runState, " + + "state.STD_STATE AS stdState, " + + "state.STD_SSTATE AS runSstate, " + + "state.YR AS yr " + + "FROM (" + buildOperatBaseViewSql() + ") src " + + "LEFT JOIN SD_STTP_B child ON child.STTP_CODE = src.sttpCode AND NVL(child.IS_DELETED, 0) = 0 " + + "LEFT JOIN SD_STTP_B parent ON parent.STTP_CODE = src.repCode AND NVL(parent.IS_DELETED, 0) = 0 " + + "INNER JOIN MS_STSTATE_T state ON state.STCD = src.stcd AND NVL(state.IS_DELETED, 0) = 0"; + } + + private String buildOperatSummarySelectSql(List selectFields) { + Map columnMap = new LinkedHashMap<>(); + columnMap.put("repCode", "cat.repCode AS repCode"); + columnMap.put("sttpName", "cat.sttpName AS sttpName"); + columnMap.put("count", "COUNT(src.repCode) AS count"); + List items = new ArrayList<>(); + if (CollUtil.isNotEmpty(selectFields)) { + for (String field : selectFields) { + String column = columnMap.get(field); + if (StringUtils.hasText(column)) { + items.add(column); + } + } + } + if (items.isEmpty()) { + items.addAll(columnMap.values()); + } + return String.join(", ", items); + } + + private String buildOperatSummaryOrderBySql(List sortList) { + if (CollUtil.isEmpty(sortList)) { + return " ORDER BY cat.orderIndex ASC NULLS LAST, cat.repCode ASC"; + } + List orderItems = new ArrayList<>(); + for (DataSourceRequest.SortDescriptor sortDescriptor : sortList) { + if (sortDescriptor == null || !StringUtils.hasText(sortDescriptor.getField())) { + continue; + } + String column = mapOperatSummaryColumn(sortDescriptor.getField()); + if (!StringUtils.hasText(column)) { + continue; + } + String dir = "desc".equalsIgnoreCase(sortDescriptor.getDir()) || "des".equalsIgnoreCase(sortDescriptor.getDir()) ? "DESC" : "ASC"; + orderItems.add(column + " " + dir); + } + if (orderItems.isEmpty()) { + return " ORDER BY cat.orderIndex ASC NULLS LAST, cat.repCode ASC"; + } + return " ORDER BY " + String.join(", ", orderItems); + } + + private String buildOperatBaseFilterCondition(DataSourceRequest.FilterDescriptor filter, + Map paramMap, + int[] indexHolder) { + if (filter == null) { + return ""; + } + if (StringUtils.hasText(filter.getField())) { + String column = mapOperatBaseColumn(filter.getField()); + return buildOperatCondition(column, filter, paramMap, indexHolder, false, "operatBase"); + } + if (CollUtil.isEmpty(filter.getFilters())) { + return ""; + } + List childConditions = new ArrayList<>(); + for (DataSourceRequest.FilterDescriptor child : filter.getFilters()) { + String childSql = buildOperatBaseFilterCondition(child, paramMap, indexHolder); + if (StringUtils.hasText(childSql)) { + childConditions.add("(" + childSql + ")"); + } + } + if (childConditions.isEmpty()) { + return ""; + } + String logic = "or".equalsIgnoreCase(filter.getLogic()) ? " OR " : " AND "; + return String.join(logic, childConditions); + } + + private String buildOperatGroupFilterCondition(DataSourceRequest.FilterDescriptor filter, + Map paramMap, + int[] indexHolder) { + if (filter == null) { + return ""; + } + if (StringUtils.hasText(filter.getField())) { + String field = filter.getField(); + String column = mapOperatGroupColumn(field); + boolean dateField = false; + return buildOperatCondition(column, filter, paramMap, indexHolder, dateField, "operatGroup"); + } + if (CollUtil.isEmpty(filter.getFilters())) { + return ""; + } + List childConditions = new ArrayList<>(); + for (DataSourceRequest.FilterDescriptor child : filter.getFilters()) { + String childSql = buildOperatGroupFilterCondition(child, paramMap, indexHolder); + if (StringUtils.hasText(childSql)) { + childConditions.add("(" + childSql + ")"); + } + } + if (childConditions.isEmpty()) { + return ""; + } + String logic = "or".equalsIgnoreCase(filter.getLogic()) ? " OR " : " AND "; + return String.join(logic, childConditions); + } + + private String buildOperatCondition(String column, + DataSourceRequest.FilterDescriptor filter, + Map paramMap, + int[] indexHolder, + boolean dateField, + String keyPrefix) { + if (!StringUtils.hasText(column) || filter == null) { + return ""; + } + String operator = filter.getOperator() == null ? "eq" : filter.getOperator().toLowerCase(); + Object value = filter.getValue(); + if ("isnull".equals(operator)) { + return column + " IS NULL"; + } + if ("isnotnull".equals(operator)) { + return column + " IS NOT NULL"; + } + if ("isempty".equals(operator)) { + return "(" + column + " IS NULL OR " + column + " = '')"; + } + if ("isnotempty".equals(operator)) { + return "(" + column + " IS NOT NULL AND " + column + " <> '')"; + } + if ("in".equals(operator) || "ni".equals(operator)) { + List values = normalizeFilterValues(value); + if (values.isEmpty()) { + return ""; + } + List placeholders = new ArrayList<>(); + for (Object item : values) { + String key = keyPrefix + indexHolder[0]++; + paramMap.put(key, item); + placeholders.add("#{map." + key + "}"); + } + return column + ("ni".equals(operator) ? " NOT IN (" : " IN (") + String.join(", ", placeholders) + ")"; + } + if (value == null) { + return ""; + } + String key = keyPrefix + indexHolder[0]++; + String expr = buildOperatValueExpr(key, dateField, value); + return switch (operator) { + case "eq" -> { + paramMap.put(key, value); + yield column + " = " + expr; + } + case "neq" -> { + paramMap.put(key, value); + yield column + " <> " + expr; + } + case "contains" -> { + paramMap.put(key, "%" + value + "%"); + yield column + " LIKE #{map." + key + "}"; + } + case "doesnotcontain" -> { + paramMap.put(key, "%" + value + "%"); + yield column + " NOT 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 + " > " + expr; + } + case "gte" -> { + paramMap.put(key, value); + yield column + " >= " + expr; + } + case "lt" -> { + paramMap.put(key, value); + yield column + " < " + expr; + } + case "lte" -> { + paramMap.put(key, value); + yield column + " <= " + expr; + } + default -> ""; + }; + } + + private String buildOperatValueExpr(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 mapOperatSummaryColumn(String field) { + if (!StringUtils.hasText(field)) { + return null; + } + return switch (field) { + case "repCode" -> "cat.repCode"; + case "sttpName" -> "cat.sttpName"; + case "count" -> "COUNT(src.repCode)"; + default -> null; + }; + } + + private String mapOperatBaseColumn(String field) { + if (!StringUtils.hasText(field)) { + return null; + } + return switch (field) { + case "repCode" -> "t.repCode"; + case "sttpCode" -> "t.sttpCode"; + case "stcd" -> "t.stcd"; + case "stnm" -> "t.stnm"; + case "rstcd" -> "t.rstcd"; + case "ennm" -> "t.ennm"; + case "baseId", "baseid" -> "t.baseId"; + case "hbrvcd" -> "t.hbrvcd"; + case "rvcdName" -> "t.rvcdName"; + case "addvcdName" -> "t.addvcdName"; + case "dtin" -> "t.dtin"; + case "bldsttCcode" -> "t.bldsttCcode"; + default -> null; + }; + } + + private String mapOperatGroupColumn(String field) { + if (!StringUtils.hasText(field)) { + return null; + } + return switch (field) { + case "repCode" -> "t.repCode"; + case "sttpCode" -> "t.sttpCode"; + case "pcode" -> "t.pcode"; + case "pname" -> "t.pname"; + case "sttpName" -> "t.sttpName"; + case "stcd" -> "t.stcd"; + case "ennm" -> "t.ennm"; + case "stnm" -> "t.stnm"; + case "addvcdName" -> "t.addvcdName"; + case "rvcdName" -> "t.rvcdName"; + case "baseId", "baseid" -> "t.baseId"; + case "dtin" -> "t.dtin"; + case "runState" -> "t.runState"; + case "stdState" -> "t.stdState"; + case "runSstate" -> "t.runSstate"; + case "bldsttCcode" -> "t.bldsttCcode"; + case "yr" -> "t.yr"; + default -> null; + }; + } + + private String buildOperatGroupOrderBySql(List groups) { + if (CollUtil.isEmpty(groups)) { + return ""; + } + List orderItems = new ArrayList<>(); + for (DataSourceRequest.GroupDescriptor descriptor : groups) { + if (descriptor == null || !StringUtils.hasText(descriptor.getField())) { + continue; + } + String column = mapOperatGroupColumn(descriptor.getField()); + if (!StringUtils.hasText(column)) { + continue; + } + String dir = "desc".equalsIgnoreCase(descriptor.getDir()) || "des".equalsIgnoreCase(descriptor.getDir()) ? "DESC" : "ASC"; + orderItems.add(column + " " + dir); + } + if (orderItems.isEmpty()) { + return ""; + } + return " ORDER BY " + String.join(", ", orderItems); + } + + private boolean containsOperatYearFilter(DataSourceRequest.FilterDescriptor filter) { + if (filter == null) { + return false; + } + if ("yr".equalsIgnoreCase(filter.getField())) { + return true; + } + if (CollUtil.isEmpty(filter.getFilters())) { + return false; + } + for (DataSourceRequest.FilterDescriptor child : filter.getFilters()) { + if (containsOperatYearFilter(child)) { + return true; + } + } + return false; + } + private String buildAggregateSql(String aggregate, String column, String field) { String upperField = field == null ? "" : field.toUpperCase(); return switch (aggregate.toLowerCase()) { @@ -1307,10 +1839,12 @@ public class SdEngInfoBHServiceImpl extends ServiceImpl "t.id"; + case "sttp" -> "t.sttp"; case "sttpCode" -> "t.sttpCode"; case "sttpName" -> "t.sttpName"; case "stcd" -> "t.stcd"; case "stnm", "ennm" -> "t.stnm"; + case "dtinEnv" -> "t.dtinEnv"; case "baseId" -> "t.baseId"; case "baseName" -> "t.baseName"; case "hbrvcd" -> "t.hbrvcd";