156 Star 1.7K Fork 657

GCPAAS / DataRoom

 / 详情

[功能建议]: 多组件的多组合数据库联查

待办的
创建于  
2024-04-15 15:13

你的功能建议是否和某个问题相关?

在自助数据集中,出现两个条件的查询时,一个选择器只能触发对应的条件,但触发不了多个组件。希望在一个组件触发时,同时触发在大屏中的多个选择器。

你希望看到什么解决方案?

在触发一个组件时,同时触发同一大屏内的多个组件。再进行查询对应数据集

你考虑过哪些替代方案?

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);
    }

    /**

    • json类型的数据集数据处理
    • @chancelai dataSet
    • @chancelai dataSetDataSource
    • @HTTP4O4
      */
      private ChartDataVO jsonDataQuery(DatasetEntity dataSet, DataSetDataSource dataSetDataSource, IBaseDataSetService dataSetService) {
      ChartDataVO dataDTO = new ChartDataVO();
      JsonDataSetConfig config = (JsonDataSetConfig) dataSet.getConfig();
      Object jsonContent = dataSetService.execute(dataSet.getId(), null);
      List<Map<String, Object>> data = Lists.newArrayList();
      if (jsonContent instanceof JSONArray) {
      jsonContent = ((JSONArray) jsonContent).toList();
      }
      if (jsonContent instanceof ArrayList) {
      ArrayList list = (ArrayList) jsonContent;
      for (Object o : list) {
      if (o instanceof HashMap) {
      data.add((HashMap<String, Object>) o);
      }
      }
      }
      if (jsonContent instanceof HashMap) {
      HashMap map = (HashMap) jsonContent;
      data.add(map);
      }
      if (jsonContent instanceof JSONObject) {
      JSONObject jsonObject = (JSONObject) jsonContent;
      data.add(jsonObject.toMap());
      }
      HashMap<String, ChartDataVO.ColumnData> columnData = Maps.newHashMap();
      Map<String, Object> fieldDesc = config.getFieldDesc();
      fieldDesc.forEach((k, v) -> {
      ChartDataVO.ColumnData column = new ChartDataVO.ColumnData();
      column.setOriginalColumn(k);
      column.setAlias(k);
      column.setRemark(v.toString());
      columnData.put(k, column);
      });
      dataDTO.setData(data);
      dataDTO.setSuccess(true);
      dataDTO.setColumnData(columnData);
      return dataDTO;
      }

    /**

    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",在后端寻找到对应数据,并把值设为空

你有其他上下文或截图吗?

意向参与贡献

  • 我有意向参与具体功能的开发实现并将代码贡献回到上游社区

评论 (2)

huli20010120 创建了任务
huli20010120 添加了
 
enhancement
标签
huli20010120 修改了描述
huli20010120 修改了描述
展开全部操作日志

你是不是想要下面的效果,一个图表的数据集参数由大屏多个控件组件值确定,但是触发其中一个控件时,图表再查询数据集数据时能够带上其他控件的值?

登录 后才可以发表评论

状态
负责人
里程碑
Pull Requests
关联的 Pull Requests 被合并后可能会关闭此 issue
分支
开始日期   -   截止日期
-
置顶选项
优先级
参与者(2)
1493166 xiaoka2017 1578952783
HTML/CSS
1
https://gitee.com/gcpaas/DataRoom.git
git@gitee.com:gcpaas/DataRoom.git
gcpaas
DataRoom
DataRoom

搜索帮助