Browse Source

折线图取数调整

chenw 6 years ago
parent
commit
d85e31f0fb

+ 32 - 4
bi-server/src/main/java/com/usoftchina/bi/server/dao/chart/ShowChartsMapper.java

@@ -261,23 +261,51 @@ public interface ShowChartsMapper {
     /**
      * 柱状图无分组取数
      * @param fieldName
-     * @param columnName
+     * @param tableName
      * @param condition
+     * @param sort
+     * @param rule
      * @return
      */
     @Select("SELECT ${fieldName} FROM ${tableName} WHERE ${condition} ORDER BY ${sort} ${rule}")
-    List<HistogramData> getHistogramValueWithoutGroup(@Param("fieldName") String fieldName, @Param("tableName") String columnName, @Param("condition") String condition,
+    List<HistogramData> getHistogramValueWithoutGroup(@Param("fieldName") String fieldName, @Param("tableName") String tableName, @Param("condition") String condition,
                                                       @Param("sort") String sort, @Param("rule") String rule);
 
     /**
      * 柱状图分组取数
      * @param fieldName
-     * @param columnName
+     * @param tableName
      * @param condition
      * @param groupCondition
+     * @param sort
+     * @param rule
      * @return
      */
     @Select("SELECT ${fieldName} FROM ${tableName} WHERE ${condition} GROUP BY ${groupCondition} ORDER BY ${sort} ${rule}")
-    List<HistogramGroupData> getHistogramValueWithGroup(@Param("fieldName") String fieldName, @Param("tableName") String columnName, @Param("condition") String condition, @Param("groupCondition") String groupCondition,
+    List<HistogramGroupData> getHistogramValueWithGroup(@Param("fieldName") String fieldName, @Param("tableName") String tableName, @Param("condition") String condition, @Param("groupCondition") String groupCondition,
                                                         @Param("sort") String sort, @Param("rule") String rule);
+
+    /**
+     * 折线图无分组取数
+     * @param fieldName
+     * @param tableName
+     * @param condition
+     * @return
+     */
+    @Select("SELECT ${fieldName} FROM ${tableName} WHERE ${condition} ORDER BY ${sort} ${rule}")
+    List<LineSeriesMap> getLineValueWithoutGroup(@Param("fieldName") String fieldName, @Param("tableName") String tableName, @Param("condition") String condition,
+                                                 @Param("sort") String sort, @Param("rule") String rule);
+
+    /**
+     * 折线图分组取数
+     * @param fieldName
+     * @param tableName
+     * @param condition
+     * @param groupCondition
+     * @return
+     */
+    @Select("SELECT ${fieldName} FROM ${tableName} WHERE ${condition} GROUP BY ${groupCondition} ORDER BY ${sort} ${rule}")
+    List<LineSeriesGroupMap> getLineValueWithGroup(@Param("fieldName") String fieldName, @Param("tableName") String tableName, @Param("condition") String condition, @Param("groupCondition") String groupCondition,
+                                                   @Param("sort") String sort, @Param("rule") String rule);
+
 }

+ 8 - 0
bi-server/src/main/java/com/usoftchina/bi/server/model/bo/LineSeries.java

@@ -22,6 +22,14 @@ public class LineSeries {
         this.mdata = mdata;
     }
 
+    public LineSeries() {
+    }
+
+    public LineSeries(String name, List<LineSeriesMap> mdata) {
+        this.name = name;
+        this.mdata = mdata;
+    }
+
     @Override
     public String toString() {
         return "LineSeries{" +

+ 8 - 6
bi-server/src/main/java/com/usoftchina/bi/server/model/bo/LineSeriesGroupMap.java

@@ -1,16 +1,18 @@
 package com.usoftchina.bi.server.model.bo;
 
-public class LineSeriesGroupMap {
+import java.io.Serializable;
+
+public class LineSeriesGroupMap implements Serializable {
     private String date;
     private Double value;
-    private String group;
+    private String groupName;
 
-    public String getGroup() {
-        return group;
+    public String getGroupName() {
+        return groupName;
     }
 
-    public void setGroup(String group) {
-        this.group = group;
+    public void setGroupName(String groupName) {
+        this.groupName = groupName;
     }
 
     public String getDate() {

+ 3 - 1
bi-server/src/main/java/com/usoftchina/bi/server/model/bo/LineSeriesMap.java

@@ -1,6 +1,8 @@
 package com.usoftchina.bi.server.model.bo;
 
-public class LineSeriesMap {
+import java.io.Serializable;
+
+public class LineSeriesMap implements Serializable {
     private String date;
     private Double value;
 

+ 3 - 1
bi-server/src/main/java/com/usoftchina/bi/server/model/bo/PieSeriesMap.java

@@ -1,6 +1,8 @@
 package com.usoftchina.bi.server.model.bo;
 
-public class PieSeriesMap {
+import java.io.Serializable;
+
+public class PieSeriesMap implements Serializable {
     private Double value;
     private String name;
 

+ 3 - 1
bi-server/src/main/java/com/usoftchina/bi/server/model/po/TargetData.java

@@ -1,6 +1,8 @@
 package com.usoftchina.bi.server.model.po;
 
-public class TargetData {
+import java.io.Serializable;
+
+public class TargetData implements Serializable{
     private int id;
     private Double data;
 

+ 61 - 101
bi-server/src/main/java/com/usoftchina/bi/server/service/chart/ShowLineService.java

@@ -13,11 +13,14 @@ import com.usoftchina.bi.core.jdbc.DynamicDataSourceContextHolder;
 import com.usoftchina.bi.server.utils.ScreenUtil;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.stereotype.Service;
+import org.springframework.util.Assert;
+import org.springframework.util.StringUtils;
 
 import java.util.ArrayList;
 import java.util.Iterator;
 import java.util.List;
 import java.util.Map;
+import java.util.stream.Collectors;
 
 @Service
 public class ShowLineService {
@@ -38,132 +41,89 @@ public class ShowLineService {
     Line数据展示
      */
     public RepEntity showLine(LineConfigInfo lineConfigInfo, String token, int dashId, String styleConfig){
+        Assert.notNull(lineConfigInfo, "请求参数不能为空");
+         /* 变量定义 */
         ChartsDataInfo chartsDataInfo = new ChartsDataInfo();
-        chartsDataInfo.setStyleConfig(styleConfig);
+        String xColumn = lineConfigInfo.getxAxis().getColumnRename(),
+               yColumn = lineConfigInfo.getyAxis().getColumnRename(),
+               yType = lineConfigInfo.getyAxis().getShowDataType(),
+               yAxisType = CalculationJudgeUtil.Judge(yType),
+               xAxisType = lineConfigInfo.getxAxis().getShowDataType();
+        List<String> groupBy = lineConfigInfo.getGroups(),
+                     xAxisData = new ArrayList<String>();       //X轴自己用
+        List<LineSeries> serieses = new ArrayList<LineSeries>();    //生成柱状图的系列
+        List<Screen> filters = lineConfigInfo.getFilters();
+        ScreenStr scr = new ScreenStr();
+        String screen = "",                                 //正常筛选条件
+               screenToColumn = "",                         //跟目标列相同的筛选条件
+               screenToColumnS = "";                        //跟目标列相同的筛选条件
         TimeReture timeReture = new TimeReture();
-        if (lineConfigInfo == null || "".equals(lineConfigInfo)){
-            return new RepEntity(RepCode.Null);
-        }
         int id = lineConfigInfo.getId();
-        //获取列配置
+        int baseId = getChartsDataUtilService.getBaseId(id);
         ChartsColumnConfig chartsColumn = chartsConfigMapper.getChartsColumn(id);
-        if (chartsColumn == null || "".equals(chartsColumn)){
+        String tableName = chartsUtilService.getSqlStr(token, id, dashId);
+        /* 参数校验 */
+        if (StringUtils.isEmpty(chartsColumn)){
             return new RepEntity(RepCode.Null);
         }
-        String style = chartsColumn.getChartStyle();
-        String config = chartsColumn.getChartConfig();
-        chartsDataInfo.setChartsColumnConfig(chartsColumn);
-
-
-        String tableName = chartsUtilService.getSqlStr(token, id, dashId);
-        if ("".equals(tableName)){
+        if (StringUtils.isEmpty(tableName)){
             return new RepEntity(RepCode.NoAuthority);
         }
-
-        int baseId = getChartsDataUtilService.getBaseId(id);
-
+        if (StringUtils.isEmpty(xColumn) || StringUtils.isEmpty(yColumn)){
+            return new RepEntity(RepCode.nullAxis);
+        }
+        /* 取数逻辑 */
         try{
             if (!DynamicDataSourceContextHolder.isContainsDataSource(baseId)) {
                 return new RepEntity(RepCode.DataSourceNull);
             } else {
                 DynamicDataSourceContextHolder.setDataSourceType(baseId);
             }
-
-        String xColumn = lineConfigInfo.getxAxis().getColumnRename();
-        String yColumn = lineConfigInfo.getyAxis().getColumnRename();
-
-        String xAxisType = lineConfigInfo.getxAxis().getShowDataType();
-        List<String> groupBy = lineConfigInfo.getGroups();
-
-        if (xColumn == null || "".equals(xColumn) || yColumn == null || "".equals(yColumn)){
-            return new RepEntity(RepCode.nullAxis);
-        }
-
-        String yType = lineConfigInfo.getyAxis().getShowDataType();
-        String yAxisType = CalculationJudgeUtil.Judge(yType);
-
-
-
-        List<LineSeriesMap> value = new ArrayList<LineSeriesMap>();
-        List<LineSeries> serieses = new ArrayList<LineSeries>();    //生成柱状图的系列
-        List<String> xAxisData = new ArrayList<String>();  //X轴自己用
-
-        //取筛选列表
-        List<Screen> screens = lineConfigInfo.getFilters();
-        ScreenStr scr = new ScreenStr();
-        String screen = "";               //正常筛选条件
-        String screenToColumn = "";       //跟目标列相同的筛选条件
-        String screenToColumnS = "";       //跟目标列相同的筛选条件
-        if ("".equals(screens) || screens == null || screens.size() == 0){
-            screen = "";
-        }else {
-            scr = screenUtil.screensUtil(screens, xColumn, xAxisType);
-            screen = scr.getRet();
-            screenToColumn = scr.getWithColumnRet();
-            StringBuilder sb = new StringBuilder(screenToColumn);
-            if (screenToColumn != null && !("".equals(screenToColumn))){
-                screenToColumnS = screenToColumn + " " + screen;               //and
-                screenToColumn = String.valueOf(sb .replace(1, 5, "where "));
-                screen = screenToColumn + " " + screen;         //where
-            } else {
-                StringBuilder sb1 = new StringBuilder(screen);
-                screenToColumnS = screen;
-                screen = String.valueOf(sb1 .replace(1, 5, "where "));
+            //条件语句处理
+            if (!CollectionUtils.isEmpty(filters)) {
+                scr = screenUtil.screensUtil(filters, xColumn, xAxisType);
+                screen = scr.getRet();
+                screenToColumn = scr.getWithColumnRet();
+                if (!StringUtils.isEmpty(screenToColumn)){
+                    screenToColumnS = screenToColumn.startsWith(" and ") ? (screenToColumn.substring(5) + " " + screen) : (screenToColumn+ " " + screen);
+                } else {
+                    screenToColumnS = screen.startsWith(" and ") ? screen.substring(5) : screen;
+                }
+            }else {
+                screenToColumnS = " 1 = 1 ";
             }
-        }
-
-        //X轴
-        //判断是否为日期类型
-            timeReture = timeConverterUtil.timeConverter(xColumn, tableName, xAxisType, screen, lineConfigInfo.getMaxCount());
-            xAxisData = timeReture.getValues();
-            chartsDataInfo.setTooMany(timeReture.isOverdose());
-
-        if ("".equals(xAxisData) || xAxisData == null || xAxisData.size() == 0){
-            return new RepEntity(RepCode.Null);
-        }
-
-        //无分组时Y值
-        value = showChartsMapper.getTimeValues(yAxisType, yColumn, tableName, xColumn, screen);
-        LineSeries series = new LineSeries();
-        series.setMdata(value);
-
-        serieses.add(series);
-
-        //有分组
-        if (groupBy.size() != 0){
-            serieses.remove(0);
-            Iterator itGroup = groupBy.iterator();  //分组数
-
-            //遍历分组
-            while (itGroup.hasNext()){
-                String groupByName = (String) itGroup.next();
-                List<String> groupsData = showChartsMapper.getGroups(groupByName,tableName, screenToColumnS, lineConfigInfo.getMaxCount()); //查询每个分组系列
-                if (groupsData.size() == 0)
-                    continue;
-                Iterator itGroupsData = groupsData.iterator();
-                if (groupsData.size() > lineConfigInfo.getMaxCount()){
+            xColumn = TimeConverterUtil.convertToOracleDateStr(xColumn, xAxisType);         //X轴 -> 折线图X轴只能为日期类型
+            String fieldName = yAxisType + "(" + yColumn + ") as value,nvl(" + xColumn + ",'空') as \"date\" ";
+            String condition = screenToColumnS + " GROUP BY " + xColumn;
+            String sort = xColumn, rule = "ASC";
+            if (CollectionUtils.isEmpty(groupBy)) {
+                List<LineSeriesMap> lineSeriesMapList = showChartsMapper.getLineValueWithoutGroup(fieldName, tableName, condition, sort, rule);
+                xAxisData = lineSeriesMapList.stream().map(LineSeriesMap::getDate).collect(Collectors.toList());
+                if (CollectionUtils.isEmpty(xAxisData)) {
+                    return new RepEntity(RepCode.Null);
+                }
+                if (xAxisData.size() > lineConfigInfo.getMaxCount()) {
                     chartsDataInfo.setTooMany(true);
                 }
-                String groupsName = (String)itGroupsData.next();
-
-                List<LineSeriesGroupMap> lineSeriesGroupMapList = showChartsMapper.getGroupsValuesTime(yAxisType, yColumn, tableName, groupByName, groupsName, xColumn, "'YYYY-MM-DD'",screenToColumnS);
-                Map<String, List<LineSeriesGroupMap>> lineSeriesGroupMap = CollectionUtils.groupBy(lineSeriesGroupMapList, LineSeriesGroupMap::getGroup);
+                serieses.add(new LineSeries(null, lineSeriesMapList));
+            }else {
+                fieldName = fieldName + ", nvl(" + groupBy.get(0) + ",'空') as groupName ";
+                condition = screenToColumnS;
+                String groupCondition = xColumn + "," + groupBy.get(0);
+                List<LineSeriesGroupMap> lineSeriesGroupMapList = showChartsMapper.getLineValueWithGroup(fieldName, tableName, condition, groupCondition,sort, rule);
+                Map<String, List<LineSeriesGroupMap>> lineSeriesGroupMap = CollectionUtils.groupBy(lineSeriesGroupMapList, LineSeriesGroupMap::getGroupName);
                 Iterator<Map.Entry<String, List<LineSeriesGroupMap>>> it = lineSeriesGroupMap.entrySet().iterator();
                 List<LineSeriesMap> lineSeriesMapList = null;
                 while (it.hasNext()) {
                     Map.Entry<String, List<LineSeriesGroupMap>> entry = it.next();
-                    LineSeries lineSeries = new LineSeries();
-                    lineSeries.setName(entry.getKey());
                     lineSeriesMapList = new ArrayList<>();
                     copyProperties(entry.getValue(), lineSeriesMapList);
-                    lineSeries.setMdata(lineSeriesMapList);
-                    serieses.add(lineSeries);
+                    serieses.add(new LineSeries(entry.getKey(), lineSeriesMapList));
                 }
             }
-        }
-
-        chartsDataInfo.setSerieses(serieses);
-
+            chartsDataInfo.setStyleConfig(styleConfig);
+            chartsDataInfo.setChartsColumnConfig(chartsColumn);
+            chartsDataInfo.setSerieses(serieses);
         }catch (Exception e){
             e.printStackTrace();
             if (e.getCause().getMessage().contains("ORA-00904:")) {

+ 1 - 1
bi-server/src/test/java/com/usoftchina/bi/test/server/controller/chart/ChartsConfigControllerTest.java

@@ -100,7 +100,7 @@ public class ChartsConfigControllerTest extends BaseControllerTest {
                 .header("token", token))
                 .andReturn();
         RepEntity<List> repEntity = result(result, List.class);
-        logger.info("result={}", JsonUtils.toJsonString(repEntity.getData()));
+        logger.info("result={}", JsonUtils.toJsonString(repEntity.getDate()));
     }*/
 
 }