From 1e439621a547769f18699b3f679fc3fde02259c4 Mon Sep 17 00:00:00 2001 From: Jimmy Liow Date: Wed, 12 Jun 2024 15:37:04 +0800 Subject: [PATCH] =?UTF-8?q?feat:=20=E5=88=9D=E6=AD=A5=E5=AE=8C=E6=88=90?= =?UTF-8?q?=E8=B4=A6=E5=8F=B7=E6=9D=83=E9=99=90=E7=AE=A1=E7=90=86=E7=95=8C?= =?UTF-8?q?=E9=9D=A2?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- doc/价格管理平台.bmpr | Bin 254976 -> 254976 bytes package.json | 2 +- src/main.jsx | 2 + src/stores/Reservation.js | 11 +- src/views/account/Management.jsx | 375 +++++++++++++++++++++++++++++++ src/views/reservation/Detail.jsx | 16 +- 6 files changed, 392 insertions(+), 14 deletions(-) create mode 100644 src/views/account/Management.jsx diff --git a/doc/价格管理平台.bmpr b/doc/价格管理平台.bmpr index 3d600bf3c0587b0b73e806a7259dfb676fbf17c7..f82ae8076d9aab3c8dcfdcdd040fbe0d2877c22e 100644 GIT binary patch delta 1401 zcmZvbUu@G=6vuz(-rKrhVRI?noCPP&QJ^Njv2GOXLxB$Zu;8ZE^kENMf^msAaT3D6 z7_B=0L>JfXGJY6!REgq)n$a73UQG01F-u&cQBWYx6rBkVKKMWk4}*Gs_ck#Da`XND z?&ti@J*W4a)51byVWF}30Q5{n_d?J4VK*2^Itiy+%>-}l?{i#d53P)|!`VygQQ9X+ zU9{UtYq#0CP7f{L=6m-z`{mC0_=Br| zGRCDojJ>+ya6_@PWs?ol0JNA z((;Qu1RblhK63X`9Oc2sZ>t*edAMor*omS5RH)4;`eB8aOZ1CkD6+n78;Z1Vn-d`v zN!t0>aJ7ijw=OL{uko{dA@qN&-g>MZek}4y*5mB7as1P}Y@qVrwf*pOB>_Ufst$k2 zD=9h}xJ$n!n^g5wMm0m}*_|1=Z4MOlT${}`=dm_(9{Tmig<_+g8zk)Jn zc);?jC$8;JdLu+aLBSk88X~p`6S8) z!@}|mNN{iQh= zXZJ>*X{9VJq!4KxX)P&2Y9uw2!ld=2qoiY`?HkU=jx&zsE_IcH2~rq&r=6}L6M_B+@}Y5;Xh=(iNF8= delta 17666 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 Nj+YNlcT$Ph{x6kJbU^?B diff --git a/package.json b/package.json index 51e69db..7b26815 100644 --- a/package.json +++ b/package.json @@ -1,7 +1,7 @@ { "name": "global.highlights.hub", "private": true, - "version": "0.1.0", + "version": "2.0.0", "type": "module", "scripts": { "dev": "vite", diff --git a/src/main.jsx b/src/main.jsx index 37da44d..7be63e3 100644 --- a/src/main.jsx +++ b/src/main.jsx @@ -18,6 +18,7 @@ import ReservationNewest from "@/views/reservation/Newest"; import ReservationDetail from "@/views/reservation/Detail"; import ChangePassword from "@/views/account/ChangePassword"; import AccountProfile from "@/views/account/Profile"; +import AccountManagement from "@/views/account/Management"; import FeedbackIndex from "@/views/feedback/Index"; import FeedbackDetail from "@/views/feedback/Detail"; import FeedbackCustomerDetail from "@/views/feedback/CustomerDetail"; @@ -51,6 +52,7 @@ const router = createBrowserRouter([ { path: "reservation/:reservationId", element: }, { path: "account/change-password", element: }, { path: "account/profile", element: }, + { path: "account/management", element: }, { path: "feedback", element: }, { path: "feedback/:GRI_SN/:CII_SN/:RefNo", element: }, { path: "feedback/:GRI_SN/:RefNo", element: }, diff --git a/src/stores/Reservation.js b/src/stores/Reservation.js index 0e78634..686d191 100644 --- a/src/stores/Reservation.js +++ b/src/stores/Reservation.js @@ -19,7 +19,7 @@ export const fetchPlanDetail = async (travelAgencyId, reservationId) => { if (json.errcode == 0) { return { - planDetail: json.PlanDetail[0], + planDetail: json.PlanDetail == null ? {} : json.PlanDetail[0], planChangeList: json.PlanChange??[] } } else { @@ -139,7 +139,7 @@ const useReservationStore = create((set, get) => ({ }, fetchAllGuideList: () => { - const { userId, travelAgencyId } = usingStorage() + const { travelAgencyId } = usingStorage() const fetchUrl = prepareUrl(HT_HOST + '/service-cusservice/PTGetGuideList') .append('VEI_SN', travelAgencyId) .build(); @@ -161,7 +161,8 @@ const useReservationStore = create((set, get) => ({ }); }, - getReservationDetail: async (travelAgencyId, reservationId) => { + getReservationDetail: async (reservationId) => { + const { travelAgencyId } = usingStorage() const { planDetail, planChangeList } = await fetchPlanDetail(travelAgencyId, reservationId) const attachListJson = await fetchAttachList(reservationId) @@ -192,7 +193,8 @@ const useReservationStore = create((set, get) => ({ })) }, - submitConfirmation: (userId, travelAgencyId, confirmText) => { + submitConfirmation: (confirmText) => { + const { userId, travelAgencyId } = usingStorage() const { selectedConfirmation, getReservationDetail, reservationDetail } = get() const formData = new FormData() formData.append('PCI_SN', selectedConfirmation.key) @@ -205,7 +207,6 @@ const useReservationStore = create((set, get) => ({ return postForm(postUrl, formData) .then(json => { if (json.errcode == 0 && json.Result.length == 1) { - // this.fetchReservation(this.reservationDetail.reservationId); getReservationDetail(travelAgencyId, reservationDetail.reservationId) return json } diff --git a/src/views/account/Management.jsx b/src/views/account/Management.jsx new file mode 100644 index 0000000..6045a6b --- /dev/null +++ b/src/views/account/Management.jsx @@ -0,0 +1,375 @@ +import { NavLink, useLocation } from 'react-router-dom' +import { useState, useEffect } from 'react' +import { Row, Col, Space, Button, Table, Select, TreeSelect, Typography, Modal, App, Form, Input } from 'antd' +import dayjs from 'dayjs' +import { isEmpty } from '@/utils/commons' +import { useTranslation } from 'react-i18next' +import useFormStore from '@/stores/Form' +import useReservationStore from '@/stores/Reservation' +import SearchForm from '@/components/SearchForm' + +const { Title } = Typography + +const { SHOW_PARENT } = TreeSelect + +const permissionData = [ + { + title: '机票管理', + value: '0-0', + key: '0-0', + children: [ + { + title: '录入机票价格', + value: '0-0-0', + key: '0-0-0', + }, + ], + }, + { + title: '产品管理', + value: '0-1', + key: '0-1', + children: [ + { + title: '录入产品价格', + value: '0-1-0', + key: '0-1-0', + }, + { + title: '新增产品描述', + value: '0-1-1', + key: '0-1-1', + }, + { + title: '复制供应商产品信息', + value: '0-1-2', + key: '0-1-2', + }, + ], + }, + { + title: '账号管理', + value: '2-1', + key: '2-1', + children: [ + { + title: '重置账号密码', + value: '2-1-0', + key: '2-1-0', + }, + { + title: '禁用账号', + value: '2-1-1', + key: '2-1-1', + }, + { + title: '分配账号角色', + value: '2-1-2', + key: '2-1-2', + }, + ], + }, +]; + +function Management() { + const { t } = useTranslation() + const accountListColumns = [ + { + title: t('account:username'), + dataIndex: 'username', + key: 'account:username', + }, + { + title: t('account:realname'), + dataIndex: 'realname', + key: 'account:realname', + }, + { + title: t('account:email'), + dataIndex: 'email', + key: 'account:email' + }, + { + title: t('account:role'), + dataIndex: 'role', + key: 'account:role' + }, + { + title: t('account:lastLogin'), + dataIndex: 'lastLogin', + key: 'account:lastLogin' + }, + { + title: t('account:action'), + key: 'account:action', + dataIndex: 'account:action', + render: actionRender + }, + ] + + function actionRender() { + return ( + + + + + + ) + } + + + const onPermissionChange = (newValue) => { + console.log('onChange ', newValue); + setPermissionValue(newValue); + } + const [permissionValue, setPermissionValue] = useState(['0-0-0']) + const [isAccountModalOpen, setAccountModalOpen] = useState(false) + const [isRoleModalOpen, setRoleModalOpen] = useState(false) + const [dataLoading, setDataLoading] = useState(false) + const [accountList, setaccountList] = useState([ + { + username: 'bjyiran', + realname: '怡小芳', + email: 'xiaofang@yiran.com', + role: '国内供应商', + lastLogin: '2024-06-12 13:53' + }, + { + username: 'int-robin', + realname: 'Robin', + email: 'robin@int.com', + role: '海外供应商', + lastLogin: '2024-06-12 13:53' + }, + { + username: 'betty-wu', + realname: '吴雪', + email: 'betty@hainatravel.com', + role: '客服组', + lastLogin: '2024-06-12 13:53' + }, + { + username: 'lancy', + realname: '吴金倩', + email: 'lancy@hainatravel.com', + role: '产品组', + lastLogin: '2024-06-12 13:53' + }, + { + username: 'LYJ', + realname: '廖一军', + email: 'lyj@hainatravel.com', + role: 'Web 开发组,海外测试供应商', + lastLogin: '2024-06-12 13:53' + } + ]) + + const formValuesToSub = useFormStore((state) => state.formValuesToSub) + + const [form] = Form.useForm() + const [fetchAllGuideList, fetchReservationList, reservationList, reservationPage, cityList, selectReservation, getCityListByReservationId] = + useReservationStore((state) => + [state.fetchAllGuideList, state.fetchReservationList, state.reservationList, state.reservationPage, state.cityList, state.selectReservation, state.getCityListByReservationId]) + + const { notification } = App.useApp() + + const handleAccountOk = () => { + } + + const handleAccountCancel = () => { + setAccountModalOpen(false) + } + + const handleRoleOk = () => { + } + + const handleRoleCancel = () => { + setRoleModalOpen(false) + } + + const onFinish = (values) => { + console.log(values) + } + + const onFinishFailed = (error) => { + console.log('Failed:', error) + // form.resetFields() + } + + // 默认重新搜索第一页,所有状态的计划 + const onSearchClick = (current=1, status=null) => { + } + + return ( + <> + +
+ {t('account:management.newAccount')} + + + + + + + + + + + + +
+
+ {/* Role Edit */} + +
+ {t('account:management.newRole')} + + + + + + +
+
+ + {t('account:management.tile')} + { + setDataLoading(true) + fetchReservationList(formVal) + .catch(ex => { + notification.error({ + message: 'Notification', + description: ex.message, + placement: 'top', + duration: 4, + }) + }) + .finally(() => { + setDataLoading(false) + }) + }} + /> + + + + + + + + + + + { return `总数:${total}` } + }} + onChange={(pagination) => {onSearchClick(pagination.current)}} + columns={accountListColumns} dataSource={accountList} + /> + + + + + ) +} + +export default Management diff --git a/src/views/reservation/Detail.jsx b/src/views/reservation/Detail.jsx index a214486..2e6f8f8 100644 --- a/src/views/reservation/Detail.jsx +++ b/src/views/reservation/Detail.jsx @@ -1,10 +1,10 @@ -import { useParams, useNavigate } from "react-router-dom" +import { useParams } from "react-router-dom" import { useEffect, useState } from 'react' import { Row, Col, Space, Button, Table, Input, Typography, Modal, Tag, App } from 'antd' import { FileOutlined } from '@ant-design/icons'; -import useAuthStore from '@/stores/Auth' +import { usingStorage } from '@/hooks/usingStorage' import useReservationStore from '@/stores/Reservation' import { useTranslation } from 'react-i18next' import BackBtn from '@/components/BackBtn' @@ -69,7 +69,6 @@ function Detail() { ); } - const navigate = useNavigate(); const [isModalOpen, setIsModalOpen] = useState(false); const [confirmLoading, setConfirmLoading] = useState(false); const [confirmText, setConfirmText] = useState(''); @@ -78,7 +77,8 @@ function Detail() { const { notification } = App.useApp(); const { reservationId } = useParams(); - const loginUser = useAuthStore((state) => state.loginUser) + const { travelAgencyId, loginToken } = usingStorage() + const [getReservationDetail, reservationDetail, confirmationList, selectConfirmation, submitConfirmation] = useReservationStore((state) => [state.getReservationDetail, state.reservationDetail, state.confirmationList, state.selectConfirmation, state.submitConfirmation]) @@ -87,9 +87,9 @@ function Detail() { 'https://view.officeapps.live.com/op/embed.aspx?wdPrint=1&wdHideGridlines=0&wdHideComments=1&wdEmbedCode=0&src='; // 测试文档:https://www.chinahighlights.com/public/reservationW220420009.doc const reservationUrl = - `https://p9axztuwd7x8a7.mycht.cn/service-fileServer/DownloadPlanDoc?GRI_SN=${reservationId}&VEI_SN=${loginUser.travelAgencyId}&token=${loginUser.token}&FileType=1`; + `https://p9axztuwd7x8a7.mycht.cn/service-fileServer/DownloadPlanDoc?GRI_SN=${reservationId}&VEI_SN=${travelAgencyId}&token=${loginToken}&FileType=1`; const nameCardUrl = - `https://p9axztuwd7x8a7.mycht.cn/service-fileServer/DownloadPlanDoc?GRI_SN=${reservationId}&VEI_SN=${loginUser.travelAgencyId}&token=${loginUser.token}&FileType=2`; + `https://p9axztuwd7x8a7.mycht.cn/service-fileServer/DownloadPlanDoc?GRI_SN=${reservationId}&VEI_SN=${travelAgencyId}&token=${loginToken}&FileType=2`; const reservationPreviewUrl = officeWebViewerUrl + encodeURIComponent(reservationUrl); const nameCardPreviewUrl = officeWebViewerUrl + encodeURIComponent(nameCardUrl); @@ -103,7 +103,7 @@ function Detail() { const handleOk = () => { setConfirmLoading(true); - submitConfirmation(loginUser.userId, loginUser.travelAgencyId, confirmText + '\n——————————————————————\n' +newConfirmText) + submitConfirmation(confirmText + '\n——————————————————————\n' +newConfirmText) .finally(() => { setNewConfirmText(''); setIsModalOpen(false); @@ -116,7 +116,7 @@ function Detail() { useEffect(() => { setDataLoading(true); - getReservationDetail(loginUser.travelAgencyId, reservationId) + getReservationDetail(reservationId) .catch(ex => { notification.error({ message: `Notification`,