保誠-保戶業務員媒合平台
HelenHuang
2021-12-28 cbd3dd0632db02f147f27107971b6b5c22e035cf
[尚未完成] 編輯 AgentInfo
修改4個檔案
新增1個檔案
513 ■■■■■ 已變更過的檔案
PAMapp/pages/agentInfo/_agentNo.vue 12 ●●●● 修補檔 | 檢視 | 原始 | 究查 | 歷程
PAMapp/pages/agentInfo/edit/_agentNo.vue 466 ●●●●● 修補檔 | 檢視 | 原始 | 究查 | 歷程
PAMapp/shared/models/account.model.ts 23 ●●●●● 修補檔 | 檢視 | 原始 | 究查 | 歷程
PAMapp/shared/models/agent-info.model.ts 5 ●●●● 修補檔 | 檢視 | 原始 | 究查 | 歷程
PAMapp/shared/services/account-setting.service.ts 7 ●●●● 修補檔 | 檢視 | 原始 | 究查 | 歷程
PAMapp/pages/agentInfo/_agentNo.vue
@@ -134,8 +134,8 @@
        type="flex"
        class="pam-paragraph">
        <UiField icon="school" label="個人背景">
          <span v-for="(experience, index) in agentInfo.experiences" :key="index">
            {{ experience }}<span v-if="index !== agentInfo.experiences.length - 1">, </span>
          <span>
            {{ agentInfo.experiences }}
          </span>
        </UiField>
      </el-row>
@@ -182,6 +182,9 @@
            </div>
        </div>
    </PopUpFrame>
    <div class="consultant-edit-btn" v-if="currentRole === role.ADMIN">
      <el-button type="primary" @click.native="$router.push(`/agentInfo/edit/${agentInfo.agentNo}`)">編輯帳戶資訊</el-button>
    </div>
    </div>
</template>
@@ -291,5 +294,8 @@
  flex-wrap: wrap;
  line-height: 24px;
}
.consultant-edit-btn{
  display: flex;
  justify-content: center;
}
</style>
PAMapp/pages/agentInfo/edit/_agentNo.vue
¤ñ¹ï·sÀÉ®×
@@ -0,0 +1,466 @@
<template>
    <div>
      <el-row
        type="flex"
        justify="center">
        <UiAvatar :size="150" :fileName="agentInfo.img"></UiAvatar>
      </el-row>
      <el-row
        type="flex"
        class="pt-10"
        justify="center"
        align="middle" v-if="!hideReviews">
        <!-- TODO:隱藏滿意度 -->
          <i class="pam-icon icon--primary icon-star"></i>
          <h3 class="mdTxt">{{ agentInfo.avgScore }}</h3>
      </el-row>
      <el-row
        type="flex"
        class="pt-10"
        justify="center">
        <el-input class="mdTxt" v-model="editInfoValue.name"></el-input>
      </el-row>
      <el-row
        type="flex"
        class="pam-paragraph">
        <UiField :span="12" icon="agent" label="頭銜">
          <el-input  v-model="editInfoValue.title"></el-input>
        </UiField>
      </el-row>
      <el-row
        type="flex"
        class="pam-paragraph">
        <UiField icon="company" label="服務地區">
          <el-input  v-model="editInfoValue.serveArea"></el-input>
        </UiField>
      </el-row>
      <el-row
        type="flex"
        class="pam-paragraph">
        <UiField icon="address" label="公司地址">
          <el-input  v-model="editInfoValue.companyAddress"></el-input>
        </UiField>
      </el-row>
      <el-row
        type="flex"
        class="pam-paragraph">
        <UiField :span="12" icon="time" label="最後上線時間">
          {{ agentInfo.latestLoginTime | formatDate }}
        </UiField>
        <UiField :span="12" icon="calender" label="服務資歷" style="display:flex">
          <el-input  v-model="editInfoValue.seniorityYear" class="seniority-input"></el-input>å¹´
          <el-select  style="width:60px" v-model="editInfoValue.seniorityMonth" class="seniority-input">
            <el-option
              v-for="(month) in [0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12]"
              :value="month"
              :key="month">
              {{ month }}
            </el-option>
          </el-select>月
        </UiField>
      </el-row>
      <el-row
        type="flex"
        class="pam-paragraph">
        <el-col :span="24" class="pam-field">
          <div class="pam-field__label pam-progress__label">
            <div>
              <div class="pam-field__title">
                <i class="pam-icon icon-thumbs-up"
                  ></i>諮詢度表現 <i class="pl-5 text--primary icon-information" @click="alertFieldInfo('evaluation')"></i>
              </div>
            </div>
            <div class="xsTxt">
              {{ agentInfo.evaluation }}/50 (近一個月/累計)
            </div>
          </div>
          <div class="pam-field__content pam-field-evaluation pt-10">
            <el-progress :show-text="false" :stroke-width="15" :percentage="agentInfo.evaluation * 2"></el-progress>
          </div>
        </el-col>
      </el-row>
      <el-row
        type="flex"
        class="pam-paragraph">
        <el-checkbox
            v-model="editInfoValue.communicationStyle"
            :label="communicateStyle"
            :key="index"
            v-for="(communicateStyle, index) in communicationStyleList">
          </el-checkbox>
      </el-row>
      <el-row
        type="flex"
        class="pam-paragraph">
        <UiField icon="flag" label="專長領域">
          <el-checkbox
            v-model="editInfoValue.expert"
            :label="item.name"
            :key="item.id"
            v-for="item in expertList">
          </el-checkbox>
        </UiField>
      </el-row>
      <el-row
        type="flex"
        class="pam-paragraph">
        <UiField icon="comment" label="個人理念">
          <el-input type="textarea" autosize v-model="editInfoValue.concept"></el-input>
        </UiField>
      </el-row>
      <el-row
        type="flex"
        class="pam-paragraph">
        <UiField icon="school" label="個人背景">
            <el-input type="textarea" autosize v-model="editInfoValue.experience"></el-input>
        </UiField>
      </el-row>
      <el-row
        type="flex"
        class="pam-paragraph">
        <UiField icon="trophy" label="得獎經歷">
          <el-input type="textarea" autosize style="height:70%" v-model="editInfoValue.awards"></el-input>
        </UiField>
      </el-row>
    <PopUpFrame
      :isOpen.sync="isAlertFieldInfo"
      >
        <div class="text--center mdTxt fs-18">
            <p>{{ fieldInfoTitle }}</p>
            <p class="mt-20 text--left text--regular">{{ fieldInfoDesc }}</p>
            <div class="text--center mt-30">
              <el-button
                type="primary"
                @click="isAlertFieldInfo = false"
              >我知道了</el-button>
            </div>
        </div>
    </PopUpFrame>
    <div class="pam-paragraph account-confirm">
      <el-button :disabled="isSubmitBtnDisabled"
        @click.native="editAgentInfoSetting">
          é€å‡º
      </el-button>
    </div>
    </div>
