feat(backend):chart 支持 dashboard传入过滤组件条件
This commit is contained in:
parent
9de0749200
commit
afca57c459
@ -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}")
|
||||
|
||||
@ -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<String> value;
|
||||
private List<String> viewIds;
|
||||
private DatasetTableField datasetTableField;
|
||||
}
|
||||
@ -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<ChartExtFilterRequest> filter;
|
||||
}
|
||||
@ -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<ChartViewFieldDTO> xAxis = new Gson().fromJson(view.getXAxis(), new TypeToken<List<ChartViewFieldDTO>>() {
|
||||
}.getType());
|
||||
@ -107,6 +109,24 @@ public class ChartViewService {
|
||||
// List<DatasetTableField> xList = dataSetTableFieldsService.getListByIds(xIds);
|
||||
// List<DatasetTableField> yList = dataSetTableFieldsService.getListByIds(yIds);
|
||||
|
||||
// 过滤来自仪表盘的条件
|
||||
List<ChartExtFilterRequest> 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<DatasetTableField> 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<ChartViewFieldDTO> xAxis, List<ChartViewFieldDTO> yAxis) {
|
||||
public String transMysqlExtFilter(List<ChartExtFilterRequest> requestList) {
|
||||
if (CollectionUtils.isEmpty(requestList)) {
|
||||
return "";
|
||||
}
|
||||
StringBuilder filter = new StringBuilder();
|
||||
for (ChartExtFilterRequest request : requestList) {
|
||||
List<String> 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<ChartViewFieldDTO> xAxis, List<ChartViewFieldDTO> yAxis, List<ChartExtFilterRequest> 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<ChartViewFieldDTO> xAxis, List<ChartViewFieldDTO> yAxis) {
|
||||
public String transMysqlSQL(String table, List<ChartViewFieldDTO> xAxis, List<ChartViewFieldDTO> yAxis, List<ChartExtFilterRequest> 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":
|
||||
|
||||
@ -66,4 +66,8 @@ public class DataSetTableFieldsService {
|
||||
datasetTableFieldExample.createCriteria().andTableIdEqualTo(id);
|
||||
return datasetTableFieldMapper.selectByExample(datasetTableFieldExample);
|
||||
}
|
||||
|
||||
public DatasetTableField get(String id) {
|
||||
return datasetTableFieldMapper.selectByPrimaryKey(id);
|
||||
}
|
||||
}
|
||||
|
||||
@ -58,7 +58,7 @@ public class PanelGroupService {
|
||||
return panelGroupDTOList;
|
||||
}
|
||||
|
||||
public void getTreeChildren(List<PanelGroupDTO> parentPanelGroupDTO){
|
||||
public void getTreeChildren(List<PanelGroupDTO> parentPanelGroupDTO) {
|
||||
Optional.ofNullable(parentPanelGroupDTO).ifPresent(parent -> parent.forEach(panelGroupDTO -> {
|
||||
List<PanelGroupDTO> panelGroupDTOChildren = extPanelGroupMapper.panelGroupList(new PanelGroupRequest(panelGroupDTO.getId()));
|
||||
panelGroupDTO.setChildren(panelGroupDTOChildren);
|
||||
@ -66,7 +66,7 @@ public class PanelGroupService {
|
||||
}));
|
||||
}
|
||||
|
||||
public List<PanelGroupDTO> getDefaultTree(PanelGroupRequest panelGroupRequest){
|
||||
public List<PanelGroupDTO> 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<PanelDesign> panelDesignList = panelDesignMapper.selectByExample(panelDesignExample);
|
||||
if(CollectionUtils.isNotEmpty(panelDesignList)){
|
||||
List<PanelDesign> panelDesignList = panelDesignMapper.selectByExample(panelDesignExample);
|
||||
if (CollectionUtils.isNotEmpty(panelDesignList)) {
|
||||
List<PanelDesignDTO> 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<ChartViewDTO> getUsableViews(String panelId) throws Exception{
|
||||
public List<ChartViewDTO> getUsableViews(String panelId) throws Exception {
|
||||
List<ChartViewDTO> chartViewDTOList = new ArrayList<>();
|
||||
List<ChartView> 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);
|
||||
}
|
||||
});
|
||||
}
|
||||
}
|
||||
|
||||
@ -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<String[]> getData(String hTable, List<DatasetTableField> fields, List<ChartViewFieldDTO> xAxis, List<ChartViewFieldDTO> yAxis, String tmpTable) throws Exception {
|
||||
public List<String[]> getData(String hTable, List<DatasetTableField> fields, List<ChartViewFieldDTO> xAxis, List<ChartViewFieldDTO> yAxis, String tmpTable, List<ChartExtFilterRequest> 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<Row> sql = sqlContext.sql(getSQL(xAxis, yAxis, tmpTable));
|
||||
Dataset<Row> sql = sqlContext.sql(getSQL(xAxis, yAxis, tmpTable, requestList));
|
||||
// transform
|
||||
List<String[]> data = new ArrayList<>();
|
||||
List<Row> list = sql.collectAsList();
|
||||
@ -149,7 +150,7 @@ public class SparkCalc {
|
||||
return dataFrame;
|
||||
}
|
||||
|
||||
public String getSQL(List<ChartViewFieldDTO> xAxis, List<ChartViewFieldDTO> yAxis, String table) {
|
||||
public String getSQL(List<ChartViewFieldDTO> xAxis, List<ChartViewFieldDTO> yAxis, String table, List<ChartExtFilterRequest> 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<ChartExtFilterRequest> requestList) {
|
||||
if (CollectionUtils.isEmpty(requestList)) {
|
||||
return "";
|
||||
}
|
||||
StringBuilder filter = new StringBuilder();
|
||||
for (ChartExtFilterRequest request : requestList) {
|
||||
List<String> 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();
|
||||
}
|
||||
}
|
||||
|
||||
@ -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) : []
|
||||
|
||||
Loading…
Reference in New Issue
Block a user