Browse Source

总体统计图完善

zhuth 7 years ago
parent
commit
b6245f4f5d

+ 50 - 13
src/components/chartDesigner/header.jsx

@@ -1,15 +1,16 @@
 import React from 'react'
-import { Input, Icon, Button, Popconfirm } from 'antd'
+import { Input, Icon, Button, Popconfirm, Tooltip, Modal } from 'antd'
 import { connect } from 'dva'
 import { ActionCreators } from 'redux-undo'
-import '../../models/chartDesigner'
 import './header.less'
 
 class Header extends React.Component {
     constructor(props) {
         super(props);
         this.state = {
-            visibleConfirm: false
+            visibleConfirm: false,
+            visibleCopyBox: false,
+            newHeaderLabel: ''
         }
     }
 
@@ -17,8 +18,18 @@ class Header extends React.Component {
         this.setState({ visibleConfirm: visible });
     }
 
+    copyHandler = () => {
+        const { dispatch } = this.props;
+        this.setState({
+            visibleCopyBox: false
+        }, () => {
+            dispatch({ type: 'chartDesigner/remoteCopyAdd', newHeaderLabel: this.state.newHeaderLabel });
+        });
+    }
+
     render() {
         const { chartDesigner, dispatch } = this.props;
+        const { newHeaderLabel } = this.state;
         return (
             <div className='header'>
                 <div className='header-item toolbar-back'>
@@ -40,8 +51,8 @@ class Header extends React.Component {
                             });
                             dispatch({ type: 'main/redirect', path: '/chart' });
                         }}
-                        okText="是的"
-                        cancelText="不必了"
+                        okText="保存"
+                        cancelText="不保存"
                     >
                         <Button onClick={() => {
                             if(chartDesigner.dirty) {
@@ -80,14 +91,40 @@ class Header extends React.Component {
                     />
                 </div>
                 <div className='header-item toolbar-buttons'>
-                    <div className=''>
-                        <Button className='button-uodo' icon='undo' onClick={() => {
-                            dispatch(ActionCreators.undo());
-                        }}>撤销</Button>
-                        <Button className='button-redo' icon='redo' onClick={() => {
-                            dispatch(ActionCreators.redo());
-                        }}>重做</Button>
-                        <Button className='button-uodo' >预览</Button>
+                    <div>
+                        <Tooltip title='复制新增'>
+                            <Button shape="circle" icon='copy' onClick={() => {
+                                this.setState({
+                                    visibleCopyBox: true,
+                                    newHeaderLabel: chartDesigner.header.label + '_副本'
+                                })
+                            }}>
+                            </Button>
+                        </Tooltip>
+                        <Modal
+                            title="以当前图表配置创建新的图表副本"
+                            visible={this.state.visibleCopyBox}
+                            okText='创建'
+                            onOk={this.copyHandler}
+                            onCancel={() => {this.setState({visibleCopyBox:false})}}
+                        >
+                            <p>当前的图表会被保存,您将从新的图表副本继续设计。</p>
+                            副本名称:<Input value={newHeaderLabel} placeholder={chartDesigner.header.label+'_副本'} onChange={(e) => {
+                                this.setState({
+                                    newHeaderLabel: e.target.value
+                                });
+                            }} />
+                        </Modal>
+                        <Tooltip title='撤销'>
+                            <Button shape="circle" icon='undo' onClick={() => {
+                                dispatch(ActionCreators.undo());
+                            }}></Button>
+                        </Tooltip>
+                        <Tooltip title='重做'>
+                            <Button shape="circle" icon='redo' onClick={() => {
+                                dispatch(ActionCreators.redo());
+                            }}></Button>
+                        </Tooltip>
                     </div>
                 </div>
             </div>

+ 3 - 0
src/components/chartDesigner/header.less

@@ -33,4 +33,7 @@
             }
         }
     }
+}
+.ant-tooltip-arrow {
+    border-bottom-color: rgba(255,255,255,.75) !important;
 }

