package com.pollex.pam.service.mapper; import com.pollex.pam.domain.Appointment; import com.pollex.pam.domain.Consultant; import com.pollex.pam.service.AppointmentService; import com.pollex.pam.service.dto.ConsultantDTO; import com.pollex.pam.service.dto.ConsultantDetailDTO; import com.pollex.pam.service.dto.CustomerFavoriteConsultantDTO; import org.apache.commons.lang3.StringUtils; import org.springframework.beans.BeanUtils; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Service; import java.time.Instant; import java.time.ZonedDateTime; import java.util.*; import java.util.stream.Collectors; @Service public class ConsultantMapper { @Autowired AppointmentService appointmentService; private static final Character SPLIT_MASK = ','; public CustomerFavoriteConsultantDTO toCustomerFavoriteConsultantDto(Consultant source) { CustomerFavoriteConsultantDTO consultantDTO = new CustomerFavoriteConsultantDTO(); consultantDTO.setAgentNo(source.getAgentNo()); consultantDTO.setName(source.getName()); consultantDTO.setAvgScore(source.getAvgScore()); consultantDTO.setSeniority(source.getSeniorityDTOString()); consultantDTO.setExpertise(splitStringWithChar(source.getExpertise())); consultantDTO.setImg(source.getPhotoPath()); consultantDTO.setRole(source.getRole()); consultantDTO.setContactStatus(null); consultantDTO.setUpdateTime(null); return consultantDTO; } public ConsultantDTO toDto(Consultant source) { ConsultantDTO consultantDTO = new ConsultantDTO(); consultantDTO.setAgentNo(source.getAgentNo()); consultantDTO.setName(source.getName()); consultantDTO.setAvgScore(source.getAvgScore()); consultantDTO.setSeniority(source.getSeniorityDTOString()); consultantDTO.setExpertise(splitStringWithChar(source.getExpertise())); consultantDTO.setImg(source.getPhotoPath()); consultantDTO.setRole(source.getRole()); consultantDTO.setSuitability(0); consultantDTO.setContactStatus(null); consultantDTO.setUpdateTime(null); // consultantDTO.setLatestAppointmentId(null); return consultantDTO; } public ConsultantDetailDTO toDetailDto(Consultant source) { ConsultantDetailDTO consultantDetailDTO = new ConsultantDetailDTO(); BeanUtils.copyProperties(source, consultantDetailDTO); consultantDetailDTO.setName(source.getName()); consultantDetailDTO.setAgentNo(source.getAgentNo()); consultantDetailDTO.setRole(source.getRole()); consultantDetailDTO.setAvgScore(source.getAvgScore()); consultantDetailDTO.setTitle(source.getTitle()); consultantDetailDTO.setPhoneNumber(source.getPhoneNumber()); consultantDetailDTO.setServeArea(source.getServeArea()); consultantDetailDTO.setCompanyAddress(source.getCompanyAddress()); consultantDetailDTO.setSeniority(source.getSeniorityDTOString()); consultantDetailDTO.setConcept(source.getConcept()); consultantDetailDTO.setAwards(source.getAward()); consultantDetailDTO.setImg(source.getPhotoPath()); consultantDetailDTO.setExpertise(splitStringWithChar(source.getExpertise())); consultantDetailDTO.setExperiences(source.getExperience()); List appointments = appointmentService.findByAgentNo(source.getAgentNo()); long allAppointmentCount = appointments.size(); long nearlyMonthAppointmentCount = appointments .stream() .filter(appointment -> { Instant oneMonthAgo = ZonedDateTime.now().minusMonths(1).toInstant(); return appointment.getAppointmentDate().isAfter(oneMonthAgo); }).count(); consultantDetailDTO.setAllAppointmentCount(allAppointmentCount); consultantDetailDTO.setNearlyMonthAppointmentCount(nearlyMonthAppointmentCount); return consultantDetailDTO; } private List splitStringWithChar(String source) { return Arrays.stream(StringUtils.split(source, SPLIT_MASK)) .map(String::trim) .collect(Collectors.toList()); } }