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/ConsultantService.java | 85 ++++++++++++++++++++++++++++++++++-------- 1 files changed, 68 insertions(+), 17 deletions(-) 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 d78a39f..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 @@ -73,22 +73,22 @@ @Autowired ApplicationProperties applicationProperty; - + @Autowired SendMsgService sendMsgService; - + @Autowired SpringTemplateEngine springTemplateEngine; - + @Autowired ApplicationProperties applicationProperties; - + @Autowired ConsultantService consultantService; - + @Autowired SatisfactionRepository satisfactionRepository; - + @Autowired PersonalNotificationService personalNotificationService; @@ -108,7 +108,7 @@ dto, appointmentService.findAvailableByAgentNoAndCustomerId(consultant.getAgentNo(), customerId) ); - + setFavoriteConsultantUpdatedTime(relation, dto); return dto; @@ -140,8 +140,7 @@ if (!appointments.isEmpty()) { AppointmentCustomerView latestAvailableAppointment = appointments.get(0); ContactStatusEnum latestStatus = latestAvailableAppointment.getCommunicateStatus(); - if( latestStatus != ContactStatusEnum.DONE - || latestStatus != ContactStatusEnum.CLOSED) + if(latestStatus != ContactStatusEnum.DONE && latestStatus != ContactStatusEnum.CLOSED) customerFavoriteConsultantDTO.setContactStatus(latestStatus); else customerFavoriteConsultantDTO.setContactStatus(PICKED); @@ -160,8 +159,60 @@ 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) { @@ -271,19 +322,19 @@ public void sendSatisfactionToClient(Appointment appointment) { String subject = "皛踵�漲憛怠神�"; - + if(StringUtils.hasText(appointment.getEmail())) { String content = genSendSatisfactionEmailContent(appointment); sendMsgService.sendMsgByEmail(appointment.getEmail(), subject, content, true); - + }if(StringUtils.hasText(appointment.getPhone())) { String content = genSendSatisfactionSMSContent(appointment); sendMsgService.sendMsgBySMS(appointment.getPhone(), content); } - + personalNotificationService.createSendSatisfactionToClientToCustomer(appointment); } - + private String genSendSatisfactionSMSContent(Appointment appointment) { String agentNo = appointment.getAgentNo(); Consultant consultant = consultantService.findByAgentNo(agentNo); @@ -305,7 +356,7 @@ public String getSendSatisfactionToClientUrl(Long appointmentId) { return applicationProperties.getFrontEndDomain() + "/?appointmentId=" + appointmentId; } - + public void setConsultantAvgScore(Satisfaction satisfaction) { float avgScore = getAgentAvgScore(satisfaction.getAgentNo()); Consultant consultant = consultantRepository.findOneByAgentNo(satisfaction.getAgentNo()) @@ -317,7 +368,7 @@ public float getAgentAvgScore(String agentNo) { Float avgScore = satisfactionRepository.getAgentScoreAvg(agentNo); if(avgScore==null)return 0; - BigDecimal bigDecimal = new BigDecimal(avgScore); + BigDecimal bigDecimal = new BigDecimal(avgScore); return avgScore = bigDecimal.setScale(1,BigDecimal.ROUND_HALF_UP).floatValue(); } } -- Gitblit v1.8.0