| | |
| | | <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> |
| | |
| | | </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> |
| | | <!-- TODO: 未串接 api, 隱藏平台滿意度 --> |
| | | <!-- <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> --> |
| | | <el-button type="primary" |
| | | @click="closeReservePopUp"> |
| | | 我知道了 |
| | |
| | | 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; |
| | | @State('myConsultantList') |
| | | myConsultantList!: Consultant[]; |
| | | |
| | | @Action |
| | | storeConsultantList!: () => Promise<number>; |
| | | |
| | | @roleStorage.Getter |
| | | isUserLogin!:boolean; |
| | | |
| | | @roleStorage.State |
| | | recommendConsultantItem!:string; |
| | | |
| | | score ="" ; |
| | | |
| | | genderOptions=[ |
| | | { |
| | |
| | | }, |
| | | { |
| | | title:'分紅保單', |
| | | content:'分紅保單是兼具「分攤風險」與「紅利共享」特色的保單,具有一定穩定度,讓你可以同時享有壽險保障及紅利!' |
| | | content:'分紅保單是兼具「分攤風險」與「紅利共享」特色的保單,具有一定穩定度,讓您可以同時享有壽險保障及紅利!' |
| | | } |
| | | ]; |
| | | |
| | |
| | | appointmentId = 0; |
| | | appointmentTime = ''; |
| | | |
| | | //////////////////////////////////////////////////////////////////////////// |
| | | |
| | | beforeRouteEnter(to: any, from: any, next: any) { |
| | | next(vm => { |
| | | const isUserLogin = authService.isUserLogin(); |
| | |
| | | }) |
| | | } |
| | | |
| | | async fetch() { |
| | | if (authService.isUserLogin()) { |
| | | await this.storeConsultantList(); |
| | | }; |
| | | } |
| | | |
| | | mounted(): void { |
| | | if (authService.isUserLogin()) { |
| | | this.storeConsultantList(); |
| | | }; |
| | | this.setMyRequest(); |
| | | } |
| | | |
| | |
| | | } |
| | | } |
| | | |
| | | 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; |
| | | //////////////////////////////////////////////////////////////////////////// |
| | | |
| | | @Watch('myConsultantList') |
| | | onMyConsultantListChange() { |
| | | if (authService.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; |
| | | } |
| | | } |
| | | } |
| | | |
| | | get userInfo(): RegisterInfo { |
| | | const initUserInfo = JSON.parse(localStorage.getItem('userInfo')!); |
| | | return initUserInfo; |
| | | 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 === 'reserved') |
| | | .map((reversedAppointment) => ( |
| | | { ...reversedAppointment, |
| | | sortDate: new Date(reversedAppointment.appointmentDate) |
| | | })) |
| | | .sort((preAppointment, nextAppointment) => +nextAppointment.sortDate - +preAppointment.sortDate)[0] |
| | | : null; |
| | | return this.getReservedData(appointmentInfo); |
| | | } |
| | | |
| | | get isDisabledSubmitBtn(): boolean { |
| | | return _.includes(this.myRequest.contactType,ContactType.PHONE) |
| | | ? !this.isHopeContactTimeDone() |
| | | : !this.phoneValid; |
| | | private getReservedData(appointmentInfo) { |
| | | if (appointmentInfo) { |
| | | const hopeContactTime = appointmentInfo!.hopeContactTime.split("'") |
| | | .filter(item => item && item !== ','); |
| | | this.getAppointmentId(appointmentInfo); |
| | | |
| | | return { |
| | | ...appointmentInfo, |
| | | hopeContactTime: hopeContactTime.map(item => { |
| | | const info = item.split('、'); |
| | | return { |
| | | selectWeekOptions: info[0].split(','), |
| | | selectTimesOptions: info[1].split(',') |
| | | } |
| | | }), |
| | | requirement: appointmentInfo.requirement.split(',') |
| | | } |
| | | } else { |
| | | return null; |
| | | } |
| | | } |
| | | |
| | | private isHopeContactTimeDone():boolean{ |
| | | return this.myRequest.hopeContactTime[0]?.selectWeekOptions.length >0 && this.myRequest.hopeContactTime[0]?.selectTimesOptions.length >0; |
| | | private getAppointmentId(appointmentInfo) { |
| | | this.appointmentId = appointmentInfo.id; |
| | | this.appointmentTime = appointmentInfo.lastModifiedDate |
| | | ? appointmentInfo.lastModifiedDate |
| | | : appointmentInfo.appointmentDate; |
| | | } |
| | | |
| | | //////////////////////////////////////////////////////////////////////////// |
| | | |
| | | sentDemand() { |
| | | if (this.isEditBtn) { |
| | | this.sentEditAppointmentDemand(); |
| | | 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() { |
| | |
| | | }); |
| | | } |
| | | |
| | | 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); |
| | | }); |
| | | } |
| | | |
| | | getHopeContactTime() { |
| | | private getHopeContactTime() { |
| | | const selectedHopeContactTime = this.myRequest.hopeContactTime.filter((i) => i.selectWeekOptions?.length && i.selectTimesOptions?.length); |
| | | return selectedHopeContactTime.map(i => { |
| | | return `'${i.selectWeekOptions}、${i.selectTimesOptions}'`} |
| | |
| | | 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); |
| | | 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; |
| | | } |
| | | |
| | | 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; |
| | | } |
| | | 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; |
| | | } |
| | | |
| | | private getAppointmentId(appointmentInfo) { |
| | | this.appointmentId = appointmentInfo.id; |
| | | this.appointmentTime = appointmentInfo.lastModifiedDate |
| | | ? appointmentInfo.lastModifiedDate |
| | | : appointmentInfo.appointmentDate; |
| | | 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); |
| | | |
| | | 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; |
| | | } |
| | | } |
| | | 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> |
| | | |
| | |
| | | display: flex; |
| | | justify-content: center; |
| | | margin-top: 10px; |
| | | margin-bottom: 26px; |
| | | } |
| | | |
| | | //drawer最底下文字樣式 |
| | |
| | | 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{ |
| | |
| | | } |
| | | } |
| | | |
| | | |
| | | </style> |
| | | |