123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166 |
- package com.yihu.quota.controller;
- import com.fasterxml.jackson.core.type.TypeReference;
- import com.github.abel533.echarts.Option;
- import com.yihu.ehr.constants.ApiVersion;
- import com.yihu.ehr.constants.ServiceApi;
- import com.yihu.ehr.controller.EnvelopRestEndPoint;
- import com.yihu.ehr.exception.ApiException;
- import com.yihu.ehr.util.rest.Envelop;
- import com.yihu.quota.model.cube.Cube;
- import com.yihu.quota.model.view.View;
- import com.yihu.quota.service.cube.CubeService;
- import com.yihu.quota.service.view.ViewDimensionService;
- import com.yihu.quota.service.view.ViewQuotaService;
- import com.yihu.quota.service.view.ViewService;
- import com.yihu.quota.util.AggregationBuildHandler;
- import com.yihu.quota.util.ElasticSearchHandler;
- import com.yihu.quota.util.ReportOption;
- import com.yihu.quota.vo.ViewQuotaFilterModel;
- import io.swagger.annotations.Api;
- import io.swagger.annotations.ApiOperation;
- import io.swagger.annotations.ApiParam;
- import org.apache.commons.lang3.StringUtils;
- import org.elasticsearch.client.transport.TransportClient;
- import org.elasticsearch.index.query.BoolQueryBuilder;
- import org.elasticsearch.index.query.QueryBuilders;
- import org.elasticsearch.search.aggregations.AbstractAggregationBuilder;
- import org.elasticsearch.search.aggregations.Aggregation;
- import org.elasticsearch.search.aggregations.AggregationBuilders;
- import org.elasticsearch.search.aggregations.Aggregations;
- import org.elasticsearch.search.aggregations.bucket.filter.FilterAggregationBuilder;
- import org.springframework.beans.factory.annotation.Autowired;
- import org.springframework.web.bind.annotation.RequestMapping;
- import org.springframework.web.bind.annotation.RequestMethod;
- import org.springframework.web.bind.annotation.RequestParam;
- import org.springframework.web.bind.annotation.RestController;
- import java.util.ArrayList;
- import java.util.LinkedList;
- import java.util.List;
- import java.util.Map;
- /**
- * @author janseny
- * @date 2018年9月26日
- */
- @RestController
- @RequestMapping(ApiVersion.Version1_0)
- @Api(description = "OLAP 视图 控制入口")
- public class ViewController extends EnvelopRestEndPoint {
- @Autowired
- private ViewService viewService;
- @Autowired
- private CubeService cubeService;
- @Autowired
- private AggregationBuildHandler aggregationBuildHandler;
- @ApiOperation(value = "添加视图")
- @RequestMapping(value = ServiceApi.StatisticView.View.Add, method = RequestMethod.GET)
- public Envelop add(
- @ApiParam(name = "code", value = "视图code", required = true)
- @RequestParam(value = "code", required = true) String code,
- @ApiParam(name = "name", value = "视图名称", required = true)
- @RequestParam(value = "name", required = true) String name,
- @ApiParam(name = "cubeId", value = "多维数据集ID", required = true)
- @RequestParam(value = "cubeId", required = true) int cubeId,
- @ApiParam(name = "displayType", value = "展示类型 1:数值,2:普通表格,3:树形表格,4:饼图,5:折线图,6:柱状图,7:组合图(折线图+柱状图),8:雷达图,9:旭日图", required = false)
- @RequestParam(value = "displayType", required = false) String displayType,
- @ApiParam(name = "isDrill", value = "可钻取 1:可以,2:不可以", required = false)
- @RequestParam(value = "isDrill", required = false) String isDrill
- ) {
- Envelop envelop = new Envelop();
- envelop.setSuccessFlg(true);
- try {
- View view = new View();
- Cube cube = cubeService.findOne(cubeId);
- view.setCode(code);
- view.setName(name);
- view.setEsIndex(cube.getIndexName());
- view.setEsType(cube.getIndexType());
- view.setDisplayType(displayType != null ? displayType : "1");
- view.setIsDrill(isDrill != null ? isDrill : "1");
- viewService.save(view);
- } catch (Exception e) {
- e.printStackTrace();
- envelop.setSuccessFlg(false);
- }
- return envelop;
- }
- @ApiOperation(value = "删除视图")
- @RequestMapping(value = ServiceApi.StatisticView.View.Delete, method = RequestMethod.DELETE)
- public Envelop delete(
- @ApiParam(name = "id", value = "ID", required = true)
- @RequestParam(value = "id", required = true) int id) {
- Envelop envelop = new Envelop();
- envelop.setSuccessFlg(true);
- viewService.delete(id);
- return envelop;
- }
- @ApiOperation(value = "获取视图的统计结果,并转换成展示的数据格式")
- @RequestMapping(value = ServiceApi.StatisticView.View.GetViewStatisticData, method = RequestMethod.GET)
- public Envelop getViewStatisticData(
- @ApiParam(name = "viewCode", value = "视图编码", required = true)
- @RequestParam(value = "viewCode") String viewCode,
- @ApiParam(name = "filterJsonStr", value = "过滤条件JSON字符串,上卷/下钻时需动态移除/添加钻取维度值作为过滤条件," +
- "如:'[{\"relationType\":\"and\",\"field\":\"event_date\",\"compareType\":\"belong\",\"filterValue\":\"2017-06-11\"}]',relationType 可取值'and|or'。")
- @RequestParam(value = "filterJsonStr", required = false) String filterJsonStr,
- @ApiParam(name = "sortJsonStr", value = "排序JSON字符串,排序字段从可排序的维度中挑选,如:'{\"cubeCode\":\"xxx\",\"field\":\"event_date\",\"sort\":\"asc\"}',cubeCode 为多维数据集编码。")
- @RequestParam(value = "sortJsonStr", required = false) String sortJsonStr,
- @ApiParam(name = "drillJsonStr", value = "钻取维度JSON字符串,如:'{\"cubeCode\":\"xxx\",\"field\":\"event_date\",\"replaced\":{\"cubeCode\":\"xxx\",\"field\":\"event_date\"}}'," +
- "cubeCode 为多维数据集编码,replaced 为被替换的行维度。")
- @RequestParam(value = "drillJsonStr", required = false) String drillJsonStr) throws Exception {
- Envelop envelop = new Envelop();
- envelop.setSuccessFlg(true);
- try {
- // 获取视图的完整规则
- View view = viewService.getViewRule(viewCode);
- if (view == null) {
- throw new ApiException("视图不存在。");
- }
- // 根据参数动态调整视图规则
- viewService.adjustViewRule(view, sortJsonStr, drillJsonStr);
- // 根据视图规则,获取统计结果
- List<ViewQuotaFilterModel> filterModelList = new ArrayList<>();
- if (StringUtils.isNotEmpty(filterJsonStr)) {
- filterModelList = objectMapper.readValue(filterJsonStr, new TypeReference<List<ViewQuotaFilterModel>>() {
- });
- }
- Aggregations aggregations = viewService.statViewResult(view, filterModelList);
- // 转换统计结果数据格式
- if (view.getDisplayType().equals("1")) {
- //数值型
- Map<String, Object> resultMap = aggregationBuildHandler.numericalDataParsing(view, aggregations.getAsMap());
- envelop.setObj(resultMap);
- } else if (view.getDisplayType().equals("2")) {
- //普通表格
- List<Map<String, Object>> resultList = aggregationBuildHandler.tableDataParsing(view, aggregations.getAsMap());
- envelop.setObj(resultList);
- } else if (view.getDisplayType().equals("3")) {
- //树形表格
- } else {
- //图表
- Option option = aggregationBuildHandler.ehartDataParsing(view, aggregations.getAsMap());
- String echartJson = option.toString();
- envelop.setObj(echartJson);
- }
- } catch (Exception e) {
- e.printStackTrace();
- envelop.setSuccessFlg(false);
- envelop.setErrorMsg(e.getMessage());
- throw new Exception(e);
- }
- return envelop;
- }
- }
|