From fdaba51634eed3f9fdc335ab050419332881ff9a Mon Sep 17 00:00:00 2001 From: tangwei Date: Mon, 6 Jul 2026 11:36:11 +0800 Subject: [PATCH] =?UTF-8?q?feat:=20=E6=A0=96=E6=81=AF=E5=9C=B0/=E7=8F=8D?= =?UTF-8?q?=E7=A8=80=E6=A4=8D=E7=89=A9=E5=9B=AD/=E5=8A=A8=E7=89=A9?= =?UTF-8?q?=E6=95=91=E5=8A=A9=E7=AB=99=E6=8F=8F=E7=82=B9=E6=8E=A5=E5=8F=A3?= =?UTF-8?q?(=E4=BB=85=E6=9F=A5=E8=AF=A2=E5=9C=A8=E5=BB=BA=E7=8A=B6?= =?UTF-8?q?=E6=80=81=E7=9A=84)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../controller/VapConstructionController.java | 6 + .../vap/entity/vo/FhvapBuiltPointVo.java | 57 +++++ .../vap/service/VpConstructionService.java | 3 + .../impl/VpConstructionServiceImpl.java | 216 ++++++++++++++++++ 4 files changed, 282 insertions(+) create mode 100644 backend/src/main/java/com/yfd/platform/qgc_env/vap/entity/vo/FhvapBuiltPointVo.java diff --git a/backend/src/main/java/com/yfd/platform/qgc_env/vap/controller/VapConstructionController.java b/backend/src/main/java/com/yfd/platform/qgc_env/vap/controller/VapConstructionController.java index ef34b630..cf534c58 100644 --- a/backend/src/main/java/com/yfd/platform/qgc_env/vap/controller/VapConstructionController.java +++ b/backend/src/main/java/com/yfd/platform/qgc_env/vap/controller/VapConstructionController.java @@ -76,4 +76,10 @@ public class VapConstructionController { public ResponseResult getVprYearKendoListCust(@RequestBody DataSourceRequest dataSourceRequest) { return ResponseResult.successData(vpConstructionService.getVprYearList(dataSourceRequest)); } + + @PostMapping("/fhvap/built/GetKendoListCust") + @Operation(summary = "栖息地/珍稀植物园/动物救助站描点接口(仅查询在建状态的)") + public ResponseResult getFhvapBuiltPointKendoListCust(@RequestBody DataSourceRequest dataSourceRequest) { + return ResponseResult.successData(vpConstructionService.getFhvapBuiltPointKendoListCust(dataSourceRequest)); + } } diff --git a/backend/src/main/java/com/yfd/platform/qgc_env/vap/entity/vo/FhvapBuiltPointVo.java b/backend/src/main/java/com/yfd/platform/qgc_env/vap/entity/vo/FhvapBuiltPointVo.java new file mode 100644 index 00000000..f71df8e4 --- /dev/null +++ b/backend/src/main/java/com/yfd/platform/qgc_env/vap/entity/vo/FhvapBuiltPointVo.java @@ -0,0 +1,57 @@ +package com.yfd.platform.qgc_env.vap.entity.vo; + +import lombok.Data; + +@Data +public class FhvapBuiltPointVo { + + private String stcd; + + private String stnm; + + private String titleName; + + private String bldsttCcode; + + private String bldstt; + + private Double lttd; + + private Double lgtd; + + private Double dtmel; + + private String rstcds; + + private String ennm; + + private String sttpCode; + + private String dwtp; + + private String dwtpName; + + private String sttpMap; + + private String rvcd; + + private String addvcd; + + private String baseId; + + private String sttp; + + private String anchoPointState; + + private String mway; + + private Integer dtin; + + private String stdSstate; + + private Integer distance; + + private Integer ftpTypeCount; + + private Integer ftpCount; +} \ No newline at end of file diff --git a/backend/src/main/java/com/yfd/platform/qgc_env/vap/service/VpConstructionService.java b/backend/src/main/java/com/yfd/platform/qgc_env/vap/service/VpConstructionService.java index 0a362f81..44fd2569 100644 --- a/backend/src/main/java/com/yfd/platform/qgc_env/vap/service/VpConstructionService.java +++ b/backend/src/main/java/com/yfd/platform/qgc_env/vap/service/VpConstructionService.java @@ -2,6 +2,7 @@ package com.yfd.platform.qgc_env.vap.service; import com.yfd.platform.common.DataSourceRequest; import com.yfd.platform.common.DataSourceResult; +import com.yfd.platform.qgc_env.vap.entity.vo.FhvapBuiltPointVo; import com.yfd.platform.qgc_env.vap.entity.vo.VpBasinIntDetailVo; import com.yfd.platform.qgc_env.vap.entity.vo.VpVarVo; import com.yfd.platform.qgc_env.vap.entity.vo.VpStInfoResultVo; @@ -27,4 +28,6 @@ public interface VpConstructionService { DataSourceResult getVarYearList(DataSourceRequest dataSourceRequest); DataSourceResult getVprYearList(DataSourceRequest dataSourceRequest); + + DataSourceResult getFhvapBuiltPointKendoListCust(DataSourceRequest dataSourceRequest); } diff --git a/backend/src/main/java/com/yfd/platform/qgc_env/vap/service/impl/VpConstructionServiceImpl.java b/backend/src/main/java/com/yfd/platform/qgc_env/vap/service/impl/VpConstructionServiceImpl.java index e0bc4ccf..7b0727c4 100644 --- a/backend/src/main/java/com/yfd/platform/qgc_env/vap/service/impl/VpConstructionServiceImpl.java +++ b/backend/src/main/java/com/yfd/platform/qgc_env/vap/service/impl/VpConstructionServiceImpl.java @@ -9,6 +9,7 @@ import com.yfd.platform.common.GroupHelper; import com.yfd.platform.common.GroupingInfo; import com.yfd.platform.common.MicroservicDynamicSQLMapper; import com.yfd.platform.common.PageInfo; +import com.yfd.platform.qgc_env.vap.entity.vo.FhvapBuiltPointVo; import com.yfd.platform.qgc_env.vap.entity.vo.VpBasinIntDetailVo; import com.yfd.platform.qgc_env.vap.entity.vo.VpConstructionSituationVo; import com.yfd.platform.qgc_env.vap.entity.vo.VpVarVo; @@ -1908,4 +1909,219 @@ public class VpConstructionServiceImpl implements VpConstructionService { dataSourceResult.setTotal(page != null ? page.getTotal() : (long) yList.size()); return dataSourceResult; } + + @Override + public DataSourceResult getFhvapBuiltPointKendoListCust(DataSourceRequest dataSourceRequest) { + DataSourceResult dataSourceResult = new DataSourceResult<>(); + dataSourceResult.setAggregates(new HashMap<>()); + + if (dataSourceRequest == null) { + dataSourceResult.setData(new ArrayList<>()); + dataSourceResult.setTotal(0L); + return dataSourceResult; + } + + StringBuilder sql = new StringBuilder("SELECT\n" + + " t.STCD AS stcd,\n" + + " t.STNM AS stnm,\n" + + " t.STNM AS titleName,\n" + + " TO_CHAR(t.BLDSTT_CODE) AS bldsttCcode,\n" + + " TO_CHAR(t.BLDSTT_CODE) AS bldstt,\n" + + " t.LTTD AS lttd,\n" + + " t.LGTD AS lgtd,\n" + + " t.ELEV AS dtmel,\n" + + " t.RSTCD AS rstcds,\n" + + " eng.ENNM AS ennm,\n" + + " t.STTP AS sttpCode,\n" + + " t.STTP AS dwtp,\n" + + " CASE\n" + + " WHEN t.STTP = 'VP' THEN '珍稀植物园'\n" + + " WHEN t.STTP = 'VA' THEN '动物救助站'\n" + + " WHEN t.STTP = 'FH' THEN '栖息地'\n" + + " ELSE '其它'\n" + + " END AS dwtpName,\n" + + " t.STTP AS sttpMap,\n" + + " t.RVCD AS rvcd,\n" + + " t.ADDVCD AS addvcd,\n" + + " t.BASE_ID AS baseId,\n" + + " t.STTP AS sttp,\n" + + " t.DTIN AS dtin\n" + + "FROM (\n" + + " SELECT STCD, STNM, STTP, LGTD, LTTD, ELEV, RSTCD, BASE_ID, RVCD, ADDVCD, BLDSTT_CODE, DTIN\n" + + " FROM SD_VP_B_H\n" + + " WHERE NVL(IS_DELETED, 0) = 0 AND BLDSTT_CODE = 1 AND LGTD IS NOT NULL AND LTTD IS NOT NULL\n" + + " UNION ALL\n" + + " SELECT STCD, STNM, STTP, LGTD, LTTD, ELEV, RSTCD, BASE_ID, NULL AS RVCD, NULL AS ADDVCD, BLDSTT_CODE, DTIN\n" + + " FROM SD_VA_B_H\n" + + " WHERE NVL(IS_DELETED, 0) = 0 AND BLDSTT_CODE = 1 AND LGTD IS NOT NULL AND LTTD IS NOT NULL\n" + + " UNION ALL\n" + + " SELECT STCD, STNM, 'FH' AS STTP, LGTD, LTTD, ELEV, RSTCD, BASE_ID, RVCD, ADDVCD, 1 AS BLDSTT_CODE, DTIN\n" + + " FROM SD_FHBT_B_H\n" + + " WHERE NVL(IS_DELETED, 0) = 0 AND LGTD IS NOT NULL AND LTTD IS NOT NULL\n" + + ") t\n" + + "LEFT JOIN SD_ENGINFO_B_H eng ON eng.STCD = t.RSTCD AND NVL(eng.IS_DELETED, 0) = 0 "); + + Map paramMap = new HashMap<>(); + String filterSql = buildFhvapPointFilterCondition(dataSourceRequest.getFilter(), paramMap, new int[]{0}); + if (StrUtil.isNotBlank(filterSql)) { + sql.append(" AND ").append(filterSql); + } + + sql.append(buildFhvapPointOrderBySql(dataSourceRequest.getSort())); + + Page page = KendoUtil.getPage(dataSourceRequest); + List resultList = microservicDynamicSQLMapper.pageAllListWithResultType(page, sql.toString(), paramMap, FhvapBuiltPointVo.class); + + for (FhvapBuiltPointVo vo : resultList) { + String sttp = vo.getSttp(); + if ("VP".equals(sttp)) { + vo.setAnchoPointState("GY_1_BUILT"); + } else if ("VA".equals(sttp)) { + vo.setAnchoPointState("GY_2_BUILT"); + } else if ("FH".equals(sttp)) { + vo.setAnchoPointState("GY_3_BUILT"); + } else { + vo.setAnchoPointState("GY_4_BUILT"); + } + } + + dataSourceResult.setData(resultList); + dataSourceResult.setTotal(page == null ? resultList.size() : page.getTotal()); + return dataSourceResult; + } + + private String buildFhvapPointFilterCondition(DataSourceRequest.FilterDescriptor filter, + Map paramMap, + int[] indexHolder) { + if (filter == null) { + return ""; + } + if (StrUtil.isNotBlank(filter.getField())) { + return buildFhvapPointLeafCondition(filter, paramMap, indexHolder); + } + if (CollectionUtils.isEmpty(filter.getFilters())) { + return ""; + } + List conditions = new ArrayList<>(); + for (DataSourceRequest.FilterDescriptor child : filter.getFilters()) { + String childSql = buildFhvapPointFilterCondition(child, paramMap, indexHolder); + if (StrUtil.isNotBlank(childSql)) { + conditions.add("(" + childSql + ")"); + } + } + if (conditions.isEmpty()) { + return ""; + } + return String.join("or".equalsIgnoreCase(filter.getLogic()) ? " OR " : " AND ", conditions); + } + + private String buildFhvapPointLeafCondition(DataSourceRequest.FilterDescriptor filter, + Map paramMap, + int[] indexHolder) { + String field = filter.getField(); + Object value = filter.getValue(); + String operator = StrUtil.blankToDefault(filter.getOperator(), "eq").toLowerCase(); + + String column = mapFhvapPointColumn(field); + if (StrUtil.isBlank(column)) { + return ""; + } + + if ("isnull".equals(operator)) { + return column + " IS NULL"; + } + if ("isnotnull".equals(operator)) { + return column + " IS NOT NULL"; + } + if ("in".equals(operator)) { + List values = normalizeValues(value); + if (values.isEmpty()) { + return ""; + } + List placeholders = new ArrayList<>(); + for (Object item : values) { + String paramKey = "fhvapParam" + indexHolder[0]++; + paramMap.put(paramKey, item); + placeholders.add("#{map." + paramKey + "}"); + } + return column + " IN (" + String.join(", ", placeholders) + ")"; + } + if (value == null) { + return ""; + } + + String paramKey = "fhvapParam" + indexHolder[0]++; + switch (operator) { + case "eq": + paramMap.put(paramKey, value); + return column + " = #{map." + paramKey + "}"; + case "neq": + paramMap.put(paramKey, value); + return column + " <> #{map." + paramKey + "}"; + case "contains": + paramMap.put(paramKey, "%" + value + "%"); + return column + " LIKE #{map." + paramKey + "}"; + case "startswith": + paramMap.put(paramKey, value + "%"); + return column + " LIKE #{map." + paramKey + "}"; + case "endswith": + paramMap.put(paramKey, "%" + value); + return column + " LIKE #{map." + paramKey + "}"; + case "gt": + paramMap.put(paramKey, value); + return column + " > #{map." + paramKey + "}"; + case "gte": + paramMap.put(paramKey, value); + return column + " >= #{map." + paramKey + "}"; + case "lt": + paramMap.put(paramKey, value); + return column + " < #{map." + paramKey + "}"; + case "lte": + paramMap.put(paramKey, value); + return column + " <= #{map." + paramKey + "}"; + default: + return ""; + } + } + + private String mapFhvapPointColumn(String field) { + if (StrUtil.isBlank(field)) { + return null; + } + Map columnMap = new HashMap<>(); + columnMap.put("stcd", "t.STCD"); + columnMap.put("stnm", "t.STNM"); + columnMap.put("sttpCode", "t.STTP"); + columnMap.put("bldsttCcode", "t.BLDSTT_CODE"); + columnMap.put("lgtd", "t.LGTD"); + columnMap.put("lttd", "t.LTTD"); + columnMap.put("baseId", "t.BASE_ID"); + columnMap.put("rvcd", "t.RVCD"); + columnMap.put("addvcd", "t.ADDVCD"); + columnMap.put("rstcds", "t.RSTCD"); + columnMap.put("ennm", "eng.ENNM"); + return columnMap.get(field); + } + + private String buildFhvapPointOrderBySql(List sorts) { + if (sorts == null || sorts.isEmpty()) { + return " ORDER BY t.BASE_ID ASC, t.STCD ASC"; + } + List orderItems = new ArrayList<>(); + for (DataSourceRequest.SortDescriptor sort : sorts) { + if (sort == null || StrUtil.isBlank(sort.getField())) { + continue; + } + String column = mapFhvapPointColumn(sort.getField()); + if (StrUtil.isBlank(column)) { + continue; + } + String direction = "desc".equalsIgnoreCase(sort.getDir()) || "des".equalsIgnoreCase(sort.getDir()) ? "DESC" : "ASC"; + orderItems.add(column + " " + direction + " NULLS LAST"); + } + if (orderItems.isEmpty()) { + return " ORDER BY t.BASE_ID ASC, t.STCD ASC"; + } + return " ORDER BY " + String.join(", ", orderItems); + } }