ViewController.java 7.2 KB

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