diff --git a/backend/src/main/java/com/yfd/platform/env/controller/SdFishDictoryBController.java b/backend/src/main/java/com/yfd/platform/env/controller/SdFishDictoryBController.java index 25d4586..d7c6ee7 100644 --- a/backend/src/main/java/com/yfd/platform/env/controller/SdFishDictoryBController.java +++ b/backend/src/main/java/com/yfd/platform/env/controller/SdFishDictoryBController.java @@ -1,6 +1,7 @@ package com.yfd.platform.env.controller; import cn.hutool.core.util.StrUtil; +import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; import com.baomidou.mybatisplus.extension.plugins.pagination.Page; import com.yfd.platform.annotation.Log; import com.yfd.platform.common.DataSourceRequest; @@ -55,8 +56,8 @@ public class SdFishDictoryBController { @Operation(summary = "根据名称查询所有鱼类字典") public ResponseResult listByName(@RequestParam(required = false) String name) { return ResponseResult.successData(sdFishDictoryBService.list( - new com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper() - .eq(StrUtil.isNotBlank(name), SdFishDictoryB::getName, name) + new LambdaQueryWrapper() + .eq(StrUtil.isNotBlank(name), SdFishDictoryB::getName, name).select(SdFishDictoryB::getId, SdFishDictoryB::getName, SdFishDictoryB::getAlias) )); } @@ -89,4 +90,12 @@ public class SdFishDictoryBController { boolean result = sdFishDictoryBService.deleteById(id); return result ? ResponseResult.success("删除成功") : ResponseResult.error("删除失败"); } + + @GetMapping("/similar") + @Operation(summary = "查询相似鱼类列表") + public ResponseResult findSimilarFish( + @RequestParam String name, + @RequestParam(required = false, defaultValue = "10") Integer limit) { + return ResponseResult.successData(sdFishDictoryBService.findSimilarFish(name, limit)); + } } \ No newline at end of file diff --git a/backend/src/main/java/com/yfd/platform/env/service/ISdFishDictoryBService.java b/backend/src/main/java/com/yfd/platform/env/service/ISdFishDictoryBService.java index 05e03b8..0080982 100644 --- a/backend/src/main/java/com/yfd/platform/env/service/ISdFishDictoryBService.java +++ b/backend/src/main/java/com/yfd/platform/env/service/ISdFishDictoryBService.java @@ -4,6 +4,8 @@ import com.baomidou.mybatisplus.extension.plugins.pagination.Page; import com.baomidou.mybatisplus.extension.service.IService; import com.yfd.platform.env.domain.SdFishDictoryB; +import java.util.List; + public interface ISdFishDictoryBService extends IService { Page selectPage(String name, String code, Integer type, Integer rare, Page page); @@ -15,4 +17,6 @@ public interface ISdFishDictoryBService extends IService { boolean deleteById(String id); SdFishDictoryB getById(String id); + + List findSimilarFish(String name, Integer limit); } \ No newline at end of file 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 4a118c0..db00ef3 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 @@ -9,6 +9,9 @@ import com.yfd.platform.env.service.ISdFishDictoryBService; import org.springframework.stereotype.Service; import org.springframework.util.StringUtils; +import java.util.*; +import java.util.stream.Collectors; + @Service public class SdFishDictoryBServiceImpl extends ServiceImpl implements ISdFishDictoryBService { @@ -62,4 +65,116 @@ public class SdFishDictoryBServiceImpl extends ServiceImpl findSimilarFish(String name, Integer limit) { + if (!StringUtils.hasText(name)) { + return Collections.emptyList(); + } + + String searchName = name.trim(); + LambdaQueryWrapper wrapper = new LambdaQueryWrapper<>(); + wrapper.eq(SdFishDictoryB::getIsDeleted, 0); + List allFish = list(wrapper); + + SdFishDictoryB referenceFish = 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 (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) + .collect(Collectors.toList()); + } + + 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) + .collect(Collectors.toList()); + } + + private int calculateSimilarity(SdFishDictoryB ref, SdFishDictoryB target) { + int score = 0; + + if (ref.getOrders() != null && ref.getOrders().equals(target.getOrders())) { + score += 3; + } + if (ref.getFamily() != null && ref.getFamily().equals(target.getFamily())) { + score += 5; + } + if (ref.getGenus() != null && ref.getGenus().equals(target.getGenus())) { + score += 8; + } + if (ref.getSpecies() != null && ref.getSpecies().equals(target.getSpecies())) { + score += 10; + } + + if (ref.getType() != null && ref.getType().equals(target.getType())) { + score += 2; + } + + if (ref.getHabitat() != null && ref.getHabitat().equals(target.getHabitat())) { + 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())) { + score += 3; + } + + if (ref.getFeedingHabit() != null && ref.getFeedingHabit().equals(target.getFeedingHabit())) { + score += 2; + } + + if (ref.getSpawnCharact() != null && ref.getSpawnCharact().equals(target.getSpawnCharact())) { + score += 2; + } + + return score; + } } \ No newline at end of file diff --git a/backend/src/main/java/com/yfd/platform/system/controller/SmsVerifyCodeController.java b/backend/src/main/java/com/yfd/platform/system/controller/SmsVerifyCodeController.java index 774df19..cefe7c8 100644 --- a/backend/src/main/java/com/yfd/platform/system/controller/SmsVerifyCodeController.java +++ b/backend/src/main/java/com/yfd/platform/system/controller/SmsVerifyCodeController.java @@ -5,6 +5,7 @@ import cn.hutool.jwt.JWTUtil; import com.yfd.platform.config.ResponseResult; import com.yfd.platform.config.WebConfig; import com.yfd.platform.system.domain.*; +import com.yfd.platform.system.mapper.SysMenuMapper; import com.yfd.platform.system.service.ISmsVerifyCodeService; import com.yfd.platform.system.service.ISysLogService; import com.yfd.platform.system.service.IUserService; @@ -47,6 +48,9 @@ public class SmsVerifyCodeController { @Resource private ISysLogService sysLogService; + @Resource + private SysMenuMapper sysMenuMapper; + @Value("${rsa.private_key}") private String privateKey; @@ -150,6 +154,8 @@ public class SmsVerifyCodeController { user.setOrgid("e90063ced25e3d469860e88d920c082f"); user.setUsertype(1); user.setUsername(smsVerifyCodeRequest.getUsername()); + user.setGroupCode(smsVerifyCodeRequest.getGroupCode()); + user.setCompanyCode(smsVerifyCodeRequest.getCompanyCode()); boolean success = userService.save(user); // 给注册用户加上默认权限 this.addDefaultRole(smsVerifyCodeRequest); @@ -162,12 +168,9 @@ public class SmsVerifyCodeController { private boolean addDefaultRole(SmsVerifyCodeRequest smsVerifyCodeRequest) { String stationCode = smsVerifyCodeRequest.getStationCode(); - String companyCode = smsVerifyCodeRequest.getCompanyCode(); - String groupCode = smsVerifyCodeRequest.getGroupCode(); String hbrvcdCode = smsVerifyCodeRequest.getHbrvcdCode(); - List roleIds=new ArrayList<>(); - roleIds.add("c13481a486c9ee559cf305284df4d207"); - roleIds.add("c13481a486c9ee559cf305284df4d207"); + + return true; } @@ -277,7 +280,10 @@ public class SmsVerifyCodeController { LoginUser loginUser = new LoginUser(); loginUser.setUser(user); loginUser.setUsername(user.getUsername()); - + //Todo 根据用户查询权限信息 添加到LoginUser中 + List permissions = + sysMenuMapper.selectPermsByUserId(user.getId()); + loginUser.setPermissions( permissions); HttpServletRequest request = RequestHolder.getHttpServletRequest(); SysLog sysLog = new SysLog(); sysLog.setUsercode(user.getUsername()); diff --git a/backend/src/main/java/com/yfd/platform/system/domain/LoginUser.java b/backend/src/main/java/com/yfd/platform/system/domain/LoginUser.java index 1115c79..baf4258 100644 --- a/backend/src/main/java/com/yfd/platform/system/domain/LoginUser.java +++ b/backend/src/main/java/com/yfd/platform/system/domain/LoginUser.java @@ -24,9 +24,15 @@ public class LoginUser implements UserDetails { private List permissions=new ArrayList<>(); + /** + * 自定义构造函数(如果需要特殊逻辑) + */ public LoginUser(SysUser user, List permissions) { this.user = user; - this.permissions = permissions; + // 4. 增加非空判断,确保 permissions 永远不为 null + if (permissions != null) { + this.permissions = permissions; + } } @JSONField(serialize = false) diff --git a/backend/src/main/java/com/yfd/platform/system/domain/SysUser.java b/backend/src/main/java/com/yfd/platform/system/domain/SysUser.java index bdf5fb3..6d771f8 100644 --- a/backend/src/main/java/com/yfd/platform/system/domain/SysUser.java +++ b/backend/src/main/java/com/yfd/platform/system/domain/SysUser.java @@ -146,6 +146,15 @@ public class SysUser implements Serializable { */ private Date regTime; + /** + * 集团编号 + */ + private String groupCode; + /** + * 公司编号 + */ + private String companyCode; + @TableField(exist = false) List roles; }