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); 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() 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; } } 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; } 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);