|
|
@ -1,9 +1,29 @@ |
|
|
import React, { Component } from 'react'; |
|
|
import React, { Component } from 'react'; |
|
|
import { connect } from 'dva'; |
|
|
import { connect } from 'dva'; |
|
|
import { Row, Col, Icon, Card, Tabs, Table, Radio, DatePicker, Tooltip, Menu, Dropdown } from 'antd'; |
|
|
import { |
|
|
|
|
|
Row, |
|
|
|
|
|
Col, |
|
|
|
|
|
Icon, |
|
|
|
|
|
Card, |
|
|
|
|
|
Tabs, |
|
|
|
|
|
Table, |
|
|
|
|
|
Radio, |
|
|
|
|
|
DatePicker, |
|
|
|
|
|
Tooltip, |
|
|
|
|
|
Menu, |
|
|
|
|
|
Dropdown, |
|
|
|
|
|
} from 'antd'; |
|
|
import numeral from 'numeral'; |
|
|
import numeral from 'numeral'; |
|
|
import { |
|
|
import { |
|
|
ChartCard, yuan, MiniArea, MiniBar, MiniProgress, Field, Bar, Pie, TimelineChart, |
|
|
ChartCard, |
|
|
|
|
|
yuan, |
|
|
|
|
|
MiniArea, |
|
|
|
|
|
MiniBar, |
|
|
|
|
|
MiniProgress, |
|
|
|
|
|
Field, |
|
|
|
|
|
Bar, |
|
|
|
|
|
Pie, |
|
|
|
|
|
TimelineChart, |
|
|
} from '../../components/Charts'; |
|
|
} from '../../components/Charts'; |
|
|
import Trend from '../../components/Trend'; |
|
|
import Trend from '../../components/Trend'; |
|
|
import NumberInfo from '../../components/NumberInfo'; |
|
|
import NumberInfo from '../../components/NumberInfo'; |
|
|
@ -30,7 +50,7 @@ export default class Analysis extends Component { |
|
|
salesType: 'all', |
|
|
salesType: 'all', |
|
|
currentTabKey: '', |
|
|
currentTabKey: '', |
|
|
rangePickerValue: getTimeDistance('year'), |
|
|
rangePickerValue: getTimeDistance('year'), |
|
|
} |
|
|
}; |
|
|
|
|
|
|
|
|
componentDidMount() { |
|
|
componentDidMount() { |
|
|
this.props.dispatch({ |
|
|
this.props.dispatch({ |
|
|
@ -49,13 +69,13 @@ export default class Analysis extends Component { |
|
|
this.setState({ |
|
|
this.setState({ |
|
|
salesType: e.target.value, |
|
|
salesType: e.target.value, |
|
|
}); |
|
|
}); |
|
|
} |
|
|
}; |
|
|
|
|
|
|
|
|
handleTabChange = (key) => { |
|
|
handleTabChange = (key) => { |
|
|
this.setState({ |
|
|
this.setState({ |
|
|
currentTabKey: key, |
|
|
currentTabKey: key, |
|
|
}); |
|
|
}); |
|
|
} |
|
|
}; |
|
|
|
|
|
|
|
|
handleRangePickerChange = (rangePickerValue) => { |
|
|
handleRangePickerChange = (rangePickerValue) => { |
|
|
this.setState({ |
|
|
this.setState({ |
|
|
@ -65,7 +85,7 @@ export default class Analysis extends Component { |
|
|
this.props.dispatch({ |
|
|
this.props.dispatch({ |
|
|
type: 'chart/fetchSalesData', |
|
|
type: 'chart/fetchSalesData', |
|
|
}); |
|
|
}); |
|
|
} |
|
|
}; |
|
|
|
|
|
|
|
|
selectDate = (type) => { |
|
|
selectDate = (type) => { |
|
|
this.setState({ |
|
|
this.setState({ |
|
|
@ -75,7 +95,7 @@ export default class Analysis extends Component { |
|
|
this.props.dispatch({ |
|
|
this.props.dispatch({ |
|
|
type: 'chart/fetchSalesData', |
|
|
type: 'chart/fetchSalesData', |
|
|
}); |
|
|
}); |
|
|
} |
|
|
}; |
|
|
|
|
|
|
|
|
isActive(type) { |
|
|
isActive(type) { |
|
|
const { rangePickerValue } = this.state; |
|
|
const { rangePickerValue } = this.state; |
|
|
@ -83,7 +103,10 @@ export default class Analysis extends Component { |
|
|
if (!rangePickerValue[0] || !rangePickerValue[1]) { |
|
|
if (!rangePickerValue[0] || !rangePickerValue[1]) { |
|
|
return; |
|
|
return; |
|
|
} |
|
|
} |
|
|
if (rangePickerValue[0].isSame(value[0], 'day') && rangePickerValue[1].isSame(value[1], 'day')) { |
|
|
if ( |
|
|
|
|
|
rangePickerValue[0].isSame(value[0], 'day') && |
|
|
|
|
|
rangePickerValue[1].isSame(value[1], 'day') |
|
|
|
|
|
) { |
|
|
return styles.currentDate; |
|
|
return styles.currentDate; |
|
|
} |
|
|
} |
|
|
} |
|
|
} |
|
|
@ -104,10 +127,10 @@ export default class Analysis extends Component { |
|
|
loading, |
|
|
loading, |
|
|
} = chart; |
|
|
} = chart; |
|
|
|
|
|
|
|
|
const salesPieData = salesType === 'all' ? |
|
|
const salesPieData = |
|
|
salesTypeData |
|
|
salesType === 'all' |
|
|
: |
|
|
? salesTypeData |
|
|
(salesType === 'online' ? salesTypeDataOnline : salesTypeDataOffline); |
|
|
: salesType === 'online' ? salesTypeDataOnline : salesTypeDataOffline; |
|
|
|
|
|
|
|
|
const menu = ( |
|
|
const menu = ( |
|
|
<Menu> |
|
|
<Menu> |
|
|
@ -191,13 +214,13 @@ export default class Analysis extends Component { |
|
|
subTitle="转化率" |
|
|
subTitle="转化率" |
|
|
gap={2} |
|
|
gap={2} |
|
|
total={`${data.cvr * 100}%`} |
|
|
total={`${data.cvr * 100}%`} |
|
|
theme={(currentKey !== data.name) && 'light'} |
|
|
theme={currentKey !== data.name && 'light'} |
|
|
/> |
|
|
/> |
|
|
</Col> |
|
|
</Col> |
|
|
<Col span={12} style={{ paddingTop: 36 }}> |
|
|
<Col span={12} style={{ paddingTop: 36 }}> |
|
|
<Pie |
|
|
<Pie |
|
|
animate={false} |
|
|
animate={false} |
|
|
color={(currentKey !== data.name) && '#BDE4FF'} |
|
|
color={currentKey !== data.name && '#BDE4FF'} |
|
|
inner={0.55} |
|
|
inner={0.55} |
|
|
tooltip={false} |
|
|
tooltip={false} |
|
|
margin={[0, 0, 0, 0]} |
|
|
margin={[0, 0, 0, 0]} |
|
|
@ -224,7 +247,11 @@ export default class Analysis extends Component { |
|
|
<ChartCard |
|
|
<ChartCard |
|
|
bordered={false} |
|
|
bordered={false} |
|
|
title="总销售额" |
|
|
title="总销售额" |
|
|
action={<Tooltip title="指标说明"><Icon type="info-circle-o" /></Tooltip>} |
|
|
action={ |
|
|
|
|
|
<Tooltip title="指标说明"> |
|
|
|
|
|
<Icon type="info-circle-o" /> |
|
|
|
|
|
</Tooltip> |
|
|
|
|
|
} |
|
|
total={yuan(126560)} |
|
|
total={yuan(126560)} |
|
|
footer={<Field label="日均销售额" value={`¥${numeral(12423).format('0,0')}`} />} |
|
|
footer={<Field label="日均销售额" value={`¥${numeral(12423).format('0,0')}`} />} |
|
|
contentHeight={46} |
|
|
contentHeight={46} |
|
|
@ -241,38 +268,43 @@ export default class Analysis extends Component { |
|
|
<ChartCard |
|
|
<ChartCard |
|
|
bordered={false} |
|
|
bordered={false} |
|
|
title="访问量" |
|
|
title="访问量" |
|
|
action={<Tooltip title="指标说明"><Icon type="info-circle-o" /></Tooltip>} |
|
|
action={ |
|
|
|
|
|
<Tooltip title="指标说明"> |
|
|
|
|
|
<Icon type="info-circle-o" /> |
|
|
|
|
|
</Tooltip> |
|
|
|
|
|
} |
|
|
total={numeral(8846).format('0,0')} |
|
|
total={numeral(8846).format('0,0')} |
|
|
footer={<Field label="日访问量" value={numeral(1234).format('0,0')} />} |
|
|
footer={<Field label="日访问量" value={numeral(1234).format('0,0')} />} |
|
|
contentHeight={46} |
|
|
contentHeight={46} |
|
|
> |
|
|
> |
|
|
<MiniArea |
|
|
<MiniArea color="#975FE4" data={visitData} /> |
|
|
color="#975FE4" |
|
|
|
|
|
height={46} |
|
|
|
|
|
data={visitData} |
|
|
|
|
|
/> |
|
|
|
|
|
</ChartCard> |
|
|
</ChartCard> |
|
|
</Col> |
|
|
</Col> |
|
|
<Col {...topColResponsiveProps}> |
|
|
<Col {...topColResponsiveProps}> |
|
|
<ChartCard |
|
|
<ChartCard |
|
|
bordered={false} |
|
|
bordered={false} |
|
|
title="支付笔数" |
|
|
title="支付笔数" |
|
|
action={<Tooltip title="指标说明"><Icon type="info-circle-o" /></Tooltip>} |
|
|
action={ |
|
|
|
|
|
<Tooltip title="指标说明"> |
|
|
|
|
|
<Icon type="info-circle-o" /> |
|
|
|
|
|
</Tooltip> |
|
|
|
|
|
} |
|
|
total={numeral(6560).format('0,0')} |
|
|
total={numeral(6560).format('0,0')} |
|
|
footer={<Field label="转化率" value="60%" />} |
|
|
footer={<Field label="转化率" value="60%" />} |
|
|
contentHeight={46} |
|
|
contentHeight={46} |
|
|
> |
|
|
> |
|
|
<MiniBar |
|
|
<MiniBar data={visitData} /> |
|
|
height={46} |
|
|
|
|
|
data={visitData} |
|
|
|
|
|
/> |
|
|
|
|
|
</ChartCard> |
|
|
</ChartCard> |
|
|
</Col> |
|
|
</Col> |
|
|
<Col {...topColResponsiveProps}> |
|
|
<Col {...topColResponsiveProps}> |
|
|
<ChartCard |
|
|
<ChartCard |
|
|
bordered={false} |
|
|
bordered={false} |
|
|
title="运营活动效果" |
|
|
title="运营活动效果" |
|
|
action={<Tooltip title="指标说明"><Icon type="info-circle-o" /></Tooltip>} |
|
|
action={ |
|
|
|
|
|
<Tooltip title="指标说明"> |
|
|
|
|
|
<Icon type="info-circle-o" /> |
|
|
|
|
|
</Tooltip> |
|
|
|
|
|
} |
|
|
total="78%" |
|
|
total="78%" |
|
|
footer={ |
|
|
footer={ |
|
|
<div style={{ whiteSpace: 'nowrap', overflow: 'hidden' }}> |
|
|
<div style={{ whiteSpace: 'nowrap', overflow: 'hidden' }}> |
|
|
@ -291,37 +323,27 @@ export default class Analysis extends Component { |
|
|
</Col> |
|
|
</Col> |
|
|
</Row> |
|
|
</Row> |
|
|
|
|
|
|
|
|
<Card |
|
|
<Card loading={loading} bordered={false} bodyStyle={{ padding: 0 }}> |
|
|
loading={loading} |
|
|
|
|
|
bordered={false} |
|
|
|
|
|
bodyStyle={{ padding: 0 }} |
|
|
|
|
|
> |
|
|
|
|
|
<div className={styles.salesCard}> |
|
|
<div className={styles.salesCard}> |
|
|
<Tabs tabBarExtraContent={salesExtra} size="large" tabBarStyle={{ marginBottom: 24 }}> |
|
|
<Tabs tabBarExtraContent={salesExtra} size="large" tabBarStyle={{ marginBottom: 24 }}> |
|
|
<TabPane tab="销售额" key="sales"> |
|
|
<TabPane tab="销售额" key="sales"> |
|
|
<Row> |
|
|
<Row> |
|
|
<Col xl={16} lg={12} md={12} sm={24} xs={24}> |
|
|
<Col xl={16} lg={12} md={12} sm={24} xs={24}> |
|
|
<div className={styles.salesBar}> |
|
|
<div className={styles.salesBar}> |
|
|
<Bar |
|
|
<Bar height={270} title="销售额趋势" data={salesData} /> |
|
|
height={295} |
|
|
|
|
|
title="销售额趋势" |
|
|
|
|
|
data={salesData} |
|
|
|
|
|
/> |
|
|
|
|
|
</div> |
|
|
</div> |
|
|
</Col> |
|
|
</Col> |
|
|
<Col xl={8} lg={12} md={12} sm={24} xs={24}> |
|
|
<Col xl={8} lg={12} md={12} sm={24} xs={24}> |
|
|
<div className={styles.salesRank}> |
|
|
<div className={styles.salesRank}> |
|
|
<h4 className={styles.rankingTitle}>门店销售额排名</h4> |
|
|
<h4 className={styles.rankingTitle}>门店销售额排名</h4> |
|
|
<ul className={styles.rankingList}> |
|
|
<ul className={styles.rankingList}> |
|
|
{ |
|
|
{rankingListData.map((item, i) => ( |
|
|
rankingListData.map((item, i) => ( |
|
|
<li key={item.title}> |
|
|
<li key={item.title}> |
|
|
<span className={i < 3 ? styles.active : ''}>{i + 1}</span> |
|
|
<span className={(i < 3) ? styles.active : ''}>{i + 1}</span> |
|
|
<span>{item.title}</span> |
|
|
<span>{item.title}</span> |
|
|
<span>{numeral(item.total).format('0,0')}</span> |
|
|
<span>{numeral(item.total).format('0,0')}</span> |
|
|
</li> |
|
|
</li> |
|
|
))} |
|
|
)) |
|
|
|
|
|
} |
|
|
|
|
|
</ul> |
|
|
</ul> |
|
|
</div> |
|
|
</div> |
|
|
</Col> |
|
|
</Col> |
|
|
@ -331,26 +353,20 @@ export default class Analysis extends Component { |
|
|
<Row> |
|
|
<Row> |
|
|
<Col xl={16} lg={12} md={12} sm={24} xs={24}> |
|
|
<Col xl={16} lg={12} md={12} sm={24} xs={24}> |
|
|
<div className={styles.salesBar}> |
|
|
<div className={styles.salesBar}> |
|
|
<Bar |
|
|
<Bar height={292} title="访问量趋势" data={salesData} /> |
|
|
height={292} |
|
|
|
|
|
title="访问量趋势" |
|
|
|
|
|
data={salesData} |
|
|
|
|
|
/> |
|
|
|
|
|
</div> |
|
|
</div> |
|
|
</Col> |
|
|
</Col> |
|
|
<Col xl={8} lg={12} md={12} sm={24} xs={24}> |
|
|
<Col xl={8} lg={12} md={12} sm={24} xs={24}> |
|
|
<div className={styles.salesRank}> |
|
|
<div className={styles.salesRank}> |
|
|
<h4 className={styles.rankingTitle}>门店访问量排名</h4> |
|
|
<h4 className={styles.rankingTitle}>门店访问量排名</h4> |
|
|
<ul className={styles.rankingList}> |
|
|
<ul className={styles.rankingList}> |
|
|
{ |
|
|
{rankingListData.map((item, i) => ( |
|
|
rankingListData.map((item, i) => ( |
|
|
<li key={item.title}> |
|
|
<li key={item.title}> |
|
|
<span className={i < 3 && styles.active}>{i + 1}</span> |
|
|
<span className={(i < 3) && styles.active}>{i + 1}</span> |
|
|
<span>{item.title}</span> |
|
|
<span>{item.title}</span> |
|
|
<span>{numeral(item.total).format('0,0')}</span> |
|
|
<span>{numeral(item.total).format('0,0')}</span> |
|
|
</li> |
|
|
</li> |
|
|
))} |
|
|
)) |
|
|
|
|
|
} |
|
|
|
|
|
</ul> |
|
|
</ul> |
|
|
</div> |
|
|
</div> |
|
|
</Col> |
|
|
</Col> |
|
|
@ -385,11 +401,7 @@ export default class Analysis extends Component { |
|
|
status="up" |
|
|
status="up" |
|
|
subTotal={17.1} |
|
|
subTotal={17.1} |
|
|
/> |
|
|
/> |
|
|
<MiniArea |
|
|
<MiniArea line height={45} data={visitData2} /> |
|
|
line |
|
|
|
|
|
height={45} |
|
|
|
|
|
data={visitData2} |
|
|
|
|
|
/> |
|
|
|
|
|
</Col> |
|
|
</Col> |
|
|
<Col sm={12} xs={24} style={{ marginBottom: 24 }}> |
|
|
<Col sm={12} xs={24} style={{ marginBottom: 24 }}> |
|
|
<NumberInfo |
|
|
<NumberInfo |
|
|
@ -399,11 +411,7 @@ export default class Analysis extends Component { |
|
|
subTotal={26.2} |
|
|
subTotal={26.2} |
|
|
gap={8} |
|
|
gap={8} |
|
|
/> |
|
|
/> |
|
|
<MiniArea |
|
|
<MiniArea line height={45} data={visitData2} /> |
|
|
line |
|
|
|
|
|
height={45} |
|
|
|
|
|
data={visitData2} |
|
|
|
|
|
/> |
|
|
|
|
|
</Col> |
|
|
</Col> |
|
|
</Row> |
|
|
</Row> |
|
|
<Table |
|
|
<Table |
|
|
@ -425,7 +433,7 @@ export default class Analysis extends Component { |
|
|
bordered={false} |
|
|
bordered={false} |
|
|
title="销售额类别占比" |
|
|
title="销售额类别占比" |
|
|
bodyStyle={{ padding: 24 }} |
|
|
bodyStyle={{ padding: 24 }} |
|
|
extra={( |
|
|
extra={ |
|
|
<div className={styles.salesCardExtra}> |
|
|
<div className={styles.salesCardExtra}> |
|
|
{iconGroup} |
|
|
{iconGroup} |
|
|
<div className={styles.salesTypeRadio}> |
|
|
<div className={styles.salesTypeRadio}> |
|
|
@ -436,7 +444,7 @@ export default class Analysis extends Component { |
|
|
</Radio.Group> |
|
|
</Radio.Group> |
|
|
</div> |
|
|
</div> |
|
|
</div> |
|
|
</div> |
|
|
)} |
|
|
} |
|
|
style={{ marginTop: 24, minHeight: 509 }} |
|
|
style={{ marginTop: 24, minHeight: 509 }} |
|
|
> |
|
|
> |
|
|
<h4 style={{ marginTop: 8, marginBottom: 32 }}>销售额</h4> |
|
|
<h4 style={{ marginTop: 8, marginBottom: 32 }}>销售额</h4> |
|
|
@ -460,25 +468,18 @@ export default class Analysis extends Component { |
|
|
bodyStyle={{ padding: '0 0 32px 0' }} |
|
|
bodyStyle={{ padding: '0 0 32px 0' }} |
|
|
style={{ marginTop: 32 }} |
|
|
style={{ marginTop: 32 }} |
|
|
> |
|
|
> |
|
|
<Tabs |
|
|
<Tabs activeKey={activeKey} onChange={this.handleTabChange}> |
|
|
activeKey={activeKey} |
|
|
{offlineData.map(shop => ( |
|
|
onChange={this.handleTabChange} |
|
|
<TabPane tab={<CustomTab data={shop} currentTabKey={activeKey} />} key={shop.name}> |
|
|
> |
|
|
<div style={{ padding: '0 24px' }}> |
|
|
{ |
|
|
<TimelineChart |
|
|
offlineData.map(shop => ( |
|
|
height={400} |
|
|
<TabPane |
|
|
data={offlineChartData} |
|
|
tab={<CustomTab data={shop} currentTabKey={activeKey} />} |
|
|
titleMap={{ y1: '客流量', y2: '支付笔数' }} |
|
|
key={shop.name} |
|
|
/> |
|
|
> |
|
|
</div> |
|
|
<div style={{ padding: '0 24px' }}> |
|
|
</TabPane> |
|
|
<TimelineChart |
|
|
))} |
|
|
data={offlineChartData} |
|
|
|
|
|
titleMap={{ y1: '客流量', y2: '支付笔数' }} |
|
|
|
|
|
/> |
|
|
|
|
|
</div> |
|
|
|
|
|
</TabPane>) |
|
|
|
|
|
) |
|
|
|
|
|
} |
|
|
|
|
|
</Tabs> |
|
|
</Tabs> |
|
|
</Card> |
|
|
</Card> |
|
|
</div> |
|
|
</div> |
|
|
|