From 73307b0ada907f8ac857b3dfc4e7d50e3b7b92e9 Mon Sep 17 00:00:00 2001
From: Tomas <tomasysh@gmail.com>
Date: 星期一, 24 一月 2022 16:24:52 +0800
Subject: [PATCH] Merge branch 'Phase3' of https://dev.pollex.com.tw:8443/r/pcalife/PAM into Phase3

---
 PAMapp/pages/questionnaire/_agentNo.vue |  278 +++++++++++++++++++++++++++++++-----------------------
 1 files changed, 159 insertions(+), 119 deletions(-)

diff --git a/PAMapp/pages/questionnaire/_agentNo.vue b/PAMapp/pages/questionnaire/_agentNo.vue
index c9a622f..cb8c164 100644
--- a/PAMapp/pages/questionnaire/_agentNo.vue
+++ b/PAMapp/pages/questionnaire/_agentNo.vue
@@ -16,7 +16,7 @@
               <div class="datepicker required">
                   <span class="mdTxt">�����蝯∠�靘踵���</span>
                   <PhoneContactTimePicker
-                  :scheduleList.sync="myRequest.hopeContactTime"/>
+                  :scheduleList="myRequest.hopeContactTime"/>
               </div>
           </div>
           <div class="mt-30">
@@ -24,8 +24,12 @@
               <div class="ques-header__input-block">
                   <span>Email嚗�</span>
                   <input class="ques-header__input"
+                    :class="{ 'is-invalid': !emailValid}"
                     placeholder="隢撓�"
                     v-model="myRequest.email">
+              </div>
+              <div class="error mt-5 mb-5" style="margin-left:65px">
+                  <span v-show="!emailValid">Email�撘�炊</span>
               </div>
           </div>
         </div>
@@ -55,7 +59,7 @@
               <div class="datepicker">
                   <span class="mdTxt">�����蝯∠�靘踵���</span>
                   <PhoneContactTimePicker
-                  :scheduleList.sync="myRequest.hopeContactTime"/>
+                  :scheduleList="myRequest.hopeContactTime"/>
               </div>
           </div>
         </div>
@@ -115,12 +119,21 @@
     </PopUpFrame>
 
     <PopUpFrame :isOpen.sync="sendReserve" @update:isOpen="closeReservePopUp">
-        <div class="text--middle  mt-30 sendReserve-txt">�����������憿批���</div>
-        <div class="text--middle sendReserve-txt">�����蝯∴��</div>
+        <div class="mdTxt mt-30 sendReserve-txt">�������</div>
+        <div class="mdTxt sendReserve-txt mb-30">�����“�������蝯∴��</div>
+        <div class="pam-app-review mb-10">
+          <div class="mdTxt mb-10">撠
+                <span class="mdTxt text--primary text--bold ">������</span>
+                撟喳��擃����
+            </div>
+          <div class="mdTxt">�蝯虫�嗾憿��嚗�</div>
+        </div>
+        <el-rate v-model="score" class="pam-satisfaction-rate fix-chrome-click--issue"></el-rate>
         <div class="text--center mdTxt">
+          <el-button @click="closeReservePopUp">����</el-button>
           <el-button type="primary"
             @click="closeReservePopUp">
-            ������
+            �
           </el-button>
         </div>
     </PopUpFrame>
@@ -140,20 +153,34 @@
 
 <script lang="ts">
 import { Vue, Component, State, Action, Watch, namespace } from 'nuxt-property-decorator';
-import { addFavoriteConsultant, appointmentDemand, AppointmentParams, AppointmentRequests ,editAppointment } from '~/assets/ts/api/consultant';
-import { getRequestQuestionFromStorage, getRequestsFromStorage, removeRequestQuestionFromStorage, setRequestsToStorage } from '~/assets/ts/storageRequests';
+import { getRequestsFromStorage, removeRequestQuestionFromStorage, setRequestsToStorage } from '~/shared/storageRequests';
 import _ from 'lodash';
