From be14b5aaf21e33136bfc5968cd25d59fff01deeb Mon Sep 17 00:00:00 2001 From: tangwei Date: Wed, 24 Jun 2026 11:41:31 +0800 Subject: [PATCH 01/32] =?UTF-8?q?fix:=20=E4=BC=98=E5=8C=96=E9=80=BB?= =?UTF-8?q?=E8=BE=91?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../impl/VpConstructionServiceImpl.java | 2 +- .../warn/entity/vo/StcdWarnStateVo.java | 6 +++ .../service/impl/WarnDataServiceImpl.java | 41 ++++++++++--------- 3 files changed, 28 insertions(+), 21 deletions(-) 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 9a2ad153..fe46774a 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 @@ -1738,7 +1738,7 @@ public class VpConstructionServiceImpl implements VpConstructionService { columnMap.put("runState", "vp.RUN_STATE"); columnMap.put("runStateName", "CASE NVL(vp.RUN_STATE, -1) WHEN 1 THEN '运行' WHEN 0 THEN '未运行' ELSE NULL END"); columnMap.put("baseStepSort", "hb.ORDER_INDEX"); - columnMap.put("rvcdStepSort", "hbrv.ORDER_INDEX"); +// columnMap.put("rvcdStepSort", "hbrv.ORDER_INDEX"); columnMap.put("rstcdStepSort", "eng.ORDER_INDEX"); columnMap.put("siteStepSort", "vp.ORDER_INDEX"); return columnMap.get(field); diff --git a/backend/src/main/java/com/yfd/platform/qgc_env/warn/entity/vo/StcdWarnStateVo.java b/backend/src/main/java/com/yfd/platform/qgc_env/warn/entity/vo/StcdWarnStateVo.java index 91edb18c..9843ffc3 100644 --- a/backend/src/main/java/com/yfd/platform/qgc_env/warn/entity/vo/StcdWarnStateVo.java +++ b/backend/src/main/java/com/yfd/platform/qgc_env/warn/entity/vo/StcdWarnStateVo.java @@ -51,9 +51,15 @@ public class StcdWarnStateVo { @Schema(description = "基础排序") private Integer baseStepSort; + @Schema(description = "流域排序") + private Integer rvcdStepSort; + @Schema(description = "电站排序") private Integer rstcdStepSort; + @Schema(description = "站点排序") + private Integer siteStepSort; + @Schema(description = "数据接入类型") private Integer dtinType; } diff --git a/backend/src/main/java/com/yfd/platform/qgc_env/warn/service/impl/WarnDataServiceImpl.java b/backend/src/main/java/com/yfd/platform/qgc_env/warn/service/impl/WarnDataServiceImpl.java index d6b57df6..efd22964 100644 --- a/backend/src/main/java/com/yfd/platform/qgc_env/warn/service/impl/WarnDataServiceImpl.java +++ b/backend/src/main/java/com/yfd/platform/qgc_env/warn/service/impl/WarnDataServiceImpl.java @@ -325,7 +325,9 @@ public class WarnDataServiceImpl implements WarnDataService { .append("r.rvcd AS rvcd, ") .append("r.warnState AS warnState, ") .append("r.baseStepSort AS baseStepSort, ") + .append("r.rvcdStepSort AS rvcdStepSort, ") .append("r.rstcdStepSort AS rstcdStepSort, ") + .append("r.siteStepSort AS siteStepSort, ") .append("r.dtinType AS dtinType ") .append("FROM (") .append(buildWarnStcdDetailSql(warnType)) @@ -369,18 +371,16 @@ public class WarnDataServiceImpl implements WarnDataService { String normalizedWarnStateExpr = "CASE " + "WHEN eng.WARN_STATE = '0' OR eng.WARN_STATE IS NULL OR eng.WARN_STATE = '' THEN '00' " + "ELSE eng.WARN_STATE END"; - String nonEngWarnStateExpr = "CASE state.STD_SSTATE " + - "WHEN 2 THEN 0 " + - "WHEN 3 THEN 2 " + - "ELSE state.STD_SSTATE END"; + String wqWarnStateExpr = "TO_NUMBER(NULLIF(wq.WARN_STATE, ''))"; + String wtWarnStateExpr = "TO_NUMBER(NULLIF(wt.WARN_STATE, ''))"; List parts = new ArrayList<>(); if ("QEC".equalsIgnoreCase(warnType)) { parts.add(buildWarnStcdEngSql(normalizedWarnStateExpr, warnType)); } else { parts.add(buildWarnStcdEngSql(normalizedWarnStateExpr, warnType)); - parts.add(buildWarnStcdWqSql(nonEngWarnStateExpr)); - parts.add(buildWarnStcdWtSql(nonEngWarnStateExpr)); + parts.add(buildWarnStcdWqSql(wqWarnStateExpr)); + parts.add(buildWarnStcdWtSql(wtWarnStateExpr)); } return String.join(" UNION ALL ", parts); } @@ -409,11 +409,14 @@ public class WarnDataServiceImpl implements WarnDataService { .append("eng.HBRVCD AS rvcd, ") .append(warnStateExpr).append(" AS warnState, ") .append("hb.ORDER_INDEX AS baseStepSort, ") + .append("along.ORDER_INDEX AS rvcdStepSort, ") .append("eng.ORDER_INDEX AS rstcdStepSort, ") + .append("eng.ORDER_INDEX AS siteStepSort, ") .append("CAST(NULL AS NUMBER) AS dtinType ") .append("FROM SD_ENGINFO_B_H eng ") .append("LEFT JOIN SD_STTP_B sttp ON sttp.STTP_CODE = 'ENG' AND NVL(sttp.IS_DELETED, 0) = 0 ") .append("LEFT JOIN SD_HYDROBASE hb ON hb.BASEID = eng.BASE_ID AND NVL(hb.IS_DELETED, 0) = 0 ") + .append("LEFT JOIN MS_ALONG_B along ON along.RVCD = eng.HBRVCD AND along.CODE = 'common' AND NVL(along.IS_DELETED, 0) = 0 ") .append("WHERE NVL(eng.IS_DELETED, 0) = 0 "); if ("QEC".equalsIgnoreCase(warnType)) { sql.append("AND NVL(eng.BLDSTT_CODE, -1) = 2 ") @@ -439,12 +442,15 @@ public class WarnDataServiceImpl implements WarnDataService { "eng.HBRVCD AS rvcd, " + warnStateExpr + " AS warnState, " + "hb.ORDER_INDEX AS baseStepSort, " + + "along.ORDER_INDEX AS rvcdStepSort, " + "eng.ORDER_INDEX AS rstcdStepSort, " + + "siteAlong.SORT AS siteStepSort, " + "wq.DTIN_TYPE AS dtinType " + "FROM SD_WQ_B_H wq " + - "LEFT JOIN (" + buildWarnStcdLatestStateSql() + ") state ON state.STCD = wq.STCD AND state.STTP_CODE = wq.STTP " + "LEFT JOIN SD_ENGINFO_B_H eng ON eng.STCD = wq.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 MS_ALONGDET_B siteAlong ON siteAlong.ALONG_ID = along.ID AND siteAlong.STCD = wq.STCD AND NVL(siteAlong.IS_DELETED, 0) = 0 " + "LEFT JOIN SD_STTP_B sttp ON sttp.STTP_CODE = wq.STTP AND NVL(sttp.IS_DELETED, 0) = 0 " + "WHERE NVL(wq.IS_DELETED, 0) = 0 " + "AND NVL(wq.USFL, 0) = 1 " + @@ -465,30 +471,21 @@ public class WarnDataServiceImpl implements WarnDataService { "eng.HBRVCD AS rvcd, " + warnStateExpr + " AS warnState, " + "hb.ORDER_INDEX AS baseStepSort, " + + "along.ORDER_INDEX AS rvcdStepSort, " + "eng.ORDER_INDEX AS rstcdStepSort, " + + "siteAlong.SORT AS siteStepSort, " + "wt.DTIN_TYPE AS dtinType " + "FROM SD_WT_B_H wt " + - "LEFT JOIN (" + buildWarnStcdLatestStateSql() + ") state ON state.STCD = wt.STCD AND state.STTP_CODE = wt.STTP " + "LEFT JOIN SD_ENGINFO_B_H eng ON eng.STCD = wt.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 MS_ALONGDET_B siteAlong ON siteAlong.ALONG_ID = along.ID AND siteAlong.STCD = wt.STCD AND NVL(siteAlong.IS_DELETED, 0) = 0 " + "LEFT JOIN SD_STTP_B sttp ON sttp.STTP_CODE = wt.STTP AND NVL(sttp.IS_DELETED, 0) = 0 " + "WHERE NVL(wt.IS_DELETED, 0) = 0 " + "AND NVL(wt.USFL, 0) = 1 " + "AND wt.STTP = 'WTRV' "; } - private String buildWarnStcdLatestStateSql() { - return "SELECT s.STCD, s.STTP_CODE, s.STD_SSTATE " + - "FROM MS_STSTATE_T s " + - "INNER JOIN (" + - "SELECT STCD, MAX(YR) AS MAX_YR " + - "FROM MS_STSTATE_T " + - "WHERE NVL(IS_DELETED, 0) = 0 " + - "GROUP BY STCD" + - ") mx ON mx.STCD = s.STCD AND mx.MAX_YR = s.YR " + - "WHERE NVL(s.IS_DELETED, 0) = 0"; - } - private String buildWarnStcdFilterCondition(DataSourceRequest.FilterDescriptor filter, Map paramMap, int[] indexHolder) { @@ -595,6 +592,10 @@ public class WarnDataServiceImpl implements WarnDataService { case "baseName" -> "r.baseName"; case "rvcd" -> "r.rvcd"; case "warnState" -> "r.warnState"; + case "baseStepSort" -> "r.baseStepSort"; + case "rvcdStepSort" -> "r.rvcdStepSort"; + case "rstcdStepSort" -> "r.rstcdStepSort"; + case "siteStepSort" -> "r.siteStepSort"; case "dtinType" -> "r.dtinType"; default -> null; }; From 0395e1cd5c32de8dd94b48607341543afaa50f4e Mon Sep 17 00:00:00 2001 From: tangwei Date: Wed, 24 Jun 2026 14:59:47 +0800 Subject: [PATCH 02/32] =?UTF-8?q?fix:=20=E4=BC=98=E5=8C=96=E9=80=BB?= =?UTF-8?q?=E8=BE=91?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../com/yfd/platform/qgc_env/fp/entity/vo/FpFpssrlQueryVo.java | 3 +++ .../yfd/platform/qgc_env/fp/service/impl/FpRunServiceImpl.java | 1 + 2 files changed, 4 insertions(+) diff --git a/backend/src/main/java/com/yfd/platform/qgc_env/fp/entity/vo/FpFpssrlQueryVo.java b/backend/src/main/java/com/yfd/platform/qgc_env/fp/entity/vo/FpFpssrlQueryVo.java index 5094b292..56bbf631 100644 --- a/backend/src/main/java/com/yfd/platform/qgc_env/fp/entity/vo/FpFpssrlQueryVo.java +++ b/backend/src/main/java/com/yfd/platform/qgc_env/fp/entity/vo/FpFpssrlQueryVo.java @@ -72,6 +72,9 @@ public class FpFpssrlQueryVo { @Schema(description = "游向") private String direction; + @Schema(description = "游向中文") + private String directionName; + @Schema(description = "水温") private String temperature; diff --git a/backend/src/main/java/com/yfd/platform/qgc_env/fp/service/impl/FpRunServiceImpl.java b/backend/src/main/java/com/yfd/platform/qgc_env/fp/service/impl/FpRunServiceImpl.java index f94e7cfd..c81bf512 100644 --- a/backend/src/main/java/com/yfd/platform/qgc_env/fp/service/impl/FpRunServiceImpl.java +++ b/backend/src/main/java/com/yfd/platform/qgc_env/fp/service/impl/FpRunServiceImpl.java @@ -1635,6 +1635,7 @@ public class FpRunServiceImpl implements FpRunService { selectMap.put("width", "t.width AS width"); selectMap.put("fishspeed", "t.fishspeed AS fishspeed"); selectMap.put("direction", "t.direction AS direction"); + selectMap.put("directionName", "CASE t.direction WHEN '0' THEN '上行' WHEN '1' THEN '下行' WHEN '2' THEN '上行折返' WHEN '3' THEN '下行折返' END AS directionName"); selectMap.put("temperature", "t.temperature AS temperature"); selectMap.put("speed", "t.speed AS speed"); selectMap.put("channelno", "t.channelno AS channelno"); From 9e62c64495f5ca7a0813ba213080a37028f4e13f Mon Sep 17 00:00:00 2001 From: tangwei Date: Thu, 25 Jun 2026 11:47:42 +0800 Subject: [PATCH 03/32] =?UTF-8?q?fix:=20=E4=BC=98=E5=8C=96=E9=80=BB?= =?UTF-8?q?=E8=BE=91?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../main/java/com/yfd/platform/qgc_base/domain/SdFpssBH.java | 2 +- .../com/yfd/platform/qgc_base/domain/vo/EngVmsstbprptVo.java | 2 ++ .../qgc_base/service/impl/SdEngInfoBHServiceImpl.java | 4 ++++ .../platform/qgc_env/fp/service/impl/FpBuildServiceImpl.java | 4 ++-- 4 files changed, 9 insertions(+), 3 deletions(-) diff --git a/backend/src/main/java/com/yfd/platform/qgc_base/domain/SdFpssBH.java b/backend/src/main/java/com/yfd/platform/qgc_base/domain/SdFpssBH.java index a20947e9..5c267806 100644 --- a/backend/src/main/java/com/yfd/platform/qgc_base/domain/SdFpssBH.java +++ b/backend/src/main/java/com/yfd/platform/qgc_base/domain/SdFpssBH.java @@ -228,7 +228,7 @@ public class SdFpssBH implements Serializable { /** * 鱼道或仿自然通道-流速,单位:m/s */ - private String v; + private String flow; /** * 仿自然通道断面形状 diff --git a/backend/src/main/java/com/yfd/platform/qgc_base/domain/vo/EngVmsstbprptVo.java b/backend/src/main/java/com/yfd/platform/qgc_base/domain/vo/EngVmsstbprptVo.java index c234fe73..58d51f26 100644 --- a/backend/src/main/java/com/yfd/platform/qgc_base/domain/vo/EngVmsstbprptVo.java +++ b/backend/src/main/java/com/yfd/platform/qgc_base/domain/vo/EngVmsstbprptVo.java @@ -29,6 +29,8 @@ public class EngVmsstbprptVo implements Serializable { private String hynm; private String topHynm; private String stlc; + private Double lgtd; + private Double lttd; private Date jcdt; private Date piodt; private Date aiodt; 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 da85cba8..03e612b4 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 @@ -531,6 +531,8 @@ public class SdEngInfoBHServiceImpl extends ServiceImpl Date: Thu, 25 Jun 2026 14:59:36 +0800 Subject: [PATCH 04/32] =?UTF-8?q?feat:=20=E5=85=A8=E8=BF=87=E7=A8=8B?= =?UTF-8?q?=E6=B2=BF=E7=A8=8B=E9=B1=BC=E7=B1=BB=E5=8F=98=E5=8C=96=E6=83=85?= =?UTF-8?q?=E5=86=B5?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../yfd/platform/config/SwaggerConfig.java | 8 + .../qgc_base/domain/vo/EngVmsstbprptVo.java | 3 + .../service/impl/SdEngInfoBHServiceImpl.java | 6 + .../wte/controller/WeFishController.java | 29 + .../qgc_env/wte/entity/vo/WeFishTQgcVo.java | 134 +++++ .../qgc_env/wte/service/WeFishService.java | 10 + .../wte/service/impl/WeFishServiceImpl.java | 499 ++++++++++++++++++ 7 files changed, 689 insertions(+) create mode 100644 backend/src/main/java/com/yfd/platform/qgc_env/wte/controller/WeFishController.java create mode 100644 backend/src/main/java/com/yfd/platform/qgc_env/wte/entity/vo/WeFishTQgcVo.java create mode 100644 backend/src/main/java/com/yfd/platform/qgc_env/wte/service/WeFishService.java create mode 100644 backend/src/main/java/com/yfd/platform/qgc_env/wte/service/impl/WeFishServiceImpl.java diff --git a/backend/src/main/java/com/yfd/platform/config/SwaggerConfig.java b/backend/src/main/java/com/yfd/platform/config/SwaggerConfig.java index 2b33fea4..f46f9a63 100644 --- a/backend/src/main/java/com/yfd/platform/config/SwaggerConfig.java +++ b/backend/src/main/java/com/yfd/platform/config/SwaggerConfig.java @@ -143,6 +143,14 @@ public class SwaggerConfig { .build(); } + @Bean + public GroupedOpenApi groupEnvWteApi() { + return GroupedOpenApi.builder() + .group("3.9 全过程-生态环保数据服务-生态调查(wte)") + .packagesToScan("com.yfd.platform.qgc_env.wte.controller") + .build(); + } + diff --git a/backend/src/main/java/com/yfd/platform/qgc_base/domain/vo/EngVmsstbprptVo.java b/backend/src/main/java/com/yfd/platform/qgc_base/domain/vo/EngVmsstbprptVo.java index 58d51f26..28c657ee 100644 --- a/backend/src/main/java/com/yfd/platform/qgc_base/domain/vo/EngVmsstbprptVo.java +++ b/backend/src/main/java/com/yfd/platform/qgc_base/domain/vo/EngVmsstbprptVo.java @@ -21,6 +21,7 @@ public class EngVmsstbprptVo implements Serializable { private String baseId; private String baseName; private String reachcdName; + private String reachcd; private String hbrvcd; private String hbrvcdName; private String rvcd; @@ -28,6 +29,8 @@ public class EngVmsstbprptVo implements Serializable { private String addvcdName; private String hynm; private String topHynm; + private String hycd; + private String topHycd; private String stlc; private Double lgtd; private Double lttd; 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 03e612b4..05de1201 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 @@ -533,6 +533,7 @@ public class SdEngInfoBHServiceImpl extends ServiceImpl getQgcWeFishTKendoListCust(DataSourceRequest dataSourceRequest); +} diff --git a/backend/src/main/java/com/yfd/platform/qgc_env/wte/service/impl/WeFishServiceImpl.java b/backend/src/main/java/com/yfd/platform/qgc_env/wte/service/impl/WeFishServiceImpl.java new file mode 100644 index 00000000..86849c3b --- /dev/null +++ b/backend/src/main/java/com/yfd/platform/qgc_env/wte/service/impl/WeFishServiceImpl.java @@ -0,0 +1,499 @@ +package com.yfd.platform.qgc_env.wte.service.impl; + +import cn.hutool.core.collection.CollUtil; +import cn.hutool.core.date.DateUtil; +import cn.hutool.core.util.StrUtil; +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.wte.entity.vo.WeFishTQgcVo; +import com.yfd.platform.qgc_env.wte.service.WeFishService; +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.Date; +import java.util.HashMap; +import java.util.List; +import java.util.Map; + +@Service +public class WeFishServiceImpl implements WeFishService { + + @Resource + private MicroservicDynamicSQLMapper microservicDynamicSQLMapper; + + @Override + public DataSourceResult getQgcWeFishTKendoListCust(DataSourceRequest dataSourceRequest) { + DataSourceLoadOptionsBase loadOptions = dataSourceRequest == null ? null : dataSourceRequest.toDevRequest(); + GroupingInfo[] groupInfos = loadOptions == null ? null : loadOptions.getGroup(); + Map paramMap = new HashMap<>(); + + String filterSql = buildWeFishQgcFilterCondition( + dataSourceRequest == null ? null : dataSourceRequest.getFilter(), + paramMap, + new int[]{0} + ); + + StringBuilder sql = new StringBuilder(); + sql.append("SELECT r.* FROM (") + .append(buildWeFishQgcDetailSql()) + .append(") r WHERE 1 = 1 "); + if (StrUtil.isNotBlank(filterSql)) { + sql.append(" AND ").append(filterSql).append(" "); + } + + DataSourceResult result = new DataSourceResult<>(); + if (CollUtil.isNotEmpty(dataSourceRequest == null ? null : dataSourceRequest.getGroup())) { + String groupedSql = buildWeFishQgcGroupSql(sql.toString(), groupInfos); + List> rows = microservicDynamicSQLMapper.getAllList(groupedSql, 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((long) rows.size()); + result.setAggregates(new HashMap<>()); + return result; + } + + sql.append(buildWeFishQgcOrderBySql(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, + WeFishTQgcVo.class + ); + fillWeFishDerivedFields(list); + + result.setData(list); + result.setTotal(page != null ? page.getTotal() : list.size()); + result.setAggregates(new HashMap<>()); + return result; + } + + private String buildWeFishQgcGroupSql(String baseSql, GroupingInfo[] groupInfos) { + if (groupInfos == null || groupInfos.length == 0) { + return baseSql; + } + List groupFields = new ArrayList<>(); + List selectItems = new ArrayList<>(); + List orderByItems = new ArrayList<>(); + for (GroupingInfo item : groupInfos) { + if (item == null || StrUtil.isBlank(item.getSelector())) { + continue; + } + String selector = item.getSelector(); + String groupColumn = mapWeFishQgcGroupColumn(selector); + if (StrUtil.isBlank(groupColumn)) { + continue; + } + groupFields.add(groupColumn); + selectItems.add(groupColumn + " AS " + selector.toUpperCase()); + boolean hasCountAlias = false; + if (CollUtil.isNotEmpty(item.getSummaryInfos())) { + for (com.yfd.platform.common.SummaryInfo summaryInfo : item.getSummaryInfos()) { + if (summaryInfo == null || StrUtil.isBlank(summaryInfo.getSelector()) || StrUtil.isBlank(summaryInfo.getSummaryType())) { + continue; + } + String summaryColumn = mapWeFishQgcGroupColumn(summaryInfo.getSelector()); + if (StrUtil.isBlank(summaryColumn)) { + continue; + } + String summaryType = summaryInfo.getSummaryType().toUpperCase(); + String summarySelector = summaryInfo.getSelector().toUpperCase(); + switch (summaryInfo.getSummaryType().toLowerCase()) { + case "count" -> { + selectItems.add("COUNT(" + summaryColumn + ") AS " + summaryType + "_" + summarySelector); + if (selector.equalsIgnoreCase(summaryInfo.getSelector())) { + hasCountAlias = true; + } + } + case "sum" -> selectItems.add("SUM(" + summaryColumn + ") AS " + summaryType + "_" + summarySelector); + case "avg", "average" -> selectItems.add("AVG(" + summaryColumn + ") AS AVG_" + summarySelector); + case "min" -> selectItems.add("MIN(" + summaryColumn + ") AS " + summaryType + "_" + summarySelector); + case "max" -> selectItems.add("MAX(" + summaryColumn + ") AS " + summaryType + "_" + summarySelector); + default -> { + } + } + } + } + if (!hasCountAlias) { + selectItems.add("COUNT(*) AS COUNT_" + selector.toUpperCase()); + } + String dir = Boolean.TRUE.equals(item.getDesc()) ? "DESC" : "ASC"; + orderByItems.add(groupColumn + " " + dir); + } + if (groupFields.isEmpty()) { + return baseSql; + } + StringBuilder sql = new StringBuilder("SELECT "); + sql.append(String.join(", ", selectItems)) + .append(" FROM (") + .append(baseSql) + .append(") T GROUP BY ") + .append(String.join(", ", groupFields)); + if (!orderByItems.isEmpty()) { + sql.append(" ORDER BY ").append(String.join(", ", orderByItems)); + } + return sql.toString(); + } + + private String buildWeFishQgcDetailSql() { + return "SELECT " + + "section.STCD AS stcd, " + + "section.STNM AS stnm, " + + "eng.BASE_ID AS baseId, " + + "eng.BASE_NAME AS baseName, " + + "eng.RVCD AS rvcd, " + + "eng.RVCD_NAME AS rvcdName, " + + "eng.ADDVCD AS addvcd, " + + "eng.ADDVCD_NAME AS addvcdName, " + + "eng.HBRVCD AS hbrvcd, " + + "eng.HBRVCD_NAME AS hbrvcdName, " + + "we.DCPC AS dcpc, " + + "we.TM AS tm, " + + "we.FID AS werFid, " + + "fish.WER_ID AS werId, " + + "fish.FTP AS ftp, " + + "fish.FSZ AS fsz, " + + "fish.FCNT AS fcnt, " + + "fish.FWGH AS fwgh, " + + "fish.ST AS st, " + + "fish.PS AS ps, " + + "fish.AVG_FWGT AS avgFwgt, " + + "fish.AVG_FSZ AS avgFsz, " + + "fish.FID AS fid, " + + "fish.FILE_ID AS fileId, " + + "dict.FISH_ID AS id, " + + "dict.NAME AS name, " + + "dict.ALIAS AS alias, " + + "dict.GENUS AS genus, " + + "dict.FAMILY AS family, " + + "dict.SPECIES AS species, " + + "dict.TYPE AS type, " + + "dict.RARE AS rare, " + + "dict.SPEC_ORIGIN AS specOrigin, " + + "dict.PTYPE AS ptype, " + + "TO_CHAR(we.TM, 'yyyy') AS yr, " + + "CASE " + + "WHEN dict.SPEC_ORIGIN = 2 THEN 1 " + + "WHEN dict.SPEC_ORIGIN = 1 AND NVL(dict.PTYPE, -1) <> 6 THEN 2 " + + "WHEN dict.SPEC_ORIGIN = 1 AND dict.PTYPE = 6 THEN 3 " + + "END AS ty " + + "FROM SD_WE_R we " + + "INNER JOIN SD_WEFISH_R fish ON fish.WER_ID = we.ID " + + " AND NVL(fish.IS_DELETED, 0) = 0 " + + "INNER JOIN SD_WE_B_H section ON section.STCD = we.STCD " + + " AND NVL(section.USFL, 0) = 1 " + + "LEFT JOIN SD_ENGINFO_B_H eng ON eng.STCD = section.RSTCD " + + " AND NVL(eng.IS_DELETED, 0) = 0 " + + "LEFT JOIN V_SD_FISHDICTORY_B dict ON dict.FISH_ID = fish.FTP " + + " AND (dict.RVCD = 'ZY' OR dict.RVCD = eng.HBRVCD) " + + "WHERE NVL(we.IS_DELETED, 0) = 0 " + + // 旧库按 TASK_STATUS=Approved/null 过滤,新库改用 STATUS=1(完成) 承接审批通过口径 + "AND NVL(we.STATUS, 1) = 1 "; + } + + private String buildWeFishQgcFilterCondition(DataSourceRequest.FilterDescriptor filter, + Map paramMap, + int[] indexHolder) { + if (filter == null) { + return ""; + } + if (StrUtil.isNotBlank(filter.getField())) { + return buildWeFishQgcLeafCondition(filter, paramMap, indexHolder); + } + if (CollUtil.isEmpty(filter.getFilters())) { + return ""; + } + List conditions = new ArrayList<>(); + for (DataSourceRequest.FilterDescriptor child : filter.getFilters()) { + String childSql = buildWeFishQgcFilterCondition(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 buildWeFishQgcLeafCondition(DataSourceRequest.FilterDescriptor filter, + Map paramMap, + int[] indexHolder) { + String column = mapWeFishQgcColumn(filter.getField()); + if (StrUtil.isBlank(column)) { + return ""; + } + String operator = StrUtil.blankToDefault(filter.getOperator(), "eq").toLowerCase(); + 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 = normalizeWeFishQgcValues(filter.getValue()); + if (values.isEmpty()) { + return ""; + } + List placeholders = new ArrayList<>(); + for (Object value : values) { + Object normalizedValue = normalizeWeFishQgcValue(filter.getField(), value); + if (normalizedValue == null) { + continue; + } + String key = "weFishQgcP" + indexHolder[0]++; + paramMap.put(key, normalizedValue); + placeholders.add("#{map." + key + "}"); + } + if (placeholders.isEmpty()) { + return ""; + } + return column + ("ni".equals(operator) ? " NOT IN (" : " IN (") + String.join(", ", placeholders) + ")"; + } + + Object normalizedValue = normalizeWeFishQgcValue(filter.getField(), filter.getValue()); + if (normalizedValue == null) { + return ""; + } + String key = "weFishQgcP" + indexHolder[0]++; + return switch (operator) { + case "eq" -> { + paramMap.put(key, normalizedValue); + yield column + " = #{map." + key + "}"; + } + case "neq" -> { + paramMap.put(key, normalizedValue); + yield column + " <> #{map." + key + "}"; + } + case "gt" -> { + paramMap.put(key, normalizedValue); + yield column + " > #{map." + key + "}"; + } + case "gte" -> { + paramMap.put(key, normalizedValue); + yield column + " >= #{map." + key + "}"; + } + case "lt" -> { + paramMap.put(key, normalizedValue); + yield column + " < #{map." + key + "}"; + } + case "lte" -> { + paramMap.put(key, normalizedValue); + yield column + " <= #{map." + key + "}"; + } + case "contains" -> { + paramMap.put(key, "%" + String.valueOf(normalizedValue).trim() + "%"); + yield column + " LIKE #{map." + key + "}"; + } + case "doesnotcontain" -> { + paramMap.put(key, "%" + String.valueOf(normalizedValue).trim() + "%"); + yield column + " NOT LIKE #{map." + key + "}"; + } + case "startswith" -> { + paramMap.put(key, String.valueOf(normalizedValue).trim() + "%"); + yield column + " LIKE #{map." + key + "}"; + } + case "endswith" -> { + paramMap.put(key, "%" + String.valueOf(normalizedValue).trim()); + yield column + " LIKE #{map." + key + "}"; + } + default -> ""; + }; + } + + private String mapWeFishQgcColumn(String field) { + if (StrUtil.isBlank(field)) { + return null; + } + return switch (field) { + case "stcd" -> "r.stcd"; + case "stnm" -> "r.stnm"; + case "baseId" -> "r.baseId"; + case "baseName" -> "r.baseName"; + case "rvcd" -> "r.rvcd"; + case "rvcdName" -> "r.rvcdName"; + case "addvcd" -> "r.addvcd"; + case "addvcdName" -> "r.addvcdName"; + case "hbrvcd" -> "r.hbrvcd"; + case "hbrvcdName" -> "r.hbrvcdName"; + case "dcpc" -> "r.dcpc"; + case "tm" -> "r.tm"; + case "werFid" -> "r.werFid"; + case "werId" -> "r.werId"; + case "ftp" -> "r.ftp"; + case "fsz" -> "r.fsz"; + case "fcnt" -> "r.fcnt"; + case "fwgh" -> "r.fwgh"; + case "st" -> "r.st"; + case "ps" -> "r.ps"; + case "avgFwgt" -> "r.avgFwgt"; + case "avgFsz" -> "r.avgFsz"; + case "fid" -> "r.fid"; + case "fileId" -> "r.fileId"; + case "id" -> "r.id"; + case "name" -> "r.name"; + case "alias" -> "r.alias"; + case "genus" -> "r.genus"; + case "family" -> "r.family"; + case "species" -> "r.species"; + case "type" -> "r.type"; + case "rare" -> "r.rare"; + case "specOrigin" -> "r.specOrigin"; + case "ptype" -> "r.ptype"; + case "yr" -> "r.yr"; + case "ty" -> "r.ty"; + default -> null; + }; + } + + private String mapWeFishQgcGroupColumn(String field) { + String column = mapWeFishQgcColumn(field); + if (StrUtil.isBlank(column)) { + return null; + } + return column.startsWith("r.") ? column.substring(2) : column; + } + + private String buildWeFishQgcOrderBySql(List sorts) { + if (CollUtil.isEmpty(sorts)) { + return " ORDER BY r.tm DESC NULLS LAST, r.stcd ASC, r.name ASC"; + } + List orderByParts = new ArrayList<>(); + for (DataSourceRequest.SortDescriptor sort : sorts) { + if (sort == null || StrUtil.isBlank(sort.getField())) { + continue; + } + String column = mapWeFishQgcColumn(sort.getField()); + if (StrUtil.isBlank(column)) { + continue; + } + String direction = "desc".equalsIgnoreCase(sort.getDir()) ? "DESC" : "ASC"; + orderByParts.add(column + " " + direction + " NULLS LAST"); + } + if (orderByParts.isEmpty()) { + return " ORDER BY r.tm DESC NULLS LAST, r.stcd ASC, r.name ASC"; + } + return " ORDER BY " + String.join(", ", orderByParts); + } + + private Object normalizeWeFishQgcValue(String field, Object value) { + if (value == null) { + return null; + } + if (isWeFishIntegerField(field)) { + try { + return Integer.parseInt(String.valueOf(value).trim()); + } catch (Exception ex) { + return null; + } + } + if (isWeFishDecimalField(field)) { + try { + return new java.math.BigDecimal(String.valueOf(value).trim()); + } catch (Exception ex) { + return null; + } + } + if ("tm".equals(field)) { + return parseDateTimeSafely(value); + } + return value; + } + + private List normalizeWeFishQgcValues(Object value) { + List values = new ArrayList<>(); + if (value == null) { + return values; + } + if (value instanceof Iterable iterable) { + for (Object item : iterable) { + values.add(item); + } + return values; + } + if (value.getClass().isArray()) { + Object[] array = (Object[]) value; + values.addAll(Arrays.asList(array)); + return values; + } + values.add(value); + return values; + } + + private boolean isWeFishIntegerField(String field) { + return "fcnt".equals(field) || "ty".equals(field); + } + + private boolean isWeFishDecimalField(String field) { + return "fwgh".equals(field) || "avgFwgt".equals(field) || "avgFsz".equals(field); + } + + private Date parseDateTimeSafely(Object value) { + if (value == null) { + return null; + } + if (value instanceof Date date) { + return date; + } + try { + return DateUtil.parse(String.valueOf(value).trim()).toJdkDate(); + } catch (Exception ex) { + return null; + } + } + + private void fillWeFishDerivedFields(List list) { + if (CollUtil.isEmpty(list)) { + return; + } + for (WeFishTQgcVo item : list) { + if (item == null) { + continue; + } + item.setTyName(resolveTyName(item.getTy())); + item.setSpecOriginName(resolveSpecOriginName(item.getSpecOrigin())); + } + } + + private String resolveTyName(Integer ty) { + if (ty == null) { + return null; + } + return switch (ty) { + case 1 -> "外来鱼类"; + case 2 -> "本土受威胁鱼类"; + case 3 -> "本土无危鱼类"; + default -> null; + }; + } + + private String resolveSpecOriginName(String specOrigin) { + if (StrUtil.isBlank(specOrigin)) { + return null; + } + return switch (specOrigin) { + case "1" -> "本土"; + case "2" -> "外来鱼类"; + default -> null; + }; + } +} From 77681adba93fd798a5084ffaacf57ea3c954faa4 Mon Sep 17 00:00:00 2001 From: tangwei Date: Thu, 25 Jun 2026 15:39:18 +0800 Subject: [PATCH 05/32] =?UTF-8?q?fix:=20=E4=BC=98=E5=8C=96=E9=80=BB?= =?UTF-8?q?=E8=BE=91?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../com/yfd/platform/constant/Constant.java | 2 +- .../impl/MsOperationLogServiceImpl.java | 193 ++++++++++++++++-- .../service/impl/SdEngInfoBHServiceImpl.java | 123 ++++++++++- 3 files changed, 302 insertions(+), 16 deletions(-) diff --git a/backend/src/main/java/com/yfd/platform/constant/Constant.java b/backend/src/main/java/com/yfd/platform/constant/Constant.java index c460999e..32eab6e9 100644 --- a/backend/src/main/java/com/yfd/platform/constant/Constant.java +++ b/backend/src/main/java/com/yfd/platform/constant/Constant.java @@ -13,7 +13,7 @@ public class Constant { public static final String DATE_TIME_FORMAT = "yyyy-MM-dd HH:mm:ss"; public static final String CODE_KEY = "code-key-"; - public static final long CODE_EXPIRATION_TIME = 1000 * 60; + public static final long CODE_EXPIRATION_TIME = 1000 * 60 * 2; /** * 用于IP定位转换 */ diff --git a/backend/src/main/java/com/yfd/platform/qgc_base/service/impl/MsOperationLogServiceImpl.java b/backend/src/main/java/com/yfd/platform/qgc_base/service/impl/MsOperationLogServiceImpl.java index 0e2ec828..141c247d 100644 --- a/backend/src/main/java/com/yfd/platform/qgc_base/service/impl/MsOperationLogServiceImpl.java +++ b/backend/src/main/java/com/yfd/platform/qgc_base/service/impl/MsOperationLogServiceImpl.java @@ -20,9 +20,11 @@ import java.lang.reflect.Field; import java.lang.reflect.Modifier; import java.util.ArrayList; import java.util.Date; +import java.util.HashSet; import java.util.LinkedHashMap; import java.util.List; import java.util.Map; +import java.util.Set; @Service public class MsOperationLogServiceImpl implements IMsOperationLogService { @@ -33,22 +35,146 @@ public class MsOperationLogServiceImpl implements IMsOperationLogService { static { ENG_FIELD_MEANING_MAP.put("STCD", "电站编码"); + ENG_FIELD_MEANING_MAP.put("TM", "数据时间"); ENG_FIELD_MEANING_MAP.put("ENNM", "电站名称"); ENG_FIELD_MEANING_MAP.put("BASE_ID", "所属基地编码"); + ENG_FIELD_MEANING_MAP.put("BASE_NAME", "所属基地名称"); ENG_FIELD_MEANING_MAP.put("HBRVCD", "所属基地流域编码"); + ENG_FIELD_MEANING_MAP.put("HBRVCD_NAME", "所属基地流域名称"); ENG_FIELD_MEANING_MAP.put("RVCD", "所属流域编码"); + ENG_FIELD_MEANING_MAP.put("RVCD_NAME", "所属流域名称"); ENG_FIELD_MEANING_MAP.put("ADDVCD", "所属行政区编码"); + ENG_FIELD_MEANING_MAP.put("ADDVCD_NAME", "所属行政区名称"); + ENG_FIELD_MEANING_MAP.put("COUNTRY", "所属国家编码"); + ENG_FIELD_MEANING_MAP.put("COUNTRY_NAME", "所属国家名称"); + ENG_FIELD_MEANING_MAP.put("REACHCD", "所属河段编码"); + ENG_FIELD_MEANING_MAP.put("REACHCD_NAME", "所属河段名称"); ENG_FIELD_MEANING_MAP.put("HYCD", "所属公司编码"); + ENG_FIELD_MEANING_MAP.put("HYNM", "所属公司名称"); + ENG_FIELD_MEANING_MAP.put("TOP_HYCD", "所属集团编码"); + ENG_FIELD_MEANING_MAP.put("TOP_HYNM", "所属集团名称"); ENG_FIELD_MEANING_MAP.put("BLPRD", "所属建设阶段"); ENG_FIELD_MEANING_MAP.put("BLDSTT", "建设状态"); ENG_FIELD_MEANING_MAP.put("BLDSTT_CODE", "建设状态分类"); + ENG_FIELD_MEANING_MAP.put("ENGTP", "工程类别"); + ENG_FIELD_MEANING_MAP.put("PRSC", "工程规模"); + ENG_FIELD_MEANING_MAP.put("SCRSC", "工程规模(水库库容)"); + ENG_FIELD_MEANING_MAP.put("PRGR", "工程等别"); + ENG_FIELD_MEANING_MAP.put("FN", "主要功能"); + ENG_FIELD_MEANING_MAP.put("BSSSIN", "地震基本烈度"); + ENG_FIELD_MEANING_MAP.put("FRSSIN", "设防地震烈度"); + ENG_FIELD_MEANING_MAP.put("ADJUST_ENG", "是否调节水库"); + ENG_FIELD_MEANING_MAP.put("ISHVBRRG", "有无拦河坝"); ENG_FIELD_MEANING_MAP.put("DVTP", "开发方式"); + ENG_FIELD_MEANING_MAP.put("CNTP", "建设类型"); ENG_FIELD_MEANING_MAP.put("DTIN", "数据是否接入"); + ENG_FIELD_MEANING_MAP.put("DTIN_TM", "数据接入时间"); + ENG_FIELD_MEANING_MAP.put("USFL", "是否启用"); + ENG_FIELD_MEANING_MAP.put("MONTH_REPORT", "是否发布月报"); + ENG_FIELD_MEANING_MAP.put("TB_WAY", "填报方式"); + ENG_FIELD_MEANING_MAP.put("TB_FREQUENCY", "填报频率"); ENG_FIELD_MEANING_MAP.put("RGCP", "调节性能"); ENG_FIELD_MEANING_MAP.put("LGTD", "经度"); ENG_FIELD_MEANING_MAP.put("LTTD", "纬度"); + ENG_FIELD_MEANING_MAP.put("ELEV", "高程"); ENG_FIELD_MEANING_MAP.put("STLC", "站址"); ENG_FIELD_MEANING_MAP.put("ORDER_INDEX", "排序"); + ENG_FIELD_MEANING_MAP.put("STDSDT", "规划设计日期"); + ENG_FIELD_MEANING_MAP.put("PSTSTDT", "计划开工日期"); + ENG_FIELD_MEANING_MAP.put("PESSTDT", "计划完工日期"); + ENG_FIELD_MEANING_MAP.put("SWDT", "开工日期"); + ENG_FIELD_MEANING_MAP.put("JCDT", "建成日期"); + ENG_FIELD_MEANING_MAP.put("WDDT", "退役/拆除日期"); + ENG_FIELD_MEANING_MAP.put("JLDT", "截流日期"); + ENG_FIELD_MEANING_MAP.put("INTRODUCE", "电站简介"); + ENG_FIELD_MEANING_MAP.put("LOGO", "电站LOGO"); + ENG_FIELD_MEANING_MAP.put("INFFILE", "介绍弹窗图片"); + ENG_FIELD_MEANING_MAP.put("DMAT", "坝体材质"); + ENG_FIELD_MEANING_MAP.put("DMTP", "坝体类型"); + ENG_FIELD_MEANING_MAP.put("MNUN", "管理单位"); + ENG_FIELD_MEANING_MAP.put("CMUN", "主管单位"); + ENG_FIELD_MEANING_MAP.put("BLSYS", "归属部门"); + ENG_FIELD_MEANING_MAP.put("ROLL", "绕经度方向旋转矩阵值"); + ENG_FIELD_MEANING_MAP.put("PITCH", "绕纬度方向旋转矩阵值"); + ENG_FIELD_MEANING_MAP.put("HEADING", "绕高程方向旋转矩阵值"); + ENG_FIELD_MEANING_MAP.put("SCALE", "模型缩放比例"); + ENG_FIELD_MEANING_MAP.put("IMPDSTRZ", "是否受下游顶托"); + ENG_FIELD_MEANING_MAP.put("PROV", "工程概况"); + ENG_FIELD_MEANING_MAP.put("ESTRYDIS", "河口距离"); + ENG_FIELD_MEANING_MAP.put("THRSMDAYS", "三同时评价允许误差天数"); + ENG_FIELD_MEANING_MAP.put("ZJXYDZ", "直接下游电站"); + ENG_FIELD_MEANING_MAP.put("EDTUN", "编制单位"); + ENG_FIELD_MEANING_MAP.put("EDTTM", "编制时间"); + ENG_FIELD_MEANING_MAP.put("DSNSTT", "勘测设计情况"); + ENG_FIELD_MEANING_MAP.put("YSDLEN", "引水道长"); + ENG_FIELD_MEANING_MAP.put("DMRKTP", "坝基岩性"); + ENG_FIELD_MEANING_MAP.put("HNTJZL", "混凝土浇筑量"); + ENG_FIELD_MEANING_MAP.put("GNTP", "容量构成"); + ENG_FIELD_MEANING_MAP.put("CNTRAR", "控制流域面积"); + ENG_FIELD_MEANING_MAP.put("CNTRSC", "控制面积占全流域比例"); + ENG_FIELD_MEANING_MAP.put("AVYRP", "多年平均降水量"); + ENG_FIELD_MEANING_MAP.put("AVQ", "多年平均流量"); + ENG_FIELD_MEANING_MAP.put("DSAVQ", "电站未建枯水期平均流量"); + ENG_FIELD_MEANING_MAP.put("DSMXQ", "设计洪峰流量"); + ENG_FIELD_MEANING_MAP.put("CHMXQ", "校核洪峰流量"); + ENG_FIELD_MEANING_MAP.put("RVLEN", "河道长度"); + ENG_FIELD_MEANING_MAP.put("RVGR", "河道比降"); + ENG_FIELD_MEANING_MAP.put("AVW", "多年平均径流量"); + ENG_FIELD_MEANING_MAP.put("AVYRQ", "多年平均年径流量"); + ENG_FIELD_MEANING_MAP.put("AVSD", "多年平均输沙量"); + ENG_FIELD_MEANING_MAP.put("AVS", "多年平均含沙量"); + ENG_FIELD_MEANING_MAP.put("MYAVMNAT", "多年平均最低气温"); + ENG_FIELD_MEANING_MAP.put("DSW1", "设计一日洪量"); + ENG_FIELD_MEANING_MAP.put("DSW3", "设计三日洪量"); + ENG_FIELD_MEANING_MAP.put("CHFLDR", "校核洪水历时"); + ENG_FIELD_MEANING_MAP.put("CHFLW", "校核洪水总量"); + ENG_FIELD_MEANING_MAP.put("CPSC", "库容系数"); + ENG_FIELD_MEANING_MAP.put("NRZAR", "正常蓄水位时水库面积"); + ENG_FIELD_MEANING_MAP.put("BCKLEN", "水库回水长度"); + ENG_FIELD_MEANING_MAP.put("NRAVWT", "天然河流平均水温"); + ENG_FIELD_MEANING_MAP.put("NRMXAVWT", "天然河流最高温月份多年平均水温"); + ENG_FIELD_MEANING_MAP.put("NRMNAVWT", "天然河流最低温月份多年平均水温"); + ENG_FIELD_MEANING_MAP.put("DNAVWT", "建成后坝下平均水温"); + ENG_FIELD_MEANING_MAP.put("DNMXAVWT", "建成后坝下最高温月份多年平均水温"); + ENG_FIELD_MEANING_MAP.put("DNMNAVWT", "建成后坝下最低温月份多年平均水温"); + ENG_FIELD_MEANING_MAP.put("NRUPAR", "坝址以上流域面积"); + ENG_FIELD_MEANING_MAP.put("NRAVZ", "坝址天然河流平均水位"); + ENG_FIELD_MEANING_MAP.put("NRAVH", "坝址天然河流平均水深"); + ENG_FIELD_MEANING_MAP.put("DSNFQFRQ", "设计入库洪水流量"); + ENG_FIELD_MEANING_MAP.put("CKFQFQR", "校核入库洪水流量"); + ENG_FIELD_MEANING_MAP.put("OBMXW3", "实测最大洪量(三天)"); + ENG_FIELD_MEANING_MAP.put("FDCZ", "水库淹没城镇"); + ENG_FIELD_MEANING_MAP.put("FDQT", "淹没其它设施"); + ENG_FIELD_MEANING_MAP.put("DSTCRVR", "距河源距离"); + ENG_FIELD_MEANING_MAP.put("CKW3", "校核洪量(三天)"); + ENG_FIELD_MEANING_MAP.put("FSLTDZ", "防洪限制水位"); + ENG_FIELD_MEANING_MAP.put("RSTP", "资源类别"); + ENG_FIELD_MEANING_MAP.put("ADJCPS", "调节库容单独"); + ENG_FIELD_MEANING_MAP.put("ADJCPM", "调节库容联合"); + ENG_FIELD_MEANING_MAP.put("YRGEB", "已正建规模装机容量"); + ENG_FIELD_MEANING_MAP.put("TTPWRB", "已正建规模年发电量"); + ENG_FIELD_MEANING_MAP.put("DMCREL", "坝顶高程"); + ENG_FIELD_MEANING_MAP.put("WSC", "水量利用系数"); + ENG_FIELD_MEANING_MAP.put("MXDMHG", "最大坝高"); + ENG_FIELD_MEANING_MAP.put("MXDMHGL", "最大坝高(左)"); + ENG_FIELD_MEANING_MAP.put("MXDMHGR", "最大坝高(右)"); + ENG_FIELD_MEANING_MAP.put("WVTPEL", "防浪墙顶高程"); + } + + private static final Map ENG_CODE_NAME_FIELD_MAP = new LinkedHashMap<>(); + + private static final Set ENG_NAME_COLUMNS = new HashSet<>(); + + static { + ENG_CODE_NAME_FIELD_MAP.put("BASE_ID", "BASE_NAME"); + ENG_CODE_NAME_FIELD_MAP.put("HBRVCD", "HBRVCD_NAME"); + ENG_CODE_NAME_FIELD_MAP.put("RVCD", "RVCD_NAME"); + ENG_CODE_NAME_FIELD_MAP.put("ADDVCD", "ADDVCD_NAME"); + ENG_CODE_NAME_FIELD_MAP.put("COUNTRY", "COUNTRY_NAME"); + ENG_CODE_NAME_FIELD_MAP.put("HYCD", "HYNM"); + ENG_CODE_NAME_FIELD_MAP.put("TOP_HYCD", "TOP_HYNM"); + ENG_CODE_NAME_FIELD_MAP.put("REACHCD", "REACHCD_NAME"); + ENG_NAME_COLUMNS.addAll(ENG_CODE_NAME_FIELD_MAP.values()); } @Resource @@ -66,17 +192,28 @@ public class MsOperationLogServiceImpl implements IMsOperationLogService { msOperationLogMapper.insert(mainLog); List details = new ArrayList<>(); + Set processedColumns = new HashSet<>(); for (Field field : SdEngInfoBH.class.getDeclaredFields()) { if (shouldSkipField(field)) { continue; } field.setAccessible(true); + String columnName = resolveColumnName(field); + if (ENG_NAME_COLUMNS.contains(columnName) || processedColumns.contains(columnName)) { + continue; + } Object newValue = getFieldValue(field, engInfo); if (newValue == null) { continue; } - details.add(buildDetail(mainLog.getId(), engInfo.getStcd(), resolveColumnName(field), - null, newValue, "新增字段值")); + String nameColumn = ENG_CODE_NAME_FIELD_MAP.get(columnName); + Object newNameValue = StrUtil.isBlank(nameColumn) ? newValue : getColumnValue(engInfo, nameColumn); + details.add(buildDetail(mainLog.getId(), engInfo.getStcd(), columnName, + null, null, newValue, newNameValue, "新增字段值")); + processedColumns.add(columnName); + if (StrUtil.isNotBlank(nameColumn)) { + processedColumns.add(nameColumn); + } } batchInsertDetails(details); } @@ -93,18 +230,30 @@ public class MsOperationLogServiceImpl implements IMsOperationLogService { msOperationLogMapper.insert(mainLog); List details = new ArrayList<>(); + Set processedColumns = new HashSet<>(); for (Field field : SdEngInfoBH.class.getDeclaredFields()) { if (shouldSkipField(field)) { continue; } field.setAccessible(true); - Object oldValue = getFieldValue(field, before); - Object newValue = getFieldValue(field, after); - if (equalsValue(oldValue, newValue)) { + String columnName = resolveColumnName(field); + if (ENG_NAME_COLUMNS.contains(columnName) || processedColumns.contains(columnName)) { continue; } - details.add(buildDetail(mainLog.getId(), after.getStcd(), resolveColumnName(field), - oldValue, newValue, "修改字段值")); + Object oldValue = getFieldValue(field, before); + Object newValue = getFieldValue(field, after); + String nameColumn = ENG_CODE_NAME_FIELD_MAP.get(columnName); + Object oldNameValue = StrUtil.isBlank(nameColumn) ? oldValue : getColumnValue(before, nameColumn); + Object newNameValue = StrUtil.isBlank(nameColumn) ? newValue : getColumnValue(after, nameColumn); + if (equalsValue(oldValue, newValue) && equalsValue(oldNameValue, newNameValue)) { + continue; + } + details.add(buildDetail(mainLog.getId(), after.getStcd(), columnName, + oldValue, oldNameValue, newValue, newNameValue, "修改字段值")); + processedColumns.add(columnName); + if (StrUtil.isNotBlank(nameColumn)) { + processedColumns.add(nameColumn); + } } batchInsertDetails(details); } @@ -121,8 +270,10 @@ public class MsOperationLogServiceImpl implements IMsOperationLogService { private MsOperationLogDetail buildDetail(String mainId, String stationCode, String fieldCode, - Object oldValue, - Object newValue, + Object oldValueCode, + Object oldValueName, + Object newValueCode, + Object newValueName, String remark) { MsOperationLogDetail detail = new MsOperationLogDetail(); detail.setMainId(mainId); @@ -130,10 +281,10 @@ public class MsOperationLogServiceImpl implements IMsOperationLogService { detail.setStationCode(stationCode); detail.setFieldCode(fieldCode); detail.setFieldMeaning(ENG_FIELD_MEANING_MAP.getOrDefault(fieldCode, fieldCode)); - detail.setOldValueCode(formatValue(oldValue)); - detail.setOldValueName(formatValue(oldValue)); - detail.setNewValueCode(formatValue(newValue)); - detail.setNewValueName(formatValue(newValue)); + detail.setOldValueCode(formatValue(oldValueCode)); + detail.setOldValueName(formatValue(oldValueName)); + detail.setNewValueCode(formatValue(newValueCode)); + detail.setNewValueName(formatValue(newValueName)); detail.setRemark(remark); return detail; } @@ -173,6 +324,22 @@ public class MsOperationLogServiceImpl implements IMsOperationLogService { } } + private Object getColumnValue(Object target, String columnName) { + if (target == null || StrUtil.isBlank(columnName)) { + return null; + } + for (Field field : SdEngInfoBH.class.getDeclaredFields()) { + if (shouldSkipField(field)) { + continue; + } + field.setAccessible(true); + if (StrUtil.equals(resolveColumnName(field), columnName)) { + return getFieldValue(field, target); + } + } + return null; + } + private boolean equalsValue(Object oldValue, Object newValue) { return StrUtil.equals(formatValue(oldValue), formatValue(newValue)); } 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 05de1201..4d59891b 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 @@ -203,6 +203,7 @@ public class SdEngInfoBHServiceImpl extends ServiceImpl paramMap = new HashMap<>(); + paramMap.put("baseId", engInfo.getBaseId()); + paramMap.put("hbrvcd", engInfo.getHbrvcd()); + paramMap.put("rvcd", engInfo.getRvcd()); + paramMap.put("addvcd", engInfo.getAddvcd()); + paramMap.put("country", engInfo.getCountry()); + paramMap.put("hycd", engInfo.getHycd()); + paramMap.put("topHycd", engInfo.getTopHycd()); + paramMap.put("reachcd", engInfo.getReachcd()); + + Map row = microservicDynamicSQLMapper.getOneBySql(buildEngRelatedNameSql(paramMap), paramMap); + engInfo.setBaseName(resolveRelatedName(engInfo.getBaseId(), row, "BASENAME")); + engInfo.setHbrvcdName(resolveRelatedName(engInfo.getHbrvcd(), row, "HBRVNM")); + engInfo.setRvcdName(resolveRelatedName(engInfo.getRvcd(), row, "RVNM")); + engInfo.setAddvcdName(resolveRelatedName(engInfo.getAddvcd(), row, "ADDVNM")); + engInfo.setCountryName(resolveRelatedName(engInfo.getCountry(), row, "COUNTRY_NAME")); + engInfo.setHynm(resolveRelatedName(engInfo.getHycd(), row, "HYNM")); + engInfo.setTopHynm(resolveRelatedName(engInfo.getTopHycd(), row, "TOP_HYNM")); + engInfo.setReachcdName(resolveRelatedName(engInfo.getReachcd(), row, "REACHCD_NAME")); + } + + private String buildEngRelatedNameSql(Map paramMap) { + StringBuilder sql = new StringBuilder("SELECT "); + sql.append(buildScalarNameSelect( + StringUtils.hasText((String) paramMap.get("baseId")), + "(SELECT hb.BASENAME FROM SD_HYDROBASE hb WHERE hb.BASEID = #{map.baseId} AND NVL(hb.IS_DELETED, 0) = 0 AND ROWNUM = 1)", + "BASENAME" + )); + sql.append(", "); + sql.append(buildHbrvNameSelect(paramMap)); + sql.append(", "); + sql.append(buildScalarNameSelect( + StringUtils.hasText((String) paramMap.get("rvcd")), + "(SELECT rv.RVNM FROM SD_RVCD_DIC rv WHERE rv.RVCD = #{map.rvcd} AND ROWNUM = 1)", + "RVNM" + )); + sql.append(", "); + sql.append(buildScalarNameSelect( + StringUtils.hasText((String) paramMap.get("addvcd")), + "(SELECT addv.ADDVNM FROM SD_ADDVCD_DIC addv WHERE addv.ADDVCD = #{map.addvcd} AND ROWNUM = 1)", + "ADDVNM" + )); + sql.append(", "); + sql.append(buildScalarNameSelect( + StringUtils.hasText((String) paramMap.get("country")), + "(SELECT country.COUNTRY_NAME FROM SD_COUNTRY_B country WHERE country.COUNTRY_ID = #{map.country} " + + "AND NVL(country.ENABLED, 1) = 1 AND ROWNUM = 1)", + "COUNTRY_NAME" + )); + sql.append(", "); + sql.append(buildScalarNameSelect( + StringUtils.hasText((String) paramMap.get("hycd")), + "(SELECT hy.HYNM FROM SD_HYCD_DIC hy WHERE hy.HYCD = #{map.hycd} " + + "AND NVL(hy.IS_DELETED, 0) = 0 AND NVL(hy.ENABLED, 1) = 1 AND ROWNUM = 1)", + "HYNM" + )); + sql.append(", "); + sql.append(buildScalarNameSelect( + StringUtils.hasText((String) paramMap.get("topHycd")), + "(SELECT hy.HYNM FROM SD_HYCD_DIC hy WHERE hy.HYCD = #{map.topHycd} " + + "AND NVL(hy.IS_DELETED, 0) = 0 AND NVL(hy.ENABLED, 1) = 1 AND ROWNUM = 1)", + "TOP_HYNM" + )); + sql.append(", "); + sql.append(buildScalarNameSelect( + StringUtils.hasText((String) paramMap.get("reachcd")), + "(SELECT rv.RVNM FROM SD_RVCD_DIC rv WHERE rv.RVCD = #{map.reachcd} AND ROWNUM = 1)", + "REACHCD_NAME" + )); + sql.append(" FROM DUAL"); + return sql.toString(); + } + + private String buildHbrvNameSelect(Map paramMap) { + if (!StringUtils.hasText((String) paramMap.get("hbrvcd"))) { + return "NULL AS HBRVNM"; + } + StringBuilder sql = new StringBuilder("(SELECT hbrv.HBRVNM FROM SD_HBRV_DIC hbrv WHERE hbrv.HBRVCD = #{map.hbrvcd} "); + if (StringUtils.hasText((String) paramMap.get("baseId"))) { + sql.append("AND hbrv.BASEID = #{map.baseId} "); + } + sql.append("AND NVL(hbrv.IS_DELETED, 0) = 0 AND NVL(hbrv.ENABLED, 1) = 1 AND ROWNUM = 1) AS HBRVNM"); + return sql.toString(); + } + + private String buildScalarNameSelect(boolean hasText, String querySql, String alias) { + if (!hasText) { + return "NULL AS " + alias; + } + return querySql + " AS " + alias; + } + + private String resolveRelatedName(String code, Map row, String column) { + if (code == null) { + return null; + } + if (code.isBlank()) { + return ""; + } + if (row == null) { + return null; + } + Object value = row.get(column); + if (value == null) { + value = row.get(column.toLowerCase()); + } + return value == null ? null : String.valueOf(value); + } + @Override public boolean deleteEngInfo(String stcd) { return this.update( new LambdaUpdateWrapper().eq(SdEngInfoBH::getStcd, stcd).set(SdEngInfoBH::getIsDeleted, 1)); From b895e989c9b91d587ff5a54add85a164c0137907 Mon Sep 17 00:00:00 2001 From: tangwei Date: Thu, 25 Jun 2026 16:00:53 +0800 Subject: [PATCH 06/32] =?UTF-8?q?fix:=20=E4=BC=98=E5=8C=96=E9=80=BB?= =?UTF-8?q?=E8=BE=91?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../impl/MsOperationLogServiceImpl.java | 151 ++++++++++++++++-- 1 file changed, 141 insertions(+), 10 deletions(-) diff --git a/backend/src/main/java/com/yfd/platform/qgc_base/service/impl/MsOperationLogServiceImpl.java b/backend/src/main/java/com/yfd/platform/qgc_base/service/impl/MsOperationLogServiceImpl.java index 141c247d..00f2d699 100644 --- a/backend/src/main/java/com/yfd/platform/qgc_base/service/impl/MsOperationLogServiceImpl.java +++ b/backend/src/main/java/com/yfd/platform/qgc_base/service/impl/MsOperationLogServiceImpl.java @@ -38,21 +38,21 @@ public class MsOperationLogServiceImpl implements IMsOperationLogService { ENG_FIELD_MEANING_MAP.put("TM", "数据时间"); ENG_FIELD_MEANING_MAP.put("ENNM", "电站名称"); ENG_FIELD_MEANING_MAP.put("BASE_ID", "所属基地编码"); - ENG_FIELD_MEANING_MAP.put("BASE_NAME", "所属基地名称"); +// ENG_FIELD_MEANING_MAP.put("BASE_NAME", "所属基地名称"); ENG_FIELD_MEANING_MAP.put("HBRVCD", "所属基地流域编码"); - ENG_FIELD_MEANING_MAP.put("HBRVCD_NAME", "所属基地流域名称"); +// ENG_FIELD_MEANING_MAP.put("HBRVCD_NAME", "所属基地流域名称"); ENG_FIELD_MEANING_MAP.put("RVCD", "所属流域编码"); - ENG_FIELD_MEANING_MAP.put("RVCD_NAME", "所属流域名称"); +// ENG_FIELD_MEANING_MAP.put("RVCD_NAME", "所属流域名称"); ENG_FIELD_MEANING_MAP.put("ADDVCD", "所属行政区编码"); - ENG_FIELD_MEANING_MAP.put("ADDVCD_NAME", "所属行政区名称"); +// ENG_FIELD_MEANING_MAP.put("ADDVCD_NAME", "所属行政区名称"); ENG_FIELD_MEANING_MAP.put("COUNTRY", "所属国家编码"); - ENG_FIELD_MEANING_MAP.put("COUNTRY_NAME", "所属国家名称"); +// ENG_FIELD_MEANING_MAP.put("COUNTRY_NAME", "所属国家名称"); ENG_FIELD_MEANING_MAP.put("REACHCD", "所属河段编码"); - ENG_FIELD_MEANING_MAP.put("REACHCD_NAME", "所属河段名称"); +// ENG_FIELD_MEANING_MAP.put("REACHCD_NAME", "所属河段名称"); ENG_FIELD_MEANING_MAP.put("HYCD", "所属公司编码"); - ENG_FIELD_MEANING_MAP.put("HYNM", "所属公司名称"); +// ENG_FIELD_MEANING_MAP.put("HYNM", "所属公司名称"); ENG_FIELD_MEANING_MAP.put("TOP_HYCD", "所属集团编码"); - ENG_FIELD_MEANING_MAP.put("TOP_HYNM", "所属集团名称"); +// ENG_FIELD_MEANING_MAP.put("TOP_HYNM", "所属集团名称"); ENG_FIELD_MEANING_MAP.put("BLPRD", "所属建设阶段"); ENG_FIELD_MEANING_MAP.put("BLDSTT", "建设状态"); ENG_FIELD_MEANING_MAP.put("BLDSTT_CODE", "建设状态分类"); @@ -165,6 +165,8 @@ public class MsOperationLogServiceImpl implements IMsOperationLogService { private static final Set ENG_NAME_COLUMNS = new HashSet<>(); + private static final Map> ENG_DICT_VALUE_NAME_MAP = new LinkedHashMap<>(); + static { ENG_CODE_NAME_FIELD_MAP.put("BASE_ID", "BASE_NAME"); ENG_CODE_NAME_FIELD_MAP.put("HBRVCD", "HBRVCD_NAME"); @@ -175,6 +177,93 @@ public class MsOperationLogServiceImpl implements IMsOperationLogService { ENG_CODE_NAME_FIELD_MAP.put("TOP_HYCD", "TOP_HYNM"); ENG_CODE_NAME_FIELD_MAP.put("REACHCD", "REACHCD_NAME"); ENG_NAME_COLUMNS.addAll(ENG_CODE_NAME_FIELD_MAP.values()); + + ENG_DICT_VALUE_NAME_MAP.put("USFL", buildValueNameMap("0", "禁用", "1", "启用")); + ENG_DICT_VALUE_NAME_MAP.put("DTIN", buildValueNameMap("0", "否", "1", "是")); + ENG_DICT_VALUE_NAME_MAP.put("MONTH_REPORT", buildValueNameMap("0", "否", "1", "是")); + ENG_DICT_VALUE_NAME_MAP.put("BLPRD", buildValueNameMap( + "1001000", "规划", + "1002000", "预可研", + "1003000", "环评", + "1004000", "可研", + "1005000", "在建", + "1006000", "招标设计", + "1007000", "施工详图", + "1009000", "建设", + "1010000", "蓄水阶段环保验收", + "1011000", "竣工", + "1012000", "竣工环保验收", + "1013000", "环境影响后评价" + )); + ENG_DICT_VALUE_NAME_MAP.put("BLDSTT", buildValueNameMap( + "1", "已建成未验收", + "2", "在建", + "3", "可研", + "4", "规划", + "5", "预可研", + "6", "已核准", + "7", "招标设计", + "8", "施工详图", + "9", "其他", + "10", "已建成已验收", + "11", "已开展后评价", + "31", "项目建议书", + "32", "可研", + "33", "已审批", + "34", "初步设计", + "35", "技施设计", + "36", "在建", + "37", "已建成未验收", + "38", "已建成已验收", + "39", "已开展后评价", + "40", "其他", + "61", "规划", + "62", "项目建议书", + "63", "预可研", + "64", "可研", + "65", "已核准", + "66", "初步设计", + "67", "招标设计", + "68", "技施设计", + "69", "施工详图", + "70", "在建", + "71", "已建成未验收", + "72", "已建成已验收", + "73", "已开展后评价", + "74", "其他", + "91", "拆除" + )); + ENG_DICT_VALUE_NAME_MAP.put("BLDSTT_CODE", buildValueNameMap( + "0", "未建/规划", + "1", "在建", + "2", "已建" + )); + ENG_DICT_VALUE_NAME_MAP.put("ENGTP", buildValueNameMap("1", "水电站", "2", "水利工程", "3", "航电枢纽")); + ENG_DICT_VALUE_NAME_MAP.put("PRSC", buildValueNameMap("1", "大型1", "2", "大型2", "3", "中型", "4", "小型")); + ENG_DICT_VALUE_NAME_MAP.put("SCRSC", buildValueNameMap("1", "大型1", "2", "大型2", "3", "中型", "4", "小型1", "5", "小型2")); + ENG_DICT_VALUE_NAME_MAP.put("PRGR", buildValueNameMap("1", "Ⅰ", "2", "Ⅱ", "3", "Ⅲ", "4", "Ⅳ", "5", "Ⅴ")); + ENG_DICT_VALUE_NAME_MAP.put("FN", buildValueNameMap( + "1", "发电", "2", "防洪", "3", "灌溉", "4", "供水", "5", "航运", + "6", "旅游", "7", "环境", "8", "养殖", "9", "其他" + )); + ENG_DICT_VALUE_NAME_MAP.put("BSSSIN", buildValueNameMap("5", "<Ⅵ", "6", "Ⅵ", "7", "Ⅶ", "8", "Ⅷ", "9", "≥Ⅸ")); + ENG_DICT_VALUE_NAME_MAP.put("FRSSIN", buildValueNameMap("0", "未设防", "6", "Ⅵ", "7", "Ⅶ", "8", "Ⅷ", "9", "≥Ⅸ")); + ENG_DICT_VALUE_NAME_MAP.put("ADJUST_ENG", buildValueNameMap("0", "否", "1", "是")); + ENG_DICT_VALUE_NAME_MAP.put("ISHVBRRG", buildValueNameMap("0", "无", "1", "有")); + ENG_DICT_VALUE_NAME_MAP.put("RGCP", buildValueNameMap( + "1", "多年调节", "2", "年调节", "3", "不完全年调节", "4", "径流式(无调节)", + "5", "季调节", "6", "月调节", "7", "周调节", "8", "日调节", "9", "其他" + )); + ENG_DICT_VALUE_NAME_MAP.put("DMAT", buildValueNameMap("0", "混凝土坝", "1", "土坝")); + ENG_DICT_VALUE_NAME_MAP.put("DMTP", buildValueNameMap( + "0", "混合型", "1", "重力坝", "2", "拱坝", "3", "土石坝", "4", "支墩坝", + "5", "混凝土闸坝", "6", "混凝土面板堆石坝", "7", "预应力坝", + "8", "复合土工膜面板堆石坝", "9", "碾压混凝土重力坝", "10", "混凝土重力坝" + )); + ENG_DICT_VALUE_NAME_MAP.put("DVTP", buildValueNameMap("1", "堤坝式", "2", "引水式", "3", "混合式")); + ENG_DICT_VALUE_NAME_MAP.put("CNTP", buildValueNameMap("1", "新建", "2", "改建", "3", "扩建", "4", "加固")); + ENG_DICT_VALUE_NAME_MAP.put("BLSYS", buildValueNameMap("1", "水利", "2", "能源", "3", "交通", "4", "农业", "5", "建设", "9", "其他")); + ENG_DICT_VALUE_NAME_MAP.put("IMPDSTRZ", buildValueNameMap("0", "否", "1", "是")); } @Resource @@ -243,8 +332,8 @@ public class MsOperationLogServiceImpl implements IMsOperationLogService { Object oldValue = getFieldValue(field, before); Object newValue = getFieldValue(field, after); String nameColumn = ENG_CODE_NAME_FIELD_MAP.get(columnName); - Object oldNameValue = StrUtil.isBlank(nameColumn) ? oldValue : getColumnValue(before, nameColumn); - Object newNameValue = StrUtil.isBlank(nameColumn) ? newValue : getColumnValue(after, nameColumn); + Object oldNameValue = resolveNameValue(columnName, nameColumn, oldValue, before); + Object newNameValue = resolveNameValue(columnName, nameColumn, newValue, after); if (equalsValue(oldValue, newValue) && equalsValue(oldNameValue, newNameValue)) { continue; } @@ -340,6 +429,48 @@ public class MsOperationLogServiceImpl implements IMsOperationLogService { return null; } + private Object resolveNameValue(String fieldCode, String nameColumn, Object rawValue, SdEngInfoBH target) { + if (StrUtil.isNotBlank(nameColumn)) { + return getColumnValue(target, nameColumn); + } + return resolveDictName(fieldCode, rawValue); + } + + private Object resolveDictName(String fieldCode, Object rawValue) { + String text = formatValue(rawValue); + if (StrUtil.isBlank(text)) { + return rawValue; + } + Map dictMap = ENG_DICT_VALUE_NAME_MAP.get(fieldCode); + if (dictMap == null || dictMap.isEmpty()) { + return rawValue; + } + if (!text.contains(",") && !text.contains(";")) { + return dictMap.getOrDefault(text, rawValue == null ? null : text); + } + String[] parts = text.split("[,;]"); + List names = new ArrayList<>(); + for (String part : parts) { + String code = StrUtil.trim(part); + if (StrUtil.isBlank(code)) { + continue; + } + names.add(dictMap.getOrDefault(code, code)); + } + return names.isEmpty() ? rawValue : String.join(",", names); + } + + private static Map buildValueNameMap(String... keyValues) { + Map valueMap = new LinkedHashMap<>(); + if (keyValues == null) { + return valueMap; + } + for (int i = 0; i + 1 < keyValues.length; i += 2) { + valueMap.put(keyValues[i], keyValues[i + 1]); + } + return valueMap; + } + private boolean equalsValue(Object oldValue, Object newValue) { return StrUtil.equals(formatValue(oldValue), formatValue(newValue)); } From c24c4e8645f3ddfa8711ec07ac5db2e3e40e5f52 Mon Sep 17 00:00:00 2001 From: tangwei Date: Thu, 25 Jun 2026 16:14:45 +0800 Subject: [PATCH 07/32] =?UTF-8?q?fix:=20=E4=BC=98=E5=8C=96=E9=80=BB?= =?UTF-8?q?=E8=BE=91?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../service/impl/SdEngInfoBHServiceImpl.java | 19 ++++++++++++++----- 1 file changed, 14 insertions(+), 5 deletions(-) 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 4d59891b..568249a6 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 @@ -300,11 +300,7 @@ public class SdEngInfoBHServiceImpl extends ServiceImpl paramMap) { + if (!StringUtils.hasText((String) paramMap.get("reachcd"))) { + return "NULL AS REACHCD_NAME"; + } + return "(SELECT LISTAGG(pathNode.RVNM, '-') WITHIN GROUP (ORDER BY pathNode.LVL DESC) " + + "FROM ( " + + " SELECT rv.RVNM, LEVEL AS LVL " + + " FROM SD_RVCD_DIC rv " + + " START WITH rv.RVCD = #{map.reachcd} " + + " CONNECT BY PRIOR rv.PRVCD = rv.RVCD " + + ") pathNode) AS REACHCD_NAME"; + } + private String resolveRelatedName(String code, Map row, String column) { if (code == null) { return null; From a3eac3a4ad0e08e6f7cdb61e5825011ed0cccd51 Mon Sep 17 00:00:00 2001 From: tangwei Date: Thu, 25 Jun 2026 17:10:55 +0800 Subject: [PATCH 08/32] =?UTF-8?q?fix:=20=E4=BC=98=E5=8C=96=E9=80=BB?= =?UTF-8?q?=E8=BE=91?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../controller/SdEngInfoBHController.java | 11 +- .../domain/SdEngInfoBHOperateRequest.java | 4 +- .../qgc_base/service/ISdEngInfoBHService.java | 3 + .../impl/MsOperationLogServiceImpl.java | 8 +- .../service/impl/SdEngInfoBHServiceImpl.java | 126 ++++++++++++++++++ 5 files changed, 143 insertions(+), 9 deletions(-) diff --git a/backend/src/main/java/com/yfd/platform/qgc_base/controller/SdEngInfoBHController.java b/backend/src/main/java/com/yfd/platform/qgc_base/controller/SdEngInfoBHController.java index 1faa114d..ac83a965 100644 --- a/backend/src/main/java/com/yfd/platform/qgc_base/controller/SdEngInfoBHController.java +++ b/backend/src/main/java/com/yfd/platform/qgc_base/controller/SdEngInfoBHController.java @@ -1,6 +1,7 @@ package com.yfd.platform.qgc_base.controller; import com.baomidou.mybatisplus.extension.plugins.pagination.Page; +import com.fasterxml.jackson.databind.ObjectMapper; import com.yfd.platform.annotation.Log; import com.yfd.platform.common.DataSourceRequest; import com.yfd.platform.config.ResponseResult; @@ -24,6 +25,9 @@ import jakarta.annotation.Resource; @Tag(name = "电站管理") public class SdEngInfoBHController { + @Resource + private ObjectMapper objectMapper; + @Resource private ISdEngInfoBHService engInfoBHService; @@ -93,14 +97,17 @@ public class SdEngInfoBHController { @PostMapping("/add") @Operation(summary = "新增电站") public ResponseResult add(@RequestBody SdEngInfoBHOperateRequest request) { - boolean result = engInfoBHService.addEngInfo(request.getEngInfo(), request.getSource()); + SdEngInfoBH engInfo = request == null || request.getEngInfo() == null + ? null + : objectMapper.convertValue(request.getEngInfo(), SdEngInfoBH.class); + boolean result = engInfoBHService.addEngInfo(engInfo, request.getSource()); return result ? ResponseResult.success("新增成功") : ResponseResult.error("新增失败"); } @Log(module = "电站管理", value = "修改电站") @PostMapping("/update") @Operation(summary = "修改电站") - public ResponseResult update(@RequestBody SdEngInfoBHOperateRequest request) { + public ResponseResult update(@RequestBody SdEngInfoBHOperateRequest request) throws Exception { boolean result = engInfoBHService.updateEngInfo(request.getEngInfo(), request.getSource()); return result ? ResponseResult.success("修改成功") : ResponseResult.error("修改失败"); } diff --git a/backend/src/main/java/com/yfd/platform/qgc_base/domain/SdEngInfoBHOperateRequest.java b/backend/src/main/java/com/yfd/platform/qgc_base/domain/SdEngInfoBHOperateRequest.java index bbe53d73..afbc160c 100644 --- a/backend/src/main/java/com/yfd/platform/qgc_base/domain/SdEngInfoBHOperateRequest.java +++ b/backend/src/main/java/com/yfd/platform/qgc_base/domain/SdEngInfoBHOperateRequest.java @@ -2,10 +2,12 @@ package com.yfd.platform.qgc_base.domain; import lombok.Data; +import java.util.Map; + @Data public class SdEngInfoBHOperateRequest { - private SdEngInfoBH engInfo; + private Map engInfo; private String source; } 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 174f151d..f40b1edb 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 @@ -12,6 +12,7 @@ import com.yfd.platform.qgc_base.domain.vo.EngStInfoResultVo; import com.yfd.platform.qgc_base.domain.vo.EngVmsstbprptVo; import java.util.List; +import java.util.Map; import java.util.Set; /** @@ -62,6 +63,8 @@ public interface ISdEngInfoBHService extends IService { boolean updateEngInfo(SdEngInfoBH engInfo, String source); + boolean updateEngInfo(Map engInfoPatch, String source) throws Exception; + /** * 删除电站 */ diff --git a/backend/src/main/java/com/yfd/platform/qgc_base/service/impl/MsOperationLogServiceImpl.java b/backend/src/main/java/com/yfd/platform/qgc_base/service/impl/MsOperationLogServiceImpl.java index 00f2d699..56eb5d89 100644 --- a/backend/src/main/java/com/yfd/platform/qgc_base/service/impl/MsOperationLogServiceImpl.java +++ b/backend/src/main/java/com/yfd/platform/qgc_base/service/impl/MsOperationLogServiceImpl.java @@ -1,7 +1,5 @@ package com.yfd.platform.qgc_base.service.impl; -import cn.hutool.core.bean.BeanUtil; -import cn.hutool.core.bean.copier.CopyOptions; import cn.hutool.core.date.DateUtil; import cn.hutool.core.util.StrUtil; import com.baomidou.mybatisplus.annotation.TableField; @@ -308,12 +306,10 @@ public class MsOperationLogServiceImpl implements IMsOperationLogService { } @Override - public void recordEngUpdateLog(SdEngInfoBH before, SdEngInfoBH changeSet, String source) { - if (before == null || changeSet == null) { + public void recordEngUpdateLog(SdEngInfoBH before, SdEngInfoBH after, String source) { + if (before == null || after == null) { return; } - SdEngInfoBH after = BeanUtil.copyProperties(before, SdEngInfoBH.class); - BeanUtil.copyProperties(changeSet, after, CopyOptions.create().ignoreNullValue()); MsOperationLog mainLog = buildMainLog("修改电站", source); msOperationLogMapper.insert(mainLog); 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 568249a6..37ca529c 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 @@ -4,9 +4,15 @@ import cn.hutool.core.bean.BeanUtil; import cn.hutool.core.bean.copier.CopyOptions; import cn.hutool.core.collection.CollUtil; import cn.hutool.core.util.StrUtil; +import com.baomidou.mybatisplus.annotation.TableField; +import com.baomidou.mybatisplus.annotation.TableId; import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; import com.baomidou.mybatisplus.core.conditions.update.LambdaUpdateWrapper; +import com.baomidou.mybatisplus.core.conditions.update.UpdateWrapper; import com.baomidou.mybatisplus.extension.plugins.pagination.Page; +import com.fasterxml.jackson.core.JsonProcessingException; +import com.fasterxml.jackson.databind.JsonMappingException; +import com.fasterxml.jackson.databind.ObjectMapper; import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; import com.yfd.platform.common.DataSourceLoadOptionsBase; import com.yfd.platform.common.DataSourceRequest; @@ -33,6 +39,7 @@ import org.springframework.stereotype.Service; import org.springframework.transaction.annotation.Transactional; import org.springframework.util.StringUtils; +import java.lang.reflect.Field; import java.util.ArrayList; import java.util.Arrays; import java.util.HashMap; @@ -51,6 +58,19 @@ import java.util.stream.Collectors; @Service public class SdEngInfoBHServiceImpl extends ServiceImpl implements ISdEngInfoBHService { + private static final Map ENG_CODE_NAME_FIELD_MAP = new LinkedHashMap<>(); + + static { + ENG_CODE_NAME_FIELD_MAP.put("baseId", "baseName"); + ENG_CODE_NAME_FIELD_MAP.put("hbrvcd", "hbrvcdName"); + ENG_CODE_NAME_FIELD_MAP.put("rvcd", "rvcdName"); + ENG_CODE_NAME_FIELD_MAP.put("addvcd", "addvcdName"); + ENG_CODE_NAME_FIELD_MAP.put("country", "countryName"); + ENG_CODE_NAME_FIELD_MAP.put("hycd", "hynm"); + ENG_CODE_NAME_FIELD_MAP.put("topHycd", "topHynm"); + ENG_CODE_NAME_FIELD_MAP.put("reachcd", "reachcdName"); + } + @Resource private SdEngInfoBHMapper engInfoBHMapper; @@ -63,6 +83,9 @@ public class SdEngInfoBHServiceImpl extends ServiceImpl queryPageList(Page page, String ennm, String rvcd, String baseId, String hycd) { LambdaQueryWrapper wrapper = new LambdaQueryWrapper<>(); @@ -232,6 +255,60 @@ public class SdEngInfoBHServiceImpl extends ServiceImpl engInfoPatch, String source) throws JsonMappingException { + if (engInfoPatch == null || engInfoPatch.isEmpty()) { + return false; + } + String stcd = toTextValue(engInfoPatch.get("stcd")); + if (!StringUtils.hasText(stcd)) { + return false; + } + SdEngInfoBH before = this.getById(stcd); + if (before == null) { + return false; + } + SdEngInfoBH after = BeanUtil.copyProperties(before, SdEngInfoBH.class); + objectMapper.updateValue(after, engInfoPatch); + fillRelatedNameFields(after); + boolean result = updateEngInfoByPatch(stcd, after, engInfoPatch); + if (result) { + msOperationLogService.recordEngUpdateLog(before, after, source); + } + return result; + } + + private boolean updateEngInfoByPatch(String stcd, SdEngInfoBH after, Map engInfoPatch) { + UpdateWrapper updateWrapper = new UpdateWrapper<>(); + updateWrapper.eq("STCD", stcd); + boolean hasUpdateField = false; + for (Field field : SdEngInfoBH.class.getDeclaredFields()) { + field.setAccessible(true); + String fieldName = field.getName(); + if ("serialVersionUID".equals(fieldName) || "stcd".equals(fieldName)) { + continue; + } + boolean explicitPatched = engInfoPatch.containsKey(fieldName); + boolean linkedNamePatched = isLinkedNameFieldPatched(fieldName, engInfoPatch); + if (!explicitPatched && !linkedNamePatched) { + continue; + } + String resolveColumnName = resolveColumnName(field); + Object fieldValue = getFieldValue(field, after); + if (fieldValue == null) { + updateWrapper.setSql(resolveColumnName + " = NULL"); + } else { + updateWrapper.set(resolveColumnName, fieldValue); + } + hasUpdateField = true; + } + if (!hasUpdateField) { + return true; + } + return this.update(null, updateWrapper); + } + private void fillRelatedNameFields(SdEngInfoBH engInfo) { if (engInfo == null) { return; @@ -354,6 +431,55 @@ public class SdEngInfoBHServiceImpl extends ServiceImpl engInfoPatch) { + for (Map.Entry entry : ENG_CODE_NAME_FIELD_MAP.entrySet()) { + if (entry.getValue().equals(fieldName) && engInfoPatch.containsKey(entry.getKey())) { + return true; + } + } + return false; + } + + private String resolveColumnName(Field field) { + TableId tableId = field.getAnnotation(TableId.class); + if (tableId != null) { + return camelToUpperUnderline(field.getName()); + } + TableField tableField = field.getAnnotation(TableField.class); + if (tableField != null && StrUtil.isNotBlank(tableField.value())) { + return tableField.value(); + } + return camelToUpperUnderline(field.getName()); + } + + private Object getFieldValue(Field field, Object target) { + try { + return field.get(target); + } catch (IllegalAccessException e) { + return null; + } + } + + private String toTextValue(Object value) { + if (value == null) { + return null; + } + String text = String.valueOf(value); + return text.isBlank() ? null : text; + } + + private String camelToUpperUnderline(String text) { + StringBuilder builder = new StringBuilder(); + for (int i = 0; i < text.length(); i++) { + char ch = text.charAt(i); + if (Character.isUpperCase(ch) && i > 0) { + builder.append('_'); + } + builder.append(Character.toUpperCase(ch)); + } + return builder.toString(); + } + @Override public boolean deleteEngInfo(String stcd) { return this.update( new LambdaUpdateWrapper().eq(SdEngInfoBH::getStcd, stcd).set(SdEngInfoBH::getIsDeleted, 1)); From 0c11fade58e0a1075c1d4e58867337629aa9a6df Mon Sep 17 00:00:00 2001 From: tangwei Date: Thu, 25 Jun 2026 17:29:13 +0800 Subject: [PATCH 09/32] =?UTF-8?q?fix:=20=E4=BC=98=E5=8C=96=E9=80=BB?= =?UTF-8?q?=E8=BE=91?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../service/impl/SdEngInfoBHServiceImpl.java | 29 ++++++++++++++++--- 1 file changed, 25 insertions(+), 4 deletions(-) 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 37ca529c..6afe35c0 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 @@ -258,10 +258,11 @@ public class SdEngInfoBHServiceImpl extends ServiceImpl engInfoPatch, String source) throws JsonMappingException { - if (engInfoPatch == null || engInfoPatch.isEmpty()) { + Map filteredPatch = filterEngInfoPatchFields(engInfoPatch); + if (filteredPatch.isEmpty()) { return false; } - String stcd = toTextValue(engInfoPatch.get("stcd")); + String stcd = toTextValue(filteredPatch.get("stcd")); if (!StringUtils.hasText(stcd)) { return false; } @@ -270,9 +271,9 @@ public class SdEngInfoBHServiceImpl extends ServiceImpl filterEngInfoPatchFields(Map engInfoPatch) { + Map filteredPatch = new LinkedHashMap<>(); + if (engInfoPatch == null || engInfoPatch.isEmpty()) { + return filteredPatch; + } + Set validFieldNames = new HashSet<>(); + for (Field field : SdEngInfoBH.class.getDeclaredFields()) { + if ("serialVersionUID".equals(field.getName())) { + continue; + } + validFieldNames.add(field.getName()); + } + for (Map.Entry entry : engInfoPatch.entrySet()) { + if (validFieldNames.contains(entry.getKey())) { + filteredPatch.put(entry.getKey(), entry.getValue()); + } + } + return filteredPatch; + } + private boolean isLinkedNameFieldPatched(String fieldName, Map engInfoPatch) { for (Map.Entry entry : ENG_CODE_NAME_FIELD_MAP.entrySet()) { if (entry.getValue().equals(fieldName) && engInfoPatch.containsKey(entry.getKey())) { From f25d0cf4210b492cbd2f201c6ea6833c299498a9 Mon Sep 17 00:00:00 2001 From: tangwei Date: Thu, 25 Jun 2026 17:41:15 +0800 Subject: [PATCH 10/32] =?UTF-8?q?fix:=20=E4=BC=98=E5=8C=96=E5=A4=9A?= =?UTF-8?q?=E5=B9=B4=E5=B9=B3=E5=9D=87=E5=B9=B4=E5=8F=91=E7=94=B5=E9=87=8F?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../platform/qgc_base/service/impl/SdEngInfoBHServiceImpl.java | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) 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 6afe35c0..487e14e8 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 @@ -902,7 +902,7 @@ public class SdEngInfoBHServiceImpl extends ServiceImpl Date: Thu, 25 Jun 2026 17:59:58 +0800 Subject: [PATCH 11/32] =?UTF-8?q?feat:=20=E8=A1=8C=E6=94=BF=E5=8C=BA?= =?UTF-8?q?=E7=AE=A1=E7=90=86&=E6=A0=B9=E6=8D=AE=E7=BA=A7=E5=88=AB?= =?UTF-8?q?=E5=92=8C=E7=88=B6=E7=BA=A7=E8=A1=8C=E6=94=BF=E5=8C=BA=E7=BC=96?= =?UTF-8?q?=E7=A0=81=E6=9F=A5=E8=AF=A2=E8=A1=8C=E6=94=BF=E5=8C=BA=E4=B8=8B?= =?UTF-8?q?=E6=8B=89?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../controller/SdAddvcdDicController.java | 27 ++++++ .../platform/qgc_base/domain/SdAddvcdDic.java | 93 +++++++++++++++++++ .../domain/SdAddvcdDicDropdownRequest.java | 17 ++++ .../qgc_base/mapper/SdAddvcdDicMapper.java | 12 +++ .../qgc_base/service/ISdAddvcdDicService.java | 19 ++++ .../service/impl/SdAddvcdDicServiceImpl.java | 28 ++++++ 6 files changed, 196 insertions(+) create mode 100644 backend/src/main/java/com/yfd/platform/qgc_base/controller/SdAddvcdDicController.java create mode 100644 backend/src/main/java/com/yfd/platform/qgc_base/domain/SdAddvcdDic.java create mode 100644 backend/src/main/java/com/yfd/platform/qgc_base/domain/SdAddvcdDicDropdownRequest.java create mode 100644 backend/src/main/java/com/yfd/platform/qgc_base/mapper/SdAddvcdDicMapper.java create mode 100644 backend/src/main/java/com/yfd/platform/qgc_base/service/ISdAddvcdDicService.java create mode 100644 backend/src/main/java/com/yfd/platform/qgc_base/service/impl/SdAddvcdDicServiceImpl.java diff --git a/backend/src/main/java/com/yfd/platform/qgc_base/controller/SdAddvcdDicController.java b/backend/src/main/java/com/yfd/platform/qgc_base/controller/SdAddvcdDicController.java new file mode 100644 index 00000000..ff404809 --- /dev/null +++ b/backend/src/main/java/com/yfd/platform/qgc_base/controller/SdAddvcdDicController.java @@ -0,0 +1,27 @@ +package com.yfd.platform.qgc_base.controller; + +import com.yfd.platform.config.ResponseResult; +import com.yfd.platform.qgc_base.domain.SdAddvcdDicDropdownRequest; +import com.yfd.platform.qgc_base.service.ISdAddvcdDicService; +import io.swagger.v3.oas.annotations.Operation; +import io.swagger.v3.oas.annotations.tags.Tag; +import jakarta.annotation.Resource; +import org.springframework.web.bind.annotation.PostMapping; +import org.springframework.web.bind.annotation.RequestBody; +import org.springframework.web.bind.annotation.RequestMapping; +import org.springframework.web.bind.annotation.RestController; + +@RestController +@RequestMapping("/env/addvcd") +@Tag(name = "行政区管理") +public class SdAddvcdDicController { + + @Resource + private ISdAddvcdDicService addvcdDicService; + + @PostMapping("/selectForDropdown") + @Operation(summary = "根据级别和父级行政区编码查询行政区下拉") + public ResponseResult selectForDropdown(@RequestBody SdAddvcdDicDropdownRequest request) { + return ResponseResult.successData(addvcdDicService.selectForDropdown(request.getGrd(), request.getPaddvcd())); + } +} diff --git a/backend/src/main/java/com/yfd/platform/qgc_base/domain/SdAddvcdDic.java b/backend/src/main/java/com/yfd/platform/qgc_base/domain/SdAddvcdDic.java new file mode 100644 index 00000000..69223c3e --- /dev/null +++ b/backend/src/main/java/com/yfd/platform/qgc_base/domain/SdAddvcdDic.java @@ -0,0 +1,93 @@ +package com.yfd.platform.qgc_base.domain; + +import com.baomidou.mybatisplus.annotation.IdType; +import com.baomidou.mybatisplus.annotation.TableId; +import com.baomidou.mybatisplus.annotation.TableName; +import lombok.Data; +import lombok.EqualsAndHashCode; + +import java.io.Serializable; + +/** + *

+ * 行政区字典表 + *

+ */ +@Data +@EqualsAndHashCode(callSuper = false) +@TableName("SD_ADDVCD_DIC") +public class SdAddvcdDic implements Serializable { + + private static final long serialVersionUID = 1L; + + /** + * 行政区编码 + */ + @TableId(type = IdType.INPUT) + private String addvcd; + + /** + * 行政区划名称 + */ + private String addvnm; + + /** + * 所属行政编码,根节点为空 + */ + private String paddvcd; + + /** + * 树级别,从1开始 1=省 2=市 3=县 + */ + private Integer grd; + + /** + * 树全路径 + */ + private String path; + + /** + * 排序 + */ + private Integer orderIndex; + + /** + * 中心经度 + */ + private Double lgtd; + + /** + * 中心纬度 + */ + private Double lttd; + + /** + * 面积 + */ + private Double area; + + /** + * 周长 + */ + private Double perimeter; + + /** + * 所属国家 + */ + private String country; + + /** + * 简介 + */ + private String introduce; + + /** + * 介绍图片 + */ + private String inffile; + + /** + * 简称 + */ + private String shortname; +} diff --git a/backend/src/main/java/com/yfd/platform/qgc_base/domain/SdAddvcdDicDropdownRequest.java b/backend/src/main/java/com/yfd/platform/qgc_base/domain/SdAddvcdDicDropdownRequest.java new file mode 100644 index 00000000..27409592 --- /dev/null +++ b/backend/src/main/java/com/yfd/platform/qgc_base/domain/SdAddvcdDicDropdownRequest.java @@ -0,0 +1,17 @@ +package com.yfd.platform.qgc_base.domain; + +import lombok.Data; + +@Data +public class SdAddvcdDicDropdownRequest { + + /** + * 树级别,从1开始 1=省 2=市 3=县 + */ + private Integer grd; + + /** + * 所属行政编码,根节点为空 + */ + private String paddvcd; +} diff --git a/backend/src/main/java/com/yfd/platform/qgc_base/mapper/SdAddvcdDicMapper.java b/backend/src/main/java/com/yfd/platform/qgc_base/mapper/SdAddvcdDicMapper.java new file mode 100644 index 00000000..9016fb28 --- /dev/null +++ b/backend/src/main/java/com/yfd/platform/qgc_base/mapper/SdAddvcdDicMapper.java @@ -0,0 +1,12 @@ +package com.yfd.platform.qgc_base.mapper; + +import com.baomidou.mybatisplus.core.mapper.BaseMapper; +import com.yfd.platform.qgc_base.domain.SdAddvcdDic; + +/** + *

+ * 行政区字典表 Mapper 接口 + *

+ */ +public interface SdAddvcdDicMapper extends BaseMapper { +} diff --git a/backend/src/main/java/com/yfd/platform/qgc_base/service/ISdAddvcdDicService.java b/backend/src/main/java/com/yfd/platform/qgc_base/service/ISdAddvcdDicService.java new file mode 100644 index 00000000..f02313c4 --- /dev/null +++ b/backend/src/main/java/com/yfd/platform/qgc_base/service/ISdAddvcdDicService.java @@ -0,0 +1,19 @@ +package com.yfd.platform.qgc_base.service; + +import com.baomidou.mybatisplus.extension.service.IService; +import com.yfd.platform.qgc_base.domain.SdAddvcdDic; + +import java.util.List; + +/** + *

+ * 行政区字典表 服务类 + *

+ */ +public interface ISdAddvcdDicService extends IService { + + /** + * 根据级别和父级行政区编码查询下拉数据 + */ + List selectForDropdown(Integer grd, String paddvcd); +} diff --git a/backend/src/main/java/com/yfd/platform/qgc_base/service/impl/SdAddvcdDicServiceImpl.java b/backend/src/main/java/com/yfd/platform/qgc_base/service/impl/SdAddvcdDicServiceImpl.java new file mode 100644 index 00000000..05f5a959 --- /dev/null +++ b/backend/src/main/java/com/yfd/platform/qgc_base/service/impl/SdAddvcdDicServiceImpl.java @@ -0,0 +1,28 @@ +package com.yfd.platform.qgc_base.service.impl; + +import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; +import com.yfd.platform.qgc_base.domain.SdAddvcdDic; +import com.yfd.platform.qgc_base.mapper.SdAddvcdDicMapper; +import com.yfd.platform.qgc_base.service.ISdAddvcdDicService; +import org.springframework.stereotype.Service; +import org.springframework.util.StringUtils; + +import java.util.List; + +/** + *

+ * 行政区字典表 服务实现类 + *

+ */ +@Service +public class SdAddvcdDicServiceImpl extends ServiceImpl implements ISdAddvcdDicService { + + @Override + public List selectForDropdown(Integer grd, String paddvcd) { + return this.lambdaQuery() + .eq(grd != null, SdAddvcdDic::getGrd, grd) + .eq(StringUtils.hasText(paddvcd), SdAddvcdDic::getPaddvcd, paddvcd) + .orderByAsc(SdAddvcdDic::getOrderIndex) + .list(); + } +} From b329d475c8b9223ad54d2677da98ffc85aef714b Mon Sep 17 00:00:00 2001 From: tangwei Date: Thu, 25 Jun 2026 18:00:28 +0800 Subject: [PATCH 12/32] =?UTF-8?q?fix:=20=E4=BC=98=E5=8C=96=E8=A7=86?= =?UTF-8?q?=E9=A2=91=E6=8E=A5=E5=8F=A3=E6=8A=A5=E9=94=99?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../common/MicroservicDynamicSQLMapper.java | 3 +- .../vd/service/impl/VdMonitorServiceImpl.java | 29 ++++++++++++------- 2 files changed, 20 insertions(+), 12 deletions(-) diff --git a/backend/src/main/java/com/yfd/platform/common/MicroservicDynamicSQLMapper.java b/backend/src/main/java/com/yfd/platform/common/MicroservicDynamicSQLMapper.java index 56b60176..59e435bd 100644 --- a/backend/src/main/java/com/yfd/platform/common/MicroservicDynamicSQLMapper.java +++ b/backend/src/main/java/com/yfd/platform/common/MicroservicDynamicSQLMapper.java @@ -45,7 +45,8 @@ public interface MicroservicDynamicSQLMapper { default List getAllListWithResultType(String sql, Map map, Class resultType) { - return convertList(getAllList(sql, map), resultType); + List> allList = getAllList(sql, map); + return convertList(allList, resultType); } @Select({"select count(1) count from ${sql} and ${ew.sqlSegment}"}) diff --git a/backend/src/main/java/com/yfd/platform/qgc_env/vd/service/impl/VdMonitorServiceImpl.java b/backend/src/main/java/com/yfd/platform/qgc_env/vd/service/impl/VdMonitorServiceImpl.java index 549b34fa..0a674c47 100644 --- a/backend/src/main/java/com/yfd/platform/qgc_env/vd/service/impl/VdMonitorServiceImpl.java +++ b/backend/src/main/java/com/yfd/platform/qgc_env/vd/service/impl/VdMonitorServiceImpl.java @@ -1179,26 +1179,33 @@ public class VdMonitorServiceImpl implements VdMonitorService { private List normalizeValues(Object value) { List values = new ArrayList<>(); + appendNormalizedValues(values, value); + return values; + } + + private void appendNormalizedValues(List values, Object value) { + if (value == null) { + return; + } if (value instanceof List list) { for (Object item : list) { - if (item != null) { - values.add(item); - } + appendNormalizedValues(values, item); } - return values; + return; } if (value instanceof Object[] array) { for (Object item : array) { - if (item != null) { - values.add(item); - } + appendNormalizedValues(values, item); } - return values; + return; } - if (value != null) { - values.add(value); + if (value instanceof String text) { + if (StrUtil.isNotBlank(text)) { + values.add(text); + } + return; } - return values; + values.add(value); } private String mapVdTreeColumn(String field) { From 5bf3cf0ee90fc07c751a96c19f911a3cc64f87c1 Mon Sep 17 00:00:00 2001 From: tangwei Date: Thu, 25 Jun 2026 18:13:30 +0800 Subject: [PATCH 13/32] =?UTF-8?q?feat:=20=E5=85=A8=E8=BF=87=E7=A8=8B?= =?UTF-8?q?=E6=B2=BF=E7=A8=8B=E9=B1=BC=E7=B1=BB=E5=8F=98=E5=8C=96=E6=83=85?= =?UTF-8?q?=E5=86=B5=E6=9C=89=E6=95=B0=E6=8D=AE=E7=9A=84=E6=B5=81=E5=9F=9F?= =?UTF-8?q?=E5=92=8C=E5=B9=B4=E4=BB=BD?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../wte/controller/WeFishController.java | 6 + .../qgc_env/wte/entity/vo/WeRvcdYearVo.java | 15 ++ .../qgc_env/wte/service/WeFishService.java | 5 + .../wte/service/impl/WeFishServiceImpl.java | 155 +++++++++++++++++- 4 files changed, 175 insertions(+), 6 deletions(-) create mode 100644 backend/src/main/java/com/yfd/platform/qgc_env/wte/entity/vo/WeRvcdYearVo.java diff --git a/backend/src/main/java/com/yfd/platform/qgc_env/wte/controller/WeFishController.java b/backend/src/main/java/com/yfd/platform/qgc_env/wte/controller/WeFishController.java index da46591c..b4468f5f 100644 --- a/backend/src/main/java/com/yfd/platform/qgc_env/wte/controller/WeFishController.java +++ b/backend/src/main/java/com/yfd/platform/qgc_env/wte/controller/WeFishController.java @@ -26,4 +26,10 @@ public class WeFishController { public ResponseResult getQgcWeFishTKendoListCust(@RequestBody DataSourceRequest dataSourceRequest) { return ResponseResult.successData(weFishService.getQgcWeFishTKendoListCust(dataSourceRequest)); } + + @PostMapping("/we/fisht/year/qgc/GetKendoListCust") + @Operation(summary = "全过程沿程鱼类变化情况有数据的流域和年份") + public ResponseResult getQgcFishStaticsYearList(@RequestBody DataSourceRequest dataSourceRequest) { + return ResponseResult.successData(weFishService.getQgcFishStaticsYearList(dataSourceRequest)); + } } diff --git a/backend/src/main/java/com/yfd/platform/qgc_env/wte/entity/vo/WeRvcdYearVo.java b/backend/src/main/java/com/yfd/platform/qgc_env/wte/entity/vo/WeRvcdYearVo.java new file mode 100644 index 00000000..96ce4c52 --- /dev/null +++ b/backend/src/main/java/com/yfd/platform/qgc_env/wte/entity/vo/WeRvcdYearVo.java @@ -0,0 +1,15 @@ +package com.yfd.platform.qgc_env.wte.entity.vo; + +import io.swagger.v3.oas.annotations.media.Schema; +import lombok.Data; + +@Data +@Schema(description = "沿程鱼类有数据流域年份") +public class WeRvcdYearVo { + + @Schema(description = "河段编码") + private String hbrvcd; + + @Schema(description = "年份") + private String yr; +} diff --git a/backend/src/main/java/com/yfd/platform/qgc_env/wte/service/WeFishService.java b/backend/src/main/java/com/yfd/platform/qgc_env/wte/service/WeFishService.java index 0cc2c3f6..5f365be3 100644 --- a/backend/src/main/java/com/yfd/platform/qgc_env/wte/service/WeFishService.java +++ b/backend/src/main/java/com/yfd/platform/qgc_env/wte/service/WeFishService.java @@ -4,7 +4,12 @@ import com.yfd.platform.common.DataSourceRequest; import com.yfd.platform.common.DataSourceResult; import com.yfd.platform.qgc_env.wte.entity.vo.WeFishTQgcVo; +import java.util.List; +import java.util.Map; + public interface WeFishService { DataSourceResult getQgcWeFishTKendoListCust(DataSourceRequest dataSourceRequest); + + DataSourceResult>> getQgcFishStaticsYearList(DataSourceRequest dataSourceRequest); } diff --git a/backend/src/main/java/com/yfd/platform/qgc_env/wte/service/impl/WeFishServiceImpl.java b/backend/src/main/java/com/yfd/platform/qgc_env/wte/service/impl/WeFishServiceImpl.java index 86849c3b..686c02af 100644 --- a/backend/src/main/java/com/yfd/platform/qgc_env/wte/service/impl/WeFishServiceImpl.java +++ b/backend/src/main/java/com/yfd/platform/qgc_env/wte/service/impl/WeFishServiceImpl.java @@ -11,6 +11,7 @@ import com.yfd.platform.common.GroupHelper; import com.yfd.platform.common.GroupingInfo; import com.yfd.platform.common.MicroservicDynamicSQLMapper; import com.yfd.platform.qgc_env.wte.entity.vo.WeFishTQgcVo; +import com.yfd.platform.qgc_env.wte.entity.vo.WeRvcdYearVo; import com.yfd.platform.qgc_env.wte.service.WeFishService; import com.yfd.platform.utils.QgcQueryWrapperUtil; import jakarta.annotation.Resource; @@ -20,6 +21,7 @@ import java.util.ArrayList; import java.util.Arrays; import java.util.Date; import java.util.HashMap; +import java.util.LinkedHashMap; import java.util.List; import java.util.Map; @@ -80,6 +82,39 @@ public class WeFishServiceImpl implements WeFishService { return result; } + @Override + public DataSourceResult>> getQgcFishStaticsYearList(DataSourceRequest dataSourceRequest) { + Map paramMap = new HashMap<>(); + DataSourceRequest.FilterDescriptor filter = dataSourceRequest == null ? null : dataSourceRequest.getFilter(); + + String baseId = getFirstWeFishFilterText(filter, "baseId"); + String hbrvcd = getFirstWeFishFilterText(filter, "hbrvcd"); + String yr = getFirstWeFishFilterText(filter, "yr"); + List rstcdList = getWeFishFilterTexts(filter, "rstcd"); + + String sql = buildWeFishYearSql(baseId, hbrvcd, yr, rstcdList, paramMap); + List rows = microservicDynamicSQLMapper.getAllListWithResultType(sql, paramMap, WeRvcdYearVo.class); + + LinkedHashMap> yrMap = new LinkedHashMap<>(); + for (WeRvcdYearVo row : rows) { + if (row == null || StrUtil.isBlank(row.getHbrvcd()) || StrUtil.isBlank(row.getYr())) { + continue; + } + yrMap.computeIfAbsent(row.getHbrvcd(), key -> new ArrayList<>()).add(row.getYr()); + } + + DataSourceResult>> result = new DataSourceResult<>(); + if (yrMap.isEmpty()) { + result.setData(null); + result.setTotal(0L); + } else { + result.setData(java.util.Collections.singletonList(yrMap)); + result.setTotal(1L); + } + result.setAggregates(new HashMap<>()); + return result; + } + private String buildWeFishQgcGroupSql(String baseSql, GroupingInfo[] groupInfos) { if (groupInfos == null || groupInfos.length == 0) { return baseSql; @@ -147,6 +182,74 @@ public class WeFishServiceImpl implements WeFishService { return sql.toString(); } + private String buildWeFishYearSql(String baseId, + String hbrvcd, + String yr, + List rstcdList, + Map paramMap) { + StringBuilder sql = new StringBuilder(); + sql.append("SELECT t.HBRVCD AS hbrvcd, t.YR AS yr ") + .append("FROM (") + .append("SELECT section.HBRVCD, section.RSTCD, section.BASE_ID, TO_CHAR(we.TM, 'yyyy') AS yr ") + .append("FROM SD_WE_B_H section ") + .append("INNER JOIN SD_WE_R we ON section.STCD = we.STCD ") + .append(" AND NVL(we.IS_DELETED, 0) = 0 ") + .append(" AND NVL(we.STATUS, 1) = 1 ") + .append("INNER JOIN SD_WEFISH_R fish ON we.ID = fish.WER_ID ") + .append(" AND NVL(fish.IS_DELETED, 0) = 0 ") + .append("LEFT JOIN V_SD_FISHDICTORY_B dict ON fish.FTP = dict.FISH_ID ") + .append(" AND (section.HBRVCD = dict.RVCD OR dict.RVCD = 'ZY') ") + .append("WHERE NVL(section.USFL, 0) = 1 ") + .append("AND CASE ") + .append("WHEN dict.SPEC_ORIGIN = 2 THEN 1 ") + .append("WHEN dict.SPEC_ORIGIN = 1 AND NVL(dict.PTYPE, -1) <> 6 THEN 2 ") + .append("WHEN dict.SPEC_ORIGIN = 1 AND dict.PTYPE = 6 THEN 3 ") + .append("END IS NOT NULL "); + + if (StrUtil.isNotBlank(baseId)) { + paramMap.put("weYearBaseId", baseId); + sql.append("AND section.BASE_ID = #{map.weYearBaseId} "); + } + if (StrUtil.isNotBlank(hbrvcd)) { + paramMap.put("weYearHbrvcd", hbrvcd); + sql.append("AND section.HBRVCD = #{map.weYearHbrvcd} "); + } + if (StrUtil.isNotBlank(yr)) { + paramMap.put("weYearYr", yr); + sql.append("AND TO_CHAR(we.TM, 'yyyy') = #{map.weYearYr} "); + } + if (CollUtil.isNotEmpty(rstcdList)) { + List placeholders = new ArrayList<>(); + int index = 0; + for (String rstcd : rstcdList) { + if (StrUtil.isBlank(rstcd)) { + continue; + } + String key = "weYearRstcd" + index++; + paramMap.put(key, rstcd); + placeholders.add("#{map." + key + "}"); + } + if (CollUtil.isNotEmpty(placeholders)) { + sql.append("AND section.RSTCD IN (").append(String.join(", ", placeholders)).append(") "); + } + } + + sql.append("GROUP BY section.BASE_ID, section.HBRVCD, section.RSTCD, TO_CHAR(we.TM, 'yyyy')") + .append(") t ") + .append("INNER JOIN (") + .append("SELECT det.STCD, det.SORT, cfg.RVCD ") + .append("FROM MS_ALONG_B cfg ") + .append("INNER JOIN MS_ALONGDET_B det ON cfg.ID = det.ALONG_ID ") + .append("WHERE det.STTP = 'ENG' ") + .append(" AND cfg.CODE = 'common' ") + .append(" AND NVL(det.IS_DELETED, 0) = 0 ") + .append(" AND NVL(cfg.IS_DELETED, 0) = 0") + .append(") t2 ON t.RSTCD = t2.STCD ") + .append("GROUP BY t.BASE_ID, t.HBRVCD, t.YR ") + .append("ORDER BY t.BASE_ID ASC NULLS LAST, t.HBRVCD ASC NULLS LAST, t.YR DESC"); + return sql.toString(); + } + private String buildWeFishQgcDetailSql() { return "SELECT " + "section.STCD AS stcd, " + @@ -421,22 +524,28 @@ public class WeFishServiceImpl implements WeFishService { private List normalizeWeFishQgcValues(Object value) { List values = new ArrayList<>(); + appendWeFishQgcValues(values, value); + return values; + } + + private void appendWeFishQgcValues(List values, Object value) { if (value == null) { - return values; + return; } if (value instanceof Iterable iterable) { for (Object item : iterable) { - values.add(item); + appendWeFishQgcValues(values, item); } - return values; + return; } if (value.getClass().isArray()) { Object[] array = (Object[]) value; - values.addAll(Arrays.asList(array)); - return values; + for (Object item : array) { + appendWeFishQgcValues(values, item); + } + return; } values.add(value); - return values; } private boolean isWeFishIntegerField(String field) { @@ -461,6 +570,40 @@ public class WeFishServiceImpl implements WeFishService { } } + private String getFirstWeFishFilterText(DataSourceRequest.FilterDescriptor filter, String fieldName) { + List values = getWeFishFilterTexts(filter, fieldName); + return CollUtil.isEmpty(values) ? null : values.get(0); + } + + private List getWeFishFilterTexts(DataSourceRequest.FilterDescriptor filter, String fieldName) { + List values = new ArrayList<>(); + collectWeFishFilterTexts(filter, fieldName, values); + return values; + } + + private void collectWeFishFilterTexts(DataSourceRequest.FilterDescriptor filter, String fieldName, List values) { + if (filter == null || StrUtil.isBlank(fieldName)) { + return; + } + if (fieldName.equalsIgnoreCase(filter.getField())) { + for (Object item : normalizeWeFishQgcValues(filter.getValue())) { + if (item == null) { + continue; + } + String text = String.valueOf(item).trim(); + if (StrUtil.isNotBlank(text)) { + values.add(text); + } + } + } + if (CollUtil.isEmpty(filter.getFilters())) { + return; + } + for (DataSourceRequest.FilterDescriptor child : filter.getFilters()) { + collectWeFishFilterTexts(child, fieldName, values); + } + } + private void fillWeFishDerivedFields(List list) { if (CollUtil.isEmpty(list)) { return; From acaa7344d0756970632026f775a125c42e5e8e43 Mon Sep 17 00:00:00 2001 From: tangwei Date: Thu, 25 Jun 2026 18:28:51 +0800 Subject: [PATCH 14/32] =?UTF-8?q?feat:=20=E6=B0=B4=E7=94=9F=E7=94=9F?= =?UTF-8?q?=E6=80=81=E8=B0=83=E6=9F=A5=E6=A6=82=E5=86=B5?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../wte/controller/WeFishController.java | 6 + .../qgc_env/wte/entity/vo/WeStaticsVo.java | 23 ++++ .../qgc_env/wte/service/WeFishService.java | 3 + .../wte/service/impl/WeFishServiceImpl.java | 117 ++++++++++++++++++ 4 files changed, 149 insertions(+) create mode 100644 backend/src/main/java/com/yfd/platform/qgc_env/wte/entity/vo/WeStaticsVo.java diff --git a/backend/src/main/java/com/yfd/platform/qgc_env/wte/controller/WeFishController.java b/backend/src/main/java/com/yfd/platform/qgc_env/wte/controller/WeFishController.java index b4468f5f..671a59d0 100644 --- a/backend/src/main/java/com/yfd/platform/qgc_env/wte/controller/WeFishController.java +++ b/backend/src/main/java/com/yfd/platform/qgc_env/wte/controller/WeFishController.java @@ -32,4 +32,10 @@ public class WeFishController { public ResponseResult getQgcFishStaticsYearList(@RequestBody DataSourceRequest dataSourceRequest) { return ResponseResult.successData(weFishService.getQgcFishStaticsYearList(dataSourceRequest)); } + + @PostMapping("/we/fisht/statics/GetKendoListCust") + @Operation(summary = "水生生态调查概况") + public ResponseResult getQgcWeFishStatics(@RequestBody DataSourceRequest dataSourceRequest) { + return ResponseResult.successData(weFishService.getQgcWeFishStatics(dataSourceRequest)); + } } diff --git a/backend/src/main/java/com/yfd/platform/qgc_env/wte/entity/vo/WeStaticsVo.java b/backend/src/main/java/com/yfd/platform/qgc_env/wte/entity/vo/WeStaticsVo.java new file mode 100644 index 00000000..2dd0928e --- /dev/null +++ b/backend/src/main/java/com/yfd/platform/qgc_env/wte/entity/vo/WeStaticsVo.java @@ -0,0 +1,23 @@ +package com.yfd.platform.qgc_env.wte.entity.vo; + +import io.swagger.v3.oas.annotations.media.Schema; +import lombok.Data; +import lombok.experimental.Accessors; + +@Data +@Accessors(chain = true) +@Schema(description = "水生生态调查概况") +public class WeStaticsVo { + + @Schema(description = "调查批次数量") + private Long dcpcCount; + + @Schema(description = "调查断面数量") + private Long stcdCount; + + @Schema(description = "调查鱼类数量") + private Long ftpCount; + + @Schema(description = "调查鱼类总数") + private Long fcntSum; +} diff --git a/backend/src/main/java/com/yfd/platform/qgc_env/wte/service/WeFishService.java b/backend/src/main/java/com/yfd/platform/qgc_env/wte/service/WeFishService.java index 5f365be3..f3342731 100644 --- a/backend/src/main/java/com/yfd/platform/qgc_env/wte/service/WeFishService.java +++ b/backend/src/main/java/com/yfd/platform/qgc_env/wte/service/WeFishService.java @@ -3,6 +3,7 @@ package com.yfd.platform.qgc_env.wte.service; import com.yfd.platform.common.DataSourceRequest; import com.yfd.platform.common.DataSourceResult; import com.yfd.platform.qgc_env.wte.entity.vo.WeFishTQgcVo; +import com.yfd.platform.qgc_env.wte.entity.vo.WeStaticsVo; import java.util.List; import java.util.Map; @@ -12,4 +13,6 @@ public interface WeFishService { DataSourceResult getQgcWeFishTKendoListCust(DataSourceRequest dataSourceRequest); DataSourceResult>> getQgcFishStaticsYearList(DataSourceRequest dataSourceRequest); + + DataSourceResult getQgcWeFishStatics(DataSourceRequest dataSourceRequest); } diff --git a/backend/src/main/java/com/yfd/platform/qgc_env/wte/service/impl/WeFishServiceImpl.java b/backend/src/main/java/com/yfd/platform/qgc_env/wte/service/impl/WeFishServiceImpl.java index 686c02af..0836b964 100644 --- a/backend/src/main/java/com/yfd/platform/qgc_env/wte/service/impl/WeFishServiceImpl.java +++ b/backend/src/main/java/com/yfd/platform/qgc_env/wte/service/impl/WeFishServiceImpl.java @@ -12,6 +12,7 @@ import com.yfd.platform.common.GroupingInfo; import com.yfd.platform.common.MicroservicDynamicSQLMapper; import com.yfd.platform.qgc_env.wte.entity.vo.WeFishTQgcVo; import com.yfd.platform.qgc_env.wte.entity.vo.WeRvcdYearVo; +import com.yfd.platform.qgc_env.wte.entity.vo.WeStaticsVo; import com.yfd.platform.qgc_env.wte.service.WeFishService; import com.yfd.platform.utils.QgcQueryWrapperUtil; import jakarta.annotation.Resource; @@ -19,6 +20,7 @@ import org.springframework.stereotype.Service; import java.util.ArrayList; import java.util.Arrays; +import java.util.Collections; import java.util.Date; import java.util.HashMap; import java.util.LinkedHashMap; @@ -115,6 +117,34 @@ public class WeFishServiceImpl implements WeFishService { return result; } + @Override + public DataSourceResult getQgcWeFishStatics(DataSourceRequest dataSourceRequest) { + Map paramMap = new HashMap<>(); + DataSourceRequest.FilterDescriptor filter = dataSourceRequest == null ? null : dataSourceRequest.getFilter(); + + String baseId = getFirstWeFishFilterText(filter, "baseId"); + String hbrvcd = getFirstWeFishFilterText(filter, "hbrvcd"); + String yr = getFirstWeFishFilterText(filter, "yr"); + List rstcdList = getWeFishFilterTexts(filter, "rstcd"); + + String sql = buildWeFishStaticsSql(baseId, hbrvcd, yr, rstcdList, paramMap); + Map row = microservicDynamicSQLMapper.getOneBySql(sql, paramMap); + WeStaticsVo vo = buildWeFishStaticsVo(row); + if (vo == null) { + vo = new WeStaticsVo(); + } + vo.setDcpcCount(vo.getDcpcCount() == null ? 0L : vo.getDcpcCount()); + vo.setStcdCount(vo.getStcdCount() == null ? 0L : vo.getStcdCount()); + vo.setFtpCount(vo.getFtpCount() == null ? 0L : vo.getFtpCount()); + vo.setFcntSum(vo.getFcntSum() == null ? 0L : vo.getFcntSum()); + + DataSourceResult result = new DataSourceResult<>(); + result.setData(Collections.singletonList(vo)); + result.setTotal(1L); + result.setAggregates(new HashMap<>()); + return result; + } + private String buildWeFishQgcGroupSql(String baseSql, GroupingInfo[] groupInfos) { if (groupInfos == null || groupInfos.length == 0) { return baseSql; @@ -250,6 +280,67 @@ public class WeFishServiceImpl implements WeFishService { return sql.toString(); } + private String buildWeFishStaticsSql(String baseId, + String hbrvcd, + String yr, + List rstcdList, + Map paramMap) { + StringBuilder sql = new StringBuilder(); + sql.append("SELECT ") + .append("COUNT(DISTINCT we.DCPC) AS dcpcCount, ") + .append("COUNT(DISTINCT we.STCD) AS stcdCount, ") + .append("COUNT(DISTINCT fish.FTP) AS ftpCount, ") + .append("NVL(SUM(NVL(fish.FCNT, 0)), 0) AS fcntSum ") + .append("FROM SD_WE_B_H section ") + .append("INNER JOIN SD_WE_R we ON section.STCD = we.STCD ") + .append(" AND NVL(we.IS_DELETED, 0) = 0 ") + .append(" AND NVL(we.STATUS, 1) = 1 ") + .append("LEFT JOIN SD_WEFISH_R fish ON fish.WER_ID = we.ID ") + .append(" AND NVL(fish.IS_DELETED, 0) = 0 ") + .append("WHERE NVL(section.USFL, 0) = 1 "); + + if (StrUtil.isNotBlank(baseId)) { + paramMap.put("weStaticsBaseId", baseId); + sql.append("AND section.BASE_ID = #{map.weStaticsBaseId} "); + } + if (StrUtil.isNotBlank(hbrvcd)) { + paramMap.put("weStaticsHbrvcd", hbrvcd); + sql.append("AND section.HBRVCD = #{map.weStaticsHbrvcd} "); + } + if (StrUtil.isNotBlank(yr)) { + paramMap.put("weStaticsYr", yr); + sql.append("AND TO_CHAR(we.TM, 'yyyy') = #{map.weStaticsYr} "); + } + if (CollUtil.isNotEmpty(rstcdList)) { + List placeholders = new ArrayList<>(); + int index = 0; + for (String rstcd : rstcdList) { + if (StrUtil.isBlank(rstcd)) { + continue; + } + String key = "weStaticsRstcd" + index++; + paramMap.put(key, rstcd); + placeholders.add("#{map." + key + "}"); + } + if (CollUtil.isNotEmpty(placeholders)) { + sql.append("AND section.RSTCD IN (").append(String.join(", ", placeholders)).append(") "); + } + } + return sql.toString(); + } + + private WeStaticsVo buildWeFishStaticsVo(Map row) { + if (row == null || row.isEmpty()) { + return null; + } + WeStaticsVo vo = new WeStaticsVo(); + vo.setDcpcCount(toWeFishLongValue(firstPresentWeFishValue(row, "DCPCCOUNT", "dcpcCount"))); + vo.setStcdCount(toWeFishLongValue(firstPresentWeFishValue(row, "STCDCOUNT", "stcdCount"))); + vo.setFtpCount(toWeFishLongValue(firstPresentWeFishValue(row, "FTPCOUNT", "ftpCount"))); + vo.setFcntSum(toWeFishLongValue(firstPresentWeFishValue(row, "FCNTSUM", "fcntSum"))); + return vo; + } + private String buildWeFishQgcDetailSql() { return "SELECT " + "section.STCD AS stcd, " + @@ -570,6 +661,32 @@ public class WeFishServiceImpl implements WeFishService { } } + private Object firstPresentWeFishValue(Map row, String... keys) { + if (row == null || keys == null) { + return null; + } + for (String key : keys) { + if (key != null && row.containsKey(key)) { + return row.get(key); + } + } + return null; + } + + private Long toWeFishLongValue(Object value) { + if (value == null) { + return null; + } + if (value instanceof Number number) { + return number.longValue(); + } + try { + return Long.parseLong(String.valueOf(value).trim()); + } catch (Exception ex) { + return null; + } + } + private String getFirstWeFishFilterText(DataSourceRequest.FilterDescriptor filter, String fieldName) { List values = getWeFishFilterTexts(filter, fieldName); return CollUtil.isEmpty(values) ? null : values.get(0); From bd11b3ba5752b232000e022dcb80b3b12ac945d5 Mon Sep 17 00:00:00 2001 From: tangwei Date: Fri, 26 Jun 2026 08:22:51 +0800 Subject: [PATCH 15/32] =?UTF-8?q?feat:=20=E7=8E=AF=E4=BF=9D=E9=83=A8-?= =?UTF-8?q?=E6=B2=BF=E7=A8=8B=E9=B1=BC=E7=B1=BB=E5=8F=98=E5=8C=96=E6=83=85?= =?UTF-8?q?=E5=86=B5=E6=9F=B1=E7=8A=B6=E5=9B=BE?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../wte/controller/WeFishController.java | 6 + .../wte/entity/vo/WeFishStatQgcVo.java | 26 +++ .../qgc_env/wte/service/WeFishService.java | 3 + .../wte/service/impl/WeFishServiceImpl.java | 149 ++++++++++++++++++ 4 files changed, 184 insertions(+) create mode 100644 backend/src/main/java/com/yfd/platform/qgc_env/wte/entity/vo/WeFishStatQgcVo.java diff --git a/backend/src/main/java/com/yfd/platform/qgc_env/wte/controller/WeFishController.java b/backend/src/main/java/com/yfd/platform/qgc_env/wte/controller/WeFishController.java index 671a59d0..90336189 100644 --- a/backend/src/main/java/com/yfd/platform/qgc_env/wte/controller/WeFishController.java +++ b/backend/src/main/java/com/yfd/platform/qgc_env/wte/controller/WeFishController.java @@ -38,4 +38,10 @@ public class WeFishController { public ResponseResult getQgcWeFishStatics(@RequestBody DataSourceRequest dataSourceRequest) { return ResponseResult.successData(weFishService.getQgcWeFishStatics(dataSourceRequest)); } + + @PostMapping("/we/fisht/stat/qgc/GetKendoListCust") + @Operation(summary = "环保部-沿程鱼类变化情况柱状图") + public ResponseResult getQgcWeFishStatList(@RequestBody DataSourceRequest dataSourceRequest) { + return ResponseResult.successData(weFishService.getQgcWeFishStatList(dataSourceRequest)); + } } diff --git a/backend/src/main/java/com/yfd/platform/qgc_env/wte/entity/vo/WeFishStatQgcVo.java b/backend/src/main/java/com/yfd/platform/qgc_env/wte/entity/vo/WeFishStatQgcVo.java new file mode 100644 index 00000000..0ad18a62 --- /dev/null +++ b/backend/src/main/java/com/yfd/platform/qgc_env/wte/entity/vo/WeFishStatQgcVo.java @@ -0,0 +1,26 @@ +package com.yfd.platform.qgc_env.wte.entity.vo; + +import io.swagger.v3.oas.annotations.media.Schema; +import lombok.Data; + +import java.util.Map; + +@Data +@Schema(description = "全过程沿程鱼类变化情况柱状图") +public class WeFishStatQgcVo { + + @Schema(description = "电站编码") + private String stcd; + + @Schema(description = "电站名称") + private String stnm; + + @Schema(description = "鱼类类型总数") + private Long total; + + @Schema(description = "鱼类类型明细,key 为鱼类类型,value 为鱼种类数量") + private Map detail; + + @Schema(description = "排序") + private Integer sort; +} diff --git a/backend/src/main/java/com/yfd/platform/qgc_env/wte/service/WeFishService.java b/backend/src/main/java/com/yfd/platform/qgc_env/wte/service/WeFishService.java index f3342731..9e353f97 100644 --- a/backend/src/main/java/com/yfd/platform/qgc_env/wte/service/WeFishService.java +++ b/backend/src/main/java/com/yfd/platform/qgc_env/wte/service/WeFishService.java @@ -2,6 +2,7 @@ package com.yfd.platform.qgc_env.wte.service; import com.yfd.platform.common.DataSourceRequest; import com.yfd.platform.common.DataSourceResult; +import com.yfd.platform.qgc_env.wte.entity.vo.WeFishStatQgcVo; import com.yfd.platform.qgc_env.wte.entity.vo.WeFishTQgcVo; import com.yfd.platform.qgc_env.wte.entity.vo.WeStaticsVo; @@ -15,4 +16,6 @@ public interface WeFishService { DataSourceResult>> getQgcFishStaticsYearList(DataSourceRequest dataSourceRequest); DataSourceResult getQgcWeFishStatics(DataSourceRequest dataSourceRequest); + + DataSourceResult getQgcWeFishStatList(DataSourceRequest dataSourceRequest); } diff --git a/backend/src/main/java/com/yfd/platform/qgc_env/wte/service/impl/WeFishServiceImpl.java b/backend/src/main/java/com/yfd/platform/qgc_env/wte/service/impl/WeFishServiceImpl.java index 0836b964..55c5fcc4 100644 --- a/backend/src/main/java/com/yfd/platform/qgc_env/wte/service/impl/WeFishServiceImpl.java +++ b/backend/src/main/java/com/yfd/platform/qgc_env/wte/service/impl/WeFishServiceImpl.java @@ -10,6 +10,7 @@ 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.wte.entity.vo.WeFishStatQgcVo; import com.yfd.platform.qgc_env.wte.entity.vo.WeFishTQgcVo; import com.yfd.platform.qgc_env.wte.entity.vo.WeRvcdYearVo; import com.yfd.platform.qgc_env.wte.entity.vo.WeStaticsVo; @@ -145,6 +146,52 @@ public class WeFishServiceImpl implements WeFishService { return result; } + @Override + public DataSourceResult getQgcWeFishStatList(DataSourceRequest dataSourceRequest) { + Map paramMap = new HashMap<>(); + DataSourceRequest.FilterDescriptor filter = dataSourceRequest == null ? null : dataSourceRequest.getFilter(); + + String baseId = getFirstWeFishFilterText(filter, "baseId"); + String hbrvcd = getFirstWeFishFilterText(filter, "hbrvcd"); + String yr = getFirstWeFishFilterText(filter, "yr"); + List rstcdList = getWeFishFilterTexts(filter, "rstcd"); + + String sql = buildWeFishStatQgcSql(baseId, hbrvcd, yr, rstcdList, paramMap); + List> rows = microservicDynamicSQLMapper.getAllList(sql, paramMap); + + LinkedHashMap resultMap = new LinkedHashMap<>(); + for (Map row : rows) { + String stcd = safeWeFishString(firstPresentWeFishValue(row, "STCD", "stcd")); + if (StrUtil.isBlank(stcd)) { + continue; + } + WeFishStatQgcVo vo = resultMap.computeIfAbsent(stcd, key -> { + WeFishStatQgcVo item = new WeFishStatQgcVo(); + item.setStcd(key); + item.setStnm(safeWeFishString(firstPresentWeFishValue(row, "STNM", "stnm"))); + item.setSort(toWeFishIntegerValue(firstPresentWeFishValue(row, "SORT", "sort"))); + item.setTotal(0L); + item.setDetail(new LinkedHashMap<>()); + return item; + }); + Long num = toWeFishLongValue(firstPresentWeFishValue(row, "NUM", "num")); + if (num == null) { + num = 0L; + } + String ty = safeWeFishString(firstPresentWeFishValue(row, "TY", "ty")); + if (StrUtil.isNotBlank(ty)) { + vo.getDetail().put(ty, num); + } + vo.setTotal((vo.getTotal() == null ? 0L : vo.getTotal()) + num); + } + + DataSourceResult result = new DataSourceResult<>(); + result.setData(new ArrayList<>(resultMap.values())); + result.setTotal((long) resultMap.size()); + result.setAggregates(new HashMap<>()); + return result; + } + private String buildWeFishQgcGroupSql(String baseSql, GroupingInfo[] groupInfos) { if (groupInfos == null || groupInfos.length == 0) { return baseSql; @@ -280,6 +327,86 @@ public class WeFishServiceImpl implements WeFishService { return sql.toString(); } + private String buildWeFishStatQgcSql(String baseId, + String hbrvcd, + String yr, + List rstcdList, + Map paramMap) { + StringBuilder sql = new StringBuilder(); + sql.append("SELECT t.STCD AS stcd, t.STNM AS stnm, t.NUM AS num, t.TY AS ty, t2.SORT AS sort ") + .append("FROM (") + .append("SELECT section.RSTCD AS STCD, ") + .append("eng.ENNM AS STNM, ") + .append("COUNT(DISTINCT fish.FTP) AS NUM, ") + .append("CASE ") + .append("WHEN dict.SPEC_ORIGIN = 2 THEN '1' ") + .append("WHEN dict.SPEC_ORIGIN = 1 AND NVL(dict.PTYPE, -1) <> 6 THEN '2' ") + .append("WHEN dict.SPEC_ORIGIN = 1 AND dict.PTYPE = 6 THEN '3' ") + .append("END AS TY ") + .append("FROM SD_WE_B_H section ") + .append("INNER JOIN SD_WE_R we ON section.STCD = we.STCD ") + .append(" AND NVL(we.IS_DELETED, 0) = 0 ") + .append(" AND NVL(we.STATUS, 1) = 1 ") + .append("INNER JOIN SD_WEFISH_R fish ON we.ID = fish.WER_ID ") + .append(" AND NVL(fish.IS_DELETED, 0) = 0 ") + .append("LEFT JOIN SD_ENGINFO_B_H eng ON eng.STCD = section.RSTCD ") + .append(" AND NVL(eng.IS_DELETED, 0) = 0 ") + .append("LEFT JOIN V_SD_FISHDICTORY_B dict ON fish.FTP = dict.FISH_ID ") + .append(" AND (section.HBRVCD = dict.RVCD OR dict.RVCD = 'ZY') ") + .append("WHERE NVL(section.USFL, 0) = 1 "); + + if (StrUtil.isNotBlank(baseId)) { + paramMap.put("weFishStatBaseId", baseId); + sql.append("AND section.BASE_ID = #{map.weFishStatBaseId} "); + } + if (StrUtil.isNotBlank(hbrvcd)) { + paramMap.put("weFishStatHbrvcd", hbrvcd); + sql.append("AND section.HBRVCD = #{map.weFishStatHbrvcd} "); + } + if (StrUtil.isNotBlank(yr)) { + paramMap.put("weFishStatYr", yr); + sql.append("AND TO_CHAR(we.TM, 'yyyy') = #{map.weFishStatYr} "); + } + if (CollUtil.isNotEmpty(rstcdList)) { + List placeholders = new ArrayList<>(); + int index = 0; + for (String rstcd : rstcdList) { + if (StrUtil.isBlank(rstcd)) { + continue; + } + String key = "weFishStatRstcd" + index++; + paramMap.put(key, rstcd); + placeholders.add("#{map." + key + "}"); + } + if (CollUtil.isNotEmpty(placeholders)) { + sql.append("AND section.RSTCD IN (").append(String.join(", ", placeholders)).append(") "); + } + } + + sql.append("AND CASE ") + .append("WHEN dict.SPEC_ORIGIN = 2 THEN 1 ") + .append("WHEN dict.SPEC_ORIGIN = 1 AND NVL(dict.PTYPE, -1) <> 6 THEN 2 ") + .append("WHEN dict.SPEC_ORIGIN = 1 AND dict.PTYPE = 6 THEN 3 ") + .append("END IS NOT NULL ") + .append("GROUP BY section.RSTCD, eng.ENNM, CASE ") + .append("WHEN dict.SPEC_ORIGIN = 2 THEN '1' ") + .append("WHEN dict.SPEC_ORIGIN = 1 AND NVL(dict.PTYPE, -1) <> 6 THEN '2' ") + .append("WHEN dict.SPEC_ORIGIN = 1 AND dict.PTYPE = 6 THEN '3' ") + .append("END") + .append(") t ") + .append("INNER JOIN (") + .append("SELECT det.STCD, det.SORT, cfg.RVCD ") + .append("FROM MS_ALONG_B cfg ") + .append("INNER JOIN MS_ALONGDET_B det ON cfg.ID = det.ALONG_ID ") + .append("WHERE det.STTP = 'ENG' ") + .append(" AND cfg.CODE = 'common' ") + .append(" AND NVL(det.IS_DELETED, 0) = 0 ") + .append(" AND NVL(cfg.IS_DELETED, 0) = 0") + .append(") t2 ON t.STCD = t2.STCD ") + .append("ORDER BY t2.SORT ASC NULLS LAST, t.STCD ASC, t.TY ASC"); + return sql.toString(); + } + private String buildWeFishStaticsSql(String baseId, String hbrvcd, String yr, @@ -687,6 +814,28 @@ public class WeFishServiceImpl implements WeFishService { } } + private Integer toWeFishIntegerValue(Object value) { + if (value == null) { + return null; + } + if (value instanceof Number number) { + return number.intValue(); + } + try { + return Integer.parseInt(String.valueOf(value).trim()); + } catch (Exception ex) { + return null; + } + } + + private String safeWeFishString(Object value) { + if (value == null) { + return null; + } + String text = String.valueOf(value).trim(); + return StrUtil.isBlank(text) ? null : text; + } + private String getFirstWeFishFilterText(DataSourceRequest.FilterDescriptor filter, String fieldName) { List values = getWeFishFilterTexts(filter, fieldName); return CollUtil.isEmpty(values) ? null : values.get(0); From 76939be1afe38ea23db3897d2c5b2120a3aa7400 Mon Sep 17 00:00:00 2001 From: tangwei Date: Fri, 26 Jun 2026 08:51:37 +0800 Subject: [PATCH 16/32] =?UTF-8?q?fix:=20=E4=BC=98=E5=8C=96=E6=A0=BC?= =?UTF-8?q?=E5=BC=8F?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../yfd/platform/config/SecurityConfig.java | 28 ++++++++++--------- .../controller/SdEngInfoBHController.java | 4 +-- 2 files changed, 16 insertions(+), 16 deletions(-) diff --git a/backend/src/main/java/com/yfd/platform/config/SecurityConfig.java b/backend/src/main/java/com/yfd/platform/config/SecurityConfig.java index a43e3361..58ec8889 100644 --- a/backend/src/main/java/com/yfd/platform/config/SecurityConfig.java +++ b/backend/src/main/java/com/yfd/platform/config/SecurityConfig.java @@ -61,19 +61,21 @@ public class SecurityConfig { .requestMatchers("/tempFile/**").permitAll() .requestMatchers("/system/user/auditUser").permitAll() .requestMatchers("/register/accessToken").permitAll() -// .requestMatchers("/eng/**").permitAll() -// .requestMatchers("/eq/**").permitAll() -// .requestMatchers("/env/**").permitAll() -// .requestMatchers("/warn/**").permitAll() -// .requestMatchers("/wt/**").permitAll() -// .requestMatchers("/fb/**").permitAll() -// .requestMatchers("/zq/**").permitAll() -// .requestMatchers("/wq/**").permitAll() -// .requestMatchers("/vd/**").permitAll() -// .requestMatchers("/fp/**").permitAll() -// .requestMatchers("/fpr/**").permitAll() -// .requestMatchers("/fh/**").permitAll() -// .requestMatchers("/data/**").permitAll() + .requestMatchers("/eng/**").permitAll() + .requestMatchers("/eq/**").permitAll() + .requestMatchers("/env/**").permitAll() + .requestMatchers("/warn/**").permitAll() + .requestMatchers("/wt/**").permitAll() + .requestMatchers("/fb/**").permitAll() + .requestMatchers("/zq/**").permitAll() + .requestMatchers("/wq/**").permitAll() + .requestMatchers("/wte/**").permitAll() + .requestMatchers("/vd/**").permitAll() + .requestMatchers("/vap/**").permitAll() + .requestMatchers("/fp/**").permitAll() + .requestMatchers("/fpr/**").permitAll() + .requestMatchers("/fh/**").permitAll() + .requestMatchers("/data/**").permitAll() .requestMatchers("/sms/**").permitAll() .requestMatchers(HttpMethod.GET, "/").permitAll() .requestMatchers(HttpMethod.GET, diff --git a/backend/src/main/java/com/yfd/platform/qgc_base/controller/SdEngInfoBHController.java b/backend/src/main/java/com/yfd/platform/qgc_base/controller/SdEngInfoBHController.java index ac83a965..8e989690 100644 --- a/backend/src/main/java/com/yfd/platform/qgc_base/controller/SdEngInfoBHController.java +++ b/backend/src/main/java/com/yfd/platform/qgc_base/controller/SdEngInfoBHController.java @@ -97,9 +97,7 @@ public class SdEngInfoBHController { @PostMapping("/add") @Operation(summary = "新增电站") public ResponseResult add(@RequestBody SdEngInfoBHOperateRequest request) { - SdEngInfoBH engInfo = request == null || request.getEngInfo() == null - ? null - : objectMapper.convertValue(request.getEngInfo(), SdEngInfoBH.class); + SdEngInfoBH engInfo = request == null || request.getEngInfo() == null ? null : objectMapper.convertValue(request.getEngInfo(), SdEngInfoBH.class); boolean result = engInfoBHService.addEngInfo(engInfo, request.getSource()); return result ? ResponseResult.success("新增成功") : ResponseResult.error("新增失败"); } From 0b673d4620b9a5aa49f91ffe7ffbd5071fdb7d09 Mon Sep 17 00:00:00 2001 From: tangwei Date: Fri, 26 Jun 2026 09:00:48 +0800 Subject: [PATCH 17/32] =?UTF-8?q?fix:=20=E4=BC=98=E5=8C=96=E7=94=B5?= =?UTF-8?q?=E7=AB=99=E5=88=A0=E9=99=A4?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../controller/SdEngInfoBHController.java | 5 ++- .../domain/SdEngInfoBHOperateRequest.java | 3 ++ .../service/IMsOperationLogService.java | 2 + .../qgc_base/service/ISdEngInfoBHService.java | 2 + .../impl/MsOperationLogServiceImpl.java | 35 +++++++++++++++++ .../service/impl/SdEngInfoBHServiceImpl.java | 38 ++++++++++++++++++- 6 files changed, 81 insertions(+), 4 deletions(-) diff --git a/backend/src/main/java/com/yfd/platform/qgc_base/controller/SdEngInfoBHController.java b/backend/src/main/java/com/yfd/platform/qgc_base/controller/SdEngInfoBHController.java index 8e989690..b5c994ee 100644 --- a/backend/src/main/java/com/yfd/platform/qgc_base/controller/SdEngInfoBHController.java +++ b/backend/src/main/java/com/yfd/platform/qgc_base/controller/SdEngInfoBHController.java @@ -113,8 +113,9 @@ public class SdEngInfoBHController { @Log(module = "电站管理", value = "删除电站") @PostMapping("/delete") @Operation(summary = "删除电站") - public ResponseResult delete(@RequestParam String stcd) { - boolean result = engInfoBHService.deleteEngInfo(stcd); + public ResponseResult delete(@RequestBody SdEngInfoBHOperateRequest request) { + boolean result = engInfoBHService.deleteEngInfo(request == null ? null : request.getIds(), + request == null ? null : request.getSource()); return result ? ResponseResult.success("删除成功") : ResponseResult.error("删除失败"); } diff --git a/backend/src/main/java/com/yfd/platform/qgc_base/domain/SdEngInfoBHOperateRequest.java b/backend/src/main/java/com/yfd/platform/qgc_base/domain/SdEngInfoBHOperateRequest.java index afbc160c..8087d328 100644 --- a/backend/src/main/java/com/yfd/platform/qgc_base/domain/SdEngInfoBHOperateRequest.java +++ b/backend/src/main/java/com/yfd/platform/qgc_base/domain/SdEngInfoBHOperateRequest.java @@ -2,6 +2,7 @@ package com.yfd.platform.qgc_base.domain; import lombok.Data; +import java.util.List; import java.util.Map; @Data @@ -9,5 +10,7 @@ public class SdEngInfoBHOperateRequest { private Map engInfo; + private List ids; + private String source; } diff --git a/backend/src/main/java/com/yfd/platform/qgc_base/service/IMsOperationLogService.java b/backend/src/main/java/com/yfd/platform/qgc_base/service/IMsOperationLogService.java index 51debb1d..f9edde52 100644 --- a/backend/src/main/java/com/yfd/platform/qgc_base/service/IMsOperationLogService.java +++ b/backend/src/main/java/com/yfd/platform/qgc_base/service/IMsOperationLogService.java @@ -7,4 +7,6 @@ public interface IMsOperationLogService { void recordEngAddLog(SdEngInfoBH engInfo, String source); void recordEngUpdateLog(SdEngInfoBH before, SdEngInfoBH changeSet, String source); + + void recordEngDeleteLog(SdEngInfoBH engInfo, String source); } 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 f40b1edb..88ec4792 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 @@ -70,6 +70,8 @@ public interface ISdEngInfoBHService extends IService { */ boolean deleteEngInfo(String stcd); + boolean deleteEngInfo(List ids, String source); + List selectRegDropdown(SdEngInfoBHRequest sdEngInfoBHRequest); EngBaseInfoVo getStInfoByStcd(String stcd); diff --git a/backend/src/main/java/com/yfd/platform/qgc_base/service/impl/MsOperationLogServiceImpl.java b/backend/src/main/java/com/yfd/platform/qgc_base/service/impl/MsOperationLogServiceImpl.java index 56eb5d89..8e70e7fb 100644 --- a/backend/src/main/java/com/yfd/platform/qgc_base/service/impl/MsOperationLogServiceImpl.java +++ b/backend/src/main/java/com/yfd/platform/qgc_base/service/impl/MsOperationLogServiceImpl.java @@ -343,6 +343,41 @@ public class MsOperationLogServiceImpl implements IMsOperationLogService { batchInsertDetails(details); } + @Override + public void recordEngDeleteLog(SdEngInfoBH engInfo, String source) { + if (engInfo == null) { + return; + } + MsOperationLog mainLog = buildMainLog("删除电站", source); + msOperationLogMapper.insert(mainLog); + + List details = new ArrayList<>(); + Set processedColumns = new HashSet<>(); + for (Field field : SdEngInfoBH.class.getDeclaredFields()) { + if (shouldSkipField(field)) { + continue; + } + field.setAccessible(true); + String columnName = resolveColumnName(field); + if (ENG_NAME_COLUMNS.contains(columnName) || processedColumns.contains(columnName)) { + continue; + } + Object oldValue = getFieldValue(field, engInfo); + if (oldValue == null) { + continue; + } + String nameColumn = ENG_CODE_NAME_FIELD_MAP.get(columnName); + Object oldNameValue = resolveNameValue(columnName, nameColumn, oldValue, engInfo); + details.add(buildDetail(mainLog.getId(), engInfo.getStcd(), columnName, + oldValue, oldNameValue, null, null, "删除字段值")); + processedColumns.add(columnName); + if (StrUtil.isNotBlank(nameColumn)) { + processedColumns.add(nameColumn); + } + } + batchInsertDetails(details); + } + private MsOperationLog buildMainLog(String remark, String source) { MsOperationLog log = new MsOperationLog(); log.setOperator(resolveOperator()); 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 487e14e8..c170ed57 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 @@ -42,6 +42,7 @@ import org.springframework.util.StringUtils; import java.lang.reflect.Field; import java.util.ArrayList; import java.util.Arrays; +import java.util.Date; import java.util.HashMap; import java.util.HashSet; import java.util.LinkedHashMap; @@ -503,8 +504,41 @@ public class SdEngInfoBHServiceImpl extends ServiceImpl().eq(SdEngInfoBH::getStcd, stcd).set(SdEngInfoBH::getIsDeleted, 1)); -// return this.removeById(stcd); + if (StrUtil.isBlank(stcd)) { + return false; + } + return deleteEngInfo(java.util.Collections.singletonList(stcd), null); + } + + @Override + @Transactional(rollbackFor = Exception.class) + public boolean deleteEngInfo(List ids, String source) { + List stcdList = ids == null ? new ArrayList<>() : ids.stream() + .filter(StrUtil::isNotBlank) + .distinct() + .collect(Collectors.toList()); + if (CollUtil.isEmpty(stcdList)) { + return false; + } + List beforeList = this.lambdaQuery() + .in(SdEngInfoBH::getStcd, stcdList) + .eq(SdEngInfoBH::getIsDeleted, 0) + .list(); + if (CollUtil.isEmpty(beforeList)) { + return false; + } + boolean result = this.update(new LambdaUpdateWrapper() + .in(SdEngInfoBH::getStcd, stcdList) + .eq(SdEngInfoBH::getIsDeleted, 0) + .set(SdEngInfoBH::getIsDeleted, 1) + .set(SdEngInfoBH::getDeleteUser, SecurityUtils.getCurrentUsername()) + .set(SdEngInfoBH::getDeleteTime, new Date())); + if (result) { + for (SdEngInfoBH before : beforeList) { + msOperationLogService.recordEngDeleteLog(before, source); + } + } + return result; } @Override From 2e6a1197f579e0c73caa5ddc554d128d6b1f1cb9 Mon Sep 17 00:00:00 2001 From: tangwei Date: Fri, 26 Jun 2026 09:10:43 +0800 Subject: [PATCH 18/32] =?UTF-8?q?feat:=20=E7=8E=AF=E4=BF=9D=E9=83=A8-?= =?UTF-8?q?=E6=B0=B4=E7=94=9F=E7=94=9F=E6=80=81=E8=B0=83=E6=9F=A5-?= =?UTF-8?q?=E6=B0=B4=E7=94=9F=E7=94=9F=E6=80=81=E9=9D=A2=E6=9D=BF?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../wte/controller/WeFishController.java | 6 + .../wte/entity/vo/WeFishListStatQgcVo.java | 52 ++++ .../qgc_env/wte/service/WeFishService.java | 3 + .../wte/service/impl/WeFishServiceImpl.java | 273 ++++++++++++++++++ 4 files changed, 334 insertions(+) create mode 100644 backend/src/main/java/com/yfd/platform/qgc_env/wte/entity/vo/WeFishListStatQgcVo.java diff --git a/backend/src/main/java/com/yfd/platform/qgc_env/wte/controller/WeFishController.java b/backend/src/main/java/com/yfd/platform/qgc_env/wte/controller/WeFishController.java index 90336189..b9a2ca69 100644 --- a/backend/src/main/java/com/yfd/platform/qgc_env/wte/controller/WeFishController.java +++ b/backend/src/main/java/com/yfd/platform/qgc_env/wte/controller/WeFishController.java @@ -44,4 +44,10 @@ public class WeFishController { public ResponseResult getQgcWeFishStatList(@RequestBody DataSourceRequest dataSourceRequest) { return ResponseResult.successData(weFishService.getQgcWeFishStatList(dataSourceRequest)); } + + @PostMapping("/we/fishList/stat/qgc/GetKendoListCust") + @Operation(summary = "环保部-水生生态调查-水生生态面板") + public ResponseResult getQgcFishListStat(@RequestBody DataSourceRequest dataSourceRequest) { + return ResponseResult.successData(weFishService.getQgcFishListStat(dataSourceRequest)); + } } diff --git a/backend/src/main/java/com/yfd/platform/qgc_env/wte/entity/vo/WeFishListStatQgcVo.java b/backend/src/main/java/com/yfd/platform/qgc_env/wte/entity/vo/WeFishListStatQgcVo.java new file mode 100644 index 00000000..a70632a1 --- /dev/null +++ b/backend/src/main/java/com/yfd/platform/qgc_env/wte/entity/vo/WeFishListStatQgcVo.java @@ -0,0 +1,52 @@ +package com.yfd.platform.qgc_env.wte.entity.vo; + +import io.swagger.v3.oas.annotations.media.Schema; +import lombok.Data; +import lombok.experimental.Accessors; + +import java.util.Date; + +@Data +@Accessors(chain = true) +@Schema(description = "环保部-水生生态调查-水生生态面板") +public class WeFishListStatQgcVo { + + @Schema(description = "鱼类编码") + private String id; + + @Schema(description = "鱼类名称") + private String name; + + @Schema(description = "基地编码") + private String baseId; + + @Schema(description = "基地名称") + private String baseName; + + @Schema(description = "河流编码") + private String rvcd; + + @Schema(description = "河流名称") + private String rvcdName; + + @Schema(description = "流域编码") + private String hbrvcd; + + @Schema(description = "流域名称") + private String hbrvcdName; + + @Schema(description = "电站编码") + private String rstcd; + + @Schema(description = "电站名称") + private String ennm; + + @Schema(description = "时间") + private Date tm; + + @Schema(description = "年份") + private Integer yr; + + @Schema(description = "鱼类数量") + private Long fcnt; +} diff --git a/backend/src/main/java/com/yfd/platform/qgc_env/wte/service/WeFishService.java b/backend/src/main/java/com/yfd/platform/qgc_env/wte/service/WeFishService.java index 9e353f97..20c4baa5 100644 --- a/backend/src/main/java/com/yfd/platform/qgc_env/wte/service/WeFishService.java +++ b/backend/src/main/java/com/yfd/platform/qgc_env/wte/service/WeFishService.java @@ -2,6 +2,7 @@ package com.yfd.platform.qgc_env.wte.service; import com.yfd.platform.common.DataSourceRequest; import com.yfd.platform.common.DataSourceResult; +import com.yfd.platform.qgc_env.wte.entity.vo.WeFishListStatQgcVo; import com.yfd.platform.qgc_env.wte.entity.vo.WeFishStatQgcVo; import com.yfd.platform.qgc_env.wte.entity.vo.WeFishTQgcVo; import com.yfd.platform.qgc_env.wte.entity.vo.WeStaticsVo; @@ -18,4 +19,6 @@ public interface WeFishService { DataSourceResult getQgcWeFishStatics(DataSourceRequest dataSourceRequest); DataSourceResult getQgcWeFishStatList(DataSourceRequest dataSourceRequest); + + DataSourceResult getQgcFishListStat(DataSourceRequest dataSourceRequest); } diff --git a/backend/src/main/java/com/yfd/platform/qgc_env/wte/service/impl/WeFishServiceImpl.java b/backend/src/main/java/com/yfd/platform/qgc_env/wte/service/impl/WeFishServiceImpl.java index 55c5fcc4..80ae39d5 100644 --- a/backend/src/main/java/com/yfd/platform/qgc_env/wte/service/impl/WeFishServiceImpl.java +++ b/backend/src/main/java/com/yfd/platform/qgc_env/wte/service/impl/WeFishServiceImpl.java @@ -10,6 +10,7 @@ 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.wte.entity.vo.WeFishListStatQgcVo; import com.yfd.platform.qgc_env.wte.entity.vo.WeFishStatQgcVo; import com.yfd.platform.qgc_env.wte.entity.vo.WeFishTQgcVo; import com.yfd.platform.qgc_env.wte.entity.vo.WeRvcdYearVo; @@ -192,6 +193,43 @@ public class WeFishServiceImpl implements WeFishService { return result; } + @Override + public DataSourceResult getQgcFishListStat(DataSourceRequest dataSourceRequest) { + Map paramMap = new HashMap<>(); + String filterSql = buildWeFishListStatFilterCondition( + dataSourceRequest == null ? null : dataSourceRequest.getFilter(), + paramMap, + new int[]{0} + ); + + StringBuilder sql = new StringBuilder(); + sql.append("SELECT r.yr AS yr, r.id AS id, r.name AS name, r.hbrvcd AS hbrvcd, r.hbrvcdName AS hbrvcdName, ") + .append("SUM(NVL(r.fcnt, 0)) AS fcnt ") + .append("FROM (") + .append(buildWeFishListStatQgcDetailSql()) + .append(") r WHERE 1 = 1 "); + if (StrUtil.isNotBlank(filterSql)) { + sql.append("AND ").append(filterSql).append(" "); + } + sql.append("GROUP BY r.yr, r.id, r.name, r.hbrvcd, r.hbrvcdName ") + .append("ORDER BY r.yr ASC"); + + List> rows = microservicDynamicSQLMapper.getAllList(sql.toString(), paramMap); + List list = new ArrayList<>(); + for (Map row : rows) { + WeFishListStatQgcVo vo = buildWeFishListStatQgcVo(row); + if (vo != null) { + list.add(vo); + } + } + + DataSourceResult result = new DataSourceResult<>(); + result.setData(list); + result.setTotal((long) list.size()); + result.setAggregates(new HashMap<>()); + return result; + } + private String buildWeFishQgcGroupSql(String baseSql, GroupingInfo[] groupInfos) { if (groupInfos == null || groupInfos.length == 0) { return baseSql; @@ -407,6 +445,35 @@ public class WeFishServiceImpl implements WeFishService { return sql.toString(); } + private String buildWeFishListStatQgcDetailSql() { + return "SELECT " + + "dict.FISH_ID AS id, " + + "dict.NAME AS name, " + + "dict.CODE AS code, " + + "eng.RVCD AS rvcd, " + + "eng.RVCD_NAME AS rvcdName, " + + "eng.HBRVCD AS hbrvcd, " + + "eng.HBRVCD_NAME AS hbrvcdName, " + + "section.RSTCD AS rstcd, " + + "eng.ENNM AS ennm, " + + "eng.BASE_ID AS baseId, " + + "eng.BASE_NAME AS baseName, " + + "we.TM AS tm, " + + "TO_CHAR(we.TM, 'yyyy') AS yr, " + + "fish.FCNT AS fcnt " + + "FROM SD_WE_R we " + + "INNER JOIN SD_WEFISH_R fish ON we.ID = fish.WER_ID " + + " AND NVL(fish.IS_DELETED, 0) = 0 " + + "INNER JOIN SD_WE_B_H section ON we.STCD = section.STCD " + + " AND NVL(section.USFL, 0) = 1 " + + "INNER JOIN SD_ENGINFO_B_H eng ON eng.STCD = section.RSTCD " + + " AND NVL(eng.IS_DELETED, 0) = 0 " + + "INNER JOIN V_SD_FISHDICTORY_B dict ON dict.FISH_ID = fish.FTP " + + " AND (eng.HBRVCD = dict.RVCD OR dict.RVCD = 'ZY') " + + "WHERE NVL(we.IS_DELETED, 0) = 0 " + + "AND NVL(we.STATUS, 1) = 1 "; + } + private String buildWeFishStaticsSql(String baseId, String hbrvcd, String yr, @@ -746,6 +813,212 @@ public class WeFishServiceImpl implements WeFishService { return values; } + private String buildWeFishListStatFilterCondition(DataSourceRequest.FilterDescriptor filter, + Map paramMap, + int[] indexHolder) { + if (filter == null) { + return ""; + } + if (StrUtil.isNotBlank(filter.getField())) { + return buildWeFishListStatLeafCondition(filter, paramMap, indexHolder); + } + if (CollUtil.isEmpty(filter.getFilters())) { + return ""; + } + List conditions = new ArrayList<>(); + for (DataSourceRequest.FilterDescriptor child : filter.getFilters()) { + String childSql = buildWeFishListStatFilterCondition(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 buildWeFishListStatLeafCondition(DataSourceRequest.FilterDescriptor filter, + Map paramMap, + int[] indexHolder) { + String column = mapWeFishListStatColumn(filter.getField()); + if (StrUtil.isBlank(column)) { + return ""; + } + String operator = StrUtil.blankToDefault(filter.getOperator(), "eq").toLowerCase(); + 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 = normalizeWeFishQgcValues(filter.getValue()); + if (values.isEmpty()) { + return ""; + } + List placeholders = new ArrayList<>(); + for (Object value : values) { + Object normalizedValue = normalizeWeFishListStatValue(filter.getField(), value); + if (normalizedValue == null) { + continue; + } + String key = "weFishListStatP" + indexHolder[0]++; + paramMap.put(key, normalizedValue); + placeholders.add("#{map." + key + "}"); + } + if (placeholders.isEmpty()) { + return ""; + } + return column + ("ni".equals(operator) ? " NOT IN (" : " IN (") + String.join(", ", placeholders) + ")"; + } + + Object normalizedValue = normalizeWeFishListStatValue(filter.getField(), filter.getValue()); + if (normalizedValue == null) { + return ""; + } + String key = "weFishListStatP" + indexHolder[0]++; + return switch (operator) { + case "eq" -> { + paramMap.put(key, normalizedValue); + yield column + " = #{map." + key + "}"; + } + case "neq" -> { + paramMap.put(key, normalizedValue); + yield column + " <> #{map." + key + "}"; + } + case "gt" -> { + paramMap.put(key, normalizedValue); + yield column + " > #{map." + key + "}"; + } + case "gte" -> { + paramMap.put(key, normalizedValue); + yield column + " >= #{map." + key + "}"; + } + case "lt" -> { + paramMap.put(key, normalizedValue); + yield column + " < #{map." + key + "}"; + } + case "lte" -> { + paramMap.put(key, normalizedValue); + yield column + " <= #{map." + key + "}"; + } + case "contains" -> { + paramMap.put(key, "%" + String.valueOf(normalizedValue).trim() + "%"); + yield column + " LIKE #{map." + key + "}"; + } + case "doesnotcontain" -> { + paramMap.put(key, "%" + String.valueOf(normalizedValue).trim() + "%"); + yield column + " NOT LIKE #{map." + key + "}"; + } + case "startswith" -> { + paramMap.put(key, String.valueOf(normalizedValue).trim() + "%"); + yield column + " LIKE #{map." + key + "}"; + } + case "endswith" -> { + paramMap.put(key, "%" + String.valueOf(normalizedValue).trim()); + yield column + " LIKE #{map." + key + "}"; + } + default -> ""; + }; + } + + private String mapWeFishListStatColumn(String field) { + if (StrUtil.isBlank(field)) { + return null; + } + return switch (field) { + case "id" -> "r.id"; + case "name" -> "r.name"; + case "baseId" -> "r.baseId"; + case "baseName" -> "r.baseName"; + case "rvcd" -> "r.rvcd"; + case "rvcdName" -> "r.rvcdName"; + case "hbrvcd" -> "r.hbrvcd"; + case "hbrvcdName" -> "r.hbrvcdName"; + case "rstcd" -> "r.rstcd"; + case "ennm" -> "r.ennm"; + case "tm" -> "r.tm"; + case "yr" -> "r.yr"; + case "fcnt" -> "r.fcnt"; + case "code" -> "r.code"; + default -> null; + }; + } + + private Object normalizeWeFishListStatValue(String field, Object value) { + if (value == null) { + return null; + } + if ("yr".equals(field)) { + try { + return Integer.parseInt(String.valueOf(value).trim()); + } catch (Exception ex) { + return null; + } + } + if ("fcnt".equals(field)) { + try { + return new java.math.BigDecimal(String.valueOf(value).trim()); + } catch (Exception ex) { + return null; + } + } + if ("tm".equals(field)) { + return parseDateTimeSafely(value); + } + return value; + } + + private WeFishListStatQgcVo buildWeFishListStatQgcVo(Map row) { + if (row == null || row.isEmpty()) { + return null; + } + return new WeFishListStatQgcVo() + .setId(safeWeFishString(firstPresentWeFishValue(row, "ID", "id"))) + .setName(safeWeFishString(firstPresentWeFishValue(row, "NAME", "name"))) + .setBaseId(safeWeFishString(firstPresentWeFishValue(row, "BASEID", "baseId"))) + .setBaseName(safeWeFishString(firstPresentWeFishValue(row, "BASENAME", "baseName"))) + .setRvcd(safeWeFishString(firstPresentWeFishValue(row, "RVCD", "rvcd"))) + .setRvcdName(safeWeFishString(firstPresentWeFishValue(row, "RVCDNAME", "rvcdName"))) + .setHbrvcd(safeWeFishString(firstPresentWeFishValue(row, "HBRVCD", "hbrvcd"))) + .setHbrvcdName(safeWeFishString(firstPresentWeFishValue(row, "HBRVCDNAME", "hbrvcdName"))) + .setRstcd(safeWeFishString(firstPresentWeFishValue(row, "RSTCD", "rstcd"))) + .setEnnm(safeWeFishString(firstPresentWeFishValue(row, "ENNM", "ennm"))) + .setTm(toDateValue(firstPresentWeFishValue(row, "TM", "tm"))) + .setYr(toWeFishIntegerValue(firstPresentWeFishValue(row, "YR", "yr"))) + .setFcnt(toWeFishLongValue(firstPresentWeFishValue(row, "FCNT", "fcnt"))); + } + + private Date toDateValue(Object value) { + if (value == null) { + return null; + } + if (value instanceof Date date) { + return date; + } + if (value instanceof Number number) { + return new Date(number.longValue()); + } + String text = String.valueOf(value).trim(); + if (StrUtil.isBlank(text)) { + return null; + } + try { + return DateUtil.parse(text).toJdkDate(); + } catch (Exception ex) { + return null; + } + } + + private void appendWeFishQgcValues(List values, Object value) { if (value == null) { return; From a96b76afcfa97cc632543c65ae7af5421a8b90e8 Mon Sep 17 00:00:00 2001 From: tangwei Date: Fri, 26 Jun 2026 09:23:17 +0800 Subject: [PATCH 19/32] =?UTF-8?q?feat:=20=E7=8E=AF=E4=BF=9D=E9=83=A8-?= =?UTF-8?q?=E6=B0=B4=E7=94=9F=E7=94=9F=E6=80=81=E8=B0=83=E6=9F=A5-?= =?UTF-8?q?=E9=B1=BC=E7=B1=BB=E5=88=86=E5=B8=83=E9=94=9A=E7=82=B9?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../wte/controller/WeFishController.java | 6 + .../wte/entity/vo/WeFishPointQgcVo.java | 64 +++++ .../qgc_env/wte/service/WeFishService.java | 3 + .../wte/service/impl/WeFishServiceImpl.java | 272 ++++++++++++++++++ 4 files changed, 345 insertions(+) create mode 100644 backend/src/main/java/com/yfd/platform/qgc_env/wte/entity/vo/WeFishPointQgcVo.java diff --git a/backend/src/main/java/com/yfd/platform/qgc_env/wte/controller/WeFishController.java b/backend/src/main/java/com/yfd/platform/qgc_env/wte/controller/WeFishController.java index b9a2ca69..d1e3f90f 100644 --- a/backend/src/main/java/com/yfd/platform/qgc_env/wte/controller/WeFishController.java +++ b/backend/src/main/java/com/yfd/platform/qgc_env/wte/controller/WeFishController.java @@ -50,4 +50,10 @@ public class WeFishController { public ResponseResult getQgcFishListStat(@RequestBody DataSourceRequest dataSourceRequest) { return ResponseResult.successData(weFishService.getQgcFishListStat(dataSourceRequest)); } + + @PostMapping("/we/fishPoint/qgc/GetKendoListCust") + @Operation(summary = "环保部-水生生态调查-鱼类分布锚点") + public ResponseResult getQgcWeFishPoint(@RequestBody DataSourceRequest dataSourceRequest) { + return ResponseResult.successData(weFishService.getQgcWeFishPoint(dataSourceRequest)); + } } diff --git a/backend/src/main/java/com/yfd/platform/qgc_env/wte/entity/vo/WeFishPointQgcVo.java b/backend/src/main/java/com/yfd/platform/qgc_env/wte/entity/vo/WeFishPointQgcVo.java new file mode 100644 index 00000000..5de853ca --- /dev/null +++ b/backend/src/main/java/com/yfd/platform/qgc_env/wte/entity/vo/WeFishPointQgcVo.java @@ -0,0 +1,64 @@ +package com.yfd.platform.qgc_env.wte.entity.vo; + +import io.swagger.v3.oas.annotations.media.Schema; +import lombok.Data; +import lombok.experimental.Accessors; + +import java.math.BigDecimal; + +@Data +@Accessors(chain = true) +@Schema(description = "环保部-水生生态调查-鱼类分布锚点") +public class WeFishPointQgcVo { + + @Schema(description = "站点类型") + private String sttp; + + @Schema(description = "站点编码") + private String stcd; + + @Schema(description = "经度") + private BigDecimal lgtd; + + @Schema(description = "纬度") + private BigDecimal lttd; + + @Schema(description = "高程") + private BigDecimal dtmel; + + @Schema(description = "描点状态") + private String anchoPointState; + + @Schema(description = "锚点类型") + private String sttpMap; + + @Schema(description = "弹框站点名称") + private String titleName; + + @Schema(description = "地图避让") + private Integer distance; + + @Schema(description = "流域编码") + private String rvcd; + + @Schema(description = "行政编码") + private String addvcd; + + @Schema(description = "基地编码") + private String baseId; + + @Schema(description = "关联电站编码") + private String rstcds; + + @Schema(description = "设施类型") + private String sttpCode; + + @Schema(description = "断面名称") + private String stnm; + + @Schema(description = "电站名称") + private String ennm; + + @Schema(description = "调查鱼类列表") + private String ftp; +} diff --git a/backend/src/main/java/com/yfd/platform/qgc_env/wte/service/WeFishService.java b/backend/src/main/java/com/yfd/platform/qgc_env/wte/service/WeFishService.java index 20c4baa5..5d68201f 100644 --- a/backend/src/main/java/com/yfd/platform/qgc_env/wte/service/WeFishService.java +++ b/backend/src/main/java/com/yfd/platform/qgc_env/wte/service/WeFishService.java @@ -3,6 +3,7 @@ package com.yfd.platform.qgc_env.wte.service; import com.yfd.platform.common.DataSourceRequest; import com.yfd.platform.common.DataSourceResult; import com.yfd.platform.qgc_env.wte.entity.vo.WeFishListStatQgcVo; +import com.yfd.platform.qgc_env.wte.entity.vo.WeFishPointQgcVo; import com.yfd.platform.qgc_env.wte.entity.vo.WeFishStatQgcVo; import com.yfd.platform.qgc_env.wte.entity.vo.WeFishTQgcVo; import com.yfd.platform.qgc_env.wte.entity.vo.WeStaticsVo; @@ -21,4 +22,6 @@ public interface WeFishService { DataSourceResult getQgcWeFishStatList(DataSourceRequest dataSourceRequest); DataSourceResult getQgcFishListStat(DataSourceRequest dataSourceRequest); + + DataSourceResult getQgcWeFishPoint(DataSourceRequest dataSourceRequest); } diff --git a/backend/src/main/java/com/yfd/platform/qgc_env/wte/service/impl/WeFishServiceImpl.java b/backend/src/main/java/com/yfd/platform/qgc_env/wte/service/impl/WeFishServiceImpl.java index 80ae39d5..b7814813 100644 --- a/backend/src/main/java/com/yfd/platform/qgc_env/wte/service/impl/WeFishServiceImpl.java +++ b/backend/src/main/java/com/yfd/platform/qgc_env/wte/service/impl/WeFishServiceImpl.java @@ -11,6 +11,7 @@ import com.yfd.platform.common.GroupHelper; import com.yfd.platform.common.GroupingInfo; import com.yfd.platform.common.MicroservicDynamicSQLMapper; import com.yfd.platform.qgc_env.wte.entity.vo.WeFishListStatQgcVo; +import com.yfd.platform.qgc_env.wte.entity.vo.WeFishPointQgcVo; import com.yfd.platform.qgc_env.wte.entity.vo.WeFishStatQgcVo; import com.yfd.platform.qgc_env.wte.entity.vo.WeFishTQgcVo; import com.yfd.platform.qgc_env.wte.entity.vo.WeRvcdYearVo; @@ -20,14 +21,17 @@ import com.yfd.platform.utils.QgcQueryWrapperUtil; import jakarta.annotation.Resource; import org.springframework.stereotype.Service; +import java.math.BigDecimal; import java.util.ArrayList; import java.util.Arrays; import java.util.Collections; import java.util.Date; import java.util.HashMap; +import java.util.HashSet; import java.util.LinkedHashMap; import java.util.List; import java.util.Map; +import java.util.Set; @Service public class WeFishServiceImpl implements WeFishService { @@ -230,6 +234,38 @@ public class WeFishServiceImpl implements WeFishService { return result; } + @Override + public DataSourceResult getQgcWeFishPoint(DataSourceRequest dataSourceRequest) { + DataSourceLoadOptionsBase loadOptions = dataSourceRequest == null ? null : dataSourceRequest.toDevRequest(); + String stcd = resolveWeFishStringFilterValue(dataSourceRequest, loadOptions, "stcd"); + String baseId = resolveWeFishStringFilterValue(dataSourceRequest, loadOptions, "baseId"); + String startTime = resolveWeFishStringFilterValue(dataSourceRequest, loadOptions, "startTime"); + String endTime = resolveWeFishStringFilterValue(dataSourceRequest, loadOptions, "endTime"); + List fishList = getWeFishFilterTexts(dataSourceRequest == null ? null : dataSourceRequest.getFilter(), "fishList"); + + Map paramMap = new HashMap<>(); + String sql = buildWeFishPointQgcSql(stcd, baseId, startTime, endTime, fishList, paramMap); + Page page = loadOptions == null ? null + : QgcQueryWrapperUtil.buildPage(loadOptions, loadOptions.getSkip(), loadOptions.getTake()); + List> rows = microservicDynamicSQLMapper.pageAllList(page, sql, paramMap); + + Map fishNameMap = loadWeFishNameMap(); + List list = new ArrayList<>(); + for (Map row : rows) { + WeFishPointQgcVo vo = buildWeFishPointQgcVo(row, fishNameMap); + if (vo != null) { + list.add(vo); + } + } + applyWeFishPointMapDistance(list); + + DataSourceResult result = new DataSourceResult<>(); + result.setData(list); + result.setTotal(page != null ? page.getTotal() : list.size()); + result.setAggregates(new HashMap<>()); + return result; + } + private String buildWeFishQgcGroupSql(String baseSql, GroupingInfo[] groupInfos) { if (groupInfos == null || groupInfos.length == 0) { return baseSql; @@ -474,6 +510,96 @@ public class WeFishServiceImpl implements WeFishService { "AND NVL(we.STATUS, 1) = 1 "; } + private String buildWeFishPointQgcSql(String stcd, + String baseId, + String startTime, + String endTime, + List fishList, + Map paramMap) { + Date start = null; + Date end = null; + if (StrUtil.isNotBlank(startTime) && StrUtil.isNotBlank(endTime)) { + start = parseDateTimeSafely(startTime); + end = parseDateTimeSafely(endTime); + } + StringBuilder sql = new StringBuilder(); + sql.append("SELECT agg.ftp AS ftp, section.STCD AS stcd, section.RSTCD AS rstcds, ") + .append("section.STNM AS stnm, eng.ENNM AS ennm, ") + .append("section.LGTD AS lgtd, section.LTTD AS lttd, ") + .append("'ylfb' AS sttp, 'ylfb' AS sttpMap, ") + .append("section.RVCD AS rvcd, section.ADDVCD AS addvcd, section.BASE_ID AS baseId, ") + .append("'WE' AS sttpCode, 'ylfb' AS anchoPointState, '鱼类分布' AS titleName, ") + .append("eng.ELEV AS dtmel ") + .append("FROM (") + .append("SELECT LISTAGG(TO_CHAR(t.ID), ',') WITHIN GROUP (ORDER BY t.ID) AS ftp, t.stcd ") + .append("FROM (") + .append("SELECT dict.ZY_FISH_ID AS ID, we.STCD AS stcd ") + .append("FROM SD_WE_R we ") + .append("INNER JOIN SD_WE_B_H section ON we.STCD = section.STCD ") + .append(" AND NVL(section.USFL, 0) = 1 ") + .append("INNER JOIN SD_WEFISH_R fish ON we.ID = fish.WER_ID ") + .append(" AND NVL(fish.IS_DELETED, 0) = 0 ") + .append("INNER JOIN V_SD_FISHDICTORY_B dict ON dict.FISH_ID = fish.FTP ") + .append(" AND (section.HBRVCD = dict.RVCD OR dict.RVCD = 'ZY') ") + .append("WHERE NVL(we.IS_DELETED, 0) = 0 ") + .append("AND NVL(we.STATUS, 1) = 1 "); + + if (StrUtil.isNotBlank(stcd)) { + paramMap.put("weFishPointStcd", stcd); + sql.append("AND we.STCD = #{map.weFishPointStcd} "); + } + if (start != null && end != null) { + paramMap.put("weFishPointStartTime", start); + paramMap.put("weFishPointEndTime", end); + sql.append("AND we.TM BETWEEN #{map.weFishPointStartTime} AND #{map.weFishPointEndTime} "); + } + if (CollUtil.isNotEmpty(fishList)) { + List placeholders = new ArrayList<>(); + int index = 0; + for (String fishId : fishList) { + if (StrUtil.isBlank(fishId)) { + continue; + } + String key = "weFishPointFish" + index++; + paramMap.put(key, fishId); + placeholders.add("#{map." + key + "}"); + } + if (CollUtil.isNotEmpty(placeholders)) { + sql.append("AND we.STCD IN (") + .append("SELECT a.STCD ") + .append("FROM SD_WE_R a ") + .append("INNER JOIN SD_WE_B_H section2 ON a.STCD = section2.STCD ") + .append(" AND NVL(section2.USFL, 0) = 1 ") + .append("INNER JOIN SD_WEFISH_R b ON a.ID = b.WER_ID ") + .append(" AND NVL(b.IS_DELETED, 0) = 0 ") + .append("INNER JOIN V_SD_FISHDICTORY_B c ON c.FISH_ID = b.FTP ") + .append(" AND (section2.HBRVCD = c.RVCD OR c.RVCD = 'ZY') ") + .append("WHERE NVL(a.IS_DELETED, 0) = 0 ") + .append("AND NVL(a.STATUS, 1) = 1 "); + if (start != null && end != null) { + sql.append("AND a.TM BETWEEN #{map.weFishPointStartTime} AND #{map.weFishPointEndTime} "); + } + sql.append("AND c.FISH_ID IN (").append(String.join(", ", placeholders)).append(")") + .append(") "); + } + } + + sql.append("GROUP BY we.STCD, dict.ZY_FISH_ID") + .append(") t GROUP BY t.stcd") + .append(") agg ") + .append("INNER JOIN SD_WE_B_H section ON agg.stcd = section.STCD ") + .append(" AND NVL(section.USFL, 0) = 1 ") + .append("LEFT JOIN SD_ENGINFO_B_H eng ON eng.STCD = section.RSTCD ") + .append(" AND NVL(eng.IS_DELETED, 0) = 0 ") + .append("WHERE 1 = 1 "); + if (StrUtil.isNotBlank(baseId)) { + paramMap.put("weFishPointBaseId", baseId); + sql.append("AND section.BASE_ID = #{map.weFishPointBaseId} "); + } + sql.append("ORDER BY section.STCD ASC"); + return sql.toString(); + } + private String buildWeFishStaticsSql(String baseId, String hbrvcd, String yr, @@ -997,6 +1123,152 @@ public class WeFishServiceImpl implements WeFishService { .setFcnt(toWeFishLongValue(firstPresentWeFishValue(row, "FCNT", "fcnt"))); } + private WeFishPointQgcVo buildWeFishPointQgcVo(Map row, Map fishNameMap) { + if (row == null || row.isEmpty()) { + return null; + } + return new WeFishPointQgcVo() + .setFtp(resolveWeFishNames(firstPresentWeFishValue(row, "FTP", "ftp"), fishNameMap)) + .setStcd(safeWeFishString(firstPresentWeFishValue(row, "STCD", "stcd"))) + .setRstcds(safeWeFishString(firstPresentWeFishValue(row, "RSTCDS", "rstcds"))) + .setStnm(safeWeFishString(firstPresentWeFishValue(row, "STNM", "stnm"))) + .setEnnm(safeWeFishString(firstPresentWeFishValue(row, "ENNM", "ennm"))) + .setLgtd(toWeFishBigDecimalValue(firstPresentWeFishValue(row, "LGTD", "lgtd"))) + .setLttd(toWeFishBigDecimalValue(firstPresentWeFishValue(row, "LTTD", "lttd"))) + .setSttp(safeWeFishString(firstPresentWeFishValue(row, "STTP", "sttp"))) + .setSttpMap(safeWeFishString(firstPresentWeFishValue(row, "STTPMAP", "sttpMap"))) + .setRvcd(safeWeFishString(firstPresentWeFishValue(row, "RVCD", "rvcd"))) + .setAddvcd(safeWeFishString(firstPresentWeFishValue(row, "ADDVCD", "addvcd"))) + .setBaseId(safeWeFishString(firstPresentWeFishValue(row, "BASEID", "baseId"))) + .setSttpCode(safeWeFishString(firstPresentWeFishValue(row, "STTPCODE", "sttpCode"))) + .setAnchoPointState(safeWeFishString(firstPresentWeFishValue(row, "ANCHOPOINTSTATE", "anchoPointState"))) + .setTitleName(safeWeFishString(firstPresentWeFishValue(row, "TITLENAME", "titleName"))) + .setDtmel(toWeFishBigDecimalValue(firstPresentWeFishValue(row, "DTMEL", "dtmel"))); + } + + private Map loadWeFishNameMap() { + List> rows = microservicDynamicSQLMapper.getAllList( + "SELECT ID AS id, NAME AS name FROM SD_FISHDICTORY_B WHERE NVL(IS_DELETED, 0) = 0", + new HashMap<>() + ); + Map fishNameMap = new LinkedHashMap<>(); + for (Map row : rows) { + String id = safeWeFishString(firstPresentWeFishValue(row, "ID", "id")); + String name = safeWeFishString(firstPresentWeFishValue(row, "NAME", "name")); + if (StrUtil.isNotBlank(id) && StrUtil.isNotBlank(name)) { + fishNameMap.put(id, name); + } + } + return fishNameMap; + } + + private String resolveWeFishNames(Object ftpValue, Map fishNameMap) { + String ftp = safeWeFishString(ftpValue); + if (StrUtil.isBlank(ftp)) { + return ""; + } + String[] ids = ftp.split(","); + List names = new ArrayList<>(); + for (String id : ids) { + String trimId = StrUtil.trim(id); + if (StrUtil.isBlank(trimId)) { + continue; + } + String name = fishNameMap.get(trimId); + if (StrUtil.isNotBlank(name)) { + names.add(name); + } + } + return names.isEmpty() ? "" : String.join(",", names); + } + + private void applyWeFishPointMapDistance(List points) { + if (CollUtil.isEmpty(points)) { + return; + } + int defaultLevel = 50000000; + int level1 = 1500000; + double level1Distance = 1.2D; + int level2 = 800000; + double level2Distance = 0.8D; + int level3 = 400000; + double level3Distance = 0.4D; + int level4 = 50000; + double level4Distance = 0.1D; + + Set marked = new HashSet<>(); + for (int i = 0; i < points.size(); i++) { + WeFishPointQgcVo current = points.get(i); + String category = current.getAnchoPointState(); + String currentKey = StrUtil.nullToEmpty(current.getStcd()) + StrUtil.nullToEmpty(category); + if (marked.contains(currentKey)) { + continue; + } + current.setDistance(defaultLevel); + BigDecimal x1 = current.getLgtd(); + BigDecimal y1 = current.getLttd(); + if (x1 == null || y1 == null) { + continue; + } + for (int j = i + 1; j < points.size(); j++) { + WeFishPointQgcVo target = points.get(j); + String targetCategory = target.getAnchoPointState(); + String targetKey = StrUtil.nullToEmpty(target.getStcd()) + StrUtil.nullToEmpty(targetCategory); + if (marked.contains(targetKey)) { + continue; + } + BigDecimal x2 = target.getLgtd(); + BigDecimal y2 = target.getLttd(); + if (x2 == null || y2 == null || currentKey.equals(targetKey)) { + continue; + } + double dx = Math.abs(x1.doubleValue() - x2.doubleValue()); + double dy = Math.abs(y1.doubleValue() - y2.doubleValue()); + double distance = Math.sqrt(dx * dx + dy * dy); + if (distance < level4Distance) { + target.setDistance(level4); + marked.add(targetKey); + } else if (distance < level3Distance) { + target.setDistance(level3); + marked.add(targetKey); + } else if (distance < level2Distance) { + target.setDistance(level2); + marked.add(targetKey); + } else if (distance < level1Distance) { + target.setDistance(level1); + marked.add(targetKey); + } + } + } + } + + private java.math.BigDecimal toWeFishBigDecimalValue(Object value) { + if (value == null) { + return null; + } + if (value instanceof java.math.BigDecimal decimal) { + return decimal; + } + if (value instanceof Number number) { + return java.math.BigDecimal.valueOf(number.doubleValue()); + } + try { + return new java.math.BigDecimal(String.valueOf(value).trim()); + } catch (Exception ex) { + return null; + } + } + + private String resolveWeFishStringFilterValue(DataSourceRequest dataSourceRequest, + DataSourceLoadOptionsBase loadOptions, + String field) { + String value = getFirstWeFishFilterText(dataSourceRequest == null ? null : dataSourceRequest.getFilter(), field); + if (StrUtil.isBlank(value) && loadOptions != null) { + value = QgcQueryWrapperUtil.getFilterFieldValue(loadOptions, field); + } + return StrUtil.trim(value); + } + private Date toDateValue(Object value) { if (value == null) { return null; From 03c43a5e8a84628c4b91712a5dba9bfc437bec8b Mon Sep 17 00:00:00 2001 From: tangwei Date: Fri, 26 Jun 2026 09:32:15 +0800 Subject: [PATCH 20/32] =?UTF-8?q?feat:=20=E7=8E=AF=E4=BF=9D=E9=83=A8-?= =?UTF-8?q?=E6=B0=B4=E7=94=9F=E7=94=9F=E6=80=81=E8=B0=83=E6=9F=A5-?= =?UTF-8?q?=E6=B0=B4=E7=94=9F=E7=94=9F=E6=80=81=E4=B8=80=E7=BA=A7=E9=A1=B5?= =?UTF-8?q?=E9=9D=A2=E5=88=97=E8=A1=A8?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../wte/controller/WeFishController.java | 6 + .../wte/entity/vo/WeFishListQgcVo.java | 50 ++++++ .../qgc_env/wte/service/WeFishService.java | 3 + .../wte/service/impl/WeFishServiceImpl.java | 145 ++++++++++++++++++ 4 files changed, 204 insertions(+) create mode 100644 backend/src/main/java/com/yfd/platform/qgc_env/wte/entity/vo/WeFishListQgcVo.java diff --git a/backend/src/main/java/com/yfd/platform/qgc_env/wte/controller/WeFishController.java b/backend/src/main/java/com/yfd/platform/qgc_env/wte/controller/WeFishController.java index d1e3f90f..6e90a7e7 100644 --- a/backend/src/main/java/com/yfd/platform/qgc_env/wte/controller/WeFishController.java +++ b/backend/src/main/java/com/yfd/platform/qgc_env/wte/controller/WeFishController.java @@ -27,6 +27,12 @@ public class WeFishController { return ResponseResult.successData(weFishService.getQgcWeFishTKendoListCust(dataSourceRequest)); } + @PostMapping("/we/fishList/GetKendoListCust") + @Operation(summary = "环保部-水生生态调查-水生生态一级页面列表") + public ResponseResult getQgcWeFishList(@RequestBody DataSourceRequest dataSourceRequest) { + return ResponseResult.successData(weFishService.getQgcWeFishList(dataSourceRequest)); + } + @PostMapping("/we/fisht/year/qgc/GetKendoListCust") @Operation(summary = "全过程沿程鱼类变化情况有数据的流域和年份") public ResponseResult getQgcFishStaticsYearList(@RequestBody DataSourceRequest dataSourceRequest) { diff --git a/backend/src/main/java/com/yfd/platform/qgc_env/wte/entity/vo/WeFishListQgcVo.java b/backend/src/main/java/com/yfd/platform/qgc_env/wte/entity/vo/WeFishListQgcVo.java new file mode 100644 index 00000000..5ee533c5 --- /dev/null +++ b/backend/src/main/java/com/yfd/platform/qgc_env/wte/entity/vo/WeFishListQgcVo.java @@ -0,0 +1,50 @@ +package com.yfd.platform.qgc_env.wte.entity.vo; + +import io.swagger.v3.oas.annotations.media.Schema; +import lombok.Data; +import lombok.experimental.Accessors; + +@Data +@Accessors(chain = true) +@Schema(description = "环保部-水生生态调查-水生生态一级页面列表") +public class WeFishListQgcVo { + + @Schema(description = "鱼类编码") + private String id; + + @Schema(description = "鱼类名称") + private String name; + + @Schema(description = "基地编码") + private String baseId; + + @Schema(description = "基地名称") + private String baseName; + + @Schema(description = "河流编码") + private String rvcd; + + @Schema(description = "河流名称") + private String rvcdName; + + @Schema(description = "流域编码") + private String hbrvcd; + + @Schema(description = "流域名称") + private String hbrvcdName; + + @Schema(description = "电站编码") + private String rstcd; + + @Schema(description = "电站名称") + private String ennm; + + @Schema(description = "时间") + private String tm; + + @Schema(description = "年份") + private Integer yr; + + @Schema(description = "鱼类数量") + private Long fcnt; +} diff --git a/backend/src/main/java/com/yfd/platform/qgc_env/wte/service/WeFishService.java b/backend/src/main/java/com/yfd/platform/qgc_env/wte/service/WeFishService.java index 5d68201f..c3e3e414 100644 --- a/backend/src/main/java/com/yfd/platform/qgc_env/wte/service/WeFishService.java +++ b/backend/src/main/java/com/yfd/platform/qgc_env/wte/service/WeFishService.java @@ -2,6 +2,7 @@ package com.yfd.platform.qgc_env.wte.service; import com.yfd.platform.common.DataSourceRequest; import com.yfd.platform.common.DataSourceResult; +import com.yfd.platform.qgc_env.wte.entity.vo.WeFishListQgcVo; import com.yfd.platform.qgc_env.wte.entity.vo.WeFishListStatQgcVo; import com.yfd.platform.qgc_env.wte.entity.vo.WeFishPointQgcVo; import com.yfd.platform.qgc_env.wte.entity.vo.WeFishStatQgcVo; @@ -15,6 +16,8 @@ public interface WeFishService { DataSourceResult getQgcWeFishTKendoListCust(DataSourceRequest dataSourceRequest); + DataSourceResult getQgcWeFishList(DataSourceRequest dataSourceRequest); + DataSourceResult>> getQgcFishStaticsYearList(DataSourceRequest dataSourceRequest); DataSourceResult getQgcWeFishStatics(DataSourceRequest dataSourceRequest); diff --git a/backend/src/main/java/com/yfd/platform/qgc_env/wte/service/impl/WeFishServiceImpl.java b/backend/src/main/java/com/yfd/platform/qgc_env/wte/service/impl/WeFishServiceImpl.java index b7814813..3988e87d 100644 --- a/backend/src/main/java/com/yfd/platform/qgc_env/wte/service/impl/WeFishServiceImpl.java +++ b/backend/src/main/java/com/yfd/platform/qgc_env/wte/service/impl/WeFishServiceImpl.java @@ -10,6 +10,7 @@ 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.wte.entity.vo.WeFishListQgcVo; import com.yfd.platform.qgc_env.wte.entity.vo.WeFishListStatQgcVo; import com.yfd.platform.qgc_env.wte.entity.vo.WeFishPointQgcVo; import com.yfd.platform.qgc_env.wte.entity.vo.WeFishStatQgcVo; @@ -90,6 +91,61 @@ public class WeFishServiceImpl implements WeFishService { return result; } + @Override + public DataSourceResult getQgcWeFishList(DataSourceRequest dataSourceRequest) { + DataSourceLoadOptionsBase loadOptions = dataSourceRequest == null ? null : dataSourceRequest.toDevRequest(); + GroupingInfo[] groupInfos = loadOptions == null ? null : loadOptions.getGroup(); + Map paramMap = new HashMap<>(); + + String filterSql = buildWeFishListStatFilterCondition( + dataSourceRequest == null ? null : dataSourceRequest.getFilter(), + paramMap, + new int[]{0} + ); + + StringBuilder sql = new StringBuilder(); + sql.append("SELECT r.id AS id, r.name AS name, r.rvcd AS rvcd, r.rvcdName AS rvcdName, ") + .append("r.hbrvcd AS hbrvcd, r.hbrvcdName AS hbrvcdName, r.rstcd AS rstcd, r.ennm AS ennm, ") + .append("r.baseId AS baseId, r.baseName AS baseName, r.tm AS tm, r.yr AS yr, r.fcnt AS fcnt, r.code AS code ") + .append("FROM (") + .append(buildWeFishListStatQgcDetailSql()) + .append(") r WHERE 1 = 1 "); + if (StrUtil.isNotBlank(filterSql)) { + sql.append("AND ").append(filterSql).append(" "); + } + + DataSourceResult result = new DataSourceResult<>(); + if (CollUtil.isNotEmpty(dataSourceRequest == null ? null : dataSourceRequest.getGroup())) { + String groupedSql = buildWeFishListQgcGroupSql(sql.toString(), groupInfos); + List> rows = microservicDynamicSQLMapper.getAllList(groupedSql, 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); + result.setAggregates(new HashMap<>()); + return result; + } + + sql.append(buildWeFishListQgcOrderBySql(dataSourceRequest == null ? null : dataSourceRequest.getSort())); + Page page = loadOptions == null ? null + : QgcQueryWrapperUtil.buildPage(loadOptions, loadOptions.getSkip(), loadOptions.getTake()); + List> rows = microservicDynamicSQLMapper.pageAllList(page, sql.toString(), paramMap); + List list = new ArrayList<>(); + for (Map row : rows) { + WeFishListQgcVo vo = buildWeFishListQgcVo(row); + if (vo != null) { + list.add(vo); + } + } + + result.setData(list); + result.setTotal(page != null ? page.getTotal() : list.size()); + result.setAggregates(new HashMap<>()); + return result; + } + @Override public DataSourceResult>> getQgcFishStaticsYearList(DataSourceRequest dataSourceRequest) { Map paramMap = new HashMap<>(); @@ -600,6 +656,36 @@ public class WeFishServiceImpl implements WeFishService { return sql.toString(); } + private String buildWeFishListQgcGroupSql(String baseSql, GroupingInfo[] groupInfos) { + if (groupInfos == null || groupInfos.length == 0) { + return baseSql; + } + List groupFields = new ArrayList<>(); + List selectItems = new ArrayList<>(); + for (GroupingInfo item : groupInfos) { + if (item == null || StrUtil.isBlank(item.getSelector())) { + continue; + } + String groupColumn = mapWeFishListQgcGroupColumn(item.getSelector()); + if (StrUtil.isBlank(groupColumn)) { + continue; + } + groupFields.add(groupColumn); + selectItems.add(groupColumn + " AS " + item.getSelector().toUpperCase()); + selectItems.add("COUNT(*) AS COUNT_" + item.getSelector().toUpperCase()); + } + if (groupFields.isEmpty()) { + return baseSql; + } + StringBuilder sql = new StringBuilder("SELECT "); + sql.append(String.join(", ", selectItems)) + .append(" FROM (") + .append(baseSql) + .append(") T GROUP BY ") + .append(String.join(", ", groupFields)); + return sql.toString(); + } + private String buildWeFishStaticsSql(String baseId, String hbrvcd, String yr, @@ -1079,6 +1165,36 @@ public class WeFishServiceImpl implements WeFishService { }; } + private String mapWeFishListQgcGroupColumn(String field) { + String column = mapWeFishListStatColumn(field); + if (StrUtil.isBlank(column)) { + return null; + } + return column.startsWith("r.") ? column.substring(2) : column; + } + + private String buildWeFishListQgcOrderBySql(List sorts) { + if (CollUtil.isEmpty(sorts)) { + return ""; + } + List orderByParts = new ArrayList<>(); + for (DataSourceRequest.SortDescriptor sort : sorts) { + if (sort == null || StrUtil.isBlank(sort.getField())) { + continue; + } + String column = mapWeFishListStatColumn(sort.getField()); + if (StrUtil.isBlank(column)) { + continue; + } + String direction = "desc".equalsIgnoreCase(sort.getDir()) ? "DESC" : "ASC"; + orderByParts.add(column + " " + direction + " NULLS LAST"); + } + if (orderByParts.isEmpty()) { + return ""; + } + return " ORDER BY " + String.join(", ", orderByParts); + } + private Object normalizeWeFishListStatValue(String field, Object value) { if (value == null) { return null; @@ -1123,6 +1239,26 @@ public class WeFishServiceImpl implements WeFishService { .setFcnt(toWeFishLongValue(firstPresentWeFishValue(row, "FCNT", "fcnt"))); } + private WeFishListQgcVo buildWeFishListQgcVo(Map row) { + if (row == null || row.isEmpty()) { + return null; + } + return new WeFishListQgcVo() + .setId(safeWeFishString(firstPresentWeFishValue(row, "ID", "id"))) + .setName(safeWeFishString(firstPresentWeFishValue(row, "NAME", "name"))) + .setBaseId(safeWeFishString(firstPresentWeFishValue(row, "BASEID", "baseId"))) + .setBaseName(safeWeFishString(firstPresentWeFishValue(row, "BASENAME", "baseName"))) + .setRvcd(safeWeFishString(firstPresentWeFishValue(row, "RVCD", "rvcd"))) + .setRvcdName(safeWeFishString(firstPresentWeFishValue(row, "RVCDNAME", "rvcdName"))) + .setHbrvcd(safeWeFishString(firstPresentWeFishValue(row, "HBRVCD", "hbrvcd"))) + .setHbrvcdName(safeWeFishString(firstPresentWeFishValue(row, "HBRVCDNAME", "hbrvcdName"))) + .setRstcd(safeWeFishString(firstPresentWeFishValue(row, "RSTCD", "rstcd"))) + .setEnnm(safeWeFishString(firstPresentWeFishValue(row, "ENNM", "ennm"))) + .setTm(toWeFishDateTimeTextValue(firstPresentWeFishValue(row, "TM", "tm"))) + .setYr(toWeFishIntegerValue(firstPresentWeFishValue(row, "YR", "yr"))) + .setFcnt(toWeFishLongValue(firstPresentWeFishValue(row, "FCNT", "fcnt"))); + } + private WeFishPointQgcVo buildWeFishPointQgcVo(Map row, Map fishNameMap) { if (row == null || row.isEmpty()) { return null; @@ -1290,6 +1426,15 @@ public class WeFishServiceImpl implements WeFishService { } } + private String toWeFishDateTimeTextValue(Object value) { + Date date = toDateValue(value); + if (date != null) { + return DateUtil.formatDateTime(date); + } + String text = safeWeFishString(value); + return StrUtil.isBlank(text) ? null : text; + } + private void appendWeFishQgcValues(List values, Object value) { if (value == null) { From adee795bed222d7818aff861506643b0153f559f Mon Sep 17 00:00:00 2001 From: tangwei Date: Fri, 26 Jun 2026 09:54:17 +0800 Subject: [PATCH 21/32] =?UTF-8?q?feat:=20=E6=B0=B4=E7=94=9F=E7=94=9F?= =?UTF-8?q?=E6=80=81AI=E7=9B=91=E6=B5=8B=E8=A3=85=E7=BD=AE=E5=9F=BA?= =?UTF-8?q?=E7=A1=80=E4=BF=A1=E6=81=AF=E6=9F=A5=E8=AF=A2?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../wte/controller/WeFishController.java | 6 + .../qgc_env/wte/entity/vo/WeMsstbprptVo.java | 38 ++++ .../qgc_env/wte/service/WeFishService.java | 3 + .../wte/service/impl/WeFishServiceImpl.java | 202 ++++++++++++++++++ 4 files changed, 249 insertions(+) create mode 100644 backend/src/main/java/com/yfd/platform/qgc_env/wte/entity/vo/WeMsstbprptVo.java diff --git a/backend/src/main/java/com/yfd/platform/qgc_env/wte/controller/WeFishController.java b/backend/src/main/java/com/yfd/platform/qgc_env/wte/controller/WeFishController.java index 6e90a7e7..f3e8289c 100644 --- a/backend/src/main/java/com/yfd/platform/qgc_env/wte/controller/WeFishController.java +++ b/backend/src/main/java/com/yfd/platform/qgc_env/wte/controller/WeFishController.java @@ -33,6 +33,12 @@ public class WeFishController { return ResponseResult.successData(weFishService.getQgcWeFishList(dataSourceRequest)); } + @PostMapping("/msstbprpt/GetKendoList") + @Operation(summary = "水生生态AI监测装置基础信息查询") + public ResponseResult getMsstbprptList(@RequestBody DataSourceRequest dataSourceRequest) { + return ResponseResult.successData(weFishService.getMsstbprptList(dataSourceRequest)); + } + @PostMapping("/we/fisht/year/qgc/GetKendoListCust") @Operation(summary = "全过程沿程鱼类变化情况有数据的流域和年份") public ResponseResult getQgcFishStaticsYearList(@RequestBody DataSourceRequest dataSourceRequest) { diff --git a/backend/src/main/java/com/yfd/platform/qgc_env/wte/entity/vo/WeMsstbprptVo.java b/backend/src/main/java/com/yfd/platform/qgc_env/wte/entity/vo/WeMsstbprptVo.java new file mode 100644 index 00000000..999bd6f3 --- /dev/null +++ b/backend/src/main/java/com/yfd/platform/qgc_env/wte/entity/vo/WeMsstbprptVo.java @@ -0,0 +1,38 @@ +package com.yfd.platform.qgc_env.wte.entity.vo; + +import io.swagger.v3.oas.annotations.media.Schema; +import lombok.Data; + +import java.math.BigDecimal; + +@Data +@Schema(description = "水生生态AI监测装置基础信息查询") +public class WeMsstbprptVo { + + @Schema(description = "主键") + 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 sttpCode; + + @Schema(description = "排序") + private Integer orderIndex; + + @Schema(description = "经度") + private BigDecimal lgtd; + + @Schema(description = "纬度") + private BigDecimal lttd; +} diff --git a/backend/src/main/java/com/yfd/platform/qgc_env/wte/service/WeFishService.java b/backend/src/main/java/com/yfd/platform/qgc_env/wte/service/WeFishService.java index c3e3e414..b2baca1f 100644 --- a/backend/src/main/java/com/yfd/platform/qgc_env/wte/service/WeFishService.java +++ b/backend/src/main/java/com/yfd/platform/qgc_env/wte/service/WeFishService.java @@ -4,6 +4,7 @@ import com.yfd.platform.common.DataSourceRequest; import com.yfd.platform.common.DataSourceResult; import com.yfd.platform.qgc_env.wte.entity.vo.WeFishListQgcVo; import com.yfd.platform.qgc_env.wte.entity.vo.WeFishListStatQgcVo; +import com.yfd.platform.qgc_env.wte.entity.vo.WeMsstbprptVo; import com.yfd.platform.qgc_env.wte.entity.vo.WeFishPointQgcVo; import com.yfd.platform.qgc_env.wte.entity.vo.WeFishStatQgcVo; import com.yfd.platform.qgc_env.wte.entity.vo.WeFishTQgcVo; @@ -18,6 +19,8 @@ public interface WeFishService { DataSourceResult getQgcWeFishList(DataSourceRequest dataSourceRequest); + DataSourceResult getMsstbprptList(DataSourceRequest dataSourceRequest); + DataSourceResult>> getQgcFishStaticsYearList(DataSourceRequest dataSourceRequest); DataSourceResult getQgcWeFishStatics(DataSourceRequest dataSourceRequest); diff --git a/backend/src/main/java/com/yfd/platform/qgc_env/wte/service/impl/WeFishServiceImpl.java b/backend/src/main/java/com/yfd/platform/qgc_env/wte/service/impl/WeFishServiceImpl.java index 3988e87d..cac9c489 100644 --- a/backend/src/main/java/com/yfd/platform/qgc_env/wte/service/impl/WeFishServiceImpl.java +++ b/backend/src/main/java/com/yfd/platform/qgc_env/wte/service/impl/WeFishServiceImpl.java @@ -12,6 +12,7 @@ import com.yfd.platform.common.GroupingInfo; import com.yfd.platform.common.MicroservicDynamicSQLMapper; import com.yfd.platform.qgc_env.wte.entity.vo.WeFishListQgcVo; import com.yfd.platform.qgc_env.wte.entity.vo.WeFishListStatQgcVo; +import com.yfd.platform.qgc_env.wte.entity.vo.WeMsstbprptVo; import com.yfd.platform.qgc_env.wte.entity.vo.WeFishPointQgcVo; import com.yfd.platform.qgc_env.wte.entity.vo.WeFishStatQgcVo; import com.yfd.platform.qgc_env.wte.entity.vo.WeFishTQgcVo; @@ -146,6 +147,44 @@ public class WeFishServiceImpl implements WeFishService { return result; } + @Override + public DataSourceResult getMsstbprptList(DataSourceRequest dataSourceRequest) { + DataSourceLoadOptionsBase loadOptions = dataSourceRequest == null ? null : dataSourceRequest.toDevRequest(); + Map paramMap = new HashMap<>(); + + StringBuilder sql = new StringBuilder(); + sql.append("SELECT ") + .append(buildWeMsstbprptSelectSql(dataSourceRequest == null ? null : dataSourceRequest.getSelect())) + .append(" FROM (") + .append(buildWeMsstbprptViewSql()) + .append(") t WHERE 1 = 1 "); + + String filterSql = buildWeMsstbprptFilterCondition( + dataSourceRequest == null ? null : dataSourceRequest.getFilter(), + paramMap, + new int[]{0} + ); + if (StrUtil.isNotBlank(filterSql)) { + sql.append("AND ").append(filterSql).append(" "); + } + sql.append(buildWeMsstbprptOrderBySql(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, + WeMsstbprptVo.class + ); + + DataSourceResult result = new DataSourceResult<>(); + result.setData(list); + result.setTotal(page != null ? page.getTotal() : list.size()); + result.setAggregates(new HashMap<>()); + return result; + } + @Override public DataSourceResult>> getQgcFishStaticsYearList(DataSourceRequest dataSourceRequest) { Map paramMap = new HashMap<>(); @@ -656,6 +695,169 @@ public class WeFishServiceImpl implements WeFishService { return sql.toString(); } + private String buildWeMsstbprptViewSql() { + return "SELECT " + + "ai.STCD AS id, " + + "ai.STCD AS stcd, " + + "ai.RSTCD AS rstcd, " + + "eng.ENNM AS ennm, " + + "ai.STNM AS stnm, " + + "ai.STTP AS sttpCode, " + + "ai.ORDER_INDEX AS orderIndex, " + + "ai.LGTD AS lgtd, " + + "ai.LTTD AS lttd " + + "FROM SD_AIMONITOR_B_H ai " + + "LEFT JOIN SD_ENGINFO_B_H eng ON eng.STCD = ai.RSTCD AND NVL(eng.IS_DELETED, 0) = 0 " + + "WHERE NVL(ai.IS_DELETED, 0) = 0"; + } + + private String buildWeMsstbprptSelectSql(List selectFields) { + Map columns = weMsstbprptFieldColumns(); + List selected = new ArrayList<>(); + if (CollUtil.isEmpty(selectFields)) { + selected.addAll(columns.values()); + } else { + for (String field : selectFields) { + String column = columns.get(field); + if (StrUtil.isNotBlank(column)) { + selected.add(column); + } + } + } + if (selected.isEmpty()) { + selected.addAll(columns.values()); + } + return String.join(", ", selected); + } + + private Map weMsstbprptFieldColumns() { + Map columns = new LinkedHashMap<>(); + columns.put("id", "t.id AS id"); + columns.put("stcd", "t.stcd AS stcd"); + columns.put("rstcd", "t.rstcd AS rstcd"); + columns.put("ennm", "t.ennm AS ennm"); + columns.put("stnm", "t.stnm AS stnm"); + columns.put("sttpCode", "t.sttpCode AS sttpCode"); + columns.put("orderIndex", "t.orderIndex AS orderIndex"); + columns.put("lgtd", "t.lgtd AS lgtd"); + columns.put("lttd", "t.lttd AS lttd"); + return columns; + } + + private String buildWeMsstbprptFilterCondition(DataSourceRequest.FilterDescriptor filter, + Map paramMap, + int[] indexHolder) { + if (filter == null) { + return ""; + } + if (StrUtil.isNotBlank(filter.getField())) { + return buildWeMsstbprptLeafCondition(filter, paramMap, indexHolder); + } + if (CollUtil.isEmpty(filter.getFilters())) { + return ""; + } + List conditions = new ArrayList<>(); + for (DataSourceRequest.FilterDescriptor child : filter.getFilters()) { + String childSql = buildWeMsstbprptFilterCondition(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 buildWeMsstbprptLeafCondition(DataSourceRequest.FilterDescriptor filter, + Map paramMap, + int[] indexHolder) { + String column = mapWeMsstbprptColumn(filter.getField()); + if (StrUtil.isBlank(column)) { + return ""; + } + String operator = StrUtil.blankToDefault(filter.getOperator(), "eq").toLowerCase(); + if ("in".equals(operator) || "ni".equals(operator)) { + List values = normalizeWeFishQgcValues(filter.getValue()); + if (values.isEmpty()) { + return ""; + } + List placeholders = new ArrayList<>(); + for (Object value : values) { + if (value == null || StrUtil.isBlank(String.valueOf(value).trim())) { + continue; + } + String key = "weMsstbprptP" + indexHolder[0]++; + paramMap.put(key, String.valueOf(value).trim()); + placeholders.add("#{map." + key + "}"); + } + if (placeholders.isEmpty()) { + return ""; + } + return column + ("ni".equals(operator) ? " NOT IN (" : " IN (") + String.join(", ", placeholders) + ")"; + } + Object rawValue = filter.getValue(); + if (rawValue == null || StrUtil.isBlank(String.valueOf(rawValue).trim())) { + return ""; + } + String key = "weMsstbprptP" + indexHolder[0]++; + paramMap.put(key, String.valueOf(rawValue).trim()); + return switch (operator) { + case "eq" -> column + " = #{map." + key + "}"; + case "neq" -> column + " <> #{map." + key + "}"; + case "contains" -> { + paramMap.put(key, "%" + String.valueOf(rawValue).trim() + "%"); + yield column + " LIKE #{map." + key + "}"; + } + case "doesnotcontain" -> { + paramMap.put(key, "%" + String.valueOf(rawValue).trim() + "%"); + yield column + " NOT LIKE #{map." + key + "}"; + } + default -> ""; + }; + } + + private String mapWeMsstbprptColumn(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 "sttpCode" -> "t.sttpCode"; + case "orderIndex" -> "t.orderIndex"; + case "lgtd" -> "t.lgtd"; + case "lttd" -> "t.lttd"; + default -> null; + }; + } + + private String buildWeMsstbprptOrderBySql(List sorts) { + if (CollUtil.isEmpty(sorts)) { + return ""; + } + List orderByParts = new ArrayList<>(); + for (DataSourceRequest.SortDescriptor sort : sorts) { + if (sort == null || StrUtil.isBlank(sort.getField())) { + continue; + } + String column = mapWeMsstbprptColumn(sort.getField()); + if (StrUtil.isBlank(column)) { + continue; + } + String direction = "desc".equalsIgnoreCase(sort.getDir()) ? "DESC" : "ASC"; + orderByParts.add(column + " " + direction + " NULLS LAST"); + } + if (orderByParts.isEmpty()) { + return ""; + } + return " ORDER BY " + String.join(", ", orderByParts); + } + private String buildWeFishListQgcGroupSql(String baseSql, GroupingInfo[] groupInfos) { if (groupInfos == null || groupInfos.length == 0) { return baseSql; From 8ee9952d0ebce0bc7257c5b281de45c977698fbd Mon Sep 17 00:00:00 2001 From: tangwei Date: Fri, 26 Jun 2026 10:09:15 +0800 Subject: [PATCH 22/32] =?UTF-8?q?feat:=20=E9=87=8E=E7=94=9F=E5=8A=A8?= =?UTF-8?q?=E7=89=A9=E7=9B=91=E6=B5=8B=E9=BB=98=E8=AE=A4=E6=9C=89=E6=95=B0?= =?UTF-8?q?=E6=8D=AE=E7=9A=84=E5=B9=B4=E4=BB=BD=E5=92=8C=E6=9C=88=E4=BB=BD?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../wte/controller/WeFishController.java | 6 + .../qgc_env/wte/entity/vo/WeWvaYearQgcVo.java | 12 ++ .../qgc_env/wte/service/WeFishService.java | 3 + .../wte/service/impl/WeFishServiceImpl.java | 152 ++++++++++++++++++ 4 files changed, 173 insertions(+) create mode 100644 backend/src/main/java/com/yfd/platform/qgc_env/wte/entity/vo/WeWvaYearQgcVo.java diff --git a/backend/src/main/java/com/yfd/platform/qgc_env/wte/controller/WeFishController.java b/backend/src/main/java/com/yfd/platform/qgc_env/wte/controller/WeFishController.java index f3e8289c..fde8e0a3 100644 --- a/backend/src/main/java/com/yfd/platform/qgc_env/wte/controller/WeFishController.java +++ b/backend/src/main/java/com/yfd/platform/qgc_env/wte/controller/WeFishController.java @@ -39,6 +39,12 @@ public class WeFishController { return ResponseResult.successData(weFishService.getMsstbprptList(dataSourceRequest)); } + @PostMapping("/wva/year/GetKendoListCust") + @Operation(summary = "野生动物监测默认有数据的年份和月份") + public ResponseResult getWvaDefaultYearList(@RequestBody DataSourceRequest dataSourceRequest) { + return ResponseResult.successData(weFishService.getWvaDefaultYearList(dataSourceRequest)); + } + @PostMapping("/we/fisht/year/qgc/GetKendoListCust") @Operation(summary = "全过程沿程鱼类变化情况有数据的流域和年份") public ResponseResult getQgcFishStaticsYearList(@RequestBody DataSourceRequest dataSourceRequest) { diff --git a/backend/src/main/java/com/yfd/platform/qgc_env/wte/entity/vo/WeWvaYearQgcVo.java b/backend/src/main/java/com/yfd/platform/qgc_env/wte/entity/vo/WeWvaYearQgcVo.java new file mode 100644 index 00000000..ef90a362 --- /dev/null +++ b/backend/src/main/java/com/yfd/platform/qgc_env/wte/entity/vo/WeWvaYearQgcVo.java @@ -0,0 +1,12 @@ +package com.yfd.platform.qgc_env.wte.entity.vo; + +import io.swagger.v3.oas.annotations.media.Schema; +import lombok.Data; + +@Data +@Schema(description = "野生动物监测默认有数据的年月") +public class WeWvaYearQgcVo { + + @Schema(description = "年月,格式yyyy-MM") + private String ym; +} diff --git a/backend/src/main/java/com/yfd/platform/qgc_env/wte/service/WeFishService.java b/backend/src/main/java/com/yfd/platform/qgc_env/wte/service/WeFishService.java index b2baca1f..f8ce3fa4 100644 --- a/backend/src/main/java/com/yfd/platform/qgc_env/wte/service/WeFishService.java +++ b/backend/src/main/java/com/yfd/platform/qgc_env/wte/service/WeFishService.java @@ -9,6 +9,7 @@ import com.yfd.platform.qgc_env.wte.entity.vo.WeFishPointQgcVo; import com.yfd.platform.qgc_env.wte.entity.vo.WeFishStatQgcVo; import com.yfd.platform.qgc_env.wte.entity.vo.WeFishTQgcVo; import com.yfd.platform.qgc_env.wte.entity.vo.WeStaticsVo; +import com.yfd.platform.qgc_env.wte.entity.vo.WeWvaYearQgcVo; import java.util.List; import java.util.Map; @@ -21,6 +22,8 @@ public interface WeFishService { DataSourceResult getMsstbprptList(DataSourceRequest dataSourceRequest); + DataSourceResult getWvaDefaultYearList(DataSourceRequest dataSourceRequest); + DataSourceResult>> getQgcFishStaticsYearList(DataSourceRequest dataSourceRequest); DataSourceResult getQgcWeFishStatics(DataSourceRequest dataSourceRequest); diff --git a/backend/src/main/java/com/yfd/platform/qgc_env/wte/service/impl/WeFishServiceImpl.java b/backend/src/main/java/com/yfd/platform/qgc_env/wte/service/impl/WeFishServiceImpl.java index cac9c489..8b5697c0 100644 --- a/backend/src/main/java/com/yfd/platform/qgc_env/wte/service/impl/WeFishServiceImpl.java +++ b/backend/src/main/java/com/yfd/platform/qgc_env/wte/service/impl/WeFishServiceImpl.java @@ -18,6 +18,7 @@ import com.yfd.platform.qgc_env.wte.entity.vo.WeFishStatQgcVo; import com.yfd.platform.qgc_env.wte.entity.vo.WeFishTQgcVo; import com.yfd.platform.qgc_env.wte.entity.vo.WeRvcdYearVo; import com.yfd.platform.qgc_env.wte.entity.vo.WeStaticsVo; +import com.yfd.platform.qgc_env.wte.entity.vo.WeWvaYearQgcVo; import com.yfd.platform.qgc_env.wte.service.WeFishService; import com.yfd.platform.utils.QgcQueryWrapperUtil; import jakarta.annotation.Resource; @@ -185,6 +186,46 @@ public class WeFishServiceImpl implements WeFishService { return result; } + @Override + public DataSourceResult getWvaDefaultYearList(DataSourceRequest dataSourceRequest) { + DataSourceLoadOptionsBase loadOptions = dataSourceRequest == null ? null : dataSourceRequest.toDevRequest(); + Map paramMap = new HashMap<>(); + + String filterSql = buildWeWvaYearFilterCondition( + dataSourceRequest == null ? null : dataSourceRequest.getFilter(), + paramMap, + new int[]{0} + ); + + StringBuilder sql = new StringBuilder(); + sql.append("SELECT TO_CHAR(a.TM, 'yyyy') || '-' || TO_CHAR(a.TM, 'MM') AS ym ") + .append("FROM SD_WVA_R a ") + .append("INNER JOIN SD_AIMONITOR_B_H b ON a.STCD = b.STCD ") + .append("WHERE NVL(a.IS_DELETED, 0) = 0 ") + .append("AND NVL(b.IS_DELETED, 0) = 0 ") + .append("AND b.STTP = 'WVA' "); + if (StrUtil.isNotBlank(filterSql)) { + sql.append("AND ").append(filterSql).append(" "); + } + sql.append("GROUP BY TO_CHAR(a.TM, 'yyyy'), TO_CHAR(a.TM, 'MM') ") + .append("ORDER BY TO_CHAR(a.TM, 'yyyy') DESC, TO_CHAR(a.TM, 'MM') DESC"); + + Page page = loadOptions == null ? null + : QgcQueryWrapperUtil.buildPage(loadOptions, loadOptions.getSkip(), loadOptions.getTake()); + List list = microservicDynamicSQLMapper.pageAllListWithResultType( + page, + sql.toString(), + paramMap, + WeWvaYearQgcVo.class + ); + + DataSourceResult result = new DataSourceResult<>(); + result.setData(list); + result.setTotal((long) list.size()); + result.setAggregates(new HashMap<>()); + return result; + } + @Override public DataSourceResult>> getQgcFishStaticsYearList(DataSourceRequest dataSourceRequest) { Map paramMap = new HashMap<>(); @@ -695,6 +736,117 @@ public class WeFishServiceImpl implements WeFishService { return sql.toString(); } + private String buildWeWvaYearFilterCondition(DataSourceRequest.FilterDescriptor filter, + Map paramMap, + int[] indexHolder) { + if (filter == null) { + return ""; + } + if (StrUtil.isNotBlank(filter.getField())) { + return buildWeWvaYearLeafCondition(filter, paramMap, indexHolder); + } + if (CollUtil.isEmpty(filter.getFilters())) { + return ""; + } + List conditions = new ArrayList<>(); + for (DataSourceRequest.FilterDescriptor child : filter.getFilters()) { + String childSql = buildWeWvaYearFilterCondition(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 buildWeWvaYearLeafCondition(DataSourceRequest.FilterDescriptor filter, + Map paramMap, + int[] indexHolder) { + String column = mapWeWvaYearColumn(filter.getField()); + if (StrUtil.isBlank(column)) { + return ""; + } + String operator = StrUtil.blankToDefault(filter.getOperator(), "eq").toLowerCase(); + 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 = normalizeWeFishQgcValues(filter.getValue()); + if (values.isEmpty()) { + return ""; + } + List placeholders = new ArrayList<>(); + for (Object value : values) { + if (value == null || StrUtil.isBlank(String.valueOf(value).trim())) { + continue; + } + String key = "weWvaYearP" + indexHolder[0]++; + paramMap.put(key, String.valueOf(value).trim()); + placeholders.add("#{map." + key + "}"); + } + if (placeholders.isEmpty()) { + return ""; + } + return column + ("ni".equals(operator) ? " NOT IN (" : " IN (") + String.join(", ", placeholders) + ")"; + } + + Object rawValue = filter.getValue(); + if (rawValue == null || StrUtil.isBlank(String.valueOf(rawValue).trim())) { + return ""; + } + String text = String.valueOf(rawValue).trim(); + String key = "weWvaYearP" + indexHolder[0]++; + return switch (operator) { + case "eq" -> { + paramMap.put(key, text); + yield column + " = #{map." + key + "}"; + } + case "neq" -> { + paramMap.put(key, text); + yield column + " <> #{map." + key + "}"; + } + case "contains" -> { + paramMap.put(key, "%" + text + "%"); + yield column + " LIKE #{map." + key + "}"; + } + case "doesnotcontain" -> { + paramMap.put(key, "%" + text + "%"); + yield column + " NOT LIKE #{map." + key + "}"; + } + default -> ""; + }; + } + + private String mapWeWvaYearColumn(String field) { + if (StrUtil.isBlank(field)) { + return null; + } + return switch (field) { + case "stcd" -> "a.STCD"; + case "tm" -> "a.TM"; + case "fid" -> "a.FID"; + case "stnm" -> "b.STNM"; + case "sttpCode" -> "b.STTP"; + case "rstcd" -> "b.RSTCD"; + case "baseId" -> "b.BASE_ID"; + case "hbrvcd" -> "b.HBRVCD"; + case "ym" -> "TO_CHAR(a.TM, 'yyyy') || '-' || TO_CHAR(a.TM, 'MM')"; + default -> null; + }; + } + private String buildWeMsstbprptViewSql() { return "SELECT " + "ai.STCD AS id, " + From 7f967f4cbaa13613e85cd58212d560caaaeb017a Mon Sep 17 00:00:00 2001 From: tangwei Date: Fri, 26 Jun 2026 10:16:24 +0800 Subject: [PATCH 23/32] =?UTF-8?q?feat:=20=E6=B0=B4=E7=94=9F=E7=94=9F?= =?UTF-8?q?=E6=80=81=E7=AB=99=E7=82=B9=E5=9F=BA=E7=A1=80=E7=BB=9F=E8=AE=A1?= =?UTF-8?q?=E6=9F=A5=E8=AF=A2?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../wte/controller/WeFishController.java | 8 +- .../qgc_env/wte/entity/vo/WeVmsstbprptVo.java | 47 ++++ .../qgc_env/wte/service/WeFishService.java | 3 + .../wte/service/impl/WeFishServiceImpl.java | 233 ++++++++++++++++++ 4 files changed, 290 insertions(+), 1 deletion(-) create mode 100644 backend/src/main/java/com/yfd/platform/qgc_env/wte/entity/vo/WeVmsstbprptVo.java diff --git a/backend/src/main/java/com/yfd/platform/qgc_env/wte/controller/WeFishController.java b/backend/src/main/java/com/yfd/platform/qgc_env/wte/controller/WeFishController.java index fde8e0a3..af9a014c 100644 --- a/backend/src/main/java/com/yfd/platform/qgc_env/wte/controller/WeFishController.java +++ b/backend/src/main/java/com/yfd/platform/qgc_env/wte/controller/WeFishController.java @@ -14,7 +14,7 @@ import org.springframework.web.bind.annotation.RestController; @RestController @RequestMapping("/wte") -@Tag(name = "水生生态模块") +@Tag(name = "生态调查模块") @Validated public class WeFishController { @@ -39,6 +39,12 @@ public class WeFishController { return ResponseResult.successData(weFishService.getMsstbprptList(dataSourceRequest)); } + @PostMapping("/vmsstbprpt/GetKendoList") + @Operation(summary = "水生生态站点基础统计查询") + public ResponseResult getVmsstbprptList(@RequestBody DataSourceRequest dataSourceRequest) { + return ResponseResult.successData(weFishService.getVmsstbprptList(dataSourceRequest)); + } + @PostMapping("/wva/year/GetKendoListCust") @Operation(summary = "野生动物监测默认有数据的年份和月份") public ResponseResult getWvaDefaultYearList(@RequestBody DataSourceRequest dataSourceRequest) { diff --git a/backend/src/main/java/com/yfd/platform/qgc_env/wte/entity/vo/WeVmsstbprptVo.java b/backend/src/main/java/com/yfd/platform/qgc_env/wte/entity/vo/WeVmsstbprptVo.java new file mode 100644 index 00000000..e65e99cf --- /dev/null +++ b/backend/src/main/java/com/yfd/platform/qgc_env/wte/entity/vo/WeVmsstbprptVo.java @@ -0,0 +1,47 @@ +package com.yfd.platform.qgc_env.wte.entity.vo; + +import io.swagger.v3.oas.annotations.media.Schema; +import lombok.Data; + +import java.math.BigDecimal; + +@Data +@Schema(description = "水生生态站点基础统计查询") +public class WeVmsstbprptVo { + + @Schema(description = "主键") + private String id; + + @Schema(description = "站类编码") + private String sttpCode; + + @Schema(description = "站点编码") + private String stcd; + + @Schema(description = "站点名称") + private String stnm; + + @Schema(description = "所属电站编码") + private String rstcd; + + @Schema(description = "所属电站名称") + private String ennm; + + @Schema(description = "基地编码") + private String baseId; + + @Schema(description = "流域编码") + private String hbrvcd; + + @Schema(description = "河流编码") + private String rvcd; + + @Schema(description = "排序") + private Integer orderIndex; + + @Schema(description = "经度") + private BigDecimal lgtd; + + @Schema(description = "纬度") + private BigDecimal lttd; +} diff --git a/backend/src/main/java/com/yfd/platform/qgc_env/wte/service/WeFishService.java b/backend/src/main/java/com/yfd/platform/qgc_env/wte/service/WeFishService.java index f8ce3fa4..af594668 100644 --- a/backend/src/main/java/com/yfd/platform/qgc_env/wte/service/WeFishService.java +++ b/backend/src/main/java/com/yfd/platform/qgc_env/wte/service/WeFishService.java @@ -9,6 +9,7 @@ import com.yfd.platform.qgc_env.wte.entity.vo.WeFishPointQgcVo; import com.yfd.platform.qgc_env.wte.entity.vo.WeFishStatQgcVo; import com.yfd.platform.qgc_env.wte.entity.vo.WeFishTQgcVo; import com.yfd.platform.qgc_env.wte.entity.vo.WeStaticsVo; +import com.yfd.platform.qgc_env.wte.entity.vo.WeVmsstbprptVo; import com.yfd.platform.qgc_env.wte.entity.vo.WeWvaYearQgcVo; import java.util.List; @@ -22,6 +23,8 @@ public interface WeFishService { DataSourceResult getMsstbprptList(DataSourceRequest dataSourceRequest); + DataSourceResult getVmsstbprptList(DataSourceRequest dataSourceRequest); + DataSourceResult getWvaDefaultYearList(DataSourceRequest dataSourceRequest); DataSourceResult>> getQgcFishStaticsYearList(DataSourceRequest dataSourceRequest); diff --git a/backend/src/main/java/com/yfd/platform/qgc_env/wte/service/impl/WeFishServiceImpl.java b/backend/src/main/java/com/yfd/platform/qgc_env/wte/service/impl/WeFishServiceImpl.java index 8b5697c0..16d87af7 100644 --- a/backend/src/main/java/com/yfd/platform/qgc_env/wte/service/impl/WeFishServiceImpl.java +++ b/backend/src/main/java/com/yfd/platform/qgc_env/wte/service/impl/WeFishServiceImpl.java @@ -18,6 +18,7 @@ import com.yfd.platform.qgc_env.wte.entity.vo.WeFishStatQgcVo; import com.yfd.platform.qgc_env.wte.entity.vo.WeFishTQgcVo; import com.yfd.platform.qgc_env.wte.entity.vo.WeRvcdYearVo; import com.yfd.platform.qgc_env.wte.entity.vo.WeStaticsVo; +import com.yfd.platform.qgc_env.wte.entity.vo.WeVmsstbprptVo; import com.yfd.platform.qgc_env.wte.entity.vo.WeWvaYearQgcVo; import com.yfd.platform.qgc_env.wte.service.WeFishService; import com.yfd.platform.utils.QgcQueryWrapperUtil; @@ -186,6 +187,44 @@ public class WeFishServiceImpl implements WeFishService { return result; } + @Override + public DataSourceResult getVmsstbprptList(DataSourceRequest dataSourceRequest) { + DataSourceLoadOptionsBase loadOptions = dataSourceRequest == null ? null : dataSourceRequest.toDevRequest(); + Map paramMap = new HashMap<>(); + + StringBuilder sql = new StringBuilder(); + sql.append("SELECT ") + .append(buildWeVmsstbprptSelectSql(dataSourceRequest == null ? null : dataSourceRequest.getSelect())) + .append(" FROM (") + .append(buildWeVmsstbprptViewSql()) + .append(") t WHERE 1 = 1 "); + + String filterSql = buildWeVmsstbprptFilterCondition( + dataSourceRequest == null ? null : dataSourceRequest.getFilter(), + paramMap, + new int[]{0} + ); + if (StrUtil.isNotBlank(filterSql)) { + sql.append("AND ").append(filterSql).append(" "); + } + sql.append(buildWeVmsstbprptOrderBySql(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, + WeVmsstbprptVo.class + ); + + DataSourceResult result = new DataSourceResult<>(); + result.setData(list); + result.setTotal(page != null ? page.getTotal() : list.size()); + result.setAggregates(new HashMap<>()); + return result; + } + @Override public DataSourceResult getWvaDefaultYearList(DataSourceRequest dataSourceRequest) { DataSourceLoadOptionsBase loadOptions = dataSourceRequest == null ? null : dataSourceRequest.toDevRequest(); @@ -863,6 +902,25 @@ public class WeFishServiceImpl implements WeFishService { "WHERE NVL(ai.IS_DELETED, 0) = 0"; } + private String buildWeVmsstbprptViewSql() { + return "SELECT " + + "ai.STCD AS id, " + + "ai.STTP AS sttpCode, " + + "ai.STCD AS stcd, " + + "ai.STNM AS stnm, " + + "ai.RSTCD AS rstcd, " + + "eng.ENNM AS ennm, " + + "ai.BASE_ID AS baseId, " + + "ai.HBRVCD AS hbrvcd, " + + "ai.RVCD AS rvcd, " + + "ai.ORDER_INDEX AS orderIndex, " + + "ai.LGTD AS lgtd, " + + "ai.LTTD AS lttd " + + "FROM SD_AIMONITOR_B_H ai " + + "LEFT JOIN SD_ENGINFO_B_H eng ON eng.STCD = ai.RSTCD AND NVL(eng.IS_DELETED, 0) = 0 " + + "WHERE NVL(ai.IS_DELETED, 0) = 0"; + } + private String buildWeMsstbprptSelectSql(List selectFields) { Map columns = weMsstbprptFieldColumns(); List selected = new ArrayList<>(); @@ -882,6 +940,29 @@ public class WeFishServiceImpl implements WeFishService { return String.join(", ", selected); } + private String buildWeVmsstbprptSelectSql(List selectFields) { + Map columns = weVmsstbprptFieldColumns(); + List selected = new ArrayList<>(); + if (CollUtil.isEmpty(selectFields)) { + selected.add("t.sttpCode AS sttpCode"); + selected.add("t.stnm AS stnm"); + selected.add("t.stcd AS stcd"); + } else { + for (String field : selectFields) { + String column = columns.get(field); + if (StrUtil.isNotBlank(column)) { + selected.add(column); + } + } + } + if (selected.isEmpty()) { + selected.add("t.sttpCode AS sttpCode"); + selected.add("t.stnm AS stnm"); + selected.add("t.stcd AS stcd"); + } + return String.join(", ", selected); + } + private Map weMsstbprptFieldColumns() { Map columns = new LinkedHashMap<>(); columns.put("id", "t.id AS id"); @@ -896,6 +977,23 @@ public class WeFishServiceImpl implements WeFishService { return columns; } + private Map weVmsstbprptFieldColumns() { + Map columns = new LinkedHashMap<>(); + columns.put("id", "t.id AS id"); + columns.put("sttpCode", "t.sttpCode AS sttpCode"); + columns.put("stcd", "t.stcd AS stcd"); + columns.put("stnm", "t.stnm AS stnm"); + columns.put("rstcd", "t.rstcd AS rstcd"); + columns.put("ennm", "t.ennm AS ennm"); + columns.put("baseId", "t.baseId AS baseId"); + columns.put("hbrvcd", "t.hbrvcd AS hbrvcd"); + columns.put("rvcd", "t.rvcd AS rvcd"); + columns.put("orderIndex", "t.orderIndex AS orderIndex"); + columns.put("lgtd", "t.lgtd AS lgtd"); + columns.put("lttd", "t.lttd AS lttd"); + return columns; + } + private String buildWeMsstbprptFilterCondition(DataSourceRequest.FilterDescriptor filter, Map paramMap, int[] indexHolder) { @@ -970,6 +1068,98 @@ public class WeFishServiceImpl implements WeFishService { }; } + private String buildWeVmsstbprptFilterCondition(DataSourceRequest.FilterDescriptor filter, + Map paramMap, + int[] indexHolder) { + if (filter == null) { + return ""; + } + if (StrUtil.isNotBlank(filter.getField())) { + return buildWeVmsstbprptLeafCondition(filter, paramMap, indexHolder); + } + if (CollUtil.isEmpty(filter.getFilters())) { + return ""; + } + List conditions = new ArrayList<>(); + for (DataSourceRequest.FilterDescriptor child : filter.getFilters()) { + String childSql = buildWeVmsstbprptFilterCondition(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 buildWeVmsstbprptLeafCondition(DataSourceRequest.FilterDescriptor filter, + Map paramMap, + int[] indexHolder) { + String column = mapWeVmsstbprptColumn(filter.getField()); + if (StrUtil.isBlank(column)) { + return ""; + } + String operator = StrUtil.blankToDefault(filter.getOperator(), "eq").toLowerCase(); + 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 = normalizeWeFishQgcValues(filter.getValue()); + if (values.isEmpty()) { + return ""; + } + List placeholders = new ArrayList<>(); + for (Object value : values) { + if (value == null || StrUtil.isBlank(String.valueOf(value).trim())) { + continue; + } + String key = "weVmsstbprptP" + indexHolder[0]++; + paramMap.put(key, String.valueOf(value).trim()); + placeholders.add("#{map." + key + "}"); + } + if (placeholders.isEmpty()) { + return ""; + } + return column + ("ni".equals(operator) ? " NOT IN (" : " IN (") + String.join(", ", placeholders) + ")"; + } + Object rawValue = filter.getValue(); + if (rawValue == null || StrUtil.isBlank(String.valueOf(rawValue).trim())) { + return ""; + } + String key = "weVmsstbprptP" + indexHolder[0]++; + String text = String.valueOf(rawValue).trim(); + return switch (operator) { + case "eq" -> { + paramMap.put(key, text); + yield column + " = #{map." + key + "}"; + } + case "neq" -> { + paramMap.put(key, text); + yield column + " <> #{map." + key + "}"; + } + case "contains" -> { + paramMap.put(key, "%" + text + "%"); + yield column + " LIKE #{map." + key + "}"; + } + case "doesnotcontain" -> { + paramMap.put(key, "%" + text + "%"); + yield column + " NOT LIKE #{map." + key + "}"; + } + default -> ""; + }; + } + private String mapWeMsstbprptColumn(String field) { if (StrUtil.isBlank(field)) { return null; @@ -988,6 +1178,27 @@ public class WeFishServiceImpl implements WeFishService { }; } + private String mapWeVmsstbprptColumn(String field) { + if (StrUtil.isBlank(field)) { + return null; + } + return switch (field) { + case "id" -> "t.id"; + case "sttpCode" -> "t.sttpCode"; + case "stcd" -> "t.stcd"; + case "stnm" -> "t.stnm"; + case "rstcd" -> "t.rstcd"; + case "ennm" -> "t.ennm"; + case "baseId" -> "t.baseId"; + case "hbrvcd" -> "t.hbrvcd"; + case "rvcd" -> "t.rvcd"; + case "orderIndex" -> "t.orderIndex"; + case "lgtd" -> "t.lgtd"; + case "lttd" -> "t.lttd"; + default -> null; + }; + } + private String buildWeMsstbprptOrderBySql(List sorts) { if (CollUtil.isEmpty(sorts)) { return ""; @@ -1010,6 +1221,28 @@ public class WeFishServiceImpl implements WeFishService { return " ORDER BY " + String.join(", ", orderByParts); } + private String buildWeVmsstbprptOrderBySql(List sorts) { + if (CollUtil.isEmpty(sorts)) { + return ""; + } + List orderByParts = new ArrayList<>(); + for (DataSourceRequest.SortDescriptor sort : sorts) { + if (sort == null || StrUtil.isBlank(sort.getField())) { + continue; + } + String column = mapWeVmsstbprptColumn(sort.getField()); + if (StrUtil.isBlank(column)) { + continue; + } + String direction = "desc".equalsIgnoreCase(sort.getDir()) ? "DESC" : "ASC"; + orderByParts.add(column + " " + direction + " NULLS LAST"); + } + if (orderByParts.isEmpty()) { + return ""; + } + return " ORDER BY " + String.join(", ", orderByParts); + } + private String buildWeFishListQgcGroupSql(String baseSql, GroupingInfo[] groupInfos) { if (groupInfos == null || groupInfos.length == 0) { return baseSql; From dd9ca6df75bfa1fa6a8a75668f1760a56fe570aa Mon Sep 17 00:00:00 2001 From: tangwei Date: Fri, 26 Jun 2026 10:49:42 +0800 Subject: [PATCH 24/32] =?UTF-8?q?feat:=20=E9=87=8E=E7=94=9F=E5=8A=A8?= =?UTF-8?q?=E7=89=A9=E7=9B=91=E6=B5=8B=E6=83=85=E5=86=B5?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../wte/controller/WeFishController.java | 6 + .../qgc_env/wte/entity/vo/WeWvaQgcVo.java | 58 +++ .../qgc_env/wte/service/WeFishService.java | 3 + .../wte/service/impl/WeFishServiceImpl.java | 338 ++++++++++++++++++ 4 files changed, 405 insertions(+) create mode 100644 backend/src/main/java/com/yfd/platform/qgc_env/wte/entity/vo/WeWvaQgcVo.java diff --git a/backend/src/main/java/com/yfd/platform/qgc_env/wte/controller/WeFishController.java b/backend/src/main/java/com/yfd/platform/qgc_env/wte/controller/WeFishController.java index af9a014c..adebfe77 100644 --- a/backend/src/main/java/com/yfd/platform/qgc_env/wte/controller/WeFishController.java +++ b/backend/src/main/java/com/yfd/platform/qgc_env/wte/controller/WeFishController.java @@ -51,6 +51,12 @@ public class WeFishController { return ResponseResult.successData(weFishService.getWvaDefaultYearList(dataSourceRequest)); } + @PostMapping("/wva/GetKendoListCust") + @Operation(summary = "野生动物监测情况") + public ResponseResult getWvaList(@RequestBody DataSourceRequest dataSourceRequest) { + return ResponseResult.successData(weFishService.getWvaList(dataSourceRequest)); + } + @PostMapping("/we/fisht/year/qgc/GetKendoListCust") @Operation(summary = "全过程沿程鱼类变化情况有数据的流域和年份") public ResponseResult getQgcFishStaticsYearList(@RequestBody DataSourceRequest dataSourceRequest) { diff --git a/backend/src/main/java/com/yfd/platform/qgc_env/wte/entity/vo/WeWvaQgcVo.java b/backend/src/main/java/com/yfd/platform/qgc_env/wte/entity/vo/WeWvaQgcVo.java new file mode 100644 index 00000000..b0911f8d --- /dev/null +++ b/backend/src/main/java/com/yfd/platform/qgc_env/wte/entity/vo/WeWvaQgcVo.java @@ -0,0 +1,58 @@ +package com.yfd.platform.qgc_env.wte.entity.vo; + +import com.fasterxml.jackson.annotation.JsonFormat; +import io.swagger.v3.oas.annotations.media.Schema; +import lombok.Data; + +import java.util.Date; + +@Data +@Schema(description = "野生动物监测情况") +public class WeWvaQgcVo { + + @Schema(description = "主键") + private String id; + + @Schema(description = "野生动物监测站编码") + private String stcd; + + @Schema(description = "野生动物监测站名称") + private String stnm; + + @Schema(description = "站类编码") + private String sttpCode; + + @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss") + @Schema(description = "时间") + private Date tm; + + @Schema(description = "显示名称") + private String flnm; + + @Schema(description = "图片路径") + private String imgPath; + + @Schema(description = "视频路径") + private String flpth; + + @Schema(description = "附件ID") + private String fid; + + @Schema(description = "备注") + private String description; + + @Schema(description = "所属电站编码") + private String rstcd; + + @Schema(description = "基地编码") + private String baseId; + + @Schema(description = "流域编码") + private String hbrvcd; + + @Schema(description = "河流编码") + private String rvcd; + + @Schema(description = "排序") + private Integer orderIndex; +} diff --git a/backend/src/main/java/com/yfd/platform/qgc_env/wte/service/WeFishService.java b/backend/src/main/java/com/yfd/platform/qgc_env/wte/service/WeFishService.java index af594668..4412fbbb 100644 --- a/backend/src/main/java/com/yfd/platform/qgc_env/wte/service/WeFishService.java +++ b/backend/src/main/java/com/yfd/platform/qgc_env/wte/service/WeFishService.java @@ -10,6 +10,7 @@ import com.yfd.platform.qgc_env.wte.entity.vo.WeFishStatQgcVo; import com.yfd.platform.qgc_env.wte.entity.vo.WeFishTQgcVo; import com.yfd.platform.qgc_env.wte.entity.vo.WeStaticsVo; import com.yfd.platform.qgc_env.wte.entity.vo.WeVmsstbprptVo; +import com.yfd.platform.qgc_env.wte.entity.vo.WeWvaQgcVo; import com.yfd.platform.qgc_env.wte.entity.vo.WeWvaYearQgcVo; import java.util.List; @@ -25,6 +26,8 @@ public interface WeFishService { DataSourceResult getVmsstbprptList(DataSourceRequest dataSourceRequest); + DataSourceResult getWvaList(DataSourceRequest dataSourceRequest); + DataSourceResult getWvaDefaultYearList(DataSourceRequest dataSourceRequest); DataSourceResult>> getQgcFishStaticsYearList(DataSourceRequest dataSourceRequest); diff --git a/backend/src/main/java/com/yfd/platform/qgc_env/wte/service/impl/WeFishServiceImpl.java b/backend/src/main/java/com/yfd/platform/qgc_env/wte/service/impl/WeFishServiceImpl.java index 16d87af7..5d086cec 100644 --- a/backend/src/main/java/com/yfd/platform/qgc_env/wte/service/impl/WeFishServiceImpl.java +++ b/backend/src/main/java/com/yfd/platform/qgc_env/wte/service/impl/WeFishServiceImpl.java @@ -19,6 +19,7 @@ import com.yfd.platform.qgc_env.wte.entity.vo.WeFishTQgcVo; import com.yfd.platform.qgc_env.wte.entity.vo.WeRvcdYearVo; import com.yfd.platform.qgc_env.wte.entity.vo.WeStaticsVo; import com.yfd.platform.qgc_env.wte.entity.vo.WeVmsstbprptVo; +import com.yfd.platform.qgc_env.wte.entity.vo.WeWvaQgcVo; import com.yfd.platform.qgc_env.wte.entity.vo.WeWvaYearQgcVo; import com.yfd.platform.qgc_env.wte.service.WeFishService; import com.yfd.platform.utils.QgcQueryWrapperUtil; @@ -265,6 +266,50 @@ public class WeFishServiceImpl implements WeFishService { return result; } + @Override + public DataSourceResult getWvaList(DataSourceRequest dataSourceRequest) { + DataSourceLoadOptionsBase loadOptions = dataSourceRequest == null ? null : dataSourceRequest.toDevRequest(); + Map paramMap = new HashMap<>(); + + StringBuilder sql = new StringBuilder(); + sql.append("SELECT ") + .append(buildWeWvaSelectSql(dataSourceRequest == null ? null : dataSourceRequest.getSelect())) + .append(" FROM (") + .append(buildWeWvaViewSql()) + .append(") t WHERE 1 = 1 "); + + String filterSql = buildWeWvaFilterCondition( + dataSourceRequest == null ? null : dataSourceRequest.getFilter(), + paramMap, + new int[]{0} + ); + if (StrUtil.isNotBlank(filterSql)) { + sql.append("AND ").append(filterSql).append(" "); + } + sql.append(buildWeWvaOrderBySql(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, + WeWvaQgcVo.class + ); + for (WeWvaQgcVo vo : list) { + if (vo == null || vo.getTm() == null || StrUtil.isBlank(vo.getStnm())) { + continue; + } + vo.setFlnm(vo.getStnm() + " " + DateUtil.format(vo.getTm(), "yyyy-MM-dd HH")); + } + + DataSourceResult result = new DataSourceResult<>(); + result.setData(list); + result.setTotal(page != null ? page.getTotal() : list.size()); + result.setAggregates(new HashMap<>()); + return result; + } + @Override public DataSourceResult>> getQgcFishStaticsYearList(DataSourceRequest dataSourceRequest) { Map paramMap = new HashMap<>(); @@ -856,6 +901,22 @@ public class WeFishServiceImpl implements WeFishService { paramMap.put(key, text); yield column + " <> #{map." + key + "}"; } + case "gt" -> { + paramMap.put(key, text); + yield column + " > #{map." + key + "}"; + } + case "gte" -> { + paramMap.put(key, text); + yield column + " >= #{map." + key + "}"; + } + case "lt" -> { + paramMap.put(key, text); + yield column + " < #{map." + key + "}"; + } + case "lte" -> { + paramMap.put(key, text); + yield column + " <= #{map." + key + "}"; + } case "contains" -> { paramMap.put(key, "%" + text + "%"); yield column + " LIKE #{map." + key + "}"; @@ -864,6 +925,14 @@ public class WeFishServiceImpl implements WeFishService { paramMap.put(key, "%" + text + "%"); yield column + " NOT LIKE #{map." + key + "}"; } + case "startswith" -> { + paramMap.put(key, text + "%"); + yield column + " LIKE #{map." + key + "}"; + } + case "endswith" -> { + paramMap.put(key, "%" + text); + yield column + " LIKE #{map." + key + "}"; + } default -> ""; }; } @@ -921,6 +990,29 @@ public class WeFishServiceImpl implements WeFishService { "WHERE NVL(ai.IS_DELETED, 0) = 0"; } + private String buildWeWvaViewSql() { + return "SELECT " + + "a.ID AS id, " + + "a.STCD AS stcd, " + + "b.STNM AS stnm, " + + "b.STTP AS sttpCode, " + + "a.TM AS tm, " + + "a.FLNM AS flnm, " + + "a.IMG_PATH AS imgPath, " + + "a.FLPTH AS flpth, " + + "a.FID AS fid, " + + "a.DESCRIPTION AS description, " + + "b.RSTCD AS rstcd, " + + "b.BASE_ID AS baseId, " + + "b.HBRVCD AS hbrvcd, " + + "b.RVCD AS rvcd, " + + "b.ORDER_INDEX AS orderIndex " + + "FROM SD_WVA_R a " + + "INNER JOIN SD_AIMONITOR_B_H b ON a.STCD = b.STCD " + + "WHERE NVL(a.IS_DELETED, 0) = 0 " + + "AND NVL(b.IS_DELETED, 0) = 0"; + } + private String buildWeMsstbprptSelectSql(List selectFields) { Map columns = weMsstbprptFieldColumns(); List selected = new ArrayList<>(); @@ -963,6 +1055,39 @@ public class WeFishServiceImpl implements WeFishService { return String.join(", ", selected); } + private String buildWeWvaSelectSql(List selectFields) { + Map columns = weWvaFieldColumns(); + List selected = new ArrayList<>(); + if (CollUtil.isEmpty(selectFields)) { + selected.add("t.id AS id"); + selected.add("t.stcd AS stcd"); + selected.add("t.stnm AS stnm"); + selected.add("t.tm AS tm"); + selected.add("t.flnm AS flnm"); + selected.add("t.imgPath AS imgPath"); + selected.add("t.flpth AS flpth"); + selected.add("t.fid AS fid"); + selected.add("t.description AS description"); + } else { + for (String field : selectFields) { + String column = columns.get(field); + if (StrUtil.isNotBlank(column)) { + selected.add(column); + } + } + } + if (!selected.stream().anyMatch(item -> item.contains(" AS stnm"))) { + selected.add("t.stnm AS stnm"); + } + if (!selected.stream().anyMatch(item -> item.contains(" AS tm"))) { + selected.add("t.tm AS tm"); + } + if (!selected.stream().anyMatch(item -> item.contains(" AS flnm"))) { + selected.add("t.flnm AS flnm"); + } + return String.join(", ", selected); + } + private Map weMsstbprptFieldColumns() { Map columns = new LinkedHashMap<>(); columns.put("id", "t.id AS id"); @@ -994,6 +1119,26 @@ public class WeFishServiceImpl implements WeFishService { return columns; } + private Map weWvaFieldColumns() { + Map columns = new LinkedHashMap<>(); + columns.put("id", "t.id AS id"); + columns.put("stcd", "t.stcd AS stcd"); + columns.put("stnm", "t.stnm AS stnm"); + columns.put("sttpCode", "t.sttpCode AS sttpCode"); + columns.put("tm", "t.tm AS tm"); + columns.put("flnm", "t.flnm AS flnm"); + columns.put("imgPath", "t.imgPath AS imgPath"); + columns.put("flpth", "t.flpth AS flpth"); + columns.put("fid", "t.fid AS fid"); + columns.put("description", "t.description AS description"); + columns.put("rstcd", "t.rstcd AS rstcd"); + columns.put("baseId", "t.baseId AS baseId"); + columns.put("hbrvcd", "t.hbrvcd AS hbrvcd"); + columns.put("rvcd", "t.rvcd AS rvcd"); + columns.put("orderIndex", "t.orderIndex AS orderIndex"); + return columns; + } + private String buildWeMsstbprptFilterCondition(DataSourceRequest.FilterDescriptor filter, Map paramMap, int[] indexHolder) { @@ -1148,6 +1293,22 @@ public class WeFishServiceImpl implements WeFishService { paramMap.put(key, text); yield column + " <> #{map." + key + "}"; } + case "gt" -> { + paramMap.put(key, text); + yield column + " > #{map." + key + "}"; + } + case "gte" -> { + paramMap.put(key, text); + yield column + " >= #{map." + key + "}"; + } + case "lt" -> { + paramMap.put(key, text); + yield column + " < #{map." + key + "}"; + } + case "lte" -> { + paramMap.put(key, text); + yield column + " <= #{map." + key + "}"; + } case "contains" -> { paramMap.put(key, "%" + text + "%"); yield column + " LIKE #{map." + key + "}"; @@ -1160,6 +1321,137 @@ public class WeFishServiceImpl implements WeFishService { }; } + private String buildWeWvaFilterCondition(DataSourceRequest.FilterDescriptor filter, + Map paramMap, + int[] indexHolder) { + if (filter == null) { + return ""; + } + if (StrUtil.isNotBlank(filter.getField())) { + return buildWeWvaLeafCondition(filter, paramMap, indexHolder); + } + if (CollUtil.isEmpty(filter.getFilters())) { + return ""; + } + List conditions = new ArrayList<>(); + for (DataSourceRequest.FilterDescriptor child : filter.getFilters()) { + String childSql = buildWeWvaFilterCondition(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 buildWeWvaLeafCondition(DataSourceRequest.FilterDescriptor filter, + Map paramMap, + int[] indexHolder) { + String column = mapWeWvaColumn(filter.getField()); + if (StrUtil.isBlank(column)) { + return ""; + } + String operator = StrUtil.blankToDefault(filter.getOperator(), "eq").toLowerCase(); + 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 = normalizeWeFishQgcValues(filter.getValue()); + if (values.isEmpty()) { + return ""; + } + List placeholders = new ArrayList<>(); + for (Object value : values) { + if (value == null || StrUtil.isBlank(String.valueOf(value).trim())) { + continue; + } + String key = "weWvaP" + indexHolder[0]++; + paramMap.put(key, String.valueOf(value).trim()); + placeholders.add("#{map." + key + "}"); + } + if (placeholders.isEmpty()) { + return ""; + } + return column + ("ni".equals(operator) ? " NOT IN (" : " IN (") + String.join(", ", placeholders) + ")"; + } + Object rawValue = filter.getValue(); + if (rawValue == null || StrUtil.isBlank(String.valueOf(rawValue).trim())) { + return ""; + } + String key = "weWvaP" + indexHolder[0]++; + String text = String.valueOf(rawValue).trim(); + boolean dateField = isWeWvaDateField(filter); + String valueExpr = buildWeWvaValueExpr(key, dateField, rawValue); + return switch (operator) { + case "eq" -> { + paramMap.put(key, text); + yield column + " = " + valueExpr; + } + case "neq" -> { + paramMap.put(key, text); + yield column + " <> " + valueExpr; + } + case "gt" -> { + paramMap.put(key, text); + yield column + " > " + valueExpr; + } + case "gte" -> { + paramMap.put(key, text); + yield column + " >= " + valueExpr; + } + case "lt" -> { + paramMap.put(key, text); + yield column + " < " + valueExpr; + } + case "lte" -> { + paramMap.put(key, text); + yield column + " <= " + valueExpr; + } + case "contains" -> { + paramMap.put(key, "%" + text + "%"); + yield column + " LIKE #{map." + key + "}"; + } + case "doesnotcontain" -> { + paramMap.put(key, "%" + text + "%"); + yield column + " NOT LIKE #{map." + key + "}"; + } + default -> ""; + }; + } + + private boolean isWeWvaDateField(DataSourceRequest.FilterDescriptor filter) { + if (filter == null || StrUtil.isBlank(filter.getField())) { + return false; + } + if ("tm".equalsIgnoreCase(filter.getField())) { + return true; + } + return "date".equalsIgnoreCase(filter.getDataType()); + } + + private String buildWeWvaValueExpr(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 mapWeMsstbprptColumn(String field) { if (StrUtil.isBlank(field)) { return null; @@ -1199,6 +1491,30 @@ public class WeFishServiceImpl implements WeFishService { }; } + private String mapWeWvaColumn(String field) { + if (StrUtil.isBlank(field)) { + return null; + } + return switch (field) { + case "id" -> "t.id"; + case "stcd" -> "t.stcd"; + case "stnm" -> "t.stnm"; + case "sttpCode" -> "t.sttpCode"; + case "tm" -> "t.tm"; + case "flnm" -> "t.flnm"; + case "imgPath" -> "t.imgPath"; + case "flpth" -> "t.flpth"; + case "fid" -> "t.fid"; + case "description" -> "t.description"; + case "rstcd" -> "t.rstcd"; + case "baseId" -> "t.baseId"; + case "hbrvcd" -> "t.hbrvcd"; + case "rvcd" -> "t.rvcd"; + case "orderIndex" -> "t.orderIndex"; + default -> null; + }; + } + private String buildWeMsstbprptOrderBySql(List sorts) { if (CollUtil.isEmpty(sorts)) { return ""; @@ -1243,6 +1559,28 @@ public class WeFishServiceImpl implements WeFishService { return " ORDER BY " + String.join(", ", orderByParts); } + private String buildWeWvaOrderBySql(List sorts) { + if (CollUtil.isEmpty(sorts)) { + return " ORDER BY t.tm DESC NULLS LAST"; + } + List orderByParts = new ArrayList<>(); + for (DataSourceRequest.SortDescriptor sort : sorts) { + if (sort == null || StrUtil.isBlank(sort.getField())) { + continue; + } + String column = mapWeWvaColumn(sort.getField()); + if (StrUtil.isBlank(column)) { + continue; + } + String direction = "desc".equalsIgnoreCase(sort.getDir()) ? "DESC" : "ASC"; + orderByParts.add(column + " " + direction + " NULLS LAST"); + } + if (orderByParts.isEmpty()) { + return " ORDER BY t.tm DESC NULLS LAST"; + } + return " ORDER BY " + String.join(", ", orderByParts); + } + private String buildWeFishListQgcGroupSql(String baseSql, GroupingInfo[] groupInfos) { if (groupInfos == null || groupInfos.length == 0) { return baseSql; From c0499f93dcc3fc877a407b95d62e58c1cb3b05d3 Mon Sep 17 00:00:00 2001 From: tangwei Date: Fri, 26 Jun 2026 10:59:53 +0800 Subject: [PATCH 25/32] =?UTF-8?q?feat:=20=E6=A0=B9=E6=8D=AE=E6=9D=A1?= =?UTF-8?q?=E4=BB=B6=E6=9F=A5=E8=AF=A2=E7=94=B5=E7=AB=99=E9=A1=B5=E6=B0=B4?= =?UTF-8?q?=E6=B8=A9=E5=9F=BA=E7=A1=80=E7=AB=99=E7=82=B9=E5=88=97=E8=A1=A8?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../wt/controller/SdWTMonitorController.java | 6 + .../qgc_env/wt/entity/vo/SdWtBaseInfoVO.java | 9 ++ .../wt/service/SdWtMonitorService.java | 2 + .../service/impl/SdWtMonitorServiceImpl.java | 131 +++++++++++++++--- 4 files changed, 127 insertions(+), 21 deletions(-) diff --git a/backend/src/main/java/com/yfd/platform/qgc_env/wt/controller/SdWTMonitorController.java b/backend/src/main/java/com/yfd/platform/qgc_env/wt/controller/SdWTMonitorController.java index e1bc5b59..f1c2c15c 100644 --- a/backend/src/main/java/com/yfd/platform/qgc_env/wt/controller/SdWTMonitorController.java +++ b/backend/src/main/java/com/yfd/platform/qgc_env/wt/controller/SdWTMonitorController.java @@ -197,6 +197,12 @@ public class SdWTMonitorController { return ResponseResult.successData(sdWtMonitorService.getMsstbprptList(dataSourceRequest)); } + @PostMapping("/msstbprpt/eng/GetKendoList") + @Operation(summary = "根据条件查询电站页水温基础站点列表") + public ResponseResult getMsstbprptEngList(@RequestBody DataSourceRequest dataSourceRequest) { + return ResponseResult.successData(sdWtMonitorService.getMsstbprptEngList(dataSourceRequest)); + } + @GetMapping("/msstbprpt/getStcdInfo") @Operation(summary = "根据站码查询单条水温基础数据") public ResponseResult getStcdInfo(@RequestParam String stcd) { diff --git a/backend/src/main/java/com/yfd/platform/qgc_env/wt/entity/vo/SdWtBaseInfoVO.java b/backend/src/main/java/com/yfd/platform/qgc_env/wt/entity/vo/SdWtBaseInfoVO.java index 034e0633..f88daf2f 100644 --- a/backend/src/main/java/com/yfd/platform/qgc_env/wt/entity/vo/SdWtBaseInfoVO.java +++ b/backend/src/main/java/com/yfd/platform/qgc_env/wt/entity/vo/SdWtBaseInfoVO.java @@ -74,6 +74,15 @@ public class SdWtBaseInfoVO implements Serializable { @Schema(description = "所属电站编码") private String rstcd; + @Schema(description = "设备类型") + private Integer wtDeviceType; + + @Schema(description = "接入类型") + private Integer dtinType; + + @Schema(description = "监测方式") + private Integer mway; + @Schema(description = "所属测站编码") private String stCode; diff --git a/backend/src/main/java/com/yfd/platform/qgc_env/wt/service/SdWtMonitorService.java b/backend/src/main/java/com/yfd/platform/qgc_env/wt/service/SdWtMonitorService.java index e8aab7ec..a6fd35f2 100644 --- a/backend/src/main/java/com/yfd/platform/qgc_env/wt/service/SdWtMonitorService.java +++ b/backend/src/main/java/com/yfd/platform/qgc_env/wt/service/SdWtMonitorService.java @@ -22,6 +22,8 @@ public interface SdWtMonitorService { DataSourceResult getMsstbprptList(DataSourceRequest dataSourceRequest); + DataSourceResult getMsstbprptEngList(DataSourceRequest dataSourceRequest); + WtBaseInfoVo getStcdInfo(String stcd); DataSourceResult getCxDetailList(DataSourceRequest dataSourceRequest); diff --git a/backend/src/main/java/com/yfd/platform/qgc_env/wt/service/impl/SdWtMonitorServiceImpl.java b/backend/src/main/java/com/yfd/platform/qgc_env/wt/service/impl/SdWtMonitorServiceImpl.java index c34f1641..5e05c91b 100644 --- a/backend/src/main/java/com/yfd/platform/qgc_env/wt/service/impl/SdWtMonitorServiceImpl.java +++ b/backend/src/main/java/com/yfd/platform/qgc_env/wt/service/impl/SdWtMonitorServiceImpl.java @@ -856,14 +856,31 @@ public class SdWtMonitorServiceImpl implements SdWtMonitorService { StringBuilder sql = new StringBuilder(); sql.append("SELECT ").append(selectSql).append(" ") - .append("FROM SD_WT_B_H wt ") - .append("LEFT JOIN SD_ENGINFO_B_H eng ON eng.STCD = wt.RSTCD AND NVL(eng.IS_DELETED, 0) = 0 ") - .append("LEFT JOIN SD_HYDROBASE hb ON hb.BASEID = eng.BASE_ID AND NVL(hb.IS_DELETED, 0) = 0 ") - .append("LEFT JOIN SD_HBRV_DIC hbrv ON hbrv.HBRVCD = eng.HBRVCD AND hbrv.BASEID = eng.BASE_ID AND NVL(hbrv.IS_DELETED, 0) = 0 ") - .append("LEFT JOIN SD_STTP_B sttp ON sttp.STTP_CODE = wt.STTP AND NVL(sttp.IS_DELETED, 0) = 0 ") - .append("LEFT JOIN (SELECT DISTINCT STCD FROM SD_WTRV_R WHERE IS_DELETED = 0 AND TM >= SYSDATE - 1) rvRecent ON rvRecent.STCD = wt.STCD ") - .append("LEFT JOIN (SELECT DISTINCT STCD FROM SD_WTVT_R WHERE IS_DELETED = 0 AND TM >= SYSDATE - 1) vtRecent ON vtRecent.STCD = wt.STCD ") - .append("WHERE NVL(wt.IS_DELETED, 0) = 0 AND NVL(wt.DTIN_TYPE, 0) = 0 "); + .append(buildWtMsstbprptFromSql()); + + Map paramMap = new HashMap<>(); + appendWtMsstbprptFilters(sql, paramMap, dataSourceRequest == null ? null : dataSourceRequest.getFilter()); + sql.append(buildVmsstbprptOrderBySql(dataSourceRequest == null ? null : dataSourceRequest.getSort())); + + DataSourceLoadOptionsBase loadOptions = dataSourceRequest.toDevRequest(); + Page page = QgcQueryWrapperUtil.buildPage(loadOptions, loadOptions.getSkip(), loadOptions.getTake()); + List list = microservicDynamicSQLMapper.pageAllListWithResultType(page, sql.toString(), paramMap, SdWtBaseInfoVO.class); + + DataSourceResult result = new DataSourceResult<>(); + result.setData(list); + result.setTotal(page != null ? page.getTotal() : list.size()); + result.setAggregates(new HashMap<>()); + return result; + } + + @Override + public DataSourceResult getMsstbprptEngList(DataSourceRequest dataSourceRequest) { + List selectFields = dataSourceRequest == null ? null : dataSourceRequest.getSelect(); + String selectSql = buildWtMsstbprptEngSelectSql(selectFields); + + StringBuilder sql = new StringBuilder(); + sql.append("SELECT ").append(selectSql).append(" ") + .append(buildWtMsstbprptFromSql()); Map paramMap = new HashMap<>(); appendWtMsstbprptFilters(sql, paramMap, dataSourceRequest == null ? null : dataSourceRequest.getFilter()); @@ -1980,6 +1997,16 @@ public class SdWtMonitorServiceImpl implements SdWtMonitorService { orderColumns.add("NVL(dtin, -1) " + dir + " NULLS LAST"); } else if ("dtinName".equals(field)) { orderColumns.add("CASE WHEN NVL(dtin, 0) = 1 THEN '已接入' ELSE '未接入' END " + dir + " NULLS LAST"); + } else if ("wtDeviceType".equals(field)) { + orderColumns.add("NVL(wtDeviceType, -1) " + dir + " NULLS LAST"); + } else if ("dtinType".equals(field)) { + orderColumns.add("NVL(dtinType, -1) " + dir + " NULLS LAST"); + } else if ("mway".equals(field)) { + orderColumns.add("NVL(mway, -1) " + dir + " NULLS LAST"); + } else if ("lgtd".equals(field)) { + orderColumns.add("lgtd " + dir + " NULLS LAST"); + } else if ("lttd".equals(field)) { + orderColumns.add("lttd " + dir + " NULLS LAST"); } } } @@ -1991,6 +2018,54 @@ public class SdWtMonitorServiceImpl implements SdWtMonitorService { } private String buildWtMsstbprptSelectSql(List selectFields) { + Map columnMap = buildWtMsstbprptColumnMap(); + + List actualColumns = new ArrayList<>(); + if (selectFields != null && !selectFields.isEmpty()) { + for (String field : selectFields) { + String column = columnMap.get(field); + if (StrUtil.isNotBlank(column)) { + actualColumns.add(column); + } + } + } + if (actualColumns.isEmpty()) { + actualColumns.addAll(columnMap.values()); + } + return String.join(", ", actualColumns); + } + + private String buildWtMsstbprptEngSelectSql(List selectFields) { + Map columnMap = buildWtMsstbprptColumnMap(); + List actualColumns = new ArrayList<>(); + if (selectFields == null || selectFields.isEmpty()) { + actualColumns.add(columnMap.get("stcd")); + actualColumns.add(columnMap.get("stnm")); + actualColumns.add(columnMap.get("wtDeviceType")); + actualColumns.add(columnMap.get("dtinType")); + actualColumns.add(columnMap.get("mway")); + actualColumns.add(columnMap.get("lgtd")); + actualColumns.add(columnMap.get("lttd")); + actualColumns.add(columnMap.get("baseId")); + actualColumns.add(columnMap.get("baseName")); + } else { + for (String field : selectFields) { + String column = columnMap.get(field); + if (StrUtil.isNotBlank(column)) { + actualColumns.add(column); + } + } + } + ensureWtMsstbprptColumn(actualColumns, columnMap, "stcd"); + ensureWtMsstbprptColumn(actualColumns, columnMap, "stnm"); + ensureWtMsstbprptColumn(actualColumns, columnMap, "lgtd"); + ensureWtMsstbprptColumn(actualColumns, columnMap, "lttd"); + ensureWtMsstbprptColumn(actualColumns, columnMap, "baseId"); + ensureWtMsstbprptColumn(actualColumns, columnMap, "baseName"); + return String.join(", ", actualColumns); + } + + private Map buildWtMsstbprptColumnMap() { Map columnMap = new LinkedHashMap<>(); columnMap.put("baseName", "hb.BASENAME AS baseName"); columnMap.put("baseId", "hb.BASEID AS baseId"); @@ -2009,31 +2084,43 @@ public class SdWtMonitorServiceImpl implements SdWtMonitorService { columnMap.put("stcd", "wt.STCD AS stcd"); columnMap.put("fhstcd", "wt.FHSTCD AS fhstcd"); columnMap.put("rstcd", "wt.RSTCD AS rstcd"); -// columnMap.put("bldsttCcodeName", "CASE WHEN wt.BLDSTT_CODE IN ('1', '10', '11') THEN '已建' WHEN wt.BLDSTT_CODE IN ('2', '7', '8') THEN '在建' ELSE '未建/规划' END AS bldsttCcodeName"); columnMap.put("bldsttCcodeName", "CASE WHEN wt.BLDSTT_CODE = 0 THEN '未建/规划' " + "WHEN wt.BLDSTT_CODE = 1 THEN '在建' " + "WHEN wt.BLDSTT_CODE = 2 THEN '已建' " + - "ELSE '未知' END"); + "ELSE '未知' END AS bldsttCcodeName"); columnMap.put("bldsttCcode", "wt.BLDSTT_CODE AS bldsttCcode"); columnMap.put("stCode", "NULL AS stCode"); columnMap.put("stName", "NULL AS stName"); columnMap.put("dvtp", "eng.DVTP AS dvtp"); columnMap.put("hbrvcd", "eng.HBRVCD AS hbrvcd"); + columnMap.put("lgtd", "wt.LGTD AS lgtd"); + columnMap.put("lttd", "wt.LTTD AS lttd"); + columnMap.put("wtDeviceType", "wt.WT_DEVICE_TYPE AS wtDeviceType"); + columnMap.put("dtinType", "wt.DTIN_TYPE AS dtinType"); + columnMap.put("mway", "wt.MWAY AS mway"); + return columnMap; + } - List actualColumns = new ArrayList<>(); - if (selectFields != null && !selectFields.isEmpty()) { - for (String field : selectFields) { - String column = columnMap.get(field); - if (StrUtil.isNotBlank(column)) { - actualColumns.add(column); - } - } + private void ensureWtMsstbprptColumn(List actualColumns, Map columnMap, String field) { + String column = columnMap.get(field); + if (StrUtil.isBlank(column)) { + return; } - if (actualColumns.isEmpty()) { - actualColumns.addAll(columnMap.values()); + if (!actualColumns.contains(column)) { + actualColumns.add(column); } - return String.join(", ", actualColumns); + } + + private String buildWtMsstbprptFromSql() { + return "FROM SD_WT_B_H wt " + + "LEFT JOIN SD_ENGINFO_B_H eng ON eng.STCD = wt.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 " + + "LEFT JOIN SD_STTP_B sttp ON sttp.STTP_CODE = wt.STTP AND NVL(sttp.IS_DELETED, 0) = 0 " + + "LEFT JOIN (SELECT DISTINCT STCD FROM SD_WTRV_R WHERE IS_DELETED = 0 AND TM >= SYSDATE - 1) rvRecent ON rvRecent.STCD = wt.STCD " + + "LEFT JOIN (SELECT DISTINCT STCD FROM SD_WTVT_R WHERE IS_DELETED = 0 AND TM >= SYSDATE - 1) vtRecent ON vtRecent.STCD = wt.STCD " + + "WHERE NVL(wt.IS_DELETED, 0) = 0 AND NVL(wt.DTIN_TYPE, 0) = 0 "; } private void appendWtMsstbprptFilters(StringBuilder sql, @@ -2061,6 +2148,8 @@ public class SdWtMonitorServiceImpl implements SdWtMonitorService { appendWtMsstbprptLeaf(sql, paramMap, paramKey, "wt.RSTCD", operator, value); } else if ("baseId".equals(field)) { appendWtMsstbprptLeaf(sql, paramMap, paramKey, "eng.BASE_ID", operator, value); + } else if ("sttpFullPath".equals(field)) { + appendWtMsstbprptLeaf(sql, paramMap, paramKey, "sttp.FULL_PATH", operator, value); } else if ("mway".equals(field)) { appendWtMsstbprptLeaf(sql, paramMap, paramKey, "wt.MWAY", operator, value); } else if ("dtin".equals(field)) { From 8e3fa72fd109295ce502616f0dab4445dbf6b5d5 Mon Sep 17 00:00:00 2001 From: tangwei Date: Fri, 26 Jun 2026 11:18:36 +0800 Subject: [PATCH 26/32] =?UTF-8?q?feat:=20=E6=B0=B4=E6=B8=A9=E6=97=A5?= =?UTF-8?q?=E6=95=B0=E6=8D=AE=E7=BB=9F=E8=AE=A1=E4=BF=AE=E6=AD=A3=E7=BB=93?= =?UTF-8?q?=E6=9E=9C=E6=95=B0=E6=8D=AE?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../platform/qgc_base/domain/SdFpssBH.java | 2 +- .../qgc_env/fp/entity/vo/FpVmsstbprptVo.java | 5 +- .../wt/controller/SdWTMonitorController.java | 6 + .../wt/entity/vo/WtrvAmendResultVo.java | 38 +++ .../wt/service/SdWtMonitorService.java | 3 + .../service/impl/SdWtMonitorServiceImpl.java | 270 ++++++++++++++++++ 6 files changed, 322 insertions(+), 2 deletions(-) create mode 100644 backend/src/main/java/com/yfd/platform/qgc_env/wt/entity/vo/WtrvAmendResultVo.java diff --git a/backend/src/main/java/com/yfd/platform/qgc_base/domain/SdFpssBH.java b/backend/src/main/java/com/yfd/platform/qgc_base/domain/SdFpssBH.java index 5c267806..66d4e2e9 100644 --- a/backend/src/main/java/com/yfd/platform/qgc_base/domain/SdFpssBH.java +++ b/backend/src/main/java/com/yfd/platform/qgc_base/domain/SdFpssBH.java @@ -308,7 +308,7 @@ public class SdFpssBH implements Serializable { /** * 设计过鱼规模,单位:尾 */ - private Long sjgycnt; + private String sjgycnt; /** * 主要过鱼对象{[code:鱼编码1,name:鱼名称1,数量],[code:鱼编码2,name:鱼名称2]...} diff --git a/backend/src/main/java/com/yfd/platform/qgc_env/fp/entity/vo/FpVmsstbprptVo.java b/backend/src/main/java/com/yfd/platform/qgc_env/fp/entity/vo/FpVmsstbprptVo.java index 83915608..a657d6a9 100644 --- a/backend/src/main/java/com/yfd/platform/qgc_env/fp/entity/vo/FpVmsstbprptVo.java +++ b/backend/src/main/java/com/yfd/platform/qgc_env/fp/entity/vo/FpVmsstbprptVo.java @@ -199,8 +199,11 @@ public class FpVmsstbprptVo implements Serializable { @Schema(description = "升鱼机集鱼槽水深") private String syjwdp; +// @Schema(description = "设计过鱼规模") +// private Integer sjgycnt; + @Schema(description = "设计过鱼规模") - private Integer sjgycnt; + private String sjgycnt; @Schema(description = "主要过鱼对象描述") private String zygydxms; diff --git a/backend/src/main/java/com/yfd/platform/qgc_env/wt/controller/SdWTMonitorController.java b/backend/src/main/java/com/yfd/platform/qgc_env/wt/controller/SdWTMonitorController.java index f1c2c15c..e6c18c3a 100644 --- a/backend/src/main/java/com/yfd/platform/qgc_env/wt/controller/SdWTMonitorController.java +++ b/backend/src/main/java/com/yfd/platform/qgc_env/wt/controller/SdWTMonitorController.java @@ -203,6 +203,12 @@ public class SdWTMonitorController { return ResponseResult.successData(sdWtMonitorService.getMsstbprptEngList(dataSourceRequest)); } + @PostMapping("/wtrvAmend/dayAmend/GetKendoListCust") + @Operation(summary = "水温日数据统计修正结果数据") + public ResponseResult getWtrvAmendDayList(@RequestBody DataSourceRequest dataSourceRequest) { + return ResponseResult.successData(sdWtMonitorService.getWtrvAmendDayList(dataSourceRequest)); + } + @GetMapping("/msstbprpt/getStcdInfo") @Operation(summary = "根据站码查询单条水温基础数据") public ResponseResult getStcdInfo(@RequestParam String stcd) { diff --git a/backend/src/main/java/com/yfd/platform/qgc_env/wt/entity/vo/WtrvAmendResultVo.java b/backend/src/main/java/com/yfd/platform/qgc_env/wt/entity/vo/WtrvAmendResultVo.java new file mode 100644 index 00000000..330d668c --- /dev/null +++ b/backend/src/main/java/com/yfd/platform/qgc_env/wt/entity/vo/WtrvAmendResultVo.java @@ -0,0 +1,38 @@ +package com.yfd.platform.qgc_env.wt.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 WtrvAmendResultVo { + + @Schema(description = "站点编码") + private String stcd; + + @Schema(description = "日期") + @JsonFormat(pattern = "yyyy-MM-dd") + private Date dt; + + @Schema(description = "温度") + private BigDecimal wt; + + @Schema(description = "站点名称") + private String stnm; + + @Schema(description = "电站编码") + private String rstcd; + + @Schema(description = "电站名称") + private String ennm; + + @Schema(description = "基地编码") + private String baseId; + + @Schema(description = "基地名称") + private String baseName; +} diff --git a/backend/src/main/java/com/yfd/platform/qgc_env/wt/service/SdWtMonitorService.java b/backend/src/main/java/com/yfd/platform/qgc_env/wt/service/SdWtMonitorService.java index a6fd35f2..f4639357 100644 --- a/backend/src/main/java/com/yfd/platform/qgc_env/wt/service/SdWtMonitorService.java +++ b/backend/src/main/java/com/yfd/platform/qgc_env/wt/service/SdWtMonitorService.java @@ -11,6 +11,7 @@ import com.yfd.platform.qgc_env.wt.entity.vo.SttpInfoVo; import com.yfd.platform.qgc_env.wt.entity.vo.WbsbVo; import com.yfd.platform.qgc_env.wt.entity.vo.WtBaseInfoVo; import com.yfd.platform.qgc_env.wt.entity.vo.WtrvVo; +import com.yfd.platform.qgc_env.wt.entity.vo.WtrvAmendResultVo; import java.util.List; @@ -24,6 +25,8 @@ public interface SdWtMonitorService { DataSourceResult getMsstbprptEngList(DataSourceRequest dataSourceRequest); + DataSourceResult getWtrvAmendDayList(DataSourceRequest dataSourceRequest); + WtBaseInfoVo getStcdInfo(String stcd); DataSourceResult getCxDetailList(DataSourceRequest dataSourceRequest); diff --git a/backend/src/main/java/com/yfd/platform/qgc_env/wt/service/impl/SdWtMonitorServiceImpl.java b/backend/src/main/java/com/yfd/platform/qgc_env/wt/service/impl/SdWtMonitorServiceImpl.java index 5e05c91b..b34a64a1 100644 --- a/backend/src/main/java/com/yfd/platform/qgc_env/wt/service/impl/SdWtMonitorServiceImpl.java +++ b/backend/src/main/java/com/yfd/platform/qgc_env/wt/service/impl/SdWtMonitorServiceImpl.java @@ -16,6 +16,7 @@ import com.yfd.platform.qgc_env.wt.entity.vo.WbsbVo; import com.yfd.platform.qgc_env.wt.entity.vo.WtBaseInfoVo; import com.yfd.platform.qgc_env.wt.entity.vo.WtFishVo; import com.yfd.platform.qgc_env.wt.entity.vo.WtTreeStcdVo; +import com.yfd.platform.qgc_env.wt.entity.vo.WtrvAmendResultVo; import com.yfd.platform.qgc_env.wt.entity.vo.WtrvVo; import com.yfd.platform.qgc_env.wt.mapper.SdWtMonitorMapper; import com.yfd.platform.qgc_env.wt.service.SdWtMonitorService; @@ -897,6 +898,37 @@ public class SdWtMonitorServiceImpl implements SdWtMonitorService { return result; } + @Override + public DataSourceResult getWtrvAmendDayList(DataSourceRequest dataSourceRequest) { + List selectFields = dataSourceRequest == null ? null : dataSourceRequest.getSelect(); + String selectSql = buildWtrvAmendSelectSql(selectFields); + + StringBuilder sql = new StringBuilder(); + sql.append("SELECT ").append(selectSql).append(" FROM (") + .append(buildWtrvAmendMergedSql()) + .append(") t WHERE 1 = 1 "); + + Map paramMap = new HashMap<>(); + String filterSql = buildWtrvAmendFilterCondition(dataSourceRequest == null ? null : dataSourceRequest.getFilter(), + paramMap, new int[]{0}); + if (StrUtil.isNotBlank(filterSql)) { + sql.append(" AND ").append(filterSql); + } + sql.append(buildWtrvAmendOrderBySql(dataSourceRequest == null ? null : dataSourceRequest.getSort())); + + DataSourceLoadOptionsBase loadOptions = dataSourceRequest == null ? null : dataSourceRequest.toDevRequest(); + Page page = loadOptions == null ? null + : QgcQueryWrapperUtil.buildPage(loadOptions, loadOptions.getSkip(), loadOptions.getTake()); + List list = microservicDynamicSQLMapper.pageAllListWithResultType(page, + sql.toString(), paramMap, WtrvAmendResultVo.class); + + DataSourceResult result = new DataSourceResult<>(); + result.setData(list); + result.setTotal(page != null ? page.getTotal() : list.size()); + result.setAggregates(new HashMap<>()); + return result; + } + @Override public DataSourceResult getCxDetailList(DataSourceRequest dataSourceRequest) { List filters = new ArrayList<>(); @@ -1819,6 +1851,244 @@ public class SdWtMonitorServiceImpl implements SdWtMonitorService { return " ORDER BY " + String.join(", ", orderColumns); } + private String buildWtrvAmendMergedSql() { + return "SELECT " + + "dayData.STCD AS stcd, " + + "dayData.DT AS dt, " + + "NVL(amendData.WT, dayData.WT) AS wt, " + + "wt.STNM AS stnm, " + + "wt.RSTCD AS rstcd, " + + "eng.ENNM AS ennm, " + + "eng.BASE_ID AS baseId, " + + "hb.BASENAME AS baseName " + + "FROM SD_WTRVDAY_S dayData " + + "INNER JOIN SD_WT_B_H wt ON dayData.STCD = wt.STCD " + + " AND wt.STTP = 'WTRV' " + + " AND NVL(wt.IS_DELETED, 0) = 0 " + + "LEFT JOIN SD_WTRVAMEND_S amendData ON amendData.STCD = dayData.STCD " + + " AND amendData.DT = dayData.DT " + + " AND NVL(amendData.IS_DELETED, 0) = 0 " + + "LEFT JOIN SD_ENGINFO_B_H eng ON eng.STCD = wt.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 " + + "WHERE NVL(dayData.IS_DELETED, 0) = 0 " + + "UNION ALL " + + "SELECT " + + "amendData.STCD AS stcd, " + + "amendData.DT AS dt, " + + "amendData.WT AS wt, " + + "wt.STNM AS stnm, " + + "wt.RSTCD AS rstcd, " + + "eng.ENNM AS ennm, " + + "eng.BASE_ID AS baseId, " + + "hb.BASENAME AS baseName " + + "FROM SD_WTRVAMEND_S amendData " + + "INNER JOIN SD_WT_B_H wt ON amendData.STCD = wt.STCD " + + " AND wt.STTP = 'WTRV' " + + " AND NVL(wt.IS_DELETED, 0) = 0 " + + "LEFT JOIN SD_ENGINFO_B_H eng ON eng.STCD = wt.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 " + + "WHERE NVL(amendData.IS_DELETED, 0) = 0 " + + "AND NOT EXISTS ( " + + " SELECT 1 FROM SD_WTRVDAY_S dayData " + + " WHERE dayData.STCD = amendData.STCD " + + " AND dayData.DT = amendData.DT " + + " AND NVL(dayData.IS_DELETED, 0) = 0 " + + ")"; + } + + private String buildWtrvAmendSelectSql(List selectFields) { + Map columnMap = buildWtrvAmendColumnMap(); + List actualColumns = new ArrayList<>(); + if (selectFields != null && !selectFields.isEmpty()) { + for (String field : selectFields) { + String column = columnMap.get(field); + if (StrUtil.isNotBlank(column)) { + actualColumns.add(column); + } + } + } + if (actualColumns.isEmpty()) { + actualColumns.addAll(columnMap.values()); + } + return String.join(", ", actualColumns); + } + + private Map buildWtrvAmendColumnMap() { + Map columnMap = new LinkedHashMap<>(); + columnMap.put("stcd", "t.stcd AS stcd"); + columnMap.put("dt", "t.dt AS dt"); + columnMap.put("wt", "t.wt AS wt"); + columnMap.put("stnm", "t.stnm AS stnm"); + columnMap.put("rstcd", "t.rstcd AS rstcd"); + columnMap.put("ennm", "t.ennm AS ennm"); + columnMap.put("baseId", "t.baseId AS baseId"); + columnMap.put("baseName", "t.baseName AS baseName"); + return columnMap; + } + + private String buildWtrvAmendFilterCondition(DataSourceRequest.FilterDescriptor filter, + Map paramMap, + int[] indexHolder) { + if (filter == null) { + return ""; + } + if (filter.getFilters() != null && !filter.getFilters().isEmpty()) { + List conditions = new ArrayList<>(); + for (DataSourceRequest.FilterDescriptor child : filter.getFilters()) { + String condition = buildWtrvAmendFilterCondition(child, paramMap, indexHolder); + if (StrUtil.isNotBlank(condition)) { + conditions.add("(" + condition + ")"); + } + } + if (conditions.isEmpty()) { + return ""; + } + String logic = "or".equalsIgnoreCase(filter.getLogic()) ? " OR " : " AND "; + return String.join(logic, conditions); + } + return buildWtrvAmendLeafCondition(filter, paramMap, indexHolder); + } + + private String buildWtrvAmendLeafCondition(DataSourceRequest.FilterDescriptor filter, + Map paramMap, + int[] indexHolder) { + String column = mapWtrvAmendColumn(filter == null ? null : filter.getField()); + if (StrUtil.isBlank(column) || StrUtil.isBlank(filter.getOperator())) { + return ""; + } + String operator = filter.getOperator().toLowerCase(); + Object rawValue = 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 (rawValue == null) { + return ""; + } + String paramKey = "wtrvAmendP" + indexHolder[0]++; + boolean dateField = isWtrvAmendDateField(filter); + if ("in".equals(operator) || "ni".equals(operator)) { + List values = normalizeToList(rawValue); + if (values.isEmpty()) { + return ""; + } + List placeholders = new ArrayList<>(); + int itemIndex = 0; + for (Object value : values) { + String itemKey = paramKey + "_" + itemIndex++; + paramMap.put(itemKey, String.valueOf(value).trim()); + placeholders.add(buildWtrvAmendValueExpr(itemKey, dateField, value)); + } + return column + ("ni".equals(operator) ? " NOT IN (" : " IN (") + String.join(", ", placeholders) + ")"; + } + String text = String.valueOf(rawValue).trim(); + paramMap.put(paramKey, text); + String valueExpr = buildWtrvAmendValueExpr(paramKey, dateField, rawValue); + return switch (operator) { + case "eq" -> column + " = " + valueExpr; + case "neq" -> column + " <> " + valueExpr; + case "gt" -> column + " > " + valueExpr; + case "gte" -> column + " >= " + valueExpr; + case "lt" -> column + " < " + valueExpr; + case "lte" -> column + " <= " + valueExpr; + case "contains" -> { + paramMap.put(paramKey, "%" + text + "%"); + yield column + " LIKE #{map." + paramKey + "}"; + } + case "doesnotcontain" -> { + paramMap.put(paramKey, "%" + text + "%"); + yield column + " NOT LIKE #{map." + paramKey + "}"; + } + case "startswith" -> { + paramMap.put(paramKey, text + "%"); + yield column + " LIKE #{map." + paramKey + "}"; + } + case "endswith" -> { + paramMap.put(paramKey, "%" + text); + yield column + " LIKE #{map." + paramKey + "}"; + } + default -> ""; + }; + } + + private String mapWtrvAmendColumn(String field) { + if (StrUtil.isBlank(field)) { + return null; + } + return switch (field) { + case "stcd" -> "t.stcd"; + case "dt" -> "t.dt"; + case "wt" -> "t.wt"; + case "stnm" -> "t.stnm"; + case "rstcd" -> "t.rstcd"; + case "ennm" -> "t.ennm"; + case "baseId" -> "t.baseId"; + case "baseName" -> "t.baseName"; + default -> null; + }; + } + + private String buildWtrvAmendOrderBySql(List sortList) { + List orderColumns = new ArrayList<>(); + if (sortList != null) { + for (DataSourceRequest.SortDescriptor sortDescriptor : sortList) { + String column = mapWtrvAmendColumn(sortDescriptor.getField()); + if (StrUtil.isBlank(column)) { + continue; + } + String dir = "desc".equalsIgnoreCase(sortDescriptor.getDir()) || "des".equalsIgnoreCase(sortDescriptor.getDir()) ? "DESC" : "ASC"; + orderColumns.add(column + " " + dir + ("t.dt".equals(column) || "t.wt".equals(column) ? " NULLS LAST" : "")); + } + } + if (orderColumns.isEmpty()) { + return " ORDER BY t.dt DESC, t.stcd ASC"; + } + return " ORDER BY " + String.join(", ", orderColumns); + } + + private boolean isWtrvAmendDateField(DataSourceRequest.FilterDescriptor filter) { + if (filter == null || StrUtil.isBlank(filter.getField())) { + return false; + } + if ("dt".equalsIgnoreCase(filter.getField())) { + return true; + } + return "date".equalsIgnoreCase(filter.getDataType()); + } + + private String buildWtrvAmendValueExpr(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 List normalizeToList(Object value) { + if (value == null) { + return Collections.emptyList(); + } + if (value instanceof List list) { + return list.stream().filter(Objects::nonNull).collect(Collectors.toList()); + } + return Collections.singletonList(value); + } + private String buildSttpInfoFilterCondition(DataSourceRequest.FilterDescriptor filter, Map paramMap, int[] indexHolder) { From de480e3e1923fc51f6c64e4cf6b20468e4dd155d Mon Sep 17 00:00:00 2001 From: tangwei Date: Fri, 26 Jun 2026 11:35:07 +0800 Subject: [PATCH 27/32] =?UTF-8?q?feat:=20=E4=BF=9D=E5=AD=98=E4=BF=AE?= =?UTF-8?q?=E6=AD=A3=E5=90=8E=E7=9A=84=E6=B2=B3=E9=81=93=E6=B0=B4=E6=B8=A9?= =?UTF-8?q?=E6=97=A5=E6=95=B0=E6=8D=AE?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../wt/controller/SdWTMonitorController.java | 9 +++ .../qgc_env/wt/entity/vo/WtrvAmendSaveVo.java | 20 +++++ .../wt/service/SdWtMonitorService.java | 3 + .../service/impl/SdWtMonitorServiceImpl.java | 76 +++++++++++++++++++ 4 files changed, 108 insertions(+) create mode 100644 backend/src/main/java/com/yfd/platform/qgc_env/wt/entity/vo/WtrvAmendSaveVo.java diff --git a/backend/src/main/java/com/yfd/platform/qgc_env/wt/controller/SdWTMonitorController.java b/backend/src/main/java/com/yfd/platform/qgc_env/wt/controller/SdWTMonitorController.java index e6c18c3a..6dccdf94 100644 --- a/backend/src/main/java/com/yfd/platform/qgc_env/wt/controller/SdWTMonitorController.java +++ b/backend/src/main/java/com/yfd/platform/qgc_env/wt/controller/SdWTMonitorController.java @@ -9,6 +9,7 @@ import com.yfd.platform.common.exception.BizException; import com.yfd.platform.config.ResponseResult; import com.yfd.platform.qgc_base.entity.vo.BatchDeleteAo; import com.yfd.platform.qgc_env.wt.entity.vo.WtrvInfo; +import com.yfd.platform.qgc_env.wt.entity.vo.WtrvAmendSaveVo; import com.yfd.platform.qgc_env.wt.service.*; import com.yfd.platform.utils.QgcQueryWrapperUtil; import io.swagger.v3.oas.annotations.Operation; @@ -17,6 +18,7 @@ import jakarta.annotation.Resource; import org.springframework.validation.annotation.Validated; import org.springframework.web.bind.annotation.*; +import java.util.List; import java.util.Map; @RestController @@ -209,6 +211,13 @@ public class SdWTMonitorController { return ResponseResult.successData(sdWtMonitorService.getWtrvAmendDayList(dataSourceRequest)); } + @PostMapping("/wtrvAmend/dayAmend/saveAmendData") + @Operation(summary = "保存修正后的河道水温日数据") + public ResponseResult saveWtrvAmendData(@RequestBody List amendDataList) { + sdWtMonitorService.saveWtrvAmendData(amendDataList); + return ResponseResult.success(); + } + @GetMapping("/msstbprpt/getStcdInfo") @Operation(summary = "根据站码查询单条水温基础数据") public ResponseResult getStcdInfo(@RequestParam String stcd) { diff --git a/backend/src/main/java/com/yfd/platform/qgc_env/wt/entity/vo/WtrvAmendSaveVo.java b/backend/src/main/java/com/yfd/platform/qgc_env/wt/entity/vo/WtrvAmendSaveVo.java new file mode 100644 index 00000000..29482d0c --- /dev/null +++ b/backend/src/main/java/com/yfd/platform/qgc_env/wt/entity/vo/WtrvAmendSaveVo.java @@ -0,0 +1,20 @@ +package com.yfd.platform.qgc_env.wt.entity.vo; + +import io.swagger.v3.oas.annotations.media.Schema; +import lombok.Data; + +import java.math.BigDecimal; + +@Data +@Schema(description = "河道水温日修正保存入参") +public class WtrvAmendSaveVo { + + @Schema(description = "站点编码") + private String stcd; + + @Schema(description = "日期,支持 yyyy-MM-dd 或 yyyy-MM-dd HH:mm:ss") + private String dt; + + @Schema(description = "修正后水温") + private BigDecimal wt; +} diff --git a/backend/src/main/java/com/yfd/platform/qgc_env/wt/service/SdWtMonitorService.java b/backend/src/main/java/com/yfd/platform/qgc_env/wt/service/SdWtMonitorService.java index f4639357..c6d44008 100644 --- a/backend/src/main/java/com/yfd/platform/qgc_env/wt/service/SdWtMonitorService.java +++ b/backend/src/main/java/com/yfd/platform/qgc_env/wt/service/SdWtMonitorService.java @@ -10,6 +10,7 @@ import com.yfd.platform.qgc_env.wt.entity.vo.SdYearDetailVO; import com.yfd.platform.qgc_env.wt.entity.vo.SttpInfoVo; import com.yfd.platform.qgc_env.wt.entity.vo.WbsbVo; import com.yfd.platform.qgc_env.wt.entity.vo.WtBaseInfoVo; +import com.yfd.platform.qgc_env.wt.entity.vo.WtrvAmendSaveVo; import com.yfd.platform.qgc_env.wt.entity.vo.WtrvVo; import com.yfd.platform.qgc_env.wt.entity.vo.WtrvAmendResultVo; @@ -27,6 +28,8 @@ public interface SdWtMonitorService { DataSourceResult getWtrvAmendDayList(DataSourceRequest dataSourceRequest); + void saveWtrvAmendData(List amendDataList); + WtBaseInfoVo getStcdInfo(String stcd); DataSourceResult getCxDetailList(DataSourceRequest dataSourceRequest); diff --git a/backend/src/main/java/com/yfd/platform/qgc_env/wt/service/impl/SdWtMonitorServiceImpl.java b/backend/src/main/java/com/yfd/platform/qgc_env/wt/service/impl/SdWtMonitorServiceImpl.java index b34a64a1..fa485604 100644 --- a/backend/src/main/java/com/yfd/platform/qgc_env/wt/service/impl/SdWtMonitorServiceImpl.java +++ b/backend/src/main/java/com/yfd/platform/qgc_env/wt/service/impl/SdWtMonitorServiceImpl.java @@ -1,5 +1,6 @@ package com.yfd.platform.qgc_env.wt.service.impl; +import cn.hutool.core.date.DateUtil; import cn.hutool.core.util.StrUtil; import com.baomidou.mybatisplus.extension.plugins.pagination.Page; import com.yfd.platform.common.*; @@ -17,13 +18,16 @@ import com.yfd.platform.qgc_env.wt.entity.vo.WtBaseInfoVo; import com.yfd.platform.qgc_env.wt.entity.vo.WtFishVo; import com.yfd.platform.qgc_env.wt.entity.vo.WtTreeStcdVo; import com.yfd.platform.qgc_env.wt.entity.vo.WtrvAmendResultVo; +import com.yfd.platform.qgc_env.wt.entity.vo.WtrvAmendSaveVo; import com.yfd.platform.qgc_env.wt.entity.vo.WtrvVo; import com.yfd.platform.qgc_env.wt.mapper.SdWtMonitorMapper; import com.yfd.platform.qgc_env.wt.service.SdWtMonitorService; import com.yfd.platform.utils.QgcQueryWrapperUtil; import jakarta.annotation.Resource; import lombok.Data; +import org.springframework.jdbc.core.JdbcTemplate; import org.springframework.stereotype.Service; +import org.springframework.transaction.annotation.Transactional; import java.math.BigDecimal; import java.util.ArrayList; @@ -47,6 +51,9 @@ public class SdWtMonitorServiceImpl implements SdWtMonitorService { @Resource private MicroservicDynamicSQLMapper microservicDynamicSQLMapper; + @Resource + private JdbcTemplate jdbcTemplate; + @Override public DataSourceResult getEvnmAutoMonitorList(DataSourceRequest dataSourceRequest) { DataSourceLoadOptionsBase loadOptions = dataSourceRequest == null ? null : dataSourceRequest.toDevRequest(); @@ -929,6 +936,19 @@ public class SdWtMonitorServiceImpl implements SdWtMonitorService { return result; } + @Override + @Transactional(rollbackFor = Exception.class) + public void saveWtrvAmendData(List amendDataList) { + if (amendDataList == null || amendDataList.isEmpty()) { + throw new BizException("数据不能为空"); + } + int batchSize = 500; + for (int i = 0; i < amendDataList.size(); i += batchSize) { + List subList = amendDataList.subList(i, Math.min(i + batchSize, amendDataList.size())); + mergeWtrvAmendDataBatch(subList, i); + } + } + @Override public DataSourceResult getCxDetailList(DataSourceRequest dataSourceRequest) { List filters = new ArrayList<>(); @@ -2089,6 +2109,62 @@ public class SdWtMonitorServiceImpl implements SdWtMonitorService { return Collections.singletonList(value); } + private void mergeWtrvAmendDataBatch(List amendDataList, int startIndex) { + StringBuilder sql = new StringBuilder("MERGE INTO SD_WTRVAMEND_S target USING ("); + List params = new ArrayList<>(); + for (int i = 0; i < amendDataList.size(); i++) { + WtrvAmendSaveVo item = amendDataList.get(i); + int rowNo = startIndex + i + 1; + String stcd = item == null ? null : StrUtil.trimToNull(item.getStcd()); + if (StrUtil.isBlank(stcd)) { + throw new BizException("第" + rowNo + "条数据站点编码不能为空"); + } + String dt = normalizeWtrvAmendDate(item.getDt()); + if (StrUtil.isBlank(dt)) { + throw new BizException("第" + rowNo + "条数据日期格式不正确"); + } + if (i > 0) { + sql.append(" UNION ALL "); + } + sql.append("SELECT ? AS STCD, TO_DATE(?, 'YYYY-MM-DD HH24:MI:SS') AS DT, ? AS WT FROM DUAL"); + params.add(stcd); + params.add(dt); + params.add(item.getWt()); + } + sql.append(") source ON (target.STCD = source.STCD AND target.DT = source.DT) ") + .append("WHEN MATCHED THEN UPDATE SET ") + .append("target.WT = source.WT, ") + .append("target.IS_DELETED = 0, ") + .append("target.DELETE_USER = NULL, ") + .append("target.DELETE_TIME = NULL, ") + .append("target.MODIFY_TIME = SYSDATE ") + .append("WHEN NOT MATCHED THEN INSERT (ID, STCD, DT, WT, RECORD_TIME, IS_DELETED) ") + .append("VALUES (SYS_GUID(), source.STCD, source.DT, source.WT, SYSDATE, 0)"); + jdbcTemplate.update(sql.toString(), params.toArray()); + } + + private String normalizeWtrvAmendDate(String value) { + if (StrUtil.isBlank(value)) { + return null; + } + String text = value.trim().replace('T', ' '); + try { + if (text.length() <= 10) { + return DateUtil.formatDateTime(DateUtil.parse(text.substring(0, 10), "yyyy-MM-dd").toJdkDate()); + } + if (text.length() >= 19) { + return DateUtil.formatDateTime(DateUtil.parse(text.substring(0, 19), "yyyy-MM-dd HH:mm:ss").toJdkDate()); + } + return DateUtil.formatDateTime(DateUtil.parse(text, "yyyy-MM-dd HH:mm").toJdkDate()); + } catch (Exception ex) { + try { + return DateUtil.formatDateTime(DateUtil.parse(value.trim()).toJdkDate()); + } catch (Exception ignore) { + return null; + } + } + } + private String buildSttpInfoFilterCondition(DataSourceRequest.FilterDescriptor filter, Map paramMap, int[] indexHolder) { From ebfd668d0612fb39da373949ff9fc7f07cfcd090 Mon Sep 17 00:00:00 2001 From: tangwei Date: Fri, 26 Jun 2026 13:58:44 +0800 Subject: [PATCH 28/32] =?UTF-8?q?fix:=20=E4=BC=98=E5=8C=96=E9=80=BB?= =?UTF-8?q?=E8=BE=91?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../com/yfd/platform/system/controller/LoginController.java | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/backend/src/main/java/com/yfd/platform/system/controller/LoginController.java b/backend/src/main/java/com/yfd/platform/system/controller/LoginController.java index 0a51347e..82ed2e6f 100644 --- a/backend/src/main/java/com/yfd/platform/system/controller/LoginController.java +++ b/backend/src/main/java/com/yfd/platform/system/controller/LoginController.java @@ -68,7 +68,7 @@ public class LoginController { @PostMapping("/login") @Operation(summary = "登录用户") @ResponseBody - public ResponseResult login(SysUser user) throws Exception { + public ResponseResult login(SysUser user, @RequestHeader(value = "Tenant_id", required = false) String tenantId) throws Exception { // 密码解密 String password = RsaUtils.decryptByPrivateKey(privateKey, user.getPassword()); @@ -100,6 +100,10 @@ public class LoginController { Integer status = loginUser.getUser().getStatus(); String regStatus = loginUser.getUser().getRegStatus(); + if (StrUtil.isNotBlank(tenantId)&&!tenantId.equals(loginUser.getUser().getTenantId())) { + return ResponseResult.error("账号不存在或密码错误"); + } + if (StrUtil.isNotBlank(regStatus)&&"REJECTED".equals(regStatus)) { return ResponseResult.error("账号审核未通过"); } From 4ab11f3b94562488d48c9f132d93c44ebd3dce9a Mon Sep 17 00:00:00 2001 From: tangwei Date: Fri, 26 Jun 2026 14:22:04 +0800 Subject: [PATCH 29/32] =?UTF-8?q?feat:=20=E9=87=8D=E7=82=B9=E9=99=86?= =?UTF-8?q?=E7=94=9F=E5=8A=A8=E7=89=A9=E4=BA=8C=E7=BA=A7=E9=A1=B5=E9=9D=A2?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../wte/controller/WeFishController.java | 6 + .../wte/entity/vo/WeTeSpecialAnimalVo.java | 32 +++ .../qgc_env/wte/service/WeFishService.java | 3 + .../wte/service/impl/WeFishServiceImpl.java | 222 ++++++++++++++++++ 4 files changed, 263 insertions(+) create mode 100644 backend/src/main/java/com/yfd/platform/qgc_env/wte/entity/vo/WeTeSpecialAnimalVo.java diff --git a/backend/src/main/java/com/yfd/platform/qgc_env/wte/controller/WeFishController.java b/backend/src/main/java/com/yfd/platform/qgc_env/wte/controller/WeFishController.java index adebfe77..d9456491 100644 --- a/backend/src/main/java/com/yfd/platform/qgc_env/wte/controller/WeFishController.java +++ b/backend/src/main/java/com/yfd/platform/qgc_env/wte/controller/WeFishController.java @@ -86,4 +86,10 @@ public class WeFishController { public ResponseResult getQgcWeFishPoint(@RequestBody DataSourceRequest dataSourceRequest) { return ResponseResult.successData(weFishService.getQgcWeFishPoint(dataSourceRequest)); } + + @PostMapping("/te/tet/spec/GetKendoListCust") + @Operation(summary = "重点陆生动物二级页面") + public ResponseResult getTeSpecialAnimalList(@RequestBody DataSourceRequest dataSourceRequest) { + return ResponseResult.successData(weFishService.getTeSpecialAnimalList(dataSourceRequest)); + } } diff --git a/backend/src/main/java/com/yfd/platform/qgc_env/wte/entity/vo/WeTeSpecialAnimalVo.java b/backend/src/main/java/com/yfd/platform/qgc_env/wte/entity/vo/WeTeSpecialAnimalVo.java new file mode 100644 index 00000000..7622d501 --- /dev/null +++ b/backend/src/main/java/com/yfd/platform/qgc_env/wte/entity/vo/WeTeSpecialAnimalVo.java @@ -0,0 +1,32 @@ +package com.yfd.platform.qgc_env.wte.entity.vo; + +import io.swagger.v3.oas.annotations.media.Schema; +import lombok.Data; +import lombok.experimental.Accessors; + +@Data +@Accessors(chain = true) +@Schema(description = "重点陆生动物二级页面") +public class WeTeSpecialAnimalVo { + + @Schema(description = "动物主键") + private String id; + + @Schema(description = "动物名称") + private String name; + + @Schema(description = "动物英文名称") + private String nameEn; + + @Schema(description = "保护级别编码") + private String protectlvl; + + @Schema(description = "保护级别名称") + private String protectlvlName; + + @Schema(description = "LOGO") + private String logo; + + @Schema(description = "介绍") + private String introduce; +} diff --git a/backend/src/main/java/com/yfd/platform/qgc_env/wte/service/WeFishService.java b/backend/src/main/java/com/yfd/platform/qgc_env/wte/service/WeFishService.java index 4412fbbb..9cf1c024 100644 --- a/backend/src/main/java/com/yfd/platform/qgc_env/wte/service/WeFishService.java +++ b/backend/src/main/java/com/yfd/platform/qgc_env/wte/service/WeFishService.java @@ -9,6 +9,7 @@ import com.yfd.platform.qgc_env.wte.entity.vo.WeFishPointQgcVo; import com.yfd.platform.qgc_env.wte.entity.vo.WeFishStatQgcVo; import com.yfd.platform.qgc_env.wte.entity.vo.WeFishTQgcVo; import com.yfd.platform.qgc_env.wte.entity.vo.WeStaticsVo; +import com.yfd.platform.qgc_env.wte.entity.vo.WeTeSpecialAnimalVo; import com.yfd.platform.qgc_env.wte.entity.vo.WeVmsstbprptVo; import com.yfd.platform.qgc_env.wte.entity.vo.WeWvaQgcVo; import com.yfd.platform.qgc_env.wte.entity.vo.WeWvaYearQgcVo; @@ -39,4 +40,6 @@ public interface WeFishService { DataSourceResult getQgcFishListStat(DataSourceRequest dataSourceRequest); DataSourceResult getQgcWeFishPoint(DataSourceRequest dataSourceRequest); + + DataSourceResult getTeSpecialAnimalList(DataSourceRequest dataSourceRequest); } diff --git a/backend/src/main/java/com/yfd/platform/qgc_env/wte/service/impl/WeFishServiceImpl.java b/backend/src/main/java/com/yfd/platform/qgc_env/wte/service/impl/WeFishServiceImpl.java index 5d086cec..fbaaf40c 100644 --- a/backend/src/main/java/com/yfd/platform/qgc_env/wte/service/impl/WeFishServiceImpl.java +++ b/backend/src/main/java/com/yfd/platform/qgc_env/wte/service/impl/WeFishServiceImpl.java @@ -18,6 +18,7 @@ import com.yfd.platform.qgc_env.wte.entity.vo.WeFishStatQgcVo; import com.yfd.platform.qgc_env.wte.entity.vo.WeFishTQgcVo; import com.yfd.platform.qgc_env.wte.entity.vo.WeRvcdYearVo; import com.yfd.platform.qgc_env.wte.entity.vo.WeStaticsVo; +import com.yfd.platform.qgc_env.wte.entity.vo.WeTeSpecialAnimalVo; import com.yfd.platform.qgc_env.wte.entity.vo.WeVmsstbprptVo; import com.yfd.platform.qgc_env.wte.entity.vo.WeWvaQgcVo; import com.yfd.platform.qgc_env.wte.entity.vo.WeWvaYearQgcVo; @@ -486,6 +487,44 @@ public class WeFishServiceImpl implements WeFishService { return result; } + @Override + public DataSourceResult getTeSpecialAnimalList(DataSourceRequest dataSourceRequest) { + DataSourceLoadOptionsBase loadOptions = dataSourceRequest == null ? null : dataSourceRequest.toDevRequest(); + Map paramMap = new HashMap<>(); + + StringBuilder sql = new StringBuilder(); + sql.append("SELECT ") + .append(buildTeSpecialAnimalSelectSql(dataSourceRequest == null ? null : dataSourceRequest.getSelect())) + .append(" FROM (") + .append(buildTeSpecialAnimalDetailSql()) + .append(") t WHERE 1 = 1 "); + + String filterSql = buildTeSpecialAnimalFilterCondition( + dataSourceRequest == null ? null : dataSourceRequest.getFilter(), + paramMap, + new int[]{0} + ); + if (StrUtil.isNotBlank(filterSql)) { + sql.append("AND ").append(filterSql).append(" "); + } + sql.append(buildTeSpecialAnimalOrderBySql(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, + WeTeSpecialAnimalVo.class + ); + + DataSourceResult result = new DataSourceResult<>(); + result.setData(list); + result.setTotal(page != null ? page.getTotal() : list.size()); + result.setAggregates(new HashMap<>()); + return result; + } + private String buildWeFishQgcGroupSql(String baseSql, GroupingInfo[] groupInfos) { if (groupInfos == null || groupInfos.length == 0) { return baseSql; @@ -820,6 +859,189 @@ public class WeFishServiceImpl implements WeFishService { return sql.toString(); } + private String buildTeSpecialAnimalDetailSql() { + return "SELECT DISTINCT " + + "b.ID AS id, " + + "b.NAME AS name, " + + "b.NAME_EN AS nameEn, " + + "b.PROTECTLVL AS protectlvl, " + + "b.PROTECTLVL AS protectlvlName, " + + "b.LOGO AS logo, " + + "b.INTRODUCE AS introduce " + + "FROM MS_SPECANIMALS_B a " + + "INNER JOIN SD_VABASIC_B b ON a.ANIMAL_ID = b.ID " + + "WHERE NVL(a.IS_DELETED, 0) = 0 " + + "AND NVL(b.IS_DELETED, 0) = 0 " + + "AND NVL(b.ENABLE, 1) = 1 "; + } + + private String buildTeSpecialAnimalSelectSql(List selectFields) { + Map columnMap = buildTeSpecialAnimalColumnMap(); + List columns = new ArrayList<>(); + if (CollUtil.isNotEmpty(selectFields)) { + for (String field : selectFields) { + String column = columnMap.get(field); + if (StrUtil.isNotBlank(column)) { + columns.add(column); + } + } + } + if (columns.isEmpty()) { + columns.addAll(columnMap.values()); + } + return String.join(", ", columns); + } + + private Map buildTeSpecialAnimalColumnMap() { + Map columnMap = new LinkedHashMap<>(); + columnMap.put("id", "t.id AS id"); + columnMap.put("name", "t.name AS name"); + columnMap.put("nameEn", "t.nameEn AS nameEn"); + columnMap.put("protectlvl", "t.protectlvl AS protectlvl"); + columnMap.put("protectlvlName", "t.protectlvlName AS protectlvlName"); + columnMap.put("logo", "t.logo AS logo"); + columnMap.put("introduce", "t.introduce AS introduce"); + return columnMap; + } + + private String buildTeSpecialAnimalFilterCondition(DataSourceRequest.FilterDescriptor filter, + Map paramMap, + int[] indexHolder) { + if (filter == null) { + return ""; + } + if (StrUtil.isNotBlank(filter.getField())) { + return buildTeSpecialAnimalLeafCondition(filter, paramMap, indexHolder); + } + if (CollUtil.isEmpty(filter.getFilters())) { + return ""; + } + List conditions = new ArrayList<>(); + for (DataSourceRequest.FilterDescriptor child : filter.getFilters()) { + String childSql = buildTeSpecialAnimalFilterCondition(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 buildTeSpecialAnimalLeafCondition(DataSourceRequest.FilterDescriptor filter, + Map paramMap, + int[] indexHolder) { + String column = mapTeSpecialAnimalColumn(filter == null ? null : filter.getField()); + if (StrUtil.isBlank(column)) { + return ""; + } + String operator = StrUtil.blankToDefault(filter.getOperator(), "eq").toLowerCase(); + 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 = normalizeWeFishQgcValues(filter.getValue()); + if (values.isEmpty()) { + return ""; + } + List placeholders = new ArrayList<>(); + for (Object value : values) { + String text = safeWeFishString(value); + if (StrUtil.isBlank(text)) { + continue; + } + String key = "teSpecP" + indexHolder[0]++; + paramMap.put(key, text); + placeholders.add("#{map." + key + "}"); + } + if (placeholders.isEmpty()) { + return ""; + } + return column + ("ni".equals(operator) ? " NOT IN (" : " IN (") + String.join(", ", placeholders) + ")"; + } + String text = safeWeFishString(filter.getValue()); + if (StrUtil.isBlank(text)) { + return ""; + } + String key = "teSpecP" + indexHolder[0]++; + return switch (operator) { + case "eq" -> { + paramMap.put(key, text); + yield column + " = #{map." + key + "}"; + } + case "neq" -> { + paramMap.put(key, text); + yield column + " <> #{map." + key + "}"; + } + case "contains" -> { + paramMap.put(key, "%" + text + "%"); + yield column + " LIKE #{map." + key + "}"; + } + case "doesnotcontain" -> { + paramMap.put(key, "%" + text + "%"); + yield column + " NOT LIKE #{map." + key + "}"; + } + case "startswith" -> { + paramMap.put(key, text + "%"); + yield column + " LIKE #{map." + key + "}"; + } + case "endswith" -> { + paramMap.put(key, "%" + text); + yield column + " LIKE #{map." + key + "}"; + } + default -> ""; + }; + } + + private String mapTeSpecialAnimalColumn(String field) { + if (StrUtil.isBlank(field)) { + return null; + } + return switch (field) { + case "id" -> "t.id"; + case "name" -> "t.name"; + case "nameEn" -> "t.nameEn"; + case "protectlvl" -> "t.protectlvl"; + case "protectlvlName" -> "t.protectlvlName"; + case "logo" -> "t.logo"; + case "introduce" -> "t.introduce"; + default -> null; + }; + } + + private String buildTeSpecialAnimalOrderBySql(List sorts) { + if (CollUtil.isEmpty(sorts)) { + return " ORDER BY t.name ASC NULLS LAST, t.id ASC"; + } + List orderByParts = new ArrayList<>(); + for (DataSourceRequest.SortDescriptor sort : sorts) { + if (sort == null || StrUtil.isBlank(sort.getField())) { + continue; + } + String column = mapTeSpecialAnimalColumn(sort.getField()); + if (StrUtil.isBlank(column)) { + continue; + } + String direction = "desc".equalsIgnoreCase(sort.getDir()) || "des".equalsIgnoreCase(sort.getDir()) ? "DESC" : "ASC"; + orderByParts.add(column + " " + direction + " NULLS LAST"); + } + if (orderByParts.isEmpty()) { + return " ORDER BY t.name ASC NULLS LAST, t.id ASC"; + } + return " ORDER BY " + String.join(", ", orderByParts); + } + private String buildWeWvaYearFilterCondition(DataSourceRequest.FilterDescriptor filter, Map paramMap, int[] indexHolder) { From 4d3dec4b00d0fe5f9212de9d724f2cbb61d160d2 Mon Sep 17 00:00:00 2001 From: tangwei Date: Fri, 26 Jun 2026 15:00:39 +0800 Subject: [PATCH 30/32] =?UTF-8?q?feat:=20=E9=A6=96=E9=A1=B5-=E7=8E=AF?= =?UTF-8?q?=E4=BF=9D=E8=AE=BE=E6=96=BD=E8=BF=90=E8=A1=8C=E7=8A=B6=E5=86=B5?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../controller/SdEngMonitorController.java | 6 + .../qgc_base/domain/vo/EngOperatVo.java | 32 ++ .../qgc_base/service/ISdEngInfoBHService.java | 3 + .../service/impl/SdEngInfoBHServiceImpl.java | 534 ++++++++++++++++++ 4 files changed, 575 insertions(+) create mode 100644 backend/src/main/java/com/yfd/platform/qgc_base/domain/vo/EngOperatVo.java 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"; From 55b23bb8efe37e1bd7880b6ce642e6358c0d521f Mon Sep 17 00:00:00 2001 From: tangwei Date: Fri, 26 Jun 2026 15:32:12 +0800 Subject: [PATCH 31/32] =?UTF-8?q?fix:=20=E4=BC=98=E5=8C=96=E9=80=BB?= =?UTF-8?q?=E8=BE=91?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../src/main/resources/mapper/data/FishStatisticsMapper.xml | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/backend/src/main/resources/mapper/data/FishStatisticsMapper.xml b/backend/src/main/resources/mapper/data/FishStatisticsMapper.xml index 61f193c2..6099458b 100644 --- a/backend/src/main/resources/mapper/data/FishStatisticsMapper.xml +++ b/backend/src/main/resources/mapper/data/FishStatisticsMapper.xml @@ -76,7 +76,7 @@ ON sud.ORG_ID = rr.ROOT_RVCD JOIN SD_ENGINFO_B_H e ON e.REACHCD = rr.DESC_RVCD - AND e.USFL = 1 +-- AND e.USFL = 1 JOIN river_display r ON e.REACHCD = r.RVCD WHERE su.STATUS = 1 @@ -98,7 +98,7 @@ AND sud.ORG_TYPE = 'STATION' JOIN SD_ENGINFO_B_H e ON sud.ORG_ID = e.STCD - AND e.USFL = 1 +-- AND e.USFL = 1 JOIN river_display r ON e.REACHCD = r.RVCD WHERE su.STATUS = 1 From 8c5a9813921f59eb7fb235bb5319532fa0b8f09b Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E7=8E=8B=E5=85=B4=E5=87=AF?= <2448379534@qq.com> Date: Fri, 26 Jun 2026 17:52:57 +0800 Subject: [PATCH 32/32] =?UTF-8?q?=E7=94=9F=E6=80=81=E8=B0=83=E6=9F=A5-?= =?UTF-8?q?=E7=BA=BF=E4=B8=8A=E6=8E=A5=E5=8F=A3?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- frontend/src/api/select/index.ts | 8 + frontend/src/api/stdc/index.ts | 139 ++++ frontend/src/components/BasicTable/index.vue | 15 +- .../src/components/SidePanelItem/index.vue | 41 +- frontend/src/main.ts | 1 - frontend/src/modules/Ysdwjc/index.vue | 731 +++++++++++------ .../alongFishMod/TwoLayers/Yanchengyulei.vue | 615 ++++++++++++++ frontend/src/modules/alongFishMod/index.vue | 764 ++++++++++++++---- frontend/src/modules/jidiSelectorMod.vue | 2 +- .../lushengshengtaijiance/LsstjkTk.vue | 234 ++++++ .../modules/lushengshengtaijiance/index.vue | 402 +++++++-- .../shuishengshengtaijiance/SsstdcgkTk.vue | 362 +++++++++ .../modules/shuishengshengtaijiance/index.vue | 439 ++++++++-- frontend/src/store/modules/jidiSelectEvent.ts | 122 ++- .../views/home/shuiDianKaiFaZhuangKuang.vue | 2 +- 15 files changed, 3178 insertions(+), 699 deletions(-) create mode 100644 frontend/src/api/stdc/index.ts create mode 100644 frontend/src/modules/alongFishMod/TwoLayers/Yanchengyulei.vue create mode 100644 frontend/src/modules/lushengshengtaijiance/LsstjkTk.vue create mode 100644 frontend/src/modules/shuishengshengtaijiance/SsstdcgkTk.vue diff --git a/frontend/src/api/select/index.ts b/frontend/src/api/select/index.ts index 337a03f2..dc4d5f78 100644 --- a/frontend/src/api/select/index.ts +++ b/frontend/src/api/select/index.ts @@ -1,4 +1,12 @@ import request from '@/utils/request'; +//水电基地数据获取 +export function wbsbGetKendoList(data: any) { + return request({ + url: '/env/hydrobase/wbsb/GetKendoList', + method: 'post', + data + }); +} // 基地下拉列表 export function getBaseDropdown(data: any) { diff --git a/frontend/src/api/stdc/index.ts b/frontend/src/api/stdc/index.ts new file mode 100644 index 00000000..ce9c8d6e --- /dev/null +++ b/frontend/src/api/stdc/index.ts @@ -0,0 +1,139 @@ +import request from '@/utils/request'; + +//水生生态调查情况-下拉选择框 +export function wbsbGetKendoList(data: any) { + return request({ + url: '/api/dec-lygk-base-server/base/wbsb/GetKendoList', + method: 'post', + data + }); +} + +// 水生生态调查情况-获取默认年份 +export function getDftYear(data: any) { + return request({ + url: '/api/wmp-env-server/env/we/fisht/year/qgc/GetKendoListCust', + method: 'post', + data + }); +} + +// 水生生态调查情况-获取统计数据 +export function getWeFisht(data: any) { + return request({ + url: '/api/wmp-env-server/env/we/fisht/statics/GetKendoListCust', + method: 'post', + data + }); +} + +// 水生生态调查概况-表格数据接口 +export function getWeStaticsSecond(data: any) { + return request({ + url: '/api/wmp-env-server/env/we/fisht/statics/getWeStaticsSecond', + method: 'post', + data + }); +} + +// 沿程鱼类变化-图表数据接口 +export function fishChanges2(data: any) { + return request({ + url: '/api/wmp-env-server/env/we/fisht/stat/GetKendoListCust', + method: 'post', + data + }); +} + +// 沿程鱼类变化-详情表格接口 +export function fishDetail(data: any) { + return request({ + url: '/api/wmp-env-server/env/we/fisht/detail/GetKendoListCust', + method: 'post', + data + }); +} + +// 沿程鱼类变化-Tab数量统计接口 +export function getTabNum(data: any) { + return request({ + url: '/api/wmp-env-server/env/we/fisht/statTab/GetKendoListCust', + method: 'post', + data + }); +} + +// 沿程鱼类变化-获取断面列表 +export function getStcdList(data: any) { + return request({ + url: '/api/dec-lygk-base-server/base/vmsstbprpt/noWqDtinType0Auth/GetKendoList', + method: 'post', + data: { + filter: data, + orders: JSON.stringify({ siteStepSort: 'asc' }) + } + }); +} + +// 沿程鱼类变化-基地模式详情表格接口 +export function fishQgcDetail(data: any) { + return request({ + url: '/api/wmp-env-server/env/we/fisht/qgcDetail/GetKendoListCust', + method: 'post', + data + }); +} + +// 陆生生态监测情况-获取统计数据 +export function getEvnmAutoMonitor(data: any) { + return request({ + url: '/api/dec-lygk-base-server/base/evnmAutoMonitor/GetKendoListCust', + method: 'post', + data + }); +} + +// 陆生生态监测-红外相机信息表格 +export function getVmsstbprptList(data: any) { + return request({ + url: '/api/dec-lygk-base-server/base/vmsstbprpt/GetKendoList', + method: 'post', + data + }); +} + +// 陆生生态监测-重点陆生动物表格 +export function getTetSpecList(data: any) { + return request({ + url: '/api/wmp-env-server/te/tet/spec/GetKendoListCust', + method: 'post', + data + }); +} + +// 野生动物监测-获取运行数据 +export function getWvaData(data: any) { + return request({ + url: '/api/wmp-env-server/env/wva/GetKendoListCust', + method: 'post', + data + }); +} + +// 野生动物监测-获取默认数据 +export function getWvaDftData(data: any) { + return request({ + url: '/api/wmp-env-server/env/wva/default/GetKendoListCust', + method: 'post', + data + }); +} + +// 野生动物监测-获取默认年份列表 +export function getWvaDftTm(data: any) { + return request({ + url: '/api/wmp-env-server/env/wva/year/GetKendoListCust', + method: 'post', + data + }); +} diff --git a/frontend/src/components/BasicTable/index.vue b/frontend/src/components/BasicTable/index.vue index 8e1e6fdf..49e4eede 100644 --- a/frontend/src/components/BasicTable/index.vue +++ b/frontend/src/components/BasicTable/index.vue @@ -587,22 +587,23 @@ const enhancedColumns = computed(() => { // 处理 merge 配置 if (col.merge && col.dataIndex) { - const baseCol = { - ...col, - customCell: createMergeCellHandler(col) - }; - - // 如果有 slots.customRender,移除 slots + // 如果有 slots.customRender,移除 slots 但保留 customCell if (enhancedCol.slots?.customRender) { const { slots, ...restCol } = enhancedCol; return { ...restCol, + customCell: createMergeCellHandler(col), _slotName: slots.customRender, ...(props.enableEllipsis ? { ellipsis: true } : {}) }; } - return enhancedCol; + // 没有 slots 时,返回包含 customCell 的列配置 + return { + ...enhancedCol, + customCell: createMergeCellHandler(col), + ...(props.enableEllipsis ? { ellipsis: true } : {}) + }; } // 如果有 slots.customRender,移除 slots(由 bodyCell 处理),保留 dataIndex 用于匹配 diff --git a/frontend/src/components/SidePanelItem/index.vue b/frontend/src/components/SidePanelItem/index.vue index c9e04764..abbfc6d5 100644 --- a/frontend/src/components/SidePanelItem/index.vue +++ b/frontend/src/components/SidePanelItem/index.vue @@ -47,26 +47,7 @@
-
- -
+
@@ -96,6 +77,26 @@ @expand="handleTreeExpand" > +
+
+
diff --git a/frontend/src/main.ts b/frontend/src/main.ts index 48e4d1a4..69c40277 100644 --- a/frontend/src/main.ts +++ b/frontend/src/main.ts @@ -48,7 +48,6 @@ app .use(router) .use(ElementPlus) .use(Antd) - .use(Antd) .use(WujieVue) .use(i18n) .mount('#app'); diff --git a/frontend/src/modules/Ysdwjc/index.vue b/frontend/src/modules/Ysdwjc/index.vue index 63451fcc..76ad8bfa 100644 --- a/frontend/src/modules/Ysdwjc/index.vue +++ b/frontend/src/modules/Ysdwjc/index.vue @@ -1,320 +1,541 @@ - + \ No newline at end of file + diff --git a/frontend/src/modules/alongFishMod/TwoLayers/Yanchengyulei.vue b/frontend/src/modules/alongFishMod/TwoLayers/Yanchengyulei.vue new file mode 100644 index 00000000..8d7f6e9f --- /dev/null +++ b/frontend/src/modules/alongFishMod/TwoLayers/Yanchengyulei.vue @@ -0,0 +1,615 @@ + + + + + + diff --git a/frontend/src/modules/alongFishMod/index.vue b/frontend/src/modules/alongFishMod/index.vue index 91763f43..937433fa 100644 --- a/frontend/src/modules/alongFishMod/index.vue +++ b/frontend/src/modules/alongFishMod/index.vue @@ -1,209 +1,631 @@ - + \ No newline at end of file + +.empty-placeholder { + width: 100%; + min-height: 231px; + display: flex; + background: #fff; + flex-direction: column; + justify-content: center; + align-items: center; +} + +:deep(.ant-empty-description) { + text-indent: 0em !important; +} + diff --git a/frontend/src/modules/jidiSelectorMod.vue b/frontend/src/modules/jidiSelectorMod.vue index 79b7984c..d0d19ebe 100644 --- a/frontend/src/modules/jidiSelectorMod.vue +++ b/frontend/src/modules/jidiSelectorMod.vue @@ -14,7 +14,7 @@ onMounted(() => {}); + + + + diff --git a/frontend/src/modules/lushengshengtaijiance/index.vue b/frontend/src/modules/lushengshengtaijiance/index.vue index e67352da..3b2b33d9 100644 --- a/frontend/src/modules/lushengshengtaijiance/index.vue +++ b/frontend/src/modules/lushengshengtaijiance/index.vue @@ -1,133 +1,361 @@ \ No newline at end of file + +:deep(.ant-spin-nested-loading) { + min-height: 72px; +} + diff --git a/frontend/src/modules/shuishengshengtaijiance/SsstdcgkTk.vue b/frontend/src/modules/shuishengshengtaijiance/SsstdcgkTk.vue new file mode 100644 index 00000000..dbab8517 --- /dev/null +++ b/frontend/src/modules/shuishengshengtaijiance/SsstdcgkTk.vue @@ -0,0 +1,362 @@ + + + + + diff --git a/frontend/src/modules/shuishengshengtaijiance/index.vue b/frontend/src/modules/shuishengshengtaijiance/index.vue index 6a965c25..723cb7dc 100644 --- a/frontend/src/modules/shuishengshengtaijiance/index.vue +++ b/frontend/src/modules/shuishengshengtaijiance/index.vue @@ -1,133 +1,400 @@ \ No newline at end of file + +:deep(.ant-spin-nested-loading) { + min-height: 72px; +} + diff --git a/frontend/src/store/modules/jidiSelectEvent.ts b/frontend/src/store/modules/jidiSelectEvent.ts index 39ed9496..6364b530 100644 --- a/frontend/src/store/modules/jidiSelectEvent.ts +++ b/frontend/src/store/modules/jidiSelectEvent.ts @@ -1,81 +1,15 @@ import { defineStore } from 'pinia'; -import { ref } from 'vue'; - +import { ref, onMounted } from 'vue'; +import { wbsbGetKendoList } from '@/api/select'; export const useJidiSelectEventStore = defineStore('jidiSelectEvent', () => { const jidiData: any = ref([ { wbsCode: 'all', wbsName: '当前全部', selected: true - }, - { - wbsCode: '01', - wbsName: '金沙江干流', - selected: false - }, - { - wbsCode: '02', - wbsName: '雅砻江干流', - selected: false - }, - { - wbsCode: '03', - wbsName: '大渡河干流', - selected: false - }, - { - wbsCode: '04', - wbsName: '乌江干流', - selected: false - }, - { - wbsCode: '05', - wbsName: '长江上游干流', - selected: false - }, - { - wbsCode: '10', - wbsName: '湘西', - selected: false - }, - { - wbsCode: '08', - wbsName: '黄河上游干流', - selected: false - }, - { - wbsCode: '09', - wbsName: '黄河中游干流', - selected: false - }, - { - wbsCode: '06', - wbsName: '南盘江-红水河', - selected: false - }, - { - wbsCode: '12', - wbsName: '东北', - selected: false - }, - { - wbsCode: '07', - wbsName: '澜沧江干流', - selected: false - }, - { - wbsCode: '13', - wbsName: '怒江干流' - }, - { - wbsCode: '11', - wbsName: '闽浙赣' - }, - { - wbsCode: 'other', - wbsName: '其他' } ]); + const loading = ref(false); const selectedItem = ref(jidiData.value[0]); const updataJidiData = (index: any) => { console.log(index); @@ -85,10 +19,58 @@ export const useJidiSelectEventStore = defineStore('jidiSelectEvent', () => { }); jidiData.value[index].selected = true; }; + const getJidiData = async () => { + loading.value = true; + let params = { + filter: { + logic: 'and', + filters: [ + { + field: 'wbsType', + operator: 'eq', + dataType: 'string', + value: 'PSB' + }, + { + field: 'treeLevel', + operator: 'eq', + dataType: 'string', + value: '1' + } + ] + }, + sort: [ + { + field: 'orderIndex', + dir: 'asc' + } + ], + select: ['wbsCode', 'wbsName'] + }; + const res = await wbsbGetKendoList(params); + let data = res?.data?.data || [ + { + wbsCode: 'all', + wbsName: '当前全部', + selected: true + } + ]; + jidiData.value = data.map((item: any) => { + return { + ...item, + selected: item.wbsCode == 'all' ? true : false + }; + }); + loading.value = false; + }; + onMounted(() => { + getJidiData(); + }); return { jidiData, selectedItem, - updataJidiData + updataJidiData, + loading }; }); diff --git a/frontend/src/views/home/shuiDianKaiFaZhuangKuang.vue b/frontend/src/views/home/shuiDianKaiFaZhuangKuang.vue index 18222986..4d629c9c 100644 --- a/frontend/src/views/home/shuiDianKaiFaZhuangKuang.vue +++ b/frontend/src/views/home/shuiDianKaiFaZhuangKuang.vue @@ -154,7 +154,7 @@ const showMapModal17 = () => { - + 打开野生动物监测弹窗