From 40ba87b958d3b53f2eef4f95eb3add6548f35006 Mon Sep 17 00:00:00 2001
From: wayne <wayne8692wayne8692@gmail.com>
Date: 星期五, 03 十二月 2021 11:18:48 +0800
Subject: [PATCH] [update] 我的顧問清單新增預約單歷史明細、預約單的更新API、預約單的邏輯刪除API

---
 pamapi/src/doc/顧問API/客戶的顧問清單.txt                                                      |  142 +++++++++++++-
 pamapi/src/main/java/com/pollex/pam/web/rest/ConsultantResource.java                  |    4 
 pamapi/src/main/java/com/pollex/pam/domain/Satisfaction.java                          |   29 +-
 pamapi/src/main/java/com/pollex/pam/repository/SatisfactionRepository.java            |    5 
 pamapi/src/main/java/com/pollex/pam/repository/AppointmentCustomerViewRepository.java |    3 
 pamapi/src/main/java/com/pollex/pam/service/mapper/AppointmentMapper.java             |    7 
 pamapi/src/main/java/com/pollex/pam/domain/Appointment.java                           |   17 +
 pamapi/src/doc/預約單/取消預約單API.txt                                                       |    4 
 pamapi/src/main/java/com/pollex/pam/service/mapper/ConsultantMapper.java              |   19 +
 pamapi/src/main/java/com/pollex/pam/service/dto/AppointmentCustomerViewDTO.java       |   13 
 pamapi/src/main/java/com/pollex/pam/service/SatisfactionService.java                  |   17 +
 pamapi/src/doc/sql/20211202_w.sql                                                     |   35 +++
 pamapi/src/main/java/com/pollex/pam/domain/AppointmentCustomerView.java               |   11 +
 pamapi/src/main/java/com/pollex/pam/service/AppointmentService.java                   |   17 +
 pamapi/src/main/java/com/pollex/pam/service/dto/CustomerFavoriteConsultantDTO.java    |  152 +++++++++++++++
 pamapi/src/main/java/com/pollex/pam/service/ConsultantService.java                    |   67 ++++-
 pamapi/src/main/java/com/pollex/pam/service/dto/AppointmentDTO.java                   |    9 
 pamapi/src/main/java/com/pollex/pam/service/dto/SatisfactionDTO.java                  |    7 
 18 files changed, 486 insertions(+), 72 deletions(-)

diff --git a/pamapi/src/doc/sql/20211202_w.sql b/pamapi/src/doc/sql/20211202_w.sql
new file mode 100644
index 0000000..70e929f
--- /dev/null
+++ b/pamapi/src/doc/sql/20211202_w.sql
@@ -0,0 +1,35 @@
+ALTER TABLE omo.appointment ADD status varchar NULL;
+ALTER TABLE omo.appointment ADD contact_time timestamp NULL;
+ALTER TABLE omo.appointment ADD last_modified_date timestamp NULL;
+ALTER TABLE omo.customer ADD agree_personal_information_time timestamp NULL;
+
+UPDATE omo.appointment SET status = 'AVAILABLE';
+UPDATE omo.appointment SET last_modified_date = appointment_date;
+
+DROP VIEW omo.appointment_customer_view;
+
+CREATE OR REPLACE VIEW omo.appointment_customer_view
+AS SELECT a.id AS appointment_id,
+          a.phone,
+          a.email,
+          a.contact_type,
+          a.gender,
+          a.age,
+          a.job,
+          a.requirement,
+          a.communicate_status,
+          a.hope_contact_time,
+          a.other_requirement,
+          a.agent_no,
+          a.appointment_date,
+          a.customer_id,
+          a.consultant_view_time,
+          a.consultant_read_time,
+          a.contact_time,
+          a.status,
+          a.last_modified_date,
+          c.name
+   FROM omo.appointment a
+            LEFT JOIN omo.customer c ON a.customer_id = c.id;
+
+ALTER TABLE omo.satisfaction ADD appointment_id bigserial NOT NULL;
diff --git "a/pamapi/src/doc/\351\240\220\347\264\204\345\226\256/\345\217\226\346\266\210\351\240\220\347\264\204\345\226\256API.txt" "b/pamapi/src/doc/\351\240\220\347\264\204\345\226\256/\345\217\226\346\266\210\351\240\220\347\264\204\345\226\256API.txt"
new file mode 100644
index 0000000..8474f16
--- /dev/null
+++ "b/pamapi/src/doc/\351\240\220\347\264\204\345\226\256/\345\217\226\346\266\210\351\240\220\347\264\204\345\226\256API.txt"
@@ -0,0 +1,4 @@
+http delete:
+http://localhost:8080/api/appointment/{appointmentId}
+
+response http status: 204 (����)
diff --git "a/pamapi/src/doc/\351\241\247\345\225\217API/\345\256\242\346\210\266\347\232\204\351\241\247\345\225\217\346\270\205\345\226\256.txt" "b/pamapi/src/doc/\351\241\247\345\225\217API/\345\256\242\346\210\266\347\232\204\351\241\247\345\225\217\346\270\205\345\226\256.txt"
index 5402bd7..fbe3e9d 100644
--- "a/pamapi/src/doc/\351\241\247\345\225\217API/\345\256\242\346\210\266\347\232\204\351\241\247\345\225\217\346\270\205\345\226\256.txt"
+++ "b/pamapi/src/doc/\351\241\247\345\225\217API/\345\256\242\346\210\266\347\232\204\351\241\247\345\225\217\346\270\205\345\226\256.txt"
@@ -3,19 +3,141 @@
 response body:
 [
     {
-        "agentNo": "12345",
-        "name": "皜祈岫��璆剖�",
-        "img": "",
+        "agentNo": "J149388015",
+        "name": "摰���",
+        "img": "avatar9.jpg",
         "expertise": [
-            "鞎∪����",
-            "鞈頧宏"
+            "�摨瑁����",
+            "摮戊��",
+            "鞈閬��",
+            "璅暑��隡�",
+            "靽�瑼�/閬��",
+            "����"
         ],
-        "avgScore": 4.7,
+        "avgScore": 4.0,
+        "contactStatus": "reserved",        // ��脰�����icked (�脰����)�eserved (撌脤���)�ontacted (撌脤��蝜�)
+        "createTime": "2021-12-02T10:55:53.939Z",   // ��憿批������
+        "updateTime": "2021-12-02T10:56:32.741Z",   // ��餈�����
+        "role": "憡��蝬�鈭�",
+        "seniority": "22 撟� 8 ���",
+        "latestAppointmentId": 130,                 // ��敺�蝑��ID
+        "latestAppointmentDate": "2021-12-02T10:56:32.741Z",    // ��敺�蝑��������
+        "latestAppointmentScore": null,                 // ��敺�蝑����� (null�撠閰��)
+        "appointments": [       // 摰X撌脤���“���
+            {
+                "id": 130,
+                "phone": "0938520091",
+                "email": "",
+                "contactType": "phone",
+                "gender": "female",
+                "age": "21-30",
+                "job": "��",
+                "requirement": "摮戊��,��������",
+                "communicateStatus": "reserved",
+                "hopeContactTime": "'蝳格��,蝳格���,蝳格����12:00~14:00,18:00~21:00'",
+                "otherRequirement": null,
+                "appointmentDate": "2021-12-02T10:56:32.741Z",
+                "lastModifiedDate": "2021-12-02T10:56:32.741Z",
+                "agentNo": "J149388015",
+                "customerId": 76,
+                "name": "��蝬�",
+                "consultantViewTime": null,
+                "consultantReadTime": null
+            }
+        ],
+        "new": true
+    },
+    {
+        "agentNo": "B282677963",
+        "name": "�憒�",
+        "img": "avatar6.jpg",
+        "expertise": [
+            "�摨瑁����",
+            "摮戊��",
+            "鞈閬��",
+            "璅暑��隡�",
+            "靽�瑼�/閬��",
+            "����"
+        ],
+        "avgScore": 1.0,
+        "contactStatus": "reserved",
+        "createTime": "2021-12-02T10:55:57.423Z",
+        "updateTime": "2021-12-02T10:56:56.946Z",
+        "role": "����蝬�鈭�",
+        "seniority": "30 撟� 8 ���",
+        "latestAppointmentId": 131,
+        "latestAppointmentDate": "2021-12-02T10:56:56.946Z",
+        "latestAppointmentScore": null,
+        "appointments": [
+            {
+                "id": 131,
+                "phone": "0938520091",
+                "email": "",
+                "contactType": "phone",
+                "gender": "female",
+                "age": "21-30",
+                "job": "��",
+                "requirement": "摮戊��,��������",
+                "communicateStatus": "reserved",
+                "hopeContactTime": "'蝳格����9:00~12:00,12:00~14:00,14:00~18:00,18:00~21:00'",
+                "otherRequirement": null,
+                "appointmentDate": "2021-12-02T10:56:56.946Z",
+                "lastModifiedDate": "2021-12-02T10:56:56.946Z",
+                "agentNo": "B282677963",
+                "customerId": 76,
+                "name": "��蝬�",
+                "consultantViewTime": null,
+                "consultantReadTime": null
+            }
+        ],
+        "new": true
+    },
+    {
+        "agentNo": "R221444250",
+        "name": "撏祠",
+        "img": "avatar10.jpg",
+        "expertise": [
+            "�摨瑁����",
+            "摮戊��",
+            "鞈閬��",
+            "璅暑��隡�",
+            "靽�瑼�/閬��",
+            "����"
+        ],
+        "avgScore": 5.0,
         "contactStatus": "picked",
-        "updateTime": "2021-11-02T06:46:13.723Z",
-        "seniority": "4撟�2���",
+        "createTime": "2021-12-02T10:56:01.004Z",
+        "updateTime": null,
         "role": "����蝬�鈭�",
-        "new": false,
-        "latestAppointmentId": null
+        "seniority": "38 撟� ",
+        "latestAppointmentId": null,
+        "latestAppointmentDate": null,
+        "latestAppointmentScore": null,
+        "appointments": [],
+        "new": true
+    },
+    {
+        "agentNo": "Z152717443",
+        "name": "隡���",
+        "img": "avatar3.jpg",
+        "expertise": [
+            "�摨瑁����",
+            "摮戊��",
+            "鞈閬��",
+            "璅暑��隡�",
+            "靽�瑼�/閬��",
+            "����"
+        ],
+        "avgScore": 3.0,
+        "contactStatus": "picked",
+        "createTime": "2021-12-02T10:56:04.620Z",
+        "updateTime": null,
+        "role": "��陸靽蝬�鈭�",
+        "seniority": "17 撟� 1 ���",
+        "latestAppointmentId": null,
+        "latestAppointmentDate": null,
+        "latestAppointmentScore": null,                 // ��敺�蝑����� (null�撠閰��)
+        "appointments": [],
+        "new": true
     }
 ]
diff --git a/pamapi/src/main/java/com/pollex/pam/domain/Appointment.java b/pamapi/src/main/java/com/pollex/pam/domain/Appointment.java
index 882613c..e29a371 100644
--- a/pamapi/src/main/java/com/pollex/pam/domain/Appointment.java
+++ b/pamapi/src/main/java/com/pollex/pam/domain/Appointment.java
@@ -7,6 +7,7 @@
 
 import com.pollex.pam.enums.AppointmentStatusEnum;
 import com.pollex.pam.enums.ContactStatusEnum;
+import org.springframework.data.annotation.CreatedDate;
 import org.springframework.data.annotation.LastModifiedDate;
 import org.springframework.data.jpa.domain.support.AuditingEntityListener;
 
@@ -55,9 +56,13 @@
 	@Column(name = "other_requirement")
     private String otherRequirement;
 
-    @LastModifiedDate
-	@Column(name = "appointment_date")
+    @CreatedDate
+	@Column(name = "appointment_date", updatable = false)
     private Instant appointmentDate;
+
+    @LastModifiedDate
+    @Column(name = "last_modified_date")
+    private Instant lastModifiedDate;
 
 	@Column(name = "agent_no")
     private String agentNo;
@@ -210,4 +215,12 @@
     public void setStatus(AppointmentStatusEnum status) {
         this.status = status;
     }
+
+    public Instant getLastModifiedDate() {
+        return lastModifiedDate;
+    }
+
+    public void setLastModifiedDate(Instant lastModifiedDate) {
+        this.lastModifiedDate = lastModifiedDate;
+    }
 }
diff --git a/pamapi/src/main/java/com/pollex/pam/domain/AppointmentCustomerView.java b/pamapi/src/main/java/com/pollex/pam/domain/AppointmentCustomerView.java
index da38baa..edee8a4 100644
--- a/pamapi/src/main/java/com/pollex/pam/domain/AppointmentCustomerView.java
+++ b/pamapi/src/main/java/com/pollex/pam/domain/AppointmentCustomerView.java
@@ -72,6 +72,9 @@
     @Column(name = "consultant_read_time")
     private Instant consultantReadTime;
 
+    @Column(name = "last_modified_date")
+    private Instant lastModifiedDate;
+
     @Column(name = "name")
     private String name;
 
@@ -207,6 +210,14 @@
         this.consultantReadTime = consultantReadTime;
     }
 
+    public Instant getLastModifiedDate() {
+        return lastModifiedDate;
+    }
+
+    public void setLastModifiedDate(Instant lastModifiedDate) {
+        this.lastModifiedDate = lastModifiedDate;
+    }
+
     public String getName() {
 		return name;
 	}
