From 1239b58fee8d4f678a26eaa0a57b6ab4ea655107 Mon Sep 17 00:00:00 2001 From: tangwei Date: Wed, 29 Apr 2026 11:52:20 +0800 Subject: [PATCH] =?UTF-8?q?fix:=20=E4=BC=98=E5=8C=96=E9=B1=BC=E7=B1=BB?= =?UTF-8?q?=E6=99=BA=E8=83=BD=E6=9F=A5=E8=AF=A2?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../impl/SdFishDictoryBServiceImpl.java | 159 +++++++++++------- .../src/main/resources/application-devtw.yml | 4 +- .../src/main/resources/application-prod.yml | 4 +- backend/src/main/resources/application.yml | 2 +- 4 files changed, 100 insertions(+), 69 deletions(-) diff --git a/backend/src/main/java/com/yfd/platform/env/service/impl/SdFishDictoryBServiceImpl.java b/backend/src/main/java/com/yfd/platform/env/service/impl/SdFishDictoryBServiceImpl.java index db00ef3..1519f3f 100644 --- a/backend/src/main/java/com/yfd/platform/env/service/impl/SdFishDictoryBServiceImpl.java +++ b/backend/src/main/java/com/yfd/platform/env/service/impl/SdFishDictoryBServiceImpl.java @@ -1,5 +1,6 @@ package com.yfd.platform.env.service.impl; +import cn.hutool.core.util.ObjectUtil; import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; import com.baomidou.mybatisplus.extension.plugins.pagination.Page; import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; @@ -72,106 +73,136 @@ public class SdFishDictoryBServiceImpl extends ServiceImpl 0) ? limit : 10; String searchName = name.trim(); LambdaQueryWrapper wrapper = new LambdaQueryWrapper<>(); wrapper.eq(SdFishDictoryB::getIsDeleted, 0); List allFish = list(wrapper); - SdFishDictoryB referenceFish = allFish.stream() + SdFishDictoryB exactMatch = allFish.stream() .filter(f -> f.getName() != null && f.getName().equals(searchName)) .findFirst() .orElse(null); - if (referenceFish == null) { - referenceFish = allFish.stream() - .filter(f -> f.getName() != null && f.getName().contains(searchName)) - .findFirst() - .orElse(null); - } + if (exactMatch != null) { + Map similarityMap = new HashMap<>(); + for (SdFishDictoryB fish : allFish) { + if (fish.getId().equals(exactMatch.getId())) { + continue; + } + int score = calculateSimilarity(exactMatch, fish); + if (score > 0) { + similarityMap.put(fish, score); + } + } - if (referenceFish == null && allFish.stream().anyMatch(f -> - f.getName() != null && (f.getName().contains(searchName) || searchName.contains(f.getName())))) { - final String searchNameFinal = searchName; - referenceFish = allFish.stream() - .filter(f -> f.getName() != null && - (f.getName().contains(searchNameFinal) || searchNameFinal.contains(f.getName()))) - .findFirst() - .orElse(null); - } - - if (referenceFish == null) { - return allFish.stream() - .filter(f -> f.getName() != null && f.getName().contains(searchName)) - .limit(limit != null ? limit : 10) + List result = similarityMap.entrySet().stream() + .sorted(Map.Entry.comparingByValue().reversed()) + .limit(resultLimit) + .map(Map.Entry::getKey) .collect(Collectors.toList()); + + result.add(0, exactMatch); + return result; } - final SdFishDictoryB finalRefFish = referenceFish; - Map similarityMap = new HashMap<>(); - - for (SdFishDictoryB fish : allFish) { - if (fish.getId().equals(finalRefFish.getId())) { - continue; - } - - int score = calculateSimilarity(finalRefFish, fish); - if (score > 0) { - similarityMap.put(fish, score); - } - } - - return similarityMap.entrySet().stream() - .sorted(Map.Entry.comparingByValue().reversed()) - .limit(limit != null ? limit : 10) - .map(Map.Entry::getKey) + List containsMatches = allFish.stream() + .filter(f -> f.getName() != null && f.getName().contains(searchName)) .collect(Collectors.toList()); + + if (!containsMatches.isEmpty()) { + List result = containsMatches.stream() + .sorted((f1, f2) -> { + int len1 = f1.getName().length(); + int len2 = f2.getName().length(); + if (len1 != len2) { + return Integer.compare(len1, len2); + } + return f1.getName().compareTo(f2.getName()); + }) + .limit(resultLimit) + .collect(Collectors.toList()); + return result; + } + + SdFishDictoryB partialMatch = allFish.stream() + .filter(f -> f.getName() != null && (searchName.contains(f.getName()) || f.getName().contains(searchName))) + .findFirst() + .orElse(null); + + if (partialMatch != null) { + Map similarityMap = new HashMap<>(); + for (SdFishDictoryB fish : allFish) { + if (fish.getId().equals(partialMatch.getId())) { + continue; + } + int score = calculateSimilarity(partialMatch, fish); + if (score > 0) { + similarityMap.put(fish, score); + } + } + + List result = similarityMap.entrySet().stream() + .sorted(Map.Entry.comparingByValue().reversed()) + .limit(resultLimit) + .map(Map.Entry::getKey) + .collect(Collectors.toList()); + + result.add(0, partialMatch); + return result; + } + + return Collections.emptyList(); } private int calculateSimilarity(SdFishDictoryB ref, SdFishDictoryB target) { int score = 0; - if (ref.getOrders() != null && ref.getOrders().equals(target.getOrders())) { - score += 3; + if (ref.getGenus() != null && ref.getGenus().equals(target.getGenus()) && !ref.getGenus().isEmpty()) { + score += 25; } - if (ref.getFamily() != null && ref.getFamily().equals(target.getFamily())) { - score += 5; + + if (ref.getSpecies() != null && ref.getSpecies().equals(target.getSpecies()) && !ref.getSpecies().isEmpty()) { + score += 20; } - if (ref.getGenus() != null && ref.getGenus().equals(target.getGenus())) { - score += 8; + + if (ref.getFamily() != null && ref.getFamily().equals(target.getFamily()) && !ref.getFamily().isEmpty()) { + score += 15; } - if (ref.getSpecies() != null && ref.getSpecies().equals(target.getSpecies())) { + + if (ref.getOrders() != null && ref.getOrders().equals(target.getOrders()) && !ref.getOrders().isEmpty()) { score += 10; } - if (ref.getType() != null && ref.getType().equals(target.getType())) { - score += 2; + if (ref.getType() != null && ref.getType().equals(target.getType()) && !ObjectUtil.isEmpty(ref.getType()) ) { + score += 5; } - if (ref.getHabitat() != null && ref.getHabitat().equals(target.getHabitat())) { + if (ref.getHabitat() != null && ref.getHabitat().equals(target.getHabitat()) && !ObjectUtil.isEmpty(ref.getHabitat())) { + score += 5; + } + + if (ref.getHabitMigrat() != null && ref.getHabitMigrat().equals(target.getHabitMigrat()) && !ref.getHabitMigrat().isEmpty()) { + score += 5; + } + + if (ref.getFeedingHabit() != null && ref.getFeedingHabit().equals(target.getFeedingHabit()) && !ref.getFeedingHabit().isEmpty()) { score += 3; } - if (ref.getRare() != null && ref.getRare().equals(target.getRare())) { - score += 2; - } - - if (ref.getPtype() != null && ref.getPtype().equals(target.getPtype())) { - score += 2; - } - - if (ref.getResourceType() != null && ref.getResourceType().equals(target.getResourceType())) { - score += 2; - } - - if (ref.getHabitMigrat() != null && ref.getHabitMigrat().equals(target.getHabitMigrat())) { + if (ref.getSpawnCharact() != null && ref.getSpawnCharact().equals(target.getSpawnCharact()) && !ref.getSpawnCharact().isEmpty()) { score += 3; } - if (ref.getFeedingHabit() != null && ref.getFeedingHabit().equals(target.getFeedingHabit())) { + if (ref.getPtype() != null && ref.getPtype().equals(target.getPtype()) && !ObjectUtil.isEmpty(ref.getPtype())) { score += 2; } - if (ref.getSpawnCharact() != null && ref.getSpawnCharact().equals(target.getSpawnCharact())) { + if (ref.getResourceType() != null && ref.getResourceType().equals(target.getResourceType()) && !ObjectUtil.isEmpty(ref.getResourceType())) { + score += 2; + } + + if (ref.getRare() != null && ref.getRare().equals(target.getRare()) && !ObjectUtil.isEmpty(ref.getRare())) { score += 2; } diff --git a/backend/src/main/resources/application-devtw.yml b/backend/src/main/resources/application-devtw.yml index 34a784a..25aaddf 100644 --- a/backend/src/main/resources/application-devtw.yml +++ b/backend/src/main/resources/application-devtw.yml @@ -10,12 +10,12 @@ spring: druid: master: driverClassName: oracle.jdbc.OracleDriver - url: "${DB_MASTER_URL:jdbc:oracle:thin:@172.16.21.134:1521/SDLYZ}" + url: "${DB_MASTER_URL:jdbc:oracle:thin:@172.16.31.190:1521/SDLYZ}" username: "${DB_MASTER_USERNAME:QGC_REFA}" password: "${DB_MASTER_PASSWORD:Y4M4K1oCkL8U}" slave: driverClassName: oracle.jdbc.OracleDriver - url: "${DB_SLAVE_URL:jdbc:oracle:thin:@172.16.21.134:1521/SDLYZ}" + url: "${DB_SLAVE_URL:jdbc:oracle:thin:@172.16.31.190:1521/SDLYZ}" username: "${DB_SLAVE_USERNAME:QGC_REFA}" password: "${DB_SLAVE_PASSWORD:Y4M4K1oCkL8U}" diff --git a/backend/src/main/resources/application-prod.yml b/backend/src/main/resources/application-prod.yml index 8021243..dc2e84b 100644 --- a/backend/src/main/resources/application-prod.yml +++ b/backend/src/main/resources/application-prod.yml @@ -10,12 +10,12 @@ spring: druid: master: driverClassName: oracle.jdbc.OracleDriver - url: "${DB_MASTER_URL:jdbc:oracle:thin:@172.16.21.134:1521/SDLYZ}" + url: "${DB_MASTER_URL:jdbc:oracle:thin:@172.16.31.190:1521/SDLYZ}" username: "${DB_MASTER_USERNAME:QGC_REFA}" password: "${DB_MASTER_PASSWORD:Y4M4K1oCkL8U}" slave: driverClassName: oracle.jdbc.OracleDriver - url: "${DB_SLAVE_URL:jdbc:oracle:thin:@172.16.21.134:1521/SDLYZ}" + url: "${DB_SLAVE_URL:jdbc:oracle:thin:@172.16.31.190:1521/SDLYZ}" username: "${DB_SLAVE_USERNAME:QGC_REFA}" password: "${DB_SLAVE_PASSWORD:Y4M4K1oCkL8U}" diff --git a/backend/src/main/resources/application.yml b/backend/src/main/resources/application.yml index cfbf0b8..f3b5aa4 100644 --- a/backend/src/main/resources/application.yml +++ b/backend/src/main/resources/application.yml @@ -1,6 +1,6 @@ spring: profiles: - active: devtw + active: prod jasypt: encryptor: