diff --git a/src/stores/Feedback.js b/src/stores/Feedback.js index a9f40fe..dd3feb1 100644 --- a/src/stores/Feedback.js +++ b/src/stores/Feedback.js @@ -85,7 +85,6 @@ const useFeedbackStore = create( ...initialState, reset: () => set(initialState), - setState: (state) => set(state), setLoading: (loading) => set({ loading }), setFeedbackList: (feedbackList) => set({ feedbackList }), diff --git a/src/stores/Report.js b/src/stores/Report.js index 45e075c..0767790 100644 --- a/src/stores/Report.js +++ b/src/stores/Report.js @@ -1,113 +1,69 @@ -import { makeAutoObservable, runInAction } from "mobx"; -import { fetchJSON, postForm } from "@/utils/request"; -import { prepareUrl, isNotEmpty } from "@/utils/commons"; +import { fetchJSON } from "@/utils/request"; import { HT_HOST } from "@/config"; -import { json } from "react-router-dom"; -import * as config from "@/config"; -import dayjs from "dayjs"; +import { create } from 'zustand'; +import { devtools } from 'zustand/middleware'; -class Report { - constructor(root) { - makeAutoObservable(this, { rootStore: false }); - this.root = root; - } +const initialState = { + loading: false, + vendorScoresData: [], //地接统计数据集,合计数据,每月数据,地接考核分数 + productScoresData: [], //产品体验分析 常用酒店分析, 导游接待情况 + commendScoresData: [], //表扬情况, 投诉情况, 评建议 +}; +export const useReportStore = create( + devtools((set, get) => ({ + ...initialState, + reset: () => set(initialState), - vendorScoresData = []; //地接统计数据集,合计数据,每月数据,地接考核分数 - productScoresData = []; //产品体验分析 常用酒店分析, 导游接待情况 - commendScoresData = []; //表扬情况, 投诉情况, 评建议 + setLoading: (loading) => set({ loading }), + setVendorScoresData: (vendorScoresData) => set({ vendorScoresData }), + setProductScoresData: (productScoresData) => set({ productScoresData }), + setCommendScoresData: (commendScoresData) => set({ commendScoresData }), - loading = false; - search_date_start = dayjs().month(0).startOf("month"); - search_date_end = dayjs().month(11).endOf("month"); - - onDateRangeChange = dates => { - this.search_date_start = dates == null ? null : dates[0].startOf("month"); - this.search_date_end = dates == null ? null : dates[1].endOf("month"); - }; - - getHWVendorScores(VEI_SN, StartDate, EndDate) { - this.loading = true; - const fetchUrl = prepareUrl(HT_HOST +"/service-cusservice/PTGetHWVendorScores") - .append("VEI_SN", VEI_SN) - .append("StartDate", StartDate) - .append("EndDate", EndDate) - .append("StrDEI_SN", "(,-1,)") - .append("OrderType", "-1") - .append("GroupType", "-1") - .append("token", this.root.authStore.login.token) - .build(); - - return fetchJSON(fetchUrl).then(json => { - runInAction(() => { - this.loading = false; - if (json.errcode == 0) { - if (isNotEmpty(json)) { - this.vendorScoresData = json; - } else { - this.vendorScoresData = []; - } - } else { - throw new Error(json.errmsg + ": " + json.errcode); - } - }); - }); - } - - getHWProductScores(VEI_SN, StartDate, EndDate) { - this.loading = true; - const fetchUrl = prepareUrl(HT_HOST +"/service-cusservice/PTGetHWProductScores") - .append("VEI_SN", VEI_SN) - .append("StartDate", StartDate) - .append("EndDate", EndDate) - .append("StrDEI_SN", "(,-1,)") - .append("OrderType", "-1") - .append("GroupType", "-1") - .append("token", this.root.authStore.login.token) - .build(); - - return fetchJSON(fetchUrl).then(json => { - runInAction(() => { - this.loading = false; - if (json.errcode == 0) { - if (isNotEmpty(json)) { - this.productScoresData = json; - } else { - this.productScoresData = []; - } - } else { - throw new Error(json.errmsg + ": " + json.errcode); - } - }); - }); - } - - getHWCommendScores(VEI_SN, StartDate, EndDate) { - this.loading = true; - const fetchUrl = prepareUrl(HT_HOST +"/service-cusservice/PTGetHWCommendScores") - .append("VEI_SN", VEI_SN) - .append("StartDate", StartDate) - .append("EndDate", EndDate) - .append("StrDEI_SN", "(,-1,)") - .append("OrderType", "-1") - .append("GroupType", "-1") - .append("token", this.root.authStore.login.token) - .build(); - - return fetchJSON(fetchUrl).then(json => { - runInAction(() => { - this.loading = false; - if (json.errcode == 0) { - if (isNotEmpty(json)) { - this.commendScoresData = json; - } else { - this.commendScoresData = []; - } - } else { - throw new Error(json.errmsg + ": " + json.errcode); - } - }); - }); - } -} - -export default Report; + async getHWVendorScores(VEI_SN, StartDate, EndDate) { + const { setLoading, setVendorScoresData } = get(); + setLoading(true); + const searchParams = { + VEI_SN, + StartDate, + EndDate, + StrDEI_SN: '(,-1,)', + OrderType: '-1', + GroupType: '-1', + }; + const { errcode, ...Result } = await fetchJSON(`${HT_HOST}/service-cusservice/PTGetHWVendorScores`, searchParams); + setVendorScoresData(errcode === 0 ? Result : {}); + setLoading(false); + }, + async getHWProductScores(VEI_SN, StartDate, EndDate) { + const { setLoading, setProductScoresData } = get(); + setLoading(true); + const searchParams = { + VEI_SN, + StartDate, + EndDate, + StrDEI_SN: '(,-1,)', + OrderType: '-1', + GroupType: '-1', + }; + const { errcode, ...Result } = await fetchJSON(`${HT_HOST}/service-cusservice/PTGetHWProductScores`, searchParams); + setProductScoresData(errcode === 0 ? Result : {}); + setLoading(false); + }, + async getHWCommendScores(VEI_SN, StartDate, EndDate) { + const { setLoading, setCommendScoresData } = get(); + setLoading(true); + const searchParams = { + VEI_SN, + StartDate, + EndDate, + StrDEI_SN: '(,-1,)', + OrderType: '-1', + GroupType: '-1', + }; + const { errcode, ...Result } = await fetchJSON(`${HT_HOST}/service-cusservice/PTGetHWCommendScores`, searchParams); + setCommendScoresData(errcode === 0 ? Result : {}); + setLoading(false); + }, + })) +); +export default useReportStore; diff --git a/src/stores/Root.js b/src/stores/Root.js index 2f75dd9..57645f4 100644 --- a/src/stores/Root.js +++ b/src/stores/Root.js @@ -2,14 +2,12 @@ import { makeAutoObservable } from "mobx"; import { Reservation } from "./Reservation"; import { Auth } from "./Auth"; import {Invoice} from "./Invoice"; -import Report from "./Report"; class Root { constructor() { this.reservationStore = new Reservation(this); this.authStore = new Auth(this); this.invoiceStore = new Invoice(this); - this.reportStore = new Report(this); makeAutoObservable(this); } diff --git a/src/views/report/Index.jsx b/src/views/report/Index.jsx index 6e9038f..9e8724e 100644 --- a/src/views/report/Index.jsx +++ b/src/views/report/Index.jsx @@ -1,505 +1,402 @@ -import { useEffect } from "react"; -import { observer } from "mobx-react"; -import { Row, Col, Space, Button, Table, Divider, Typography, DatePicker } from "antd"; -import { useStore } from "@/stores/StoreContext.js"; -import * as config from "@/config"; -import * as comm from "@/utils/commons"; -import { usePDF } from "react-to-pdf"; +import { Row, Col, Space, Button, Table, Divider, Typography } from 'antd'; +import * as comm from '@/utils/commons'; +import { usePDF } from 'react-to-pdf'; +import dayjs from 'dayjs'; +import SearchForm from '@/components/SearchForm'; +import useAuthStore from '@/stores/Auth'; +import useReportStore from '@/stores/Report'; function Index() { - const { reportStore, authStore } = useStore(); - const { search_date_start, search_date_end, vendorScoresData, productScoresData, commendScoresData } = reportStore; - const evaluationScores = vendorScoresData.EvaluationScores ? vendorScoresData.EvaluationScores[0] : []; - useEffect(() => {}, []); - const columns_month = [ - { - title: "Date", - dataIndex: "VMonth", - key: "VMonth", - }, - { - title: "Groups", - dataIndex: "Groups", - key: "Groups", - }, - { - title: "Number of People", - dataIndex: "PersonNum", - key: "PersonNum", - }, - { - title: "Transaction Amount(USD)", - dataIndex: "AmountUSD", - key: "AmountUSD", - render: value => comm.formatPrice(value), - }, - { - title: "Evaluation Score", - dataIndex: "EvaluationScore", - key: "EvaluationScore", - }, - { - title: "TP Reviews", - dataIndex: "TPReviews", - key: "TPReviews", - }, - { - title: "TP Reviews Rate", - dataIndex: "TPReviewRate", - key: "TPReviewRate", - render: value => comm.formatPercent(value), - }, - { - title: "Complaints", - dataIndex: "Complaints", - key: "Complaints", - }, - { - title: "Complaint Rate", - dataIndex: "ComplaintRate", - key: "ComplaintRate", - render: value => comm.formatPercent(value), - }, - ]; + const [travelAgencyId, ] = useAuthStore((state) => [state.loginUser.travelAgencyId]); + const [vendorScoresData, getHWVendorScores] = useReportStore((state) => [state.vendorScoresData, state.getHWVendorScores]); + const [productScoresData, getHWProductScores] = useReportStore((state) => [state.productScoresData, state.getHWProductScores]); + const [commendScoresData, getHWCommendScores] = useReportStore((state) => [state.commendScoresData, state.getHWCommendScores]); - const columns_guide = [ - { - title: "Name", - dataIndex: "TGI2_Name", - key: "TGI2_Name", - }, - { - title: "Average Scores", - dataIndex: "VAverage", - key: "VAverage", - }, - { - title: "Group Numbers", - dataIndex: "ReceptionGroups", - key: "ReceptionGroups", - }, - { - title: "TP Reviews", - dataIndex: "CommendNum", - key: "CommendNum", - }, - { - title: "TP Review Rate", - dataIndex: "CommendRate", - key: "CommendRate", - render: value => comm.formatPercent(value), - }, - { - title: "Complaints", - dataIndex: "Complaints", - key: "Complaints", - }, - { - title: "Complaint Rate", - dataIndex: "ComplaintRate", - key: "ComplaintRate", - render: value => comm.formatPercent(value), - }, - ]; + const evaluationScores = vendorScoresData.EvaluationScores ? vendorScoresData.EvaluationScores[0] : []; + const primaryData = vendorScoresData.EvaluationScores + ? [comm.pick(vendorScoresData.EvaluationScores[0], ['Groups', 'PersonNum', 'AmountUSD', 'EvaluationScore', 'TPReviews', 'TPReviewRate', 'Complaints', 'ComplaintRate'])] + : []; - const columns_commend = [ - { - title: "Reference Number", - dataIndex: "GRI_No", - key: "GRI_No", - }, - { - title: "Tour Guides", - dataIndex: "ObjectName", - key: "ObjectName", - }, - { - title: "Essential Comments", - dataIndex: "ECI_Content", - key: "ECI_Content", - }, - ]; + const evaluationScoresData = [ + { category: 'DMC Services', item: 'Guide', value: evaluationScores.FRTGuide, note: evaluationScores.FRTText }, + { category: 'DMC Services', item: 'Driver & Vehicle', value: evaluationScores.FRTGriver }, + { category: 'DMC Services', item: 'Food Arrangement', value: evaluationScores.FRTMeal }, + { category: 'DMC Services', item: 'Activity', value: evaluationScores.FRTProduct }, + { category: 'Itinerary Arrangements', item: 'Hotel', value: evaluationScores.FRTHotel, }, + { category: 'Itinerary Arrangements', item: 'Travel Advisor’s Planning', value: evaluationScores.FRTAdvisor }, + ]; + const columns_evaluation = [ + { title: 'Category', dataIndex: 'category', key: 'category',align: 'center', onCell: (_, index) => ({ rowSpan: index === 0 ? 4 : index === 4 ? 2 : 0 }) }, + { title: 'Item', dataIndex: 'item', key: 'item', align: 'center' }, + { title: 'Your Scores', dataIndex: 'value', key: 'value',align: 'center', }, + { title: 'Note', dataIndex: 'note', key: 'note',align: 'center', onCell: (_, index) => ({ rowSpan: index === 0 ? 7 : 0 })}, + ]; - const { toPDF, targetRef } = usePDF({ - method: "save", - filename: "GHH-Report.pdf", - page: { margin: "3", format: "letter" }, //margin: Margin.SMALL, - canvas: { mimeType: "image/jpeg", qualityRatio: 1 }, - overrides: { pdf: { compress: true }, canvas: { useCORS: true } }, - }); + const columns_DMC_customer_satisfaction = [ + { title: 'Customer Satisfaction', dataIndex: 'item', key: 'item',align: 'center', }, + { title: '3 scores', dataIndex: 'stand_3', key: 'stand_3', align: 'center', onCell: (_, index) => ({ colSpan: (index === 2 || index===4) ? 3 : 1 }) }, + { title: '4 scores', dataIndex: 'stand_4', key: 'stand_4',align: 'center',onCell: (_, index) => ({ colSpan: (index === 2 || index===4) ? 0 : 1 }) }, + { title: '5 scores', dataIndex: 'stand_5', key: 'stand_5',align: 'center',onCell: (_, index) => ({ colSpan: (index === 2 || index===4) ? 0 : 1 }) }, + { title: 'Your Scores', dataIndex: 'value', key: 'value',align: 'center', }, + { title: 'Final Scores', dataIndex: 'final_score', key: 'final_score',align: 'center', onCell: (_, index) => ({ rowSpan: index === 0 ? 5 : 0 })}, + { title: 'Note', dataIndex: 'note', key: 'note',align: 'center', }, + ]; + const DMCData_customer_satisfaction = [ + { + item: 'TP review rating', + stand_3: '\\', + stand_4: '30%', + stand_5: '60%', + value: evaluationScores.TPReviewRating, + final_score: evaluationScores.AvgCusSatisfaction, + note: evaluationScores.AvgCusSatisfaction, + }, + { + item: 'Post tour complaints', + stand_3: '1', + stand_4: '0', + stand_5: '0', + value: evaluationScores.PostTourComplaints, + // final_score: evaluationScores.AvgCusSatisfaction, + note: evaluationScores.PostTourComplaintsText, + }, + { + item: 'Complaints resolved during the tour', + stand_3: '3', + // stand_4: '0', + // stand_5: '0', + value: evaluationScores.ComplaintsDuringTour, + note: evaluationScores.ComplaintsDuringTourText, + }, + { item: 'Customer photos', stand_3: '\\', stand_4: '30%', stand_5: '50%', value: evaluationScores.CustomerPhotoRate, note: evaluationScores.CustomerPhotoRateText }, + { item: 'Evaluation scores', stand_3: '4.5', value: evaluationScores.EvaluationFormScore, note: evaluationScores.EvaluationFormScoreText }, + ]; - return ( - - - - - - Select Date - - - - - - - - - - - + const columns_DMC_sopport_local = [ + { title: 'Operator Support & Local resources', dataIndex: 'item', key: 'item',align: 'center', }, + { title: '3 scores', dataIndex: 'stand_3', key: 'stand_3', align: 'center', }, + { title: '4 scores', dataIndex: 'stand_4', key: 'stand_4',align: 'center', }, + { title: '5 scores', dataIndex: 'stand_5', key: 'stand_5',align: 'center', }, + { title: 'Your Scores', dataIndex: 'value', key: 'value',align: 'center', }, + { title: 'Final Scores', dataIndex: 'final_score', key: 'final_score',align: 'center', onCell: (_, index) => ({ rowSpan: index === 0 ? 6 : 0 })}, + { title: 'Note', dataIndex: 'note', key: 'note',align: 'center', }, + ]; + const DMCData_sopport_local = [ + { + item: 'Response efficiency', + stand_3: '1d', + stand_4: '6hrs', + stand_5: '3hrs', + value: evaluationScores.ResponseEfficiency, + final_score: evaluationScores.AvgLocalResources, + note: evaluationScores.ResponseEfficiencyText, + }, + { + item: 'Provide suggestions and alternatives', + stand_3: '\\', + stand_4: '√', + stand_5: '√', + value: evaluationScores.ProvideSuggestions, + // final_score: evaluationScores.AvgCusSatisfaction, + note: evaluationScores.ProvideSuggestionsText, + }, + { + item: 'Provide local tourism information', + stand_3: '\\', + stand_4: '√', + stand_5: '√', + value: evaluationScores.ProvideLocalInfo, + note: evaluationScores.ProvideLocalInfoText, + }, + { item: 'Assist in developing exclusive products', + stand_3: '\\', + stand_4: '\\', + stand_5: '√', value: evaluationScores.ExclusiveProducts, note: evaluationScores.ExclusiveProductsText }, + { item: 'Dedicated tour guide team for AH', + stand_3: '\\', + stand_4: '√', + stand_5: '√', value: evaluationScores.DedicatedTourGuide, note: evaluationScores.DedicatedTourGuideText }, + { item: 'Partner hotels with contracted rate', + stand_3: '\\', + stand_4: '√', + stand_5: '√', value: evaluationScores.PartnerHotels, note: evaluationScores.PartnerHotelsText }, + ]; + const columns_DMC_pricing = [ + { title: 'Pricing & Settlement (20%)', dataIndex: 'item', key: 'item',align: 'center', }, + { title: '3 scores', dataIndex: 'stand_3', key: 'stand_3', align: 'center', }, + { title: '4 scores', dataIndex: 'stand_4', key: 'stand_4',align: 'center', }, + { title: '5 scores', dataIndex: 'stand_5', key: 'stand_5',align: 'center', }, + { title: 'Your Scores', dataIndex: 'value', key: 'value',align: 'center', }, + { title: 'Final Scores', dataIndex: 'final_score', key: 'final_score',align: 'center', onCell: (_, index) => ({ rowSpan: index === 0 ? 3 : 0 })}, + { title: 'Note', dataIndex: 'note', key: 'note',align: 'center', }, + ]; + const DMCData_pricing = [ + { + item: 'Quotation', + stand_3: 'Package', + stand_4: 'Day tours', + stand_5: 'Individual services', + value: evaluationScores.Quotation, + final_score: evaluationScores.AvgPricingAndSettlement, + note: evaluationScores.QuotationText, + }, + { + item: 'Settlement', + stand_3: 'Prepayment', + stand_4: 'Monthly Prepayment', + stand_5: 'Monthly settlement after the tours', + value: evaluationScores.Settlement, + note: evaluationScores.SettlementText, + }, + { + item: 'Cancellation policy', + stand_3: '30 days', + stand_4: '21 days', + stand_5: '1 day', + value: evaluationScores.CancellationPolicy, + note: evaluationScores.CancellationPolicyText, + },]; - - - - Primary Data - -
-
-
-
- - - - - - - - - - - - - - - - - - - - - - - - - -
GroupsNumber of PeopleTransaction Amount (USD)Evaluation ScoreTP ReviewsTP Reviews RateComplaintsComplaint Rate
{evaluationScores.Groups}{evaluationScores.PersonNum}{comm.formatPrice(evaluationScores.AmountUSD)}{evaluationScores.EvaluationScore}{evaluationScores.TPReviews}{comm.formatPercent(evaluationScores.TPReviewRate)}{evaluationScores.Complaints}{comm.formatPercent(evaluationScores.ComplaintRate)}
-
-
-
-
- + const columns_primary = [ + { + title: 'Groups', + dataIndex: 'Groups', + key: 'Groups', + }, + { + title: 'Number of People', + dataIndex: 'PersonNum', + key: 'PersonNum', + }, + { + title: 'Transaction Amount(USD)', + dataIndex: 'AmountUSD', + key: 'AmountUSD', + render: (value) => comm.formatPrice(value), + }, + { + title: 'Evaluation Score', + dataIndex: 'EvaluationScore', + key: 'EvaluationScore', + }, + { + title: 'TP Reviews', + dataIndex: 'TPReviews', + key: 'TPReviews', + }, + { + title: 'TP Reviews Rate', + dataIndex: 'TPReviewRate', + key: 'TPReviewRate', + render: (value) => comm.formatPercent(value), + }, + { + title: 'Complaints', + dataIndex: 'Complaints', + key: 'Complaints', + }, + { + title: 'Complaint Rate', + dataIndex: 'ComplaintRate', + key: 'ComplaintRate', + render: (value) => comm.formatPercent(value), + }, + ]; - - - Monthly Data - - - + const columns_month = [{ title: 'Date', dataIndex: 'VMonth', key: 'VMonth' }, ...columns_primary]; - - - DMC Assessment Criteria - -
-
-
-
-
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
Customer Satisfaction3 scores4 scores5 scoresYour ScoresFinal ScoresNote
TP review rating\30%60%{evaluationScores.TPReviewRating}{evaluationScores.AvgCusSatisfaction}{evaluationScores.TPReviewRatingText}
Post tour complaints100{evaluationScores.PostTourComplaints}{evaluationScores.PostTourComplaintsText}
Complaints resolved during the tour3{evaluationScores.ComplaintsDuringTour}{evaluationScores.ComplaintsDuringTourText}
Customer photos\30%50%{evaluationScores.CustomerPhotoRate}{evaluationScores.CustomerPhotoRateText}
Evaluation scores4.5{evaluationScores.EvaluationFormScore}{evaluationScores.EvaluationFormScoreText}
-
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
Operator Support & Local resources3 scores4 scores5 scoresYour ScoresFinal ScoresNote
Response efficiency1d6hrs3hrs{evaluationScores.ResponseEfficiency}{evaluationScores.AvgLocalResources}{evaluationScores.ResponseEfficiencyText}
Provide suggestions and alternatives\{evaluationScores.ProvideSuggestions}{evaluationScores.ProvideSuggestionsText}
Provide local tourism information\{evaluationScores.ProvideLocalInfo}{evaluationScores.ProvideLocalInfoText}
Assist in developing exclusive products\\{evaluationScores.ExclusiveProducts}{evaluationScores.ExclusiveProductsText}
Dedicated tour guide team for AH\{evaluationScores.DedicatedTourGuide}{evaluationScores.DedicatedTourGuideText}
Partner hotels with contracted rate\{evaluationScores.PartnerHotels}{evaluationScores.PartnerHotelsText}
-
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
Pricing & Settlement (20%)3 scores4 scores5 scoresYour ScoresFinal ScoresNote
QuotationPackageDay toursIndividual services{evaluationScores.Quotation}{evaluationScores.AvgPricingAndSettlement}{evaluationScores.QuotationText}
SettlementPrepaymentMonthly PrepaymentMonthly settlement after the tours{evaluationScores.Settlement}{evaluationScores.SettlementText}
Cancellation policy30 days21 days1 day{evaluationScores.CancellationPolicy}{evaluationScores.CancellationPolicyText}
- - - - - - - Final Scores: {evaluationScores.FinalScores} - - -
- - - Scoring Rules - - -
    -
  1. The maximum score is 5
  2. -
  3. - The three categories are: -
      -
    • Customer satisfaction (40%)
    • -
    • Operator support & local resources (40%)
    • -
    • Pricing & settlement (20%)
    • -
    -
  4. -
  5. For each category, you can only get the corresponding score if you meet the standards of all items under the score.
  6. -
  7. The final score is the sum of the scores of each category multiplied by the proportion of the category.
  8. -
-
-
+ const columns_guide = [ + { + title: 'Name', + dataIndex: 'TGI2_Name', + key: 'TGI2_Name', + }, + { + title: 'Average Scores', + dataIndex: 'VAverage', + key: 'VAverage', + }, + { + title: 'Group Numbers', + dataIndex: 'ReceptionGroups', + key: 'ReceptionGroups', + }, + { + title: 'TP Reviews', + dataIndex: 'CommendNum', + key: 'CommendNum', + }, + { + title: 'TP Review Rate', + dataIndex: 'CommendRate', + key: 'CommendRate', + render: (value) => comm.formatPercent(value), + }, + { + title: 'Complaints', + dataIndex: 'Complaints', + key: 'Complaints', + }, + { + title: 'Complaint Rate', + dataIndex: 'ComplaintRate', + key: 'ComplaintRate', + render: (value) => comm.formatPercent(value), + }, + ]; -
- - Evaluation Scores - -
-
-
-
- - - - - - - - - - - - - - - - + const columns_commend = [ + { + title: 'Reference Number', + dataIndex: 'GRI_No', + key: 'GRI_No', + }, + { + title: 'Tour Guides', + dataIndex: 'ObjectName', + key: 'ObjectName', + }, + { + title: 'Essential Comments', + dataIndex: 'ECI_Content', + key: 'ECI_Content', + }, + ]; - - - - - - - - - - - - + const { toPDF, targetRef } = usePDF({ + method: 'save', + filename: 'GHH-Report.pdf', + page: { margin: '3', format: 'letter' }, //margin: Margin.SMALL, + canvas: { mimeType: 'image/jpeg', qualityRatio: 1 }, + overrides: { pdf: { compress: true }, canvas: { useCORS: true } }, + }); - - - - - - - - - - -
CategoryItemYour ScoresNote
DMC ServicesGuide{evaluationScores.FRTGuide}{evaluationScores.FRTText}
Driver & Vehicle{evaluationScores.FRTGriver}
Food Arrangement{evaluationScores.FRTMeal}
Activity{evaluationScores.FRTProduct}
Itinerary ArrangementsHotel{evaluationScores.FRTHotel}
Travel Advisor’s Planning{evaluationScores.FRTAdvisor}
-
-
-
-
- - - - Tour Guides Performence - - + return ( + + {/* */} + + + { + getHWVendorScores(travelAgencyId, formVal.startdate, formVal.enddate); + getHWProductScores(travelAgencyId, formVal.startdate, formVal.enddate); + getHWCommendScores(travelAgencyId, formVal.startdate, formVal.enddate); + }} + /> + + + + + - - TP Reviews - -
+ + + + + Primary Data + + +
+ - - Complaints - -
+ + + + Monthly Data + + +
+ - - Suggestions from Customers - -
- - - - ); + + + + DMC Assessment Criteria + + +
+
+
+
+
+ + + Final Scores: {evaluationScores.FinalScores} + + +
+ + + Scoring Rules + + +
    +
  1. The maximum score is 5
  2. +
  3. + The three categories are: +
      +
    • Customer satisfaction (40%)
    • +
    • Operator support & local resources (40%)
    • +
    • Pricing & settlement (20%)
    • +
    +
  4. +
  5. For each category, you can only get the corresponding score if you meet the standards of all items under the score.
  6. +
  7. The final score is the sum of the scores of each category multiplied by the proportion of the category.
  8. +
+
+
+ +
+ + + Evaluation Scores + + +
+ + + + + Tour Guides Performence + + +
+ + + + TP Reviews + + +
+ + + + Complaints + + +
+ + + + Suggestions from Customers + + +
+ + + + ); } -export default observer(Index); +export default (Index);