在自助数据集中,出现两个条件的查询时,一个选择器只能触发对应的条件,但触发不了多个组件。希望在一个组件触发时,同时触发在大屏中的多个选择器。
在触发一个组件时,同时触发同一大屏内的多个组件。再进行查询对应数据集
package com.gccloud.dataroom.core.module.chart.service;
import com.gccloud.common.exception.GlobalException;
import com.gccloud.common.utils.JSON;
import com.gccloud.common.vo.PageVO;
import com.gccloud.dataroom.core.constant.PageDesignConstant;
import com.gccloud.dataroom.core.module.chart.bean.Chart;
import com.gccloud.dataroom.core.module.chart.bean.Filter;
import com.gccloud.dataroom.core.module.chart.components.datasource.BaseChartDataSource;
import com.gccloud.dataroom.core.module.chart.components.datasource.DataSetDataSource;
import com.gccloud.dataroom.core.module.chart.dto.ChartDataSearchDTO;
import com.gccloud.dataroom.core.module.chart.vo.ChartDataVO;
import com.gccloud.dataset.constant.DatasetConstant;
import com.gccloud.dataset.dto.DatasetParamDTO;
import com.gccloud.dataset.entity.DatasetEntity;
import com.gccloud.dataset.entity.config.JsonDataSetConfig;
import com.gccloud.dataset.params.ParamsClient;
import com.gccloud.dataset.service.IBaseDataSetService;
import com.gccloud.dataset.service.factory.DataSetServiceFactory;
import com.gccloud.dataset.vo.DatasetInfoVO;
import com.google.common.collect.Lists;
import com.google.common.collect.Maps;
import lombok.Data;
import lombok.extern.slf4j.Slf4j;
import org.apache.commons.lang3.StringUtils;
import org.json.JSONArray;
import org.json.JSONObject;
import org.springframework.stereotype.Service;
import javax.annotation.Resource;
import java.util.*;
/**
@Author liuchengbiao
@wangzhaohui 1.0
@date 2022/8/8 15:11
*/
@杨泽
@jav
@Service("dataRoomBaseChartDataService")
public class BaseChartDataService {
/**
问题过程:前端传入参数,后端进行参数的过滤查询。
分析问题:每次前端只传入一个参数,后端只处理一个参数。
问题原因:(没有对参数进行保持)
解决方案:把参数进行保持
1.新建列表进行参数存储。
2.添加参数进列表
3.添加符合参数进查询
*/
Map<String, List> dataRoomSearchDtoMap = new HashMap<>();
@Devos
private DataSetServiceFactory dataSetServiceFactory;
@Devos
private ParamsClient paramsClient;
public ChartDataVO dataQuery(Chart chart, ChartDataSearchDTO searchDTO) {
BaseChartDataSource dataSource = chart.getDataSource();
if (dataSource == null) {
return null;
}
if (!dataSource.getClass().equals(DataSetDataSource.class)) {
return null;
}
DataSetDataSource dataSetDataSource = (DataSetDataSource) dataSource;
if (StringUtils.isBlank(dataSetDataSource.getBusinessKey())) {
return null;
}
IBaseDataSetService dataSetService = dataSetServiceFactory.buildById(dataSetDataSource.getBusinessKey());
DatasetEntity datasetEntity = dataSetService.getByIdFromCache(dataSetDataSource.getBusinessKey());
if (datasetEntity == null) {
return null;
}
if (DatasetConstant.DataSetType.JSON.equals(datasetEntity.getDatasetType())) {
return jsonDataQuery(datasetEntity, dataSetDataSource, dataSetService);
}
return dataSetDataQuery(dataSetDataSource, chart, searchDTO, dataSetService);
}
/**
/**
private ChartDataVO dataSetDataQuery(DataSetDataSource dataSource, Chart chart, ChartDataSearchDTO searchDTO, IBaseDataSetService dataSetService) {
log.warn("searchDto:{}",searchDTO.getFilterList());
ChartDataVO dataDTO = new ChartDataVO();
List params = Lists.newArrayList();
if (StringUtils.isBlank(dataSource.getBusinessKey())) {
throw new GlobalException("图表未配置数据集");
}
DatasetInfoVO dataSetInfoVo = dataSetService.getInfoById(dataSource.getBusinessKey());
HashMap<String, ChartDataVO.ColumnData> columnData = Maps.newHashMap();
List<Map<String, Object>> fieldJson = dataSetInfoVo.getFields();
for (Map<String, Object> field : fieldJson) {
ChartDataVO.ColumnData column = new ChartDataVO.ColumnData();
column.setOriginalColumn(field.get(DatasetInfoVO.FIELD_NAME).toString());
column.setAlias(field.get(DatasetInfoVO.FIELD_NAME).toString());
column.setRemark(field.get(DatasetInfoVO.FIELD_DESC).toString());
String sourceTable = field.get(DatasetInfoVO.FIELD_SOURCE) == null ? "" : field.get(DatasetInfoVO.FIELD_SOURCE).toString();
column.setTableName(sourceTable);
String type = field.get(DatasetInfoVO.FIELD_TYPE) == null ? "" : field.get(DatasetInfoVO.FIELD_TYPE).toString();
column.setType(type);
columnData.put(field.get(DatasetInfoVO.FIELD_NAME).toString(), column);
}
if (chart.getType().equals(PageDesignConstant.BigScreen.Type.TABLES)) {
// 表格的话,要按照dimensionFieldList对columnData进行排序
List dimensionFieldList = dataSource.getDimensionFieldList();
LinkedHashMap<String, ChartDataVO.ColumnData> newColumnData = Maps.newLinkedHashMap();
dimensionFieldList.forEach(dimensionField -> newColumnData.put(dimensionField, columnData.get(dimensionField)));
// 剩下的字段按照原来的顺序放到后面
columnData.forEach((key, value) -> {
if (!newColumnData.containsKey(key)) {
newColumnData.put(key, value);
}
});
}
if (dataSource.getParams() != null && dataSource.getParams().size() > 0) {
List<DatasetParamDTO> searchDTOList;
if (dataRoomSearchDtoMap.containsKey(searchDTO.getPageCode())) {
log.warn("取出列表:{}",searchDTO.getPageCode());
searchDTOList = dataRoomSearchDtoMap.get(searchDTO.getPageCode());
} else {
log.warn("放入:{}列表",searchDTO.getPageCode());
searchDTOList = new ArrayList<>();
dataRoomSearchDtoMap.put(searchDTO.getPageCode(), searchDTOList);
}
String setString = JSON.toJSONString(dataSetInfoVo.getParams());
List<DatasetParamDTO> setParams = JSON.parseArray(setString, DatasetParamDTO.class);
for (DatasetParamDTO param : setParams) {
if (!dataSource.getParams().containsKey(param.getName())) {
continue;
}
String value = dataSource.getParams().get(param.getName()).toString();
// 如果传入了过滤条件,优先使用过滤条件
if (searchDTO.getFilterList() != null && searchDTO.getFilterList().size() > 0) {
for (Filter filter : searchDTO.getFilterList()) {
if (filter.getColumn() == null) {
continue;
}
if (filter.getColumn().equals(param.getName())) {
if (filter.getValue() == null || filter.getValue().size() == 0) {
continue;
}
value = filter.getValue().get(0);
break;
}
}
}
param.setValue(value);
param.setStatus(1);
//哈希表中包含对应列表?否 创建并放,是 取
//输出参数不为空?
//列表不包含对应参数?是 加入列表,否 设置对应值
if (!param.getValue().isEmpty() && param.getValue() != null) {
if (searchDTOList.stream().noneMatch(item -> item.getName().equals(param.getName()))) {
searchDTOList.add(param);
} else {
if (param.getValue().equals("null")){
param.setValue(null);
}
searchDTOList.stream()
.filter(item -> item.getName().equals(param.getName()))
.forEach(item -> item.setValue(param.getValue()));
}
}
}
if (searchDTOList == null || searchDTOList.size() == 0) {
log.warn("searchDTOList:为空");
} else {
log.warn("searchDTOList: {}", searchDTOList);
params.addAll(searchDTOList);
}
} else {
// 组件配置的数据集参数为空,则使用数据集默认的参数
List<DatasetParamDTO> setParams = dataSetInfoVo.getParams();
if (setParams == null) {
setParams = Lists.newArrayList();
}
String setString = JSON.toJSONString(setParams);
params = JSON.parseArray(setString, DatasetParamDTO.class);
}
dataDTO.setColumnData(columnData);
Object data;
log.info("查询数据集数据,参数:{}", JSON.toJSONString(params));
if (dataSource.getServerPagination() != null && dataSource.getServerPagination() && searchDTO.getSize() != null && searchDTO.getCurrent() != null) {
PageVO<Object> pageResult = dataSetService.execute(dataSource.getBusinessKey(), params, searchDTO.getCurrent(), searchDTO.getSize());
data = pageResult.getList();
dataDTO.setTotalCount((int) pageResult.getTotalCount());
dataDTO.setTotalPage((int) pageResult.getTotalPage());
} else {
data = dataSetService.execute(dataSource.getBusinessKey(), params);
}
boolean backendExecutionNeeded = dataSetService.checkBackendExecutionNeeded(dataSource.getBusinessKey());
dataDTO.setExecutionByFrontend(!backendExecutionNeeded);
dataDTO.setData(data);
dataDTO.setSuccess(true);
return dataDTO;
}
}
组合联查后,在清除一个数据的时候。会无法清除列表中的数据,但可以通过修改选择器源码来进行适配,例如在选择器清空时,自动插入一个字符串为"null",在后端寻找到对应数据,并把值设为空