-import { Consultant } from '~/assets/ts/models/consultant.model';
-import { ContactType } from '~/assets/ts/models/enum/ContactType';
-import { Gender } from '~/assets/ts/models/enum/Gender';
-import { RegisterInfo } from '~/assets/ts/models/registerInfo';
+
+import appointmentService from '~/shared/services/appointment.service';
+import authService from '~/shared/services/auth.service';
+import queryConsultantService from '~/shared/services/query-consultant.service';
+import { Consultant } from '~/shared/models/consultant.model';
+import { ContactType } from '~/shared/models/enum/ContactType';
+import { Gender } from '~/shared/models/enum/Gender';
+import { RegisterInfo } from '~/shared/models/registerInfo';
+import { AppointmentParams, AppointmentRequests } from '~/shared/models/appointment.model';
 
   const roleStorage = namespace('localStorage');
   @Component
   export default class Questionnaire extends Vue {
-    @State('myConsultantList') myConsultantList!: Consultant[];
-    @Action storeConsultantList!: () => Promise<number>;
-    @roleStorage.Getter isUserLogin!:boolean;
+    @State('myConsultantList')
+    myConsultantList!: Consultant[];
+
+    @Action
+    storeConsultantList!: () => Promise<number>;
+
+    @roleStorage.Getter
+    isUserLogin!:boolean;
+
+    @roleStorage.State
+    recommendConsultantItem!:string;
+
+    score ="" ;
 
     genderOptions=[
       {
@@ -247,7 +274,7 @@
                   },
                   {
                       title:'����',
-                      content:'���������憸券�����鈭怒�����嚗���摰帘摰漲嚗��隞亙��澈��ˊ�靽���嚗�'
+                      content:'���������憸券�����鈭怒�����嚗���摰帘摰漲嚗��隞亙��澈��ˊ�靽���嚗�'
                   }
     ];
 
@@ -274,9 +301,11 @@
     appointmentId = 0;
     appointmentTime = '';
 
+    ////////////////////////////////////////////////////////////////////////////
+
     beforeRouteEnter(to: any, from: any, next: any) {
       next(vm => {
-        const isUserLogin = vm.$store.getters['localStorage/isUserLogin'];
+        const isUserLogin = authService.isUserLogin();
         if (from.name === 'login' && !isUserLogin) {
           vm.$router.go(-1);
           return;
@@ -288,19 +317,16 @@
       })
     }
 
-    async fetch() {
-      if (this.isUserLogin) {
-        await this.storeConsultantList();
-      };
-    }
-
     mounted(): void {
+      if (authService.isUserLogin()) {
+        this.storeConsultantList();
+      };
       this.setMyRequest();
     }
 
     private setMyRequest(): void {
       const storageMyRequest = getRequestsFromStorage();
-      const storageMyQuestion = getRequestQuestionFromStorage();
+      const storageMyRequirement = this.recommendConsultantItem ? JSON.parse(this.recommendConsultantItem).requirements:[];
 
       if (storageMyRequest) {
         this.myRequest = {
@@ -314,100 +340,41 @@
         };
       }
 
-      if (storageMyQuestion) {
+      if (storageMyRequirement) {
         this.myRequest = {
           ...this.myRequest,
-          requirement: storageMyQuestion
+          requirement: storageMyRequirement
         }
         removeRequestQuestionFromStorage();
       }
     }
 
-    get phoneValid(): boolean {
-      const rule = /^09[0-9]{8}$/;
-      return this.myRequest.phone
-            ? rule.test(this.myRequest.phone) && _.isEqual(this.myRequest.phone.length,10)
-            : true;
-    }
+    ////////////////////////////////////////////////////////////////////////////
 
-    get userInfo(): RegisterInfo {
-      const initUserInfo = JSON.parse(localStorage.getItem('userInfo')!);
-      return initUserInfo;
-    }
+    @Watch('myConsultantList')
+    onMyConsultantListChange() {
+      if (authService.isUserLogin() && this.myConsultantList.length > 0) {
+          const editAppointment = this.getLatestReserved(this.$route.params.agentNo);
 
-    get isDisabledSubmitBtn(): boolean {
-           return _.includes(this.myRequest.contactType,ContactType.PHONE)
-      ? !this.isHopeContactTimeDone()
-      : !this.phoneValid;
-    }
-
-    private isHopeContactTimeDone():boolean{
-      return this.myRequest.hopeContactTime[0]?.selectWeekOptions.length >0 && this.myRequest.hopeContactTime[0]?.selectTimesOptions.length >0;
-    }
-
-    sentDemand() {
-      if (this.isEditBtn) {
-        this.sentEditAppointmentDemand();
-      } else {
-        addFavoriteConsultant([this.$route.params.agentNo]).then(res => this.sentAppointmentDemand());
+          if (editAppointment && editAppointment.agentNo) {
+            this.myRequest = JSON.parse(JSON.stringify(editAppointment));
+            if (!this.$route.query || this.$route.query.edit !== 'true') {
+              this.isEditPopup = true;
+            }
+            this.isEditBtn = true;
+          }
       }
-
-    }
-
-    private sentAppointmentDemand() {
-        const data: AppointmentParams = {
-          ...this.myRequest,
-          requirement: _.map(this.myRequest.requirement,o=>o).toString(),
-          hopeContactTime: this.myRequest.phone && this.phoneValid ? this.getHopeContactTime() :'',
-          agentNo: this.$route.params.agentNo
-        };
-
-        appointmentDemand(data).then(res => {
-            this.sendReserve = true;
-            this.myRequest.hopeContactTime = [];
-            setRequestsToStorage(this.myRequest);
-        });
-    }
-
-    private sentEditAppointmentDemand() {
-      const info = {
-          ...this.myRequest,
-          requirement: _.map(this.myRequest.requirement,o=>o).toString(),
-          hopeContactTime: this.myRequest.phone && this.phoneValid ? this.getHopeContactTime() :'',
-          id: this.appointmentId,
-          otherRequirement: null
-        }
-        editAppointment(info).then(res => {
-          this.sendReserve = true;
-          this.myRequest.hopeContactTime = [];
-          setRequestsToStorage(this.myRequest);
-        });
-    }
-
-    getHopeContactTime() {
-        const selectedHopeContactTime = this.myRequest.hopeContactTime.filter((i) => i.selectWeekOptions?.length && i.selectTimesOptions?.length);
-        return selectedHopeContactTime.map(i => {
-            return `'${i.selectWeekOptions}��${i.selectTimesOptions}'`}
-        ).toString();
-    }
-
-    closeReservePopUp() {
-        this.sendReserve = false;
-        this.$router.push('/')
     }
 
     private getLatestReserved(agentNo) {
       const agentInfo = this.myConsultantList.filter(item => item.agentNo === agentNo);
-
       const appointmentInfo = agentInfo.length > 0 && agentInfo[0].appointments
         ? agentInfo[0].appointments!
-              .filter((appointment) => appointment.communicateStatus !== 'contacted')
-              .map((reversedAppointment) => {
-                return {
-                  ...reversedAppointment,
+              .filter((appointment) => appointment.communicateStatus === 'reserved')
+              .map((reversedAppointment) => (
+                { ...reversedAppointment,
                   sortDate: new Date(reversedAppointment.appointmentDate)
-                }
-              })
+                }))
               .sort((preAppointment, nextAppointment) => +nextAppointment.sortDate - +preAppointment.sortDate)[0]
         : null;
       return this.getReservedData(appointmentInfo);
@@ -418,12 +385,9 @@
         const hopeContactTime = appointmentInfo!.hopeContactTime.split("'")
               .filter(item => item && item !== ',');
         this.getAppointmentId(appointmentInfo);
+
         return {
-            age: appointmentInfo.age,
-            agentNo: appointmentInfo.agentNo,
-            contactType: appointmentInfo.contactType,
-            email: appointmentInfo.email || '',
-            gender: appointmentInfo.gender,
+            ...appointmentInfo,
             hopeContactTime: hopeContactTime.map(item => {
                 const info = item.split('��');
                 return {
@@ -431,8 +395,6 @@
                     selectTimesOptions: info[1].split(',')
                 }
             }),
-            job: appointmentInfo.job,
-            phone: appointmentInfo.phone || '',
             requirement: appointmentInfo.requirement.split(',')
           }
       } else {
@@ -446,20 +408,88 @@
                   ? appointmentInfo.lastModifiedDate
                   : appointmentInfo.appointmentDate;
     }
-    @Watch('myConsultantList') onMyConsultantListChange() {
-      if (this.isUserLogin && this.myConsultantList.length > 0) {
-          const editAppointment = this.getLatestReserved(this.$route.params.agentNo);
 
-          if (editAppointment && editAppointment.agentNo) {
-            this.myRequest = JSON.parse(JSON.stringify(editAppointment));
-            if (!this.$route.query || this.$route.query.edit !== 'true') {
-              this.isEditPopup = true;
-            }
-            this.isEditBtn = true;
-            return;
-          }
+    ////////////////////////////////////////////////////////////////////////////
+
+    sentDemand() {
+      if (this.isEditBtn) {
+        this.editAppointmentDemand();
+      } else {
+        queryConsultantService.addFavoriteConsultant([this.$route.params.agentNo]).then(res => this.sentAppointmentDemand());
       }
     }
+
+    private editAppointmentDemand() {
+      const info = {
+          ...this.myRequest,
+          requirement: _.map(this.myRequest.requirement,o=>o).toString(),
+          hopeContactTime: this.myRequest.phone && this.phoneValid ? this.getHopeContactTime() :'',
+          id: this.appointmentId,
+          otherRequirement: null
+        }
+      appointmentService.editAppointment(info).then(res => {
+        this.sendReserve = true;
+        this.myRequest.hopeContactTime = [];
+        setRequestsToStorage(this.myRequest);
+      });
+    }
+
+    private sentAppointmentDemand() {
+        const data: AppointmentParams = {
+          ...this.myRequest,
+          requirement: _.map(this.myRequest.requirement,o=>o).toString(),
+          hopeContactTime: this.myRequest.phone && this.phoneValid ? this.getHopeContactTime() :'',
+          agentNo: this.$route.params.agentNo
+        };
+
+        queryConsultantService.appointmentDemand(data).then(res => {
+            this.sendReserve = true;
+            this.myRequest.hopeContactTime = [];
+            setRequestsToStorage(this.myRequest);
+        });
+    }
+
+    private getHopeContactTime() {
+        const selectedHopeContactTime = this.myRequest.hopeContactTime.filter((i) => i.selectWeekOptions?.length && i.selectTimesOptions?.length);
+        return selectedHopeContactTime.map(i => {
+            return `'${i.selectWeekOptions}��${i.selectTimesOptions}'`}
+        ).toString();
+    }
+
+    closeReservePopUp() {
+        this.sendReserve = false;
+        this.$router.push('/')
+    }
+
+    ////////////////////////////////////////////////////////////////////////////
+
+    get phoneValid(): boolean {
+      const rule = /^09[0-9]{8}$/;
+      return this.myRequest.phone
+            ? rule.test(this.myRequest.phone) && _.isEqual(this.myRequest.phone.length,10)
+            : true;
+    }
+
+    get emailValid() {
+      const rule = /^[a-zA-Z0-9._-]+@[a-zA-Z0-9.-]+\.[a-zA-Z]{2,4}$/;
+      return this.myRequest.email ? rule.test(this.myRequest.email) : true;
+    }
+
+    get userInfo(): RegisterInfo {
+      const initUserInfo = JSON.parse(localStorage.getItem('userInfo')!);
+      return initUserInfo;
+    }
+
+    get isDisabledSubmitBtn(): boolean {
+           return _.includes(this.myRequest.contactType,ContactType.PHONE)
+      ? !this.isHopeContactTimeDone() || !this.emailValid
+      : !this.phoneValid;
+    }
+
+    private isHopeContactTimeDone():boolean{
+      return this.myRequest.hopeContactTime[0]?.selectWeekOptions.length >0 && this.myRequest.hopeContactTime[0]?.selectTimesOptions.length >0;
+    }
+
   }
 </script>
 
@@ -468,7 +498,6 @@
   display: flex;
   justify-content: center;
   margin-top: 10px;
-  margin-bottom: 26px;
 }
 
 //drawer��摨���見撘�
@@ -593,6 +622,16 @@
     margin: 0px 20px;
   }
 
+.pam-app-review{
+  display: flex;
+  flex-direction: column;
+  justify-content: center;
+  align-items: center;
+}
+
+.pam-satisfaction-rate{
+  margin-bottom: 45px;
+}
 
   @include desktop{
   .ques-header{
@@ -620,5 +659,6 @@
   }
 }
 
+
 </style>
 

--
Gitblit v1.8.0