From f0dcf99d28416254efd69d5c331bdaad74707c7a Mon Sep 17 00:00:00 2001 From: tangwei Date: Thu, 11 Jun 2026 08:47:53 +0800 Subject: [PATCH 01/34] =?UTF-8?q?fix:=20=E9=B1=BC=E7=B1=BB=E5=AD=97?= =?UTF-8?q?=E5=85=B8=E7=9B=B8=E4=BC=BC=E5=BA=A6=E6=9F=A5=E8=AF=A2=E4=BC=98?= =?UTF-8?q?=E5=8C=96?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../impl/SdFishDictoryBServiceImpl.java | 399 ++++++++++++++---- 1 file changed, 316 insertions(+), 83 deletions(-) diff --git a/backend/src/main/java/com/yfd/platform/qgc_base/service/impl/SdFishDictoryBServiceImpl.java b/backend/src/main/java/com/yfd/platform/qgc_base/service/impl/SdFishDictoryBServiceImpl.java index 5a635c3a..7544ea93 100644 --- a/backend/src/main/java/com/yfd/platform/qgc_base/service/impl/SdFishDictoryBServiceImpl.java +++ b/backend/src/main/java/com/yfd/platform/qgc_base/service/impl/SdFishDictoryBServiceImpl.java @@ -74,107 +74,231 @@ public class SdFishDictoryBServiceImpl extends ServiceImpl 0) ? limit : 10; - String searchName = name.trim(); - LambdaQueryWrapper wrapper = new LambdaQueryWrapper<>(); - wrapper.eq(SdFishDictoryB::getIsDeleted, 0); - List allFish = list(wrapper); + String rawSearchName = name.trim(); + String searchName = normalizeText(rawSearchName); - SdFishDictoryB exactMatch = allFish.stream() - .filter(f -> f.getName() != null && f.getName().equals(searchName)) - .findFirst() - .orElse(null); - - if (exactMatch != null) { - Map similarityMap = new HashMap<>(); - for (SdFishDictoryB fish : allFish) { - if (fish.getId().equals(exactMatch.getId())) { - continue; - } - int score = calculateSimilarity(exactMatch, fish); - if (score > 0) { - similarityMap.put(fish, score); - } - } - - List result = similarityMap.entrySet().stream() - .sorted(Map.Entry.comparingByValue().reversed()) - .limit(resultLimit) - .map(Map.Entry::getKey) - .collect(Collectors.toList()); - - result.add(0, exactMatch); - return result; + List candidateFish = querySimilarFishCandidates(rawSearchName, searchName, resultLimit); + if (candidateFish.isEmpty()) { + return Collections.emptyList(); } - List containsMatches = allFish.stream() - .filter(f -> f.getName() != null && f.getName().contains(searchName)) + Map searchScoreMap = new HashMap<>(); + for (SdFishDictoryB fish : candidateFish) { + if (fish == null || !StringUtils.hasText(fish.getId())) { + continue; + } + int score = calculateSearchScore(searchName, fish); + if (score > 0) { + searchScoreMap.put(fish.getId(), score); + } + } + + if (searchScoreMap.isEmpty()) { + return Collections.emptyList(); + } + + SdFishDictoryB referenceFish = candidateFish.stream() + .filter(fish -> fish != null && searchScoreMap.containsKey(fish.getId())) + .max((f1, f2) -> { + int scoreCompare = Integer.compare(searchScoreMap.get(f1.getId()), searchScoreMap.get(f2.getId())); + if (scoreCompare != 0) { + return scoreCompare; + } + Integer order1 = f1.getOrderIndex() == null ? 0 : f1.getOrderIndex(); + Integer order2 = f2.getOrderIndex() == null ? 0 : f2.getOrderIndex(); + int orderCompare = Integer.compare(order1, order2); + if (orderCompare != 0) { + return orderCompare; + } + return safeText(f2.getName()).compareTo(safeText(f1.getName())); + }) + .orElse(null); + + if (referenceFish == null) { + return Collections.emptyList(); + } + + return candidateFish.stream() + .filter(fish -> fish != null && StringUtils.hasText(fish.getId())) + .map(fish -> new AbstractMap.SimpleEntry<>(fish, buildFinalScore(referenceFish, fish, searchScoreMap.getOrDefault(fish.getId(), 0)))) + .filter(entry -> entry.getValue() > 0) + .sorted((e1, e2) -> { + int scoreCompare = Integer.compare(e2.getValue(), e1.getValue()); + if (scoreCompare != 0) { + return scoreCompare; + } + Integer order1 = e1.getKey().getOrderIndex() == null ? 0 : e1.getKey().getOrderIndex(); + Integer order2 = e2.getKey().getOrderIndex() == null ? 0 : e2.getKey().getOrderIndex(); + int orderCompare = Integer.compare(order2, order1); + if (orderCompare != 0) { + return orderCompare; + } + return safeText(e1.getKey().getName()).compareTo(safeText(e2.getKey().getName())); + }) + .limit(resultLimit) + .map(Map.Entry::getKey) .collect(Collectors.toList()); + } - if (!containsMatches.isEmpty()) { - List result = containsMatches.stream() - .sorted((f1, f2) -> { - int len1 = f1.getName().length(); - int len2 = f2.getName().length(); - if (len1 != len2) { - return Integer.compare(len1, len2); - } - return f1.getName().compareTo(f2.getName()); - }) - .limit(resultLimit) - .collect(Collectors.toList()); - return result; + private List querySimilarFishCandidates(String rawSearchName, String normalizedSearchName, int resultLimit) { + int candidateLimit = Math.min(Math.max(resultLimit * 30, 120), 500); + LinkedHashMap candidateMap = new LinkedHashMap<>(); + + mergeCandidates(candidateMap, queryExactCandidates(rawSearchName, normalizedSearchName, candidateLimit)); + if (candidateMap.size() < candidateLimit) { + mergeCandidates(candidateMap, queryContainsCandidates(rawSearchName, normalizedSearchName, candidateLimit)); + } + if (candidateMap.size() < candidateLimit) { + mergeCandidates(candidateMap, queryTokenCandidates(normalizedSearchName, candidateLimit)); } - SdFishDictoryB partialMatch = allFish.stream() - .filter(f -> f.getName() != null && (searchName.contains(f.getName()) || f.getName().contains(searchName))) - .findFirst() - .orElse(null); + return new ArrayList<>(candidateMap.values()); + } - if (partialMatch != null) { - Map similarityMap = new HashMap<>(); - for (SdFishDictoryB fish : allFish) { - if (fish.getId().equals(partialMatch.getId())) { - continue; - } - int score = calculateSimilarity(partialMatch, fish); - if (score > 0) { - similarityMap.put(fish, score); - } + private void mergeCandidates(Map candidateMap, List candidates) { + if (candidates == null || candidates.isEmpty()) { + return; + } + for (SdFishDictoryB fish : candidates) { + if (fish == null || !StringUtils.hasText(fish.getId())) { + continue; } - - List result = similarityMap.entrySet().stream() - .sorted(Map.Entry.comparingByValue().reversed()) - .limit(resultLimit) - .map(Map.Entry::getKey) - .collect(Collectors.toList()); - - result.add(0, partialMatch); - return result; + candidateMap.putIfAbsent(fish.getId(), fish); } + } - return Collections.emptyList(); + private List queryExactCandidates(String rawSearchName, String normalizedSearchName, int limit) { + if (!StringUtils.hasText(rawSearchName)) { + return Collections.emptyList(); + } + LambdaQueryWrapper wrapper = buildCandidateSelectWrapper(); + wrapper.and(w -> w + .eq(SdFishDictoryB::getName, rawSearchName) + .or().eq(SdFishDictoryB::getAlias, rawSearchName) + .or().eq(SdFishDictoryB::getNameEn, rawSearchName) + .or().eq(SdFishDictoryB::getSpecies, rawSearchName) + .or().eq(SdFishDictoryB::getGenus, rawSearchName) + .or().eq(SdFishDictoryB::getFamily, rawSearchName) + .or().eq(SdFishDictoryB::getOrders, rawSearchName) + .or().apply("LOWER(NAME) = {0}", normalizedSearchName) + .or().apply("LOWER(ALIAS) = {0}", normalizedSearchName) + .or().apply("LOWER(NAME_EN) = {0}", normalizedSearchName) + .or().apply("LOWER(SPECIES) = {0}", normalizedSearchName) + .or().apply("LOWER(GENUS) = {0}", normalizedSearchName) + .or().apply("LOWER(FAMILY) = {0}", normalizedSearchName) + .or().apply("LOWER(ORDERS) = {0}", normalizedSearchName)); + wrapper.orderByDesc(SdFishDictoryB::getOrderIndex); + return page(new Page<>(1, limit), wrapper).getRecords(); + } + + private List queryContainsCandidates(String rawSearchName, String normalizedSearchName, int limit) { + if (!StringUtils.hasText(rawSearchName)) { + return Collections.emptyList(); + } + String likeValue = "%" + rawSearchName + "%"; + String normalizedLikeValue = "%" + normalizedSearchName + "%"; + LambdaQueryWrapper wrapper = buildCandidateSelectWrapper(); + wrapper.and(w -> w + .like(SdFishDictoryB::getName, rawSearchName) + .or().like(SdFishDictoryB::getAlias, rawSearchName) + .or().like(SdFishDictoryB::getNameEn, rawSearchName) + .or().like(SdFishDictoryB::getSpecies, rawSearchName) + .or().like(SdFishDictoryB::getGenus, rawSearchName) + .or().like(SdFishDictoryB::getFamily, rawSearchName) + .or().like(SdFishDictoryB::getOrders, rawSearchName) + .or().like(SdFishDictoryB::getIntroduce, rawSearchName) + .or().apply("LOWER(NAME) LIKE {0}", normalizedLikeValue) + .or().apply("LOWER(ALIAS) LIKE {0}", normalizedLikeValue) + .or().apply("LOWER(NAME_EN) LIKE {0}", normalizedLikeValue) + .or().apply("LOWER(SPECIES) LIKE {0}", normalizedLikeValue) + .or().apply("LOWER(GENUS) LIKE {0}", normalizedLikeValue) + .or().apply("LOWER(FAMILY) LIKE {0}", normalizedLikeValue) + .or().apply("LOWER(ORDERS) LIKE {0}", normalizedLikeValue) + .or().apply("LOWER(INTRODUCE) LIKE {0}", normalizedLikeValue)); + wrapper.orderByDesc(SdFishDictoryB::getOrderIndex); + return page(new Page<>(1, limit), wrapper).getRecords(); + } + + private List queryTokenCandidates(String normalizedSearchName, int limit) { + Set tokens = splitTokens(normalizedSearchName).stream() + .filter(StringUtils::hasText) + .filter(token -> token.length() >= 2) + .limit(5) + .collect(Collectors.toCollection(LinkedHashSet::new)); + if (tokens.isEmpty()) { + return Collections.emptyList(); + } + LambdaQueryWrapper wrapper = buildCandidateSelectWrapper(); + wrapper.and(w -> { + boolean first = true; + for (String token : tokens) { + String likeValue = "%" + token + "%"; + if (!first) { + w.or(); + } + w.apply("LOWER(NAME) LIKE {0}", likeValue) + .or().apply("LOWER(ALIAS) LIKE {0}", likeValue) + .or().apply("LOWER(NAME_EN) LIKE {0}", likeValue) + .or().apply("LOWER(SPECIES) LIKE {0}", likeValue) + .or().apply("LOWER(GENUS) LIKE {0}", likeValue) + .or().apply("LOWER(FAMILY) LIKE {0}", likeValue) + .or().apply("LOWER(ORDERS) LIKE {0}", likeValue) + .or().apply("LOWER(INTRODUCE) LIKE {0}", likeValue); + first = false; + } + }); + wrapper.orderByDesc(SdFishDictoryB::getOrderIndex); + return page(new Page<>(1, limit), wrapper).getRecords(); + } + + private LambdaQueryWrapper buildCandidateSelectWrapper() { + LambdaQueryWrapper wrapper = new LambdaQueryWrapper<>(); + wrapper.select( + SdFishDictoryB::getId, + SdFishDictoryB::getCode, + SdFishDictoryB::getName, + SdFishDictoryB::getNameEn, + SdFishDictoryB::getAlias, + SdFishDictoryB::getIntroduce, + SdFishDictoryB::getOrders, + SdFishDictoryB::getFamily, + SdFishDictoryB::getGenus, + SdFishDictoryB::getSpecies, + SdFishDictoryB::getType, + SdFishDictoryB::getHabitat, + SdFishDictoryB::getHabitMigrat, + SdFishDictoryB::getFeedingHabit, + SdFishDictoryB::getSpawnCharact, + SdFishDictoryB::getPtype, + SdFishDictoryB::getResourceType, + SdFishDictoryB::getRare, + SdFishDictoryB::getOrderIndex, + SdFishDictoryB::getIsDeleted + ); + wrapper.eq(SdFishDictoryB::getIsDeleted, 0); + return wrapper; } private int calculateSimilarity(SdFishDictoryB ref, SdFishDictoryB target) { int score = 0; - if (ref.getGenus() != null && ref.getGenus().equals(target.getGenus()) && !ref.getGenus().isEmpty()) { - score += 25; + if (ref == null || target == null) { + return 0; + } + if (StringUtils.hasText(ref.getId()) && ref.getId().equals(target.getId())) { + return 5000; } - if (ref.getSpecies() != null && ref.getSpecies().equals(target.getSpecies()) && !ref.getSpecies().isEmpty()) { - score += 20; - } + score += calculateFieldSimilarity(ref.getName(), target.getName(), 45); + score += calculateFieldSimilarity(ref.getNameEn(), target.getNameEn(), 22); + score += calculateFieldSimilarity(ref.getAlias(), target.getAlias(), 26); + score += calculateFieldSimilarity(ref.getSpecies(), target.getSpecies(), 30); + score += calculateFieldSimilarity(ref.getGenus(), target.getGenus(), 24); + score += calculateFieldSimilarity(ref.getFamily(), target.getFamily(), 18); + score += calculateFieldSimilarity(ref.getOrders(), target.getOrders(), 14); + score += calculateFieldSimilarity(ref.getIntroduce(), target.getIntroduce(), 8); - if (ref.getFamily() != null && ref.getFamily().equals(target.getFamily()) && !ref.getFamily().isEmpty()) { - score += 15; - } - - if (ref.getOrders() != null && ref.getOrders().equals(target.getOrders()) && !ref.getOrders().isEmpty()) { - score += 10; - } - - if (ref.getType() != null && ref.getType().equals(target.getType()) && !ObjectUtil.isEmpty(ref.getType()) ) { + if (ref.getType() != null && ref.getType().equals(target.getType()) && !ObjectUtil.isEmpty(ref.getType())) { score += 5; } @@ -208,4 +332,113 @@ public class SdFishDictoryBServiceImpl extends ServiceImpl 0 && normalizedSearch.contains(normalizedCandidate) && normalizedCandidate.length() >= 2) { + return reverseContainsScore; + } + return calculateTextOverlapScore(normalizedSearch, normalizedCandidate, overlapMaxScore); + } + + private int calculateFieldSimilarity(String left, String right, int exactScore) { + String normalizedLeft = normalizeText(left); + String normalizedRight = normalizeText(right); + if (!StringUtils.hasText(normalizedLeft) || !StringUtils.hasText(normalizedRight)) { + return 0; + } + if (normalizedLeft.equals(normalizedRight)) { + return exactScore; + } + if (normalizedLeft.contains(normalizedRight) || normalizedRight.contains(normalizedLeft)) { + return Math.max(1, exactScore / 2); + } + return calculateTextOverlapScore(normalizedLeft, normalizedRight, Math.max(1, exactScore / 3)); + } + + private int calculateTextOverlapScore(String left, String right, int maxScore) { + if (!StringUtils.hasText(left) || !StringUtils.hasText(right) || maxScore <= 0) { + return 0; + } + Set leftTokens = splitTokens(left); + Set rightTokens = splitTokens(right); + if (leftTokens.isEmpty() || rightTokens.isEmpty()) { + return 0; + } + long commonCount = leftTokens.stream().filter(rightTokens::contains).count(); + if (commonCount <= 0) { + return 0; + } + int base = Math.min(leftTokens.size(), rightTokens.size()); + if (base <= 0) { + return 0; + } + return (int) Math.min(maxScore, Math.round((double) commonCount * maxScore / base)); + } + + private Set splitTokens(String text) { + String normalized = normalizeText(text); + if (!StringUtils.hasText(normalized)) { + return Collections.emptySet(); + } + Set tokens = new LinkedHashSet<>(); + String[] parts = normalized.split("[\\s,,;;、/\\\\()()]+"); + for (String part : parts) { + if (StringUtils.hasText(part)) { + tokens.add(part); + } + } + if (tokens.isEmpty()) { + for (int i = 0; i < normalized.length(); i++) { + char ch = normalized.charAt(i); + if (!Character.isWhitespace(ch)) { + tokens.add(String.valueOf(ch)); + } + } + } + return tokens; + } + + private String normalizeText(String text) { + if (!StringUtils.hasText(text)) { + return ""; + } + return text.trim().toLowerCase(Locale.ROOT); + } + + private String safeText(String text) { + return text == null ? "" : text; + } +} From dda9e145aeae6bdffad97af18a4dffd8f55803c1 Mon Sep 17 00:00:00 2001 From: tangwei Date: Thu, 11 Jun 2026 10:38:58 +0800 Subject: [PATCH 02/34] =?UTF-8?q?feat:=20=E5=85=A8=E8=BF=87=E7=A8=8B?= =?UTF-8?q?=E8=BF=87=E9=B1=BC=E4=BA=BA=E5=B7=A5=E7=9B=91=E6=B5=8B=E6=95=B0?= =?UTF-8?q?=E6=8D=AE=E6=9F=A5=E8=AF=A2=E4=BC=98=E5=8C=96&=E6=9F=A5?= =?UTF-8?q?=E8=AF=A2=E8=BF=87=E9=B1=BC=E8=AE=BE=E6=96=BD=E6=8C=87=E5=AE=9A?= =?UTF-8?q?=E5=B9=B4=E4=BB=BD=E9=B1=BC=E7=B1=BB=E4=B8=8B=E6=8B=89=E9=80=89?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../fp/controller/FishPassageController.java | 6 ++ .../qgc_env/fp/entity/vo/FpFishSelectVo.java | 11 +++ .../qgc_env/fp/entity/vo/FpSdfpssrVo.java | 6 ++ .../qgc_env/fp/service/FpRunService.java | 3 + .../fp/service/impl/FpRunServiceImpl.java | 72 ++++++++++++++++++- 5 files changed, 97 insertions(+), 1 deletion(-) create mode 100644 backend/src/main/java/com/yfd/platform/qgc_env/fp/entity/vo/FpFishSelectVo.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 30979d90..8affd4ac 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 @@ -46,6 +46,12 @@ public class FishPassageController { return ResponseResult.successData(fpRunService.processQgcFpssTableKendoList(dataSourceRequest)); } + @PostMapping("/run/fish/select") + @Operation(summary = "查询过鱼设施指定年份鱼类下拉选") + public ResponseResult getFishSelect(@RequestBody DataSourceRequest dataSourceRequest) { + return ResponseResult.successData(fpRunService.getFishSelect(dataSourceRequest)); + } + @PostMapping("/build/GetKendoListCust") @Operation(summary = "过鱼设施建设及接入情况统计") public ResponseResult getKendoListCust(@RequestBody DataSourceRequest dataSourceRequest) { diff --git a/backend/src/main/java/com/yfd/platform/qgc_env/fp/entity/vo/FpFishSelectVo.java b/backend/src/main/java/com/yfd/platform/qgc_env/fp/entity/vo/FpFishSelectVo.java new file mode 100644 index 00000000..37b97528 --- /dev/null +++ b/backend/src/main/java/com/yfd/platform/qgc_env/fp/entity/vo/FpFishSelectVo.java @@ -0,0 +1,11 @@ +package com.yfd.platform.qgc_env.fp.entity.vo; + +import lombok.Data; + +@Data +public class FpFishSelectVo { + + private String id; + + private String name; +} diff --git a/backend/src/main/java/com/yfd/platform/qgc_env/fp/entity/vo/FpSdfpssrVo.java b/backend/src/main/java/com/yfd/platform/qgc_env/fp/entity/vo/FpSdfpssrVo.java index 19e357fc..7c5fcbdc 100644 --- a/backend/src/main/java/com/yfd/platform/qgc_env/fp/entity/vo/FpSdfpssrVo.java +++ b/backend/src/main/java/com/yfd/platform/qgc_env/fp/entity/vo/FpSdfpssrVo.java @@ -63,6 +63,12 @@ public class FpSdfpssrVo { @Schema(description = "附件ID") private String fid; + @Schema(description = "视频") + private String vdpth; + + @Schema(description = "图片") + private String picpth; + @Schema(description = "游向") private Integer direction; diff --git a/backend/src/main/java/com/yfd/platform/qgc_env/fp/service/FpRunService.java b/backend/src/main/java/com/yfd/platform/qgc_env/fp/service/FpRunService.java index 48c3ce8b..5d51d2ba 100644 --- a/backend/src/main/java/com/yfd/platform/qgc_env/fp/service/FpRunService.java +++ b/backend/src/main/java/com/yfd/platform/qgc_env/fp/service/FpRunService.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.FpFishSelectVo; import com.yfd.platform.qgc_env.fp.entity.vo.FpSdfpssrVo; import com.yfd.platform.qgc_env.fp.entity.vo.FpTableVo; import com.yfd.platform.qgc_env.fp.entity.vo.YearFpStatisticsVo; @@ -17,5 +18,7 @@ public interface FpRunService { DataSourceResult processQgcFpssTableKendoList(DataSourceRequest dataSourceRequest); + DataSourceResult getFishSelect(DataSourceRequest dataSourceRequest); + List getYearFpStatic(String year); } 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 00b1c6e1..ec4b7376 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 @@ -13,6 +13,7 @@ import com.yfd.platform.common.GroupHelper; import com.yfd.platform.common.GroupingInfo; import com.yfd.platform.common.MicroservicDynamicSQLMapper; import com.yfd.platform.common.exception.BizException; +import com.yfd.platform.qgc_env.fp.entity.vo.FpFishSelectVo; import com.yfd.platform.qgc_env.fp.entity.vo.FpFtpStatisticsVo; import com.yfd.platform.qgc_env.fp.entity.vo.FpRunPlanVo; import com.yfd.platform.qgc_env.fp.entity.vo.FpSdfpssrVo; @@ -128,6 +129,39 @@ public class FpRunServiceImpl implements FpRunService { return queryQgcFpssTableGroupList(dataSourceRequest, loadOptions, stcd); } + @Override + public DataSourceResult getFishSelect(DataSourceRequest dataSourceRequest) { + DataSourceLoadOptionsBase loadOptions = dataSourceRequest == null ? null : dataSourceRequest.toDevRequest(); + String stcd = loadOptions == null ? null : QgcQueryWrapperUtil.getFilterFieldValue(loadOptions, "stcd"); + if (StrUtil.isBlank(stcd)) { + throw new BizException("过鱼设施(stcd)编码不能为空."); + } + String tm = loadOptions == null ? null : QgcQueryWrapperUtil.getFilterFieldValue(loadOptions, "tm"); + if (StrUtil.isBlank(tm) || !tm.contains(",")) { + throw new BizException("时间范围(tm)不能为空,格式应为开始时间,结束时间."); + } + String[] tmArr = tm.split(","); + if (tmArr.length < 2 || StrUtil.isBlank(tmArr[0]) || StrUtil.isBlank(tmArr[1])) { + throw new BizException("时间范围(tm)格式错误."); + } + + Map paramMap = new HashMap<>(); + paramMap.put("stcd", StrUtil.trim(stcd)); + paramMap.put("tmStart", StrUtil.trim(tmArr[0])); + paramMap.put("tmEnd", StrUtil.trim(tmArr[1])); + + List list = microservicDynamicSQLMapper.getAllListWithResultType( + buildFpFishSelectSql(), + paramMap, + FpFishSelectVo.class + ); + DataSourceResult result = new DataSourceResult<>(); + result.setData(list); + result.setTotal(list == null ? 0L : list.size()); + result.setAggregates(new HashMap<>()); + return result; + } + @Override public List getYearFpStatic(String year) { Map paramMap = new HashMap<>(); @@ -737,7 +771,9 @@ public class FpRunServiceImpl implements FpRunService { "t.FTP AS fishId, " + "t.FCNT AS fcnt, " + "t.FSZ AS fsz, " + - "t.FID AS fid, " + + "NULL AS fid, " + + "t.PICPTH AS picpth, " + + "t.VDPTH AS vdpth, " + "t.DIRECTION AS direction, " + "1 AS mway, " + "t.STRDT AS strdt, " + @@ -790,6 +826,8 @@ public class FpRunServiceImpl implements FpRunService { selectMap.put("fcnt", "t.fcnt AS fcnt"); selectMap.put("fsz", "t.fsz AS fsz"); selectMap.put("fid", "t.fid AS fid"); + selectMap.put("picpth", "t.picpth AS picpth"); + selectMap.put("vdpth", "t.vdpth AS vdpth"); selectMap.put("direction", "t.direction AS direction"); selectMap.put("mway", "t.mway AS mway"); selectMap.put("strdt", "t.strdt AS strdt"); @@ -1141,6 +1179,38 @@ public class FpRunServiceImpl implements FpRunService { "ORDER BY eng.BASE_ID, a.FTP"; } + private String buildFpFishSelectSql() { + return "SELECT DISTINCT t.ID AS id, t.NAME AS name " + + "FROM ( " + + " SELECT a.FTP AS ID, " + + " COALESCE(fishRv.NAME, relRv.FISH_NAME, fishZy.NAME, relZy.FISH_NAME, fishDirect.NAME) AS NAME " + + " FROM SD_FPSS_R a " + + " INNER JOIN SD_FPSS_B_H fp ON fp.STCD = a.STCD " + + " LEFT JOIN SD_ENGINFO_B_H eng ON eng.STCD = fp.RSTCD AND NVL(eng.IS_DELETED, 0) = 0 " + + " LEFT JOIN SD_FISHDICTORY_RLTN_B relRv ON relRv.FISH_ID = a.FTP " + + " AND relRv.RVCD = eng.HBRVCD " + + " AND NVL(relRv.IS_DELETED, 0) = 0 " + + " LEFT JOIN SD_FISHDICTORY_B fishRv ON fishRv.ID = NVL(relRv.ZY_FISH_ID, relRv.FISH_ID) " + + " AND NVL(fishRv.IS_DELETED, 0) = 0 " + + " AND NVL(fishRv.ENABLE, 1) = 1 " + + " LEFT JOIN SD_FISHDICTORY_RLTN_B relZy ON relZy.FISH_ID = a.FTP " + + " AND relZy.RVCD = 'ZY' " + + " AND NVL(relZy.IS_DELETED, 0) = 0 " + + " LEFT JOIN SD_FISHDICTORY_B fishZy ON fishZy.ID = NVL(relZy.ZY_FISH_ID, relZy.FISH_ID) " + + " AND NVL(fishZy.IS_DELETED, 0) = 0 " + + " AND NVL(fishZy.ENABLE, 1) = 1 " + + " LEFT JOIN SD_FISHDICTORY_B fishDirect ON fishDirect.ID = a.FTP " + + " AND NVL(fishDirect.IS_DELETED, 0) = 0 " + + " AND NVL(fishDirect.ENABLE, 1) = 1 " + + " WHERE NVL(a.IS_DELETED, 0) = 0 " + + " AND a.STCD = #{map.stcd} " + + " AND a.STRDT >= TO_DATE(#{map.tmStart}, 'YYYY-MM-DD HH24:MI:SS') " + + " AND a.STRDT <= TO_DATE(#{map.tmEnd}, 'YYYY-MM-DD HH24:MI:SS') " + + ") t " + + "WHERE t.NAME IS NOT NULL " + + "ORDER BY t.NAME"; + } + private String resolveFallbackFishText(String fallbackFishJson, String fallbackFishText) { if (StrUtil.isNotBlank(fallbackFishJson)) { Set fishNames = new LinkedHashSet<>(); From 1ea183c607e873c173055c71902109311f7a98a6 Mon Sep 17 00:00:00 2001 From: tangwei Date: Thu, 11 Jun 2026 12:57:30 +0800 Subject: [PATCH 03/34] =?UTF-8?q?fix:=20=E4=BC=98=E5=8C=96=E8=BF=87?= =?UTF-8?q?=E9=B1=BC=E8=BF=90=E8=A1=8C=E7=9B=91=E6=B5=8B=E6=95=B0=E6=8D=AE?= =?UTF-8?q?=E6=9F=A5=E8=AF=A2?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../qgc_env/fp/entity/vo/FpSdfpssrVo.java | 3 + .../qgc_env/fp/entity/vo/FpTableVo.java | 6 ++ .../fp/service/impl/FpRunServiceImpl.java | 78 +++++++++++-------- 3 files changed, 53 insertions(+), 34 deletions(-) diff --git a/backend/src/main/java/com/yfd/platform/qgc_env/fp/entity/vo/FpSdfpssrVo.java b/backend/src/main/java/com/yfd/platform/qgc_env/fp/entity/vo/FpSdfpssrVo.java index 7c5fcbdc..64fada9b 100644 --- a/backend/src/main/java/com/yfd/platform/qgc_env/fp/entity/vo/FpSdfpssrVo.java +++ b/backend/src/main/java/com/yfd/platform/qgc_env/fp/entity/vo/FpSdfpssrVo.java @@ -72,6 +72,9 @@ public class FpSdfpssrVo { @Schema(description = "游向") private Integer direction; + @Schema(description = "游向") + private Integer directionName; + @Schema(description = "监测方式") private Integer mway; diff --git a/backend/src/main/java/com/yfd/platform/qgc_env/fp/entity/vo/FpTableVo.java b/backend/src/main/java/com/yfd/platform/qgc_env/fp/entity/vo/FpTableVo.java index e336bf1b..b6f4978a 100644 --- a/backend/src/main/java/com/yfd/platform/qgc_env/fp/entity/vo/FpTableVo.java +++ b/backend/src/main/java/com/yfd/platform/qgc_env/fp/entity/vo/FpTableVo.java @@ -75,4 +75,10 @@ public class FpTableVo { @Schema(description = "监测方式:1=人工 2=自动(预留)") private Integer mway; + +// @Schema(description = "视频") +// private String vdpth; +// +// @Schema(description = "图片") +// private String picpth; } 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 ec4b7376..68e0e443 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 @@ -63,8 +63,8 @@ public class FpRunServiceImpl implements FpRunService { Map paramMap = new HashMap<>(); paramMap.put("stcd", stcd); paramMap.put("yr", yr); - - Map row = microservicDynamicSQLMapper.getOneBySql(buildQgcSecondPlanSql(), paramMap); + String sql = buildQgcSecondPlanSql(); + Map row = microservicDynamicSQLMapper.getOneBySql(sql, paramMap); FpRunPlanVo vo = row == null || row.isEmpty() ? new FpRunPlanVo() : BeanUtil.fillBeanWithMap( @@ -372,49 +372,55 @@ public class FpRunServiceImpl implements FpRunService { " CAST(NULL AS VARCHAR2(255)) AS FIRSTIMGURL, " + " CAST(NULL AS VARCHAR2(255)) AS VIDEOURL, " + " t.FWET AS FWET, " + - " t.FID AS FID, " + - " CASE WHEN t.AI_STCD IS NULL THEN '人工填报' ELSE aiFp.STNM END AS DATASRC, " + + " NULL AS FID, " + + "t.PICPTH AS picpth, " + + "t.VDPTH AS vdpth, " + + " '人工填报' AS DATASRC, " + +// " CASE WHEN t.AI_STCD IS NULL THEN '人工填报' ELSE aiFp.STNM END AS DATASRC, " + " 1 AS MWAY, " + " t.STRDT AS STRDT, " + " t.ENDDT AS ENDDT " + " FROM SD_FPSS_R t " + " LEFT JOIN SD_FPSS_B_H fp ON fp.STCD = t.STCD " + - " LEFT JOIN SD_FPSS_B_H aiFp ON aiFp.STCD = t.AI_STCD " + +// " LEFT JOIN SD_FPSS_B_H aiFp ON aiFp.STCD = t.AI_STCD " + " LEFT JOIN SD_ENGINFO_B_H eng ON eng.STCD = fp.RSTCD AND NVL(eng.IS_DELETED, 0) = 0 " + " LEFT JOIN SD_FISHDICTORY_RLTN_B relRv ON relRv.FISH_ID = t.FTP AND relRv.RVCD = eng.HBRVCD AND NVL(relRv.IS_DELETED, 0) = 0 " + " LEFT JOIN SD_FISHDICTORY_B fishRv ON fishRv.ID = relRv.ZY_FISH_ID AND NVL(fishRv.IS_DELETED, 0) = 0 AND NVL(fishRv.ENABLE, 1) = 1 " + " LEFT JOIN SD_FISHDICTORY_RLTN_B relZy ON relZy.FISH_ID = t.FTP AND relZy.RVCD = 'ZY' AND NVL(relZy.IS_DELETED, 0) = 0 " + " LEFT JOIN SD_FISHDICTORY_B fishZy ON fishZy.ID = relZy.ZY_FISH_ID AND NVL(fishZy.IS_DELETED, 0) = 0 AND NVL(fishZy.ENABLE, 1) = 1 " + " LEFT JOIN SD_FISHDICTORY_B fishDirect ON fishDirect.ID = t.FTP AND NVL(fishDirect.IS_DELETED, 0) = 0 AND NVL(fishDirect.ENABLE, 1) = 1 " + - " WHERE (t.TASK_STATUS = 'Approved' OR t.TASK_STATUS IS NULL) " + - " AND NVL(t.IS_DELETED, 0) = 0 " + - " UNION ALL " + - " SELECT CAST(NULL AS VARCHAR2(36)) AS STCD, " + - " CAST(NULL AS VARCHAR2(64)) AS STNM, " + - " CAST(NULL AS VARCHAR2(19)) AS TM, " + - " CAST(NULL AS VARCHAR2(255)) AS FTP, " + - " CAST(NULL AS VARCHAR2(200)) AS FISHID, " + - " CAST(NULL AS VARCHAR2(256)) AS FSZ, " + - " CAST(NULL AS VARCHAR2(4)) AS YR, " + - " CAST(NULL AS VARCHAR2(20)) AS FCNT, " + - " CAST(NULL AS VARCHAR2(50)) AS LENGTH, " + - " CAST(NULL AS VARCHAR2(50)) AS WIDTH, " + - " CAST(NULL AS VARCHAR2(50)) AS FISHSPEED, " + - " CAST(NULL AS VARCHAR2(10)) AS DIRECTION, " + - " CAST(NULL AS VARCHAR2(20)) AS DIRECTIONNAME, " + - " CAST(NULL AS NUMBER(18,0)) AS UPFCNT, " + - " CAST(NULL AS NUMBER(18,0)) AS DOWNFCNT, " + - " CAST(NULL AS VARCHAR2(50)) AS TEMPERATURE, " + - " CAST(NULL AS VARCHAR2(50)) AS SPEED, " + - " CAST(NULL AS VARCHAR2(255)) AS FIRSTIMGURL, " + - " CAST(NULL AS VARCHAR2(255)) AS VIDEOURL, " + - " CAST(NULL AS VARCHAR2(50)) AS FWET, " + - " CAST(NULL AS VARCHAR2(1000)) AS FID, " + - " CAST(NULL AS VARCHAR2(64)) AS DATASRC, " + - " 2 AS MWAY, " + - " CAST(NULL AS TIMESTAMP) AS STRDT, " + - " CAST(NULL AS TIMESTAMP) AS ENDDT " + - " FROM DUAL WHERE 1 = 0 " + + " WHERE " + +// "(t.TASK_STATUS = 'Approved' OR t.TASK_STATUS IS NULL) AND "+ + " NVL(t.IS_DELETED, 0) = 0 " + +// " UNION ALL " + +// " SELECT CAST(NULL AS VARCHAR2(36)) AS STCD, " + +// " CAST(NULL AS VARCHAR2(64)) AS STNM, " + +// " CAST(NULL AS VARCHAR2(19)) AS TM, " + +// " CAST(NULL AS VARCHAR2(255)) AS FTP, " + +// " CAST(NULL AS VARCHAR2(200)) AS FISHID, " + +// " CAST(NULL AS VARCHAR2(256)) AS FSZ, " + +// " CAST(NULL AS VARCHAR2(4)) AS YR, " + +// " CAST(NULL AS VARCHAR2(20)) AS FCNT, " + +// " CAST(NULL AS VARCHAR2(50)) AS LENGTH, " + +// " CAST(NULL AS VARCHAR2(50)) AS WIDTH, " + +// " CAST(NULL AS VARCHAR2(50)) AS FISHSPEED, " + +// " CAST(NULL AS VARCHAR2(10)) AS DIRECTION, " + +// " CAST(NULL AS VARCHAR2(20)) AS DIRECTIONNAME, " + +// " CAST(NULL AS NUMBER(18,0)) AS UPFCNT, " + +// " CAST(NULL AS NUMBER(18,0)) AS DOWNFCNT, " + +// " CAST(NULL AS VARCHAR2(50)) AS TEMPERATURE, " + +// " CAST(NULL AS VARCHAR2(50)) AS SPEED, " + +// " CAST(NULL AS VARCHAR2(255)) AS FIRSTIMGURL, " + +// " CAST(NULL AS VARCHAR2(255)) AS VIDEOURL, " + +// " CAST(NULL AS VARCHAR2(50)) AS FWET, " + +// " CAST(NULL AS VARCHAR2(255)) AS picpth, " + +// " CAST(NULL AS VARCHAR2(255)) vdpth FWET, " + +// " CAST(NULL AS VARCHAR2(1000)) AS FID, " + +// " CAST(NULL AS VARCHAR2(64)) AS DATASRC, " + +// " 2 AS MWAY, " + +// " CAST(NULL AS TIMESTAMP) AS STRDT, " + +// " CAST(NULL AS TIMESTAMP) AS ENDDT " + +// " FROM DUAL WHERE 1 = 0 " + ") manualData"; } @@ -439,6 +445,8 @@ public class FpRunServiceImpl implements FpRunService { selectMap.put("videourl", "t.videourl AS videourl"); selectMap.put("fwet", "t.fwet AS fwet"); selectMap.put("fid", "t.fid AS fid"); + selectMap.put("picpth", "t.picpth AS picpth"); + selectMap.put("vdpth", "t.vdpth AS vdpth"); selectMap.put("upFcnt", "t.upFcnt AS upFcnt"); selectMap.put("downFcnt", "t.downFcnt AS downFcnt"); selectMap.put("dataSrc", "t.dataSrc AS dataSrc"); @@ -775,6 +783,7 @@ public class FpRunServiceImpl implements FpRunService { "t.PICPTH AS picpth, " + "t.VDPTH AS vdpth, " + "t.DIRECTION AS direction, " + + "t.DIRECTION AS directionName, " + "1 AS mway, " + "t.STRDT AS strdt, " + "t.ENDDT AS enddt, " + @@ -829,6 +838,7 @@ public class FpRunServiceImpl implements FpRunService { selectMap.put("picpth", "t.picpth AS picpth"); selectMap.put("vdpth", "t.vdpth AS vdpth"); selectMap.put("direction", "t.direction AS direction"); + selectMap.put("directionName", "t.directionName AS directionName"); selectMap.put("mway", "t.mway AS mway"); selectMap.put("strdt", "t.strdt AS strdt"); selectMap.put("enddt", "t.enddt AS enddt"); From b083dd7019e9a7b8f27f4b329014cc463bdf297d Mon Sep 17 00:00:00 2001 From: tangwei Date: Thu, 11 Jun 2026 13:08:07 +0800 Subject: [PATCH 04/34] =?UTF-8?q?fix:=20=E4=BC=98=E5=8C=96=E8=BF=87?= =?UTF-8?q?=E9=B1=BC=E5=AE=A1=E6=89=B9=E9=A1=B5=E9=9D=A2=E5=88=86=E9=A1=B5?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../platform/utils/DataSourceRequestUtil.java | 33 +++++++++++++++---- 1 file changed, 27 insertions(+), 6 deletions(-) diff --git a/backend/src/main/java/com/yfd/platform/utils/DataSourceRequestUtil.java b/backend/src/main/java/com/yfd/platform/utils/DataSourceRequestUtil.java index 17197a2f..a9a101ee 100644 --- a/backend/src/main/java/com/yfd/platform/utils/DataSourceRequestUtil.java +++ b/backend/src/main/java/com/yfd/platform/utils/DataSourceRequestUtil.java @@ -18,18 +18,39 @@ public class DataSourceRequestUtil { private static final Pattern SAFE_IDENTIFIER = Pattern.compile("^[A-Za-z_][A-Za-z0-9_]*(\\.[A-Za-z_][A-Za-z0-9_]*)*$"); +// public static Page getPage(DataSourceRequest request) { +// if (request == null) { +// return null; +// } +// int take = request.getTake(); +// int skip = request.getSkip(); +// if (take <= 0) { +// return null; +// } +// Page page = new Page<>(); +// page.setSize((long) take); +// page.setCurrent(skip / take + 1L); +// return page; +// } + + public static Page getPage(DataSourceRequest request) { if (request == null) { return null; } - int take = request.getTake(); - int skip = request.getSkip(); - if (take <= 0) { - return null; + int pageNum = request.getSkip(); // 前端传的页码(从1开始) + int pageSize = request.getTake(); // 每页条数 + + if (pageSize <= 0) { + return null; // 或 throw new IllegalArgumentException("每页条数必须大于0") } + if (pageNum < 1) { + pageNum = 1; // 页码最小为1 + } + Page page = new Page<>(); - page.setSize((long) take); - page.setCurrent(skip / take + 1L); + page.setSize((long) pageSize); + page.setCurrent(pageNum); // 直接使用页码 return page; } From 1076d58f3a86a25814161b54b705893f007cba3d Mon Sep 17 00:00:00 2001 From: tangwei Date: Thu, 11 Jun 2026 13:57:35 +0800 Subject: [PATCH 05/34] =?UTF-8?q?fix:=20=E4=BC=98=E5=8C=96=E8=BF=87?= =?UTF-8?q?=E9=B1=BC=E8=AE=BE=E6=96=BD=E6=B8=B8=E5=90=91=E8=BF=94=E5=9B=9E?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../java/com/yfd/platform/qgc_env/fp/entity/vo/FpSdfpssrVo.java | 2 +- .../yfd/platform/qgc_env/fp/service/impl/FpRunServiceImpl.java | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/backend/src/main/java/com/yfd/platform/qgc_env/fp/entity/vo/FpSdfpssrVo.java b/backend/src/main/java/com/yfd/platform/qgc_env/fp/entity/vo/FpSdfpssrVo.java index 64fada9b..f9b0d928 100644 --- a/backend/src/main/java/com/yfd/platform/qgc_env/fp/entity/vo/FpSdfpssrVo.java +++ b/backend/src/main/java/com/yfd/platform/qgc_env/fp/entity/vo/FpSdfpssrVo.java @@ -73,7 +73,7 @@ public class FpSdfpssrVo { private Integer direction; @Schema(description = "游向") - private Integer directionName; + private String directionName; @Schema(description = "监测方式") private Integer mway; 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 68e0e443..9c81ca56 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 @@ -783,7 +783,7 @@ public class FpRunServiceImpl implements FpRunService { "t.PICPTH AS picpth, " + "t.VDPTH AS vdpth, " + "t.DIRECTION AS direction, " + - "t.DIRECTION AS directionName, " + + " CASE t.DIRECTION WHEN 0 THEN '上行' WHEN 1 THEN '下行' WHEN 2 THEN '上行折返' WHEN 3 THEN '下行折返' END AS directionName, " + "1 AS mway, " + "t.STRDT AS strdt, " + "t.ENDDT AS enddt, " + From 3fdf0da4233827c7cf9046d7599343e1347b75f3 Mon Sep 17 00:00:00 2001 From: tangwei Date: Thu, 11 Jun 2026 14:19:53 +0800 Subject: [PATCH 06/34] =?UTF-8?q?fix:=20=E4=BC=98=E5=8C=96=E6=A0=96?= =?UTF-8?q?=E6=81=AF=E5=9C=B0=E6=B0=B4=E6=B8=A9=E5=8F=82=E6=95=B0?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../platform/qgc_env/fh/service/impl/FhHabitatServiceImpl.java | 1 + 1 file changed, 1 insertion(+) 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 8b5c1608..dcad8272 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 @@ -1486,6 +1486,7 @@ public class FhHabitatServiceImpl implements FhHabitatService { case "id" -> "t.ID"; case "stcd" -> "t.STCD"; case "dt" -> "t.DT"; + case "DT" -> "t.DT"; case "wt" -> "t.WT"; default -> null; }; From c56938e881705fa3dd1dd38877e0e62ade822a35 Mon Sep 17 00:00:00 2001 From: tangwei Date: Thu, 11 Jun 2026 14:41:33 +0800 Subject: [PATCH 07/34] =?UTF-8?q?fix:=20=E4=BC=98=E5=8C=96=E8=BF=87?= =?UTF-8?q?=E9=B1=BC=E8=AE=BE=E6=96=BD=E6=8E=A5=E5=8F=A3?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../yfd/platform/qgc_env/fp/entity/vo/FpTableVo.java | 10 +++++----- .../qgc_env/fp/service/impl/FpRunServiceImpl.java | 2 ++ 2 files changed, 7 insertions(+), 5 deletions(-) diff --git a/backend/src/main/java/com/yfd/platform/qgc_env/fp/entity/vo/FpTableVo.java b/backend/src/main/java/com/yfd/platform/qgc_env/fp/entity/vo/FpTableVo.java index b6f4978a..1556d10b 100644 --- a/backend/src/main/java/com/yfd/platform/qgc_env/fp/entity/vo/FpTableVo.java +++ b/backend/src/main/java/com/yfd/platform/qgc_env/fp/entity/vo/FpTableVo.java @@ -76,9 +76,9 @@ public class FpTableVo { @Schema(description = "监测方式:1=人工 2=自动(预留)") private Integer mway; -// @Schema(description = "视频") -// private String vdpth; -// -// @Schema(description = "图片") -// private String picpth; + @Schema(description = "视频") + private String vdpth; + + @Schema(description = "图片") + private String picpth; } 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 9c81ca56..a89a3ff2 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 @@ -347,6 +347,8 @@ public class FpRunServiceImpl implements FpRunService { "manualData.VIDEOURL AS videourl, " + "manualData.FWET AS fwet, " + "manualData.FID AS fid, " + + "manualData.PICPTH AS picpth, " + + "manualData.VDPTH AS vdpth, " + "manualData.DATASRC AS dataSrc, " + "manualData.MWAY AS mway, " + "manualData.STRDT AS strdt, " + From 0dc8ef3cef0cfe0dac2d683210775650556898a3 Mon Sep 17 00:00:00 2001 From: tangwei Date: Thu, 11 Jun 2026 15:12:17 +0800 Subject: [PATCH 08/34] =?UTF-8?q?fix:=20=E4=BC=98=E5=8C=96=E8=BF=87?= =?UTF-8?q?=E9=B1=BC=E8=AE=BE=E6=96=BD=E6=8E=A5=E5=8F=A3?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../fp/service/impl/FpRunServiceImpl.java | 109 +++++++++--------- 1 file changed, 54 insertions(+), 55 deletions(-) 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 a89a3ff2..6bc68dcb 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 @@ -222,41 +222,33 @@ public class FpRunServiceImpl implements FpRunService { private DataSourceResult queryQgcFpssTableGroupList(DataSourceRequest dataSourceRequest, DataSourceLoadOptionsBase loadOptions, String stcdFilter) { - List groups = dataSourceRequest.getGroup(); - GroupingInfo[] groupInfos = loadOptions == null ? new GroupingInfo[0] : loadOptions.getGroup(); - StringBuilder sql = new StringBuilder("SELECT "); - List selectItems = new ArrayList<>(); - for (DataSourceRequest.GroupDescriptor descriptor : groups) { - if (descriptor == null || StrUtil.isBlank(descriptor.getField())) { - continue; - } - String column = mapQgcFpssTableColumn(descriptor.getField()); - if (StrUtil.isBlank(column)) { - continue; - } - selectItems.add(column + " AS " + descriptor.getField().toUpperCase()); - selectItems.add("COUNT(*) AS COUNT_" + descriptor.getField().toUpperCase()); - if (CollUtil.isNotEmpty(descriptor.getAggregates())) { - for (DataSourceRequest.AggregateDescriptor aggregate : descriptor.getAggregates()) { - String aggregateColumn = mapQgcFpssTableColumn(aggregate.getField()); - if (StrUtil.isBlank(aggregateColumn) || StrUtil.isBlank(aggregate.getAggregate())) { - continue; - } - String aggregateSql = buildAggregateSql(aggregate.getAggregate(), aggregateColumn, aggregate.getField()); - if (StrUtil.isNotBlank(aggregateSql)) { - selectItems.add(aggregateSql); - } - } - } - } - if (selectItems.isEmpty()) { - selectItems.add("t.YR AS YR"); - selectItems.add("COUNT(*) AS COUNT_YR"); - } - - sql.append(String.join(", ", selectItems)) - .append(" FROM (") + sql.append("CAST(NULL AS VARCHAR2(36)) AS stcd, ") + .append("CAST(NULL AS VARCHAR2(255)) AS stnm, ") + .append("CAST(NULL AS VARCHAR2(19)) AS tm, ") + .append("t.ftp AS ftp, ") + .append("CAST(NULL AS VARCHAR2(200)) AS fishId, ") + .append("MAX(t.fsz) AS fsz, ") + .append("TO_CHAR(SUM(TO_NUMBER(NVL(t.fcnt, '0')))) AS fcnt, ") + .append("CAST(NULL AS VARCHAR2(50)) AS length, ") + .append("CAST(NULL AS VARCHAR2(50)) AS width, ") + .append("CAST(NULL AS VARCHAR2(50)) AS fishspeed, ") + .append("CAST(NULL AS VARCHAR2(20)) AS direction, ") + .append("CAST(NULL AS VARCHAR2(20)) AS directionName, ") + .append("CAST(NULL AS VARCHAR2(50)) AS temperature, ") + .append("CAST(NULL AS VARCHAR2(50)) AS speed, ") + .append("CAST(NULL AS VARCHAR2(255)) AS firstimgurl, ") + .append("CAST(NULL AS VARCHAR2(255)) AS videourl, ") + .append("t.yr AS yr, ") + .append("CAST(NULL AS VARCHAR2(50)) AS fwet, ") + .append("CAST(NULL AS VARCHAR2(1000)) AS fid, ") + .append("CAST(NULL AS NUMBER(18,0)) AS upFcnt, ") + .append("CAST(NULL AS NUMBER(18,0)) AS downFcnt, ") + .append("CAST(NULL AS VARCHAR2(64)) AS dataSrc, ") + .append("CAST(NULL AS NUMBER(3,0)) AS mway, ") + .append("CAST(NULL AS VARCHAR2(255)) AS picpth, ") + .append("CAST(NULL AS VARCHAR2(255)) AS vdpth ") + .append("FROM (") .append(buildQgcFpssTableCoreSql()) .append(") t WHERE 1 = 1 "); @@ -267,29 +259,14 @@ public class FpRunServiceImpl implements FpRunService { sql.append(" AND ").append(filterSql).append(" "); } - List groupByColumns = new ArrayList<>(); - for (DataSourceRequest.GroupDescriptor descriptor : groups) { - if (descriptor == null || StrUtil.isBlank(descriptor.getField())) { - continue; - } - String column = mapQgcFpssTableColumn(descriptor.getField()); - if (StrUtil.isNotBlank(column)) { - groupByColumns.add(column); - } - } - if (!groupByColumns.isEmpty()) { - sql.append(" GROUP BY ").append(String.join(", ", groupByColumns)).append(" "); - } - sql.append(buildQgcFpssTableGroupOrderBySql(groups)); + sql.append(" GROUP BY t.yr, t.ftp "); + sql.append(buildQgcFpssTableAggregateOrderBySql(dataSourceRequest == null ? null : dataSourceRequest.getSort())); - List> rows = microservicDynamicSQLMapper.pageAllList(null, sql.toString(), paramMap); + Page page = loadOptions == null ? null : QgcQueryWrapperUtil.buildPage(loadOptions, loadOptions.getSkip(), loadOptions.getTake()); + List rows = microservicDynamicSQLMapper.pageAllListWithResultType(page, sql.toString(), paramMap, FpTableVo.class); DataSourceResult result = new DataSourceResult<>(); - if (Boolean.TRUE.equals(dataSourceRequest.getGroupResultFlat())) { - result.setData((List) (List) new GroupHelper().faltGroup(rows, Arrays.asList(groupInfos))); - } else { - result.setData((List) (List) new GroupHelper().group(rows, Arrays.asList(groupInfos))); - } - result.setTotal(0L); + result.setData(rows); + result.setTotal(page != null ? page.getTotal() : rows.size()); result.setAggregates(new HashMap<>()); return result; } @@ -664,6 +641,28 @@ public class FpRunServiceImpl implements FpRunService { return orders.isEmpty() ? "" : " ORDER BY " + String.join(", ", orders); } + private String buildQgcFpssTableAggregateOrderBySql(List sortList) { + if (CollUtil.isEmpty(sortList)) { + return " ORDER BY yr DESC"; + } + List orderColumns = new ArrayList<>(); + for (DataSourceRequest.SortDescriptor sortDescriptor : sortList) { + if (sortDescriptor == null || StrUtil.isBlank(sortDescriptor.getField())) { + continue; + } + String field = sortDescriptor.getField(); + if (!"yr".equals(field) && !"ftp".equals(field) && !"fsz".equals(field) && !"fcnt".equals(field)) { + continue; + } + String dir = "desc".equalsIgnoreCase(sortDescriptor.getDir()) || "des".equalsIgnoreCase(sortDescriptor.getDir()) ? "DESC" : "ASC"; + orderColumns.add(field + " " + dir + " NULLS LAST"); + } + if (orderColumns.isEmpty()) { + return " ORDER BY yr DESC"; + } + return " ORDER BY " + String.join(", ", orderColumns); + } + private DataSourceResult queryQgcSdfpssrDetailList(DataSourceRequest dataSourceRequest, DataSourceLoadOptionsBase loadOptions) { StringBuilder sql = new StringBuilder(); From 24abcffd67f2253f2353d576ded34448d9e44fa3 Mon Sep 17 00:00:00 2001 From: tangwei Date: Thu, 11 Jun 2026 15:33:40 +0800 Subject: [PATCH 09/34] =?UTF-8?q?feat:=20=E8=BF=87=E9=B1=BC=E8=AE=BE?= =?UTF-8?q?=E6=96=BD=E7=BB=BC=E5=90=88=E5=88=86=E6=9E=90?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../fp/controller/FishPassageController.java | 6 + .../entity/vo/FpRunAnalysisHeadColumnVo.java | 68 ++++ .../fp/entity/vo/FpRunAnalysisTableVo.java | 25 ++ .../qgc_env/fp/entity/vo/FpRunAnalysisVo.java | 47 +++ .../qgc_env/fp/service/FpRunService.java | 3 + .../fp/service/impl/FpRunServiceImpl.java | 307 ++++++++++++++++++ 6 files changed, 456 insertions(+) create mode 100644 backend/src/main/java/com/yfd/platform/qgc_env/fp/entity/vo/FpRunAnalysisHeadColumnVo.java create mode 100644 backend/src/main/java/com/yfd/platform/qgc_env/fp/entity/vo/FpRunAnalysisTableVo.java create mode 100644 backend/src/main/java/com/yfd/platform/qgc_env/fp/entity/vo/FpRunAnalysisVo.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 8affd4ac..495f05ca 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 @@ -52,6 +52,12 @@ public class FishPassageController { return ResponseResult.successData(fpRunService.getFishSelect(dataSourceRequest)); } + @PostMapping("/run/analysis/GetKendoListCust") + @Operation(summary = "过鱼设施综合分析") + public ResponseResult getAnalysisData(@RequestBody DataSourceRequest dataSourceRequest) { + return ResponseResult.successData(fpRunService.getAnalysisData(dataSourceRequest)); + } + @PostMapping("/build/GetKendoListCust") @Operation(summary = "过鱼设施建设及接入情况统计") public ResponseResult getKendoListCust(@RequestBody DataSourceRequest dataSourceRequest) { diff --git a/backend/src/main/java/com/yfd/platform/qgc_env/fp/entity/vo/FpRunAnalysisHeadColumnVo.java b/backend/src/main/java/com/yfd/platform/qgc_env/fp/entity/vo/FpRunAnalysisHeadColumnVo.java new file mode 100644 index 00000000..8a3e0123 --- /dev/null +++ b/backend/src/main/java/com/yfd/platform/qgc_env/fp/entity/vo/FpRunAnalysisHeadColumnVo.java @@ -0,0 +1,68 @@ +package com.yfd.platform.qgc_env.fp.entity.vo; + +import io.swagger.v3.oas.annotations.media.Schema; +import lombok.AllArgsConstructor; +import lombok.Data; +import lombok.experimental.Accessors; + +import java.util.List; + +@Data +@Accessors(chain = true) +@AllArgsConstructor +@Schema(description = "过鱼设施综合分析表头") +public class FpRunAnalysisHeadColumnVo { + + @Schema(description = "字段名") + private String dataIndex; + + @Schema(description = "标题") + private String title; + + @Schema(description = "是否展示") + private Boolean visible = true; + + @Schema(description = "唯一键") + private String key; + + @Schema(description = "单位") + private String unit; + + @Schema(description = "是否合并") + private boolean merge; + + @Schema(description = "数据类型") + private String dataType; + + @Schema(description = "数据格式") + private String dataFormat; + + @Schema(description = "子节点") + private List children; + + public FpRunAnalysisHeadColumnVo(String title, String dataIndex) { + this.title = title; + this.dataIndex = dataIndex; + this.key = dataIndex; + } + + public FpRunAnalysisHeadColumnVo(String title, String dataIndex, String key) { + this.title = title; + this.dataIndex = dataIndex; + this.key = key; + } + + public FpRunAnalysisHeadColumnVo(String dataIndex, + String title, + Boolean visible, + String key, + boolean merge, + List children) { + this.title = title; + this.dataIndex = dataIndex; + this.visible = visible; + this.merge = merge; + this.children = children; + this.key = key; + } +} diff --git a/backend/src/main/java/com/yfd/platform/qgc_env/fp/entity/vo/FpRunAnalysisTableVo.java b/backend/src/main/java/com/yfd/platform/qgc_env/fp/entity/vo/FpRunAnalysisTableVo.java new file mode 100644 index 00000000..c36bae7e --- /dev/null +++ b/backend/src/main/java/com/yfd/platform/qgc_env/fp/entity/vo/FpRunAnalysisTableVo.java @@ -0,0 +1,25 @@ +package com.yfd.platform.qgc_env.fp.entity.vo; + +import io.swagger.v3.oas.annotations.media.Schema; +import lombok.Data; +import lombok.experimental.Accessors; + +import java.util.List; + +@Data +@Accessors(chain = true) +@Schema(description = "过鱼设施综合分析表格") +public class FpRunAnalysisTableVo { + + @Schema(description = "表头") + private List columns; + + @Schema(description = "表格数据") + private Object dataSource; + + @Schema(description = "总数") + private Long total; + + @Schema(description = "水温设备类型") + private Integer wtDeviceType; +} diff --git a/backend/src/main/java/com/yfd/platform/qgc_env/fp/entity/vo/FpRunAnalysisVo.java b/backend/src/main/java/com/yfd/platform/qgc_env/fp/entity/vo/FpRunAnalysisVo.java new file mode 100644 index 00000000..27842ae0 --- /dev/null +++ b/backend/src/main/java/com/yfd/platform/qgc_env/fp/entity/vo/FpRunAnalysisVo.java @@ -0,0 +1,47 @@ +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 = "过鱼设施综合分析数据") +public class FpRunAnalysisVo { + + @Schema(description = "时间") + private String dt; + + @Schema(description = "鱼类名称") + private String ftp; + + @Schema(description = "过鱼数量") + private BigDecimal fcnt; + + @Schema(description = "出库水温(℃)") + private BigDecimal wt; + + @Schema(description = "化学需氧量(mg/L)") + private BigDecimal codcr; + + @Schema(description = "氨氮(mg/L)") + private BigDecimal nh3n; + + @Schema(description = "总磷(mg/L)") + private BigDecimal tp; + + @Schema(description = "总氮(mg/L)") + private BigDecimal tn; + + @Schema(description = "坝下水位(m)") + private BigDecimal dz; + + @Schema(description = "坝上水位(m)") + private BigDecimal rz; + + @Schema(description = "入库流量(m3/s)") + private BigDecimal qi; + + @Schema(description = "出库流量(m3/s)") + private BigDecimal qo; +} diff --git a/backend/src/main/java/com/yfd/platform/qgc_env/fp/service/FpRunService.java b/backend/src/main/java/com/yfd/platform/qgc_env/fp/service/FpRunService.java index 5d51d2ba..4611c100 100644 --- a/backend/src/main/java/com/yfd/platform/qgc_env/fp/service/FpRunService.java +++ b/backend/src/main/java/com/yfd/platform/qgc_env/fp/service/FpRunService.java @@ -3,6 +3,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.FpFishSelectVo; +import com.yfd.platform.qgc_env.fp.entity.vo.FpRunAnalysisTableVo; import com.yfd.platform.qgc_env.fp.entity.vo.FpSdfpssrVo; import com.yfd.platform.qgc_env.fp.entity.vo.FpTableVo; import com.yfd.platform.qgc_env.fp.entity.vo.YearFpStatisticsVo; @@ -18,6 +19,8 @@ public interface FpRunService { DataSourceResult processQgcFpssTableKendoList(DataSourceRequest dataSourceRequest); + DataSourceResult getAnalysisData(DataSourceRequest dataSourceRequest); + DataSourceResult getFishSelect(DataSourceRequest dataSourceRequest); List getYearFpStatic(String year); 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 6bc68dcb..79790dd2 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 @@ -15,6 +15,9 @@ import com.yfd.platform.common.MicroservicDynamicSQLMapper; import com.yfd.platform.common.exception.BizException; import com.yfd.platform.qgc_env.fp.entity.vo.FpFishSelectVo; import com.yfd.platform.qgc_env.fp.entity.vo.FpFtpStatisticsVo; +import com.yfd.platform.qgc_env.fp.entity.vo.FpRunAnalysisHeadColumnVo; +import com.yfd.platform.qgc_env.fp.entity.vo.FpRunAnalysisTableVo; +import com.yfd.platform.qgc_env.fp.entity.vo.FpRunAnalysisVo; import com.yfd.platform.qgc_env.fp.entity.vo.FpRunPlanVo; import com.yfd.platform.qgc_env.fp.entity.vo.FpSdfpssrVo; import com.yfd.platform.qgc_env.fp.entity.vo.FpTableVo; @@ -129,6 +132,90 @@ public class FpRunServiceImpl implements FpRunService { return queryQgcFpssTableGroupList(dataSourceRequest, loadOptions, stcd); } + @Override + public DataSourceResult getAnalysisData(DataSourceRequest dataSourceRequest) { + DataSourceResult result = new DataSourceResult<>(); + DataSourceLoadOptionsBase loadOptions = dataSourceRequest == null ? null : dataSourceRequest.toDevRequest(); + String tm = loadOptions == null ? null : QgcQueryWrapperUtil.getFilterFieldValue(loadOptions, "tm"); + if (StrUtil.isBlank(tm) || !tm.contains(",")) { + throw new BizException("时间范围(tm)格式错误."); + } + String[] tmArr = tm.split(","); + if (tmArr.length < 2 || StrUtil.isBlank(tmArr[0]) || StrUtil.isBlank(tmArr[1])) { + throw new BizException("时间范围(tm)格式错误."); + } + String stcd = loadOptions == null ? null : QgcQueryWrapperUtil.getFilterFieldValue(loadOptions, "stcd"); + if (StrUtil.isBlank(stcd)) { + throw new BizException("过鱼设施(stcd)编码不能为空."); + } + String ftp = loadOptions == null ? null : QgcQueryWrapperUtil.getFilterFieldValue(loadOptions, "ftp"); + if (StrUtil.isBlank(ftp)) { + result.setData(Collections.emptyList()); + result.setTotal(0L); + result.setAggregates(new HashMap<>()); + return result; + } + + Map stationParamMap = new HashMap<>(); + stationParamMap.put("stcd", StrUtil.trim(stcd)); + Map stationContext = microservicDynamicSQLMapper.getOneBySql( + buildQgcFpRunAnalysisStationSql(), + stationParamMap + ); + String rstcd = stationContext == null ? null : Convert.toStr(stationContext.get("rstcd"), null); + String hbrvcd = stationContext == null ? null : Convert.toStr(stationContext.get("hbrvcd"), null); + + String wtrvStcd = null; + String wqStcd = null; + if (StrUtil.isNotBlank(rstcd) && StrUtil.isNotBlank(hbrvcd)) { + Map alongParamMap = new HashMap<>(); + alongParamMap.put("rstcd", rstcd); + alongParamMap.put("hbrvcd", hbrvcd); + List> alongRows = microservicDynamicSQLMapper.pageAllList( + null, + buildQgcFpRunAnalysisAlongSql(), + alongParamMap + ); + for (Map row : alongRows) { + String sttpCode = Convert.toStr(row.get("sttpCode"), null); + if ("WTRV".equalsIgnoreCase(sttpCode) && StrUtil.isBlank(wtrvStcd)) { + wtrvStcd = Convert.toStr(row.get("stcd"), null); + } + if ("WQ".equalsIgnoreCase(sttpCode) && StrUtil.isBlank(wqStcd)) { + wqStcd = Convert.toStr(row.get("stcd"), null); + } + } + } + + Map paramMap = new HashMap<>(); + paramMap.put("stcd", StrUtil.trim(stcd)); + paramMap.put("ftp", StrUtil.trim(ftp)); + paramMap.put("startTime", StrUtil.trim(tmArr[0])); + paramMap.put("endTime", StrUtil.trim(tmArr[1])); + paramMap.put("rstcd", rstcd); + paramMap.put("hbrvcd", hbrvcd); + paramMap.put("wtrvStcd", wtrvStcd); + paramMap.put("wqStcd", wqStcd); + + Page page = loadOptions == null ? null : QgcQueryWrapperUtil.buildPage(loadOptions); + List rows = microservicDynamicSQLMapper.pageAllListWithResultType( + page, + buildQgcFpRunAnalysisDataSql(dataSourceRequest == null ? null : dataSourceRequest.getSort()), + paramMap, + FpRunAnalysisVo.class + ); + + long total = page != null ? page.getTotal() : rows.size(); + FpRunAnalysisTableVo tableVo = new FpRunAnalysisTableVo() + .setColumns(buildQgcFpRunAnalysisColumns(StrUtil.trim(ftp))) + .setDataSource(rows) + .setTotal(total); + result.setData(Collections.singletonList(tableVo)); + result.setTotal(total); + result.setAggregates(new HashMap<>()); + return result; + } + @Override public DataSourceResult getFishSelect(DataSourceRequest dataSourceRequest) { DataSourceLoadOptionsBase loadOptions = dataSourceRequest == null ? null : dataSourceRequest.toDevRequest(); @@ -1058,6 +1145,226 @@ public class FpRunServiceImpl implements FpRunService { }; } + private String buildQgcFpRunAnalysisStationSql() { + return "SELECT fp.RSTCD AS rstcd, eng.HBRVCD AS hbrvcd " + + "FROM SD_FPSS_B_H fp " + + "LEFT JOIN SD_ENGINFO_B_H eng ON eng.STCD = fp.RSTCD AND NVL(eng.IS_DELETED, 0) = 0 " + + "WHERE fp.STCD = #{map.stcd} " + + "AND ROWNUM = 1"; + } + + private String buildQgcFpRunAnalysisAlongSql() { + return "SELECT t2.STCD AS stcd, t2.STTP AS sttpCode " + + "FROM MS_ALONG_B t1 " + + "INNER JOIN MS_ALONGDET_B t2 ON t1.ID = t2.ALONG_ID " + + "WHERE t1.CODE = 'common' " + + " AND t1.RVCD = #{map.hbrvcd} " + + " AND t2.RSTCD = #{map.rstcd} " + + " AND t2.STTP IN ('WTRV', 'WQ') " + + " AND NVL(t1.IS_DELETED, 0) = 0 " + + " AND NVL(t2.IS_DELETED, 0) = 0 " + + "ORDER BY NVL(t2.SORT, 999999), t2.STCD"; + } + + private String buildQgcFpRunAnalysisDataSql(List sortList) { + return "SELECT t.DT AS dt, " + + " t.FTP AS ftp, " + + " t.FCNT AS fcnt, " + + " t.WT AS wt, " + + " t.CODCR AS codcr, " + + " t.NH3N AS nh3n, " + + " t.TP AS tp, " + + " t.TN AS tn, " + + " t.DZ AS dz, " + + " t.RZ AS rz, " + + " t.QI AS qi, " + + " t.QO AS qo " + + "FROM ( " + + " SELECT t1.DT AS DT, " + + " t2.FTP AS FTP, " + + " t2.FCNT AS FCNT, " + + " t3.WT AS WT, " + + " t4.CODCR AS CODCR, " + + " t4.NH3N AS NH3N, " + + " t4.TP AS TP, " + + " t4.TN AS TN, " + + " t5.DZ AS DZ, " + + " t5.RZ AS RZ, " + + " t5.QI AS QI, " + + " t5.QO AS QO " + + " FROM ( " + + " SELECT TO_CHAR(TO_DATE(#{map.startTime}, 'YYYY-MM-DD HH24:MI:SS') + LEVEL - 1, 'YYYY-MM-DD') AS DT " + + " FROM DUAL " + + " CONNECT BY LEVEL <= TO_DATE(#{map.endTime}, 'YYYY-MM-DD HH24:MI:SS') - TO_DATE(#{map.startTime}, 'YYYY-MM-DD HH24:MI:SS') + 1 " + + " ) t1 " + + " LEFT JOIN ( " + + buildQgcFpRunAnalysisFishSql() + + " ) t2 ON t1.DT = t2.DT " + + " LEFT JOIN ( " + + buildQgcFpRunAnalysisWtSql() + + " ) t3 ON t1.DT = t3.DT " + + " LEFT JOIN ( " + + buildQgcFpRunAnalysisWqSql() + + " ) t4 ON t1.DT = t4.DT " + + " LEFT JOIN ( " + + buildQgcFpRunAnalysisEngSql() + + " ) t5 ON t1.DT = t5.DT " + + ") t " + + "WHERE (t.FTP IS NOT NULL OR t.FCNT IS NOT NULL OR t.WT IS NOT NULL OR t.CODCR IS NOT NULL OR t.NH3N IS NOT NULL OR t.TP IS NOT NULL OR t.TN IS NOT NULL OR t.DZ IS NOT NULL OR t.RZ IS NOT NULL OR t.QI IS NOT NULL OR t.QO IS NOT NULL) " + + buildQgcFpRunAnalysisOrderBySql(sortList); + } + + private String buildQgcFpRunAnalysisFishSql() { + return "SELECT t.DT AS DT, t.FTP AS FTP, t.FCNT AS FCNT FROM ( " + + buildQgcFpRunAnalysisManualFishSql() + + " UNION ALL " + + buildQgcFpRunAnalysisAutoFishSql() + + " ) t"; + } + + private String buildQgcFpRunAnalysisManualFishSql() { + return "SELECT TO_CHAR(src.STRDT, 'YYYY-MM-DD') AS DT, " + + " src.FTP AS FTP, " + + " SUM(src.FCNT) AS FCNT " + + "FROM ( " + + " SELECT t.STRDT AS STRDT, " + + " t.FCNT AS FCNT, " + + " COALESCE(fishRv.NAME, relRv.FISH_NAME, fishZy.NAME, relZy.FISH_NAME, fishDirect.NAME, t.FTP) AS FTP " + + " FROM SD_FPSS_R t " + + " INNER JOIN SD_FPSS_B_H fp ON fp.STCD = t.STCD " + + " LEFT JOIN SD_ENGINFO_B_H eng ON eng.STCD = fp.RSTCD AND NVL(eng.IS_DELETED, 0) = 0 " + + " LEFT JOIN SD_FISHDICTORY_RLTN_B relRv ON relRv.FISH_ID = t.FTP " + + " AND relRv.RVCD = eng.HBRVCD " + + " AND NVL(relRv.IS_DELETED, 0) = 0 " + + " LEFT JOIN SD_FISHDICTORY_B fishRv ON fishRv.ID = relRv.ZY_FISH_ID " + + " AND NVL(fishRv.IS_DELETED, 0) = 0 " + + " AND NVL(fishRv.ENABLE, 1) = 1 " + + " LEFT JOIN SD_FISHDICTORY_RLTN_B relZy ON relZy.FISH_ID = t.FTP " + + " AND relZy.RVCD = 'ZY' " + + " AND NVL(relZy.IS_DELETED, 0) = 0 " + + " LEFT JOIN SD_FISHDICTORY_B fishZy ON fishZy.ID = relZy.ZY_FISH_ID " + + " AND NVL(fishZy.IS_DELETED, 0) = 0 " + + " AND NVL(fishZy.ENABLE, 1) = 1 " + + " LEFT JOIN SD_FISHDICTORY_B fishDirect ON fishDirect.ID = t.FTP " + + " AND NVL(fishDirect.IS_DELETED, 0) = 0 " + + " AND NVL(fishDirect.ENABLE, 1) = 1 " + + " WHERE t.STCD = #{map.stcd} " + + " AND t.STRDT >= TO_DATE(#{map.startTime}, 'YYYY-MM-DD HH24:MI:SS') " + + " AND t.STRDT <= TO_DATE(#{map.endTime}, 'YYYY-MM-DD HH24:MI:SS') " + + " AND NVL(t.IS_DELETED, 0) = 0 " + + ") src " + + "WHERE src.FTP = #{map.ftp} " + + "GROUP BY TO_CHAR(src.STRDT, 'YYYY-MM-DD'), src.FTP"; + } + + // The automatic branch is reserved intentionally until the new equivalent table is provided. + private String buildQgcFpRunAnalysisAutoFishSql() { + return "SELECT CAST(NULL AS VARCHAR2(10)) AS DT, " + + " CAST(NULL AS VARCHAR2(255)) AS FTP, " + + " CAST(NULL AS NUMBER(18, 2)) AS FCNT " + + "FROM DUAL WHERE 1 = 0"; + } + + private String buildQgcFpRunAnalysisWtSql() { + return "SELECT TO_CHAR(t.DT, 'YYYY-MM-DD') AS DT, " + + " ROUND(AVG(t.WT), 2) AS WT " + + "FROM SD_WTRVDAY_S t " + + "WHERE t.STCD = #{map.wtrvStcd} " + + " AND t.DT >= TO_DATE(#{map.startTime}, 'YYYY-MM-DD HH24:MI:SS') " + + " AND t.DT <= TO_DATE(#{map.endTime}, 'YYYY-MM-DD HH24:MI:SS') " + + " AND NVL(t.IS_DELETED, 0) = 0 " + + "GROUP BY TO_CHAR(t.DT, 'YYYY-MM-DD')"; + } + + private String buildQgcFpRunAnalysisWqSql() { + return "SELECT TO_CHAR(t.DT, 'YYYY-MM-DD') AS DT, " + + " ROUND(AVG(t.CODCR), 2) AS CODCR, " + + " ROUND(AVG(t.NH3N), 2) AS NH3N, " + + " ROUND(AVG(t.TP), 2) AS TP, " + + " ROUND(AVG(t.TN), 2) AS TN " + + "FROM SD_WQDAY_S t " + + "WHERE t.STCD = #{map.wqStcd} " + + " AND t.DT >= TO_DATE(#{map.startTime}, 'YYYY-MM-DD HH24:MI:SS') " + + " AND t.DT <= TO_DATE(#{map.endTime}, 'YYYY-MM-DD HH24:MI:SS') " + + " AND NVL(t.IS_DELETED, 0) = 0 " + + "GROUP BY TO_CHAR(t.DT, 'YYYY-MM-DD')"; + } + + private String buildQgcFpRunAnalysisEngSql() { + return "SELECT TO_CHAR(TRUNC(t.TM), 'YYYY-MM-DD') AS DT, " + + " ROUND(AVG(t.DZ), 2) AS DZ, " + + " ROUND(AVG(t.RZ), 2) AS RZ, " + + " ROUND(AVG(t.QI), 2) AS QI, " + + " ROUND(AVG(t.QO), 2) AS QO " + + "FROM SD_HYDROPW_R t " + + "WHERE t.STCD = #{map.rstcd} " + + " AND t.TM >= TO_DATE(#{map.startTime}, 'YYYY-MM-DD HH24:MI:SS') " + + " AND t.TM <= TO_DATE(#{map.endTime}, 'YYYY-MM-DD HH24:MI:SS') " + + " AND NVL(t.IS_DELETED, 0) = 0 " + + "GROUP BY TRUNC(t.TM)"; + } + + private String buildQgcFpRunAnalysisOrderBySql(List sortList) { + if (CollUtil.isEmpty(sortList)) { + return " ORDER BY t.DT"; + } + List orderColumns = new ArrayList<>(); + for (DataSourceRequest.SortDescriptor sortDescriptor : sortList) { + if (sortDescriptor == null || StrUtil.isBlank(sortDescriptor.getField())) { + continue; + } + String column = mapQgcFpRunAnalysisColumn(sortDescriptor.getField()); + if (StrUtil.isBlank(column)) { + continue; + } + String dir = "desc".equalsIgnoreCase(sortDescriptor.getDir()) || "des".equalsIgnoreCase(sortDescriptor.getDir()) ? "DESC" : "ASC"; + orderColumns.add(column + " " + dir + " NULLS LAST"); + } + if (orderColumns.isEmpty()) { + return " ORDER BY t.DT"; + } + return " ORDER BY " + String.join(", ", orderColumns); + } + + private String mapQgcFpRunAnalysisColumn(String field) { + if (StrUtil.isBlank(field)) { + return null; + } + return switch (field) { + case "dt" -> "t.DT"; + case "ftp" -> "t.FTP"; + case "fcnt" -> "t.FCNT"; + case "wt" -> "t.WT"; + case "codcr" -> "t.CODCR"; + case "nh3n" -> "t.NH3N"; + case "tp" -> "t.TP"; + case "tn" -> "t.TN"; + case "dz" -> "t.DZ"; + case "rz" -> "t.RZ"; + case "qi" -> "t.QI"; + case "qo" -> "t.QO"; + default -> null; + }; + } + + private List buildQgcFpRunAnalysisColumns(String ftpName) { + List columns = new ArrayList<>(); + columns.add(new FpRunAnalysisHeadColumnVo("dt", "时间", true, "dt", false, new ArrayList<>()) + .setDataType("date") + .setDataFormat("yyyy-MM-DD")); + columns.add(new FpRunAnalysisHeadColumnVo("fcnt", ftpName + "(尾)", true, "fcnt", false, new ArrayList<>())); + columns.add(new FpRunAnalysisHeadColumnVo("wt", "出库水温(℃)", true, "wt", false, new ArrayList<>())); + columns.add(new FpRunAnalysisHeadColumnVo("codcr", "化学需氧量(mg/L)", true, "codcr", false, new ArrayList<>())); + columns.add(new FpRunAnalysisHeadColumnVo("nh3n", "氨氮(mg/L)", true, "nh3n", false, new ArrayList<>())); + columns.add(new FpRunAnalysisHeadColumnVo("tp", "总磷(mg/L)", true, "tp", false, new ArrayList<>())); + columns.add(new FpRunAnalysisHeadColumnVo("tn", "总氮(mg/L)", true, "tn", false, new ArrayList<>())); + columns.add(new FpRunAnalysisHeadColumnVo("qi", "入库流量(m³/s)", true, "qi", false, new ArrayList<>())); + columns.add(new FpRunAnalysisHeadColumnVo("qo", "出库流量(m³/s)", true, "qo", false, new ArrayList<>())); + columns.add(new FpRunAnalysisHeadColumnVo("rz", "坝上水位(m)", true, "rz", false, new ArrayList<>())); + columns.add(new FpRunAnalysisHeadColumnVo("dz", "坝下水位(m)", true, "dz", false, new ArrayList<>())); + return columns; + } + private List normalizeValues(Object value) { if (value == null) { return new ArrayList<>(); From 1da4ca420e24e3a0b04a417f4d8be3027f00894b Mon Sep 17 00:00:00 2001 From: tangwei Date: Thu, 11 Jun 2026 16:04:54 +0800 Subject: [PATCH 10/34] =?UTF-8?q?fix:=20=E4=BC=98=E5=8C=96=E8=BF=87?= =?UTF-8?q?=E9=B1=BC=E8=AE=BE=E6=96=BD=E9=A1=B5=E9=9D=A2=E6=8E=92=E5=BA=8F?= =?UTF-8?q?=E9=97=AE=E9=A2=98?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../fp/service/impl/FpBuildServiceImpl.java | 82 ++++++++++++++----- 1 file changed, 61 insertions(+), 21 deletions(-) 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 5cedcef4..0f92c70f 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 @@ -309,21 +309,78 @@ public class FpBuildServiceImpl implements FpBuildService { } Map columnMap = new HashMap<>(); columnMap.put("stcd", "fp.STCD"); + columnMap.put("logo", "fp.LOGO"); columnMap.put("stnm", "fp.STNM"); columnMap.put("sttpCode", "fp.STTP"); columnMap.put("sttpName", "sttp.STTP_NAME"); columnMap.put("sttpFullPath", "sttp.FULL_PATH"); + columnMap.put("sttpTreeLevel", "sttp.TREE_LEVEL"); columnMap.put("rstcd", "fp.RSTCD"); - columnMap.put("logo", "fp.LOGO"); columnMap.put("ennm", "eng.ENNM"); columnMap.put("baseId", "eng.BASE_ID"); columnMap.put("baseName", "hb.BASENAME"); columnMap.put("hbrvcd", "eng.HBRVCD"); + columnMap.put("hbrvcdName", "hbrv.HBRVNM"); + columnMap.put("lgtd", "fp.LGTD"); + columnMap.put("lttd", "fp.LTTD"); + columnMap.put("elev", "fp.ELEV"); + columnMap.put("stlc", "fp.STLC"); columnMap.put("dtin", "fp.DTIN"); columnMap.put("dtinName", "CASE WHEN NVL(fp.DTIN, 0) = 1 THEN '已接入' ELSE '未接入' END"); + columnMap.put("dtinTm", "fp.DTIN_TM"); columnMap.put("bldsttCcode", "fp.BLDSTT_CODE"); columnMap.put("bldsttCcodeName", "CASE WHEN fp.BLDSTT_CODE IN (1, 10, 11) THEN '已建' WHEN fp.BLDSTT_CODE IN (2, 7, 8) THEN '在建' ELSE '未建/规划' END"); + columnMap.put("stdsdt", "fp.STDSDT"); + columnMap.put("pststdt", "fp.PSTSTDT"); + columnMap.put("pesstdt", "fp.PESSTDT"); + columnMap.put("swdt", "fp.SWDT"); + columnMap.put("jcdt", "fp.JCDT"); + columnMap.put("wddt", "fp.WDDT"); + columnMap.put("introduce", "fp.INTRODUCE"); columnMap.put("ydxs", "fp.YDXS"); + columnMap.put("ydzcd", "fp.YDZCD"); + columnMap.put("ydjkz", "fp.YDJKZ"); + columnMap.put("ydjkcnt", "fp.YDJKCNT"); + columnMap.put("jkhg", "fp.JKHG"); + columnMap.put("ydyyxs", "fp.YDYYXS"); + columnMap.put("ydckz", "fp.YDCKZ"); + columnMap.put("ydckcnt", "fp.YDCKCNT"); + columnMap.put("ckhg", "fp.CKHG"); + columnMap.put("ydcsv", "fp.YDCSV"); + columnMap.put("ydcscd", "fp.YDCSCD"); + columnMap.put("ydcskd", "fp.YDCSKD"); + columnMap.put("ydcspd", "fp.YDCSPD"); + columnMap.put("ydcscnt", "fp.YDCSCNT"); + columnMap.put("ydxxccnt", "fp.YDXXCCNT"); + columnMap.put("v", "fp.V"); + columnMap.put("fzrdmxz", "fp.FZRDMXZ"); + columnMap.put("fzrtdsz", "fp.FZRTDSZ"); + columnMap.put("fzryxwdp", "fp.FZRYXWDP"); + columnMap.put("fzrpj", "fp.FZRPJ"); + columnMap.put("symtlc", "fp.SYMTLC"); + columnMap.put("symtxs", "fp.SYMTXS"); + columnMap.put("xymtlc", "fp.XYMTLC"); + columnMap.put("xymtxs", "fp.XYMTXS"); + columnMap.put("jyfs", "fp.JYFS"); + columnMap.put("yyfs", "fp.YYFS"); + columnMap.put("syjcnt", "fp.SYJCNT"); + columnMap.put("syjhg", "fp.SYJHG"); + columnMap.put("syjq", "fp.SYJQ"); + columnMap.put("syjsz", "fp.SYJSZ"); + columnMap.put("syjwdp", "fp.SYJWDP"); + columnMap.put("sjgycnt", "fp.SJGYCNT"); + columnMap.put("zygydxms", "fp.ZYGYDXMS"); + columnMap.put("jggydxms", "fp.JGGYDXMS"); + columnMap.put("gytm", "fp.GYTM"); + columnMap.put("yxtm", "fp.YXTM"); + columnMap.put("fpssmn", "fp.FPSSMN"); + columnMap.put("dtfrqcy", "fp.DTFRQCY"); + columnMap.put("jbtxcs", "fp.JBTXCS"); + columnMap.put("isUp", "fp.IS_UP"); + columnMap.put("isDown", "fp.IS_DOWN"); + columnMap.put("remark", "fp.REMARK"); + columnMap.put("vlsr", "fp.VLSR"); + columnMap.put("vlsrTm", "fp.VLSR_TM"); columnMap.put("siteStepSort", "fp.ORDER_INDEX"); columnMap.put("rstcdStepSort", "eng.ORDER_INDEX"); columnMap.put("baseStepSort", "hb.ORDER_INDEX"); @@ -336,34 +393,17 @@ public class FpBuildServiceImpl implements FpBuildService { return " ORDER BY NVL(hb.ORDER_INDEX, 999999) ASC, NVL(hbrv.ORDER_INDEX, 999999) ASC, " + "NVL(eng.ORDER_INDEX, 999999) ASC, NVL(fp.ORDER_INDEX, 999999) ASC, fp.STCD ASC"; } - Map sortMap = new HashMap<>(); - sortMap.put("stcd", "fp.STCD"); - sortMap.put("stnm", "fp.STNM"); - sortMap.put("sttpCode", "fp.STTP"); - sortMap.put("sttpName", "sttp.STTP_NAME"); - sortMap.put("rstcd", "fp.RSTCD"); - sortMap.put("ennm", "eng.ENNM"); - sortMap.put("baseId", "eng.BASE_ID"); - sortMap.put("baseName", "hb.BASENAME"); - sortMap.put("hbrvcd", "eng.HBRVCD"); - sortMap.put("dtin", "fp.DTIN"); - sortMap.put("bldsttCcode", "fp.BLDSTT_CODE"); - sortMap.put("baseStepSort", "hb.ORDER_INDEX"); - sortMap.put("rvcdStepSort", "hbrv.ORDER_INDEX"); - sortMap.put("rstcdStepSort", "eng.ORDER_INDEX"); - sortMap.put("siteStepSort", "fp.ORDER_INDEX"); - List orderItems = new ArrayList<>(); for (DataSourceRequest.SortDescriptor sort : sorts) { if (sort == null || sort.getField() == null || sort.getField().isBlank()) { continue; } - String column = sortMap.get(sort.getField()); + String column = mapVmsstbprptColumn(sort.getField()); if (column == null) { continue; } - String direction = "desc".equalsIgnoreCase(sort.getDir()) ? "DESC" : "ASC"; - orderItems.add(column + " " + direction); + String direction = "desc".equalsIgnoreCase(sort.getDir()) || "des".equalsIgnoreCase(sort.getDir()) ? "DESC" : "ASC"; + orderItems.add(column + " " + direction + " NULLS LAST"); } if (orderItems.isEmpty()) { return " ORDER BY NVL(hb.ORDER_INDEX, 999999) ASC, NVL(hbrv.ORDER_INDEX, 999999) ASC, " + From 9ceb2899d0d1ae42bf61d70fb660c7fb11a53de8 Mon Sep 17 00:00:00 2001 From: tangwei Date: Thu, 11 Jun 2026 16:23:24 +0800 Subject: [PATCH 11/34] =?UTF-8?q?fix:=20=E4=BC=98=E5=8C=96=E5=88=97?= =?UTF-8?q?=E8=A1=A8=E6=8E=92=E5=BA=8F?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../eq/service/impl/EngEqDataServiceImpl.java | 39 +++++++- .../zq/service/impl/EngRiverServiceImpl.java | 3 + .../fh/service/impl/FhHabitatServiceImpl.java | 36 ++++++-- .../fp/service/impl/FpRunServiceImpl.java | 5 ++ .../impl/VpConstructionServiceImpl.java | 89 ++++++++++--------- .../vd/service/impl/VdMonitorServiceImpl.java | 27 +++++- .../wq/service/impl/EnvWqDataServiceImpl.java | 78 +++++++++++----- .../service/impl/SdWtMonitorServiceImpl.java | 66 +++++++++++--- .../zq/service/impl/ZqMonitorServiceImpl.java | 44 ++++++++- 9 files changed, 295 insertions(+), 92 deletions(-) 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 8dac6130..3aba66c4 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 @@ -4083,10 +4083,17 @@ public class EngEqDataServiceImpl implements EngEqDataService { } return switch (field) { case "id" -> "t.id"; + case "recordUser" -> "t.recordUser"; case "wbsType" -> "t.wbsType"; + case "recordTime" -> "t.recordTime"; + case "modifyTime" -> "t.modifyTime"; + case "displayRecordUser" -> "t.displayRecordUser"; + case "isolateType" -> "t.isolateType"; case "wbsCode" -> "t.wbsCode"; case "wbsName" -> "t.wbsName"; case "wbsSname" -> "t.wbsSname"; + case "wbsNameEn" -> "t.wbsNameEn"; + case "wbsSnameEn" -> "t.wbsSnameEn"; case "enable" -> "t.enable"; case "description" -> "t.description"; case "parentId" -> "t.parentId"; @@ -4097,10 +4104,28 @@ public class EngEqDataServiceImpl implements EngEqDataService { case "topWbsType" -> "t.topWbsType"; case "fullPath" -> "t.fullPath"; case "internal" -> "t.internal"; + case "lgtd" -> "t.lgtd"; + case "lttd" -> "t.lttd"; + case "area" -> "t.area"; + case "perimeter" -> "t.perimeter"; + case "synopsis" -> "t.synopsis"; case "introduce" -> "t.introduce"; + case "logo" -> "t.logo"; + case "inffile" -> "t.inffile"; case "orderIndex" -> "NVL(t.orderIndex, 999999)"; - case "recordTime" -> "t.recordTime"; - case "modifyTime" -> "t.modifyTime"; + case "filterContent" -> "t.filterContent"; + case "departmentId" -> "t.departmentId"; + case "systemId" -> "t.systemId"; + case "platformId" -> "t.platformId"; + case "reachWwqtg" -> "t.reachWwqtg"; + case "maxElev" -> "t.maxElev"; + case "minElev" -> "t.minElev"; + case "datTp" -> "t.datTp"; + case "rvAg" -> "t.rvAg"; + case "ifInnRv" -> "t.ifInnRv"; + case "showControl" -> "t.showControl"; + case "stcd" -> "t.stcd"; + case "displayDepartment" -> "t.displayDepartment"; default -> null; }; } @@ -4195,7 +4220,10 @@ public class EngEqDataServiceImpl implements EngEqDataService { return null; } return switch (field) { - case "baseStepSort", "rvcdStepSort", "rstcdStepSort", "siteStepSort", + case "id", "baseId", "hbrvcd", "hycd", "rvcd", "bldsttCcode", + "sfdbName", "mwrSfdb", "mwrSfdbName", "avqSfdb", "avqSfdbName", + "qecC", "mwrC", "avqC", "qecRuleDid", "qecMwrruleDid", "beforeQec", + "baseStepSort", "rvcdStepSort", "rstcdStepSort", "siteStepSort", "tm", "stcd", "stnm", "ennm", "qi", "qo", "qec", "sfdb", "rz", "dz", "qecLimit", "mwrLimit", "avqLimit", "baseName", "rvcdName", "hbrvcdName", "addvcdName", "qecAi" -> field; @@ -4208,7 +4236,10 @@ public class EngEqDataServiceImpl implements EngEqDataService { return null; } return switch (field) { - case "baseStepSort", "rvcdStepSort", "rstcdStepSort", "siteStepSort", + case "id", "baseId", "hbrvcd", "rvcd", "qecC", "mwrC", "avqC", + "sfdbName", "qecSfdb", "mwrSfdb", "mwrSfdbName", "avqSfdb", + "avqSfdbName", "qecRuleDid", "qecMwrruleDid", + "baseStepSort", "rvcdStepSort", "rstcdStepSort", "siteStepSort", "dt", "stcd", "stnm", "ennm", "qi", "qo", "qec", "sfdb", "rz", "dz", "qecLimit", "mwrLimit", "avqLimit", "baseName", "rvcdName", "hbrvcdName", "addvcdName", "beforeQec" -> field; diff --git a/backend/src/main/java/com/yfd/platform/qgc_eng/zq/service/impl/EngRiverServiceImpl.java b/backend/src/main/java/com/yfd/platform/qgc_eng/zq/service/impl/EngRiverServiceImpl.java index ec537c0b..87d73bd9 100644 --- a/backend/src/main/java/com/yfd/platform/qgc_eng/zq/service/impl/EngRiverServiceImpl.java +++ b/backend/src/main/java/com/yfd/platform/qgc_eng/zq/service/impl/EngRiverServiceImpl.java @@ -400,8 +400,11 @@ public class EngRiverServiceImpl implements EngRiverService { case "hbrvcd" -> "t.HBRVCD"; case "hbrvcdName" -> "t.HBRVCDNAME"; case "bldsttCcode" -> "t.BLDSTTCCODE"; + case "vdid" -> "t.VDID"; case "rzVideo" -> "t.RZVIDEO"; case "speedVideo" -> "t.SPEEDVIDEO"; + case "rzVideoPath" -> "t.RZVIDEOPATH"; + case "speedVideoPath" -> "t.SPEEDVIDEOPATH"; case "baseStepSort" -> "t.BASESTEPSORT"; case "rvcdStepSort" -> "t.RVCDSTEPSORT"; case "rstcdStepSort" -> "t.RSTCDSTEPSORT"; 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 dcad8272..9b6dd008 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 @@ -860,6 +860,16 @@ public class FhHabitatServiceImpl implements FhHabitatService { sortMap.put("vlsr", "t.VLSR"); sortMap.put("dtinType", "t.DTIN_TYPE"); sortMap.put("enable", "t.ENABLE"); + sortMap.put("qxdbhdx", "t.QXDBHDX"); + sortMap.put("qxdbhfw", "t.QXDBHFW"); + sortMap.put("qxdbhcd", "t.QXDBHCD"); + sortMap.put("qxdbhmj", "t.QXDBHMJ"); + sortMap.put("bhhl", "t.BHHL"); + sortMap.put("bhhd", "t.BHHD"); + sortMap.put("bhcs", "t.BHCS"); + sortMap.put("qxdbhfs", "t.QXDBHFS"); + sortMap.put("qxdbhhxcd", "t.QXDBHHXCD"); + sortMap.put("qxdbhwwcd", "t.QXDBHWWCD"); sortMap.put("fhmonitor", "t.FHMONITOR"); sortMap.put("dtfrqcy", "t.DTFRQCY"); sortMap.put("qxdinv", "t.QXDINV"); @@ -870,15 +880,15 @@ public class FhHabitatServiceImpl implements FhHabitatService { sortMap.put("baseStepSort", "t.BASESTEPSORT"); List orderItems = new ArrayList<>(); for (DataSourceRequest.SortDescriptor sort : sorts) { - if (sort == null || !Boolean.TRUE.equals(sort.getNeedSortFlag())) { + if (sort == null || StrUtil.isBlank(sort.getField())) { continue; } String column = sortMap.get(sort.getField()); if (column == null) { continue; } - String direction = "desc".equalsIgnoreCase(sort.getDir()) ? "DESC" : "ASC"; - orderItems.add(column + " " + direction); + 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.BASESTEPSORT ASC, t.RVCDSTEPSORT ASC, t.RSTCDSTEPSORT ASC, t.SITESTEPSORT ASC, t.STCD ASC"; @@ -1028,6 +1038,16 @@ public class FhHabitatServiceImpl implements FhHabitatService { sortMap.put("esstdt", "fh.ATTM"); sortMap.put("dtin", "fh.DTIN"); sortMap.put("enable", "fh.USFL"); + sortMap.put("qxdbhdx", "fh.BHDX"); + sortMap.put("qxdbhfw", "fh.BHFW"); + sortMap.put("qxdbhcd", "fh.BHCD"); + sortMap.put("qxdbhmj", "fh.BHMJ"); + sortMap.put("bhhl", "fh.BHHL"); + sortMap.put("bhhd", "fh.BHHD"); + sortMap.put("bhcs", "fh.BHCS"); + sortMap.put("qxdbhfs", "fh.BHFS"); + sortMap.put("qxdbhhxcd", "fh.BHHXCD"); + sortMap.put("qxdbhwwcd", "fh.BHWWCD"); sortMap.put("dtfrqcy", "fh.DTFRQCY"); sortMap.put("qxdinv", "fh.INV"); sortMap.put("baseStepSort", "hb.ORDER_INDEX"); @@ -1036,15 +1056,15 @@ public class FhHabitatServiceImpl implements FhHabitatService { sortMap.put("rvcdStepSort", "along.ORDER_INDEX"); List orderItems = new ArrayList<>(); for (DataSourceRequest.SortDescriptor sort : sorts) { - if (sort == null || !Boolean.TRUE.equals(sort.getNeedSortFlag())) { + if (sort == null || StrUtil.isBlank(sort.getField())) { continue; } String column = sortMap.get(sort.getField()); if (column == null) { continue; } - String direction = "desc".equalsIgnoreCase(sort.getDir()) ? "DESC" : "ASC"; - orderItems.add(column + " " + direction); + String direction = "desc".equalsIgnoreCase(sort.getDir()) || "des".equalsIgnoreCase(sort.getDir()) ? "DESC" : "ASC"; + orderItems.add(column + " " + direction + " NULLS LAST"); } if (orderItems.isEmpty()) { return " ORDER BY hb.ORDER_INDEX ASC, along.ORDER_INDEX ASC, rstAlong.SORT ASC, fh.ORDER_INDEX ASC, fh.STCD ASC"; @@ -1355,6 +1375,8 @@ public class FhHabitatServiceImpl implements FhHabitatService { case "bhhd" -> "t.bhhd"; case "bhcs" -> "t.bhcs"; case "qxdbhfs" -> "t.qxdbhfs"; + case "qxdbhhxcd" -> "t.qxdbhhxcd"; + case "qxdbhwwcd" -> "t.qxdbhwwcd"; case "ststdt" -> "t.ststdt"; case "usfl", "enable" -> "t.usfl"; case "baseStepSort" -> "t.baseStepSort"; @@ -1379,7 +1401,7 @@ public class FhHabitatServiceImpl implements FhHabitatService { continue; } String dir = ("desc".equalsIgnoreCase(sortDescriptor.getDir()) || "des".equalsIgnoreCase(sortDescriptor.getDir())) ? "DESC" : "ASC"; - orders.add(column + " " + dir); + orders.add(column + " " + dir + " NULLS LAST"); } if (orders.isEmpty()) { return " ORDER BY t.baseStepSort ASC, t.rvcdStepSort ASC, t.rstcdStepSort ASC, t.siteStepSort ASC, t.stcd ASC"; 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 79790dd2..db09544e 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 @@ -675,6 +675,8 @@ public class FpRunServiceImpl implements FpRunService { case "speed" -> "t.SPEED"; case "firstimgurl" -> "t.FIRSTIMGURL"; case "videourl" -> "t.VIDEOURL"; + case "vdpth" -> "t.VDPTH"; + case "picpth" -> "t.PICPTH"; case "fwet" -> "t.FWET"; case "fid" -> "t.FID"; case "upFcnt" -> "t.UPFCNT"; @@ -1085,7 +1087,10 @@ public class FpRunServiceImpl implements FpRunService { case "fcnt" -> "t.FCNT"; case "fsz" -> "t.FSZ"; case "fid" -> "t.FID"; + case "picpth" -> "t.PICPTH"; + case "vdpth" -> "t.VDPTH"; case "direction" -> "t.DIRECTION"; + case "directionName" -> "t.DIRECTIONNAME"; case "mway" -> "t.MWAY"; case "strdt" -> "t.STRDT"; case "enddt" -> "t.ENDDT"; 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 f3d3976f..ee55fc10 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 @@ -394,6 +394,10 @@ public class VpConstructionServiceImpl implements VpConstructionService { columnMap.put("bldsttName", "CASE WHEN NVL(vp.BLDSTT_CODE, 0) = 2 THEN '已建' WHEN NVL(vp.BLDSTT_CODE, 0) = 1 THEN '在建' ELSE '未建/规划' END"); columnMap.put("ststdt", "vp.SWDT"); columnMap.put("jcdt", "vp.JCDT"); + columnMap.put("esstdt", "vp.ESSTDT"); + columnMap.put("logo", "vp.LOGO"); + columnMap.put("introduce", "vp.INTRODUCE"); + columnMap.put("inffile", "vp.INFFILE"); return columnMap.get(field); } @@ -402,35 +406,25 @@ public class VpConstructionServiceImpl implements VpConstructionService { return " ORDER BY NVL(hb.ORDER_INDEX, 999999) ASC, NVL(eng.ORDER_INDEX, 999999) ASC, " + "NVL(vp.ORDER_INDEX, 999999) ASC, vp.STCD ASC"; } - Map sortMap = new HashMap<>(); - sortMap.put("stcd", "vp.STCD"); - sortMap.put("stnm", "vp.STNM"); - sortMap.put("sttpCode", "vp.STTP"); - sortMap.put("sttpName", "sttp.STTP_NAME"); - sortMap.put("baseId", "vp.BASE_ID"); - sortMap.put("baseName", "hb.BASENAME"); - sortMap.put("ennm", "eng.ENNM"); - sortMap.put("dtin", "vp.DTIN"); - sortMap.put("dtinName", "CASE WHEN NVL(vp.DTIN, 0) = 1 THEN '已接入' ELSE '未接入' END"); - sortMap.put("bldstt", "vp.BLDSTT_CODE"); - sortMap.put("bldsttName", "CASE WHEN NVL(vp.BLDSTT_CODE, 0) = 2 THEN '已建' WHEN NVL(vp.BLDSTT_CODE, 0) = 1 THEN '在建' ELSE '未建/规划' END"); - sortMap.put("ststdt", "vp.SWDT"); - sortMap.put("jcdt", "vp.JCDT"); - sortMap.put("baseStepSort", "hb.ORDER_INDEX"); - sortMap.put("rstcdStepSort", "eng.ORDER_INDEX"); - sortMap.put("siteStepSort", "vp.ORDER_INDEX"); - List orderItems = new ArrayList<>(); for (DataSourceRequest.SortDescriptor sort : sorts) { if (sort == null || StrUtil.isBlank(sort.getField())) { continue; } - String column = sortMap.get(sort.getField()); + String column = mapColumn(sort.getField()); + if (StrUtil.isBlank(column)) { + column = switch (sort.getField()) { + case "baseStepSort" -> "hb.ORDER_INDEX"; + case "rstcdStepSort" -> "eng.ORDER_INDEX"; + case "siteStepSort" -> "vp.ORDER_INDEX"; + default -> null; + }; + } if (StrUtil.isBlank(column)) { continue; } - String direction = "desc".equalsIgnoreCase(sort.getDir()) ? "DESC" : "ASC"; - orderItems.add(column + " " + direction); + String direction = "desc".equalsIgnoreCase(sort.getDir()) || "des".equalsIgnoreCase(sort.getDir()) ? "DESC" : "ASC"; + orderItems.add(column + " " + direction + " NULLS LAST"); } if (orderItems.isEmpty()) { return " ORDER BY NVL(hb.ORDER_INDEX, 999999) ASC, NVL(eng.ORDER_INDEX, 999999) ASC, " @@ -770,15 +764,44 @@ public class VpConstructionServiceImpl implements VpConstructionService { columnMap.put("sttp", "vp.STTP"); columnMap.put("sttpCode", "vp.STTP"); columnMap.put("sttpName", "sttp.STTP_NAME"); + columnMap.put("sttpFullPath", "sttp.FULL_PATH"); + columnMap.put("sttpTreeLevel", "sttp.TREE_LEVEL"); columnMap.put("baseId", "vp.BASE_ID"); columnMap.put("baseName", "hb.BASENAME"); columnMap.put("rstcd", "vp.RSTCD"); columnMap.put("ennm", "eng.ENNM"); columnMap.put("hbrvcd", "vp.HBRVCD"); + columnMap.put("hbrvcdName", "hbrv.HBRVNM"); columnMap.put("rvcd", "eng.REACHCD"); + columnMap.put("rvcdName", "rv.RVNM"); + columnMap.put("lgtd", "vp.LGTD"); + columnMap.put("lttd", "vp.LTTD"); + columnMap.put("stlc", "vp.STLC"); columnMap.put("dtin", "vp.DTIN"); + columnMap.put("dtinName", "CASE WHEN NVL(vp.DTIN, 0) = 1 THEN '已接入' ELSE '未接入' END"); + columnMap.put("dtinTm", "vp.DTIN_TM"); columnMap.put("bldstt", "vp.BLPRD"); columnMap.put("bldsttCcode", "vp.BLDSTT_CODE"); + columnMap.put("bldsttName", "CASE WHEN vp.BLDSTT_CODE IN (1, 10, 11) THEN '已建' WHEN vp.BLDSTT_CODE IN (2, 7, 8) THEN '在建' ELSE '未建/规划' END"); + columnMap.put("bldsttCcodeName", "CASE WHEN vp.BLDSTT_CODE IN (1, 10, 11) THEN '已建' WHEN vp.BLDSTT_CODE IN (2, 7, 8) THEN '在建' ELSE '未建/规划' END"); + columnMap.put("stdsdt", "vp.STDSDT"); + columnMap.put("ststdt", "vp.STDSDT"); + columnMap.put("pststdt", "vp.PSTSTDT"); + columnMap.put("pesstdt", "vp.PESSTDT"); + columnMap.put("esstdt", "vp.ESSTDT"); + columnMap.put("jcdt", "vp.JCDT"); + columnMap.put("logo", "vp.LOGO"); + columnMap.put("introduce", "vp.INTRODUCE"); + columnMap.put("inffile", "vp.INFFILE"); + columnMap.put("inv", "vp.INV"); + columnMap.put("aptl", "vp.APTL"); + columnMap.put("area", "vp.AREA"); + columnMap.put("runState", "vp.RUN_STATE"); + columnMap.put("runStateName", "CASE NVL(vp.RUN_STATE, -1) WHEN 1 THEN '运行' WHEN 0 THEN '未运行' ELSE NULL END"); + columnMap.put("baseStepSort", "hb.ORDER_INDEX"); + columnMap.put("rvcdStepSort", "hbrv.ORDER_INDEX"); + columnMap.put("rstcdStepSort", "eng.ORDER_INDEX"); + columnMap.put("siteStepSort", "vp.ORDER_INDEX"); return columnMap.get(field); } @@ -834,35 +857,17 @@ public class VpConstructionServiceImpl implements VpConstructionService { return " ORDER BY NVL(eng.ORDER_INDEX, 999999) ASC, NVL(eng.ORDER_INDEX, 999999) ASC, " + "NVL(vp.ORDER_INDEX, 999999) ASC, vp.STCD ASC"; } - Map sortMap = new HashMap<>(); - sortMap.put("stcd", "vp.STCD"); - sortMap.put("stnm", "vp.STNM"); - sortMap.put("sttp", "vp.STTP"); - sortMap.put("sttpCode", "vp.STTP"); - sortMap.put("sttpName", "sttp.STTP_NAME"); - sortMap.put("baseId", "vp.BASE_ID"); - sortMap.put("baseName", "hb.BASENAME"); - sortMap.put("rstcd", "vp.RSTCD"); - sortMap.put("ennm", "eng.ENNM"); - sortMap.put("dtin", "vp.DTIN"); - sortMap.put("bldstt", "vp.BLPRD"); - sortMap.put("bldsttCcode", "vp.BLDSTT_CODE"); - sortMap.put("rvcdStepSort", "eng.ORDER_INDEX"); - sortMap.put("rstcdStepSort", "eng.ORDER_INDEX"); - sortMap.put("siteStepSort", "vp.ORDER_INDEX"); - sortMap.put("baseStepSort", "hb.ORDER_INDEX"); - List orderItems = new ArrayList<>(); for (DataSourceRequest.SortDescriptor sort : sorts) { if (sort == null || StrUtil.isBlank(sort.getField())) { continue; } - String column = sortMap.get(sort.getField()); + String column = mapVmsstbprptColumn(sort.getField()); if (StrUtil.isBlank(column)) { continue; } - String direction = "desc".equalsIgnoreCase(sort.getDir()) ? "DESC" : "ASC"; - orderItems.add(column + " " + direction); + String direction = "desc".equalsIgnoreCase(sort.getDir()) || "des".equalsIgnoreCase(sort.getDir()) ? "DESC" : "ASC"; + orderItems.add(column + " " + direction + " NULLS LAST"); } if (orderItems.isEmpty()) { return " ORDER BY NVL(eng.ORDER_INDEX, 999999) ASC, NVL(eng.ORDER_INDEX, 999999) ASC, " diff --git a/backend/src/main/java/com/yfd/platform/qgc_env/vd/service/impl/VdMonitorServiceImpl.java b/backend/src/main/java/com/yfd/platform/qgc_env/vd/service/impl/VdMonitorServiceImpl.java index b69a292e..f5113e3a 100644 --- a/backend/src/main/java/com/yfd/platform/qgc_env/vd/service/impl/VdMonitorServiceImpl.java +++ b/backend/src/main/java/com/yfd/platform/qgc_env/vd/service/impl/VdMonitorServiceImpl.java @@ -844,6 +844,13 @@ public class VdMonitorServiceImpl implements VdMonitorService { case "sttpFullPath" -> "t.sttpFullPath"; case "stcd" -> "t.stcd"; case "stnm" -> "t.stnm"; + case "mntp" -> "t.mntp"; + case "stlc" -> "t.stlc"; + case "lgtd" -> "t.lgtd"; + case "lttd" -> "t.lttd"; + case "elev" -> "t.elev"; + case "jcdt" -> "t.jcdt"; + case "wddt" -> "t.wddt"; case "rstcd" -> "t.rstcd"; case "ennm" -> "t.ennm"; case "fhstcd" -> "t.fhstcd"; @@ -853,14 +860,28 @@ public class VdMonitorServiceImpl implements VdMonitorService { case "baseId" -> "t.baseId"; case "baseName" -> "t.baseName"; case "hbrvcd" -> "t.hbrvcd"; + case "hbrvcdName" -> "t.hbrvcdName"; + case "dtinName" -> "t.dtinName"; + case "bldsttCcode" -> "t.bldsttCcode"; + case "bldsttCcodeName" -> "t.bldsttCcodeName"; + case "stindx" -> "t.stindx"; + case "introduce" -> "t.introduce"; + case "logo" -> "t.logo"; + case "inffile" -> "t.inffile"; + case "dtfrqcy" -> "t.dtfrqcy"; + case "remark" -> "t.remark"; + case "vlsr" -> "t.vlsr"; + case "vlsrTm" -> "t.vlsrTm"; case "rvcd" -> "t.rvcd"; case "addvcd" -> "t.addvcd"; case "dtin" -> "t.dtin"; case "usfl" -> "t.usfl"; - case "bldsttCcode" -> "t.bldsttCcode"; case "url" -> "t.url"; case "playWay" -> "t.playWay"; case "sourceTable" -> "t.sourceTable"; + case "baseStepSort" -> "t.baseStepSort"; + case "rstcdStepSort" -> "t.rstcdStepSort"; + case "siteStepSort" -> "t.siteStepSort"; default -> null; }; } @@ -937,8 +958,8 @@ public class VdMonitorServiceImpl implements VdMonitorService { if (StrUtil.isBlank(column)) { continue; } - String direction = "desc".equalsIgnoreCase(sort.getDir()) ? "DESC" : "ASC"; - orderItems.add(column + " " + direction); + 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.baseStepSort ASC, t.rstcdStepSort ASC, t.siteStepSort ASC, t.stcd ASC"; 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 72790e38..2ebee4d2 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 @@ -1034,6 +1034,7 @@ public class EnvWqDataServiceImpl implements EnvWqDataService { case "stcd" -> "T.STCD"; case "tm" -> "T.TM"; case "wqgrd" -> "T.WQGRD"; + case "wqgrdName" -> "T.WQGRD_NAME"; case "ph" -> "T.PH"; case "dox" -> "T.DOX"; case "codmn" -> "T.CODMN"; @@ -1070,14 +1071,23 @@ public class EnvWqDataServiceImpl implements EnvWqDataService { case "tu" -> "T.TU"; case "cyano" -> "T.CYANO"; case "sfdb" -> "T.SFDB"; + case "sfdbName" -> "T.SFDB_NAME"; case "wtmp" -> "T.WTMP"; case "dtinType" -> "T.DTIN_TYPE"; case "tod" -> "T.TOD"; case "wqSfdbhnYs" -> "T.WQ_SFDBHN_YS"; + case "wqSfdbhnYsName" -> "T.WQ_SFDBHN_YS_NAME"; + case "rvcdName" -> "T.RVCD_NAME"; + case "addvcdName" -> "T.ADDVCD_NAME"; + case "qi" -> "T.QI"; + case "qo" -> "T.QO"; case "siteStepSort" -> "T.SITESTEPSORT"; case "baseStepSort" -> "T.BASESTEPSORT"; + case "rvcdStepSort" -> "T.RVCDSTEPSORT"; case "rstcdStepSort" -> "T.RSTCDSTEPSORT"; case "sttpCode" -> "T.STTP_CODE"; + case "minVal" -> "T.MINVAL"; + case "maxVal" -> "T.MAXVAL"; default -> null; }; } @@ -2107,6 +2117,8 @@ public class EnvWqDataServiceImpl implements EnvWqDataService { case "coenvwState", "dtin", "dtinType" -> "CASE WHEN NVL(eng.DTIN, 0) = 1 THEN 1 ELSE 0 END"; case "sttpCode" -> "'ENG'"; case "stcd", "rstcd" -> "eng.STCD"; + case "stCode" -> "eng.STCD"; + case "stName" -> "eng.ENNM"; case "dvtp" -> "eng.DVTP"; case "baseStepSort" -> "hb.ORDER_INDEX"; case "hbrvcd" -> "eng.HBRVCD"; @@ -2125,6 +2137,8 @@ public class EnvWqDataServiceImpl implements EnvWqDataService { case "sttpCode" -> "wq.STTP"; case "stcd" -> "wq.STCD"; case "rstcd" -> "wq.RSTCD"; + case "stCode" -> "wq.STCD"; + case "stName" -> "wq.STNM"; case "dvtp" -> "eng.DVTP"; case "baseStepSort" -> "hb.ORDER_INDEX"; case "hbrvcd" -> "eng.HBRVCD"; @@ -2150,7 +2164,7 @@ public class EnvWqDataServiceImpl implements EnvWqDataService { continue; } String dir = ("desc".equalsIgnoreCase(sortDescriptor.getDir()) || "des".equalsIgnoreCase(sortDescriptor.getDir())) ? "DESC" : "ASC"; - orderColumns.add(column + " " + dir); + orderColumns.add(column + " " + dir + " NULLS LAST"); } } if (orderColumns.isEmpty()) { @@ -2287,6 +2301,45 @@ public class EnvWqDataServiceImpl implements EnvWqDataService { case "fhstcd" -> "t.FHSTCD"; case "baseId" -> "t.BASE_ID"; case "dtin" -> "t.DTIN"; + case "tm" -> "t.TM"; + case "sttp" -> "t.STTP"; + case "lgtd" -> "t.LGTD"; + case "lttd" -> "t.LTTD"; + case "elev" -> "t.ELEV"; + case "stlc" -> "t.STLC"; + case "wwqtg" -> "t.WWQTG"; + case "wqtype" -> "t.WQTYPE"; + case "jcdt" -> "t.JCDT"; + case "wddt" -> "t.WDDT"; + case "bldsttCode" -> "t.BLDSTT_CODE"; + case "introduce" -> "t.INTRODUCE"; + case "logo" -> "t.LOGO"; + case "inffile" -> "t.INFFILE"; + case "usfl" -> "t.USFL"; + case "dtinSrc" -> "t.DTIN_SRC"; + case "dtinTm" -> "t.DTIN_TM"; + case "stindx" -> "t.STINDX"; + case "orderIndex" -> "t.ORDER_INDEX"; + case "rstcd" -> "t.RSTCD"; + case "ennm" -> "eng.ENNM"; + case "baseName" -> "hb.BASENAME"; + case "hbrvcd" -> "eng.HBRVCD"; + case "hbrvcdName" -> "hbrv.HBRVNM"; + case "rvcd" -> "eng.RVCD"; + case "rvcdName" -> "rv.RVNM"; + case "addvcd" -> "eng.ADDVCD"; + case "addvcdName" -> "addv.ADDVNM"; + case "ispro" -> "t.ISPRO"; + case "dtfrqcy" -> "t.DTFRQCY"; + case "remark" -> "t.REMARK"; + case "vlsr" -> "t.VLSR"; + case "vlsrTm" -> "t.VLSR_TM"; + case "recordUser" -> "t.RECORD_USER"; + case "recordTime" -> "t.RECORD_TIME"; + case "modifyUser" -> "t.MODIFY_USER"; + case "modifyTime" -> "t.MODIFY_TIME"; + case "deleteUser" -> "t.DELETE_USER"; + case "deleteTime" -> "t.DELETE_TIME"; default -> null; }; } @@ -2441,25 +2494,7 @@ public class EnvWqDataServiceImpl implements EnvWqDataService { if (sortDescriptor == null || StrUtil.isBlank(sortDescriptor.getField())) { continue; } - String column = switch (sortDescriptor.getField()) { - case "stcd" -> "t.STCD"; - case "stnm" -> "t.STNM"; - case "tm" -> "t.TM"; - case "sttp" -> "t.STTP"; - case "jcdt" -> "t.JCDT"; - case "rstcd" -> "t.RSTCD"; - case "ennm" -> "eng.ENNM"; - case "baseId" -> "eng.BASE_ID"; - case "baseName" -> "hb.BASENAME"; - case "hbrvcd" -> "eng.HBRVCD"; - case "rvcd" -> "eng.RVCD"; - case "fhstcd" -> "t.FHSTCD"; - case "mway" -> "t.MWAY"; - case "dtin" -> "t.DTIN"; - case "dtinType" -> "t.DTIN_TYPE"; - case "orderIndex" -> "t.ORDER_INDEX"; - default -> null; - }; + String column = mapMsstbprptColumn(sortDescriptor.getField()); if (StrUtil.isBlank(column)) { continue; } @@ -2519,7 +2554,8 @@ public class EnvWqDataServiceImpl implements EnvWqDataService { sql.append(", "); } sql.append(column).append(" ") - .append("desc".equalsIgnoreCase(sortDescriptor.getDir()) ? "DESC" : "ASC"); + .append(("desc".equalsIgnoreCase(sortDescriptor.getDir()) || "des".equalsIgnoreCase(sortDescriptor.getDir())) ? "DESC" : "ASC") + .append(" NULLS LAST"); appended = true; } return appended ? sql.toString() : ""; 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 d3946de4..1a67c0b7 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 @@ -1660,6 +1660,7 @@ public class SdWtMonitorServiceImpl implements SdWtMonitorService { case "stnm" -> "t.STNM"; case "baseId" -> "t.BASEID"; case "dt" -> "t.DT"; + case "monthInt", "month" -> "EXTRACT(MONTH FROM t.DT)"; case "wt", "actualTemp" -> "t.WT"; case "sttp" -> "t.STTP"; case "sumVal" -> "t.SUMVAL"; @@ -1873,7 +1874,18 @@ public class SdWtMonitorServiceImpl implements SdWtMonitorService { case "sttpName" -> "t.STTP_NAME"; case "description" -> "t.DESCRIPTION"; case "parentId" -> "t.PARENT_ID"; -// case "enable" -> "t.ENABLED"; + case "displayRecordUser" -> "t.DISPLAY_RECORD_USER"; + case "isolateType" -> "t.ISOLATE_TYPE"; + case "stbprpCnt" -> "t.STBPRP_CNT"; + case "recordUserName" -> "t.RECORD_USER_NAME"; + case "modifyUserName" -> "t.MODIFY_USER_NAME"; + case "displayDepartment" -> "t.DISPLAY_DEPARTMENT"; + case "enable" -> "t.ENABLE"; + case "filterContent" -> "t.FILTER_CONTENT"; + case "isTempStorage" -> "t.IS_TEMP_STORAGE"; + case "departmentId" -> "t.DEPARTMENT_ID"; + case "systemId" -> "t.SYSTEM_ID"; + case "platformId" -> "t.PLATFORM_ID"; case "treeLevel" -> "t.TREE_LEVEL"; case "hasChildren" -> "t.HAS_CHILDREN"; case "fullPath" -> "t.FULL_PATH"; @@ -1912,23 +1924,55 @@ public class SdWtMonitorServiceImpl implements SdWtMonitorService { if (sortList != null) { for (DataSourceRequest.SortDescriptor sortDescriptor : sortList) { String field = sortDescriptor.getField(); - String dir = "desc".equalsIgnoreCase(sortDescriptor.getDir()) ? "DESC" : "ASC"; + String dir = "desc".equalsIgnoreCase(sortDescriptor.getDir()) || "des".equalsIgnoreCase(sortDescriptor.getDir()) ? "DESC" : "ASC"; if ("baseStepSort".equals(field)) { - orderColumns.add("NVL(baseStepSort, 999999) " + dir); + orderColumns.add("NVL(baseStepSort, 999999) " + dir + " NULLS LAST"); } else if ("rvcdStepSort".equals(field)) { -// orderColumns.add("NVL(rvcdStepSort, 999999) " + dir); - } else if ("hbrvcd".equals(field)) { - orderColumns.add("NVL(hbrvcd, '~') " + dir); + orderColumns.add("NVL(rvcdStepSort, 999999) " + dir + " NULLS LAST"); } else if ("rstcdStepSort".equals(field)) { -// orderColumns.add("NVL(rstcdStepSort, 999999) " + dir); + orderColumns.add("NVL(rstcdStepSort, 999999) " + dir + " NULLS LAST"); } else if ("siteStepSort".equals(field)) { - orderColumns.add("NVL(siteStepSort, 999999) " + dir); + orderColumns.add("NVL(siteStepSort, 999999) " + dir + " NULLS LAST"); + } else if ("baseId".equals(field)) { + orderColumns.add("NVL(baseId, '~') " + dir + " NULLS LAST"); + } else if ("hbrvcd".equals(field)) { + orderColumns.add("NVL(hbrvcd, '~') " + dir + " NULLS LAST"); + } else if ("sttpCode".equals(field)) { + orderColumns.add("NVL(sttpCode, '~') " + dir + " NULLS LAST"); + } else if ("sttpName".equals(field)) { + orderColumns.add("NVL(sttpName, '~') " + dir + " NULLS LAST"); + } else if ("sttpFullPath".equals(field)) { + orderColumns.add("NVL(sttpFullPath, '~') " + dir + " NULLS LAST"); } else if ("stnm".equals(field)) { - orderColumns.add("NVL(stnm, '~') " + dir); + orderColumns.add("NVL(stnm, '~') " + dir + " NULLS LAST"); } else if ("ennm".equals(field)) { - orderColumns.add("NVL(ennm, '~') " + dir); + orderColumns.add("NVL(ennm, '~') " + dir + " NULLS LAST"); } else if ("stcd".equals(field)) { - orderColumns.add("NVL(stcd, '~') " + dir); + orderColumns.add("NVL(stcd, '~') " + dir + " NULLS LAST"); + } else if ("fhstcd".equals(field)) { + orderColumns.add("NVL(fhstcd, '~') " + dir + " NULLS LAST"); + } else if ("rstcd".equals(field)) { + orderColumns.add("NVL(rstcd, '~') " + dir + " NULLS LAST"); + } else if ("stCode".equals(field)) { + orderColumns.add("NVL(stCode, '~') " + dir + " NULLS LAST"); + } else if ("stName".equals(field)) { + orderColumns.add("NVL(stName, '~') " + dir + " NULLS LAST"); + } else if ("dvtp".equals(field)) { + orderColumns.add("NVL(dvtp, '~') " + dir + " NULLS LAST"); + } else if ("jcdt".equals(field)) { + orderColumns.add("jcdt " + dir + " NULLS LAST"); + } else if ("stindx".equals(field)) { + orderColumns.add("NVL(stindx, '~') " + dir + " NULLS LAST"); + } else if ("coenvwState".equals(field)) { + orderColumns.add("NVL(coenvwState, -1) " + dir + " NULLS LAST"); + } else if ("bldsttCcode".equals(field)) { + orderColumns.add("NVL(bldsttCcode, '~') " + dir + " NULLS LAST"); + } else if ("bldsttCcodeName".equals(field)) { + orderColumns.add("NVL(bldsttCcodeName, '~') " + dir + " NULLS LAST"); + } else if ("dtin".equals(field)) { + orderColumns.add("NVL(dtin, -1) " + dir + " NULLS LAST"); + } else if ("dtinName".equals(field)) { + orderColumns.add("CASE WHEN NVL(dtin, 0) = 1 THEN '已接入' ELSE '未接入' END " + dir + " NULLS LAST"); } } } 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 21e5cd7e..af6eb22c 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 @@ -552,8 +552,11 @@ public class ZqMonitorServiceImpl implements ZqMonitorService { case "hbrvcd" -> "t.HBRVCD"; case "hbrvcdName" -> "t.HBRVCDNAME"; case "bldsttCcode" -> "t.BLDSTTCCODE"; + case "vdid" -> "t.VDID"; case "rzVideo" -> "t.RZVIDEO"; case "speedVideo" -> "t.SPEEDVIDEO"; + case "rzVideoPath" -> "t.RZVIDEOPATH"; + case "speedVideoPath" -> "t.SPEEDVIDEOPATH"; case "baseStepSort" -> "t.BASESTEPSORT"; case "rvcdStepSort" -> "t.RVCDSTEPSORT"; case "rstcdStepSort" -> "t.RSTCDSTEPSORT"; @@ -916,18 +919,51 @@ public class ZqMonitorServiceImpl implements ZqMonitorService { case "stnm" -> "t.STNM"; case "tm" -> "t.TM"; case "sttp", "sttpCode" -> "t.STTP"; + case "lgtd" -> "t.LGTD"; + case "lttd" -> "t.LTTD"; + case "elev" -> "t.ELEV"; + case "stlc" -> "t.STLC"; case "jcdt" -> "t.JCDT"; + case "wddt" -> "t.WDDT"; + case "bldsttCode", "bldsttCcode" -> "t.BLDSTT_CODE"; + case "bldsttCcodeName" -> "CASE WHEN t.BLDSTT_CODE IN ('1', '10', '11') THEN '已建' WHEN t.BLDSTT_CODE IN ('2', '7', '8') THEN '在建' ELSE '未建/规划' END"; + case "introduce" -> "t.INTRODUCE"; + case "logo" -> "t.LOGO"; + case "inffile" -> "t.INFFILE"; + case "usfl" -> "t.USFL"; + case "dtin" -> "t.DTIN"; + case "dtinSrc" -> "t.DTIN_SRC"; + case "dtinType" -> "t.DTIN_TYPE"; + case "dtinTm" -> "t.DTIN_TM"; + case "mway" -> "t.MWAY"; + case "mwayName" -> "CASE NVL(t.MWAY, 0) WHEN 1 THEN '人工' WHEN 2 THEN '自动' ELSE '未知' END"; + case "stindx" -> "t.STINDX"; + case "orderIndex" -> "t.ORDER_INDEX"; + case "dmstcd" -> "t.DMSTCD"; case "rstcd" -> "t.RSTCD"; case "ennm" -> "eng.ENNM"; case "baseId" -> "eng.BASE_ID"; case "baseName" -> "hb.BASENAME"; case "hbrvcd" -> "eng.HBRVCD"; + case "hbrvcdName" -> "hbrv.HBRVNM"; case "rvcd" -> "eng.RVCD"; + case "rvcdName" -> "rv.RVNM"; + case "addvcd" -> "eng.ADDVCD"; + case "addvcdName" -> "addv.ADDVNM"; case "fhstcd" -> "t.FHSTCD"; - case "mway" -> "t.MWAY"; - case "dtin" -> "t.DTIN"; - case "dtinType" -> "t.DTIN_TYPE"; - case "orderIndex" -> "t.ORDER_INDEX"; + case "ispro" -> "t.ISPRO"; + case "project" -> "t.PROJECT"; + case "dtfrqcy" -> "t.DTFRQCY"; + case "remark" -> "t.REMARK"; + case "vlsr" -> "t.VLSR"; + case "vlsrTm" -> "t.VLSR_TM"; + case "recordUser" -> "t.RECORD_USER"; + case "recordTime" -> "t.RECORD_TIME"; + case "modifyUser" -> "t.MODIFY_USER"; + case "modifyTime" -> "t.MODIFY_TIME"; + case "isDeleted" -> "t.IS_DELETED"; + case "deleteUser" -> "t.DELETE_USER"; + case "deleteTime" -> "t.DELETE_TIME"; default -> null; }; if (StrUtil.isBlank(column)) { From ddde939ad7ecf0b8e06efc70b2398fd715b5079b Mon Sep 17 00:00:00 2001 From: tangwei Date: Thu, 11 Jun 2026 16:41:47 +0800 Subject: [PATCH 12/34] =?UTF-8?q?fix:=20=E4=BC=98=E5=8C=96=E6=89=B9?= =?UTF-8?q?=E5=A4=8D=E6=96=87=E4=BB=B6=E5=88=97=E8=A1=A8=E6=8E=92=E5=BA=8F?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../service/impl/SdEngInfoBHServiceImpl.java | 64 +++++++++++-------- 1 file changed, 39 insertions(+), 25 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 fea2bf6e..0ee131b5 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 @@ -1139,20 +1139,45 @@ public class SdEngInfoBHServiceImpl extends ServiceImpl "e.STCD"; - case "hydropowerStation" -> "e.ENNM"; - case "baseId", "baseid" -> "e.BASEID"; - case "hbrvcd" -> "e.HBRVCD"; - case "envMonitoringRequire" -> "e.ENV_MONITORING_REQUIRE"; - case "ecologicalFlow" -> "e.ECOLOGICAL_FLOW"; - case "approvalFileNo" -> "e.APPROVAL_FILE_NO"; - case "approvalFileTitle" -> "e.APPROVAL_FILE_TITLE"; - case "fishPassageMeasures" -> "e.FISH_PASSAGE_MEASURES"; - case "bldsttCcode" -> "s.BLDSTT_CODE"; - case "bldsttCName" -> "CASE WHEN s.BLDSTT_CODE = 0 OR s.BLDSTT_CODE IS NULL THEN '未建/规划' WHEN s.BLDSTT_CODE = 1 THEN '在建' WHEN s.BLDSTT_CODE = 2 THEN '已建' ELSE NULL END"; + case "id" -> "e.ID"; case "basin" -> "e.BASIN"; case "river" -> "e.RIVER"; + case "hydropowerStation" -> "e.ENNM"; + case "approvalFileNo" -> "e.APPROVAL_FILE_NO"; + case "approvalFileTitle" -> "e.APPROVAL_FILE_TITLE"; + case "fileName" -> "e.FILE_NAME"; + case "flpath" -> "e.FLPATH"; + case "ecologicalFlow" -> "e.ECOLOGICAL_FLOW"; + case "waterEnvProtection" -> "e.WATER_ENV_PROTECTION"; + case "coldWaterMitigation" -> "e.COLD_WATER_MITIGATION"; + case "habitatProtection" -> "e.HABITAT_PROTECTION"; + case "fishPassageMeasures" -> "e.FISH_PASSAGE_MEASURES"; + case "fishStocking" -> "e.FISH_STOCKING"; + case "terrestrialEcoSoilCons" -> "e.TERRESTRIAL_ECO_SOIL_CONS"; + case "rarePlantProtection" -> "e.RARE_PLANT_PROTECTION"; + case "animalRescue" -> "e.ANIMAL_RESCUE"; + case "resettlementMeasures" -> "e.RESETTLEMENT_MEASURES"; + case "constructionPollutionCtrl" -> "e.CONSTRUCTION_POLLUTION_CTRL"; + case "groundwaterGeoProtect" -> "e.GROUNDWATER_GEO_PROTECT"; + case "scenicAreaProtection" -> "e.SCENIC_AREA_PROTECTION"; + case "envMonitoringRequire" -> "e.ENV_MONITORING_REQUIRE"; + case "baseId", "baseid" -> "e.BASEID"; + case "hbrvcd" -> "e.HBRVCD"; + case "eiaStcd" -> "e.STCD"; + case "stcd" -> "s.STCD"; case "stnm" -> "s.ENNM"; + case "sttp" -> "sttp.ID"; + case "sttpName" -> "sttp.STTP_NAME"; + case "bldsttCcode" -> "s.BLDSTT_CODE"; + case "bldsttCName" -> "CASE WHEN s.BLDSTT_CODE = 0 OR s.BLDSTT_CODE IS NULL THEN '未建/规划' WHEN s.BLDSTT_CODE = 1 THEN '在建' WHEN s.BLDSTT_CODE = 2 THEN '已建' ELSE NULL END"; + case "bldstt" -> "s.BLDSTT"; + case "lgtd" -> "s.LGTD"; + case "lttd" -> "s.LTTD"; + case "flid" -> "e.FLPATH"; + case "baseStepSort" -> "baseStepSort"; + case "rvcdStepSort" -> "rvcdStepSort"; + case "rstcdStepSort" -> "rstcdStepSort"; + case "siteStepSort" -> "siteStepSort"; default -> null; }; } @@ -1166,23 +1191,12 @@ public class SdEngInfoBHServiceImpl extends ServiceImpl "baseStepSort"; - case "rvcdStepSort" -> "rvcdStepSort"; - case "rstcdStepSort" -> "rstcdStepSort"; - case "siteStepSort" -> "siteStepSort"; - case "stnm" -> "stnm"; - case "hydropowerStation" -> "e.HYDROPOWER_STATION"; - case "approvalFileNo" -> "e.APPROVAL_FILE_NO"; - case "recordTime" -> "e.RECORD_TIME"; - case "bldsttCcode" -> "s.BLDSTT_CODE"; - default -> null; - }; + String column = mapEiaapprovalColumn(sortDescriptor.getField()); if (!StringUtils.hasText(column)) { continue; } - String dir = "desc".equalsIgnoreCase(sortDescriptor.getDir()) ? "DESC" : "ASC"; - orderItems.add(column + " " + dir); + String dir = "desc".equalsIgnoreCase(sortDescriptor.getDir()) || "des".equalsIgnoreCase(sortDescriptor.getDir()) ? "DESC" : "ASC"; + orderItems.add(column + " " + dir + " NULLS LAST"); } if (orderItems.isEmpty()) { return " ORDER BY baseStepSort ASC, rvcdStepSort ASC, rstcdStepSort ASC, siteStepSort ASC, stnm ASC"; From 23f0c51eddad81f3df39aa8bf98641cb112de319 Mon Sep 17 00:00:00 2001 From: tangwei Date: Thu, 11 Jun 2026 17:13:39 +0800 Subject: [PATCH 13/34] =?UTF-8?q?feat:=20=E9=87=8E=E7=94=9F=E5=8A=A8?= =?UTF-8?q?=E7=89=A9=E7=9B=91=E6=B5=8B=E6=83=85=E5=86=B5?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- ...er.java => VapConstructionController.java} | 8 +- .../qgc_env/vap/entity/vo/VpWvaRunVo.java | 88 +++++ .../vap/service/VpConstructionService.java | 3 + .../impl/VpConstructionServiceImpl.java | 304 ++++++++++++++++++ 4 files changed, 402 insertions(+), 1 deletion(-) rename backend/src/main/java/com/yfd/platform/qgc_env/vap/controller/{VpConstructionController.java => VapConstructionController.java} (86%) create mode 100644 backend/src/main/java/com/yfd/platform/qgc_env/vap/entity/vo/VpWvaRunVo.java diff --git a/backend/src/main/java/com/yfd/platform/qgc_env/vap/controller/VpConstructionController.java b/backend/src/main/java/com/yfd/platform/qgc_env/vap/controller/VapConstructionController.java similarity index 86% rename from backend/src/main/java/com/yfd/platform/qgc_env/vap/controller/VpConstructionController.java rename to backend/src/main/java/com/yfd/platform/qgc_env/vap/controller/VapConstructionController.java index e9f4b4f3..65bc8883 100644 --- a/backend/src/main/java/com/yfd/platform/qgc_env/vap/controller/VpConstructionController.java +++ b/backend/src/main/java/com/yfd/platform/qgc_env/vap/controller/VapConstructionController.java @@ -18,7 +18,7 @@ import org.springframework.web.bind.annotation.RestController; @RequestMapping("/vap") @Tag(name = "珍稀植物园建设及接入情况") @Validated -public class VpConstructionController { +public class VapConstructionController { @Resource private VpConstructionService vpConstructionService; @@ -46,4 +46,10 @@ public class VpConstructionController { public ResponseResult basinVpIntDetail(@RequestBody DataSourceRequest dataSourceRequest) { return ResponseResult.successData(vpConstructionService.basinVpIntDetail(dataSourceRequest)); } + + @PostMapping("/wva/GetKendoListCust") + @Operation(summary = "野生动物监测情况") + public ResponseResult getWvaKendoListCust(@RequestBody DataSourceRequest dataSourceRequest) { + return ResponseResult.successData(vpConstructionService.processWvaKendoList(dataSourceRequest)); + } } diff --git a/backend/src/main/java/com/yfd/platform/qgc_env/vap/entity/vo/VpWvaRunVo.java b/backend/src/main/java/com/yfd/platform/qgc_env/vap/entity/vo/VpWvaRunVo.java new file mode 100644 index 00000000..8858d34c --- /dev/null +++ b/backend/src/main/java/com/yfd/platform/qgc_env/vap/entity/vo/VpWvaRunVo.java @@ -0,0 +1,88 @@ +package com.yfd.platform.qgc_env.vap.entity.vo; + +import com.fasterxml.jackson.annotation.JsonFormat; +import io.swagger.v3.oas.annotations.media.Schema; +import lombok.Data; + +import java.util.Date; + +@Data +@Schema(description = "野生动物监测情况") +public class VpWvaRunVo { + + @Schema(description = "站点编码") + private String stcd; + + @Schema(description = "站点名称") + private String stnm; + + @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss") + @Schema(description = "时间") + private Date tm; + + @Schema(description = "显示名称") + private String flnm; + + @Schema(description = "图片路径") + private String imgPath; + + @Schema(description = "视频路径") + private String flpth; + + @Schema(description = "附件ID") + private String fid; + + @Schema(description = "备注") + private String description; + + @Schema(description = "平台ID") + private String platformId; + + @Schema(description = "部门ID") + private String departmentId; + + @Schema(description = "是否暂存") + private Long isTempStorage; + + @Schema(description = "站类编码") + private String sttpCode; + + @Schema(description = "站类名称") + private String sttpName; + + @Schema(description = "所属基地编码") + private String baseId; + + @Schema(description = "所属基地名称") + private String baseName; + + @Schema(description = "所属电站编码") + private String rstcd; + + @Schema(description = "所属电站名称") + private String ennm; + + @Schema(description = "所属基地流域编码") + private String hbrvcd; + + @Schema(description = "所属基地流域名称") + private String hbrvcdName; + + @Schema(description = "建设状态编码") + private String bldsttCcode; + + @Schema(description = "建设状态名称") + private String bldsttCcodeName; + + @Schema(description = "动物类型") + private String tetp; + + @Schema(description = "救助数量") + private Integer tecnt; + + @Schema(description = "放生地点") + private String stlc; + + @Schema(description = "原始照片路径") + private String fpth; +} 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 2f073631..5e02dbd8 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 @@ -4,6 +4,7 @@ import com.yfd.platform.common.DataSourceRequest; import com.yfd.platform.common.DataSourceResult; import com.yfd.platform.qgc_env.vap.entity.vo.VpBasinIntDetailVo; import com.yfd.platform.qgc_env.vap.entity.vo.VpStInfoResultVo; +import com.yfd.platform.qgc_env.vap.entity.vo.VpWvaRunVo; public interface VpConstructionService { @@ -14,4 +15,6 @@ public interface VpConstructionService { VpStInfoResultVo getStInfoByStcd(String stcd); DataSourceResult basinVpIntDetail(DataSourceRequest dataSourceRequest); + + DataSourceResult processWvaKendoList(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 ee55fc10..4b1e1aa7 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 @@ -14,6 +14,7 @@ import com.yfd.platform.qgc_env.vap.entity.vo.VpConstructionSituationVo; import com.yfd.platform.qgc_env.vap.entity.vo.VpStBaseInfoVo; import com.yfd.platform.qgc_env.vap.entity.vo.VpStInfoResultVo; import com.yfd.platform.qgc_env.vap.entity.vo.VpVmsstbprptVo; +import com.yfd.platform.qgc_env.vap.entity.vo.VpWvaRunVo; import com.yfd.platform.qgc_env.vap.service.VpConstructionService; import com.yfd.platform.utils.KendoUtil; import com.yfd.platform.utils.QgcQueryWrapperUtil; @@ -171,6 +172,309 @@ public class VpConstructionServiceImpl implements VpConstructionService { return result; } + @Override + public DataSourceResult processWvaKendoList(DataSourceRequest dataSourceRequest) { + DataSourceLoadOptionsBase loadOptions = dataSourceRequest == null ? null : dataSourceRequest.toDevRequest(); + PageInfo pageInfo = loadOptions == null ? new PageInfo() : QgcQueryWrapperUtil.getPageInfo(loadOptions); + Page page = pageInfo.getHasPageInfo() ? pageInfo.getPage() : null; + + Map paramMap = new HashMap<>(); + StringBuilder sql = new StringBuilder(buildWvaBaseSql()); + String filterSql = buildWvaFilterCondition(dataSourceRequest == null ? null : dataSourceRequest.getFilter(), + paramMap, new int[]{0}); + if (StrUtil.isNotBlank(filterSql)) { + sql.append(" AND ").append(filterSql); + } + + String groupBy = dataSourceRequest == null ? null : KendoUtil.getGroupBy(dataSourceRequest); + GroupingInfo[] groupInfos = loadOptions == null ? null : loadOptions.getGroup(); + if (StrUtil.isNotBlank(groupBy) && groupInfos != null && groupInfos.length > 0) { + String groupedSql = buildWvaGroupSql(sql.toString(), groupInfos); + List> rows = microservicDynamicSQLMapper.pageAllList(null, groupedSql, paramMap); + DataSourceResult result = new DataSourceResult(); + if (Boolean.TRUE.equals(dataSourceRequest.getGroupResultFlat())) { + result.setData(new GroupHelper().faltGroup(rows, Arrays.asList(groupInfos))); + } else { + result.setData(new GroupHelper().group(rows, Arrays.asList(groupInfos))); + } + result.setTotal(0L); + result.setAggregates(new HashMap<>()); + return result; + } + + sql.append(buildWvaOrderBySql(dataSourceRequest == null ? null : dataSourceRequest.getSort())); + List list = microservicDynamicSQLMapper.pageAllListWithResultType( + page, sql.toString(), paramMap, VpWvaRunVo.class + ); + DataSourceResult result = new DataSourceResult<>(); + result.setData(list); + result.setTotal(page != null ? page.getTotal() : list.size()); + result.setAggregates(new HashMap<>()); + return result; + } + + private String buildWvaBaseSql() { + return "SELECT " + + "va.STCD AS stcd, " + + "vb.STNM AS stnm, " + + "va.TM AS tm, " + + "vb.STNM || ' ' || TO_CHAR(va.TM, 'yyyy-MM-dd HH24') AS flnm, " + + "va.FPTH AS imgPath, " + + "va.FPTH AS flpth, " + + "va.FID AS fid, " + + "va.DESCRIPTION AS description, " + + "CAST(NULL AS VARCHAR2(36)) AS platformId, " + + "CAST(NULL AS VARCHAR2(36)) AS departmentId, " + + "CAST(NULL AS NUMBER(1,0)) AS isTempStorage, " + + "vb.STTP AS sttpCode, " + + "sttp.STTP_NAME AS sttpName, " + + "vb.BASE_ID AS baseId, " + + "hb.BASENAME AS baseName, " + + "vb.RSTCD AS rstcd, " + + "eng.ENNM AS ennm, " + + "vb.HBRVCD AS hbrvcd, " + + "hbrv.HBRVNM AS hbrvcdName, " + + "TO_CHAR(vb.BLDSTT_CODE) AS bldsttCcode, " + + "CASE WHEN vb.BLDSTT_CODE IN (1, 10, 11) THEN '已建' " + + "WHEN vb.BLDSTT_CODE IN (2, 7, 8) THEN '在建' ELSE '未建/规划' END AS bldsttCcodeName, " + + "va.TETP AS tetp, " + + "va.TECNT AS tecnt, " + + "va.STLC AS stlc, " + + "va.FPTH AS fpth, " + + "NVL(hb.ORDER_INDEX, 999999) AS baseStepSort, " + + "NVL(hbrv.ORDER_INDEX, 999999) AS rvcdStepSort, " + + "NVL(eng.ORDER_INDEX, 999999) AS rstcdStepSort, " + + "NVL(vb.ORDER_INDEX, 999999) AS siteStepSort " + + "FROM SD_VA_R va " + + "INNER JOIN SD_VA_B_H vb ON vb.STCD = va.STCD AND NVL(vb.IS_DELETED, 0) = 0 " + + "LEFT JOIN SD_HYDROBASE hb ON hb.BASEID = vb.BASE_ID AND NVL(hb.IS_DELETED, 0) = 0 " + + "LEFT JOIN SD_ENGINFO_B_H eng ON eng.STCD = vb.RSTCD AND NVL(eng.IS_DELETED, 0) = 0 " + + "LEFT JOIN SD_HBRV_DIC hbrv ON hbrv.HBRVCD = vb.HBRVCD " + + "AND (hbrv.BASEID = vb.BASE_ID OR vb.BASE_ID IS NULL) " + + "AND NVL(hbrv.IS_DELETED, 0) = 0 AND NVL(hbrv.ENABLED, 1) = 1 " + + "LEFT JOIN SD_STTP_B sttp ON sttp.STTP_CODE = vb.STTP " + + "AND NVL(sttp.IS_DELETED, 0) = 0 AND NVL(sttp.ENABLE, 1) = 1 " + + "WHERE NVL(va.IS_DELETED, 0) = 0 "; + } + + private String buildWvaFilterCondition(DataSourceRequest.FilterDescriptor filter, + Map paramMap, + int[] indexHolder) { + if (filter == null) { + return ""; + } + if (StrUtil.isNotBlank(filter.getField())) { + return buildWvaLeafCondition(filter, paramMap, indexHolder); + } + if (CollectionUtils.isEmpty(filter.getFilters())) { + return ""; + } + List conditions = new ArrayList<>(); + for (DataSourceRequest.FilterDescriptor child : filter.getFilters()) { + String childSql = buildWvaFilterCondition(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 buildWvaLeafCondition(DataSourceRequest.FilterDescriptor filter, + Map paramMap, + int[] indexHolder) { + String field = filter.getField(); + Object value = filter.getValue(); + String operator = StrUtil.blankToDefault(filter.getOperator(), "eq").toLowerCase(); + + if ("keyword".equals(field)) { + if (value == null || StrUtil.isBlank(String.valueOf(value))) { + return ""; + } + String paramKey = "wvaParam" + indexHolder[0]++; + paramMap.put(paramKey, "%" + value + "%"); + return "(vb.STNM LIKE #{map." + paramKey + "} OR hb.BASENAME LIKE #{map." + paramKey + "} " + + "OR eng.ENNM LIKE #{map." + paramKey + "} OR va.TETP LIKE #{map." + paramKey + "} " + + "OR va.DESCRIPTION LIKE #{map." + paramKey + "})"; + } + + String column = mapWvaColumn(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 buildWvaGroupSql(String detailSql, GroupingInfo[] groupInfos) { + List groupFields = new ArrayList<>(); + List orderItems = new ArrayList<>(); + StringBuilder sql = new StringBuilder("SELECT "); + boolean first = true; + for (GroupingInfo item : groupInfos) { + if (item == null || StrUtil.isBlank(item.getSelector())) { + continue; + } + String selector = item.getSelector(); + if (!isWvaGroupSupported(selector)) { + continue; + } + if (!first) { + sql.append(", "); + } + sql.append("t.").append(selector).append(" AS ").append(selector) + .append(", COUNT(*) AS count_").append(selector); + groupFields.add("t." + selector); + orderItems.add("t." + selector + (item.getDesc() ? " DESC" : " ASC")); + first = false; + } + if (groupFields.isEmpty()) { + return "SELECT * FROM (" + detailSql + ") t WHERE 1 = 0"; + } + sql.append(" FROM (").append(detailSql).append(") t GROUP BY ") + .append(String.join(", ", groupFields)); + if (!orderItems.isEmpty()) { + sql.append(" ORDER BY ").append(String.join(", ", orderItems)); + } + return sql.toString(); + } + + private boolean isWvaGroupSupported(String selector) { + return "stcd".equals(selector) + || "stnm".equals(selector) + || "sttpCode".equals(selector) + || "sttpName".equals(selector) + || "baseId".equals(selector) + || "baseName".equals(selector) + || "rstcd".equals(selector) + || "ennm".equals(selector) + || "hbrvcd".equals(selector) + || "hbrvcdName".equals(selector) + || "bldsttCcode".equals(selector) + || "bldsttCcodeName".equals(selector) + || "tetp".equals(selector) + || "stlc".equals(selector); + } + + private String mapWvaColumn(String field) { + if (StrUtil.isBlank(field)) { + return null; + } + Map columnMap = new HashMap<>(); + columnMap.put("stcd", "va.STCD"); + columnMap.put("stnm", "vb.STNM"); + columnMap.put("tm", "va.TM"); + columnMap.put("flnm", "vb.STNM || ' ' || TO_CHAR(va.TM, 'yyyy-MM-dd HH24')"); + columnMap.put("imgPath", "va.FPTH"); + columnMap.put("flpth", "va.FPTH"); + columnMap.put("fid", "va.FID"); + columnMap.put("description", "va.DESCRIPTION"); + columnMap.put("sttpCode", "vb.STTP"); + columnMap.put("sttpName", "sttp.STTP_NAME"); + columnMap.put("baseId", "vb.BASE_ID"); + columnMap.put("baseName", "hb.BASENAME"); + columnMap.put("rstcd", "vb.RSTCD"); + columnMap.put("ennm", "eng.ENNM"); + columnMap.put("hbrvcd", "vb.HBRVCD"); + columnMap.put("hbrvcdName", "hbrv.HBRVNM"); + columnMap.put("bldsttCcode", "vb.BLDSTT_CODE"); + columnMap.put("bldsttCcodeName", + "CASE WHEN vb.BLDSTT_CODE IN (1, 10, 11) THEN '已建' WHEN vb.BLDSTT_CODE IN (2, 7, 8) THEN '在建' ELSE '未建/规划' END"); + columnMap.put("tetp", "va.TETP"); + columnMap.put("tecnt", "va.TECNT"); + columnMap.put("stlc", "va.STLC"); + columnMap.put("fpth", "va.FPTH"); + return columnMap.get(field); + } + + private String buildWvaOrderBySql(List sorts) { + if (sorts == null || sorts.isEmpty()) { + return " ORDER BY NVL(hb.ORDER_INDEX, 999999) ASC, NVL(hbrv.ORDER_INDEX, 999999) ASC, " + + "NVL(eng.ORDER_INDEX, 999999) ASC, NVL(vb.ORDER_INDEX, 999999) ASC, va.TM ASC, va.STCD ASC"; + } + List orderItems = new ArrayList<>(); + for (DataSourceRequest.SortDescriptor sort : sorts) { + if (sort == null || StrUtil.isBlank(sort.getField())) { + continue; + } + String column = mapWvaColumn(sort.getField()); + if (StrUtil.isBlank(column)) { + column = switch (sort.getField()) { + case "baseStepSort" -> "hb.ORDER_INDEX"; + case "rvcdStepSort" -> "hbrv.ORDER_INDEX"; + case "rstcdStepSort" -> "eng.ORDER_INDEX"; + case "siteStepSort" -> "vb.ORDER_INDEX"; + default -> null; + }; + } + 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 NVL(hb.ORDER_INDEX, 999999) ASC, NVL(hbrv.ORDER_INDEX, 999999) ASC, " + + "NVL(eng.ORDER_INDEX, 999999) ASC, NVL(vb.ORDER_INDEX, 999999) ASC, va.TM DESC, va.STCD ASC"; + } + return " ORDER BY " + String.join(", ", orderItems); + } + private String buildBaseSql(boolean botanicalGarden, boolean nationwide) { String baseIdExpr = botanicalGarden ? "CASE WHEN vp.BASE_ID IS NULL THEN 'null' ELSE vp.BASE_ID END" From ea911448303c0bfddf6cf09435dde29e0216e42b Mon Sep 17 00:00:00 2001 From: tangwei Date: Thu, 11 Jun 2026 17:24:50 +0800 Subject: [PATCH 14/34] =?UTF-8?q?feat:=20=E5=8A=A8=E7=89=A9=E6=95=91?= =?UTF-8?q?=E5=8A=A9=E7=AB=99=E5=BB=BA=E8=AE=BE=E5=8F=8A=E6=8E=A5=E5=85=A5?= =?UTF-8?q?=E6=83=85=E5=86=B5?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../controller/VapConstructionController.java | 6 + .../qgc_env/vap/entity/vo/VpVacVo.java | 65 ++++ .../vap/service/VpConstructionService.java | 3 + .../impl/VpConstructionServiceImpl.java | 279 ++++++++++++++++++ 4 files changed, 353 insertions(+) create mode 100644 backend/src/main/java/com/yfd/platform/qgc_env/vap/entity/vo/VpVacVo.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 65bc8883..ef4924a8 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 @@ -52,4 +52,10 @@ public class VapConstructionController { public ResponseResult getWvaKendoListCust(@RequestBody DataSourceRequest dataSourceRequest) { return ResponseResult.successData(vpConstructionService.processWvaKendoList(dataSourceRequest)); } + + @PostMapping("/vac/GetKendoListCust") + @Operation(summary = "动物救助站建设及接入情况") + public ResponseResult getVacKendoListCust(@RequestBody DataSourceRequest dataSourceRequest) { + return ResponseResult.successData(vpConstructionService.processVacKendoList(dataSourceRequest)); + } } diff --git a/backend/src/main/java/com/yfd/platform/qgc_env/vap/entity/vo/VpVacVo.java b/backend/src/main/java/com/yfd/platform/qgc_env/vap/entity/vo/VpVacVo.java new file mode 100644 index 00000000..89c52339 --- /dev/null +++ b/backend/src/main/java/com/yfd/platform/qgc_env/vap/entity/vo/VpVacVo.java @@ -0,0 +1,65 @@ +package com.yfd.platform.qgc_env.vap.entity.vo; + +import io.swagger.v3.oas.annotations.media.Schema; +import lombok.Data; + +import java.util.Date; + +@Data +@Schema(description = "动物救助站建设及接入情况") +public class VpVacVo { + + @Schema(description = "测站编码") + private String stcd; + + @Schema(description = "基础对象名称") + private String stnm; + + @Schema(description = "业务类型名称") + private String sttpName; + + @Schema(description = "所属基地ID") + private String baseId; + + @Schema(description = "所属基地名称") + private String baseName; + + @Schema(description = "水电站名称") + private String ennm; + + @Schema(description = "是否接入") + private String dtin; + + @Schema(description = "是否接入名称") + private String dtinName; + + @Schema(description = "建设状态") + private String bldsttCcode; + + @Schema(description = "建设状态名称") + private String bldsttCcodeName; + + @Schema(description = "开工日期") + private Date ststdt; + + @Schema(description = "建成日期") + private Date esstdt; + + @Schema(description = "LOGO") + private String logo; + + @Schema(description = "简介") + private String introduce; + + @Schema(description = "介绍弹窗图片") + private String inffile; + + @Schema(description = "基地排序") + private Integer baseStepSort; + + @Schema(description = "电站排序") + private Integer rstcdStepSort; + + @Schema(description = "站点排序") + private Integer siteStepSort; +} 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 5e02dbd8..0cddcfec 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 @@ -4,6 +4,7 @@ import com.yfd.platform.common.DataSourceRequest; import com.yfd.platform.common.DataSourceResult; import com.yfd.platform.qgc_env.vap.entity.vo.VpBasinIntDetailVo; import com.yfd.platform.qgc_env.vap.entity.vo.VpStInfoResultVo; +import com.yfd.platform.qgc_env.vap.entity.vo.VpVacVo; import com.yfd.platform.qgc_env.vap.entity.vo.VpWvaRunVo; public interface VpConstructionService { @@ -17,4 +18,6 @@ public interface VpConstructionService { DataSourceResult basinVpIntDetail(DataSourceRequest dataSourceRequest); DataSourceResult processWvaKendoList(DataSourceRequest dataSourceRequest); + + DataSourceResult processVacKendoList(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 4b1e1aa7..0328ba0e 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 @@ -11,6 +11,7 @@ import com.yfd.platform.common.MicroservicDynamicSQLMapper; import com.yfd.platform.common.PageInfo; 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.VpVacVo; import com.yfd.platform.qgc_env.vap.entity.vo.VpStBaseInfoVo; import com.yfd.platform.qgc_env.vap.entity.vo.VpStInfoResultVo; import com.yfd.platform.qgc_env.vap.entity.vo.VpVmsstbprptVo; @@ -213,6 +214,284 @@ public class VpConstructionServiceImpl implements VpConstructionService { return result; } + @Override + public DataSourceResult processVacKendoList(DataSourceRequest dataSourceRequest) { + DataSourceLoadOptionsBase loadOptions = dataSourceRequest == null ? null : dataSourceRequest.toDevRequest(); + PageInfo pageInfo = loadOptions == null ? new PageInfo() : QgcQueryWrapperUtil.getPageInfo(loadOptions); + Page page = pageInfo.getHasPageInfo() ? pageInfo.getPage() : null; + + String isZoo = loadOptions == null ? null : QgcQueryWrapperUtil.getFilterFieldValue(loadOptions, "isZoo"); + Map paramMap = new HashMap<>(); + StringBuilder sql = new StringBuilder(buildVacBaseSql("1".equals(isZoo))); + String filterSql = buildVacFilterCondition(dataSourceRequest == null ? null : dataSourceRequest.getFilter(), + paramMap, new int[]{0}); + if (StrUtil.isNotBlank(filterSql)) { + sql.append(" AND ").append(filterSql); + } + + String groupBy = dataSourceRequest == null ? null : KendoUtil.getGroupBy(dataSourceRequest); + GroupingInfo[] groupInfos = loadOptions == null ? null : loadOptions.getGroup(); + if (StrUtil.isNotBlank(groupBy) && groupInfos != null && groupInfos.length > 0) { + String groupedSql = buildVacGroupSql(sql.toString(), groupInfos); + List> rows = microservicDynamicSQLMapper.pageAllList(null, groupedSql, paramMap); + DataSourceResult result = new DataSourceResult(); + if (Boolean.TRUE.equals(dataSourceRequest.getGroupResultFlat())) { + result.setData(new GroupHelper().faltGroup(rows, Arrays.asList(groupInfos))); + } else { + result.setData(new GroupHelper().group(rows, Arrays.asList(groupInfos))); + } + result.setTotal(0L); + result.setAggregates(new HashMap<>()); + return result; + } + + sql.append(buildVacOrderBySql(dataSourceRequest == null ? null : dataSourceRequest.getSort())); + List list = microservicDynamicSQLMapper.pageAllListWithResultType( + page, sql.toString(), paramMap, VpVacVo.class + ); + DataSourceResult result = new DataSourceResult<>(); + result.setData(list); + result.setTotal(page != null ? page.getTotal() : list.size()); + result.setAggregates(new HashMap<>()); + return result; + } + + private String buildVacBaseSql(boolean isZoo) { + String baseIdExpr = isZoo ? "CASE WHEN va.BASE_ID IS NULL THEN 'null' ELSE va.BASE_ID END" : "va.BASE_ID"; + String dtinExpr = isZoo ? "CASE WHEN va.DTIN IS NULL THEN '400' ELSE TO_CHAR(va.DTIN) END" : "TO_CHAR(va.DTIN)"; + return "SELECT " + + "va.STCD AS stcd, " + + "va.STNM AS stnm, " + + "sttp.STTP_NAME AS sttpName, " + + baseIdExpr + " AS baseId, " + + "hb.BASENAME AS baseName, " + + "eng.ENNM AS ennm, " + + dtinExpr + " AS dtin, " + + "CASE WHEN NVL(va.DTIN, 0) = 1 THEN '已接入' ELSE '未接入' END AS dtinName, " + + "TO_CHAR(va.BLDSTT_CODE) AS bldsttCcode, " + + "CASE WHEN NVL(va.BLDSTT_CODE, 0) = 2 THEN '已建' WHEN NVL(va.BLDSTT_CODE, 0) = 1 THEN '在建' ELSE '未建/规划' END AS bldsttCcodeName, " + + "va.SWDT AS ststdt, " + + "va.JCDT AS esstdt, " + + "va.LOGO AS logo, " + + "va.INTRODUCE AS introduce, " + + "va.INFFILE AS inffile, " + + "NVL(hb.ORDER_INDEX, 999999) AS baseStepSort, " + + "NVL(eng.ORDER_INDEX, 999999) AS rstcdStepSort, " + + "NVL(va.ORDER_INDEX, 999999) AS siteStepSort " + + "FROM SD_VA_B_H va " + + "LEFT JOIN SD_HYDROBASE hb ON hb.BASEID = va.BASE_ID AND NVL(hb.IS_DELETED, 0) = 0 " + + "LEFT JOIN SD_ENGINFO_B_H eng ON eng.STCD = va.RSTCD AND NVL(eng.IS_DELETED, 0) = 0 " + + "LEFT JOIN SD_STTP_B sttp ON sttp.STTP_CODE = va.STTP " + + "AND NVL(sttp.IS_DELETED, 0) = 0 AND NVL(sttp.ENABLE, 1) = 1 " + + "WHERE va.STTP = 'VA' AND NVL(va.IS_DELETED, 0) = 0 "; + } + + private String buildVacFilterCondition(DataSourceRequest.FilterDescriptor filter, + Map paramMap, + int[] indexHolder) { + if (filter == null) { + return ""; + } + if (StrUtil.isNotBlank(filter.getField())) { + return buildVacLeafCondition(filter, paramMap, indexHolder); + } + if (CollectionUtils.isEmpty(filter.getFilters())) { + return ""; + } + List conditions = new ArrayList<>(); + for (DataSourceRequest.FilterDescriptor child : filter.getFilters()) { + String childSql = buildVacFilterCondition(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 buildVacLeafCondition(DataSourceRequest.FilterDescriptor filter, + Map paramMap, + int[] indexHolder) { + String field = filter.getField(); + if ("isZoo".equals(field)) { + return ""; + } + Object value = filter.getValue(); + String operator = StrUtil.blankToDefault(filter.getOperator(), "eq").toLowerCase(); + + if ("keyword".equals(field)) { + if (value == null || StrUtil.isBlank(String.valueOf(value))) { + return ""; + } + String paramKey = "vacParam" + indexHolder[0]++; + paramMap.put(paramKey, "%" + value + "%"); + return "(va.STNM LIKE #{map." + paramKey + "} OR hb.BASENAME LIKE #{map." + paramKey + "} OR eng.ENNM LIKE #{map." + paramKey + "})"; + } + + String column = mapVacColumn(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 = "vacParam" + indexHolder[0]++; + paramMap.put(paramKey, item); + placeholders.add("#{map." + paramKey + "}"); + } + return column + " IN (" + String.join(", ", placeholders) + ")"; + } + if (value == null) { + return ""; + } + + String paramKey = "vacParam" + 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 buildVacGroupSql(String detailSql, GroupingInfo[] groupInfos) { + List groupFields = new ArrayList<>(); + List orderItems = new ArrayList<>(); + StringBuilder sql = new StringBuilder("SELECT "); + boolean first = true; + for (GroupingInfo item : groupInfos) { + if (item == null || StrUtil.isBlank(item.getSelector())) { + continue; + } + String selector = item.getSelector(); + if (!isVacGroupSupported(selector)) { + continue; + } + if (!first) { + sql.append(", "); + } + sql.append("t.").append(selector).append(" AS ").append(selector) + .append(", COUNT(*) AS count_").append(selector); + groupFields.add("t." + selector); + orderItems.add("t." + selector + (item.getDesc() ? " DESC" : " ASC")); + first = false; + } + if (groupFields.isEmpty()) { + return "SELECT * FROM (" + detailSql + ") t WHERE 1 = 0"; + } + sql.append(" FROM (").append(detailSql).append(") t GROUP BY ") + .append(String.join(", ", groupFields)); + if (!orderItems.isEmpty()) { + sql.append(" ORDER BY ").append(String.join(", ", orderItems)); + } + return sql.toString(); + } + + private boolean isVacGroupSupported(String selector) { + return "stcd".equals(selector) + || "stnm".equals(selector) + || "sttpName".equals(selector) + || "baseId".equals(selector) + || "baseName".equals(selector) + || "ennm".equals(selector) + || "dtin".equals(selector) + || "dtinName".equals(selector) + || "bldsttCcode".equals(selector) + || "bldsttCcodeName".equals(selector); + } + + private String mapVacColumn(String field) { + if (StrUtil.isBlank(field)) { + return null; + } + Map columnMap = new HashMap<>(); + columnMap.put("stcd", "va.STCD"); + columnMap.put("stnm", "va.STNM"); + columnMap.put("sttpName", "sttp.STTP_NAME"); + columnMap.put("baseId", "va.BASE_ID"); + columnMap.put("baseName", "hb.BASENAME"); + columnMap.put("ennm", "eng.ENNM"); + columnMap.put("dtin", "va.DTIN"); + columnMap.put("dtinName", "CASE WHEN NVL(va.DTIN, 0) = 1 THEN '已接入' ELSE '未接入' END"); + columnMap.put("bldstt", "va.BLDSTT_CODE"); + columnMap.put("bldsttCcode", "va.BLDSTT_CODE"); + columnMap.put("bldsttCcodeName", + "CASE WHEN NVL(va.BLDSTT_CODE, 0) = 2 THEN '已建' WHEN NVL(va.BLDSTT_CODE, 0) = 1 THEN '在建' ELSE '未建/规划' END"); + columnMap.put("ststdt", "va.SWDT"); + columnMap.put("esstdt", "va.JCDT"); + columnMap.put("logo", "va.LOGO"); + columnMap.put("introduce", "va.INTRODUCE"); + columnMap.put("inffile", "va.INFFILE"); + return columnMap.get(field); + } + + private String buildVacOrderBySql(List sorts) { + if (sorts == null || sorts.isEmpty()) { + return " ORDER BY NVL(hb.ORDER_INDEX, 999999) ASC, NVL(eng.ORDER_INDEX, 999999) ASC, NVL(va.ORDER_INDEX, 999999) ASC, va.STCD ASC"; + } + List orderItems = new ArrayList<>(); + for (DataSourceRequest.SortDescriptor sort : sorts) { + if (sort == null || StrUtil.isBlank(sort.getField())) { + continue; + } + String column = mapVacColumn(sort.getField()); + if (StrUtil.isBlank(column)) { + column = switch (sort.getField()) { + case "baseStepSort" -> "hb.ORDER_INDEX"; + case "rstcdStepSort" -> "eng.ORDER_INDEX"; + case "siteStepSort" -> "va.ORDER_INDEX"; + default -> null; + }; + } + 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 NVL(hb.ORDER_INDEX, 999999) ASC, NVL(eng.ORDER_INDEX, 999999) ASC, NVL(va.ORDER_INDEX, 999999) ASC, va.STCD ASC"; + } + return " ORDER BY " + String.join(", ", orderItems); + } + private String buildWvaBaseSql() { return "SELECT " + "va.STCD AS stcd, " + From fd0e11d1e4585a6c64f186fc01bcd9b67cd0955e Mon Sep 17 00:00:00 2001 From: tangwei Date: Thu, 11 Jun 2026 18:00:32 +0800 Subject: [PATCH 15/34] =?UTF-8?q?feat:=20=E5=8A=A8=E7=89=A9=E6=95=91?= =?UTF-8?q?=E5=8A=A9=E6=83=85=E5=86=B5?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../controller/VapConstructionController.java | 6 + .../qgc_env/vap/entity/vo/VpVarVo.java | 64 ++++ .../vap/service/VpConstructionService.java | 3 + .../impl/VpConstructionServiceImpl.java | 351 ++++++++++++++++++ 4 files changed, 424 insertions(+) create mode 100644 backend/src/main/java/com/yfd/platform/qgc_env/vap/entity/vo/VpVarVo.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 ef4924a8..ffa9a01e 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 @@ -58,4 +58,10 @@ public class VapConstructionController { public ResponseResult getVacKendoListCust(@RequestBody DataSourceRequest dataSourceRequest) { return ResponseResult.successData(vpConstructionService.processVacKendoList(dataSourceRequest)); } + + @PostMapping("/var/GetKendoListCust") + @Operation(summary = "动物救助情况") + public ResponseResult getVarKendoListCust(@RequestBody DataSourceRequest dataSourceRequest) { + return ResponseResult.successData(vpConstructionService.processVarKendoList(dataSourceRequest)); + } } diff --git a/backend/src/main/java/com/yfd/platform/qgc_env/vap/entity/vo/VpVarVo.java b/backend/src/main/java/com/yfd/platform/qgc_env/vap/entity/vo/VpVarVo.java new file mode 100644 index 00000000..80eeb789 --- /dev/null +++ b/backend/src/main/java/com/yfd/platform/qgc_env/vap/entity/vo/VpVarVo.java @@ -0,0 +1,64 @@ +package com.yfd.platform.qgc_env.vap.entity.vo; + +import com.fasterxml.jackson.annotation.JsonFormat; +import io.swagger.v3.oas.annotations.media.Schema; +import lombok.Data; + +import java.util.Date; + +@Data +@Schema(description = "动物救助情况") +public class VpVarVo { + + @Schema(description = "主键") + private String id; + + @Schema(description = "测站编码") + private String stcd; + + @Schema(description = "所属基地ID") + private String baseId; + + @Schema(description = "测站名称") + private String stnm; + + @JsonFormat(pattern = "yyyy-MM-dd") + @Schema(description = "放生日期") + private Date tm; + + @Schema(description = "陆生生态类型") + private String tetp; + + @Schema(description = "救助数量") + private Integer tecnt; + + @Schema(description = "放生地点") + private String stlc; + + @Schema(description = "放生照片") + private String fpth; + + @Schema(description = "文件ID") + private String fid; + + @Schema(description = "平台ID") + private String platformId; + + @Schema(description = "部门ID") + private String departmentId; + + @Schema(description = "是否暂存") + private Integer isTempStorage; + + @Schema(description = "年度") + private String year; + + @Schema(description = "描述") + private String description; + + @Schema(description = "基地排序") + private Integer baseStepSort; + + @Schema(description = "站点排序") + private Integer siteStepSort; +} 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 0cddcfec..28de636f 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.VpBasinIntDetailVo; +import com.yfd.platform.qgc_env.vap.entity.vo.VpVarVo; import com.yfd.platform.qgc_env.vap.entity.vo.VpStInfoResultVo; import com.yfd.platform.qgc_env.vap.entity.vo.VpVacVo; import com.yfd.platform.qgc_env.vap.entity.vo.VpWvaRunVo; @@ -20,4 +21,6 @@ public interface VpConstructionService { DataSourceResult processWvaKendoList(DataSourceRequest dataSourceRequest); DataSourceResult processVacKendoList(DataSourceRequest dataSourceRequest); + + DataSourceResult processVarKendoList(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 0328ba0e..e7323320 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 @@ -11,6 +11,7 @@ import com.yfd.platform.common.MicroservicDynamicSQLMapper; import com.yfd.platform.common.PageInfo; 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; import com.yfd.platform.qgc_env.vap.entity.vo.VpVacVo; import com.yfd.platform.qgc_env.vap.entity.vo.VpStBaseInfoVo; import com.yfd.platform.qgc_env.vap.entity.vo.VpStInfoResultVo; @@ -256,6 +257,275 @@ public class VpConstructionServiceImpl implements VpConstructionService { return result; } + @Override + public DataSourceResult processVarKendoList(DataSourceRequest dataSourceRequest) { + DataSourceLoadOptionsBase loadOptions = dataSourceRequest == null ? null : dataSourceRequest.toDevRequest(); + PageInfo pageInfo = loadOptions == null ? new PageInfo() : QgcQueryWrapperUtil.getPageInfo(loadOptions); + Page page = pageInfo.getHasPageInfo() ? pageInfo.getPage() : null; + + Map paramMap = new HashMap<>(); + StringBuilder sql = new StringBuilder(buildVarBaseSql()); + String filterSql = buildVarFilterCondition(dataSourceRequest == null ? null : dataSourceRequest.getFilter(), + paramMap, new int[]{0}); + if (StrUtil.isNotBlank(filterSql)) { + sql.append(" AND ").append(filterSql); + } + + String groupBy = dataSourceRequest == null ? null : KendoUtil.getGroupBy(dataSourceRequest); + GroupingInfo[] groupInfos = loadOptions == null ? null : loadOptions.getGroup(); + if (StrUtil.isNotBlank(groupBy) && groupInfos != null && groupInfos.length > 0) { + String groupedSql = buildVarGroupSql(sql.toString(), groupInfos); + List> rows = microservicDynamicSQLMapper.pageAllList(null, groupedSql, paramMap); + DataSourceResult result = new DataSourceResult(); + if (Boolean.TRUE.equals(dataSourceRequest.getGroupResultFlat())) { + result.setData(new GroupHelper().faltGroup(rows, Arrays.asList(groupInfos))); + } else { + result.setData(new GroupHelper().group(rows, Arrays.asList(groupInfos))); + } + result.setTotal(0L); + result.setAggregates(new HashMap<>()); + return result; + } + + sql.append(buildVarOrderBySql(dataSourceRequest == null ? null : dataSourceRequest.getSort())); + List list = microservicDynamicSQLMapper.pageAllListWithResultType( + page, sql.toString(), paramMap, VpVarVo.class + ); + DataSourceResult result = new DataSourceResult<>(); + result.setData(list); + result.setTotal(page != null ? page.getTotal() : list.size()); + result.setAggregates(new HashMap<>()); + return result; + } + + private String buildVarBaseSql() { + return "SELECT " + + "r.ID AS id, " + + "va.STCD AS stcd, " + + "va.BASE_ID AS baseId, " + + "va.STNM AS stnm, " + + "r.TM AS tm, " + + "basic.NAME AS tetp, " + + "r.TECNT AS tecnt, " + + "r.STLC AS stlc, " + + "r.FPTH AS fpth, " + + "r.FID AS fid, " + + "CAST(NULL AS VARCHAR2(36)) AS platformId, " + + "CAST(NULL AS VARCHAR2(36)) AS departmentId, " + + "CAST(NULL AS NUMBER(1,0)) AS isTempStorage, " + + "TO_CHAR(r.TM, 'YYYY') AS year, " + + "r.DESCRIPTION AS description, " + + "NVL(hb.ORDER_INDEX, 999999) AS baseStepSort, " + + "NVL(va.ORDER_INDEX, 999999) AS siteStepSort " + + "FROM SD_VA_B_H va " + + "LEFT JOIN SD_VA_R r ON r.STCD = va.STCD AND NVL(r.IS_DELETED, 0) = 0 " + + "LEFT JOIN SD_VABASIC_B basic ON basic.ID = r.TETP AND NVL(basic.IS_DELETED, 0) = 0 " + + "LEFT JOIN SD_HYDROBASE hb ON hb.BASEID = va.BASE_ID AND NVL(hb.IS_DELETED, 0) = 0 " + + "WHERE va.STTP = 'VA' AND NVL(va.IS_DELETED, 0) = 0 "; + } + + private String buildVarFilterCondition(DataSourceRequest.FilterDescriptor filter, + Map paramMap, + int[] indexHolder) { + if (filter == null) { + return ""; + } + if (StrUtil.isNotBlank(filter.getField())) { + return buildVarLeafCondition(filter, paramMap, indexHolder); + } + if (CollectionUtils.isEmpty(filter.getFilters())) { + return ""; + } + List conditions = new ArrayList<>(); + for (DataSourceRequest.FilterDescriptor child : filter.getFilters()) { + String childSql = buildVarFilterCondition(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 buildVarLeafCondition(DataSourceRequest.FilterDescriptor filter, + Map paramMap, + int[] indexHolder) { + String field = filter.getField(); + Object value = filter.getValue(); + String operator = StrUtil.blankToDefault(filter.getOperator(), "eq").toLowerCase(); + + if ("keyword".equals(field)) { + if (value == null || StrUtil.isBlank(String.valueOf(value))) { + return ""; + } + String paramKey = "varParam" + indexHolder[0]++; + paramMap.put(paramKey, "%" + value + "%"); + return "(va.STNM LIKE #{map." + paramKey + "} OR basic.NAME LIKE #{map." + paramKey + "} " + + "OR r.STLC LIKE #{map." + paramKey + "} OR r.DESCRIPTION LIKE #{map." + paramKey + "})"; + } + + String column = mapVarColumn(field); + if (StrUtil.isBlank(column)) { + return ""; + } + if (isDateField(field)) { + return buildDateCondition(column, operator, value, paramMap, indexHolder, "varParam"); + } + 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 = "varParam" + indexHolder[0]++; + paramMap.put(paramKey, item); + placeholders.add("#{map." + paramKey + "}"); + } + return column + " IN (" + String.join(", ", placeholders) + ")"; + } + if (value == null) { + return ""; + } + + String paramKey = "varParam" + 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 buildVarGroupSql(String detailSql, GroupingInfo[] groupInfos) { + List groupFields = new ArrayList<>(); + List orderItems = new ArrayList<>(); + StringBuilder sql = new StringBuilder("SELECT "); + boolean first = true; + for (GroupingInfo item : groupInfos) { + if (item == null || StrUtil.isBlank(item.getSelector())) { + continue; + } + String selector = item.getSelector(); + if (!isVarGroupSupported(selector)) { + continue; + } + if (!first) { + sql.append(", "); + } + sql.append("t.").append(selector).append(" AS ").append(selector) + .append(", COUNT(*) AS count_").append(selector); + groupFields.add("t." + selector); + orderItems.add("t." + selector + (item.getDesc() ? " DESC" : " ASC")); + first = false; + } + if (groupFields.isEmpty()) { + return "SELECT * FROM (" + detailSql + ") t WHERE 1 = 0"; + } + sql.append(" FROM (").append(detailSql).append(") t GROUP BY ") + .append(String.join(", ", groupFields)); + if (!orderItems.isEmpty()) { + sql.append(" ORDER BY ").append(String.join(", ", orderItems)); + } + return sql.toString(); + } + + private boolean isVarGroupSupported(String selector) { + return "stcd".equals(selector) + || "baseId".equals(selector) + || "stnm".equals(selector) + || "tm".equals(selector) + || "tetp".equals(selector) + || "tecnt".equals(selector) + || "stlc".equals(selector) + || "fpth".equals(selector) + || "fid".equals(selector) + || "year".equals(selector) + || "description".equals(selector); + } + + private String mapVarColumn(String field) { + if (StrUtil.isBlank(field)) { + return null; + } + Map columnMap = new HashMap<>(); + columnMap.put("id", "r.ID"); + columnMap.put("stcd", "va.STCD"); + columnMap.put("baseId", "va.BASE_ID"); + columnMap.put("stnm", "va.STNM"); + columnMap.put("tm", "r.TM"); + columnMap.put("tetp", "basic.NAME"); + columnMap.put("tecnt", "r.TECNT"); + columnMap.put("stlc", "r.STLC"); + columnMap.put("fpth", "r.FPTH"); + columnMap.put("fid", "r.FID"); + columnMap.put("year", "TO_CHAR(r.TM, 'YYYY')"); + columnMap.put("description", "r.DESCRIPTION"); + return columnMap.get(field); + } + + private String buildVarOrderBySql(List sorts) { + if (sorts == null || sorts.isEmpty()) { + return " ORDER BY NVL(hb.ORDER_INDEX, 999999) ASC, NVL(va.ORDER_INDEX, 999999) ASC, r.TM DESC NULLS LAST, va.STCD ASC"; + } + List orderItems = new ArrayList<>(); + for (DataSourceRequest.SortDescriptor sort : sorts) { + if (sort == null || StrUtil.isBlank(sort.getField())) { + continue; + } + String column = mapVarColumn(sort.getField()); + if (StrUtil.isBlank(column)) { + column = switch (sort.getField()) { + case "baseStepSort" -> "hb.ORDER_INDEX"; + case "siteStepSort" -> "va.ORDER_INDEX"; + default -> null; + }; + } + 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 NVL(hb.ORDER_INDEX, 999999) ASC, NVL(va.ORDER_INDEX, 999999) ASC, r.TM DESC NULLS LAST, va.STCD ASC"; + } + return " ORDER BY " + String.join(", ", orderItems); + } + private String buildVacBaseSql(boolean isZoo) { String baseIdExpr = isZoo ? "CASE WHEN va.BASE_ID IS NULL THEN 'null' ELSE va.BASE_ID END" : "va.BASE_ID"; String dtinExpr = isZoo ? "CASE WHEN va.DTIN IS NULL THEN '400' ELSE TO_CHAR(va.DTIN) END" : "TO_CHAR(va.DTIN)"; @@ -334,6 +604,9 @@ public class VpConstructionServiceImpl implements VpConstructionService { if (StrUtil.isBlank(column)) { return ""; } + if (isDateField(field)) { + return buildDateCondition(column, operator, value, paramMap, indexHolder, "vacParam"); + } if ("isnull".equals(operator)) { return column + " IS NULL"; } @@ -583,6 +856,9 @@ public class VpConstructionServiceImpl implements VpConstructionService { if (StrUtil.isBlank(column)) { return ""; } + if (isDateField(field)) { + return buildDateCondition(column, operator, value, paramMap, indexHolder, "wvaParam"); + } if ("isnull".equals(operator)) { return column + " IS NULL"; } @@ -855,6 +1131,9 @@ public class VpConstructionServiceImpl implements VpConstructionService { if (StrUtil.isBlank(column)) { return ""; } + if (isDateField(field)) { + return buildDateCondition(column, operator, value, paramMap, indexHolder, "vpParam"); + } if ("isnull".equals(operator)) { return column + " IS NULL"; } @@ -1040,6 +1319,75 @@ public class VpConstructionServiceImpl implements VpConstructionService { return values; } + private boolean isDateField(String field) { + return "tm".equals(field) + || "ststdt".equals(field) + || "esstdt".equals(field) + || "jcdt".equals(field) + || "stdsdt".equals(field) + || "pststdt".equals(field) + || "pesstdt".equals(field) + || "swdt".equals(field) + || "wddt".equals(field) + || "dtinTm".equals(field); + } + + private String buildDateCondition(String column, + String operator, + Object value, + Map paramMap, + int[] indexHolder, + String paramPrefix) { + if ("isnull".equals(operator)) { + return column + " IS NULL"; + } + if ("isnotnull".equals(operator)) { + return column + " IS NOT NULL"; + } + if (value == null || StrUtil.isBlank(String.valueOf(value))) { + return ""; + } + String dateValue = normalizeDateValue(String.valueOf(value)); + if (StrUtil.isBlank(dateValue)) { + return ""; + } + String paramKey = paramPrefix + indexHolder[0]++; + paramMap.put(paramKey, dateValue); + String dateExpr = "TO_DATE(#{map." + paramKey + "}, '" + resolveOracleDateFormat(dateValue) + "')"; + return switch (operator) { + case "eq" -> column + " = " + dateExpr; + case "neq" -> column + " <> " + dateExpr; + case "gt" -> column + " > " + dateExpr; + case "gte" -> column + " >= " + dateExpr; + case "lt" -> column + " < " + dateExpr; + case "lte" -> column + " <= " + dateExpr; + default -> ""; + }; + } + + private String normalizeDateValue(String value) { + if (StrUtil.isBlank(value)) { + return value; + } + String normalized = StrUtil.trim(value); + if (normalized.contains("T")) { + normalized = normalized.replace("T", " "); + } + if (normalized.endsWith("Z")) { + normalized = normalized.substring(0, normalized.length() - 1); + } + int dotIndex = normalized.indexOf('.'); + if (dotIndex > 0) { + normalized = normalized.substring(0, dotIndex); + } + return normalized; + } + + private String resolveOracleDateFormat(String value) { + String normalized = StrUtil.blankToDefault(value, ""); + return normalized.length() > 10 ? "YYYY-MM-DD HH24:MI:SS" : "YYYY-MM-DD"; + } + private String buildVmsstbprptBaseSql() { return "SELECT " + "vp.STCD AS id, " + @@ -1273,6 +1621,9 @@ public class VpConstructionServiceImpl implements VpConstructionService { } String operator = StrUtil.blankToDefault(filter.getOperator(), "eq").toLowerCase(); Object value = filter.getValue(); + if (isDateField(filter.getField())) { + return buildDateCondition(column, operator, value, paramMap, indexHolder, "vpMsParam"); + } if ("isnull".equals(operator)) { return column + " IS NULL"; } From e4a34270567cc0ffff861e4dc896aa15f88636c7 Mon Sep 17 00:00:00 2001 From: tangwei Date: Fri, 12 Jun 2026 09:11:56 +0800 Subject: [PATCH 16/34] =?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=E7=AB=99=E5=9F=BA=E7=A1=80=E5=88=97?= =?UTF-8?q?=E8=A1=A8?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../yfd/platform/config/SwaggerConfig.java | 9 + .../fpr/controller/FprMonitorController.java | 29 + .../qgc_env/fpr/entity/vo/FprMsstbprptVo.java | 170 ++++++ .../fpr/service/FprMonitorService.java | 10 + .../service/impl/FprMonitorServiceImpl.java | 554 ++++++++++++++++++ 5 files changed, 772 insertions(+) create mode 100644 backend/src/main/java/com/yfd/platform/qgc_env/fpr/controller/FprMonitorController.java create mode 100644 backend/src/main/java/com/yfd/platform/qgc_env/fpr/entity/vo/FprMsstbprptVo.java create mode 100644 backend/src/main/java/com/yfd/platform/qgc_env/fpr/service/FprMonitorService.java create mode 100644 backend/src/main/java/com/yfd/platform/qgc_env/fpr/service/impl/FprMonitorServiceImpl.java diff --git a/backend/src/main/java/com/yfd/platform/config/SwaggerConfig.java b/backend/src/main/java/com/yfd/platform/config/SwaggerConfig.java index 3cc06390..8c8c0bc2 100644 --- a/backend/src/main/java/com/yfd/platform/config/SwaggerConfig.java +++ b/backend/src/main/java/com/yfd/platform/config/SwaggerConfig.java @@ -119,6 +119,15 @@ public class SwaggerConfig { .build(); } + @Bean + public GroupedOpenApi groupEnvFprApi() { + return GroupedOpenApi.builder() + .group("3.5 全过程-生态环保数据服务-鱼类调查") + .packagesToScan("com.yfd.platform.qgc_env.fpr.controller") + .build(); + } + + 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 new file mode 100644 index 00000000..8a3b1c22 --- /dev/null +++ b/backend/src/main/java/com/yfd/platform/qgc_env/fpr/controller/FprMonitorController.java @@ -0,0 +1,29 @@ +package com.yfd.platform.qgc_env.fpr.controller; + +import com.yfd.platform.common.DataSourceRequest; +import com.yfd.platform.config.ResponseResult; +import com.yfd.platform.qgc_env.fpr.service.FprMonitorService; +import io.swagger.v3.oas.annotations.Operation; +import io.swagger.v3.oas.annotations.tags.Tag; +import jakarta.annotation.Resource; +import org.springframework.validation.annotation.Validated; +import org.springframework.web.bind.annotation.PostMapping; +import org.springframework.web.bind.annotation.RequestBody; +import org.springframework.web.bind.annotation.RequestMapping; +import org.springframework.web.bind.annotation.RestController; + +@RestController +@RequestMapping("/fpr") +@Tag(name = "鱼类调查装置站基础信息") +@Validated +public class FprMonitorController { + + @Resource + private FprMonitorService fprMonitorService; + + @PostMapping("/msstbprpt/GetKendoList") + @Operation(summary = "鱼类调查装置站基础列表") + public ResponseResult getMsstbprptList(@RequestBody DataSourceRequest dataSourceRequest) { + return ResponseResult.successData(fprMonitorService.getMsstbprptList(dataSourceRequest)); + } +} diff --git a/backend/src/main/java/com/yfd/platform/qgc_env/fpr/entity/vo/FprMsstbprptVo.java b/backend/src/main/java/com/yfd/platform/qgc_env/fpr/entity/vo/FprMsstbprptVo.java new file mode 100644 index 00000000..3482b334 --- /dev/null +++ b/backend/src/main/java/com/yfd/platform/qgc_env/fpr/entity/vo/FprMsstbprptVo.java @@ -0,0 +1,170 @@ +package com.yfd.platform.qgc_env.fpr.entity.vo; + +import io.swagger.v3.oas.annotations.media.Schema; +import lombok.Data; + +import java.util.Date; + +@Data +@Schema(description = "鱼类调查装置站基础信息") +public class FprMsstbprptVo { + + @Schema(description = "主键ID") + private String id; + + @Schema(description = "是否删除") + private Integer isDeleted; + + @Schema(description = "站点编码") + private String stcd; + + @Schema(description = "站点名称") + private String stnm; + + @Schema(description = "站类") + private String sttp; + + @Schema(description = "站类编码") + private String sttpCode; + + @Schema(description = "站类名称") + private String sttpName; + + @Schema(description = "站类全路径") + private String sttpFullPath; + + @Schema(description = "站类层级") + private Integer sttpTreeLevel; + + @Schema(description = "数据时间") + private Date tm; + + @Schema(description = "经度") + private Double lgtd; + + @Schema(description = "纬度") + private Double lttd; + + @Schema(description = "高程") + private Double elev; + + @Schema(description = "站址") + private String stlc; + + @Schema(description = "建成日期") + private Date jcdt; + + @Schema(description = "退役日期") + private Date wddt; + + @Schema(description = "简介") + private String introduce; + + @Schema(description = "LOGO") + private String logo; + + @Schema(description = "介绍弹窗图片") + private String inffile; + + @Schema(description = "是否启用") + private Integer usfl; + + @Schema(description = "是否接入") + private Integer dtin; + + @Schema(description = "是否接入名称") + private String dtinName; + + @Schema(description = "接入开始时间") + private Date dtinTm; + + @Schema(description = "监测方式") + private Integer mway; + + @Schema(description = "监测方式名称") + private String mwayName; + + @Schema(description = "监测指标") + private String stindx; + + @Schema(description = "排序") + private Integer orderIndex; + + @Schema(description = "所属电站编码") + private String rstcd; + + @Schema(description = "所属电站名称") + private String ennm; + + @Schema(description = "所属基地编码") + private String baseId; + + @Schema(description = "所属基地名称") + private String baseName; + + @Schema(description = "所属基地流域编码") + private String hbrvcd; + + @Schema(description = "所属基地流域名称") + private String hbrvcdName; + + @Schema(description = "所属流域编码") + private String rvcd; + + @Schema(description = "所属流域名称") + private String rvcdName; + + @Schema(description = "用途") + private String purpose; + + @Schema(description = "观察方式") + private String observe; + + @Schema(description = "监测频次") + private Integer dtfrqcy; + + @Schema(description = "备注") + private String remark; + + @Schema(description = "数据来源") + private String vlsr; + + @Schema(description = "数据来源时间") + private Date vlsrTm; + + @Schema(description = "建设状态") + private String bldstt; + + @Schema(description = "建设状态名称") + private String bldsttName; + + @Schema(description = "建设状态分类编码") + private String bldsttCcode; + + @Schema(description = "建设状态分类名称") + private String bldsttCcodeName; + + @Schema(description = "创建人") + private String recordUser; + + @Schema(description = "创建时间") + private Date recordTime; + + @Schema(description = "更新人") + private String modifyUser; + + @Schema(description = "更新时间") + private Date modifyTime; + + @Schema(description = "基地排序") + private Integer baseStepSort; + + @Schema(description = "流域排序") + private Integer rvcdStepSort; + + @Schema(description = "电站排序") + private Integer rstcdStepSort; + + @Schema(description = "站点排序") + private Integer siteStepSort; +} 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 new file mode 100644 index 00000000..3f387236 --- /dev/null +++ b/backend/src/main/java/com/yfd/platform/qgc_env/fpr/service/FprMonitorService.java @@ -0,0 +1,10 @@ +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.FprMsstbprptVo; + +public interface FprMonitorService { + + DataSourceResult getMsstbprptList(DataSourceRequest dataSourceRequest); +} 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 new file mode 100644 index 00000000..9afabdf1 --- /dev/null +++ b/backend/src/main/java/com/yfd/platform/qgc_env/fpr/service/impl/FprMonitorServiceImpl.java @@ -0,0 +1,554 @@ +package com.yfd.platform.qgc_env.fpr.service.impl; + +import cn.hutool.core.collection.CollUtil; +import cn.hutool.core.util.StrUtil; +import com.baomidou.mybatisplus.extension.plugins.pagination.Page; +import com.yfd.platform.common.DataSourceLoadOptionsBase; +import com.yfd.platform.common.DataSourceRequest; +import com.yfd.platform.common.DataSourceResult; +import com.yfd.platform.common.GroupHelper; +import com.yfd.platform.common.GroupingInfo; +import com.yfd.platform.common.MicroservicDynamicSQLMapper; +import com.yfd.platform.qgc_env.fpr.entity.vo.FprMsstbprptVo; +import com.yfd.platform.qgc_env.fpr.service.FprMonitorService; +import com.yfd.platform.utils.QgcQueryWrapperUtil; +import jakarta.annotation.Resource; +import org.springframework.stereotype.Service; + +import java.util.ArrayList; +import java.util.Arrays; +import java.util.HashMap; +import java.util.LinkedHashMap; +import java.util.List; +import java.util.Map; + +@Service +public class FprMonitorServiceImpl implements FprMonitorService { + + @Resource + private MicroservicDynamicSQLMapper microservicDynamicSQLMapper; + + @Override + public DataSourceResult getMsstbprptList(DataSourceRequest dataSourceRequest) { + DataSourceLoadOptionsBase loadOptions = dataSourceRequest == null ? null : dataSourceRequest.toDevRequest(); + Map paramMap = new HashMap<>(); + String filterSql = buildMsstbprptFilterCondition( + dataSourceRequest == null ? null : dataSourceRequest.getFilter(), + paramMap, + new int[]{0} + ); + + if (CollUtil.isNotEmpty(dataSourceRequest == null ? null : dataSourceRequest.getGroup())) { + StringBuilder groupedBaseSql = new StringBuilder("SELECT * FROM (") + .append(buildMsstbprptBaseSql()) + .append(") t WHERE 1 = 1 "); + if (StrUtil.isNotBlank(filterSql)) { + groupedBaseSql.append(" AND ").append(filterSql).append(" "); + } + GroupingInfo[] groupInfos = loadOptions == null ? null : loadOptions.getGroup(); + String groupedSql = buildMsstbprptGroupSql(groupedBaseSql.toString(), groupInfos); + List> rows = microservicDynamicSQLMapper.pageAllList(null, groupedSql, paramMap); + + DataSourceResult result = new DataSourceResult(); + if (Boolean.TRUE.equals(dataSourceRequest.getGroupResultFlat())) { + result.setData(new GroupHelper().faltGroup(rows, Arrays.asList(groupInfos))); + } else { + result.setData(new GroupHelper().group(rows, Arrays.asList(groupInfos))); + } + result.setTotal((long) rows.size()); + result.setAggregates(new HashMap<>()); + return result; + } + + StringBuilder sql = new StringBuilder("SELECT ") + .append(buildMsstbprptDetailSelectSql(dataSourceRequest == null ? null : dataSourceRequest.getSelect())) + .append(" FROM (") + .append(buildMsstbprptBaseSql()) + .append(") t WHERE 1 = 1 "); + if (StrUtil.isNotBlank(filterSql)) { + sql.append(" AND ").append(filterSql).append(" "); + } + sql.append(buildMsstbprptDetailOrderBySql(dataSourceRequest == null ? null : dataSourceRequest.getSort())); + + Page page = loadOptions == null ? null : QgcQueryWrapperUtil.buildPage(loadOptions, loadOptions.getSkip(), loadOptions.getTake()); + List list = microservicDynamicSQLMapper.pageAllListWithResultType( + page, sql.toString(), paramMap, FprMsstbprptVo.class + ); + + DataSourceResult result = new DataSourceResult<>(); + result.setData(list); + result.setTotal(page != null ? page.getTotal() : list.size()); + result.setAggregates(new HashMap<>()); + return result; + } + + private String buildMsstbprptBaseSql() { + return "SELECT " + + "CAST(NULL AS VARCHAR2(36)) AS id, " + + "NVL(src.IS_DELETED, 0) AS isDeleted, " + + "src.STCD AS stcd, " + + "src.STNM AS stnm, " + + "src.STTP AS sttp, " + + "src.STTP AS sttpCode, " + + "sttp.STTP_NAME AS sttpName, " + + "sttp.FULL_PATH AS sttpFullPath, " + + "sttp.TREE_LEVEL AS sttpTreeLevel, " + + "src.TM AS tm, " + + "src.LGTD AS lgtd, " + + "src.LTTD AS lttd, " + + "src.ELEV AS elev, " + + "src.STLC AS stlc, " + + "src.JCDT AS jcdt, " + + "src.WDDT AS wddt, " + + "src.INTRODUCE AS introduce, " + + "src.LOGO AS logo, " + + "src.INFFILE AS inffile, " + + "src.USFL AS usfl, " + + "src.DTIN AS dtin, " + + "CASE WHEN NVL(src.DTIN, 0) = 1 THEN '已接入' ELSE '未接入' END AS dtinName, " + + "src.DTIN_TM AS dtinTm, " + + "src.MWAY AS mway, " + + "CASE WHEN NVL(src.MWAY, 0) = 1 THEN '人工' WHEN NVL(src.MWAY, 0) = 2 THEN '自动' ELSE NULL END AS mwayName, " + + "src.STINDX AS stindx, " + + "src.ORDER_INDEX AS orderIndex, " + + "src.RSTCD AS rstcd, " + + "eng.ENNM AS ennm, " + + "src.BASE_ID AS baseId, " + + "hb.BASENAME AS baseName, " + + "src.HBRVCD AS hbrvcd, " + + "hbrv.HBRVNM AS hbrvcdName, " + + "src.RVCD AS rvcd, " + + "rv.RVNM AS rvcdName, " + + "src.PURPOSE AS purpose, " + + "src.OBSERVE AS observe, " + + "src.DTFRQCY AS dtfrqcy, " + + "src.REMARK AS remark, " + + "src.VLSR AS vlsr, " + + "src.VLSR_TM AS vlsrTm, " + + "TO_CHAR(src.BLDSTT_CODE) AS bldstt, " + + "CASE WHEN NVL(src.BLDSTT_CODE, 0) = 2 THEN '已建' WHEN NVL(src.BLDSTT_CODE, 0) = 1 THEN '在建' ELSE '未建/规划' END AS bldsttName, " + + "TO_CHAR(src.BLDSTT_CODE) AS bldsttCcode, " + + "CASE WHEN NVL(src.BLDSTT_CODE, 0) = 2 THEN '已建' WHEN NVL(src.BLDSTT_CODE, 0) = 1 THEN '在建' ELSE '未建/规划' END AS bldsttCcodeName, " + + "src.RECORD_USER AS recordUser, " + + "src.RECORD_TIME AS recordTime, " + + "src.MODIFY_USER AS modifyUser, " + + "src.MODIFY_TIME AS modifyTime, " + + "NVL(hb.ORDER_INDEX, 999999) AS baseStepSort, " + + "NVL(alongBase.ORDER_INDEX, 999999) AS rvcdStepSort, " + + "NVL(engSort.SORT, 999999) AS rstcdStepSort, " + + "NVL(siteSort.SORT, NVL(src.ORDER_INDEX, 999999)) AS siteStepSort " + + "FROM SD_FPRD_B_H src " + + "LEFT JOIN SD_ENGINFO_B_H eng ON eng.STCD = src.RSTCD AND NVL(eng.IS_DELETED, 0) = 0 " + + "LEFT JOIN SD_HYDROBASE hb ON hb.BASEID = src.BASE_ID AND NVL(hb.IS_DELETED, 0) = 0 " + + "LEFT JOIN SD_HBRV_DIC hbrv ON hbrv.HBRVCD = src.HBRVCD " + + " AND hbrv.BASEID = src.BASE_ID " + + " AND NVL(hbrv.IS_DELETED, 0) = 0 " + + " AND NVL(hbrv.ENABLED, 1) = 1 " + + "LEFT JOIN SD_RVCD_DIC rv ON rv.RVCD = src.RVCD " + + "LEFT JOIN SD_STTP_B sttp ON sttp.STTP_CODE = src.STTP " + + " AND NVL(sttp.IS_DELETED, 0) = 0 " + + " AND NVL(sttp.ENABLE, 1) = 1 " + + "LEFT JOIN MS_ALONG_B alongBase ON alongBase.RVCD = src.HBRVCD " + + " AND alongBase.CODE = 'common' " + + " AND NVL(alongBase.IS_DELETED, 0) = 0 " + + "LEFT JOIN ( " + + " SELECT det.STCD, det.SORT, along.RVCD " + + " FROM MS_ALONGDET_B det " + + " INNER JOIN MS_ALONG_B along ON det.ALONG_ID = along.ID " + + " WHERE NVL(det.IS_DELETED, 0) = 0 " + + " AND NVL(along.IS_DELETED, 0) = 0 " + + " AND along.CODE = 'common' " + + ") engSort ON engSort.RVCD = src.HBRVCD AND engSort.STCD = src.RSTCD " + + "LEFT JOIN ( " + + " SELECT det.STCD, det.SORT, along.RVCD " + + " FROM MS_ALONGDET_B det " + + " INNER JOIN MS_ALONG_B along ON det.ALONG_ID = along.ID " + + " WHERE NVL(det.IS_DELETED, 0) = 0 " + + " AND NVL(along.IS_DELETED, 0) = 0 " + + " AND along.CODE = 'common' " + + ") siteSort ON siteSort.RVCD = src.HBRVCD AND siteSort.STCD = src.STCD " + + "WHERE NVL(src.IS_DELETED, 0) = 0 "; + } + + private String buildMsstbprptDetailSelectSql(List selectFields) { + LinkedHashMap columnMap = buildMsstbprptSelectColumnMap(); + if (CollUtil.isEmpty(selectFields)) { + return String.join(", ", columnMap.values()); + } + List selectColumns = new ArrayList<>(); + for (String field : selectFields) { + String column = columnMap.get(field); + if (StrUtil.isNotBlank(column)) { + selectColumns.add(column); + } + } + return selectColumns.isEmpty() ? String.join(", ", columnMap.values()) : String.join(", ", selectColumns); + } + + private LinkedHashMap buildMsstbprptSelectColumnMap() { + LinkedHashMap columnMap = new LinkedHashMap<>(); + columnMap.put("id", "t.id AS id"); + columnMap.put("isDeleted", "t.isDeleted AS isDeleted"); + columnMap.put("stcd", "t.stcd AS stcd"); + columnMap.put("stnm", "t.stnm AS stnm"); + columnMap.put("sttp", "t.sttp AS sttp"); + columnMap.put("sttpCode", "t.sttpCode AS sttpCode"); + columnMap.put("sttpName", "t.sttpName AS sttpName"); + columnMap.put("sttpFullPath", "t.sttpFullPath AS sttpFullPath"); + columnMap.put("sttpTreeLevel", "t.sttpTreeLevel AS sttpTreeLevel"); + columnMap.put("tm", "t.tm AS tm"); + columnMap.put("lgtd", "t.lgtd AS lgtd"); + columnMap.put("lttd", "t.lttd AS lttd"); + columnMap.put("elev", "t.elev AS elev"); + columnMap.put("stlc", "t.stlc AS stlc"); + columnMap.put("jcdt", "t.jcdt AS jcdt"); + columnMap.put("wddt", "t.wddt AS wddt"); + columnMap.put("introduce", "t.introduce AS introduce"); + columnMap.put("logo", "t.logo AS logo"); + columnMap.put("inffile", "t.inffile AS inffile"); + columnMap.put("usfl", "t.usfl AS usfl"); + columnMap.put("dtin", "t.dtin AS dtin"); + columnMap.put("dtinName", "t.dtinName AS dtinName"); + columnMap.put("dtinTm", "t.dtinTm AS dtinTm"); + columnMap.put("mway", "t.mway AS mway"); + columnMap.put("mwayName", "t.mwayName AS mwayName"); + columnMap.put("stindx", "t.stindx AS stindx"); + columnMap.put("orderIndex", "t.orderIndex AS orderIndex"); + columnMap.put("rstcd", "t.rstcd AS rstcd"); + columnMap.put("ennm", "t.ennm AS ennm"); + columnMap.put("baseId", "t.baseId AS baseId"); + columnMap.put("baseName", "t.baseName AS baseName"); + columnMap.put("hbrvcd", "t.hbrvcd AS hbrvcd"); + columnMap.put("hbrvcdName", "t.hbrvcdName AS hbrvcdName"); + columnMap.put("rvcd", "t.rvcd AS rvcd"); + columnMap.put("rvcdName", "t.rvcdName AS rvcdName"); + columnMap.put("purpose", "t.purpose AS purpose"); + columnMap.put("observe", "t.observe AS observe"); + columnMap.put("dtfrqcy", "t.dtfrqcy AS dtfrqcy"); + columnMap.put("remark", "t.remark AS remark"); + columnMap.put("vlsr", "t.vlsr AS vlsr"); + columnMap.put("vlsrTm", "t.vlsrTm AS vlsrTm"); + columnMap.put("bldstt", "t.bldstt AS bldstt"); + columnMap.put("bldsttName", "t.bldsttName AS bldsttName"); + columnMap.put("bldsttCcode", "t.bldsttCcode AS bldsttCcode"); + columnMap.put("bldsttCcodeName", "t.bldsttCcodeName AS bldsttCcodeName"); + columnMap.put("recordUser", "t.recordUser AS recordUser"); + columnMap.put("recordTime", "t.recordTime AS recordTime"); + columnMap.put("modifyUser", "t.modifyUser AS modifyUser"); + columnMap.put("modifyTime", "t.modifyTime AS modifyTime"); + columnMap.put("baseStepSort", "t.baseStepSort AS baseStepSort"); + columnMap.put("rvcdStepSort", "t.rvcdStepSort AS rvcdStepSort"); + columnMap.put("rstcdStepSort", "t.rstcdStepSort AS rstcdStepSort"); + columnMap.put("siteStepSort", "t.siteStepSort AS siteStepSort"); + return columnMap; + } + + private String buildMsstbprptFilterCondition(DataSourceRequest.FilterDescriptor filter, + Map paramMap, + int[] indexHolder) { + if (filter == null) { + return ""; + } + if (StrUtil.isNotBlank(filter.getField())) { + return buildMsstbprptLeafCondition(filter, paramMap, indexHolder); + } + if (filter.getFilters() == null || filter.getFilters().isEmpty()) { + return ""; + } + List conditions = new ArrayList<>(); + for (DataSourceRequest.FilterDescriptor child : filter.getFilters()) { + String childSql = buildMsstbprptFilterCondition(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 buildMsstbprptLeafCondition(DataSourceRequest.FilterDescriptor filter, + Map paramMap, + int[] indexHolder) { + String field = filter.getField(); + String operator = StrUtil.blankToDefault(filter.getOperator(), "eq").toLowerCase(); + Object value = filter.getValue(); + + if ("keyword".equals(field)) { + if (value == null || StrUtil.isBlank(String.valueOf(value))) { + return ""; + } + String paramKey = "fprP" + indexHolder[0]++; + paramMap.put(paramKey, "%" + value + "%"); + return "(t.stcd LIKE #{map." + paramKey + "} " + + "OR t.stnm LIKE #{map." + paramKey + "} " + + "OR t.baseName LIKE #{map." + paramKey + "} " + + "OR t.ennm LIKE #{map." + paramKey + "} " + + "OR t.introduce LIKE #{map." + paramKey + "})"; + } + + String column = mapMsstbprptColumn(field); + if (StrUtil.isBlank(column)) { + return ""; + } + if (isDateField(field)) { + return buildDateCondition(column, operator, value, paramMap, indexHolder, "fprP"); + } + 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 = "fprP" + indexHolder[0]++; + paramMap.put(paramKey, item); + placeholders.add("#{map." + paramKey + "}"); + } + return column + " IN (" + String.join(", ", placeholders) + ")"; + } + if (value == null) { + return ""; + } + String paramKey = "fprP" + 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 mapMsstbprptColumn(String field) { + if (StrUtil.isBlank(field)) { + return null; + } + return switch (field) { + case "id" -> "t.id"; + case "isDeleted" -> "t.isDeleted"; + case "stcd" -> "t.stcd"; + case "stnm" -> "t.stnm"; + case "sttp" -> "t.sttp"; + case "sttpCode" -> "t.sttpCode"; + case "sttpName" -> "t.sttpName"; + case "sttpFullPath" -> "t.sttpFullPath"; + case "sttpTreeLevel" -> "t.sttpTreeLevel"; + case "tm" -> "t.tm"; + case "lgtd" -> "t.lgtd"; + case "lttd" -> "t.lttd"; + case "elev" -> "t.elev"; + case "stlc" -> "t.stlc"; + case "jcdt" -> "t.jcdt"; + case "wddt" -> "t.wddt"; + case "introduce" -> "t.introduce"; + case "logo" -> "t.logo"; + case "inffile" -> "t.inffile"; + case "usfl" -> "t.usfl"; + case "dtin" -> "t.dtin"; + case "dtinName" -> "t.dtinName"; + case "dtinTm" -> "t.dtinTm"; + case "mway" -> "t.mway"; + case "mwayName" -> "t.mwayName"; + case "stindx" -> "t.stindx"; + case "orderIndex" -> "t.orderIndex"; + case "rstcd" -> "t.rstcd"; + case "ennm" -> "t.ennm"; + case "baseId" -> "t.baseId"; + case "baseName" -> "t.baseName"; + case "hbrvcd" -> "t.hbrvcd"; + case "hbrvcdName" -> "t.hbrvcdName"; + case "rvcd" -> "t.rvcd"; + case "rvcdName" -> "t.rvcdName"; + case "purpose" -> "t.purpose"; + case "observe" -> "t.observe"; + case "dtfrqcy" -> "t.dtfrqcy"; + case "remark" -> "t.remark"; + case "vlsr" -> "t.vlsr"; + case "vlsrTm" -> "t.vlsrTm"; + case "bldstt" -> "t.bldstt"; + case "bldsttName" -> "t.bldsttName"; + case "bldsttCcode" -> "t.bldsttCcode"; + case "bldsttCcodeName" -> "t.bldsttCcodeName"; + case "recordUser" -> "t.recordUser"; + case "recordTime" -> "t.recordTime"; + case "modifyUser" -> "t.modifyUser"; + case "modifyTime" -> "t.modifyTime"; + case "baseStepSort" -> "t.baseStepSort"; + case "rvcdStepSort" -> "t.rvcdStepSort"; + case "rstcdStepSort" -> "t.rstcdStepSort"; + case "siteStepSort" -> "t.siteStepSort"; + default -> null; + }; + } + + private String buildMsstbprptDetailOrderBySql(List sorts) { + List orderItems = new ArrayList<>(); + if (CollUtil.isNotEmpty(sorts)) { + for (DataSourceRequest.SortDescriptor sort : sorts) { + if (sort == null || StrUtil.isBlank(sort.getField())) { + continue; + } + String column = mapMsstbprptColumn(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.baseStepSort ASC NULLS LAST, t.rvcdStepSort ASC NULLS LAST, " + + "t.rstcdStepSort ASC NULLS LAST, t.siteStepSort ASC NULLS LAST, t.stcd ASC"; + } + return " ORDER BY " + String.join(", ", orderItems); + } + + private String buildMsstbprptGroupSql(String detailSql, GroupingInfo[] groupInfos) { + if (groupInfos == null || groupInfos.length == 0) { + return detailSql; + } + List groupFields = new ArrayList<>(); + List selectItems = new ArrayList<>(); + List orderItems = new ArrayList<>(); + for (GroupingInfo item : groupInfos) { + if (item == null || StrUtil.isBlank(item.getSelector())) { + continue; + } + String selector = item.getSelector(); + String column = mapMsstbprptColumn(selector); + if (StrUtil.isBlank(column)) { + continue; + } + groupFields.add(column); + selectItems.add(column + " AS " + selector); + selectItems.add("COUNT(*) AS count_" + selector); + orderItems.add(column + (item.getDesc() ? " DESC" : " ASC")); + } + if (groupFields.isEmpty()) { + return "SELECT * FROM (" + detailSql + ") t WHERE 1 = 0"; + } + return "SELECT " + String.join(", ", selectItems) + + " FROM (" + detailSql + ") t GROUP BY " + String.join(", ", groupFields) + + " ORDER BY " + String.join(", ", orderItems); + } + + private List normalizeValues(Object value) { + List values = new ArrayList<>(); + if (value == null) { + return values; + } + if (value instanceof List list) { + values.addAll(list); + return values; + } + String text = StrUtil.trim(String.valueOf(value)); + if (StrUtil.isBlank(text)) { + return values; + } + if (text.startsWith("[") && text.endsWith("]")) { + text = text.substring(1, text.length() - 1); + } + for (String item : text.split(",")) { + String trimmed = StrUtil.trim(item); + if (StrUtil.isNotBlank(trimmed)) { + values.add(StrUtil.removeAll(trimmed, "\"")); + } + } + return values; + } + + private boolean isDateField(String field) { + return "tm".equals(field) + || "jcdt".equals(field) + || "wddt".equals(field) + || "dtinTm".equals(field) + || "vlsrTm".equals(field) + || "recordTime".equals(field) + || "modifyTime".equals(field); + } + + private String buildDateCondition(String column, + String operator, + Object value, + Map paramMap, + int[] indexHolder, + String paramPrefix) { + if ("isnull".equals(operator)) { + return column + " IS NULL"; + } + if ("isnotnull".equals(operator)) { + return column + " IS NOT NULL"; + } + if (value == null || StrUtil.isBlank(String.valueOf(value))) { + return ""; + } + String dateValue = normalizeDateValue(String.valueOf(value)); + if (StrUtil.isBlank(dateValue)) { + return ""; + } + String paramKey = paramPrefix + indexHolder[0]++; + paramMap.put(paramKey, dateValue); + String dateExpr = "TO_DATE(#{map." + paramKey + "}, '" + resolveOracleDateFormat(dateValue) + "')"; + return switch (operator) { + case "eq" -> column + " = " + dateExpr; + case "neq" -> column + " <> " + dateExpr; + case "gt" -> column + " > " + dateExpr; + case "gte" -> column + " >= " + dateExpr; + case "lt" -> column + " < " + dateExpr; + case "lte" -> column + " <= " + dateExpr; + default -> ""; + }; + } + + private String normalizeDateValue(String value) { + String normalized = StrUtil.trim(value); + if (normalized.contains("T")) { + normalized = normalized.replace("T", " "); + } + if (normalized.endsWith("Z")) { + normalized = normalized.substring(0, normalized.length() - 1); + } + int dotIndex = normalized.indexOf('.'); + if (dotIndex > 0) { + normalized = normalized.substring(0, dotIndex); + } + return normalized; + } + + private String resolveOracleDateFormat(String value) { + return value != null && value.length() > 10 ? "YYYY-MM-DD HH24:MI:SS" : "YYYY-MM-DD"; + } +} From e4a2a5db6aac559d376068e0ce395e9d3d509171 Mon Sep 17 00:00:00 2001 From: tangwei Date: Fri, 12 Jun 2026 09:46:07 +0800 Subject: [PATCH 17/34] =?UTF-8?q?feat:=20=E6=A0=B9=E6=8D=AE=E6=9D=A1?= =?UTF-8?q?=E4=BB=B6=E6=9F=A5=E8=AF=A2=E8=BF=87=E9=B1=BC=E8=AE=BE=E6=96=BD?= =?UTF-8?q?=E9=B1=BC=E9=81=93=E4=BC=A0=E6=84=9F=E5=99=A8=E5=9F=BA=E7=A1=80?= =?UTF-8?q?=E5=88=97=E8=A1=A8?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../fp/controller/FishPassageController.java | 6 + .../qgc_env/fp/entity/vo/FpVmsstbprptVo.java | 21 ++ .../qgc_env/fp/service/FpBuildService.java | 2 + .../fp/service/impl/FpBuildServiceImpl.java | 244 +++++++++++++++++- 4 files changed, 266 insertions(+), 7 deletions(-) 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 495f05ca..b14fb25c 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 @@ -70,6 +70,12 @@ public class FishPassageController { return ResponseResult.successData(fpBuildService.getVmsstbprptList(dataSourceRequest)); } + @PostMapping("/fpq/msstbprpt/GetKendoList") + @Operation(summary = "根据条件查询过鱼设施鱼道传感器基础列表") + public ResponseResult getFpqMsstbprptList(@RequestBody DataSourceRequest dataSourceRequest) { + return ResponseResult.successData(fpBuildService.getFpqMsstbprptList(dataSourceRequest)); + } + @GetMapping("/msstbprpt/getStInfoByStcd") @Operation(summary = "根据站码查询单条过鱼设施基础数据") public ResponseResult getStInfoByStcd(@RequestParam String stcd) { diff --git a/backend/src/main/java/com/yfd/platform/qgc_env/fp/entity/vo/FpVmsstbprptVo.java b/backend/src/main/java/com/yfd/platform/qgc_env/fp/entity/vo/FpVmsstbprptVo.java index 174a4d1e..83915608 100644 --- a/backend/src/main/java/com/yfd/platform/qgc_env/fp/entity/vo/FpVmsstbprptVo.java +++ b/backend/src/main/java/com/yfd/platform/qgc_env/fp/entity/vo/FpVmsstbprptVo.java @@ -16,9 +16,18 @@ public class FpVmsstbprptVo implements Serializable { @Schema(description = "过鱼设施编码") private String stcd; + @Schema(description = "旧接口兼容站码") + private String stCode; + @Schema(description = "过鱼设施名称") private String stnm; + @Schema(description = "旧接口兼容站名") + private String stName; + + @Schema(description = "过鱼设施类型") + private String sttp; + @Schema(description = "过鱼设施类型编码") private String sttpCode; @@ -208,6 +217,12 @@ public class FpVmsstbprptVo implements Serializable { @Schema(description = "主要过鱼月份") private String fpssmn; + @Schema(description = "监测方式") + private Integer mway; + + @Schema(description = "监测方式名称") + private String mwayName; + @Schema(description = "数据监测频次") private Integer dtfrqcy; @@ -229,6 +244,12 @@ public class FpVmsstbprptVo implements Serializable { @Schema(description = "LOGO") private String logo; + @Schema(description = "旧接口兼容排序") + private Integer orderIndex; + + @Schema(description = "描述") + private String description; + @Schema(description = "数据来源时间") private Date vlsrTm; 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 8d1cefac..b7ff92f2 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 @@ -11,5 +11,7 @@ public interface FpBuildService { DataSourceResult getVmsstbprptList(DataSourceRequest dataSourceRequest); + DataSourceResult getFpqMsstbprptList(DataSourceRequest dataSourceRequest); + FpVmsstbprptVo getStInfoByStcd(String stcd); } 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 0f92c70f..e30b2f22 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 @@ -58,18 +58,37 @@ public class FpBuildServiceImpl implements FpBuildService { @Override public DataSourceResult getVmsstbprptList(DataSourceRequest dataSourceRequest) { + return queryVmsstbprptList(dataSourceRequest, null); + } + + @Override + public DataSourceResult getFpqMsstbprptList(DataSourceRequest dataSourceRequest) { + return queryVmsstbprptList(dataSourceRequest, "FPQ"); + } + + private DataSourceResult queryVmsstbprptList(DataSourceRequest dataSourceRequest, String fixedSttpCode) { DataSourceLoadOptionsBase loadOptions = dataSourceRequest == null ? null : dataSourceRequest.toDevRequest(); Page page = loadOptions == null ? null : QgcQueryWrapperUtil.buildPage(loadOptions, loadOptions.getSkip(), loadOptions.getTake()); Map paramMap = new HashMap<>(); - StringBuilder sql = new StringBuilder(buildVmsstbprptBaseSql()); + StringBuilder innerSql = new StringBuilder(buildVmsstbprptBaseSql()); + if (fixedSttpCode != null && !fixedSttpCode.isBlank()) { + paramMap.put("fixedSttpCode", fixedSttpCode); + innerSql.append(" AND fp.STTP = #{map.fixedSttpCode}"); + } String filterSql = buildVmsstbprptFilterCondition(dataSourceRequest == null ? null : dataSourceRequest.getFilter(), paramMap, new int[]{0}); if (!filterSql.isBlank()) { - sql.append(" AND ").append(filterSql); + innerSql.append(" AND ").append(filterSql); } + StringBuilder sql = new StringBuilder("SELECT ") + .append(buildVmsstbprptSelectSql(dataSourceRequest == null ? null : dataSourceRequest.getSelect())) + .append(" FROM (") + .append(innerSql) + .append(") t "); + sql.append(buildVmsstbprptOrderBySql(dataSourceRequest == null ? null : dataSourceRequest.getSort())); List list = microservicDynamicSQLMapper.pageAllListWithResultType( @@ -98,8 +117,11 @@ public class FpBuildServiceImpl implements FpBuildService { StringBuilder sql = new StringBuilder(); sql.append("SELECT ") .append("fp.STCD AS stcd, ") + .append("fp.STCD AS stCode, ") .append("fp.LOGO AS logo, ") .append("fp.STNM AS stnm, ") + .append("fp.STNM AS stName, ") + .append("fp.STTP AS sttp, ") .append("fp.STTP AS sttpCode, ") .append("sttp.STTP_NAME AS sttpName, ") .append("sttp.FULL_PATH AS sttpFullPath, ") @@ -170,9 +192,13 @@ public class FpBuildServiceImpl implements FpBuildService { .append("fp.JBTXCS AS jbtxcs, ") .append("fp.IS_UP AS isUp, ") .append("fp.IS_DOWN AS isDown, ") + .append("CAST(NULL AS NUMBER(1,0)) AS mway, ") + .append("CAST(NULL AS VARCHAR2(32)) AS mwayName, ") .append("fp.REMARK AS remark, ") .append("fp.VLSR AS vlsr, ") .append("fp.VLSR_TM AS vlsrTm, ") + .append("fp.ORDER_INDEX AS orderIndex, ") + .append("CAST(NULL AS VARCHAR2(1000)) AS description, ") .append("NVL(hb.ORDER_INDEX, 999999) AS baseStepSort, ") .append("NVL(hbrv.ORDER_INDEX, 999999) AS rvcdStepSort, ") .append("NVL(eng.ORDER_INDEX, 999999) AS rstcdStepSort, ") @@ -188,6 +214,110 @@ public class FpBuildServiceImpl implements FpBuildService { return sql.toString(); } + private String buildVmsstbprptSelectSql(List selectFields) { + if (CollectionUtils.isEmpty(selectFields)) { + return "t.*"; + } + Map selectMap = buildVmsstbprptSelectMap(); + List selectItems = new ArrayList<>(); + for (String field : selectFields) { + String column = selectMap.get(field); + if (column != null && !column.isBlank()) { + selectItems.add(column); + } + } + return selectItems.isEmpty() ? "t.*" : String.join(", ", selectItems); + } + + private Map buildVmsstbprptSelectMap() { + Map selectMap = new HashMap<>(); + selectMap.put("stcd", "t.stcd AS stcd"); + selectMap.put("stCode", "t.stCode AS stCode"); + selectMap.put("stnm", "t.stnm AS stnm"); + selectMap.put("stName", "t.stName AS stName"); + selectMap.put("sttp", "t.sttp AS sttp"); + selectMap.put("sttpCode", "t.sttpCode AS sttpCode"); + selectMap.put("sttpName", "t.sttpName AS sttpName"); + selectMap.put("sttpFullPath", "t.sttpFullPath AS sttpFullPath"); + selectMap.put("sttpTreeLevel", "t.sttpTreeLevel AS sttpTreeLevel"); + selectMap.put("rstcd", "t.rstcd AS rstcd"); + selectMap.put("ennm", "t.ennm AS ennm"); + selectMap.put("baseId", "t.baseId AS baseId"); + selectMap.put("baseName", "t.baseName AS baseName"); + selectMap.put("hbrvcd", "t.hbrvcd AS hbrvcd"); + selectMap.put("hbrvcdName", "t.hbrvcdName AS hbrvcdName"); + selectMap.put("lgtd", "t.lgtd AS lgtd"); + selectMap.put("lttd", "t.lttd AS lttd"); + selectMap.put("elev", "t.elev AS elev"); + selectMap.put("stlc", "t.stlc AS stlc"); + selectMap.put("dtin", "t.dtin AS dtin"); + selectMap.put("dtinName", "t.dtinName AS dtinName"); + selectMap.put("dtinTm", "t.dtinTm AS dtinTm"); + selectMap.put("bldsttCcode", "t.bldsttCcode AS bldsttCcode"); + selectMap.put("bldsttCcodeName", "t.bldsttCcodeName AS bldsttCcodeName"); + selectMap.put("stdsdt", "t.stdsdt AS stdsdt"); + selectMap.put("pststdt", "t.pststdt AS pststdt"); + selectMap.put("pesstdt", "t.pesstdt AS pesstdt"); + selectMap.put("swdt", "t.swdt AS swdt"); + selectMap.put("jcdt", "t.jcdt AS jcdt"); + selectMap.put("wddt", "t.wddt AS wddt"); + selectMap.put("introduce", "t.introduce AS introduce"); + selectMap.put("ydxs", "t.ydxs AS ydxs"); + selectMap.put("ydzcd", "t.ydzcd AS ydzcd"); + selectMap.put("ydjkz", "t.ydjkz AS ydjkz"); + selectMap.put("ydjkcnt", "t.ydjkcnt AS ydjkcnt"); + selectMap.put("jkhg", "t.jkhg AS jkhg"); + selectMap.put("ydyyxs", "t.ydyyxs AS ydyyxs"); + selectMap.put("ydckz", "t.ydckz AS ydckz"); + selectMap.put("ydckcnt", "t.ydckcnt AS ydckcnt"); + selectMap.put("ckhg", "t.ckhg AS ckhg"); + selectMap.put("ydcsv", "t.ydcsv AS ydcsv"); + selectMap.put("ydcscd", "t.ydcscd AS ydcscd"); + selectMap.put("ydcskd", "t.ydcskd AS ydcskd"); + selectMap.put("ydcspd", "t.ydcspd AS ydcspd"); + selectMap.put("ydcscnt", "t.ydcscnt AS ydcscnt"); + selectMap.put("ydxxccnt", "t.ydxxccnt AS ydxxccnt"); + selectMap.put("v", "t.v AS v"); + selectMap.put("fzrdmxz", "t.fzrdmxz AS fzrdmxz"); + selectMap.put("fzrtdsz", "t.fzrtdsz AS fzrtdsz"); + selectMap.put("fzryxwdp", "t.fzryxwdp AS fzryxwdp"); + selectMap.put("fzrpj", "t.fzrpj AS fzrpj"); + selectMap.put("symtlc", "t.symtlc AS symtlc"); + selectMap.put("symtxs", "t.symtxs AS symtxs"); + selectMap.put("xymtlc", "t.xymtlc AS xymtlc"); + selectMap.put("xymtxs", "t.xymtxs AS xymtxs"); + selectMap.put("jyfs", "t.jyfs AS jyfs"); + selectMap.put("yyfs", "t.yyfs AS yyfs"); + selectMap.put("syjcnt", "t.syjcnt AS syjcnt"); + selectMap.put("syjhg", "t.syjhg AS syjhg"); + selectMap.put("syjq", "t.syjq AS syjq"); + selectMap.put("syjsz", "t.syjsz AS syjsz"); + selectMap.put("syjwdp", "t.syjwdp AS syjwdp"); + selectMap.put("sjgycnt", "t.sjgycnt AS sjgycnt"); + selectMap.put("zygydxms", "t.zygydxms AS zygydxms"); + selectMap.put("jggydxms", "t.jggydxms AS jggydxms"); + selectMap.put("gytm", "t.gytm AS gytm"); + selectMap.put("yxtm", "t.yxtm AS yxtm"); + selectMap.put("fpssmn", "t.fpssmn AS fpssmn"); + selectMap.put("dtfrqcy", "t.dtfrqcy AS dtfrqcy"); + selectMap.put("jbtxcs", "t.jbtxcs AS jbtxcs"); + selectMap.put("isUp", "t.isUp AS isUp"); + selectMap.put("isDown", "t.isDown AS isDown"); + selectMap.put("mway", "t.mway AS mway"); + selectMap.put("mwayName", "t.mwayName AS mwayName"); + selectMap.put("remark", "t.remark AS remark"); + selectMap.put("vlsr", "t.vlsr AS vlsr"); + selectMap.put("vlsrTm", "t.vlsrTm AS vlsrTm"); + selectMap.put("logo", "t.logo AS logo"); + selectMap.put("orderIndex", "t.orderIndex AS orderIndex"); + selectMap.put("description", "t.description AS description"); + selectMap.put("baseStepSort", "t.baseStepSort AS baseStepSort"); + selectMap.put("rvcdStepSort", "t.rvcdStepSort AS rvcdStepSort"); + selectMap.put("rstcdStepSort", "t.rstcdStepSort AS rstcdStepSort"); + selectMap.put("siteStepSort", "t.siteStepSort AS siteStepSort"); + return selectMap; + } + private String buildVmsstbprptFilterCondition(DataSourceRequest.FilterDescriptor filter, Map paramMap, int[] indexHolder) { @@ -309,8 +439,11 @@ public class FpBuildServiceImpl implements FpBuildService { } Map columnMap = new HashMap<>(); columnMap.put("stcd", "fp.STCD"); + columnMap.put("stCode", "fp.ST_CODE"); columnMap.put("logo", "fp.LOGO"); columnMap.put("stnm", "fp.STNM"); + columnMap.put("stName", "fp.STNM"); + columnMap.put("sttp", "fp.STTP"); columnMap.put("sttpCode", "fp.STTP"); columnMap.put("sttpName", "sttp.STTP_NAME"); columnMap.put("sttpFullPath", "sttp.FULL_PATH"); @@ -378,9 +511,13 @@ public class FpBuildServiceImpl implements FpBuildService { columnMap.put("jbtxcs", "fp.JBTXCS"); columnMap.put("isUp", "fp.IS_UP"); columnMap.put("isDown", "fp.IS_DOWN"); + columnMap.put("mway", "NULL"); + columnMap.put("mwayName", "NULL"); columnMap.put("remark", "fp.REMARK"); columnMap.put("vlsr", "fp.VLSR"); columnMap.put("vlsrTm", "fp.VLSR_TM"); + columnMap.put("orderIndex", "fp.ORDER_INDEX"); + columnMap.put("description", "NULL"); columnMap.put("siteStepSort", "fp.ORDER_INDEX"); columnMap.put("rstcdStepSort", "eng.ORDER_INDEX"); columnMap.put("baseStepSort", "hb.ORDER_INDEX"); @@ -390,15 +527,15 @@ public class FpBuildServiceImpl implements FpBuildService { private String buildVmsstbprptOrderBySql(List sorts) { if (sorts == null || sorts.isEmpty()) { - return " ORDER BY NVL(hb.ORDER_INDEX, 999999) ASC, NVL(hbrv.ORDER_INDEX, 999999) ASC, " + - "NVL(eng.ORDER_INDEX, 999999) ASC, NVL(fp.ORDER_INDEX, 999999) ASC, fp.STCD ASC"; + return " ORDER BY t.baseStepSort ASC NULLS LAST, t.rvcdStepSort ASC NULLS LAST, " + + "t.rstcdStepSort ASC NULLS LAST, t.siteStepSort ASC NULLS LAST, t.stcd ASC"; } List orderItems = new ArrayList<>(); for (DataSourceRequest.SortDescriptor sort : sorts) { if (sort == null || sort.getField() == null || sort.getField().isBlank()) { continue; } - String column = mapVmsstbprptColumn(sort.getField()); + String column = mapVmsstbprptOuterColumn(sort.getField()); if (column == null) { continue; } @@ -406,9 +543,102 @@ public class FpBuildServiceImpl implements FpBuildService { orderItems.add(column + " " + direction + " NULLS LAST"); } if (orderItems.isEmpty()) { - return " ORDER BY NVL(hb.ORDER_INDEX, 999999) ASC, NVL(hbrv.ORDER_INDEX, 999999) ASC, " + - "NVL(eng.ORDER_INDEX, 999999) ASC, NVL(fp.ORDER_INDEX, 999999) ASC, fp.STCD ASC"; + return " ORDER BY t.baseStepSort ASC NULLS LAST, t.rvcdStepSort ASC NULLS LAST, " + + "t.rstcdStepSort ASC NULLS LAST, t.siteStepSort ASC NULLS LAST, t.stcd ASC"; } return " ORDER BY " + String.join(", ", orderItems); } + + private String mapVmsstbprptOuterColumn(String field) { + if (field == null || field.isBlank()) { + return null; + } + return switch (field) { + case "stcd" -> "t.stcd"; + case "stCode" -> "t.stCode"; + case "logo" -> "t.logo"; + case "stnm" -> "t.stnm"; + case "stName" -> "t.stName"; + case "sttp" -> "t.sttp"; + case "sttpCode" -> "t.sttpCode"; + case "sttpName" -> "t.sttpName"; + case "sttpFullPath" -> "t.sttpFullPath"; + case "sttpTreeLevel" -> "t.sttpTreeLevel"; + case "rstcd" -> "t.rstcd"; + case "ennm" -> "t.ennm"; + case "baseId" -> "t.baseId"; + case "baseName" -> "t.baseName"; + case "hbrvcd" -> "t.hbrvcd"; + case "hbrvcdName" -> "t.hbrvcdName"; + case "lgtd" -> "t.lgtd"; + case "lttd" -> "t.lttd"; + case "elev" -> "t.elev"; + case "stlc" -> "t.stlc"; + case "dtin" -> "t.dtin"; + case "dtinName" -> "t.dtinName"; + case "dtinTm" -> "t.dtinTm"; + case "bldsttCcode" -> "t.bldsttCcode"; + case "bldsttCcodeName" -> "t.bldsttCcodeName"; + case "stdsdt" -> "t.stdsdt"; + case "pststdt" -> "t.pststdt"; + case "pesstdt" -> "t.pesstdt"; + case "swdt" -> "t.swdt"; + case "jcdt" -> "t.jcdt"; + case "wddt" -> "t.wddt"; + case "introduce" -> "t.introduce"; + case "ydxs" -> "t.ydxs"; + case "ydzcd" -> "t.ydzcd"; + case "ydjkz" -> "t.ydjkz"; + case "ydjkcnt" -> "t.ydjkcnt"; + case "jkhg" -> "t.jkhg"; + case "ydyyxs" -> "t.ydyyxs"; + case "ydckz" -> "t.ydckz"; + case "ydckcnt" -> "t.ydckcnt"; + case "ckhg" -> "t.ckhg"; + case "ydcsv" -> "t.ydcsv"; + case "ydcscd" -> "t.ydcscd"; + case "ydcskd" -> "t.ydcskd"; + case "ydcspd" -> "t.ydcspd"; + case "ydcscnt" -> "t.ydcscnt"; + case "ydxxccnt" -> "t.ydxxccnt"; + case "v" -> "t.v"; + case "fzrdmxz" -> "t.fzrdmxz"; + case "fzrtdsz" -> "t.fzrtdsz"; + case "fzryxwdp" -> "t.fzryxwdp"; + case "fzrpj" -> "t.fzrpj"; + case "symtlc" -> "t.symtlc"; + case "symtxs" -> "t.symtxs"; + case "xymtlc" -> "t.xymtlc"; + case "xymtxs" -> "t.xymtxs"; + case "jyfs" -> "t.jyfs"; + case "yyfs" -> "t.yyfs"; + case "syjcnt" -> "t.syjcnt"; + case "syjhg" -> "t.syjhg"; + case "syjq" -> "t.syjq"; + case "syjsz" -> "t.syjsz"; + case "syjwdp" -> "t.syjwdp"; + case "sjgycnt" -> "t.sjgycnt"; + case "zygydxms" -> "t.zygydxms"; + case "jggydxms" -> "t.jggydxms"; + case "gytm" -> "t.gytm"; + case "yxtm" -> "t.yxtm"; + case "fpssmn" -> "t.fpssmn"; + case "dtfrqcy" -> "t.dtfrqcy"; + case "jbtxcs" -> "t.jbtxcs"; + case "isUp" -> "t.isUp"; + case "isDown" -> "t.isDown"; + case "mway" -> "t.mway"; + case "mwayName" -> "t.mwayName"; + case "remark" -> "t.remark"; + case "vlsr" -> "t.vlsr"; + case "vlsrTm" -> "t.vlsrTm"; + case "orderIndex" -> "t.orderIndex"; + case "description" -> "t.description"; + case "baseStepSort" -> "t.baseStepSort"; + case "rvcdStepSort" -> "t.rvcdStepSort"; + case "rstcdStepSort" -> "t.rstcdStepSort"; + case "siteStepSort" -> "t.siteStepSort"; + default -> null; + }; + } } From 85244333dffcf11522cf026d1bb679bea7b1a6c8 Mon Sep 17 00:00:00 2001 From: tangwei Date: Fri, 12 Jun 2026 09:54:54 +0800 Subject: [PATCH 18/34] =?UTF-8?q?fix:=20=E6=A0=B9=E6=8D=AE=E6=9D=A1?= =?UTF-8?q?=E4=BB=B6=E6=9F=A5=E8=AF=A2=E8=BF=87=E9=B1=BC=E8=AE=BE=E6=96=BD?= =?UTF-8?q?=E9=B1=BC=E9=81=93=E4=BC=A0=E6=84=9F=E5=99=A8=E5=9F=BA=E7=A1=80?= =?UTF-8?q?=E5=88=97=E8=A1=A8?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../fp/controller/FishPassageController.java | 14 ++++++++++---- 1 file changed, 10 insertions(+), 4 deletions(-) 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 b14fb25c..a803fd10 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 @@ -70,12 +70,18 @@ public class FishPassageController { return ResponseResult.successData(fpBuildService.getVmsstbprptList(dataSourceRequest)); } - @PostMapping("/fpq/msstbprpt/GetKendoList") - @Operation(summary = "根据条件查询过鱼设施鱼道传感器基础列表") - public ResponseResult getFpqMsstbprptList(@RequestBody DataSourceRequest dataSourceRequest) { - return ResponseResult.successData(fpBuildService.getFpqMsstbprptList(dataSourceRequest)); + @PostMapping("/msstbprpt/GetKendoList") + @Operation(summary = "根据条件查询过鱼设施基础列表(公用)") + public ResponseResult getCommonMsstbprptList(@RequestBody DataSourceRequest dataSourceRequest) { + return ResponseResult.successData(fpBuildService.getVmsstbprptList(dataSourceRequest)); } +// @PostMapping("/fpq/msstbprpt/GetKendoList") +// @Operation(summary = "根据条件查询过鱼设施鱼道传感器基础列表") +// public ResponseResult getFpqMsstbprptList(@RequestBody DataSourceRequest dataSourceRequest) { +// return ResponseResult.successData(fpBuildService.getFpqMsstbprptList(dataSourceRequest)); +// } + @GetMapping("/msstbprpt/getStInfoByStcd") @Operation(summary = "根据站码查询单条过鱼设施基础数据") public ResponseResult getStInfoByStcd(@RequestParam String stcd) { From d7474cefb9f71bd131a6e76f353683d7d4c12dda Mon Sep 17 00:00:00 2001 From: tangwei Date: Fri, 12 Jun 2026 10:16:12 +0800 Subject: [PATCH 19/34] =?UTF-8?q?feat:=20=E6=9F=A5=E8=AF=A2=E5=9F=BA?= =?UTF-8?q?=E5=9C=B0/=E5=9F=BA=E5=9C=B0=E6=B5=81=E5=9F=9F=E6=A0=91?= =?UTF-8?q?=E6=95=B0=E6=8D=AE?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../eq/service/impl/EngEqDataServiceImpl.java | 2 +- .../qgc_env/fpr/controller/FprMonitorController.java | 12 ++++++++++++ 2 files changed, 13 insertions(+), 1 deletion(-) 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 3aba66c4..49d442b7 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 @@ -2976,7 +2976,7 @@ public class EngEqDataServiceImpl implements EngEqDataService { "CASE WHEN t.PBASEID = '0' THEN NULL ELSE t.PBASEID END AS parentCode, " + "t.GRD AS treeLevel, " + "CASE WHEN EXISTS (SELECT 1 FROM SD_HYDROBASE c WHERE c.PBASEID = t.BASEID AND NVL(c.IS_DELETED, 0) = 0) THEN 1 ELSE 0 END AS hasChildren, " + - "CAST(NULL AS VARCHAR2(36)) AS objId, " + + "t.BASEID AS objId, " + "CAST(NULL AS VARCHAR2(20)) AS topWbsType, " + "t.PATH AS fullPath, " + "1 AS internal, " + 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 8a3b1c22..733c5d0d 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 @@ -2,6 +2,7 @@ package com.yfd.platform.qgc_env.fpr.controller; import com.yfd.platform.common.DataSourceRequest; import com.yfd.platform.config.ResponseResult; +import com.yfd.platform.qgc_eng.eq.service.EngEqDataService; import com.yfd.platform.qgc_env.fpr.service.FprMonitorService; import io.swagger.v3.oas.annotations.Operation; import io.swagger.v3.oas.annotations.tags.Tag; @@ -21,9 +22,20 @@ public class FprMonitorController { @Resource private FprMonitorService fprMonitorService; + @Resource + private EngEqDataService engEqDataService; + + @PostMapping("/msstbprpt/GetKendoList") @Operation(summary = "鱼类调查装置站基础列表") public ResponseResult getMsstbprptList(@RequestBody DataSourceRequest dataSourceRequest) { return ResponseResult.successData(fprMonitorService.getMsstbprptList(dataSourceRequest)); } + + @PostMapping("/wbsb/GetKendoList") + @Operation(summary = "查询基地/基地流域树数据") + public ResponseResult getWbsbList(@RequestBody DataSourceRequest dataSourceRequest) { + return ResponseResult.successData(engEqDataService.getWbsbList(dataSourceRequest)); + } + } From aa5f9a76c6829bd33df63df0095c4820a7fa62ab Mon Sep 17 00:00:00 2001 From: tangwei Date: Fri, 12 Jun 2026 10:27:45 +0800 Subject: [PATCH 20/34] =?UTF-8?q?feat:=20=E9=B1=BC=E7=B1=BB=E5=AD=97?= =?UTF-8?q?=E5=85=B8=E5=88=97=E8=A1=A8?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../fpr/controller/FprMonitorController.java | 6 + .../qgc_env/fpr/entity/vo/FprFishDicVo.java | 73 +++ .../fpr/service/FprMonitorService.java | 3 + .../service/impl/FprMonitorServiceImpl.java | 429 ++++++++++++++++++ 4 files changed, 511 insertions(+) create mode 100644 backend/src/main/java/com/yfd/platform/qgc_env/fpr/entity/vo/FprFishDicVo.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 733c5d0d..42656cb7 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 @@ -32,6 +32,12 @@ public class FprMonitorController { return ResponseResult.successData(fprMonitorService.getMsstbprptList(dataSourceRequest)); } + @PostMapping("/fishDic/GetKendoList") + @Operation(summary = "鱼类字典列表") + public ResponseResult getFishDicList(@RequestBody DataSourceRequest dataSourceRequest) { + return ResponseResult.successData(fprMonitorService.getFishDicList(dataSourceRequest)); + } + @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/FprFishDicVo.java b/backend/src/main/java/com/yfd/platform/qgc_env/fpr/entity/vo/FprFishDicVo.java new file mode 100644 index 00000000..96e5bf92 --- /dev/null +++ b/backend/src/main/java/com/yfd/platform/qgc_env/fpr/entity/vo/FprFishDicVo.java @@ -0,0 +1,73 @@ +package com.yfd.platform.qgc_env.fpr.entity.vo; + +import io.swagger.v3.oas.annotations.media.Schema; +import lombok.Data; + +import java.util.Date; + +@Data +@Schema(description = "鱼类字典信息") +public class FprFishDicVo { + + private String id; + private String code; + private String name; + private String nameEn; + private String alias; + private String logo; + private String introduce; + private String inffile; + private String orders; + private String family; + private String genus; + private String species; + private Integer type; + private String typeName; + private String fsz; + private Integer rare; + private String rareName; + private Integer specOrigin; + private String specOriginName; + private Integer ptype; + private String ptypeName; + private String rvcd; + private String rvcdName; + private String habitMigrat; + private String feedingHabit; + private String spawnCharact; + private String food; + private String timeFeed; + private String orignDate; + private String pretemp; + private String flowRate; + private String depth; + private String botmMater; + private String wqtq; + private String wqtqName; + private Integer habitat; + private String habitatName; + private Integer situation; + private String situationName; + private Integer resourceType; + private String resourceTypeName; + private String shapedesc; + private String protectlvl; + private String habitation; + private String fid; + private String description; + private Integer enable; + private String enableName; + private Integer internal; + private String internalName; + private Integer orderIndex; + private String recordUser; + private Date recordTime; + private String modifyUser; + private Date modifyTime; + private Integer isDeleted; + private String deleteUser; + private Date deleteTime; + private String spawnMonth; + private String vlsr; + private Date vlsrTm; +} 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 3f387236..5c8d434d 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,9 +2,12 @@ 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.FprFishDicVo; import com.yfd.platform.qgc_env.fpr.entity.vo.FprMsstbprptVo; public interface FprMonitorService { DataSourceResult getMsstbprptList(DataSourceRequest dataSourceRequest); + + DataSourceResult getFishDicList(DataSourceRequest dataSourceRequest); } 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 9afabdf1..06256add 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 @@ -9,6 +9,7 @@ import com.yfd.platform.common.DataSourceResult; import com.yfd.platform.common.GroupHelper; import com.yfd.platform.common.GroupingInfo; import com.yfd.platform.common.MicroservicDynamicSQLMapper; +import com.yfd.platform.qgc_env.fpr.entity.vo.FprFishDicVo; import com.yfd.platform.qgc_env.fpr.entity.vo.FprMsstbprptVo; import com.yfd.platform.qgc_env.fpr.service.FprMonitorService; import com.yfd.platform.utils.QgcQueryWrapperUtil; @@ -82,6 +83,60 @@ public class FprMonitorServiceImpl implements FprMonitorService { return result; } + @Override + public DataSourceResult getFishDicList(DataSourceRequest dataSourceRequest) { + DataSourceLoadOptionsBase loadOptions = dataSourceRequest == null ? null : dataSourceRequest.toDevRequest(); + Map paramMap = new HashMap<>(); + String filterSql = buildFishDicFilterCondition( + dataSourceRequest == null ? null : dataSourceRequest.getFilter(), + paramMap, + new int[]{0} + ); + + if (CollUtil.isNotEmpty(dataSourceRequest == null ? null : dataSourceRequest.getGroup())) { + StringBuilder groupedBaseSql = new StringBuilder("SELECT * FROM (") + .append(buildFishDicBaseSql()) + .append(") t WHERE 1 = 1 "); + if (StrUtil.isNotBlank(filterSql)) { + groupedBaseSql.append(" AND ").append(filterSql).append(" "); + } + GroupingInfo[] groupInfos = loadOptions == null ? null : loadOptions.getGroup(); + String groupedSql = buildFishDicGroupSql(groupedBaseSql.toString(), groupInfos); + List> rows = microservicDynamicSQLMapper.pageAllList(null, groupedSql, paramMap); + + DataSourceResult result = new DataSourceResult(); + if (Boolean.TRUE.equals(dataSourceRequest.getGroupResultFlat())) { + result.setData(new GroupHelper().faltGroup(rows, Arrays.asList(groupInfos))); + } else { + result.setData(new GroupHelper().group(rows, Arrays.asList(groupInfos))); + } + result.setTotal((long) rows.size()); + result.setAggregates(new HashMap<>()); + return result; + } + + StringBuilder sql = new StringBuilder("SELECT ") + .append(buildFishDicDetailSelectSql(dataSourceRequest == null ? null : dataSourceRequest.getSelect())) + .append(" FROM (") + .append(buildFishDicBaseSql()) + .append(") t WHERE 1 = 1 "); + if (StrUtil.isNotBlank(filterSql)) { + sql.append(" AND ").append(filterSql).append(" "); + } + sql.append(buildFishDicOrderBySql(dataSourceRequest == null ? null : dataSourceRequest.getSort())); + + Page page = loadOptions == null ? null : QgcQueryWrapperUtil.buildPage(loadOptions, loadOptions.getSkip(), loadOptions.getTake()); + List list = microservicDynamicSQLMapper.pageAllListWithResultType( + page, sql.toString(), paramMap, FprFishDicVo.class + ); + + DataSourceResult result = new DataSourceResult<>(); + result.setData(list); + result.setTotal(page != null ? page.getTotal() : list.size()); + result.setAggregates(new HashMap<>()); + return result; + } + private String buildMsstbprptBaseSql() { return "SELECT " + "CAST(NULL AS VARCHAR2(36)) AS id, " + @@ -170,6 +225,77 @@ public class FprMonitorServiceImpl implements FprMonitorService { "WHERE NVL(src.IS_DELETED, 0) = 0 "; } + private String buildFishDicBaseSql() { + return "SELECT " + + "src.ID AS id, " + + "src.CODE AS code, " + + "src.NAME AS name, " + + "src.NAME_EN AS nameEn, " + + "src.ALIAS AS alias, " + + "src.LOGO AS logo, " + + "src.INTRODUCE AS introduce, " + + "src.INFFILE AS inffile, " + + "src.ORDERS AS orders, " + + "src.FAMILY AS family, " + + "src.GENUS AS genus, " + + "src.SPECIES AS species, " + + "src.TYPE AS type, " + + "CASE WHEN src.TYPE = 1 THEN '淡水' WHEN src.TYPE = 2 THEN '海水' ELSE NULL END AS typeName, " + + "src.FSZ AS fsz, " + + "src.RARE AS rare, " + + "CASE WHEN src.RARE = 1 THEN '是' WHEN src.RARE = 0 THEN '否' ELSE NULL END AS rareName, " + + "src.SPEC_ORIGIN AS specOrigin, " + + "CASE WHEN src.SPEC_ORIGIN = 1 THEN '本土物种' WHEN src.SPEC_ORIGIN = 2 THEN '外来物种' ELSE NULL END AS specOriginName, " + + "src.PTYPE AS ptype, " + + "CASE src.PTYPE " + + "WHEN 1 THEN '濒危' WHEN 2 THEN '极危' WHEN 3 THEN '近危' WHEN 4 THEN '易危' " + + "WHEN 5 THEN '重点保护' WHEN 6 THEN '无危' WHEN 7 THEN '国家二级' WHEN 8 THEN '市二级保护' ELSE NULL END AS ptypeName, " + + "src.RVCD AS rvcd, " + + "rv.RVNM AS rvcdName, " + + "src.HABIT_MIGRAT AS habitMigrat, " + + "src.FEEDING_HABIT AS feedingHabit, " + + "src.SPAWN_CHARACT AS spawnCharact, " + + "src.FOOD AS food, " + + "src.TIME_FEED AS timeFeed, " + + "src.ORIGN_DATE AS orignDate, " + + "src.PRETEMP AS pretemp, " + + "src.FLOW_RATE AS flowRate, " + + "src.DEPTH AS depth, " + + "src.BOTM_MATER AS botmMater, " + + "src.WQTQ AS wqtq, " + + "CASE src.WQTQ " + + "WHEN '1' THEN 'Ⅰ类' WHEN '2' THEN 'Ⅱ类' WHEN '3' THEN 'Ⅲ类' WHEN '4' THEN 'Ⅳ类' WHEN '5' THEN 'Ⅴ类' WHEN '6' THEN '劣V类' ELSE NULL END AS wqtqName, " + + "src.HABITAT AS habitat, " + + "CASE src.HABITAT WHEN 1 THEN '流水生境' WHEN 2 THEN '静缓流生境' WHEN 3 THEN '洞穴生境' ELSE NULL END AS habitatName, " + + "src.SITUATION AS situation, " + + "CASE src.SITUATION WHEN 1 THEN '优势种' WHEN 2 THEN '常见种' WHEN 3 THEN '少见种' WHEN 4 THEN '记录种' ELSE NULL END AS situationName, " + + "src.RESOURCE_TYPE AS resourceType, " + + "CASE src.RESOURCE_TYPE WHEN 1 THEN '保护鱼类' WHEN 2 THEN '特有鱼类' WHEN 3 THEN '重要经济鱼类' WHEN 4 THEN '濒危状况' ELSE NULL END AS resourceTypeName, " + + "src.SHAPEDESC AS shapedesc, " + + "src.PROTECTLVL AS protectlvl, " + + "src.HABITATION AS habitation, " + + "src.FID AS fid, " + + "src.DESCRIPTION AS description, " + + "src.ENABLE AS enable, " + + "CASE WHEN src.ENABLE = 1 THEN '启用' WHEN src.ENABLE = 0 THEN '禁用' ELSE NULL END AS enableName, " + + "src.INTERNAL AS internal, " + + "CASE WHEN src.INTERNAL = 1 THEN '是' WHEN src.INTERNAL = 0 THEN '否' ELSE NULL END AS internalName, " + + "src.ORDER_INDEX AS orderIndex, " + + "src.RECORD_USER AS recordUser, " + + "src.RECORD_TIME AS recordTime, " + + "src.MODIFY_USER AS modifyUser, " + + "src.MODIFY_TIME AS modifyTime, " + + "src.IS_DELETED AS isDeleted, " + + "src.DELETE_USER AS deleteUser, " + + "src.DELETE_TIME AS deleteTime, " + + "src.SPAWN_MONTH AS spawnMonth, " + + "src.VLSR AS vlsr, " + + "src.VLSR_TM AS vlsrTm " + + "FROM SD_FISHDICTORY_B src " + + "LEFT JOIN SD_RVCD_DIC rv ON rv.RVCD = src.RVCD " + + "WHERE NVL(src.IS_DELETED, 0) = 0 "; + } + private String buildMsstbprptDetailSelectSql(List selectFields) { LinkedHashMap columnMap = buildMsstbprptSelectColumnMap(); if (CollUtil.isEmpty(selectFields)) { @@ -243,6 +369,87 @@ public class FprMonitorServiceImpl implements FprMonitorService { return columnMap; } + private String buildFishDicDetailSelectSql(List selectFields) { + LinkedHashMap columnMap = buildFishDicSelectColumnMap(); + if (CollUtil.isEmpty(selectFields)) { + return String.join(", ", columnMap.values()); + } + List selectColumns = new ArrayList<>(); + for (String field : selectFields) { + String column = columnMap.get(field); + if (StrUtil.isNotBlank(column)) { + selectColumns.add(column); + } + } + return selectColumns.isEmpty() ? String.join(", ", columnMap.values()) : String.join(", ", selectColumns); + } + + private LinkedHashMap buildFishDicSelectColumnMap() { + LinkedHashMap columnMap = new LinkedHashMap<>(); + columnMap.put("id", "t.id AS id"); + columnMap.put("code", "t.code AS code"); + columnMap.put("name", "t.name AS name"); + columnMap.put("nameEn", "t.nameEn AS nameEn"); + columnMap.put("alias", "t.alias AS alias"); + columnMap.put("logo", "t.logo AS logo"); + columnMap.put("introduce", "t.introduce AS introduce"); + columnMap.put("inffile", "t.inffile AS inffile"); + columnMap.put("orders", "t.orders AS orders"); + columnMap.put("family", "t.family AS family"); + columnMap.put("genus", "t.genus AS genus"); + columnMap.put("species", "t.species AS species"); + columnMap.put("type", "t.type AS type"); + columnMap.put("typeName", "t.typeName AS typeName"); + columnMap.put("fsz", "t.fsz AS fsz"); + columnMap.put("rare", "t.rare AS rare"); + columnMap.put("rareName", "t.rareName AS rareName"); + columnMap.put("specOrigin", "t.specOrigin AS specOrigin"); + columnMap.put("specOriginName", "t.specOriginName AS specOriginName"); + columnMap.put("ptype", "t.ptype AS ptype"); + columnMap.put("ptypeName", "t.ptypeName AS ptypeName"); + columnMap.put("rvcd", "t.rvcd AS rvcd"); + columnMap.put("rvcdName", "t.rvcdName AS rvcdName"); + columnMap.put("habitMigrat", "t.habitMigrat AS habitMigrat"); + columnMap.put("feedingHabit", "t.feedingHabit AS feedingHabit"); + columnMap.put("spawnCharact", "t.spawnCharact AS spawnCharact"); + columnMap.put("food", "t.food AS food"); + columnMap.put("timeFeed", "t.timeFeed AS timeFeed"); + columnMap.put("orignDate", "t.orignDate AS orignDate"); + columnMap.put("pretemp", "t.pretemp AS pretemp"); + columnMap.put("flowRate", "t.flowRate AS flowRate"); + columnMap.put("depth", "t.depth AS depth"); + columnMap.put("botmMater", "t.botmMater AS botmMater"); + columnMap.put("wqtq", "t.wqtq AS wqtq"); + columnMap.put("wqtqName", "t.wqtqName AS wqtqName"); + columnMap.put("habitat", "t.habitat AS habitat"); + columnMap.put("habitatName", "t.habitatName AS habitatName"); + columnMap.put("situation", "t.situation AS situation"); + columnMap.put("situationName", "t.situationName AS situationName"); + columnMap.put("resourceType", "t.resourceType AS resourceType"); + columnMap.put("resourceTypeName", "t.resourceTypeName AS resourceTypeName"); + columnMap.put("shapedesc", "t.shapedesc AS shapedesc"); + columnMap.put("protectlvl", "t.protectlvl AS protectlvl"); + columnMap.put("habitation", "t.habitation AS habitation"); + columnMap.put("fid", "t.fid AS fid"); + columnMap.put("description", "t.description AS description"); + columnMap.put("enable", "t.enable AS enable"); + columnMap.put("enableName", "t.enableName AS enableName"); + columnMap.put("internal", "t.internal AS internal"); + columnMap.put("internalName", "t.internalName AS internalName"); + columnMap.put("orderIndex", "t.orderIndex AS orderIndex"); + columnMap.put("recordUser", "t.recordUser AS recordUser"); + columnMap.put("recordTime", "t.recordTime AS recordTime"); + columnMap.put("modifyUser", "t.modifyUser AS modifyUser"); + columnMap.put("modifyTime", "t.modifyTime AS modifyTime"); + columnMap.put("isDeleted", "t.isDeleted AS isDeleted"); + columnMap.put("deleteUser", "t.deleteUser AS deleteUser"); + columnMap.put("deleteTime", "t.deleteTime AS deleteTime"); + columnMap.put("spawnMonth", "t.spawnMonth AS spawnMonth"); + columnMap.put("vlsr", "t.vlsr AS vlsr"); + columnMap.put("vlsrTm", "t.vlsrTm AS vlsrTm"); + return columnMap; + } + private String buildMsstbprptFilterCondition(DataSourceRequest.FilterDescriptor filter, Map paramMap, int[] indexHolder) { @@ -268,6 +475,31 @@ public class FprMonitorServiceImpl implements FprMonitorService { return String.join("or".equalsIgnoreCase(filter.getLogic()) ? " OR " : " AND ", conditions); } + private String buildFishDicFilterCondition(DataSourceRequest.FilterDescriptor filter, + Map paramMap, + int[] indexHolder) { + if (filter == null) { + return ""; + } + if (StrUtil.isNotBlank(filter.getField())) { + return buildFishDicLeafCondition(filter, paramMap, indexHolder); + } + if (filter.getFilters() == null || filter.getFilters().isEmpty()) { + return ""; + } + List conditions = new ArrayList<>(); + for (DataSourceRequest.FilterDescriptor child : filter.getFilters()) { + String childSql = buildFishDicFilterCondition(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 buildMsstbprptLeafCondition(DataSourceRequest.FilterDescriptor filter, Map paramMap, int[] indexHolder) { @@ -351,6 +583,75 @@ public class FprMonitorServiceImpl implements FprMonitorService { } } + private String buildFishDicLeafCondition(DataSourceRequest.FilterDescriptor filter, + Map paramMap, + int[] indexHolder) { + String field = filter.getField(); + String operator = StrUtil.blankToDefault(filter.getOperator(), "eq").toLowerCase(); + Object value = filter.getValue(); + String column = mapFishDicColumn(field); + if (StrUtil.isBlank(column)) { + return ""; + } + if (isFishDicDateField(field)) { + return buildDateCondition(column, operator, value, paramMap, indexHolder, "fishDicP"); + } + 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 = "fishDicP" + indexHolder[0]++; + paramMap.put(paramKey, item); + placeholders.add("#{map." + paramKey + "}"); + } + return column + " IN (" + String.join(", ", placeholders) + ")"; + } + if (value == null) { + return ""; + } + String paramKey = "fishDicP" + 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 mapMsstbprptColumn(String field) { if (StrUtil.isBlank(field)) { return null; @@ -413,6 +714,76 @@ public class FprMonitorServiceImpl implements FprMonitorService { }; } + private String mapFishDicColumn(String field) { + if (StrUtil.isBlank(field)) { + return null; + } + return switch (field) { + case "id" -> "t.id"; + case "code" -> "t.code"; + case "name" -> "t.name"; + case "nameEn" -> "t.nameEn"; + case "alias" -> "t.alias"; + case "logo" -> "t.logo"; + case "introduce" -> "t.introduce"; + case "inffile" -> "t.inffile"; + case "orders" -> "t.orders"; + case "family" -> "t.family"; + case "genus" -> "t.genus"; + case "species" -> "t.species"; + case "type" -> "t.type"; + case "typeName" -> "t.typeName"; + case "fsz" -> "t.fsz"; + case "rare" -> "t.rare"; + case "rareName" -> "t.rareName"; + case "specOrigin" -> "t.specOrigin"; + case "specOriginName" -> "t.specOriginName"; + case "ptype" -> "t.ptype"; + case "ptypeName" -> "t.ptypeName"; + case "rvcd" -> "t.rvcd"; + case "rvcdName" -> "t.rvcdName"; + case "habitMigrat" -> "t.habitMigrat"; + case "feedingHabit" -> "t.feedingHabit"; + case "spawnCharact" -> "t.spawnCharact"; + case "food" -> "t.food"; + case "timeFeed" -> "t.timeFeed"; + case "orignDate" -> "t.orignDate"; + case "pretemp" -> "t.pretemp"; + case "flowRate" -> "t.flowRate"; + case "depth" -> "t.depth"; + case "botmMater" -> "t.botmMater"; + case "wqtq" -> "t.wqtq"; + case "wqtqName" -> "t.wqtqName"; + case "habitat" -> "t.habitat"; + case "habitatName" -> "t.habitatName"; + case "situation" -> "t.situation"; + case "situationName" -> "t.situationName"; + case "resourceType" -> "t.resourceType"; + case "resourceTypeName" -> "t.resourceTypeName"; + case "shapedesc" -> "t.shapedesc"; + case "protectlvl" -> "t.protectlvl"; + case "habitation" -> "t.habitation"; + case "fid" -> "t.fid"; + case "description" -> "t.description"; + case "enable" -> "t.enable"; + case "enableName" -> "t.enableName"; + case "internal" -> "t.internal"; + case "internalName" -> "t.internalName"; + case "orderIndex" -> "t.orderIndex"; + case "recordUser" -> "t.recordUser"; + case "recordTime" -> "t.recordTime"; + case "modifyUser" -> "t.modifyUser"; + case "modifyTime" -> "t.modifyTime"; + case "isDeleted" -> "t.isDeleted"; + case "deleteUser" -> "t.deleteUser"; + case "deleteTime" -> "t.deleteTime"; + case "spawnMonth" -> "t.spawnMonth"; + case "vlsr" -> "t.vlsr"; + case "vlsrTm" -> "t.vlsrTm"; + default -> null; + }; + } + private String buildMsstbprptDetailOrderBySql(List sorts) { List orderItems = new ArrayList<>(); if (CollUtil.isNotEmpty(sorts)) { @@ -436,6 +807,28 @@ public class FprMonitorServiceImpl implements FprMonitorService { return " ORDER BY " + String.join(", ", orderItems); } + private String buildFishDicOrderBySql(List sorts) { + List orderItems = new ArrayList<>(); + if (CollUtil.isNotEmpty(sorts)) { + for (DataSourceRequest.SortDescriptor sort : sorts) { + if (sort == null || StrUtil.isBlank(sort.getField())) { + continue; + } + String column = mapFishDicColumn(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.orderIndex ASC NULLS LAST, t.name ASC"; + } + return " ORDER BY " + String.join(", ", orderItems); + } + private String buildMsstbprptGroupSql(String detailSql, GroupingInfo[] groupInfos) { if (groupInfos == null || groupInfos.length == 0) { return detailSql; @@ -465,6 +858,35 @@ public class FprMonitorServiceImpl implements FprMonitorService { " ORDER BY " + String.join(", ", orderItems); } + private String buildFishDicGroupSql(String detailSql, GroupingInfo[] groupInfos) { + if (groupInfos == null || groupInfos.length == 0) { + return detailSql; + } + List groupFields = new ArrayList<>(); + List selectItems = new ArrayList<>(); + List orderItems = new ArrayList<>(); + for (GroupingInfo item : groupInfos) { + if (item == null || StrUtil.isBlank(item.getSelector())) { + continue; + } + String selector = item.getSelector(); + String column = mapFishDicColumn(selector); + if (StrUtil.isBlank(column)) { + continue; + } + groupFields.add(column); + selectItems.add(column + " AS " + selector); + selectItems.add("COUNT(*) AS count_" + selector); + orderItems.add(column + (item.getDesc() ? " DESC" : " ASC")); + } + if (groupFields.isEmpty()) { + return "SELECT * FROM (" + detailSql + ") t WHERE 1 = 0"; + } + return "SELECT " + String.join(", ", selectItems) + + " FROM (" + detailSql + ") t GROUP BY " + String.join(", ", groupFields) + + " ORDER BY " + String.join(", ", orderItems); + } + private List normalizeValues(Object value) { List values = new ArrayList<>(); if (value == null) { @@ -500,6 +922,13 @@ public class FprMonitorServiceImpl implements FprMonitorService { || "modifyTime".equals(field); } + private boolean isFishDicDateField(String field) { + return "recordTime".equals(field) + || "modifyTime".equals(field) + || "deleteTime".equals(field) + || "vlsrTm".equals(field); + } + private String buildDateCondition(String column, String operator, Object value, From 539e5e9315e55647ddd29cc8ffa27ed501e48abe Mon Sep 17 00:00:00 2001 From: tangwei Date: Fri, 12 Jun 2026 10:43:27 +0800 Subject: [PATCH 21/34] =?UTF-8?q?feat:=20=E8=8E=B7=E5=8F=96=E9=B1=BC?= =?UTF-8?q?=E7=B1=BB=E8=B0=83=E6=9F=A5=E8=A3=85=E7=BD=AE=E6=A6=82=E5=86=B5?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../fpr/controller/FprMonitorController.java | 9 +++ .../qgc_env/fpr/entity/ao/FprdRunDataAo.java | 21 ++++++ .../fpr/entity/vo/FprdRunDataInfoVo.java | 18 +++++ .../fpr/service/FprMonitorService.java | 4 + .../service/impl/FprMonitorServiceImpl.java | 74 +++++++++++++++++++ 5 files changed, 126 insertions(+) create mode 100644 backend/src/main/java/com/yfd/platform/qgc_env/fpr/entity/ao/FprdRunDataAo.java create mode 100644 backend/src/main/java/com/yfd/platform/qgc_env/fpr/entity/vo/FprdRunDataInfoVo.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 42656cb7..fa260bf9 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 @@ -2,7 +2,9 @@ package com.yfd.platform.qgc_env.fpr.controller; import com.yfd.platform.common.DataSourceRequest; import com.yfd.platform.config.ResponseResult; +import com.yfd.platform.qgc_env.fpr.entity.ao.FprdRunDataAo; 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.service.FprMonitorService; import io.swagger.v3.oas.annotations.Operation; import io.swagger.v3.oas.annotations.tags.Tag; @@ -38,6 +40,13 @@ public class FprMonitorController { return ResponseResult.successData(fprMonitorService.getFishDicList(dataSourceRequest)); } + @PostMapping("/sdFprdR/getFprdDataInfo") + @Operation(summary = "获取鱼类调查装置概况") + public ResponseResult getFprdRunDataInfo(@RequestBody FprdRunDataAo ao) { + FprdRunDataInfoVo result = fprMonitorService.getFprdRunDataInfo(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/ao/FprdRunDataAo.java b/backend/src/main/java/com/yfd/platform/qgc_env/fpr/entity/ao/FprdRunDataAo.java new file mode 100644 index 00000000..eab31d0a --- /dev/null +++ b/backend/src/main/java/com/yfd/platform/qgc_env/fpr/entity/ao/FprdRunDataAo.java @@ -0,0 +1,21 @@ +package com.yfd.platform.qgc_env.fpr.entity.ao; + +import io.swagger.v3.oas.annotations.media.Schema; +import lombok.Data; + +@Data +@Schema(description = "鱼类调查装置概况查询参数") +public class FprdRunDataAo { + + @Schema(description = "基地编码") + private String baseId; + + @Schema(description = "基地流域编码") + private String hbrvcd; + + @Schema(description = "站点编码,旧接口保留字段") + private String stcd; + + @Schema(description = "年度") + private Integer year; +} diff --git a/backend/src/main/java/com/yfd/platform/qgc_env/fpr/entity/vo/FprdRunDataInfoVo.java b/backend/src/main/java/com/yfd/platform/qgc_env/fpr/entity/vo/FprdRunDataInfoVo.java new file mode 100644 index 00000000..e7eda870 --- /dev/null +++ b/backend/src/main/java/com/yfd/platform/qgc_env/fpr/entity/vo/FprdRunDataInfoVo.java @@ -0,0 +1,18 @@ +package com.yfd.platform.qgc_env.fpr.entity.vo; + +import io.swagger.v3.oas.annotations.media.Schema; +import lombok.Data; + +@Data +@Schema(description = "鱼类调查装置概况") +public class FprdRunDataInfoVo { + + @Schema(description = "鱼类调查装置数量") + private Integer fprdCount; + + @Schema(description = "鱼类种数") + private Integer ftpCount; + + @Schema(description = "鱼类记录数") + private Integer fishCount; +} 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 5c8d434d..e8ff69e0 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,12 +2,16 @@ 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.ao.FprdRunDataAo; 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.FprdRunDataInfoVo; public interface FprMonitorService { DataSourceResult getMsstbprptList(DataSourceRequest dataSourceRequest); DataSourceResult getFishDicList(DataSourceRequest dataSourceRequest); + + FprdRunDataInfoVo getFprdRunDataInfo(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 06256add..6934c32a 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 @@ -1,5 +1,7 @@ package com.yfd.platform.qgc_env.fpr.service.impl; +import cn.hutool.core.bean.BeanUtil; +import cn.hutool.core.bean.copier.CopyOptions; import cn.hutool.core.collection.CollUtil; import cn.hutool.core.util.StrUtil; import com.baomidou.mybatisplus.extension.plugins.pagination.Page; @@ -9,8 +11,11 @@ import com.yfd.platform.common.DataSourceResult; import com.yfd.platform.common.GroupHelper; import com.yfd.platform.common.GroupingInfo; import com.yfd.platform.common.MicroservicDynamicSQLMapper; +import com.yfd.platform.common.exception.BizException; +import com.yfd.platform.qgc_env.fpr.entity.ao.FprdRunDataAo; 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.FprdRunDataInfoVo; import com.yfd.platform.qgc_env.fpr.service.FprMonitorService; import com.yfd.platform.utils.QgcQueryWrapperUtil; import jakarta.annotation.Resource; @@ -29,6 +34,36 @@ public class FprMonitorServiceImpl implements FprMonitorService { @Resource private MicroservicDynamicSQLMapper microservicDynamicSQLMapper; + @Override + public FprdRunDataInfoVo getFprdRunDataInfo(FprdRunDataAo ao) { + if (ao == null) { + throw new BizException("请求参数不能为空."); + } + if (StrUtil.isBlank(ao.getBaseId())) { + throw new BizException("基地编码(baseId)不能为空."); + } + if (ao.getYear() == null) { + throw new BizException("年度(year)不能为空."); + } + + Map paramMap = new HashMap<>(); + paramMap.put("baseId", ao.getBaseId()); + paramMap.put("year", String.valueOf(ao.getYear())); + if (StrUtil.isNotBlank(ao.getHbrvcd())) { + paramMap.put("hbrvcd", ao.getHbrvcd()); + } + + Map row = microservicDynamicSQLMapper.getOneBySql(buildFprdRunDataInfoSql(ao), paramMap); + if (row == null || row.isEmpty()) { + return new FprdRunDataInfoVo(); + } + return BeanUtil.fillBeanWithMap( + row, + new FprdRunDataInfoVo(), + CopyOptions.create().setIgnoreCase(true).setIgnoreError(true) + ); + } + @Override public DataSourceResult getMsstbprptList(DataSourceRequest dataSourceRequest) { DataSourceLoadOptionsBase loadOptions = dataSourceRequest == null ? null : dataSourceRequest.toDevRequest(); @@ -225,6 +260,45 @@ public class FprMonitorServiceImpl implements FprMonitorService { "WHERE NVL(src.IS_DELETED, 0) = 0 "; } + private String buildFprdRunDataInfoSql(FprdRunDataAo ao) { + StringBuilder sql = new StringBuilder("SELECT ") + .append("NVL((SELECT COUNT(1) ") + .append(" FROM SD_FPRD_B_H baseCnt ") + .append(" WHERE NVL(baseCnt.IS_DELETED, 0) = 0 ") + .append(" AND baseCnt.STTP = 'FPRD' ") + .append(" AND baseCnt.BASE_ID = #{map.baseId}), 0) AS fprdCount, ") + .append("NVL((SELECT COUNT(DISTINCT fish.NAME) ") + .append(" FROM SD_FPRD_R run ") + .append(" INNER JOIN SD_FPRD_B_H base ON base.STCD = run.STCD ") + .append(" AND NVL(base.IS_DELETED, 0) = 0 ") + .append(" AND base.STTP = 'FPRD' ") + .append(" INNER JOIN SD_FPRDFISH_R fish ON fish.FPRDR_ID = run.ID ") + .append(" AND NVL(fish.IS_DELETED, 0) = 0 ") + .append(" WHERE NVL(run.IS_DELETED, 0) = 0 ") + .append(" AND TO_CHAR(run.TM, 'YYYY') = #{map.year} ") + .append(" AND base.BASE_ID = #{map.baseId} "); + if (StrUtil.isNotBlank(ao.getHbrvcd())) { + sql.append(" AND base.HBRVCD = #{map.hbrvcd} "); + } + sql.append("), 0) AS ftpCount, ") + .append("NVL((SELECT COUNT(1) ") + .append(" FROM SD_FPRD_R run ") + .append(" INNER JOIN SD_FPRD_B_H base ON base.STCD = run.STCD ") + .append(" AND NVL(base.IS_DELETED, 0) = 0 ") + .append(" AND base.STTP = 'FPRD' ") + .append(" INNER JOIN SD_FPRDFISH_R fish ON fish.FPRDR_ID = run.ID ") + .append(" AND NVL(fish.IS_DELETED, 0) = 0 ") + .append(" WHERE NVL(run.IS_DELETED, 0) = 0 ") + .append(" AND TO_CHAR(run.TM, 'YYYY') = #{map.year} ") + .append(" AND base.BASE_ID = #{map.baseId} "); + if (StrUtil.isNotBlank(ao.getHbrvcd())) { + sql.append(" AND base.HBRVCD = #{map.hbrvcd} "); + } + sql.append("), 0) AS fishCount ") + .append("FROM DUAL"); + return sql.toString(); + } + private String buildFishDicBaseSql() { return "SELECT " + "src.ID AS id, " + From d4a9d0e802e389ebf2ce3b42c59fc8f55851e0a4 Mon Sep 17 00:00:00 2001 From: tangwei Date: Fri, 12 Jun 2026 10:48:57 +0800 Subject: [PATCH 22/34] =?UTF-8?q?feat:=20=E8=8E=B7=E5=8F=96=E9=B1=BC?= =?UTF-8?q?=E7=B1=BB=E5=8F=98=E5=8C=96=E6=83=85=E5=86=B5?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../fpr/controller/FprMonitorController.java | 10 +++ .../fpr/entity/vo/FprFtpChangeInfoVo.java | 21 +++++++ .../fpr/service/FprMonitorService.java | 5 ++ .../service/impl/FprMonitorServiceImpl.java | 63 ++++++++++++++++--- 4 files changed, 90 insertions(+), 9 deletions(-) create mode 100644 backend/src/main/java/com/yfd/platform/qgc_env/fpr/entity/vo/FprFtpChangeInfoVo.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 fa260bf9..49d3cf87 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,6 +4,7 @@ import com.yfd.platform.common.DataSourceRequest; import com.yfd.platform.config.ResponseResult; import com.yfd.platform.qgc_env.fpr.entity.ao.FprdRunDataAo; 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.FprdRunDataInfoVo; import com.yfd.platform.qgc_env.fpr.service.FprMonitorService; import io.swagger.v3.oas.annotations.Operation; @@ -15,6 +16,8 @@ import org.springframework.web.bind.annotation.RequestBody; import org.springframework.web.bind.annotation.RequestMapping; import org.springframework.web.bind.annotation.RestController; +import java.util.List; + @RestController @RequestMapping("/fpr") @Tag(name = "鱼类调查装置站基础信息") @@ -47,6 +50,13 @@ public class FprMonitorController { return ResponseResult.successData(result); } + @PostMapping("/sdFprdR/getFtpChangeInfo") + @Operation(summary = "获取鱼类变化情况") + public ResponseResult getFtpChangeInfo(@RequestBody FprdRunDataAo ao) { + List result = fprMonitorService.getFtpChangeInfo(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/FprFtpChangeInfoVo.java b/backend/src/main/java/com/yfd/platform/qgc_env/fpr/entity/vo/FprFtpChangeInfoVo.java new file mode 100644 index 00000000..d9c2de58 --- /dev/null +++ b/backend/src/main/java/com/yfd/platform/qgc_env/fpr/entity/vo/FprFtpChangeInfoVo.java @@ -0,0 +1,21 @@ +package com.yfd.platform.qgc_env.fpr.entity.vo; + +import io.swagger.v3.oas.annotations.media.Schema; +import lombok.Data; + +@Data +@Schema(description = "鱼类变化情况") +public class FprFtpChangeInfoVo { + + @Schema(description = "鱼种类数量") + private String ftpCount; + + @Schema(description = "鱼数量") + private Integer fishCount; + + @Schema(description = "月") + private Integer month; + + @Schema(description = "年份") + private Integer year; +} 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 e8ff69e0..9f638034 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,11 +2,14 @@ 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.FprFishDicVo; import com.yfd.platform.qgc_env.fpr.entity.vo.FprMsstbprptVo; import com.yfd.platform.qgc_env.fpr.entity.vo.FprdRunDataInfoVo; +import java.util.List; + public interface FprMonitorService { DataSourceResult getMsstbprptList(DataSourceRequest dataSourceRequest); @@ -14,4 +17,6 @@ public interface FprMonitorService { DataSourceResult getFishDicList(DataSourceRequest dataSourceRequest); FprdRunDataInfoVo getFprdRunDataInfo(FprdRunDataAo ao); + + List getFtpChangeInfo(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 6934c32a..309e6f0e 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 @@ -14,6 +14,7 @@ import com.yfd.platform.common.MicroservicDynamicSQLMapper; import com.yfd.platform.common.exception.BizException; import com.yfd.platform.qgc_env.fpr.entity.ao.FprdRunDataAo; 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.FprdRunDataInfoVo; import com.yfd.platform.qgc_env.fpr.service.FprMonitorService; @@ -36,15 +37,7 @@ public class FprMonitorServiceImpl implements FprMonitorService { @Override public FprdRunDataInfoVo getFprdRunDataInfo(FprdRunDataAo ao) { - if (ao == null) { - throw new BizException("请求参数不能为空."); - } - if (StrUtil.isBlank(ao.getBaseId())) { - throw new BizException("基地编码(baseId)不能为空."); - } - if (ao.getYear() == null) { - throw new BizException("年度(year)不能为空."); - } + validateFprdRunDataAo(ao); Map paramMap = new HashMap<>(); paramMap.put("baseId", ao.getBaseId()); @@ -64,6 +57,23 @@ public class FprMonitorServiceImpl implements FprMonitorService { ); } + @Override + public List getFtpChangeInfo(FprdRunDataAo ao) { + validateFprdRunDataAo(ao); + + Map paramMap = new HashMap<>(); + paramMap.put("baseId", ao.getBaseId()); + paramMap.put("year", String.valueOf(ao.getYear())); + if (StrUtil.isNotBlank(ao.getHbrvcd())) { + paramMap.put("hbrvcd", ao.getHbrvcd()); + } + return microservicDynamicSQLMapper.getAllListWithResultType( + buildFtpChangeInfoSql(ao), + paramMap, + FprFtpChangeInfoVo.class + ); + } + @Override public DataSourceResult getMsstbprptList(DataSourceRequest dataSourceRequest) { DataSourceLoadOptionsBase loadOptions = dataSourceRequest == null ? null : dataSourceRequest.toDevRequest(); @@ -299,6 +309,41 @@ public class FprMonitorServiceImpl implements FprMonitorService { return sql.toString(); } + private String buildFtpChangeInfoSql(FprdRunDataAo ao) { + StringBuilder sql = new StringBuilder("SELECT ") + .append("COUNT(DISTINCT fish.NAME) AS ftpCount, ") + .append("COUNT(1) AS fishCount, ") + .append("TO_NUMBER(TO_CHAR(run.TM, 'MM')) AS month, ") + .append("TO_NUMBER(TO_CHAR(run.TM, 'YYYY')) AS year ") + .append("FROM SD_FPRD_R run ") + .append("INNER JOIN SD_FPRD_B_H base ON base.STCD = run.STCD ") + .append(" AND NVL(base.IS_DELETED, 0) = 0 ") + .append(" AND base.STTP = 'FPRD' ") + .append("INNER JOIN SD_FPRDFISH_R fish ON fish.FPRDR_ID = run.ID ") + .append(" AND NVL(fish.IS_DELETED, 0) = 0 ") + .append("WHERE NVL(run.IS_DELETED, 0) = 0 ") + .append(" AND TO_CHAR(run.TM, 'YYYY') = #{map.year} ") + .append(" AND base.BASE_ID = #{map.baseId} "); + if (StrUtil.isNotBlank(ao.getHbrvcd())) { + sql.append(" AND base.HBRVCD = #{map.hbrvcd} "); + } + sql.append("GROUP BY TO_CHAR(run.TM, 'MM'), TO_CHAR(run.TM, 'YYYY') ") + .append("ORDER BY TO_CHAR(run.TM, 'YYYY') ASC, TO_CHAR(run.TM, 'MM') ASC"); + return sql.toString(); + } + + private void validateFprdRunDataAo(FprdRunDataAo ao) { + if (ao == null) { + throw new BizException("请求参数不能为空."); + } + if (StrUtil.isBlank(ao.getBaseId())) { + throw new BizException("基地编码(baseId)不能为空."); + } + if (ao.getYear() == null) { + throw new BizException("年度(year)不能为空."); + } + } + private String buildFishDicBaseSql() { return "SELECT " + "src.ID AS id, " + From 2085324c5e6813e1cec4953891dafeeb6d523db7 Mon Sep 17 00:00:00 2001 From: tangwei Date: Fri, 12 Jun 2026 11:18:00 +0800 Subject: [PATCH 23/34] =?UTF-8?q?fix:=20=E7=9B=91=E6=B5=8B=E6=96=B9?= =?UTF-8?q?=E5=BC=8F?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../platform/qgc_env/fp/service/impl/FpBuildServiceImpl.java | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) 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 e30b2f22..4f6aa743 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 @@ -192,8 +192,8 @@ public class FpBuildServiceImpl implements FpBuildService { .append("fp.JBTXCS AS jbtxcs, ") .append("fp.IS_UP AS isUp, ") .append("fp.IS_DOWN AS isDown, ") - .append("CAST(NULL AS NUMBER(1,0)) AS mway, ") - .append("CAST(NULL AS VARCHAR2(32)) AS mwayName, ") + .append("fp.MWAY AS mway, ") + .append("CASE NVL(fp.MWAY, 0) WHEN 1 THEN '人工' WHEN 2 THEN '自动' ELSE '未知' END AS mwayName,") .append("fp.REMARK AS remark, ") .append("fp.VLSR AS vlsr, ") .append("fp.VLSR_TM AS vlsrTm, ") From 2fcc7e666d2380b59d945fa4515efcfd976b61ed Mon Sep 17 00:00:00 2001 From: tangwei Date: Fri, 12 Jun 2026 11:38:05 +0800 Subject: [PATCH 24/34] =?UTF-8?q?fix:=20=E5=A2=9E=E5=8A=A0=E8=87=AA?= =?UTF-8?q?=E5=8A=A8=E8=BF=87=E9=B1=BC=E6=95=B0=E6=8D=AE?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../fp/service/impl/FpRunServiceImpl.java | 134 +++++++++--------- 1 file changed, 69 insertions(+), 65 deletions(-) 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 db09544e..31f88ac9 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 @@ -390,36 +390,73 @@ public class FpRunServiceImpl implements FpRunService { private String buildQgcFpssTableCoreSql() { return "SELECT " + - "manualData.STCD AS stcd, " + - "manualData.STNM AS stnm, " + - "manualData.TM AS tm, " + - "manualData.FTP AS ftp, " + - "manualData.FISHID AS fishId, " + - "manualData.FSZ AS fsz, " + - "manualData.YR AS yr, " + - "manualData.FCNT AS fcnt, " + - "manualData.LENGTH AS length, " + - "manualData.WIDTH AS width, " + - "manualData.FISHSPEED AS fishspeed, " + - "manualData.DIRECTION AS direction, " + - "manualData.DIRECTIONNAME AS directionName, " + - "manualData.UPFCNT AS upFcnt, " + - "manualData.DOWNFCNT AS downFcnt, " + - "manualData.TEMPERATURE AS temperature, " + - "manualData.SPEED AS speed, " + - "manualData.FIRSTIMGURL AS firstimgurl, " + - "manualData.VIDEOURL AS videourl, " + - "manualData.FWET AS fwet, " + - "manualData.FID AS fid, " + - "manualData.PICPTH AS picpth, " + - "manualData.VDPTH AS vdpth, " + - "manualData.DATASRC AS dataSrc, " + - "manualData.MWAY AS mway, " + - "manualData.STRDT AS strdt, " + - "manualData.ENDDT AS enddt " + + "src.STCD AS stcd, " + + "src.STNM AS stnm, " + + "src.TM AS tm, " + + "src.FTP AS ftp, " + + "src.FISHID AS fishId, " + + "src.FSZ AS fsz, " + + "src.YR AS yr, " + + "src.FCNT AS fcnt, " + + "src.LENGTH AS length, " + + "src.WIDTH AS width, " + + "src.FISHSPEED AS fishspeed, " + + "src.DIRECTION AS direction, " + + "src.DIRECTIONNAME AS directionName, " + + "src.UPFCNT AS upFcnt, " + + "src.DOWNFCNT AS downFcnt, " + + "src.TEMPERATURE AS temperature, " + + "src.SPEED AS speed, " + + "src.FIRSTIMGURL AS firstimgurl, " + + "src.VIDEOURL AS videourl, " + + "src.FWET AS fwet, " + + "src.FID AS fid, " + + "src.PICPTH AS picpth, " + + "src.VDPTH AS vdpth, " + + "src.DATASRC AS dataSrc, " + + "src.MWAY AS mway, " + + "src.STRDT AS strdt, " + + "src.ENDDT AS enddt " + "FROM ( " + " SELECT t.STCD AS STCD, " + " fp.STNM AS STNM, " + + " TO_CHAR(t.TM, 'YYYY-MM-DD HH24:MI:SS') AS TM, " + + " COALESCE(fishRv.NAME, relRv.FISH_NAME, fishZy.NAME, relZy.FISH_NAME, fishDirect.NAME, t.FTP) AS FTP, " + + " t.FTP AS FISHID, " + + " t.FSZ AS FSZ, " + + " TO_CHAR(t.TM, 'YYYY') AS YR, " + + " TO_CHAR(t.FCNT) AS FCNT, " + + " TO_CHAR(t.LENGTH) AS LENGTH, " + + " TO_CHAR(t.WIDTH) AS WIDTH, " + + " t.FISHSPEED AS FISHSPEED, " + + " TO_CHAR(t.DIRECTION) AS DIRECTION, " + + " CASE t.DIRECTION WHEN 0 THEN '上行' WHEN 1 THEN '下行' WHEN 2 THEN '上行折返' WHEN 3 THEN '下行折返' END AS DIRECTIONNAME, " + + " CASE WHEN t.DIRECTION = 0 THEN t.FCNT END AS UPFCNT, " + + " CASE WHEN t.DIRECTION = 1 THEN t.FCNT END AS DOWNFCNT, " + + " TO_CHAR(t.TEMPERATURE) AS TEMPERATURE, " + + " TO_CHAR(t.SPEED) AS SPEED, " + + " t.FIRSTIMGURL AS FIRSTIMGURL, " + + " t.VIDEOURL AS VIDEOURL, " + + " NULL AS FWET, " + + " t.FID AS FID, " + + " t.FIRSTIMGURL AS PICPTH, " + + " t.VIDEOURL AS VDPTH, " + + " '自动识别' AS DATASRC, " + + " 2 AS MWAY, " + + " t.TM AS STRDT, " + + " t.TM AS ENDDT " + + " FROM SD_FPSSRL_R t " + + " LEFT JOIN SD_FPSS_B_H fp ON fp.STCD = t.STCD " + + " LEFT JOIN SD_ENGINFO_B_H eng ON eng.STCD = fp.RSTCD AND NVL(eng.IS_DELETED, 0) = 0 " + + " LEFT JOIN SD_FISHDICTORY_RLTN_B relRv ON relRv.FISH_ID = t.FTP AND relRv.RVCD = eng.HBRVCD AND NVL(relRv.IS_DELETED, 0) = 0 " + + " LEFT JOIN SD_FISHDICTORY_B fishRv ON fishRv.ID = relRv.ZY_FISH_ID AND NVL(fishRv.IS_DELETED, 0) = 0 AND NVL(fishRv.ENABLE, 1) = 1 " + + " LEFT JOIN SD_FISHDICTORY_RLTN_B relZy ON relZy.FISH_ID = t.FTP AND relZy.RVCD = 'ZY' AND NVL(relZy.IS_DELETED, 0) = 0 " + + " LEFT JOIN SD_FISHDICTORY_B fishZy ON fishZy.ID = relZy.ZY_FISH_ID AND NVL(fishZy.IS_DELETED, 0) = 0 AND NVL(fishZy.ENABLE, 1) = 1 " + + " LEFT JOIN SD_FISHDICTORY_B fishDirect ON fishDirect.ID = t.FTP AND NVL(fishDirect.IS_DELETED, 0) = 0 AND NVL(fishDirect.ENABLE, 1) = 1 " + + " WHERE NVL(t.IS_DELETED, 0) = 0 " + + " UNION ALL " + + " SELECT t.STCD AS STCD, " + + " fp.STNM AS STNM, " + " TO_CHAR(t.STRDT, 'YYYY-MM-DD HH24:MI:SS') AS TM, " + " COALESCE(fishRv.NAME, relRv.FISH_NAME, fishZy.NAME, relZy.FISH_NAME, fishDirect.NAME, t.FTP) AS FTP, " + " t.FTP AS FISHID, " + @@ -439,55 +476,22 @@ public class FpRunServiceImpl implements FpRunService { " CAST(NULL AS VARCHAR2(255)) AS VIDEOURL, " + " t.FWET AS FWET, " + " NULL AS FID, " + - "t.PICPTH AS picpth, " + - "t.VDPTH AS vdpth, " + - " '人工填报' AS DATASRC, " + -// " CASE WHEN t.AI_STCD IS NULL THEN '人工填报' ELSE aiFp.STNM END AS DATASRC, " + + " t.PICPTH AS PICPTH, " + + " t.VDPTH AS VDPTH, " + + " '人工填报' AS DATASRC, " + " 1 AS MWAY, " + " t.STRDT AS STRDT, " + " t.ENDDT AS ENDDT " + " FROM SD_FPSS_R t " + " LEFT JOIN SD_FPSS_B_H fp ON fp.STCD = t.STCD " + -// " LEFT JOIN SD_FPSS_B_H aiFp ON aiFp.STCD = t.AI_STCD " + " LEFT JOIN SD_ENGINFO_B_H eng ON eng.STCD = fp.RSTCD AND NVL(eng.IS_DELETED, 0) = 0 " + " LEFT JOIN SD_FISHDICTORY_RLTN_B relRv ON relRv.FISH_ID = t.FTP AND relRv.RVCD = eng.HBRVCD AND NVL(relRv.IS_DELETED, 0) = 0 " + " LEFT JOIN SD_FISHDICTORY_B fishRv ON fishRv.ID = relRv.ZY_FISH_ID AND NVL(fishRv.IS_DELETED, 0) = 0 AND NVL(fishRv.ENABLE, 1) = 1 " + " LEFT JOIN SD_FISHDICTORY_RLTN_B relZy ON relZy.FISH_ID = t.FTP AND relZy.RVCD = 'ZY' AND NVL(relZy.IS_DELETED, 0) = 0 " + " LEFT JOIN SD_FISHDICTORY_B fishZy ON fishZy.ID = relZy.ZY_FISH_ID AND NVL(fishZy.IS_DELETED, 0) = 0 AND NVL(fishZy.ENABLE, 1) = 1 " + " LEFT JOIN SD_FISHDICTORY_B fishDirect ON fishDirect.ID = t.FTP AND NVL(fishDirect.IS_DELETED, 0) = 0 AND NVL(fishDirect.ENABLE, 1) = 1 " + - " WHERE " + -// "(t.TASK_STATUS = 'Approved' OR t.TASK_STATUS IS NULL) AND "+ - " NVL(t.IS_DELETED, 0) = 0 " + -// " UNION ALL " + -// " SELECT CAST(NULL AS VARCHAR2(36)) AS STCD, " + -// " CAST(NULL AS VARCHAR2(64)) AS STNM, " + -// " CAST(NULL AS VARCHAR2(19)) AS TM, " + -// " CAST(NULL AS VARCHAR2(255)) AS FTP, " + -// " CAST(NULL AS VARCHAR2(200)) AS FISHID, " + -// " CAST(NULL AS VARCHAR2(256)) AS FSZ, " + -// " CAST(NULL AS VARCHAR2(4)) AS YR, " + -// " CAST(NULL AS VARCHAR2(20)) AS FCNT, " + -// " CAST(NULL AS VARCHAR2(50)) AS LENGTH, " + -// " CAST(NULL AS VARCHAR2(50)) AS WIDTH, " + -// " CAST(NULL AS VARCHAR2(50)) AS FISHSPEED, " + -// " CAST(NULL AS VARCHAR2(10)) AS DIRECTION, " + -// " CAST(NULL AS VARCHAR2(20)) AS DIRECTIONNAME, " + -// " CAST(NULL AS NUMBER(18,0)) AS UPFCNT, " + -// " CAST(NULL AS NUMBER(18,0)) AS DOWNFCNT, " + -// " CAST(NULL AS VARCHAR2(50)) AS TEMPERATURE, " + -// " CAST(NULL AS VARCHAR2(50)) AS SPEED, " + -// " CAST(NULL AS VARCHAR2(255)) AS FIRSTIMGURL, " + -// " CAST(NULL AS VARCHAR2(255)) AS VIDEOURL, " + -// " CAST(NULL AS VARCHAR2(50)) AS FWET, " + -// " CAST(NULL AS VARCHAR2(255)) AS picpth, " + -// " CAST(NULL AS VARCHAR2(255)) vdpth FWET, " + -// " CAST(NULL AS VARCHAR2(1000)) AS FID, " + -// " CAST(NULL AS VARCHAR2(64)) AS DATASRC, " + -// " 2 AS MWAY, " + -// " CAST(NULL AS TIMESTAMP) AS STRDT, " + -// " CAST(NULL AS TIMESTAMP) AS ENDDT " + -// " FROM DUAL WHERE 1 = 0 " + - ") manualData"; + " WHERE NVL(t.IS_DELETED, 0) = 0 " + + ") src"; } private String buildQgcFpssTableDetailSelectSql(List selectFields) { From 2f4a7b538c1ec266f7615484a4b018cb8566220f Mon Sep 17 00:00:00 2001 From: tangwei Date: Fri, 12 Jun 2026 13:57:43 +0800 Subject: [PATCH 25/34] =?UTF-8?q?fix:=20=E5=A2=9E=E5=8A=A0=E8=87=AA?= =?UTF-8?q?=E5=8A=A8=E8=BF=87=E9=B1=BC=E6=95=B0=E6=8D=AE?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../qgc_env/fp/entity/vo/FpTableVo.java | 4 ++ .../fp/service/impl/FpRunServiceImpl.java | 47 ++++++++++--------- 2 files changed, 30 insertions(+), 21 deletions(-) diff --git a/backend/src/main/java/com/yfd/platform/qgc_env/fp/entity/vo/FpTableVo.java b/backend/src/main/java/com/yfd/platform/qgc_env/fp/entity/vo/FpTableVo.java index 1556d10b..423fb561 100644 --- a/backend/src/main/java/com/yfd/platform/qgc_env/fp/entity/vo/FpTableVo.java +++ b/backend/src/main/java/com/yfd/platform/qgc_env/fp/entity/vo/FpTableVo.java @@ -19,6 +19,10 @@ public class FpTableVo { @Schema(description = "鱼种类") private String ftp; + + @Schema(description = "鱼种类") + private String ftpName; + @Schema(description = "鱼类编码") private String fishId; 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 31f88ac9..c556a84b 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 @@ -310,31 +310,32 @@ public class FpRunServiceImpl implements FpRunService { DataSourceLoadOptionsBase loadOptions, String stcdFilter) { StringBuilder sql = new StringBuilder("SELECT "); - sql.append("CAST(NULL AS VARCHAR2(36)) AS stcd, ") - .append("CAST(NULL AS VARCHAR2(255)) AS stnm, ") - .append("CAST(NULL AS VARCHAR2(19)) AS tm, ") + sql.append("MAX(t.stcd) AS stcd, ") + .append("MAX(t.stnm) AS stnm, ") + .append("MIN(t.tm) AS tm, ") .append("t.ftp AS ftp, ") - .append("CAST(NULL AS VARCHAR2(200)) AS fishId, ") + .append("t.ftpName AS ftpName, ") + .append("MAX(t.fishId) AS fishId, ") .append("MAX(t.fsz) AS fsz, ") .append("TO_CHAR(SUM(TO_NUMBER(NVL(t.fcnt, '0')))) AS fcnt, ") - .append("CAST(NULL AS VARCHAR2(50)) AS length, ") - .append("CAST(NULL AS VARCHAR2(50)) AS width, ") - .append("CAST(NULL AS VARCHAR2(50)) AS fishspeed, ") - .append("CAST(NULL AS VARCHAR2(20)) AS direction, ") - .append("CAST(NULL AS VARCHAR2(20)) AS directionName, ") - .append("CAST(NULL AS VARCHAR2(50)) AS temperature, ") - .append("CAST(NULL AS VARCHAR2(50)) AS speed, ") - .append("CAST(NULL AS VARCHAR2(255)) AS firstimgurl, ") - .append("CAST(NULL AS VARCHAR2(255)) AS videourl, ") + .append("MAX(t.length) AS length, ") + .append("MAX(t.width) AS width, ") + .append("MAX(t.fishspeed) AS fishspeed, ") + .append("MAX(t.direction) AS direction, ") + .append("MAX(t.directionName) AS directionName, ") + .append("MAX(t.temperature) AS temperature, ") + .append("MAX(t.speed) AS speed, ") + .append("MAX(t.firstimgurl) AS firstimgurl, ") + .append("MAX(t.videourl) AS videourl, ") .append("t.yr AS yr, ") - .append("CAST(NULL AS VARCHAR2(50)) AS fwet, ") - .append("CAST(NULL AS VARCHAR2(1000)) AS fid, ") - .append("CAST(NULL AS NUMBER(18,0)) AS upFcnt, ") - .append("CAST(NULL AS NUMBER(18,0)) AS downFcnt, ") - .append("CAST(NULL AS VARCHAR2(64)) AS dataSrc, ") - .append("CAST(NULL AS NUMBER(3,0)) AS mway, ") - .append("CAST(NULL AS VARCHAR2(255)) AS picpth, ") - .append("CAST(NULL AS VARCHAR2(255)) AS vdpth ") + .append("MAX(t.fwet) AS fwet, ") + .append("MAX(t.fid) AS fid, ") + .append("SUM(NVL(t.upFcnt, 0)) AS upFcnt, ") + .append("SUM(NVL(t.downFcnt, 0)) AS downFcnt, ") + .append("CASE WHEN COUNT(DISTINCT t.dataSrc) = 1 THEN MAX(t.dataSrc) ELSE '人工+自动' END AS dataSrc, ") + .append("CASE WHEN COUNT(DISTINCT t.mway) = 1 THEN MAX(t.mway) ELSE NULL END AS mway, ") + .append("MAX(t.picpth) AS picpth, ") + .append("MAX(t.vdpth) AS vdpth ") .append("FROM (") .append(buildQgcFpssTableCoreSql()) .append(") t WHERE 1 = 1 "); @@ -394,6 +395,7 @@ public class FpRunServiceImpl implements FpRunService { "src.STNM AS stnm, " + "src.TM AS tm, " + "src.FTP AS ftp, " + + "src.NAME AS ftpName, " + "src.FISHID AS fishId, " + "src.FSZ AS fsz, " + "src.YR AS yr, " + @@ -423,6 +425,7 @@ public class FpRunServiceImpl implements FpRunService { " TO_CHAR(t.TM, 'YYYY-MM-DD HH24:MI:SS') AS TM, " + " COALESCE(fishRv.NAME, relRv.FISH_NAME, fishZy.NAME, relZy.FISH_NAME, fishDirect.NAME, t.FTP) AS FTP, " + " t.FTP AS FISHID, " + + " fishRv.NAME AS NAME, " + " t.FSZ AS FSZ, " + " TO_CHAR(t.TM, 'YYYY') AS YR, " + " TO_CHAR(t.FCNT) AS FCNT, " + @@ -460,6 +463,7 @@ public class FpRunServiceImpl implements FpRunService { " TO_CHAR(t.STRDT, 'YYYY-MM-DD HH24:MI:SS') AS TM, " + " COALESCE(fishRv.NAME, relRv.FISH_NAME, fishZy.NAME, relZy.FISH_NAME, fishDirect.NAME, t.FTP) AS FTP, " + " t.FTP AS FISHID, " + + " fishRv.NAME AS NAME, " + " t.FSZ AS FSZ, " + " TO_CHAR(t.STRDT, 'YYYY') AS YR, " + " TO_CHAR(t.FCNT) AS FCNT, " + @@ -500,6 +504,7 @@ public class FpRunServiceImpl implements FpRunService { selectMap.put("stnm", "t.stnm AS stnm"); selectMap.put("tm", "t.tm AS tm"); selectMap.put("ftp", "t.ftp AS ftp"); + selectMap.put("ftpName", "t.ftpName AS ftpName"); selectMap.put("fishId", "t.fishId AS fishId"); selectMap.put("fsz", "t.fsz AS fsz"); selectMap.put("yr", "t.yr AS yr"); From 5ba2f5e9bb1c034bf086db04687581a4f90cc38c Mon Sep 17 00:00:00 2001 From: tangwei Date: Fri, 12 Jun 2026 14:28:12 +0800 Subject: [PATCH 26/34] =?UTF-8?q?fix:=20=E5=A2=9E=E5=8A=A0=E8=87=AA?= =?UTF-8?q?=E5=8A=A8=E8=BF=87=E9=B1=BC=E6=95=B0=E6=8D=AE?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../fp/service/impl/FpRunServiceImpl.java | 25 ++++++++----------- 1 file changed, 11 insertions(+), 14 deletions(-) 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 c556a84b..9f0266a2 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 @@ -390,6 +390,7 @@ public class FpRunServiceImpl implements FpRunService { } private String buildQgcFpssTableCoreSql() { + String fishNameExpr = buildFishDictionaryDisplayExpr("cRv", "cZy", "t.FTP"); return "SELECT " + "src.STCD AS stcd, " + "src.STNM AS stnm, " + @@ -423,9 +424,9 @@ public class FpRunServiceImpl implements FpRunService { " SELECT t.STCD AS STCD, " + " fp.STNM AS STNM, " + " TO_CHAR(t.TM, 'YYYY-MM-DD HH24:MI:SS') AS TM, " + - " COALESCE(fishRv.NAME, relRv.FISH_NAME, fishZy.NAME, relZy.FISH_NAME, fishDirect.NAME, t.FTP) AS FTP, " + + " COALESCE(c.NAME, t.FTP ) AS FTP , " + " t.FTP AS FISHID, " + - " fishRv.NAME AS NAME, " + + " COALESCE(c.NAME, t.FTP ) AS NAME, " + " t.FSZ AS FSZ, " + " TO_CHAR(t.TM, 'YYYY') AS YR, " + " TO_CHAR(t.FCNT) AS FCNT, " + @@ -451,19 +452,15 @@ public class FpRunServiceImpl implements FpRunService { " FROM SD_FPSSRL_R t " + " LEFT JOIN SD_FPSS_B_H fp ON fp.STCD = t.STCD " + " LEFT JOIN SD_ENGINFO_B_H eng ON eng.STCD = fp.RSTCD AND NVL(eng.IS_DELETED, 0) = 0 " + - " LEFT JOIN SD_FISHDICTORY_RLTN_B relRv ON relRv.FISH_ID = t.FTP AND relRv.RVCD = eng.HBRVCD AND NVL(relRv.IS_DELETED, 0) = 0 " + - " LEFT JOIN SD_FISHDICTORY_B fishRv ON fishRv.ID = relRv.ZY_FISH_ID AND NVL(fishRv.IS_DELETED, 0) = 0 AND NVL(fishRv.ENABLE, 1) = 1 " + - " LEFT JOIN SD_FISHDICTORY_RLTN_B relZy ON relZy.FISH_ID = t.FTP AND relZy.RVCD = 'ZY' AND NVL(relZy.IS_DELETED, 0) = 0 " + - " LEFT JOIN SD_FISHDICTORY_B fishZy ON fishZy.ID = relZy.ZY_FISH_ID AND NVL(fishZy.IS_DELETED, 0) = 0 AND NVL(fishZy.ENABLE, 1) = 1 " + - " LEFT JOIN SD_FISHDICTORY_B fishDirect ON fishDirect.ID = t.FTP AND NVL(fishDirect.IS_DELETED, 0) = 0 AND NVL(fishDirect.ENABLE, 1) = 1 " + + " LEFT JOIN V_SD_FISHDICTORY_B c ON t.FTP = c.FISH_ID AND (fp.HBRVCD = c.RVCD OR c.RVCD = 'ZY') " + " WHERE NVL(t.IS_DELETED, 0) = 0 " + " UNION ALL " + " SELECT t.STCD AS STCD, " + " fp.STNM AS STNM, " + " TO_CHAR(t.STRDT, 'YYYY-MM-DD HH24:MI:SS') AS TM, " + - " COALESCE(fishRv.NAME, relRv.FISH_NAME, fishZy.NAME, relZy.FISH_NAME, fishDirect.NAME, t.FTP) AS FTP, " + + " COALESCE(c.NAME, t.FTP ) AS FTP, " + " t.FTP AS FISHID, " + - " fishRv.NAME AS NAME, " + + " COALESCE(c.NAME, t.FTP ) AS NAME, " + " t.FSZ AS FSZ, " + " TO_CHAR(t.STRDT, 'YYYY') AS YR, " + " TO_CHAR(t.FCNT) AS FCNT, " + @@ -489,15 +486,15 @@ public class FpRunServiceImpl implements FpRunService { " FROM SD_FPSS_R t " + " LEFT JOIN SD_FPSS_B_H fp ON fp.STCD = t.STCD " + " LEFT JOIN SD_ENGINFO_B_H eng ON eng.STCD = fp.RSTCD AND NVL(eng.IS_DELETED, 0) = 0 " + - " LEFT JOIN SD_FISHDICTORY_RLTN_B relRv ON relRv.FISH_ID = t.FTP AND relRv.RVCD = eng.HBRVCD AND NVL(relRv.IS_DELETED, 0) = 0 " + - " LEFT JOIN SD_FISHDICTORY_B fishRv ON fishRv.ID = relRv.ZY_FISH_ID AND NVL(fishRv.IS_DELETED, 0) = 0 AND NVL(fishRv.ENABLE, 1) = 1 " + - " LEFT JOIN SD_FISHDICTORY_RLTN_B relZy ON relZy.FISH_ID = t.FTP AND relZy.RVCD = 'ZY' AND NVL(relZy.IS_DELETED, 0) = 0 " + - " LEFT JOIN SD_FISHDICTORY_B fishZy ON fishZy.ID = relZy.ZY_FISH_ID AND NVL(fishZy.IS_DELETED, 0) = 0 AND NVL(fishZy.ENABLE, 1) = 1 " + - " LEFT JOIN SD_FISHDICTORY_B fishDirect ON fishDirect.ID = t.FTP AND NVL(fishDirect.IS_DELETED, 0) = 0 AND NVL(fishDirect.ENABLE, 1) = 1 " + + " LEFT JOIN V_SD_FISHDICTORY_B c ON t.FTP = c.FISH_ID AND (fp.HBRVCD = c.RVCD OR c.RVCD = 'ZY') " + " WHERE NVL(t.IS_DELETED, 0) = 0 " + ") src"; } + private String buildFishDictionaryDisplayExpr(String rvAlias, String zyAlias, String fishFieldExpr) { + return "COALESCE(" + rvAlias + ".NAME, " + zyAlias + ".NAME, " + fishFieldExpr + ")"; + } + private String buildQgcFpssTableDetailSelectSql(List selectFields) { Map selectMap = new LinkedHashMap<>(); selectMap.put("stcd", "t.stcd AS stcd"); From daf0c4e89042aeb8f8d35f84e615541dfb81272f Mon Sep 17 00:00:00 2001 From: tangwei Date: Fri, 12 Jun 2026 15:08:09 +0800 Subject: [PATCH 27/34] =?UTF-8?q?feat:=20=E6=A0=B9=E6=8D=AE=E5=9F=BA?= =?UTF-8?q?=E5=9C=B0=E6=9F=A5=E8=AF=A2=E5=9F=BA=E5=9C=B0=E6=B5=81=E5=9F=9F?= =?UTF-8?q?=E5=88=97=E8=A1=A8?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../yfd/platform/config/SwaggerConfig.java | 2 +- .../controller/SdHbrvDicController.java | 9 ++- .../qgc_base/entity/vo/HbrvWbsVo.java | 21 +++++++ .../qgc_base/service/ISdHbrvDicService.java | 6 +- .../service/impl/SdHbrvDicServiceImpl.java | 61 ++++++++++++++++++- 5 files changed, 95 insertions(+), 4 deletions(-) create mode 100644 backend/src/main/java/com/yfd/platform/qgc_base/entity/vo/HbrvWbsVo.java diff --git a/backend/src/main/java/com/yfd/platform/config/SwaggerConfig.java b/backend/src/main/java/com/yfd/platform/config/SwaggerConfig.java index 8c8c0bc2..443e06a6 100644 --- a/backend/src/main/java/com/yfd/platform/config/SwaggerConfig.java +++ b/backend/src/main/java/com/yfd/platform/config/SwaggerConfig.java @@ -87,7 +87,7 @@ public class SwaggerConfig { @Bean public GroupedOpenApi groupEnvVDApi() { return GroupedOpenApi.builder() - .group("3.3.1 全过程-生态环保数据服务-过鱼设施-过鱼监测") + .group("3.3.1 全过程-生态环保数据服务-过鱼设施-过鱼监测(VD视频模块)") .packagesToScan("com.yfd.platform.qgc_env.vd.controller") .build(); } diff --git a/backend/src/main/java/com/yfd/platform/qgc_base/controller/SdHbrvDicController.java b/backend/src/main/java/com/yfd/platform/qgc_base/controller/SdHbrvDicController.java index e52b8e93..e16a3edf 100644 --- a/backend/src/main/java/com/yfd/platform/qgc_base/controller/SdHbrvDicController.java +++ b/backend/src/main/java/com/yfd/platform/qgc_base/controller/SdHbrvDicController.java @@ -1,6 +1,7 @@ package com.yfd.platform.qgc_base.controller; import com.baomidou.mybatisplus.extension.plugins.pagination.Page; +import com.yfd.platform.common.DataSourceRequest; import com.yfd.platform.annotation.Log; import com.yfd.platform.config.ResponseResult; import com.yfd.platform.qgc_base.domain.SdHbrvDic; @@ -112,4 +113,10 @@ public class SdHbrvDicController { @RequestParam(required = false) String baseid) { return ResponseResult.successData(hbrvDicService.regDropdown(hbrvnm, baseid)); } -} \ No newline at end of file + + @PostMapping("/wbsb/getHbrvdList") + @Operation(summary = "根据基地查询基地流域列表") + public ResponseResult getHbrvdList(@RequestBody DataSourceRequest dataSourceRequest) { + return ResponseResult.successData(hbrvDicService.getHbrvdList(dataSourceRequest)); + } +} diff --git a/backend/src/main/java/com/yfd/platform/qgc_base/entity/vo/HbrvWbsVo.java b/backend/src/main/java/com/yfd/platform/qgc_base/entity/vo/HbrvWbsVo.java new file mode 100644 index 00000000..61d77520 --- /dev/null +++ b/backend/src/main/java/com/yfd/platform/qgc_base/entity/vo/HbrvWbsVo.java @@ -0,0 +1,21 @@ +package com.yfd.platform.qgc_base.entity.vo; + +import io.swagger.v3.oas.annotations.media.Schema; +import lombok.Data; + +@Data +@Schema(description = "基地流域树节点") +public class HbrvWbsVo { + + @Schema(description = "基地流域编码") + private String hbrvcd; + + @Schema(description = "基地流域名称") + private String hbrvcdName; + + @Schema(description = "基地编码") + private String baseId; + + @Schema(description = "基地名称") + private String baseName; +} diff --git a/backend/src/main/java/com/yfd/platform/qgc_base/service/ISdHbrvDicService.java b/backend/src/main/java/com/yfd/platform/qgc_base/service/ISdHbrvDicService.java index ea932c43..c38003c0 100644 --- a/backend/src/main/java/com/yfd/platform/qgc_base/service/ISdHbrvDicService.java +++ b/backend/src/main/java/com/yfd/platform/qgc_base/service/ISdHbrvDicService.java @@ -2,7 +2,9 @@ package com.yfd.platform.qgc_base.service; import com.baomidou.mybatisplus.extension.plugins.pagination.Page; import com.baomidou.mybatisplus.extension.service.IService; +import com.yfd.platform.common.DataSourceRequest; import com.yfd.platform.qgc_base.domain.SdHbrvDic; +import com.yfd.platform.qgc_base.entity.vo.HbrvWbsVo; import java.util.List; import java.util.Set; @@ -58,4 +60,6 @@ public interface ISdHbrvDicService extends IService { List regDropdown(String hbrvnm, String baseid); -} \ No newline at end of file + List getHbrvdList(DataSourceRequest dataSourceRequest); + +} diff --git a/backend/src/main/java/com/yfd/platform/qgc_base/service/impl/SdHbrvDicServiceImpl.java b/backend/src/main/java/com/yfd/platform/qgc_base/service/impl/SdHbrvDicServiceImpl.java index c0653ad3..b897970b 100644 --- a/backend/src/main/java/com/yfd/platform/qgc_base/service/impl/SdHbrvDicServiceImpl.java +++ b/backend/src/main/java/com/yfd/platform/qgc_base/service/impl/SdHbrvDicServiceImpl.java @@ -1,22 +1,32 @@ package com.yfd.platform.qgc_base.service.impl; import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; +import com.yfd.platform.common.DataSourceLoadOptionsBase; +import com.yfd.platform.common.DataSourceRequest; import com.baomidou.mybatisplus.extension.plugins.pagination.Page; import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; import com.yfd.platform.qgc_data.domain.SysUserDataScope; import com.yfd.platform.qgc_data.mapper.SysUserDataScopeMapper; import com.yfd.platform.qgc_base.domain.SdEngInfoBH; import com.yfd.platform.qgc_base.domain.SdHbrvDic; +import com.yfd.platform.qgc_base.domain.SdHydrobase; +import com.yfd.platform.qgc_base.entity.vo.HbrvWbsVo; import com.yfd.platform.qgc_base.mapper.SdEngInfoBHMapper; import com.yfd.platform.qgc_base.mapper.SdHbrvDicMapper; +import com.yfd.platform.qgc_base.mapper.SdHydrobaseMapper; import com.yfd.platform.qgc_base.service.ISdHbrvDicService; +import com.yfd.platform.utils.QgcQueryWrapperUtil; import com.yfd.platform.utils.SecurityUtils; import jakarta.annotation.Resource; +import org.springframework.util.StringUtils; import org.springframework.stereotype.Service; import java.util.ArrayList; +import java.util.Comparator; +import java.util.HashMap; import java.util.HashSet; import java.util.List; +import java.util.Map; import java.util.Set; import java.util.stream.Collectors; @@ -33,6 +43,9 @@ public class SdHbrvDicServiceImpl extends ServiceImpl queryPageList(Page page, String hbrvnm, String baseid) { @@ -200,4 +213,50 @@ public class SdHbrvDicServiceImpl extends ServiceImpl getHbrvdList(DataSourceRequest dataSourceRequest) { + DataSourceLoadOptionsBase loadOptions = dataSourceRequest == null ? null : dataSourceRequest.toDevRequest(); + String baseId = loadOptions == null ? null : QgcQueryWrapperUtil.getFilterFieldValue(loadOptions, "baseId"); + + LambdaQueryWrapper wrapper = new LambdaQueryWrapper<>(); + wrapper.eq(StringUtils.hasText(baseId), SdHbrvDic::getBaseid, baseId) + .eq(SdHbrvDic::getIsDeleted, 0) + .eq(SdHbrvDic::getEnabled, 1) + .orderByAsc(SdHbrvDic::getBaseid, SdHbrvDic::getOrderIndex, SdHbrvDic::getHbrvcd); + + List hbrvList = this.list(wrapper); + if (hbrvList.isEmpty()) { + return new ArrayList<>(); + } + + List baseIds = hbrvList.stream() + .map(SdHbrvDic::getBaseid) + .filter(StringUtils::hasText) + .distinct() + .toList(); + + Map baseNameMap; + if (!baseIds.isEmpty()) { + baseNameMap = hydrobaseMapper.selectBatchIds(baseIds).stream() + .collect(Collectors.toMap(SdHydrobase::getBaseid, SdHydrobase::getBasename, (a, b) -> a)); + } else { + baseNameMap = new HashMap<>(); + } + + return hbrvList.stream() + .map(item -> toHbrvWbsVo(item, baseNameMap.get(item.getBaseid()))) + .sorted(Comparator.comparing(HbrvWbsVo::getBaseId, Comparator.nullsLast(String::compareTo)) + .thenComparing(HbrvWbsVo::getHbrvcd, Comparator.nullsLast(String::compareTo))) + .toList(); + } + + private HbrvWbsVo toHbrvWbsVo(SdHbrvDic source, String baseName) { + HbrvWbsVo vo = new HbrvWbsVo(); + vo.setHbrvcd(source.getHbrvcd()); + vo.setHbrvcdName(source.getHbrvnm()); + vo.setBaseId(source.getBaseid()); + vo.setBaseName(baseName); + return vo; + } +} From abb76a8abbdce4279f47845e78b81526d9e009a9 Mon Sep 17 00:00:00 2001 From: tangwei Date: Fri, 12 Jun 2026 15:34:21 +0800 Subject: [PATCH 28/34] =?UTF-8?q?feat:=20=E6=80=BB=E9=99=A2=E9=B1=BC?= =?UTF-8?q?=E7=B1=BB=E5=AD=97=E5=85=B8=E5=88=97=E8=A1=A8?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../fpr/controller/FprMonitorController.java | 7 + .../qgc_env/fpr/entity/vo/FprZyFishDicVo.java | 46 +++ .../fpr/service/FprMonitorService.java | 3 + .../service/impl/FprMonitorServiceImpl.java | 316 ++++++++++++++++++ 4 files changed, 372 insertions(+) create mode 100644 backend/src/main/java/com/yfd/platform/qgc_env/fpr/entity/vo/FprZyFishDicVo.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 49d3cf87..a5f31b87 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 @@ -6,6 +6,7 @@ import com.yfd.platform.qgc_env.fpr.entity.ao.FprdRunDataAo; 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.FprdRunDataInfoVo; +import com.yfd.platform.qgc_env.fpr.entity.vo.FprZyFishDicVo; import com.yfd.platform.qgc_env.fpr.service.FprMonitorService; import io.swagger.v3.oas.annotations.Operation; import io.swagger.v3.oas.annotations.tags.Tag; @@ -43,6 +44,12 @@ public class FprMonitorController { return ResponseResult.successData(fprMonitorService.getFishDicList(dataSourceRequest)); } + @PostMapping("/fishDic/zy/GetKendoList") + @Operation(summary = "总院鱼类字典列表") + public ResponseResult getZyFishDicList(@RequestBody DataSourceRequest dataSourceRequest) { + return ResponseResult.successData(fprMonitorService.getZyFishDicList(dataSourceRequest)); + } + @PostMapping("/sdFprdR/getFprdDataInfo") @Operation(summary = "获取鱼类调查装置概况") public ResponseResult getFprdRunDataInfo(@RequestBody FprdRunDataAo ao) { diff --git a/backend/src/main/java/com/yfd/platform/qgc_env/fpr/entity/vo/FprZyFishDicVo.java b/backend/src/main/java/com/yfd/platform/qgc_env/fpr/entity/vo/FprZyFishDicVo.java new file mode 100644 index 00000000..6399d079 --- /dev/null +++ b/backend/src/main/java/com/yfd/platform/qgc_env/fpr/entity/vo/FprZyFishDicVo.java @@ -0,0 +1,46 @@ +package com.yfd.platform.qgc_env.fpr.entity.vo; + +import io.swagger.v3.oas.annotations.media.Schema; +import lombok.Data; + +@Data +@Schema(description = "总院鱼类字典信息") +public class FprZyFishDicVo { + + private Integer index; + private String id; + private Integer isDeleted; + private String zyFishId; + private String rvcd; + private String rvcdName; + private String name; + private Integer type; + private String family; + private String genus; + private String species; + private String nameEn; + private String alias; + private String fsz; + private String shapedesc; + private String habitation; + private String habitMigrat; + private String feedingHabit; + private String food; + private String timeFeed; + private String orignDate; + private String filterContent; + private String pretemp; + private String flowRate; + private String depth; + private String wqtq; + private String spawnCharact; + private String botmMater; + private Integer ptype; + private String ptypeName; + private Integer specOrigin; + private String specOriginName; + private String description; + private String logo; + private String inffile; + private String spawnMonth; +} 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 9f638034..c0c49dd4 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 @@ -7,6 +7,7 @@ import com.yfd.platform.qgc_env.fpr.entity.ao.FprdRunDataAo; 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.FprdRunDataInfoVo; +import com.yfd.platform.qgc_env.fpr.entity.vo.FprZyFishDicVo; import java.util.List; @@ -16,6 +17,8 @@ public interface FprMonitorService { DataSourceResult getFishDicList(DataSourceRequest dataSourceRequest); + DataSourceResult getZyFishDicList(DataSourceRequest dataSourceRequest); + FprdRunDataInfoVo getFprdRunDataInfo(FprdRunDataAo ao); List getFtpChangeInfo(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 309e6f0e..993da4ea 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 @@ -17,6 +17,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.FprdRunDataInfoVo; +import com.yfd.platform.qgc_env.fpr.entity.vo.FprZyFishDicVo; import com.yfd.platform.qgc_env.fpr.service.FprMonitorService; import com.yfd.platform.utils.QgcQueryWrapperUtil; import jakarta.annotation.Resource; @@ -28,6 +29,7 @@ import java.util.HashMap; import java.util.LinkedHashMap; import java.util.List; import java.util.Map; +import java.util.stream.Collectors; @Service public class FprMonitorServiceImpl implements FprMonitorService { @@ -182,6 +184,89 @@ public class FprMonitorServiceImpl implements FprMonitorService { return result; } + @Override + public DataSourceResult getZyFishDicList(DataSourceRequest dataSourceRequest) { + DataSourceLoadOptionsBase loadOptions = dataSourceRequest == null ? null : dataSourceRequest.toDevRequest(); + Map paramMap = new HashMap<>(); + String rvcd = loadOptions == null ? null : QgcQueryWrapperUtil.getFilterFieldValue(loadOptions, "rvcd"); + String filterSql = buildZyFishDicFilterCondition( + dataSourceRequest == null ? null : dataSourceRequest.getFilter(), + paramMap, + new int[]{0} + ); + + StringBuilder sql = new StringBuilder("SELECT * FROM (") + .append(buildZyFishDicBaseSql()) + .append(") t WHERE 1 = 1 "); + if (StrUtil.isNotBlank(filterSql)) { + sql.append(" AND ").append(filterSql).append(" "); + } + + List list = microservicDynamicSQLMapper.getAllListWithResultType( + sql.toString(), + paramMap, + FprZyFishDicVo.class + ); + List> rvcdRows = microservicDynamicSQLMapper.getAllList( + "SELECT RVCD AS rvcd, RVNM AS rvcdName FROM SD_RVCD_DIC", + null + ); + Map rvcdNameMap = new HashMap<>(); + for (Map row : rvcdRows) { + Object rvcdKey = row.get("RVCD"); + Object rvcdName = row.get("RVCDNAME"); + if (rvcdKey != null && rvcdName != null) { + rvcdNameMap.put(String.valueOf(rvcdKey), String.valueOf(rvcdName)); + } + } + + List resultList; + Map> rvcdMap = new HashMap<>(); + if (StrUtil.isBlank(rvcd)) { + rvcdMap = list.stream() + .collect(Collectors.groupingBy( + item -> StrUtil.blankToDefault(item.getZyFishId(), item.getId()), + LinkedHashMap::new, + Collectors.mapping(FprZyFishDicVo::getRvcd, Collectors.toList()) + )); + LinkedHashMap distinctMap = new LinkedHashMap<>(); + for (FprZyFishDicVo item : list) { + distinctMap.putIfAbsent(StrUtil.blankToDefault(item.getZyFishId(), item.getId()), item); + } + resultList = new ArrayList<>(distinctMap.values()); + } else { + resultList = new ArrayList<>(list); + } + + for (int i = 0; i < resultList.size(); i++) { + FprZyFishDicVo item = resultList.get(i); + item.setIndex(i + 1); + item.setSpawnMonth(formatSpawnMonth(item.getSpawnMonth())); + if (StrUtil.isBlank(rvcd)) { + List rvcdList = rvcdMap.getOrDefault( + StrUtil.blankToDefault(item.getZyFishId(), item.getId()), + new ArrayList<>() + ).stream().filter(StrUtil::isNotBlank).distinct().toList(); + List rvcdNames = new ArrayList<>(); + for (String rvcdItem : rvcdList) { + String rvcdName = rvcdNameMap.get(rvcdItem); + if (StrUtil.isNotBlank(rvcdName)) { + rvcdNames.add(rvcdName); + } + } + item.setRvcdName(String.join(",", rvcdNames)); + } else { + item.setRvcdName(rvcdNameMap.get(item.getRvcd())); + } + } + + DataSourceResult result = new DataSourceResult<>(); + result.setTotal((long) resultList.size()); + result.setData(paginateZyFishDicList(resultList, loadOptions)); + result.setAggregates(new HashMap<>()); + return result; + } + private String buildMsstbprptBaseSql() { return "SELECT " + "CAST(NULL AS VARCHAR2(36)) AS id, " + @@ -415,6 +500,49 @@ public class FprMonitorServiceImpl implements FprMonitorService { "WHERE NVL(src.IS_DELETED, 0) = 0 "; } + private String buildZyFishDicBaseSql() { + return "SELECT DISTINCT " + + "src.ID AS id, " + + "NVL(src.IS_DELETED, 0) AS isDeleted, " + + "CASE WHEN rel.ZY_FISH_ID IS NULL THEN src.ID ELSE rel.ZY_FISH_ID END AS zyFishId, " + + "CASE WHEN rel.RVCD IS NULL THEN 'null' ELSE rel.RVCD END AS rvcd, " + + "src.NAME AS name, " + + "src.TYPE AS type, " + + "src.FAMILY AS family, " + + "src.GENUS AS genus, " + + "src.SPECIES AS species, " + + "src.NAME_EN AS nameEn, " + + "src.ALIAS AS alias, " + + "src.FSZ AS fsz, " + + "src.SHAPEDESC AS shapedesc, " + + "src.HABITATION AS habitation, " + + "src.HABIT_MIGRAT AS habitMigrat, " + + "src.FEEDING_HABIT AS feedingHabit, " + + "src.FOOD AS food, " + + "src.TIME_FEED AS timeFeed, " + + "src.ORIGN_DATE AS orignDate, " + + "CAST(NULL AS VARCHAR2(255)) AS filterContent, " + + "src.PRETEMP AS pretemp, " + + "src.FLOW_RATE AS flowRate, " + + "src.DEPTH AS depth, " + + "src.WQTQ AS wqtq, " + + "src.SPAWN_CHARACT AS spawnCharact, " + + "src.BOTM_MATER AS botmMater, " + + "src.PTYPE AS ptype, " + + "CASE src.PTYPE WHEN 1 THEN '濒危' WHEN 2 THEN '极危' WHEN 3 THEN '近危' WHEN 4 THEN '易危' WHEN 5 THEN '重点保护' WHEN 6 THEN '无危' WHEN 7 THEN '国家二级' WHEN 8 THEN '市二级保护' ELSE '未知' END AS ptypeName, "+ + "src.SPEC_ORIGIN AS specOrigin, " + + "CASE WHEN src.SPEC_ORIGIN = 1 THEN '本土物种' WHEN src.SPEC_ORIGIN = 2 THEN '外来物种' ELSE NULL END AS specOriginName, " + + "src.DESCRIPTION AS description, " + + "src.LOGO AS logo, " + + "src.INFFILE AS inffile, " + + "src.SPAWN_MONTH AS spawnMonth " + + "FROM SD_FISHDICTORY_B src " + + "LEFT JOIN SD_FISHDICTORY_RLTN_B rel ON src.ID = rel.ZY_FISH_ID " + + " AND rel.RVCD <> 'ZY' " + + " AND NVL(rel.IS_DELETED, 0) = 0 " + + "WHERE NVL(src.IS_DELETED, 0) = 0 "; + } + private String buildMsstbprptDetailSelectSql(List selectFields) { LinkedHashMap columnMap = buildMsstbprptSelectColumnMap(); if (CollUtil.isEmpty(selectFields)) { @@ -619,6 +747,31 @@ public class FprMonitorServiceImpl implements FprMonitorService { return String.join("or".equalsIgnoreCase(filter.getLogic()) ? " OR " : " AND ", conditions); } + private String buildZyFishDicFilterCondition(DataSourceRequest.FilterDescriptor filter, + Map paramMap, + int[] indexHolder) { + if (filter == null) { + return ""; + } + if (StrUtil.isNotBlank(filter.getField())) { + return buildZyFishDicLeafCondition(filter, paramMap, indexHolder); + } + if (filter.getFilters() == null || filter.getFilters().isEmpty()) { + return ""; + } + List conditions = new ArrayList<>(); + for (DataSourceRequest.FilterDescriptor child : filter.getFilters()) { + String childSql = buildZyFishDicFilterCondition(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 buildMsstbprptLeafCondition(DataSourceRequest.FilterDescriptor filter, Map paramMap, int[] indexHolder) { @@ -771,6 +924,90 @@ public class FprMonitorServiceImpl implements FprMonitorService { } } + private String buildZyFishDicLeafCondition(DataSourceRequest.FilterDescriptor filter, + Map paramMap, + int[] indexHolder) { + String field = filter.getField(); + String operator = StrUtil.blankToDefault(filter.getOperator(), "eq").toLowerCase(); + Object value = filter.getValue(); + + if ("keyword".equals(field)) { + if (value == null || StrUtil.isBlank(String.valueOf(value))) { + return ""; + } + String paramKey = "fprZyP" + indexHolder[0]++; + paramMap.put(paramKey, "%" + value + "%"); + return "(t.name LIKE #{map." + paramKey + "} " + + "OR t.nameEn LIKE #{map." + paramKey + "} " + + "OR t.alias LIKE #{map." + paramKey + "} " + + "OR t.family LIKE #{map." + paramKey + "} " + + "OR t.genus LIKE #{map." + paramKey + "} " + + "OR t.species LIKE #{map." + paramKey + "})"; + } + + String column = mapZyFishDicColumn(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 = "fprZyP" + indexHolder[0]++; + paramMap.put(paramKey, item); + placeholders.add("#{map." + paramKey + "}"); + } + return column + " IN (" + String.join(", ", placeholders) + ")"; + } + if (value == null) { + return ""; + } + String paramKey = "fprZyP" + 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 "notcontains": + paramMap.put(paramKey, "%" + value + "%"); + return column + " NOT 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 mapMsstbprptColumn(String field) { if (StrUtil.isBlank(field)) { return null; @@ -903,6 +1140,85 @@ public class FprMonitorServiceImpl implements FprMonitorService { }; } + private String mapZyFishDicColumn(String field) { + if (StrUtil.isBlank(field)) { + return null; + } + return switch (field) { + case "id" -> "t.id"; + case "isDeleted" -> "t.isDeleted"; + case "zyFishId" -> "t.zyFishId"; + case "rvcd" -> "t.rvcd"; + case "name" -> "t.name"; + case "type" -> "t.type"; + case "family" -> "t.family"; + case "genus" -> "t.genus"; + case "species" -> "t.species"; + case "nameEn" -> "t.nameEn"; + case "alias" -> "t.alias"; + case "fsz" -> "t.fsz"; + case "shapedesc" -> "t.shapedesc"; + case "habitation" -> "t.habitation"; + case "habitMigrat" -> "t.habitMigrat"; + case "feedingHabit" -> "t.feedingHabit"; + case "food" -> "t.food"; + case "timeFeed" -> "t.timeFeed"; + case "orignDate" -> "t.orignDate"; + case "filterContent" -> "t.filterContent"; + case "pretemp" -> "t.pretemp"; + case "flowRate" -> "t.flowRate"; + case "depth" -> "t.depth"; + case "wqtq" -> "t.wqtq"; + case "spawnCharact" -> "t.spawnCharact"; + case "botmMater" -> "t.botmMater"; + case "ptype" -> "t.ptype"; + case "specOrigin" -> "t.specOrigin"; + case "description" -> "t.description"; + case "logo" -> "t.logo"; + case "inffile" -> "t.inffile"; + case "spawnMonth" -> "t.spawnMonth"; + default -> null; + }; + } + + private List paginateZyFishDicList(List resultList, DataSourceLoadOptionsBase loadOptions) { + if (CollUtil.isEmpty(resultList) || loadOptions == null || loadOptions.getTake() == null || loadOptions.getTake() <= 0) { + return resultList; + } + int start = Math.max(loadOptions.getSkip() == null ? 0 : loadOptions.getSkip(), 0); + int end = Math.min(start + loadOptions.getTake(), resultList.size()); + if (start >= resultList.size()) { + return new ArrayList<>(); + } + return new ArrayList<>(resultList.subList(start, end)); + } + + private String formatSpawnMonth(String input) { + if (StrUtil.isBlank(input)) { + return input; + } + try { + String[] numbers = input.split(","); + List ranges = new ArrayList<>(); + int start = Integer.parseInt(numbers[0]); + int end = Integer.parseInt(numbers[0]); + for (int i = 1; i < numbers.length; i++) { + int current = Integer.parseInt(numbers[i]); + if (current == end + 1) { + end = current; + } else { + ranges.add(start == end ? Integer.toString(start) : start + "-" + end); + start = current; + end = current; + } + } + ranges.add(start == end ? Integer.toString(start) : start + "-" + end); + return String.join(",", ranges); + } catch (Exception ex) { + return input; + } + } + private String buildMsstbprptDetailOrderBySql(List sorts) { List orderItems = new ArrayList<>(); if (CollUtil.isNotEmpty(sorts)) { From d46649391ece130cc9920f95cb313c6f73d14b2c Mon Sep 17 00:00:00 2001 From: tangwei Date: Fri, 12 Jun 2026 15:59:09 +0800 Subject: [PATCH 29/34] =?UTF-8?q?feat:=20=E6=9F=A5=E8=AF=A2=E6=B0=B4?= =?UTF-8?q?=E8=B4=A8=E6=97=A5=E6=95=B0=E6=8D=AE?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../wq/controller/EnvWqDataController.java | 6 + .../qgc_env/wq/entity/vo/EnvWqDayDataVo.java | 81 ++++ .../qgc_env/wq/service/EnvWqDataService.java | 2 + .../wq/service/impl/EnvWqDataServiceImpl.java | 418 ++++++++++++++++++ 4 files changed, 507 insertions(+) create mode 100644 backend/src/main/java/com/yfd/platform/qgc_env/wq/entity/vo/EnvWqDayDataVo.java diff --git a/backend/src/main/java/com/yfd/platform/qgc_env/wq/controller/EnvWqDataController.java b/backend/src/main/java/com/yfd/platform/qgc_env/wq/controller/EnvWqDataController.java index 76f13c1f..ba23d28a 100644 --- a/backend/src/main/java/com/yfd/platform/qgc_env/wq/controller/EnvWqDataController.java +++ b/backend/src/main/java/com/yfd/platform/qgc_env/wq/controller/EnvWqDataController.java @@ -42,6 +42,12 @@ public class EnvWqDataController { return ResponseResult.successData(envWqDataService.processDataKendoList(dataSourceRequest)); } + @PostMapping("/data/day/GetKendoListCust") + @Operation(summary = "查询水质日数据") + public ResponseResult getDayKendoListCust(@RequestBody DataSourceRequest dataSourceRequest) { + return ResponseResult.successData(envWqDataService.getDayKendoListCust(dataSourceRequest)); + } + @PostMapping("/GetStbprpYsByStcd") @Operation(summary = "水质监测数据查询") public ResponseResult GetStbprpYsByStcd(@RequestBody DataSourceRequest dataSourceRequest) { diff --git a/backend/src/main/java/com/yfd/platform/qgc_env/wq/entity/vo/EnvWqDayDataVo.java b/backend/src/main/java/com/yfd/platform/qgc_env/wq/entity/vo/EnvWqDayDataVo.java new file mode 100644 index 00000000..3140e45d --- /dev/null +++ b/backend/src/main/java/com/yfd/platform/qgc_env/wq/entity/vo/EnvWqDayDataVo.java @@ -0,0 +1,81 @@ +package com.yfd.platform.qgc_env.wq.entity.vo; + +import io.swagger.v3.oas.annotations.media.Schema; +import lombok.Data; + +import java.math.BigDecimal; +import java.util.Date; +import java.util.List; +import java.util.Map; + +@Data +@Schema(description = "水质日数据") +public class EnvWqDayDataVo { + private String stcd; + private String rstcd; + private String stnm; + private String stCode; + private String stName; + private String ennm; + private Date dt; + private BigDecimal wtmp; + private BigDecimal ph; + private BigDecimal dox; + private BigDecimal codmn; + private BigDecimal codcr; + private BigDecimal bod5; + private BigDecimal nh3n; + private BigDecimal tp; + private BigDecimal tn; + private BigDecimal cu; + private BigDecimal zn; + private BigDecimal f; + private BigDecimal se; + private BigDecimal ars; + private BigDecimal hg; + private BigDecimal cd; + private BigDecimal cr6; + private BigDecimal pb; + private BigDecimal cn; + private BigDecimal vlph; + private BigDecimal oil; + private BigDecimal las; + private BigDecimal s2; + private BigDecimal fcg; + private BigDecimal cl; + private BigDecimal so4; + private BigDecimal no3; + private BigDecimal thrd; + private BigDecimal cond; + private BigDecimal fe; + private BigDecimal mn; + private BigDecimal al; + private BigDecimal ss; + private BigDecimal no2; + private BigDecimal chla; + private BigDecimal clarity; + private BigDecimal tu; + private BigDecimal tod; + private BigDecimal cyano; + private String wqgrd; + private String wqgrdName; + private String wwqtg; + private String wwqtgName; + private Integer sfdb; + private String sfdbName; + private String wqSfdbhnYs; + private String wqSfdbhnYsName; + private String baseId; + private String baseName; + private String rvcdName; + private String addvcdName; + private String dtinType; + private BigDecimal qi; + private BigDecimal qo; + private Integer baseStepSort; + private Integer rvcdStepSort; + private Integer rstcdStepSort; + private Integer siteStepSort; + private List> min; + private List> max; +} diff --git a/backend/src/main/java/com/yfd/platform/qgc_env/wq/service/EnvWqDataService.java b/backend/src/main/java/com/yfd/platform/qgc_env/wq/service/EnvWqDataService.java index 7e351ad7..6b473403 100644 --- a/backend/src/main/java/com/yfd/platform/qgc_env/wq/service/EnvWqDataService.java +++ b/backend/src/main/java/com/yfd/platform/qgc_env/wq/service/EnvWqDataService.java @@ -12,6 +12,8 @@ public interface EnvWqDataService { DataSourceResult processDataKendoList(DataSourceRequest dataSourceRequest); + DataSourceResult getDayKendoListCust(DataSourceRequest dataSourceRequest); + DataSourceResult getStbprpYsByStcd(DataSourceRequest dataSourceRequest); DataSourceResult getAlongWqKendoListCust(DataSourceRequest dataSourceRequest); 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 2ebee4d2..a2487669 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 @@ -143,6 +143,54 @@ public class EnvWqDataServiceImpl implements EnvWqDataService { return result; } + @Override + public DataSourceResult getDayKendoListCust(DataSourceRequest dataSourceRequest) { + StringBuilder sql = new StringBuilder(buildEnvWqDayBaseSql()); + Map paramMap = new HashMap<>(); + String filterSql = buildEnvWqDayFilterCondition( + dataSourceRequest == null ? null : dataSourceRequest.getFilter(), + paramMap, + new int[]{0} + ); + if (StrUtil.isNotBlank(filterSql)) { + sql.append(" AND ").append(filterSql).append(" "); + } + + DataSourceLoadOptionsBase loadOptions = dataSourceRequest.toDevRequest(); + String groupBy = KendoUtil.getGroupBy(dataSourceRequest); + GroupingInfo[] groupInfos = loadOptions.getGroup(); + if (StrUtil.isNotBlank(groupBy) && groupInfos != null && groupInfos.length > 0) { + String groupedSql = buildEnvWqDayGroupSql(sql.toString(), groupBy, groupInfos); + List> list = microservicDynamicSQLMapper.pageAllList(null, groupedSql, paramMap); + DataSourceResult result = new DataSourceResult(); + if (Boolean.TRUE.equals(dataSourceRequest.getGroupResultFlat())) { + result.setData(new GroupHelper().faltGroup(list, Arrays.asList(groupInfos))); + } else { + result.setData(new GroupHelper().group(list, Arrays.asList(groupInfos))); + } + result.setTotal(0L); + result.setAggregates(new HashMap<>()); + return result; + } + + sql.append(buildEnvWqDayOrderBySql(dataSourceRequest.getSort())); + Page page = QgcQueryWrapperUtil.buildPage(loadOptions, loadOptions.getSkip(), loadOptions.getTake()); + List list = microservicDynamicSQLMapper.pageAllListWithResultType( + page, + sql.toString(), + paramMap, + EnvWqDayDataVo.class + ); + fillEnvWqDayDerivedFields(list); + fillEnvWqDayLimit(list); + + DataSourceResult result = new DataSourceResult<>(); + result.setData(list); + result.setTotal(page != null ? page.getTotal() : list.size()); + result.setAggregates(new HashMap<>()); + return result; + } + @Override public DataSourceResult getStbprpYsByStcd(DataSourceRequest dataSourceRequest) { DataSourceLoadOptionsBase loadOptions = dataSourceRequest == null ? null : dataSourceRequest.toDevRequest(); @@ -917,6 +965,376 @@ public class EnvWqDataServiceImpl implements EnvWqDataService { return sql.toString(); } + private String buildEnvWqDayBaseSql() { + return new StringBuilder() + .append("SELECT ") + .append("T.STCD AS stcd, ") + .append("T.RSTCD AS rstcd, ") + .append("T.STNM AS stnm, ") + .append("T.ST_CODE AS stCode, ") + .append("T.ST_NAME AS stName, ") + .append("T.ENNM AS ennm, ") + .append("T.DT AS dt, ") + .append("T.WTMP AS wtmp, ") + .append("T.PH AS ph, ") + .append("T.DOX AS dox, ") + .append("T.CODMN AS codmn, ") + .append("T.CODCR AS codcr, ") + .append("T.BOD5 AS bod5, ") + .append("T.NH3N AS nh3n, ") + .append("T.TP AS tp, ") + .append("T.TN AS tn, ") + .append("T.CU AS cu, ") + .append("T.ZN AS zn, ") + .append("T.F AS f, ") + .append("T.SE AS se, ") + .append("T.ARS AS ars, ") + .append("T.HG AS hg, ") + .append("T.CD AS cd, ") + .append("T.CR6 AS cr6, ") + .append("T.PB AS pb, ") + .append("T.CN AS cn, ") + .append("T.VLPH AS vlph, ") + .append("T.OIL AS oil, ") + .append("T.LAS AS las, ") + .append("T.S2 AS s2, ") + .append("T.FCG AS fcg, ") + .append("T.CL AS cl, ") + .append("T.SO4 AS so4, ") + .append("T.NO3 AS no3, ") + .append("T.THRD AS thrd, ") + .append("T.COND AS cond, ") + .append("T.FE AS fe, ") + .append("T.MN AS mn, ") + .append("T.AL AS al, ") + .append("T.SS AS ss, ") + .append("T.NO2 AS no2, ") + .append("T.CHLA AS chla, ") + .append("T.CLARITY AS clarity, ") + .append("T.TU AS tu, ") + .append("T.TOD AS tod, ") + .append("T.CYANO AS cyano, ") + .append("T.WQGRD AS wqgrd, ") + .append("T.WWQTG AS wwqtg, ") + .append("T.SFDB AS sfdb, ") + .append("T.WQ_SFDBHN_YS AS wqSfdbhnYs, ") + .append("T.BASE_ID AS baseId, ") + .append("T.BASE_NAME AS baseName, ") + .append("T.RVCD_NAME AS rvcdName, ") + .append("T.ADDVCD_NAME AS addvcdName, ") + .append("T.DTIN_TYPE AS dtinType, ") + .append("T.QI AS qi, ") + .append("T.QO AS qo, ") + .append("T.BASESTEPSORT AS baseStepSort, ") + .append("T.RVCDSTEPSORT AS rvcdStepSort, ") + .append("T.RSTCDSTEPSORT AS rstcdStepSort, ") + .append("T.SITESTEPSORT AS siteStepSort ") + .append("FROM (SELECT ") + .append("day.STCD, ") + .append("station.RSTCD, ") + .append("station.STNM, ") + .append("station.ST_CODE, ") + .append("station.ST_NAME, ") + .append("station.ENNM, ") + .append("day.DT, ") + .append("day.WTMP, day.PH, day.DOX, day.CODMN, day.CODCR, day.BOD5, day.NH3N, day.TP, day.TN, ") + .append("day.CU, day.ZN, day.F, day.SE, day.ARS, day.HG, day.CD, day.CR6, day.PB, day.CN, day.VLPH, ") + .append("day.OIL, day.LAS, day.S2, day.FCG, day.CL, day.SO4, day.NO3, day.THRD, day.COND, day.FE, day.MN, ") + .append("day.AL, day.SS, day.NO2, day.CHLA, day.CLARITY, day.TU, ") + .append("CAST(NULL AS NUMBER(15,2)) AS TOD, ") + .append("day.CYANO, day.WQGRD, station.WWQTG, day.SFDB, ") + .append("CAST(NULL AS VARCHAR2(512)) AS WQ_SFDBHN_YS, ") + .append("station.BASE_ID, station.BASE_NAME, station.RVCD_NAME, station.ADDVCD_NAME, station.DTIN_TYPE, ") + .append("dayRun.QI AS QI, dayRun.QO AS QO, ") + .append("station.BASESTEPSORT, station.RVCDSTEPSORT, station.RSTCDSTEPSORT, station.SITESTEPSORT ") + .append("FROM SD_WQDAY_S day ") + .append("INNER JOIN (").append(buildEnvWqDayStationBaseSql()).append(") station ON station.STCD = day.STCD ") + .append("LEFT JOIN (SELECT run.STCD, TRUNC(run.TM) AS DT, AVG(run.QI) AS QI, AVG(run.QO) AS QO ") + .append(" FROM SD_HYDROPW_R run ") + .append(" WHERE NVL(run.IS_DELETED, 0) = 0 ") + .append(" GROUP BY run.STCD, TRUNC(run.TM)) dayRun ") + .append(" ON station.RSTCD = dayRun.STCD AND day.DT = dayRun.DT AND station.DTIN_TYPE = '0' ") + .append("WHERE NVL(day.IS_DELETED, 0) = 0) T WHERE 1 = 1 ") + .toString(); + } + + private String buildEnvWqDayStationBaseSql() { + return "SELECT " + + "wq.STCD, " + + "wq.STNM, " + + "wq.RSTCD, " + + "eng.ENNM, " + + "wq.BASE_ID, " + + "hb.BASENAME AS BASE_NAME, " + + "eng.HBRVCD, " + + "hbrv.HBRVNM AS HBRVCD_NAME, " + + "rv.RVNM AS RVCD_NAME, " + + "addv.ADDVNM AS ADDVCD_NAME, " + + "wq.WWQTG, " + + "TO_CHAR(wq.DTIN_TYPE) AS DTIN_TYPE, " + + "wq.FHSTCD AS ST_CODE, " + + "fh.STNM AS ST_NAME, " + + "rstAlong.SORT AS RSTCDSTEPSORT, " + + "hb.ORDER_INDEX AS BASESTEPSORT, " + + "rvAlong.ORDER_INDEX AS RVCDSTEPSORT, " + + "siteAlong.SORT AS SITESTEPSORT " + + "FROM SD_WQ_B_H wq " + + "LEFT JOIN SD_ENGINFO_B_H eng ON eng.STCD = wq.RSTCD AND NVL(eng.IS_DELETED, 0) = 0 " + + "LEFT JOIN SD_HYDROBASE hb ON hb.BASEID = wq.BASE_ID AND NVL(hb.IS_DELETED, 0) = 0 " + + "LEFT JOIN SD_HBRV_DIC hbrv ON hbrv.HBRVCD = eng.HBRVCD AND hbrv.BASEID = wq.BASE_ID AND NVL(hbrv.IS_DELETED, 0) = 0 AND NVL(hbrv.ENABLED, 1) = 1 " + + "LEFT JOIN SD_RVCD_DIC rv ON rv.RVCD = eng.RVCD " + + "LEFT JOIN SD_ADDVCD_DIC addv ON addv.ADDVCD = eng.ADDVCD " + + "LEFT JOIN SD_FHBT_B_H fh ON fh.STCD = wq.FHSTCD AND NVL(fh.IS_DELETED, 0) = 0 " + + "LEFT JOIN MS_ALONG_B rvAlong ON rvAlong.RVCD = eng.HBRVCD AND rvAlong.CODE = 'common' AND NVL(rvAlong.IS_DELETED, 0) = 0 " + + "LEFT JOIN (SELECT det.SORT, along.RVCD, det.STCD " + + " FROM MS_ALONGDET_B det " + + " INNER JOIN MS_ALONG_B along ON det.ALONG_ID = along.ID " + + " WHERE NVL(det.IS_DELETED, 0) = 0 AND NVL(along.IS_DELETED, 0) = 0 AND along.CODE = 'common') rstAlong " + + " ON rstAlong.RVCD = eng.HBRVCD AND rstAlong.STCD = wq.RSTCD " + + "LEFT JOIN (SELECT det.SORT, along.RVCD, det.STCD " + + " FROM MS_ALONGDET_B det " + + " INNER JOIN MS_ALONG_B along ON det.ALONG_ID = along.ID " + + " WHERE NVL(det.IS_DELETED, 0) = 0 AND NVL(along.IS_DELETED, 0) = 0 AND along.CODE = 'common') siteAlong " + + " ON siteAlong.RVCD = eng.HBRVCD AND siteAlong.STCD = wq.STCD " + + "WHERE wq.STTP IN ('WQ', 'WQFB') AND NVL(wq.IS_DELETED, 0) = 0"; + } + + private String buildEnvWqDayFilterCondition(DataSourceRequest.FilterDescriptor filter, + Map paramMap, + int[] indexHolder) { + if (filter == null) { + return ""; + } + if (StrUtil.isNotBlank(filter.getField())) { + return buildEnvWqDayLeafCondition(filter, paramMap, indexHolder); + } + if (CollUtil.isEmpty(filter.getFilters())) { + return ""; + } + List conditions = new ArrayList<>(); + for (DataSourceRequest.FilterDescriptor child : filter.getFilters()) { + String childSql = buildEnvWqDayFilterCondition(child, paramMap, indexHolder); + if (StrUtil.isNotBlank(childSql)) { + conditions.add(childSql); + } + } + if (conditions.isEmpty()) { + return ""; + } + String logic = "or".equalsIgnoreCase(filter.getLogic()) ? " OR " : " AND "; + return "(" + String.join(logic, conditions) + ")"; + } + + private String buildEnvWqDayLeafCondition(DataSourceRequest.FilterDescriptor filter, + Map paramMap, + int[] indexHolder) { + String column = mapEnvWqDayColumn(filter.getField()); + if (StrUtil.isBlank(column) || filter.getValue() == null) { + return ""; + } + String operator = StrUtil.blankToDefault(filter.getOperator(), "eq").toLowerCase(); + String key = "envWqDayParam" + indexHolder[0]++; + boolean dateField = "dt".equals(filter.getField()); + switch (operator) { + case "eq": + paramMap.put(key, filter.getValue()); + return dateField ? column + " = TO_DATE(#{map." + key + "}, 'YYYY-MM-DD HH24:MI:SS')" : column + " = #{map." + key + "}"; + case "neq": + paramMap.put(key, filter.getValue()); + return dateField ? column + " <> TO_DATE(#{map." + key + "}, 'YYYY-MM-DD HH24:MI:SS')" : column + " <> #{map." + key + "}"; + case "gt": + paramMap.put(key, filter.getValue()); + return dateField ? column + " > TO_DATE(#{map." + key + "}, 'YYYY-MM-DD HH24:MI:SS')" : column + " > #{map." + key + "}"; + case "gte": + paramMap.put(key, filter.getValue()); + return dateField ? column + " >= TO_DATE(#{map." + key + "}, 'YYYY-MM-DD HH24:MI:SS')" : column + " >= #{map." + key + "}"; + case "lt": + paramMap.put(key, filter.getValue()); + return dateField ? column + " < TO_DATE(#{map." + key + "}, 'YYYY-MM-DD HH24:MI:SS')" : column + " < #{map." + key + "}"; + case "lte": + paramMap.put(key, filter.getValue()); + return dateField ? column + " <= TO_DATE(#{map." + key + "}, 'YYYY-MM-DD HH24:MI:SS')" : column + " <= #{map." + key + "}"; + case "contains": + paramMap.put(key, "%" + filter.getValue() + "%"); + return column + " LIKE #{map." + key + "}"; + default: + return ""; + } + } + + private String mapEnvWqDayColumn(String field) { + if (StrUtil.isBlank(field)) { + return null; + } + return switch (field) { + case "baseName" -> "T.BASE_NAME"; + case "stnm" -> "T.STNM"; + case "wwqtg" -> "T.WWQTG"; + case "baseId" -> "T.BASE_ID"; + case "rstcd" -> "T.RSTCD"; + case "ennm" -> "T.ENNM"; + case "stCode" -> "T.ST_CODE"; + case "stName" -> "T.ST_NAME"; + case "stcd" -> "T.STCD"; + case "dt" -> "T.DT"; + case "wqgrd" -> "T.WQGRD"; + case "ph" -> "T.PH"; + case "dox" -> "T.DOX"; + case "codmn" -> "T.CODMN"; + case "codcr" -> "T.CODCR"; + case "bod5" -> "T.BOD5"; + case "nh3n" -> "T.NH3N"; + case "tp" -> "T.TP"; + case "tn" -> "T.TN"; + case "cu" -> "T.CU"; + case "zn" -> "T.ZN"; + case "f" -> "T.F"; + case "se" -> "T.SE"; + case "ars" -> "T.ARS"; + case "hg" -> "T.HG"; + case "cd" -> "T.CD"; + case "cr6" -> "T.CR6"; + case "pb" -> "T.PB"; + case "cn" -> "T.CN"; + case "vlph" -> "T.VLPH"; + case "oil" -> "T.OIL"; + case "las" -> "T.LAS"; + case "s2" -> "T.S2"; + case "fcg" -> "T.FCG"; + case "cl" -> "T.CL"; + case "so4" -> "T.SO4"; + case "no3" -> "T.NO3"; + case "thrd" -> "T.THRD"; + case "cond" -> "T.COND"; + case "fe" -> "T.FE"; + case "mn" -> "T.MN"; + case "al" -> "T.AL"; + case "ss" -> "T.SS"; + case "no2" -> "T.NO2"; + case "chla" -> "T.CHLA"; + case "clarity" -> "T.CLARITY"; + case "tu" -> "T.TU"; + case "cyano" -> "T.CYANO"; + case "sfdb" -> "T.SFDB"; + case "wtmp" -> "T.WTMP"; + case "dtinType" -> "T.DTIN_TYPE"; + case "tod" -> "T.TOD"; + case "wqSfdbhnYs" -> "T.WQ_SFDBHN_YS"; + case "rvcdName" -> "T.RVCD_NAME"; + case "addvcdName" -> "T.ADDVCD_NAME"; + case "qi" -> "T.QI"; + case "qo" -> "T.QO"; + case "siteStepSort" -> "T.SITESTEPSORT"; + case "baseStepSort" -> "T.BASESTEPSORT"; + case "rvcdStepSort" -> "T.RVCDSTEPSORT"; + case "rstcdStepSort" -> "T.RSTCDSTEPSORT"; + default -> null; + }; + } + + private String buildEnvWqDayGroupSql(String baseSql, String groupBy, GroupingInfo[] groupInfos) { + StringBuilder sql = new StringBuilder("SELECT "); + List groupFields = new ArrayList<>(); + for (GroupingInfo item : groupInfos) { + if (item != null && StrUtil.isNotBlank(item.getSelector())) { + groupFields.add(item.getSelector()); + } + } + sql.append(String.join(", ", groupFields)); + for (GroupingInfo item : groupInfos) { + sql.append(", COUNT(*) AS count_").append(item.getSelector()).append(" "); + } + sql.append("FROM (").append(baseSql).append(") T ").append(groupBy); + return sql.toString(); + } + + private String buildEnvWqDayOrderBySql(List sortList) { + if (sortList == null || sortList.isEmpty()) { + return " ORDER BY T.DT DESC NULLS LAST, T.BASESTEPSORT ASC NULLS LAST, T.RVCDSTEPSORT ASC NULLS LAST, T.RSTCDSTEPSORT ASC NULLS LAST, T.SITESTEPSORT ASC NULLS LAST, T.STCD ASC"; + } + StringBuilder sql = new StringBuilder(" ORDER BY "); + boolean appended = false; + for (DataSourceRequest.SortDescriptor sortDescriptor : sortList) { + if (sortDescriptor == null || StrUtil.isBlank(sortDescriptor.getField())) { + continue; + } + String column = mapEnvWqDayColumn(sortDescriptor.getField()); + if (column == null) { + continue; + } + if (appended) { + sql.append(", "); + } + sql.append(column).append(" ") + .append("desc".equalsIgnoreCase(sortDescriptor.getDir()) ? "DESC" : "ASC") + .append(" NULLS LAST"); + appended = true; + } + return appended ? sql.toString() : " ORDER BY T.DT DESC NULLS LAST, T.BASESTEPSORT ASC NULLS LAST, T.RVCDSTEPSORT ASC NULLS LAST, T.RSTCDSTEPSORT ASC NULLS LAST, T.SITESTEPSORT ASC NULLS LAST, T.STCD ASC"; + } + + private void fillEnvWqDayDerivedFields(List list) { + if (CollUtil.isEmpty(list)) { + return; + } + for (EnvWqDayDataVo item : list) { + item.setWqgrdName(getWqLevelName(item.getWqgrd())); + item.setWwqtgName(getWqLevelName(item.getWwqtg())); + item.setSfdbName(getSfdbName(item.getSfdb())); + item.setWqSfdbhnYsName(convertWqFactors(item.getWqSfdbhnYs())); + } + } + + private void fillEnvWqDayLimit(List list) { + if (CollUtil.isEmpty(list)) { + return; + } + String sql = "SELECT t2.YS AS \"ys\", t2.MIN_VAL AS \"minVal\", t2.MAX_VAL AS \"maxVal\", t2.LVL AS \"lvl\" " + + "FROM MS_WARN_RULE_B t1 " + + "INNER JOIN MS_WARN_RULE_DETAIL_B t2 ON t1.ID = t2.RULE_ID " + + "WHERE t1.RULE_TYPE = 'WQLVL'"; + List> ruleList = microservicDynamicSQLMapper.pageAllList(null, sql, null); + if (CollUtil.isEmpty(ruleList)) { + return; + } + Map ruleDirectionMap = getWqLimitDirection(ruleList); + Map>> levelRuleMap = ruleList.stream() + .filter(item -> StrUtil.isNotBlank(asString(item.get("lvl")))) + .collect(Collectors.groupingBy(item -> asString(item.get("lvl")))); + + for (EnvWqDayDataVo item : list) { + if (StrUtil.isBlank(item.getWwqtg())) { + continue; + } + List> currentRules = levelRuleMap.get(item.getWwqtg()); + if (CollUtil.isEmpty(currentRules)) { + continue; + } + List> max = new ArrayList<>(); + List> min = new ArrayList<>(); + for (Map rule : currentRules) { + String ys = asString(rule.get("ys")); + Integer direction = ruleDirectionMap.get(ys); + Map maxMap = new LinkedHashMap<>(); + Map minMap = new LinkedHashMap<>(); + if (direction != null && direction == 2) { + maxMap.put(ys, rule.get("maxVal")); + minMap.put(ys, rule.get("minVal")); + max.add(maxMap); + min.add(minMap); + } else if (direction != null && direction == 1) { + minMap.put(ys, rule.get("minVal")); + min.add(minMap); + } else { + maxMap.put(ys, rule.get("maxVal")); + max.add(maxMap); + } + } + item.setMax(max); + item.setMin(min); + } + } + private String buildEnvWqDataStationBaseSql() { return "SELECT " + "wq.STCD, " + From 8240bf65c04de31035e873f4a590661b0ed45d41 Mon Sep 17 00:00:00 2001 From: tangwei Date: Fri, 12 Jun 2026 16:33:11 +0800 Subject: [PATCH 30/34] =?UTF-8?q?feat:=20=E6=9F=A5=E8=AF=A2=E6=B0=B4?= =?UTF-8?q?=E8=B4=A8=E5=91=A8=E6=97=AC=E6=9C=88=E5=AD=A3=E5=B9=B4=E6=95=B0?= =?UTF-8?q?=E6=8D=AE?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../wq/controller/EnvWqDataController.java | 6 + .../qgc_env/wq/entity/vo/EnvWqDrtpDataVo.java | 78 ++++ .../qgc_env/wq/service/EnvWqDataService.java | 2 + .../wq/service/impl/EnvWqDataServiceImpl.java | 337 ++++++++++++++++++ 4 files changed, 423 insertions(+) create mode 100644 backend/src/main/java/com/yfd/platform/qgc_env/wq/entity/vo/EnvWqDrtpDataVo.java diff --git a/backend/src/main/java/com/yfd/platform/qgc_env/wq/controller/EnvWqDataController.java b/backend/src/main/java/com/yfd/platform/qgc_env/wq/controller/EnvWqDataController.java index ba23d28a..682a1104 100644 --- a/backend/src/main/java/com/yfd/platform/qgc_env/wq/controller/EnvWqDataController.java +++ b/backend/src/main/java/com/yfd/platform/qgc_env/wq/controller/EnvWqDataController.java @@ -48,6 +48,12 @@ public class EnvWqDataController { return ResponseResult.successData(envWqDataService.getDayKendoListCust(dataSourceRequest)); } + @PostMapping("/data/drtp/GetKendoListCust") + @Operation(summary = "查询水质周旬月季年数据") + public ResponseResult getDrtpKendoListCust(@RequestBody DataSourceRequest dataSourceRequest) { + return ResponseResult.successData(envWqDataService.getDrtpKendoListCust(dataSourceRequest)); + } + @PostMapping("/GetStbprpYsByStcd") @Operation(summary = "水质监测数据查询") public ResponseResult GetStbprpYsByStcd(@RequestBody DataSourceRequest dataSourceRequest) { diff --git a/backend/src/main/java/com/yfd/platform/qgc_env/wq/entity/vo/EnvWqDrtpDataVo.java b/backend/src/main/java/com/yfd/platform/qgc_env/wq/entity/vo/EnvWqDrtpDataVo.java new file mode 100644 index 00000000..5da93652 --- /dev/null +++ b/backend/src/main/java/com/yfd/platform/qgc_env/wq/entity/vo/EnvWqDrtpDataVo.java @@ -0,0 +1,78 @@ +package com.yfd.platform.qgc_env.wq.entity.vo; + +import io.swagger.v3.oas.annotations.media.Schema; +import lombok.Data; + +import java.math.BigDecimal; +import java.util.Date; + +@Data +@Schema(description = "水质周旬月季年数据") +public class EnvWqDrtpDataVo { + private String stcd; + private String stnm; + private String rstcd; + private String ennm; + private String stCode; + private String stName; + private Integer month; + private Integer year; + private String drtp; + private Integer dr; + private BigDecimal wtmp; + private BigDecimal ph; + private BigDecimal dox; + private BigDecimal codmn; + private BigDecimal codcr; + private BigDecimal bod5; + private BigDecimal nh3n; + private BigDecimal tp; + private BigDecimal tn; + private BigDecimal cu; + private BigDecimal zn; + private BigDecimal f; + private BigDecimal se; + private BigDecimal ars; + private BigDecimal hg; + private BigDecimal cd; + private BigDecimal cr6; + private BigDecimal pb; + private BigDecimal cn; + private BigDecimal vlph; + private BigDecimal oil; + private BigDecimal las; + private BigDecimal s2; + private BigDecimal fcg; + private BigDecimal cl; + private BigDecimal so4; + private BigDecimal no3; + private BigDecimal thrd; + private BigDecimal cond; + private BigDecimal fe; + private BigDecimal mn; + private BigDecimal al; + private BigDecimal ss; + private BigDecimal no2; + private BigDecimal chla; + private BigDecimal clarity; + private BigDecimal tu; + private BigDecimal tod; + private BigDecimal cyano; + private String wqgrd; + private String wqgrdName; + private String wwqtg; + private String wwqtgName; + private Integer sfdb; + private String sfdbName; + private String wqSfdbhnYs; + private String baseId; + private String baseName; + private String rvcdName; + private String addvcdName; + private String dtinType; + private Date tm; + private Integer baseStepSort; + private Integer rvcdStepSort; + private Integer rstcdStepSort; + private Integer siteStepSort; +} diff --git a/backend/src/main/java/com/yfd/platform/qgc_env/wq/service/EnvWqDataService.java b/backend/src/main/java/com/yfd/platform/qgc_env/wq/service/EnvWqDataService.java index 6b473403..fba7baa5 100644 --- a/backend/src/main/java/com/yfd/platform/qgc_env/wq/service/EnvWqDataService.java +++ b/backend/src/main/java/com/yfd/platform/qgc_env/wq/service/EnvWqDataService.java @@ -14,6 +14,8 @@ public interface EnvWqDataService { DataSourceResult getDayKendoListCust(DataSourceRequest dataSourceRequest); + DataSourceResult getDrtpKendoListCust(DataSourceRequest dataSourceRequest); + DataSourceResult getStbprpYsByStcd(DataSourceRequest dataSourceRequest); DataSourceResult getAlongWqKendoListCust(DataSourceRequest dataSourceRequest); 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 a2487669..942d42a6 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 @@ -191,6 +191,53 @@ public class EnvWqDataServiceImpl implements EnvWqDataService { return result; } + @Override + public DataSourceResult getDrtpKendoListCust(DataSourceRequest dataSourceRequest) { + StringBuilder sql = new StringBuilder(buildEnvWqDrtpBaseSql()); + Map paramMap = new HashMap<>(); + String filterSql = buildEnvWqDrtpFilterCondition( + dataSourceRequest == null ? null : dataSourceRequest.getFilter(), + paramMap, + new int[]{0} + ); + if (StrUtil.isNotBlank(filterSql)) { + sql.append(" AND ").append(filterSql).append(" "); + } + + DataSourceLoadOptionsBase loadOptions = dataSourceRequest.toDevRequest(); + String groupBy = KendoUtil.getGroupBy(dataSourceRequest); + GroupingInfo[] groupInfos = loadOptions.getGroup(); + if (StrUtil.isNotBlank(groupBy) && groupInfos != null && groupInfos.length > 0) { + String groupedSql = buildEnvWqDayGroupSql(sql.toString(), groupBy, groupInfos); + List> list = microservicDynamicSQLMapper.pageAllList(null, groupedSql, paramMap); + DataSourceResult result = new DataSourceResult(); + if (Boolean.TRUE.equals(dataSourceRequest.getGroupResultFlat())) { + result.setData(new GroupHelper().faltGroup(list, Arrays.asList(groupInfos))); + } else { + result.setData(new GroupHelper().group(list, Arrays.asList(groupInfos))); + } + result.setTotal(0L); + result.setAggregates(new HashMap<>()); + return result; + } + + sql.append(buildEnvWqDrtpOrderBySql(dataSourceRequest.getSort())); + Page page = QgcQueryWrapperUtil.buildPage(loadOptions, loadOptions.getSkip(), loadOptions.getTake()); + List list = microservicDynamicSQLMapper.pageAllListWithResultType( + page, + sql.toString(), + paramMap, + EnvWqDrtpDataVo.class + ); + fillEnvWqDrtpDerivedFields(list); + + DataSourceResult result = new DataSourceResult<>(); + result.setData(list); + result.setTotal(page != null ? page.getTotal() : list.size()); + result.setAggregates(new HashMap<>()); + return result; + } + @Override public DataSourceResult getStbprpYsByStcd(DataSourceRequest dataSourceRequest) { DataSourceLoadOptionsBase loadOptions = dataSourceRequest == null ? null : dataSourceRequest.toDevRequest(); @@ -1058,8 +1105,90 @@ public class EnvWqDataServiceImpl implements EnvWqDataService { .toString(); } + private String buildEnvWqDrtpBaseSql() { + return new StringBuilder() + .append("SELECT ") + .append("T.STCD AS stcd, ") + .append("T.STNM AS stnm, ") + .append("T.RSTCD AS rstcd, ") + .append("T.ENNM AS ennm, ") + .append("T.ST_CODE AS stCode, ") + .append("T.ST_NAME AS stName, ") + .append("T.MONTH AS month, ") + .append("T.YEAR AS year, ") + .append("T.DRTP AS drtp, ") + .append("T.DR AS dr, ") + .append("T.WTMP AS wtmp, ") + .append("T.PH AS ph, ") + .append("T.DOX AS dox, ") + .append("T.CODMN AS codmn, ") + .append("T.CODCR AS codcr, ") + .append("T.BOD5 AS bod5, ") + .append("T.NH3N AS nh3n, ") + .append("T.TP AS tp, ") + .append("T.TN AS tn, ") + .append("T.CU AS cu, ") + .append("T.ZN AS zn, ") + .append("T.F AS f, ") + .append("T.SE AS se, ") + .append("T.ARS AS ars, ") + .append("T.HG AS hg, ") + .append("T.CD AS cd, ") + .append("T.CR6 AS cr6, ") + .append("T.PB AS pb, ") + .append("T.CN AS cn, ") + .append("T.VLPH AS vlph, ") + .append("T.OIL AS oil, ") + .append("T.LAS AS las, ") + .append("T.S2 AS s2, ") + .append("T.FCG AS fcg, ") + .append("T.CL AS cl, ") + .append("T.SO4 AS so4, ") + .append("T.NO3 AS no3, ") + .append("T.THRD AS thrd, ") + .append("T.COND AS cond, ") + .append("T.FE AS fe, ") + .append("T.MN AS mn, ") + .append("T.AL AS al, ") + .append("T.SS AS ss, ") + .append("T.NO2 AS no2, ") + .append("T.CHLA AS chla, ") + .append("T.CLARITY AS clarity, ") + .append("T.TU AS tu, ") + .append("CAST(NULL AS NUMBER(15,2)) AS tod, ") + .append("T.CYANO AS cyano, ") + .append("T.WQGRD AS wqgrd, ") + .append("T.WWQTG AS wwqtg, ") + .append("T.SFDB AS sfdb, ") + .append("CAST(NULL AS VARCHAR2(512)) AS wqSfdbhnYs, ") + .append("T.BASE_ID AS baseId, ") + .append("T.BASE_NAME AS baseName, ") + .append("T.RVCD_NAME AS rvcdName, ") + .append("T.ADDVCD_NAME AS addvcdName, ") + .append("T.DTIN_TYPE AS dtinType, ") + .append("T.TM AS tm, ") + .append("T.BASESTEPSORT AS baseStepSort, ") + .append("T.RVCDSTEPSORT AS rvcdStepSort, ") + .append("T.RSTCDSTEPSORT AS rstcdStepSort, ") + .append("T.SITESTEPSORT AS siteStepSort ") + .append("FROM (SELECT ") + .append("drtp.STCD,station.MWAY, station.STNM, station.RSTCD, station.ENNM, station.ST_CODE, station.ST_NAME, ") + .append("drtp.MONTH, drtp.YEAR, drtp.DRTP, drtp.DR, drtp.WTMP, drtp.PH, drtp.DOX, drtp.CODMN, drtp.CODCR, ") + .append("drtp.BOD5, drtp.NH3N, drtp.TP, drtp.TN, drtp.CU, drtp.ZN, drtp.F, drtp.SE, drtp.ARS, drtp.HG, ") + .append("drtp.CD, drtp.CR6, drtp.PB, drtp.CN, drtp.VLPH, drtp.OIL, drtp.LAS, drtp.S2, drtp.FCG, drtp.CL, ") + .append("drtp.SO4, drtp.NO3, drtp.THRD, drtp.COND, drtp.FE, drtp.MN, drtp.AL, drtp.SS, drtp.NO2, ") + .append("drtp.CHLA, drtp.CLARITY, drtp.TU, drtp.CYANO, drtp.WQGRD, station.WWQTG, drtp.SFDB, ") + .append("station.BASE_ID, station.BASE_NAME, station.RVCD_NAME, station.ADDVCD_NAME, station.DTIN_TYPE, ") + .append("drtp.TM, station.BASESTEPSORT, station.RVCDSTEPSORT, station.RSTCDSTEPSORT, station.SITESTEPSORT ") + .append("FROM SD_WQDRTP_S drtp ") + .append("INNER JOIN (").append(buildEnvWqDayStationBaseSql()).append(") station ON station.STCD = drtp.STCD ") + .append("WHERE NVL(drtp.IS_DELETED, 0) = 0) T WHERE 1 = 1 ") + .toString(); + } + private String buildEnvWqDayStationBaseSql() { return "SELECT " + + "wq.MWAY, " + "wq.STCD, " + "wq.STNM, " + "wq.RSTCD, " + @@ -1157,6 +1286,24 @@ public class EnvWqDataServiceImpl implements EnvWqDataService { case "contains": paramMap.put(key, "%" + filter.getValue() + "%"); return column + " LIKE #{map." + key + "}"; + case "in": { + List list = null; + if (filter.getValue() instanceof List l) { + list = l; + } else if (filter.getValue() instanceof Object[] arr) { + list = Arrays.asList(arr); + } + if (list != null && !list.isEmpty()) { + List placeholders = new ArrayList<>(); + for (Object item : list) { + String itemKey = "envWqDrtpParam" + indexHolder[0]++; + paramMap.put(itemKey, item); + placeholders.add("#{map." + itemKey + "}"); + } + return column + " IN (" + String.join(", ", placeholders) + ")"; + } + return ""; + } default: return ""; } @@ -1232,6 +1379,160 @@ public class EnvWqDataServiceImpl implements EnvWqDataService { }; } + private String buildEnvWqDrtpFilterCondition(DataSourceRequest.FilterDescriptor filter, + Map paramMap, + int[] indexHolder) { + if (filter == null) { + return ""; + } + if (StrUtil.isNotBlank(filter.getField())) { + return buildEnvWqDrtpLeafCondition(filter, paramMap, indexHolder); + } + if (CollUtil.isEmpty(filter.getFilters())) { + return ""; + } + List conditions = new ArrayList<>(); + for (DataSourceRequest.FilterDescriptor child : filter.getFilters()) { + String childSql = buildEnvWqDrtpFilterCondition(child, paramMap, indexHolder); + if (StrUtil.isNotBlank(childSql)) { + conditions.add(childSql); + } + } + if (conditions.isEmpty()) { + return ""; + } + String logic = "or".equalsIgnoreCase(filter.getLogic()) ? " OR " : " AND "; + return "(" + String.join(logic, conditions) + ")"; + } + + private String buildEnvWqDrtpLeafCondition(DataSourceRequest.FilterDescriptor filter, + Map paramMap, + int[] indexHolder) { + String column = mapEnvWqDrtpColumn(filter.getField()); + if (StrUtil.isBlank(column) || filter.getValue() == null) { + return ""; + } + String operator = StrUtil.blankToDefault(filter.getOperator(), "eq").toLowerCase(); + String key = "envWqDrtpParam" + indexHolder[0]++; + boolean dateField = "tm".equals(filter.getField()); + switch (operator) { + case "eq": + paramMap.put(key, filter.getValue()); + return dateField ? column + " = TO_DATE(#{map." + key + "}, 'YYYY-MM-DD HH24:MI:SS')" : column + " = #{map." + key + "}"; + case "neq": + paramMap.put(key, filter.getValue()); + return dateField ? column + " <> TO_DATE(#{map." + key + "}, 'YYYY-MM-DD HH24:MI:SS')" : column + " <> #{map." + key + "}"; + case "gt": + paramMap.put(key, filter.getValue()); + return dateField ? column + " > TO_DATE(#{map." + key + "}, 'YYYY-MM-DD HH24:MI:SS')" : column + " > #{map." + key + "}"; + case "gte": + paramMap.put(key, filter.getValue()); + return dateField ? column + " >= TO_DATE(#{map." + key + "}, 'YYYY-MM-DD HH24:MI:SS')" : column + " >= #{map." + key + "}"; + case "lt": + paramMap.put(key, filter.getValue()); + return dateField ? column + " < TO_DATE(#{map." + key + "}, 'YYYY-MM-DD HH24:MI:SS')" : column + " < #{map." + key + "}"; + case "lte": + paramMap.put(key, filter.getValue()); + return dateField ? column + " <= TO_DATE(#{map." + key + "}, 'YYYY-MM-DD HH24:MI:SS')" : column + " <= #{map." + key + "}"; + case "contains": + paramMap.put(key, "%" + filter.getValue() + "%"); + return column + " LIKE #{map." + key + "}"; + case "in": { + List list = null; + if (filter.getValue() instanceof List l) { + list = l; + } else if (filter.getValue() instanceof Object[] arr) { + list = Arrays.asList(arr); + } + if (list != null && !list.isEmpty()) { + List placeholders = new ArrayList<>(); + for (Object item : list) { + String itemKey = "envWqDrtpParam" + indexHolder[0]++; + paramMap.put(itemKey, item); + placeholders.add("#{map." + itemKey + "}"); + } + return column + " IN (" + String.join(", ", placeholders) + ")"; + } + return ""; + } + default: + return ""; + } + } + + private String mapEnvWqDrtpColumn(String field) { + if (StrUtil.isBlank(field)) { + return null; + } + return switch (field) { + case "stcd" -> "T.STCD"; + case "mway" -> "T.MWAY"; + case "stnm" -> "T.STNM"; + case "rstcd" -> "T.RSTCD"; + case "ennm" -> "T.ENNM"; + case "stCode" -> "T.ST_CODE"; + case "stName" -> "T.ST_NAME"; + case "month" -> "T.MONTH"; + case "year" -> "T.YEAR"; + case "drtp" -> "T.DRTP"; + case "dr" -> "T.DR"; + case "wtmp" -> "T.WTMP"; + case "ph" -> "T.PH"; + case "dox" -> "T.DOX"; + case "codmn" -> "T.CODMN"; + case "codcr" -> "T.CODCR"; + case "bod5" -> "T.BOD5"; + case "nh3n" -> "T.NH3N"; + case "tp" -> "T.TP"; + case "tn" -> "T.TN"; + case "cu" -> "T.CU"; + case "zn" -> "T.ZN"; + case "f" -> "T.F"; + case "se" -> "T.SE"; + case "ars" -> "T.ARS"; + case "hg" -> "T.HG"; + case "cd" -> "T.CD"; + case "cr6" -> "T.CR6"; + case "pb" -> "T.PB"; + case "cn" -> "T.CN"; + case "vlph" -> "T.VLPH"; + case "oil" -> "T.OIL"; + case "las" -> "T.LAS"; + case "s2" -> "T.S2"; + case "fcg" -> "T.FCG"; + case "cl" -> "T.CL"; + case "so4" -> "T.SO4"; + case "no3" -> "T.NO3"; + case "thrd" -> "T.THRD"; + case "cond" -> "T.COND"; + case "fe" -> "T.FE"; + case "mn" -> "T.MN"; + case "al" -> "T.AL"; + case "ss" -> "T.SS"; + case "no2" -> "T.NO2"; + case "chla" -> "T.CHLA"; + case "clarity" -> "T.CLARITY"; + case "tu" -> "T.TU"; + case "tod" -> "T.TOD"; + case "cyano" -> "T.CYANO"; + case "wqgrd" -> "T.WQGRD"; + case "wwqtg" -> "T.WWQTG"; + case "sfdb" -> "T.SFDB"; + case "wqSfdbhnYs" -> "T.WQ_SFDBHN_YS"; + case "baseId" -> "T.BASE_ID"; + case "baseName" -> "T.BASE_NAME"; + case "rvcdName" -> "T.RVCD_NAME"; + case "addvcdName" -> "T.ADDVCD_NAME"; + case "dtinType" -> "T.DTIN_TYPE"; + case "tm" -> "T.TM"; + case "siteStepSort" -> "T.SITESTEPSORT"; + case "baseStepSort" -> "T.BASESTEPSORT"; + case "rvcdStepSort" -> "T.RVCDSTEPSORT"; + case "rstcdStepSort" -> "T.RSTCDSTEPSORT"; + default -> null; + }; + } + private String buildEnvWqDayGroupSql(String baseSql, String groupBy, GroupingInfo[] groupInfos) { StringBuilder sql = new StringBuilder("SELECT "); List groupFields = new ArrayList<>(); @@ -1273,6 +1574,31 @@ public class EnvWqDataServiceImpl implements EnvWqDataService { return appended ? sql.toString() : " ORDER BY T.DT DESC NULLS LAST, T.BASESTEPSORT ASC NULLS LAST, T.RVCDSTEPSORT ASC NULLS LAST, T.RSTCDSTEPSORT ASC NULLS LAST, T.SITESTEPSORT ASC NULLS LAST, T.STCD ASC"; } + private String buildEnvWqDrtpOrderBySql(List sortList) { + if (sortList == null || sortList.isEmpty()) { + return " ORDER BY T.TM DESC NULLS LAST, T.BASESTEPSORT ASC NULLS LAST, T.RVCDSTEPSORT ASC NULLS LAST, T.RSTCDSTEPSORT ASC NULLS LAST, T.SITESTEPSORT ASC NULLS LAST, T.STCD ASC"; + } + StringBuilder sql = new StringBuilder(" ORDER BY "); + boolean appended = false; + for (DataSourceRequest.SortDescriptor sortDescriptor : sortList) { + if (sortDescriptor == null || StrUtil.isBlank(sortDescriptor.getField())) { + continue; + } + String column = mapEnvWqDrtpColumn(sortDescriptor.getField()); + if (column == null) { + continue; + } + if (appended) { + sql.append(", "); + } + sql.append(column).append(" ") + .append("desc".equalsIgnoreCase(sortDescriptor.getDir()) ? "DESC" : "ASC") + .append(" NULLS LAST"); + appended = true; + } + return appended ? sql.toString() : " ORDER BY T.TM DESC NULLS LAST, T.BASESTEPSORT ASC NULLS LAST, T.RVCDSTEPSORT ASC NULLS LAST, T.RSTCDSTEPSORT ASC NULLS LAST, T.SITESTEPSORT ASC NULLS LAST, T.STCD ASC"; + } + private void fillEnvWqDayDerivedFields(List list) { if (CollUtil.isEmpty(list)) { return; @@ -1285,6 +1611,17 @@ public class EnvWqDataServiceImpl implements EnvWqDataService { } } + private void fillEnvWqDrtpDerivedFields(List list) { + if (CollUtil.isEmpty(list)) { + return; + } + for (EnvWqDrtpDataVo item : list) { + item.setWqgrdName(getWqLevelName(item.getWqgrd())); + item.setWwqtgName(getWqLevelName(item.getWwqtg())); + item.setSfdbName(getSfdbName(item.getSfdb())); + } + } + private void fillEnvWqDayLimit(List list) { if (CollUtil.isEmpty(list)) { return; From 9fdac17bb5eb2780bb5001f14c7d36db66d08317 Mon Sep 17 00:00:00 2001 From: tangwei Date: Fri, 12 Jun 2026 16:50:47 +0800 Subject: [PATCH 31/34] =?UTF-8?q?feat:=20=E6=9F=A5=E8=AF=A2=E5=87=BA?= =?UTF-8?q?=E5=BA=93=E6=B0=B4=E6=B8=A9=E6=97=A5=E6=95=B0=E6=8D=AE?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../wt/entity/vo/SdAlongDayDetailVO.java | 37 +++ .../service/impl/AlongDetailServiceImpl.java | 229 ++++++++++++++++-- 2 files changed, 242 insertions(+), 24 deletions(-) create mode 100644 backend/src/main/java/com/yfd/platform/qgc_env/wt/entity/vo/SdAlongDayDetailVO.java diff --git a/backend/src/main/java/com/yfd/platform/qgc_env/wt/entity/vo/SdAlongDayDetailVO.java b/backend/src/main/java/com/yfd/platform/qgc_env/wt/entity/vo/SdAlongDayDetailVO.java new file mode 100644 index 00000000..3d52461d --- /dev/null +++ b/backend/src/main/java/com/yfd/platform/qgc_env/wt/entity/vo/SdAlongDayDetailVO.java @@ -0,0 +1,37 @@ +package com.yfd.platform.qgc_env.wt.entity.vo; + +import com.fasterxml.jackson.annotation.JsonFormat; +import io.swagger.v3.oas.annotations.media.Schema; +import lombok.Data; + +import java.math.BigDecimal; +import java.util.Date; + +@Data +@Schema(description = "出库水温日数据") +public class SdAlongDayDetailVO { + @Schema(description = "日期") + @JsonFormat(pattern = "yyyy-MM-dd", timezone = "GMT+8") + private Date dt; + + @Schema(description = "温度") + private BigDecimal wt; + + @Schema(description = "编码") + private String stcd; + + @Schema(description = "电站编码") + private String rstcd; + + @Schema(description = "电站名称") + private String ennm; + + @Schema(description = "站点名称") + private String stnm; + + @Schema(description = "基地编码") + private String baseId; + + @Schema(description = "基地名称") + private String baseName; +} diff --git a/backend/src/main/java/com/yfd/platform/qgc_env/wt/service/impl/AlongDetailServiceImpl.java b/backend/src/main/java/com/yfd/platform/qgc_env/wt/service/impl/AlongDetailServiceImpl.java index 53be0477..5e50ab86 100644 --- a/backend/src/main/java/com/yfd/platform/qgc_env/wt/service/impl/AlongDetailServiceImpl.java +++ b/backend/src/main/java/com/yfd/platform/qgc_env/wt/service/impl/AlongDetailServiceImpl.java @@ -12,6 +12,7 @@ import com.yfd.platform.qgc_env.wt.mapper.AlongDetailMapper; import com.yfd.platform.qgc_env.wt.mapper.SdWtrvdrtpSMapper; import com.yfd.platform.qgc_env.wt.service.AlongDetailService; import com.yfd.platform.qgc_env.wt.entity.vo.SdAlongDetailVO; +import com.yfd.platform.qgc_env.wt.entity.vo.SdAlongDayDetailVO; import com.yfd.platform.qgc_env.wt.entity.vo.WtrvInfo; import com.yfd.platform.qgc_base.entity.vo.BatchDeleteAo; import com.yfd.platform.qgc_base.entity.vo.DataParam; @@ -129,33 +130,50 @@ public class AlongDetailServiceImpl extends ServiceImpl filterResult, Page page, String groupBy) { - DataSourceResult dataSourceResult = new DataSourceResult(); - StringBuilder sql = new StringBuilder(); + DataSourceResult dataSourceResult = new DataSourceResult<>(); + DataSourceLoadOptionsBase loadOptions = dataSourceRequest == null ? null : dataSourceRequest.toDevRequest(); + StringBuilder sql = new StringBuilder() + .append("SELECT ") + .append("t.DT AS dt, ") + .append("t.WT AS wt, ") + .append("t.STCD AS stcd, ") + .append("t.RSTCD AS rstcd, ") + .append("t.ENNM AS ennm, ") + .append("t.STNM AS stnm, ") + .append("t.BASE_ID AS baseId, ") + .append("t.BASENAME AS baseName ") + .append("FROM (") + .append("SELECT day.DT, day.WT, day.STCD, wt.RSTCD, eng.ENNM, wt.STNM, eng.BASE_ID, hb.BASENAME ") + .append("FROM SD_WTRVDAY_S day ") + .append("INNER JOIN SD_WT_B_H wt ON wt.STCD = day.STCD ") + .append(" AND NVL(wt.IS_DELETED, 0) = 0 ") + .append(" AND wt.STTP = 'WTRV' ") + .append("LEFT JOIN SD_ENGINFO_B_H eng ON eng.STCD = wt.RSTCD AND NVL(eng.IS_DELETED, 0) = 0 ") + .append("LEFT JOIN SD_HYDROBASE hb ON hb.BASEID = eng.BASE_ID AND NVL(hb.IS_DELETED, 0) = 0 ") + .append("WHERE NVL(day.IS_DELETED, 0) = 0") + .append(") t WHERE 1 = 1 "); - if(StrUtil.isNotBlank(filterResult.get("default").getSelectSql())){ - sql.append(filterResult.get("default").getSelectSql()); - sql.append(" from "); - sql.append(" SD_WTRVDAY_S a inner join MS_STBPRP_T b on a.STCD=b.STCD and b.STTP_CODE='WTRV' "); - sql.append(" where 1=1 "); - if (ObjectUtil.isNotEmpty(filterResult.get(CommonConstant.DEFAULT))) { - if (StrUtil.isNotBlank(filterResult.get(CommonConstant.DEFAULT).getGroupSql())) { - sql.append(" and ").append(filterResult.get(CommonConstant.DEFAULT).getGroupSql()); - } + Map paramMap = new HashMap<>(); + String filterSql = buildAlongDayFilterCondition( + dataSourceRequest == null ? null : dataSourceRequest.getFilter(), + paramMap, + new int[]{0} + ); + if (StrUtil.isNotBlank(filterSql)) { + sql.append(" AND ").append(filterSql); + } + sql.append(buildAlongDayOrderBySql(dataSourceRequest == null ? null : dataSourceRequest.getSort())); - if (StrUtil.isNotBlank(filterResult.get(CommonConstant.DEFAULT).getOrderBySql())) { - sql.append(" ").append(filterResult.get(CommonConstant.DEFAULT).getOrderBySql()); - } - } - } - Map map = new HashMap(); - Iterator iterator = filterResult.keySet().iterator(); - while (iterator.hasNext()) { - String key = (String) iterator.next(); - map.putAll(filterResult.get(key).getParamMap()); - } - List< Map> resultList = this.dynamicSQLMapper.pageAllList(page, sql.toString(), map); + Page currentPage = loadOptions == null ? page : QgcQueryWrapperUtil.buildPage(loadOptions, loadOptions.getSkip(), loadOptions.getTake()); + List resultList = this.microservicDynamicSQLMapper.pageAllListWithResultType( + currentPage, + sql.toString(), + paramMap, + SdAlongDayDetailVO.class + ); dataSourceResult.setData(resultList); - dataSourceResult.setTotal(ObjectUtil.isNotEmpty(page) ? page.getTotal() : (long) resultList.size()); + dataSourceResult.setTotal(ObjectUtil.isNotEmpty(currentPage) ? currentPage.getTotal() : (long) resultList.size()); + dataSourceResult.setAggregates(new HashMap<>()); return dataSourceResult; } @@ -191,6 +209,169 @@ public class AlongDetailServiceImpl extends ServiceImpl paramMap, + int[] indexHolder) { + if (filter == null) { + return ""; + } + if (StrUtil.isNotBlank(filter.getField())) { + return buildAlongDayLeafCondition(filter, paramMap, indexHolder); + } + if (CollUtil.isEmpty(filter.getFilters())) { + return ""; + } + List conditions = new ArrayList<>(); + for (DataSourceRequest.FilterDescriptor child : filter.getFilters()) { + String childSql = buildAlongDayFilterCondition(child, paramMap, indexHolder); + if (StrUtil.isNotBlank(childSql)) { + conditions.add(childSql); + } + } + if (conditions.isEmpty()) { + return ""; + } + String logic = "or".equalsIgnoreCase(filter.getLogic()) ? " OR " : " AND "; + return "(" + String.join(logic, conditions) + ")"; + } + + private String buildAlongDayLeafCondition(DataSourceRequest.FilterDescriptor filter, + Map paramMap, + int[] indexHolder) { + String column = mapAlongDayColumn(filter.getField()); + if (StrUtil.isBlank(column) || filter.getValue() == null) { + return ""; + } + String operator = StrUtil.blankToDefault(filter.getOperator(), "eq").toLowerCase(); + boolean dateField = "tm".equalsIgnoreCase(filter.getField()) || "dt".equalsIgnoreCase(filter.getField()); + String key = "alongDayParam" + indexHolder[0]++; + switch (operator) { + case "eq": + paramMap.put(key, filter.getValue()); + return dateField + ? column + " = TO_DATE(SUBSTR(#{map." + key + "}, 1, 10), 'YYYY-MM-DD')" + : column + " = #{map." + key + "}"; + case "neq": + paramMap.put(key, filter.getValue()); + return dateField + ? column + " <> TO_DATE(SUBSTR(#{map." + key + "}, 1, 10), 'YYYY-MM-DD')" + : column + " <> #{map." + key + "}"; + case "gt": + paramMap.put(key, filter.getValue()); + return dateField + ? column + " > TO_DATE(SUBSTR(#{map." + key + "}, 1, 10), 'YYYY-MM-DD')" + : column + " > #{map." + key + "}"; + case "gte": + paramMap.put(key, filter.getValue()); + return dateField + ? column + " >= TO_DATE(SUBSTR(#{map." + key + "}, 1, 10), 'YYYY-MM-DD')" + : column + " >= #{map." + key + "}"; + case "lt": + paramMap.put(key, filter.getValue()); + return dateField + ? column + " < TO_DATE(SUBSTR(#{map." + key + "}, 1, 10), 'YYYY-MM-DD')" + : column + " < #{map." + key + "}"; + case "lte": + paramMap.put(key, filter.getValue()); + return dateField + ? column + " <= TO_DATE(SUBSTR(#{map." + key + "}, 1, 10), 'YYYY-MM-DD')" + : column + " <= #{map." + key + "}"; + case "contains": + paramMap.put(key, "%" + filter.getValue() + "%"); + return column + " LIKE #{map." + key + "}"; + case "in": { + List values = splitAlongDayFilterValues(filter.getValue()); + if (CollUtil.isEmpty(values)) { + return ""; + } + List placeholders = new ArrayList<>(); + for (String item : values) { + String itemKey = "alongDayParam" + indexHolder[0]++; + paramMap.put(itemKey, item); + placeholders.add(dateField + ? "TO_DATE(SUBSTR(#{map." + itemKey + "}, 1, 10), 'YYYY-MM-DD')" + : "#{map." + itemKey + "}"); + } + return column + " IN (" + String.join(", ", placeholders) + ")"; + } + default: + return ""; + } + } + + private String mapAlongDayColumn(String field) { + if (StrUtil.isBlank(field)) { + return null; + } + return switch (field) { + case "tm", "dt" -> "t.DT"; + case "stcd" -> "t.STCD"; + case "rstcd" -> "t.RSTCD"; + case "wt" -> "t.WT"; + case "stnm" -> "t.STNM"; + case "baseName", "basename" -> "t.BASENAME"; + case "baseId" -> "t.BASE_ID"; + case "ennm" -> "t.ENNM"; + default -> null; + }; + } + + private String buildAlongDayOrderBySql(List sortList) { + if (CollUtil.isEmpty(sortList)) { + return " ORDER BY t.DT DESC NULLS LAST, t.STCD ASC"; + } + List orderItems = new ArrayList<>(); + for (DataSourceRequest.SortDescriptor sortDescriptor : sortList) { + if (sortDescriptor == null || StrUtil.isBlank(sortDescriptor.getField())) { + continue; + } + String column = mapAlongDayColumn(sortDescriptor.getField()); + if (StrUtil.isBlank(column)) { + continue; + } + String dir = "desc".equalsIgnoreCase(sortDescriptor.getDir()) ? "DESC" : "ASC"; + orderItems.add(column + " " + dir + " NULLS LAST"); + } + return CollUtil.isEmpty(orderItems) ? " ORDER BY t.DT DESC NULLS LAST, t.STCD ASC" : " ORDER BY " + String.join(", ", orderItems); + } + + private List splitAlongDayFilterValues(Object value) { + if (value == null) { + return Collections.emptyList(); + } + if (value instanceof List listValue) { + List result = new ArrayList<>(); + for (Object item : listValue) { + if (item != null && StrUtil.isNotBlank(String.valueOf(item))) { + result.add(String.valueOf(item).trim()); + } + } + return result; + } + if (value instanceof Object[] arrayValue) { + List result = new ArrayList<>(); + for (Object item : arrayValue) { + if (item != null && StrUtil.isNotBlank(String.valueOf(item))) { + result.add(String.valueOf(item).trim()); + } + } + return result; + } + String text = String.valueOf(value).trim(); + if (StrUtil.isBlank(text)) { + return Collections.emptyList(); + } + text = text.replace("[", "").replace("]", "").replace("\"", "").replace("'", ""); + List result = new ArrayList<>(); + for (String item : text.split(",")) { + String trimmed = item == null ? null : item.trim(); + if (StrUtil.isNotBlank(trimmed) && !result.contains(trimmed)) { + result.add(trimmed); + } + } + return result; + } + @Override public DataSourceResult processQgcKendList(DataSourceResult dataSourceResult, WtrvInfo wtrvInfo) { DataSourceResult dr = new DataSourceResult(); From 849aeb80175251a42aed557bf698b3ae6a1b24ba Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E7=8E=8B=E5=85=B4=E5=87=AF?= <2448379534@qq.com> Date: Fri, 12 Jun 2026 16:59:35 +0800 Subject: [PATCH 32/34] =?UTF-8?q?=E5=9F=BA=E7=A1=80=E4=BF=A1=E6=81=AF?= =?UTF-8?q?=E9=85=8D=E7=BD=AE?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- frontend/src/api/mapModal/index.ts | 45 +- frontend/src/components/BasicTable/index.vue | 22 +- .../src/components/MapModal/column.config.ts | 706 ++++++++++- .../MapModal/components/BasicInfo.vue | 42 +- frontend/src/components/MapModal/index.vue | 504 +++++++- .../src/components/MapModal/setting.config.ts | 309 ++--- .../chuixiangshuiwenChangeMod/index.vue | 4 +- ...eixingzuchengjijieruqingkuangTwoLayers.vue | 2 +- .../guoyujiance/components/FPVDDetailMD.vue | 2 +- .../ModalPage/index.vue | 57 +- .../monthlyAverage.vue | 2 +- .../qixidibaohugongzuokaizhanQK/index.vue | 2 +- .../qixidiheduanjianceqingkuangEJ/index.vue | 9 +- frontend/src/modules/qixidijchuXx/index.vue | 2 +- .../TwoLayer/ModalYkzhbzdjcgz.vue | 416 +++++++ .../ShengTaiLiuLiangDaBQKTwoLayer.vue | 944 ++++++++++++++ .../src/modules/shengtaidabiaoMod/index.vue | 505 +++++--- .../modules/shengtaidabiaoTwoMod/index.vue | 710 +++++++---- .../TwoLayers/yaerAverage.vue | 2 +- .../TwoLayer/ShuiDianKaiFQKTwoLayer.vue | 2 +- .../shuiwenjiancegongzuoEJ.vue | 2 +- .../shuiwenjiancegongzuoEJ.vue | 1082 +++++++++-------- frontend/src/modules/waterQuality/index.vue | 2 +- .../yanchengshuiwenChangeMod/index.vue | 3 +- frontend/src/store/modules/model.ts | 34 +- .../views/home/shuiDianKaiFaZhuangKuang.vue | 36 +- 26 files changed, 4249 insertions(+), 1197 deletions(-) create mode 100644 frontend/src/modules/shengtaidabiaoMod/TwoLayer/ModalYkzhbzdjcgz.vue create mode 100644 frontend/src/modules/shengtaidabiaoMod/TwoLayer/ShengTaiLiuLiangDaBQKTwoLayer.vue diff --git a/frontend/src/api/mapModal/index.ts b/frontend/src/api/mapModal/index.ts index 01c0a468..cf829d84 100644 --- a/frontend/src/api/mapModal/index.ts +++ b/frontend/src/api/mapModal/index.ts @@ -22,6 +22,49 @@ export function getIdUrl(params: any) { params }); } +// 查询站点建设状态 +export function getBuildState(data: any) { + return request({ + url: '/api/dec-lygk-base-server/base/vmsstbprpt/GetKendoList', + method: 'post', + data: { + filter: data.filter, + select: ['bldsttCcode', 'engIwtCode', 'engDwtCode'] + } + }); +} +// 查询鱼类栖息地监测数据类型可用性 +export function getFishTab(stcd: string) { + return request({ + url: `/api/wmp-env-server/we/wer/getWeDefaultData`, + method: 'get', + params: { stcd } + }); +} +// 检查水质站是否启用 AI 预测功能 +export function checkAnalysisShow(data: any) { + return request({ + url: '/api/dec-lygk-base-server/base/vmsstbprpt/GetKendoList', + method: 'post', + data + }); +} +// 查询站点的关联子站点 (垂向水温、AI 识别) +export function getStInfoByStcd(params: any) { + return request({ + url: '/api/dec-lygk-base-server/base/msstbprpt/getStInfoByStcd', + method: 'get', + params + }); +} +// 检查电站是否有专题配置数据 +export function checkPowerStationTopic(data: any) { + return request({ + url: '/api/wmp-sys-server/sys/psbmodulelbb/GetKendoList', + method: 'post', + data + }); +} // 全景影像 export function getPanoramaList(data: any) { return request({ @@ -33,7 +76,7 @@ export function getPanoramaList(data: any) { // 实时视频 export function getVideoList(data: any) { return request({ - url: '/vd/vmsstbprpt/GetKendoList', + url: '/api/dec-lygk-base-server/base/msstbprpt/GetKendoList', method: 'post', data }); diff --git a/frontend/src/components/BasicTable/index.vue b/frontend/src/components/BasicTable/index.vue index 9e65d607..87cb3b1c 100644 --- a/frontend/src/components/BasicTable/index.vue +++ b/frontend/src/components/BasicTable/index.vue @@ -36,7 +36,6 @@ + + diff --git a/frontend/src/modules/shengtaidabiaoMod/TwoLayer/ShengTaiLiuLiangDaBQKTwoLayer.vue b/frontend/src/modules/shengtaidabiaoMod/TwoLayer/ShengTaiLiuLiangDaBQKTwoLayer.vue new file mode 100644 index 00000000..385787c7 --- /dev/null +++ b/frontend/src/modules/shengtaidabiaoMod/TwoLayer/ShengTaiLiuLiangDaBQKTwoLayer.vue @@ -0,0 +1,944 @@ + + + + + diff --git a/frontend/src/modules/shengtaidabiaoMod/index.vue b/frontend/src/modules/shengtaidabiaoMod/index.vue index bd7944ad..7cdf61dc 100644 --- a/frontend/src/modules/shengtaidabiaoMod/index.vue +++ b/frontend/src/modules/shengtaidabiaoMod/index.vue @@ -1,190 +1,403 @@ \ No newline at end of file + diff --git a/frontend/src/modules/shengtaidabiaoTwoMod/index.vue b/frontend/src/modules/shengtaidabiaoTwoMod/index.vue index e137d523..6477b27e 100644 --- a/frontend/src/modules/shengtaidabiaoTwoMod/index.vue +++ b/frontend/src/modules/shengtaidabiaoTwoMod/index.vue @@ -1,286 +1,526 @@ diff --git a/frontend/src/modules/shuiWenNianNeiFenBu/TwoLayers/yaerAverage.vue b/frontend/src/modules/shuiWenNianNeiFenBu/TwoLayers/yaerAverage.vue index 9a1adb39..d3836f4c 100644 --- a/frontend/src/modules/shuiWenNianNeiFenBu/TwoLayers/yaerAverage.vue +++ b/frontend/src/modules/shuiWenNianNeiFenBu/TwoLayers/yaerAverage.vue @@ -298,7 +298,7 @@ const handleExport = async () => {}; const handleViewDetail = (record: any) => { modelStore.modalVisible = true; modelStore.params.sttp = 'WT'; - modelStore.title = record.stnm + '详情信息'; + modelStore.title = record.stnm ; modelStore.params.stcd = record.stcd; }; diff --git a/frontend/src/modules/shuidianhuangjingjieruMod/TwoLayer/ShuiDianKaiFQKTwoLayer.vue b/frontend/src/modules/shuidianhuangjingjieruMod/TwoLayer/ShuiDianKaiFQKTwoLayer.vue index 974a3508..b432ef68 100644 --- a/frontend/src/modules/shuidianhuangjingjieruMod/TwoLayer/ShuiDianKaiFQKTwoLayer.vue +++ b/frontend/src/modules/shuidianhuangjingjieruMod/TwoLayer/ShuiDianKaiFQKTwoLayer.vue @@ -910,7 +910,7 @@ function handleRowClick(record: any) { stcd: record.stcd, titleName: record.stnm } as any // 临时类型断言,因为 store 定义不完整 - modelStore.title = record.stnm ? `${record.stnm} 详情信息` : '详情信息' + modelStore.title = record.stnm ? `${record.stnm} ` : '' modelStore.tabList = handleTabs(modelStore.params) modelStore.modalVisible = true diff --git a/frontend/src/modules/shuiwenjiancegongzuokaizhangqingkuang/shuiwenjiancegongzuoEJ.vue b/frontend/src/modules/shuiwenjiancegongzuokaizhangqingkuang/shuiwenjiancegongzuoEJ.vue index b736fad9..b1dc99f9 100644 --- a/frontend/src/modules/shuiwenjiancegongzuokaizhangqingkuang/shuiwenjiancegongzuoEJ.vue +++ b/frontend/src/modules/shuiwenjiancegongzuokaizhangqingkuang/shuiwenjiancegongzuoEJ.vue @@ -518,7 +518,7 @@ const handleViewDetail = (record: any) => { if (record) { modelStore.modalVisible = true; modelStore.params.sttp = "WT"; - modelStore.title = record.stnm + "详情信息"; + modelStore.title = record.stnm ; // modelStore.isBasicEdit = true; if (tabIndex.value == "27") { modelStore.params.enfc = "1"; diff --git a/frontend/src/modules/shuizhijiancegongzuoQK/shuiwenjiancegongzuoEJ.vue b/frontend/src/modules/shuizhijiancegongzuoQK/shuiwenjiancegongzuoEJ.vue index 9c790179..f33cefe9 100644 --- a/frontend/src/modules/shuizhijiancegongzuoQK/shuiwenjiancegongzuoEJ.vue +++ b/frontend/src/modules/shuizhijiancegongzuoQK/shuiwenjiancegongzuoEJ.vue @@ -1,636 +1,646 @@ diff --git a/frontend/src/modules/waterQuality/index.vue b/frontend/src/modules/waterQuality/index.vue index fd509a41..02a4141c 100644 --- a/frontend/src/modules/waterQuality/index.vue +++ b/frontend/src/modules/waterQuality/index.vue @@ -724,7 +724,7 @@ const handleDataPointClick = (params: any) => { if (stationData && stationData.stcd) { modelStore.modalVisible = true; modelStore.params.sttp = "WQFB"; - modelStore.title = stationData.stnm + "详情信息"; + modelStore.title = stationData.stnm ; // modelStore.isBasicEdit = true; modelStore.params.stcd = stationData.stcd; } diff --git a/frontend/src/modules/yanchengshuiwenChangeMod/index.vue b/frontend/src/modules/yanchengshuiwenChangeMod/index.vue index 4f74f749..d6d30b22 100644 --- a/frontend/src/modules/yanchengshuiwenChangeMod/index.vue +++ b/frontend/src/modules/yanchengshuiwenChangeMod/index.vue @@ -249,8 +249,7 @@ const initChart = () => { console.log('temperature:', params.data.value); modelStore.modalVisible = true; modelStore.params.sttp = "WT"; - modelStore.title = params.data.stnm + "详情信息"; - // modelStore.isBasicEdit = true; + modelStore.title = params.data.stnm; modelStore.params.stcd = params.data.stcd; modelStore.params.date = paramsOne.tm; } diff --git a/frontend/src/store/modules/model.ts b/frontend/src/store/modules/model.ts index 0ab7411f..bc51bc2c 100644 --- a/frontend/src/store/modules/model.ts +++ b/frontend/src/store/modules/model.ts @@ -10,6 +10,17 @@ export const useModelStore = defineStore('model', () => { const isBasicEdit = ref(false); const showStcdSelector = ref(false); // 是否显示下拉框 const stcdOptions = ref>([]); // 可选测站列表 + + // 新增:功能迁移所需的状态字段 + const baseId = ref(''); // 当前基地 ID + const hasPowerStatData = ref(false); // 电站是否有专题数据 + const isPowerStatPage = ref(false); // 是否在电站专题页面 + const verticalWaterStcd = ref(''); // 垂向水温子站点编码 + const aiSites = ref([]); // AI 识别站点列表 + const wtConfig = ref<{ ioWtrv?: boolean; hasRstcdWtvt?: boolean }>({}); // 水温配置 + const wqShow = ref(false); // 水质 AI 预测显示 + const fishTabInfo = ref(null); // 鱼类监测数据信息 + const params = ref<{ sttp: string; stcd: any; @@ -17,13 +28,23 @@ export const useModelStore = defineStore('model', () => { show: any; enfc:any; eqtp:any; + baseId?: string; // 新增:基地 ID + sttpCode?: string; // 新增:站点类型代码 + sttpMap?: string; // 新增:站点类型映射 + dtinType?: string; + bldstt: string; }>({ sttp: 'eng', stcd: '', date: '', show: true, enfc:'0', - eqtp:'' + eqtp:'', + baseId: '', + sttpCode: '', + sttpMap: '', + dtinType:'', + bldstt:'', }); const filterStll= ref('') return { @@ -36,5 +57,14 @@ export const useModelStore = defineStore('model', () => { showStcdSelector, // 新增 stcdOptions, // 新增 filterStll, + // 新增返回字段 + baseId, + hasPowerStatData, + isPowerStatPage, + verticalWaterStcd, + aiSites, + wtConfig, + wqShow, + fishTabInfo, }; -}); +}); \ No newline at end of file diff --git a/frontend/src/views/home/shuiDianKaiFaZhuangKuang.vue b/frontend/src/views/home/shuiDianKaiFaZhuangKuang.vue index c688b1f9..18222986 100644 --- a/frontend/src/views/home/shuiDianKaiFaZhuangKuang.vue +++ b/frontend/src/views/home/shuiDianKaiFaZhuangKuang.vue @@ -28,110 +28,110 @@ onMounted(() => { const showMapModal = () => { modelStore.modalVisible = true; modelStore.params.sttp = "ENG"; - modelStore.title = "三峡 详情信息"; + modelStore.title = "三峡 "; modelStore.isBasicEdit = true; }; const showMapModal1 = () => { modelStore.modalVisible = true; modelStore.params.sttp = "WT"; - modelStore.title = "水温 详情信息"; + modelStore.title = "水温 "; modelStore.isBasicEdit = true; }; const showMapModal2 = () => { modelStore.modalVisible = true; modelStore.params.sttp = "WQFB"; - modelStore.title = "水质 详情信息"; + modelStore.title = "水质 "; modelStore.isBasicEdit = true; }; const showMapModal3 = () => { modelStore.modalVisible = true; modelStore.params.sttp = "FH"; - modelStore.title = "栖息地 详情信息"; + modelStore.title = "栖息地 "; modelStore.isBasicEdit = true; };// const showMapModal4 = () => { modelStore.modalVisible = true; modelStore.params.sttp = "fh_zq_point"; - modelStore.title = "栖息地流量 详情信息"; + modelStore.title = "栖息地流量 "; modelStore.isBasicEdit = true; }; const showMapModal5 = () => { modelStore.modalVisible = true; modelStore.params.sttp = "fp_point"; - modelStore.title = "过鱼设施 详情信息"; + modelStore.title = "过鱼设施 "; modelStore.isBasicEdit = true; }; const showMapModal6 = () => { modelStore.modalVisible = true; modelStore.params.sttp = "FB"; - modelStore.title = "鱼类增殖站 详情信息"; + modelStore.title = "鱼类增殖站 "; modelStore.isBasicEdit = true; }; // const showMapModal7 = () => { modelStore.modalVisible = true; modelStore.params.sttp = "VA"; - modelStore.title = "动物救助站 详情信息"; + modelStore.title = "动物救助站 "; modelStore.isBasicEdit = true; }; const showMapModal8 = () => { modelStore.modalVisible = true; modelStore.params.sttp = "VP"; - modelStore.title = "珍稀植物园 详情信息"; + modelStore.title = "珍稀植物园 "; modelStore.isBasicEdit = true; }; const showMapModal9 = () => { modelStore.modalVisible = true; modelStore.params.sttp = "WE"; - modelStore.title = "水生生态调查断面 详情信息"; + modelStore.title = "水生生态调查断面 "; modelStore.isBasicEdit = true; }; const showMapModal10 = () => { modelStore.modalVisible = true; modelStore.params.sttp = "WVA"; - modelStore.title = "野生动物监测 详情信息"; + modelStore.title = "野生动物监测 "; modelStore.isBasicEdit = true; }; const showMapModal11 = () => { modelStore.modalVisible = true; modelStore.params.sttp = "VD_FBFM"; - modelStore.title = "AI视频监控站 详情信息"; + modelStore.title = "AI视频监控站 "; modelStore.isBasicEdit = true; }; const showMapModal12 = () => { modelStore.modalVisible = true; modelStore.params.sttp = "eng_alarm_point"; - modelStore.title = "水电站告警情况 详情信息"; + modelStore.title = "水电站告警情况 "; modelStore.isBasicEdit = true; }; const showMapModal13 = () => { modelStore.modalVisible = true; modelStore.params.sttp = "FPRD"; - modelStore.title = "鱼类调查装置 详情信息"; + modelStore.title = "鱼类调查装置 "; modelStore.isBasicEdit = true; }; const showMapModal14 = () => { modelStore.modalVisible = true; modelStore.params.sttp = "DW_2"; - modelStore.title = "低温水减缓设施-叠梁门 详情信息"; + modelStore.title = "低温水减缓设施-叠梁门 "; modelStore.isBasicEdit = true; }; const showMapModal15 = () => { modelStore.modalVisible = true; modelStore.params.sttp = "DW_5"; - modelStore.title = "前置挡墙 详情信息"; + modelStore.title = "前置挡墙 "; modelStore.isBasicEdit = true; }; const showMapModal16 = () => { modelStore.modalVisible = true; modelStore.params.sttp = "DW_6"; - modelStore.title = "隔水幕墙 详情信息"; + modelStore.title = "隔水幕墙 "; modelStore.isBasicEdit = true; }; const showMapModal17 = () => { modelStore.modalVisible = true; modelStore.params.sttp = "DW_1"; - modelStore.title = "夹岩双层取水 详情信息"; + modelStore.title = "夹岩双层取水 "; modelStore.isBasicEdit = true; }; //DW_5 From afc6935822e17bb75e07ea644aaafa94f6fdd4a3 Mon Sep 17 00:00:00 2001 From: tangwei Date: Fri, 12 Jun 2026 17:12:30 +0800 Subject: [PATCH 33/34] =?UTF-8?q?feat:=20=E8=A1=A8=E5=B1=82=E6=B0=B4?= =?UTF-8?q?=E6=B8=A9=E5=B0=8F=E6=97=B6=E6=95=B0=E6=8D=AE=E4=BF=AE=E6=94=B9?= =?UTF-8?q?=E5=88=A0=E9=99=A4?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../wt/entity/vo/SdAlongDrtpDetailVO.java | 43 ++++ .../service/impl/AlongDetailServiceImpl.java | 203 +++++++++++++++--- 2 files changed, 222 insertions(+), 24 deletions(-) create mode 100644 backend/src/main/java/com/yfd/platform/qgc_env/wt/entity/vo/SdAlongDrtpDetailVO.java diff --git a/backend/src/main/java/com/yfd/platform/qgc_env/wt/entity/vo/SdAlongDrtpDetailVO.java b/backend/src/main/java/com/yfd/platform/qgc_env/wt/entity/vo/SdAlongDrtpDetailVO.java new file mode 100644 index 00000000..01aa63e8 --- /dev/null +++ b/backend/src/main/java/com/yfd/platform/qgc_env/wt/entity/vo/SdAlongDrtpDetailVO.java @@ -0,0 +1,43 @@ +package com.yfd.platform.qgc_env.wt.entity.vo; + +import io.swagger.v3.oas.annotations.media.Schema; +import lombok.Data; + +import java.math.BigDecimal; + +@Data +@Schema(description = "出库水温周旬月季年数据") +public class SdAlongDrtpDetailVO { + @Schema(description = "编码") + private String stcd; + + @Schema(description = "站点名称") + private String stnm; + + @Schema(description = "电站编码") + private String rstcd; + + @Schema(description = "电站名称") + private String ennm; + + @Schema(description = "基地编码") + private String baseId; + + @Schema(description = "基地名称") + private String baseName; + + @Schema(description = "温度") + private BigDecimal wt; + + @Schema(description = "月") + private Integer month; + + @Schema(description = "年") + private Integer year; + + @Schema(description = "维度类型") + private String drtp; + + @Schema(description = "时段类型") + private Integer dr; +} diff --git a/backend/src/main/java/com/yfd/platform/qgc_env/wt/service/impl/AlongDetailServiceImpl.java b/backend/src/main/java/com/yfd/platform/qgc_env/wt/service/impl/AlongDetailServiceImpl.java index 5e50ab86..6e8c530c 100644 --- a/backend/src/main/java/com/yfd/platform/qgc_env/wt/service/impl/AlongDetailServiceImpl.java +++ b/backend/src/main/java/com/yfd/platform/qgc_env/wt/service/impl/AlongDetailServiceImpl.java @@ -13,6 +13,7 @@ import com.yfd.platform.qgc_env.wt.mapper.SdWtrvdrtpSMapper; import com.yfd.platform.qgc_env.wt.service.AlongDetailService; import com.yfd.platform.qgc_env.wt.entity.vo.SdAlongDetailVO; import com.yfd.platform.qgc_env.wt.entity.vo.SdAlongDayDetailVO; +import com.yfd.platform.qgc_env.wt.entity.vo.SdAlongDrtpDetailVO; import com.yfd.platform.qgc_env.wt.entity.vo.WtrvInfo; import com.yfd.platform.qgc_base.entity.vo.BatchDeleteAo; import com.yfd.platform.qgc_base.entity.vo.DataParam; @@ -179,33 +180,54 @@ public class AlongDetailServiceImpl extends ServiceImpl filterResult, Page page, String groupBy) { - DataSourceResult dataSourceResult = new DataSourceResult(); - StringBuilder sql = new StringBuilder(); - if(StrUtil.isNotBlank(filterResult.get(CommonConstant.DEFAULT).getSelectSql())){ - sql.append(filterResult.get(CommonConstant.DEFAULT).getSelectSql()); - sql.append(" from "); - sql.append(" SD_WTRVDRTP_S a inner join MS_STBPRP_T b on a.STCD=b.STCD and b.STTP_CODE='WTRV' "); - sql.append(" where 1=1 "); - if (ObjectUtil.isNotEmpty(filterResult.get(CommonConstant.DEFAULT))) { - if (StrUtil.isNotBlank(filterResult.get(CommonConstant.DEFAULT).getGroupSql())) { - sql.append(" and ").append(filterResult.get(CommonConstant.DEFAULT).getGroupSql()); - } + DataSourceResult dataSourceResult = new DataSourceResult<>(); + DataSourceLoadOptionsBase loadOptions = dataSourceRequest == null ? null : dataSourceRequest.toDevRequest(); + StringBuilder sql = new StringBuilder() + .append("SELECT ") + .append("t.STCD AS stcd, ") + .append("t.STNM AS stnm, ") + .append("t.RSTCD AS rstcd, ") + .append("t.ENNM AS ennm, ") + .append("t.BASE_ID AS baseId, ") + .append("t.BASENAME AS baseName, ") + .append("t.WT AS wt, ") + .append("t.MONTH AS month, ") + .append("t.YEAR AS year, ") + .append("t.DRTP AS drtp, ") + .append("t.DR AS dr ") + .append("FROM (") + .append("SELECT drtp.STCD, wt.STNM, wt.RSTCD, eng.ENNM, eng.BASE_ID, hb.BASENAME, ") + .append("drtp.WT, drtp.MONTH, drtp.YEAR, drtp.DRTP, drtp.DR, drtp.TM ") + .append("FROM SD_WTRVDRTP_S drtp ") + .append("INNER JOIN SD_WT_B_H wt ON wt.STCD = drtp.STCD ") + .append(" AND NVL(wt.IS_DELETED, 0) = 0 ") + .append(" AND wt.STTP = 'WTRV' ") + .append("LEFT JOIN SD_ENGINFO_B_H eng ON eng.STCD = wt.RSTCD AND NVL(eng.IS_DELETED, 0) = 0 ") + .append("LEFT JOIN SD_HYDROBASE hb ON hb.BASEID = eng.BASE_ID AND NVL(hb.IS_DELETED, 0) = 0 ") + .append("WHERE NVL(drtp.IS_DELETED, 0) = 0") + .append(") t WHERE 1 = 1 "); - if (StrUtil.isNotBlank(filterResult.get(CommonConstant.DEFAULT).getOrderBySql())) { - sql.append(" ").append(filterResult.get(CommonConstant.DEFAULT).getOrderBySql()); - } - } + Map paramMap = new HashMap<>(); + String filterSql = buildAlongDrtpFilterCondition( + dataSourceRequest == null ? null : dataSourceRequest.getFilter(), + paramMap, + new int[]{0} + ); + if (StrUtil.isNotBlank(filterSql)) { + sql.append(" AND ").append(filterSql); } - Map map = new HashMap(); - Iterator iterator = filterResult.keySet().iterator(); + sql.append(buildAlongDrtpOrderBySql(dataSourceRequest == null ? null : dataSourceRequest.getSort())); - while (iterator.hasNext()) { - String key = (String) iterator.next(); - map.putAll(filterResult.get(key).getParamMap()); - } - List> resultList = this.dynamicSQLMapper.pageAllList(page, sql.toString(), map); + Page currentPage = loadOptions == null ? page : QgcQueryWrapperUtil.buildPage(loadOptions, loadOptions.getSkip(), loadOptions.getTake()); + List resultList = this.microservicDynamicSQLMapper.pageAllListWithResultType( + currentPage, + sql.toString(), + paramMap, + SdAlongDrtpDetailVO.class + ); dataSourceResult.setData(resultList); - dataSourceResult.setTotal(ObjectUtil.isNotEmpty(page) ? page.getTotal() : (long) resultList.size()); + dataSourceResult.setTotal(ObjectUtil.isNotEmpty(currentPage) ? currentPage.getTotal() : (long) resultList.size()); + dataSourceResult.setAggregates(new HashMap<>()); return dataSourceResult; } @@ -372,6 +394,138 @@ public class AlongDetailServiceImpl extends ServiceImpl paramMap, + int[] indexHolder) { + if (filter == null) { + return ""; + } + if (StrUtil.isNotBlank(filter.getField())) { + return buildAlongDrtpLeafCondition(filter, paramMap, indexHolder); + } + if (CollUtil.isEmpty(filter.getFilters())) { + return ""; + } + List conditions = new ArrayList<>(); + for (DataSourceRequest.FilterDescriptor child : filter.getFilters()) { + String childSql = buildAlongDrtpFilterCondition(child, paramMap, indexHolder); + if (StrUtil.isNotBlank(childSql)) { + conditions.add(childSql); + } + } + if (conditions.isEmpty()) { + return ""; + } + String logic = "or".equalsIgnoreCase(filter.getLogic()) ? " OR " : " AND "; + return "(" + String.join(logic, conditions) + ")"; + } + + private String buildAlongDrtpLeafCondition(DataSourceRequest.FilterDescriptor filter, + Map paramMap, + int[] indexHolder) { + String column = mapAlongDrtpColumn(filter.getField()); + if (StrUtil.isBlank(column) || filter.getValue() == null) { + return ""; + } + String operator = StrUtil.blankToDefault(filter.getOperator(), "eq").toLowerCase(); + boolean dateField = "tm".equalsIgnoreCase(filter.getField()) || "dt".equalsIgnoreCase(filter.getField()); + String key = "alongDrtpParam" + indexHolder[0]++; + switch (operator) { + case "eq": + paramMap.put(key, filter.getValue()); + return dateField + ? column + " = TO_DATE(SUBSTR(#{map." + key + "}, 1, 10), 'YYYY-MM-DD')" + : column + " = #{map." + key + "}"; + case "neq": + paramMap.put(key, filter.getValue()); + return dateField + ? column + " <> TO_DATE(SUBSTR(#{map." + key + "}, 1, 10), 'YYYY-MM-DD')" + : column + " <> #{map." + key + "}"; + case "gt": + paramMap.put(key, filter.getValue()); + return dateField + ? column + " > TO_DATE(SUBSTR(#{map." + key + "}, 1, 10), 'YYYY-MM-DD')" + : column + " > #{map." + key + "}"; + case "gte": + paramMap.put(key, filter.getValue()); + return dateField + ? column + " >= TO_DATE(SUBSTR(#{map." + key + "}, 1, 10), 'YYYY-MM-DD')" + : column + " >= #{map." + key + "}"; + case "lt": + paramMap.put(key, filter.getValue()); + return dateField + ? column + " < TO_DATE(SUBSTR(#{map." + key + "}, 1, 10), 'YYYY-MM-DD')" + : column + " < #{map." + key + "}"; + case "lte": + paramMap.put(key, filter.getValue()); + return dateField + ? column + " <= TO_DATE(SUBSTR(#{map." + key + "}, 1, 10), 'YYYY-MM-DD')" + : column + " <= #{map." + key + "}"; + case "contains": + paramMap.put(key, "%" + filter.getValue() + "%"); + return column + " LIKE #{map." + key + "}"; + case "in": { + List values = splitAlongDayFilterValues(filter.getValue()); + if (CollUtil.isEmpty(values)) { + return ""; + } + List placeholders = new ArrayList<>(); + for (String item : values) { + String itemKey = "alongDrtpParam" + indexHolder[0]++; + paramMap.put(itemKey, item); + placeholders.add(dateField + ? "TO_DATE(SUBSTR(#{map." + itemKey + "}, 1, 10), 'YYYY-MM-DD')" + : "#{map." + itemKey + "}"); + } + return column + " IN (" + String.join(", ", placeholders) + ")"; + } + default: + return ""; + } + } + + private String mapAlongDrtpColumn(String field) { + if (StrUtil.isBlank(field)) { + return null; + } + return switch (field) { + case "tm", "dt" -> "t.TM"; + case "stcd" -> "t.STCD"; + case "rstcd" -> "t.RSTCD"; + case "wt" -> "t.WT"; + case "stnm" -> "t.STNM"; + case "baseName", "basename" -> "t.BASENAME"; + case "baseId" -> "t.BASE_ID"; + case "ennm" -> "t.ENNM"; + case "month" -> "t.MONTH"; + case "year" -> "t.YEAR"; + case "drtp" -> "t.DRTP"; + case "dr" -> "t.DR"; + default -> null; + }; + } + + private String buildAlongDrtpOrderBySql(List sortList) { + if (CollUtil.isEmpty(sortList)) { + return " ORDER BY t.YEAR DESC NULLS LAST, t.MONTH DESC NULLS LAST, t.DRTP ASC NULLS LAST, t.DR ASC NULLS LAST, t.STCD ASC"; + } + List orderItems = new ArrayList<>(); + for (DataSourceRequest.SortDescriptor sortDescriptor : sortList) { + if (sortDescriptor == null || StrUtil.isBlank(sortDescriptor.getField())) { + continue; + } + String column = mapAlongDrtpColumn(sortDescriptor.getField()); + if (StrUtil.isBlank(column)) { + continue; + } + String dir = "desc".equalsIgnoreCase(sortDescriptor.getDir()) ? "DESC" : "ASC"; + orderItems.add(column + " " + dir + " NULLS LAST"); + } + return CollUtil.isEmpty(orderItems) + ? " ORDER BY t.YEAR DESC NULLS LAST, t.MONTH DESC NULLS LAST, t.DRTP ASC NULLS LAST, t.DR ASC NULLS LAST, t.STCD ASC" + : " ORDER BY " + String.join(", ", orderItems); + } + @Override public DataSourceResult processQgcKendList(DataSourceResult dataSourceResult, WtrvInfo wtrvInfo) { DataSourceResult dr = new DataSourceResult(); @@ -662,7 +816,8 @@ public class AlongDetailServiceImpl extends ServiceImpl dateRangeMap = new HashMap<>(); From 90a074ff93bfcd9075b7d8b0b9e3505a936cca6d Mon Sep 17 00:00:00 2001 From: tangwei Date: Fri, 12 Jun 2026 17:37:09 +0800 Subject: [PATCH 34/34] =?UTF-8?q?feat:=20=E4=BF=AE=E6=94=B9=E6=B0=B4?= =?UTF-8?q?=E8=B4=A8=E5=B0=8F=E6=97=B6=E6=95=B0=E6=8D=AE&=E5=88=A0?= =?UTF-8?q?=E9=99=A4=E6=B0=B4=E8=B4=A8=E5=B0=8F=E6=97=B6/=E6=97=A5/?= =?UTF-8?q?=E6=9C=88=E6=95=B0=E6=8D=AE?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../wq/controller/EnvWqDataController.java | 17 + .../qgc_env/wq/service/EnvWqDataService.java | 7 + .../wq/service/impl/EnvWqDataServiceImpl.java | 523 ++++++++++++++++++ 3 files changed, 547 insertions(+) diff --git a/backend/src/main/java/com/yfd/platform/qgc_env/wq/controller/EnvWqDataController.java b/backend/src/main/java/com/yfd/platform/qgc_env/wq/controller/EnvWqDataController.java index 682a1104..6d0a35b7 100644 --- a/backend/src/main/java/com/yfd/platform/qgc_env/wq/controller/EnvWqDataController.java +++ b/backend/src/main/java/com/yfd/platform/qgc_env/wq/controller/EnvWqDataController.java @@ -2,6 +2,7 @@ package com.yfd.platform.qgc_env.wq.controller; import com.yfd.platform.common.DataSourceRequest; import com.yfd.platform.config.ResponseResult; +import com.yfd.platform.qgc_base.entity.vo.BatchDeleteAo; import com.yfd.platform.qgc_env.wq.service.EnvWqDataService; import io.swagger.v3.oas.annotations.Operation; import io.swagger.v3.oas.annotations.tags.Tag; @@ -14,6 +15,8 @@ import org.springframework.web.bind.annotation.RequestParam; import org.springframework.web.bind.annotation.RequestMapping; import org.springframework.web.bind.annotation.RestController; +import java.util.Map; + @RestController @RequestMapping("/wq") @Tag(name = "水质统计分析") @@ -54,6 +57,20 @@ public class EnvWqDataController { return ResponseResult.successData(envWqDataService.getDrtpKendoListCust(dataSourceRequest)); } + @PostMapping("/updateWqRsData") + @Operation(summary = "修改水质小时数据") + public ResponseResult updateWqRsData(@RequestBody Map updateData) { + envWqDataService.updateWqRsData(updateData); + return ResponseResult.success(); + } + + @PostMapping("/removeKendoByIds") + @Operation(summary = "删除水质小时/日/月数据") + public ResponseResult removeKendoByIds(@RequestBody BatchDeleteAo batchDeleteAo) { + envWqDataService.removeKendoByIds(batchDeleteAo); + return ResponseResult.success(); + } + @PostMapping("/GetStbprpYsByStcd") @Operation(summary = "水质监测数据查询") public ResponseResult GetStbprpYsByStcd(@RequestBody DataSourceRequest dataSourceRequest) { diff --git a/backend/src/main/java/com/yfd/platform/qgc_env/wq/service/EnvWqDataService.java b/backend/src/main/java/com/yfd/platform/qgc_env/wq/service/EnvWqDataService.java index fba7baa5..f23a3931 100644 --- a/backend/src/main/java/com/yfd/platform/qgc_env/wq/service/EnvWqDataService.java +++ b/backend/src/main/java/com/yfd/platform/qgc_env/wq/service/EnvWqDataService.java @@ -2,8 +2,11 @@ package com.yfd.platform.qgc_env.wq.service; 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.wq.entity.vo.WqBaseInfoVo; +import java.util.Map; + public interface EnvWqDataService { DataSourceResult processKendoList(DataSourceRequest dataSourceRequest); @@ -35,4 +38,8 @@ public interface EnvWqDataService { DataSourceResult getStTbYsBVoKendoListCust(String stcd, String tbCode, String startTime, String endTime); DataSourceResult getStTbYsBVoKendoListCust(DataSourceRequest dataSourceRequest); + + boolean updateWqRsData(Map updateData); + + boolean removeKendoByIds(BatchDeleteAo batchDeleteAo); } 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 942d42a6..c984ae0c 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 @@ -13,6 +13,8 @@ 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_base.entity.vo.BatchDeleteAo; +import com.yfd.platform.qgc_base.entity.vo.DataParam; import com.yfd.platform.qgc_env.wq.entity.vo.*; import com.yfd.platform.qgc_env.wq.service.EnvWqDataService; import com.yfd.platform.qgc_env.wt.entity.vo.WbsbVo; @@ -22,13 +24,17 @@ import com.yfd.platform.utils.RequestHolder; import com.yfd.platform.utils.SecurityUtils; import jakarta.annotation.Resource; import org.springframework.stereotype.Service; +import org.springframework.transaction.annotation.Transactional; +import org.springframework.jdbc.core.JdbcTemplate; import java.math.BigDecimal; import java.util.ArrayList; import java.util.Arrays; +import java.util.Calendar; import java.util.Comparator; import java.util.Date; import java.util.HashMap; +import java.util.HashSet; import java.util.LinkedHashMap; import java.util.List; import java.util.Map; @@ -41,6 +47,9 @@ public class EnvWqDataServiceImpl implements EnvWqDataService { @Resource private MicroservicDynamicSQLMapper microservicDynamicSQLMapper; + @Resource + private JdbcTemplate jdbcTemplate; + @Override public DataSourceResult processKendoList(DataSourceRequest dataSourceRequest) { boolean calculated = CommonConstant.CALCULATE_SUCCESS.equals( @@ -3637,4 +3646,518 @@ public class EnvWqDataServiceImpl implements EnvWqDataService { } return " ORDER BY " + String.join(", ", orders); } + + @Override + @Transactional(rollbackFor = Exception.class) + public boolean updateWqRsData(Map updateData) { + if (updateData == null || updateData.isEmpty()) { + return true; + } + updateWqHourData(updateData); + updateWqTargetIfNeeded(updateData); + + String stcd = asString(updateData.get("stcd")); + String tm = asString(updateData.get("tm")); + if (StrUtil.isNotBlank(stcd) && StrUtil.isNotBlank(tm) && tm.length() >= 10) { + String dateStr = tm.substring(0, 10); + statisticsDayDataFromHour(stcd, dateStr, dateStr); + + String[] ym = dateStr.substring(0, 7).split("-"); + if (ym.length == 2) { + Integer year = Integer.parseInt(ym[0]); + Integer month = Integer.parseInt(ym[1]); + String startDate = year + "-" + String.format("%02d", month) + "-01"; + String endDate = getMonthEndDate(year, month); + statisticsMonthDataFromDay(stcd, startDate, endDate); + } + } + return true; + } + + @Override + @Transactional(rollbackFor = Exception.class) + public boolean removeKendoByIds(BatchDeleteAo batchDeleteAo) { + List dataList = batchDeleteAo == null ? null : batchDeleteAo.getDataList(); + if (CollUtil.isEmpty(dataList)) { + return true; + } + String dataType = StrUtil.blankToDefault(batchDeleteAo.getDataType(), "").toUpperCase(); + int batchSize = 500; + for (int i = 0; i < dataList.size(); i += batchSize) { + List subList = dataList.subList(i, Math.min(i + batchSize, dataList.size())); + if ("MON".equals(dataType)) { + softDeleteWqMonthData(subList); + } + if ("DATE".equals(dataType)) { + softDeleteWqDayData(subList); + } + if ("TIME".equals(dataType)) { + deleteWqHourData(subList); + + Map dateRangeMap = new HashMap<>(); + Map monthRangeMap = new HashMap<>(); + for (DataParam param : subList) { + String stcd = param == null ? null : param.getId(); + String tm = param == null ? null : param.getTm(); + if (StrUtil.isBlank(stcd) || StrUtil.isBlank(tm) || tm.length() < 10) { + continue; + } + String dateStr = tm.substring(0, 10); + dateRangeMap.compute(stcd, (key, range) -> { + if (range == null) { + return new String[]{dateStr, dateStr}; + } + if (dateStr.compareTo(range[0]) < 0) { + range[0] = dateStr; + } + if (dateStr.compareTo(range[1]) > 0) { + range[1] = dateStr; + } + return range; + }); + + String[] ym = tm.substring(0, 7).split("-"); + if (ym.length == 2) { + Integer year = Integer.parseInt(ym[0]); + Integer month = Integer.parseInt(ym[1]); + String monthStart = year + "-" + String.format("%02d", month) + "-01"; + String monthEnd = getMonthEndDate(year, month); + monthRangeMap.putIfAbsent(stcd + "_" + year + "_" + month, + new String[]{stcd, monthStart, monthEnd}); + } + } + + for (Map.Entry entry : dateRangeMap.entrySet()) { + statisticsDayDataFromHour(entry.getKey(), entry.getValue()[0], entry.getValue()[1]); + } + Set processedMonths = new HashSet<>(); + for (String[] values : monthRangeMap.values()) { + String monthKey = values[0] + "_" + values[1]; + if (processedMonths.add(monthKey)) { + statisticsMonthDataFromDay(values[0], values[1], values[2]); + } + } + } + } + return true; + } + + private void updateWqHourData(Map updateData) { + LinkedHashMap columnMap = new LinkedHashMap<>(); + columnMap.put("wtmp", "WTMP"); + columnMap.put("ph", "PH"); + columnMap.put("dox", "DOX"); + columnMap.put("codmn", "CODMN"); + columnMap.put("codcr", "CODCR"); + columnMap.put("bod5", "BOD5"); + columnMap.put("nh3n", "NH3N"); + columnMap.put("tp", "TP"); + columnMap.put("tn", "TN"); + columnMap.put("cu", "CU"); + columnMap.put("zn", "ZN"); + columnMap.put("f", "F"); + columnMap.put("se", "SE"); + columnMap.put("ars", "ARS"); + columnMap.put("hg", "HG"); + columnMap.put("cd", "CD"); + columnMap.put("cr6", "CR6"); + columnMap.put("pb", "PB"); + columnMap.put("cn", "CN"); + columnMap.put("vlph", "VLPH"); + columnMap.put("oil", "OIL"); + columnMap.put("las", "LAS"); + columnMap.put("s2", "S2"); + columnMap.put("fcg", "FCG"); + columnMap.put("cl", "CL"); + columnMap.put("so4", "SO4"); + columnMap.put("no3", "NO3"); + columnMap.put("thrd", "THRD"); + columnMap.put("cond", "COND"); + columnMap.put("fe", "FE"); + columnMap.put("mn", "MN"); + columnMap.put("al", "AL"); + columnMap.put("chla", "CHLA"); + columnMap.put("clarity", "CLARITY"); + columnMap.put("tu", "TU"); + columnMap.put("cyano", "CYANO"); + columnMap.put("wqgrd", "WQGRD"); + columnMap.put("sfdb", "SFDB"); + columnMap.put("wqSfdbhnYs", "WQ_SFDBHN_YS"); + + List setClauses = new ArrayList<>(); + List params = new ArrayList<>(); + for (Map.Entry entry : columnMap.entrySet()) { + if (updateData.containsKey(entry.getKey())) { + setClauses.add(entry.getValue() + " = ?"); + params.add(updateData.get(entry.getKey())); + } + } + if (setClauses.isEmpty()) { + return; + } + + String stcd = asString(updateData.get("stcd")); + String tm = asString(updateData.get("tm")); + if (StrUtil.isBlank(stcd) || StrUtil.isBlank(tm)) { + throw new BizException("站点编码和时间不能为空"); + } + + String sql = "UPDATE SD_WQ_R SET " + String.join(", ", setClauses) + + " WHERE STCD = ? AND TM = TO_DATE(?, 'YYYY-MM-DD HH24:MI:SS')"; + params.add(stcd); + params.add(tm); + jdbcTemplate.update(sql, params.toArray()); + } + + private void updateWqTargetIfNeeded(Map updateData) { + if (!updateData.containsKey("wwqtg")) { + return; + } + String stcd = asString(updateData.get("stcd")); + if (StrUtil.isBlank(stcd)) { + return; + } + jdbcTemplate.update( + "UPDATE SD_WQ_B_H SET WWQTG = ?, MODIFY_USER = ?, MODIFY_TIME = SYSDATE " + + "WHERE STCD = ? AND NVL(IS_DELETED, 0) = 0", + updateData.get("wwqtg"), + SecurityUtils.getUserId(), + stcd + ); + } + + private void softDeleteWqMonthData(List dataParamList) { + if (CollUtil.isEmpty(dataParamList)) { + return; + } + StringBuilder sql = new StringBuilder("MERGE INTO SD_WQDRTP_S target USING ("); + List params = new ArrayList<>(); + for (int i = 0; i < dataParamList.size(); i++) { + if (i > 0) { + sql.append(" UNION ALL "); + } + sql.append("SELECT ? AS STCD, ? AS DRTP, ? AS YEAR, ? AS MONTH FROM DUAL"); + DataParam item = dataParamList.get(i); + params.add(item == null ? null : item.getId()); + params.add(item == null ? null : item.getDrtp()); + params.add(item == null ? null : item.getYear()); + params.add(item == null ? null : item.getMonth()); + } + sql.append(") source ON (target.STCD = source.STCD AND target.DRTP = source.DRTP ") + .append("AND target.YEAR = source.YEAR AND target.MONTH = source.MONTH) ") + .append("WHEN MATCHED THEN UPDATE SET target.IS_DELETED = 1, target.DELETE_TIME = SYSDATE"); + jdbcTemplate.update(sql.toString(), params.toArray()); + } + + private void softDeleteWqDayData(List dataParamList) { + if (CollUtil.isEmpty(dataParamList)) { + return; + } + StringBuilder sql = new StringBuilder("MERGE INTO SD_WQDAY_S target USING ("); + List params = new ArrayList<>(); + for (int i = 0; i < dataParamList.size(); i++) { + if (i > 0) { + sql.append(" UNION ALL "); + } + sql.append("SELECT ? AS STCD, TO_DATE(?, 'YYYY-MM-DD HH24:MI:SS') AS DT FROM DUAL"); + DataParam item = dataParamList.get(i); + params.add(item == null ? null : item.getId()); + params.add(item == null ? null : item.getDt()); + } + sql.append(") source ON (target.STCD = source.STCD AND target.DT = source.DT) ") + .append("WHEN MATCHED THEN UPDATE SET target.IS_DELETED = 1, target.DELETE_TIME = SYSDATE"); + jdbcTemplate.update(sql.toString(), params.toArray()); + } + + private void deleteWqHourData(List dataParamList) { + if (CollUtil.isEmpty(dataParamList)) { + return; + } + StringBuilder sql = new StringBuilder("DELETE FROM SD_WQ_R WHERE "); + List params = new ArrayList<>(); + for (int i = 0; i < dataParamList.size(); i++) { + if (i > 0) { + sql.append(" OR "); + } + sql.append("(STCD = ? AND TM = TO_DATE(?, 'YYYY-MM-DD HH24:MI:SS'))"); + DataParam item = dataParamList.get(i); + params.add(item == null ? null : item.getId()); + params.add(item == null ? null : item.getTm()); + } + jdbcTemplate.update(sql.toString(), params.toArray()); + } + + private String getMonthEndDate(Integer year, Integer month) { + Calendar calendar = Calendar.getInstance(); + calendar.set(year, month - 1, 1); + int lastDay = calendar.getActualMaximum(Calendar.DAY_OF_MONTH); + return year + "-" + String.format("%02d", month) + "-" + String.format("%02d", lastDay); + } + + private void statisticsDayDataFromHour(String stcd, String startDate, String endDate) { + String deleteSql = "DELETE FROM SD_WQDAY_S T " + + "WHERE T.STCD = ? " + + "AND T.DT BETWEEN TO_DATE(?, 'YYYY-MM-DD') " + + "AND TO_DATE(?, 'YYYY-MM-DD') " + + "AND NOT EXISTS ( " + + "SELECT 1 FROM SD_WQ_R S " + + "WHERE S.STCD = T.STCD " + + "AND TRUNC(S.TM) = T.DT " + + "AND S.TM >= TO_DATE(? || ' 00:00:00', 'YYYY-MM-DD HH24:MI:SS') " + + "AND S.TM <= TO_DATE(? || ' 23:59:59', 'YYYY-MM-DD HH24:MI:SS') " + + "AND S.IS_DELETED = 0)"; + jdbcTemplate.update(deleteSql, stcd, startDate, endDate, startDate, endDate); + + String mergeSql = "MERGE INTO SD_WQDAY_S T " + + "USING ( " + + " SELECT " + + " STCD, " + + " TRUNC(TM) AS DT, " + + " AVG(WTMP) AS WTMP, " + + " AVG(PH) AS PH, " + + " AVG(DOX) AS DOX, " + + " AVG(CODMN) AS CODMN, " + + " AVG(CODCR) AS CODCR, " + + " AVG(BOD5) AS BOD5, " + + " AVG(NH3N) AS NH3N, " + + " AVG(TP) AS TP, " + + " AVG(TN) AS TN, " + + " AVG(CU) AS CU, " + + " AVG(ZN) AS ZN, " + + " AVG(F) AS F, " + + " AVG(SE) AS SE, " + + " AVG(ARS) AS ARS, " + + " AVG(HG) AS HG, " + + " AVG(CD) AS CD, " + + " AVG(CR6) AS CR6, " + + " AVG(PB) AS PB, " + + " AVG(CN) AS CN, " + + " AVG(VLPH) AS VLPH, " + + " AVG(OIL) AS OIL, " + + " AVG(LAS) AS LAS, " + + " AVG(S2) AS S2, " + + " AVG(FCG) AS FCG, " + + " AVG(CL) AS CL, " + + " AVG(SO4) AS SO4, " + + " AVG(NO3) AS NO3, " + + " AVG(THRD) AS THRD, " + + " AVG(COND) AS COND, " + + " AVG(FE) AS FE, " + + " AVG(MN) AS MN, " + + " AVG(AL) AS AL, " + + " AVG(CHLA) AS CHLA, " + + " AVG(CLARITY) AS CLARITY, " + + " AVG(TU) AS TU, " + + " AVG(CYANO) AS CYANO, " + + " AVG(SS) AS SS, " + + " AVG(NO2) AS NO2, " + + " MIN(WQGRD) AS WQGRD, " + + " MIN(SFDB) AS SFDB " + + " FROM SD_WQ_R " + + " WHERE STCD = ? " + + " AND TM >= TO_DATE(? || ' 00:00:00', 'YYYY-MM-DD HH24:MI:SS') " + + " AND TM <= TO_DATE(? || ' 23:59:59', 'YYYY-MM-DD HH24:MI:SS') " + + " AND IS_DELETED = 0 " + + " GROUP BY STCD, TRUNC(TM) " + + ") S " + + "ON (T.STCD = S.STCD AND T.DT = S.DT) " + + "WHEN MATCHED THEN UPDATE SET " + + " T.WTMP = S.WTMP, " + + " T.PH = S.PH, " + + " T.DOX = S.DOX, " + + " T.CODMN = S.CODMN, " + + " T.CODCR = S.CODCR, " + + " T.BOD5 = S.BOD5, " + + " T.NH3N = S.NH3N, " + + " T.TP = S.TP, " + + " T.TN = S.TN, " + + " T.CU = S.CU, " + + " T.ZN = S.ZN, " + + " T.F = S.F, " + + " T.SE = S.SE, " + + " T.ARS = S.ARS, " + + " T.HG = S.HG, " + + " T.CD = S.CD, " + + " T.CR6 = S.CR6, " + + " T.PB = S.PB, " + + " T.CN = S.CN, " + + " T.VLPH = S.VLPH, " + + " T.OIL = S.OIL, " + + " T.LAS = S.LAS, " + + " T.S2 = S.S2, " + + " T.FCG = S.FCG, " + + " T.CL = S.CL, " + + " T.SO4 = S.SO4, " + + " T.NO3 = S.NO3, " + + " T.THRD = S.THRD, " + + " T.COND = S.COND, " + + " T.FE = S.FE, " + + " T.MN = S.MN, " + + " T.AL = S.AL, " + + " T.CHLA = S.CHLA, " + + " T.CLARITY = S.CLARITY, " + + " T.TU = S.TU, " + + " T.CYANO = S.CYANO, " + + " T.SS = S.SS, " + + " T.NO2 = S.NO2, " + + " T.WQGRD = S.WQGRD, " + + " T.SFDB = S.SFDB, " + + " T.IS_DELETED = 0, " + + " T.DELETE_USER = NULL, " + + " T.DELETE_TIME = NULL, " + + " T.MODIFY_USER = NULL, " + + " T.MODIFY_TIME = SYSDATE " + + "WHEN NOT MATCHED THEN INSERT ( " + + " ID, STCD, DT, WQGRD, WTMP, PH, DOX, CODMN, CODCR, BOD5, " + + " NH3N, TP, TN, CU, ZN, F, SE, ARS, HG, CD, CR6, PB, CN, VLPH, " + + " OIL, LAS, S2, FCG, CL, SO4, NO3, THRD, COND, FE, MN, AL, CHLA, " + + " CLARITY, TU, CYANO, SFDB, SS, NO2, " + + " RECORD_TIME, IS_DELETED " + + ") VALUES ( " + + " SYS_GUID(), S.STCD, S.DT, S.WQGRD, S.WTMP, S.PH, S.DOX, S.CODMN, S.CODCR, S.BOD5, " + + " S.NH3N, S.TP, S.TN, S.CU, S.ZN, S.F, S.SE, S.ARS, S.HG, S.CD, S.CR6, S.PB, S.CN, S.VLPH, " + + " S.OIL, S.LAS, S.S2, S.FCG, S.CL, S.SO4, S.NO3, S.THRD, S.COND, S.FE, S.MN, S.AL, S.CHLA, " + + " S.CLARITY, S.TU, S.CYANO, S.SFDB, S.SS, S.NO2, " + + " SYSDATE, 0 " + + ")"; + jdbcTemplate.update(mergeSql, stcd, startDate, endDate); + } + + private void statisticsMonthDataFromDay(String stcd, String startDate, String endDate) { + Integer startYearInt = Integer.parseInt(startDate.substring(0, 4)); + Integer startMonthInt = Integer.parseInt(startDate.substring(5, 7)); + Integer endMonthInt = Integer.parseInt(endDate.substring(5, 7)); + + String deleteSql = "DELETE FROM SD_WQDRTP_S T " + + "WHERE T.DRTP = 'MON' " + + "AND T.STCD = ? " + + "AND T.YEAR = ? " + + "AND T.MONTH BETWEEN ? AND ? " + + "AND NOT EXISTS ( " + + " SELECT 1 FROM SD_WQDAY_S D " + + " WHERE D.STCD = T.STCD " + + " AND D.IS_DELETED = 0 " + + " AND EXTRACT(YEAR FROM D.DT) = T.YEAR " + + " AND EXTRACT(MONTH FROM D.DT) = T.MONTH " + + " AND D.DT >= TO_DATE(?, 'YYYY-MM-DD') " + + " AND D.DT < TO_DATE(?, 'YYYY-MM-DD') + 1)"; + jdbcTemplate.update(deleteSql, stcd, startYearInt, startMonthInt, endMonthInt, startDate, endDate); + + String mergeSql = "MERGE INTO SD_WQDRTP_S T " + + "USING ( " + + " SELECT " + + " STCD, " + + " EXTRACT(YEAR FROM DT) AS YEAR, " + + " EXTRACT(MONTH FROM DT) AS MONTH, " + + " 'MON' AS DRTP, " + + " AVG(WTMP) AS WTMP, " + + " AVG(PH) AS PH, " + + " AVG(DOX) AS DOX, " + + " AVG(CODMN) AS CODMN, " + + " AVG(CODCR) AS CODCR, " + + " AVG(BOD5) AS BOD5, " + + " AVG(NH3N) AS NH3N, " + + " AVG(TP) AS TP, " + + " AVG(TN) AS TN, " + + " AVG(CU) AS CU, " + + " AVG(ZN) AS ZN, " + + " AVG(F) AS F, " + + " AVG(SE) AS SE, " + + " AVG(ARS) AS ARS, " + + " AVG(HG) AS HG, " + + " AVG(CD) AS CD, " + + " AVG(CR6) AS CR6, " + + " AVG(PB) AS PB, " + + " AVG(CN) AS CN, " + + " AVG(VLPH) AS VLPH, " + + " AVG(OIL) AS OIL, " + + " AVG(LAS) AS LAS, " + + " AVG(S2) AS S2, " + + " AVG(FCG) AS FCG, " + + " AVG(CL) AS CL, " + + " AVG(SO4) AS SO4, " + + " AVG(NO3) AS NO3, " + + " AVG(THRD) AS THRD, " + + " AVG(COND) AS COND, " + + " AVG(FE) AS FE, " + + " AVG(MN) AS MN, " + + " AVG(AL) AS AL, " + + " AVG(CHLA) AS CHLA, " + + " AVG(CLARITY) AS CLARITY, " + + " AVG(TU) AS TU, " + + " AVG(CYANO) AS CYANO, " + + " AVG(SFDB) AS SFDB, " + + " AVG(SS) AS SS, " + + " AVG(NO2) AS NO2, " + + " MIN(WQGRD) AS WQGRD " + + " FROM SD_WQDAY_S " + + " WHERE STCD = ? " + + " AND DT >= TO_DATE(?, 'YYYY-MM-DD') " + + " AND DT < TO_DATE(?, 'YYYY-MM-DD') + 1 " + + " AND IS_DELETED = 0 " + + " GROUP BY STCD, EXTRACT(YEAR FROM DT), EXTRACT(MONTH FROM DT) " + + ") S " + + "ON (T.STCD = S.STCD AND T.DRTP = 'MON' AND T.YEAR = S.YEAR AND T.MONTH = S.MONTH) " + + "WHEN MATCHED THEN UPDATE SET " + + " T.WQGRD = S.WQGRD, " + + " T.WTMP = S.WTMP, " + + " T.PH = S.PH, " + + " T.DOX = S.DOX, " + + " T.CODMN = S.CODMN, " + + " T.CODCR = S.CODCR, " + + " T.BOD5 = S.BOD5, " + + " T.NH3N = S.NH3N, " + + " T.TP = S.TP, " + + " T.TN = S.TN, " + + " T.CU = S.CU, " + + " T.ZN = S.ZN, " + + " T.F = S.F, " + + " T.SE = S.SE, " + + " T.ARS = S.ARS, " + + " T.HG = S.HG, " + + " T.CD = S.CD, " + + " T.CR6 = S.CR6, " + + " T.PB = S.PB, " + + " T.CN = S.CN, " + + " T.VLPH = S.VLPH, " + + " T.OIL = S.OIL, " + + " T.LAS = S.LAS, " + + " T.S2 = S.S2, " + + " T.FCG = S.FCG, " + + " T.CL = S.CL, " + + " T.SO4 = S.SO4, " + + " T.NO3 = S.NO3, " + + " T.THRD = S.THRD, " + + " T.COND = S.COND, " + + " T.FE = S.FE, " + + " T.MN = S.MN, " + + " T.AL = S.AL, " + + " T.CHLA = S.CHLA, " + + " T.CLARITY = S.CLARITY, " + + " T.TU = S.TU, " + + " T.CYANO = S.CYANO, " + + " T.SFDB = S.SFDB, " + + " T.SS = S.SS, " + + " T.NO2 = S.NO2, " + + " T.IS_DELETED = 0, " + + " T.DELETE_TIME = NULL, " + + " T.MODIFY_TIME = SYSDATE, " + + " T.TM = SYSDATE " + + "WHEN NOT MATCHED THEN INSERT ( " + + " ID, STCD, DRTP, YEAR, MONTH, WQGRD, " + + " WTMP, PH, DOX, CODMN, CODCR, BOD5, NH3N, TP, TN, " + + " CU, ZN, F, SE, ARS, HG, CD, CR6, PB, CN, VLPH, " + + " OIL, LAS, S2, FCG, CL, SO4, NO3, THRD, COND, " + + " FE, MN, AL, CHLA, CLARITY, TU, CYANO, SFDB, SS, NO2, " + + " RECORD_TIME, IS_DELETED, TM " + + ") VALUES ( " + + " SYS_GUID(), S.STCD, 'MON', S.YEAR, S.MONTH, S.WQGRD, " + + " S.WTMP, S.PH, S.DOX, S.CODMN, S.CODCR, S.BOD5, S.NH3N, S.TP, S.TN, " + + " S.CU, S.ZN, S.F, S.SE, S.ARS, S.HG, S.CD, S.CR6, S.PB, S.CN, S.VLPH, " + + " S.OIL, S.LAS, S.S2, S.FCG, S.CL, S.SO4, S.NO3, S.THRD, S.COND, " + + " S.FE, S.MN, S.AL, S.CHLA, S.CLARITY, S.TU, S.CYANO, S.SFDB, S.SS, S.NO2, " + + " SYSDATE, 0, SYSDATE " + + ")"; + jdbcTemplate.update(mergeSql, stcd, startDate, endDate); + } }