Merge branch 'dev-tw'

This commit is contained in:
tangwei 2026-06-12 17:47:31 +08:00
commit 5aa7f360e9
49 changed files with 6806 additions and 411 deletions

View File

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

View File

@ -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));
}
}
@PostMapping("/wbsb/getHbrvdList")
@Operation(summary = "根据基地查询基地流域列表")
public ResponseResult getHbrvdList(@RequestBody DataSourceRequest dataSourceRequest) {
return ResponseResult.successData(hbrvDicService.getHbrvdList(dataSourceRequest));
}
}

View File

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

View File

@ -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<SdHbrvDic> {
List<SdHbrvDic> regDropdown(String hbrvnm, String baseid);
}
List<HbrvWbsVo> getHbrvdList(DataSourceRequest dataSourceRequest);
}

View File

@ -1139,20 +1139,45 @@ public class SdEngInfoBHServiceImpl extends ServiceImpl<SdEngInfoBHMapper, SdEng
return null;
}
return switch (field) {
case "stcd", "eiaStcd" -> "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<SdEngInfoBHMapper, SdEng
if (sortDescriptor == null || !StringUtils.hasText(sortDescriptor.getField())) {
continue;
}
String column = switch (sortDescriptor.getField()) {
case "baseStepSort" -> "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";

View File

@ -74,107 +74,231 @@ public class SdFishDictoryBServiceImpl extends ServiceImpl<SdFishDictoryBMapper,
}
int resultLimit = (limit != null && limit > 0) ? limit : 10;
String searchName = name.trim();
LambdaQueryWrapper<SdFishDictoryB> wrapper = new LambdaQueryWrapper<>();
wrapper.eq(SdFishDictoryB::getIsDeleted, 0);
List<SdFishDictoryB> 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<SdFishDictoryB, Integer> 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<SdFishDictoryB> result = similarityMap.entrySet().stream()
.sorted(Map.Entry.<SdFishDictoryB, Integer>comparingByValue().reversed())
.limit(resultLimit)
.map(Map.Entry::getKey)
.collect(Collectors.toList());
result.add(0, exactMatch);
return result;
List<SdFishDictoryB> candidateFish = querySimilarFishCandidates(rawSearchName, searchName, resultLimit);
if (candidateFish.isEmpty()) {
return Collections.emptyList();
}
List<SdFishDictoryB> containsMatches = allFish.stream()
.filter(f -> f.getName() != null && f.getName().contains(searchName))
Map<String, Integer> 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<SdFishDictoryB> 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<SdFishDictoryB> querySimilarFishCandidates(String rawSearchName, String normalizedSearchName, int resultLimit) {
int candidateLimit = Math.min(Math.max(resultLimit * 30, 120), 500);
LinkedHashMap<String, SdFishDictoryB> 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<SdFishDictoryB, Integer> 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<String, SdFishDictoryB> candidateMap, List<SdFishDictoryB> candidates) {
if (candidates == null || candidates.isEmpty()) {
return;
}
for (SdFishDictoryB fish : candidates) {
if (fish == null || !StringUtils.hasText(fish.getId())) {
continue;
}
List<SdFishDictoryB> result = similarityMap.entrySet().stream()
.sorted(Map.Entry.<SdFishDictoryB, Integer>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<SdFishDictoryB> queryExactCandidates(String rawSearchName, String normalizedSearchName, int limit) {
if (!StringUtils.hasText(rawSearchName)) {
return Collections.emptyList();
}
LambdaQueryWrapper<SdFishDictoryB> 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<SdFishDictoryB> queryContainsCandidates(String rawSearchName, String normalizedSearchName, int limit) {
if (!StringUtils.hasText(rawSearchName)) {
return Collections.emptyList();
}
String likeValue = "%" + rawSearchName + "%";
String normalizedLikeValue = "%" + normalizedSearchName + "%";
LambdaQueryWrapper<SdFishDictoryB> 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<SdFishDictoryB> queryTokenCandidates(String normalizedSearchName, int limit) {
Set<String> 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<SdFishDictoryB> 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<SdFishDictoryB> buildCandidateSelectWrapper() {
LambdaQueryWrapper<SdFishDictoryB> 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<SdFishDictoryBMapper,
return score;
}
}
private int calculateSearchScore(String searchName, SdFishDictoryB fish) {
int score = 0;
score += calculateFieldSearchScore(searchName, fish.getName(), 220, 140, 90, 40);
score += calculateFieldSearchScore(searchName, fish.getAlias(), 180, 120, 80, 30);
score += calculateFieldSearchScore(searchName, fish.getNameEn(), 160, 100, 70, 25);
score += calculateFieldSearchScore(searchName, fish.getSpecies(), 140, 90, 60, 25);
score += calculateFieldSearchScore(searchName, fish.getGenus(), 120, 80, 55, 20);
score += calculateFieldSearchScore(searchName, fish.getFamily(), 100, 70, 45, 18);
score += calculateFieldSearchScore(searchName, fish.getOrders(), 90, 60, 40, 15);
score += calculateFieldSearchScore(searchName, fish.getIntroduce(), 45, 30, 0, 12);
return score;
}
private int buildFinalScore(SdFishDictoryB referenceFish, SdFishDictoryB currentFish, int searchScore) {
int totalScore = searchScore;
if (referenceFish != null) {
totalScore += calculateSimilarity(referenceFish, currentFish);
}
return totalScore;
}
private int calculateFieldSearchScore(String searchText, String candidate, int exactScore, int containsScore,
int reverseContainsScore, int overlapMaxScore) {
String normalizedSearch = normalizeText(searchText);
String normalizedCandidate = normalizeText(candidate);
if (!StringUtils.hasText(normalizedSearch) || !StringUtils.hasText(normalizedCandidate)) {
return 0;
}
if (normalizedCandidate.equals(normalizedSearch)) {
return exactScore;
}
if (normalizedCandidate.contains(normalizedSearch)) {
return containsScore;
}
if (reverseContainsScore > 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<String> leftTokens = splitTokens(left);
Set<String> 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<String> splitTokens(String text) {
String normalized = normalizeText(text);
if (!StringUtils.hasText(normalized)) {
return Collections.emptySet();
}
Set<String> 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;
}
}

View File

@ -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<SdHbrvDicMapper, SdHbrvDic
@Resource
private SdEngInfoBHMapper engInfoBHMapper;
@Resource
private SdHydrobaseMapper hydrobaseMapper;
private SdHbrvDicMapper hbrvDicMapper;
@Override
public Page<SdHbrvDic> queryPageList(Page<SdHbrvDic> page, String hbrvnm, String baseid) {
@ -200,4 +213,50 @@ public class SdHbrvDicServiceImpl extends ServiceImpl<SdHbrvDicMapper, SdHbrvDic
.orderByAsc(SdHbrvDic::getBaseid,SdHbrvDic::getOrderIndex)
.list();
}
}
@Override
public List<HbrvWbsVo> getHbrvdList(DataSourceRequest dataSourceRequest) {
DataSourceLoadOptionsBase loadOptions = dataSourceRequest == null ? null : dataSourceRequest.toDevRequest();
String baseId = loadOptions == null ? null : QgcQueryWrapperUtil.getFilterFieldValue(loadOptions, "baseId");
LambdaQueryWrapper<SdHbrvDic> 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<SdHbrvDic> hbrvList = this.list(wrapper);
if (hbrvList.isEmpty()) {
return new ArrayList<>();
}
List<String> baseIds = hbrvList.stream()
.map(SdHbrvDic::getBaseid)
.filter(StringUtils::hasText)
.distinct()
.toList();
Map<String, String> 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;
}
}

View File

@ -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, " +
@ -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;

View File

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

View File

@ -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<String> 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<String> 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";
@ -1486,6 +1508,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;
};

View File

@ -46,6 +46,18 @@ 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("/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) {
@ -58,6 +70,18 @@ public class FishPassageController {
return ResponseResult.successData(fpBuildService.getVmsstbprptList(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) {

View File

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

View File

@ -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<FpRunAnalysisHeadColumnVo> 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<FpRunAnalysisHeadColumnVo> children) {
this.title = title;
this.dataIndex = dataIndex;
this.visible = visible;
this.merge = merge;
this.children = children;
this.key = key;
}
}

View File

@ -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<FpRunAnalysisHeadColumnVo> columns;
@Schema(description = "表格数据")
private Object dataSource;
@Schema(description = "总数")
private Long total;
@Schema(description = "水温设备类型")
private Integer wtDeviceType;
}

View File

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

View File

@ -63,9 +63,18 @@ public class FpSdfpssrVo {
@Schema(description = "附件ID")
private String fid;
@Schema(description = "视频")
private String vdpth;
@Schema(description = "图片")
private String picpth;
@Schema(description = "游向")
private Integer direction;
@Schema(description = "游向")
private String directionName;
@Schema(description = "监测方式")
private Integer mway;

View File

@ -19,6 +19,10 @@ public class FpTableVo {
@Schema(description = "鱼种类")
private String ftp;
@Schema(description = "鱼种类")
private String ftpName;
@Schema(description = "鱼类编码")
private String fishId;
@ -75,4 +79,10 @@ public class FpTableVo {
@Schema(description = "监测方式1=人工 2=自动(预留)")
private Integer mway;
@Schema(description = "视频")
private String vdpth;
@Schema(description = "图片")
private String picpth;
}

View File

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

View File

@ -11,5 +11,7 @@ public interface FpBuildService {
DataSourceResult<FpVmsstbprptVo> getVmsstbprptList(DataSourceRequest dataSourceRequest);
DataSourceResult<FpVmsstbprptVo> getFpqMsstbprptList(DataSourceRequest dataSourceRequest);
FpVmsstbprptVo getStInfoByStcd(String stcd);
}

View File

@ -2,6 +2,8 @@ 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;
@ -17,5 +19,9 @@ public interface FpRunService {
DataSourceResult<FpTableVo> processQgcFpssTableKendoList(DataSourceRequest dataSourceRequest);
DataSourceResult<FpRunAnalysisTableVo> getAnalysisData(DataSourceRequest dataSourceRequest);
DataSourceResult<FpFishSelectVo> getFishSelect(DataSourceRequest dataSourceRequest);
List<YearFpStatisticsVo> getYearFpStatic(String year);
}

View File

@ -58,18 +58,37 @@ public class FpBuildServiceImpl implements FpBuildService {
@Override
public DataSourceResult<FpVmsstbprptVo> getVmsstbprptList(DataSourceRequest dataSourceRequest) {
return queryVmsstbprptList(dataSourceRequest, null);
}
@Override
public DataSourceResult<FpVmsstbprptVo> getFpqMsstbprptList(DataSourceRequest dataSourceRequest) {
return queryVmsstbprptList(dataSourceRequest, "FPQ");
}
private DataSourceResult<FpVmsstbprptVo> 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<String, Object> 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<FpVmsstbprptVo> 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("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, ")
.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<String> selectFields) {
if (CollectionUtils.isEmpty(selectFields)) {
return "t.*";
}
Map<String, String> selectMap = buildVmsstbprptSelectMap();
List<String> 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<String, String> buildVmsstbprptSelectMap() {
Map<String, String> 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<String, Object> paramMap,
int[] indexHolder) {
@ -309,21 +439,85 @@ public class FpBuildServiceImpl implements FpBuildService {
}
Map<String, String> 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");
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("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");
@ -333,42 +527,118 @@ public class FpBuildServiceImpl implements FpBuildService {
private String buildVmsstbprptOrderBySql(List<DataSourceRequest.SortDescriptor> 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";
}
Map<String, String> 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<String> 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 = mapVmsstbprptOuterColumn(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, " +
"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;
};
}
}

View File

@ -13,7 +13,11 @@ 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.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;
@ -62,8 +66,8 @@ public class FpRunServiceImpl implements FpRunService {
Map<String, Object> paramMap = new HashMap<>();
paramMap.put("stcd", stcd);
paramMap.put("yr", yr);
Map<String, Object> row = microservicDynamicSQLMapper.getOneBySql(buildQgcSecondPlanSql(), paramMap);
String sql = buildQgcSecondPlanSql();
Map<String, Object> row = microservicDynamicSQLMapper.getOneBySql(sql, paramMap);
FpRunPlanVo vo = row == null || row.isEmpty()
? new FpRunPlanVo()
: BeanUtil.fillBeanWithMap(
@ -128,6 +132,123 @@ public class FpRunServiceImpl implements FpRunService {
return queryQgcFpssTableGroupList(dataSourceRequest, loadOptions, stcd);
}
@Override
public DataSourceResult<FpRunAnalysisTableVo> getAnalysisData(DataSourceRequest dataSourceRequest) {
DataSourceResult<FpRunAnalysisTableVo> 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<String, Object> stationParamMap = new HashMap<>();
stationParamMap.put("stcd", StrUtil.trim(stcd));
Map<String, Object> 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<String, Object> alongParamMap = new HashMap<>();
alongParamMap.put("rstcd", rstcd);
alongParamMap.put("hbrvcd", hbrvcd);
List<Map<String, Object>> alongRows = microservicDynamicSQLMapper.pageAllList(
null,
buildQgcFpRunAnalysisAlongSql(),
alongParamMap
);
for (Map<String, Object> 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<String, Object> 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<FpRunAnalysisVo> 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<FpFishSelectVo> 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<String, Object> paramMap = new HashMap<>();
paramMap.put("stcd", StrUtil.trim(stcd));
paramMap.put("tmStart", StrUtil.trim(tmArr[0]));
paramMap.put("tmEnd", StrUtil.trim(tmArr[1]));
List<FpFishSelectVo> list = microservicDynamicSQLMapper.getAllListWithResultType(
buildFpFishSelectSql(),
paramMap,
FpFishSelectVo.class
);
DataSourceResult<FpFishSelectVo> result = new DataSourceResult<>();
result.setData(list);
result.setTotal(list == null ? 0L : list.size());
result.setAggregates(new HashMap<>());
return result;
}
@Override
public List<YearFpStatisticsVo> getYearFpStatic(String year) {
Map<String, Object> paramMap = new HashMap<>();
@ -188,41 +309,34 @@ public class FpRunServiceImpl implements FpRunService {
private DataSourceResult<FpTableVo> queryQgcFpssTableGroupList(DataSourceRequest dataSourceRequest,
DataSourceLoadOptionsBase loadOptions,
String stcdFilter) {
List<DataSourceRequest.GroupDescriptor> groups = dataSourceRequest.getGroup();
GroupingInfo[] groupInfos = loadOptions == null ? new GroupingInfo[0] : loadOptions.getGroup();
StringBuilder sql = new StringBuilder("SELECT ");
List<String> 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("MAX(t.stcd) AS stcd, ")
.append("MAX(t.stnm) AS stnm, ")
.append("MIN(t.tm) AS tm, ")
.append("t.ftp AS ftp, ")
.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("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("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 ");
@ -233,29 +347,14 @@ public class FpRunServiceImpl implements FpRunService {
sql.append(" AND ").append(filterSql).append(" ");
}
List<String> 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<Map<String, Object>> rows = microservicDynamicSQLMapper.pageAllList(null, sql.toString(), paramMap);
Page<?> page = loadOptions == null ? null : QgcQueryWrapperUtil.buildPage(loadOptions, loadOptions.getSkip(), loadOptions.getTake());
List<FpTableVo> rows = microservicDynamicSQLMapper.pageAllListWithResultType(page, sql.toString(), paramMap, FpTableVo.class);
DataSourceResult<FpTableVo> result = new DataSourceResult<>();
if (Boolean.TRUE.equals(dataSourceRequest.getGroupResultFlat())) {
result.setData((List<FpTableVo>) (List<?>) new GroupHelper().faltGroup(rows, Arrays.asList(groupInfos)));
} else {
result.setData((List<FpTableVo>) (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;
}
@ -291,38 +390,77 @@ public class FpRunServiceImpl implements FpRunService {
}
private String buildQgcFpssTableCoreSql() {
String fishNameExpr = buildFishDictionaryDisplayExpr("cRv", "cZy", "t.FTP");
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.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.NAME AS ftpName, " +
"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.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, " +
" TO_CHAR(t.TM, 'YYYY-MM-DD HH24:MI:SS') AS TM, " +
" COALESCE(c.NAME, t.FTP ) AS FTP , " +
" t.FTP AS FISHID, " +
" COALESCE(c.NAME, t.FTP ) AS NAME, " +
" 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 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(c.NAME, t.FTP ) AS FTP, " +
" t.FTP AS FISHID, " +
" COALESCE(c.NAME, t.FTP ) AS NAME, " +
" t.FSZ AS FSZ, " +
" TO_CHAR(t.STRDT, 'YYYY') AS YR, " +
" TO_CHAR(t.FCNT) AS FCNT, " +
@ -338,50 +476,23 @@ 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, " +
" 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(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";
" 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<String> selectFields) {
@ -390,6 +501,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");
@ -405,6 +517,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");
@ -567,6 +681,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";
@ -620,6 +736,28 @@ public class FpRunServiceImpl implements FpRunService {
return orders.isEmpty() ? "" : " ORDER BY " + String.join(", ", orders);
}
private String buildQgcFpssTableAggregateOrderBySql(List<DataSourceRequest.SortDescriptor> sortList) {
if (CollUtil.isEmpty(sortList)) {
return " ORDER BY yr DESC";
}
List<String> 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<FpSdfpssrVo> queryQgcSdfpssrDetailList(DataSourceRequest dataSourceRequest,
DataSourceLoadOptionsBase loadOptions) {
StringBuilder sql = new StringBuilder();
@ -737,8 +875,11 @@ 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, " +
" 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, " +
@ -790,7 +931,10 @@ 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("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");
@ -949,7 +1093,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";
@ -1009,6 +1156,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<DataSourceRequest.SortDescriptor> 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<DataSourceRequest.SortDescriptor> sortList) {
if (CollUtil.isEmpty(sortList)) {
return " ORDER BY t.DT";
}
List<String> 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<FpRunAnalysisHeadColumnVo> buildQgcFpRunAnalysisColumns(String ftpName) {
List<FpRunAnalysisHeadColumnVo> 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<Object> normalizeValues(Object value) {
if (value == null) {
return new ArrayList<>();
@ -1141,6 +1508,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<String> fishNames = new LinkedHashSet<>();

View File

@ -0,0 +1,73 @@
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.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;
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;
import java.util.List;
@RestController
@RequestMapping("/fpr")
@Tag(name = "鱼类调查装置站基础信息")
@Validated
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("/fishDic/GetKendoList")
@Operation(summary = "鱼类字典列表")
public ResponseResult getFishDicList(@RequestBody DataSourceRequest dataSourceRequest) {
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) {
FprdRunDataInfoVo result = fprMonitorService.getFprdRunDataInfo(ao);
return ResponseResult.successData(result);
}
@PostMapping("/sdFprdR/getFtpChangeInfo")
@Operation(summary = "获取鱼类变化情况")
public ResponseResult getFtpChangeInfo(@RequestBody FprdRunDataAo ao) {
List<FprFtpChangeInfoVo> result = fprMonitorService.getFtpChangeInfo(ao);
return ResponseResult.successData(result);
}
@PostMapping("/wbsb/GetKendoList")
@Operation(summary = "查询基地/基地流域树数据")
public ResponseResult getWbsbList(@RequestBody DataSourceRequest dataSourceRequest) {
return ResponseResult.successData(engEqDataService.getWbsbList(dataSourceRequest));
}
}

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

@ -0,0 +1,25 @@
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 com.yfd.platform.qgc_env.fpr.entity.vo.FprZyFishDicVo;
import java.util.List;
public interface FprMonitorService {
DataSourceResult<FprMsstbprptVo> getMsstbprptList(DataSourceRequest dataSourceRequest);
DataSourceResult<FprFishDicVo> getFishDicList(DataSourceRequest dataSourceRequest);
DataSourceResult<FprZyFishDicVo> getZyFishDicList(DataSourceRequest dataSourceRequest);
FprdRunDataInfoVo getFprdRunDataInfo(FprdRunDataAo ao);
List<FprFtpChangeInfoVo> getFtpChangeInfo(FprdRunDataAo ao);
}

View File

@ -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,22 @@ 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));
}
@PostMapping("/vac/GetKendoListCust")
@Operation(summary = "动物救助站建设及接入情况")
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));
}
}

View File

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

View File

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

View File

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

View File

@ -3,7 +3,10 @@ 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;
public interface VpConstructionService {
@ -14,4 +17,10 @@ public interface VpConstructionService {
VpStInfoResultVo getStInfoByStcd(String stcd);
DataSourceResult<VpBasinIntDetailVo> basinVpIntDetail(DataSourceRequest dataSourceRequest);
DataSourceResult<VpWvaRunVo> processWvaKendoList(DataSourceRequest dataSourceRequest);
DataSourceResult<VpVacVo> processVacKendoList(DataSourceRequest dataSourceRequest);
DataSourceResult<VpVarVo> processVarKendoList(DataSourceRequest dataSourceRequest);
}

View File

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

View File

@ -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 = "水质统计分析")
@ -42,6 +45,32 @@ 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("/data/drtp/GetKendoListCust")
@Operation(summary = "查询水质周旬月季年数据")
public ResponseResult getDrtpKendoListCust(@RequestBody DataSourceRequest dataSourceRequest) {
return ResponseResult.successData(envWqDataService.getDrtpKendoListCust(dataSourceRequest));
}
@PostMapping("/updateWqRsData")
@Operation(summary = "修改水质小时数据")
public ResponseResult updateWqRsData(@RequestBody Map<String, Object> 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) {

View File

@ -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<Map<String, Object>> min;
private List<Map<String, Object>> max;
}

View File

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

View File

@ -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);
@ -12,6 +15,10 @@ public interface EnvWqDataService {
DataSourceResult processDataKendoList(DataSourceRequest dataSourceRequest);
DataSourceResult getDayKendoListCust(DataSourceRequest dataSourceRequest);
DataSourceResult getDrtpKendoListCust(DataSourceRequest dataSourceRequest);
DataSourceResult getStbprpYsByStcd(DataSourceRequest dataSourceRequest);
DataSourceResult getAlongWqKendoListCust(DataSourceRequest dataSourceRequest);
@ -31,4 +38,8 @@ public interface EnvWqDataService {
DataSourceResult getStTbYsBVoKendoListCust(String stcd, String tbCode, String startTime, String endTime);
DataSourceResult getStTbYsBVoKendoListCust(DataSourceRequest dataSourceRequest);
boolean updateWqRsData(Map<String, Object> updateData);
boolean removeKendoByIds(BatchDeleteAo batchDeleteAo);
}

View File

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

View File

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

View File

@ -12,6 +12,8 @@ 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.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;
@ -129,66 +131,399 @@ public class AlongDetailServiceImpl extends ServiceImpl<AlongDetailMapper, SdAlo
@Override
public DataSourceResult processDayKendoList(DataSourceRequest dataSourceRequest, Map<String, GroupResult> filterResult, Page page, String groupBy) {
DataSourceResult dataSourceResult = new DataSourceResult();
StringBuilder sql = new StringBuilder();
DataSourceResult<SdAlongDayDetailVO> 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<String, Object> 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<String, Object> map = new HashMap();
Iterator iterator = filterResult.keySet().iterator();
while (iterator.hasNext()) {
String key = (String) iterator.next();
map.putAll(filterResult.get(key).getParamMap());
}
List< Map<String, Object>> resultList = this.dynamicSQLMapper.pageAllList(page, sql.toString(), map);
Page<?> currentPage = loadOptions == null ? page : QgcQueryWrapperUtil.buildPage(loadOptions, loadOptions.getSkip(), loadOptions.getTake());
List<SdAlongDayDetailVO> 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;
}
@Override
public DataSourceResult processDrtpKendoList(DataSourceRequest dataSourceRequest, Map<String, GroupResult> 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<SdAlongDrtpDetailVO> 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<String, Object> paramMap = new HashMap<>();
String filterSql = buildAlongDrtpFilterCondition(
dataSourceRequest == null ? null : dataSourceRequest.getFilter(),
paramMap,
new int[]{0}
);
if (StrUtil.isNotBlank(filterSql)) {
sql.append(" AND ").append(filterSql);
}
sql.append(buildAlongDrtpOrderBySql(dataSourceRequest == null ? null : dataSourceRequest.getSort()));
Page<?> currentPage = loadOptions == null ? page : QgcQueryWrapperUtil.buildPage(loadOptions, loadOptions.getSkip(), loadOptions.getTake());
List<SdAlongDrtpDetailVO> resultList = this.microservicDynamicSQLMapper.pageAllListWithResultType(
currentPage,
sql.toString(),
paramMap,
SdAlongDrtpDetailVO.class
);
dataSourceResult.setData(resultList);
dataSourceResult.setTotal(ObjectUtil.isNotEmpty(currentPage) ? currentPage.getTotal() : (long) resultList.size());
dataSourceResult.setAggregates(new HashMap<>());
return dataSourceResult;
}
private String buildAlongDayFilterCondition(DataSourceRequest.FilterDescriptor filter,
Map<String, Object> paramMap,
int[] indexHolder) {
if (filter == null) {
return "";
}
if (StrUtil.isNotBlank(filter.getField())) {
return buildAlongDayLeafCondition(filter, paramMap, indexHolder);
}
if (CollUtil.isEmpty(filter.getFilters())) {
return "";
}
List<String> conditions = new ArrayList<>();
for (DataSourceRequest.FilterDescriptor child : filter.getFilters()) {
String childSql = buildAlongDayFilterCondition(child, paramMap, indexHolder);
if (StrUtil.isNotBlank(childSql)) {
conditions.add(childSql);
}
}
Map<String, Object> map = new HashMap();
Iterator iterator = filterResult.keySet().iterator();
while (iterator.hasNext()) {
String key = (String) iterator.next();
map.putAll(filterResult.get(key).getParamMap());
if (conditions.isEmpty()) {
return "";
}
List<Map<String, Object>> resultList = this.dynamicSQLMapper.pageAllList(page, sql.toString(), map);
dataSourceResult.setData(resultList);
dataSourceResult.setTotal(ObjectUtil.isNotEmpty(page) ? page.getTotal() : (long) resultList.size());
return dataSourceResult;
String logic = "or".equalsIgnoreCase(filter.getLogic()) ? " OR " : " AND ";
return "(" + String.join(logic, conditions) + ")";
}
private String buildAlongDayLeafCondition(DataSourceRequest.FilterDescriptor filter,
Map<String, Object> 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<String> values = splitAlongDayFilterValues(filter.getValue());
if (CollUtil.isEmpty(values)) {
return "";
}
List<String> 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<DataSourceRequest.SortDescriptor> sortList) {
if (CollUtil.isEmpty(sortList)) {
return " ORDER BY t.DT DESC NULLS LAST, t.STCD ASC";
}
List<String> 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<String> splitAlongDayFilterValues(Object value) {
if (value == null) {
return Collections.emptyList();
}
if (value instanceof List<?> listValue) {
List<String> 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<String> 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<String> 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;
}
private String buildAlongDrtpFilterCondition(DataSourceRequest.FilterDescriptor filter,
Map<String, Object> paramMap,
int[] indexHolder) {
if (filter == null) {
return "";
}
if (StrUtil.isNotBlank(filter.getField())) {
return buildAlongDrtpLeafCondition(filter, paramMap, indexHolder);
}
if (CollUtil.isEmpty(filter.getFilters())) {
return "";
}
List<String> 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<String, Object> 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<String> values = splitAlongDayFilterValues(filter.getValue());
if (CollUtil.isEmpty(values)) {
return "";
}
List<String> 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<DataSourceRequest.SortDescriptor> 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<String> 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
@ -481,7 +816,8 @@ public class AlongDetailServiceImpl extends ServiceImpl<AlongDetailMapper, SdAlo
}
if ("TIME".equals(dataType)) {
sdWtrvdrtpSMapper.deleteWtrvRData(subList, DateUtil.now(), SecurityUtils.getCurrentUsername());
// SecurityUtils.getCurrentUsername()
sdWtrvdrtpSMapper.deleteWtrvRData(subList, DateUtil.now(), "admin");
// 删除小时数据后需要重新统计对应的日数据和月数据
Map<String, String[]> dateRangeMap = new HashMap<>();

View File

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

View File

@ -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)) {

View File

@ -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 <T> Page<T> getPage(DataSourceRequest request) {
// if (request == null) {
// return null;
// }
// int take = request.getTake();
// int skip = request.getSkip();
// if (take <= 0) {
// return null;
// }
// Page<T> page = new Page<>();
// page.setSize((long) take);
// page.setCurrent(skip / take + 1L);
// return page;
// }
public static <T> Page<T> 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<T> page = new Page<>();
page.setSize((long) take);
page.setCurrent(skip / take + 1L);
page.setSize((long) pageSize);
page.setCurrent(pageNum); // 直接使用页码
return page;
}