保誠-保戶業務員媒合平台
wayne
2021-11-08 5baaed06e6ef8f2bc29bf36bec6ed86a2f44e1cd
[add] #todo 129741,我的清單、加入清單、快速篩選API

修改6個檔案
新增4個檔案
257 ■■■■ 已變更過的檔案
pamapi/src/main/java/com/pollex/pam/domain/Consultant.java 2 ●●● 修補檔 | 檢視 | 原始 | 究查 | 歷程
pamapi/src/main/java/com/pollex/pam/domain/CustomFavoriteConsultant.java 71 ●●●●● 修補檔 | 檢視 | 原始 | 究查 | 歷程
pamapi/src/main/java/com/pollex/pam/repository/ConsultantRepository.java 5 ●●●● 修補檔 | 檢視 | 原始 | 究查 | 歷程
pamapi/src/main/java/com/pollex/pam/repository/CustomFavoriteConsultantRepository.java 12 ●●●●● 修補檔 | 檢視 | 原始 | 究查 | 歷程
pamapi/src/main/java/com/pollex/pam/service/ConsultantQuerySpec.java 59 ●●●●● 修補檔 | 檢視 | 原始 | 究查 | 歷程
pamapi/src/main/java/com/pollex/pam/service/ConsultantService.java 58 ●●●● 修補檔 | 檢視 | 原始 | 究查 | 歷程
pamapi/src/main/java/com/pollex/pam/service/dto/ConsultantDTO.java 11 ●●●● 修補檔 | 檢視 | 原始 | 究查 | 歷程
pamapi/src/main/java/com/pollex/pam/service/mapper/ConsultantMapper.java 23 ●●●●● 修補檔 | 檢視 | 原始 | 究查 | 歷程
pamapi/src/main/java/com/pollex/pam/web/rest/ConsultantResource.java 8 ●●●● 修補檔 | 檢視 | 原始 | 究查 | 歷程
pamapi/src/main/java/com/pollex/pam/web/rest/errors/NotLoginException.java 8 ●●●●● 修補檔 | 檢視 | 原始 | 究查 | 歷程
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{
}