feat: 首页环保设施运行状况明细

This commit is contained in:
tangwei 2026-06-29 11:07:18 +08:00
parent 156e449267
commit 23005d7cfc
5 changed files with 582 additions and 0 deletions

View File

@ -12,6 +12,9 @@ public class BatchDeleteAo implements Serializable {
private static final long serialVersionUID = 1L; private static final long serialVersionUID = 1L;
@Schema(description = "数据来源")
private String source;
@Schema(description = "数据类型") @Schema(description = "数据类型")
private String dataType; private String dataType;

View File

@ -26,4 +26,10 @@ public class OverviewController {
public ResponseResult getMsstbprptList(@RequestBody DataSourceRequest dataSourceRequest) { public ResponseResult getMsstbprptList(@RequestBody DataSourceRequest dataSourceRequest) {
return ResponseResult.successData(overviewService.getMsstbprptList(dataSourceRequest)); return ResponseResult.successData(overviewService.getMsstbprptList(dataSourceRequest));
} }
@PostMapping("/oped/GetKendoListCust")
@Operation(summary = "首页环保设施运行状况明细")
public ResponseResult getOpedList(@RequestBody DataSourceRequest dataSourceRequest) {
return ResponseResult.successData(overviewService.getOpedList(dataSourceRequest));
}
} }

View File

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

View File

@ -3,8 +3,11 @@ package com.yfd.platform.qgc_env.overview.service;
import com.yfd.platform.common.DataSourceRequest; import com.yfd.platform.common.DataSourceRequest;
import com.yfd.platform.common.DataSourceResult; 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.OverviewMsstbprptVo;
import com.yfd.platform.qgc_env.overview.entity.vo.OverviewOpedVo;
public interface OverviewService { public interface OverviewService {
DataSourceResult<OverviewMsstbprptVo> getMsstbprptList(DataSourceRequest dataSourceRequest); DataSourceResult<OverviewMsstbprptVo> getMsstbprptList(DataSourceRequest dataSourceRequest);
DataSourceResult<OverviewOpedVo> getOpedList(DataSourceRequest dataSourceRequest);
} }

View File

@ -6,19 +6,24 @@ import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import com.yfd.platform.common.DataSourceLoadOptionsBase; import com.yfd.platform.common.DataSourceLoadOptionsBase;
import com.yfd.platform.common.DataSourceRequest; import com.yfd.platform.common.DataSourceRequest;
import com.yfd.platform.common.DataSourceResult; 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.common.MicroservicDynamicSQLMapper;
import com.yfd.platform.qgc_env.overview.entity.vo.OverviewMsstbprptVo; 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.qgc_env.overview.service.OverviewService;
import com.yfd.platform.utils.QgcQueryWrapperUtil; import com.yfd.platform.utils.QgcQueryWrapperUtil;
import jakarta.annotation.Resource; import jakarta.annotation.Resource;
import org.springframework.stereotype.Service; import org.springframework.stereotype.Service;
import java.util.ArrayList; import java.util.ArrayList;
import java.util.Arrays;
import java.util.HashMap; import java.util.HashMap;
import java.util.LinkedHashMap; import java.util.LinkedHashMap;
import java.util.LinkedHashSet; import java.util.LinkedHashSet;
import java.util.List; import java.util.List;
import java.util.Map; import java.util.Map;
import java.time.Year;
@Service @Service
public class OverviewServiceImpl implements OverviewService { public class OverviewServiceImpl implements OverviewService {
@ -58,6 +63,49 @@ public class OverviewServiceImpl implements OverviewService {
return result; return result;
} }
@Override
@SuppressWarnings("unchecked")
public DataSourceResult<OverviewOpedVo> getOpedList(DataSourceRequest dataSourceRequest) {
DataSourceResult<OverviewOpedVo> result = new DataSourceResult<>();
result.setAggregates(new HashMap<>());
if (dataSourceRequest == null) {
result.setData(new ArrayList<>());
result.setTotal(0L);
return result;
}
DataSourceLoadOptionsBase loadOptions = dataSourceRequest.toDevRequest();
Map<String, Object> 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<Map<String, Object>> rows = microservicDynamicSQLMapper.pageAllList(page, groupSql, paramMap);
if (Boolean.TRUE.equals(dataSourceRequest.getGroupResultFlat())) {
result.setData((List<OverviewOpedVo>) (List<?>) new GroupHelper().faltGroup(rows, Arrays.asList(groupInfos)));
} else {
result.setData((List<OverviewOpedVo>) (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<OverviewOpedVo> list = microservicDynamicSQLMapper.pageAllListWithResultType(
page, sql, paramMap, OverviewOpedVo.class
);
result.setData(list);
result.setTotal(page == null ? list.size() : page.getTotal());
return result;
}
private String buildBaseSql() { private String buildBaseSql() {
return buildFbSql() + " UNION ALL " + buildDwSql() + " UNION ALL " + buildFpSql(); return buildFbSql() + " UNION ALL " + buildDwSql() + " UNION ALL " + buildFpSql();
} }
@ -572,6 +620,484 @@ public class OverviewServiceImpl implements OverviewService {
return " ORDER BY " + String.join(", ", orderItems); return " ORDER BY " + String.join(", ", orderItems);
} }
private Integer resolveOpedStateYear() {
return Year.now().getValue();
}
private String buildOpedDetailSql(List<String> 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<String> resolveOpedSelectFields(List<String> select) {
List<String> fields = CollUtil.isEmpty(select)
? new ArrayList<>(buildOpedSelectMap().keySet())
: new ArrayList<>(select);
LinkedHashSet<String> 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<String> selectFields) {
Map<String, String> columnMap = buildOpedSelectMap();
List<String> 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<String, String> buildOpedSelectMap() {
Map<String, String> 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<String, Object> paramMap,
int[] indexHolder) {
if (filter == null) {
return "";
}
if (StrUtil.isNotBlank(filter.getField())) {
return buildOpedLeafCondition(filter, paramMap, indexHolder);
}
if (CollUtil.isEmpty(filter.getFilters())) {
return "";
}
List<String> 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<String, Object> 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<Object> values = normalizeValues(filter.getValue());
if (values.isEmpty()) {
return "";
}
List<String> 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<DataSourceRequest.SortDescriptor> 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<String> 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<String> groupFields = new ArrayList<>();
List<String> selectItems = new ArrayList<>();
List<String> 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<Object> normalizeValues(Object value) { private List<Object> normalizeValues(Object value) {
List<Object> values = new ArrayList<>(); List<Object> values = new ArrayList<>();
collectValues(value, values); collectValues(value, values);