From 46100d831850923ad9a9e40cf1b6e45164875f5a Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E6=89=88=E5=85=86=E5=A2=9E?= <你的邮箱@example.com> Date: Mon, 6 Jul 2026 09:01:31 +0800 Subject: [PATCH 01/27] =?UTF-8?q?=E9=97=AE=E9=A2=98=E8=AE=B0=E5=BD=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- frontend/.env.development | 2 +- frontend/docs/问题.md | 1 + 2 files changed, 2 insertions(+), 1 deletion(-) diff --git a/frontend/.env.development b/frontend/.env.development index b9d4b82d..699b8b22 100644 --- a/frontend/.env.development +++ b/frontend/.env.development @@ -7,7 +7,7 @@ VITE_APP_TITLE = '水电水利建设项目全过程环境管理信息平台' VITE_APP_PORT = 3000 VITE_APP_BASE_API = '/dev-api' # 本地环境 -# VITE_APP_BASE_URL = 'http://172.16.54.1:8093' +# VITE_APP_BASE_URL = 'http://localhost:8093' # 测试环境 # VITE_APP_BASE_URL = 'http://172.16.21.142:8093' # VITE_APP_BASE_URL = 'http://172.16.21.142:8096' diff --git a/frontend/docs/问题.md b/frontend/docs/问题.md index d3f62f2a..fd8c4e33 100644 --- a/frontend/docs/问题.md +++ b/frontend/docs/问题.md @@ -27,6 +27,7 @@ | 2026-07-01 | 王 | 17 | 所有弹框加拖动 |
|
| | 2026-07-01 | 王 | 18 | 所有弹框检查宽度有的是固定的 |
|
| | 2026-07-02 | 扈 | 19 | 地图点击基地切换偶发性会全部展示出来所有锚点 |
|
| +| 2026-07-03 | 汤 | 20 | 图例数据关了选中配置需要添加一个字段是默认不显示 |
|
| --- From f6e2d49558eaee4559bdd22946cbd1dcacc22477 Mon Sep 17 00:00:00 2001 From: tangwei Date: Mon, 6 Jul 2026 09:05:54 +0800 Subject: [PATCH 02/27] =?UTF-8?q?feat:=20=E7=94=9F=E6=80=81=E6=B5=81?= =?UTF-8?q?=E9=87=8F=E6=B3=84=E6=94=BE=E8=AE=BE=E6=96=BD=E6=8F=8F=E7=82=B9?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../eq/controller/EngEqDataController.java | 6 + .../qgc_eng/eq/entity/vo/EngEqdsVo.java | 101 +++++++++++++++ .../qgc_eng/eq/service/EngEqDataService.java | 3 + .../eq/service/impl/EngEqDataServiceImpl.java | 121 ++++++++++++++++++ .../src/main/resources/application-prod.yml | 5 +- 5 files changed, 234 insertions(+), 2 deletions(-) create mode 100644 backend/src/main/java/com/yfd/platform/qgc_eng/eq/entity/vo/EngEqdsVo.java diff --git a/backend/src/main/java/com/yfd/platform/qgc_eng/eq/controller/EngEqDataController.java b/backend/src/main/java/com/yfd/platform/qgc_eng/eq/controller/EngEqDataController.java index 962d0667..1773f5d0 100644 --- a/backend/src/main/java/com/yfd/platform/qgc_eng/eq/controller/EngEqDataController.java +++ b/backend/src/main/java/com/yfd/platform/qgc_eng/eq/controller/EngEqDataController.java @@ -181,4 +181,10 @@ public class EngEqDataController { StcdInfoVo result = engEqDataService.getStInfoByStcd(stcd); return ResponseResult.successData(result); } + + @PostMapping("/eqds/GetKendoListCust") + @Operation(summary = "生态流量泄放设施描点") + public ResponseResult getEqdsKendoListCust(@RequestBody DataSourceRequest dataSourceRequest) { + return ResponseResult.successData(engEqDataService.getEqdsKendoListCust(dataSourceRequest)); + } } diff --git a/backend/src/main/java/com/yfd/platform/qgc_eng/eq/entity/vo/EngEqdsVo.java b/backend/src/main/java/com/yfd/platform/qgc_eng/eq/entity/vo/EngEqdsVo.java new file mode 100644 index 00000000..043eb2c0 --- /dev/null +++ b/backend/src/main/java/com/yfd/platform/qgc_eng/eq/entity/vo/EngEqdsVo.java @@ -0,0 +1,101 @@ +package com.yfd.platform.qgc_eng.eq.entity.vo; + +import io.swagger.v3.oas.annotations.media.Schema; +import lombok.Data; + +import java.math.BigDecimal; + +@Data +@Schema(description = "生态流量泄放设施描点VO") +public class EngEqdsVo { + + @Schema(description = "设施编码") + private String stcd; + + @Schema(description = "设施名称") + private String stnm; + + @Schema(description = "电站编码") + private String rstcd; + + @Schema(description = "电站名称") + private String ennm; + + @Schema(description = "生态流量泄放方式") + private Integer eqtp; + + @Schema(description = "孔口尺寸") + private String flksz; + + @Schema(description = "进水口地板高程") + private BigDecimal jskdbgc; + + @Schema(description = "出水口地板高程") + private BigDecimal cskdbgc; + + @Schema(description = "死水位时保证流量") + private BigDecimal ddzgq; + + @Schema(description = "基荷发电工况") + private BigDecimal jhfdgk; + + @Schema(description = "最大泄放流量") + private String flkq; + + @Schema(description = "基地") + private String baseId; + + @Schema(description = "流域") + private String rvcd; + + @Schema(description = "行政区") + private String addvcd; + + @Schema(description = "经度") + private BigDecimal lgtd; + + @Schema(description = "纬度") + private BigDecimal lttd; + + @Schema(description = "高程") + private BigDecimal dtmel; + + @Schema(description = "工程类型") + private String sttp; + + @Schema(description = "工程类型名称") + private String sttpName; + + @Schema(description = "锚点类型") + private String sttpMap; + + @Schema(description = "设施类型") + private String sttpCode; + + @Schema(description = "图例编码") + private String anchoPointState; + + @Schema(description = "弹窗名称") + private String titleName; + + @Schema(description = "生态流量限值") + private BigDecimal qecLimit; + + @Schema(description = "地图避让") + private Integer distance; + + @Schema(description = "建设状态 0=规划,1=在建,2=已建") + private String bldsttCode; + + @Schema(description = "沿程排序") + private Integer siteStepSort; + + @Schema(description = "流域排序") + private Integer rvcdStepSort; + + @Schema(description = "电站排序") + private Integer rstcdStepSort; + + @Schema(description = "基地排序") + private Integer baseStepSort; +} \ No newline at end of file diff --git a/backend/src/main/java/com/yfd/platform/qgc_eng/eq/service/EngEqDataService.java b/backend/src/main/java/com/yfd/platform/qgc_eng/eq/service/EngEqDataService.java index f2fbf60c..260c2bba 100644 --- a/backend/src/main/java/com/yfd/platform/qgc_eng/eq/service/EngEqDataService.java +++ b/backend/src/main/java/com/yfd/platform/qgc_eng/eq/service/EngEqDataService.java @@ -7,6 +7,7 @@ import com.yfd.platform.qgc_eng.eq.entity.vo.EngEqBaseVmsstbprptVo; import com.yfd.platform.qgc_eng.eq.entity.vo.EngEqDayDataVo; import com.yfd.platform.qgc_eng.eq.entity.vo.EngEqDrtpDataVo; import com.yfd.platform.qgc_eng.eq.entity.vo.EngEqDayIntervalVo; +import com.yfd.platform.qgc_eng.eq.entity.vo.EngEqdsVo; import com.yfd.platform.qgc_eng.eq.entity.vo.EngEqHourIntervalVo; import com.yfd.platform.qgc_eng.eq.entity.vo.EngEqIntervalVo; import com.yfd.platform.qgc_eng.eq.entity.vo.EngEqLimitQueryVo; @@ -65,4 +66,6 @@ public interface EngEqDataService { DataSourceResult getDefaultYear(DataSourceRequest dataSourceRequest); StcdInfoVo getStInfoByStcd(String stcd); + + DataSourceResult getEqdsKendoListCust(DataSourceRequest dataSourceRequest); } diff --git a/backend/src/main/java/com/yfd/platform/qgc_eng/eq/service/impl/EngEqDataServiceImpl.java b/backend/src/main/java/com/yfd/platform/qgc_eng/eq/service/impl/EngEqDataServiceImpl.java index ce231794..6cc84b77 100644 --- a/backend/src/main/java/com/yfd/platform/qgc_eng/eq/service/impl/EngEqDataServiceImpl.java +++ b/backend/src/main/java/com/yfd/platform/qgc_eng/eq/service/impl/EngEqDataServiceImpl.java @@ -18,6 +18,7 @@ import com.yfd.platform.qgc_eng.eq.entity.vo.EngEqDataVo; import com.yfd.platform.qgc_eng.eq.entity.vo.EngEqDayDataVo; import com.yfd.platform.qgc_eng.eq.entity.vo.EngEqDrtpDataVo; import com.yfd.platform.qgc_eng.eq.entity.vo.EngEqDayIntervalVo; +import com.yfd.platform.qgc_eng.eq.entity.vo.EngEqdsVo; import com.yfd.platform.qgc_eng.eq.entity.vo.EngEqLimitQueryVo; import com.yfd.platform.qgc_eng.eq.entity.vo.EngEqLimitVo; import com.yfd.platform.qgc_eng.eq.entity.vo.EngFidVo; @@ -36,6 +37,7 @@ import com.yfd.platform.qgc_eng.eq.entity.vo.WbsbVo; import com.yfd.platform.qgc_eng.eq.entity.vo.StBaseInfo; import com.yfd.platform.qgc_eng.eq.entity.vo.StcdInfoVo; import com.yfd.platform.qgc_eng.eq.service.EngEqDataService; +import com.yfd.platform.qgc_env.wt.utils.SiteAvoidanceUtils; import com.yfd.platform.utils.QgcQueryWrapperUtil; import jakarta.annotation.Resource; import org.springframework.stereotype.Service; @@ -5889,4 +5891,123 @@ public class EngEqDataServiceImpl implements EngEqDataService { } return dataSourceResult; } + + @Override + public DataSourceResult getEqdsKendoListCust(DataSourceRequest dataSourceRequest) { + DataSourceResult dataSourceResult = new DataSourceResult<>(); + dataSourceResult.setAggregates(new HashMap<>()); + + if (dataSourceRequest == null) { + dataSourceResult.setData(new ArrayList<>()); + dataSourceResult.setTotal(0L); + return dataSourceResult; + } + + StringBuilder sql = new StringBuilder(); + sql.append("SELECT ") + .append("a.STCD AS stcd, ") + .append("a.STNM AS stnm, ") + .append("a.RSTCD AS rstcd, ") + .append("eng.ENNM AS ennm, ") + .append("a.STTP AS sttp, ") + .append("a.BASE_ID AS baseId, ") + .append("a.LGTD AS lgtd, ") + .append("a.LTTD AS lttd, ") + .append("a.ELEV AS dtmel, ") + .append("a.BLDSTT_CODE AS bldsttCode, ") + .append("a.RVCD AS rvcd, ") + .append("a.ADDVCD AS addvcd, ") + .append("NVL(siteSort.SORT, 999999) AS siteStepSort, ") + .append("NVL(along.ORDER_INDEX, 999999) AS rvcdStepSort, ") + .append("NVL(rstSort.SORT, 999999) AS rstcdStepSort, ") + .append("NVL(hb.ORDER_INDEX, 999999) AS baseStepSort ") + .append("FROM SD_EQ_B_H a ") + .append("LEFT JOIN SD_ENGINFO_B_H eng ON eng.STCD = a.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 MS_ALONG_B along ON along.RVCD = eng.HBRVCD AND along.CODE = 'common' AND NVL(along.IS_DELETED, 0) = 0 ") + .append("LEFT JOIN ( ") + .append(" SELECT det.SORT, cfg.RVCD, det.STCD ") + .append(" FROM MS_ALONGDET_B det ") + .append(" INNER JOIN MS_ALONG_B cfg ON det.ALONG_ID = cfg.ID ") + .append(" WHERE NVL(det.IS_DELETED, 0) = 0 AND NVL(cfg.IS_DELETED, 0) = 0 AND cfg.CODE = 'common' ") + .append(") rstSort ON rstSort.RVCD = eng.HBRVCD AND rstSort.STCD = a.RSTCD ") + .append("LEFT JOIN ( ") + .append(" SELECT det.SORT, cfg.RVCD, det.STCD ") + .append(" FROM MS_ALONGDET_B det ") + .append(" INNER JOIN MS_ALONG_B cfg ON det.ALONG_ID = cfg.ID ") + .append(" WHERE NVL(det.IS_DELETED, 0) = 0 AND NVL(cfg.IS_DELETED, 0) = 0 AND cfg.CODE = 'common' ") + .append(") siteSort ON siteSort.RVCD = eng.HBRVCD AND siteSort.STCD = a.STCD ") + .append("WHERE NVL(a.IS_DELETED, 0) = 0 ") + .append("AND NVL(a.USFL, 1) = 1 ") + .append("AND a.LGTD IS NOT NULL ") + .append("AND a.LTTD IS NOT NULL ") + .append("AND a.STTP IN (SELECT STTP_CODE FROM SD_STTP_B WHERE DESCRIPTION = 'EQ') ") + .append("AND a.RSTCD IS NOT NULL ") + .append("ORDER BY NVL(siteSort.SORT, 999999), NVL(along.ORDER_INDEX, 999999), NVL(rstSort.SORT, 999999), NVL(hb.ORDER_INDEX, 999999), a.STNM "); + + DataSourceLoadOptionsBase loadOptions = dataSourceRequest.toDevRequest(); + Page page = loadOptions == null ? null : QgcQueryWrapperUtil.buildPage(loadOptions, loadOptions.getSkip(), loadOptions.getTake()); + List eqdsVoList = microservicDynamicSQLMapper.pageAllListWithResultType(page, sql.toString(), new HashMap<>(), EngEqdsVo.class); + + List resultList = new ArrayList<>(); + for (EngEqdsVo eqdsVo : eqdsVoList) { + String sttpCode = eqdsVo.getSttp(); + List sttpCodeSplit = StrUtil.split(sttpCode, "_"); + eqdsVo.setSttpMap(sttpCodeSplit.get(0)); + eqdsVo.setEqtp(Integer.valueOf(sttpCodeSplit.get(1))); + eqdsVo.setSttp(sttpCodeSplit.get(0)); + eqdsVo.setTitleName(eqdsVo.getStnm()); + + String bldsttCode = eqdsVo.getBldsttCode(); + if ("2".equals(bldsttCode)) { + eqdsVo.setAnchoPointState(sttpCode); + } else { + eqdsVo.setAnchoPointState(sttpCode + "_incomplete"); + } + + eqdsVo.setSttpCode("EQ"); + + String rstcd = eqdsVo.getRstcd(); + if (rstcd != null && rstcd.contains(",")) { + EngEqdsVo eqdsVoNew = new EngEqdsVo(); + eqdsVoNew.setStcd(eqdsVo.getStcd()); + eqdsVoNew.setStnm(eqdsVo.getStnm()); + eqdsVoNew.setSttp(eqdsVo.getSttp()); + eqdsVoNew.setSttpMap(eqdsVo.getSttpMap()); + eqdsVoNew.setSttpCode(eqdsVo.getSttpCode()); + eqdsVoNew.setEqtp(eqdsVo.getEqtp()); + eqdsVoNew.setAnchoPointState(eqdsVo.getAnchoPointState()); + eqdsVoNew.setTitleName(eqdsVo.getTitleName()); + eqdsVoNew.setLgtd(eqdsVo.getLgtd()); + eqdsVoNew.setLttd(eqdsVo.getLttd()); + eqdsVoNew.setDtmel(eqdsVo.getDtmel()); + eqdsVoNew.setBaseId(eqdsVo.getBaseId()); + eqdsVoNew.setBldsttCode(eqdsVo.getBldsttCode()); + + List stcdSplit = StrUtil.split(rstcd, ','); + eqdsVo.setRstcd(stcdSplit.get(0)); + eqdsVoNew.setRstcd(stcdSplit.get(1)); + + String ennm = eqdsVo.getEnnm(); + if (ennm != null && ennm.contains(",")) { + List ennmSplit = StrUtil.split(ennm, ','); + eqdsVo.setEnnm(ennmSplit.get(0)); + eqdsVoNew.setEnnm(ennmSplit.get(1)); + } + resultList.add(eqdsVoNew); + } + resultList.add(eqdsVo); + } + + SiteAvoidanceUtils.calcSiteMapLev(resultList, + EngEqdsVo::getStcd, + EngEqdsVo::getLgtd, + EngEqdsVo::getLttd, + EngEqdsVo::getAnchoPointState, + EngEqdsVo::setDistance); + + dataSourceResult.setData(resultList); + dataSourceResult.setTotal(page == null ? resultList.size() : page.getTotal()); + return dataSourceResult; + } } diff --git a/backend/src/main/resources/application-prod.yml b/backend/src/main/resources/application-prod.yml index 294c61ea..48e5a037 100644 --- a/backend/src/main/resources/application-prod.yml +++ b/backend/src/main/resources/application-prod.yml @@ -111,9 +111,10 @@ spring: matching-strategy: ant_path_matcher data: redis: - host: ${REDIS_HOST:localhost} + host: ${REDIS_HOST:172.16.21.142} port: ${REDIS_PORT:6379} - password: ${REDIS_PASSWORD:} + password: ${REDIS_PASSWORD:zny5678} + database: ${REDIS_DATABASE:15} timeout: 10000ms lettuce: pool: From 85cf3bc3580e1acc921eec725c612c0c024c58d9 Mon Sep 17 00:00:00 2001 From: tangwei Date: Mon, 6 Jul 2026 09:46:43 +0800 Subject: [PATCH 03/27] =?UTF-8?q?feat:=20=E6=A0=96=E6=81=AF=E5=9C=B0/?= =?UTF-8?q?=E7=8F=8D=E7=A8=80=E6=A4=8D=E7=89=A9=E5=9B=AD/=E5=8A=A8?= =?UTF-8?q?=E7=89=A9=E6=95=91=E5=8A=A9=E7=AB=99=E6=8F=8F=E7=82=B9?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../fb/service/impl/FbStationServiceImpl.java | 4 +- .../fh/controller/FhHabitatController.java | 6 ++ .../qgc_env/fh/entity/vo/FhHaVapVo.java | 28 +++++++ .../qgc_env/fh/service/FhHabitatService.java | 3 + .../fh/service/impl/FhHabitatServiceImpl.java | 74 +++++++++++++++++++ .../fp/service/impl/FpRunServiceImpl.java | 6 +- .../service/impl/WarnDataServiceImpl.java | 4 +- .../impl/SmsVerifyCodeServiceImpl.java | 3 +- 8 files changed, 120 insertions(+), 8 deletions(-) create mode 100644 backend/src/main/java/com/yfd/platform/qgc_env/fh/entity/vo/FhHaVapVo.java diff --git a/backend/src/main/java/com/yfd/platform/qgc_env/fb/service/impl/FbStationServiceImpl.java b/backend/src/main/java/com/yfd/platform/qgc_env/fb/service/impl/FbStationServiceImpl.java index 7963c7c4..f3b3df70 100644 --- a/backend/src/main/java/com/yfd/platform/qgc_env/fb/service/impl/FbStationServiceImpl.java +++ b/backend/src/main/java/com/yfd/platform/qgc_env/fb/service/impl/FbStationServiceImpl.java @@ -4643,8 +4643,8 @@ public class FbStationServiceImpl implements FbStationService { .append(" SELECT t.RSTCD AS stcd, COUNT(1) AS lcjStatus ") .append(" FROM SD_ENGFR_R t ") .append(" INNER JOIN SD_RPIMNFISH_R t1 ON t.ID = t1.RPIMN_ID ") - .append(" WHERE (t.TASK_STATUS IS NULL OR t.TASK_STATUS = 'Approved') ") - .append(" AND NVL(t.IS_DELETED, 0) = 0 AND NVL(t1.IS_DELETED, 0) = 0 ") + .append(" WHERE 1=1 ") + .append(" AND t.IS_DELETED = 0 AND t1.IS_DELETED = 0 ") .append(" AND t.TM BETWEEN ADD_MONTHS(SYSDATE, -12) AND SYSDATE ") .append(" GROUP BY t.RSTCD ") .append(") b ON a.STCD = b.stcd ") diff --git a/backend/src/main/java/com/yfd/platform/qgc_env/fh/controller/FhHabitatController.java b/backend/src/main/java/com/yfd/platform/qgc_env/fh/controller/FhHabitatController.java index 8a5ee63d..1ab1d44d 100644 --- a/backend/src/main/java/com/yfd/platform/qgc_env/fh/controller/FhHabitatController.java +++ b/backend/src/main/java/com/yfd/platform/qgc_env/fh/controller/FhHabitatController.java @@ -71,4 +71,10 @@ public class FhHabitatController { public ResponseResult getStTbYsBVoKendoListCust(@RequestBody DataSourceRequest dataSourceRequest) { return ResponseResult.successData(fhHabitatService.getStTbYsBVoKendoListCust(dataSourceRequest)); } + + @PostMapping("/fhvap/GetKendoListCust") + @Operation(summary = "栖息地/珍稀植物园/动物救助站描点") + public ResponseResult getFhvapKendoListCust(@RequestBody DataSourceRequest dataSourceRequest) { + return ResponseResult.successData(fhHabitatService.getFhvapKendoListCust(dataSourceRequest)); + } } diff --git a/backend/src/main/java/com/yfd/platform/qgc_env/fh/entity/vo/FhHaVapVo.java b/backend/src/main/java/com/yfd/platform/qgc_env/fh/entity/vo/FhHaVapVo.java new file mode 100644 index 00000000..9be9c376 --- /dev/null +++ b/backend/src/main/java/com/yfd/platform/qgc_env/fh/entity/vo/FhHaVapVo.java @@ -0,0 +1,28 @@ +package com.yfd.platform.qgc_env.fh.entity.vo; + +import lombok.Data; + +import java.math.BigDecimal; + +@Data +public class FhHaVapVo { + private String baseId; + private String baseName; + private String stcd; + private String stnm; + private String sttp; + private String sttpCode; + private String sttpMap; + private String anchoPointState; + private String rstcd; + private String ennm; + private String rvcd; + private String rvcdName; + private BigDecimal lgtd; + private BigDecimal lttd; + private String bldsttCcode; + private BigDecimal dtmel; + private Integer dtin; + private Integer distance; + private String titleName; +} \ No newline at end of file diff --git a/backend/src/main/java/com/yfd/platform/qgc_env/fh/service/FhHabitatService.java b/backend/src/main/java/com/yfd/platform/qgc_env/fh/service/FhHabitatService.java index 267ff509..12e188e6 100644 --- a/backend/src/main/java/com/yfd/platform/qgc_env/fh/service/FhHabitatService.java +++ b/backend/src/main/java/com/yfd/platform/qgc_env/fh/service/FhHabitatService.java @@ -5,6 +5,7 @@ import com.yfd.platform.common.DataSourceResult; import com.yfd.platform.qgc_env.fh.entity.ao.FhDefaultAo; import com.yfd.platform.qgc_env.fh.entity.vo.FhBaseInfoVo; import com.yfd.platform.qgc_env.fh.entity.vo.FhDefaultVo; +import com.yfd.platform.qgc_env.fh.entity.vo.FhHaVapVo; import com.yfd.platform.qgc_env.fh.entity.vo.HabitatVo; public interface FhHabitatService { @@ -24,4 +25,6 @@ public interface FhHabitatService { FhBaseInfoVo getStcdInfo(String stcd); DataSourceResult getStTbYsBVoKendoListCust(DataSourceRequest dataSourceRequest); + + DataSourceResult getFhvapKendoListCust(DataSourceRequest dataSourceRequest); } diff --git a/backend/src/main/java/com/yfd/platform/qgc_env/fh/service/impl/FhHabitatServiceImpl.java b/backend/src/main/java/com/yfd/platform/qgc_env/fh/service/impl/FhHabitatServiceImpl.java index cef364cf..3cca065f 100644 --- a/backend/src/main/java/com/yfd/platform/qgc_env/fh/service/impl/FhHabitatServiceImpl.java +++ b/backend/src/main/java/com/yfd/platform/qgc_env/fh/service/impl/FhHabitatServiceImpl.java @@ -16,11 +16,13 @@ import com.yfd.platform.common.exception.BizException; import com.yfd.platform.qgc_env.fh.entity.ao.FhDefaultAo; import com.yfd.platform.qgc_env.fh.entity.vo.FhBaseInfoVo; import com.yfd.platform.qgc_env.fh.entity.vo.FhDefaultVo; +import com.yfd.platform.qgc_env.fh.entity.vo.FhHaVapVo; import com.yfd.platform.qgc_env.fh.entity.vo.HabitatVo; import com.yfd.platform.qgc_env.fh.entity.vo.FhMsstbprptVo; import com.yfd.platform.qgc_env.fh.entity.vo.FhSdriverdayVo; import com.yfd.platform.qgc_env.fh.entity.vo.FhSdrvwtsVo; import com.yfd.platform.qgc_env.fh.service.FhHabitatService; +import com.yfd.platform.qgc_env.wt.utils.SiteAvoidanceUtils; import com.yfd.platform.qgc_env.wq.entity.vo.StTbYsVo; import com.yfd.platform.utils.QgcQueryWrapperUtil; import jakarta.annotation.Resource; @@ -1920,4 +1922,76 @@ public class FhHabitatServiceImpl implements FhHabitatService { } return sql.toString(); } + + @Override + public DataSourceResult getFhvapKendoListCust(DataSourceRequest dataSourceRequest) { + DataSourceResult dataSourceResult = new DataSourceResult<>(); + dataSourceResult.setAggregates(new HashMap<>()); + + if (dataSourceRequest == null) { + dataSourceResult.setData(new ArrayList<>()); + dataSourceResult.setTotal(0L); + return dataSourceResult; + } + + StringBuilder sql = new StringBuilder(); + sql.append("SELECT ") + .append("t.BASE_ID AS baseId, ") + .append("hb.BASENAME AS baseName, ") + .append("t.STCD AS stcd, ") + .append("t.STNM AS stnm, ") + .append("t.STTP_CODE AS sttp, ") + .append("t.STTP_CODE AS sttpCode, ") + .append("t.STTP_CODE AS sttpMap, ") + .append("t.STTP_CODE AS anchoPointState, ") + .append("t.RSTCD AS rstcd, ") + .append("eng.ENNM AS ennm, ") + .append("NVL(t.HBRVCD, eng.HBRVCD) AS rvcd, ") + .append("t.LGTD AS lgtd, ") + .append("t.LTTD AS lttd, ") + .append("t.BLDSTT_CCODE AS bldsttCcode, ") + .append("t.ELEV AS dtmel, ") + .append("t.DTIN AS dtin ") + .append("FROM ( ") + .append(" SELECT STCD, STNM, 'FH' AS STTP_CODE, RSTCD, BASE_ID, HBRVCD, LGTD, LTTD, BLPRD AS BLDSTT_CCODE, ELEV, DTIN ") + .append(" FROM SD_FHBT_B_H WHERE NVL(IS_DELETED, 0) = 0 AND USFL = 1 ") + .append(" UNION ALL ") + .append(" SELECT STCD, STNM, STTP AS STTP_CODE, RSTCD, BASE_ID, HBRVCD, LGTD, LTTD, BLDSTT_CODE AS BLDSTT_CCODE, ELEV, DTIN ") + .append(" FROM SD_VA_B_H WHERE NVL(IS_DELETED, 0) = 0 AND USFL = 1 ") + .append(" UNION ALL ") + .append(" SELECT STCD, STNM, STTP AS STTP_CODE, RSTCD, BASE_ID, HBRVCD, LGTD, LTTD, BLDSTT_CODE AS BLDSTT_CCODE, ELEV, DTIN ") + .append(" FROM SD_VP_B_H WHERE NVL(IS_DELETED, 0) = 0 AND USFL = 1 ") + .append(") t ") + .append("LEFT JOIN SD_ENGINFO_B_H eng ON eng.STCD = t.RSTCD AND NVL(eng.IS_DELETED, 0) = 0 ") + .append("LEFT JOIN SD_HYDROBASE hb ON hb.BASEID = NVL(t.BASE_ID, eng.BASE_ID) AND NVL(hb.IS_DELETED, 0) = 0 ") + .append("WHERE t.LGTD IS NOT NULL AND t.LTTD IS NOT NULL "); + + DataSourceLoadOptionsBase loadOptions = dataSourceRequest.toDevRequest(); + Page page = loadOptions == null ? null : QgcQueryWrapperUtil.buildPage(loadOptions, loadOptions.getSkip(), loadOptions.getTake()); + List vaVpList = microservicDynamicSQLMapper.pageAllListWithResultType(page, sql.toString(), new HashMap<>(), FhHaVapVo.class); + + for (FhHaVapVo vo : vaVpList) { + String bldsttCcode = vo.getBldsttCcode(); + if (!"2".equals(bldsttCcode)) { + if ("VP".equals(vo.getSttp())) { + vo.setAnchoPointState("VP_INCOMPLETE"); + } else if ("VA".equals(vo.getSttp())) { + vo.setAnchoPointState("VA_INCOMPLETE"); + } + } + vo.setTitleName(vo.getStnm()); + vo.setSttpCode(vo.getSttp()); + } + + SiteAvoidanceUtils.calcSiteMapLev(vaVpList, + FhHaVapVo::getStcd, + FhHaVapVo::getLgtd, + FhHaVapVo::getLttd, + FhHaVapVo::getAnchoPointState, + FhHaVapVo::setDistance); + + dataSourceResult.setData(vaVpList); + dataSourceResult.setTotal(page == null ? vaVpList.size() : page.getTotal()); + return dataSourceResult; + } } 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 c81bf512..cdaec94d 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 @@ -2332,7 +2332,7 @@ public class FpRunServiceImpl implements FpRunService { " FROM ( " + " SELECT STCD, FTP " + " FROM SD_FPRUNPLAN_B " + - " WHERE (TASK_STATUS = 'Approved' OR TASK_STATUS IS NULL) " + + " WHERE 1=1 " + " AND IS_DELETED = 0 " + " AND STCD = #{map.stcd} " + " AND TO_CHAR(START_TIME, 'yyyy') = #{map.yr} " + @@ -2356,7 +2356,7 @@ public class FpRunServiceImpl implements FpRunService { " FROM ( " + " SELECT STCD, TO_CHAR(START_TIME, 'mm') AS stm, TO_CHAR(END_TIME, 'mm') AS edm, PYCNT AS pycnt " + " FROM SD_FPRUNPLAN_B " + - " WHERE (TASK_STATUS = 'Approved' OR TASK_STATUS IS NULL) " + + " WHERE 1=1 " + " AND IS_DELETED = 0 " + " AND STCD = #{map.stcd} " + " AND TO_CHAR(START_TIME, 'yyyy') = #{map.yr} " + @@ -2368,7 +2368,7 @@ public class FpRunServiceImpl implements FpRunService { " AND STCD NOT IN ( " + " SELECT STCD " + " FROM SD_FPRUNPLAN_B " + - " WHERE (TASK_STATUS = 'Approved' OR TASK_STATUS IS NULL) " + + " WHERE 1=1 " + " AND IS_DELETED = 0 " + " AND STCD = #{map.stcd} " + " AND TO_CHAR(START_TIME, 'yyyy') = #{map.yr} " + 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 ac9bf4e7..01cd74b5 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 @@ -523,8 +523,8 @@ public class WarnDataServiceImpl implements WarnDataService { sql.append("LEFT JOIN MS_ALONG_B along ON b.HBRVCD = along.RVCD AND along.CODE = 'common' AND NVL(along.IS_DELETED, 0) = 0 "); sql.append("LEFT JOIN (SELECT det.SORT, cfg.RVCD, det.STCD FROM MS_ALONGDET_B det INNER JOIN MS_ALONG_B cfg ON det.ALONG_ID = cfg.ID WHERE NVL(det.IS_DELETED, 0) = 0 AND NVL(cfg.IS_DELETED, 0) = 0 AND cfg.CODE = 'common') rstSort ON rstSort.RVCD = b.HBRVCD AND rstSort.STCD = b.RSTCD "); sql.append("LEFT JOIN (SELECT det.SORT, cfg.RVCD, det.STCD FROM MS_ALONGDET_B det INNER JOIN MS_ALONG_B cfg ON det.ALONG_ID = cfg.ID WHERE NVL(det.IS_DELETED, 0) = 0 AND NVL(cfg.IS_DELETED, 0) = 0 AND cfg.CODE = 'common') siteSort ON siteSort.RVCD = b.HBRVCD AND siteSort.STCD = b.STCD "); - sql.append("WHERE NVL(a.IS_DELETED, 0) = 0 "); - sql.append("AND (a.TASK_STATUS IS NULL OR a.TASK_STATUS = 'Approved') "); + sql.append("WHERE a.IS_DELETED = 0 "); +// sql.append("AND (a.TASK_STATUS IS NULL OR a.TASK_STATUS = 'Approved') "); sql.append("AND a.FID NOT LIKE '%ORA-%' AND a.FID NOT LIKE '%Out%' "); if (StrUtil.isNotBlank(type)) { diff --git a/backend/src/main/java/com/yfd/platform/system/service/impl/SmsVerifyCodeServiceImpl.java b/backend/src/main/java/com/yfd/platform/system/service/impl/SmsVerifyCodeServiceImpl.java index 20f531d7..de1c5d31 100644 --- a/backend/src/main/java/com/yfd/platform/system/service/impl/SmsVerifyCodeServiceImpl.java +++ b/backend/src/main/java/com/yfd/platform/system/service/impl/SmsVerifyCodeServiceImpl.java @@ -17,6 +17,7 @@ import org.springframework.transaction.annotation.Transactional; import java.util.Date; import java.util.List; import java.util.Random; +import java.util.Set; import java.util.regex.Pattern; import java.util.stream.Collectors; @@ -162,7 +163,7 @@ public class SmsVerifyCodeServiceImpl extends ServiceImpl validPhones = sysUsers.stream().map(SysUser::getPhone).filter(this::isValidPhone).toList(); + Set validPhones = sysUsers.stream().map(SysUser::getPhone).filter(this::isValidPhone).collect(Collectors.toSet()); if (validPhones.isEmpty()) { log.warn("催促短信发送失败:没有合规的手机号"); From 275cb5e4549bebdb3fe93792528f7c938f560bf4 Mon Sep 17 00:00:00 2001 From: tangwei Date: Mon, 6 Jul 2026 10:18:43 +0800 Subject: [PATCH 04/27] =?UTF-8?q?feat:=20=E7=94=B5=E7=AB=99=E5=87=BA?= =?UTF-8?q?=E5=85=A5=E5=BA=93=E6=B0=B4=E6=B8=A9=E6=8F=8F=E7=82=B9?= 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/WaterTempMapVO.java | 104 ++++++++++++++++ .../wt/service/SdWtMonitorService.java | 3 + .../service/impl/SdWtMonitorServiceImpl.java | 114 ++++++++++++++++++ 4 files changed, 227 insertions(+) create mode 100644 backend/src/main/java/com/yfd/platform/qgc_env/wt/entity/vo/WaterTempMapVO.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 828e4caf..ca3533ee 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 @@ -327,4 +327,10 @@ public class SdWTMonitorController { public ResponseResult getFacilityPointKendoListCust(@RequestBody DataSourceRequest dataSourceRequest) { return ResponseResult.successData(sdWtMonitorService.getFacilityPointKendoListCust(dataSourceRequest)); } + + @PostMapping("/getEngTempPointList/GetKendoListCust") + @Operation(summary = "电站出入库水温描点") + public ResponseResult getEngTempPointListKendoListCust(@RequestBody DataSourceRequest dataSourceRequest) { + return ResponseResult.successData(sdWtMonitorService.getEngTempPointListKendoListCust(dataSourceRequest)); + } } diff --git a/backend/src/main/java/com/yfd/platform/qgc_env/wt/entity/vo/WaterTempMapVO.java b/backend/src/main/java/com/yfd/platform/qgc_env/wt/entity/vo/WaterTempMapVO.java new file mode 100644 index 00000000..d5808d99 --- /dev/null +++ b/backend/src/main/java/com/yfd/platform/qgc_env/wt/entity/vo/WaterTempMapVO.java @@ -0,0 +1,104 @@ +package com.yfd.platform.qgc_env.wt.entity.vo; + +import io.swagger.v3.oas.annotations.media.Schema; +import lombok.Data; + +import java.math.BigDecimal; +import java.util.Date; + +@Data +@Schema(description = "水温监测点描点VO") +public class WaterTempMapVO { + + @Schema(description = "站点编码") + private String stcd; + + @Schema(description = "站名") + private String stnm; + + @Schema(description = "关联电站名称") + private String ennm; + + @Schema(description = "站点类型编码") + private String sttpCode; + + @Schema(description = "数据接入类型:0=自建,1=国家建,2=人工") + private String dtinType; + + @Schema(description = "站点类型") + private String sttp; + + @Schema(description = "锚点类型") + private String sttpMap; + + @Schema(description = "栖息地名称") + private String fhstnm; + + @Schema(description = "是否是垂向水温,0=否 1=是") + private Integer enfc; + + @Schema(description = "所在位置") + private String location; + + @Schema(description = "运行状态") + private String status = "1"; + + @Schema(description = "水温") + private BigDecimal temperature; + + @Schema(description = "日期") + private Date tm; + + @Schema(description = "经度") + private BigDecimal lgtd; + + @Schema(description = "纬度") + private BigDecimal lttd; + + @Schema(description = "高程") + private BigDecimal dtmel; + + @Schema(description = "弹框站点名称") + private String titleName; + + @Schema(description = "监测方式") + private Integer mway; + + @Schema(description = "垂向水温类型:1=浮动式 2=固定式") + private Integer deviceType; + + @Schema(description = "流域编码") + private String rvcd; + + @Schema(description = "行政编码") + private String addvcd; + + @Schema(description = "基地编码") + private String baseId; + + @Schema(description = "关联电站编码") + private String rstcds; + + @Schema(description = "描点状态") + private String anchoPointState; + + @Schema(description = "地图避让") + private Integer distance; + + @Schema(description = "垂向水温站点浮窗数据") + private Object wtvtInfo; + + @Schema(description = "水温值") + private BigDecimal value; + + @Schema(description = "排序") + private Integer orderIndex; + + @Schema(description = "出入库标识 (1 入库水温, 2 出库水温 ,3 非出入库水温)") + private Integer ioType; + + public void setTemperature(BigDecimal temperature) { + this.temperature = temperature; + this.value = temperature; + } +} \ No newline at end of file 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 ba092d0a..60398c1e 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 @@ -14,6 +14,7 @@ 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; import com.yfd.platform.qgc_env.wt.entity.vo.DwSlowFacilityMapVO; +import com.yfd.platform.qgc_env.wt.entity.vo.WaterTempMapVO; import java.util.List; @@ -54,4 +55,6 @@ public interface SdWtMonitorService { List getWtvtDefaultTreeStcd(DataSourceRequest dataSourceRequest); DataSourceResult getFacilityPointKendoListCust(DataSourceRequest dataSourceRequest); + + DataSourceResult getEngTempPointListKendoListCust(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 b6ce2afd..87a25b85 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 @@ -21,6 +21,7 @@ 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.entity.vo.DwSlowFacilityMapVO; +import com.yfd.platform.qgc_env.wt.entity.vo.WaterTempMapVO; import com.yfd.platform.qgc_env.wt.mapper.SdWtMonitorMapper; import com.yfd.platform.qgc_env.wt.utils.SiteAvoidanceUtils; import com.yfd.platform.qgc_env.wt.service.SdWtMonitorService; @@ -2921,4 +2922,117 @@ public class SdWtMonitorServiceImpl implements SdWtMonitorService { return dataSourceResult; } + @Override + public DataSourceResult getEngTempPointListKendoListCust(DataSourceRequest dataSourceRequest) { + DataSourceResult dataSourceResult = new DataSourceResult<>(); + dataSourceResult.setAggregates(new HashMap<>()); + + if (dataSourceRequest == null) { + dataSourceResult.setData(new ArrayList<>()); + dataSourceResult.setTotal(0L); + return dataSourceResult; + } + + DataSourceLoadOptionsBase loadOptions = dataSourceRequest.toDevRequest(); + String dtinType = QgcQueryWrapperUtil.getFilterFieldValue(loadOptions, "flag"); + String sttpCode = QgcQueryWrapperUtil.getFilterFieldValue(loadOptions, "sttpCode"); + String fhFlag = QgcQueryWrapperUtil.getFilterFieldValue(loadOptions, "fhFlag"); + + StringBuilder sql = new StringBuilder("SELECT\n" + + " wt.STCD AS stcd,\n" + + " wt.STNM AS stnm,\n" + + " wt.STNM AS titleName,\n" + + " wt.RSTCD AS rstcds,\n" + + " CASE\n" + + " WHEN wt.STTP = 'WTVT' THEN 1\n" + + " ELSE 0\n" + + " END AS enfc,\n" + + " 'WT' AS sttp,\n" + + " wt.STTP AS sttpCode,\n" + + " 'WT' AS sttpMap,\n" + + " wt.LGTD AS lgtd,\n" + + " wt.LTTD AS lttd,\n" + + " wt.WT_DEVICE_TYPE AS deviceType,\n" + + " wt.ELEV AS dtmel,\n" + + " wt.FHSTNM AS fhstnm,\n" + + " wt.MWAY AS mway,\n" + + " eng.RVCD AS rvcd,\n" + + " eng.ADDVCD AS addvcd,\n" + + " eng.BASE_ID AS baseId,\n" + + " eng.ENNM AS ennm,\n" + + " wt.ORDER_INDEX AS orderIndex,\n" + + " wt.DTIN_TYPE AS dtinType,\n" + + " (CASE\n" + + " WHEN wt.STTP = 'WTRV' AND rel.ENG_IWT_CODE IS NOT NULL THEN 1\n" + + " WHEN wt.STTP = 'WTRV' AND rel.ENG_DWT_CODE IS NOT NULL THEN 2\n" + + " WHEN wt.STTP = 'WTRV' AND rel.ENG_IWT_CODE IS NULL AND rel.ENG_DWT_CODE IS NULL THEN 3\n" + + " END) AS ioType\n" + + "FROM SD_WT_B_H wt\n" + + "LEFT JOIN SD_ENGINFO_B_H eng ON eng.STCD = wt.RSTCD AND NVL(eng.IS_DELETED, 0) = 0\n" + + "LEFT JOIN SD_WTENGRLTN_B rel ON rel.STCD = wt.STCD AND NVL(rel.IS_DELETED, 0) = 0\n" + + "WHERE NVL(wt.IS_DELETED, 0) = 0 AND wt.STTP IN ('WTRV', 'WTVT') AND wt.LGTD IS NOT NULL AND wt.LTTD IS NOT NULL "); + + if (StrUtil.isNotBlank(sttpCode)) { + sql.append(" AND wt.STTP = #{map.sttpCode} "); + } + if (StrUtil.isNotBlank(dtinType)) { + sql.append(" AND wt.DTIN_TYPE = #{map.dtinType} "); + } + + Map paramMap = new HashMap<>(); + if (StrUtil.isNotBlank(sttpCode)) { + paramMap.put("sttpCode", sttpCode); + } + if (StrUtil.isNotBlank(dtinType)) { + paramMap.put("dtinType", dtinType); + } + + List sort = dataSourceRequest.getSort(); + if (sort != null && !sort.isEmpty()) { + sql.append(" ORDER BY "); + for (int i = 0; i < sort.size(); i++) { + String field = sort.get(i).getField(); + String dir = sort.get(i).getDir(); + sql.append(field).append(" ").append(dir); + if (i < sort.size() - 1) { + sql.append(","); + } + } + } else { + sql.append(" ORDER BY wt.ORDER_INDEX ASC "); + } + + Page page = QgcQueryWrapperUtil.buildPage(loadOptions, loadOptions.getSkip(), loadOptions.getTake()); + List resultList = microservicDynamicSQLMapper.pageAllListWithResultType(page, sql.toString(), paramMap, WaterTempMapVO.class); + + for (WaterTempMapVO vo : resultList) { + if (StrUtil.isNotBlank(fhFlag)) { + vo.setAnchoPointState("fhwt_legend"); + } else if (StrUtil.isNotBlank(dtinType)) { + if ("0".equals(dtinType)) { + vo.setAnchoPointState("stinfo_wtzj_legend"); + } else if ("2".equals(dtinType)) { + vo.setAnchoPointState("stinfo_wtrg_legend"); + } + } else { + if (vo.getMway() != null && vo.getMway() == 1) { + vo.setAnchoPointState("WT_1"); + } else if (vo.getMway() != null && vo.getMway() == 2) { + vo.setAnchoPointState("WT_2"); + } + } + } + + SiteAvoidanceUtils.calcSiteMapLev(resultList, + WaterTempMapVO::getStcd, + WaterTempMapVO::getLgtd, + WaterTempMapVO::getLttd, + WaterTempMapVO::getAnchoPointState, + WaterTempMapVO::setDistance); + + dataSourceResult.setData(resultList); + dataSourceResult.setTotal(page == null ? resultList.size() : page.getTotal()); + return dataSourceResult; + } + } From aa71489035d4b59b9b0c8eb24c8cead38e700751 Mon Sep 17 00:00:00 2001 From: tangwei Date: Mon, 6 Jul 2026 10:34:48 +0800 Subject: [PATCH 05/27] =?UTF-8?q?feat:=20=E6=B5=81=E9=87=8F=E7=AB=99?= =?UTF-8?q?=E9=94=9A=E7=82=B9=E6=8E=A5=E5=8F=A3?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../zq/controller/ZqMonitorController.java | 6 ++ .../qgc_env/zq/entity/vo/ZqPoint.java | 93 +++++++++++++++++++ .../qgc_env/zq/service/ZqMonitorService.java | 3 + .../zq/service/impl/ZqMonitorServiceImpl.java | 76 +++++++++++++++ 4 files changed, 178 insertions(+) create mode 100644 backend/src/main/java/com/yfd/platform/qgc_env/zq/entity/vo/ZqPoint.java diff --git a/backend/src/main/java/com/yfd/platform/qgc_env/zq/controller/ZqMonitorController.java b/backend/src/main/java/com/yfd/platform/qgc_env/zq/controller/ZqMonitorController.java index 7629326f..6f166ed8 100644 --- a/backend/src/main/java/com/yfd/platform/qgc_env/zq/controller/ZqMonitorController.java +++ b/backend/src/main/java/com/yfd/platform/qgc_env/zq/controller/ZqMonitorController.java @@ -82,4 +82,10 @@ public class ZqMonitorController { public ResponseResult getStcdInfo(@RequestParam String stcd) { return ResponseResult.successData(zqMonitorService.getStcdInfo(stcd)); } + + @PostMapping("/zqpoint/GetKendoListCust") + @Operation(summary = "流量站锚点接口") + public ResponseResult getZqPointKendoListCust(@RequestBody DataSourceRequest dataSourceRequest) { + return ResponseResult.successData(zqMonitorService.getZqPointKendoListCust(dataSourceRequest)); + } } diff --git a/backend/src/main/java/com/yfd/platform/qgc_env/zq/entity/vo/ZqPoint.java b/backend/src/main/java/com/yfd/platform/qgc_env/zq/entity/vo/ZqPoint.java new file mode 100644 index 00000000..1ebb5502 --- /dev/null +++ b/backend/src/main/java/com/yfd/platform/qgc_env/zq/entity/vo/ZqPoint.java @@ -0,0 +1,93 @@ +package com.yfd.platform.qgc_env.zq.entity.vo; + +import io.swagger.v3.oas.annotations.media.Schema; +import lombok.Data; + +import java.math.BigDecimal; +import java.util.Date; + +@Data +@Schema(description = "流量站锚点VO") +public class ZqPoint { + + @Schema(description = "站点编码") + private String stcd; + + @Schema(description = "站名") + private String stnm; + + @Schema(description = "流域名称") + private String rvnm; + + @Schema(description = "关联电站名称") + private String ennm; + + @Schema(description = "栖息地编码") + private String fhstcd; + + @Schema(description = "栖息地名称") + private String fhstnm; + + @Schema(description = "站点类型名称") + private String sttpName; + + @Schema(description = "日期") + private Date tm; + + @Schema(description = "水位") + private BigDecimal z; + + @Schema(description = "流量") + private BigDecimal q; + + @Schema(description = "流速") + private BigDecimal v; + + @Schema(description = "数据接入类型") + private String dtinType; + + @Schema(description = "站点排序") + private Integer siteStepSort; + + @Schema(description = "站点类型编码") + private String sttpCode; + + @Schema(description = "站点类型") + private String sttp; + + @Schema(description = "锚点类型") + private String sttpMap; + + @Schema(description = "经度") + private BigDecimal lgtd; + + @Schema(description = "纬度") + private BigDecimal lttd; + + @Schema(description = "高程") + private BigDecimal dtmel; + + @Schema(description = "描点状态") + private String anchoPointState; + + @Schema(description = "弹框站点名称") + private String titleName; + + @Schema(description = "流域编码") + private String rvcd; + + @Schema(description = "行政编码") + private String addvcd; + + @Schema(description = "基地编码") + private String baseId; + + @Schema(description = "关联电站编码") + private String rstcds; + + @Schema(description = "地图避让") + private Integer distance; + + @Schema(description = "站址") + private String stlc; +} \ No newline at end of file diff --git a/backend/src/main/java/com/yfd/platform/qgc_env/zq/service/ZqMonitorService.java b/backend/src/main/java/com/yfd/platform/qgc_env/zq/service/ZqMonitorService.java index f2468d65..f7fc85cb 100644 --- a/backend/src/main/java/com/yfd/platform/qgc_env/zq/service/ZqMonitorService.java +++ b/backend/src/main/java/com/yfd/platform/qgc_env/zq/service/ZqMonitorService.java @@ -4,6 +4,7 @@ import com.yfd.platform.common.DataSourceRequest; import com.yfd.platform.common.DataSourceResult; import com.yfd.platform.qgc_base.entity.vo.BatchDeleteAo; import com.yfd.platform.qgc_env.zq.entity.vo.ZqBaseInfoVo; +import com.yfd.platform.qgc_env.zq.entity.vo.ZqPoint; import com.yfd.platform.qgc_env.zq.entity.vo.ZqRiverDayDataVo; import com.yfd.platform.qgc_env.zq.entity.vo.ZqRiverDrtpDataVo; import com.yfd.platform.qgc_env.zq.entity.vo.ZqRiverDataVo; @@ -25,4 +26,6 @@ public interface ZqMonitorService { boolean updateRiverRData(java.util.Map updateData, String source); ZqBaseInfoVo getStcdInfo(String stcd); + + DataSourceResult getZqPointKendoListCust(DataSourceRequest dataSourceRequest); } diff --git a/backend/src/main/java/com/yfd/platform/qgc_env/zq/service/impl/ZqMonitorServiceImpl.java b/backend/src/main/java/com/yfd/platform/qgc_env/zq/service/impl/ZqMonitorServiceImpl.java index a573ce04..e5f8e482 100644 --- a/backend/src/main/java/com/yfd/platform/qgc_env/zq/service/impl/ZqMonitorServiceImpl.java +++ b/backend/src/main/java/com/yfd/platform/qgc_env/zq/service/impl/ZqMonitorServiceImpl.java @@ -18,9 +18,11 @@ import com.yfd.platform.qgc_base.mapper.MsOperationLogDetailMapper; import com.yfd.platform.qgc_base.mapper.MsOperationLogMapper; import com.yfd.platform.qgc_env.fh.entity.vo.HabitatVo; import com.yfd.platform.qgc_env.zq.entity.vo.ZqBaseInfoVo; +import com.yfd.platform.qgc_env.zq.entity.vo.ZqPoint; import com.yfd.platform.qgc_env.zq.entity.vo.ZqRiverDayDataVo; import com.yfd.platform.qgc_env.zq.entity.vo.ZqRiverDrtpDataVo; import com.yfd.platform.qgc_env.zq.entity.vo.ZqRiverDataVo; +import com.yfd.platform.qgc_env.wt.utils.SiteAvoidanceUtils; import com.yfd.platform.qgc_env.zq.service.ZqMonitorService; import com.yfd.platform.utils.QgcQueryWrapperUtil; import com.yfd.platform.utils.SecurityUtils; @@ -2370,4 +2372,78 @@ public class ZqMonitorServiceImpl implements ZqMonitorService { } return " ORDER BY " + String.join(", ", orderColumns); } + + @Override + public DataSourceResult getZqPointKendoListCust(DataSourceRequest dataSourceRequest) { + DataSourceResult dataSourceResult = new DataSourceResult<>(); + dataSourceResult.setAggregates(new HashMap<>()); + + if (dataSourceRequest == null) { + dataSourceResult.setData(new ArrayList<>()); + dataSourceResult.setTotal(0L); + return dataSourceResult; + } + + StringBuilder sql = new StringBuilder("SELECT\n" + + " rb.STCD AS stcd,\n" + + " rb.STNM AS stnm,\n" + + " rb.STNM AS titleName,\n" + + " rb.RSTCD AS rstcds,\n" + + " CASE\n" + + " WHEN rb.DTIN_TYPE = 0 THEN 'zjllz'\n" + + " WHEN rb.DTIN_TYPE = 1 THEN 'gjllz'\n" + + " ELSE ''\n" + + " END AS anchoPointState,\n" + + " 'ZQ' AS sttpMap,\n" + + " rb.STTP AS sttp,\n" + + " rb.STTP AS sttpCode,\n" + + " rb.LGTD AS lgtd,\n" + + " rb.LTTD AS lttd,\n" + + " rb.ELEV AS dtmel,\n" + + " rb.STLC AS stlc,\n" + + " eng.RVCD AS rvcd,\n" + + " eng.ADDVCD AS addvcd,\n" + + " rv.RVNM AS rvnm,\n" + + " eng.BASE_ID AS baseId,\n" + + " eng.ENNM AS ennm,\n" + + " rb.FHSTCD AS fhstcd,\n" + + " fh.STNM AS fhstnm,\n" + + " rb.DTIN_TYPE AS dtinType,\n" + + " NVL(siteSort.SORT, 999999) AS siteStepSort\n" + + "FROM SD_RIVER_B_H rb\n" + + "LEFT JOIN SD_ENGINFO_B_H eng ON eng.STCD = rb.RSTCD AND NVL(eng.IS_DELETED, 0) = 0\n" + + "LEFT JOIN SD_RVCD_DIC rv ON rv.RVCD = eng.RVCD\n" + + "LEFT JOIN SD_RIVER_B_H fh ON fh.STCD = rb.FHSTCD AND NVL(fh.IS_DELETED, 0) = 0\n" + + "LEFT JOIN (\n" + + " SELECT det.SORT, cfg.RVCD, det.STCD\n" + + " FROM MS_ALONGDET_B det\n" + + " INNER JOIN MS_ALONG_B cfg ON det.ALONG_ID = cfg.ID\n" + + " WHERE NVL(det.IS_DELETED, 0) = 0 AND NVL(cfg.IS_DELETED, 0) = 0 AND cfg.CODE = 'common'\n" + + ") siteSort ON siteSort.RVCD = eng.HBRVCD AND siteSort.STCD = rb.STCD\n" + + "WHERE NVL(rb.IS_DELETED, 0) = 0 AND rb.STTP = 'ZQ' AND rb.LGTD IS NOT NULL AND rb.LTTD IS NOT NULL "); + + Map paramMap = new HashMap<>(); + + DataSourceLoadOptionsBase loadOptions = dataSourceRequest.toDevRequest(); + String filterSql = buildMsstbprptFilterCondition(loadOptions.getFilter(), paramMap, new int[]{0}); + if (StrUtil.isNotBlank(filterSql)) { + sql.append(" AND ").append(filterSql).append(" "); + } + + sql.append(" ORDER BY siteStepSort ASC "); + + Page page = QgcQueryWrapperUtil.buildPage(loadOptions, loadOptions.getSkip(), loadOptions.getTake()); + List resultList = microservicDynamicSQLMapper.pageAllListWithResultType(page, sql.toString(), paramMap, ZqPoint.class); + + SiteAvoidanceUtils.calcSiteMapLev(resultList, + ZqPoint::getStcd, + ZqPoint::getLgtd, + ZqPoint::getLttd, + ZqPoint::getAnchoPointState, + ZqPoint::setDistance); + + dataSourceResult.setData(resultList); + dataSourceResult.setTotal(page == null ? resultList.size() : page.getTotal()); + return dataSourceResult; + } } From c056d30682d0261d2a8ef67a8f6598efddbadb08 Mon Sep 17 00:00:00 2001 From: tangwei Date: Mon, 6 Jul 2026 10:49:40 +0800 Subject: [PATCH 06/27] =?UTF-8?q?feat:=20=E8=BF=87=E9=B1=BC=E8=AE=BE?= =?UTF-8?q?=E6=96=BD=E5=9C=B0=E5=9B=BE=E6=8F=8F=E7=82=B9=E6=8E=A5=E5=8F=A3?= =?UTF-8?q?(=E4=BB=85=E6=9F=A5=E8=AF=A2=E5=9C=A8=E5=BB=BA=E7=8A=B6?= =?UTF-8?q?=E6=80=81=E7=9A=84)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../fp/controller/FishPassageController.java | 8 +- .../qgc_env/fp/entity/vo/FpAnchoPointVo.java | 89 +++++++++ .../qgc_env/fp/service/FpBuildService.java | 3 + .../fp/service/impl/FpBuildServiceImpl.java | 175 ++++++++++++++++++ .../zq/service/impl/ZqMonitorServiceImpl.java | 2 +- 5 files changed, 272 insertions(+), 5 deletions(-) create mode 100644 backend/src/main/java/com/yfd/platform/qgc_env/fp/entity/vo/FpAnchoPointVo.java diff --git a/backend/src/main/java/com/yfd/platform/qgc_env/fp/controller/FishPassageController.java b/backend/src/main/java/com/yfd/platform/qgc_env/fp/controller/FishPassageController.java index 25fb7bb6..7ed024a6 100644 --- a/backend/src/main/java/com/yfd/platform/qgc_env/fp/controller/FishPassageController.java +++ b/backend/src/main/java/com/yfd/platform/qgc_env/fp/controller/FishPassageController.java @@ -106,9 +106,9 @@ public class FishPassageController { return ResponseResult.successData(fpBuildService.getStInfoByStcd(stcd)); } - @GetMapping("/run/qgc/year/GetYearFpStatistics") - @Operation(summary = "全过程过鱼统计总数,根据基地分组") - public ResponseResult getYearFpStatic(@RequestParam("year") String year) { - return ResponseResult.successData(fpRunService.getYearFpStatic(year)); + @PostMapping("/point/built/GetKendoListCust") + @Operation(summary = "过鱼设施地图描点接口(仅查询在建状态的)") + public ResponseResult getFpBuiltPointKendoListCust(@RequestBody DataSourceRequest dataSourceRequest) { + return ResponseResult.successData(fpBuildService.getFpBuiltPointKendoListCust(dataSourceRequest)); } } diff --git a/backend/src/main/java/com/yfd/platform/qgc_env/fp/entity/vo/FpAnchoPointVo.java b/backend/src/main/java/com/yfd/platform/qgc_env/fp/entity/vo/FpAnchoPointVo.java new file mode 100644 index 00000000..f803e21c --- /dev/null +++ b/backend/src/main/java/com/yfd/platform/qgc_env/fp/entity/vo/FpAnchoPointVo.java @@ -0,0 +1,89 @@ +package com.yfd.platform.qgc_env.fp.entity.vo; + +import io.swagger.v3.oas.annotations.media.Schema; +import lombok.Data; + +import java.math.BigDecimal; + +@Data +@Schema(description = "过鱼设施锚点VO") +public class FpAnchoPointVo { + + @Schema(description = "站点编码") + private String stcd; + + @Schema(description = "站名") + private String stnm; + + @Schema(description = "弹框站点名称") + private String titleName; + + @Schema(description = "建设状态编码") + private String bldsttCcode; + + @Schema(description = "建设状态") + private String bldstt; + + @Schema(description = "纬度") + private BigDecimal lttd; + + @Schema(description = "经度") + private BigDecimal lgtd; + + @Schema(description = "高程") + private BigDecimal dtmel; + + @Schema(description = "关联电站编码") + private String rstcds; + + @Schema(description = "电站名称") + private String ennm; + + @Schema(description = "站点类型编码") + private String sttpCode; + + @Schema(description = "运行状态") + private String run; + + @Schema(description = "设施类型") + private String dwtp; + + @Schema(description = "设施类型名称") + private String dwtpName; + + @Schema(description = "锚点类型") + private String sttpMap; + + @Schema(description = "流域编码") + private String rvcd; + + @Schema(description = "行政编码") + private String addvcd; + + @Schema(description = "基地编码") + private String baseId; + + @Schema(description = "站点类型") + private String sttp; + + @Schema(description = "描点状态") + private String anchoPointState; + + @Schema(description = "监测方式") + private Integer mway; + + @Schema(description = "数据接入") + private Integer dtin; + + @Schema(description = "达标状态子类型") + private Integer stdSstate; + + @Schema(description = "地图避让") + private Integer distance; + + @Schema(description = "过鱼种类") + private Integer ftpTypeCount; + + @Schema(description = "过鱼数量") + private Integer ftpCount; +} \ No newline at end of file diff --git a/backend/src/main/java/com/yfd/platform/qgc_env/fp/service/FpBuildService.java b/backend/src/main/java/com/yfd/platform/qgc_env/fp/service/FpBuildService.java index 56b2fadb..67e8973d 100644 --- a/backend/src/main/java/com/yfd/platform/qgc_env/fp/service/FpBuildService.java +++ b/backend/src/main/java/com/yfd/platform/qgc_env/fp/service/FpBuildService.java @@ -2,6 +2,7 @@ package com.yfd.platform.qgc_env.fp.service; import com.yfd.platform.common.DataSourceRequest; import com.yfd.platform.common.DataSourceResult; +import com.yfd.platform.qgc_env.fp.entity.vo.FpAnchoPointVo; import com.yfd.platform.qgc_env.fp.entity.vo.FpConstructionSituationVo; import com.yfd.platform.qgc_env.fp.entity.vo.FpFishDicVo; import com.yfd.platform.qgc_env.fp.entity.vo.FpVmsstbprptVo; @@ -19,4 +20,6 @@ public interface FpBuildService { DataSourceResult getFpqMsstbprptList(DataSourceRequest dataSourceRequest); FpVmsstbprptVo getStInfoByStcd(String stcd); + + DataSourceResult getFpBuiltPointKendoListCust(DataSourceRequest dataSourceRequest); } diff --git a/backend/src/main/java/com/yfd/platform/qgc_env/fp/service/impl/FpBuildServiceImpl.java b/backend/src/main/java/com/yfd/platform/qgc_env/fp/service/impl/FpBuildServiceImpl.java index 4e504346..653cf89d 100644 --- a/backend/src/main/java/com/yfd/platform/qgc_env/fp/service/impl/FpBuildServiceImpl.java +++ b/backend/src/main/java/com/yfd/platform/qgc_env/fp/service/impl/FpBuildServiceImpl.java @@ -11,9 +11,11 @@ import com.yfd.platform.common.GroupingInfo; import com.yfd.platform.common.MicroservicDynamicSQLMapper; import com.yfd.platform.common.PageInfo; import com.yfd.platform.common.exception.BizException; +import com.yfd.platform.qgc_env.fp.entity.vo.FpAnchoPointVo; import com.yfd.platform.qgc_env.fp.entity.vo.FpConstructionSituationVo; import com.yfd.platform.qgc_env.fp.entity.vo.FpFishDicVo; import com.yfd.platform.qgc_env.fp.entity.vo.FpVmsstbprptVo; +import com.yfd.platform.qgc_env.wt.utils.SiteAvoidanceUtils; import com.yfd.platform.qgc_env.fp.service.FpBuildService; import com.yfd.platform.utils.QgcQueryWrapperUtil; import jakarta.annotation.Resource; @@ -1142,4 +1144,177 @@ public class FpBuildServiceImpl implements FpBuildService { default -> null; }; } + + @Override + public DataSourceResult getFpBuiltPointKendoListCust(DataSourceRequest dataSourceRequest) { + DataSourceResult dataSourceResult = new DataSourceResult<>(); + dataSourceResult.setAggregates(new HashMap<>()); + + if (dataSourceRequest == null) { + dataSourceResult.setData(new ArrayList<>()); + dataSourceResult.setTotal(0L); + return dataSourceResult; + } + + StringBuilder sql = new StringBuilder("SELECT\n" + + " fp.STCD AS stcd,\n" + + " fp.STNM AS stnm,\n" + + " fp.STNM AS titleName,\n" + + " fp.BLDSTT_CODE AS bldsttCcode,\n" + + " fp.BLDSTT_CODE AS bldstt,\n" + + " fp.LTTD AS lttd,\n" + + " fp.LGTD AS lgtd,\n" + + " fp.ELEV AS dtmel,\n" + + " fp.RSTCD AS rstcds,\n" + + " eng.ENNM AS ennm,\n" + + " 'FP' AS sttpCode,\n" + + " fp.STTP AS dwtp,\n" + + " CASE\n" + + " WHEN fp.STTP = 'FP_1' THEN '鱼道'\n" + + " WHEN fp.STTP = 'FP_2' THEN '仿自然通道'\n" + + " WHEN fp.STTP = 'FP_3' THEN '集运鱼系统'\n" + + " WHEN fp.STTP = 'FP_4' THEN '升鱼机'\n" + + " ELSE '其它'\n" + + " END AS dwtpName,\n" + + " fp.STTP AS sttpMap,\n" + + " eng.RVCD AS rvcd,\n" + + " eng.ADDVCD AS addvcd,\n" + + " eng.BASE_ID AS baseId,\n" + + " fp.STTP AS sttp,\n" + + " fp.MWAY AS mway,\n" + + " fp.DTIN AS dtin\n" + + "FROM SD_FPSS_B_H fp\n" + + "LEFT JOIN SD_ENGINFO_B_H eng ON eng.STCD = fp.RSTCD AND NVL(eng.IS_DELETED, 0) = 0\n" + + "WHERE NVL(fp.IS_DELETED, 0) = 0 AND fp.BLDSTT_CODE = 1 AND fp.LGTD IS NOT NULL AND fp.LTTD IS NOT NULL "); + + Map paramMap = new HashMap<>(); + + DataSourceLoadOptionsBase loadOptions = dataSourceRequest.toDevRequest(); + String filterSql = buildFpPointFilterCondition(loadOptions.getFilter(), paramMap, new int[]{0}); + if (StrUtil.isNotBlank(filterSql)) { + sql.append(" AND ").append(filterSql).append(" "); + } + + sql.append(" ORDER BY fp.ORDER_INDEX ASC "); + + Page page = QgcQueryWrapperUtil.buildPage(loadOptions, loadOptions.getSkip(), loadOptions.getTake()); + List resultList = microservicDynamicSQLMapper.pageAllListWithResultType(page, sql.toString(), paramMap, FpAnchoPointVo.class); + + for (FpAnchoPointVo vo : resultList) { + String sttp = vo.getSttp(); + if ("FP_1".equals(sttp)) { + vo.setAnchoPointState("GY_1_BUILT"); + } else if ("FP_2".equals(sttp)) { + vo.setAnchoPointState("GY_2_BUILT"); + } else if ("FP_3".equals(sttp)) { + vo.setAnchoPointState("GY_3_BUILT"); + } else if ("FP_4".equals(sttp)) { + vo.setAnchoPointState("GY_4_BUILT"); + } else { + vo.setAnchoPointState("GY_5_BUILT"); + } + } + + SiteAvoidanceUtils.calcSiteMapLev(resultList, + FpAnchoPointVo::getStcd, + FpAnchoPointVo::getLgtd, + FpAnchoPointVo::getLttd, + FpAnchoPointVo::getAnchoPointState, + FpAnchoPointVo::setDistance); + + dataSourceResult.setData(resultList); + dataSourceResult.setTotal(page == null ? resultList.size() : page.getTotal()); + return dataSourceResult; + } + + private String buildFpPointFilterCondition(DataSourceRequest.FilterDescriptor filter, + Map paramMap, + int[] indexHolder) { + if (filter == null) { + return ""; + } + if (filter.getField() != null && !filter.getField().isBlank()) { + return buildFpPointLeafCondition(filter, paramMap, indexHolder); + } + if (CollectionUtils.isEmpty(filter.getFilters())) { + return ""; + } + List conditions = new ArrayList<>(); + for (DataSourceRequest.FilterDescriptor child : filter.getFilters()) { + String childSql = buildFpPointFilterCondition(child, paramMap, indexHolder); + if (!childSql.isBlank()) { + conditions.add("(" + childSql + ")"); + } + } + if (conditions.isEmpty()) { + return ""; + } + String logic = "or".equalsIgnoreCase(filter.getLogic()) ? " OR " : " AND "; + return String.join(logic, conditions); + } + + private String buildFpPointLeafCondition(DataSourceRequest.FilterDescriptor filter, + Map paramMap, + int[] indexHolder) { + String field = filter.getField(); + if (field == null || field.isBlank()) { + return ""; + } + String column = switch (field) { + case "stcd" -> "fp.STCD"; + case "stnm" -> "fp.STNM"; + case "baseId" -> "eng.BASE_ID"; + case "rvcd" -> "eng.RVCD"; + case "addvcd" -> "eng.ADDVCD"; + case "sttp" -> "fp.STTP"; + default -> null; + }; + if (column == 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 ("in".equals(operator)) { + List values = normalizeValues(value); + if (values.isEmpty()) { + return ""; + } + List placeholders = new ArrayList<>(); + for (Object item : values) { + String paramKey = "fpPointParam" + indexHolder[0]++; + paramMap.put(paramKey, item); + placeholders.add("#{map." + paramKey + "}"); + } + return column + " IN (" + String.join(", ", placeholders) + ")"; + } + if (value == null) { + return ""; + } + String paramKey = "fpPointParam" + indexHolder[0]++; + switch (operator) { + case "eq": + paramMap.put(paramKey, value); + return column + " = #{map." + paramKey + "}"; + case "neq": + paramMap.put(paramKey, value); + return column + " <> #{map." + paramKey + "}"; + case "contains": + paramMap.put(paramKey, "%" + value + "%"); + return column + " LIKE #{map." + paramKey + "}"; + case "startswith": + paramMap.put(paramKey, value + "%"); + return column + " LIKE #{map." + paramKey + "}"; + case "endswith": + paramMap.put(paramKey, "%" + value); + return column + " LIKE #{map." + paramKey + "}"; + default: + return ""; + } + } } diff --git a/backend/src/main/java/com/yfd/platform/qgc_env/zq/service/impl/ZqMonitorServiceImpl.java b/backend/src/main/java/com/yfd/platform/qgc_env/zq/service/impl/ZqMonitorServiceImpl.java index e5f8e482..6263bed7 100644 --- a/backend/src/main/java/com/yfd/platform/qgc_env/zq/service/impl/ZqMonitorServiceImpl.java +++ b/backend/src/main/java/com/yfd/platform/qgc_env/zq/service/impl/ZqMonitorServiceImpl.java @@ -2425,7 +2425,7 @@ public class ZqMonitorServiceImpl implements ZqMonitorService { Map paramMap = new HashMap<>(); DataSourceLoadOptionsBase loadOptions = dataSourceRequest.toDevRequest(); - String filterSql = buildMsstbprptFilterCondition(loadOptions.getFilter(), paramMap, new int[]{0}); + String filterSql = buildMsstbprptFilterCondition(dataSourceRequest == null ? null : dataSourceRequest.getFilter(), paramMap, new int[]{0}); if (StrUtil.isNotBlank(filterSql)) { sql.append(" AND ").append(filterSql).append(" "); } From d6ab49711aa0e08cc2c7a671a3faece84f616369 Mon Sep 17 00:00:00 2001 From: tangwei Date: Mon, 6 Jul 2026 11:12:30 +0800 Subject: [PATCH 07/27] =?UTF-8?q?feat:=20=E5=85=A8=E8=BF=87=E7=A8=8B?= =?UTF-8?q?=E8=BF=87=E9=B1=BC=E7=BB=9F=E8=AE=A1=E6=80=BB=E6=95=B0=EF=BC=8C?= =?UTF-8?q?=E6=A0=B9=E6=8D=AE=E5=9F=BA=E5=9C=B0=E5=88=86=E7=BB=84?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../qgc_env/fp/controller/FishPassageController.java | 6 ++++++ .../qgc_env/fp/service/impl/FpBuildServiceImpl.java | 2 +- 2 files changed, 7 insertions(+), 1 deletion(-) diff --git a/backend/src/main/java/com/yfd/platform/qgc_env/fp/controller/FishPassageController.java b/backend/src/main/java/com/yfd/platform/qgc_env/fp/controller/FishPassageController.java index 7ed024a6..21dedacf 100644 --- a/backend/src/main/java/com/yfd/platform/qgc_env/fp/controller/FishPassageController.java +++ b/backend/src/main/java/com/yfd/platform/qgc_env/fp/controller/FishPassageController.java @@ -111,4 +111,10 @@ public class FishPassageController { public ResponseResult getFpBuiltPointKendoListCust(@RequestBody DataSourceRequest dataSourceRequest) { return ResponseResult.successData(fpBuildService.getFpBuiltPointKendoListCust(dataSourceRequest)); } + + @GetMapping("/run/qgc/year/GetYearFpStatistics") + @Operation(summary = "全过程过鱼统计总数,根据基地分组") + public ResponseResult getYearFpStatic(@RequestParam("year") String year) { + return ResponseResult.successData(fpRunService.getYearFpStatic(year)); + } } diff --git a/backend/src/main/java/com/yfd/platform/qgc_env/fp/service/impl/FpBuildServiceImpl.java b/backend/src/main/java/com/yfd/platform/qgc_env/fp/service/impl/FpBuildServiceImpl.java index 653cf89d..b96d8ef3 100644 --- a/backend/src/main/java/com/yfd/platform/qgc_env/fp/service/impl/FpBuildServiceImpl.java +++ b/backend/src/main/java/com/yfd/platform/qgc_env/fp/service/impl/FpBuildServiceImpl.java @@ -1190,7 +1190,7 @@ public class FpBuildServiceImpl implements FpBuildService { Map paramMap = new HashMap<>(); DataSourceLoadOptionsBase loadOptions = dataSourceRequest.toDevRequest(); - String filterSql = buildFpPointFilterCondition(loadOptions.getFilter(), paramMap, new int[]{0}); + String filterSql = buildFpPointFilterCondition(dataSourceRequest.getFilter(), paramMap, new int[]{0}); if (StrUtil.isNotBlank(filterSql)) { sql.append(" AND ").append(filterSql).append(" "); } From fdaba51634eed3f9fdc335ab050419332881ff9a Mon Sep 17 00:00:00 2001 From: tangwei Date: Mon, 6 Jul 2026 11:36:11 +0800 Subject: [PATCH 08/27] =?UTF-8?q?feat:=20=E6=A0=96=E6=81=AF=E5=9C=B0/?= =?UTF-8?q?=E7=8F=8D=E7=A8=80=E6=A4=8D=E7=89=A9=E5=9B=AD/=E5=8A=A8?= =?UTF-8?q?=E7=89=A9=E6=95=91=E5=8A=A9=E7=AB=99=E6=8F=8F=E7=82=B9=E6=8E=A5?= =?UTF-8?q?=E5=8F=A3(=E4=BB=85=E6=9F=A5=E8=AF=A2=E5=9C=A8=E5=BB=BA?= =?UTF-8?q?=E7=8A=B6=E6=80=81=E7=9A=84)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../controller/VapConstructionController.java | 6 + .../vap/entity/vo/FhvapBuiltPointVo.java | 57 +++++ .../vap/service/VpConstructionService.java | 3 + .../impl/VpConstructionServiceImpl.java | 216 ++++++++++++++++++ 4 files changed, 282 insertions(+) create mode 100644 backend/src/main/java/com/yfd/platform/qgc_env/vap/entity/vo/FhvapBuiltPointVo.java diff --git a/backend/src/main/java/com/yfd/platform/qgc_env/vap/controller/VapConstructionController.java b/backend/src/main/java/com/yfd/platform/qgc_env/vap/controller/VapConstructionController.java index ef34b630..cf534c58 100644 --- a/backend/src/main/java/com/yfd/platform/qgc_env/vap/controller/VapConstructionController.java +++ b/backend/src/main/java/com/yfd/platform/qgc_env/vap/controller/VapConstructionController.java @@ -76,4 +76,10 @@ public class VapConstructionController { public ResponseResult getVprYearKendoListCust(@RequestBody DataSourceRequest dataSourceRequest) { return ResponseResult.successData(vpConstructionService.getVprYearList(dataSourceRequest)); } + + @PostMapping("/fhvap/built/GetKendoListCust") + @Operation(summary = "栖息地/珍稀植物园/动物救助站描点接口(仅查询在建状态的)") + public ResponseResult getFhvapBuiltPointKendoListCust(@RequestBody DataSourceRequest dataSourceRequest) { + return ResponseResult.successData(vpConstructionService.getFhvapBuiltPointKendoListCust(dataSourceRequest)); + } } diff --git a/backend/src/main/java/com/yfd/platform/qgc_env/vap/entity/vo/FhvapBuiltPointVo.java b/backend/src/main/java/com/yfd/platform/qgc_env/vap/entity/vo/FhvapBuiltPointVo.java new file mode 100644 index 00000000..f71df8e4 --- /dev/null +++ b/backend/src/main/java/com/yfd/platform/qgc_env/vap/entity/vo/FhvapBuiltPointVo.java @@ -0,0 +1,57 @@ +package com.yfd.platform.qgc_env.vap.entity.vo; + +import lombok.Data; + +@Data +public class FhvapBuiltPointVo { + + private String stcd; + + private String stnm; + + private String titleName; + + private String bldsttCcode; + + private String bldstt; + + private Double lttd; + + private Double lgtd; + + private Double dtmel; + + private String rstcds; + + private String ennm; + + private String sttpCode; + + private String dwtp; + + private String dwtpName; + + private String sttpMap; + + private String rvcd; + + private String addvcd; + + private String baseId; + + private String sttp; + + private String anchoPointState; + + private String mway; + + private Integer dtin; + + private String stdSstate; + + private Integer distance; + + private Integer ftpTypeCount; + + private Integer ftpCount; +} \ No newline at end of file diff --git a/backend/src/main/java/com/yfd/platform/qgc_env/vap/service/VpConstructionService.java b/backend/src/main/java/com/yfd/platform/qgc_env/vap/service/VpConstructionService.java index 0a362f81..44fd2569 100644 --- a/backend/src/main/java/com/yfd/platform/qgc_env/vap/service/VpConstructionService.java +++ b/backend/src/main/java/com/yfd/platform/qgc_env/vap/service/VpConstructionService.java @@ -2,6 +2,7 @@ package com.yfd.platform.qgc_env.vap.service; import com.yfd.platform.common.DataSourceRequest; import com.yfd.platform.common.DataSourceResult; +import com.yfd.platform.qgc_env.vap.entity.vo.FhvapBuiltPointVo; import com.yfd.platform.qgc_env.vap.entity.vo.VpBasinIntDetailVo; import com.yfd.platform.qgc_env.vap.entity.vo.VpVarVo; import com.yfd.platform.qgc_env.vap.entity.vo.VpStInfoResultVo; @@ -27,4 +28,6 @@ public interface VpConstructionService { DataSourceResult getVarYearList(DataSourceRequest dataSourceRequest); DataSourceResult getVprYearList(DataSourceRequest dataSourceRequest); + + DataSourceResult getFhvapBuiltPointKendoListCust(DataSourceRequest dataSourceRequest); } diff --git a/backend/src/main/java/com/yfd/platform/qgc_env/vap/service/impl/VpConstructionServiceImpl.java b/backend/src/main/java/com/yfd/platform/qgc_env/vap/service/impl/VpConstructionServiceImpl.java index e0bc4ccf..7b0727c4 100644 --- a/backend/src/main/java/com/yfd/platform/qgc_env/vap/service/impl/VpConstructionServiceImpl.java +++ b/backend/src/main/java/com/yfd/platform/qgc_env/vap/service/impl/VpConstructionServiceImpl.java @@ -9,6 +9,7 @@ import com.yfd.platform.common.GroupHelper; import com.yfd.platform.common.GroupingInfo; import com.yfd.platform.common.MicroservicDynamicSQLMapper; import com.yfd.platform.common.PageInfo; +import com.yfd.platform.qgc_env.vap.entity.vo.FhvapBuiltPointVo; import com.yfd.platform.qgc_env.vap.entity.vo.VpBasinIntDetailVo; import com.yfd.platform.qgc_env.vap.entity.vo.VpConstructionSituationVo; import com.yfd.platform.qgc_env.vap.entity.vo.VpVarVo; @@ -1908,4 +1909,219 @@ public class VpConstructionServiceImpl implements VpConstructionService { dataSourceResult.setTotal(page != null ? page.getTotal() : (long) yList.size()); return dataSourceResult; } + + @Override + public DataSourceResult getFhvapBuiltPointKendoListCust(DataSourceRequest dataSourceRequest) { + DataSourceResult dataSourceResult = new DataSourceResult<>(); + dataSourceResult.setAggregates(new HashMap<>()); + + if (dataSourceRequest == null) { + dataSourceResult.setData(new ArrayList<>()); + dataSourceResult.setTotal(0L); + return dataSourceResult; + } + + StringBuilder sql = new StringBuilder("SELECT\n" + + " t.STCD AS stcd,\n" + + " t.STNM AS stnm,\n" + + " t.STNM AS titleName,\n" + + " TO_CHAR(t.BLDSTT_CODE) AS bldsttCcode,\n" + + " TO_CHAR(t.BLDSTT_CODE) AS bldstt,\n" + + " t.LTTD AS lttd,\n" + + " t.LGTD AS lgtd,\n" + + " t.ELEV AS dtmel,\n" + + " t.RSTCD AS rstcds,\n" + + " eng.ENNM AS ennm,\n" + + " t.STTP AS sttpCode,\n" + + " t.STTP AS dwtp,\n" + + " CASE\n" + + " WHEN t.STTP = 'VP' THEN '珍稀植物园'\n" + + " WHEN t.STTP = 'VA' THEN '动物救助站'\n" + + " WHEN t.STTP = 'FH' THEN '栖息地'\n" + + " ELSE '其它'\n" + + " END AS dwtpName,\n" + + " t.STTP AS sttpMap,\n" + + " t.RVCD AS rvcd,\n" + + " t.ADDVCD AS addvcd,\n" + + " t.BASE_ID AS baseId,\n" + + " t.STTP AS sttp,\n" + + " t.DTIN AS dtin\n" + + "FROM (\n" + + " SELECT STCD, STNM, STTP, LGTD, LTTD, ELEV, RSTCD, BASE_ID, RVCD, ADDVCD, BLDSTT_CODE, DTIN\n" + + " FROM SD_VP_B_H\n" + + " WHERE NVL(IS_DELETED, 0) = 0 AND BLDSTT_CODE = 1 AND LGTD IS NOT NULL AND LTTD IS NOT NULL\n" + + " UNION ALL\n" + + " SELECT STCD, STNM, STTP, LGTD, LTTD, ELEV, RSTCD, BASE_ID, NULL AS RVCD, NULL AS ADDVCD, BLDSTT_CODE, DTIN\n" + + " FROM SD_VA_B_H\n" + + " WHERE NVL(IS_DELETED, 0) = 0 AND BLDSTT_CODE = 1 AND LGTD IS NOT NULL AND LTTD IS NOT NULL\n" + + " UNION ALL\n" + + " SELECT STCD, STNM, 'FH' AS STTP, LGTD, LTTD, ELEV, RSTCD, BASE_ID, RVCD, ADDVCD, 1 AS BLDSTT_CODE, DTIN\n" + + " FROM SD_FHBT_B_H\n" + + " WHERE NVL(IS_DELETED, 0) = 0 AND LGTD IS NOT NULL AND LTTD IS NOT NULL\n" + + ") t\n" + + "LEFT JOIN SD_ENGINFO_B_H eng ON eng.STCD = t.RSTCD AND NVL(eng.IS_DELETED, 0) = 0 "); + + Map paramMap = new HashMap<>(); + String filterSql = buildFhvapPointFilterCondition(dataSourceRequest.getFilter(), paramMap, new int[]{0}); + if (StrUtil.isNotBlank(filterSql)) { + sql.append(" AND ").append(filterSql); + } + + sql.append(buildFhvapPointOrderBySql(dataSourceRequest.getSort())); + + Page page = KendoUtil.getPage(dataSourceRequest); + List resultList = microservicDynamicSQLMapper.pageAllListWithResultType(page, sql.toString(), paramMap, FhvapBuiltPointVo.class); + + for (FhvapBuiltPointVo vo : resultList) { + String sttp = vo.getSttp(); + if ("VP".equals(sttp)) { + vo.setAnchoPointState("GY_1_BUILT"); + } else if ("VA".equals(sttp)) { + vo.setAnchoPointState("GY_2_BUILT"); + } else if ("FH".equals(sttp)) { + vo.setAnchoPointState("GY_3_BUILT"); + } else { + vo.setAnchoPointState("GY_4_BUILT"); + } + } + + dataSourceResult.setData(resultList); + dataSourceResult.setTotal(page == null ? resultList.size() : page.getTotal()); + return dataSourceResult; + } + + private String buildFhvapPointFilterCondition(DataSourceRequest.FilterDescriptor filter, + Map paramMap, + int[] indexHolder) { + if (filter == null) { + return ""; + } + if (StrUtil.isNotBlank(filter.getField())) { + return buildFhvapPointLeafCondition(filter, paramMap, indexHolder); + } + if (CollectionUtils.isEmpty(filter.getFilters())) { + return ""; + } + List conditions = new ArrayList<>(); + for (DataSourceRequest.FilterDescriptor child : filter.getFilters()) { + String childSql = buildFhvapPointFilterCondition(child, paramMap, indexHolder); + if (StrUtil.isNotBlank(childSql)) { + conditions.add("(" + childSql + ")"); + } + } + if (conditions.isEmpty()) { + return ""; + } + return String.join("or".equalsIgnoreCase(filter.getLogic()) ? " OR " : " AND ", conditions); + } + + private String buildFhvapPointLeafCondition(DataSourceRequest.FilterDescriptor filter, + Map paramMap, + int[] indexHolder) { + String field = filter.getField(); + Object value = filter.getValue(); + String operator = StrUtil.blankToDefault(filter.getOperator(), "eq").toLowerCase(); + + String column = mapFhvapPointColumn(field); + if (StrUtil.isBlank(column)) { + return ""; + } + + if ("isnull".equals(operator)) { + return column + " IS NULL"; + } + if ("isnotnull".equals(operator)) { + return column + " IS NOT NULL"; + } + if ("in".equals(operator)) { + List values = normalizeValues(value); + if (values.isEmpty()) { + return ""; + } + List placeholders = new ArrayList<>(); + for (Object item : values) { + String paramKey = "fhvapParam" + indexHolder[0]++; + paramMap.put(paramKey, item); + placeholders.add("#{map." + paramKey + "}"); + } + return column + " IN (" + String.join(", ", placeholders) + ")"; + } + if (value == null) { + return ""; + } + + String paramKey = "fhvapParam" + indexHolder[0]++; + switch (operator) { + case "eq": + paramMap.put(paramKey, value); + return column + " = #{map." + paramKey + "}"; + case "neq": + paramMap.put(paramKey, value); + return column + " <> #{map." + paramKey + "}"; + case "contains": + paramMap.put(paramKey, "%" + value + "%"); + return column + " LIKE #{map." + paramKey + "}"; + case "startswith": + paramMap.put(paramKey, value + "%"); + return column + " LIKE #{map." + paramKey + "}"; + case "endswith": + paramMap.put(paramKey, "%" + value); + return column + " LIKE #{map." + paramKey + "}"; + case "gt": + paramMap.put(paramKey, value); + return column + " > #{map." + paramKey + "}"; + case "gte": + paramMap.put(paramKey, value); + return column + " >= #{map." + paramKey + "}"; + case "lt": + paramMap.put(paramKey, value); + return column + " < #{map." + paramKey + "}"; + case "lte": + paramMap.put(paramKey, value); + return column + " <= #{map." + paramKey + "}"; + default: + return ""; + } + } + + private String mapFhvapPointColumn(String field) { + if (StrUtil.isBlank(field)) { + return null; + } + Map columnMap = new HashMap<>(); + columnMap.put("stcd", "t.STCD"); + columnMap.put("stnm", "t.STNM"); + columnMap.put("sttpCode", "t.STTP"); + columnMap.put("bldsttCcode", "t.BLDSTT_CODE"); + columnMap.put("lgtd", "t.LGTD"); + columnMap.put("lttd", "t.LTTD"); + columnMap.put("baseId", "t.BASE_ID"); + columnMap.put("rvcd", "t.RVCD"); + columnMap.put("addvcd", "t.ADDVCD"); + columnMap.put("rstcds", "t.RSTCD"); + columnMap.put("ennm", "eng.ENNM"); + return columnMap.get(field); + } + + private String buildFhvapPointOrderBySql(List sorts) { + if (sorts == null || sorts.isEmpty()) { + return " ORDER BY t.BASE_ID ASC, t.STCD ASC"; + } + List orderItems = new ArrayList<>(); + for (DataSourceRequest.SortDescriptor sort : sorts) { + if (sort == null || StrUtil.isBlank(sort.getField())) { + continue; + } + String column = mapFhvapPointColumn(sort.getField()); + if (StrUtil.isBlank(column)) { + continue; + } + String direction = "desc".equalsIgnoreCase(sort.getDir()) || "des".equalsIgnoreCase(sort.getDir()) ? "DESC" : "ASC"; + orderItems.add(column + " " + direction + " NULLS LAST"); + } + if (orderItems.isEmpty()) { + return " ORDER BY t.BASE_ID ASC, t.STCD ASC"; + } + return " ORDER BY " + String.join(", ", orderItems); + } } From 61e896de25f47c869d7009574ccdbe9faccb261c Mon Sep 17 00:00:00 2001 From: tangwei Date: Mon, 6 Jul 2026 11:48:23 +0800 Subject: [PATCH 09/27] =?UTF-8?q?feat:=20=E9=87=8E=E7=94=9F=E5=8A=A8?= =?UTF-8?q?=E7=89=A9=E9=94=9A=E7=82=B9?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../controller/VapConstructionController.java | 6 + .../vap/service/VpConstructionService.java | 3 + .../impl/VpConstructionServiceImpl.java | 185 ++++++++++++++++++ 3 files changed, 194 insertions(+) diff --git a/backend/src/main/java/com/yfd/platform/qgc_env/vap/controller/VapConstructionController.java b/backend/src/main/java/com/yfd/platform/qgc_env/vap/controller/VapConstructionController.java index cf534c58..d6900110 100644 --- a/backend/src/main/java/com/yfd/platform/qgc_env/vap/controller/VapConstructionController.java +++ b/backend/src/main/java/com/yfd/platform/qgc_env/vap/controller/VapConstructionController.java @@ -82,4 +82,10 @@ public class VapConstructionController { public ResponseResult getFhvapBuiltPointKendoListCust(@RequestBody DataSourceRequest dataSourceRequest) { return ResponseResult.successData(vpConstructionService.getFhvapBuiltPointKendoListCust(dataSourceRequest)); } + + @PostMapping("/wva/point/GetKendoListCust") + @Operation(summary = "野生动物锚点") + public ResponseResult getWvaPointKendoListCust(@RequestBody DataSourceRequest dataSourceRequest) { + return ResponseResult.successData(vpConstructionService.getWvaPointKendoListCust(dataSourceRequest)); + } } diff --git a/backend/src/main/java/com/yfd/platform/qgc_env/vap/service/VpConstructionService.java b/backend/src/main/java/com/yfd/platform/qgc_env/vap/service/VpConstructionService.java index 44fd2569..634224a5 100644 --- a/backend/src/main/java/com/yfd/platform/qgc_env/vap/service/VpConstructionService.java +++ b/backend/src/main/java/com/yfd/platform/qgc_env/vap/service/VpConstructionService.java @@ -3,6 +3,7 @@ package com.yfd.platform.qgc_env.vap.service; import com.yfd.platform.common.DataSourceRequest; import com.yfd.platform.common.DataSourceResult; import com.yfd.platform.qgc_env.vap.entity.vo.FhvapBuiltPointVo; +import com.yfd.platform.qgc_env.vap.entity.vo.WvaPointVo; import com.yfd.platform.qgc_env.vap.entity.vo.VpBasinIntDetailVo; import com.yfd.platform.qgc_env.vap.entity.vo.VpVarVo; import com.yfd.platform.qgc_env.vap.entity.vo.VpStInfoResultVo; @@ -30,4 +31,6 @@ public interface VpConstructionService { DataSourceResult getVprYearList(DataSourceRequest dataSourceRequest); DataSourceResult getFhvapBuiltPointKendoListCust(DataSourceRequest dataSourceRequest); + + DataSourceResult getWvaPointKendoListCust(DataSourceRequest dataSourceRequest); } diff --git a/backend/src/main/java/com/yfd/platform/qgc_env/vap/service/impl/VpConstructionServiceImpl.java b/backend/src/main/java/com/yfd/platform/qgc_env/vap/service/impl/VpConstructionServiceImpl.java index 7b0727c4..9b1131e0 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 @@ -10,6 +10,7 @@ import com.yfd.platform.common.GroupingInfo; import com.yfd.platform.common.MicroservicDynamicSQLMapper; import com.yfd.platform.common.PageInfo; import com.yfd.platform.qgc_env.vap.entity.vo.FhvapBuiltPointVo; +import com.yfd.platform.qgc_env.vap.entity.vo.WvaPointVo; import com.yfd.platform.qgc_env.vap.entity.vo.VpBasinIntDetailVo; import com.yfd.platform.qgc_env.vap.entity.vo.VpConstructionSituationVo; import com.yfd.platform.qgc_env.vap.entity.vo.VpVarVo; @@ -2124,4 +2125,188 @@ public class VpConstructionServiceImpl implements VpConstructionService { } return " ORDER BY " + String.join(", ", orderItems); } + + @Override + public DataSourceResult getWvaPointKendoListCust(DataSourceRequest dataSourceRequest) { + DataSourceResult dataSourceResult = new DataSourceResult<>(); + dataSourceResult.setAggregates(new HashMap<>()); + + if (dataSourceRequest == null) { + dataSourceResult.setData(new ArrayList<>()); + dataSourceResult.setTotal(0L); + return dataSourceResult; + } + + StringBuilder sql = new StringBuilder("SELECT\n" + + " we.DTIN AS dtin,\n" + + " we.STCD AS stcd,\n" + + " we.STNM AS stnm,\n" + + " we.STNM AS titleName,\n" + + " TO_CHAR(we.BLDSTT_CODE) AS bldsttCcode,\n" + + " TO_CHAR(we.BLDSTT_CODE) AS bldstt,\n" + + " we.LTTD AS lttd,\n" + + " we.LGTD AS lgtd,\n" + + " we.ELEV AS dtmel,\n" + + " we.RSTCD AS rstcds,\n" + + " eng.ENNM AS ennm,\n" + + " 'WVA' AS sttpMap,\n" + + " we.RVCD AS rvcd,\n" + + " we.ADDVCD AS addvcd,\n" + + " we.BASE_ID AS baseId,\n" + + " 'WVA' AS sttp,\n" + + " 'wild_animal_legend' AS anchoPointState,\n" + + " 'WVA' AS sttpCode\n" + + "FROM SD_WE_B_H we\n" + + "LEFT JOIN SD_ENGINFO_B_H eng ON eng.STCD = we.RSTCD AND NVL(eng.IS_DELETED, 0) = 0\n" + + "WHERE we.LGTD IS NOT NULL AND we.LTTD IS NOT NULL "); + + Map paramMap = new HashMap<>(); + String filterSql = buildWvaPointFilterCondition(dataSourceRequest.getFilter(), paramMap, new int[]{0}); + if (StrUtil.isNotBlank(filterSql)) { + sql.append(" AND ").append(filterSql); + } + + sql.append(buildWvaPointOrderBySql(dataSourceRequest.getSort())); + + Page page = KendoUtil.getPage(dataSourceRequest); + List resultList = microservicDynamicSQLMapper.pageAllListWithResultType(page, sql.toString(), paramMap, WvaPointVo.class); + + dataSourceResult.setData(resultList); + dataSourceResult.setTotal(page == null ? resultList.size() : page.getTotal()); + return dataSourceResult; + } + + private String buildWvaPointFilterCondition(DataSourceRequest.FilterDescriptor filter, + Map paramMap, + int[] indexHolder) { + if (filter == null) { + return ""; + } + if (StrUtil.isNotBlank(filter.getField())) { + return buildWvaPointLeafCondition(filter, paramMap, indexHolder); + } + if (CollectionUtils.isEmpty(filter.getFilters())) { + return ""; + } + List conditions = new ArrayList<>(); + for (DataSourceRequest.FilterDescriptor child : filter.getFilters()) { + String childSql = buildWvaPointFilterCondition(child, paramMap, indexHolder); + if (StrUtil.isNotBlank(childSql)) { + conditions.add("(" + childSql + ")"); + } + } + if (conditions.isEmpty()) { + return ""; + } + return String.join("or".equalsIgnoreCase(filter.getLogic()) ? " OR " : " AND ", conditions); + } + + private String buildWvaPointLeafCondition(DataSourceRequest.FilterDescriptor filter, + Map paramMap, + int[] indexHolder) { + String field = filter.getField(); + Object value = filter.getValue(); + String operator = StrUtil.blankToDefault(filter.getOperator(), "eq").toLowerCase(); + + String column = mapWvaPointColumn(field); + if (StrUtil.isBlank(column)) { + return ""; + } + + if ("isnull".equals(operator)) { + return column + " IS NULL"; + } + if ("isnotnull".equals(operator)) { + return column + " IS NOT NULL"; + } + if ("in".equals(operator)) { + List values = normalizeValues(value); + if (values.isEmpty()) { + return ""; + } + List placeholders = new ArrayList<>(); + for (Object item : values) { + String paramKey = "wvaParam" + indexHolder[0]++; + paramMap.put(paramKey, item); + placeholders.add("#{map." + paramKey + "}"); + } + return column + " IN (" + String.join(", ", placeholders) + ")"; + } + if (value == null) { + return ""; + } + + String paramKey = "wvaParam" + indexHolder[0]++; + switch (operator) { + case "eq": + paramMap.put(paramKey, value); + return column + " = #{map." + paramKey + "}"; + case "neq": + paramMap.put(paramKey, value); + return column + " <> #{map." + paramKey + "}"; + case "contains": + paramMap.put(paramKey, "%" + value + "%"); + return column + " LIKE #{map." + paramKey + "}"; + case "startswith": + paramMap.put(paramKey, value + "%"); + return column + " LIKE #{map." + paramKey + "}"; + case "endswith": + paramMap.put(paramKey, "%" + value); + return column + " LIKE #{map." + paramKey + "}"; + case "gt": + paramMap.put(paramKey, value); + return column + " > #{map." + paramKey + "}"; + case "gte": + paramMap.put(paramKey, value); + return column + " >= #{map." + paramKey + "}"; + case "lt": + paramMap.put(paramKey, value); + return column + " < #{map." + paramKey + "}"; + case "lte": + paramMap.put(paramKey, value); + return column + " <= #{map." + paramKey + "}"; + default: + return ""; + } + } + + private String mapWvaPointColumn(String field) { + if (StrUtil.isBlank(field)) { + return null; + } + Map columnMap = new HashMap<>(); + columnMap.put("stcd", "we.STCD"); + columnMap.put("stnm", "we.STNM"); + columnMap.put("sttpCode", "'WVA'"); + columnMap.put("lgtd", "we.LGTD"); + columnMap.put("lttd", "we.LTTD"); + columnMap.put("baseId", "we.BASE_ID"); + columnMap.put("rvcd", "we.RVCD"); + columnMap.put("addvcd", "we.ADDVCD"); + columnMap.put("rstcds", "we.RSTCD"); + columnMap.put("ennm", "eng.ENNM"); + return columnMap.get(field); + } + + private String buildWvaPointOrderBySql(List sorts) { + if (sorts == null || sorts.isEmpty()) { + return " ORDER BY we.BASE_ID ASC, we.STCD ASC"; + } + List orderItems = new ArrayList<>(); + for (DataSourceRequest.SortDescriptor sort : sorts) { + if (sort == null || StrUtil.isBlank(sort.getField())) { + continue; + } + String column = mapWvaPointColumn(sort.getField()); + if (StrUtil.isBlank(column)) { + continue; + } + String direction = "desc".equalsIgnoreCase(sort.getDir()) || "des".equalsIgnoreCase(sort.getDir()) ? "DESC" : "ASC"; + orderItems.add(column + " " + direction + " NULLS LAST"); + } + if (orderItems.isEmpty()) { + return " ORDER BY we.BASE_ID ASC, we.STCD ASC"; + } + return " ORDER BY " + String.join(", ", orderItems); + } } From fa805bfc5382e912f41642c004c8b546a5e8d93b Mon Sep 17 00:00:00 2001 From: tangwei Date: Mon, 6 Jul 2026 11:48:38 +0800 Subject: [PATCH 10/27] =?UTF-8?q?feat:=20=E9=87=8E=E7=94=9F=E5=8A=A8?= =?UTF-8?q?=E7=89=A9=E9=94=9A=E7=82=B9?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../qgc_env/vap/entity/vo/WvaPointVo.java | 47 +++++++++++++++++++ 1 file changed, 47 insertions(+) create mode 100644 backend/src/main/java/com/yfd/platform/qgc_env/vap/entity/vo/WvaPointVo.java diff --git a/backend/src/main/java/com/yfd/platform/qgc_env/vap/entity/vo/WvaPointVo.java b/backend/src/main/java/com/yfd/platform/qgc_env/vap/entity/vo/WvaPointVo.java new file mode 100644 index 00000000..ac2802b5 --- /dev/null +++ b/backend/src/main/java/com/yfd/platform/qgc_env/vap/entity/vo/WvaPointVo.java @@ -0,0 +1,47 @@ +package com.yfd.platform.qgc_env.vap.entity.vo; + +import lombok.Data; + +@Data +public class WvaPointVo { + + private Integer dtin; + + private String stcd; + + private String stnm; + + private String titleName; + + private String bldsttCcode; + + private String bldstt; + + private Double lttd; + + private Double lgtd; + + private Double dtmel; + + private String rstcds; + + private String ennm; + + private String sttpMap; + + private String rvcd; + + private String addvcd; + + private String baseId; + + private String sttp; + + private String anchoPointState; + + private String mway; + + private String sttpCode; + + private Integer distance; +} \ No newline at end of file From 1b7f52783db93e3906a79d8dd85a32b045148bc1 Mon Sep 17 00:00:00 2001 From: tangwei Date: Mon, 6 Jul 2026 12:28:13 +0800 Subject: [PATCH 11/27] =?UTF-8?q?feat:=20=E9=B1=BC=E7=B1=BB=E8=B0=83?= =?UTF-8?q?=E6=9F=A5=E8=A3=85=E7=BD=AE=E9=94=9A=E7=82=B9=E4=BF=A1=E6=81=AF?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../fpr/controller/FprMonitorController.java | 12 ++- .../fpr/entity/vo/FprdPointInfoVo.java | 67 +++++++++++++++ .../fpr/service/FprMonitorService.java | 5 +- .../service/impl/FprMonitorServiceImpl.java | 83 +++++++++++++++++++ 4 files changed, 164 insertions(+), 3 deletions(-) create mode 100644 backend/src/main/java/com/yfd/platform/qgc_env/fpr/entity/vo/FprdPointInfoVo.java diff --git a/backend/src/main/java/com/yfd/platform/qgc_env/fpr/controller/FprMonitorController.java b/backend/src/main/java/com/yfd/platform/qgc_env/fpr/controller/FprMonitorController.java index 61cbb809..bf3f44ff 100644 --- a/backend/src/main/java/com/yfd/platform/qgc_env/fpr/controller/FprMonitorController.java +++ b/backend/src/main/java/com/yfd/platform/qgc_env/fpr/controller/FprMonitorController.java @@ -4,9 +4,10 @@ import com.yfd.platform.common.DataSourceRequest; import com.yfd.platform.common.DataSourceResult; import com.yfd.platform.config.ResponseResult; import com.yfd.platform.qgc_env.fpr.entity.ao.FprdRunDataAo; -import com.yfd.platform.qgc_env.fpr.entity.vo.FprdDetailVo; -import com.yfd.platform.qgc_eng.eq.service.EngEqDataService; import com.yfd.platform.qgc_env.fpr.entity.vo.FprFtpChangeInfoVo; +import com.yfd.platform.qgc_env.fpr.entity.vo.FprdDetailVo; +import com.yfd.platform.qgc_env.fpr.entity.vo.FprdPointInfoVo; +import com.yfd.platform.qgc_eng.eq.service.EngEqDataService; import com.yfd.platform.qgc_env.fpr.entity.vo.FprdRunDataInfoVo; import com.yfd.platform.qgc_env.fpr.entity.vo.FprZyFishDicVo; import com.yfd.platform.qgc_env.fpr.service.FprMonitorService; @@ -86,6 +87,13 @@ public class FprMonitorController { return ResponseResult.successData(result); } + @PostMapping("/sdFprdR/point/getFprdPointList") + @Operation(summary = "鱼类调查装置锚点信息") + public ResponseResult getFprdPointList(@RequestBody FprdRunDataAo ao) { + List result = fprMonitorService.getFprdInfoList(ao); + return ResponseResult.successData(result); + } + @PostMapping("/wbsb/GetKendoList") @Operation(summary = "查询基地/基地流域树数据") public ResponseResult getWbsbList(@RequestBody DataSourceRequest dataSourceRequest) { diff --git a/backend/src/main/java/com/yfd/platform/qgc_env/fpr/entity/vo/FprdPointInfoVo.java b/backend/src/main/java/com/yfd/platform/qgc_env/fpr/entity/vo/FprdPointInfoVo.java new file mode 100644 index 00000000..81ea189f --- /dev/null +++ b/backend/src/main/java/com/yfd/platform/qgc_env/fpr/entity/vo/FprdPointInfoVo.java @@ -0,0 +1,67 @@ +package com.yfd.platform.qgc_env.fpr.entity.vo; + +import lombok.Data; + +@Data +public class FprdPointInfoVo { + + private String stcd; + + private String stnm; + + private String titleName; + + private String bldsttCcode; + + private String bldstt; + + private Double lttd; + + private Double lgtd; + + private Double dtmel; + + private String rstcds; + + private String ennm; + + private String sttpCode; + + private String dwtp; + + private String dwtpName; + + private String sttpMap; + + private String rvcd; + + private String rvcdName; + + private String addvcd; + + private String addvcdName; + + private String hbrvcd; + + private String hbrvcdName; + + private String baseId; + + private String baseName; + + private String sttp; + + private String sttpName; + + private String anchoPointState; + + private String mway; + + private Integer dtin; + + private String stdSstate; + + private Integer distance; + + private String stlc; +} \ No newline at end of file diff --git a/backend/src/main/java/com/yfd/platform/qgc_env/fpr/service/FprMonitorService.java b/backend/src/main/java/com/yfd/platform/qgc_env/fpr/service/FprMonitorService.java index 8681b405..d64cf1fc 100644 --- a/backend/src/main/java/com/yfd/platform/qgc_env/fpr/service/FprMonitorService.java +++ b/backend/src/main/java/com/yfd/platform/qgc_env/fpr/service/FprMonitorService.java @@ -2,8 +2,9 @@ package com.yfd.platform.qgc_env.fpr.service; import com.yfd.platform.common.DataSourceRequest; import com.yfd.platform.common.DataSourceResult; -import com.yfd.platform.qgc_env.fpr.entity.vo.FprFtpChangeInfoVo; import com.yfd.platform.qgc_env.fpr.entity.ao.FprdRunDataAo; +import com.yfd.platform.qgc_env.fpr.entity.vo.FprFtpChangeInfoVo; +import com.yfd.platform.qgc_env.fpr.entity.vo.FprdPointInfoVo; import com.yfd.platform.qgc_env.fpr.entity.vo.FprFishDicVo; import com.yfd.platform.qgc_env.fpr.entity.vo.FprMsstbprptVo; import com.yfd.platform.qgc_env.fpr.entity.vo.FprdDetailVo; @@ -29,4 +30,6 @@ public interface FprMonitorService { DataSourceResult getFprdDetailList(DataSourceRequest dataSourceRequest); List getFishInfo(); + + List getFprdInfoList(FprdRunDataAo ao); } diff --git a/backend/src/main/java/com/yfd/platform/qgc_env/fpr/service/impl/FprMonitorServiceImpl.java b/backend/src/main/java/com/yfd/platform/qgc_env/fpr/service/impl/FprMonitorServiceImpl.java index 09b35d14..c697d439 100644 --- a/backend/src/main/java/com/yfd/platform/qgc_env/fpr/service/impl/FprMonitorServiceImpl.java +++ b/backend/src/main/java/com/yfd/platform/qgc_env/fpr/service/impl/FprMonitorServiceImpl.java @@ -5,6 +5,7 @@ import cn.hutool.core.bean.copier.CopyOptions; import cn.hutool.core.collection.CollUtil; import cn.hutool.core.date.DateUtil; import cn.hutool.core.util.StrUtil; +import com.yfd.platform.qgc_env.wt.utils.SiteAvoidanceUtils; import com.baomidou.mybatisplus.extension.plugins.pagination.Page; import com.yfd.platform.common.DataSourceLoadOptionsBase; import com.yfd.platform.common.DataSourceRequest; @@ -18,6 +19,7 @@ import com.yfd.platform.qgc_env.fpr.entity.vo.FprFishDicVo; import com.yfd.platform.qgc_env.fpr.entity.vo.FprFtpChangeInfoVo; import com.yfd.platform.qgc_env.fpr.entity.vo.FprMsstbprptVo; import com.yfd.platform.qgc_env.fpr.entity.vo.FprdDetailVo; +import com.yfd.platform.qgc_env.fpr.entity.vo.FprdPointInfoVo; import com.yfd.platform.qgc_env.fpr.entity.vo.FprdRunDataInfoVo; import com.yfd.platform.qgc_env.fpr.entity.vo.FprZyFishDicVo; import com.yfd.platform.qgc_env.fpr.service.FprMonitorService; @@ -126,6 +128,87 @@ public class FprMonitorServiceImpl implements FprMonitorService { .toList(); } + @Override + public List getFprdInfoList(FprdRunDataAo ao) { + validateFprdRunDataAo(ao); + + Map paramMap = new HashMap<>(); + paramMap.put("baseId", ao.getBaseId()); + + StringBuilder sql = new StringBuilder("SELECT ") + .append("aim.STCD AS stcd, ") + .append("aim.STNM AS stnm, ") + .append("aim.STNM AS titleName, ") + .append("TO_CHAR(aim.BLDSTT_CODE) AS bldsttCcode, ") + .append("TO_CHAR(aim.BLDSTT_CODE) AS bldstt, ") + .append("aim.LTTD AS lttd, ") + .append("aim.LGTD AS lgtd, ") + .append("aim.DTMEL AS dtmel, ") + .append("aim.RSTCD AS rstcds, ") + .append("eng.ENNM AS ennm, ") + .append("aim.STTP AS sttpCode, ") + .append("aim.DWTP AS dwtp, ") + .append("aim.DWTP AS dwtpName, ") + .append("aim.STTP AS sttpMap, ") + .append("aim.RVCD AS rvcd, ") + .append("rv.RVNM AS rvcdName, ") + .append("aim.ADDVCD AS addvcd, ") + .append("addv.ADDVCD_NAME AS addvcdName, ") + .append("aim.HBRVCD AS hbrvcd, ") + .append("hbrv.HBRVNM AS hbrvcdName, ") + .append("aim.BASE_ID AS baseId, ") + .append("hb.BASENAME AS baseName, ") + .append("aim.STTP AS sttp, ") + .append("sttp.STTP_NAME AS sttpName, ") + .append("'' AS anchoPointState, ") + .append("aim.MWAY AS mway, ") + .append("aim.DTIN AS dtin, ") + .append("aim.STDSSTATE AS stdSstate, ") + .append("aim.STLC AS stlc ") + .append("FROM SD_AIMONITOR_B_H aim ") + .append("LEFT JOIN SD_ENGINFO_B_H eng ON eng.STCD = aim.RSTCD AND NVL(eng.IS_DELETED, 0) = 0 ") + .append("LEFT JOIN SD_HYDROBASE hb ON hb.BASEID = aim.BASE_ID AND NVL(hb.IS_DELETED, 0) = 0 ") + .append("LEFT JOIN SD_HBRV_DIC hbrv ON hbrv.HBRVCD = aim.HBRVCD ") + .append(" AND hbrv.BASEID = aim.BASE_ID ") + .append(" AND NVL(hbrv.IS_DELETED, 0) = 0 ") + .append(" AND NVL(hbrv.ENABLED, 1) = 1 ") + .append("LEFT JOIN SD_RVCD_DIC rv ON rv.RVCD = aim.RVCD ") + .append("LEFT JOIN SD_ADDVCD_DIC addv ON addv.ADDVCD = aim.ADDVCD ") + .append("LEFT JOIN SD_STTP_B sttp ON sttp.STTP_CODE = aim.STTP ") + .append(" AND NVL(sttp.IS_DELETED, 0) = 0 ") + .append(" AND NVL(sttp.ENABLE, 1) = 1 ") + .append("WHERE NVL(aim.IS_DELETED, 0) = 0 ") + .append(" AND aim.STTP = 'FPRD' ") + .append(" AND aim.LGTD IS NOT NULL ") + .append(" AND aim.BASE_ID = #{map.baseId}"); + + if (StrUtil.isNotBlank(ao.getHbrvcd())) { + sql.append(" AND aim.HBRVCD = #{map.hbrvcd}"); + paramMap.put("hbrvcd", ao.getHbrvcd()); + } + + if (StrUtil.isNotBlank(ao.getStcd())) { + sql.append(" AND aim.STCD = #{map.stcd}"); + paramMap.put("stcd", ao.getStcd()); + } + + List resultList = microservicDynamicSQLMapper.getAllListWithResultType( + sql.toString(), + paramMap, + FprdPointInfoVo.class + ); + + SiteAvoidanceUtils.calcSiteMapLev(resultList, + FprdPointInfoVo::getStcd, + vo -> vo.getLgtd() != null ? java.math.BigDecimal.valueOf(vo.getLgtd()) : null, + vo -> vo.getLttd() != null ? java.math.BigDecimal.valueOf(vo.getLttd()) : null, + FprdPointInfoVo::getAnchoPointState, + FprdPointInfoVo::setDistance + ); + + return resultList; + } + @Override public DataSourceResult getMsstbprptList(DataSourceRequest dataSourceRequest) { DataSourceLoadOptionsBase loadOptions = dataSourceRequest == null ? null : dataSourceRequest.toDevRequest(); From 25aeb62e95734e08fe978cf26eeda6012aa36840 Mon Sep 17 00:00:00 2001 From: tangwei Date: Mon, 6 Jul 2026 15:11:08 +0800 Subject: [PATCH 12/27] =?UTF-8?q?feat:=20=E6=9D=A1=E4=BB=B6=E8=BF=87?= =?UTF-8?q?=E6=BB=A4=E6=95=B0=E6=8D=AE=E5=88=97=E8=A1=A8?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../controller/SdEngMonitorController.java | 7 + .../qgc_base/domain/vo/EngRsvrcscdBVo.java | 41 ++++ .../qgc_base/service/ISdEngInfoBHService.java | 3 + .../service/impl/SdEngInfoBHServiceImpl.java | 195 ++++++++++++++++++ .../mapLayer/mapper/MsMapmoduleBMapper.java | 2 +- .../controller/MapmoduleBController.java | 2 + 6 files changed, 249 insertions(+), 1 deletion(-) create mode 100644 backend/src/main/java/com/yfd/platform/qgc_base/domain/vo/EngRsvrcscdBVo.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 9395ae94..3f2de614 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 @@ -2,6 +2,7 @@ package com.yfd.platform.qgc_base.controller; import com.yfd.platform.common.DataSourceRequest; import com.yfd.platform.config.ResponseResult; +import com.yfd.platform.qgc_base.domain.vo.EngRsvrcscdBVo; import com.yfd.platform.qgc_base.service.ISdEngInfoBHService; import io.swagger.v3.oas.annotations.Operation; import io.swagger.v3.oas.annotations.tags.Tag; @@ -50,4 +51,10 @@ public class SdEngMonitorController { public ResponseResult getEngPointKendoListCust(@RequestBody DataSourceRequest dataSourceRequest) { return ResponseResult.successData(engInfoBHService.getEngPointKendoListCust(dataSourceRequest)); } + + @PostMapping("/rsvrcscdb/GetKendoList") + @Operation(summary = "条件过滤数据列表") + public ResponseResult getRsvrcscdBKendoList(@RequestBody DataSourceRequest dataSourceRequest) { + return ResponseResult.successData(engInfoBHService.getRsvrcscdBKendoList(dataSourceRequest)); + } } diff --git a/backend/src/main/java/com/yfd/platform/qgc_base/domain/vo/EngRsvrcscdBVo.java b/backend/src/main/java/com/yfd/platform/qgc_base/domain/vo/EngRsvrcscdBVo.java new file mode 100644 index 00000000..c402b4a4 --- /dev/null +++ b/backend/src/main/java/com/yfd/platform/qgc_base/domain/vo/EngRsvrcscdBVo.java @@ -0,0 +1,41 @@ +package com.yfd.platform.qgc_base.domain.vo; + +import lombok.Data; + +import java.util.Date; + +@Data +public class EngRsvrcscdBVo { + + private String id; + + private String rvcd; + + private String rvcdName; + + private String stcd; + + private String ennm; + + private Double srcdis; + + private Double dmhg; + + private Double normz; + + private String recordUser; + + private Date recordTime; + + private String modifyUser; + + private Date modifyTime; + + private Integer isDeleted; + + private Double lgtd; + + private Double lttd; + + private String stlc; +} \ No newline at end of file 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 5082c0ee..73934b15 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 @@ -9,6 +9,7 @@ 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.EngRsvrcscdBVo; import com.yfd.platform.qgc_base.domain.vo.EngPointVo; import com.yfd.platform.qgc_base.domain.vo.EngStInfoResultVo; import com.yfd.platform.qgc_base.domain.vo.EngVmsstbprptVo; @@ -89,4 +90,6 @@ public interface ISdEngInfoBHService extends IService { DataSourceResult getStbprpDataKendoListCust(DataSourceRequest dataSourceRequest, String tbCode, Boolean ignorePageLimit); DataSourceResult getEngPointKendoListCust(DataSourceRequest dataSourceRequest); + + DataSourceResult getRsvrcscdBKendoList(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 879347e6..a345ecdc 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 @@ -27,6 +27,7 @@ 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.EngRsvrcscdBVo; import com.yfd.platform.qgc_base.domain.vo.EngPointVo; import com.yfd.platform.qgc_base.domain.vo.EngStbprpDataVo; import com.yfd.platform.qgc_base.domain.vo.EngStBaseInfoVo; @@ -2928,4 +2929,198 @@ public class SdEngInfoBHServiceImpl extends ServiceImpl getRsvrcscdBKendoList(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(); + Page page = loadOptions == null ? null : QgcQueryWrapperUtil.buildPage(loadOptions, loadOptions.getSkip(), loadOptions.getTake()); + + Map paramMap = new HashMap<>(); + StringBuilder sql = new StringBuilder(); + + sql.append("SELECT ") + .append("r.ID AS id, ") + .append("r.RVCD AS rvcd, ") + .append("rv.RVNM AS rvcdName, ") + .append("r.STCD AS stcd, ") + .append("r.ENNM AS ennm, ") + .append("r.SRCDIS AS srcdis, ") + .append("r.DMHG AS dmhg, ") + .append("r.NORMZ AS normz, ") + .append("r.RECORD_USER AS recordUser, ") + .append("r.RECORD_TIME AS recordTime, ") + .append("r.MODIFY_USER AS modifyUser, ") + .append("r.MODIFY_TIME AS modifyTime, ") + .append("r.IS_DELETED AS isDeleted, ") + .append("eng.LGTD AS lgtd, ") + .append("eng.LTTD AS lttd, ") + .append("eng.STLC AS stlc ") + .append("FROM SD_RSVRCSCD_B r ") + .append("LEFT JOIN SD_RVCD_DIC rv ON rv.RVCD = r.RVCD ") + .append("LEFT JOIN SD_ENGINFO_B_H eng ON eng.STCD = r.STCD AND NVL(eng.IS_DELETED, 0) = 0 ") + .append("WHERE NVL(r.IS_DELETED, 0) = 0 "); + + String filterSql = buildRsvrcscdBFilterCondition(dataSourceRequest.getFilter(), paramMap, new int[]{0}); + if (StringUtils.hasText(filterSql)) { + sql.append(" AND ").append(filterSql); + } + + sql.append(buildRsvrcscdBOrderBySql(dataSourceRequest.getSort())); + + List list = microservicDynamicSQLMapper.pageAllListWithResultType( + page, sql.toString(), paramMap, EngRsvrcscdBVo.class); + result.setData(list); + result.setTotal(page == null ? list.size() : page.getTotal()); + return result; + } + + private String buildRsvrcscdBFilterCondition(DataSourceRequest.FilterDescriptor filter, + Map paramMap, + int[] indexHolder) { + if (filter == null) { + return ""; + } + if (StringUtils.hasText(filter.getField())) { + return buildRsvrcscdBLeafCondition(filter, paramMap, indexHolder); + } + if (filter.getFilters() == null || filter.getFilters().isEmpty()) { + return ""; + } + List childConditions = new ArrayList<>(); + for (DataSourceRequest.FilterDescriptor child : filter.getFilters()) { + String childSql = buildRsvrcscdBFilterCondition(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 buildRsvrcscdBLeafCondition(DataSourceRequest.FilterDescriptor filter, + Map paramMap, + int[] indexHolder) { + String column = mapRsvrcscdBColumn(filter.getField()); + if (!StringUtils.hasText(column)) { + 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 ("in".equals(operator)) { + List values = normalizeFilterValues(value); + if (values.isEmpty()) { + return ""; + } + List placeholders = new ArrayList<>(); + for (Object item : values) { + String key = "rsvrParam" + indexHolder[0]++; + paramMap.put(key, item); + placeholders.add("#{map." + key + "}"); + } + return column + " IN (" + String.join(", ", placeholders) + ")"; + } + if (value == null) { + return ""; + } + String key = "rsvrParam" + indexHolder[0]++; + return switch (operator) { + case "eq" -> { + paramMap.put(key, value); + yield column + " = #{map." + key + "}"; + } + case "neq" -> { + paramMap.put(key, value); + yield column + " <> #{map." + key + "}"; + } + case "contains" -> { + paramMap.put(key, "%" + value + "%"); + yield column + " 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 + " > #{map." + key + "}"; + } + case "gte" -> { + paramMap.put(key, value); + yield column + " >= #{map." + key + "}"; + } + case "lt" -> { + paramMap.put(key, value); + yield column + " < #{map." + key + "}"; + } + case "lte" -> { + paramMap.put(key, value); + yield column + " <= #{map." + key + "}"; + } + default -> ""; + }; + } + + private String mapRsvrcscdBColumn(String field) { + if (!StringUtils.hasText(field)) { + return null; + } + return switch (field) { + case "id" -> "r.ID"; + case "rvcd" -> "r.RVCD"; + case "rvcdName" -> "rv.RVNM"; + case "stcd" -> "r.STCD"; + case "ennm" -> "r.ENNM"; + case "srcdis" -> "r.SRCDIS"; + case "dmhg" -> "r.DMHG"; + case "normz" -> "r.NORMZ"; + case "lgtd" -> "eng.LGTD"; + case "lttd" -> "eng.LTTD"; + case "stlc" -> "eng.STLC"; + default -> null; + }; + } + + private String buildRsvrcscdBOrderBySql(List sortList) { + if (sortList == null || sortList.isEmpty()) { + return " ORDER BY r.RVCD ASC, r.STCD ASC"; + } + List orderItems = new ArrayList<>(); + for (DataSourceRequest.SortDescriptor sortDescriptor : sortList) { + if (sortDescriptor == null || !StringUtils.hasText(sortDescriptor.getField())) { + continue; + } + String column = mapRsvrcscdBColumn(sortDescriptor.getField()); + if (!StringUtils.hasText(column)) { + continue; + } + String dir = "desc".equalsIgnoreCase(sortDescriptor.getDir()) || "des".equalsIgnoreCase(sortDescriptor.getDir()) ? "DESC" : "ASC"; + orderItems.add(column + " " + dir + " NULLS LAST"); + } + if (orderItems.isEmpty()) { + return " ORDER BY r.RVCD ASC, r.STCD ASC"; + } + return " ORDER BY " + String.join(", ", orderItems); + } } diff --git a/backend/src/main/java/com/yfd/platform/qgc_sys/mapLayer/mapper/MsMapmoduleBMapper.java b/backend/src/main/java/com/yfd/platform/qgc_sys/mapLayer/mapper/MsMapmoduleBMapper.java index ee8da0e4..f1b054e6 100644 --- a/backend/src/main/java/com/yfd/platform/qgc_sys/mapLayer/mapper/MsMapmoduleBMapper.java +++ b/backend/src/main/java/com/yfd/platform/qgc_sys/mapLayer/mapper/MsMapmoduleBMapper.java @@ -35,7 +35,7 @@ public interface MsMapmoduleBMapper extends BaseMapper { + " AND BMM.TEMPLATE_ID = #{templateId}" + " AND (BMM.TEMPLATE_ID IS NULL OR BMM.TEMPLATE_ID = '00000000-0000-0000-0000-000000000000')" + "" - + "WHERE BML.ENABLE = 1 AND (BML.TYPE NOT IN ('YXDT','DXDT','SLDT') OR BML.TYPE IS NULL) " + + "WHERE BML.ENABLE = 1 AND BML.IS_DELETED =0 AND (BML.TYPE NOT IN ('YXDT','DXDT','SLDT') OR BML.TYPE IS NULL) " + "ORDER BY BML.ORDER_INDEX" + "") List getMapLayerTree(@Param("moduleId") String moduleId, @Param("sid") String sid, diff --git a/backend/src/main/java/com/yfd/platform/qgc_sys/mapcfg/controller/MapmoduleBController.java b/backend/src/main/java/com/yfd/platform/qgc_sys/mapcfg/controller/MapmoduleBController.java index dc0d0a9f..63a368fe 100644 --- a/backend/src/main/java/com/yfd/platform/qgc_sys/mapcfg/controller/MapmoduleBController.java +++ b/backend/src/main/java/com/yfd/platform/qgc_sys/mapcfg/controller/MapmoduleBController.java @@ -68,8 +68,10 @@ public class MapmoduleBController { // 3. 执行分页查询 Page resultPage; if (page != null) { + wrapper.eq("IS_DELETED", 0); resultPage = mapmoduleBService.page(page, wrapper); } else { + wrapper.eq("IS_DELETED", 0); List list = mapmoduleBService.list(wrapper); resultPage = new Page<>(); resultPage.setRecords(list); From c6dc532040b5156982e0a900109f10f5512be07f Mon Sep 17 00:00:00 2001 From: tangwei Date: Mon, 6 Jul 2026 16:09:40 +0800 Subject: [PATCH 13/27] =?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/MapLegendController.java | 3 +- .../service/impl/MapLegendBizServiceImpl.java | 6 +-- .../java/com/yfd/platform/utils/UUIDUtil.java | 43 +++++++++++++++++++ 3 files changed, 48 insertions(+), 4 deletions(-) create mode 100644 backend/src/main/java/com/yfd/platform/utils/UUIDUtil.java diff --git a/backend/src/main/java/com/yfd/platform/qgc_sys/mapLayer/controller/MapLegendController.java b/backend/src/main/java/com/yfd/platform/qgc_sys/mapLayer/controller/MapLegendController.java index 87e3187a..fe7bb242 100644 --- a/backend/src/main/java/com/yfd/platform/qgc_sys/mapLayer/controller/MapLegendController.java +++ b/backend/src/main/java/com/yfd/platform/qgc_sys/mapLayer/controller/MapLegendController.java @@ -61,6 +61,7 @@ public class MapLegendController { // 执行分页查询 Page page = DataSourceRequestUtil.getPage(dataSourceRequest); Page resultPage; + wrapper.eq("IS_DELETED", 0); if (page != null) { resultPage = mapLegendService.page(page, wrapper); } else { @@ -110,7 +111,7 @@ public class MapLegendController { String parentId = entity.getParentId(); if (parentId != null && parentMap.containsKey(parentId)) { MsMaplegendB parent = parentMap.get(parentId); - entity.setParentCode(parent.getCode()); + entity.setParentCode(parent.getNameEn()); entity.setParentName(parent.getName()); } else { entity.setParentCode(null); diff --git a/backend/src/main/java/com/yfd/platform/qgc_sys/mapLayer/service/impl/MapLegendBizServiceImpl.java b/backend/src/main/java/com/yfd/platform/qgc_sys/mapLayer/service/impl/MapLegendBizServiceImpl.java index 5ca81ae0..ccc54b6c 100644 --- a/backend/src/main/java/com/yfd/platform/qgc_sys/mapLayer/service/impl/MapLegendBizServiceImpl.java +++ b/backend/src/main/java/com/yfd/platform/qgc_sys/mapLayer/service/impl/MapLegendBizServiceImpl.java @@ -178,8 +178,8 @@ public class MapLegendBizServiceImpl implements IMapLegendBizService { collect.forEach((str, mapLegendVoList) -> { MapLegendVo mapLegendVo = new MapLegendVo(); mapLegendVo.setName(str); - mapLegendVo.setPSort(mapLegendVoList.get(0).getPSort()); - mapLegendVo.setLayerCode(finalLayerCodeMap.get(mapLegendVoList.get(0).getParentId())); + mapLegendVo.setPSort(mapLegendVoList.getFirst().getPSort()); + mapLegendVo.setLayerCode(finalLayerCodeMap.get(mapLegendVoList.getFirst().getParentId())); // 按子级分组名分组 Map> collect1 = mapLegendVoList.stream() .collect(Collectors.groupingBy(MapLegendVo::getGroupName)); @@ -188,7 +188,7 @@ public class MapLegendBizServiceImpl implements IMapLegendBizService { List list1 = collect1.get(groupNameStr); // 如果子级和父级名称相同,则不用子级 if (groupNameStr.equalsIgnoreCase(str)) { - childrenList = list1; + childrenList.addAll(list1); } else { MapLegendVo mapLegendVoChild = new MapLegendVo(); mapLegendVoChild.setName(groupNameStr); diff --git a/backend/src/main/java/com/yfd/platform/utils/UUIDUtil.java b/backend/src/main/java/com/yfd/platform/utils/UUIDUtil.java new file mode 100644 index 00000000..092f3493 --- /dev/null +++ b/backend/src/main/java/com/yfd/platform/utils/UUIDUtil.java @@ -0,0 +1,43 @@ +package com.yfd.platform.utils; + +import java.util.UUID; + +public class UUIDUtil { + public UUIDUtil() { + } + + public static String generateTenantUUID(String tenantId) { + return tenantId + generateUUID(); + } + + public static String generateUUID() { + return UUID.randomUUID().toString().replaceAll("-", ""); + } + + public static String generateUUIDWithEnDash() { + return UUID.randomUUID().toString(); + } + + public static String generateUpperUUIDWithEnDash() { + return UUID.randomUUID().toString().toUpperCase(); + } + + public static boolean checkUuid(String uuid) { + boolean isUuid = false; + return uuid.matches("([0-9a-fA-F]{8}(-[0-9a-fA-F]{4}){3}-[0-9a-fA-F]{12}?)") ? true : isUuid; + } + + public static String md5ToUUID(String md5) { + if (!StringUtils.isBlank(md5) && md5.length() == 32) { + md5 = md5.toUpperCase(); + String var1 = md5.substring(0, 8); + String var2 = md5.substring(8, 12); + String var3 = md5.substring(12, 16); + String var4 = md5.substring(16, 20); + String var5 = md5.substring(20); + return var1 + "-" + var2 + "-" + var3 + "-" + var4 + "-" + var5; + } else { + return null; + } + } +} \ No newline at end of file From d30d873fa47dcf4de713cd4e4672a788bc332e0b Mon Sep 17 00:00:00 2001 From: tangwei Date: Mon, 6 Jul 2026 17:01:44 +0800 Subject: [PATCH 14/27] =?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/MapLegendController.java | 12 -- .../service/impl/MapLegendServiceImpl.java | 142 ++++++++++++++++++ 2 files changed, 142 insertions(+), 12 deletions(-) diff --git a/backend/src/main/java/com/yfd/platform/qgc_sys/mapLayer/controller/MapLegendController.java b/backend/src/main/java/com/yfd/platform/qgc_sys/mapLayer/controller/MapLegendController.java index fe7bb242..9c2b5010 100644 --- a/backend/src/main/java/com/yfd/platform/qgc_sys/mapLayer/controller/MapLegendController.java +++ b/backend/src/main/java/com/yfd/platform/qgc_sys/mapLayer/controller/MapLegendController.java @@ -162,18 +162,6 @@ public class MapLegendController { if (legend.getDataType() == null) { throw new BizException("图例数据类型(dataType: 1=结构,2=数据)不能为空."); } - if (legend.getDataType() == 2 && StrUtil.isBlank(legend.getLayerCode())) { - throw new BizException("关联的图层编码(layerCode)不能为空."); - } - if (StrUtil.isNotBlank(legend.getName())){ - if(StrUtil.isBlank(legend.getGroupName())){ - legend.setGroupName(legend.getName()); - } - if(StrUtil.isBlank(legend.getParentName())){ - legend.setGroupName(legend.getName()); - } - } - legend.setRecordUser(SecurityUtils.getUserId()); mapLegendService.saveOrUpdate(legend); return ResponseResult.success("保存成功."); } diff --git a/backend/src/main/java/com/yfd/platform/qgc_sys/mapLayer/service/impl/MapLegendServiceImpl.java b/backend/src/main/java/com/yfd/platform/qgc_sys/mapLayer/service/impl/MapLegendServiceImpl.java index 5152e819..7e56a94f 100644 --- a/backend/src/main/java/com/yfd/platform/qgc_sys/mapLayer/service/impl/MapLegendServiceImpl.java +++ b/backend/src/main/java/com/yfd/platform/qgc_sys/mapLayer/service/impl/MapLegendServiceImpl.java @@ -11,10 +11,13 @@ import com.yfd.platform.qgc_sys.mapLayer.domain.MsMapmoduleB; import com.yfd.platform.qgc_sys.mapLayer.mapper.MsMaplegendBMapper; import com.yfd.platform.qgc_sys.mapLayer.mapper.MsMapmoduleBMapper; import com.yfd.platform.qgc_sys.mapLayer.service.IMapLegendService; +import com.yfd.platform.utils.SecurityUtils; import jakarta.annotation.Resource; import org.springframework.stereotype.Service; +import java.util.Comparator; import java.util.List; +import java.util.stream.Collectors; /** * 地图图例基础服务实现 @@ -94,4 +97,143 @@ public class MapLegendServiceImpl extends ServiceImpl list = getSubLegendList(legend.getParentId()); + Integer maxOrderIndex = getMaxOrderIndex(list); + legend.setOrderIndex(maxOrderIndex + 1); + MsMaplegendB parentLegend = null; + if (StrUtil.isNotBlank(legend.getParentId())) { + parentLegend = this.getById(legend.getParentId()); + if (parentLegend == null) { + throw new BizException("获取父级图例信息失败.请检查父级图例(parentId)是否存在."); + } + legend.setFullPath(parentLegend.getFullPath() + legend.getId() + ","); + legend.setTreeLevel(parentLegend.getTreeLevel() + 1); + legend.setHasChildren(0); + } else { + legend.setTreeLevel(1); + legend.setFullPath(legend.getId() + ","); + legend.setHasChildren(0); + } + if (legend.getDataType() == 1) { + legend.setGroupName(legend.getName()); + legend.setParentName(legend.getName()); + } else { + String fullPath = parentLegend.getFullPath(); + if (StrUtil.isNotBlank(fullPath)) { + String[] path = fullPath.split(","); + if (path.length == 1) { + legend.setGroupName(parentLegend.getName()); + legend.setParentName(parentLegend.getName()); + } else if (path.length == 2) { + legend.setGroupName(parentLegend.getName()); + MsMaplegendB root = this.getById(path[0]); + if (root == null) { + legend.setParentName(parentLegend.getParentName()); + } else { + legend.setParentName(root.getName()); + } + } + } + } + if (parentLegend != null && StrUtil.isBlank(legend.getLayerCode())) { + legend.setLayerCode(parentLegend.getLayerCode()); + } + legend.setIfShow(0); + legend.setInternal(0); + legend.setEnable(0); + legend.setRecordUser(SecurityUtils.getUserId()); + legend.setModifyUser(SecurityUtils.getUserId()); + this.save(legend); + if (parentLegend != null) { + MsMaplegendB temp = new MsMaplegendB(); + temp.setId(parentLegend.getId()); + temp.setHasChildren(1); + this.updateById(temp); + } + } + return true; + } + + private void updateSetLegend(MsMaplegendB legend) { + if (StrUtil.isNotBlank(legend.getParentId())) { + MsMaplegendB parent = this.getById(legend.getParentId()); + if (parent != null) { + if (legend.getDataType() == 1) { + legend.setParentName(parent.getName()); + legend.setFullPath(parent.getFullPath() + legend.getId() + ","); + } else { + legend.setGroupName(parent.getName()); + if (StrUtil.isNotBlank(parent.getFullPath())) { + MsMaplegendB root = this.getById(parent.getFullPath().split(",")[0]); + if (root != null) { + legend.setParentName(root.getName()); + } + legend.setFullPath(parent.getFullPath() + legend.getId() + ","); + } + } + if (StrUtil.isNotBlank(legend.getFullPath())) { + legend.setTreeLevel(legend.getFullPath().split(",").length); + } + } + if (legend.getDataType() == 1) { + legend.setGroupName(legend.getName()); + } + } else { + if (legend.getDataType() == 1) { + legend.setGroupName(legend.getName()); + legend.setParentName(legend.getName()); + } + legend.setFullPath(legend.getId() + ","); + legend.setTreeLevel(1); + } + } + + public List getSubLegendList(String parentId) { + if (StrUtil.isNotBlank(parentId)) { + return this.lambdaQuery() + .eq(MsMaplegendB::getParentId, parentId) + .orderByAsc(MsMaplegendB::getOrderIndex) + .list(); + } else { + return this.lambdaQuery() + .eq(MsMaplegendB::getTreeLevel, 1) + .orderByAsc(MsMaplegendB::getOrderIndex) + .list(); + } + } + + public Integer getMaxOrderIndex(List list) { + if (CollectionUtil.isEmpty(list)) { + return 0; + } else { + return list.stream() + .sorted(Comparator.comparing(MsMaplegendB::getOrderIndex).reversed()) + .toList() + .getFirst() + .getOrderIndex(); + } + } + + public boolean hasSameCode(MsMaplegendB legend) { + List list = this.lambdaQuery() + .eq(MsMaplegendB::getNameEn, legend.getNameEn()) + .list(); + return !CollectionUtil.isEmpty(list) && !list.get(0).getId().equals(legend.getId()); + } } \ No newline at end of file From 85b4a1fdbd54fc4774b9edc42236a3d2c770d11e Mon Sep 17 00:00:00 2001 From: tangwei Date: Mon, 6 Jul 2026 18:10:59 +0800 Subject: [PATCH 15/27] =?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 --- .../qgc_sys/mapLayer/service/impl/MapLegendServiceImpl.java | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/backend/src/main/java/com/yfd/platform/qgc_sys/mapLayer/service/impl/MapLegendServiceImpl.java b/backend/src/main/java/com/yfd/platform/qgc_sys/mapLayer/service/impl/MapLegendServiceImpl.java index 7e56a94f..29b8e0f9 100644 --- a/backend/src/main/java/com/yfd/platform/qgc_sys/mapLayer/service/impl/MapLegendServiceImpl.java +++ b/backend/src/main/java/com/yfd/platform/qgc_sys/mapLayer/service/impl/MapLegendServiceImpl.java @@ -74,7 +74,7 @@ public class MapLegendServiceImpl extends ServiceImpl siblingWrapper = new LambdaQueryWrapper<>(); - siblingWrapper.eq(MsMaplegendB::getParentId, parent.getId()); + siblingWrapper.eq(MsMaplegendB::getParentId, parent.getId()) + .eq(MsMaplegendB::getIsDeleted, 0); List siblings = this.list(siblingWrapper); if (siblings.size() == 1 && id.equals(siblings.get(0).getId())) { MsMaplegendB updateParent = new MsMaplegendB(); From 5fa17e767ab23033d9863efd6bf07bee4b05f411 Mon Sep 17 00:00:00 2001 From: tangwei Date: Tue, 7 Jul 2026 10:28:42 +0800 Subject: [PATCH 16/27] =?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 | 16 ++++++++-------- .../wq/service/impl/EnvWqDataServiceImpl.java | 14 +++++++------- .../wt/service/impl/SdWtMonitorServiceImpl.java | 2 +- 3 files changed, 16 insertions(+), 16 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 a345ecdc..47046c92 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 @@ -2690,10 +2690,10 @@ public class SdEngInfoBHServiceImpl extends ServiceImpl "t.STCD"; - case "stnm", "ennm", "titleName" -> "t.STNM"; + case "stnm", "ennm", "titleName" -> "t.ENNM"; case "rvcd" -> "t.RVCD"; case "addvcd" -> "t.ADDVCD"; case "lgtd" -> "t.LGTD"; @@ -2901,9 +2901,9 @@ public class SdEngInfoBHServiceImpl extends ServiceImpl "rvcdStepSort"; case "rstcdStepSort" -> "rstcdStepSort"; case "baseStepSort" -> "baseStepSort"; - case "ifEngSpecial" -> "ifEngSpecial"; - case "anchoPointState" -> "anchoPointState"; - case "endInstalledType" -> "endInstalledType"; + case "ifEngSpecial" -> "(CASE WHEN elec.configCount > 0 THEN 'true' WHEN elec.configCount IS NULL THEN 'false' ELSE 'false' END)"; + case "anchoPointState" -> "(CASE WHEN t.PRSC IN ('1','2') AND t.BLDSTT_CODE = 2 THEN 'large_eng_built' WHEN t.PRSC IN ('1','2') AND t.BLDSTT_CODE = 1 THEN 'large_eng_ubuilt' WHEN t.PRSC IN ('1','2') AND (t.BLDSTT_CODE = 0 OR t.BLDSTT_CODE IS NULL) THEN 'large_eng_nbuilt' WHEN t.PRSC IN ('3') AND t.BLDSTT_CODE = 2 THEN 'mid_eng_built' WHEN t.PRSC IN ('3') AND t.BLDSTT_CODE = 1 THEN 'mid_eng_ubuilt' WHEN t.PRSC IN ('3') AND (t.BLDSTT_CODE = 0 OR t.BLDSTT_CODE IS NULL) THEN 'mid_eng_nbuilt' END)"; + case "endInstalledType" -> "(CASE WHEN t.PRSC IN ('1','2') THEN 1 WHEN t.PRSC IN ('3') THEN 2 END)"; default -> null; }; } diff --git a/backend/src/main/java/com/yfd/platform/qgc_env/wq/service/impl/EnvWqDataServiceImpl.java b/backend/src/main/java/com/yfd/platform/qgc_env/wq/service/impl/EnvWqDataServiceImpl.java index cbc2bb8b..6ea50150 100644 --- a/backend/src/main/java/com/yfd/platform/qgc_env/wq/service/impl/EnvWqDataServiceImpl.java +++ b/backend/src/main/java/com/yfd/platform/qgc_env/wq/service/impl/EnvWqDataServiceImpl.java @@ -4575,12 +4575,12 @@ public class EnvWqDataServiceImpl implements EnvWqDataService { .append("t.FHSTCD AS fhstcd, ") .append("t.ORDER_INDEX AS orderIndex, ") .append("eng.ENNM AS ennm, ") - .append("hb.BASE_NAME AS baseName, ") + .append("hb.BASENAME AS baseName, ") .append("hb.BASEID AS baseId, ") .append("eng.HBRVCD AS hbrvcd, ") - .append("NVL(hbrv.NAME, '') AS hbrvcdName, ") - .append("NVL(rvcd.NAME, '') AS rvcdName, ") - .append("NVL(addvcd.NAME, '') AS addvcdName, ") + .append("NVL(hbrv.HBRVNM, '') AS hbrvcdName, ") + .append("NVL(rvcd.RVNM, '') AS rvcdName, ") + .append("NVL(addvcd.ADDVNM, '') AS addvcdName, ") .append("NVL(along.ORDER_INDEX, 999999) AS rvcdStepSort, ") .append("NVL(rstSort.SORT, 999999) AS rstcdStepSort, ") .append("NVL(siteSort.SORT, 999999) AS siteStepSort, ") @@ -4590,9 +4590,9 @@ public class EnvWqDataServiceImpl implements EnvWqDataService { .append("FROM SD_WQ_B_H t ") .append("LEFT JOIN SD_ENGINFO_B_H eng ON eng.STCD = t.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.CODE = eng.HBRVCD AND NVL(hbrv.IS_DELETED, 0) = 0 ") - .append("LEFT JOIN SD_RVCD_DIC rvcd ON rvcd.CODE = eng.RVCD AND NVL(rvcd.IS_DELETED, 0) = 0 ") - .append("LEFT JOIN SD_ADDVCD_DIC addvcd ON addvcd.CODE = eng.ADDVCD AND NVL(addvcd.IS_DELETED, 0) = 0 ") + .append("LEFT JOIN SD_HBRV_DIC hbrv ON hbrv.HBRVCD = eng.HBRVCD AND NVL(hbrv.IS_DELETED, 0) = 0 ") + .append("LEFT JOIN SD_RVCD_DIC rvcd ON rvcd.RVCD = eng.RVCD AND NVL(rvcd.IS_DELETED, 0) = 0 ") + .append("LEFT JOIN SD_ADDVCD_DIC addvcd ON addvcd.ADDVCD = eng.ADDVCD ") .append("LEFT JOIN MS_ALONG_B along ON along.RVCD = eng.HBRVCD AND along.CODE = 'common' AND NVL(along.IS_DELETED, 0) = 0 ") .append("LEFT JOIN ( ") .append(" SELECT det.SORT, cfg.RVCD, det.STCD ") 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 87a25b85..b28551d8 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 @@ -2872,7 +2872,7 @@ public class SdWtMonitorServiceImpl implements SdWtMonitorService { .append("sttp.STTP_NAME AS sttpName, ") .append("t.DTIN AS dtin, ") .append("NULL AS stdSstate ") - .append("FROM SD_DFLTKW_B_H t ") + .append("FROM SD_DW_B_H t ") .append("LEFT JOIN SD_ENGINFO_B_H eng ON eng.STCD = t.RSTCD AND NVL(eng.IS_DELETED, 0) = 0 ") .append("LEFT JOIN SD_STTP_B sttp ON sttp.STTP_CODE = t.STTP AND NVL(sttp.IS_DELETED, 0) = 0 ") .append("WHERE NVL(t.IS_DELETED, 0) = 0 ") From 5465ef72d6f6303acd627e183c9d4f092a25989f Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E7=8E=8B=E5=85=B4=E5=87=AF?= <2448379534@qq.com> Date: Tue, 7 Jul 2026 10:33:29 +0800 Subject: [PATCH 17/27] =?UTF-8?q?=E5=BC=B9=E7=AA=97=E6=8B=96=E5=8A=A8+?= =?UTF-8?q?=E8=BF=87=E9=B1=BC=E8=AE=BE=E6=96=BD-=E8=BF=87=E9=B1=BC?= =?UTF-8?q?=E6=80=BB=E9=87=8F-=E5=BC=B9=E6=A1=86=E6=B7=BB=E5=8A=A0?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- frontend/.env.development | 2 +- frontend/src/components/BasicSearch/index.vue | 107 +- .../FishResource/FishResourceSearch.vue | 282 ++++ .../src/components/FishResource/index.vue | 554 +++++++ .../MapModal/components/AIYXSB/index.vue | 4 +- .../MapModal/components/BasicInfo.vue | 3 +- .../components/FishFacilityMonitorData.vue | 4 +- .../components/FishFacilityRunState.vue | 4 +- .../MapModal/components/FlowMeasure.vue | 3 +- .../components/NormalOperationData/index.vue | 2 + .../components/developStatusChart/index.vue | 4 +- .../components/engEnvironmentData/index.vue | 4 +- .../JiuZhuZhanQingKuangJieShao.vue | 3 +- .../EnvironmentalQualityTwoLayers.vue | 3 +- .../modules/EnvironmentalQuality/index.vue | 4 +- frontend/src/modules/GYZLLB/index.vue | 1272 +++++++++-------- .../index.vue | 3 +- frontend/src/modules/alongFishMod/index.vue | 3 +- .../src/modules/churukushuiwenMod/index.vue | 4 +- .../modules/dianxingcuoshijieshao/index.vue | 13 +- .../index.vue | 4 +- .../fishSurvey/FishIntroduce/index.vue | 4 +- .../fishSurvey/ZhuanZhiIntroduce/index.vue | 4 +- frontend/src/modules/guoyujiance/index.vue | 3 + .../guoyusheshijiansheqingkuang/index.vue | 313 ++-- .../src/modules/guoyusheshijieshao/index.vue | 533 +++---- frontend/src/modules/huanbaoMod/index.vue | 5 +- .../src/modules/huanbaozdjcgzkzQK/index.vue | 3 +- .../src/modules/liuyu/ai/spdzwaijc/AISPTK.vue | 5 +- .../src/modules/liuyu/ai/spdzwaijc/index.vue | 3 +- .../shengtailiuliangxianshuju.vue | 3 +- .../shuizhijianceshuju.vue | 3 +- .../modules/lushengshengtaijiance/index.vue | 3 +- .../TwoLayers/monthlyAverageMaxModal.vue | 3 +- .../index.vue | 4 +- .../qixidibaohugongzuokaizhanQK/index.vue | 325 +++-- .../xieFangFangShi/index.vue | 4 +- .../xieFangFenBu/index.vue | 4 +- .../src/modules/shengtaidabiaoModJZ/index.vue | 5 +- .../modules/shengtaidabiaoTwoMod/index.vue | 4 + .../modules/shengtaidabiaoTwoModJJ/index.vue | 5 + .../modules/sheshileixingjieshao/index.vue | 3 + .../src/modules/shuiWenNianNeiFenBu/index.vue | 3 +- .../shuidianhuangjingjieruMod/DataTable.vue | 3 +- .../modules/shuishengshengtaijiance/index.vue | 3 +- .../index.vue | 4 +- .../modules/shuizhijiancegongzuoQK/index.vue | 4 +- .../yanchengshuiwenChangeMod/index.vue | 4 +- .../yunXingGaoJIng/Aisbdbyx/AISBTK.vue | 3 +- .../modules/yunXingGaoJIng/Aisbdbyx/index.vue | 3 +- .../zengZhiJiHuaWanChengQingKuang/index.vue | 4 +- .../modules/zengZhiZhanJieShaoMod/index.vue | 4 +- .../zengzhizhanjiansheyunxing/index.vue | 3 + frontend/src/store/modules/shuJuTianBao.ts | 10 +- frontend/src/utils/drag.ts | 91 +- .../BasicData/DeleteConfirmModal.vue | 4 +- .../components/monitorData/FishData/index.vue | 4 +- .../home/huanBaoSheShiYunXingZhuangKuang.vue | 2 +- frontend/src/views/register/index.vue | 3 +- .../shuiShengShengTaiDiaoCha.vue | 3 +- .../guoYuSheShiShuJuTianBao/index.vue | 3 +- 61 files changed, 2406 insertions(+), 1273 deletions(-) create mode 100644 frontend/src/components/FishResource/FishResourceSearch.vue create mode 100644 frontend/src/components/FishResource/index.vue diff --git a/frontend/.env.development b/frontend/.env.development index b9d4b82d..e9a06736 100644 --- a/frontend/.env.development +++ b/frontend/.env.development @@ -12,7 +12,7 @@ VITE_APP_BASE_API = '/dev-api' # VITE_APP_BASE_URL = 'http://172.16.21.142:8093' # VITE_APP_BASE_URL = 'http://172.16.21.142:8096' # 汤伟 -VITE_APP_BASE_URL = 'http://10.84.121.127:8093' +VITE_APP_BASE_URL = 'http://10.84.111.235:8093' # 李林 # VITE_APP_BASE_URL = 'http://10.84.121.43:8093' # VITE_APP_BASE_URL = 'http://192.168.1.162:8093' diff --git a/frontend/src/components/BasicSearch/index.vue b/frontend/src/components/BasicSearch/index.vue index 70e421bd..1a500565 100644 --- a/frontend/src/components/BasicSearch/index.vue +++ b/frontend/src/components/BasicSearch/index.vue @@ -177,7 +177,84 @@ + +
+ + + + + {{ opt.basename }} + + + + + + {{ opt.ennm }},{{ opt.reachcdName }} + + + + + + {{ opt.ennm }} + + + +
+ + + + + + + +
+ +
+
+ + + +
+ +
+
+ + + + + diff --git a/frontend/src/components/MapModal/components/AIYXSB/index.vue b/frontend/src/components/MapModal/components/AIYXSB/index.vue index fddb65fd..921b2525 100644 --- a/frontend/src/components/MapModal/components/AIYXSB/index.vue +++ b/frontend/src/components/MapModal/components/AIYXSB/index.vue @@ -245,6 +245,7 @@ import { useModelStore } from '@/store/modules/model'; import videoCover from '@/assets/images/videFm.jpg'; import MediaViewer from './MediaViewer.vue'; import AttachmentPreview from './AttachmentPreview.vue'; +import { useDraggable } from '@/utils/drag'; const modelStore = useModelStore(); @@ -875,7 +876,8 @@ const notRunningMediaViewerRef = ref(); // 附件预览弹窗 const attachmentModalVisible = ref(false); const currentAttachmentFid = ref(''); - +useDraggable(detailModalVisible, { boundary: true, resetOnOpen: true }); +useDraggable(attachmentModalVisible, { boundary: true, resetOnOpen: true }); // 查看附件 const handleViewAttachment = (record: any) => { if (!record.fid) { diff --git a/frontend/src/components/MapModal/components/BasicInfo.vue b/frontend/src/components/MapModal/components/BasicInfo.vue index c66884fa..70a185dd 100644 --- a/frontend/src/components/MapModal/components/BasicInfo.vue +++ b/frontend/src/components/MapModal/components/BasicInfo.vue @@ -152,7 +152,7 @@ import { getStcdDetail } from '@/api/mapModal'; const baseUrl = import.meta.env.VITE_APP_ATTACHMENT_URL; const modelStore = useModelStore(); const hasLoaded = ref(false); // 标记是否已经请求过 - +import { useDraggable } from '@/utils/drag'; const props = defineProps({ url: { type: String, @@ -168,6 +168,7 @@ const isLogo = ref(false); const loading = ref(false); const data2: any = ref({}); const tabledata = ref([]); +useDraggable(visible, { boundary: true, resetOnOpen: true }); const columnsConfig = ref([ { type: 'ENG', diff --git a/frontend/src/components/MapModal/components/FishFacilityMonitorData.vue b/frontend/src/components/MapModal/components/FishFacilityMonitorData.vue index e3e3bb4c..a9e993cb 100644 --- a/frontend/src/components/MapModal/components/FishFacilityMonitorData.vue +++ b/frontend/src/components/MapModal/components/FishFacilityMonitorData.vue @@ -56,6 +56,7 @@ import { getMonitorDataFpq, getMonitorDataOnline } from '@/api/mapModal'; import { useModelStore } from '@/store/modules/model'; import { DateSetting } from '@/utils/enumeration'; import dayjs from 'dayjs'; +import { useDraggable } from '@/utils/drag'; const loading = ref(false); const modelStore = useModelStore(); @@ -72,7 +73,8 @@ const previewImageUrl = ref(''); // 视频预览 const videoPreviewVisible = ref(false); const previewVideoUrl = ref(''); - +useDraggable(imagePreviewVisible, { boundary: true, resetOnOpen: true }); +useDraggable(videoPreviewVisible, { boundary: true, resetOnOpen: true }); const openImagePreview = (url: string) => { previewImageUrl.value = import.meta.env.VITE_APP_ATTACHMENT_URL + '/?' + url; imagePreviewVisible.value = true; diff --git a/frontend/src/components/MapModal/components/FishFacilityRunState.vue b/frontend/src/components/MapModal/components/FishFacilityRunState.vue index 9354ccfb..f93afe69 100644 --- a/frontend/src/components/MapModal/components/FishFacilityRunState.vue +++ b/frontend/src/components/MapModal/components/FishFacilityRunState.vue @@ -102,6 +102,7 @@ import { getDictItemsByCode } from '@/api/dict'; import { getFishDictoryDropdown } from '@/api/select'; import { useModelStore } from '@/store/modules/model'; import dayjs from 'dayjs'; +import { useDraggable } from '@/utils/drag'; const loading = ref(false); const modelStore = useModelStore(); @@ -125,7 +126,8 @@ const previewImageUrl = ref(''); // 视频预览 const videoPreviewVisible = ref(false); const currentVideoUrl = ref(''); - +useDraggable(imagePreviewVisible, { boundary: true, resetOnOpen: true }); +useDraggable(videoPreviewVisible, { boundary: true, resetOnOpen: true }); // 鱼类搜索过滤 const filterFtpOption = (input: string, option: any) => { console.log('filterOption', input, option); diff --git a/frontend/src/components/MapModal/components/FlowMeasure.vue b/frontend/src/components/MapModal/components/FlowMeasure.vue index b3908191..b5d619ef 100644 --- a/frontend/src/components/MapModal/components/FlowMeasure.vue +++ b/frontend/src/components/MapModal/components/FlowMeasure.vue @@ -79,6 +79,7 @@ import { queryPostUrlList } from '@/api/mapModal'; import { useModelStore } from '@/store/modules/model'; import BasicTable from '@/components/BasicTable/index.vue'; import { DateSetting } from '@/utils/enumeration'; +import { useDraggable } from '@/utils/drag'; const modelStore = useModelStore(); @@ -102,7 +103,7 @@ let chartInstance: echarts.ECharts | null = null; const videoModalVisible = ref(false); const videoModalTitle = ref(''); const currentVideoUrl = ref(''); - +useDraggable(videoModalVisible, { boundary: true, resetOnOpen: true }); const tabsList = [{ name: '流量监测', key: 'flowMeasure' }]; const activeTabKey = ref('flowMeasure'); diff --git a/frontend/src/components/MapModal/components/NormalOperationData/index.vue b/frontend/src/components/MapModal/components/NormalOperationData/index.vue index 432b1a4f..e99ef6b4 100644 --- a/frontend/src/components/MapModal/components/NormalOperationData/index.vue +++ b/frontend/src/components/MapModal/components/NormalOperationData/index.vue @@ -110,6 +110,7 @@ import { type OperationFilterField, type OperationTableItem } from './operationConfig'; +import { useDraggable } from '@/utils/drag'; const props = defineProps({ isActive: { type: Boolean, default: false } @@ -141,6 +142,7 @@ const loadYear = ref(false); const loadFtp = ref(false); const tableRef = ref(); const attachmentModalVisible = ref(false); +useDraggable(attachmentModalVisible, { boundary: true, resetOnOpen: true }); const currentAttachmentFid = ref(''); const fieldOptionsMap = reactive>({}); const selectLoadingMap = reactive>({}); diff --git a/frontend/src/components/developStatusChart/index.vue b/frontend/src/components/developStatusChart/index.vue index c9bb000d..1a0c370a 100644 --- a/frontend/src/components/developStatusChart/index.vue +++ b/frontend/src/components/developStatusChart/index.vue @@ -28,7 +28,7 @@ import * as echarts from 'echarts'; import { getVmsstbprptKendoList } from '@/api/home'; import { useJidiSelectEventStore } from '@/store/modules/jidiSelectEvent'; import ShuiDianKaiFQKTwoLayer from '@/modules/shuidianhuangjingjieruMod/TwoLayer/ShuiDianKaiFQKTwoLayer.vue'; - +import { useDraggable } from '@/utils/drag'; defineOptions({ name: 'developStatusChart' }); @@ -41,7 +41,7 @@ const dataLoading = ref(false); const modalVisible = ref(false); const modalProps = ref({}); - +useDraggable(modalVisible, { boundary: true, resetOnOpen: true }); function openModal(props: any) { modalProps.value = props; modalVisible.value = true; diff --git a/frontend/src/components/engEnvironmentData/index.vue b/frontend/src/components/engEnvironmentData/index.vue index b368b924..cdedab24 100644 --- a/frontend/src/components/engEnvironmentData/index.vue +++ b/frontend/src/components/engEnvironmentData/index.vue @@ -60,7 +60,7 @@ import { ref, watch } from 'vue'; import { getVmsstbprptKendoList } from '@/api/home'; import { useJidiSelectEventStore } from '@/store/modules/jidiSelectEvent'; import HuanJingSJJRQK from '@/modules/shuidianhuangjingjieruMod/TwoLayer/HuanJingSJJRQK.vue'; - +import { useDraggable } from '@/utils/drag'; defineOptions({ name: 'EngEnvironmentData' }); @@ -72,7 +72,7 @@ const data = ref>({ one: 0, two: 0, three: 0 }); const modalVisible = ref(false); const modalProps = ref({}); - +useDraggable(modalVisible, { boundary: true, resetOnOpen: true }); function openModal(props: any) { modalProps.value = props; modalVisible.value = true; diff --git a/frontend/src/modules/DongWuJiuZhuZhan/JiuZhuZhanQingKuangJieShao.vue b/frontend/src/modules/DongWuJiuZhuZhan/JiuZhuZhanQingKuangJieShao.vue index d65599df..4a82d2cd 100644 --- a/frontend/src/modules/DongWuJiuZhuZhan/JiuZhuZhanQingKuangJieShao.vue +++ b/frontend/src/modules/DongWuJiuZhuZhan/JiuZhuZhanQingKuangJieShao.vue @@ -63,6 +63,7 @@ import SidePanelItem from '@/components/SidePanelItem/index.vue'; import { useJidiSelectEventStore } from '@/store/modules/jidiSelectEvent'; import { vpcGetKendoListCust } from '@/api/zxdzw'; import ArtsDetail from '@/components/carouselIntroduce/ArtsDetail.vue'; +import { useDraggable } from '@/utils/drag'; // 定义组件名(便于调试和递归) defineOptions({ @@ -83,7 +84,7 @@ const baseid = ref(''); // 弹框控制 const modalVisible = ref(false); const currentItem = ref(null); - +useDraggable(modalVisible, { boundary: true, resetOnOpen: true }); // 加载状态 const loading = ref(false); diff --git a/frontend/src/modules/EnvironmentalQuality/TwoLayers/EnvironmentalQualityTwoLayers.vue b/frontend/src/modules/EnvironmentalQuality/TwoLayers/EnvironmentalQualityTwoLayers.vue index e871f270..912ca453 100644 --- a/frontend/src/modules/EnvironmentalQuality/TwoLayers/EnvironmentalQualityTwoLayers.vue +++ b/frontend/src/modules/EnvironmentalQuality/TwoLayers/EnvironmentalQualityTwoLayers.vue @@ -109,6 +109,7 @@ import isSameOrAfter from 'dayjs/plugin/isSameOrAfter' import BasicTable from '@/components/BasicTable/index.vue' import { wqGetKendoList } from '@/api/sz' import HJMZDTwoLays from "./HJMZDTwoLays.vue" +import { useDraggable } from '@/utils/drag'; // 注册 dayjs 插件 dayjs.extend(isSameOrAfter) @@ -155,7 +156,7 @@ const detailModalVisible = ref(false) const detailData = ref({}) const mapModalVisible = ref(false) const mapModalData = ref({}) - +useDraggable(detailModalVisible, { boundary: true, resetOnOpen: true }); // 排序配置 const sortConfig = computed(() => [ { field: 'rstcdStepSort', dir: 'asc' }, diff --git a/frontend/src/modules/EnvironmentalQuality/index.vue b/frontend/src/modules/EnvironmentalQuality/index.vue index d2c9a511..814a5bcc 100644 --- a/frontend/src/modules/EnvironmentalQuality/index.vue +++ b/frontend/src/modules/EnvironmentalQuality/index.vue @@ -36,6 +36,8 @@ import SidePanelItem from '@/components/SidePanelItem/index.vue'; import { wqGetKendoListCust } from '@/api/sz' import { useJidiSelectEventStore } from "@/store/modules/jidiSelectEvent"; import EnvironmentalQualityTwoLayers from "./TwoLayers/EnvironmentalQualityTwoLayers.vue" +import { useDraggable } from '@/utils/drag'; + // 定义组件名(便于调试和递归) defineOptions({ name: 'EnvironmentalQuality' @@ -774,7 +776,7 @@ onUnmounted(() => { // 弹框相关状态 const modalVisible = ref(false); const clickedBarData = ref<{ name: string; current: number | null; lastYear: number | null; selectedId?: string } | null>(null); - +useDraggable(modalVisible, { boundary: true, resetOnOpen: true }); diff --git a/frontend/src/modules/GYZLLB/index.vue b/frontend/src/modules/GYZLLB/index.vue index 91f70884..bfa7ed5d 100644 --- a/frontend/src/modules/GYZLLB/index.vue +++ b/frontend/src/modules/GYZLLB/index.vue @@ -1,77 +1,60 @@ diff --git a/frontend/src/modules/ZhenXiZhiWuYuanMod/ZhiWuYuanJianSheJiJieRuQingKuangBar/index.vue b/frontend/src/modules/ZhenXiZhiWuYuanMod/ZhiWuYuanJianSheJiJieRuQingKuangBar/index.vue index 2ace8474..4933ef49 100644 --- a/frontend/src/modules/ZhenXiZhiWuYuanMod/ZhiWuYuanJianSheJiJieRuQingKuangBar/index.vue +++ b/frontend/src/modules/ZhenXiZhiWuYuanMod/ZhiWuYuanJianSheJiJieRuQingKuangBar/index.vue @@ -32,6 +32,7 @@ import SidePanelItem from '@/components/SidePanelItem/index.vue'; import { vpcGetKendoListCust } from '@/api/zxdzw'; import { useJidiSelectEventStore } from '@/store/modules/jidiSelectEvent'; import ZhiWuYuanDetailTable from './ZhiWuYuanDetailTable.vue'; +import { useDraggable } from '@/utils/drag'; // 定义组件名(便于调试和递归) defineOptions({ @@ -50,7 +51,7 @@ const loading = ref(false); // 弹窗状态 const modalVisible = ref(false); const modalJidi = ref('all'); - +useDraggable(modalVisible, { boundary: true, resetOnOpen: true }); // 基地选项(用于弹窗中的下拉) const jidiOptions = ref([]); diff --git a/frontend/src/modules/alongFishMod/index.vue b/frontend/src/modules/alongFishMod/index.vue index f0d3adc2..2ca8e91d 100644 --- a/frontend/src/modules/alongFishMod/index.vue +++ b/frontend/src/modules/alongFishMod/index.vue @@ -54,6 +54,7 @@ import Yanchengyulei from './TwoLayers/Yanchengyulei.vue'; import { useJidiSelectEventStore } from '@/store/modules/jidiSelectEvent'; import { wbsbGetKendoList, getDftYear, fishChanges2 } from '@/api/stdc'; import moment from 'moment'; +import { useDraggable } from '@/utils/drag'; defineOptions({ name: 'alongFishMod' @@ -108,7 +109,7 @@ const modalHbrvcd = ref(''); const modalStateName = ref(''); const modalSectionName = ref(''); const modalStcd = ref(''); - +useDraggable(modalVisible, { boundary: true, resetOnOpen: true }); // ==================== 图表相关 ==================== /** diff --git a/frontend/src/modules/churukushuiwenMod/index.vue b/frontend/src/modules/churukushuiwenMod/index.vue index 388895b7..abf6cc30 100644 --- a/frontend/src/modules/churukushuiwenMod/index.vue +++ b/frontend/src/modules/churukushuiwenMod/index.vue @@ -53,6 +53,8 @@ import { getVmsstbprpt, inOutOneGetKendoListCust } from '@/api/sw'; import { useJidiSelectEventStore } from '@/store/modules/jidiSelectEvent'; import churukushuiwen from './churukushuiwen.vue'; import { MapClass } from '@/components/gis/map.class'; +import { useDraggable } from '@/utils/drag'; + // ==================== 组件基础配置 ==================== // 定义组件名(便于调试和递归) defineOptions({ @@ -96,7 +98,7 @@ const modalVisible = ref(false); // 弹框显示状态 const clickDataInfo = ref(null); // 点击的数据点信息 const stationName = ref(''); // 站点名称 // ==================== 数据处理函数 ==================== - +useDraggable(modalVisible, { boundary: true, resetOnOpen: true }); /** * 转换图表数据格式 * 将后端返回的扁平数据结构转换为ECharts所需的双线数据格式 diff --git a/frontend/src/modules/dianxingcuoshijieshao/index.vue b/frontend/src/modules/dianxingcuoshijieshao/index.vue index 44cc22b1..e08eea2a 100644 --- a/frontend/src/modules/dianxingcuoshijieshao/index.vue +++ b/frontend/src/modules/dianxingcuoshijieshao/index.vue @@ -2,7 +2,7 @@ \ No newline at end of file + diff --git a/frontend/src/modules/huanbaoMod/index.vue b/frontend/src/modules/huanbaoMod/index.vue index d02f6001..262ef197 100644 --- a/frontend/src/modules/huanbaoMod/index.vue +++ b/frontend/src/modules/huanbaoMod/index.vue @@ -1,5 +1,5 @@ - @@ -296,8 +304,12 @@ onUnmounted(() => { } .empty-container { display: flex; + flex-direction: column; justify-content: center; align-items: center; height: 200px; + p{ + text-indent:0px !important; + } } diff --git a/frontend/src/modules/huanbaoMod/index.vue b/frontend/src/modules/huanbaoMod/index.vue index 262ef197..32605966 100644 --- a/frontend/src/modules/huanbaoMod/index.vue +++ b/frontend/src/modules/huanbaoMod/index.vue @@ -30,7 +30,7 @@ { width: 35%; height: 482px; // position: relative; - min-width: 521px; - + .pie-chart { width: 100%; height: 100%; diff --git a/frontend/src/modules/shengTaiLiuLiangXieFangSheShiMod/xieFangFangShi/index.vue b/frontend/src/modules/shengTaiLiuLiangXieFangSheShiMod/xieFangFangShi/index.vue index 15cf663d..e1566e3c 100644 --- a/frontend/src/modules/shengTaiLiuLiangXieFangSheShiMod/xieFangFangShi/index.vue +++ b/frontend/src/modules/shengTaiLiuLiangXieFangSheShiMod/xieFangFangShi/index.vue @@ -37,7 +37,7 @@ { .chart-section { width: 35%; height: 482px; - min-width: 521px; + .pie-chart { width: 100%; diff --git a/frontend/src/modules/shengTaiLiuLiangXieFangSheShiMod/xieFangFenBu/index.vue b/frontend/src/modules/shengTaiLiuLiangXieFangSheShiMod/xieFangFenBu/index.vue index 58bf3cdc..502c418d 100644 --- a/frontend/src/modules/shengTaiLiuLiangXieFangSheShiMod/xieFangFenBu/index.vue +++ b/frontend/src/modules/shengTaiLiuLiangXieFangSheShiMod/xieFangFenBu/index.vue @@ -10,7 +10,7 @@ diff --git a/frontend/src/modules/shuidianhuangjingjieruMod/DataTable.vue b/frontend/src/modules/shuidianhuangjingjieruMod/DataTable.vue index 4de785e7..f0513a14 100644 --- a/frontend/src/modules/shuidianhuangjingjieruMod/DataTable.vue +++ b/frontend/src/modules/shuidianhuangjingjieruMod/DataTable.vue @@ -7,7 +7,7 @@ From 6c521d9d847dffcf52713d1bb6f3c4a412ad3dee Mon Sep 17 00:00:00 2001 From: tangwei Date: Tue, 7 Jul 2026 14:40:04 +0800 Subject: [PATCH 23/27] =?UTF-8?q?fix:=20=E4=BC=98=E5=8C=96=E5=9C=B0?= =?UTF-8?q?=E5=9B=BE=E6=9F=A5=E8=AF=A2=E6=8E=A5=E5=8F=A3=E9=80=BB=E8=BE=91?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../fb/service/impl/FbStationServiceImpl.java | 2 +- .../fh/service/impl/FhHabitatServiceImpl.java | 4 +- .../service/impl/SdWtMonitorServiceImpl.java | 67 +++++++++++++------ 3 files changed, 48 insertions(+), 25 deletions(-) diff --git a/backend/src/main/java/com/yfd/platform/qgc_env/fb/service/impl/FbStationServiceImpl.java b/backend/src/main/java/com/yfd/platform/qgc_env/fb/service/impl/FbStationServiceImpl.java index 80cc3408..1712f20c 100644 --- a/backend/src/main/java/com/yfd/platform/qgc_env/fb/service/impl/FbStationServiceImpl.java +++ b/backend/src/main/java/com/yfd/platform/qgc_env/fb/service/impl/FbStationServiceImpl.java @@ -4705,7 +4705,7 @@ public class FbStationServiceImpl implements FbStationService { case "rstcd" -> "a.RSTCD"; case "stcd" -> "a.STCD"; case "sttp" -> "a.STTP"; - case "bldsttCcode" -> "a.BLDSTT_CODE"; + case "bldsttccode" -> "a.BLDSTT_CODE"; case "lgtd" -> "a.LGTD"; default -> null; }; diff --git a/backend/src/main/java/com/yfd/platform/qgc_env/fh/service/impl/FhHabitatServiceImpl.java b/backend/src/main/java/com/yfd/platform/qgc_env/fh/service/impl/FhHabitatServiceImpl.java index 0efb414b..aa5bad69 100644 --- a/backend/src/main/java/com/yfd/platform/qgc_env/fh/service/impl/FhHabitatServiceImpl.java +++ b/backend/src/main/java/com/yfd/platform/qgc_env/fh/service/impl/FhHabitatServiceImpl.java @@ -1977,7 +1977,7 @@ public class FhHabitatServiceImpl implements FhHabitatService { sql.append("AND ").append(filterSql).append(" "); } Page page = loadOptions == null ? null : QgcQueryWrapperUtil.buildPage(loadOptions, loadOptions.getSkip(), loadOptions.getTake()); - List vaVpList = microservicDynamicSQLMapper.pageAllListWithResultType(page, sql.toString(), new HashMap<>(), FhHaVapVo.class); + List vaVpList = microservicDynamicSQLMapper.pageAllListWithResultType(page, sql.toString(), paramMap, FhHaVapVo.class); for (FhHaVapVo vo : vaVpList) { String bldsttCcode = vo.getBldsttCcode(); @@ -2009,7 +2009,7 @@ public class FhHabitatServiceImpl implements FhHabitatService { return null; } return switch (field.toLowerCase()) { - case "sttpCode" -> "t.sttp"; + case "sttpcode" -> "t.STTP_CODE"; case "lgtd" -> "t.lgtd"; default -> null; }; 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 b28551d8..127a19cc 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 @@ -26,6 +26,7 @@ import com.yfd.platform.qgc_env.wt.mapper.SdWtMonitorMapper; import com.yfd.platform.qgc_env.wt.utils.SiteAvoidanceUtils; import com.yfd.platform.qgc_env.wt.service.SdWtMonitorService; import com.yfd.platform.utils.QgcQueryWrapperUtil; +import com.yfd.platform.utils.SecurityUtils; import jakarta.annotation.Resource; import lombok.Data; import org.springframework.jdbc.core.JdbcTemplate; @@ -115,7 +116,7 @@ public class SdWtMonitorServiceImpl implements SdWtMonitorService { "t.JCDT AS jcdt, " + "t.WDDT AS wddt, " + "t.BLDSTT_CODE AS bldsttCode, " + - "CASE WHEN t.BLDSTT_CODE =2 THEN '已建' WHEN t.BLDSTT_CODE =1 THEN '在建' ELSE '未建/规划' END AS bldsttCcodeName, "+ + "CASE WHEN t.BLDSTT_CODE =2 THEN '已建' WHEN t.BLDSTT_CODE =1 THEN '在建' ELSE '未建/规划' END AS bldsttCcodeName, " + "t.INV AS inv, " + "t.INVINMN AS invinmn, " + "t.INTRODUCE AS introduce, " + @@ -127,7 +128,7 @@ public class SdWtMonitorServiceImpl implements SdWtMonitorService { "t.DTIN_TYPE AS dtinType, " + "t.DTIN_TM AS dtinTm, " + "t.MWAY AS mway, " + - "CASE NVL(t.MWAY, 0) WHEN 1 THEN '人工' WHEN 2 THEN '自动' ELSE '未知' END AS mwayName , "+ + "CASE NVL(t.MWAY, 0) WHEN 1 THEN '人工' WHEN 2 THEN '自动' ELSE '未知' END AS mwayName , " + "t.STINDX AS stindx, " + "t.ORDER_INDEX AS orderIndex, " + "t.DMSTCD AS dmstcd, " + @@ -445,7 +446,7 @@ public class SdWtMonitorServiceImpl implements SdWtMonitorService { } sql.append(buildYearDetailOrderBySql(dataSourceRequest == null ? null : dataSourceRequest.getSort())); - Page page = QgcQueryWrapperUtil.buildPage(loadOptions,loadOptions.getSkip(), loadOptions.getTake()); + Page page = QgcQueryWrapperUtil.buildPage(loadOptions, loadOptions.getSkip(), loadOptions.getTake()); List list = microservicDynamicSQLMapper.pageAllListWithResultType(page, sql.toString(), paramMap, SdYearDetailVO.class); for (SdYearDetailVO vo : list) { vo.setActualTemp(vo.getWt()); @@ -490,7 +491,7 @@ public class SdWtMonitorServiceImpl implements SdWtMonitorService { } sql.append(buildMonthDetailOrderBySql(dataSourceRequest == null ? null : dataSourceRequest.getSort())); - Page page = QgcQueryWrapperUtil.buildPage(loadOptions,loadOptions.getSkip(), loadOptions.getTake()); + Page page = QgcQueryWrapperUtil.buildPage(loadOptions, loadOptions.getSkip(), loadOptions.getTake()); List list = microservicDynamicSQLMapper.pageAllListWithResultType(page, sql.toString(), paramMap, SdMonthDetailVO.class); DataSourceResult result = new DataSourceResult<>(); result.setData(list); @@ -518,7 +519,7 @@ public class SdWtMonitorServiceImpl implements SdWtMonitorService { Map paramMap = new HashMap<>(); paramMap.put("stcd", stcd); WtrvVo vo = (WtrvVo) microservicDynamicSQLMapper.getOneBySqlWithResultType(sql, paramMap, WtrvVo.class); - if (vo == null ) { + if (vo == null) { return buildDefaultWtrvVo(stcd); } return vo; @@ -577,7 +578,7 @@ public class SdWtMonitorServiceImpl implements SdWtMonitorService { paramMap.put("baseId", baseId); } - Page page = QgcQueryWrapperUtil.buildPage(loadOptions,loadOptions.getSkip(), loadOptions.getTake()); + Page page = QgcQueryWrapperUtil.buildPage(loadOptions, loadOptions.getSkip(), loadOptions.getTake()); List wtFishVoList = microservicDynamicSQLMapper.pageAllListWithResultType(page, sql.toString(), paramMap, WtFishVo.class); String hbrvcd = wtFishVoList.isEmpty() ? null : wtFishVoList.get(0).getHbrvcd(); @@ -850,7 +851,7 @@ public class SdWtMonitorServiceImpl implements SdWtMonitorService { } sql.append(buildVmsstbprptOrderBySql(dataSourceRequest.getSort())); - Page page = QgcQueryWrapperUtil.buildPage(loadOptions,loadOptions.getSkip(), loadOptions.getTake()); + Page page = QgcQueryWrapperUtil.buildPage(loadOptions, loadOptions.getSkip(), loadOptions.getTake()); List list = microservicDynamicSQLMapper.pageAllListWithResultType(page, sql.toString(), paramMap, SdWtBaseInfoVO.class); DataSourceResult result = new DataSourceResult<>(); @@ -1153,7 +1154,7 @@ public class SdWtMonitorServiceImpl implements SdWtMonitorService { appendCxDetailOrderBy(sql, dataSourceRequest.getSort()); DataSourceLoadOptionsBase loadOptions = dataSourceRequest.toDevRequest(); - Page page = QgcQueryWrapperUtil.buildPage(loadOptions,loadOptions.getSkip(), loadOptions.getTake()); + Page page = QgcQueryWrapperUtil.buildPage(loadOptions, loadOptions.getSkip(), loadOptions.getTake()); List rowList = microservicDynamicSQLMapper.pageAllListWithResultType(page, sql.toString(), paramMap, WtCxDetailRow.class); List verticalList = getVerticals(rowList, wtDeviceType); @@ -2954,7 +2955,7 @@ public class SdWtMonitorServiceImpl implements SdWtMonitorService { " wt.LTTD AS lttd,\n" + " wt.WT_DEVICE_TYPE AS deviceType,\n" + " wt.ELEV AS dtmel,\n" + - " wt.FHSTNM AS fhstnm,\n" + +// " wt.FHSTNM AS fhstnm,\n" + " wt.MWAY AS mway,\n" + " eng.RVCD AS rvcd,\n" + " eng.ADDVCD AS addvcd,\n" + @@ -2971,21 +2972,30 @@ public class SdWtMonitorServiceImpl implements SdWtMonitorService { "LEFT JOIN SD_ENGINFO_B_H eng ON eng.STCD = wt.RSTCD AND NVL(eng.IS_DELETED, 0) = 0\n" + "LEFT JOIN SD_WTENGRLTN_B rel ON rel.STCD = wt.STCD AND NVL(rel.IS_DELETED, 0) = 0\n" + "WHERE NVL(wt.IS_DELETED, 0) = 0 AND wt.STTP IN ('WTRV', 'WTVT') AND wt.LGTD IS NOT NULL AND wt.LTTD IS NOT NULL "); - - if (StrUtil.isNotBlank(sttpCode)) { - sql.append(" AND wt.STTP = #{map.sttpCode} "); - } - if (StrUtil.isNotBlank(dtinType)) { - sql.append(" AND wt.DTIN_TYPE = #{map.dtinType} "); - } - Map paramMap = new HashMap<>(); - if (StrUtil.isNotBlank(sttpCode)) { - paramMap.put("sttpCode", sttpCode); - } - if (StrUtil.isNotBlank(dtinType)) { - paramMap.put("dtinType", dtinType); + String filterSql = QgcQueryWrapperUtil.buildFilterCondition( + dataSourceRequest == null ? null : dataSourceRequest.getFilter(), + paramMap, + new int[]{0}, + this::mapWeFvColumn + ); + if (StrUtil.isNotBlank(filterSql)) { + sql.append("AND ").append(filterSql).append(" "); } +// if (StrUtil.isNotBlank(sttpCode)) { +// sql.append(" AND wt.STTP = #{map.sttpCode} "); +// } +// if (StrUtil.isNotBlank(dtinType)) { +// sql.append(" AND wt.DTIN_TYPE = #{map.dtinType} "); +// } +// +// Map paramMap = new HashMap<>(); +// if (StrUtil.isNotBlank(sttpCode)) { +// paramMap.put("sttpCode", sttpCode); +// } +// if (StrUtil.isNotBlank(dtinType)) { +// paramMap.put("dtinType", dtinType); +// } List sort = dataSourceRequest.getSort(); if (sort != null && !sort.isEmpty()) { @@ -3035,4 +3045,17 @@ public class SdWtMonitorServiceImpl implements SdWtMonitorService { return dataSourceResult; } + private String mapWeFvColumn(String field) { + if (StrUtil.isBlank(field)) { + return null; + } + return switch (field.toLowerCase()) { + case "sttpcode" -> "wt.STTP"; + case "dtintype" -> "wt.DTIN_TYPE"; + case "lgtd" -> "wt.LGTD"; + case "fhstcd" -> "wt.FHSTCD"; + default -> null; + }; + } + } From 58fec2e6f19a98c3d173556b6f4bbf404fd72954 Mon Sep 17 00:00:00 2001 From: tangwei Date: Tue, 7 Jul 2026 15:20:16 +0800 Subject: [PATCH 24/27] =?UTF-8?q?fix:=20=E7=94=B5=E7=AB=99=E7=BB=9F?= =?UTF-8?q?=E8=AE=A1=E7=8A=B6=E6=80=81=E6=9D=A1=E4=BB=B6=E4=BC=98=E5=8C=96?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../platform/qgc_eng/eq/service/impl/EngEqDataServiceImpl.java | 1 + 1 file changed, 1 insertion(+) diff --git a/backend/src/main/java/com/yfd/platform/qgc_eng/eq/service/impl/EngEqDataServiceImpl.java b/backend/src/main/java/com/yfd/platform/qgc_eng/eq/service/impl/EngEqDataServiceImpl.java index 81365936..3ffbb034 100644 --- a/backend/src/main/java/com/yfd/platform/qgc_eng/eq/service/impl/EngEqDataServiceImpl.java +++ b/backend/src/main/java/com/yfd/platform/qgc_eng/eq/service/impl/EngEqDataServiceImpl.java @@ -5498,6 +5498,7 @@ public class EngEqDataServiceImpl implements EngEqDataService { case "bldsttCcode" -> "t.bldsttCcode"; case "dtinEnv" -> "t.dtinEnv"; case "DTIN" -> "t.dtin"; + case "dtin" -> "t.dtin"; case "runState" -> "t.runState"; case "baseStepSort" -> "NVL(t.baseStepSort, 999999)"; case "rvcdStepSort" -> "NVL(t.rvcdStepSort, 999999)"; From d9e15f97365e897c449e084d2272e84944f80beb Mon Sep 17 00:00:00 2001 From: tangwei Date: Tue, 7 Jul 2026 15:44:55 +0800 Subject: [PATCH 25/27] =?UTF-8?q?feat:=20=E6=A0=96=E6=81=AF=E5=9C=B0?= =?UTF-8?q?=E5=85=B3=E8=81=94=E7=AB=99=E7=82=B9=E6=8F=8F=E7=82=B9?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../fh/controller/FhHabitatController.java | 6 + .../qgc_env/fh/entity/vo/FhPointVo.java | 67 +++++++++ .../qgc_env/fh/service/FhHabitatService.java | 3 + .../fh/service/impl/FhHabitatServiceImpl.java | 138 ++++++++++++++++++ 4 files changed, 214 insertions(+) create mode 100644 backend/src/main/java/com/yfd/platform/qgc_env/fh/entity/vo/FhPointVo.java diff --git a/backend/src/main/java/com/yfd/platform/qgc_env/fh/controller/FhHabitatController.java b/backend/src/main/java/com/yfd/platform/qgc_env/fh/controller/FhHabitatController.java index 1ab1d44d..8c303c5e 100644 --- a/backend/src/main/java/com/yfd/platform/qgc_env/fh/controller/FhHabitatController.java +++ b/backend/src/main/java/com/yfd/platform/qgc_env/fh/controller/FhHabitatController.java @@ -77,4 +77,10 @@ public class FhHabitatController { public ResponseResult getFhvapKendoListCust(@RequestBody DataSourceRequest dataSourceRequest) { return ResponseResult.successData(fhHabitatService.getFhvapKendoListCust(dataSourceRequest)); } + + @PostMapping("/fhvap/fhPoint/GetKendoListCust") + @Operation(summary = "栖息地关联站点描点") + public ResponseResult getFhPoint(@RequestBody DataSourceRequest dataSourceRequest) { + return ResponseResult.successData(fhHabitatService.getFhPoint(dataSourceRequest)); + } } diff --git a/backend/src/main/java/com/yfd/platform/qgc_env/fh/entity/vo/FhPointVo.java b/backend/src/main/java/com/yfd/platform/qgc_env/fh/entity/vo/FhPointVo.java new file mode 100644 index 00000000..6beebf5f --- /dev/null +++ b/backend/src/main/java/com/yfd/platform/qgc_env/fh/entity/vo/FhPointVo.java @@ -0,0 +1,67 @@ +package com.yfd.platform.qgc_env.fh.entity.vo; + +import io.swagger.v3.oas.annotations.media.Schema; +import lombok.Data; +import lombok.experimental.Accessors; + +import java.io.Serializable; +import java.math.BigDecimal; + +@Data +@Accessors(chain = true) +@Schema(description = "栖息地关联站点描点") +public class FhPointVo implements Serializable { + + private static final long serialVersionUID = 1L; + + @Schema(description = "所属栖息地编码") + private String fhstcd; + + @Schema(description = "站码") + private String stcd; + + @Schema(description = "站名") + private String stnm; + + @Schema(description = "所属电站名称") + private String ennm; + + @Schema(description = "经度") + private BigDecimal lgtd; + + @Schema(description = "纬度") + private BigDecimal lttd; + + @Schema(description = "基地编码") + private String baseId; + + @Schema(description = "基地名称") + private String baseName; + + @Schema(description = "所属流域编码") + private String rvcd; + + @Schema(description = "所属流域名称") + private String rvcdName; + + @Schema(description = "所属电站编码") + private String rstcd; + + @Schema(description = "所属站类编码") + private String sttpCode; + + @Schema(description = "基面高程") + private BigDecimal dtmel; + + @Schema(description = "是否接入") + private Integer dtin; + + @Schema(description = "建设状态分类") + private String bldsttCcode; + + @Schema(description = "描点状态") + private String anchoPointState; + + @Schema(description = "出入库标识(1 入库水温, 2 出库水温, 3 非出入库水温)") + private Integer ioType; +} diff --git a/backend/src/main/java/com/yfd/platform/qgc_env/fh/service/FhHabitatService.java b/backend/src/main/java/com/yfd/platform/qgc_env/fh/service/FhHabitatService.java index 12e188e6..f279b5a0 100644 --- a/backend/src/main/java/com/yfd/platform/qgc_env/fh/service/FhHabitatService.java +++ b/backend/src/main/java/com/yfd/platform/qgc_env/fh/service/FhHabitatService.java @@ -6,6 +6,7 @@ import com.yfd.platform.qgc_env.fh.entity.ao.FhDefaultAo; import com.yfd.platform.qgc_env.fh.entity.vo.FhBaseInfoVo; import com.yfd.platform.qgc_env.fh.entity.vo.FhDefaultVo; import com.yfd.platform.qgc_env.fh.entity.vo.FhHaVapVo; +import com.yfd.platform.qgc_env.fh.entity.vo.FhPointVo; import com.yfd.platform.qgc_env.fh.entity.vo.HabitatVo; public interface FhHabitatService { @@ -27,4 +28,6 @@ public interface FhHabitatService { DataSourceResult getStTbYsBVoKendoListCust(DataSourceRequest dataSourceRequest); DataSourceResult getFhvapKendoListCust(DataSourceRequest dataSourceRequest); + + DataSourceResult getFhPoint(DataSourceRequest dataSourceRequest); } diff --git a/backend/src/main/java/com/yfd/platform/qgc_env/fh/service/impl/FhHabitatServiceImpl.java b/backend/src/main/java/com/yfd/platform/qgc_env/fh/service/impl/FhHabitatServiceImpl.java index aa5bad69..9156d14b 100644 --- a/backend/src/main/java/com/yfd/platform/qgc_env/fh/service/impl/FhHabitatServiceImpl.java +++ b/backend/src/main/java/com/yfd/platform/qgc_env/fh/service/impl/FhHabitatServiceImpl.java @@ -17,6 +17,7 @@ import com.yfd.platform.qgc_env.fh.entity.ao.FhDefaultAo; import com.yfd.platform.qgc_env.fh.entity.vo.FhBaseInfoVo; import com.yfd.platform.qgc_env.fh.entity.vo.FhDefaultVo; import com.yfd.platform.qgc_env.fh.entity.vo.FhHaVapVo; +import com.yfd.platform.qgc_env.fh.entity.vo.FhPointVo; import com.yfd.platform.qgc_env.fh.entity.vo.HabitatVo; import com.yfd.platform.qgc_env.fh.entity.vo.FhMsstbprptVo; import com.yfd.platform.qgc_env.fh.entity.vo.FhSdriverdayVo; @@ -2004,6 +2005,120 @@ public class FhHabitatServiceImpl implements FhHabitatService { return dataSourceResult; } + @Override + public DataSourceResult getFhPoint(DataSourceRequest dataSourceRequest) { + DataSourceResult result = new DataSourceResult<>(); + result.setAggregates(new HashMap<>()); + + DataSourceLoadOptionsBase loadOptions = dataSourceRequest == null ? null : dataSourceRequest.toDevRequest(); + Map paramMap = new HashMap<>(); + StringBuilder sql = new StringBuilder(); + sql.append("SELECT ") + .append("t.fhstcd AS fhstcd, ") + .append("t.stcd AS stcd, ") + .append("t.stnm AS stnm, ") + .append("eng.ENNM AS ennm, ") + .append("t.lgtd AS lgtd, ") + .append("t.lttd AS lttd, ") + .append("t.baseId AS baseId, ") + .append("hb.BASENAME AS baseName, ") + .append("t.rvcd AS rvcd, ") + .append("rv.RVNM AS rvcdName, ") + .append("t.rstcd AS rstcd, ") + .append("t.sttpCode AS sttpCode, ") + .append("t.dtmel AS dtmel, ") + .append("t.dtin AS dtin, ") + .append("t.bldsttCcode AS bldsttCcode, ") + .append("t.ioType AS ioType ") + .append("FROM (") + .append("SELECT fh.STCD AS fhstcd, wq.STCD AS stcd, wq.STNM AS stnm, ") + .append(" wq.LGTD AS lgtd, wq.LTTD AS lttd, fh.BASE_ID AS baseId, ") + .append(" null AS rvcd, wq.RSTCD AS rstcd, ") + .append(" 'WQ' AS sttpCode, wq.ELEV AS dtmel, wq.DTIN AS dtin, ") + .append(" TO_CHAR(wq.BLDSTT_CODE) AS bldsttCcode, CAST(NULL AS NUMBER) AS ioType ") + .append("FROM SD_FHBT_B_H fh ") + .append("INNER JOIN SD_WQ_B_H wq ON fh.STCD = wq.FHSTCD ") + .append("WHERE NVL(fh.IS_DELETED, 0) = 0 ") + .append(" AND NVL(wq.IS_DELETED, 0) = 0 ") + .append(" AND fh.BASE_ID <> 'other' ") + .append(" AND wq.LGTD IS NOT NULL ") + .append("UNION ALL ") + .append("SELECT fh.STCD AS fhstcd, wt.STCD AS stcd, wt.STNM AS stnm, ") + .append(" wt.LGTD AS lgtd, wt.LTTD AS lttd, fh.BASE_ID AS baseId, ") + .append(" NVL(fh.RVCD, engWt.RVCD) AS rvcd, wt.RSTCD AS rstcd, ") + .append(" 'WTRV' AS sttpCode, wt.ELEV AS dtmel, wt.DTIN AS dtin, ") + .append(" TO_CHAR(wt.BLDSTT_CODE) AS bldsttCcode, ") + .append(" CASE WHEN wt.WT_TYPE = 'IWT' THEN 1 ") + .append(" WHEN wt.WT_TYPE = 'DWT' THEN 2 ") + .append(" ELSE 3 END AS ioType ") + .append("FROM SD_FHBT_B_H fh ") + .append("INNER JOIN SD_WT_B_H wt ON fh.STCD = wt.FHSTCD ") + .append("LEFT JOIN SD_ENGINFO_B_H engWt ON engWt.STCD = wt.RSTCD AND NVL(engWt.IS_DELETED, 0) = 0 ") + .append("WHERE NVL(fh.IS_DELETED, 0) = 0 ") + .append(" AND NVL(wt.IS_DELETED, 0) = 0 ") + .append(" AND fh.BASE_ID <> 'other' ") + .append(" AND wt.LGTD IS NOT NULL ") + .append(" AND wt.STTP = 'WTRV' ") + .append("UNION ALL ") + .append("SELECT fh.STCD AS fhstcd, rv.STCD AS stcd, rv.STNM AS stnm, ") + .append(" rv.LGTD AS lgtd, rv.LTTD AS lttd, fh.BASE_ID AS baseId, ") + .append(" NVL(fh.RVCD, engRv.RVCD) AS rvcd, rv.RSTCD AS rstcd, ") + .append(" 'ZQ' AS sttpCode, rv.ELEV AS dtmel, rv.DTIN AS dtin, ") + .append(" TO_CHAR(rv.BLDSTT_CODE) AS bldsttCcode, CAST(NULL AS NUMBER) AS ioType ") + .append("FROM SD_FHBT_B_H fh ") + .append("INNER JOIN SD_RIVER_B_H rv ON fh.STCD = rv.FHSTCD ") + .append("LEFT JOIN SD_ENGINFO_B_H engRv ON engRv.STCD = rv.RSTCD AND NVL(engRv.IS_DELETED, 0) = 0 ") + .append("WHERE NVL(fh.IS_DELETED, 0) = 0 ") + .append(" AND NVL(rv.IS_DELETED, 0) = 0 ") + .append(" AND fh.BASE_ID <> 'other' ") + .append(" AND rv.LGTD IS NOT NULL ") + .append(" AND rv.STTP = 'ZQ' ") + .append("UNION ALL ") + .append("SELECT fh.STCD AS fhstcd, vd.STCD AS stcd, vd.STNM AS stnm, ") + .append(" vd.LGTD AS lgtd, vd.LTTD AS lttd, fh.BASE_ID AS baseId, ") + .append(" NVL(vd.RVCD, fh.RVCD) AS rvcd, vd.RSTCD AS rstcd, ") + .append(" 'VD' AS sttpCode, vd.ELEV AS dtmel, vd.DTIN AS dtin, ") + .append(" TO_CHAR(vd.BLDSTT_CODE) AS bldsttCcode, CAST(NULL AS NUMBER) AS ioType ") + .append("FROM SD_FHBT_B_H fh ") + .append("INNER JOIN SD_VDINFO_B vd ON fh.STCD = vd.FHSTCD ") + .append("WHERE NVL(fh.IS_DELETED, 0) = 0 ") + .append(" AND fh.BASE_ID <> 'other' ") + .append(" AND vd.LGTD IS NOT NULL ") + .append(") t ") + .append("LEFT JOIN SD_ENGINFO_B_H eng ON eng.STCD = t.rstcd AND NVL(eng.IS_DELETED, 0) = 0 ") + .append("LEFT JOIN SD_HYDROBASE hb ON hb.BASEID = t.baseId AND NVL(hb.IS_DELETED, 0) = 0 ") + .append("LEFT JOIN SD_RVCD_DIC rv ON rv.RVCD = t.rvcd ") + .append("WHERE 1 = 1 "); + + String filterSql = QgcQueryWrapperUtil.buildFilterCondition( + dataSourceRequest == null ? null : dataSourceRequest.getFilter(), + paramMap, + new int[]{0}, + this::mapFhPointColumn + ); + if (StrUtil.isNotBlank(filterSql)) { + sql.append("AND ").append(filterSql).append(" "); + } + sql.append("ORDER BY t.fhstcd, t.sttpCode, t.stcd"); + + List list = microservicDynamicSQLMapper.getAllListWithResultType(sql.toString(), paramMap, FhPointVo.class); + for (FhPointVo vo : list) { + String sttpCode = StrUtil.blankToDefault(vo.getSttpCode(), ""); + if ("WQ".equalsIgnoreCase(sttpCode)) { + vo.setAnchoPointState("FH_WQ"); + } else if ("WTRV".equalsIgnoreCase(sttpCode)) { + vo.setAnchoPointState("FH_WTRV"); + } else if ("ZQ".equalsIgnoreCase(sttpCode)) { + vo.setAnchoPointState("FH_ZQ"); + } else if ("VD".equalsIgnoreCase(sttpCode)) { + vo.setAnchoPointState("FH_VD"); + } + } + result.setData(list); + result.setTotal((long) list.size()); + return result; + } + private String mapWeFvColumn(String field) { if (StrUtil.isBlank(field)) { return null; @@ -2014,4 +2129,27 @@ public class FhHabitatServiceImpl implements FhHabitatService { default -> null; }; } + + private String mapFhPointColumn(String field) { + if (StrUtil.isBlank(field)) { + return null; + } + return switch (field.toLowerCase()) { + case "fhstcd" -> "t.fhstcd"; + case "stcd" -> "t.stcd"; + case "stnm" -> "t.stnm"; + case "ennm" -> "eng.ENNM"; + case "baseid" -> "t.baseId"; + case "basename" -> "hb.BASENAME"; + case "rvcd" -> "t.rvcd"; + case "rvcdname" -> "rv.RVNM"; + case "rstcd" -> "t.rstcd"; + case "sttpcode" -> "t.sttpCode"; + case "dtin" -> "t.dtin"; + case "bldsttccode" -> "t.bldsttCcode"; + case "lgtd" -> "t.lgtd"; + case "lttd" -> "t.lttd"; + default -> null; + }; + } } From 645b97435c748d6b2ee19c9a214d3d5752e6f7e8 Mon Sep 17 00:00:00 2001 From: tangwei Date: Tue, 7 Jul 2026 16:15:49 +0800 Subject: [PATCH 26/27] =?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/FishDraftDataController.java | 51 ++++++- .../impl/FishDraftDataServiceImpl.java | 140 ++++++++++++++---- 2 files changed, 158 insertions(+), 33 deletions(-) diff --git a/backend/src/main/java/com/yfd/platform/qgc_data/controller/FishDraftDataController.java b/backend/src/main/java/com/yfd/platform/qgc_data/controller/FishDraftDataController.java index 4399f5e5..3534edde 100644 --- a/backend/src/main/java/com/yfd/platform/qgc_data/controller/FishDraftDataController.java +++ b/backend/src/main/java/com/yfd/platform/qgc_data/controller/FishDraftDataController.java @@ -60,6 +60,8 @@ import java.util.*; @Slf4j public class FishDraftDataController { + private static final int IN_QUERY_BATCH_SIZE = 900; + @Resource private IFishDraftDataService fishDraftDataService; @@ -368,11 +370,10 @@ public class FishDraftDataController { @PostMapping("/batchApproveByApprovalId") @Operation(summary = "根据审批批次全部审批通过") public ResponseResult batchApproveByApprovalId(@RequestBody BatchApproveRequest request) { - if (request.getApprovalIds().isEmpty()) { + if (request.getApprovalIds() == null || request.getApprovalIds().isEmpty()) { return ResponseResult.error("请选择审批批次"); } - List draft = fishDraftDataService.list(new LambdaQueryWrapper().eq(FishDraftData::getDeletedFlag, 0).in(FishDraftData::getApprovalId, request.getApprovalIds()).eq(FishDraftData::getStatus, "PENDING").select(FishDraftData::getId)); - List ids = draft.stream().map(FishDraftData::getId).toList(); + List ids = listDraftIdsByApprovalIdsAndStatus(request.getApprovalIds(), "PENDING"); boolean result = fishDraftDataService.batchApprove(ids, request.getApproveComment()); return result ? ResponseResult.success("审批通过") : ResponseResult.error("审批失败"); } @@ -388,8 +389,7 @@ public class FishDraftDataController { @Operation(summary = "批量驳回") public ResponseResult batchRejectFull(@RequestBody BatchRejectRequest request) { if (request.getApprovalIds() != null && !request.getApprovalIds().isEmpty()) { - List draft = fishDraftDataService.list(new LambdaQueryWrapper().eq(FishDraftData::getDeletedFlag, 0).in(FishDraftData::getApprovalId, request.getApprovalIds()).eq(FishDraftData::getStatus, "PENDING").select(FishDraftData::getId)); - List ids = draft.stream().map(FishDraftData::getId).toList(); + List ids = listDraftIdsByApprovalIdsAndStatus(request.getApprovalIds(), "PENDING"); boolean result = fishDraftDataService.rejectBatch(ids, request.getRejectReason()); return result ? ResponseResult.success("驳回成功") : ResponseResult.error("驳回失败"); } @@ -429,6 +429,47 @@ public class FishDraftDataController { return result ? ResponseResult.success("修改成功") : ResponseResult.error("修改失败"); } + private List listDraftIdsByApprovalIdsAndStatus(List approvalIds, String status) { + List normalizedApprovalIds = normalizeBatchValues(approvalIds); + if (normalizedApprovalIds.isEmpty()) { + return Collections.emptyList(); + } + List ids = new ArrayList<>(); + for (List batchApprovalIds : splitList(normalizedApprovalIds, IN_QUERY_BATCH_SIZE)) { + List draft = fishDraftDataService.list(new LambdaQueryWrapper() + .eq(FishDraftData::getDeletedFlag, 0) + .in(FishDraftData::getApprovalId, batchApprovalIds) + .eq(FishDraftData::getStatus, status) + .select(FishDraftData::getId)); + ids.addAll(draft.stream().map(FishDraftData::getId).filter(StrUtil::isNotBlank).toList()); + } + return ids; + } + + private List normalizeBatchValues(List values) { + if (values == null || values.isEmpty()) { + return Collections.emptyList(); + } + LinkedHashSet normalized = new LinkedHashSet<>(); + for (String value : values) { + if (StrUtil.isNotBlank(value)) { + normalized.add(value.trim()); + } + } + return new ArrayList<>(normalized); + } + + private List> splitList(List source, int batchSize) { + if (source == null || source.isEmpty()) { + return Collections.emptyList(); + } + List> result = new ArrayList<>(); + for (int i = 0; i < source.size(); i += batchSize) { + result.add(source.subList(i, Math.min(source.size(), i + batchSize))); + } + return result; + } + @PostMapping("/delete") @Operation(summary = "删除过鱼数据") public ResponseResult delete(@RequestParam String id) { diff --git a/backend/src/main/java/com/yfd/platform/qgc_data/service/impl/FishDraftDataServiceImpl.java b/backend/src/main/java/com/yfd/platform/qgc_data/service/impl/FishDraftDataServiceImpl.java index 5a150f58..92fdd607 100644 --- a/backend/src/main/java/com/yfd/platform/qgc_data/service/impl/FishDraftDataServiceImpl.java +++ b/backend/src/main/java/com/yfd/platform/qgc_data/service/impl/FishDraftDataServiceImpl.java @@ -2,7 +2,6 @@ package com.yfd.platform.qgc_data.service.impl; import cn.hutool.core.util.StrUtil; import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; -import com.baomidou.mybatisplus.core.conditions.update.LambdaUpdateWrapper; import com.baomidou.mybatisplus.extension.plugins.pagination.Page; import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; import com.yfd.platform.common.DataSourceLoadOptionsBase; @@ -48,6 +47,8 @@ import java.util.*; @Slf4j public class FishDraftDataServiceImpl extends ServiceImpl implements IFishDraftDataService { + private static final int IN_QUERY_BATCH_SIZE = 200; + @Resource private FishDraftDataMapper fishDraftDataMapper; @@ -254,16 +255,15 @@ public class FishDraftDataServiceImpl extends ServiceImpl ids) { - long count = this.count(new LambdaQueryWrapper().in(FishDraftData::getId, ids).eq(FishDraftData::getLockFlag, 1)); + long count = countByIdsAndLockFlag(ids, 1); if(count > 0){ return false; } - LambdaUpdateWrapper updateWrapper = new LambdaUpdateWrapper<>(); - updateWrapper.in(FishDraftData::getId, ids); - updateWrapper.set(FishDraftData::getDeletedFlag, 1); String userId = SecurityUtils.getUserId(); - updateWrapper.set(FishDraftData::getDeletedBy,userId ); - return this.update(updateWrapper); + return updateByIdsInBatches(ids, entity -> { + entity.setDeletedFlag(1); + entity.setDeletedBy(userId); + }); } @Override @@ -313,13 +313,13 @@ public class FishDraftDataServiceImpl extends ServiceImpl updateWrapper = new LambdaUpdateWrapper<>(); - updateWrapper.in(FishDraftData::getId, ids); - updateWrapper.eq(FishDraftData::getLockFlag, 0); - updateWrapper.set(FishDraftData::getApprovalId, approvalMain.getId()); - updateWrapper.set(FishDraftData::getStatus, "PENDING"); - updateWrapper.set(FishDraftData::getSubmitTime, new Date()); - this.update(updateWrapper); + List unlockedIds = listIdsByLockFlag(ids, 0); + Date submitTime = new Date(); + updateByIdsInBatches(unlockedIds, entity -> { + entity.setApprovalId(approvalMain.getId()); + entity.setStatus("PENDING"); + entity.setSubmitTime(submitTime); + }); approvalLogService.logSubmit(approvalMain.getId(), operatorId, "批量提交草稿,共" + ids.size() + "条"); @@ -421,7 +421,7 @@ public class FishDraftDataServiceImpl extends ServiceImpl dataList = this.listByIds(ids); + List dataList = listByIdsInBatches(ids); Set processedApprovalIds = new HashSet<>(); List validIds = new ArrayList<>(); List fpssRList = new ArrayList<>(); @@ -438,12 +438,11 @@ public class FishDraftDataServiceImpl extends ServiceImpl updateWrapper = new LambdaUpdateWrapper<>(); - updateWrapper.in(FishDraftData::getId, validIds); - updateWrapper.set(FishDraftData::getStatus, "APPROVED"); - updateWrapper.set(FishDraftData::getApproveTime, now); - updateWrapper.set(FishDraftData::getUpdatedBy, operatorId); - this.update(updateWrapper); + updateByIdsInBatches(validIds, entity -> { + entity.setStatus("APPROVED"); + entity.setApproveTime(now); + entity.setUpdatedBy(operatorId); + }); boolean b = sdFpssRService.saveOrUpdateBatch(fpssRList); log.info("=======================插入数据条数======================="+fpssRList.size()); for (String approvalId : processedApprovalIds) { @@ -548,7 +547,7 @@ public class FishDraftDataServiceImpl extends ServiceImpl dataList = this.listByIds(ids); + List dataList = listByIdsInBatches(ids); Set processedApprovalIds = new HashSet<>(); List validIds = new ArrayList<>(); @@ -562,12 +561,11 @@ public class FishDraftDataServiceImpl extends ServiceImpl updateWrapper = new LambdaUpdateWrapper<>(); - updateWrapper.in(FishDraftData::getId, validIds); - updateWrapper.set(FishDraftData::getStatus, "REJECTED"); - updateWrapper.set(FishDraftData::getApproveTime, now); - updateWrapper.set(FishDraftData::getUpdatedBy, operatorId); - this.update(updateWrapper); + updateByIdsInBatches(validIds, entity -> { + entity.setStatus("REJECTED"); + entity.setApproveTime(now); + entity.setUpdatedBy(operatorId); + }); for (String approvalId : processedApprovalIds) { approvalLogService.logReject(approvalId, operatorId, rejectReason); @@ -679,4 +677,90 @@ public class FishDraftDataServiceImpl extends ServiceImpl listByIdsInBatches(List ids) { + List normalizedIds = normalizeBatchValues(ids); + if (normalizedIds.isEmpty()) { + return new ArrayList<>(); + } + List result = new ArrayList<>(); + for (List batchIds : splitList(normalizedIds, IN_QUERY_BATCH_SIZE)) { + result.addAll(this.list(new LambdaQueryWrapper().in(FishDraftData::getId, batchIds))); + } + return result; + } + + private long countByIdsAndLockFlag(List ids, Integer lockFlag) { + List normalizedIds = normalizeBatchValues(ids); + if (normalizedIds.isEmpty()) { + return 0L; + } + long total = 0L; + for (List batchIds : splitList(normalizedIds, IN_QUERY_BATCH_SIZE)) { + total += this.count(new LambdaQueryWrapper() + .in(FishDraftData::getId, batchIds) + .eq(FishDraftData::getLockFlag, lockFlag)); + } + return total; + } + + private List listIdsByLockFlag(List ids, Integer lockFlag) { + List normalizedIds = normalizeBatchValues(ids); + if (normalizedIds.isEmpty()) { + return Collections.emptyList(); + } + List result = new ArrayList<>(); + for (List batchIds : splitList(normalizedIds, IN_QUERY_BATCH_SIZE)) { + List records = this.list(new LambdaQueryWrapper() + .select(FishDraftData::getId) + .in(FishDraftData::getId, batchIds) + .eq(FishDraftData::getLockFlag, lockFlag)); + result.addAll(records.stream().map(FishDraftData::getId).filter(StrUtil::isNotBlank).toList()); + } + return result; + } + + private boolean updateByIdsInBatches(List ids, + java.util.function.Consumer entityCustomizer) { + List normalizedIds = normalizeBatchValues(ids); + if (normalizedIds.isEmpty()) { + return false; + } + boolean updated = false; + for (List batchIds : splitList(normalizedIds, IN_QUERY_BATCH_SIZE)) { + List batchEntities = new ArrayList<>(batchIds.size()); + for (String batchId : batchIds) { + FishDraftData entity = new FishDraftData(); + entity.setId(batchId); + entityCustomizer.accept(entity); + batchEntities.add(entity); + } + updated = this.updateBatchById(batchEntities, IN_QUERY_BATCH_SIZE) || updated; + } + return updated; + } + + private List normalizeBatchValues(List values) { + if (values == null || values.isEmpty()) { + return Collections.emptyList(); + } + LinkedHashSet normalized = new LinkedHashSet<>(); + for (String value : values) { + if (StrUtil.isNotBlank(value)) { + normalized.add(value.trim()); + } + } + return new ArrayList<>(normalized); + } + + private List> splitList(List source, int batchSize) { + if (source == null || source.isEmpty()) { + return Collections.emptyList(); + } + List> result = new ArrayList<>(); + for (int i = 0; i < source.size(); i += batchSize) { + result.add(source.subList(i, Math.min(source.size(), i + batchSize))); + } + return result; + } } From a7e4cd8c0d386911f94be4c1600a086372d3f1d7 Mon Sep 17 00:00:00 2001 From: tangwei Date: Tue, 7 Jul 2026 17:06:34 +0800 Subject: [PATCH 27/27] =?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/FishDraftDataServiceImpl.java | 265 +++++++++++++----- .../src/main/resources/application-devtw.yml | 13 + 2 files changed, 203 insertions(+), 75 deletions(-) diff --git a/backend/src/main/java/com/yfd/platform/qgc_data/service/impl/FishDraftDataServiceImpl.java b/backend/src/main/java/com/yfd/platform/qgc_data/service/impl/FishDraftDataServiceImpl.java index 92fdd607..45c47f12 100644 --- a/backend/src/main/java/com/yfd/platform/qgc_data/service/impl/FishDraftDataServiceImpl.java +++ b/backend/src/main/java/com/yfd/platform/qgc_data/service/impl/FishDraftDataServiceImpl.java @@ -35,6 +35,9 @@ import jakarta.annotation.Resource; import lombok.extern.slf4j.Slf4j; import org.springframework.stereotype.Service; import org.springframework.transaction.annotation.Transactional; +import org.springframework.transaction.TransactionDefinition; +import org.springframework.transaction.PlatformTransactionManager; +import org.springframework.transaction.support.TransactionTemplate; import java.util.*; @@ -86,6 +89,9 @@ public class FishDraftDataServiceImpl extends ServiceImpl queryPageList(DataSourceRequest dataSourceRequest) { Page page = KendoUtil.getPage(dataSourceRequest); @@ -295,12 +301,13 @@ public class FishDraftDataServiceImpl extends ServiceImpl ids) { if (ids == null || ids.isEmpty()) { return false; } String operatorId = SecurityUtils.getUserId(); + Map originalStatusMap = new HashMap<>(); + List succeededIds = new ArrayList<>(); ApprovalMain approvalMain = new ApprovalMain(); approvalMain.setApprovalNo("APR" + System.currentTimeMillis()); @@ -311,19 +318,46 @@ public class FishDraftDataServiceImpl extends ServiceImpl { + approvalMainService.save(approvalMain); + return true; + }); - List unlockedIds = listIdsByLockFlag(ids, 0); - Date submitTime = new Date(); - updateByIdsInBatches(unlockedIds, entity -> { - entity.setApprovalId(approvalMain.getId()); - entity.setStatus("PENDING"); - entity.setSubmitTime(submitTime); - }); + List unlockedDrafts = listDraftsByIdsAndLockFlag(ids, 0); + for (FishDraftData draft : unlockedDrafts) { + originalStatusMap.put(draft.getId(), draft.getStatus()); + } + Date submitTime = new Date(); + for (List batchDrafts : splitList(unlockedDrafts, IN_QUERY_BATCH_SIZE)) { + executeInNewTransaction(() -> { + List batchIds = new ArrayList<>(); + for (FishDraftData batchDraft : batchDrafts) { + batchIds.add(batchDraft.getId()); + } + updateByIdsBatch(batchIds, entity -> { + entity.setApprovalId(approvalMain.getId()); + entity.setStatus("PENDING"); + entity.setSubmitTime(submitTime); + }); + return true; + }); + for (FishDraftData batchDraft : batchDrafts) { + succeededIds.add(batchDraft.getId()); + } + } - approvalLogService.logSubmit(approvalMain.getId(), operatorId, "批量提交草稿,共" + ids.size() + "条"); - return true; + executeInNewTransaction(() -> { + approvalLogService.logSubmit(approvalMain.getId(), operatorId, "批量提交草稿,共" + ids.size() + "条"); + return true; + }); + return true; + } catch (Exception e) { + log.error("批量提交草稿失败", e); + rollbackSubmittedDrafts(approvalMain.getId(), succeededIds, originalStatusMap, e); + return false; + } } private void setUserDataScope(ApprovalMain approvalMain) { @@ -413,7 +447,6 @@ public class FishDraftDataServiceImpl extends ServiceImpl ids, String approveComment) { if (ids == null || ids.isEmpty()) { return false; @@ -422,43 +455,59 @@ public class FishDraftDataServiceImpl extends ServiceImpl dataList = listByIdsInBatches(ids); - Set processedApprovalIds = new HashSet<>(); - List validIds = new ArrayList<>(); - List fpssRList = new ArrayList<>(); - + Map> approvalDraftMap = new LinkedHashMap<>(); for (FishDraftData fishDraftData : dataList) { if ("PENDING".equals(fishDraftData.getStatus())) { - validIds.add(fishDraftData.getId()); - if (fishDraftData.getApprovalId() != null) { - processedApprovalIds.add(fishDraftData.getApprovalId()); - } - SdFpssR fpssR = convertToSdFpssR(fishDraftData, operatorId); - fpssRList.add(fpssR); + String approvalId = StrUtil.blankToDefault(fishDraftData.getApprovalId(), "__NO_APPROVAL__"); + approvalDraftMap.computeIfAbsent(approvalId, key -> new ArrayList<>()).add(fishDraftData); } } - if (!validIds.isEmpty()) { - updateByIdsInBatches(validIds, entity -> { - entity.setStatus("APPROVED"); - entity.setApproveTime(now); - entity.setUpdatedBy(operatorId); - }); - boolean b = sdFpssRService.saveOrUpdateBatch(fpssRList); - log.info("=======================插入数据条数======================="+fpssRList.size()); - for (String approvalId : processedApprovalIds) { - ApprovalMain approvalMain = approvalMainService.getById(approvalId); - approvalLogService.logApprove(approvalId, SecurityUtils.getUserId(), approveComment); - if (approvalMain != null) { - approvalMain.setStatus("APPROVED"); - approvalMain.setApproverId(operatorId); - approvalMain.setApproveTime(now); - approvalMain.setRemark(approveComment); - approvalMainService.updateById(approvalMain); + try { + for (Map.Entry> entry : approvalDraftMap.entrySet()) { + String approvalId = entry.getKey(); + List approvalDrafts = entry.getValue(); + for (List batchDrafts : splitList(approvalDrafts, IN_QUERY_BATCH_SIZE)) { + executeInNewTransaction(() -> { + List batchIds = new ArrayList<>(); + List fpssRList = new ArrayList<>(); + for (FishDraftData batchDraft : batchDrafts) { + batchIds.add(batchDraft.getId()); + fpssRList.add(convertToSdFpssR(batchDraft, operatorId)); + } + updateByIdsBatch(batchIds, entity -> { + entity.setStatus("APPROVED"); + entity.setApproveTime(now); + entity.setUpdatedBy(operatorId); + }); + boolean saved = sdFpssRService.saveOrUpdateBatch(fpssRList, IN_QUERY_BATCH_SIZE); + if (!saved) { + throw new RuntimeException("保存正式表失败"); + } + log.info("=======================插入数据条数======================={}", fpssRList.size()); + return true; + }); + } + if (!"__NO_APPROVAL__".equals(approvalId)) { + executeInNewTransaction(() -> { + ApprovalMain approvalMain = approvalMainService.getById(approvalId); + approvalLogService.logApprove(approvalId, SecurityUtils.getUserId(), approveComment); + if (approvalMain != null) { + approvalMain.setStatus("APPROVED"); + approvalMain.setApproverId(operatorId); + approvalMain.setApproveTime(now); + approvalMain.setRemark(approveComment); + approvalMainService.updateById(approvalMain); + } + return true; + }); } } + return true; + } catch (Exception e) { + log.error("批量审批失败", e); + return false; } - - return true; } private SdFpssR convertToSdFpssR(FishDraftData draft, String operatorId) { @@ -536,7 +585,6 @@ public class FishDraftDataServiceImpl extends ServiceImpl ids, String rejectReason) { if (ids == null || ids.isEmpty()) { return false; @@ -548,39 +596,52 @@ public class FishDraftDataServiceImpl extends ServiceImpl dataList = listByIdsInBatches(ids); - Set processedApprovalIds = new HashSet<>(); - List validIds = new ArrayList<>(); - + Map> approvalDraftMap = new LinkedHashMap<>(); for (FishDraftData fishDraftData : dataList) { if ("PENDING".equals(fishDraftData.getStatus())) { - validIds.add(fishDraftData.getId()); - if (fishDraftData.getApprovalId() != null) { - processedApprovalIds.add(fishDraftData.getApprovalId()); - } + String approvalId = StrUtil.blankToDefault(fishDraftData.getApprovalId(), "__NO_APPROVAL__"); + approvalDraftMap.computeIfAbsent(approvalId, key -> new ArrayList<>()).add(fishDraftData); } } - if (!validIds.isEmpty()) { - updateByIdsInBatches(validIds, entity -> { - entity.setStatus("REJECTED"); - entity.setApproveTime(now); - entity.setUpdatedBy(operatorId); - }); - - for (String approvalId : processedApprovalIds) { - approvalLogService.logReject(approvalId, operatorId, rejectReason); - ApprovalMain approvalMain = approvalMainService.getById(approvalId); - if (approvalMain != null) { - approvalMain.setStatus("REJECTED"); - approvalMain.setApproverId(operatorId); - approvalMain.setApproveTime(now); - approvalMain.setRemark(rejectReason); - approvalMainService.updateById(approvalMain); + try { + for (Map.Entry> entry : approvalDraftMap.entrySet()) { + String approvalId = entry.getKey(); + List approvalDrafts = entry.getValue(); + for (List batchDrafts : splitList(approvalDrafts, IN_QUERY_BATCH_SIZE)) { + executeInNewTransaction(() -> { + List batchIds = new ArrayList<>(); + for (FishDraftData batchDraft : batchDrafts) { + batchIds.add(batchDraft.getId()); + } + updateByIdsBatch(batchIds, entity -> { + entity.setStatus("REJECTED"); + entity.setApproveTime(now); + entity.setUpdatedBy(operatorId); + }); + return true; + }); + } + if (!"__NO_APPROVAL__".equals(approvalId)) { + executeInNewTransaction(() -> { + approvalLogService.logReject(approvalId, operatorId, rejectReason); + ApprovalMain approvalMain = approvalMainService.getById(approvalId); + if (approvalMain != null) { + approvalMain.setStatus("REJECTED"); + approvalMain.setApproverId(operatorId); + approvalMain.setApproveTime(now); + approvalMain.setRemark(rejectReason); + approvalMainService.updateById(approvalMain); + } + return true; + }); } } + return true; + } catch (Exception e) { + log.error("批量驳回失败", e); + return false; } - - return true; } @Override @@ -720,6 +781,36 @@ public class FishDraftDataServiceImpl extends ServiceImpl listDraftsByIdsAndLockFlag(List ids, Integer lockFlag) { + List normalizedIds = normalizeBatchValues(ids); + if (normalizedIds.isEmpty()) { + return Collections.emptyList(); + } + List result = new ArrayList<>(); + for (List batchIds : splitList(normalizedIds, IN_QUERY_BATCH_SIZE)) { + result.addAll(this.list(new LambdaQueryWrapper() + .in(FishDraftData::getId, batchIds) + .eq(FishDraftData::getLockFlag, lockFlag))); + } + return result; + } + + private boolean updateByIdsBatch(List ids, + java.util.function.Consumer entityCustomizer) { + List normalizedIds = normalizeBatchValues(ids); + if (normalizedIds.isEmpty()) { + return false; + } + List batchEntities = new ArrayList<>(normalizedIds.size()); + for (String batchId : normalizedIds) { + FishDraftData entity = new FishDraftData(); + entity.setId(batchId); + entityCustomizer.accept(entity); + batchEntities.add(entity); + } + return this.updateBatchById(batchEntities, IN_QUERY_BATCH_SIZE); + } + private boolean updateByIdsInBatches(List ids, java.util.function.Consumer entityCustomizer) { List normalizedIds = normalizeBatchValues(ids); @@ -728,18 +819,42 @@ public class FishDraftDataServiceImpl extends ServiceImpl batchIds : splitList(normalizedIds, IN_QUERY_BATCH_SIZE)) { - List batchEntities = new ArrayList<>(batchIds.size()); - for (String batchId : batchIds) { - FishDraftData entity = new FishDraftData(); - entity.setId(batchId); - entityCustomizer.accept(entity); - batchEntities.add(entity); - } - updated = this.updateBatchById(batchEntities, IN_QUERY_BATCH_SIZE) || updated; + updated = updateByIdsBatch(batchIds, entityCustomizer) || updated; } return updated; } + private void rollbackSubmittedDrafts(String approvalId, + List succeededIds, + Map originalStatusMap, + Exception originalException) { + try { + for (List batchIds : splitList(normalizeBatchValues(succeededIds), IN_QUERY_BATCH_SIZE)) { + executeInNewTransaction(() -> { + List rollbackEntities = new ArrayList<>(); + for (String batchId : batchIds) { + FishDraftData entity = new FishDraftData(); + entity.setId(batchId); + entity.setApprovalId(null); + entity.setSubmitTime(null); + entity.setStatus(originalStatusMap.get(batchId)); + rollbackEntities.add(entity); + } + return this.updateBatchById(rollbackEntities, IN_QUERY_BATCH_SIZE); + }); + } + executeInNewTransaction(() -> approvalMainService.removeById(approvalId)); + } catch (Exception rollbackException) { + log.error("批量提交草稿回退失败,原始异常: {}", originalException.getMessage(), rollbackException); + } + } + + private T executeInNewTransaction(java.util.function.Supplier action) { + TransactionTemplate transactionTemplate = new TransactionTemplate(transactionManager); + transactionTemplate.setPropagationBehavior(TransactionDefinition.PROPAGATION_REQUIRES_NEW); + return transactionTemplate.execute(status -> action.get()); + } + private List normalizeBatchValues(List values) { if (values == null || values.isEmpty()) { return Collections.emptyList(); diff --git a/backend/src/main/resources/application-devtw.yml b/backend/src/main/resources/application-devtw.yml index 597cd003..609aa2bc 100644 --- a/backend/src/main/resources/application-devtw.yml +++ b/backend/src/main/resources/application-devtw.yml @@ -111,6 +111,19 @@ spring: mvc: pathmatch: matching-strategy: ant_path_matcher + data: + redis: + host: "${REDIS_HOST:172.16.21.142}" + port: "${REDIS_PORT:6379}" + password: "${REDIS_PASSWORD:zny5678}" + database: "${REDIS_DATABASE:15}" + timeout: 10000ms + lettuce: + pool: + max-active: 8 + max-idle: 8 + min-idle: 2 + max-wait: 10000ms servlet: multipart: max-file-size: 300MB