雷达图兜底处理

This commit is contained in:
2026-01-11 21:37:16 +08:00
parent 756f428b68
commit 3f7d3d7243

View File

@@ -253,13 +253,15 @@ public class JobCollectionServiceImpl extends ServiceImpl<JobCollectionMapper,Jo
// 3. 薪资匹配(用户期望 <= 岗位最大薪资,且不低于最小太多) // 3. 薪资匹配(用户期望 <= 岗位最大薪资,且不低于最小太多)
Integer userMinSalary = parseSalary(user.getSalaryMin()); Integer userMinSalary = parseSalary(user.getSalaryMin());
if (userMinSalary != null && userMinSalary <= job.getMaxSalary()) { if (userMinSalary != null && job.getMaxSalary() != null && job.getMinSalary() != null) {
if (userMinSalary <= job.getMaxSalary()) {
if (userMinSalary >= job.getMinSalary()) { if (userMinSalary >= job.getMinSalary()) {
matchScore += 1; matchScore += 1;
} else if (userMinSalary >= job.getMinSalary() * 0.8) { } else if (userMinSalary >= job.getMinSalary() * 0.8) {
matchScore += 0.5; matchScore += 0.5;
} }
} }
}
// 4. 地点匹配 // 4. 地点匹配
if (user.getArea() != null && jobLocation != null) { if (user.getArea() != null && jobLocation != null) {
@@ -278,14 +280,18 @@ public class JobCollectionServiceImpl extends ServiceImpl<JobCollectionMapper,Jo
} }
// 6. 技能/岗位匹配(简化:期望岗位是否包含该岗位关键词) // 6. 技能/岗位匹配(简化:期望岗位是否包含该岗位关键词)
boolean jobMatch = user.getJobTitle() != null && String jobTitleStr = job.getJobTitle();
user.getJobTitle().stream().anyMatch(title -> title.contains(job.getJobTitle()) || job.getJobTitle().contains(title)); List<String> userJobTitles = user.getJobTitle();
boolean jobMatch = jobTitleStr != null && userJobTitles != null && !userJobTitles.isEmpty() &&
userJobTitles.stream().anyMatch(title -> title != null &&
(title.contains(jobTitleStr) || jobTitleStr.contains(title)));
if (jobMatch) { if (jobMatch) {
matchScore += 1; matchScore += 1;
} }
// 匹配度0-6 → 映射为 0-100 分 // 匹配度0-6 → 映射为 0-100 分兜底最低10分
int finalScore = (int) Math.round((matchScore / (double) totalFactors) * 100); int finalScore = (int) Math.round((matchScore / (double) totalFactors) * 100);
finalScore = Math.max(finalScore, 10); // 兜底最低10分
userScores.add(new UserCompetitiveness(user, finalScore)); userScores.add(new UserCompetitiveness(user, finalScore));
} }
@@ -295,12 +301,12 @@ public class JobCollectionServiceImpl extends ServiceImpl<JobCollectionMapper,Jo
// ================== 计算雷达图数据(取平均值)================== // ================== 计算雷达图数据(取平均值)==================
RadarChart radarChart = new RadarChart(); RadarChart radarChart = new RadarChart();
double avgAgeScore = userScores.stream().mapToInt(u -> getAgeScore(DateUtils.stringToDateWithYmd(u.getUser().getBirthDate(),DateUtils.YYYY_MM_DD))).average().orElse(0); double avgAgeScore = userScores.stream().mapToInt(u -> getAgeScore(DateUtils.stringToDateWithYmd(u.getUser().getBirthDate(),DateUtils.YYYY_MM_DD))).average().orElse(60);
double avgExperienceScore = userScores.stream().mapToInt(u -> getExperienceScore(u.getUser().getExperience(), job.getExperience(), experienceRank)).average().orElse(0); double avgExperienceScore = userScores.stream().mapToInt(u -> getExperienceScore(u.getUser().getExperience(), job.getExperience(), experienceRank)).average().orElse(60);
double avgEducationScore = userScores.stream().mapToInt(u -> getEducationScore(u.getUser().getEducation(), job.getEducation(), educationRank)).average().orElse(0); double avgEducationScore = userScores.stream().mapToInt(u -> getEducationScore(u.getUser().getEducation(), job.getEducation(), educationRank)).average().orElse(60);
double avgSkillScore = userScores.stream().mapToInt(u -> getSkillScore(u.getUser(), job)).average().orElse(0); double avgSkillScore = userScores.stream().mapToInt(u -> getSkillScore(u.getUser(), job)).average().orElse(60);
double avgSalaryScore = userScores.stream().mapToInt(u -> getSalaryScore(u.getUser(), job)).average().orElse(0); double avgSalaryScore = userScores.stream().mapToInt(u -> getSalaryScore(u.getUser(), job)).average().orElse(60);
double avgLocationScore = userScores.stream().mapToInt(u -> getLocationScore(u.getUser(), job)).average().orElse(0); double avgLocationScore = userScores.stream().mapToInt(u -> getLocationScore(u.getUser(), job)).average().orElse(60);
radarChart.setAge((int) avgAgeScore); radarChart.setAge((int) avgAgeScore);
radarChart.setExperience((int) avgExperienceScore); radarChart.setExperience((int) avgExperienceScore);
@@ -313,8 +319,8 @@ public class JobCollectionServiceImpl extends ServiceImpl<JobCollectionMapper,Jo
CompetitivenessResponse response = new CompetitivenessResponse(); CompetitivenessResponse response = new CompetitivenessResponse();
response.setTotalApplicants(Math.toIntExact(applyCount)); response.setTotalApplicants(Math.toIntExact(applyCount));
// Top 用户的匹配分 // Top 用户的匹配分(兜底处理)
int topMatchScore = userScores.get(0).getScore(); int topMatchScore = userScores.isEmpty() ? 10 : userScores.get(0).getScore();
response.setMatchScore(topMatchScore); response.setMatchScore(topMatchScore);
// 排名Top1 // 排名Top1
@@ -367,7 +373,8 @@ public class JobCollectionServiceImpl extends ServiceImpl<JobCollectionMapper,Jo
private int getLocationScore(AppUser user, Job job) { private int getLocationScore(AppUser user, Job job) {
String area = user.getArea(); String area = user.getArea();
String loc = job.getJobLocation(); String loc = job.getJobLocation();
if (area != null && (area.contains(loc) || loc.contains(area))) return 90; if (area == null || loc == null) return 60; // 兜底
if (area.contains(loc) || loc.contains(area)) return 90;
return 60; return 60;
} }
private int getSkillScore(AppUser user, Job job) { private int getSkillScore(AppUser user, Job job) {