+ 8 - 6
src/components/chartDesigner/sections/aggregateTableConfigForm.jsx

@@ -10,37 +10,39 @@ class AggregateTableConfigForm extends React.Component {
 	render() {
 		const props = this.props;
 		const { formItemLayout, chartDesigner, dispatch } = props;
-		const columns = chartDesigner.columns;
+		const { columns, aggregateTableConfig } = chartDesigner;
         
 		return (
 			<Form>
 				<FormItem label='分析目标' {...formItemLayout}>
 					<Select
-						value={props.chartDesigner.aggregateTableConfig.targetColumn}
+						value={aggregateTableConfig.targetColumn.name}
 						onChange={(value) => {
-							dispatch({ type: 'chartDesigner/changeField', name: 'aggregateTableConfig', value: { ...chartDesigner.aggregateTableConfig, targetColumn: value } });
+							let column = columns.filter(c => c.name === value)[0];
+							dispatch({ type: 'chartDesigner/changeField', name: 'aggregateTableConfig', value: { ...chartDesigner.aggregateTableConfig, targetColumn: column, statistics: [] } });
 						}}
 					>
-						{columns.filter(c => c.type === 'scale' || c.type === 'ordinal').map((c, i)=>{
+						{columns.map((c, i)=>{
 							return (<Option key={i} value={c.name}>{c.label}</Option>)
 						})}
 					</Select>
 				</FormItem>
 				<FormItem label='显示总体数据' {...formItemLayout}>
 					<CheckboxGroup
-						value={chartDesigner.aggregateTableConfig.statistics}
+						value={aggregateTableConfig.statistics}
 						onChange={(value) => {
 							dispatch({ type: 'chartDesigner/changeField', name: 'aggregateTableConfig', value: { ...props.chartDesigner.aggregateTableConfig, statistics: value } });
 						}}
 					>
 						<Row>
-							{STATISTICS_OPTION.map((s)=>{return <Col span={12} key={s.value}><Checkbox value={s.value}>{s.label}</Checkbox></Col>})}
+							{STATISTICS_OPTION.map((s)=>{return <Col span={12} key={s.value}><Checkbox disabled={s.columnType.indexOf(aggregateTableConfig.targetColumn.type) === -1} value={s.value}>{s.label}</Checkbox></Col>})}
 						</Row>
 						
 					</CheckboxGroup>
 				</FormItem>
 				<FormItem label='分组' {...formItemLayout}>
 					<Select
+						mode='multiple'
 						labelInValue={true}
 						placeholder='请选择...'
 						allowClear={true}

+ 1 - 3
src/components/chartDesigner/sections/baseConfigForm.jsx

@@ -1,8 +1,6 @@
 import React from 'react'
 import { Form, Select, Icon } from 'antd'
 import { connect } from 'dva'
-import '../../../models/chartDesigner'
-import '../../../models/dataSource'
 import CHART_TYPE from './chartType.json'
 import './baseConfigForm.less'
 const FormItem = Form.Item
@@ -45,7 +43,7 @@ class baseConfigForm extends React.Component {
 							<Option key={c.type} value={c.type} title={c.label}>
 								<div className='viewtype-box'>
 									{/* <div className={`viewtype-icon viewtype-${c.type}`}> */}
-									<Icon className='viewtype-icon' type={'chart-' + c.type} />
+									<Icon className='viewtype-icon' type={c.icon} />
 									{/* </div> */}
 									<div className='viewtype-text'>
 										{c.label}

+ 12 - 6
src/components/chartDesigner/sections/chartType.json

@@ -1,19 +1,25 @@
 [{
     "type": "aggregateTable",
-    "label": "总体统计数据表"
+    "label": "总体统计数据表",
+    "icon": "table"
 }, {
     "type": "dataView",
-    "label": "个体统计数据表"
+    "label": "数据视图",
+    "icon": "table"
 }, {
     "type": "line",
-    "label": "折线图"
+    "label": "折线图",
+    "icon": "chart-line"
 }, {
     "type": "bar",
-    "label": "柱状图"
+    "label": "柱状图",
+    "icon": "chart-bar"
 }, {
     "type": "pie",
-    "label": "饼图"
+    "label": "饼图",
+    "icon": "chart-pie"
 }, {
     "type": "scatter",
-    "label": "散点图"
+    "label": "散点图",
+    "icon": "chart-scatter"
 }]

+ 10 - 38
src/components/chartDesigner/sections/dataViewConfigForm.jsx

@@ -1,5 +1,5 @@
 import React from 'react'
-import { Form, Select, Cascader } from 'antd'
+import { Form, Select } from 'antd'
 import { connect } from 'dva'
 const FormItem = Form.Item
 const { Option } = Select
@@ -26,45 +26,17 @@ class DataViewConfigForm extends React.Component {
 					</Select>
 				</FormItem>
 				<FormItem label='排序列' {...formItemLayout}>
-					<Cascader
-						// value={[chartDesigner.dataViewConfig.sortColumn.name, chartDesigner.dataViewConfig.sortColumn.sortType]}
-						allowClear={true}
-						options={columns.filter(c =>['ordinal', 'categorical', 'time'].indexOf(c.type) !== -1).map((c, i)=>{
-							
-							return {
-								type: c.type,
-								value: c.name,
-								label: c.label,
-							}
-						})}
-						onChange={(value, items) => {
-							// let column = {};
-							// let granularity = {};
-							// if(items.length > 0) {
-							// 	column = { type: items[0].type, value: items[0].value, label: items[0].label };
-							// }
-							// if(items.length > 1) {
-							// 	granularity = { value: items[1].value, label: items[1].label };
-							// }
-							// dispatch({ type: 'chartDesigner/changeField', name: 'sortColumn', value: { ...chartDesigner.dataViewConfig, sortColumn: { column, granularity } } });
-						}}
-						displayRender={(label, selectedOptions) => {
-							let text = '';
-							let className = 'cascader-label';
-							if(label.length > 0) {
-								className += ' full-label';
-								text += label[0];
-								if(label.length > 1) {
-									text += '(' + label[1] + ')';
-								}
-							}else {
-								className += ' empty-label';
-								text = '请选择...';
-							}
-							return <div className={className}>{text}</div>;
+					<Select
+						allowClear
+						value={chartDesigner.dataViewConfig.sortColumn}
+						onChange={(value) => {
+							dispatch({ type: 'chartDesigner/changeField', name: 'dataViewConfig', value: { ...chartDesigner.dataViewConfig, sortColumn: value }});
 						}}
 					>
-					</Cascader>
+						{columns.filter(c => chartDesigner.dataViewConfig.viewColumns.indexOf(c.name) !== -1 ).map((c, i)=>{
+							return <Option key={i} value={c.name}>{c.label}</Option>
+						})}
+					</Select>
 				</FormItem>
 			</Form>
         );

+ 11 - 6
src/components/datasource/columnConfig.jsx

@@ -1,5 +1,5 @@
 import React from 'react'
-import { Form, Input, Button, Select, Table, Checkbox, Switch, Divider } from 'antd'
+import { Form, Input, Button, Select, Table, Checkbox, Switch, Divider, Icon } from 'antd'
 import { connect } from 'dva'
 import COLUMN_TYPE from './columnType.json'
 const FormItem = Form.Item
@@ -20,7 +20,7 @@ class DataSourceColumnConfig extends React.Component {
 
     render() {
 
-        const { dataSource, dispatch } = this.props;
+        const { dataSource, dispatch, loading } = this.props;
 
         const columns = [{
             title: <div><Checkbox
@@ -205,9 +205,14 @@ class DataSourceColumnConfig extends React.Component {
                                 </FormItem>
                                 <div className='buttons'>
                                     <div className='errormessage' style={{ cursor: dataSource.newOne.invalidSQL ? 'text' : 'default', opacity: dataSource.newOne.invalidSQL ? '1' : '0' }}>未查询到列数据,请检查SQL是否正确</div>
-                                    <Button disabled={!dataSource.newOne.address} onClick={() => {
+                                    <Button disabled={!dataSource.newOne.address || loading.models.dataSource} onClick={() => {
                                         dispatch({ type: 'dataSource/importNewModelColumns' })
-                                    }}>获取列数据</Button>
+                                    }}>
+                                    {
+                                        loading.models.dataSource ? <Icon type="loading" /> : ''
+                                    }
+                                    {'获取数据列'}
+                                    </Button>
                                 </div>
                             </Form>
                             <Divider orientation="left">数据列</Divider>
@@ -227,8 +232,8 @@ class DataSourceColumnConfig extends React.Component {
     }
 }
 
-function mapStateToProps({ present: { dataSource, dataConnect } }) {
-    return { dataSource, dataConnect }
+function mapStateToProps({ present: { dataSource, dataConnect, loading } }) {
+    return { dataSource, dataConnect, loading }
 }
 
 export default connect(mapStateToProps)(DataSourceColumnConfig);

+ 2 - 2
src/custom.less

@@ -1,5 +1,5 @@
-@import "/public/fonts/iconfont/custom/iconfont.css"; // 引入自定义的 iconfont
-@icon-url: "/public/fonts/iconfont/default"; // 把默认的 iconfont 地址改到本地
+@import "/fonts/iconfont/custom/iconfont.css"; // 引入自定义的 iconfont
+@icon-url: "/fonts/iconfont/default"; // 把默认的 iconfont 地址改到本地
 
 :global(.anticon) {
     &:before {

+ 58 - 15
src/models/chart.js

@@ -159,7 +159,11 @@ export default {
                         }else if(type === 'Pie') {
                             return 'pie';
                         }else if(type === 'scatter') {
-                            return 'scatter'
+                            return 'scatter';
+                        }else if(type === 'population') {
+                            return 'aggregateTable';
+                        }else if(type === 'individual') {
+                            return 'dataView';
                         }else {
                             return '';
                         }
@@ -171,6 +175,12 @@ export default {
                     let otherConfig = JSON.parse(resData.otherConfig || '{}');
                     let viewType = getViewType(resData.chartType);
 
+                    let g = groupBy.map(g => {
+                        return {
+                            key: g.columnName.toLowerCase(),
+                            label: g.columnRename
+                        }
+                    })
                     let data = {
                         code: resData.chartId,
                         header: {
@@ -180,14 +190,6 @@ export default {
                             dataSource: resData.dataId,
                             viewType: viewType
                         },
-                        preparing: {
-                            groupBy: groupBy.map(g => {
-                                return {
-                                    key: g.columnName,
-                                    label: g.columnRename
-                                }
-                            })[0]
-                        },
                         otherConfig: otherConfig,
                         description: resData.describes,
                         groupCode: resData.chartsGroup+'' === '-1' ? 'all' : resData.chartsGroup
@@ -195,12 +197,28 @@ export default {
 
                     if(viewType === 'bar') {
                         data.barConfig = chartConfig;
+                        data.preparing = {
+                            groupBy: g[0]
+                        };
                     }else if(viewType === 'pie') {
                         data.pieConfig = chartConfig;
                     }else if(viewType === 'line') {
                         data.lineConfig = chartConfig;
+                        data.preparing = {
+                            groupBy: g[0]
+                        };
                     }else if(viewType === 'scatter') {
                         data.scatterConfig = chartConfig;
+                        data.preparing = {
+                            groupBy: g[0]
+                        };
+                    }else if(viewType === 'aggregateTable') {
+                        data.aggregateTableConfig = chartConfig;
+                        data.preparing = {
+                            groupBy: g
+                        };
+                    }else if(viewType === 'dataView') {
+                        data.dataViewConfig = chartConfig;
                     }
 
                     let fields = [];
@@ -210,6 +228,7 @@ export default {
                             value: data[key]
                         })
                     }
+                    console.log(fields);
                     yield put({ type: 'chartDesigner/defaultChangeFields', fields: fields });
                     
                     yield put({ type: 'chartDesigner/changeDataSource', value: {
@@ -234,7 +253,7 @@ export default {
                     dataId: baseConfig.dataSource,
                     groupBy: preparing.groupBy && preparing.groupBy.key ? [{
                         columnName: preparing.groupBy.key,
-                        columnRamane: preparing.groupBy.label
+                        columnRename: preparing.groupBy.label
                     }] : [],
                     createBy: 'zhuth',
                     describes: description,
@@ -271,16 +290,12 @@ export default {
         *remoteModify(action, { select, call, put }) {
             try{
                 const chartDesigner = yield select(state => state.present.chartDesigner);
-                const { code, header, baseConfig, pieConfig, lineConfig, preparing,
+                const { code, header, baseConfig, pieConfig, lineConfig, aggregateTableConfig, dataViewConfig, preparing,
                     barConfig, scatterConfig, otherConfig, description, group } = chartDesigner;
                 let body = {
                     chartId: code,
                     chartName: header.label,
                     dataId: baseConfig.dataSource,
-                    groupBy: preparing.groupBy ? [{
-                        columnName: preparing.groupBy.key,
-                        columnRamane: preparing.groupBy.label
-                    }] : [],
                     createBy: 'zhuth',
                     describes: description,
                     style: '',
@@ -290,15 +305,43 @@ export default {
                 if(baseConfig.viewType === 'bar') {
                     body.chartType = 'Histogram';
                     body.chartConfig = JSON.stringify(barConfig);
+                    body.groupBy = preparing.groupBy ? [{
+                        columnName: preparing.groupBy.key,
+                        columnRename: preparing.groupBy.label
+                    }] : []
                 }else if(baseConfig.viewType === 'pie') {
                     body.chartType = 'Pie';
                     body.chartConfig = JSON.stringify(pieConfig);
                 }else if(baseConfig.viewType === 'line') {
                     body.chartType = 'Line';
                     body.chartConfig = JSON.stringify(lineConfig);
+                    body.groupBy = preparing.groupBy ? [{
+                        columnName: preparing.groupBy.key,
+                        columnRename: preparing.groupBy.label
+                    }] : []
                 }else if(baseConfig.viewType === 'scatter') {
                     body.chartType = 'scatter';
                     body.chartConfig = JSON.stringify(scatterConfig);
+                    body.groupBy = preparing.groupBy ? [{
+                        columnName: preparing.groupBy.key,
+                        columnRename: preparing.groupBy.label
+                    }] : []
+                }else if(baseConfig.viewType === 'aggregateTable') {
+                    body.chartType = 'population';
+                    body.chartConfig = JSON.stringify(aggregateTableConfig);
+                    body.groupBy = preparing.groupBy && preparing.groupBy.length > 0 ? preparing.groupBy.map(g => {
+                        return {
+                            columnName: g.key,
+                            columnRename: g.label
+                        }
+                    }) : []
+                    // body.groupBy = preparing.groupBy ? [{
+                    //     columnName: preparing.groupBy.key,
+                    //     columnRename: preparing.groupBy.label
+                    // }] : [],
+                }else if(baseConfig.viewType === 'dataView') {
+                    body.chartType = 'individual';
+                    body.chartConfig = JSON.stringify(dataViewConfig);
                 }
                 console.log(body);
                 const res = yield call(service.fetch, {

+ 104 - 22
src/models/chartDesigner.js

@@ -11,7 +11,7 @@ export default {
             header: { label: '未命名' },
             baseConfig: { dataSource: '', viewType: '' },
             preparing: { groupBy: {} },
-            aggregateTableConfig: {},
+            aggregateTableConfig: { targetColumn: {}, statistics: [] },
             dataViewConfig: {},
             barConfig: { xAxis: { column: {}, granularity: {} }, yAxis: { column: {}, gauge: {} } },
             lineConfig: { xAxis: { column: {}, granularity: {} }, yAxis: { column: {}, gauge: {} } },
@@ -38,7 +38,8 @@ export default {
             groupBy: []
         },
         aggregateTableConfig: {
-
+            targetColumn: {},
+            statistics: []
         },
         dataViewConfig: {
             viewColumns: [],
@@ -231,6 +232,7 @@ export default {
                 if(!res.err && res.data.data > 0) {
                     yield put({ type: 'chart/fetchList', mandatory: true });
                     yield put({ type: 'main/redirect', path: '/chart/' + res.data.data });
+                    // yield put({ type: 'chart/remoteDetail', code: res.data.data });
                 }else {
                     message.error('新增失败');
                 }
@@ -239,6 +241,64 @@ export default {
                 message.error('新增失败');
             }
         },
+        /**
+         * 复制新增
+         */
+        *remoteCopyAdd(action, { select, call, put }) {
+            try{
+                yield put({ type: 'chart/remoteModify' });
+                const { newHeaderLabel } = action;
+                const chartDesigner = yield select(state => state.present.chartDesigner);
+                const { baseConfig, pieConfig, lineConfig, preparing,
+                    barConfig, scatterConfig, aggregateTableConfig, dataViewConfig, otherConfig, description, group } = chartDesigner;
+                let body = {
+                    chartName: newHeaderLabel,
+                    dataId: baseConfig.dataSource,
+                    groupBy: preparing.groupBy ? [{
+                        columnName: preparing.groupBy.key,
+                        columnRamane: preparing.groupBy.label
+                    }] : [],
+                    createBy: 'zhuth',
+                    describes: description || '',
+                    style: '',
+                    otherConfig: JSON.stringify(otherConfig),
+                    chartsGroup: group ? group : '-1',
+                }; // 基本属性
+                if(baseConfig.viewType === 'bar') {
+                    body.chartType = 'Histogram';
+                    body.chartConfig = JSON.stringify(barConfig);
+                }else if(baseConfig.viewType === 'pie') {
+                    body.chartType = 'Pie';
+                    body.chartConfig = JSON.stringify(pieConfig);
+                }else if(baseConfig.viewType === 'line') {
+                    body.chartType = 'Line';
+                    body.chartConfig = JSON.stringify(lineConfig);
+                }else if(baseConfig.viewType === 'scatter') {
+                    body.chartType = 'scatter';
+                    body.chartConfig = JSON.stringify(scatterConfig);
+                }else if(baseConfig.viewType === 'aggregateTable') {
+                    body.chartType = 'population';
+                    body.chartConfig = JSON.stringify(aggregateTableConfig);
+                }else if(baseConfig.viewType === 'dataView') {
+                    body.chartType = 'individual';
+                    body.chartConfig = JSON.stringify(dataViewConfig);
+                }
+                const res = yield call(service.fetch, {
+                    url: URLS.CHART_ADD,
+                    body: body
+                })
+                console.log('复制新增', body, res);
+                if(!res.err && res.data.code > 0) {
+                    yield put({ type: 'chart/fetchList', mandatory: true });
+                    yield put({ type: 'main/redirect', path: '/chart/' + res.data.data , reload: true});
+                }else {
+                    message.error('创建副本失败');
+                }
+            }catch(e) {
+                console.error(e);
+                message.error('创建副本失败');
+            }
+        },
         *remoteDataColumn(action, { select, call, put }) {
             const code = action.code;
             try {
@@ -246,7 +306,7 @@ export default {
                     url: URLS.DATASOURCE_QUERY_DATACOLUMNS,
                     body: code
                 });
-                console.log(code, res);
+                console.log('获得图表管理数据源列数据', code, res);
                 if(!res.err && res.data.code > 0) {
                     let resData = res.data.data;
 
@@ -485,50 +545,72 @@ export default {
             try {
                 const chartDesigner = yield select(state => state.present.chartDesigner);
                 const { code, aggregateTableConfig, preparing } = chartDesigner;
-
                 const { targetColumn, statistics } = aggregateTableConfig;
+                const { groupBy } = preparing;
+
                 const body = {
                     id: code,
-                    columnName: "Y_",
+                    columnName: targetColumn.name,
                     operatorList: statistics,
-                    groupByList: preparing.groupBy && preparing.groupBy.key ? [preparing.groupBy.key] : [],
+                    groupByList: groupBy && groupBy.length > 0 ? groupBy.map(g => g.key) : [],
                 };
                 let res = yield call(service.fetch, {
                     url: URLS.CHART_AGGREGATETABLE_OPTION,
                     body: body
                 });
-                console.log(body, res);return;
+                console.log('获得总体统计数据', body, res);
                 if(!res.err && res.data.code > 0) {
-                    let c = chartDesigner.columns.filter(c => c.name === targetColumn)[0];
                     const resData = res.data.data;
 
                     let stypes = STATISTICS_OPTION.filter(o => statistics.indexOf(o.value) !== -1);
 
-                    let columns = [{
+                    let column = {
                         title: '分析目标',
                         dataIndex: 'targetColumn'
-                    }].concat(stypes.map(st => {
-                        return {
-                            title: st.label,
-                            dataIndex: st.value
-                        }
-                    }));
-                    let data = {
-                        targetColumn: c.label
-                    }
+                    };
+                    let data = { targetColumn: targetColumn.label };
+                    let columns = [column];
+                    let dataSource = [data]
 
-                    let d = resData.valueList;
-                    for(let k in d) {
-                        data[k] = d[k]
+                    if(groupBy && groupBy.length > 0) {
+                        columns = columns.concat(groupBy.map(g => {
+                            return {
+                                title: g.label,
+                                dataIndex: g.key
+                            }
+                        })).concat(stypes.map(st => {
+                            return {
+                                title: st.label,
+                                dataIndex: st.value
+                            }
+                        }));
+                        dataSource = resData.map(d => {
+                            let obj = {};
+                            stypes.map(st => obj[st.value] = d[st.value.toUpperCase()]);
+                            groupBy.map(g => obj[g.key] = d[g.key])
+                            return { ...data, ...obj };
+                        });
+                    }else {
+                        columns = columns.concat(stypes.map(st => {
+                            dataSource = dataSource.map(d => {
+                                d[st.value] = resData[st.value.toUpperCase()]
+                                return d
+                            });
+                            return {
+                                title: st.label,
+                                dataIndex: st.value
+                            }
+                        }));
                     }
 
                     let config = {
                         viewType: 'aggregateTable',
                         option: {
                             columns: columns,
-                            data: [data]
+                            data: dataSource
                         }
                     }
+                    console.log(config);
                     yield put({ type: 'silentSetField', name: 'chartOption', value: config });
                 }else {
                     yield put({ type: 'silentSetField', name: 'chartOption', value: {} });

+ 4 - 1
src/models/main.js

@@ -13,8 +13,11 @@ export default {
     },
     effects: {
         * redirect (action, { put }) {
-            const path = action.path;
+            const { path, reload } = action;
             yield put(routerRedux.push(path || '/'));
+            if(reload) {
+                window.location.reload();
+            }
         },
     },
     subscriptions: {

+ 1 - 1
src/routes/mainLayout.js

@@ -6,7 +6,7 @@ import Welcome from '../components/myPage/welcome'
 import Loading from '../components/common/loading'
 import DataSource from '../components/datasource/dataSource'
 import DataSourceDetail from '../components/datasource/dataSourceDetail'
-import Dashboard from '../components/dashboard/dashboard'
+// import Dashboard from '../components/dashboard/dashboard'
 import Chart from '../components/chart/list'
 import './mainLayout.less';
 import Demo from '../demo';