From f36e617e9e534a4b05f2029724d678bbd6c655b3 Mon Sep 17 00:00:00 2001 From: Tomas <tomasysh@gmail.com> Date: 星期三, 22 十二月 2021 11:38:54 +0800 Subject: [PATCH] refactor: separate api/consultant.ts into serveral services --- PAMapp/pages/questionnaire/_agentNo.vue | 299 ++++++++++++++++++++++++++++++++++++++++------------------- 1 files changed, 202 insertions(+), 97 deletions(-) diff --git a/PAMapp/pages/questionnaire/_agentNo.vue b/PAMapp/pages/questionnaire/_agentNo.vue index 547af0a..83f35e9 100644 --- a/PAMapp/pages/questionnaire/_agentNo.vue +++ b/PAMapp/pages/questionnaire/_agentNo.vue @@ -1,12 +1,12 @@ <template> - <div class="ques-page--reset" v-if="isLogin"> + <div class="ques-page--reset" v-if="isUserLogin"> <div class="ques-header"> <div class="ques-header__mob-banner"></div> <div class="ques-header__info" v-if="myRequest.contactType==='phone'"> <div class="text--middle"> - <div class="mdTxt">雿���蝜急撘�</div> + <div class="mdTxt">�����蝜急撘�</div> <div class="mt-10"> <span>�����</span> <span>{{myRequest.phone}}</span> @@ -31,7 +31,7 @@ </div> <div class="ques-header__info" v-else> <div class="text--middle"> - <div class="mdTxt">雿���蝜急撘�</div> + <div class="mdTxt">�����蝜急撘�</div> <div class="mt-10 ques-header__input-block"> <span>Email嚗�</span> <span>{{myRequest.email}}</span> @@ -80,7 +80,7 @@ :options="genderOptions" /> </div> <div class="pam-paragraph"> - <div class="mdTxt">撟湧翩</div> + <div class="mdTxt">���僑朣�</div> <SingleSelectBtn class="mt-10" :singleSelected.sync="myRequest.age" :options="ageRangeOptions" /> @@ -92,12 +92,12 @@ <el-button type="primary" :disabled="isDisabledSubmitBtn" @click.native="sentDemand"> - � + {{isEditBtn ? '��' : '�'}} </el-button> </div> </div> - <PopUpFrame :isOpen.sync="showDrawer" :drawerSize=" '95%' "> + <PopUpFrame :isOpen.sync="showDrawer"> <div class="qaTextTitle mdTxt"> <strong>�閬岷������</strong> </div> @@ -115,8 +115,8 @@ </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="text--middle mt-30 sendReserve-txt">�������</div> + <div class="text--middle sendReserve-txt">�����“�������蝯∴��</div> <div class="text--center mdTxt"> <el-button type="primary" @click="closeReservePopUp"> @@ -124,20 +124,41 @@ </el-button> </div> </PopUpFrame> + + <PopUpFrame :isOpen.sync="isEditPopup"> + <div class="text--middle text--center mb-10">撌脫 + <span class="bold">{{appointmentTime | formatDate}}</span> + �脰�����</div> + <div class="text--middle text--center mb-30">��蝜潛�楊頛荔��</div> + <div class="text--center mdTxt"> + <el-button @click="$router.go(-1)">餈��</el-button> + <el-button @click="isEditPopup = false" type="primary">蝺刻摩</el-button> + </div> + </PopUpFrame> </div> </template> <script lang="ts"> - import { Vue, Component } from 'nuxt-property-decorator'; - import { addFavoriteConsultant, appointmentDemand, AppointmentParams, AppointmentRequests ,RegisterInfo } from '~/assets/ts/api/consultant'; - import { getRequestsFromStorage, setRequestsToStorage, getRequestQuestionFromStorage, removeRequestQuestionFromStorage } from '~/assets/ts/storageRequests'; - import { Gender } from '~/assets/ts/models/enum/Gender'; - import { ContactType } from '~/assets/ts/models/enum/ContactType'; - import _ from 'lodash'; - import { isLogin } from '~/assets/ts/auth'; +import { Vue, Component, State, Action, Watch, namespace } from 'nuxt-property-decorator'; +import { getRequestsFromStorage, removeRequestQuestionFromStorage, setRequestsToStorage } from '~/shared/storageRequests'; +import _ from 'lodash'; +import queryConsultantService from '~/shared/services/query-consultant.service'; +import appointmentService from '~/shared/services/appointment.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; + @roleStorage.State recommendConsultantItem!:string; + genderOptions=[ { title:'���', @@ -194,10 +215,6 @@ label:'41-50' }, { - title:'46-55 甇�', - label:'46-55', - }, - { title:'51-60 甇�', label:'51-60', }, @@ -234,7 +251,7 @@ }, { title:'����', - content:'���� ���������憸券�����鈭怒�����嚗���摰帘摰漲嚗��隞亙��澈��ˊ�靽���嚗�' + content:'���������憸券�����鈭怒�����嚗���摰帘摰漲嚗��隞亙��澈��ˊ�靽���嚗�' } ]; @@ -255,18 +272,30 @@ showDrawer= false; sendReserve = false; + isEditPopup = false; + isEditBtn = false; + + appointmentId = 0; + appointmentTime = ''; beforeRouteEnter(to: any, from: any, next: any) { next(vm => { - if (from.name === 'login' && !isLogin()) { + const isUserLogin = vm.$store.getters['localStorage/isUserLogin']; + if (from.name === 'login' && !isUserLogin) { vm.$router.go(-1); return; } - if (!isLogin()) { + if (!isUserLogin) { vm.$router.push('/login'); } }) + } + + async fetch() { + if (this.isUserLogin) { + await this.storeConsultantList(); + }; } mounted(): void { @@ -275,7 +304,7 @@ private setMyRequest(): void { const storageMyRequest = getRequestsFromStorage(); - const storageMyQuestion = getRequestQuestionFromStorage(); + const storageMyRequirement = this.recommendConsultantItem ? JSON.parse(this.recommendConsultantItem).requirements:[]; if (storageMyRequest) { this.myRequest = { @@ -289,10 +318,10 @@ }; } - if (storageMyQuestion) { + if (storageMyRequirement) { this.myRequest = { ...this.myRequest, - requirement: storageMyQuestion + requirement: storageMyRequirement } removeRequestQuestionFromStorage(); } @@ -316,16 +345,17 @@ : !this.phoneValid; } - get isLogin() { - return isLogin(); - } - private isHopeContactTimeDone():boolean{ return this.myRequest.hopeContactTime[0]?.selectWeekOptions.length >0 && this.myRequest.hopeContactTime[0]?.selectTimesOptions.length >0; } sentDemand() { - addFavoriteConsultant([this.$route.params.agentNo]).then(res => this.sentAppointmentDemand()); + if (this.isEditBtn) { + this.sentEditAppointmentDemand(); + } else { + queryConsultantService.addFavoriteConsultant([this.$route.params.agentNo]).then(res => this.sentAppointmentDemand()); + } + } private sentAppointmentDemand() { @@ -336,10 +366,25 @@ agentNo: this.$route.params.agentNo }; - appointmentDemand(data).then(res => { + queryConsultantService.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 + } + appointmentService.editAppointment(info).then(res => { + this.sendReserve = true; + this.myRequest.hopeContactTime = []; + setRequestsToStorage(this.myRequest); }); } @@ -355,34 +400,98 @@ 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, + sortDate: new Date(reversedAppointment.appointmentDate) + } + }) + .sort((preAppointment, nextAppointment) => +nextAppointment.sortDate - +preAppointment.sortDate)[0] + : null; + return this.getReservedData(appointmentInfo); + } + + private getReservedData(appointmentInfo) { + if (appointmentInfo) { + 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, + hopeContactTime: hopeContactTime.map(item => { + const info = item.split('��'); + return { + selectWeekOptions: info[0].split(','), + selectTimesOptions: info[1].split(',') + } + }), + job: appointmentInfo.job, + phone: appointmentInfo.phone || '', + requirement: appointmentInfo.requirement.split(',') + } + } else { + return null; + } + } + + private getAppointmentId(appointmentInfo) { + this.appointmentId = appointmentInfo.id; + this.appointmentTime = appointmentInfo.lastModifiedDate + ? 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; + } + } + } } </script> <style lang="scss" scoped> .sendReserve-txt{ - display: flex; - justify-content: center; - margin-top: 10px; - margin-bottom: 26px; + display: flex; + justify-content: center; + margin-top: 10px; + margin-bottom: 26px; } //drawer��摨���見撘� .qa-dialog-footer{ - display: flex; - justify-content: center; - margin-bottom: 81px; - color: #ED1B2E; - cursor: pointer; + display: flex; + justify-content: center; + margin-bottom: 81px; + color: #ED1B2E; + cursor: pointer; } //����見撘���� .ques-footer{ - justify-content: center; - margin: 30px 0; - display: flex; - flex-direction: column; - align-items: center; - .el-button { + justify-content: center; + margin: 30px 0; + display: flex; + flex-direction: column; + align-items: center; + .el-button { width: 120px; height:50px; background-color: #ED1B2E; @@ -410,43 +519,39 @@ //閰喟敦���rawer銝剝�摰寧征��之撠身蝵� .qa-dialog{ - overflow-y:auto; - height: 500px; - margin-top: 20px; + overflow-y:auto; + height: 60vh; + margin-top: 20px; } //閰喟敦���rawer銝餉���� .qaTextTitle{ - margin-top:30px; - display: flex; - justify-content: center; -} - -.el-button+.el-button{ - margin-left: 0; + margin-top:30px; + display: flex; + justify-content: center; } .datepicker{ - display: flex; - flex-direction: column; + display: flex; + flex-direction: column; } .required { - position: relative; - &::before { - content: '*'; - position: absolute; - color: #FF0000; - transform: translate(-12px, 0); - } + position: relative; + &::before { + content: '*'; + position: absolute; + color: #FF0000; + transform: translate(-12px, 0); + } } .ques-page--reset.pam-page-container { - margin: 0px auto; + margin: 0px auto; } .ques-header { - position: relative; + position: relative; } .ques-header__mob-banner { @@ -459,41 +564,41 @@ background-position: center; } -.ques-header__info { - position: relative; - padding:30px 20px; - margin: 0px 20px; - background-color: #B3E7E3; - border-radius: 10px; -} - -.ques-header__input-block { - display: flex; - align-items: center; - @extend .text--middle,.mt-10 ; - .ques-header__input{ - &.is-invalid{ - border: 2px solid $PRIMARY_RED !important; - } - flex: 1; - height: 50px; + .ques-header__info { + position: relative; + padding:30px 20px; + margin: 0px 20px; + background-color: #B3E7E3; border-radius: 10px; - border: 1px #CCCCCC solid; - background-color: $PRIMARY_WHITE; - padding: 15px 10px; - box-sizing: border-box; - -webkit-box-sizing: border-box; - -moz-box-sizing: border-box; } -} -.ques-container { - position: relative; - margin: 0px 20px; -} + .ques-header__input-block { + display: flex; + align-items: center; + @extend .text--middle,.mt-10 ; + .ques-header__input{ + &.is-invalid{ + border: 2px solid $PRIMARY_RED !important; + } + flex: 1; + height: 50px; + border-radius: 10px; + border: 1px #CCCCCC solid; + background-color: $PRIMARY_WHITE; + padding: 15px 10px; + box-sizing: border-box; + -webkit-box-sizing: border-box; + -moz-box-sizing: border-box; + } + } + + .ques-container { + position: relative; + margin: 0px 20px; + } -@include desktop{ + @include desktop{ .ques-header{ display: flex; justify-content: flex-end; -- Gitblit v1.8.0