Merge branch 'master' of https://192.168.0.10:8443/r/pcalife/PAM
| | |
| | | } |
| | | |
| | | |
| | | // é¡§åç»å
¥é¡¯ç¤ºæ°é ç´å®çæ¸å¾è§¸ç¼ |
| | | export function allAppointmentsView() { |
| | | const headers = { |
| | | Authorization: 'Bearer ' + localStorage.getItem('id_token') |
| | | } |
| | | return service.post('/consultant/record/allAppointmentsView', undefined, {headers}) |
| | | } |
| | | |
| | | // è®åé ç´å®æè§¸ç¼ |
| | | export function recordRead(appointmentId: number) { |
| | | const headers = { |
| | | Authorization: 'Bearer ' + localStorage.getItem('id_token') |
| | | } |
| | | return service.post('/appointment/recordRead/' + appointmentId, undefined, {headers}) |
| | | } |
| | | |
| | | |
| | | export interface ClientInfo { |
| | |
| | | job : string, |
| | | requirement : string, |
| | | communicateStatus: string, |
| | | hopeContactTime : string, |
| | | otherRequirement : string, |
| | | appointmentDate : Date, |
| | | agentNo : string, |
| | | customerId : number, |
| | | name : string |
| | | hopeContactTime: string, |
| | | otherRequirement: string, |
| | | appointmentDate: Date, |
| | | agentNo: string, |
| | | customerId: number, |
| | | name: string, |
| | | consultantViewTime: Date, |
| | | consultantReadTime: Date, |
| | | contactTime: Date, |
| | | satisfactionScore: number |
| | | } |
| | |
| | | <template> |
| | | <div> |
| | | <el-row type="flex" class="rowStyle" @click.native="openDetail"> |
| | | <el-col :xs="5" :sm="3"> |
| | | <el-row |
| | | type="flex" |
| | | class="rowStyle cursor--pointer" |
| | | justify="space-between" |
| | | :class="{'new': !isView && isReserved}" |
| | | @click.native="openDetail" |
| | | > |
| | | <el-col :xs="1" :sm="1" class="unread" align="middle"> |
| | | <div class="circle" v-if="isReserved && !isRead"></div> |
| | | </el-col> |
| | | <el-col :xs="4" :sm="2" align="middle"> |
| | | <el-avatar |
| | | :size="50" |
| | | src="" |
| | | class="cursor--pointer fix-chrome-click--issue" |
| | | ></el-avatar> |
| | | <!-- <div class="satisfaction"> |
| | | <i class="icon-star pam-icon icon--yellow satisfaction"></i> |
| | | <span>{{'1'}}</span> |
| | | </div> --> |
| | | <div class="satisfaction"> |
| | | <template v-if="client.satisfactionScore"> |
| | | <i class="icon-star pam-icon icon--yellow satisfaction"></i> |
| | | <span>{{client.satisfactionScore}}</span> |
| | | </template> |
| | | </div> |
| | | </el-col> |
| | | <el-col :xs="14" :sm="15"> |
| | | <el-col :xs="15" :sm="15" class="pl-10"> |
| | | <div class="smTxt_bold name">{{client.name}}</div> |
| | | <div class="message">é ç´æå</div> |
| | | <div class="professionals"> |
| | |
| | | </template> |
| | | </div> |
| | | </el-col> |
| | | <el-col class="flex-column contactInfo" :xs="5" :sm="6"> |
| | | <div class="smTxt_bold cursor--pointer fix-chrome-click--issue" |
| | | :class="client.communicateStatus" |
| | | >{{isReserved ? 'å·²é ç´' : 'å·²è¯çµ¡'}} |
| | | </div> |
| | | <div class="date xsTxt text--mid_grey">{{date}}</div> |
| | | <div class="xsTxt text--mid_grey">{{time}}</div> |
| | | <el-col class="flex-column contactInfo" :xs="4" :sm="6"> |
| | | <div |
| | | class="smTxt_bold fix-chrome-click--issue" |
| | | :class="{'unread-txt': reservedTxt === 'æªè®', 'read-txt': reservedTxt !== 'æªè®'}" |
| | | >{{reservedTxt}}</div> |
| | | <div |
| | | class="date xsTxt text--mid_grey" |
| | | >{{date}}</div> |
| | | <div |
| | | class="xsTxt text--mid_grey" |
| | | >{{time}}</div> |
| | | </el-col> |
| | | </el-row> |
| | | |
| | | <Ui-Dialog |
| | | :isVisible.sync="isVisibleDialog" |
| | | :width="width" |
| | | @closeDialog="close" |
| | | class="pam-myDemand-dialog" |
| | | > |
| | | <h5 class="subTitle text--center mb-30" |
| | | >{{isReserved ? 'é ç´æå' : 'å·²è¯çµ¡è³è¨'}}</h5> |
| | | <p class="smTxt text-right">{{client.appointmentDate | formatDate}}</p> |
| | | >{{isReserved ? 'é ç´è³è¨' : 'å·²è¯çµ¡è³è¨'}}</h5> |
| | | |
| | | <p v-if='isReserved' |
| | | class="smTxt text-right" |
| | | ><span v-if="isRead">{{client.consultantReadTime | formatDate}}</span> å·²è®</p> |
| | | <p |
| | | v-if="!isReserved" |
| | | class="smTxt text-right" |
| | | >{{client.contactTime | formatDate}} è¯çµ¡</p> |
| | | <p class="smTxt">{{client.appointmentDate | formatDate}} é ç´</p> |
| | | |
| | | <div class="dialogTxt"> |
| | | <p>å§åï¼{{client.name}}</p> |
| | | <p>é»è©±ï¼{{client.phone}}</p> |
| | | <p>Emailï¼{{client.email}}</p> |
| | | <p>æ§å¥ï¼{{gender}}</p> |
| | | <p>年齡ï¼{{client.age | toAgeLabel }}</p> |
| | | <p>è·æ¥ï¼{{client.job}}</p> |
| | | <p>éæ±ï¼{{client.requirement.split(',').join('ã')}}</p> |
| | | <p v-for="(item, index) in hopeContactTime" :key="index">é£çµ¡ææ®µ{{index + 1 | formatNumber}}ï¼{{ item | formatHopeContactTime}}</p> |
| | | <p>å§åï¼<span>{{client.name}}</span></p> |
| | | <p>é»è©±ï¼<span>{{client.phone}}</span></p> |
| | | <p>Emailï¼<span>{{client.email}}</span></p> |
| | | <p>æ§å¥ï¼<span>{{gender}}</span></p> |
| | | <p>年齡ï¼<span>{{client.age | toAgeLabel }}</span></p> |
| | | <p>è·æ¥ï¼<span>{{client.job}}</span></p> |
| | | <p>éæ±ï¼<span>{{client.requirement.split(',').join('ã')}}</span></p> |
| | | <p v-for="(item, index) in hopeContactTime" |
| | | :key="index" |
| | | >é£çµ¡ææ®µ{{index + 1 | formatNumber}}ï¼<span>{{ item | formatHopeContactTime}}</span></p> |
| | | </div> |
| | | <div class="mt-30 text--center" v-if="isReserved"> |
| | | <el-button @click="markAppointment">æ¨è¨»çºå·²é£çµ¡</el-button> |
| | |
| | | </template> |
| | | |
| | | <script lang="ts"> |
| | | import { Vue, Component, Prop, Mutation, Action } from 'nuxt-property-decorator'; |
| | | import { Vue, Component, Prop, Action } from 'nuxt-property-decorator'; |
| | | import { isMobileDevice } from '~/assets/ts/device'; |
| | | import { ClientInfo, markAsContact } from '~/assets/ts/api/appointment'; |
| | | import { ClientInfo, markAsContact, recordRead } from '~/assets/ts/api/appointment'; |
| | | |
| | | @Component({ |
| | | filters: { |
| | |
| | | }) |
| | | export default class ClientList extends Vue { |
| | | @Action updateMyAppointment!: (data: ClientInfo) => void |
| | | @Action storeConsultantList!: () => void; |
| | | |
| | | @Prop() client!: ClientInfo; |
| | | isVisibleDialog = false; |
| | |
| | | return contactList.filter(item => !!item && item !== ",") |
| | | } |
| | | |
| | | get isReserved() { |
| | | return this.client.communicateStatus === 'reserved'; |
| | | } |
| | | |
| | | get isRead() { |
| | | return !!this.client.consultantReadTime; |
| | | } |
| | | |
| | | get isView() { |
| | | return !!this.client.consultantViewTime; |
| | | } |
| | | |
| | | get reservedTxt() { |
| | | if (this.isReserved) { |
| | | return this.client.consultantReadTime ? 'å·²è®' : 'æªè®'; |
| | | } else { |
| | | return 'å·²è¯çµ¡' |
| | | } |
| | | } |
| | | |
| | | get latestUpdateTime() { |
| | | if (this.isReserved) { |
| | | return this.client.consultantReadTime ? this.client.consultantReadTime : this.client.appointmentDate; |
| | | } else { |
| | | return this.client.contactTime; |
| | | } |
| | | } |
| | | |
| | | get time() { |
| | | const formatDate = (this.$options.filters as any).formatDate(this.client.appointmentDate); |
| | | const formatDate = (this.$options.filters as any).formatDate(this.latestUpdateTime); |
| | | return formatDate.split(' ')[1] |
| | | } |
| | | |
| | | get date() { |
| | | const formatDate = (this.$options.filters as any).formatDate(this.client.appointmentDate); |
| | | return formatDate.split(' ')[0] |
| | | } |
| | | |
| | | get isReserved() { |
| | | return this.client.communicateStatus === 'reserved'; |
| | | const formatDate = (this.$options.filters as any).formatDate(this.latestUpdateTime); |
| | | return formatDate.split(' ')[0]; |
| | | } |
| | | |
| | | openDetail() { |
| | |
| | | |
| | | const updatedClient = {...this.client}; |
| | | updatedClient.communicateStatus = 'contacted'; |
| | | updatedClient.appointmentDate = new Date(); |
| | | updatedClient.contactTime = new Date(); |
| | | |
| | | this.updateMyAppointment(updatedClient); |
| | | this.isVisibleDialog = false; |
| | |
| | | }) |
| | | } |
| | | |
| | | close() { |
| | | if (!this.client.consultantReadTime) { |
| | | recordRead(this.client.id).then(res => { |
| | | const updatedClient = {...this.client}; |
| | | updatedClient.consultantReadTime = new Date(); |
| | | |
| | | this.updateMyAppointment(updatedClient); |
| | | }); |
| | | } |
| | | } |
| | | |
| | | } |
| | | </script> |
| | | |
| | | <style lang="scss" scoped> |
| | | .rowStyle { |
| | | padding: 10px; |
| | | padding: 10px 15px 10px 5px; |
| | | background-color: $PRIMARY_WHITE; |
| | | margin-bottom: 10px; |
| | | display: flex; |
| | | justify-content: space-between; |
| | | |
| | | &.new { |
| | | border-left: solid 4px $YELLOW; |
| | | } |
| | | |
| | | .unread { |
| | | align-self: center; |
| | | |
| | | .circle { |
| | | width: 10px; |
| | | height: 10px; |
| | | border-radius: 50px; |
| | | background-color: $PRIMARY_RED; |
| | | margin: auto; |
| | | } |
| | | } |
| | | |
| | | .satisfaction { |
| | | font-size: 12px; |
| | |
| | | } |
| | | } |
| | | |
| | | .reserved { |
| | | .unread-txt { |
| | | @extend .text--primary; |
| | | } |
| | | |
| | | .contacted { |
| | | .read-txt { |
| | | color: $SKY_BLUE; |
| | | } |
| | | |
| | | } |
| | | |
| | | .flex-column { |
| | |
| | | height: 400px; |
| | | } |
| | | } |
| | | |
| | | |
| | | .text-right { |
| | | text-align: right; |
| | |
| | | </div> |
| | | <div class="pam-paragraph"> |
| | | <div class="pam-consultant-login__title"> |
| | | <div>é©è碼</div> |
| | | <div class="text--dark-blue fs-16 cursor--pointer fix-chrome-click--issue" |
| | | <div>é©è碼 <span class="text--dark-blue fs-16">(åå大å°å¯«)</span></div> |
| | | <div class="text--primary fs-16 cursor--pointer fix-chrome-click--issue" |
| | | @click="regenerateImgOfVerification">éæ°ç¢ç</div> |
| | | </div> |
| | | <div class="pam-consultant-login__verifyBlock mt-10"> |
| | |
| | | private redirect() { |
| | | const backToPrevious = ['questionnaire', 'myConsultantList']; |
| | | const find = backToPrevious.findIndex(item => this.previousPath.includes(item)); |
| | | console.log(this.previousPath, find, 'redirect'); |
| | | find > -1 ? this.$router.go(-1) : this.$router.push('/'); |
| | | } |
| | | |
| | | beforeRouteEnter (to, from, next) { |
| | | next(vm => { |
| | | console.log(from.path, 'beforeRouteEnter'); |
| | | vm.previousPath = from.path; |
| | | }) |
| | | } |
| | |
| | | |
| | | <NuxtChild></NuxtChild> |
| | | </div> |
| | | |
| | | <PopUpFrame |
| | | :isOpen.sync="showNewAppointmentNumber" |
| | | > |
| | | <div class="text--center mdTxt"> |
| | | <p class="mb-50">ä½ æ <span class="text--primary">{{newAppointmentNumber}}</span> åæ°çé ç´</p> |
| | | <div class="text--center"> |
| | | <el-button |
| | | type="primary" |
| | | @click="showNewAppointmentNumber = false" |
| | | >æç¥éäº</el-button> |
| | | </div> |
| | | </div> |
| | | </PopUpFrame> |
| | | </div> |
| | | </template> |
| | | |
| | | <script lang="ts"> |
| | | import { Vue, Component, State, Action, Watch } from 'nuxt-property-decorator'; |
| | | import { ClientInfo } from '~/assets/ts/api/appointment'; |
| | | import { allAppointmentsView, ClientInfo } from '~/assets/ts/api/appointment'; |
| | | import * as _ from 'lodash'; |
| | | |
| | | @Component({ |
| | |
| | | appointmentList: ClientInfo[] = []; |
| | | contactedList: ClientInfo[] = []; |
| | | clients: ClientInfo[] = []; |
| | | newAppointmentNumber: number = 0; |
| | | showNewAppointmentNumber = false; |
| | | |
| | | @State('myAppointmentList') myAppointmentList!: ClientInfo[]; |
| | | @Action storeMyAppointmentList!: any; |
| | | @Action storeMyAppointmentList!: () => Promise<number>; |
| | | |
| | | mounted() { |
| | | this.storeMyAppointmentList(); |
| | | this.storeMyAppointmentList().then(newDataLength => { |
| | | this.newAppointmentNumber = newDataLength; |
| | | if (this.newAppointmentNumber > 0) { |
| | | this.showNewAppointmentNumber = true; |
| | | allAppointmentsView().then(res => res); |
| | | } |
| | | }); |
| | | |
| | | if (this.$route.name) { |
| | | this.activeTabName = this.$route.name.split('-')[1] |
| | |
| | | @Watch('myAppointmentList') |
| | | onMyAppointmentListChange() { |
| | | this.contactedList = this.myAppointmentList |
| | | .filter(item => item.communicateStatus === 'contacted') |
| | | .sort((a, b) => a.appointmentDate > b.appointmentDate ? -1 : 1); |
| | | .filter(item => item.communicateStatus === 'contacted'); |
| | | |
| | | this.appointmentList = this.myAppointmentList |
| | | .filter(item => item.communicateStatus !== 'contacted') |
| | | .sort((a, b) => a.appointmentDate > b.appointmentDate ? -1 : 1);; |
| | | .filter(item => item.communicateStatus !== 'contacted'); |
| | | } |
| | | |
| | | tabClick(path: string) { |
| | |
| | | placeholder="è«è¼¸å
¥ééµå" |
| | | class="mb-30 pam-clientReserved-input" |
| | | v-model="keyWord" |
| | | @keyup.enter.native="search" |
| | | > |
| | | <i slot="suffix" class="icon-search search cursor--pointer" @click="search"></i> |
| | | </el-input> |
| | |
| | | ></ClientList> |
| | | |
| | | <UiPagination |
| | | :totalList="appointmentList" |
| | | :totalList="filterList" |
| | | @changePage="changePage" |
| | | ></UiPagination> |
| | | </div> |
| | | </template> |
| | | |
| | | <script lang="ts"> |
| | | import { Vue, Component, Prop, State, Watch } from 'nuxt-property-decorator'; |
| | | import { Vue, Component, State, Watch } from 'nuxt-property-decorator'; |
| | | import { ClientInfo } from '~/assets/ts/api/appointment'; |
| | | |
| | | @Component |
| | |
| | | |
| | | @Watch('myAppointmentList') |
| | | onMyAppointmentListChange() { |
| | | this.appointmentList = this.myAppointmentList |
| | | .filter(item => item.communicateStatus !== 'contacted') |
| | | .sort((a, b) => a.appointmentDate > b.appointmentDate ? -1 : 1);; |
| | | const unreadList = this.myAppointmentList |
| | | .filter(item => item.communicateStatus !== 'contacted' && !item.consultantReadTime) |
| | | .sort((a, b) => a.consultantViewTime > b.consultantViewTime ? 1 : -1); |
| | | |
| | | const readList = this.myAppointmentList |
| | | .filter(item => item.communicateStatus !== 'contacted' && item.consultantReadTime) |
| | | .sort((a, b) => a.consultantReadTime > b.consultantReadTime ? -1 : 1) |
| | | |
| | | this.appointmentList = unreadList.concat(readList); |
| | | this.filterList = this.appointmentList; |
| | | } |
| | | |
| | | mounted() { |
| | |
| | | placeholder="è«è¼¸å
¥ééµå" |
| | | class="mb-30 pam-clientReserved-input" |
| | | v-model="keyWord" |
| | | @keyup.enter.native="search" |
| | | > |
| | | <i |
| | | slot="suffix" |
| | |
| | | ></ClientList> |
| | | |
| | | <UiPagination |
| | | :totalList="contactedList" |
| | | :totalList="filterList" |
| | | @changePage="changePage" |
| | | ></UiPagination> |
| | | </div> |
| | |
| | | onMyAppointmentListChange() { |
| | | this.contactedList = (this.myAppointmentList || []) |
| | | .filter(item => item.communicateStatus === 'contacted') |
| | | .sort((a, b) => a.appointmentDate > b.appointmentDate ? -1 : 1); |
| | | .sort((a, b) => a.contactTime > b.contactTime ? -1 : 1); |
| | | this.filterList = this.contactedList; |
| | | } |
| | | |
| | | mounted() { |
| | | console.log('ClientContactedList mounted'); |
| | | |
| | | this.onMyAppointmentListChange(); |
| | | } |
| | | |
| | |
| | | import { Module, VuexModule, Mutation, Action } from 'vuex-module-decorators' |
| | | import { ClientInfo, getMyAppointmentList, getMyReviewLog } from '~/assets/ts/api/appointment'; |
| | | import { ClientInfo, getMyAppointmentList, getMyReviewLog, allAppointmentsView } from '~/assets/ts/api/appointment'; |
| | | // import * as consultant from '~/assets/ts/api/consultant'; |
| | | import { recommend, AgentOfStrictQuery, getFavoriteConsultant, addFavoriteConsultant, deleteConsultant, strictQuery } from '~/assets/ts/api/consultant'; |
| | | import { Consultants } from '~/assets/ts/models/consultant.model'; |
| | |
| | | } |
| | | |
| | | @Action |
| | | storeMyAppointmentList() { |
| | | getMyAppointmentList().then((data) => { |
| | | this.context.commit('updateMyAppointmentList', data) |
| | | async storeMyAppointmentList() { |
| | | return await getMyAppointmentList().then((data) => { |
| | | this.context.commit('updateMyAppointmentList', data); |
| | | return data.filter(item => !item.consultantViewTime || item.consultantViewTime === null).length |
| | | }); |
| | | } |
| | | |
| | |
| | | </build> |
| | | <properties> |
| | | <!-- default Spring profiles --> |
| | | <spring.profiles.active>uat{profile.api-docs}${profile.tls}${profile.no-liquibase}</spring.profiles.active> |
| | | <spring.profiles.active>uat${profile.api-docs}${profile.tls}${profile.no-liquibase}</spring.profiles.active> |
| | | </properties> |
| | | </profile> |
| | | <profile> |
| | |
| | | |
| | | [ |
| | | { |
| | | "id": 4, |
| | | "createdDate": "2021-11-30T12:32:28.943Z", |
| | | "lastModifiedDate": "2021-11-30T12:32:28.943Z", |
| | | "id": 11, |
| | | "createdDate": "2021-12-03T03:59:07.854Z", |
| | | "lastModifiedDate": "2021-12-03T03:59:07.854Z", |
| | | "customerId": 90, |
| | | "agentNo": "B282677963", |
| | | "status": "UNFILLED", |
| | | "score": 4.0 |
| | | "status": "FILLED", |
| | | "score": 4.0, |
| | | "appointmentId": 134, |
| | | "customerName": "Jack", |
| | | "agentName": "å¬å¦¹" |
| | | }, |
| | | { |
| | | "id": 5, |
| | | "createdDate": "2021-11-30T12:34:16.225Z", |
| | | "lastModifiedDate": "2021-11-30T12:34:16.225Z", |
| | | "id": 12, |
| | | "createdDate": "2021-12-03T04:00:43.181Z", |
| | | "lastModifiedDate": "2021-12-03T04:00:43.181Z", |
| | | "customerId": 90, |
| | | "agentNo": "B282677963", |
| | | "status": "UNFILLED", |
| | | "score": 4.0 |
| | | "status": "FILLED", |
| | | "score": 4.0, |
| | | "appointmentId": 135, |
| | | "customerName": "Jack", |
| | | "agentName": "å¬å¦¹" |
| | | }, |
| | | { |
| | | "id": 6, |
| | | "createdDate": "2021-11-30T12:37:27.571Z", |
| | | "lastModifiedDate": "2021-11-30T12:37:27.571Z", |
| | | "id": 13, |
| | | "createdDate": "2021-12-03T04:01:20.095Z", |
| | | "lastModifiedDate": "2021-12-03T04:01:20.095Z", |
| | | "customerId": 90, |
| | | "agentNo": "B282677963", |
| | | "status": "UNFILLED", |
| | | "score": 4.0 |
| | | }, |
| | | { |
| | | "id": 7, |
| | | "createdDate": "2021-11-30T12:52:27.709Z", |
| | | "lastModifiedDate": "2021-11-30T12:52:27.709Z", |
| | | "customerId": 90, |
| | | "agentNo": "B282677963", |
| | | "status": "UNFILLED", |
| | | "score": 4.0 |
| | | }, |
| | | { |
| | | "id": 8, |
| | | "createdDate": "2021-11-30T12:52:46.657Z", |
| | | "lastModifiedDate": "2021-11-30T12:52:46.657Z", |
| | | "customerId": 90, |
| | | "agentNo": "B282677963", |
| | | "status": "UNFILLED", |
| | | "score": 2.0 |
| | | }, |
| | | { |
| | | "id": 9, |
| | | "createdDate": "2021-12-01T03:08:50.258Z", |
| | | "lastModifiedDate": "2021-12-01T03:08:50.258Z", |
| | | "customerId": 90, |
| | | "agentNo": "B282677963", |
| | | "status": "UNFILLED", |
| | | "score": 0.0 |
| | | }, |
| | | { |
| | | "id": 10, |
| | | "createdDate": "2021-12-01T09:48:50.991Z", |
| | | "lastModifiedDate": "2021-12-01T09:48:50.991Z", |
| | | "customerId": 90, |
| | | "agentNo": "B282677963", |
| | | "status": "UNFILLED", |
| | | "score": null |
| | | "status": "FILLED", |
| | | "score": 2.0, |
| | | "appointmentId": 136, |
| | | "customerName": "Jack", |
| | | "agentName": "å¬å¦¹" |
| | | } |
| | | ] |
| | |
| | | private SatisfactionStatusEnum status; |
| | | private Float score; |
| | | private Long appointmentId; |
| | | private String customerName; |
| | | private String agentName; |
| | | |
| | | public Long getId() { |
| | | return id; |
| | | } |
| | |
| | | public void setScore(Float score) { |
| | | this.score = score; |
| | | } |
| | | |
| | | public Long getAppointmentId() { |
| | | return appointmentId; |
| | | } |
| | | public void setAppointmentId(Long appointmentId) { |
| | | this.appointmentId = appointmentId; |
| | | } |
| | | public String getCustomerName() { |
| | | return customerName; |
| | | } |
| | | public void setCustomerName(String customerName) { |
| | | this.customerName = customerName; |
| | | } |
| | | public String getAgentName() { |
| | | return agentName; |
| | | } |
| | | public void setAgentName(String agentName) { |
| | | this.agentName = agentName; |
| | | } |
| | | |
| | | |
| | | } |
| | |
| | | import java.util.List; |
| | | |
| | | import org.springframework.beans.BeanUtils; |
| | | import org.springframework.beans.factory.annotation.Autowired; |
| | | import org.springframework.stereotype.Service; |
| | | |
| | | import com.pollex.pam.domain.Consultant; |
| | | import com.pollex.pam.domain.Customer; |
| | | import com.pollex.pam.domain.Satisfaction; |
| | | import com.pollex.pam.repository.ConsultantRepository; |
| | | import com.pollex.pam.repository.CustomerRepository; |
| | | import com.pollex.pam.service.dto.SatisfactionDTO; |
| | | |
| | | @Service |
| | | public class SatisfactionMapper { |
| | | |
| | | @Autowired |
| | | ConsultantRepository consultantRepository; |
| | | |
| | | @Autowired |
| | | CustomerRepository customerRepository; |
| | | |
| | | public SatisfactionDTO toDTO(Satisfaction source) { |
| | | SatisfactionDTO target = new SatisfactionDTO(); |
| | | target.setScore(source.getScore()); |
| | | BeanUtils.copyProperties(source, target); |
| | | target.setScore(source.getScore()); |
| | | Consultant consultant= consultantRepository.findOneByAgentNo(source.getAgentNo()).get(); |
| | | target.setAgentName(consultant.getName()); |
| | | Customer customer = customerRepository.findById(source.getCustomerId()).get(); |
| | | target.setCustomerName(customer.getName()); |
| | | return target; |
| | | } |
| | | |
| | |
| | | # =================================================================== |
| | | # Spring Boot configuration for the "sit" profile. |
| | | # Spring Boot configuration for the "uat" profile. |
| | | # |
| | | # This configuration overrides the application.yml file. |
| | | # |
| | |
| | | |
| | | application: |
| | | mock-login: false |
| | | otp-web-service-url: https://vtwlifeopensysuat.pru.intranet.asia:443/pcalife-otp/ws/otpWebService?wsdl |
| | | otp-web-service-url: https://vtwlifeopensysuat.pru.intranet.asia/pcalife-otp/ws/otpWebService?wsdl |
| | | otp-web-service-password: es20!%Pass |
| | | otp-web-service-system-type: epos |
| | | e-service-login-url: https://eserviceuat.pcalife.com.tw/sso/chatbotValidate |