| | |
| | | <div class="ques-container"> |
| | | <div class="pam-paragraph"> |
| | | <div class="mdTxt"> |
| | | 想要詢問的問題 |
| | | 想了解的領域 |
| | | <span class="hint text--bold"> |
| | | (可複選) |
| | | </span> |
| | |
| | | <MultiSelectBtn class="mt-10" |
| | | :mutiSelect.sync="myRequest.requirement" |
| | | :options="requirementOptions" /> |
| | | </div> |
| | | <div class="pam-paragraph"> |
| | | <div class="mdTxt">諮詢方式</div> |
| | | <SingleSelectBtn class="mt-10" |
| | | :singleSelected.sync="myRequest.consultationMethod" |
| | | :options="consultationMethodOptions" /> |
| | | </div> |
| | | <div class="pam-paragraph"> |
| | | <div class="mdTxt">您的性別</div> |
| | |
| | | |
| | | <PopUpFrame :isOpen.sync="showDrawer"> |
| | | <div class="qaTextTitle mdTxt"> |
| | | <strong>想要詢問的問題</strong> |
| | | <strong>想了解的領域</strong> |
| | | </div> |
| | | <div class="qa-dialog"> |
| | | <div v-for="(qaText,index) in quesAboutList" :key="index" > |
| | |
| | | <script lang="ts"> |
| | | import { Vue, Component, State, Action, Watch, namespace } from 'nuxt-property-decorator'; |
| | | import { getRequestsFromStorage, removeRequestQuestionFromStorage, setRequestsToStorage } from '~/shared/storageRequests'; |
| | | import _ from 'lodash'; |
| | | |
| | | import accountSettingService from '~/shared/services/account-setting.service'; |
| | | import appointmentService from '~/shared/services/appointment.service'; |
| | |
| | | { |
| | | title:'女性', |
| | | label:Gender.FEMALE, |
| | | } |
| | | ]; |
| | | |
| | | consultationMethodOptions = [ |
| | | { |
| | | title: '線上', |
| | | label: 'online' |
| | | }, |
| | | { |
| | | title: '線下', |
| | | label: 'offline' |
| | | } |
| | | ]; |
| | | |
| | |
| | | ]; |
| | | |
| | | quesAboutList = [ |
| | | { |
| | | title:'健康與保障', |
| | | content:'唯有把身體照顧好,才是保障幸福之本,不做盲目燃燒的蠟燭,只做綻開的陽光,陪孩子多走一哩路,人生的美正要開展。' |
| | | }, |
| | | { |
| | | title:'子女教育', |
| | | content:'孩子,我們是雙方的導師也是學生,面對未來要並肩作戰,學會勇敢無畏、克服挫折、善於理財,這條路上我們一起學。' |
| | | }, |
| | | { |
| | | title:'資產規劃', |
| | | content:'真正的財富來自嚴謹規劃資產傳承,為人生蓋一堵抵禦財務風險的牆,確保資產穩健成長,替全家族的未來做好萬全準備。' |
| | | }, |
| | | { |
| | | title:'樂活退休', |
| | | content:'拼一輩子,退休後的日子要輕鬆快活,就得提早透過保險商品規劃退休財務,替自己創造穩定收入,為精彩的熟年人生揭開序幕。' |
| | | }, |
| | | { |
| | | title:'保單健檢/規劃', |
| | | content:'全面檢視自己的保障結構是否符合現在或未來的風險移轉需求。' |
| | | }, |
| | | { |
| | | title:'分紅保單', |
| | | content:'分紅保單是兼具「分攤風險」與「紅利共享」特色的保單,具有一定穩定度,讓您可以同時享有壽險保障及紅利!' |
| | | } |
| | | { |
| | | title:'健康與保障', |
| | | content:'唯有把身體照顧好,才是保障幸福之本,不做盲目燃燒的蠟燭,只做綻開的陽光,陪孩子多走一哩路,人生的美正要開展。' |
| | | }, |
| | | { |
| | | title:'子女教育', |
| | | content:'孩子,我們是雙方的導師也是學生,面對未來要並肩作戰,學會勇敢無畏、克服挫折、善於理財,這條路上我們一起學。' |
| | | }, |
| | | { |
| | | title:'資產規劃', |
| | | content:'真正的財富來自嚴謹規劃資產傳承,為人生蓋一堵抵禦財務風險的牆,確保資產穩健成長,替全家族的未來做好萬全準備。' |
| | | }, |
| | | { |
| | | title:'樂活退休', |
| | | content:'拼一輩子,退休後的日子要輕鬆快活,就得提早透過保險商品規劃退休財務,替自己創造穩定收入,為精彩的熟年人生揭開序幕。' |
| | | }, |
| | | { |
| | | title:'保單健檢/規劃', |
| | | content:'全面檢視自己的保障結構是否符合現在或未來的風險移轉需求。' |
| | | }, |
| | | { |
| | | title:'分紅保單', |
| | | content:'分紅保單是兼具「分攤風險」與「紅利共享」特色的保單,具有一定穩定度,讓您可以同時享有壽險保障及紅利!' |
| | | } |
| | | ]; |
| | | |
| | | myRequest: AppointmentRequests = { |
| | | name : '', |
| | | phone : '', |
| | | email : '', |
| | | contactType : _.isEqual(this.userInfo?.contactType,ContactType.SMS) ? ContactType.PHONE: ContactType.EMAIL, |
| | | contactType : this.userInfo?.contactType === ContactType.SMS ? ContactType.PHONE: ContactType.EMAIL, |
| | | gender : '', |
| | | age : '', |
| | | job : '', |
| | |
| | | selectTimesOptions: [], |
| | | }], |
| | | agentNo: '', |
| | | consultationMethod: '', |
| | | }; |
| | | |
| | | showDrawer= false; |
| | |
| | | private setMyRequest(): void { |
| | | const storageMyRequest = getRequestsFromStorage(); |
| | | const storageMyRequirement = this.recommendConsultantItem ? JSON.parse(this.recommendConsultantItem).requirements:[]; |
| | | const contactTypePromise = accountSettingService.getUserAccountSetting(); |
| | | |
| | | if (storageMyRequest) { |
| | | this.myRequest = { |
| | |
| | | removeRequestQuestionFromStorage(); |
| | | } |
| | | |
| | | contactTypePromise.then((contactTypeDetail) => { |
| | | this.myRequest = { |
| | | ...this.myRequest, |
| | | ...contactTypeDetail |
| | | } |
| | | }) |
| | | if (authService.isUserLogin()) { |
| | | accountSettingService.getUserAccountSetting().then((contactTypeDetail) => { |
| | | this.myRequest = { |
| | | ...this.myRequest, |
| | | ...contactTypeDetail |
| | | } |
| | | }) |
| | | } |
| | | |
| | | |
| | | } |
| | | |
| | |
| | | |
| | | private getReservedData(appointmentInfo) { |
| | | if (appointmentInfo) { |
| | | const hopeContactTime = appointmentInfo!.hopeContactTime.split("'") |
| | | .filter(item => item && item !== ','); |
| | | this.getAppointmentId(appointmentInfo); |
| | | |
| | | return { |
| | | ...appointmentInfo, |
| | | hopeContactTime: hopeContactTime.map(item => { |
| | | const hopeContactTime = appointmentInfo!.hopeContactTime |
| | | ? appointmentInfo!.hopeContactTime.split("'").filter(item => item && item !== ',').map(item => { |
| | | const info = item.split('、'); |
| | | return { |
| | | selectWeekOptions: info[0].split(','), |
| | | selectTimesOptions: info[1].split(',') |
| | | } |
| | | }), |
| | | requirement: appointmentInfo.requirement.split(',') |
| | | }) |
| | | :[{selectWeekOptions : [],selectTimesOptions: []}]; |
| | | this.getAppointmentId(appointmentInfo); |
| | | |
| | | return { |
| | | ...appointmentInfo, |
| | | hopeContactTime: hopeContactTime, |
| | | requirement: appointmentInfo.requirement |
| | | ? appointmentInfo.requirement.split(',') |
| | | : [] |
| | | } |
| | | } else { |
| | | return null; |
| | |
| | | |
| | | //////////////////////////////////////////////////////////////////////////// |
| | | |
| | | sentDemand() { |
| | | |
| | | async sentDemand() { |
| | | if (this.isEditBtn) { |
| | | this.editAppointmentDemand(); |
| | | await this.editAppointmentDemand(); |
| | | } else { |
| | | queryConsultantService.addFavoriteConsultant([{ agentNo: this.$route.params.agentNo, createdTime: new Date().toISOString()}]).then(res => this.sentAppointmentDemand()); |
| | | } |
| | | const editSettingInfo: UserSetting = { |
| | | name: this.myRequest.name, |
| | | phone: this.myRequest.phone, |
| | | email: this.myRequest.email, |
| | | // 使用 async/await 來等待異步操作的回傳結果 |
| | | const addFavoriteAgentList = [{ agentNo: this.$route.params.agentNo, createdTime: new Date().toISOString() }]; |
| | | const response = await queryConsultantService.addFavoriteConsultant(addFavoriteAgentList); |
| | | |
| | | // 確保異步操作的回傳結果不為 null 或 undefined |
| | | if (response !== null) { |
| | | await this.sentAppointmentDemand(); |
| | | } else { |
| | | throw new Error('queryConsultantService.addFavoriteConsultant returned null-like value.'); |
| | | } |
| | | } |
| | | |
| | | accountSettingService.updateAccountSetting(editSettingInfo).then((_) => { |
| | | this.storageUserInfo(this.userInfo); |
| | | }); |
| | | const editSettingInfo: UserSetting = { |
| | | name: this.myRequest.name, |
| | | phone: this.myRequest.phone, |
| | | email: this.myRequest.email, |
| | | }; |
| | | |
| | | await accountSettingService.updateAccountSetting(editSettingInfo); |
| | | this.storageUserInfo(this.userInfo); |
| | | } |
| | | |
| | | |
| | | private editAppointmentDemand() { |
| | | const info = { |
| | | ...this.myRequest, |
| | | requirement: _.map(this.myRequest.requirement,o=>o).toString(), |
| | | requirement: this.myRequest.requirement.map(o => o).toString(), |
| | | hopeContactTime: this.myRequest.phone && this.phoneValid ? this.getHopeContactTime() :'', |
| | | id: this.appointmentId, |
| | | otherRequirement: null |
| | |
| | | private sentAppointmentDemand() { |
| | | const data: AppointmentParams = { |
| | | ...this.myRequest, |
| | | requirement: _.map(this.myRequest.requirement,o=>o).toString(), |
| | | requirement: this.myRequest.requirement.map(o => o).toString(), |
| | | hopeContactTime: this.myRequest.phone && this.phoneValid ? this.getHopeContactTime() :'', |
| | | agentNo: this.$route.params.agentNo |
| | | }; |
| | |
| | | get phoneValid(): boolean { |
| | | const rule = /^09[0-9]{8}$/; |
| | | return this.myRequest.phone |
| | | ? rule.test(this.myRequest.phone) && _.isEqual(this.myRequest.phone.length,10) |
| | | ? rule.test(this.myRequest.phone) && this.myRequest.phone.length === 10 |
| | | : true; |
| | | } |
| | | |
| | |
| | | } |
| | | |
| | | get isDisabledSubmitBtn(): boolean { |
| | | return _.includes(this.myRequest.contactType,ContactType.PHONE) |
| | | ? !this.isHopeContactTimeDone() || !this.emailValid |
| | | : !this.phoneValid; |
| | | return this.myRequest.contactType.includes(ContactType.PHONE) |
| | | ? !this.isHopeContactTimeDone() || !this.emailValid |
| | | : !this.phoneValid; |
| | | } |
| | | |
| | | private isHopeContactTimeDone():boolean{ |
| | |
| | | |
| | | |
| | | </style> |
| | | |