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.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 = "filters", value = "过滤条件JSON字符串,如:'[{\"relationType\":\"and\",\"field\":\"event_date\",\"compareType\":\"belong\",\"filterValue\":\"2017-06-11\"}]'") @RequestParam(value = "filters", required = false) String filters, @ApiParam(name = "sort", value = "排序JSON字符串,排序字段从可排序的维度中挑选,如:'{\"field\":\"event_date\",\"type\":\"asc\"}'") @RequestParam(value = "sort", required = false) String sort, @ApiParam(name = "drillDimension", value = "钻取维度编码,如:'{\"field\":\"event_date\"}'") @RequestParam(value = "drillDimension", required = false) String drillDimension) { Envelop envelop = new Envelop(); envelop.setSuccessFlg(true); try { // 根据视图规则,获取统计结果 List filterModelList = new ArrayList<>(); if (StringUtils.isNotEmpty(filters)) { filterModelList = objectMapper.readValue(filters, new TypeReference>() { }); } View view = viewService.findByCode(viewCode); if(view == null){ logger.debug("视图不存在"); return null; } Aggregations aggregations = viewService.statViewResult(viewCode, 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); } return envelop; } }