Compare commits

...

10 Commits

@ -1,7 +1,7 @@
{ {
"name": "global-highlights-hub", "name": "global-highlights-hub",
"private": true, "private": true,
"version": "2.0.20", "version": "2.1.0",
"type": "module", "type": "module",
"scripts": { "scripts": {
"dev": "vite", "dev": "vite",

@ -62,7 +62,7 @@ const SearchForm = ({ initialValue, onSubmit, onReset, onMounted, confirmText, f
dept: { dept: {
key: "dept", key: "dept",
transform: value => { transform: value => {
console.log(value); //console.log(value);
return Array.isArray(value) ? value.map(ele => ele.key).join(",") : value ? value.value : ""; return Array.isArray(value) ? value.map(ele => ele.key).join(",") : value ? value.value : "";
}, },
}, },

@ -10,8 +10,8 @@ const HeaderWrapper = ({ children, header, loading, backTo, ...props }) => {
} = theme.useToken(); } = theme.useToken();
return ( return (
<> <>
<Spin spinning={loading || false}> <Spin spinning={loading || false} wrapperClassName='h-full [&_.ant-spin-container]:h-full' >
<Layout className=' bg-white'> <Layout className=' bg-white h-full'>
<Header className='header px-6 h-10 ' style={{ background: 'white' }}> <Header className='header px-6 h-10 ' style={{ background: 'white' }}>
<Flex justify={'space-between'} align={'center'} className='h-full'> <Flex justify={'space-between'} align={'center'} className='h-full'>
{/* {header} */} {/* {header} */}
@ -20,7 +20,7 @@ const HeaderWrapper = ({ children, header, loading, backTo, ...props }) => {
</Flex> </Flex>
</Header> </Header>
<Divider className='my-2' /> <Divider className='my-2' />
<Content className='' style={{ backgroundColor: colorBgContainer }}> <Content className='overflow-auto' style={{ backgroundColor: colorBgContainer }}>
{children || <Outlet />} {children || <Outlet />}
</Content> </Content>
</Layout> </Layout>

@ -98,7 +98,7 @@ function App() {
</FloatButton.Group> </FloatButton.Group>
{contextHolder} {contextHolder}
<ErrorBoundary> <ErrorBoundary>
<Layout className='min-h-screen'> <Layout className='min-h-screen h-dvh'>
<Header className='sticky top-0 z-10 w-full'> <Header className='sticky top-0 z-10 w-full'>
<Row gutter={{ md: 24 }} justify='end' align='middle'> <Row gutter={{ md: 24 }} justify='end' align='middle'>
<Col span={15}> <Col span={15}>
@ -159,7 +159,7 @@ function App() {
</Col> </Col>
</Row> </Row>
</Header> </Header>
<Content className='p-6 m-0 min-h-72 bg-white'> <Content className='p-6 m-0 min-h-72 bg-white overflow-auto'>
{needToLogin ? <>login...</> : <Outlet />} {needToLogin ? <>login...</> : <Outlet />}
</Content> </Content>
<Footer>China Highlights International Travel Service Co., LTD, Version: {BUILD_VERSION}</Footer> <Footer>China Highlights International Travel Service Co., LTD, Version: {BUILD_VERSION}</Footer>

@ -145,13 +145,13 @@ const AirticketPlan = props => {
}, },
]; ];
const Airticket_form = props => { const Airticket_form = airInfo => {
const airInfo = props.airInfo; // const airInfo = props.airInfo;
const [airinfo_form] = Form.useForm(); // const [airinfo_form] = Form.useForm();
return ( return (
<> <>
<Form <Form
form={airinfo_form} // form={airinfo_form}
name={"ticket_form_" + airInfo.id} name={"ticket_form_" + airInfo.id}
labelCol={{ labelCol={{
span: 6, span: 6,
@ -277,6 +277,39 @@ const AirticketPlan = props => {
</Space> </Space>
</Col> </Col>
</Row> </Row>
</Form>
<Form
labelCol={{
span: 6,
}}
wrapperCol={{
span: 16,
}}
initialValues={{ ...airInfo }}
onFinish={values => {
ticketIssuedNotifications(userId, airInfo.CLF_SN, airInfo.OPI_SN, values.FlightMemo_messages)
.then(() => {
notification.success({
message: `成功`,
description: "提醒信息已发出!",
placement: "top",
duration: 4,
icon: <LikeTwoTone />,
});
//airinfo_form.setFieldValue('FlightMemo_messages','')
})
.catch(() => {
notification.error({
message: `错误`,
description: "提醒失败",
placement: "top",
duration: 4,
icon: <FrownTwoTone />,
});
});
}}
autoComplete="off">
<Divider orientation="left"></Divider> <Divider orientation="left"></Divider>
<Row gutter={16}> <Row gutter={16}>
<Col md={24} lg={20} xxl={20}> <Col md={24} lg={20} xxl={20}>
@ -284,34 +317,11 @@ const AirticketPlan = props => {
<Input placeholder="没有提醒请留空,信息会抄送给上下站地接" /> <Input placeholder="没有提醒请留空,信息会抄送给上下站地接" />
</Form.Item> </Form.Item>
<Form.Item label="已发提醒" name="FlightMemo"> <Form.Item label="已发提醒" name="FlightMemo">
<Input.TextArea rows={4} readOnly disabled /> <Input.TextArea rows={4} readOnly disabled />
</Form.Item> </Form.Item>
</Col> </Col>
<Col md={24} lg={4} xxl={4}> <Col md={24} lg={4} xxl={4}>
<Button <Button type="primary" htmlType="submit">
type="primary"
onClick={() => {
ticketIssuedNotifications(userId,airInfo.CLF_SN, airInfo.OPI_SN,airinfo_form.getFieldValue('FlightMemo_messages'))
.then(() => {
notification.success({
message: `成功`,
description: "提醒信息已发出!",
placement: "top",
duration: 4,
icon: <LikeTwoTone />,
});
airinfo_form.setFieldValue('FlightMemo_messages','')
})
.catch(() => {
notification.error({
message: `错误`,
description: "提醒失败",
placement: "top",
duration: 4,
icon: <FrownTwoTone />,
});
});
}}>
3. 通知顾问 3. 通知顾问
</Button> </Button>
</Col> </Col>
@ -342,7 +352,7 @@ const AirticketPlan = props => {
</Button> </Button>
</Popconfirm> </Popconfirm>
), ),
children: <Airticket_form airInfo={item} />, children: Airticket_form(item),
}; };
}) })
: []; : [];
@ -518,8 +528,8 @@ const AirticketPlan = props => {
<Popconfirm <Popconfirm
title="请确认要增加航班记录" title="请确认要增加航班记录"
description="" description=""
onConfirm={() => { onConfirm={async () => {
postFlightDetail("", gri_sn, travelAgencyId, { FlightNo: "新的记录", FlightStatus: 1 }, []); // await postFlightDetail("", gri_sn, travelAgencyId, { FlightNo: "新的记录", FlightStatus: 1 }, []); //
getPlanDetail(travelAgencyId, gri_sn); // getPlanDetail(travelAgencyId, gri_sn); //
}} }}
okText="是" okText="是"

@ -136,7 +136,7 @@ function Detail() {
}; };
const handleChange = info => { const handleChange = info => {
console.log(info); //console.log(info);
let newFileList = [...info.fileList]; let newFileList = [...info.fileList];
newFileList = newFileList.map(file => { newFileList = newFileList.map(file => {
if (file.response && file.response.result) { if (file.response && file.response.result) {
@ -148,7 +148,7 @@ function Detail() {
}; };
const handRemove = info => { const handRemove = info => {
console.log(info); //console.log(info);
removeFeedbackImages(info.url); removeFeedbackImages(info.url);
return true; return true;
}; };

@ -21,11 +21,15 @@ function Detail() {
const { travelAgencyId } = usingStorage(); const { travelAgencyId } = usingStorage();
const handleGetAgencyProducts = async ({ pick_year, pick_agency, pick_state } = {}) => { const handleGetAgencyProducts = async ({ pick_year, pick_agency, pick_state } = {}) => {
const year = pick_year || use_year || switchParams.use_year || dayjs().year(); const year = pick_year || use_year || switchParams.use_year ; //|| dayjs().year();
const agency = pick_agency || travel_agency_id || travelAgencyId; const agency = pick_agency || travel_agency_id || travelAgencyId;
const state = pick_state ?? audit_state; const state = pick_state ?? audit_state;
const param = { travel_agency_id: agency, use_year: year, audit_state: state }; const param = { travel_agency_id: agency, use_year: year, audit_state: state };
// console.log('', param)
// setEditingProduct({}); // setEditingProduct({});
if (isEmpty(param.travel_agency_id) || isEmpty(param.use_year)) {
return false;
}
getAgencyProducts(param).catch((ex) => { getAgencyProducts(param).catch((ex) => {
setLoading(false); setLoading(false);
notification.error({ notification.error({
@ -43,11 +47,11 @@ function Detail() {
backTo={false} backTo={false}
header={<Header title={activeAgency.travel_agency_name} refresh={handleGetAgencyProducts} handleNewProduct={() => setAddProductVisible(true)} />}> header={<Header title={activeAgency.travel_agency_name} refresh={handleGetAgencyProducts} handleNewProduct={() => setAddProductVisible(true)} />}>
<> <>
<Flex gap={10}> <Flex gap={10} className='h-full'>
{/* onNodeSelect={handleNodeSelect} */} {/* onNodeSelect={handleNodeSelect} */}
<ProductsTree className='basis-80 sticky top-16 overflow-y-auto shrink-0' style={{ height: 'calc(100vh - 150px)' }} /> <ProductsTree className='basis-80 sticky top-0 overflow-y-auto shrink-0' style1={{ height: 'calc(100vh - 150px)' }} />
<Divider type={'vertical'} className='mx-1 h-auto' /> <Divider type={'vertical'} className='mx-1 h-auto' />
<div className=' flex-auto '> <div className=' flex-auto overflow-auto '>
<ProductInfo /> <ProductInfo />
</div> </div>
</Flex> </Flex>

@ -1,6 +1,6 @@
import { useEffect, useState } from "react"; import { useEffect, useState } from "react";
import { useParams, Link, useNavigate, useLocation } from "react-router-dom"; import { useParams, Link, useNavigate, useLocation } from "react-router-dom";
import { App, Button, Divider, Popconfirm, Select } from "antd"; import { App, Button, Divider, Popconfirm, Select, Typography } from "antd";
import { ReloadOutlined } from "@ant-design/icons"; import { ReloadOutlined } from "@ant-design/icons";
import { useProductsAuditStatesMapVal } from "@/hooks/useProductsSets"; import { useProductsAuditStatesMapVal } from "@/hooks/useProductsSets";
import { useTranslation } from "react-i18next"; import { useTranslation } from "react-i18next";
@ -30,6 +30,7 @@ const Header = ({ refresh, ...props }) => {
const showEditA = !location.pathname.includes("edit"); const showEditA = !location.pathname.includes("edit");
const showAuditA = !location.pathname.includes("audit"); const showAuditA = !location.pathname.includes("audit");
const { travel_agency_id, use_year, audit_state } = useParams(); const { travel_agency_id, use_year, audit_state } = useParams();
// console.log('📕', travel_agency_id, use_year, audit_state )
const { travelAgencyId } = usingStorage(); const { travelAgencyId } = usingStorage();
const { t } = useTranslation(); const { t } = useTranslation();
const isPermitted = useAuthStore((state) => state.isPermitted); const isPermitted = useAuthStore((state) => state.isPermitted);
@ -48,11 +49,12 @@ const Header = ({ refresh, ...props }) => {
const navigate = useNavigate(); const navigate = useNavigate();
const yearOptions = []; const yearOptions = [];
const currentYear = switchParams.use_year || dayjs().year(); const currentYear = dayjs().year();
const baseYear = use_year const baseYear = use_year
? Number(use_year === "all" ? currentYear : use_year) ? Number(use_year === "all" ? switchParams.use_year : use_year)
: currentYear; : switchParams.use_year;
for (let i = currentYear - 5; i <= baseYear + 5; i++) { // console.log('🔰', baseYear, )
for (let i = currentYear - 5; i <= (currentYear + 2); i++) {
yearOptions.push({ label: i, value: i }); yearOptions.push({ label: i, value: i });
} }
@ -190,8 +192,8 @@ const Header = ({ refresh, ...props }) => {
return ( return (
<div className="flex justify-end items-center gap-4 h-full"> <div className="flex justify-end items-center gap-4 h-full">
<div className="grow"> {/* <div className="grow"> */}
<h2 className="m-0 leading-tight"> <h2 className="m-0 leading-tight me-auto flex items-center">
{isPermitted(PERM_PRODUCTS_OFFER_AUDIT) ? ( {isPermitted(PERM_PRODUCTS_OFFER_AUDIT) ? (
<VendorSelector <VendorSelector
value={{ value={{
@ -212,10 +214,11 @@ const Header = ({ refresh, ...props }) => {
<Select <Select
options={yearOptions} options={yearOptions}
variant={"borderless"} variant={"borderless"}
className="w-24" className={"w-24"}
size="large" size="large"
value={pickYear} value={pickYear}
onChange={handleYearChange} onChange={handleYearChange}
placeholder="年份"
/> />
<Divider type={"vertical"} /> <Divider type={"vertical"} />
<AuditStateSelector <AuditStateSelector
@ -233,8 +236,9 @@ const Header = ({ refresh, ...props }) => {
className="text-primary round-none" className="text-primary round-none"
icon={<ReloadOutlined />} icon={<ReloadOutlined />}
/> />
{isEmpty(pickYear) && <Typography.Text type="danger" className="font-normal text-sm ms-1">请选择年份</Typography.Text>}
</h2> </h2>
</div> {/* </div> */}
{/* todo: export, 审核完成之后才能导出 */} {/* todo: export, 审核完成之后才能导出 */}
<RequireAuth subject={PERM_PRODUCTS_OFFER_AUDIT}> <RequireAuth subject={PERM_PRODUCTS_OFFER_AUDIT}>
<Button size="small" onClick={handleDownload}> <Button size="small" onClick={handleDownload}>

@ -400,7 +400,7 @@ const formValuesMapper = (values) => {
key: 'lgc_details', key: 'lgc_details',
transform: (value) => { transform: (value) => {
const valueArr = Object.values(value) const valueArr = Object.values(value)
.filter((_v) => !isEmpty(_v)) .filter((_v) => !isEmpty(_v.lgc))
.map((e) => ({ title: '', ...e, descriptions: e.descriptions || '' })); .map((e) => ({ title: '', ...e, descriptions: e.descriptions || '' }));
return valueArr; return valueArr;
}, },
@ -409,7 +409,7 @@ const formValuesMapper = (values) => {
key: 'lgc_details_mapped', key: 'lgc_details_mapped',
transform: (value) => { transform: (value) => {
const valueArr = Object.values(value) const valueArr = Object.values(value)
.filter((_v) => !isEmpty(_v)) .filter((_v) => !isEmpty(_v.lgc))
.map((e) => ({ title: '', ...e, descriptions: e.descriptions || '' })); .map((e) => ({ title: '', ...e, descriptions: e.descriptions || '' }));
return valueArr.reduce((r, c) => ({ ...r, [c.lgc]: c }), {}); return valueArr.reduce((r, c) => ({ ...r, [c.lgc]: c }), {});
}, },

@ -43,7 +43,7 @@ function Detail() {
]; ];
function detailTextRender(_, confirm) { function detailTextRender(_, confirm) {
const formattedText = confirm.PCI_ConfirmText;//.replace(/\;/g, '\n\n'); const formattedText = confirm.PCI_ConfirmText;
return ( return (
<div className='whitespace-pre-line'> <div className='whitespace-pre-line'>
{formattedText} {formattedText}
@ -76,6 +76,8 @@ function Detail() {
const [confirmText, setConfirmText] = useState(''); const [confirmText, setConfirmText] = useState('');
const [newConfirmText, setNewConfirmText] = useState(''); const [newConfirmText, setNewConfirmText] = useState('');
const [dataLoading, setDataLoading] = useState(false); const [dataLoading, setDataLoading] = useState(false);
const [reservationPreviewUrl, setReservationPreviewUrl] = useState('');
const [nameCardPreviewUrl, setNameCardPreviewUrl] = useState('');
const { notification } = App.useApp(); const { notification } = App.useApp();
const { reservationId } = useParams(); const { reservationId } = useParams();
@ -93,9 +95,6 @@ function Detail() {
const nameCardUrl = const nameCardUrl =
`https://p9axztuwd7x8a7.mycht.cn/service-fileServer/DownloadPlanDoc?GRI_SN=${reservationId}&VEI_SN=${travelAgencyId}&token=${loginToken}&FileType=2&v=${randomString}` `https://p9axztuwd7x8a7.mycht.cn/service-fileServer/DownloadPlanDoc?GRI_SN=${reservationId}&VEI_SN=${travelAgencyId}&token=${loginToken}&FileType=2&v=${randomString}`
const reservationPreviewUrl = officeWebViewerUrl + encodeURIComponent(reservationUrl);
const nameCardPreviewUrl = officeWebViewerUrl + encodeURIComponent(nameCardUrl);
const showConfirmModal = (confirm) => { const showConfirmModal = (confirm) => {
setIsModalOpen(true); setIsModalOpen(true);
const formattedText = confirm.PCI_ConfirmText;//.replace(/\;/g, '\n\n'); const formattedText = confirm.PCI_ConfirmText;//.replace(/\;/g, '\n\n');
@ -118,6 +117,10 @@ function Detail() {
useEffect(() => { useEffect(() => {
setDataLoading(true); setDataLoading(true);
setReservationPreviewUrl(officeWebViewerUrl + encodeURIComponent(reservationUrl))
setNameCardPreviewUrl(officeWebViewerUrl + encodeURIComponent(nameCardUrl))
getReservationDetail(reservationId) getReservationDetail(reservationId)
.catch(ex => { .catch(ex => {
notification.error({ notification.error({

@ -129,7 +129,7 @@ const Trainticket = props => {
<Row gutter={16}> <Row gutter={16}>
<Col md={24} lg={24} xxl={24}> <Col md={24} lg={24} xxl={24}>
<Table bordered={true} rowKey="id" columns={planListColumns} dataSource={planList} loading={loading} pagination={{ defaultPageSize: 20, showTotal: showTotal }} /> <Table bordered={true} rowKey={record => `${record.id}-${record.GRI_SN}`} columns={planListColumns} dataSource={planList} loading={loading} pagination={{ defaultPageSize: 20, showTotal: showTotal }} />
<TableExportBtn btnTxt="导出计划" label={`出票计划`} {...{ columns: planListColumns, dataSource: planList }} /> <TableExportBtn btnTxt="导出计划" label={`出票计划`} {...{ columns: planListColumns, dataSource: planList }} />
</Col> </Col>
<Col md={24} lg={24} xxl={24}></Col> <Col md={24} lg={24} xxl={24}></Col>

@ -206,7 +206,7 @@ const Invoice = props => {
}} }}
onSubmit={(err, formVal, filedsVal) => { onSubmit={(err, formVal, filedsVal) => {
getVEIFlightBill(travelAgencyId, formVal.referenceNo, formVal.invoiceCheckStatus, formVal.startdate, formVal.endtime); getVEIFlightBill(travelAgencyId, formVal.referenceNo, formVal.invoiceCheckStatus, formVal.startdate, formVal.endtime);
console.log(vEIFlightBill); //console.log(vEIFlightBill);
}} }}
/> />

@ -46,7 +46,7 @@ const TrainticketPlan = props => {
]); ]);
const reservationUrl = `https://p9axztuwd7x8a7.mycht.cn/Service_BaseInfoWeb/FlightPlanDocx?GRI_SN=${gri_sn}&VEI_SN=${travelAgencyId}&token=${loginToken}`; const reservationUrl = `https://p9axztuwd7x8a7.mycht.cn/Service_BaseInfoWeb/FlightPlanDocx?GRI_SN=${gri_sn}&VEI_SN=${travelAgencyId}&token=${loginToken}`;
const reservationPreviewUrl = OFFICEWEBVIEWERURL + encodeURIComponent(reservationUrl); const reservationPreviewUrl = OFFICEWEBVIEWERURL + encodeURIComponent(reservationUrl);
const [form] = Form.useForm(); // const [form] = Form.useForm();
const { notification } = App.useApp(); const { notification } = App.useApp();
// //
@ -74,7 +74,7 @@ const TrainticketPlan = props => {
city, // city, //
] = record.split("|"); ] = record.split("|");
return { return {
value: name + "-" + pinyin, value: name + "(" + pinyin + ")",
label: name, label: name,
}; };
}); });
@ -155,13 +155,10 @@ const TrainticketPlan = props => {
}, },
]; ];
const Trainticket_form = props => { const Trainticket_form = trainInfo => {
const trainInfo = props.airInfo;
const [traininfo_form] = Form.useForm();
return ( return (
<> <>
<Form <Form
form={traininfo_form}
name={"ticket_form_" + trainInfo.id} name={"ticket_form_" + trainInfo.id}
labelCol={{ labelCol={{
span: 6, span: 6,
@ -273,7 +270,40 @@ const TrainticketPlan = props => {
</Space> </Space>
</Col> </Col>
</Row> </Row>
<Divider orientation="left"></Divider> </Form>
<Form
labelCol={{
span: 6,
}}
wrapperCol={{
span: 16,
}}
initialValues={{ ...trainInfo }}
onFinish={values => {
ticketIssuedNotifications(userId, trainInfo.CLF_SN, trainInfo.OPI_SN, values.FlightMemo_messages)
.then(() => {
notification.success({
message: `成功`,
description: "提醒信息已发出!",
placement: "top",
duration: 4,
icon: <LikeTwoTone />,
});
//todo: values.FlightMemo_messages = "";
})
.catch(() => {
notification.error({
message: `错误`,
description: "提醒失败",
placement: "top",
duration: 4,
icon: <FrownTwoTone />,
});
});
}}
autoComplete="off">
<Divider orientation="left">出票完成通知</Divider>
<Row gutter={16}> <Row gutter={16}>
<Col md={24} lg={20} xxl={20}> <Col md={24} lg={20} xxl={20}>
<Form.Item label="上下站提醒信息" name="FlightMemo_messages"> <Form.Item label="上下站提醒信息" name="FlightMemo_messages">
@ -284,30 +314,7 @@ const TrainticketPlan = props => {
</Form.Item> </Form.Item>
</Col> </Col>
<Col md={24} lg={4} xxl={4}> <Col md={24} lg={4} xxl={4}>
<Button <Button type="primary" htmlType="submit">
type="primary"
onClick={() => {
ticketIssuedNotifications(userId, trainInfo.CLF_SN, trainInfo.OPI_SN, traininfo_form.getFieldValue("FlightMemo_messages"))
.then(() => {
notification.success({
message: `成功`,
description: "提醒信息已发出!",
placement: "top",
duration: 4,
icon: <LikeTwoTone />,
});
traininfo_form.setFieldValue("FlightMemo_messages", "");
})
.catch(() => {
notification.error({
message: `错误`,
description: "提醒失败",
placement: "top",
duration: 4,
icon: <FrownTwoTone />,
});
});
}}>
3. 通知顾问 3. 通知顾问
</Button> </Button>
</Col> </Col>
@ -338,7 +345,7 @@ const TrainticketPlan = props => {
</Button> </Button>
</Popconfirm> </Popconfirm>
), ),
children: <Trainticket_form airInfo={item} />, children: Trainticket_form(item),
}; };
}) })
: []; : [];
@ -449,7 +456,7 @@ const TrainticketPlan = props => {
confirmInfo_form confirmInfo_form
.validateFields() .validateFields()
.then(values => { .then(values => {
console.log("Received values of form: ", values.ConfirmInfo); //console.log("Received values of form: ", values.ConfirmInfo);
postVeiFlightPlanConfirm(travelAgencyId, gri_sn, userId, values.ConfirmInfo) postVeiFlightPlanConfirm(travelAgencyId, gri_sn, userId, values.ConfirmInfo)
.then(() => { .then(() => {
notification.success({ notification.success({
@ -516,8 +523,9 @@ const TrainticketPlan = props => {
<Popconfirm <Popconfirm
title="请确认要增加车票记录" title="请确认要增加车票记录"
description="" description=""
onConfirm={() => { onConfirm={async () => {
postFlightDetail("", gri_sn, travelAgencyId, { FlightNo: "新的记录", FlightStatus: 1, ServiceType: 2 }, []); // const startDate = planDetail && planDetail.length > 0 && planDetail[planDetail.length - 1].StartDate ? planDetail[planDetail.length - 1].StartDate : "";
await postFlightDetail("", gri_sn, travelAgencyId, { FlightNo: "新的记录", FlightStatus: 1, ServiceType: 2 }, { StartDate: startDate }); //
getPlanDetail(travelAgencyId, gri_sn); // getPlanDetail(travelAgencyId, gri_sn); //
}} }}
okText="是" okText="是"
@ -529,11 +537,12 @@ const TrainticketPlan = props => {
</p> </p>
</Col> </Col>
</Row> </Row>
<Row> <Row>
<Divider orientation="left">计划变更</Divider> <Divider orientation="left">计划变更</Divider>
<Col md={24} lg={12} xxl={12}> <Col md={24} lg={12} xxl={12}>
<Space direction="vertical" style={{ width: "90%" }}> <Space direction="vertical" style={{ width: "90%" }}>
<Input.TextArea rows={16} readOnly value={veiPlanChangeTxt && veiPlanChangeTxt.ChangeText} /> <Input.TextArea rows={16} value={veiPlanChangeTxt && veiPlanChangeTxt.ChangeText} />
<Button <Button
type="primary" type="primary"
onClick={() => { onClick={() => {
@ -560,7 +569,6 @@ const TrainticketPlan = props => {
</Form.Item> </Form.Item>
</Form> </Form>
</Modal> </Modal>
<Modal <Modal
title="费用信息" title="费用信息"
open={isModalOpen} open={isModalOpen}

Loading…
Cancel
Save