</template>
<script lang="ts">
import { Context } from '@nuxt/types';
import { namespace } from 'nuxt-property-decorator';
import { Vue, Component } from 'vue-property-decorator';
import * as _ from "lodash";
import myConsultantService from '~/shared/services/my-consultant.service';
import accountSettingService from '~/shared/services/account-setting.service';
import { AgentInfo } from '~/shared/models/agent-info.model';
import { hideReviews } from '~/shared/const/hide-reviews';
import { Role } from '~/shared/models/enum/Role';
import { AgentInfoSetting } from '~/shared/models/account.model';
const localStorage = namespace('localStorage');
@Component
export default class AgentInfoComponent extends Vue {
  @localStorage.State('current_role')
  currentRole!:string | null;
  _agentInfoSetting!: AgentInfoSetting;
  agentInfo!:AgentInfo
  role = Role;
  isAlertFieldInfo         = false;
  fieldInfoTitle           = '';
  fieldInfoDesc            = '';
  hideReviews              = hideReviews ;
  editInfoValue = {
    name              : '',
    expert            : [] as string[],
    title             : '',
    serveArea         : '',
    companyAddress    : '',
    seniorityYear     : 1,
    seniorityMonth    : 0,
    concept           : '',
    experience        : '',
    awards            : '',
    communicationStyle: [] as string[],
  }
  formValidStatus = {
    name          : true,
    title         : true,
    companyAddress: true,
    serveArea     : true,
    seniorityYear : true,
    seniorityMonth: true,
    expert        : true,
    concept       : true,
    experience    : true,
    awards        : true,
    communicationStyle:true
  };
  expertList=[
    {
      name:'健康與保障'
      },
    {
      name:'子女教育'
      },
    {
      name:'資產規劃'
      },
    {
      name:'樂活退休'
      },
    {
      name:'保單健檢/規劃'
    },
    {
      name:'分紅保單'}
    ];
  communicationStyleList: string[] = ['謹慎務實', '明快主動', '耐心傾聽', '健談風趣'];
  //////////////////////////////////////////////////////////////////////
  async asyncData(context: Context) {
    const agentNo = context.route.params.agentNo;
    return {
      agentInfo: await myConsultantService.getConsultantDetail(agentNo).then((res) => res)
    }
  }
  mounted(){
    this.setAgentInfo(this.agentInfo);
  }
  //////////////////////////////////////////////////////////////////////
  alertFieldInfo(field: string): void {
    this.isAlertFieldInfo = true;
    switch(field) {
      case 'suitability':
        this.fieldInfoTitle = '匹配度';
        this.fieldInfoDesc = '匹配度是透過嚴選配對或快速篩選後,將每一位保險顧問資料進行比對後排序推薦給您的媒合數值,您可以作為選擇適合顧問的參考值。';
        break;
      case 'evaluation':
        this.fieldInfoTitle = '諮詢度表現';
        this.fieldInfoDesc = '諮詢度表現是將每一位保險顧問近一個月回覆諮詢數量進行比對後排序推薦給您的媒合數值。';
        break;
    }
  }
  ////////////////////////////////////////////////////////////
  private setAgentInfo(agentInfo: AgentInfo): void {
      const [agentYear, _yearUnit , agentMonth, _monthUnit] =  agentInfo.seniority.split(" ");
      this._agentInfoSetting = {
                  agentNo           : agentInfo.agentNo||'',
                  name              : agentInfo.name || '',
                  expertise         : agentInfo.expertise || [],
                  title             : agentInfo.title || '',
                  role              : agentInfo.role||'',
                  serveArea         : agentInfo.serveArea || '',
                  gender            : agentInfo.gender||'',
                  phoneNumber       : agentInfo.phoneNumber||'',
                  companyAddress    : agentInfo.companyAddress || '',
                  seniorityYear     : agentYear? +agentYear : 0,
                  seniorityMonth    : agentMonth ? +agentMonth: 0,
                  concept           : agentInfo.concept || '',
                  experience        : agentInfo.experiences  || '',
                  award             : agentInfo.awards || '',
                  communicationStyle: agentInfo.communicationStyle || '',
                  photoBase64       : '123',
              };
                this.editInfoValue.name           = this._agentInfoSetting.name!;
                this.editInfoValue.title          = this._agentInfoSetting.title!;
                this.editInfoValue.serveArea      = this._agentInfoSetting.serveArea
                this.editInfoValue.companyAddress = this._agentInfoSetting.companyAddress;
                this.editInfoValue.seniorityYear = this._agentInfoSetting.seniorityYear;
                this.editInfoValue.seniorityMonth = this._agentInfoSetting.seniorityMonth;
                this.editInfoValue.expert        = _.cloneDeep(this._agentInfoSetting.expertise);
                this.editInfoValue.concept        = this._agentInfoSetting.concept;
                this.editInfoValue.experience     = this._agentInfoSetting.experience;
                this.editInfoValue.awards         = this._agentInfoSetting.award;
                this.editInfoValue.communicationStyle = this._agentInfoSetting.communicationStyle.split(',');
  }
  get nameValid():boolean {
      this.formValidStatus.name = this.editInfoValue.name ? true : false;
      return this.formValidStatus.name;
  }
  get titleValid():boolean{
      this.formValidStatus.title = this.editInfoValue.title ? true : false ;
      return this.formValidStatus.title;
  }
  get companyAddressValid() : boolean{
      this.formValidStatus.companyAddress = this.editInfoValue.companyAddress ? true : false;
      return this.formValidStatus.companyAddress;
  }
  get serveAreaValid():boolean{
      this.formValidStatus.serveArea = this.editInfoValue.serveArea ? true : false;
      return this.formValidStatus.serveArea;
  }
  get conceptValid():boolean{
      this.formValidStatus.concept = this.editInfoValue.concept ? true : false;
      return this.formValidStatus.concept;
  }
  get experienceValid():boolean{
      this.formValidStatus.experience = this.editInfoValue.experience ? true : false;
      return this.formValidStatus.experience;
  }
  get awardsValid():boolean{
      this.formValidStatus.awards = this.editInfoValue.awards ? true : false ;
      return this.formValidStatus.awards;
  }
  get seniorityYearValid():boolean{
    this.formValidStatus.seniorityYear = this.editInfoValue.seniorityYear ? true  : false;
    return this.formValidStatus.seniorityYear;
  }
  get seniorityMonthValid():boolean{
    this.formValidStatus.seniorityMonth = this.editInfoValue.seniorityMonth ? true : false;
    return this.formValidStatus.seniorityYear;
  }
  get communicationStyleValid():boolean{
    this.formValidStatus.communicationStyle = this.editInfoValue.communicationStyle ? true : false;
    return this.formValidStatus.seniorityMonth;
  }
  get expertValid():boolean{
    this.formValidStatus.expert = this.editInfoValue.expert ? true : false;
    return this.formValidStatus.expert;
  }
  get isSubmitBtnDisabled(): boolean {
            const isFormValid =  this.formValidStatus.name
                              && this.formValidStatus.title
                              && this.formValidStatus.companyAddress
                              && this.formValidStatus.serveArea
                              && this.formValidStatus.concept
                              && this.formValidStatus.experience
                              && this.formValidStatus.awards
                              && this.formValidStatus.seniorityYear
                              && this.formValidStatus.seniorityMonth
                              && this.formValidStatus.expert
                              && this.formValidStatus.communicationStyle;
            return !isFormValid
        }
  editAgentInfoSetting(): void {
            const editSettingInfo: any = {
                name              : this.editInfoValue.name,
                expertise         : this.editInfoValue.expert,
                title             : this.editInfoValue.title,
                role              : this.agentInfo.role,
                serveArea         : this.editInfoValue.serveArea,
                gender            : 'male',
                phoneNumber       : this.agentInfo.phoneNumber,
                companyAddress    : this.editInfoValue.companyAddress,
                seniorityYear     : this.editInfoValue.seniorityYear,
                seniorityMonth    : this.editInfoValue.seniorityMonth,
                concept           : this.editInfoValue.concept,
                experience        : this.editInfoValue.experience,
                award             : this.editInfoValue.awards,
                communicationStyle: this.editInfoValue.communicationStyle.join(','),
                photoBase64       : '123'
            }
            accountSettingService.editAgentInfoSetting(editSettingInfo).then((res: AgentInfoSetting) => {
              console.log(editSettingInfo)
            });
        }
}
</script>
<style lang="scss">
.pam-icon {
  font-size: 15px;
  padding-right: 8px;
  color: $PRUDENTIAL_GREY;
  &.icon--primary {
    color: $PRIMARY_RED;
  }
}
.pam-field {
  display: flex;
  flex-direction: column;
  .pam-field__label {
    display: flex;
    align-items: center;
    .pam-icon {
      font-size: 12px;
    }
    .pam-field__title {
      font-size: 16px;
      font-weight: bold;
      display: flex;
      align-items: center;
    }
  }
}
.pam-field-suitability {
  .el-progress-bar__inner {
    background-color: $LIGHT_BLUE !important;
  }
}
.pam-field-evaluation {
  .el-progress-bar__inner {
    background-color: $TEAL_GREEN!important;
  }
}
.pam-field-experts {
  display: flex;
  flex-wrap: wrap;
}
.pam-progress__label {
  justify-content: space-between;
  flex-wrap: wrap;
  line-height: 24px;
}
.account-confirm{
  display: flex;
  justify-content: center;
}
.seniority-input{
  width:50px;
  margin-right: 5px;
}
</style>
PAMapp/shared/models/account.model.ts
@@ -1,5 +1,24 @@
export interface UserSetting {
    name: string;
    name  : string;
    phone?: string;
    email?: string;
}
}
export interface AgentInfoSetting{
    agentNo           : string;
    name              : string;
    expertise         : string[];
    title             : string;
    role              : string;
    serveArea         : string;
    gender            : string;
    phoneNumber       : string;
    companyAddress    : string;
    seniorityYear     : number;
    seniorityMonth    : number;
    concept           : string;
    experience        : string;
    award             : string;
    communicationStyle: string;
    photoBase64       : string;
}
PAMapp/shared/models/agent-info.model.ts
@@ -8,11 +8,14 @@
  phoneNumber     : string;
  serveArea       : string;
  companyAddress  : string;
  latestLoginTime : Date  ;
  seniority       : string;
  suitability     : number;
  evaluation      : number;
  expertise       : string[];
  concept         : string;
  experiences     : string[];
  experiences     : string;
  awards          : string;
  gender            : string,
  communicationStyle: string;
}
PAMapp/shared/services/account-setting.service.ts
@@ -1,6 +1,6 @@
import { http } from "./httpClient";
import { UserSetting } from "~/shared/models/account.model";
import { AgentInfoSetting, UserSetting } from "~/shared/models/account.model";
class AccountSettingService{
@@ -13,5 +13,10 @@
    return http.put('/customer/info', params ).then(res => res.data);
  }
  //編輯顧問帳號資訊
  async editAgentInfoSetting(params:any):  Promise<AgentInfoSetting>{
    return http.post('/consultant/edit',params).then(res => res.data);
  }
}
export default new AccountSettingService();