diff --git a/pamapi/src/main/java/com/pollex/pam/domain/Satisfaction.java b/pamapi/src/main/java/com/pollex/pam/domain/Satisfaction.java
index 146b3b8..95a0944 100644
--- a/pamapi/src/main/java/com/pollex/pam/domain/Satisfaction.java
+++ b/pamapi/src/main/java/com/pollex/pam/domain/Satisfaction.java
@@ -21,16 +21,16 @@
 @Entity
 @Table(name = "satisfaction")
 public class Satisfaction implements Serializable {
-	
+
 	/**
-	 * 
+	 *
 	 */
 	private static final long serialVersionUID = 1L;
-	
+
 	@Id
     @GeneratedValue(strategy = GenerationType.IDENTITY)
     private Long id;
-	
+
 	@CreatedDate
     @Column(name = "created_date", updatable = false)
     @JsonIgnore
@@ -40,19 +40,22 @@
     @Column(name = "last_modified_date")
     @JsonIgnore
     private Instant lastModifiedDate = Instant.now();
-    
+
     @Column(name = "customer_id")
     private Long customerId;
-    
+
     @Column(name = "agent_no")
     private String agentNo;
-    
+
     @Enumerated(EnumType.STRING)
     @Column(name = "status")
     private SatisfactionStatusEnum status;
-    
+
     @Column(name = "score")
     private Float score;
+
+    @Column(name = "appointment_id")
+    private Long appointmentId;
 
 	public Long getId() {
 		return id;
@@ -109,6 +112,12 @@
 	public void setScore(Float score) {
 		this.score = score;
 	}
-    
-    
+
+    public Long getAppointmentId() {
+        return appointmentId;
+    }
+
+    public void setAppointmentId(Long appointmentId) {
+        this.appointmentId = appointmentId;
+    }
 }
diff --git a/pamapi/src/main/java/com/pollex/pam/repository/AppointmentCustomerViewRepository.java b/pamapi/src/main/java/com/pollex/pam/repository/AppointmentCustomerViewRepository.java
index 0e39bd0..b3499c6 100644
--- a/pamapi/src/main/java/com/pollex/pam/repository/AppointmentCustomerViewRepository.java
+++ b/pamapi/src/main/java/com/pollex/pam/repository/AppointmentCustomerViewRepository.java
@@ -9,7 +9,6 @@
 
 @Repository
 public interface AppointmentCustomerViewRepository extends JpaRepository<AppointmentCustomerView, Long>{
-
 	List<AppointmentCustomerView> findByAgentNo(String agentNo);
-	
+    List<AppointmentCustomerView> findByAgentNoAndCustomerId(String agentNo, Long customerId);
 }
diff --git a/pamapi/src/main/java/com/pollex/pam/repository/SatisfactionRepository.java b/pamapi/src/main/java/com/pollex/pam/repository/SatisfactionRepository.java
index ed21f2a..7763c51 100644
--- a/pamapi/src/main/java/com/pollex/pam/repository/SatisfactionRepository.java
+++ b/pamapi/src/main/java/com/pollex/pam/repository/SatisfactionRepository.java
@@ -1,6 +1,7 @@
 package com.pollex.pam.repository;
 
 import java.util.List;
+import java.util.Optional;
 
 import org.springframework.data.jpa.repository.JpaRepository;
 import org.springframework.stereotype.Repository;
@@ -13,6 +14,6 @@
 	List<Satisfaction> findByAgentNo(String agentNo);
 
 	List<Satisfaction> findByCustomerId(Long customerId);
-	
-	
+
+	Optional<Satisfaction> findOneByAppointmentId(Long appointmentId);
 }
diff --git a/pamapi/src/main/java/com/pollex/pam/service/AppointmentService.java b/pamapi/src/main/java/com/pollex/pam/service/AppointmentService.java
index 7e23420..42ef0ae 100644
--- a/pamapi/src/main/java/com/pollex/pam/service/AppointmentService.java
+++ b/pamapi/src/main/java/com/pollex/pam/service/AppointmentService.java
@@ -25,6 +25,7 @@
 import com.pollex.pam.service.mapper.AppointmentDTOMapper;
 import com.pollex.pam.web.rest.errors.AppointmentNotFoundException;
 
+import static com.pollex.pam.enums.AppointmentStatusEnum.AVAILABLE;
 import static com.pollex.pam.enums.AppointmentStatusEnum.DELETED;
 
 @Service
@@ -70,16 +71,17 @@
 		return appointmentRepository.save(appointment);
 	}
 
-
 	public AppointmentCustomerViewDTO getAppointmentDetail(Long appointmentId) {
 		AppointmentCustomerView appointment = appointmentCustomerViewRepository.findById(appointmentId)
 				.orElseThrow(AppointmentNotFoundException::new);
 		return appointmentCustomerViewMapper.toAppointmentCustomerViewDTO(appointment);
 	}
 
