pamapi/src/main/java/com/pollex/pam/domain/Consultant.java
@@ -17,7 +17,7 @@ @SequenceGenerator(name = "sequenceGenerator") private Long id; @Column(name = "agent_no") @Column(name = "agent_no", unique = true) private String agentNo; @Column(name = "name") pamapi/src/main/java/com/pollex/pam/domain/CustomFavoriteConsultant.java
比對新檔案 @@ -0,0 +1,71 @@ package com.pollex.pam.domain; import com.pollex.pam.enums.ContactStatusEnum; import javax.persistence.*; import java.io.Serializable; @Entity @Table(name = "custom_favorite_consultant") public class CustomFavoriteConsultant extends AbstractAuditingEntity implements Serializable { private static final long serialVersionUID = 1L; @Id @GeneratedValue(strategy = GenerationType.SEQUENCE, generator = "sequenceGenerator") @SequenceGenerator(name = "sequenceGenerator") private Long id; @ManyToOne @JoinColumn(name = "consultant_id") private Consultant consultant; @Column(name = "custom_id") private Long customId; @Enumerated(EnumType.STRING) @Column(name = "contact_status") private ContactStatusEnum contactStatus; public Long getId() { return id; } public void setId(Long id) { this.id = id; } public Consultant getConsultant() { return consultant; } public void setConsultant(Consultant consultant) { this.consultant = consultant; } public Long getCustomId() { return customId; } public void setCustomId(Long customId) { this.customId = customId; } public ContactStatusEnum getContactStatus() { return contactStatus; } public void setContactStatus(ContactStatusEnum contactStatus) { this.contactStatus = contactStatus; } @Override public String toString() { return "CustomFavoriteConsultant{" + "id=" + id + ", consultant=" + consultant + ", customId=" + customId + ", contactStatus='" + contactStatus + '\'' + '}'; } } pamapi/src/main/java/com/pollex/pam/repository/ConsultantRepository.java
@@ -2,13 +2,16 @@ import com.pollex.pam.domain.Consultant; import org.springframework.data.jpa.repository.JpaRepository; import org.springframework.data.jpa.repository.JpaSpecificationExecutor; import org.springframework.stereotype.Repository; import java.util.List; import java.util.Optional; @Repository public interface ConsultantRepository extends JpaRepository<Consultant, Long> { public interface ConsultantRepository extends JpaRepository<Consultant, Long>, JpaSpecificationExecutor<Consultant> { Optional<Consultant> findFirstByAgentNo(String agentNo); List<Consultant> findAllByRecommendIsTrue(); List<Consultant> findAllByAgentNoIn(List<String> agentNoList); } pamapi/src/main/java/com/pollex/pam/repository/CustomFavoriteConsultantRepository.java
比對新檔案 @@ -0,0 +1,12 @@ package com.pollex.pam.repository; import com.pollex.pam.domain.CustomFavoriteConsultant; import org.springframework.data.jpa.repository.JpaRepository; import org.springframework.stereotype.Repository; import java.util.List; @Repository public interface CustomFavoriteConsultantRepository extends JpaRepository<CustomFavoriteConsultant, Long> { List<CustomFavoriteConsultant> findAllByCustomId(Long id); } pamapi/src/main/java/com/pollex/pam/service/ConsultantQuerySpec.java
比對新檔案 @@ -0,0 +1,59 @@ package com.pollex.pam.service; import com.pollex.pam.domain.Consultant; import com.pollex.pam.service.dto.FastQueryConsultantParam; import org.apache.commons.lang3.StringUtils; import org.springframework.data.jpa.domain.Specification; import javax.persistence.criteria.CriteriaBuilder; import javax.persistence.criteria.CriteriaQuery; import javax.persistence.criteria.Predicate; import javax.persistence.criteria.Root; import java.util.HashSet; import java.util.Set; public class ConsultantQuerySpec { private ConsultantQuerySpec() { } public static Specification<Consultant> getFastQuerySpec(FastQueryConsultantParam param) { return new Specification<Consultant>() { @SuppressWarnings("FieldNameHidesFieldInSuperclass") private static final long serialVersionUID = 6644524130903161741L; @Override public Predicate toPredicate(Root<Consultant> root, CriteriaQuery<?> query, CriteriaBuilder criteriaBuilder) { Set<Predicate> set = new HashSet<>(); if(!StringUtils.isEmpty(param.getCommunicationStyle())) { set.add(criteriaBuilder.like(root.get("concept"), "%" + param.getCommunicationStyle())); } set.add(criteriaBuilder.equal(root.get("gender"), param.getGender())); set.add(criteriaBuilder.between(root.get("avgScore"), param.getAvgScore().intValue() - 1, param.getAvgScore().intValue() + 1)); Predicate[] predicates = new Predicate[set.size()]; predicates = set.toArray(predicates); return criteriaBuilder.or(predicates); } }; } // public static Specification<Consultant> getStrictQuerySpec(StrictQueryConsultantParam param) { // return new Specification<Consultant>() { // @Override // public Predicate toPredicate(Root<Consultant> root, CriteriaQuery<?> query, CriteriaBuilder criteriaBuilder) { // Set<Predicate> set = new HashSet<>(); // // set.add(criteriaBuilder.equal(root.get("gender"), param.getGender())); // set.add(criteriaBuilder.between(root.get("avgScore"), param.getAvgScore().intValue() - 1, param.getAvgScore().intValue() + 1)); // set.add(criteriaBuilder.like(root.get("serve_area"),"%"+param.getArea()+"%")); // set.add(root.get("").in(param.getRequirements())) // // Predicate[] predicates = new Predicate[set.size()]; // predicates = set.toArray(predicates); // return criteriaBuilder.or(predicates); // } // }; // } } pamapi/src/main/java/com/pollex/pam/service/ConsultantService.java
@@ -1,49 +1,89 @@ package com.pollex.pam.service; import com.pollex.pam.domain.Consultant; import com.pollex.pam.domain.CustomFavoriteConsultant; import com.pollex.pam.domain.User; import com.pollex.pam.enums.ContactStatusEnum; import com.pollex.pam.repository.ConsultantRepository; import com.pollex.pam.repository.CustomFavoriteConsultantRepository; import com.pollex.pam.service.dto.*; import com.pollex.pam.service.mapper.ConsultantMapper; import com.pollex.pam.web.rest.errors.ConsultantNotFoundException; import com.pollex.pam.web.rest.errors.NotLoginException; import org.springframework.stereotype.Service; import org.springframework.transaction.annotation.Transactional; import java.util.Collections; import java.util.List; import java.util.stream.Collectors; @Service public class ConsultantService { private final ConsultantRepository consultantRepository; private final CustomFavoriteConsultantRepository customFavoriteConsultantRepository; private final ConsultantMapper consultantMapper; private final UserService userService; public ConsultantService(ConsultantRepository consultantRepository, ConsultantMapper consultantMapper) { public ConsultantService( ConsultantRepository consultantRepository, CustomFavoriteConsultantRepository customFavoriteConsultantRepository, ConsultantMapper consultantMapper, UserService userService ) { this.consultantRepository = consultantRepository; this.customFavoriteConsultantRepository = customFavoriteConsultantRepository; this.consultantMapper = consultantMapper; this.userService = userService; } public List<ConsultantDTO> getMyConsultantList() { return Collections.emptyList(); User user = userService.getUserWithAuthorities().orElseThrow(NotLoginException::new); return customFavoriteConsultantRepository.findAllByCustomId(user.getId()) .stream() .map(consultantMapper::toDto) .collect(Collectors.toList()); } public List<ConsultantDTO> getRecommendConsultantList() { List<Consultant> recommendConsultantList = consultantRepository.findAllByRecommendIsTrue(); return consultantMapper.toDto(recommendConsultantList); } public void addConsultantToOwnList(AddConsultantParam param) { List<String> agentNoList = param.getAgentNoList(); return consultantRepository.findAllByRecommendIsTrue() .stream() .map(consultantMapper::toDto) .collect(Collectors.toList()); } public List<ConsultantDTO> strictQueryConsultant(StrictQueryConsultantParam param) { return Collections.emptyList(); } public List<ConsultantDTO> fastQueryConsultant(FastQueryConsultantParam param) { return Collections.emptyList(); return consultantRepository.findAll(ConsultantQuerySpec.getFastQuerySpec(param)) .stream() .map(consultantMapper::toDto) .collect(Collectors.toList()); } public ConsultantDetailDTO getConsultantDetail(String agentNo) { Consultant consultant = consultantRepository.findFirstByAgentNo(agentNo).orElseThrow(ConsultantNotFoundException::new); return consultantMapper.toDetailDto(consultant); } @Transactional public void addConsultantToCustomList(AddConsultantParam param) { List<String> agentNoList = param.getAgentNoList(); List<Consultant> consultants = consultantRepository.findAllByAgentNoIn(agentNoList); User user = userService.getUserWithAuthorities().orElseThrow(NotLoginException::new); consultants.forEach(consultant -> { CustomFavoriteConsultant customFavoriteConsultant = new CustomFavoriteConsultant(); customFavoriteConsultant.setConsultant(consultant); customFavoriteConsultant.setCustomId(user.getId()); customFavoriteConsultant.setContactStatus(ContactStatusEnum.PICKED); customFavoriteConsultantRepository.save(customFavoriteConsultant); }); } } pamapi/src/main/java/com/pollex/pam/service/dto/ConsultantDTO.java
@@ -4,6 +4,7 @@ import com.pollex.pam.enums.ContactStatusEnum; import java.time.Instant; import java.time.temporal.ChronoUnit; import java.util.List; public class ConsultantDTO { @@ -20,11 +21,11 @@ private String seniority; public boolean isNewConsultant() { return newConsultant; } public void setNewConsultant(boolean newConsultant) { this.newConsultant = newConsultant; if(updateTime != null){ Instant nowTimestamp = Instant.now(); return ChronoUnit.DAYS.between(updateTime, nowTimestamp) < 3; } return false; } public String getAgentNo() { pamapi/src/main/java/com/pollex/pam/service/mapper/ConsultantMapper.java
@@ -1,6 +1,7 @@ package com.pollex.pam.service.mapper; import com.pollex.pam.domain.Consultant; import com.pollex.pam.domain.CustomFavoriteConsultant; import com.pollex.pam.enums.ContactStatusEnum; import com.pollex.pam.service.dto.ConsultantDTO; import com.pollex.pam.service.dto.ConsultantDetailDTO; @@ -17,10 +18,6 @@ private final static Character SPLIT_MASK = ','; public List<ConsultantDTO> toDto(List<Consultant> source) { return source.stream().map(this::toDto).collect(Collectors.toList()); } // todo convert public ConsultantDTO toDto(Consultant source) { ConsultantDTO consultantDTO = new ConsultantDTO(); @@ -28,17 +25,27 @@ consultantDTO.setName(source.getName()); consultantDTO.setAvgScore(source.getAvgScore()); consultantDTO.setSeniority(source.getSeniority()); consultantDTO.setExpertise(splitStringWithChar(source.getExpertise())); // todo consultantDTO.setImg(""); consultantDTO.setExpertise(splitStringWithChar(source.getExpertise())); consultantDTO.setNewConsultant(false); consultantDTO.setContactStatus(ContactStatusEnum.CONTACTED); consultantDTO.setUpdateTime(Instant.now()); consultantDTO.setContactStatus(null); consultantDTO.setUpdateTime(null); return consultantDTO; } public ConsultantDTO toDto(CustomFavoriteConsultant customFavoriteConsultant) { Consultant consultant = customFavoriteConsultant.getConsultant(); ConsultantDTO dto = toDto(consultant); Instant updateTime = customFavoriteConsultant.getLastModifiedDate(); dto.setContactStatus(customFavoriteConsultant.getContactStatus()); dto.setUpdateTime(updateTime); return dto; } public ConsultantDetailDTO toDetailDto(Consultant source) { ConsultantDetailDTO consultantDetailDTO = new ConsultantDetailDTO(); consultantDetailDTO.setName(source.getName()); pamapi/src/main/java/com/pollex/pam/web/rest/ConsultantResource.java
@@ -18,7 +18,7 @@ this.consultantService = consultantService; } @GetMapping("") @GetMapping("/favorite") public ResponseEntity<List<ConsultantDTO>> getMyConsultantList() { List<ConsultantDTO> myConsultants = consultantService.getMyConsultantList(); return new ResponseEntity<>(myConsultants, HttpStatus.OK); @@ -30,9 +30,9 @@ return new ResponseEntity<>(recommendConsultantList, HttpStatus.OK); } @PostMapping("") public ResponseEntity<Void> addConsultantToOwnList(@RequestBody AddConsultantParam param) { consultantService.addConsultantToOwnList(param); @PostMapping("/favorite") public ResponseEntity<Void> addConsultantToCustomList(@RequestBody AddConsultantParam param) { consultantService.addConsultantToCustomList(param); return new ResponseEntity<>(HttpStatus.ACCEPTED); } pamapi/src/main/java/com/pollex/pam/web/rest/errors/NotLoginException.java
比對新檔案 @@ -0,0 +1,8 @@ package com.pollex.pam.web.rest.errors; import org.springframework.http.HttpStatus; import org.springframework.web.bind.annotation.ResponseStatus; @ResponseStatus(code = HttpStatus.UNAUTHORIZED, reason = "Security Context error authentication") public class NotLoginException extends RuntimeException{ }