|
|
|
@ -1,23 +1,20 @@
|
|
|
|
|
import { useContext, useEffect, useState } from 'react';
|
|
|
|
|
import { observer } from 'mobx-react';
|
|
|
|
|
import { Row, Col, Spin, Space } from 'antd';
|
|
|
|
|
import { Row, Col, Spin, Space, Radio } from 'antd';
|
|
|
|
|
import { CheckCircleTwoTone, MoneyCollectTwoTone, FlagTwoTone, SmileTwoTone, } from '@ant-design/icons';
|
|
|
|
|
import { stores_Context } from '../config';
|
|
|
|
|
import { useNavigate } from 'react-router-dom';
|
|
|
|
|
import StatisticCard from '../components/StatisticCard';
|
|
|
|
|
import Bullet from '../components/BulletWithSort';
|
|
|
|
|
import Waterfall from '../components/Waterfall';
|
|
|
|
|
import DataFieldRadio from './../components/DateFieldRadio';
|
|
|
|
|
import DataFieldRadio from '../components/DataFieldRadio';
|
|
|
|
|
import { datePartOptions } from './../components/DateGroupRadio/date';
|
|
|
|
|
import SearchForm from './../components/search/SearchForm';
|
|
|
|
|
import { empty, cloneDeep } from './../utils/commons';
|
|
|
|
|
import { empty, cloneDeep, isEmpty } from './../utils/commons';
|
|
|
|
|
import { dataFieldAlias } from './../libs/ht';
|
|
|
|
|
import { Line } from '@ant-design/charts';
|
|
|
|
|
import './home.css';
|
|
|
|
|
|
|
|
|
|
export default observer(() => {
|
|
|
|
|
const navigate = useNavigate();
|
|
|
|
|
const { TradeStore } = useContext(stores_Context);
|
|
|
|
|
const { searchPayloadHome, sideData, summaryData, BuData, topData, timeData } = TradeStore;
|
|
|
|
|
|
|
|
|
|
const topSeries = [
|
|
|
|
|
{ key: 'country', label: '国籍' },
|
|
|
|
|
{ key: 'dept', label: '小组' },
|
|
|
|
@ -26,6 +23,15 @@ export default observer(() => {
|
|
|
|
|
// { key: 'GuestGroupType', label: '客群类别' },
|
|
|
|
|
];
|
|
|
|
|
|
|
|
|
|
// const iconSets = [CheckCircleTwoTone, <MoneyCollectTwoTone />, <FlagTwoTone />, <ClockCircleTwoTone />, <DashboardTwoTone />,<SmileTwoTone />,];
|
|
|
|
|
const iconSets = [CheckCircleTwoTone, MoneyCollectTwoTone, FlagTwoTone, SmileTwoTone];
|
|
|
|
|
|
|
|
|
|
export default observer(() => {
|
|
|
|
|
// const navigate = useNavigate();
|
|
|
|
|
const { TradeStore, date_picker_store: searchFormStore } = useContext(stores_Context);
|
|
|
|
|
const { sideData, summaryData, BuData, topData, timeData, timeLineKey } = TradeStore;
|
|
|
|
|
const { formValues, } = searchFormStore;
|
|
|
|
|
|
|
|
|
|
useEffect(() => {
|
|
|
|
|
if (empty(summaryData.dataSource)) {
|
|
|
|
|
// pageRefresh();
|
|
|
|
@ -137,6 +143,14 @@ export default observer(() => {
|
|
|
|
|
},
|
|
|
|
|
});
|
|
|
|
|
};
|
|
|
|
|
const [dateField, setDateField] = useState(timeLineKey);
|
|
|
|
|
const handleChangeDateType = ({target: {value}}) => {
|
|
|
|
|
setDateField(value);
|
|
|
|
|
TradeStore.setTimeLineKey(value);
|
|
|
|
|
if (!isEmpty(TradeStore.searchPayloadHome)) {
|
|
|
|
|
TradeStore.fetchTradeDataByDate();
|
|
|
|
|
}
|
|
|
|
|
};
|
|
|
|
|
return (
|
|
|
|
|
<>
|
|
|
|
|
<Row gutter={16} style={{ margin: '-16px -8px' }}>
|
|
|
|
@ -145,7 +159,7 @@ export default observer(() => {
|
|
|
|
|
<SearchForm
|
|
|
|
|
defaultValue={{
|
|
|
|
|
initialValue: {
|
|
|
|
|
...searchPayloadHome,
|
|
|
|
|
...formValues,
|
|
|
|
|
},
|
|
|
|
|
shows: ['DateType', 'DepartmentList', 'WebCode', 'IncludeTickets', 'years'],
|
|
|
|
|
fieldProps: {
|
|
|
|
@ -155,7 +169,7 @@ export default observer(() => {
|
|
|
|
|
},
|
|
|
|
|
}}
|
|
|
|
|
onSubmit={(_err, obj, form, str) => {
|
|
|
|
|
TradeStore.setStateSearch(form);
|
|
|
|
|
TradeStore.setStateSearch(obj);
|
|
|
|
|
pageRefresh(obj);
|
|
|
|
|
}}
|
|
|
|
|
/>
|
|
|
|
@ -167,9 +181,9 @@ export default observer(() => {
|
|
|
|
|
</Space>
|
|
|
|
|
<Spin spinning={summaryData.loading}>
|
|
|
|
|
<Row gutter={layoutProps.gutter}>
|
|
|
|
|
{summaryData.dataSource.map((item) => (
|
|
|
|
|
{summaryData.dataSource.map((item, i) => (
|
|
|
|
|
<Col {...layoutProps} key={item.title}>
|
|
|
|
|
<StatisticCard {...item} showProgress={item.hasKPI} />
|
|
|
|
|
<StatisticCard {...item} showProgress={item.hasKPI} icon={iconSets[i]} />
|
|
|
|
|
</Col>
|
|
|
|
|
))}
|
|
|
|
|
</Row>
|
|
|
|
@ -177,11 +191,13 @@ export default observer(() => {
|
|
|
|
|
</section>
|
|
|
|
|
<section>
|
|
|
|
|
<Space gutter={16} size={'large'}>
|
|
|
|
|
<h3>趋势</h3>
|
|
|
|
|
<h3>走势</h3>
|
|
|
|
|
<DataFieldRadio value={timeDataField} onChange={handleChangetimeDataField} />
|
|
|
|
|
<div>周</div>
|
|
|
|
|
<Radio.Group options={datePartOptions} optionType="button" onChange={handleChangeDateType} value={dateField} />
|
|
|
|
|
</Space>
|
|
|
|
|
<Spin spinning={timeData.loading}>
|
|
|
|
|
<Line {...lineConfig} data={timeData.dataSource} />
|
|
|
|
|
</Spin>
|
|
|
|
|
</section>
|
|
|
|
|
<section>
|
|
|
|
|
<h3>市场进度</h3>
|
|
|
|
@ -189,11 +205,12 @@ export default observer(() => {
|
|
|
|
|
<Row gutter={layoutProps3.gutter}>
|
|
|
|
|
<Col {...layoutProps3}>
|
|
|
|
|
<Bullet {...BUConfig} dataSource={BuData?.dataSource || []} />
|
|
|
|
|
<h3 style={{ textAlign: 'center' }}>{`各事业部总业绩`}</h3>
|
|
|
|
|
</Col>
|
|
|
|
|
{Object.keys(sideData.dataSource).map((key) => (
|
|
|
|
|
<Col {...layoutProps3} key={key}>
|
|
|
|
|
<Waterfall key={key} {...WaterfallConfig} title={key} dataSource={sideData.dataSource[key]} line={summaryData.kpi} />
|
|
|
|
|
<h3 style={{ textAlign: 'center' }}>{key}</h3>
|
|
|
|
|
<h3 style={{ textAlign: 'center' }}>{`${key}每月业绩`}</h3>
|
|
|
|
|
</Col>
|
|
|
|
|
))}
|
|
|
|
|
</Row>
|
|
|
|
|