From 21d79d2a70b095545477472438d27a8827ee80b8 Mon Sep 17 00:00:00 2001 From: wayne <wayne8692wayne8692@gmail.com> Date: 星期四, 10 二月 2022 14:01:00 +0800 Subject: [PATCH] [update] 嚴選搜尋新增匹配度分數 --- pamapi/src/main/java/com/pollex/pam/service/ConsultantQuerySpec.java | 2 pamapi/src/main/java/com/pollex/pam/service/mapper/ConsultantMapper.java | 1 pamapi/src/main/java/com/pollex/pam/service/ConsultantService.java | 56 +++++++++++++++++++++++++++- pamapi/src/main/java/com/pollex/pam/service/dto/ConsultantDTO.java | 9 ++++ pamapi/src/main/java/com/pollex/pam/service/dto/StrictQueryConsultantParam.java | 6 +- 5 files changed, 68 insertions(+), 6 deletions(-) diff --git a/pamapi/src/main/java/com/pollex/pam/service/ConsultantQuerySpec.java b/pamapi/src/main/java/com/pollex/pam/service/ConsultantQuerySpec.java index f391f37..8e14d66 100644 --- a/pamapi/src/main/java/com/pollex/pam/service/ConsultantQuerySpec.java +++ b/pamapi/src/main/java/com/pollex/pam/service/ConsultantQuerySpec.java @@ -68,7 +68,7 @@ if(StringUtils.isNotEmpty(param.getArea())) { set.add(criteriaBuilder.like(root.get("serveArea"), "%" + param.getArea() + "%")); } - + Predicate[] predicates = new Predicate[set.size()]; predicates = set.toArray(predicates); return criteriaBuilder.and(predicates); diff --git a/pamapi/src/main/java/com/pollex/pam/service/ConsultantService.java b/pamapi/src/main/java/com/pollex/pam/service/ConsultantService.java index 0179b54..6044a45 100644 --- a/pamapi/src/main/java/com/pollex/pam/service/ConsultantService.java +++ b/pamapi/src/main/java/com/pollex/pam/service/ConsultantService.java @@ -30,7 +30,6 @@ import java.io.File; import java.io.FileInputStream; import java.io.FileNotFoundException; -import java.io.IOException; import java.io.InputStream; import java.math.BigDecimal; import java.time.Instant; @@ -39,6 +38,7 @@ import java.util.Objects; import java.util.stream.Collectors; +import static com.pollex.pam.consts.SeniorityQueryConst.*; import static com.pollex.pam.enums.ContactStatusEnum.*; @Service @@ -159,10 +159,62 @@ public List<ConsultantDTO> strictQueryConsultant(StrictQueryConsultantParam param) { return consultantRepository.findAll(ConsultantQuerySpec.getStrictQuerySpec(param)) .stream() - .map(consultantMapper::toDto) + .map(consultant -> { + int suitabilityScore = getStrictQuerySuitabilityScore(param, consultant); + + ConsultantDTO dto = consultantMapper.toDto(consultant); + dto.setSuitability(suitabilityScore); + + return dto; + }) .collect(Collectors.toList()); } + private int getStrictQuerySuitabilityScore(StrictQueryConsultantParam param, Consultant consultant) { + Float queryAvgScore = param.getAvgScore(); + String querySeniority = param.getSeniority(); + List<String> queryRequirements = param.getRequirements(); + + int score = 0; + if(isConsultantGreaterThanScore(queryAvgScore, consultant.getAvgScore())) { + score += 30; + } + + if(isConsultantInSeniority(querySeniority, consultant.getSeniorityYear())) { + score += 20; + } + + if(isAllRequirementsIncludeConsultant(queryRequirements, consultant.getExpertise())) { + score += 50; + } + + return score; + } + + private boolean isAllRequirementsIncludeConsultant(List<String> queryRequirements, String consultantExpertise) { + return queryRequirements + .stream() + .allMatch(queryRequirement -> consultantExpertise.matches(".*"+queryRequirement+".*")); + } + + private boolean isConsultantInSeniority(String querySeniority, Long consultantSeniorityYear) { + switch (querySeniority == null ? "" : querySeniority) { + case YOUNG: + return consultantSeniorityYear < 5; + case SENIOR: + return consultantSeniorityYear > 5; + case UNLIMITED: + case "": + return true; + default: + return false; + } + } + + private boolean isConsultantGreaterThanScore(Float queryAvgScore, Float consultantAvgScore) { + return Objects.isNull(queryAvgScore) || queryAvgScore < consultantAvgScore; + } + public List<ConsultantDTO> fastQueryConsultant(FastQueryConsultantParam param) { return consultantRepository.findAll(ConsultantQuerySpec.getFastQuerySpec(param)) .stream() diff --git a/pamapi/src/main/java/com/pollex/pam/service/dto/ConsultantDTO.java b/pamapi/src/main/java/com/pollex/pam/service/dto/ConsultantDTO.java index c358d53..f847769 100644 --- a/pamapi/src/main/java/com/pollex/pam/service/dto/ConsultantDTO.java +++ b/pamapi/src/main/java/com/pollex/pam/service/dto/ConsultantDTO.java @@ -20,6 +20,7 @@ private Instant updateTime; private String role; private String seniority; + private int suitability; public boolean isNewConsultant() { if(updateTime != null){ @@ -104,4 +105,12 @@ public void setNewConsultant(boolean newConsultant) { this.newConsultant = newConsultant; } + + public int getSuitability() { + return suitability; + } + + public void setSuitability(int suitability) { + this.suitability = suitability; + } } diff --git a/pamapi/src/main/java/com/pollex/pam/service/dto/StrictQueryConsultantParam.java b/pamapi/src/main/java/com/pollex/pam/service/dto/StrictQueryConsultantParam.java index a62c19d..7a7afcf 100644 --- a/pamapi/src/main/java/com/pollex/pam/service/dto/StrictQueryConsultantParam.java +++ b/pamapi/src/main/java/com/pollex/pam/service/dto/StrictQueryConsultantParam.java @@ -7,7 +7,7 @@ public class StrictQueryConsultantParam { private GenderEnum gender; - private Number avgScore; + private Float avgScore; private String status; private String area; private List<String> requirements; @@ -24,11 +24,11 @@ this.gender = gender; } - public Number getAvgScore() { + public Float getAvgScore() { return avgScore; } - public void setAvgScore(Number avgScore) { + public void setAvgScore(Float avgScore) { this.avgScore = avgScore; } diff --git a/pamapi/src/main/java/com/pollex/pam/service/mapper/ConsultantMapper.java b/pamapi/src/main/java/com/pollex/pam/service/mapper/ConsultantMapper.java index 76b779f..a04507a 100644 --- a/pamapi/src/main/java/com/pollex/pam/service/mapper/ConsultantMapper.java +++ b/pamapi/src/main/java/com/pollex/pam/service/mapper/ConsultantMapper.java @@ -42,6 +42,7 @@ consultantDTO.setImg(source.getPhotoPath()); consultantDTO.setRole(source.getRole()); + consultantDTO.setSuitability(0); consultantDTO.setContactStatus(null); consultantDTO.setUpdateTime(null); // consultantDTO.setLatestAppointmentId(null); -- Gitblit v1.8.0