Merge branch 'main' of github.com:hainatravel/GHHub

release
YCC 2 years ago
commit 8f0828aba8

@ -9,6 +9,7 @@ import RootStore from "@/stores/Root";
import { StoreContext } from '@/stores/StoreContext';
import "@/assets/global.css";
import App from "@/views/App";
import Standlone from "@/views/Standlone";
import Login from "@/views/Login";
import SignOut from "@/views/SignOut";
import Index from "@/views/index";
@ -20,6 +21,8 @@ import ReservationNameCard from "@/views/reservation/NameCard";
import FeedbackIndex from "@/views/feedback/Index";
import FeedbackDetail from "@/views/feedback/Detail";
import NoticeIndex from "@/views/notice/Index";
import InvoiceIndex from "@/views/invoice/Index";
import InvoiceDetail from "@/views/invoice/Detail";
configure({
@ -45,10 +48,12 @@ const router = createBrowserRouter([
{ path: "feedback", element: <FeedbackIndex />},
{ path: "feedback/:GRI_SN", element: <FeedbackDetail />},
{ path: "notice", element: <NoticeIndex />},
{ path: "invoice",element:<InvoiceIndex />},
{ path: "invoice/detial/:GMDSN/:GSN",element:<InvoiceDetail />},
]
},
{
element: <App />,
element: <Standlone />,
children: [
{ path: "/login", element: <Login /> },
{ path: "/sign-out", element: <SignOut /> }

@ -1,4 +1,7 @@
import { makeAutoObservable } from "mobx";
import { makeAutoObservable, runInAction } from "mobx";
import { fetchJSON } from '@/utils/request';
import { HT_HOST } from "@/config";
import { prepareUrl } from '@/utils/commons';
class Auth {
@ -7,10 +10,56 @@ class Auth {
this.root = root;
}
valdateUserPassword(usr, pwd) {
const fetchUrl = prepareUrl(HT_HOST + '/service-Cooperate/Cooperate/Login')
.append('username', usr)
.append('password', pwd)
.build();
return fetchJSON(fetchUrl)
.then(json => {
if (json.errcode == 0) {
runInAction(() => {
this.login = {
userId: json.Result.WU_LMI_SN,
username: json.Result.WU_UserName,
}
});
} else {
throw new Error(json.errmsg + ': ' + json.errcode);
}
});
}
fetchUserDetail(userId) {
const fetchUrl = prepareUrl(HT_HOST + '/service-Cooperate/Cooperate/GetLinkManInfo')
.append('LMI_SN', userId)
.build();
return fetchJSON(fetchUrl)
.then(json => {
if (json.errcode == 0) {
runInAction(() => {
this.login = {
userId: json.Result.LMI_SN,
username: json.Result.LoginName,
travelAgencyId: json.Result.LMI_VEI_SN,
travelAgencyName: json.Result.VName,
cityId: json.Result.citysn
}
});
} else {
throw new Error(json.errmsg + ': ' + json.errcode);
}
});
}
login = {
userId: 1,
username: 'Vu Xuan Giang(ANP)',
travelAgencyId: 32531 //30008供应商id对应HT的VEI_SN
username: 'Vu Xuan Giang',
travelAgencyId: 32531, //30008供应商id对应HT的VEI_SN
travelAgencyName: 'ANP',
cityId: 0
}
}

@ -0,0 +1,109 @@
import { makeAutoObservable,runInAction } from "mobx";
import { fetchJSON } from "@/utils/request";
import { prepareUrl } from '@/utils/commons';
import { HT_HOST } from "@/config";
class Invoice {
constructor(root) {
makeAutoObservable(this, { rootStore: false });
this.root = root;
}
invoiceList = []; //账单列表
fetchInvoiceList(PageIndex,OrderType,GroupNo,DateStart,DateEnd,Orderbytype,TimeType,limitmarket,mddgroup,SecuryGroup){
this.invoicePage.current=PageIndex;
const totalNum = PageIndex == 1 ? 0 : this.invoicePage.total;
//组合param
const fetchUrl = prepareUrl(HT_HOST + '/service-cusservice/PTSearchGMBPageList')
.append('VEI_SN', this.root.authStore.login.travelAgencyId)
.append('OrderType',OrderType)
.append('GroupNo',GroupNo)
.append('DateStart',DateStart)
.append('DateEnd',DateEnd)
.append('Orderbytype',Orderbytype)
.append('TimeType',TimeType)
.append('limitmarket',limitmarket)
.append('mddgroup',mddgroup)
.append('SecuryGroup',SecuryGroup)
.append('TotalNum', totalNum)
.append('PageSize', this.invoicePage.size)
.append('PageIndex', this.invoicePage.current)
.build();
return fetchJSON(fetchUrl)
.then(json => {
runInAction(()=>{
if (json.errcode==0){
this.invoiceList = json.result.map((data,index)=>{
return{
key:GSMSN,
gmd_gri_sn : data.gmd_gri_sn,
gmd_vei_sn : data.gmd_vei_sn,
GetDate : data.GetDate,
GMD_FillWorkers_SN : data.GMD_FillWorkers_SN,
GMD_FWks_LastEditTime : data.GMD_FWks_LastEditTime,
GMD_VerifyUser_SN : data.GMD_VerifyUser_SN,
GMD_Dealed : data.GMD_Dealed,
GMD_VRequestVerify : data.GMD_VRequestVerify,
LeftGDate : data.LeftGDate,
GMD_FillWorkers_Name : data.GMD_FillWorkers_Name,
GroupName : data.GroupName,
AllMoney : data.AllMoney,
PersonNum : data.PersonNum,
VName : data.VName
}
});
this.invoicePage.total = json.result[0].TotalCount;
}else{
throw new Error(json.errmsg + ': ' + json.errcode);
}
});
});
}
invoicePage = {
current:1,
size:10,
total:0
}
/* 测试数据 */
//账单列表范例数据
testData=
[
{
"GSMSN":449865,
"gmd_gri_sn":334233,
"gmd_vei_sn":628,
"GetDate":"2023-04-2 00:33:33",
"GMD_FillWorkers_SN":8617,
"GMD_FWks_LastEditTime":"2023-04-26 12:33:33",
"GMD_VerifyUser_SN":8928,
"GMD_Dealed":1,
"GMD_VRequestVerify":1,
"TotalCount":22,
"LeftGDate":"2023-03-30 00:00:00",
"GMD_FillWorkers_Name":"",
"GroupName":" 中华游230501-CA230402033",
"AllMoney":3539,
"PersonNum":"1大1小",
"VName":""
}
]
}
export default Invoice;

@ -1,5 +1,5 @@
import { makeAutoObservable, runInAction } from "mobx";
import { fetchJSON } from '@/utils/request';
import { fetchJSON, postForm } from '@/utils/request';
import { HT_HOST } from "@/config";
import { prepareUrl } from '@/utils/commons';
@ -31,7 +31,7 @@ class Reservation {
this.reservationList = json.Result.map((data, index) => {
return {
key: data.vas_gri_sn,
referenceId: data.vas_gri_sn,
reservationId: data.vas_gri_sn,
referenceNumber: data.GriName,
arrivalDate: data.GetGDate,
pax: data.PersonNum,
@ -96,11 +96,10 @@ class Reservation {
this.cityList = json.Result.map((data, index) => {
return {
key: data.CII_SN,
cityId: data.CII_SN,
cityName: data.CityName,
tourGuideId: data.TGI_SN,
tourGuide: data.GuideName,
reservationId: reservationId,
travelAgencyId: this.root.authStore.login.travelAgencyId,
tourGuide: data.GuideName
}
});
} else {
@ -110,17 +109,17 @@ class Reservation {
});
}
setupCityGuide() {
setupCityGuide(cityId, guideId) {
let formData = new FormData();
formData.append('GRI_SN', 1);
formData.append('VEI_SN', 1);
formData.append('TGI_SN', 1);
formData.append('CII_SN', 1);
formData.append('GetDate', '2023-06-01');
formData.append('LMI_SN', 1);
formData.append('GRI_SN', this.selectedReservation.reservationId);
formData.append('VEI_SN', this.root.authStore.login.travelAgencyId);
formData.append('TGI_SN', cityId);
formData.append('CII_SN', guideId);
formData.append('GetDate', this.selectedReservation.reservationDate);
formData.append('LMI_SN', this.root.authStore.login.userId);
const postUrl = HT_HOST + '/service-cusservice/PTAddGuide';
return req.postForm(postUrl, formData)
return postForm(postUrl, formData)
.then(json => {
console.info(json);
});
@ -149,9 +148,15 @@ class Reservation {
});
}
editReservation(reservation) {
this.selectedReservation = reservation;
}
guideList = [];
cityList = [];
selectedReservation = null;
reservationList = [];
reservationDetail = {

@ -2,12 +2,14 @@ import { makeAutoObservable } from "mobx";
import Reservation from "./Reservation";
import Feedback from "./Feedback";
import Auth from "./Auth";
import Invoice from "./Invoice";
class Root {
constructor() {
this.reservationStore = new Reservation(this);
this.feedbackStore = new Feedback(this);
this.authStore = new Auth(this);
//this.invoice = new Invoice(this);
makeAutoObservable(this);
}
}

@ -76,7 +76,7 @@ function App() {
items={[
{ key: "/reservation/newest", label: <Link to="/reservation/newest">Reservation</Link> },
{ key: "/feedback", label: <Link to="/feedback">Feedback</Link> },
{ key: "/invoice/list", label: <Link to="/invoice/list">Invoice</Link> },
{ key: "/invoice", label: <Link to="/invoice">Invoice</Link> },
{ key: "/notice", label: <Link to="/notice">Notice</Link> },
]}
/>

@ -1,109 +1,90 @@
import { Button, Checkbox, Form, Input, Row, Typography, Layout } from 'antd';
const { Header, Footer, Sider, Content } = Layout;
const { Title } = Typography;
const headerStyle = {
textAlign: 'center',
// color: '#fff',
height: 64,
paddingInline: 50,
lineHeight: '64px',
backgroundColor: '#f5f5f5',
};
const contentStyle = {
textAlign: 'center',
minHeight: 600,
lineHeight: '120px',
// color: '#fff',
// backgroundColor: '#108ee9',
};
const footerStyle = {
textAlign: 'center',
// color: '#fff',
// backgroundColor: '#7dbcea',
};
const onFinish = (values) => {
console.log('Success:', values);
};
const onFinishFailed = (errorInfo) => {
console.log('Failed:', errorInfo);
};
const Login = () => (
<Layout>
<Header style={headerStyle}>
<Title>Global Highlights Hub</Title>
</Header>
<Content style={contentStyle}>
<Row justify="center" align="middle" style={{minHeight: 600}}>
<Form
name="basic"
labelCol={{
span: 8,
}}
wrapperCol={{
span: 16,
}}
style={{
maxWidth: 600,
}}
initialValues={{
remember: true,
}}
onFinish={onFinish}
onFinishFailed={onFinishFailed}
autoComplete="off"
>
<Form.Item
label="Username"
name="username"
rules={[
{
required: true,
message: 'Please input your username!',
},
]}
>
<Input />
</Form.Item>
import { Button, Checkbox, Form, Input, Row, App } from 'antd';
import { useStore } from '@/stores/StoreContext.js';
<Form.Item
label="Password"
name="password"
rules={[
{
required: true,
message: 'Please input your password!',
},
]}
>
<Input.Password />
</Form.Item>
<Form.Item
name="remember"
valuePropName="checked"
wrapperCol={{
offset: 8,
span: 16,
}}
>
<Checkbox>Remember me</Checkbox>
</Form.Item>
function Login() {
const { authStore } = useStore();
const { notification } = App.useApp();
<Form.Item
wrapperCol={{
offset: 8,
span: 16,
}}
>
<Button type="primary" htmlType="submit">
Submit
</Button>
</Form.Item>
</Form>
</Row>
</Content>
<Footer style={footerStyle}>Footer</Footer>
</Layout>
const onFinish = (values) => {
console.log('Success:', values);
authStore.valdateUserPassword(values.username, values.password);
};
const onFinishFailed = (errorInfo) => {
console.log('Failed:', errorInfo);
};
return (
<Row justify="center" align="middle" style={{ minHeight: 500 }}>
<Form
name="basic"
labelCol={{
span: 8,
}}
wrapperCol={{
span: 16,
}}
style={{
maxWidth: 600,
}}
initialValues={{
remember: true,
}}
onFinish={onFinish}
onFinishFailed={onFinishFailed}
autoComplete="off"
>
<Form.Item
label="Username"
name="username"
rules={[
{
required: true,
message: 'Please input your username!',
},
]}
>
<Input />
</Form.Item>
<Form.Item
label="Password"
name="password"
rules={[
{
required: true,
message: 'Please input your password!',
},
]}
>
<Input.Password />
</Form.Item>
<Form.Item
name="remember"
valuePropName="checked"
wrapperCol={{
offset: 8,
span: 16,
}}
>
<Checkbox>Remember me</Checkbox>
</Form.Item>
<Form.Item
wrapperCol={{
offset: 8,
span: 16,
}}
>
<Button type="primary" htmlType="submit">
Submit
</Button>
</Form.Item>
</Form>
</Row>
);
}
);
export default Login;

@ -0,0 +1,57 @@
import { Outlet, Link, useHref, useLocation } from "react-router-dom";
import { useEffect } from "react";
import { observer } from "mobx-react";
import { Layout, Menu, ConfigProvider, theme, Typography, Space, Row, Col, Alert, App as AntApp } from "antd";
import { DownOutlined } from "@ant-design/icons";
import "antd/dist/reset.css";
import AppLogo from "@/assets/logo-gh.png";
import { useStore } from "@/stores/StoreContext.js";
const { Title } = Typography;
const { Header, Content, Footer } = Layout;
function Standlone() {
const { authStore } = useStore();
const {
token: { colorBgContainer },
} = theme.useToken();
return (
<ConfigProvider
theme={{
token: {
colorPrimary: "#00b96b",
},
algorithm: theme.defaultAlgorithm,
}}>
<AntApp>
<Layout
style={{
minHeight: "100vh",
}}>
<Header className="header" style={{ position: "sticky", top: 0, zIndex: 1, width: "100%" }}>
<Row gutter={{ md: 24 }} justify="center">
<Col span={4}>
<img src={AppLogo} className="logo" alt="App logo" />
</Col>
<Col span={20}><Title style={{ color: "white", marginTop: "3.5px" }}>Global Highlights Hub</Title></Col>
</Row>
</Header>
<Content
style={{
padding: 24,
margin: 0,
minHeight: 280,
background: colorBgContainer,
}}>
<Outlet />
</Content>
<Footer></Footer>
</Layout>
</AntApp>
</ConfigProvider>
);
}
export default observer(Standlone);

@ -37,6 +37,8 @@ const feedbackListColumns = [
];
function Index() {
const { feedbackStore, authStore } = useStore();
const { feedbackList } = feedbackStore;
const [selectedDateRange, onDateRangeChange] = useState([config.DATE_PRESETS[0].value]);

@ -0,0 +1,23 @@
import { useParams, useNavigate } from "react-router-dom";
import { useEffect, useState } from "react";
import { observer } from "mobx-react";
function Detail() {
const navigate = useNavigate();
const {GMDSN,GSN} = useParams();
useEffect(() => {
setDataLoading(true);
},[GMDSN,GSN]);
}
export default observer(Detail);

@ -0,0 +1,20 @@
import { NavLink } from "react-router-dom";
import { useEffect, useState } from "react";
import { observer } from "mobx-react";
import { toJS } from "mobx";
import { Row, Col, Space, Button, Table, Input, DatePicker } from "antd";
import { useStore } from "@/stores/StoreContext.js";
import * as config from "@/config";
function Index() {
return (
<Space><h1>"账单列表!"</h1></Space>
)
}
export default observer(Index);

@ -13,7 +13,7 @@ function Newest() {
title: 'Reference number',
dataIndex: 'referenceNumber',
key: 'Reference number',
render: (text, record) => <NavLink to={`/reservation/${record.referenceId}`}>{text}</NavLink>,
render: (text, record) => <NavLink to={`/reservation/${record.reservationId}`}>{text}</NavLink>,
},
{
title: 'Arrival date',
@ -71,11 +71,12 @@ function Newest() {
allowClear
placeholder="Select a guide"
optionFilterProp="children"
onChange={(value) => {
onChange={(guideId) => {
console.log(`selected:`);
console.log(value);
console.log(guideId);
console.log(`city:`);
console.log(city);
reservationStore.setupCityGuide(city.cityId, guideId);
}}
onSearch={(value) => {
console.log('search:', value);
@ -105,8 +106,9 @@ function Newest() {
const showCityGuideModal = (reservation) => {
setDataLoading(true);
setIsModalOpen(true);
reservationStore.editReservation(reservation);
reservationStore.fetchGuideList();
reservationStore.fetchCityList(reservation.referenceId)
reservationStore.fetchCityList(reservation.reservationId)
.catch(ex => {
notification.error({
message: `Notification`,

Loading…
Cancel
Save