ViewController.java 7.9 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166
  1. package com.yihu.quota.controller;
  2. import com.fasterxml.jackson.core.type.TypeReference;
  3. import com.github.abel533.echarts.Option;
  4. import com.yihu.ehr.constants.ApiVersion;
  5. import com.yihu.ehr.constants.ServiceApi;
  6. import com.yihu.ehr.controller.EnvelopRestEndPoint;
  7. import com.yihu.ehr.exception.ApiException;
  8. import com.yihu.ehr.util.rest.Envelop;
  9. import com.yihu.quota.model.cube.Cube;
  10. import com.yihu.quota.model.view.View;
  11. import com.yihu.quota.service.cube.CubeService;
  12. import com.yihu.quota.service.view.ViewDimensionService;
  13. import com.yihu.quota.service.view.ViewQuotaService;
  14. import com.yihu.quota.service.view.ViewService;
  15. import com.yihu.quota.util.AggregationBuildHandler;
  16. import com.yihu.quota.util.ElasticSearchHandler;
  17. import com.yihu.quota.util.ReportOption;
  18. import com.yihu.quota.vo.ViewQuotaFilterModel;
  19. import io.swagger.annotations.Api;
  20. import io.swagger.annotations.ApiOperation;
  21. import io.swagger.annotations.ApiParam;
  22. import org.apache.commons.lang3.StringUtils;
  23. import org.elasticsearch.client.transport.TransportClient;
  24. import org.elasticsearch.index.query.BoolQueryBuilder;
  25. import org.elasticsearch.index.query.QueryBuilders;
  26. import org.elasticsearch.search.aggregations.AbstractAggregationBuilder;
  27. import org.elasticsearch.search.aggregations.Aggregation;
  28. import org.elasticsearch.search.aggregations.AggregationBuilders;
  29. import org.elasticsearch.search.aggregations.Aggregations;
  30. import org.elasticsearch.search.aggregations.bucket.filter.FilterAggregationBuilder;
  31. import org.springframework.beans.factory.annotation.Autowired;
  32. import org.springframework.web.bind.annotation.RequestMapping;
  33. import org.springframework.web.bind.annotation.RequestMethod;
  34. import org.springframework.web.bind.annotation.RequestParam;
  35. import org.springframework.web.bind.annotation.RestController;
  36. import java.util.ArrayList;
  37. import java.util.LinkedList;
  38. import java.util.List;
  39. import java.util.Map;
  40. /**
  41. * @author janseny
  42. * @date 2018年9月26日
  43. */
  44. @RestController
  45. @RequestMapping(ApiVersion.Version1_0)
  46. @Api(description = "OLAP 视图 控制入口")
  47. public class ViewController extends EnvelopRestEndPoint {
  48. @Autowired
  49. private ViewService viewService;
  50. @Autowired
  51. private CubeService cubeService;
  52. @Autowired
  53. private AggregationBuildHandler aggregationBuildHandler;
  54. @ApiOperation(value = "添加视图")
  55. @RequestMapping(value = ServiceApi.StatisticView.View.Add, method = RequestMethod.GET)
  56. public Envelop add(
  57. @ApiParam(name = "code", value = "视图code", required = true)
  58. @RequestParam(value = "code", required = true) String code,
  59. @ApiParam(name = "name", value = "视图名称", required = true)
  60. @RequestParam(value = "name", required = true) String name,
  61. @ApiParam(name = "cubeId", value = "多维数据集ID", required = true)
  62. @RequestParam(value = "cubeId", required = true) int cubeId,
  63. @ApiParam(name = "displayType", value = "展示类型 1:数值,2:普通表格,3:树形表格,4:饼图,5:折线图,6:柱状图,7:组合图(折线图+柱状图),8:雷达图,9:旭日图", required = false)
  64. @RequestParam(value = "displayType", required = false) String displayType,
  65. @ApiParam(name = "isDrill", value = "可钻取 1:可以,2:不可以", required = false)
  66. @RequestParam(value = "isDrill", required = false) String isDrill
  67. ) {
  68. Envelop envelop = new Envelop();
  69. envelop.setSuccessFlg(true);
  70. try {
  71. View view = new View();
  72. Cube cube = cubeService.findOne(cubeId);
  73. view.setCode(code);
  74. view.setName(name);
  75. view.setEsIndex(cube.getIndexName());
  76. view.setEsType(cube.getIndexType());
  77. view.setDisplayType(displayType != null ? displayType : "1");
  78. view.setIsDrill(isDrill != null ? isDrill : "1");
  79. viewService.save(view);
  80. } catch (Exception e) {
  81. e.printStackTrace();
  82. envelop.setSuccessFlg(false);
  83. }
  84. return envelop;
  85. }
  86. @ApiOperation(value = "删除视图")
  87. @RequestMapping(value = ServiceApi.StatisticView.View.Delete, method = RequestMethod.DELETE)
  88. public Envelop delete(
  89. @ApiParam(name = "id", value = "ID", required = true)
  90. @RequestParam(value = "id", required = true) int id) {
  91. Envelop envelop = new Envelop();
  92. envelop.setSuccessFlg(true);
  93. viewService.delete(id);
  94. return envelop;
  95. }
  96. @ApiOperation(value = "获取视图的统计结果,并转换成展示的数据格式")
  97. @RequestMapping(value = ServiceApi.StatisticView.View.GetViewStatisticData, method = RequestMethod.GET)
  98. public Envelop getViewStatisticData(
  99. @ApiParam(name = "viewCode", value = "视图编码", required = true)
  100. @RequestParam(value = "viewCode") String viewCode,
  101. @ApiParam(name = "filterJsonStr", value = "过滤条件JSON字符串,上卷/下钻时需动态移除/添加钻取维度值作为过滤条件," +
  102. "如:'[{\"relationType\":\"and\",\"field\":\"event_date\",\"compareType\":\"belong\",\"filterValue\":\"2017-06-11\"}]',relationType 可取值'and|or'。")
  103. @RequestParam(value = "filterJsonStr", required = false) String filterJsonStr,
  104. @ApiParam(name = "sortJsonStr", value = "排序JSON字符串,排序字段从可排序的维度中挑选,如:'{\"cubeCode\":\"xxx\",\"field\":\"event_date\",\"sort\":\"asc\"}',cubeCode 为多维数据集编码。")
  105. @RequestParam(value = "sortJsonStr", required = false) String sortJsonStr,
  106. @ApiParam(name = "drillJsonStr", value = "钻取维度JSON字符串,如:'{\"cubeCode\":\"xxx\",\"field\":\"event_date\",\"replaced\":{\"cubeCode\":\"xxx\",\"field\":\"event_date\"}}'," +
  107. "cubeCode 为多维数据集编码,replaced 为被替换的行维度。")
  108. @RequestParam(value = "drillJsonStr", required = false) String drillJsonStr) throws Exception {
  109. Envelop envelop = new Envelop();
  110. envelop.setSuccessFlg(true);
  111. try {
  112. // 获取视图的完整规则
  113. View view = viewService.getViewRule(viewCode);
  114. if (view == null) {
  115. throw new ApiException("视图不存在。");
  116. }
  117. // 根据参数动态调整视图规则
  118. viewService.adjustViewRule(view, sortJsonStr, drillJsonStr);
  119. // 根据视图规则,获取统计结果
  120. List<ViewQuotaFilterModel> filterModelList = new ArrayList<>();
  121. if (StringUtils.isNotEmpty(filterJsonStr)) {
  122. filterModelList = objectMapper.readValue(filterJsonStr, new TypeReference<List<ViewQuotaFilterModel>>() {
  123. });
  124. }
  125. Aggregations aggregations = viewService.statViewResult(view, filterModelList);
  126. // 转换统计结果数据格式
  127. if (view.getDisplayType().equals("1")) {
  128. //数值型
  129. Map<String, Object> resultMap = aggregationBuildHandler.numericalDataParsing(view, aggregations.getAsMap());
  130. envelop.setObj(resultMap);
  131. } else if (view.getDisplayType().equals("2")) {
  132. //普通表格
  133. List<Map<String, Object>> resultList = aggregationBuildHandler.tableDataParsing(view, aggregations.getAsMap());
  134. envelop.setObj(resultList);
  135. } else if (view.getDisplayType().equals("3")) {
  136. //树形表格
  137. } else {
  138. //图表
  139. Option option = aggregationBuildHandler.ehartDataParsing(view, aggregations.getAsMap());
  140. String echartJson = option.toString();
  141. envelop.setObj(echartJson);
  142. }
  143. } catch (Exception e) {
  144. e.printStackTrace();
  145. envelop.setSuccessFlg(false);
  146. envelop.setErrorMsg(e.getMessage());
  147. throw new Exception(e);
  148. }
  149. return envelop;
  150. }
  151. }