diff --git a/backend/src/main/java/com/yfd/platform/qgc_base/entity/vo/BatchDeleteAo.java b/backend/src/main/java/com/yfd/platform/qgc_base/entity/vo/BatchDeleteAo.java index 2fbb7069..f9bab6ca 100644 --- a/backend/src/main/java/com/yfd/platform/qgc_base/entity/vo/BatchDeleteAo.java +++ b/backend/src/main/java/com/yfd/platform/qgc_base/entity/vo/BatchDeleteAo.java @@ -12,6 +12,9 @@ public class BatchDeleteAo implements Serializable { private static final long serialVersionUID = 1L; + @Schema(description = "数据来源") + private String source; + @Schema(description = "数据类型") private String dataType; diff --git a/backend/src/main/java/com/yfd/platform/qgc_env/overview/controller/OverviewController.java b/backend/src/main/java/com/yfd/platform/qgc_env/overview/controller/OverviewController.java index 5858db55..a3ed0a61 100644 --- a/backend/src/main/java/com/yfd/platform/qgc_env/overview/controller/OverviewController.java +++ b/backend/src/main/java/com/yfd/platform/qgc_env/overview/controller/OverviewController.java @@ -26,4 +26,10 @@ public class OverviewController { public ResponseResult getMsstbprptList(@RequestBody DataSourceRequest dataSourceRequest) { return ResponseResult.successData(overviewService.getMsstbprptList(dataSourceRequest)); } + + @PostMapping("/oped/GetKendoListCust") + @Operation(summary = "首页环保设施运行状况明细") + public ResponseResult getOpedList(@RequestBody DataSourceRequest dataSourceRequest) { + return ResponseResult.successData(overviewService.getOpedList(dataSourceRequest)); + } } diff --git a/backend/src/main/java/com/yfd/platform/qgc_env/overview/entity/vo/OverviewOpedVo.java b/backend/src/main/java/com/yfd/platform/qgc_env/overview/entity/vo/OverviewOpedVo.java new file mode 100644 index 00000000..32fb39d7 --- /dev/null +++ b/backend/src/main/java/com/yfd/platform/qgc_env/overview/entity/vo/OverviewOpedVo.java @@ -0,0 +1,44 @@ +package com.yfd.platform.qgc_env.overview.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 OverviewOpedVo implements Serializable { + + private static final long serialVersionUID = 1L; + + private String sttpName; + private String baseId; + private String stcd; + private String stnm; + private String sttpCode; + private String baseName; + private String rstcd; + private String ennm; + private String bldsttCcode; + private String bldsttCcodeName; + private Date dtinTm; + private Integer dtin; + private String dtinName; + private Integer runState; + private String runStateName; + private Integer stdState; + private String stdStateName; + private Integer stdSstate; + private String stdSstateName; + private Integer mway; + private String mwayName; + private String hbrvcd; + private String hbrvcdName; + private Integer baseStepSort; + private Integer baseStepsort; + private Integer rvcdStepSort; + private Integer rstcdStepSort; + private Integer rstcdStepsort; + private Integer siteStepSort; +} diff --git a/backend/src/main/java/com/yfd/platform/qgc_env/overview/service/OverviewService.java b/backend/src/main/java/com/yfd/platform/qgc_env/overview/service/OverviewService.java index c8be8692..481e665f 100644 --- a/backend/src/main/java/com/yfd/platform/qgc_env/overview/service/OverviewService.java +++ b/backend/src/main/java/com/yfd/platform/qgc_env/overview/service/OverviewService.java @@ -3,8 +3,11 @@ package com.yfd.platform.qgc_env.overview.service; import com.yfd.platform.common.DataSourceRequest; import com.yfd.platform.common.DataSourceResult; import com.yfd.platform.qgc_env.overview.entity.vo.OverviewMsstbprptVo; +import com.yfd.platform.qgc_env.overview.entity.vo.OverviewOpedVo; public interface OverviewService { DataSourceResult getMsstbprptList(DataSourceRequest dataSourceRequest); + + DataSourceResult getOpedList(DataSourceRequest dataSourceRequest); } diff --git a/backend/src/main/java/com/yfd/platform/qgc_env/overview/service/impl/OverviewServiceImpl.java b/backend/src/main/java/com/yfd/platform/qgc_env/overview/service/impl/OverviewServiceImpl.java index f516c562..a33c4f14 100644 --- a/backend/src/main/java/com/yfd/platform/qgc_env/overview/service/impl/OverviewServiceImpl.java +++ b/backend/src/main/java/com/yfd/platform/qgc_env/overview/service/impl/OverviewServiceImpl.java @@ -6,19 +6,24 @@ import com.baomidou.mybatisplus.extension.plugins.pagination.Page; import com.yfd.platform.common.DataSourceLoadOptionsBase; import com.yfd.platform.common.DataSourceRequest; import com.yfd.platform.common.DataSourceResult; +import com.yfd.platform.common.GroupHelper; +import com.yfd.platform.common.GroupingInfo; import com.yfd.platform.common.MicroservicDynamicSQLMapper; import com.yfd.platform.qgc_env.overview.entity.vo.OverviewMsstbprptVo; +import com.yfd.platform.qgc_env.overview.entity.vo.OverviewOpedVo; import com.yfd.platform.qgc_env.overview.service.OverviewService; import com.yfd.platform.utils.QgcQueryWrapperUtil; import jakarta.annotation.Resource; import org.springframework.stereotype.Service; import java.util.ArrayList; +import java.util.Arrays; import java.util.HashMap; import java.util.LinkedHashMap; import java.util.LinkedHashSet; import java.util.List; import java.util.Map; +import java.time.Year; @Service public class OverviewServiceImpl implements OverviewService { @@ -58,6 +63,49 @@ public class OverviewServiceImpl implements OverviewService { return result; } + @Override + @SuppressWarnings("unchecked") + public DataSourceResult getOpedList(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(); + Map paramMap = new HashMap<>(); + paramMap.put("stateYear", resolveOpedStateYear()); + + String filterSql = buildOpedFilterCondition(dataSourceRequest.getFilter(), paramMap, new int[]{0}); + if (CollUtil.isNotEmpty(dataSourceRequest.getGroup())) { + GroupingInfo[] groupInfos = loadOptions == null ? null : loadOptions.getGroup(); + String groupSql = buildOpedGroupSql(buildOpedDetailSql(null, filterSql), groupInfos); + Page page = loadOptions == null ? null + : QgcQueryWrapperUtil.buildPage(loadOptions, loadOptions.getSkip(), loadOptions.getTake()); + List> rows = microservicDynamicSQLMapper.pageAllList(page, groupSql, paramMap); + 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); + return result; + } + + String sql = buildOpedDetailSql(dataSourceRequest.getSelect(), filterSql) + + buildOpedOrderBySql(dataSourceRequest.getSort()); + Page page = loadOptions == null ? null + : QgcQueryWrapperUtil.buildPage(loadOptions, loadOptions.getSkip(), loadOptions.getTake()); + List list = microservicDynamicSQLMapper.pageAllListWithResultType( + page, sql, paramMap, OverviewOpedVo.class + ); + result.setData(list); + result.setTotal(page == null ? list.size() : page.getTotal()); + return result; + } + private String buildBaseSql() { return buildFbSql() + " UNION ALL " + buildDwSql() + " UNION ALL " + buildFpSql(); } @@ -572,6 +620,484 @@ public class OverviewServiceImpl implements OverviewService { return " ORDER BY " + String.join(", ", orderItems); } + private Integer resolveOpedStateYear() { + return Year.now().getValue(); + } + + private String buildOpedDetailSql(List selectFields, String filterSql) { + StringBuilder sql = new StringBuilder(); + sql.append("SELECT ") + .append(buildOpedSelectSql(selectFields)) + .append(" FROM (") + .append(buildOpedBaseSql()) + .append(") t WHERE 1 = 1 "); + if (StrUtil.isNotBlank(filterSql)) { + sql.append(" AND ").append(filterSql); + } + return sql.toString(); + } + + private String buildOpedBaseSql() { + return "SELECT " + + "src.sttpName AS sttpName, " + + "src.baseId AS baseId, " + + "src.stcd AS stcd, " + + "src.stnm AS stnm, " + + "src.sttpCode AS sttpCode, " + + "src.baseName AS baseName, " + + "src.rstcd AS rstcd, " + + "src.ennm AS ennm, " + + "src.bldsttCcode AS bldsttCcode, " + + "src.bldsttCcodeName AS bldsttCcodeName, " + + "src.dtinTm AS dtinTm, " + + "src.dtin AS dtin, " + + "src.dtinName AS dtinName, " + + "state.RUN_STATE AS runState, " + + "CASE WHEN state.RUN_STATE = 1 THEN '运行中' " + + "WHEN state.RUN_STATE IN (0, 2) THEN '未运行' ELSE NULL END AS runStateName, " + + "state.STD_STATE AS stdState, " + + "CASE WHEN state.STD_STATE = 1 THEN '达标' " + + "WHEN state.STD_STATE = 2 THEN '无数据' " + + "WHEN state.STD_STATE IN (0, 3) THEN '未达标' ELSE NULL END AS stdStateName, " + + "state.STD_SSTATE AS stdSstate, " + + "CASE WHEN state.STD_SSTATE = 1 THEN '正常运行' " + + "WHEN state.STD_SSTATE IN (0, 2) THEN '暂无数据' " + + "WHEN state.STD_SSTATE = 3 THEN '未正常运行' ELSE NULL END AS stdSstateName, " + + "CAST(NULL AS NUMBER(10)) AS mway, " + + "CAST(NULL AS VARCHAR2(32)) AS mwayName, " + + "src.hbrvcd AS hbrvcd, " + + "src.hbrvcdName AS hbrvcdName, " + + "src.baseStepSort AS baseStepSort, " + +// "src.baseStepSort AS baseStepsort, " + + "src.rvcdStepSort AS rvcdStepSort, " + + "src.rstcdStepSort AS rstcdStepSort, " + +// "src.rstcdStepSort AS rstcdStepsort, " + + "src.siteStepSort AS siteStepSort " + +// "#{map.stateYear} AS yr " + + "FROM (" + buildOpedUnionSql() + ") src " + + "LEFT JOIN MS_STSTATE_T state ON state.STCD = src.stcd " + + "AND NVL(state.IS_DELETED, 0) = 0 " + + "AND state.YR = #{map.stateYear}"; + } + + private String buildOpedUnionSql() { + return buildOpedBranchSql( + "fb.STCD", "fb.STNM", "'FB'", "child.STTP_NAME", "NVL(fb.BASE_ID, eng.BASE_ID)", + "hb.BASENAME", "fb.RSTCD", "eng.ENNM", "NVL(fb.HBRVCD, eng.HBRVCD)", "hbrv.HBRVNM", + "CAST(fb.BLDSTT_CODE AS VARCHAR2(10))", buildBldsttNameExpr("fb.BLDSTT_CODE"), "fb.DTIN_TM", "fb.DTIN", + "CASE WHEN NVL(fb.DTIN, 0) = 1 THEN '已接入' ELSE '未接入' END", + "NVL(hb.ORDER_INDEX, 999999)", "NVL(hbrv.ORDER_INDEX, 999999)", "NVL(eng.ORDER_INDEX, 999999)", "NVL(fb.ORDER_INDEX, 999999)", + "SD_FBRD_B_H fb", + "LEFT JOIN SD_STTP_B child ON child.STTP_CODE = fb.STTP AND NVL(child.IS_DELETED, 0) = 0 AND NVL(child.ENABLE, 1) = 1 " + + "LEFT JOIN SD_ENGINFO_B_H eng ON eng.STCD = fb.RSTCD AND NVL(eng.IS_DELETED, 0) = 0 " + + "LEFT JOIN SD_HYDROBASE hb ON hb.BASEID = NVL(fb.BASE_ID, eng.BASE_ID) AND NVL(hb.IS_DELETED, 0) = 0 " + + "LEFT JOIN SD_HBRV_DIC hbrv ON hbrv.HBRVCD = NVL(fb.HBRVCD, eng.HBRVCD) AND hbrv.BASEID = NVL(fb.BASE_ID, eng.BASE_ID) " + + "AND NVL(hbrv.IS_DELETED, 0) = 0 AND NVL(hbrv.ENABLED, 1) = 1", + "1 = 1" + ) + " UNION ALL " + + buildOpedBranchSql( + "vp.STCD", "vp.STNM", "'VP'", "child.STTP_NAME", "NVL(vp.BASE_ID, eng.BASE_ID)", + "hb.BASENAME", "vp.RSTCD", "eng.ENNM", "NVL(vp.HBRVCD, eng.HBRVCD)", "hbrv.HBRVNM", + "CAST(vp.BLDSTT_CODE AS VARCHAR2(10))", buildBldsttNameExpr("vp.BLDSTT_CODE"), "vp.DTIN_TM", "vp.DTIN", + "CASE WHEN NVL(vp.DTIN, 0) = 1 THEN '已接入' ELSE '未接入' END", + "NVL(hb.ORDER_INDEX, 999999)", "NVL(hbrv.ORDER_INDEX, 999999)", "NVL(eng.ORDER_INDEX, 999999)", "NVL(vp.ORDER_INDEX, 999999)", + "SD_VP_B_H vp", + "LEFT JOIN SD_STTP_B child ON child.STTP_CODE = vp.STTP AND NVL(child.IS_DELETED, 0) = 0 AND NVL(child.ENABLE, 1) = 1 " + + "LEFT JOIN SD_ENGINFO_B_H eng ON eng.STCD = vp.RSTCD AND NVL(eng.IS_DELETED, 0) = 0 " + + "LEFT JOIN SD_HYDROBASE hb ON hb.BASEID = NVL(vp.BASE_ID, eng.BASE_ID) AND NVL(hb.IS_DELETED, 0) = 0 " + + "LEFT JOIN SD_HBRV_DIC hbrv ON hbrv.HBRVCD = NVL(vp.HBRVCD, eng.HBRVCD) AND hbrv.BASEID = NVL(vp.BASE_ID, eng.BASE_ID) " + + "AND NVL(hbrv.IS_DELETED, 0) = 0 AND NVL(hbrv.ENABLED, 1) = 1", + "NVL(vp.IS_DELETED, 0) = 0" + ) + " UNION ALL " + + buildOpedBranchSql( + "va.STCD", "va.STNM", "'VA'", "child.STTP_NAME", "NVL(va.BASE_ID, eng.BASE_ID)", + "hb.BASENAME", "va.RSTCD", "eng.ENNM", "NVL(va.HBRVCD, eng.HBRVCD)", "hbrv.HBRVNM", + "CAST(va.BLDSTT_CODE AS VARCHAR2(10))", buildBldsttNameExpr("va.BLDSTT_CODE"), "va.DTIN_TM", "va.DTIN", + "CASE WHEN NVL(va.DTIN, 0) = 1 THEN '已接入' ELSE '未接入' END", + "NVL(hb.ORDER_INDEX, 999999)", "NVL(hbrv.ORDER_INDEX, 999999)", "NVL(eng.ORDER_INDEX, 999999)", "NVL(va.ORDER_INDEX, 999999)", + "SD_VA_B_H va", + "LEFT JOIN SD_STTP_B child ON child.STTP_CODE = va.STTP AND NVL(child.IS_DELETED, 0) = 0 AND NVL(child.ENABLE, 1) = 1 " + + "LEFT JOIN SD_ENGINFO_B_H eng ON eng.STCD = va.RSTCD AND NVL(eng.IS_DELETED, 0) = 0 " + + "LEFT JOIN SD_HYDROBASE hb ON hb.BASEID = NVL(va.BASE_ID, eng.BASE_ID) AND NVL(hb.IS_DELETED, 0) = 0 " + + "LEFT JOIN SD_HBRV_DIC hbrv ON hbrv.HBRVCD = NVL(va.HBRVCD, eng.HBRVCD) AND hbrv.BASEID = NVL(va.BASE_ID, eng.BASE_ID) " + + "AND NVL(hbrv.IS_DELETED, 0) = 0 AND NVL(hbrv.ENABLED, 1) = 1", + "NVL(va.IS_DELETED, 0) = 0" + ) + " UNION ALL " + + buildOpedBranchSql( + "fh.STCD", "fh.STNM", "'FH'", "child.STTP_NAME", "NVL(fh.BASE_ID, eng.BASE_ID)", + "hb.BASENAME", "fh.RSTCD", "eng.ENNM", "NVL(fh.HBRVCD, eng.HBRVCD)", "hbrv.HBRVNM", + "CAST(NULL AS VARCHAR2(10))", "CAST(NULL AS VARCHAR2(32))", "fh.DTIN_TM", "fh.DTIN", + "CASE WHEN NVL(fh.DTIN, 0) = 1 THEN '已接入' ELSE '未接入' END", + "NVL(hb.ORDER_INDEX, 999999)", "NVL(hbrv.ORDER_INDEX, 999999)", "NVL(eng.ORDER_INDEX, 999999)", "NVL(fh.ORDER_INDEX, 999999)", + "SD_FHBT_B_H fh", + "LEFT JOIN SD_STTP_B child ON child.STTP_CODE = 'FH' AND NVL(child.IS_DELETED, 0) = 0 AND NVL(child.ENABLE, 1) = 1 " + + "LEFT JOIN SD_ENGINFO_B_H eng ON eng.STCD = fh.RSTCD AND NVL(eng.IS_DELETED, 0) = 0 " + + "LEFT JOIN SD_HYDROBASE hb ON hb.BASEID = NVL(fh.BASE_ID, eng.BASE_ID) AND NVL(hb.IS_DELETED, 0) = 0 " + + "LEFT JOIN SD_HBRV_DIC hbrv ON hbrv.HBRVCD = NVL(fh.HBRVCD, eng.HBRVCD) AND hbrv.BASEID = NVL(fh.BASE_ID, eng.BASE_ID) " + + "AND NVL(hbrv.IS_DELETED, 0) = 0 AND NVL(hbrv.ENABLED, 1) = 1", + "NVL(fh.IS_DELETED, 0) = 0" + ) + " UNION ALL " + + buildOpedBranchSql( + "dw.STCD", "dw.STNM", "'DW'", "child.STTP_NAME", "NVL(dw.BASE_ID, eng.BASE_ID)", + "hb.BASENAME", "dw.RSTCD", "eng.ENNM", "NVL(dw.HBRVCD, eng.HBRVCD)", "hbrv.HBRVNM", + "CAST(dw.BLDSTT_CODE AS VARCHAR2(10))", buildBldsttNameExpr("dw.BLDSTT_CODE"), "dw.DTIN_TM", "dw.DTIN", + "CASE WHEN NVL(dw.DTIN, 0) = 1 THEN '已接入' ELSE '未接入' END", + "NVL(hb.ORDER_INDEX, 999999)", "NVL(hbrv.ORDER_INDEX, 999999)", "NVL(eng.ORDER_INDEX, 999999)", "NVL(dw.ORDER_INDEX, 999999)", + "SD_DW_B_H dw", + "LEFT JOIN SD_STTP_B child ON child.STTP_CODE = dw.STTP AND NVL(child.IS_DELETED, 0) = 0 AND NVL(child.ENABLE, 1) = 1 " + + "LEFT JOIN SD_ENGINFO_B_H eng ON eng.STCD = dw.RSTCD AND NVL(eng.IS_DELETED, 0) = 0 " + + "LEFT JOIN SD_HYDROBASE hb ON hb.BASEID = NVL(dw.BASE_ID, eng.BASE_ID) AND NVL(hb.IS_DELETED, 0) = 0 " + + "LEFT JOIN SD_HBRV_DIC hbrv ON hbrv.HBRVCD = NVL(dw.HBRVCD, eng.HBRVCD) AND hbrv.BASEID = NVL(dw.BASE_ID, eng.BASE_ID) " + + "AND NVL(hbrv.IS_DELETED, 0) = 0 AND NVL(hbrv.ENABLED, 1) = 1", + "NVL(dw.IS_DELETED, 0) = 0" + ) + " UNION ALL " + + buildOpedBranchSql( + "fp.STCD", "fp.STNM", "'FP'", "child.STTP_NAME", "eng.BASE_ID", + "hb.BASENAME", "fp.RSTCD", "eng.ENNM", "eng.HBRVCD", "hbrv.HBRVNM", + "CAST(fp.BLDSTT_CODE AS VARCHAR2(10))", buildBldsttNameExpr("fp.BLDSTT_CODE"), "fp.DTIN_TM", "fp.DTIN", + "CASE WHEN NVL(fp.DTIN, 0) = 1 THEN '已接入' ELSE '未接入' END", + "NVL(hb.ORDER_INDEX, 999999)", "NVL(hbrv.ORDER_INDEX, 999999)", "NVL(eng.ORDER_INDEX, 999999)", "NVL(fp.ORDER_INDEX, 999999)", + "SD_FPSS_B_H fp", + "LEFT JOIN SD_STTP_B child ON child.STTP_CODE = fp.STTP AND NVL(child.IS_DELETED, 0) = 0 AND NVL(child.ENABLE, 1) = 1 " + + "LEFT JOIN SD_ENGINFO_B_H eng ON eng.STCD = fp.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 SD_HBRV_DIC hbrv ON hbrv.HBRVCD = eng.HBRVCD AND hbrv.BASEID = eng.BASE_ID " + + "AND NVL(hbrv.IS_DELETED, 0) = 0 AND NVL(hbrv.ENABLED, 1) = 1", + "1 = 1 AND fp.STTP LIKE 'FP\\_%' ESCAPE '\\' " + ) + " UNION ALL " + + buildOpedBranchSql( + "eq.STCD", "eq.STNM", "'EQ'", "child.STTP_NAME", "NVL(eq.BASE_ID, eng.BASE_ID)", + "hb.BASENAME", "eq.RSTCD", "eng.ENNM", "NVL(eq.HBRVCD, eng.HBRVCD)", "hbrv.HBRVNM", + "CAST(eq.BLDSTT_CODE AS VARCHAR2(10))", buildBldsttNameExpr("eq.BLDSTT_CODE"), "eq.DTIN_TM", "eq.DTIN", + "CASE WHEN NVL(eq.DTIN, 0) = 1 THEN '已接入' ELSE '未接入' END", + "NVL(hb.ORDER_INDEX, 999999)", "NVL(hbrv.ORDER_INDEX, 999999)", "NVL(eng.ORDER_INDEX, 999999)", "NVL(eq.ORDER_INDEX, 999999)", + "SD_EQ_B_H eq", + "LEFT JOIN SD_STTP_B child ON child.STTP_CODE = eq.STTP AND NVL(child.IS_DELETED, 0) = 0 AND NVL(child.ENABLE, 1) = 1 " + + "LEFT JOIN SD_ENGINFO_B_H eng ON eng.STCD = eq.RSTCD AND NVL(eng.IS_DELETED, 0) = 0 " + + "LEFT JOIN SD_HYDROBASE hb ON hb.BASEID = NVL(eq.BASE_ID, eng.BASE_ID) AND NVL(hb.IS_DELETED, 0) = 0 " + + "LEFT JOIN SD_HBRV_DIC hbrv ON hbrv.HBRVCD = NVL(eq.HBRVCD, eng.HBRVCD) AND hbrv.BASEID = NVL(eq.BASE_ID, eng.BASE_ID) " + + "AND NVL(hbrv.IS_DELETED, 0) = 0 AND NVL(hbrv.ENABLED, 1) = 1", + "NVL(eq.IS_DELETED, 0) = 0" + ); + } + + private String buildOpedBranchSql(String stcdExpr, + String stnmExpr, + String sttpCodeExpr, + String sttpNameExpr, + String baseIdExpr, + String baseNameExpr, + String rstcdExpr, + String ennmExpr, + String hbrvcdExpr, + String hbrvcdNameExpr, + String bldsttExpr, + String bldsttNameExpr, + String dtinTmExpr, + String dtinExpr, + String dtinNameExpr, + String baseStepSortExpr, + String rvcdStepSortExpr, + String rstcdStepSortExpr, + String siteStepSortExpr, + String fromSql, + String joinSql, + String whereSql) { + return "SELECT " + + sttpNameExpr + " AS sttpName, " + + baseIdExpr + " AS baseId, " + + stcdExpr + " AS stcd, " + + stnmExpr + " AS stnm, " + + sttpCodeExpr + " AS sttpCode, " + + baseNameExpr + " AS baseName, " + + rstcdExpr + " AS rstcd, " + + ennmExpr + " AS ennm, " + + bldsttExpr + " AS bldsttCcode, " + + bldsttNameExpr + " AS bldsttCcodeName, " + + dtinTmExpr + " AS dtinTm, " + + dtinExpr + " AS dtin, " + + dtinNameExpr + " AS dtinName, " + + hbrvcdExpr + " AS hbrvcd, " + + hbrvcdNameExpr + " AS hbrvcdName, " + + baseStepSortExpr + " AS baseStepSort, " + + rvcdStepSortExpr + " AS rvcdStepSort, " + + rstcdStepSortExpr + " AS rstcdStepSort, " + + siteStepSortExpr + " AS siteStepSort " + + "FROM " + fromSql + " " + joinSql + " WHERE " + whereSql; + } + + private String buildBldsttNameExpr(String column) { + return "CASE " + column + " WHEN 0 THEN '未建/规划' WHEN 1 THEN '在建' WHEN 2 THEN '已建' ELSE NULL END"; + } + + private List resolveOpedSelectFields(List select) { + List fields = CollUtil.isEmpty(select) + ? new ArrayList<>(buildOpedSelectMap().keySet()) + : new ArrayList<>(select); + LinkedHashSet uniqueFields = new LinkedHashSet<>(); + for (String field : fields) { + if (StrUtil.isNotBlank(field)) { + uniqueFields.add(field.trim()); + } + } + if (uniqueFields.isEmpty()) { + uniqueFields.add("stcd"); + } + return new ArrayList<>(uniqueFields); + } + + private String buildOpedSelectSql(List selectFields) { + Map columnMap = buildOpedSelectMap(); + List selectParts = new ArrayList<>(); + for (String field : resolveOpedSelectFields(selectFields)) { + String column = columnMap.get(field); + if (StrUtil.isNotBlank(column)) { + selectParts.add(column); + } else { + selectParts.add("NULL AS \"" + field + "\""); + } + } + return String.join(", ", selectParts); + } + + private Map buildOpedSelectMap() { + Map columnMap = new LinkedHashMap<>(); + columnMap.put("sttpName", "t.sttpName AS \"sttpName\""); + columnMap.put("baseId", "t.baseId AS \"baseId\""); + columnMap.put("stcd", "t.stcd AS \"stcd\""); + columnMap.put("stnm", "t.stnm AS \"stnm\""); + columnMap.put("sttpCode", "t.sttpCode AS \"sttpCode\""); + columnMap.put("baseName", "t.baseName AS \"baseName\""); + columnMap.put("rstcd", "t.rstcd AS \"rstcd\""); + columnMap.put("ennm", "t.ennm AS \"ennm\""); + columnMap.put("bldsttCcode", "t.bldsttCcode AS \"bldsttCcode\""); + columnMap.put("bldsttCcodeName", "t.bldsttCcodeName AS \"bldsttCcodeName\""); + columnMap.put("dtinTm", "t.dtinTm AS \"dtinTm\""); + columnMap.put("dtin", "t.dtin AS \"dtin\""); + columnMap.put("dtinName", "t.dtinName AS \"dtinName\""); + columnMap.put("runState", "t.runState AS \"runState\""); + columnMap.put("runStateName", "t.runStateName AS \"runStateName\""); + columnMap.put("stdState", "t.stdState AS \"stdState\""); + columnMap.put("stdStateName", "t.stdStateName AS \"stdStateName\""); + columnMap.put("stdSstate", "t.stdSstate AS \"stdSstate\""); + columnMap.put("stdSstateName", "t.stdSstateName AS \"stdSstateName\""); + columnMap.put("mway", "t.mway AS \"mway\""); + columnMap.put("mwayName", "t.mwayName AS \"mwayName\""); + columnMap.put("hbrvcd", "t.hbrvcd AS \"hbrvcd\""); + columnMap.put("hbrvcdName", "t.hbrvcdName AS \"hbrvcdName\""); + columnMap.put("baseStepSort", "t.baseStepSort AS \"baseStepSort\""); +// columnMap.put("baseStepsort", "t.baseStepsort AS \"baseStepsort\""); + columnMap.put("rvcdStepSort", "t.rvcdStepSort AS \"rvcdStepSort\""); + columnMap.put("rstcdStepSort", "t.rstcdStepSort AS \"rstcdStepSort\""); +// columnMap.put("rstcdStepsort", "t.rstcdStepsort AS \"rstcdStepsort\""); + columnMap.put("siteStepSort", "t.siteStepSort AS \"siteStepSort\""); +// columnMap.put("yr", "t.yr AS \"yr\""); + return columnMap; + } + + private String buildOpedFilterCondition(DataSourceRequest.FilterDescriptor filter, + Map paramMap, + int[] indexHolder) { + if (filter == null) { + return ""; + } + if (StrUtil.isNotBlank(filter.getField())) { + return buildOpedLeafCondition(filter, paramMap, indexHolder); + } + if (CollUtil.isEmpty(filter.getFilters())) { + return ""; + } + List conditions = new ArrayList<>(); + for (DataSourceRequest.FilterDescriptor child : filter.getFilters()) { + String childSql = buildOpedFilterCondition(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 buildOpedLeafCondition(DataSourceRequest.FilterDescriptor filter, + Map paramMap, + int[] indexHolder) { + String field = filter.getField(); + if (StrUtil.isBlank(field) || "yr".equals(field)) { + return ""; + } + String operator = StrUtil.blankToDefault(filter.getOperator(), "eq").toLowerCase(); + String column = mapOpedColumn(field); + if (StrUtil.isBlank(column)) { + return ""; + } + 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 = normalizeValues(filter.getValue()); + if (values.isEmpty()) { + return ""; + } + List placeholders = new ArrayList<>(); + for (Object item : values) { + String key = "opedP" + indexHolder[0]++; + paramMap.put(key, item); + placeholders.add("#{map." + key + "}"); + } + return column + ("ni".equals(operator) ? " NOT IN (" : " IN (") + String.join(", ", placeholders) + ")"; + } + + Object value = filter.getValue(); + if (value == null) { + return ""; + } + String key = "opedP" + indexHolder[0]++; + boolean dateField = isOpedDateField(field); + String placeholder = dateField + ? "TO_DATE(#{map." + key + "}, 'YYYY-MM-DD HH24:MI:SS')" + : "#{map." + key + "}"; + paramMap.put(key, value); + return switch (operator) { + case "eq" -> column + " = " + placeholder; + case "neq" -> column + " <> " + placeholder; + case "contains" -> { + paramMap.put(key, "%" + value + "%"); + yield dateField + ? "TO_CHAR(" + column + ", 'YYYY-MM-DD HH24:MI:SS') LIKE #{map." + key + "}" + : column + " LIKE #{map." + key + "}"; + } + case "doesnotcontain" -> { + paramMap.put(key, "%" + value + "%"); + yield dateField + ? "TO_CHAR(" + column + ", 'YYYY-MM-DD HH24:MI:SS') NOT LIKE #{map." + key + "}" + : column + " NOT LIKE #{map." + key + "}"; + } + case "startswith" -> { + paramMap.put(key, value + "%"); + yield dateField + ? "TO_CHAR(" + column + ", 'YYYY-MM-DD HH24:MI:SS') LIKE #{map." + key + "}" + : column + " LIKE #{map." + key + "}"; + } + case "endswith" -> { + paramMap.put(key, "%" + value); + yield dateField + ? "TO_CHAR(" + column + ", 'YYYY-MM-DD HH24:MI:SS') LIKE #{map." + key + "}" + : column + " LIKE #{map." + key + "}"; + } + case "gt" -> column + " > " + placeholder; + case "gte" -> column + " >= " + placeholder; + case "lt" -> column + " < " + placeholder; + case "lte" -> column + " <= " + placeholder; + default -> ""; + }; + } + + private boolean isOpedDateField(String field) { + return "dtinTm".equals(field); + } + + private String mapOpedColumn(String field) { + if (StrUtil.isBlank(field)) { + return null; + } + return switch (field) { + case "sttpName" -> "t.sttpName"; + case "baseId" -> "t.baseId"; + case "stcd" -> "t.stcd"; + case "stnm" -> "t.stnm"; + case "sttpCode" -> "t.sttpCode"; + case "baseName" -> "t.baseName"; + case "rstcd" -> "t.rstcd"; + case "ennm" -> "t.ennm"; + case "bldsttCcode" -> "t.bldsttCcode"; + case "bldsttCcodeName" -> "t.bldsttCcodeName"; + case "dtinTm" -> "t.dtinTm"; + case "dtin" -> "t.dtin"; + case "dtinName" -> "t.dtinName"; + case "runState" -> "t.runState"; + case "runStateName" -> "t.runStateName"; + case "stdState" -> "t.stdState"; + case "stdStateName" -> "t.stdStateName"; + case "stdSstate" -> "t.stdSstate"; + case "stdSstateName" -> "t.stdSstateName"; + case "mway" -> "t.mway"; + case "mwayName" -> "t.mwayName"; + case "hbrvcd" -> "t.hbrvcd"; + case "hbrvcdName" -> "t.hbrvcdName"; + case "baseStepSort", "baseStepsort" -> "t.baseStepSort"; + case "rvcdStepSort" -> "t.rvcdStepSort"; + case "rstcdStepSort", "rstcdStepsort" -> "t.rstcdStepSort"; + case "siteStepSort" -> "t.siteStepSort"; + case "yr" -> "t.yr"; + default -> null; + }; + } + + private String buildOpedOrderBySql(List sortList) { + if (CollUtil.isEmpty(sortList)) { + return " ORDER BY t.baseStepSort ASC NULLS LAST, t.rvcdStepSort ASC NULLS LAST, " + + "t.rstcdStepSort ASC NULLS LAST, t.siteStepSort ASC NULLS LAST, t.stnm ASC"; + } + List orderItems = new ArrayList<>(); + for (DataSourceRequest.SortDescriptor sort : sortList) { + if (sort == null || StrUtil.isBlank(sort.getField())) { + continue; + } + String column = mapOpedColumn(sort.getField()); + if (StrUtil.isBlank(column)) { + continue; + } + String dir = "desc".equalsIgnoreCase(sort.getDir()) || "des".equalsIgnoreCase(sort.getDir()) ? "DESC" : "ASC"; + orderItems.add(column + " " + dir + " NULLS LAST"); + } + if (orderItems.isEmpty()) { + return " ORDER BY t.baseStepSort ASC NULLS LAST, t.rvcdStepSort ASC NULLS LAST, " + + "t.rstcdStepSort ASC NULLS LAST, t.siteStepSort ASC NULLS LAST, t.stnm ASC"; + } + return " ORDER BY " + String.join(", ", orderItems); + } + + private String buildOpedGroupSql(String detailSql, GroupingInfo[] groupInfos) { + if (groupInfos == null || groupInfos.length == 0) { + return detailSql; + } + List groupFields = new ArrayList<>(); + List selectItems = new ArrayList<>(); + List orderItems = new ArrayList<>(); + for (GroupingInfo item : groupInfos) { + if (item == null || StrUtil.isBlank(item.getSelector())) { + continue; + } + String selector = item.getSelector(); + String column = mapOpedColumn(selector); + if (StrUtil.isBlank(column)) { + continue; + } + groupFields.add(column); + selectItems.add(column + " AS " + selector); + selectItems.add("COUNT(*) AS count_" + selector); + orderItems.add(column + (item.getDesc() ? " DESC" : " ASC")); + } + if (groupFields.isEmpty()) { + return "SELECT * FROM (" + detailSql + ") t WHERE 1 = 0"; + } + return "SELECT " + String.join(", ", selectItems) + + " FROM (" + detailSql + ") t GROUP BY " + String.join(", ", groupFields) + + " ORDER BY " + String.join(", ", orderItems); + } + private List normalizeValues(Object value) { List values = new ArrayList<>(); collectValues(value, values);