You cannot select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
dashboard/src/views/Home.jsx

223 lines
6.8 KiB
React

import { useContext, useEffect, useState } from 'react';
import { observer } from 'mobx-react';
import { Row, Col, Spin, Space } from 'antd';
import { stores_Context } from '../config';
import { useNavigate } from 'react-router-dom';
import StatisticCard from '../components/StatisticCard';
2 years ago
import Bullet from '../components/BulletWithSort';
import Waterfall from '../components/Waterfall';
import DataFieldRadio from './../components/DateFieldRadio';
import SearchForm from './../components/search/SearchForm';
import { empty, cloneDeep } from './../utils/commons';
2 years ago
import { dataFieldAlias } from './../libs/ht';
import { Line } from '@ant-design/charts';
import './home.css';
3 years ago
2 years ago
export default observer(() => {
const navigate = useNavigate();
const { TradeStore } = useContext(stores_Context);
const { searchPayloadHome, sideData, summaryData, BuData, topData, timeData } = TradeStore;
3 years ago
const topSeries = [
2 years ago
{ key: 'country', label: '国籍' },
{ key: 'dept', label: '小组' },
{ key: 'operator', label: '顾问' },
{ key: 'destination', label: '目的地' },
// { key: 'GuestGroupType', label: '客群类别' },
];
useEffect(() => {
2 years ago
if (empty(summaryData.dataSource)) {
// pageRefresh();
}
return () => {};
}, []);
3 years ago
const pageRefresh = (queryData) => {
2 years ago
TradeStore.fetchSummaryData(queryData);
TradeStore.fetchTradeDataByDate(queryData);
2 years ago
TradeStore.fetchTradeDataByBU(queryData);
TradeStore.fetchTradeDataByMonth(queryData);
for (const iterator of topSeries) {
TradeStore.fetchTradeDataByType(iterator.key, queryData);
}
};
2 years ago
const layoutProps = {
gutter: { xs: 8, sm: 8, lg: 16 },
lg: { span: 6 },
sm: { span: 12 },
xs: { span: 24 },
};
const layoutProps3 = {
gutter: { xs: 8, sm: 8, lg: 16 },
lg: { span: 8 },
sm: { span: 12 },
xs: { span: 24 },
};
const [valueKey, setValueKey] = useState('SumML');
const [BulletConfig, setBulletConfig] = useState({
measureField: 'SumML', //
rangeField: 'SumMLRange', //
2 years ago
targetField: 'MLKPIvalue', //
xField: 'groupsLabel',
});
const handleChangeValueKey = (key) => {
setValueKey(key);
setBulletConfig({
measureField: key,
rangeField: `${key}Range`,
2 years ago
// targetField: `${key}KPI`,
targetField: dataFieldAlias[key].nestkey.v,
2 years ago
xField: 'groupsLabel',
});
};
const WaterfallConfig = {
xField: 'groupDateVal',
yField: 'SumML',
2 years ago
seriesField: 'groupsLabel',
meta: {
groupDateVal: {
alias: '月份',
2 years ago
// type: 'cat',
},
},
label: {
2 years ago
formatter: (v) => summaryData.kpi.value === 0 ? (dataFieldAlias.SumML?.formatter(v.SumML) || v.SumML) : ((v.SumML / summaryData.kpi.value) * 100).toFixed(2) + '%',
},
};
2 years ago
const BUConfig = {
measureField: 'SumML', //
rangeField: 'SumMLRange', //
targetField: 'MLKPIvalue', //
xField: 'groupsLabel',
layout: 'vertical',
};
const lineConfigSet = {
// data: orders_data.data,
padding: 'auto',
xField: 'groupDateVal',
yField: 'SumML',
seriesField: 'groupsLabel',
xAxis: {
type: 'cat',
},
smooth: true,
point: {
size: 4,
shape: "cicle",
},
legend: false,
meta: { ...cloneDeep(dataFieldAlias)
// [extProps.yField]: {
// alias: dataFieldAlias[extProps.yField]?.alias || extProps.yField,
// formatter: (v) => dataFieldAlias[extProps.yField]?.formatter(v) || v,
// max: Math.ceil(yMax / 0.95),
// },
},
};
const [timeDataField, setTimeDataField] = useState('SumML');
const [lineConfig, setLineConfig] = useState(cloneDeep(lineConfigSet));
const handleChangetimeDataField = (key) => {
setTimeDataField(key);
setLineConfig({
...lineConfig,
yField: key,
tooltip: {
customItems: (originalItems) => {
// process originalItems,
const items = originalItems.map((ele) => ({ ...ele, name: dataFieldAlias[key]?.alias || key }));
return items;
},
},
});
};
return (
<>
<Row gutter={16} style={{ margin: '-16px -8px' }}>
2 years ago
{/* style={{ margin: '-16px -8px', padding: 0 }} */}
<Col className="gutter-row" span={24}>
<SearchForm
defaultValue={{
2 years ago
initialValue: {
...searchPayloadHome,
},
2 years ago
shows: ['DateType', 'DepartmentList', 'WebCode', 'IncludeTickets', 'years'],
fieldProps: {
DepartmentList: { show_all: true },
WebCode: { show_all: true },
2 years ago
years: { hide_vs: true },
},
}}
onSubmit={(_err, obj, form, str) => {
TradeStore.setStateSearch(form);
pageRefresh(obj);
}}
/>
</Col>
</Row>
<section>
<Space>
<h2>年度业绩</h2>
</Space>
<Spin spinning={summaryData.loading}>
2 years ago
<Row gutter={layoutProps.gutter}>
{summaryData.dataSource.map((item) => (
<Col {...layoutProps} key={item.title}>
<StatisticCard {...item} showProgress={item.hasKPI} />
</Col>
))}
</Row>
</Spin>
</section>
<section>
<Space gutter={16} size={'large'}>
<h3>趋势</h3>
<DataFieldRadio value={timeDataField} onChange={handleChangetimeDataField} />
<div></div>
</Space>
<Line {...lineConfig} data={timeData.dataSource} />
</section>
<section>
<h3>市场进度</h3>
2 years ago
<Spin spinning={BuData.loading}>
<Row gutter={layoutProps3.gutter}>
<Col {...layoutProps3}>
2 years ago
<Bullet {...BUConfig} dataSource={BuData?.dataSource || []} />
</Col>
{Object.keys(sideData.dataSource).map((key) => (
<Col {...layoutProps3} key={key}>
2 years ago
<Waterfall key={key} {...WaterfallConfig} title={key} dataSource={sideData.dataSource[key]} line={summaryData.kpi} />
<h3 style={{ textAlign: 'center' }}>{key}</h3>
</Col>
))}
</Row>
</Spin>
</section>
<section>
<Space>
<h3>TOP</h3>
<div>
<DataFieldRadio value={valueKey} onChange={handleChangeValueKey} />
</div>
</Space>
<Row gutter={layoutProps.gutter}>
{topSeries.map((item) => (
<Col {...layoutProps} key={item.key}>
<Spin spinning={topData[item.key]?.loading || false}>
<h3 style={{ textAlign: 'center' }}>{item.label}</h3>
2 years ago
<Bullet {...BulletConfig} dataSource={topData[item.key]?.dataSource || []} itemLength={10} />
</Spin>
</Col>
))}
</Row>
</section>
</>
);
2 years ago
});