-
-    public List<Appointment> findByAgentNoAndCustomerId(String agentNo, Long customerId) {
-        return appointmentRepository.findByAgentNoAndCustomerId(agentNo, customerId);
+    public List<AppointmentCustomerView> findAvailableByAgentNoAndCustomerId(String agentNo, Long customerId) {
+        return appointmentCustomerViewRepository.findByAgentNoAndCustomerId(agentNo, customerId)
+            .stream()
+            .filter(appointmentCustomerView -> appointmentCustomerView.getStatus() == AVAILABLE)
+            .collect(Collectors.toList());
     }
 
     public void recordConsultantReadTime(Long appointmentId) {
@@ -102,7 +104,6 @@
     public void markAppointmentDeleted(Long appointmentId) {
         Appointment appointment = appointmentRepository.findById(appointmentId).get();
         appointment.setStatus(DELETED);
-
         appointmentRepository.save(appointment);
     }
 
@@ -117,7 +118,9 @@
     }
 
     public List<AppointmentCustomerViewDTO> getConsultantAppointments(String agentNo) {
-        List<AppointmentCustomerView> appointmentList = appointmentCustomerViewRepository.findByAgentNo(agentNo);
-        return appointmentCustomerViewMapper.toAppointmentCustomerViewDTO(appointmentList);
+        return appointmentCustomerViewRepository.findByAgentNo(agentNo).stream()
+            .filter(appointment -> appointment.getStatus() != DELETED)
+            .map(appointmentCustomerViewMapper::toAppointmentCustomerViewDTO)
+            .collect(Collectors.toList());
     }
 }
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 a06f4a5..7a9c552 100644
--- a/pamapi/src/main/java/com/pollex/pam/service/ConsultantService.java
+++ b/pamapi/src/main/java/com/pollex/pam/service/ConsultantService.java
@@ -1,14 +1,16 @@
 package com.pollex.pam.service;
 
-import com.pollex.pam.domain.Appointment;
+import com.pollex.pam.domain.AppointmentCustomerView;
 import com.pollex.pam.domain.Consultant;
 import com.pollex.pam.domain.CustomerFavoriteConsultant;
+import com.pollex.pam.domain.Satisfaction;
 import com.pollex.pam.enums.ContactStatusEnum;
 import com.pollex.pam.enums.LoginResult;
 import com.pollex.pam.repository.ConsultantRepository;
 import com.pollex.pam.repository.CustomerFavoriteConsultantRepository;
 import com.pollex.pam.security.SecurityUtils;
 import com.pollex.pam.service.dto.*;
+import com.pollex.pam.service.mapper.AppointmentCustomerViewMapper;
 import com.pollex.pam.service.mapper.ConsultantMapper;
 import com.pollex.pam.web.rest.errors.ConsultantNotFoundException;
 import org.slf4j.Logger;
@@ -42,37 +44,66 @@
     @Autowired
     LoginRecordService loginRecordService;
 
