保誠-保戶業務員媒合平台
Tomas
2023-08-17 89a12be9b19405ea5f775cf2981375cefe575d1b
PAMapp/pages/index.vue
@@ -2,6 +2,7 @@
  <div>
    <Ui-Carousel></Ui-Carousel>
    <div class="page-container">
      <div>
        <h5 class="mdTxt">預約保險顧問</h5>
        <div class="mt-10 pam-reserveBtn--block">
@@ -15,6 +16,7 @@
          </el-button>
        </div>
      </div>
      <div class="pam-paragraph">
        <el-row class="rowStyle">
          <el-col :span="16">
@@ -29,6 +31,8 @@
        <ConsultantList class="mt-10"
          :agents="consultantList.slice(0, 3)"></ConsultantList>
      </div>
      <div class='pam-paragraph'>
        <div class="pam-recommend">
          <h5 class="mdTxt">推薦保險顧問</h5>
@@ -55,7 +59,8 @@
                  <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"
@@ -137,25 +142,40 @@
              </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"
        :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 { 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';
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({
@@ -180,6 +200,9 @@
    @Action
    storeConsultantList!: any;
    @Mutation
    setAccessSource!: (accessSource: AccessFroms) => void;
    @localStorage.Mutation
    storageClearQuickFilter!: () => void;
@@ -219,7 +242,7 @@
      appointmentDate   : '',
      appointmentMemoList: [],
      appointmentNoticeLogs: [],
      communicateStatus : this.contactStatus.PICKED,
      communicateStatus: this.contactStatus.PICKED,
      consultantReadTime: '',
      consultantViewTime: '',
      contactTime       : '',
@@ -237,6 +260,7 @@
      phone             : '',
      requirement       : '',
      satisfactionScore : 0,
      consultationMethod    : ''
    };
    agentInfo: Consultant = {
@@ -254,9 +278,31 @@
      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 {
@@ -325,7 +371,7 @@
          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':
@@ -358,7 +404,9 @@
    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();
@@ -405,6 +453,10 @@
        this.$router.push(newRouteQuery);
        this.storageClearSatisfactionIdFromMsg();
        this.storageClearNotContactAppointmentIdFromMsg();
    }
    closeVideo(): void {
      this.isCloseVideo = true;
    }
    ///////////////////////////////////////////////////////////////////////////////
@@ -486,6 +538,7 @@
    align-items: center;
  }
  @media (min-width: 576px) and (max-width: 767px) {
    .quickFilter.el-button--default {
      background-image: url('~/assets/images/quickFilter/banner_web.svg');
@@ -502,6 +555,15 @@
      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;
@@ -511,4 +573,32 @@
      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>