机票信息编辑

perf/export-docx
YCC 1 year ago
parent 517d54614c
commit 655114ab44

@ -68,7 +68,7 @@ const initRouter = async () => {
{ path: 'invoice/paid',element:<RequireAuth subject={PERM_OVERSEA} result={true}><InvoicePaid /></RequireAuth>},
{ path: 'invoice/paid/detail/:flid', element: <RequireAuth subject={PERM_OVERSEA} result={true}><InvoicePaidDetail /></RequireAuth>},
{ path: 'airticket',element: <RequireAuth subject={PERM_AIR_TICKET} result={true}><Airticket /></RequireAuth>},
{ path: 'airticket/plan/:coli_sn',element:<RequireAuth subject={PERM_AIR_TICKET} result={true}><AirticketPlan /></RequireAuth>},
{ path: 'airticket/plan/:coli_sn/:gri_sn',element:<RequireAuth subject={PERM_AIR_TICKET} result={true}><AirticketPlan /></RequireAuth>},
{ path: "products",element: <RequireAuth subject={PERM_PRODUCTS_MANAGEMENT} result={true}><ProductsManage /></RequireAuth>},
{ path: "products/:travel_agency_id/:use_year/:audit_state/audit",element:<RequireAuth subject={PERM_PRODUCTS_MANAGEMENT} result={true}><ProductsAudit /></RequireAuth>},
{ path: "products/:travel_agency_id/:use_year/:audit_state/edit",element:<RequireAuth subject={PERM_PRODUCTS_OFFER_PUT} result={true}><ProductsDetail /></RequireAuth>},

@ -1,5 +1,5 @@
import { create } from "zustand";
import { fetchJSON } from "@/utils/request";
import { fetchJSON, postForm } from "@/utils/request";
import { prepareUrl, isNotEmpty } from "@/utils/commons";
import { HT_HOST, DATE_FORMAT } from "@/config";
import dayjs from "dayjs";
@ -15,7 +15,7 @@ const airTicketStore = create((set, get) => ({
const { setLoading, setPlanList } = get();
setLoading(true);
const searchParams = {
vei_sn: 4272, //vei_sn,
vei_sn: vei_sn,
FlightDate1: TimeStart,
FlightDate2: TimeEnd,
GRI_Name: GRI_Name,
@ -30,23 +30,53 @@ const airTicketStore = create((set, get) => ({
async getPlanDetail(vei_sn, gri_sn) {
const { setPlanDetail } = get();
const searchParams = {
vei_sn: 4272, //vei_sn,
gri_sn: 372928, //gri_sn
vei_sn: vei_sn,
gri_sn: gri_sn,
};
const { errcode, result } = await fetchJSON(`${HT_HOST}/Service_BaseInfoWeb/GetFlightPlanDetail`, searchParams);
const _result = errcode !== 0 ? [] : result;
setPlanDetail(_result);
},
async postFlightDetail(CLF_SN, GRI_SN, VEI_SN, original_values, info_object) {
const formData = new FormData();
formData.append("CLF_SN", CLF_SN ? CLF_SN : "");
formData.append("GRI_SN", GRI_SN);
formData.append("VEI_SN", VEI_SN);
for (const [key, value] of Object.entries(original_values)) {
formData.append(key, value); //先用原始数据填充一遍,确保复制了全部数据到新表
}
for (const [key, value] of Object.entries(info_object)) {
formData.set(key, value); //再用新值覆盖
}
const postUrl = HT_HOST + "/Service_BaseInfoWeb/edit_or_new_flight_info";
return postForm(postUrl, formData).then(json => {
if (json.errcode == 0) {
return json;
} else {
throw new Error(json.errmsg + ": " + json.errcode);
}
});
},
async getGuestList(coli_sn) {
const { setGuestList } = get();
const searchParams = {
COLI_SN: 1097829, //coli_sn,
COLI_SN: coli_sn,
};
const { errcode, result } = await fetchJSON(`${HT_HOST}/Service_BaseInfoWeb/GetFlightGuestInfo`, searchParams);
const _result = errcode !== 0 ? [] : result;
setGuestList(_result);
},
// async getFlightCostList(CLF_SN) {
// const searchParams = {
// CLF_SN: CLF_SN,
// };
// const { errcode, result } = await fetchJSON(`${HT_HOST}/Service_BaseInfoWeb/Get_flight_cost`, searchParams);
// const _result = errcode !== 0 ? [] : result;
// console.log(_result);
// return _result;
// },
}));
export default airTicketStore;

@ -43,7 +43,7 @@ async function fetchLastRequet() {
const initialState = {
tokenInterval: null,
tokenTimeout: true,
tokenTimeout: false,// 开发时候用false正式环境true,
loginStatus: 0,
defaltRoute: '',
currentUser: {

@ -46,33 +46,33 @@ const planListColumns = [
dataIndex: "ToCity",
},
{
title: "航",
title: "航",
key: "FlightNo",
dataIndex: "FlightNo",
},
{
title: "起飞时间",
key: "FlightTimeStart",
dataIndex: "FlightTimeStart",
key: "FlightStart",
dataIndex: "FlightStart",
render: text => formatColonTime(text),
},
{
title: "落地时间",
key: "FlightTimeEnd",
dataIndex: "FlightTimeEnd",
key: "FlightEnd",
dataIndex: "FlightEnd",
render: text => formatColonTime(text),
},
{
title: "是否出票",
key: "COLD_PlanVEI_SN",
dataIndex: "COLD_PlanVEI_SN",
key: "CLF_SN",
dataIndex: "CLF_SN",
render: (text, record) => "否",
},
{
title: "操作",
key: "FlightInfo",
dataIndex: "FlightInfo",
render: (text, record) => <NavLink to={`/airticket/plan/${record.COLI_SN}`}>{"编辑"}</NavLink>,
render: (text, record) => <NavLink to={`/airticket/plan/${record.COLI_SN}/${record.GRI_SN}`}>{"编辑"}</NavLink>,
},
];

@ -1,6 +1,6 @@
import { useState, useEffect } from "react";
import { Grid, Divider, Layout, Modal, Form, Input, Col, Row, Space, Collapse, Table, Button, Select, InputNumber, Typography } from "antd";
import { PhoneOutlined, CustomerServiceOutlined, AudioOutlined, ArrowUpOutlined, ArrowDownOutlined } from "@ant-design/icons";
import { Grid, Divider, Layout, Modal, Form, Input, Col, Row, Space, Collapse, Table, Button, Select, App, Typography } from "antd";
import { PhoneOutlined, FrownTwoTone, LikeTwoTone, ArrowUpOutlined, ArrowDownOutlined } from "@ant-design/icons";
import { useParams, useHref, useNavigate, NavLink } from "react-router-dom";
import { isEmpty, formatColonTime } from "@/utils/commons";
import { OFFICEWEBVIEWERURL } from "@/config";
@ -9,13 +9,22 @@ import airTicketStore from "@/stores/Airticket";
import { usingStorage } from "@/hooks/usingStorage";
const AirticketPlan = props => {
const { coli_sn } = useParams();
const { coli_sn, gri_sn } = useParams();
const { travelAgencyId, loginToken } = usingStorage();
const [getPlanDetail, planDetail, getGuestList, guestList, loading] = airTicketStore(state => [state.getPlanDetail, state.planDetail, state.getGuestList, state.guestList, state.loading]);
const [getPlanDetail, planDetail, getGuestList, guestList, loading, postFlightDetail, getFlightCostList] = airTicketStore(state => [
state.getPlanDetail,
state.planDetail,
state.getGuestList,
state.guestList,
state.loading,
state.postFlightDetail,
state.getFlightCostList,
]);
const reservationUrl = `https://p9axztuwd7x8a7.mycht.cn/Service_BaseInfoWeb/FlightPlanDocx?GRI_SN=${coli_sn}&VEI_SN=${travelAgencyId}`;
const reservationPreviewUrl = OFFICEWEBVIEWERURL + encodeURIComponent(reservationUrl);
// console.log(reservationPreviewUrl);
const [form] = Form.useForm();
const { notification } = App.useApp();
//console.log(reservationPreviewUrl);
//
const guestListColumns = [
@ -98,79 +107,185 @@ const AirticketPlan = props => {
},
];
//
const costListColumns = [
{
title: "费用类型",
key: "CostType",
dataIndex: "CostType",
},
{
title: "金额",
key: "Cost",
dataIndex: "Cost",
},
{
title: "PNR",
key: "PNR",
dataIndex: "PNR",
},
{
title: "FlightCost",
key: "FlightCost",
dataIndex: "FlightCost",
},
{
title: "Discount",
key: "Discount",
dataIndex: "Discount",
},
{
title: "ServiceFee",
key: "ServiceFee",
dataIndex: "ServiceFee",
},
{
title: "DateTime",
key: "DateTime",
dataIndex: "DateTime",
},
{
title: "FlightType",
key: "FlightType",
dataIndex: "FlightType",
},
{
title: "Memo",
key: "Memo",
dataIndex: "Memo",
},
{
title: "编辑",
key: "CLF_SN",
dataIndex: "CLF_SN", //GRI_SN VEI_SN
},
];
const Airticket_form = props => {
const aitInfo = props.airInfo;
const airInfo = props.airInfo;
return (
<>
<Form
component={false}
name={"ticket_form_" + aitInfo.id}
labelCol={{
span: 8,
}}
wrapperCol={{
span: 16,
}}
style={{
maxWidth: 600,
}}
initialValues={{
remember: true,
}}
// onFinish={onFinish}
// onFinishFailed={onFinishFailed}
autoComplete="off">
<Form.Item label="城市" name="password" rules={[{ required: true }]}>
<Space.Compact>
<Input placeholder="出发" prefix={<ArrowUpOutlined />} value={aitInfo.FromCity} />
<Input placeholder="抵达" prefix={<ArrowDownOutlined />} value={aitInfo.ToCity} />
</Space.Compact>
</Form.Item>
<Form.Item label="日期和航班" name="username" rules={[{ required: true }]}>
<Space.Compact>
<Input value={aitInfo.StartDate} />
<Input placeholder="航空公司" />
<Input placeholder="航班号" value={aitInfo.FlightNo} />
</Space.Compact>
</Form.Item>
<Form.Item label="出发" name="password" rules={[{ required: true }]}>
<Space.Compact>
<Input placeholder="机场" />
<Input placeholder="航站楼" />
<Input placeholder="出发时间" value={formatColonTime(aitInfo.FlightTimeStart)} />
</Space.Compact>
</Form.Item>
<Form.Item label="抵达" name="password" rules={[{ required: true }]}>
<Space.Compact>
<Input placeholder="机场" />
<Input placeholder="航站楼" />
<Input placeholder="抵达时间" value={formatColonTime(aitInfo.FlightTimeEnd)} />
</Space.Compact>
</Form.Item>
<Form.Item label="仓位和行李" name="password">
<Space.Compact>
<Input placeholder="仓位" />
<Input placeholder="行李" />
</Space.Compact>
</Form.Item>
<Form.Item
wrapperCol={{
offset: 14,
span: 16,
}}>
<Space>
<Button type="primary" htmlType="submit">
保存机票信息
</Button>
<Button type="dashed" htmlType="submit">
添加出票信息和费用
</Button>
</Space>
</Form.Item>
<Row>
<Col md={4} lg={4} xxl={4}></Col>
<Col md={16} lg={16} xxl={16}>
<Form
name={"ticket_form_" + airInfo.id}
labelCol={{
span: 6,
}}
wrapperCol={{
span: 16,
}}
initialValues={airInfo}
onFinish={values => {
postFlightDetail(airInfo.CLF_SN, airInfo.GRI_SN, airInfo.VEI_SN, airInfo, values)
.then(() => {
notification.success({
message: `成功`,
description: "机票信息保存成功!",
placement: "top",
duration: 4,
icon: <LikeTwoTone />,
});
})
.catch(() => {
notification.error({
message: `错误`,
description: "保存失败",
placement: "top",
duration: 4,
icon: <FrownTwoTone />,
});
});
}}
autoComplete="off">
<Form.Item label="城市">
<Space>
<Form.Item name="FromCity" noStyle>
<Input placeholder="出发" prefix={<ArrowUpOutlined />} />
</Form.Item>
<Form.Item name="ToCity" noStyle>
<Input placeholder="抵达" prefix={<ArrowDownOutlined />} />
</Form.Item>
</Space>
</Form.Item>
<Form.Item label="出发日期、航司、航班">
<Space>
<Form.Item name="StartDate" noStyle>
<Input placeholder="出发日期" />
</Form.Item>
<Form.Item name="FlightCompany" noStyle>
<Input placeholder="航空公司" />
</Form.Item>
<Form.Item name="FlightNo" noStyle>
<Input placeholder="航班号" />
</Form.Item>
</Space>
</Form.Item>
<Form.Item label="出发">
<Space>
<Form.Item name="FromAirport" noStyle>
<Input placeholder="机场" />
</Form.Item>
<Form.Item name="FromTerminal" noStyle>
<Input placeholder="航站楼" />
</Form.Item>
<Form.Item name="FlightStart" noStyle>
<Input placeholder="出发时间" />
</Form.Item>
</Space>
</Form.Item>
<Form.Item label="抵达">
<Space>
<Form.Item name="ToAirport" noStyle>
<Input placeholder="机场" />
</Form.Item>
<Form.Item name="ToTerminal" noStyle>
<Input placeholder="航站楼" />
</Form.Item>
<Form.Item name="FlightEnd" noStyle>
<Input placeholder="抵达时间" />
</Form.Item>
</Space>
</Form.Item>
<Form.Item label="仓位和行李">
<Space>
<Form.Item name="FlightCabin" noStyle>
<Input placeholder="仓位" />
</Form.Item>
<Form.Item name="Baggage" noStyle>
<Input placeholder="行李说明" />
</Form.Item>
</Space>
</Form.Item>
<Form.Item label="备注" name="FlightMemo">
<Input.TextArea rows={5} />
</Form.Item>
<Divider orientation="left">费用列表</Divider>
<Table bordered={true} rowKey="id" columns={guestListColumns} dataSource={guestList} loading={loading} pagination={false} />
</Form>
<Form.Item
wrapperCol={{
offset: 14,
span: 16,
}}>
<Space>
<Button type="primary" htmlType="submit">
保存机票信息
</Button>
<Button type="dashed">添加出票信息和费用</Button>
</Space>
</Form.Item>
</Form>
</Col>
<Col md={4} lg={4} xxl={4}></Col>
</Row>
<Row>
<Col md={24} lg={24} xxl={24}>
<Divider orientation="left">费用列表</Divider>
<Table bordered={true} rowKey="CLC_SN" columns={costListColumns} dataSource={airInfo.Flightcost_AsJOSN} loading={loading} pagination={false} />
</Col>
</Row>
</>
);
};
@ -180,7 +295,7 @@ const AirticketPlan = props => {
? planDetail.map(item => {
return {
key: item.id,
label: `${item.StartDate} 计划: ${item.FlightInfo}`,
label: `${item.StartDate}`,
children: <Airticket_form airInfo={item} />,
};
})
@ -222,7 +337,7 @@ const AirticketPlan = props => {
const TicketModal = () => {
return (
<>
<Modal title="Basic Modal" open={isModalOpen} onOk={handleOk} onCancel={handleCancel}>
<Modal title="费用信息" open={isModalOpen} onOk={handleOk} onCancel={handleCancel}>
<Form
form={ticket_form}
labelCol={{
@ -329,9 +444,8 @@ const AirticketPlan = props => {
// end
useEffect(() => {
getPlanDetail(travelAgencyId, coli_sn);
getPlanDetail(travelAgencyId, gri_sn);
getGuestList(travelAgencyId, coli_sn);
console.log(detail_items());
}, []);
return (

Loading…
Cancel
Save