From afca57c4597866e3b8ca09c7dfd6eadd006c01de Mon Sep 17 00:00:00 2001 From: junjie Date: Mon, 19 Apr 2021 11:44:21 +0800 Subject: [PATCH] =?UTF-8?q?feat(backend):chart=20=E6=94=AF=E6=8C=81=20dash?= =?UTF-8?q?board=E4=BC=A0=E5=85=A5=E8=BF=87=E6=BB=A4=E7=BB=84=E4=BB=B6?= =?UTF-8?q?=E6=9D=A1=E4=BB=B6?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../controller/chart/ChartViewController.java | 6 +- .../request/chart/ChartExtFilterRequest.java | 22 ++++++ .../request/chart/ChartExtRequest.java | 16 +++++ .../service/chart/ChartViewService.java | 71 ++++++++++++++++--- .../dataset/DataSetTableFieldsService.java | 4 ++ .../service/panel/PanelGroupService.java | 58 +++++++-------- .../io/dataease/service/spark/SparkCalc.java | 44 ++++++++++-- frontend/src/views/chart/view/ChartEdit.vue | 4 +- 8 files changed, 181 insertions(+), 44 deletions(-) create mode 100644 backend/src/main/java/io/dataease/controller/request/chart/ChartExtFilterRequest.java create mode 100644 backend/src/main/java/io/dataease/controller/request/chart/ChartExtRequest.java diff --git a/backend/src/main/java/io/dataease/controller/chart/ChartViewController.java b/backend/src/main/java/io/dataease/controller/chart/ChartViewController.java index e584a53c2c..659ca03f58 100644 --- a/backend/src/main/java/io/dataease/controller/chart/ChartViewController.java +++ b/backend/src/main/java/io/dataease/controller/chart/ChartViewController.java @@ -1,6 +1,8 @@ package io.dataease.controller.chart; import io.dataease.base.domain.ChartViewWithBLOBs; +import io.dataease.controller.request.chart.ChartExtFilterRequest; +import io.dataease.controller.request.chart.ChartExtRequest; import io.dataease.controller.request.chart.ChartViewRequest; import io.dataease.dto.chart.ChartViewDTO; import io.dataease.service.chart.ChartViewService; @@ -41,8 +43,8 @@ public class ChartViewController { } @PostMapping("/getData/{id}") - public ChartViewDTO getData(@PathVariable String id) throws Exception { - return chartViewService.getData(id); + public ChartViewDTO getData(@PathVariable String id, @RequestBody ChartExtRequest requestList) throws Exception { + return chartViewService.getData(id, requestList); } @PostMapping("chartDetail/{id}") diff --git a/backend/src/main/java/io/dataease/controller/request/chart/ChartExtFilterRequest.java b/backend/src/main/java/io/dataease/controller/request/chart/ChartExtFilterRequest.java new file mode 100644 index 0000000000..8853b8232b --- /dev/null +++ b/backend/src/main/java/io/dataease/controller/request/chart/ChartExtFilterRequest.java @@ -0,0 +1,22 @@ +package io.dataease.controller.request.chart; + +import io.dataease.base.domain.DatasetTableField; +import lombok.Getter; +import lombok.Setter; + +import java.util.List; + +/** + * @Author gin + * @Date 2021/4/19 10:24 上午 + */ +@Getter +@Setter +public class ChartExtFilterRequest { + private String componentId; + private String fieldId; + private String operator; + private List value; + private List viewIds; + private DatasetTableField datasetTableField; +} diff --git a/backend/src/main/java/io/dataease/controller/request/chart/ChartExtRequest.java b/backend/src/main/java/io/dataease/controller/request/chart/ChartExtRequest.java new file mode 100644 index 0000000000..3806316bd6 --- /dev/null +++ b/backend/src/main/java/io/dataease/controller/request/chart/ChartExtRequest.java @@ -0,0 +1,16 @@ +package io.dataease.controller.request.chart; + +import lombok.Getter; +import lombok.Setter; + +import java.util.List; + +/** + * @Author gin + * @Date 2021/4/19 11:29 上午 + */ +@Getter +@Setter +public class ChartExtRequest { + private List filter; +} 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 5612977965..1997b680ff 100644 --- a/backend/src/main/java/io/dataease/service/chart/ChartViewService.java +++ b/backend/src/main/java/io/dataease/service/chart/ChartViewService.java @@ -6,6 +6,8 @@ import io.dataease.base.domain.*; import io.dataease.base.mapper.ChartViewMapper; import io.dataease.commons.utils.AuthUtils; import io.dataease.commons.utils.BeanUtils; +import io.dataease.controller.request.chart.ChartExtFilterRequest; +import io.dataease.controller.request.chart.ChartExtRequest; import io.dataease.controller.request.chart.ChartViewRequest; import io.dataease.datasource.constants.DatasourceTypes; import io.dataease.datasource.provider.DatasourceProvider; @@ -88,7 +90,7 @@ public class ChartViewService { chartViewMapper.deleteByExample(chartViewExample); } - public ChartViewDTO getData(String id) throws Exception { + public ChartViewDTO getData(String id, ChartExtRequest requestList) throws Exception { ChartViewWithBLOBs view = chartViewMapper.selectByPrimaryKey(id); List xAxis = new Gson().fromJson(view.getXAxis(), new TypeToken>() { }.getType()); @@ -107,6 +109,24 @@ public class ChartViewService { // List xList = dataSetTableFieldsService.getListByIds(xIds); // List yList = dataSetTableFieldsService.getListByIds(yIds); + // 过滤来自仪表盘的条件 + List extFilterList = new ArrayList<>(); + if (ObjectUtils.isNotEmpty(requestList.getFilter())) { + for (ChartExtFilterRequest request : requestList.getFilter()) { + DatasetTableField datasetTableField = dataSetTableFieldsService.get(request.getFieldId()); + request.setDatasetTableField(datasetTableField); + if (StringUtils.equalsIgnoreCase(datasetTableField.getTableId(), view.getTableId())) { + if (CollectionUtils.isNotEmpty(request.getViewIds())) { + if (request.getViewIds().contains(view.getId())) { + extFilterList.add(request); + } + } else { + extFilterList.add(request); + } + } + } + } + // 获取数据集 DatasetTable table = dataSetTableService.get(view.getTableId()); // 判断连接方式,直连或者定时抽取 table.mode @@ -119,15 +139,15 @@ public class ChartViewService { DataTableInfoDTO dataTableInfoDTO = new Gson().fromJson(table.getInfo(), DataTableInfoDTO.class); if (StringUtils.equalsIgnoreCase(table.getType(), "db")) { datasourceRequest.setTable(dataTableInfoDTO.getTable()); - datasourceRequest.setQuery(getSQL(ds.getType(), dataTableInfoDTO.getTable(), xAxis, yAxis)); + datasourceRequest.setQuery(getSQL(ds.getType(), dataTableInfoDTO.getTable(), xAxis, yAxis, extFilterList)); } else if (StringUtils.equalsIgnoreCase(table.getType(), "sql")) { - datasourceRequest.setQuery(getSQL(ds.getType(), " (" + dataTableInfoDTO.getSql() + ") AS tmp ", xAxis, yAxis)); + datasourceRequest.setQuery(getSQL(ds.getType(), " (" + dataTableInfoDTO.getSql() + ") AS tmp ", xAxis, yAxis, extFilterList)); } data = datasourceProvider.getData(datasourceRequest); } else if (table.getMode() == 1) {// 抽取 // 获取数据集de字段 List fields = dataSetTableFieldsService.getFieldsByTableId(table.getId()); - data = sparkCalc.getData(table.getId(), fields, xAxis, yAxis, "tmp_" + view.getId().split("-")[0]); + data = sparkCalc.getData(table.getId(), fields, xAxis, yAxis, "tmp_" + view.getId().split("-")[0], extFilterList); } // 图表组件可再扩展 @@ -163,18 +183,45 @@ public class ChartViewService { return dto; } - public String getSQL(String type, String table, List xAxis, List yAxis) { + public String transMysqlExtFilter(List requestList) { + if (CollectionUtils.isEmpty(requestList)) { + return ""; + } + StringBuilder filter = new StringBuilder(); + for (ChartExtFilterRequest request : requestList) { + List value = request.getValue(); + if (CollectionUtils.isEmpty(value)) { + continue; + } + DatasetTableField field = request.getDatasetTableField(); + filter.append(" AND ") + .append(field.getOriginName()) + .append(" ") + .append(transMysqlFilterTerm(request.getOperator())) + .append(" "); + if (StringUtils.containsIgnoreCase(request.getOperator(), "in")) { + filter.append("('").append(StringUtils.join(value, "','")).append("')"); + } else if (StringUtils.containsIgnoreCase(request.getOperator(), "like")) { + filter.append("'%").append(value.get(0)).append("%'"); + } else { + filter.append("'").append(value.get(0)).append("'"); + } + } + return filter.toString(); + } + + public String getSQL(String type, String table, List xAxis, List yAxis, List extFilterRequestList) { DatasourceTypes datasourceType = DatasourceTypes.valueOf(type); switch (datasourceType) { case mysql: - return transMysqlSQL(table, xAxis, yAxis); + return transMysqlSQL(table, xAxis, yAxis, extFilterRequestList); case sqlServer: default: return ""; } } - public String transMysqlSQL(String table, List xAxis, List yAxis) { + public String transMysqlSQL(String table, List xAxis, List yAxis, List extFilterRequestList) { // 字段汇总 排序等 String[] field = yAxis.stream().map(y -> "CAST(" + y.getSummary() + "(" + y.getOriginName() + ") AS DECIMAL(20,2)) AS _" + y.getSummary() + "_" + y.getOriginName()).toArray(String[]::new); String[] group = xAxis.stream().map(ChartViewFieldDTO::getOriginName).toArray(String[]::new); @@ -185,7 +232,7 @@ public class ChartViewService { StringUtils.join(group, ","), StringUtils.join(field, ","), table, - "", + transMysqlExtFilter(extFilterRequestList),// origin field filter and panel field filter StringUtils.join(group, ","), StringUtils.join(order, ",")); if (sql.endsWith(",")) { @@ -221,6 +268,14 @@ public class ChartViewService { return " > "; case "ge": return " >= "; + case "in": + return " IN "; + case "not in": + return " NOT IN "; + case "like": + return " LIKE "; + case "not like": + return " NOT LIKE "; case "null": return " IS NULL "; case "not_null": diff --git a/backend/src/main/java/io/dataease/service/dataset/DataSetTableFieldsService.java b/backend/src/main/java/io/dataease/service/dataset/DataSetTableFieldsService.java index 020684bc8e..8d1109780b 100644 --- a/backend/src/main/java/io/dataease/service/dataset/DataSetTableFieldsService.java +++ b/backend/src/main/java/io/dataease/service/dataset/DataSetTableFieldsService.java @@ -66,4 +66,8 @@ public class DataSetTableFieldsService { datasetTableFieldExample.createCriteria().andTableIdEqualTo(id); return datasetTableFieldMapper.selectByExample(datasetTableFieldExample); } + + public DatasetTableField get(String id) { + return datasetTableFieldMapper.selectByPrimaryKey(id); + } } diff --git a/backend/src/main/java/io/dataease/service/panel/PanelGroupService.java b/backend/src/main/java/io/dataease/service/panel/PanelGroupService.java index cbc0521b9f..6a881798a5 100644 --- a/backend/src/main/java/io/dataease/service/panel/PanelGroupService.java +++ b/backend/src/main/java/io/dataease/service/panel/PanelGroupService.java @@ -58,7 +58,7 @@ public class PanelGroupService { return panelGroupDTOList; } - public void getTreeChildren(List parentPanelGroupDTO){ + public void getTreeChildren(List parentPanelGroupDTO) { Optional.ofNullable(parentPanelGroupDTO).ifPresent(parent -> parent.forEach(panelGroupDTO -> { List panelGroupDTOChildren = extPanelGroupMapper.panelGroupList(new PanelGroupRequest(panelGroupDTO.getId())); panelGroupDTO.setChildren(panelGroupDTOChildren); @@ -66,7 +66,7 @@ public class PanelGroupService { })); } - public List getDefaultTree(PanelGroupRequest panelGroupRequest){ + public List getDefaultTree(PanelGroupRequest panelGroupRequest) { return extPanelGroupMapper.panelGroupList(panelGroupRequest); } @@ -86,32 +86,32 @@ public class PanelGroupService { } - public void deleteCircle(String id){ + public void deleteCircle(String id) { Assert.notNull(id, "id cannot be null"); extPanelGroupMapper.deleteCircle(id); } - public PanelGroupWithBLOBs findOne(String panelId){ - return panelGroupMapper.selectByPrimaryKey(panelId); + public PanelGroupWithBLOBs findOne(String panelId) { + return panelGroupMapper.selectByPrimaryKey(panelId); } - public PanelGroupDTO findOneBack(String panelId) throws Exception{ + public PanelGroupDTO findOneBack(String panelId) throws Exception { PanelGroupDTO panelGroupDTO = extPanelGroupMapper.panelGroup(panelId); Assert.notNull(panelGroupDTO, "未查询到仪表盘信息"); PanelDesignExample panelDesignExample = new PanelDesignExample(); panelDesignExample.createCriteria().andPanelIdEqualTo(panelId); - List panelDesignList = panelDesignMapper.selectByExample(panelDesignExample); - if(CollectionUtils.isNotEmpty(panelDesignList)){ + List panelDesignList = panelDesignMapper.selectByExample(panelDesignExample); + if (CollectionUtils.isNotEmpty(panelDesignList)) { List panelDesignDTOList = new ArrayList<>(); //TODO 加载所有视图和组件的数据 - for(PanelDesign panelDesign:panelDesignList){ + for (PanelDesign panelDesign : panelDesignList) { //TODO 获取view 视图数据 - ChartViewDTO chartViewDTO = chartViewService.getData(panelDesign.getComponentId()); + ChartViewDTO chartViewDTO = chartViewService.getData(panelDesign.getComponentId(), null); //TODO 获取systemComponent 系统组件数据(待开发) PanelDesignDTO panelDesignDTO = new PanelDesignDTO(chartViewDTO); - BeanUtils.copyBean(panelDesignDTO,panelDesign); + BeanUtils.copyBean(panelDesignDTO, panelDesign); panelDesignDTO.setKeepFlag(true); panelDesignDTOList.add(panelDesignDTO); } @@ -123,14 +123,14 @@ public class PanelGroupService { } - public List getUsableViews(String panelId) throws Exception{ + public List getUsableViews(String panelId) throws Exception { List chartViewDTOList = new ArrayList<>(); List allChartView = chartViewMapper.selectByExample(null); Optional.ofNullable(allChartView).orElse(new ArrayList<>()).stream().forEach(chartView -> { try { - chartViewDTOList.add(chartViewService.getData(chartView.getId())); - }catch (Exception e){ - LOGGER.error("获取view详情出错:"+chartView.getId(),e); + chartViewDTOList.add(chartViewService.getData(chartView.getId(), null)); + } catch (Exception e) { + LOGGER.error("获取view详情出错:" + chartView.getId(), e); } }); return chartViewDTOList; @@ -150,24 +150,24 @@ public class PanelGroupService { //TODO 更新panelDesign 信息 String panelId = request.getId(); - Assert.notNull(panelId,"panelId should not be null"); + Assert.notNull(panelId, "panelId should not be null"); //清理原有design extPanelDesignMapper.deleteByPanelId(panelId); //保存view 或者component design Optional.ofNullable(request.getPanelDesigns()).orElse(new ArrayList<>()).stream().forEach(panelDesignDTO -> { - if(panelDesignDTO.isKeepFlag()) { - String componentId = ""; - if(StringUtils.equals(PanelConstants.COMPONENT_TYPE_VIEW,panelDesignDTO.getComponentType())){ - componentId = panelDesignDTO.getChartView().getId(); - }else{ - //预留 公共组件id获取 - componentId = ""; - } - panelDesignDTO.setPanelId(panelId); - panelDesignDTO.setComponentId(componentId); - panelDesignDTO.setUpdateTime(System.currentTimeMillis()); - panelDesignMapper.insertSelective(panelDesignDTO); - } + if (panelDesignDTO.isKeepFlag()) { + String componentId = ""; + if (StringUtils.equals(PanelConstants.COMPONENT_TYPE_VIEW, panelDesignDTO.getComponentType())) { + componentId = panelDesignDTO.getChartView().getId(); + } else { + //预留 公共组件id获取 + componentId = ""; + } + panelDesignDTO.setPanelId(panelId); + panelDesignDTO.setComponentId(componentId); + panelDesignDTO.setUpdateTime(System.currentTimeMillis()); + panelDesignMapper.insertSelective(panelDesignDTO); + } }); } } diff --git a/backend/src/main/java/io/dataease/service/spark/SparkCalc.java b/backend/src/main/java/io/dataease/service/spark/SparkCalc.java index b3e2010513..0824f2258e 100644 --- a/backend/src/main/java/io/dataease/service/spark/SparkCalc.java +++ b/backend/src/main/java/io/dataease/service/spark/SparkCalc.java @@ -2,6 +2,7 @@ package io.dataease.service.spark; import io.dataease.base.domain.DatasetTableField; import io.dataease.commons.utils.CommonBeanFactory; +import io.dataease.controller.request.chart.ChartExtFilterRequest; import io.dataease.dto.chart.ChartViewFieldDTO; import org.apache.commons.collections4.CollectionUtils; import org.apache.commons.lang3.ObjectUtils; @@ -43,7 +44,7 @@ public class SparkCalc { @Resource private Environment env; // 保存了配置文件的信息 - public List getData(String hTable, List fields, List xAxis, List yAxis, String tmpTable) throws Exception { + public List getData(String hTable, List fields, List xAxis, List yAxis, String tmpTable, List requestList) throws Exception { // Spark Context SparkSession spark = CommonBeanFactory.getBean(SparkSession.class); JavaSparkContext sparkContext = new JavaSparkContext(spark.sparkContext()); @@ -59,7 +60,7 @@ public class SparkCalc { } dataFrame.createOrReplaceTempView(tmpTable); - Dataset sql = sqlContext.sql(getSQL(xAxis, yAxis, tmpTable)); + Dataset sql = sqlContext.sql(getSQL(xAxis, yAxis, tmpTable, requestList)); // transform List data = new ArrayList<>(); List list = sql.collectAsList(); @@ -149,7 +150,7 @@ public class SparkCalc { return dataFrame; } - public String getSQL(List xAxis, List yAxis, String table) { + public String getSQL(List xAxis, List yAxis, String table, List extFilterRequestList) { // 字段汇总 排序等 String[] field = yAxis.stream().map(y -> "CAST(" + y.getSummary() + "(" + y.getOriginName() + ") AS DECIMAL(20,2)) AS _" + y.getSummary() + "_" + y.getOriginName()).toArray(String[]::new); String[] group = xAxis.stream().map(ChartViewFieldDTO::getOriginName).toArray(String[]::new); @@ -160,7 +161,7 @@ public class SparkCalc { StringUtils.join(group, ","), StringUtils.join(field, ","), table, - "", + transExtFilter(extFilterRequestList),// origin field filter and panel field filter, StringUtils.join(group, ","), StringUtils.join(order, ",")); if (sql.endsWith(",")) { @@ -196,6 +197,14 @@ public class SparkCalc { return " > "; case "ge": return " >= "; + case "in": + return " IN "; + case "not in": + return " NOT IN "; + case "like": + return " LIKE "; + case "not like": + return " NOT LIKE "; case "null": return " IS NULL "; case "not_null": @@ -204,4 +213,31 @@ public class SparkCalc { return ""; } } + + public String transExtFilter(List requestList) { + if (CollectionUtils.isEmpty(requestList)) { + return ""; + } + StringBuilder filter = new StringBuilder(); + for (ChartExtFilterRequest request : requestList) { + List value = request.getValue(); + if (CollectionUtils.isEmpty(value)) { + continue; + } + DatasetTableField field = request.getDatasetTableField(); + filter.append(" AND ") + .append(field.getOriginName()) + .append(" ") + .append(transFilterTerm(request.getOperator())) + .append(" "); + if (StringUtils.containsIgnoreCase(request.getOperator(), "in")) { + filter.append("('").append(StringUtils.join(value, "','")).append("')"); + } else if (StringUtils.containsIgnoreCase(request.getOperator(), "like")) { + filter.append("'%").append(value.get(0)).append("%'"); + } else { + filter.append("'").append(value.get(0)).append("'"); + } + } + return filter.toString(); + } } diff --git a/frontend/src/views/chart/view/ChartEdit.vue b/frontend/src/views/chart/view/ChartEdit.vue index 2a8d743162..d43474a44a 100644 --- a/frontend/src/views/chart/view/ChartEdit.vue +++ b/frontend/src/views/chart/view/ChartEdit.vue @@ -391,7 +391,9 @@ export default { }, getData(id) { if (id) { - post('/chart/view/getData/' + id, null).then(response => { + post('/chart/view/getData/' + id, { + filter: [] + }).then(response => { this.initTableData(response.data.tableId) this.view = JSON.parse(JSON.stringify(response.data)) this.view.xaxis = this.view.xaxis ? JSON.parse(this.view.xaxis) : []