-    public List<ConsultantDTO> getMyConsultantList() {
-        Long customerId = SecurityUtils.getCustomerDBId();
+    @Autowired
+    AppointmentCustomerViewMapper appointmentCustomerViewMapper;
 
+    @Autowired
+    SatisfactionService satisfactionService;
+
+    public List<CustomerFavoriteConsultantDTO> getMyConsultantList() {
+        Long customerId = SecurityUtils.getCustomerDBId();
 
         return customerFavoriteConsultantRepository.findAllByCustomerId(customerId)
             .stream()
             .map(customerFavoriteConsultantRelation -> {
                 Consultant consultant = customerFavoriteConsultantRelation.getConsultant();
-                ConsultantDTO dto = consultantMapper.toDto(consultant);
+                CustomerFavoriteConsultantDTO dto = consultantMapper.toCustomerFavoriteConsultantDto(consultant);
 
-                final Optional<Appointment> latestAppointmentOptional = appointmentService.findByAgentNoAndCustomerId(consultant.getAgentNo(), customerId)
-                    .stream()
-                    .max(Comparator.comparing(Appointment::getAppointmentDate));
+                dto.setContactStatus(ContactStatusEnum.PICKED);
+                dto.setLatestAppointmentId(null);
+                dto.setLatestAppointmentDate(null);
+                dto.setLatestAppointmentScore(null);
+                dto.setCreateTime(customerFavoriteConsultantRelation.getLastModifiedDate());
 
-                if(latestAppointmentOptional.isPresent()) {
-                    Appointment latestAppointment = latestAppointmentOptional.get();
-                    dto.setContactStatus(latestAppointment.getCommunicateStatus());
-                    dto.setLatestAppointmentId(latestAppointment.getId());
-                    dto.setUpdateTime(latestAppointment.getAppointmentDate());
-                }
-                else {
-                    dto.setContactStatus(ContactStatusEnum.PICKED);
-                    dto.setLatestAppointmentId(null);
-                    dto.setUpdateTime(customerFavoriteConsultantRelation.getLastModifiedDate());
-                }
+                setAppointmentInfo(
+                    dto,
+                    appointmentService.findAvailableByAgentNoAndCustomerId(consultant.getAgentNo(), customerId)
+                );
 
                 return dto;
 
             }).collect(Collectors.toList());
     }
 
+    private void setAppointmentInfo(CustomerFavoriteConsultantDTO dto, List<AppointmentCustomerView> appointmentList) {
+        List<AppointmentCustomerView> appointments = appointmentList.stream()
+            .sorted(Comparator.comparing(AppointmentCustomerView::getAppointmentDate).reversed())
+            .collect(Collectors.toList());
+
+        dto.setAppointments(appointmentCustomerViewMapper.toAppointmentCustomerViewDTO(appointments));
+
+        if (!appointments.isEmpty()) {
+            AppointmentCustomerView latestAppointment = appointments.get(0);
+            dto.setContactStatus(latestAppointment.getCommunicateStatus());
+            dto.setLatestAppointmentId(latestAppointment.getId());
+            dto.setLatestAppointmentDate(latestAppointment.getAppointmentDate());
+            dto.setUpdateTime(latestAppointment.getLastModifiedDate());
+
+            setLatestAppointmentScore(dto, latestAppointment);
+        }
+    }
+
+    private void setLatestAppointmentScore(CustomerFavoriteConsultantDTO dto, AppointmentCustomerView latestAppointment) {
+        Optional<Satisfaction> satisfactionOptional = satisfactionService.getByAppointmentId(latestAppointment.getId());
+        if(satisfactionOptional.isPresent()) {
+            Satisfaction satisfaction = satisfactionOptional.get();
+            dto.setLatestAppointmentScore(satisfaction.getScore());
+        }
+        else {
+            dto.setLatestAppointmentScore(null);
+        }
+    }
+
     public List<ConsultantDTO> getRecommendConsultantList() {
         return consultantRepository.findAllByRecommendIsTrue()
             .stream()
diff --git a/pamapi/src/main/java/com/pollex/pam/service/SatisfactionService.java b/pamapi/src/main/java/com/pollex/pam/service/SatisfactionService.java
index 58e5650..0c0b5f8 100644
--- a/pamapi/src/main/java/com/pollex/pam/service/SatisfactionService.java
+++ b/pamapi/src/main/java/com/pollex/pam/service/SatisfactionService.java
@@ -9,7 +9,6 @@
 
 import com.pollex.pam.domain.Appointment;
 import com.pollex.pam.domain.Satisfaction;
-import com.pollex.pam.enums.SatisfactionStatusEnum;
 import com.pollex.pam.repository.CustomerRepository;
 import com.pollex.pam.repository.SatisfactionRepository;
 import com.pollex.pam.service.dto.SatisfactionCustomerCreateDTO;
@@ -21,22 +20,22 @@
 @Service
 @Transactional
 public class SatisfactionService {
-	
+
 	@Autowired
 	SatisfactionRepository satisfactionRepository;
-	
+
 	@Autowired
 	AppointmentMapper appointmentMapper;
-	
+
 	@Autowired
 	SatisfactionDTOMapper satisfactionDTOMapper;
-	
+
 	@Autowired
 	SatisfactionMapper satisfactionMapper;
-	
+
 	@Autowired
 	CustomerRepository customerRepository;
-	
+
 	public Satisfaction createSatisfaction(Satisfaction satisfaction) {
 		return satisfactionRepository.save(satisfaction);
 	}
@@ -62,4 +61,8 @@
 		List<Satisfaction> satisfactionList = satisfactionRepository.findByCustomerId(customerDBId);
 		return satisfactionMapper.toDTO(satisfactionList);
 	}
+
+    public Optional<Satisfaction> getByAppointmentId(Long appointmentId) {
+        return satisfactionRepository.findOneByAppointmentId(appointmentId);
+    }
 }
diff --git a/pamapi/src/main/java/com/pollex/pam/service/dto/AppointmentCustomerViewDTO.java b/pamapi/src/main/java/com/pollex/pam/service/dto/AppointmentCustomerViewDTO.java
index 45368df..22e764f 100644
--- a/pamapi/src/main/java/com/pollex/pam/service/dto/AppointmentCustomerViewDTO.java
+++ b/pamapi/src/main/java/com/pollex/pam/service/dto/AppointmentCustomerViewDTO.java
@@ -2,10 +2,6 @@
 
 import java.time.Instant;
 
-import javax.persistence.Column;
-import javax.persistence.EnumType;
-import javax.persistence.Enumerated;
-
 import com.pollex.pam.enums.ContactStatusEnum;
 
 public class AppointmentCustomerViewDTO {
@@ -22,6 +18,7 @@
     private String hopeContactTime;
     private String otherRequirement;
     private Instant appointmentDate;
+    private Instant lastModifiedDate;
     private String agentNo;
     private Long customerId;
     private String name;
@@ -99,7 +96,13 @@
 	public void setAppointmentDate(Instant appointmentDate) {
 		this.appointmentDate = appointmentDate;
 	}
-	public String getAgentNo() {
+    public Instant getLastModifiedDate() {
+        return lastModifiedDate;
+    }
+    public void setLastModifiedDate(Instant lastModifiedDate) {
+        this.lastModifiedDate = lastModifiedDate;
+    }
+    public String getAgentNo() {
 		return agentNo;
 	}
 	public void setAgentNo(String agentNo) {
diff --git a/pamapi/src/main/java/com/pollex/pam/service/dto/AppointmentDTO.java b/pamapi/src/main/java/com/pollex/pam/service/dto/AppointmentDTO.java
index 557037d..411c500 100644
--- a/pamapi/src/main/java/com/pollex/pam/service/dto/AppointmentDTO.java
+++ b/pamapi/src/main/java/com/pollex/pam/service/dto/AppointmentDTO.java
@@ -6,7 +6,6 @@
 
 import com.pollex.pam.enums.ContactStatusEnum;
 
-@Service
 public class AppointmentDTO {
 
 	private Long id;
@@ -21,6 +20,7 @@
     private String hopeContactTime;
     private String otherRequirement;
     private Instant appointmentDate;
+    private Instant lastModifiedDate;
     private String agentNo;
     private Long customerId;
     private Instant consultantViewTime;
@@ -122,4 +122,11 @@
     public void setConsultantReadTime(Instant consultantReadTime) {
         this.consultantReadTime = consultantReadTime;
     }
+    public Instant getLastModifiedDate() {
+        return lastModifiedDate;
+    }
+
+    public void setLastModifiedDate(Instant lastModifiedDate) {
+        this.lastModifiedDate = lastModifiedDate;
+    }
 }
diff --git a/pamapi/src/main/java/com/pollex/pam/service/dto/CustomerFavoriteConsultantDTO.java b/pamapi/src/main/java/com/pollex/pam/service/dto/CustomerFavoriteConsultantDTO.java
new file mode 100644
index 0000000..78bc277
--- /dev/null
+++ b/pamapi/src/main/java/com/pollex/pam/service/dto/CustomerFavoriteConsultantDTO.java
@@ -0,0 +1,152 @@
+package com.pollex.pam.service.dto;
+
+import com.fasterxml.jackson.annotation.JsonProperty;
+import com.pollex.pam.enums.ContactStatusEnum;
+
+import java.time.Instant;
+import java.time.temporal.ChronoUnit;
+import java.util.List;
+
+public class CustomerFavoriteConsultantDTO {
+
+    @JsonProperty("new")
+    private boolean newConsultant;
+    private String agentNo;
+    private String name;
+    private String img;
+    private List<String> expertise;
+    private Float avgScore;
+    private ContactStatusEnum contactStatus;
+    private Instant createTime;
+    private Instant updateTime;
+    private String role;
+    private String seniority;
+    private Long latestAppointmentId;
+    private Instant latestAppointmentDate;
+    private Float latestAppointmentScore;
+    private List<AppointmentCustomerViewDTO> appointments;
+
+    public boolean isNewConsultant() {
+        if(createTime != null){
+            Instant nowTimestamp = Instant.now();
+            return ChronoUnit.DAYS.between(createTime, nowTimestamp) < 3;
+        }
+        return false;
+    }
+
+    public String getAgentNo() {
+        return agentNo;
+    }
+
+    public void setAgentNo(String agentNo) {
+        this.agentNo = agentNo;
+    }
+
+    public String getName() {
+        return name;
+    }
+
+    public void setName(String name) {
+        this.name = name;
+    }
+
+    public String getImg() {
+        return img;
+    }
+
+    public void setImg(String img) {
+        this.img = img;
+    }
+
+    public List<String> getExpertise() {
+        return expertise;
+    }
+
+    public void setExpertise(List<String> expertise) {
+        this.expertise = expertise;
+    }
+
+    public Float getLatestAppointmentScore() {
+        return latestAppointmentScore;
+    }
+
+    public void setLatestAppointmentScore(Float latestAppointmentScore) {
+        this.latestAppointmentScore = latestAppointmentScore;
+    }
+
+    public Float getAvgScore() {
+        return avgScore;
+    }
+
+    public void setAvgScore(Float avgScore) {
+        this.avgScore = avgScore;
+    }
+
+    public ContactStatusEnum getContactStatus() {
+        return contactStatus;
+    }
+
+    public void setContactStatus(ContactStatusEnum contactStatus) {
+        this.contactStatus = contactStatus;
+    }
+
+    public Instant getLatestAppointmentDate() {
+        return latestAppointmentDate;
+    }
+
+    public void setLatestAppointmentDate(Instant latestAppointmentDate) {
+        this.latestAppointmentDate = latestAppointmentDate;
+    }
+
+    public Instant getCreateTime() {
+        return createTime;
+    }
+
+    public Instant getUpdateTime() {
+        return updateTime;
+    }
+
+    public void setCreateTime(Instant createTime) {
+        this.createTime = createTime;
+    }
+
+    public void setUpdateTime(Instant updateTime) {
+        this.updateTime = updateTime;
+    }
+
+    public String getRole() {
+        return role;
+    }
+
+    public void setRole(String role) {
+        this.role = role;
+    }
+
+    public String getSeniority() {
+        return seniority;
+    }
+
+    public void setSeniority(String seniority) {
+        this.seniority = seniority;
+    }
+
+    public void setNewConsultant(boolean newConsultant) {
+        this.newConsultant = newConsultant;
+    }
+
+    public Long getLatestAppointmentId() {
+        return latestAppointmentId;
+    }
+
+    public void setLatestAppointmentId(Long latestAppointmentId) {
+        this.latestAppointmentId = latestAppointmentId;
+    }
+
+    public List<AppointmentCustomerViewDTO> getAppointments() {
+        return appointments;
+    }
+
+    public void setAppointments(List<AppointmentCustomerViewDTO> appointments) {
+        this.appointments = appointments;
+    }
+}
diff --git a/pamapi/src/main/java/com/pollex/pam/service/dto/SatisfactionDTO.java b/pamapi/src/main/java/com/pollex/pam/service/dto/SatisfactionDTO.java
index 8d0fba4..e244de1 100644
--- a/pamapi/src/main/java/com/pollex/pam/service/dto/SatisfactionDTO.java
+++ b/pamapi/src/main/java/com/pollex/pam/service/dto/SatisfactionDTO.java
@@ -5,7 +5,7 @@
 import com.pollex.pam.enums.SatisfactionStatusEnum;
 
 public class SatisfactionDTO {
-	
+
 	private Long id;
     private Instant createdDate;
     private Instant lastModifiedDate;
@@ -13,6 +13,7 @@
     private String agentNo;
     private SatisfactionStatusEnum status;
     private Float score;
+    private Long appointmentId;
 	public Long getId() {
 		return id;
 	}
@@ -55,6 +56,6 @@
 	public void setScore(Float score) {
 		this.score = score;
 	}
-    
-    
+
+
 }
diff --git a/pamapi/src/main/java/com/pollex/pam/service/mapper/AppointmentMapper.java b/pamapi/src/main/java/com/pollex/pam/service/mapper/AppointmentMapper.java
index 208e34d..5df4740 100644
--- a/pamapi/src/main/java/com/pollex/pam/service/mapper/AppointmentMapper.java
+++ b/pamapi/src/main/java/com/pollex/pam/service/mapper/AppointmentMapper.java
@@ -17,7 +17,7 @@
 
 @Service
 public class AppointmentMapper {
-	
+
 	@Autowired
 	AppointmentRepository appointmentRepository;
 
@@ -34,16 +34,17 @@
 
 	public Satisfaction toSatisfaction(Appointment appointment) {
 		Satisfaction target = new Satisfaction();
+        target.setAppointmentId(appointment.getId());
 		target.setAgentNo(appointment.getAgentNo());
 		target.setCustomerId(appointment.getCustomerId());
 		return target;
 	}
-	
+
 	public Satisfaction toSatisfaction(Long appointmentId) {
 		Appointment appointment = appointmentRepository.findById(appointmentId).get();
 		return toSatisfaction(appointment);
 	}
 
-	
+
 
 }
diff --git a/pamapi/src/main/java/com/pollex/pam/service/mapper/ConsultantMapper.java b/pamapi/src/main/java/com/pollex/pam/service/mapper/ConsultantMapper.java
index e6dea8c..30e0e47 100644
--- a/pamapi/src/main/java/com/pollex/pam/service/mapper/ConsultantMapper.java
+++ b/pamapi/src/main/java/com/pollex/pam/service/mapper/ConsultantMapper.java
@@ -7,7 +7,9 @@
 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;
 
@@ -19,6 +21,23 @@
 
     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);
+        consultantDTO.setLatestAppointmentId(null);
+
+        return consultantDTO;
+    }
+
     public ConsultantDTO toDto(Consultant source) {
         ConsultantDTO consultantDTO = new ConsultantDTO();
         consultantDTO.setAgentNo(source.getAgentNo());
diff --git a/pamapi/src/main/java/com/pollex/pam/web/rest/ConsultantResource.java b/pamapi/src/main/java/com/pollex/pam/web/rest/ConsultantResource.java
index bc77aeb..d672590 100644
--- a/pamapi/src/main/java/com/pollex/pam/web/rest/ConsultantResource.java
+++ b/pamapi/src/main/java/com/pollex/pam/web/rest/ConsultantResource.java
@@ -25,8 +25,8 @@
     ConsultantService consultantService;
 
     @GetMapping("/favorite")
-    public ResponseEntity<List<ConsultantDTO>> getMyConsultantList() {
-        List<ConsultantDTO> myConsultants = consultantService.getMyConsultantList();
+    public ResponseEntity<List<CustomerFavoriteConsultantDTO>> getMyConsultantList() {
+        List<CustomerFavoriteConsultantDTO> myConsultants = consultantService.getMyConsultantList();
         return new ResponseEntity<>(myConsultants, HttpStatus.OK);
     }
 

--
Gitblit v1.8.0