| | |
| | | <div> |
| | | <Ui-Carousel></Ui-Carousel> |
| | | <div class="page-container"> |
| | | |
| | | <div> |
| | | <h5 class="mdTxt">預約保險顧問</h5> |
| | | <div class="mt-10 pam-reserveBtn--block"> |
| | |
| | | </el-button> |
| | | </div> |
| | | </div> |
| | | |
| | | <div class="pam-paragraph"> |
| | | <el-row class="rowStyle"> |
| | | <el-col :span="16"> |
| | |
| | | <ConsultantList class="mt-10" |
| | | :agents="consultantList.slice(0, 3)"></ConsultantList> |
| | | </div> |
| | | |
| | | |
| | | <div class='pam-paragraph'> |
| | | <div class="pam-recommend"> |
| | | <h5 class="mdTxt">推薦保險顧問</h5> |
| | |
| | | <p>性別:{{gender}}</p> |
| | | <p>年齡:{{appointmentDetail.age | toAgeLabel }}</p> |
| | | <p>職業:{{appointmentDetail.job}}</p> |
| | | <p>需求:{{appointmentDetail.requirement.split(',').join('、')}}</p> |
| | | <p>諮詢方式:{{appointmentDetail.consultationMethod | toConsultationMethod }}</p> |
| | | <p>需求:{{ appointmentDetail.requirement ? appointmentDetail.requirement.split(',').join('、') : '--'}}</p> |
| | | <p |
| | | v-for="(item, index) in hopeContactTime" |
| | | :key="index" |
| | |
| | | </div> |
| | | </div> |
| | | </PopUpFrame> |
| | | |
| | | <div class="video-container" |
| | | v-if="isShowFilmPlayer" |
| | | style="position: fixed; bottom: 30px; right: 30px; z-index: 9999; display: flex; justify-content: flex-end;" |
| | | > |
| | | <iframe |
| | | id="ytplayer" type="text/html" width="360" height="270" |
| | | frameborder="0" |
| | | allowfullscreen |
| | | sandbox="allow-scripts allow-same-origin allow-popups allow-presentation fullscreen" |
| | | :src="filmVideoSrc" |
| | | ></iframe> |
| | | <div class="close-btn" @click="closeVideo()">X</div> |
| | | </div> |
| | | |
| | | </div> |
| | | </template> |
| | | |
| | | <script lang="ts"> |
| | | import { Vue, Component, State, Action, Watch, namespace } from 'nuxt-property-decorator'; |
| | | import {Action, Component, Getter, Mutation, namespace, State, Vue, Watch} from 'nuxt-property-decorator'; |
| | | |
| | | import appointmentService from '~/shared/services/appointment.service'; |
| | | import reviewsService from '~/shared/services/reviews.service'; |
| | | import UtilsService from '~/shared/services/utils.service'; |
| | | import myConsultantService from '~/shared/services/my-consultant.service'; |
| | | import { Appointment, AppointmentClosedInfo } from '~/shared/models/appointment.model'; |
| | | import { Consultant } from '~/shared/models/consultant.model'; |
| | | import { UserReviewsConsultantsParams } from '~/shared/models/reviews.model'; |
| | | import { StrictQueryParams } from '~/shared/models/strict-query.model'; |
| | | import { AgentInfo } from '~/shared/models/agent-info.model'; |
| | | import { ContactStatus } from '~/shared/models/enum/contact-status'; |
| | | import appointmentService from '~/shared/services/appointment.service'; |
| | | import utilService, {AccessFroms} from '~/shared/services/utils.service'; |
| | | import reviewsService from '~/shared/services/reviews.service'; |
| | | import myConsultantService from '~/shared/services/my-consultant.service'; |
| | | import {Appointment, AppointmentClosedInfo} from '~/shared/models/appointment.model'; |
| | | import {Consultant} from '~/shared/models/consultant.model'; |
| | | import {UserReviewParams} from '~/shared/models/reviews.model'; |
| | | import {StrictQueryParams} from '~/shared/models/strict-query.model'; |
| | | import {AgentInfo} from '~/shared/models/agent-info.model'; |
| | | import {ContactStatus} from '~/shared/models/enum/contact-status'; |
| | | import {SatisfactionType} from '~/shared/models/enum/satisfaction-type'; |
| | | |
| | | const localStorage = namespace('localStorage'); |
| | | const localStorage = namespace('localStorage'); |
| | | const roleStorage = namespace('localStorage'); |
| | | |
| | | @Component({ |
| | |
| | | |
| | | @Action |
| | | storeConsultantList!: any; |
| | | |
| | | @Mutation |
| | | setAccessSource!: (accessSource: AccessFroms) => void; |
| | | |
| | | @localStorage.Mutation |
| | | storageClearQuickFilter!: () => void; |
| | |
| | | appointmentDate : '', |
| | | appointmentMemoList: [], |
| | | appointmentNoticeLogs: [], |
| | | communicateStatus : this.contactStatus.PICKED, |
| | | communicateStatus: this.contactStatus.PICKED, |
| | | consultantReadTime: '', |
| | | consultantViewTime: '', |
| | | contactTime : '', |
| | |
| | | phone : '', |
| | | requirement : '', |
| | | satisfactionScore : 0, |
| | | consultationMethod : '' |
| | | }; |
| | | |
| | | agentInfo: Consultant = { |
| | |
| | | appointments : [] |
| | | }; |
| | | |
| | | isCloseVideo = false; |
| | | |
| | | @Getter |
| | | fromAccess!: AccessFroms; |
| | | |
| | | get filmVideoSrc() { |
| | | if (!this.fromAccess) return ''; |
| | | return this.fromAccess === AccessFroms.FILM_1 |
| | | ? 'https://www.youtube.com/embed/zVBLW9hWD0g?autoplay=1&mute=1&loop=1&playlist=zVBLW9hWD0g' |
| | | : 'https://www.youtube.com/embed/655JnwbuRGA?autoplay=1&mute=1&loop=1&playlist=655JnwbuRGA'; |
| | | } |
| | | |
| | | |
| | | get isShowFilmPlayer() { |
| | | return !!this.fromAccess && !this.isCloseVideo; |
| | | } |
| | | |
| | | ////////////////////////////////////////////////////////////////////// |
| | | |
| | | mounted() { |
| | | if (this.$route.query.from) { |
| | | const fromSource = this.$route.query.from as AccessFroms; |
| | | this.setAccessSource(fromSource); |
| | | utilService.insertAccessFrom(fromSource); |
| | | } |
| | | if (this.isAdminLogin) { |
| | | this.$router.push('/myAppointmentList/appointmentList'); |
| | | } else { |
| | |
| | | const appointmentInfo = values[1] as Appointment; |
| | | this.consultantName = agentInfo.name; |
| | | this.appointmentDetail = appointmentInfo; |
| | | this.appointmentDialogWidth = UtilsService.isMobileDevice() ? '80%' : ''; |
| | | this.appointmentDialogWidth = utilService.isMobileDevice() ? '80%' : ''; |
| | | this.isShowAppointmentDialog = true; |
| | | switch (reason) { |
| | | case 'inviteReviewConsultant': |
| | |
| | | |
| | | reAppointment(): void { |
| | | appointmentService.cancelAppointment(this.appointmentDetail.id).then(() => { |
| | | const requirements = this.appointmentDetail.requirement.split(','); |
| | | const requirements = this.appointmentDetail && this.appointmentDetail.requirement |
| | | ? this.appointmentDetail.requirement.split(',') |
| | | : []; |
| | | this.storeConsultantList(); |
| | | this.storageStrickQueryItem({ requirements: requirements }); |
| | | this.storageClearNotContactAppointmentIdFromMsg(); |
| | |
| | | } |
| | | |
| | | userReviewsConsultants() { |
| | | const reviewParams: UserReviewsConsultantsParams = { |
| | | const reviewParams: UserReviewParams = { |
| | | appointmentId: this.appointmentDetail.id, |
| | | score: this.inputScore, |
| | | type: SatisfactionType.APPOINTMENT |
| | | } |
| | | this.appointmentDetail.satisfactionScore = this.inputScore; |
| | | |
| | |
| | | this.$router.push(newRouteQuery); |
| | | this.storageClearSatisfactionIdFromMsg(); |
| | | this.storageClearNotContactAppointmentIdFromMsg(); |
| | | } |
| | | |
| | | closeVideo(): void { |
| | | this.isCloseVideo = true; |
| | | } |
| | | |
| | | /////////////////////////////////////////////////////////////////////////////// |
| | |
| | | align-items: center; |
| | | } |
| | | |
| | | |
| | | @media (min-width: 576px) and (max-width: 767px) { |
| | | .quickFilter.el-button--default { |
| | | background-image: url('~/assets/images/quickFilter/banner_web.svg'); |
| | |
| | | margin: 0 auto; |
| | | } |
| | | |
| | | .landing-container { |
| | | border: 2px solid blue; |
| | | border-radius: 10px; |
| | | padding: 10px; |
| | | display: flex; |
| | | flex-direction: column; |
| | | align-items: center; |
| | | } |
| | | |
| | | .pam-reserveBtn--block { |
| | | display: flex; |
| | | justify-content: space-between; |
| | |
| | | max-width: 335px; |
| | | } |
| | | } |
| | | |
| | | /* 確保 .video-container 有相對/絕對定位或固定寬度 */ |
| | | .video-container { |
| | | position: relative; |
| | | width: auto; /* 根據你的影片尺寸調整 */ |
| | | } |
| | | |
| | | /* 關閉按鈕樣式 */ |
| | | .close-btn { |
| | | position: absolute; |
| | | top: -10px; |
| | | right: -10px; |
| | | cursor: pointer; |
| | | font-size: 20px; |
| | | color: #fff; |
| | | background-color: #000; |
| | | width: 30px; |
| | | height: 30px; |
| | | text-align: center; |
| | | line-height: 30px; |
| | | border-radius: 50%; |
| | | opacity: 0.7; |
| | | } |
| | | |
| | | .close-btn:hover { |
| | | opacity: 1; |
| | | } |
| | | |
| | | </style> |