From e14b72295e3ab83c122888ca045c0c8f3df2a8f3 Mon Sep 17 00:00:00 2001 From: LiaoYijun Date: Fri, 14 Nov 2025 17:01:48 +0800 Subject: [PATCH] =?UTF-8?q?perf:=20=E5=8F=96=E6=B6=88=E6=97=B6=E5=85=B3?= =?UTF-8?q?=E9=97=AD=20Drawer?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/stores/ExternalReview.js | 24 +- src/views/external-reviews/review-list.jsx | 249 ++++++++++++++------- 2 files changed, 192 insertions(+), 81 deletions(-) diff --git a/src/stores/ExternalReview.js b/src/stores/ExternalReview.js index ff1c3b8..1f7d14e 100644 --- a/src/stores/ExternalReview.js +++ b/src/stores/ExternalReview.js @@ -1,9 +1,10 @@ import { create } from 'zustand' import { devtools } from 'zustand/middleware' import { fetchJSON, postForm } from '@/utils/request' -import { HT_HOST, TGA_HOST } from "@/config" +import { DATE_FORMAT, TGA_HOST } from "@/config" import { isEmpty } from '@/utils/commons' import { usingStorage } from '@/hooks/usingStorage' +import dayjs from "dayjs"; export const fetchAllItinerary = async (reservationId) => { @@ -35,12 +36,10 @@ const useExternalReviewStore = create(devtools((set, get) => ({ reviewList: [], - fetchReviewList: async (formValues) => { - - console.info('formValues: ', formValues) + fetchReviewList: async (formValues, travelAgencyId) => { const { errcode, errmsg, result } = await fetchJSON(`${TGA_HOST}/api/index.php/customer_review/search/`, - { agent_id: formValues.agency, group_number: formValues?.referenceNo??'', + { agent_id: travelAgencyId, group_number: formValues?.referenceNo??'', from_date: formValues?.startdate??'', thru_date: formValues?.enddate??'', approval_status: formValues?.approvalStatus??'' }) @@ -48,7 +47,6 @@ const useExternalReviewStore = create(devtools((set, get) => ({ if (errcode !== 0) { return Promise.reject(new Error(errmsg + ': ' + errcode)) } else { - console.info('reviewList: ', result) set(() => ({ reviewList: result })) @@ -57,6 +55,20 @@ const useExternalReviewStore = create(devtools((set, get) => ({ } }, + postReview: (formValues, travelAgencyId) => { + const formData = new FormData() + formData.append('agent_id', travelAgencyId) + formData.append('review_id', formValues.reviewId??'') + formData.append('review_link', formValues.reviewLink) + formData.append('date_posted', dayjs(formValues.datePosted).format(DATE_FORMAT)) + formData.append('customer_id', formValues.customerId) + formData.append('reference_id', formValues.referenceId) + formData.append('guide_id', formValues.guideId) + formData.append('city_id', formValues.cityId) + + return postForm(`${TGA_HOST}/api/index.php/customer_review/agent_submit/`, formData) + }, + }), { name: 'externalReviewStore' })) export default useExternalReviewStore diff --git a/src/views/external-reviews/review-list.jsx b/src/views/external-reviews/review-list.jsx index 84f6253..032012b 100644 --- a/src/views/external-reviews/review-list.jsx +++ b/src/views/external-reviews/review-list.jsx @@ -1,13 +1,28 @@ import { useState, useEffect } from "react"; -import { Row, Col, Space, Button, Form, Table, Typography, Input, DatePicker, Drawer, Select, App } from "antd"; +import { + Row, + Col, + Space, + Button, + Form, + Table, + Typography, + Input, + DatePicker, + Drawer, + Select, + App, +} from "antd"; import dayjs from "dayjs"; import { FileAddOutlined, EditOutlined } from "@ant-design/icons"; -import { groupBy, isEmpty } from '@/utils/commons' +import { groupBy, isEmpty } from "@/utils/commons"; import { useTranslation } from "react-i18next"; import useFormStore from "@/stores/Form"; -import { usingStorage } from '@/hooks/usingStorage' -import useExternalReviewStore, { fetchRecentGroup } from "@/stores/ExternalReview"; -import useReservationStore, {fetchCityList} from '@/stores/Reservation' +import { usingStorage } from "@/hooks/usingStorage"; +import useExternalReviewStore, { + fetchRecentGroup, +} from "@/stores/ExternalReview"; +import useReservationStore, { fetchCityList } from "@/stores/Reservation"; import SearchForm from "@/components/SearchForm"; function ReviewList() { @@ -81,9 +96,13 @@ function ReviewList() { title: t("review.Action"), width: "120px", ellipsis: true, - render: () => { + render: (_, review) => { return ( - ); @@ -91,45 +110,49 @@ function ReviewList() { }, ]; - const [formReview] = Form.useForm() - const [openReview, setOpenReview] = useState(false) - const [dataLoading, setDataLoading] = useState(false) - const [guideSelectOptions, setGuideSelectOptions] = useState([]) - const [groupListOptions, setGroupListOptions] = useState([]) - const [cityListOptions, setCityListOptions] = useState([]) + const [formReview] = Form.useForm(); + const [openReview, setOpenReview] = useState(false); + const [dataLoading, setDataLoading] = useState(false); + const [guideSelectOptions, setGuideSelectOptions] = useState([]); + const [groupListOptions, setGroupListOptions] = useState([]); + const [cityListOptions, setCityListOptions] = useState([]); - const formValuesToSub = useFormStore(s => s.formValuesToSub); - const { travelAgencyId } = usingStorage() - const [fetchAgencyGuideList] = useReservationStore(s => [ - s.fetchAgencyGuideList - ]) - const [fetchReviewList, reviewList] = useExternalReviewStore((s) => [ - s.fetchReviewList, - s.reviewList, + const formValuesToSub = useFormStore((s) => s.formValuesToSub); + const { travelAgencyId } = usingStorage(); + const [fetchAgencyGuideList] = useReservationStore((s) => [ + s.fetchAgencyGuideList, ]); + const [fetchReviewList, reviewList, postReview] = useExternalReviewStore( + (s) => [s.fetchReviewList, s.reviewList, s.postReview] + ); - const { notification } = App.useApp() + const { notification } = App.useApp(); - useEffect (() => { - initAgencyGuideList(travelAgencyId) - }, [travelAgencyId]) + useEffect(() => { + initAgentData(travelAgencyId); + }, [travelAgencyId]); - const initAgencyGuideList = async (travelAgencyId) => { - fetchAgencyGuideList(travelAgencyId) - .then((guideList) => { - const guideCity = (groupBy(guideList, 'cityName')); - const guideOptions = Object.keys(guideCity).map(city => ({ - label: isEmpty(city) ? '-' : city, options: guideCity[city].map(guide => ({ value: guide.guideId, label: guide.guideName + '(' + guide.mobileNo + ')', })), - })); - setGuideSelectOptions(guideOptions) - }) + const initAgentData = async (travelAgencyId) => { + fetchAgencyGuideList(travelAgencyId).then((guideList) => { + const guideCity = groupBy(guideList, "cityName"); + const guideOptions = Object.keys(guideCity).map((city) => ({ + label: isEmpty(city) ? "-" : city, + options: guideCity[city].map((guide) => ({ + value: guide.guideId, + label: guide.guideName + "(" + guide.mobileNo + ")", + })), + })); + setGuideSelectOptions(guideOptions); + }); - const recentGroupList = await fetchRecentGroup(travelAgencyId) - setGroupListOptions(recentGroupList.map(group => ({ value: group.id, label: group.number }))) - } - const searchReview = (submitValues, current = 1) => { + const recentGroupList = await fetchRecentGroup(travelAgencyId); + setGroupListOptions( + recentGroupList.map((group) => ({ value: group.id, label: group.number })) + ); + }; + const searchReview = (submitValues) => { setDataLoading(true); - fetchReviewList(submitValues, current) + fetchReviewList(submitValues, travelAgencyId) .catch((ex) => { notification.error({ message: `Notification`, @@ -143,77 +166,148 @@ function ReviewList() { }); }; + const onReviewSeleted = async (review) => { + // 转换为 Form.Item DatePicker 格式 + review.datePosted = dayjs(review.datePosted); + formReview.setFieldsValue(review); + setOpenReview(true); + }; + + const onReviewFinish = (values) => { + postReview(values, travelAgencyId) + .then(() => { + notification.info({ + message: "Notification", + description: "Success", + placement: "top", + }); + setOpenReview(false); + searchReview(formValuesToSub); + }) + .catch((ex) => { + notification.error({ + message: "Notification", + description: ex.message, + placement: "top", + duration: 4, + }); + }); + }; + return ( <> - setOpenReview(false)} open={openReview}> + { + setOpenReview(false); + formReview.resetFields(); + }} + >
{ - }}> - - + onReviewFinish(values); + }} + > + - - + + - + + + + - + - (option?.label ?? '').toLowerCase().includes(input.toLowerCase()) + (option?.label ?? "") + .toLowerCase() + .includes(input.toLowerCase()) } options={guideSelectOptions} /> - +