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 filterModelList = new ArrayList<>(); if (StringUtils.isNotEmpty(filterJsonStr)) { filterModelList = objectMapper.readValue(filterJsonStr, new TypeReference>() { }); } Aggregations aggregations = viewService.statViewResult(view, filterModelList); // 转换统计结果数据格式 if (view.getDisplayType().equals("1")) { //数值型 Map resultMap = aggregationBuildHandler.numericalDataParsing(view, aggregations.getAsMap()); envelop.setObj(resultMap); } else if (view.getDisplayType().equals("2")) { //普通表格 List> 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; } }