Skip to content

Commit b0484d9

Browse files
committedMar 1, 2020
Merge branch '1.1' of code.aliyun.com:jetlinks/ui-antd into 1.1
2 parents c2aa572 + 65ca937 commit b0484d9

File tree

6 files changed

+429
-314
lines changed

6 files changed

+429
-314
lines changed
 
Original file line numberDiff line numberDiff line change
@@ -1,63 +1,41 @@
1-
import React from "react";
2-
import {
3-
G2,
4-
Chart,
5-
Geom,
6-
Axis,
7-
Tooltip,
8-
Coord,
9-
Label,
10-
Legend,
11-
View,
12-
Guide,
13-
Shape,
14-
Facet,
15-
Util
16-
} from "bizcharts";
17-
import DataSet from "@antv/data-set";
1+
import React from 'react';
2+
import { Axis, Chart, Coord, Geom, Legend, Tooltip } from 'bizcharts';
3+
import DataSet from '@antv/data-set';
4+
import autoHeight from '@/pages/analysis/components/Charts/autoHeight';
5+
6+
export interface IGaugeProps {
7+
color?: string;
8+
height?: number;
9+
bgColor?: number;
10+
datas: Array<{
11+
x: string;
12+
消息量: number;
13+
}>;
14+
forceFit?: boolean;
15+
style?: React.CSSProperties;
16+
formatter: (value: string) => string;
17+
}
18+
19+
class Grouped extends React.Component<IGaugeProps> {
20+
render() {
21+
const {
22+
data,
23+
height = 1,
24+
} = this.props;
1825

19-
class Grouped extends React.Component {
20-
render() {
21-
const data = [
22-
{
23-
label: "Monday",
24-
series1: 2800,
25-
series2: 2260
26-
},
27-
{
28-
label: "Tuesday",
29-
series1: 1800,
30-
series2: 1300
31-
},
32-
{
33-
label: "Wednesday",
34-
series1: 950,
35-
series2: 900
36-
},
37-
{
38-
label: "Thursday",
39-
series1: 500,
40-
series2: 390
41-
},
42-
{
43-
label: "Friday",
44-
series1: 170,
45-
series2: 100
46-
}
47-
];
4826
const ds = new DataSet();
4927
const dv = ds.createView().source(data);
5028
dv.transform({
5129
type: "fold",
52-
fields: ["series1", "series2"],
30+
fields: ["消息量"],
5331
// 展开字段集
5432
key: "type",
5533
// key字段
5634
value: "value" // value字段
5735
});
5836
return (
5937
<div>
60-
<Chart height={385} data={dv} forceFit>
38+
<Chart height={height} data={dv} forceFit>
6139
<Legend />
6240
<Coord transpose scale={[1, -1]} />
6341
<Axis
@@ -85,4 +63,4 @@ class Grouped extends React.Component {
8563
}
8664
}
8765

88-
export default Grouped;
66+
export default autoHeight()(Grouped);

‎src/pages/analysis/components/ProportionSales.tsx

+128-30
Original file line numberDiff line numberDiff line change
@@ -1,43 +1,131 @@
1-
import React from 'react';
2-
import { Card, Radio } from 'antd';
1+
import React, { useEffect, useState } from 'react';
2+
import { message, Card, Radio } from 'antd';
33
import Charts from './Charts';
44
import styles from '../style.less';
5-
import { RadioChangeEvent } from 'antd/es/radio';
65
import { ISalesData } from '../data';
6+
import apis from '@/services';
7+
import Select from 'antd/es/select';
78

89
const { Pie } = Charts;
910

10-
const ProportionSales = ({
11-
salesType,
12-
loading,
13-
salesPieData,
14-
handleChangeSalesType,
15-
}: {
16-
loading: boolean;
17-
salesType: 'all' | 'online' | 'stores';
18-
salesPieData: ISalesData[];
19-
handleChangeSalesType?: (e: RadioChangeEvent) => void;
20-
}) => {
11+
export interface State {
12+
productDataList: any[];
13+
defaultList: any[];
14+
dataList: ISalesData[];
15+
state:string;
16+
productId:any[];
17+
productData:any;
18+
}
19+
20+
const ProportionSales = ({ loading, }: { loading: boolean; }) => {
21+
22+
const initState: State = {
23+
productDataList: [],
24+
defaultList: [],
25+
dataList: [],
26+
state:"",
27+
productId:[],
28+
productData:{},
29+
};
30+
const [productDataList, setProductDataList] = useState(initState.productDataList);
31+
const [defaultList, setDefaultList] = useState(initState.defaultList);
32+
const [dataList, setDataList] = useState(initState.dataList);
33+
const [stateType, setState] = useState(initState.state);
34+
const [productId, setProductId] = useState(initState.productId);
35+
const [productData, setProductData] = useState(initState.productData);
36+
useEffect(() => {
37+
apis.deviceProdcut
38+
.queryNoPagin()
39+
.then(response => {
40+
const tempResult = response?.result;
41+
if (tempResult) {
42+
let list = [];
43+
for (let i = 0; i < tempResult.length; i++) {
44+
productData[tempResult[i].id] = tempResult[i].name;
45+
productDataList.push(<Select.Option key={tempResult[i].id}>{tempResult[i].name}</Select.Option>);
46+
if (i < 6) {
47+
list.push(tempResult[i].id);
48+
setDefaultList(defaultList.push(tempResult[i].id));
49+
}
50+
}
51+
setProductId(list);
52+
deviceStatus(defaultList, '');
53+
}
54+
})
55+
.catch(() => {
56+
});
57+
}, []);
58+
59+
60+
function handleChange(value) {
61+
if (value.length > 6){
62+
message.error('设备型号最多只能勾选6个');
63+
return false;
64+
}
65+
setProductId(value);
66+
deviceStatus(value, stateType);
67+
}
68+
69+
function onChange(e) {
70+
let val: string = "";
71+
if (e.target.value !== 'all') {
72+
val = e.target.value;
73+
}
74+
setState(val);
75+
deviceStatus(productId, val);
76+
}
77+
78+
const deviceStatus = (prodcutList, stateType) => {
79+
const list = [];
80+
prodcutList.forEach(item => {
81+
list.push({
82+
'dashboard': 'device',
83+
'object': 'status',
84+
'measurement': 'record',
85+
'dimension': 'current',
86+
'group': item,
87+
'params': {
88+
'productId': item,
89+
'state': stateType,
90+
},
91+
});
92+
});
93+
apis.analysis.getMulti(list)
94+
.then((response: any) => {
95+
const tempResult = response?.result;
96+
if (tempResult) {
97+
const list = [];
98+
tempResult.forEach(item => {
99+
list.push({
100+
x: productData[item.group],
101+
y: item.data.value,
102+
});
103+
});
104+
setDataList(list);
105+
}
106+
});
107+
};
108+
21109
return (
22110
<Card
23111
loading={loading}
24112
className={styles.salesCard}
25113
bordered={false}
26114
title={
27-
'各类型设备占比'
115+
'各型号设备占比'
28116
}
29117
bodyStyle={{ padding: 24 }}
30118
extra={
31119
<div className={styles.salesCardExtra}>
32120
<div className={styles.salesTypeRadio}>
33-
<Radio.Group value={salesType} onChange={handleChangeSalesType}>
121+
<Radio.Group onChange={onChange} defaultValue="all">
34122
<Radio.Button value="all">
35123
全部设备
36124
</Radio.Button>
37125
<Radio.Button value="online">
38126
在线
39127
</Radio.Button>
40-
<Radio.Button value="stores">
128+
<Radio.Button value="offline">
41129
离线
42130
</Radio.Button>
43131
</Radio.Group>
@@ -48,21 +136,31 @@ const ProportionSales = ({
48136
>
49137
<div
50138
style={{
51-
minHeight: 380,
139+
minHeight: 360,
52140
}}
53141
>
54-
<h4 style={{ marginTop: 8, marginBottom: 32 }}>
55-
数量统计
56-
</h4>
57-
<Pie
58-
hasLegend
59-
subTitle={'总设备数'}
60-
total={() => <span>{salesPieData.reduce((pre, now) => now.y + pre, 0)}</span>}
61-
data={salesPieData}
62-
valueFormat={value => <span>{value}</span>}
63-
height={248}
64-
lineWidth={4}
65-
/>
142+
<div>
143+
<Select mode="tags" defaultValue={defaultList} maxTagTextLength={3}
144+
maxTagCount={3}
145+
style={{ width: '50%', float: 'right', marginBottom: 32 }}
146+
placeholder="设备型号" onChange={handleChange}>
147+
{productDataList}
148+
</Select>
149+
</div>
150+
<div>
151+
<h4 style={{ marginTop: 8, marginBottom: 32, width: '40%' }}>
152+
数量统计
153+
</h4>
154+
<Pie
155+
hasLegend
156+
subTitle={'总设备数'}
157+
total={() => <span>{dataList.reduce((pre, now) => now.y + pre, 0)}</span>}
158+
data={dataList}
159+
valueFormat={value => <span>{value}</span>}
160+
height={280}
161+
lineWidth={4}
162+
/>
163+
</div>
66164
</div>
67165
</Card>
68166
);

‎src/pages/analysis/components/SalesCard.tsx

+31-49
Original file line numberDiff line numberDiff line change
@@ -1,11 +1,9 @@
11
import React, { useEffect, useState } from 'react';
2-
import { Card, Col, DatePicker, Icon, Row, Tabs } from 'antd';
3-
import { FormattedMessage } from 'umi-plugin-react/locale';
2+
import { Card, Col, DatePicker, Radio, Row, Tabs } from 'antd';
43
import Charts from './Charts';
54
import styles from '../style.less';
65
import apis from '@/services';
76
import moment from 'moment';
8-
import { RangePickerValue } from 'antd/es/date-picker/interface';
97

108
const { Withnegative } = Charts;
119
const { TabPane } = Tabs;
@@ -18,16 +16,7 @@ export interface State {
1816
selectionTime: string
1917
}
2018

21-
const SalesCard = ({
22-
loading,
23-
isActive,
24-
handleRangePickerChange,
25-
}: {
26-
loading: boolean;
27-
isActive: (key: '1h' | '1d' | '7d' | '30d') => string;
28-
handleRangePickerChange: (dates: RangePickerValue, dateStrings: [string, string]) => void;
29-
},
30-
) => {
19+
const SalesCard = ({ loading }: { loading: boolean; }) => {
3120
let gatewayMonitor: (from: string, to: string, time: string) => void;
3221
const initState: State = {
3322
gatewayDataList: [],
@@ -56,9 +45,11 @@ const SalesCard = ({
5645
};
5746

5847
useEffect(() => {
59-
gatewayMonitor(calculationDate(30), calculationDate(0), '12h');
48+
let da = new Date();
49+
da.setHours(da.getHours() - 1);
50+
gatewayMonitor(formatData(da), calculationDate(0), '1m');
6051
setSelectionTime(calculationDate(0));
61-
setTime('12h');
52+
setTime('1m');
6253
}, []);
6354

6455
gatewayMonitor = (from: string, to: string, time: string) => {
@@ -67,10 +58,10 @@ const SalesCard = ({
6758

6859
if (time === '1m') {
6960
formatData = 'HH时mm分';
70-
}else if(time === "12h"){
71-
formatData="MM月dd日HH时";
72-
}else{
73-
formatData="MM月dd日HH时mm分";
61+
} else if (time === '12h') {
62+
formatData = 'MM月dd日HH时';
63+
} else {
64+
formatData = 'MM月dd日HH时mm分';
7465
}
7566
const list = [
7667
{
@@ -80,7 +71,7 @@ const SalesCard = ({
8071
'dimension': 'agg',
8172
'group': 'sameDay',
8273
'params': {
83-
'time': time || '12h',
74+
'time': time || '1m',
8475
'limit': 60,
8576
'format': formatData,
8677
'from': from,
@@ -100,8 +91,8 @@ const SalesCard = ({
10091
year: item.data.timeString,
10192
消息量: item.data.value,
10293
});
103-
if (item.data.timestamp % 4 === 0 && item.data.timestamp !== 0){
104-
ticksList.push(item.data.timeString)
94+
if (item.data.timestamp % 4 === 0 && item.data.timestamp !== 0) {
95+
ticksList.push(item.data.timeString);
10596
}
10697
});
10798
setTicksDataList(ticksList);
@@ -110,8 +101,9 @@ const SalesCard = ({
110101
});
111102
};
112103

113-
const deviceTime = (value: string) => {
114-
104+
function deviceTime(e) {
105+
const value = e.target.value;
106+
setTime(timeMap[value]);
115107
const dd = new Date(selectionTime);
116108

117109
if (value === '1h') {
@@ -126,7 +118,7 @@ const SalesCard = ({
126118

127119
gatewayMonitor(formatData(dd), formatData(new Date()), timeMap[value]);
128120
//setCurrentTime(dd);
129-
};
121+
}
130122

131123
const formatData = (value: string) => {
132124
const dd = new Date(value);
@@ -155,30 +147,20 @@ const SalesCard = ({
155147
tabBarExtraContent={
156148
<div className={styles.salesExtraWrap}>
157149
<div className={styles.salesExtra}>
158-
<a onClick={() => {
159-
deviceTime('1h');
160-
setTime(timeMap['1h']);
161-
}}>
162-
<FormattedMessage id="analysis.analysis.anHour" defaultMessage="An Hour"/>
163-
</a>
164-
<a onClick={() => {
165-
deviceTime('1d');
166-
setTime(timeMap['1d']);
167-
}}>
168-
<FormattedMessage id="analysis.analysis.all-day" defaultMessage="All Day"/>
169-
</a>
170-
<a onClick={() => {
171-
deviceTime('7d');
172-
setTime(timeMap['7d']);
173-
}}>
174-
<FormattedMessage id="analysis.analysis.all-week" defaultMessage="All Week"/>
175-
</a>
176-
<a className={styles.currentDate} onClick={() => {
177-
deviceTime('30d');
178-
setTime(timeMap['30d']);
179-
}}>
180-
<FormattedMessage id="analysis.analysis.all-month" defaultMessage="All Month"/>
181-
</a>
150+
<Radio.Group defaultValue="1h" onChange={deviceTime}>
151+
<Radio.Button value="1h">
152+
1小时
153+
</Radio.Button>
154+
<Radio.Button value="1d">
155+
1天
156+
</Radio.Button>
157+
<Radio.Button value="7d">
158+
7天
159+
</Radio.Button>
160+
<Radio.Button value="30d">
161+
30天
162+
</Radio.Button>
163+
</Radio.Group>
182164
</div>
183165
<DatePicker showTime defaultValue={moment(new Date(), 'yyyy-MM-dd HH:mm:ss')}
184166
placeholder="结束时间" onOk={onOk} format="YYYY-MM-DD HH:mm:ss"/>
+240-68
Original file line numberDiff line numberDiff line change
@@ -1,79 +1,251 @@
1-
import React from 'react';
2-
import { Card, Col, DatePicker, Row, Tabs } from 'antd';
3-
import { FormattedMessage } from 'umi-plugin-react/locale';
1+
import React, { useEffect, useState } from 'react';
2+
import { Card, Col, DatePicker, message, Radio, Row, Tabs } from 'antd';
43
import styles from '../style.less';
54
import { ISalesData } from '../data';
6-
import { RangePickerValue } from 'antd/es/date-picker/interface';
75
import Grouped from './Charts/Grouped/index';
6+
import apis from '@/services';
7+
import { State } from '@/pages/analysis/components/SalesCard';
8+
import moment from 'moment';
9+
import Select from 'antd/es/select';
810

9-
const { RangePicker } = DatePicker;
1011
const { TabPane } = Tabs;
1112

12-
const TopSearch = ({
13-
rangePickerValue,
14-
salesData,
15-
isActive,
16-
handleRangePickerChange,
17-
loading,
18-
selectDate,
19-
}: {
20-
rangePickerValue: RangePickerValue;
21-
isActive: (key: 'today' | 'week' | 'month' | 'year') => string;
22-
salesData: ISalesData[];
23-
loading: boolean;
24-
handleRangePickerChange: (dates: RangePickerValue, dateStrings: [string, string]) => void;
25-
selectDate: (key: 'today' | 'week' | 'month' | 'year') => void;
26-
}) => (
27-
<Card loading={loading} bordered={false} bodyStyle={{ padding: 0,marginTop: 24 }}>
28-
<div className={styles.salesCard}>
29-
<Tabs
30-
tabBarExtraContent={
31-
<div className={styles.salesExtraWrap}>
32-
<div className={styles.salesExtra}>
33-
<a className={isActive('today')} onClick={() => selectDate('today')}>
34-
<FormattedMessage id="analysis.analysis.all-day" defaultMessage="All Day"/>
35-
</a>
36-
<a className={isActive('week')} onClick={() => selectDate('week')}>
37-
<FormattedMessage id="analysis.analysis.all-week" defaultMessage="All Week"/>
38-
</a>
39-
<a className={isActive('month')} onClick={() => selectDate('month')}>
40-
<FormattedMessage id="analysis.analysis.all-month" defaultMessage="All Month"/>
41-
</a>
42-
<a className={isActive('year')} onClick={() => selectDate('year')}>
43-
<FormattedMessage id="analysis.analysis.all-year" defaultMessage="All Year"/>
44-
</a>
45-
</div>
46-
<RangePicker
47-
value={rangePickerValue}
48-
onChange={handleRangePickerChange}
49-
style={{ width: 200 }}
50-
/>
51-
</div>
13+
export interface State {
14+
gatewayDataList: any[];
15+
ticksDataList: any[];
16+
currentTime: string;
17+
time: string;
18+
selectionTime: string;
19+
productDataList: any[];
20+
defaultList: any[];
21+
dataList: ISalesData[];
22+
state: string;
23+
productId: any[];
24+
productData: any;
25+
}
26+
27+
const TopSearch = ({ loading }: { loading: boolean; }) => {
28+
29+
let gatewayMonitor: (from: string, to: string, time: string, productId: any[]) => void;
30+
31+
const initState: State = {
32+
gatewayDataList: [],
33+
ticksDataList: [],
34+
currentTime: '',
35+
time: '',
36+
selectionTime: '',
37+
productDataList: [],
38+
defaultList: [],
39+
dataList: [],
40+
state: '',
41+
productId: [],
42+
productData: {},
43+
};
44+
45+
const [productDataList, setProductDataList] = useState(initState.productDataList);
46+
const [defaultList, setDefaultList] = useState(initState.defaultList);
47+
const [dataList, setDataList] = useState(initState.dataList);
48+
const [stateType, setState] = useState(initState.state);
49+
const [productId, setProductId] = useState(initState.productId);
50+
const [productData, setProductData] = useState(initState.productData);
51+
52+
const [gatewayData, setGatewayData] = useState(initState.gatewayDataList);
53+
const [ticksDataList, setTicksDataList] = useState(initState.ticksDataList);
54+
const [time, setTime] = useState(initState.time);
55+
const [selectionTime, setSelectionTime] = useState(initState.selectionTime);
56+
57+
const calculationDate = (val: number) => {
58+
const dd = new Date();
59+
dd.setDate(dd.getDate() - val);
60+
return `${dd.getFullYear()}-${(dd.getMonth() + 1) < 10 ? `0${dd.getMonth() + 1}` : (dd.getMonth() + 1)}-${dd.getDate() < 10 ? `0${dd.getDate()}` : dd.getDate()} ${dd.getHours() < 10 ? `0${dd.getHours()}` : dd.getHours()}:${dd.getMinutes() < 10 ? `0${dd.getMinutes()}` : dd.getMinutes()}:${dd.getSeconds() < 10 ? `0${dd.getSeconds()}` : dd.getSeconds()}`;
61+
};
62+
63+
const timeMap = {
64+
'1h': '1m',
65+
'1d': '24m',
66+
'7d': '168m',
67+
'30d': '12h',
68+
};
69+
70+
useEffect(() => {
71+
apis.deviceProdcut
72+
.queryNoPagin()
73+
.then(response => {
74+
const tempResult = response?.result;
75+
if (tempResult) {
76+
let list = [];
77+
for (let i = 0; i < tempResult.length; i++) {
78+
productData[tempResult[i].id] = tempResult[i].name;
79+
productDataList.push(<Select.Option key={tempResult[i].id}>{tempResult[i].name}</Select.Option>);
80+
if (i < 6) {
81+
list.push(tempResult[i].id);
82+
setDefaultList(defaultList.push(tempResult[i].id));
83+
}
84+
}
85+
setProductId(list);
86+
let da = new Date();
87+
da.setHours(da.getHours() - 1);
88+
setSelectionTime(calculationDate(0));
89+
setTime('1m');
90+
91+
gatewayMonitor(formatData(da), calculationDate(0), '1m',defaultList);
5292
}
53-
size="large"
54-
tabBarStyle={{ marginBottom: 24 }}
55-
>
56-
<TabPane
57-
tab={'设备消息量'}
58-
key="sales"
93+
})
94+
.catch(() => {
95+
});
96+
}, []);
97+
98+
gatewayMonitor = (from, to, time, productId) => {
99+
100+
let formatData = '';
101+
102+
if (time === '1m') {
103+
formatData = 'HH时mm分';
104+
} else if (time === '12h') {
105+
formatData = 'MM月dd日HH时';
106+
} else {
107+
formatData = 'MM月dd日HH时mm分';
108+
}
109+
const list = [];
110+
productId.forEach(item => {
111+
list.push({
112+
'dashboard': 'device',
113+
'object': 'message',
114+
'measurement': 'quantity',
115+
'dimension': 'agg',
116+
'group': item,
117+
'params': {
118+
'productId': item,
119+
'time': time || '1m',
120+
'format': formatData,
121+
'from': from,
122+
'to': to,
123+
},
124+
});
125+
});
126+
127+
apis.analysis.getMulti(list)
128+
.then((response: any) => {
129+
const tempResult = response?.result;
130+
if (tempResult) {
131+
const dataList = [];
132+
tempResult.forEach(item => {
133+
dataList.push({
134+
label: productData[item.group],
135+
消息量: item.data.value
136+
});
137+
});
138+
setGatewayData(dataList);
139+
}
140+
});
141+
};
142+
143+
function handleChange(value) {
144+
if (value.length > 6) {
145+
message.error('设备型号最多只能勾选6个');
146+
return false;
147+
}
148+
setProductId(value);
149+
const dd = new Date(selectionTime);
150+
gatewayMonitor(formatData(dd), formatData(new Date()), time, value);
151+
}
152+
153+
function deviceTime(e) {
154+
const value = e.target.value;
155+
setTime(timeMap[value]);
156+
const dd = new Date(selectionTime);
157+
158+
if (value === '1h') {
159+
dd.setHours(dd.getHours() - 1);
160+
} else if (value === '1d') {
161+
dd.setDate(dd.getDate() - 1);
162+
} else if (value === '7d') {
163+
dd.setDate(dd.getDate() - 7);
164+
} else if (value === '30d') {
165+
dd.setDate(dd.getDate() - 30);
166+
}
167+
gatewayMonitor(formatData(dd), formatData(new Date()), timeMap[value], productId);
168+
}
169+
170+
const formatData = (value: string) => {
171+
const dd = new Date(value);
172+
return `${dd.getFullYear()}-${(dd.getMonth() + 1) < 10 ? `0${dd.getMonth() + 1}` : (dd.getMonth() + 1)}-${dd.getDate() < 10 ? `0${dd.getDate()}` : dd.getDate()} ${dd.getHours() < 10 ? `0${dd.getHours()}` : dd.getHours()}:${dd.getMinutes() < 10 ? `0${dd.getMinutes()}` : dd.getMinutes()}:${dd.getSeconds() < 10 ? `0${dd.getSeconds()}` : dd.getSeconds()}`;
173+
};
174+
175+
function onOk(value) {
176+
setSelectionTime(value);
177+
const dd = new Date(value);
178+
if (time === '1m') {
179+
dd.setHours(dd.getHours() - 1);
180+
} else if (time === '24m') {
181+
dd.setDate(dd.getDate() - 1);
182+
} else if (time === '168m') {
183+
dd.setDate(dd.getDate() - 7);
184+
} else if (time === '12h') {
185+
dd.setDate(dd.getDate() - 30);
186+
}
187+
gatewayMonitor(formatData(dd), formatData(value), time, productId);
188+
}
189+
190+
return (
191+
<Card loading={loading} bordered={false} bodyStyle={{ padding: 0, marginTop: 24 }}>
192+
<div className={styles.salesCard}>
193+
<Tabs
194+
tabBarExtraContent={
195+
<div className={styles.salesExtraWrap}>
196+
<div className={styles.salesExtra}>
197+
<Radio.Group defaultValue="1h" onChange={deviceTime}>
198+
<Radio.Button value="1h">
199+
1小时
200+
</Radio.Button>
201+
<Radio.Button value="1d">
202+
1天
203+
</Radio.Button>
204+
<Radio.Button value="7d">
205+
7天
206+
</Radio.Button>
207+
<Radio.Button value="30d">
208+
30天
209+
</Radio.Button>
210+
</Radio.Group>
211+
</div>
212+
<DatePicker showTime defaultValue={moment(new Date(), 'yyyy-MM-dd HH:mm:ss')}
213+
placeholder="结束时间" onOk={onOk} format="YYYY-MM-DD HH:mm:ss"/>
214+
</div>
215+
}
216+
size="large"
217+
tabBarStyle={{ marginBottom: 24 }}
59218
>
60-
<Row>
61-
<Col>
62-
<div className={styles.salesBar}>
63-
<Grouped
64-
height={400}
65-
title={
66-
'连接数量'
67-
}
68-
data={salesData}
69-
/>
219+
<TabPane
220+
tab={'设备消息量'}
221+
key="sales"
222+
>
223+
<Row>
224+
<div>
225+
<Select mode="tags" defaultValue={defaultList} maxTagTextLength={3}
226+
maxTagCount={3}
227+
style={{ width: '50%', float: 'right', marginBottom: 32, marginRight: 25 }}
228+
placeholder="设备型号" onChange={handleChange}>
229+
{productDataList}
230+
</Select>
70231
</div>
71-
</Col>
72-
</Row>
73-
</TabPane>
74-
</Tabs>
75-
</div>
76-
</Card>
77-
);
232+
<Col>
233+
<div className={styles.salesBar} style={{ marginTop: 30 }}>
234+
<Grouped
235+
height={300}
236+
title={
237+
'连接数量'
238+
}
239+
data={gatewayData}
240+
/>
241+
</div>
242+
</Col>
243+
</Row>
244+
</TabPane>
245+
</Tabs>
246+
</div>
247+
</Card>
248+
);
249+
};
78250

79251
export default TopSearch;

‎src/pages/analysis/index.tsx

+1-39
Original file line numberDiff line numberDiff line change
@@ -7,7 +7,6 @@ import styles from './style.less';
77
import PageLoading from './components/PageLoading';
88
import { Dispatch } from 'redux';
99
import { IAnalysisData } from './data.d';
10-
import { RadioChangeEvent } from 'antd/es/radio';
1110
import { GridContent } from '@ant-design/pro-layout';
1211
import getFakeChartData from './mock-data';
1312

@@ -69,18 +68,6 @@ class Analysis extends Component<analysisProps, analysisState> {
6968
clearTimeout(this.timeoutId);
7069
}
7170

72-
handleChangeSalesType = (e: RadioChangeEvent) => {
73-
this.setState({
74-
salesType: e.target.value,
75-
});
76-
};
77-
78-
handleTabChange = (key: string) => {
79-
this.setState({
80-
currentTabKey: key,
81-
});
82-
};
83-
8471
handleRangePickerChange = (rangePickerValue: RangePickerValue) => {
8572
const { dispatch } = this.props;
8673
this.setState({
@@ -119,28 +106,12 @@ class Analysis extends Component<analysisProps, analysisState> {
119106
};
120107

121108
render() {
122-
const { rangePickerValue, salesType, currentTabKey } = this.state;
123-
const { analysis, loading } = this.props;
109+
const { loading } = this.props;
124110
const {
125111
visitData,
126112
messageData,
127-
visitData2,
128-
salesData,
129-
searchData,
130-
offlineData,
131-
offlineChartData,
132-
salesTypeData,
133-
salesTypeDataOnline,
134-
salesTypeDataOffline,
135113
} = getFakeChartData;
136-
let salesPieData;
137-
if (salesType === 'all') {
138-
salesPieData = salesTypeData;
139-
} else {
140-
salesPieData = salesType === 'online' ? salesTypeDataOnline : salesTypeDataOffline;
141-
}
142114

143-
const activeKey = currentTabKey || (offlineData[0] && offlineData[0].name);
144115
return (
145116
<GridContent>
146117
<React.Fragment>
@@ -149,7 +120,6 @@ class Analysis extends Component<analysisProps, analysisState> {
149120
</Suspense>
150121
<Suspense fallback={null}>
151122
<SalesCard
152-
/* rangePickerValue={rangePickerValue}*/
153123
isActive={this.isActive}
154124
handleRangePickerChange={this.handleRangePickerChange}
155125
loading={loading}
@@ -160,22 +130,14 @@ class Analysis extends Component<analysisProps, analysisState> {
160130
<Col xl={12} lg={24} md={24} sm={24} xs={24}>
161131
<Suspense fallback={null}>
162132
<ProportionSales
163-
salesType={salesType}
164133
loading={loading}
165-
salesPieData={salesPieData}
166-
handleChangeSalesType={this.handleChangeSalesType}
167134
/>
168135
</Suspense>
169136
</Col>
170137
<Col xl={12} lg={24} md={24} sm={24} xs={24}>
171138
<Suspense fallback={null}>
172139
<TopSearch
173-
rangePickerValue={rangePickerValue}
174-
salesData={salesData}
175-
isActive={this.isActive}
176-
handleRangePickerChange={this.handleRangePickerChange}
177140
loading={loading}
178-
selectDate={this.selectDate}
179141
/>
180142
</Suspense>
181143
</Col>

‎src/pages/analysis/mock-data.ts

+2-79
Original file line numberDiff line numberDiff line change
@@ -5,6 +5,7 @@ import { IVisitData, IRadarData, IAnalysisData, ISalesData, IGatewayData } from
55
const visitData: IVisitData[] = [];
66
const messageData :IVisitData[] = [];
77
const gatewayData :IGatewayData[] = [];
8+
const salesPieData :ISalesData[] = [];
89

910
const beginDay = new Date().getTime();
1011

@@ -34,82 +35,6 @@ for (let i = 0; i < 50; i += 1) {
3435
status: Math.floor((Math.random() * 10) % 2),
3536
});
3637
}
37-
const salesTypeData = [
38-
{
39-
x: '智能门锁',
40-
y: 4544,
41-
},
42-
{
43-
x: '台灯',
44-
y: 3321,
45-
},
46-
{
47-
x: '网关',
48-
y: 3113,
49-
},
50-
{
51-
x: '空调',
52-
y: 2341,
53-
},
54-
{
55-
x: '烟感',
56-
y: 1231,
57-
},
58-
{
59-
x: '其他',
60-
y: 1231,
61-
},
62-
];
63-
64-
const salesTypeDataOnline = [
65-
{
66-
x: '智能门锁',
67-
y: 244,
68-
},
69-
{
70-
x: '烟感设备',
71-
y: 321,
72-
},
73-
{
74-
x: '智能空调',
75-
y: 311,
76-
},
77-
{
78-
x: '蓝牙网关',
79-
y: 41,
80-
},
81-
{
82-
x: '智能音响',
83-
y: 121,
84-
},
85-
{
86-
x: '其他',
87-
y: 111,
88-
},
89-
];
90-
91-
const salesTypeDataOffline = [
92-
{
93-
x: '智能台灯',
94-
y: 99,
95-
},
96-
{
97-
x: '烟感器',
98-
y: 188,
99-
},
100-
{
101-
x: '智能冰箱',
102-
y: 344,
103-
},
104-
{
105-
x: '智能插座',
106-
y: 255,
107-
},
108-
{
109-
x: '其他',
110-
y: 65,
111-
},
112-
];
11338

11439
const offlineData = [];
11540
for (let i = 0; i < 10; i += 1) {
@@ -182,9 +107,7 @@ const getFakeChartData: IAnalysisData = {
182107
searchData,
183108
offlineData,
184109
offlineChartData,
185-
salesTypeData,
186-
salesTypeDataOnline,
187-
salesTypeDataOffline,
110+
salesPieData,
188111
radarData,
189112
gatewayData,
190113
};

0 commit comments

Comments
 (0)
Please sign in to comment.