From 0d8cc04b812cfa0f15bf8ba12b5fdcbe411f90cd Mon Sep 17 00:00:00 2001 From: HelenHuang <LinHuang@pollex.com.tw> Date: 星期四, 10 二月 2022 16:07:02 +0800 Subject: [PATCH] Merge branch 'Phase3' of https://dev.pollex.com.tw:8443/r/pcalife/PAM into Phase3 --- pamapi/src/main/java/com/pollex/pam/service/ConsultantQuerySpec.java | 31 --------------- 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(+), 35 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 9613973..8e14d66 100644 --- a/pamapi/src/main/java/com/pollex/pam/service/ConsultantQuerySpec.java +++ b/pamapi/src/main/java/com/pollex/pam/service/ConsultantQuerySpec.java @@ -65,38 +65,9 @@ set.add(criteriaBuilder.equal(root.get("gender"), param.getGender())); } - if(Objects.nonNull(param.getAvgScore()) && param.getAvgScore().intValue() != 0) { - set.add(criteriaBuilder.greaterThanOrEqualTo(root.get("avgScore"), param.getAvgScore().intValue())); - } - - if(StringUtils.isNotEmpty(param.getSeniority()) && !StringUtils.equals(UNLIMITED, param.getSeniority())) { - if(YOUNG.equals(param.getSeniority())) { - set.add(criteriaBuilder.lessThanOrEqualTo(root.get("seniorityYear"), 5)); - } - else if(SENIOR.equals(param.getSeniority())) { - set.add(criteriaBuilder.greaterThan(root.get("seniorityYear"), 5)); - } - } - if(StringUtils.isNotEmpty(param.getArea())) { - Predicate predicate1 = criteriaBuilder.like(root.get("serveArea"), "%" + param.getArea() + "%"); - Predicate predicate2 = criteriaBuilder.like(root.get("serveArea"), "%��%"); - - Predicate finalPredicate = criteriaBuilder.or(predicate1, predicate2); - set.add(finalPredicate); + set.add(criteriaBuilder.like(root.get("serveArea"), "%" + param.getArea() + "%")); } - - List<String> allRequirements = Objects.nonNull(param.getRequirements()) ? param.getRequirements() : new ArrayList<>(); - if(StringUtils.isNotEmpty(param.getOtherPopularTags())) { - allRequirements.add(param.getOtherRequirement()); - } - allRequirements.forEach(requirement -> set.add(criteriaBuilder.like(root.get("expertise"), "%" + requirement + "%"))); - - List<String> allPopularTags = Objects.nonNull(param.getPopularTags()) ? param.getPopularTags() : new ArrayList<>(); - if(StringUtils.isNotEmpty(param.getOtherPopularTags())) { - allPopularTags.add(param.getOtherPopularTags()); - } - allPopularTags.forEach(popularTag -> set.add(criteriaBuilder.like(root.get("concept"), "%" + popularTag + "%"))); Predicate[] predicates = new Predicate[set.size()]; predicates = set.toArray(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