diff --git a/backend/src/main/java/io/dataease/dto/chart/ChartViewFieldDTO.java b/backend/src/main/java/io/dataease/dto/chart/ChartViewFieldDTO.java new file mode 100644 index 0000000000..b748b624d9 --- /dev/null +++ b/backend/src/main/java/io/dataease/dto/chart/ChartViewFieldDTO.java @@ -0,0 +1,30 @@ +package io.dataease.dto.chart; + +import lombok.Data; + +/** + * @Author gin + * @Date 2021/3/11 1:18 下午 + */ +@Data +public class ChartViewFieldDTO { + private String id; + + private String tableId; + + private String originName; + + private String name; + + private String type; + + private Boolean checked; + + private Integer columnIndex; + + private Long lastSyncTime; + + private Integer deType; + + private String summary; +} diff --git a/backend/src/main/java/io/dataease/service/chart/ChartViewService.java b/backend/src/main/java/io/dataease/service/chart/ChartViewService.java index 803c3f094d..7c458d51d3 100644 --- a/backend/src/main/java/io/dataease/service/chart/ChartViewService.java +++ b/backend/src/main/java/io/dataease/service/chart/ChartViewService.java @@ -12,6 +12,7 @@ import io.dataease.datasource.provider.ProviderFactory; import io.dataease.datasource.request.DatasourceRequest; import io.dataease.datasource.service.DatasourceService; import io.dataease.dto.chart.ChartViewDTO; +import io.dataease.dto.chart.ChartViewFieldDTO; import io.dataease.dto.chart.Series; import io.dataease.dto.dataset.DataTableInfoDTO; import io.dataease.service.dataset.DataSetTableFieldsService; @@ -76,9 +77,9 @@ public class ChartViewService { public ChartViewDTO getData(String id) throws Exception { ChartViewWithBLOBs view = chartViewMapper.selectByPrimaryKey(id); - List xAxis = new Gson().fromJson(view.getXAxis(), new TypeToken>() { + List xAxis = new Gson().fromJson(view.getXAxis(), new TypeToken>() { }.getType()); - List yAxis = new Gson().fromJson(view.getYAxis(), new TypeToken>() { + List yAxis = new Gson().fromJson(view.getYAxis(), new TypeToken>() { }.getType()); List x = new ArrayList<>(); @@ -88,25 +89,25 @@ public class ChartViewService { BeanUtils.copyBean(dto, view); return dto; } - List xIds = xAxis.stream().map(DatasetTableField::getId).collect(Collectors.toList()); - List yIds = yAxis.stream().map(DatasetTableField::getId).collect(Collectors.toList()); - List xList = dataSetTableFieldsService.getListByIds(xIds); - List yList = dataSetTableFieldsService.getListByIds(yIds); +// List xIds = xAxis.stream().map(DatasetTableField::getId).collect(Collectors.toList()); +// List yIds = yAxis.stream().map(DatasetTableField::getId).collect(Collectors.toList()); +// List xList = dataSetTableFieldsService.getListByIds(xIds); +// List yList = dataSetTableFieldsService.getListByIds(yIds); - // 获取数据源 + // 获取数据集 DatasetTable table = dataSetTableService.get(view.getTableId()); + // todo 判断连接方式,直连或者定时抽取 table.mode Datasource ds = datasourceService.get(table.getDataSourceId()); - DatasourceProvider datasourceProvider = ProviderFactory.getProvider(ds.getType()); DatasourceRequest datasourceRequest = new DatasourceRequest(); datasourceRequest.setDatasource(ds); DataTableInfoDTO dataTableInfoDTO = new Gson().fromJson(table.getInfo(), DataTableInfoDTO.class); datasourceRequest.setTable(dataTableInfoDTO.getTable()); - datasourceRequest.setQuery(getSQL(ds.getType(), dataTableInfoDTO.getTable(), xList, yList)); + datasourceRequest.setQuery(getSQL(ds.getType(), dataTableInfoDTO.getTable(), xAxis, yAxis)); List data = datasourceProvider.getData(datasourceRequest); // todo 处理结果,目前做一个单系列图表,后期图表组件再扩展 - for (DatasetTableField y : yList) { + for (ChartViewFieldDTO y : yAxis) { Series series1 = new Series(); series1.setName(y.getName()); series1.setType(view.getType()); @@ -116,16 +117,16 @@ public class ChartViewService { for (String[] d : data) { StringBuilder a = new StringBuilder(); BigDecimal b = new BigDecimal("0"); - for (int i = 0; i < xList.size(); i++) { - if (i == xList.size() - 1) { + for (int i = 0; i < xAxis.size(); i++) { + if (i == xAxis.size() - 1) { a.append(d[i]); } else { a.append(d[i]).append("\n"); } } x.add(a.toString()); - for (int i = xList.size(); i < xList.size() + yList.size(); i++) { - int j = i - xList.size(); + for (int i = xAxis.size(); i < xAxis.size() + yAxis.size(); i++) { + int j = i - xAxis.size(); series.get(j).getData().add(new BigDecimal(d[i])); } } @@ -139,7 +140,7 @@ public class ChartViewService { return dto; } - public String getSQL(String type, String table, List xAxis, List yAxis) { + public String getSQL(String type, String table, List xAxis, List yAxis) { DatasourceTypes datasourceType = DatasourceTypes.valueOf(type); switch (datasourceType) { case mysql: @@ -150,10 +151,10 @@ public class ChartViewService { } } - public String transMysqlSQL(String table, List xAxis, List yAxis) { - // TODO 此处sum后期由用户前端传入 - String[] field = yAxis.stream().map(y -> "sum(" + y.getOriginName() + ")").toArray(String[]::new); - String[] group = xAxis.stream().map(DatasetTableField::getOriginName).toArray(String[]::new); + public String transMysqlSQL(String table, List xAxis, List yAxis) { + // TODO 字段汇总 排序等 + String[] field = yAxis.stream().map(y -> "CAST(" + y.getSummary() + "(" + y.getOriginName() + ") AS DECIMAL(10,2))").toArray(String[]::new); + String[] group = xAxis.stream().map(ChartViewFieldDTO::getOriginName).toArray(String[]::new); return MessageFormat.format("SELECT {0},{1} FROM {2} GROUP BY {3}", StringUtils.join(group, ","), StringUtils.join(field, ","), table, StringUtils.join(group, ",")); } } diff --git a/frontend/src/lang/zh.js b/frontend/src/lang/zh.js index 2b0a8d8bda..6655f1d7b1 100644 --- a/frontend/src/lang/zh.js +++ b/frontend/src/lang/zh.js @@ -592,7 +592,15 @@ export default { x_axis: '横轴', y_axis: '纵轴', chart: '视图', - close: '关闭' + close: '关闭', + summary: '汇总方式', + fast_calc: '快速计算', + sum: '求和', + avg: '平均', + max: '最大值', + min: '最小值', + std: '标准差', + var_samp: '方差' }, dataset: { datalist: '数据集', diff --git a/frontend/src/views/chart/components/DimensionItem.vue b/frontend/src/views/chart/components/DimensionItem.vue new file mode 100644 index 0000000000..06abf94802 --- /dev/null +++ b/frontend/src/views/chart/components/DimensionItem.vue @@ -0,0 +1,66 @@ + + + + + diff --git a/frontend/src/views/chart/components/QuotaItem.vue b/frontend/src/views/chart/components/QuotaItem.vue new file mode 100644 index 0000000000..3c4ece1fa5 --- /dev/null +++ b/frontend/src/views/chart/components/QuotaItem.vue @@ -0,0 +1,95 @@ + + + + + diff --git a/frontend/src/views/chart/view/ChartEdit.vue b/frontend/src/views/chart/view/ChartEdit.vue index 7e2ac36ace..4281df8105 100644 --- a/frontend/src/views/chart/view/ChartEdit.vue +++ b/frontend/src/views/chart/view/ChartEdit.vue @@ -23,7 +23,7 @@ {{ $t('chart.dimension') }} {{ $t('chart.quota') }} - {{ $t('chart.x_axis') }} + {{ $t('chart.dimension') }} - - - - {{ item.name }} - - - - item1 - - - item2 - - - - - + - {{ $t('chart.y_axis') }} + {{ $t('chart.quota') }} - - - - {{ item.name }} - - - - - - item3 - - - sub1 - - - - - item4 - - - - - + @@ -185,10 +144,12 @@ import { post } from '@/api/dataset/dataset' import draggable from 'vuedraggable' import { BASE_BAR } from '../chart/chart' +import DimensionItem from '../components/DimensionItem' +import QuotaItem from '../components/QuotaItem' export default { name: 'ChartEdit', - components: { draggable }, + components: { QuotaItem, DimensionItem, draggable }, data() { return { table: {}, @@ -301,6 +262,16 @@ export default { view.sceneId = this.sceneId view.name = this.table.name view.tableId = this.$store.state.chart.tableId + view.xaxis.forEach(function(ele) { + if (!ele.summary || ele.summary === '') { + ele.summary = 'sum' + } + }) + view.yaxis.forEach(function(ele) { + if (!ele.summary || ele.summary === '') { + ele.summary = 'sum' + } + }) view.xaxis = JSON.stringify(view.xaxis) view.yaxis = JSON.stringify(view.yaxis) post('/chart/view/save', view).then(response => { @@ -419,6 +390,17 @@ export default { return true }, + quotaSummaryChange(item) { + console.log(item) + // 更新item + this.view.yaxis.forEach(function(ele) { + if (ele.id === item.id) { + ele.summary = item.summary + } + }) + this.save() + }, + myEcharts(option) { // 基于准备好的dom,初始化echarts实例 var myChart = this.$echarts.init(document.getElementById('echart')) @@ -483,26 +465,6 @@ export default { cursor: pointer; } - .item-axis { - padding: 1px 8px; - margin: 0 3px 2px 3px; - border: solid 1px #eee; - background-color: #f1f1f1; - text-align: left; - height: 24px; - line-height: 22px; - display: inline-block; - color: #1890ff; - border-radius: 4px; - box-sizing: border-box; - white-space: nowrap; - } - - .item-axis:hover { - background-color: #fdfdfd; - cursor: pointer; - } - .el-form-item { margin-bottom: 0; }