tl před 4 měsíci
rodič
revize
5fae126436

+ 119 - 135
cpp-admin/src/main/java/com/cpp/web/controller/stationDataQuery/WindTowerStatusDataController.java

@@ -9,6 +9,9 @@ import com.cpp.web.domain.station.WindTowerStatusData;
 import com.cpp.web.service.station.WindTowerStatusDataService;
 import io.swagger.annotations.Api;
 import io.swagger.annotations.ApiOperation;
+import lombok.AllArgsConstructor;
+import lombok.Data;
+import lombok.Getter;
 import lombok.RequiredArgsConstructor;
 import org.springframework.web.bind.annotation.GetMapping;
 import org.springframework.web.bind.annotation.PostMapping;
@@ -82,71 +85,43 @@ public class WindTowerStatusDataController {
         List<BigDecimal> ws80List = new ArrayList<>();
         List<BigDecimal> ws90List = new ArrayList<>();
         List<BigDecimal> ws100List = new ArrayList<>();
-        List<BigDecimal> wdHubHeightList = new ArrayList<>();
-        List<BigDecimal> wd10List = new ArrayList<>();
-        List<BigDecimal> wd30List = new ArrayList<>();
-        List<BigDecimal> wd50List = new ArrayList<>();
-        List<BigDecimal> wd60List = new ArrayList<>();
-        List<BigDecimal> wd70List = new ArrayList<>();
-        List<BigDecimal> wd80List = new ArrayList<>();
-        List<BigDecimal> wd90List = new ArrayList<>();
-        List<BigDecimal> wd100List = new ArrayList<>();
         LinkedHashMap<String, List> wsMap = new LinkedHashMap<>();
 
         Long momentTime = 5 * 60 * 1000L;
         for (Long tempTime = startTime; tempTime <= endTime; tempTime = tempTime + momentTime) {
             // 设置时间
-            String tempTimeStr  = sdf.format(tempTime);
+            String tempTimeStr = sdf.format(tempTime);
             timeList.add(tempTimeStr);
-            if (dataGroupMap.get(tempTimeStr)!=null){
+            if (dataGroupMap.get(tempTimeStr) != null) {
                 WindTowerStatusData windTowerStatusData = dataGroupMap.get(tempTimeStr);
                 // 风速轮毂
                 BigDecimal wsHubHeight = windTowerStatusData.getWsHubHeight();
                 wsHubHeightList.add(wsHubHeight);
-                // 轮毂风向
-                wdHubHeightList.add(windTowerStatusData.getWdHubHeight());
                 // ws10
                 BigDecimal ws10 = windTowerStatusData.getWs10();
                 ws10List.add(ws10);
-                // wd10
-                wd10List.add(windTowerStatusData.getWd10());
                 // ws30
                 BigDecimal ws30 = windTowerStatusData.getWs30();
                 ws30List.add(ws30);
-                // wd30
-                wd30List.add(windTowerStatusData.getWd30());
                 // ws50
                 BigDecimal ws50 = windTowerStatusData.getWs50();
                 ws50List.add(ws50);
-                // wd50
-                wd50List.add(windTowerStatusData.getWd50());
                 // ws60
                 BigDecimal ws60 = windTowerStatusData.getWs60();
                 ws60List.add(ws60);
-                // wd60
-                wd60List.add(windTowerStatusData.getWd60());
                 // ws70
                 BigDecimal ws70 = windTowerStatusData.getWs70();
                 ws70List.add(ws70);
-                // wd70
-                wd70List.add(windTowerStatusData.getWd70());
                 // ws80
                 BigDecimal ws80 = windTowerStatusData.getWs80();
                 ws80List.add(ws80);
-                // wd80
-                wd80List.add(windTowerStatusData.getWd80());
                 // ws90
                 BigDecimal ws90 = windTowerStatusData.getWs90();
                 ws90List.add(ws90);
-                // wd90
-                wd90List.add(windTowerStatusData.getWd90());
                 // ws100
                 BigDecimal ws100 = windTowerStatusData.getWs100();
                 ws100List.add(ws100);
-                // wd100
-                wd100List.add(windTowerStatusData.getWd100());
-            }
-            else{
+            } else {
                 // 风速轮毂
                 wsHubHeightList.add(null);
                 // ws10
@@ -181,121 +156,130 @@ public class WindTowerStatusDataController {
         returnMap.put("tableList", talbeList);
         returnMap.put("wsTime", timeList);
         returnMap.put("wsMap", wsMap);
-
-        LinkedHashMap<String, Float[]> wdMap = new LinkedHashMap<>();
-        Float[] wdHubHeightRate = getCalcWd(wdHubHeightList);
-        Float[] wd10Rate = getCalcWd(wd10List);
-        Float[] wd30Rate = getCalcWd(wd30List);
-        Float[] wd50Rate = getCalcWd(wd50List);
-        Float[] wd60Rate = getCalcWd(wd60List);
-        Float[] wd70Rate = getCalcWd(wd70List);
-        Float[] wd80Rate = getCalcWd(wd80List);
-        Float[] wd90Rate = getCalcWd(wd90List);
-        Float[] wd100Rate = getCalcWd(wd100List);
-        wdMap.put("轮毂风向", wdHubHeightRate);
-        wdMap.put("10米风向", wd10Rate);
-        wdMap.put("30米风向", wd30Rate);
-        wdMap.put("50米风向", wd50Rate);
-        wdMap.put("60米风向", wd60Rate);
-        wdMap.put("70米风向", wd70Rate);
-        wdMap.put("80米风向", wd80Rate);
-        wdMap.put("90米风向", wd90Rate);
-        wdMap.put("100米风向", wd100Rate);
-        returnMap.put("wdMap", wdMap);
+        returnMap.put("wdMap", geWsWdWfData(dataGroupMap.values().stream().collect(Collectors.toList())));
 
         return R.ok(returnMap);
     }
 
     /**
-     * 计算风向
+     * 构造风向风速风频玫瑰图数据
+     *
+     * @param windTowerStatusDataList
      * @return
      */
-    private Float[] getCalcWd(List<BigDecimal> wdList){
-        int[] frequency16 = new int[16];
-        Float[] frequency16Rate = new Float[16];
-        for(BigDecimal b: wdList){
-            if(b!=null){
-                float wdfloat = b.floatValue();
-                //N 北 0 348.76-11.25
-                if( (wdfloat>=348.76F && wdfloat<=360F) || (wdfloat>=0 && wdfloat<= 11.25)){
-                    frequency16[0]++;
-                }
-                //NNE 北东北 22.5 11.26-33.75
-                if(wdfloat>=11.26F && wdfloat<=33.75F){
-                    frequency16[15]++;
-                }
-                //NE 东北 45 33.76-56.25
-                if(wdfloat>=33.76F && wdfloat<=56.25F){
-                    frequency16[14]++;
-                }
-                //ENE 东东北 67.5 56.26-78.75
-                if(wdfloat>=56.26F && wdfloat<=78.75F){
-                    frequency16[13]++;
-                }
-                //E 东 90 78.76-101.25
-                if(wdfloat>=78.76F && wdfloat<=101.25F){
-                    frequency16[12]++;
-                }
-                //ESE 东东南 112.5 101.26-123.75
-                if(wdfloat>=101.26F && wdfloat<=123.75F){
-                    frequency16[11]++;
-                }
-                //SE 东南 135 123.76-146.25
-                if(wdfloat>=123.76F && wdfloat<=146.25F){
-                    frequency16[10]++;
-                }
-                //SSE 南东南 157.5 146.26-168.75
-                if(wdfloat>=146.26F && wdfloat<=168.75F){
-                    frequency16[9]++;
-                }
-                //S 南 180 168.76-191.25
-                if(wdfloat>=168.76F && wdfloat<=191.25F){
-                    frequency16[8]++;
-                }
-                //SSW 南西南 202.5 191.26-213.75
-                if(wdfloat>=191.26F && wdfloat<=213.75F){
-                    frequency16[7]++;
-                }
-                //SW 西南  225 213.76-236.25
-                if(wdfloat>=213.76F && wdfloat<=236.25F){
-                    frequency16[6]++;
-                }
-                //WSW 西西南 247.5 236.26-258.75
-                if(wdfloat>=236.26F && wdfloat<=258.75F){
-                    frequency16[5]++;
-                }
-                //W 西 270 258.76-281.25
-                if(wdfloat>=258.76F && wdfloat<=281.25F){
-                    frequency16[4]++;
-                }
-                //WNW 西西北 295.5 281.26-303.75
-                if(wdfloat>=281.26F && wdfloat<=303.75F){
-                    frequency16[3]++;
-                }
-                //NW 西北 315 303.76-326.25
-                if(wdfloat>=303.76F && wdfloat<=326.25F){
-                    frequency16[2]++;
-                }
-                //NNW 北西北 337.5 326.26-348.
-                if(wdfloat>=326.26F && wdfloat<=348.75F){
-                    frequency16[1]++;
-                }
+    private List geWsWdWfData(List<WindTowerStatusData> windTowerStatusDataList) {
+        Map<WsIntervalEnum, List<WindTowerStatusData>> wsIntervalEnumListMap = windTowerStatusDataList.stream().collect(Collectors.groupingBy(w -> WsIntervalEnum.getWsInterval(w.getWdHubHeight().doubleValue())));
+        List<Map<String,Object>> list = new ArrayList<>();
+
+        for (WsIntervalEnum value : WsIntervalEnum.values()) {
+            Map<String,Object> map = new HashMap<>();
+            Map<String,Object> eumForMap = new HashMap<>();
+            eumForMap.put("explain",value.getExplain());
+            eumForMap.put("color",value.getColor());
+            map.put("key",eumForMap);
+            if (wsIntervalEnumListMap.containsKey(value)) {
+                map.put("value", getCalcWd(wsIntervalEnumListMap.get(value), Double.valueOf(windTowerStatusDataList.size())));
+            } else {
+                map.put("value", new Double[]{0D, 0D, 0D, 0D, 0D, 0D, 0D, 0D, 0D, 0D, 0D, 0D, 0D, 0D, 0D, 0D});
             }
+            list.add(map);
         }
-        BigDecimal sumToltal= new BigDecimal(0);
-        for(int wdf:frequency16){
-            BigDecimal b = new BigDecimal(wdf);
-            sumToltal = sumToltal.add(b);
-        }
 
-        for(int i =0; i<frequency16.length;i++){
-            if(frequency16[i] ==0){
-                frequency16Rate[i]= 0f;
-            }else{
-                BigDecimal dividend = new BigDecimal(frequency16[i]);
-                frequency16Rate[i] =dividend.divide(sumToltal,2, BigDecimal.ROUND_HALF_UP).floatValue();
+        return list;
+    }
+
+    /**
+     * 构造风向风速风频玫瑰图数据
+     *
+     * @param windTowerStatusDataList
+     * @return
+     */
+    private Double[] getCalcWd(List<WindTowerStatusData> windTowerStatusDataList, Double size) {
+        Map<WdEnum, List<WindTowerStatusData>> wdEnumListMap = windTowerStatusDataList.stream().collect(Collectors.groupingBy(w -> WdEnum.getWdEnum(w.getWdHubHeight().doubleValue())));
+
+        Double[] data = new Double[]{0D, 0D, 0D, 0D, 0D, 0D, 0D, 0D, 0D, 0D, 0D, 0D, 0D, 0D, 0D, 0D};
+        if (size != 0) {
+            for (Map.Entry<WdEnum, List<WindTowerStatusData>> wdEnumListEntry : wdEnumListMap.entrySet()) {
+                Double wdSize = Double.valueOf(wdEnumListEntry.getValue().size());
+                data[wdEnumListEntry.getKey().index] = BigDecimal.valueOf(wdSize / size * 100).setScale(2, BigDecimal.ROUND_DOWN).doubleValue();
             }
         }
-        return frequency16Rate;
+        return data;
     }
+
+
+    @Getter
+    @AllArgsConstructor
+    enum WdEnum {
+        N("北", 348.76D, 11.25D, 0),
+        NNE("北东北", 11.26D, 33.75D, 1),
+        NE("东北", 33.76D, 56.25D, 2),
+        ENE("东东北", 56.26D, 78.75D, 3),
+        E("东", 78.76D, 101.25D, 4),
+        ESE("东东南", 101.26D, 123.75D, 5),
+        SE("东南", 123.76D, 146.25D, 6),
+        SSE("南东南", 146.26D, 168.75D, 7),
+        S("南", 168.76D, 191.25D, 8),
+        SSW("南西南", 191.26D, 213.75D, 9),
+        SW("西南", 213.76D, 236.75D, 10),
+        WSW("西西南", 236.26D, 258.75D, 11),
+        W("西", 258.76D, 281.25D, 12),
+        WNW("西西北", 281.26D, 303.75D, 13),
+        NW("西北", 303.76D, 326.25D, 14),
+        NNW("北西北", 326.26D, 348.75D, 15),
+        ;
+        private String explain;
+        private Double min;
+        private Double max;
+        private Integer index;
+
+        public static WdEnum getWdEnum(Double wd) {
+            return (wd >= N.min || wd <= N.max) ? N :
+                    (wd >= NNE.min && wd <= NNE.max) ? NNE :
+                            (wd >= NE.min && wd <= NE.max) ? NE :
+                                    (wd >= ENE.min && wd <= ENE.max) ? ENE :
+                                            (wd >= E.min && wd <= E.max) ? E :
+                                                    (wd >= ESE.min && wd <= ESE.max) ? ESE :
+                                                            (wd >= SE.min && wd <= SE.max) ? SE :
+                                                                    (wd >= SSE.min && wd <= SSE.max) ? SSE :
+                                                                            (wd >= SSW.min && wd <= SSW.max) ? SSW :
+                                                                                    (wd >= SW.min && wd <= SW.max) ? SW :
+                                                                                            (wd >= WSW.min && wd <= WSW.max) ? WSW :
+                                                                                                    (wd >= W.min && wd <= W.max) ? W :
+                                                                                                            (wd >= WNW.min && wd <= WNW.max) ? WNW :
+                                                                                                                    (wd >= NW.min && wd <= NW.max) ? NW :
+                                                                                                                            NNW;
+        }
+    }
+
+
+    @Getter
+    @AllArgsConstructor
+    enum WsIntervalEnum {
+        I1("<0.5m/s", 0D, 0.4D, 0,"rgb(255,0,47)"),
+        I2("0.5~2m/s", 0.5D, 1.9D, 1,"rgba(16,217,16,0.96)"),
+        I3("2~4m/s", 2D, 3.9D, 2,"rgba(15,246,15,0.96)"),
+        I4("4~6m/s", 4D, 5.9D, 3,"rgb(239,248,10)"),
+        I5("6~8m/s", 6D, 7.9D, 4,"rgb(244,245,244)"),
+        I6("8~10m/s", 8D, 9.9D, 5,"rgb(98,206,111)"),
+        I7(">10m/s", 10D, 100D, 5,"rgb(232,236,124)"),
+        ;
+        private String explain;
+        private Double min;
+        private Double max;
+        private Integer index;
+        private String color;
+
+        public static WsIntervalEnum getWsInterval(Double ws) {
+            return (ws >= I2.min && ws <= I2.max) ? I2 :
+                    (ws >= I3.min && ws <= I3.max) ? I3 :
+                            (ws >= I5.min && ws <= I5.max) ? I5 :
+                                    (ws >= I6.min && ws <= I6.max) ? I6 :
+                                            (ws >= I7.min && ws <= I7.max) ? I7 :
+                                                    I1;
+        }
+
+
+    }
+
 }

+ 109 - 125
cpp-ui/src/views/stationDataQuery/windtowerstatusdata/index.vue

@@ -32,14 +32,14 @@
         </el-form-item>
       </el-form>
     </div>
-    <div >
+    <div>
       <div style="display: flex">
         <div style="float:left;width: 65%;height: 350px" id="wscharts"></div>
         <div style="float:left;width: 35%;height: 350px" id="wdcharts"></div>
       </div>
 
       <div class="vxe-max-height">
-<!--        <div>-->
+        <!--        <div>-->
         <vxe-table
           highlight-hover-row
           :keep-source="true"
@@ -54,7 +54,8 @@
           :data="tableData.slice((currentPage-1) * pageSize,currentPage * pageSize)">
           <vxe-table-column field="stationCode" title="场站名称" :formatter="stationCodeFormat" width="200px"
                             fixed="left"></vxe-table-column>
-          <vxe-table-column field="time" title="时间" width="180px" fixed="left" :formatter="timeFormat"></vxe-table-column>
+          <vxe-table-column field="time" title="时间" width="180px" fixed="left"
+                            :formatter="timeFormat"></vxe-table-column>
           <vxe-table-column field="t" title="温度(℃)" width="180px"></vxe-table-column>
           <vxe-table-column field="rh" title="湿度(RH%)" width="180px"></vxe-table-column>
           <vxe-table-column field="pa" title="气压(kPa)" width="180px"></vxe-table-column>
@@ -96,6 +97,7 @@
 import * as echarts from "echarts";
 
 import resize from '../../../utils/mixins/resize'
+
 export default {
   mixins: [resize],
   name: 'inverterinfo',
@@ -684,7 +686,7 @@ export default {
       // 日期使用
       pickerOptions: {
         disabledDate: (time) => {
-         return time.getTime() > new Date(new Date().toLocaleDateString()).getTime() + 24 * 60 * 60 * 1000  - 1;
+          return time.getTime() > new Date(new Date().toLocaleDateString()).getTime() + 24 * 60 * 60 * 1000 - 1;
         }
       },
     }
@@ -709,7 +711,7 @@ export default {
   },
   computed: {},
   methods: {
-    timeFormat({ cellValue, row, column }) {
+    timeFormat({cellValue, row, column}) {
       return this.$moment(cellValue).format('YYYY-MM-DD HH:mm')
     },
     nameFormat({cellValue, row, column}) {
@@ -724,18 +726,17 @@ export default {
       this.currentPage = currentPage
       this.pageSize = pageSize
     },
-    exportFile(){
-      if (this.tableData.length>0){
+    exportFile() {
+      if (this.tableData.length > 0) {
         const item = this.stationList.find(item => item.value === this.stationCode)
         let filename = item.label
         // 文件名日期
         let startTime = this.$moment(this.dateTime[0]).format('YYYY-MM-DD')
         let endTime = this.$moment(this.dateTime[1]).format('YYYY-MM-DD')
-        if (startTime===endTime){
-          filename=filename+startTime
-        }
-        else{
-          filename=filename+startTime+'至'+endTime
+        if (startTime === endTime) {
+          filename = filename + startTime
+        } else {
+          filename = filename + startTime + '至' + endTime
         }
         this.$refs.xTable.exportData({
           filename: filename,
@@ -744,8 +745,7 @@ export default {
           isFooter: true,
           data: this.tableData
         })
-      }
-      else{
+      } else {
         this.$message.error("列表无数据不能导出文件!")
         return
       }
@@ -818,7 +818,7 @@ export default {
           }
         },
         legend: {
-          left:'center',
+          left: 'center',
           top: 20,
           width: '100%',
           icon: 'rect',
@@ -931,120 +931,101 @@ export default {
     },
     wdDraw(wdMap) {
       this.wdChart = echarts.init(document.getElementById('wdcharts'), 'dark')
-      const option = {
-        backgroundColor: 'transparent',
-        color: ['#4A99FF', '#4BFFFC', '#ff654a', '#edff4a', '#65ff4a', '#4affea', '#894aff', '#d84aff', '#ff4aae'],
-        legend: {
-          top: 20,
-          width: 50,
-          icon: 'rect',
-          itemWidth: 14,
-          itemHeight: 5,
-          itemGap: 13,
-          data: [],
-          right: '4%',
-          textStyle: {
-            fontSize: 12,
-            // color: '#F1F1F3'
-          },
-          selected: {}
-        },
+      // 配置玫瑰图
+      let windOption = {
         title: {
-          top: 20,
-          text: '风向玫瑰图',
-          textStyle: {
-            fontWeight: 'normal',
-            fontSize: 16,
-            // color: this.lineColor
-          },
-          left: '15%'
+          text: '风玫瑰图',
+          x: 'left'
         },
         tooltip: {
-          confine: true,
-          trigger: 'axis',
+          trigger: 'item', // 鼠标悬浮时触发数据项
+          formatter: '{b} [{a}]: {c}%', // 显示系列名称和数值
           axisPointer: {
+            type: 'line', // 鼠标悬浮时显示的指示线类型
             lineStyle: {
-              color: '#FFFFFF'
+              color: '#333', // 指示线的颜色
+              width: 2, // 指示线宽度
+            },
+          },
+        },
+        angleAxis: {
+          type: 'category',
+          data: [
+            'N',
+            'NNE',
+            'NE',
+            'ENE',
+            'E',
+            'ESE',
+            'SE',
+            'SSE',
+            'S',
+            'SSW',
+            'SW',
+            'WSW',
+            'W',
+            'WNW',
+            'NW',
+            'NNW'
+          ],
+          z: -1,
+          boundaryGap: true,
+          splitLine: {
+            show: true,
+            lineStyle: {
+              color: '#ddd',
+              type: 'solid'
             }
+          },
+          axisLine: {
+            show: true
           }
         },
-        radar: [
-          {
-            name: {
-              textStyle: {
-                color: '#FFFFFF',
-                fontSize: 16
-              },
-            },
-            splitArea: { // 坐标轴在 grid 区域中的分隔区域,默认不显示。
-              show: true,
-              areaStyle: { // 分隔区域的样式设置。
-                color: ['rgba(255,255,255,0)', 'rgba(255,255,255,0)'], // 分隔区域颜色。分隔区域会按数组中颜色的顺序依次循环设置颜色。默认是一个深浅的间隔色。
-              }
-            },
-            axisLine: { //指向外圈文本的分隔线样式
-              lineStyle: {
-                color: '#FFFFFF'
-              }
-            },
-            splitLine: {
-              lineStyle: {
-                color: '#FFFFFF', // 分隔线颜色
-                width: 1, // 分隔线线宽
-              }
-            },
-            indicator: [
-              {text: 'N', max: 1},
-              {text: 'NNW', max: 1},
-              {text: 'NW', max: 1},
-              {text: 'WNW', max: 1},
-              {text: 'W', max: 1},
-              {text: 'WSW', max: 1},
-              {text: 'SW', max: 1},
-              {text: 'SSW', max: 1},
-              {text: 'S', max: 1},
-              {text: 'SSE', max: 1},
-              {text: 'SE', max: 1},
-              {text: 'ESE', max: 1},
-              {text: 'E', max: 1},
-              {text: 'ENE', max: 1},
-              {text: 'NE', max: 1},
-              {text: 'NNE', max: 1},
-            ],
-            center: ['50%', '50%'],
-            radius: '70%'
+        radiusAxis: {
+          center: ['50%', '50%'],
+          axisLabel: {
+            show: false
           },
-        ],
-        series: [
-          {
-            type: 'radar',
-            tooltip: {
-              trigger: 'item',
-            },
-            areaStyle: {},
-            data: []
-          }
-        ],
-      }
-      var index = 0;
-      for (var key in wdMap) {
-        option.legend.data.push(key)
-        if (key == '轮毂风向') {
-          option.legend.selected[key] = true
-        } else {
-          option.legend.selected[key] = false
+        },
+        grid: {
+          // 控制图的大小,调整下面这些值就可以,
+          x: 40,
+          x2: 100,
+          y2: 150 // y2可以控制 X轴跟Zoom控件之间的间隔,避免以为倾斜后造成 label重叠到zoom上
+        },
+        polar: {},
+        series: [],
+        legend: {
+          show: true,
+          top: 'center',
+          right: 'right',
+          data: [],
+          orient: 'vertical'
         }
-        var wd = new Object
-        wd.name = key
-        wd.value = wdMap[key]
-        wd.connectNulls = true
-        wd.itemStyle = this.itemStyle[index].itemStyle
-        wd.areaStyle = this.itemStyle[index].areaStyle
-        option.series[0].data.push(wd)
-        index++;
       }
 
-      this.wdChart.setOption(option, true)
+      for (let i = 0; i < wdMap.length; i++) {
+        let key = wdMap[i].key
+        let value = wdMap[i].value
+        windOption.legend.data.push(key.explain)
+        windOption.series.push({
+            type: 'bar',
+            data: value,
+            coordinateSystem: 'polar',
+            name: key.explain,
+            stack: 'a',
+            itemStyle: {
+              normal: {
+                color: key.color
+              }
+            },
+            emphasis: {
+              focus: 'series'
+            }
+          }
+        )
+      }
+      this.wdChart.setOption(windOption, true)
       var _this = this
       window.addEventListener("resize", function () {
         _this.wdChart.resize();
@@ -1054,13 +1035,16 @@ export default {
 }
 </script>
 <style>
-.vxe-max-height{
-  .vxe-table--render-default .vxe-table--body-wrapper, .vxe-table--render-default .vxe-table--footer-wrapper {
-    max-height: 38vh !important;
-    overflow-y: auto;
-  }
-  .vxe-table--render-default .vxe-table--fixed-left-wrapper .vxe-table--body-wrapper {
-    max-height: calc(38vh - 6px) !important;
-  }
+.vxe-max-height {
+
+.vxe-table--render-default .vxe-table--body-wrapper, .vxe-table--render-default .vxe-table--footer-wrapper {
+  max-height: 38vh !important;
+  overflow-y: auto;
+}
+
+.vxe-table--render-default .vxe-table--fixed-left-wrapper .vxe-table--body-wrapper {
+  max-height: calc(38vh - 6px) !important;
+}
+
 }
 </style>