Pārlūkot izejas kodu

站端风机数据查询增加导出,并且对页面初始默认选择前5个风机设备,没选设备不允许查询和导出

xusl 6 mēneši atpakaļ
vecāks
revīzija
3419c4db94

+ 126 - 2
cpp-admin/src/main/java/com/cpp/web/controller/stationDataQuery/WindTurbineStatusDataController.java

@@ -1,18 +1,32 @@
 package com.cpp.web.controller.stationDataQuery;
 
+import cn.hutool.core.date.DateUtil;
+import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
 import com.baomidou.mybatisplus.core.metadata.OrderItem;
 import com.baomidou.mybatisplus.core.toolkit.Wrappers;
 import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
 import com.cpp.common.core.domain.R;
+import com.cpp.web.domain.regulation.TempShortRegulation;
+import com.cpp.web.domain.regulation.TempShortRegulationDetail;
+import com.cpp.web.domain.station.ElectricField;
+import com.cpp.web.domain.station.WindTurbineInfo;
 import com.cpp.web.domain.station.WindTurbineStatusData;
+import com.cpp.web.dto.TableColumn;
+import com.cpp.web.service.station.ElectricFieldService;
+import com.cpp.web.service.station.WindTurbineInfoService;
 import com.cpp.web.service.station.WindTurbineStatusDataService;
 import io.swagger.annotations.Api;
 import io.swagger.annotations.ApiOperation;
 import lombok.RequiredArgsConstructor;
+import lombok.extern.slf4j.Slf4j;
 import org.springframework.web.bind.annotation.*;
 
-import java.util.Date;
-import java.util.List;
+import javax.servlet.http.HttpServletResponse;
+import java.io.BufferedOutputStream;
+import java.io.IOException;
+import java.net.URLEncoder;
+import java.text.SimpleDateFormat;
+import java.util.*;
 
 
 /**
@@ -25,9 +39,12 @@ import java.util.List;
 @RequiredArgsConstructor
 @RequestMapping("/windturbinestatusdata")
 @Api(value = "windturbinestatusdata", tags = "idp_wind_turbine_status_data管理")
+@Slf4j
 public class WindTurbineStatusDataController {
 
     private final WindTurbineStatusDataService windTurbineStatusDataService;
+    private final ElectricFieldService electricFieldService;
+    private final WindTurbineInfoService windTurbineInfoService;
 
     /**
      * 分页查询
@@ -56,4 +73,111 @@ public class WindTurbineStatusDataController {
         page.setMaxLimit((long) -1);
         return R.ok(windTurbineStatusDataService.page(page, windTurbineStatusDataService.getByStationCodeAndEquipmentIdAndTimeBetween(stationCode, equipmentId, new Date(startTime), new Date(endTime))));
     }
+
+    @GetMapping("/export")
+    public void export(String stationCode, String equipmentId, Long startTime, Long endTime, HttpServletResponse response){
+        BufferedOutputStream bos = null;
+        try {
+            ElectricField electricField = electricFieldService.findByStationCode(stationCode);
+            List<WindTurbineInfo> windTurbineInfoList = windTurbineInfoService.findByStationCode(stationCode);
+            List<WindTurbineStatusData> list = windTurbineStatusDataService.list(windTurbineStatusDataService.getByStationCodeAndEquipmentIdAndTimeBetween(stationCode, equipmentId, new Date(startTime), new Date(endTime)));
+            StringBuilder templateContent = new StringBuilder();
+            response.setCharacterEncoding("UTF-8");
+
+            List<String> tableColumns = new ArrayList<>();
+            tableColumns.add("所属场站");
+            tableColumns.add("设备名称");
+            tableColumns.add("时间");
+            tableColumns.add("状态");
+            tableColumns.add("有功(KW)");
+            tableColumns.add("无功(KVar)");
+            tableColumns.add("电压(V)");
+            tableColumns.add("电流(A)");
+            tableColumns.add("转速(rpm)");
+            tableColumns.add("风速(m/s)");
+            tableColumns.add("风向(°)");
+            tableColumns.add("环境温度(℃)");
+            tableColumns.add("桨距角(°)");
+
+
+            String header = "";
+            StringBuilder content = new StringBuilder();
+
+            for (String tableColumn : tableColumns) {
+                header += "\"" + tableColumn + "\",";
+            }
+            SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd");
+            // 设备名称集合
+            Set<String> nameList = new TreeSet<>();
+            if (!list.isEmpty()){
+                list.sort(Comparator.comparing(WindTurbineStatusData::getEquipmentId).thenComparing(WindTurbineStatusData::getTime));
+            }
+            for (WindTurbineStatusData windTurbineStatusData : list) {
+                content.append(electricField.getName() + "," );
+                Optional<String> name = windTurbineInfoList.stream()
+                        .filter(w -> w.getId().longValue()==windTurbineStatusData.getEquipmentId().longValue())
+                        .map(WindTurbineInfo::getName)
+                        .findFirst();
+                content.append(name.get() + "," );
+                nameList.add(name.get());
+                content.append(DateUtil.format(windTurbineStatusData.getTime(),"yyyy-MM-dd HH:mm") + "," );
+                int statusValue = windTurbineStatusData.getStatus();
+                if (statusValue == 1) {
+                    content.append("运行,");
+                } else if (statusValue == 2) {
+                    content.append("待机,");
+                } else if (statusValue == 3) {
+                    content.append("停用,");
+                } else if (statusValue == 4) {
+                    content.append("故障,");
+                }
+                content.append(windTurbineStatusData.getActivePower() + "," );
+                content.append(windTurbineStatusData.getReactivePower() + "," );
+                content.append(windTurbineStatusData.getVoltage() + "," );
+                content.append(windTurbineStatusData.getElectricalCurrent() + "," );
+                content.append(windTurbineStatusData.getWindWheelRatedSpeed() + "," );
+                content.append(windTurbineStatusData.getWs() + "," );
+                content.append(windTurbineStatusData.getWd() + "," );
+                content.append(windTurbineStatusData.getT() + "," );
+                content.append(windTurbineStatusData.getPitchAngle() + "," );
+                content.append("\r\n");
+            }
+
+            header += "\r\n";
+            templateContent.append(header);
+
+            templateContent.append(content.toString());
+
+            String fileName = "";
+            String fileNameDeviceName = "";
+            for (String name : nameList) {
+                fileNameDeviceName += name + "-";
+            }
+            if (sdf.format(startTime).equals(sdf.format(endTime))) {
+                fileName = electricField.getName() + sdf.format(startTime) + "[" +fileNameDeviceName.substring(0,fileNameDeviceName.length()-1) + "].csv";
+            } else {
+                fileName = electricField.getName() + sdf.format(startTime) + "至" + sdf.format(endTime) + "[" +fileNameDeviceName.substring(0,fileNameDeviceName.length()-1) + "].csv";
+            }
+
+            response.setContentType("application/x-msdownload;charset=UTF-8");
+            response.setHeader("Content-disposition", "attachment; filename=" + URLEncoder.encode(fileName, "UTF-8"));
+            byte[] templateContentBytes = templateContent.toString().getBytes("UTF-8");
+            bos = new BufferedOutputStream(response.getOutputStream());
+            bos.write(new byte[]{(byte) 0xEF, (byte) 0xBB, (byte) 0xBF});
+            bos.write(templateContentBytes);
+            response.flushBuffer();
+
+        } catch (Exception e) {
+            log.error("系统错误:" + e.getMessage(), e);
+            throw new RuntimeException(e);
+        } finally {
+            if (bos != null) {
+                try {
+                    bos.close();
+                } catch (IOException e) {
+                    log.error("系统错误:" + e.getMessage(), e);
+                }
+            }
+        }
+    }
 }

+ 89 - 42
cpp-ui/src/views/stationDataQuery/windturbinestatusdata/index.vue

@@ -1,62 +1,64 @@
 <template>
   <div class="app-container">
     <div class="dark-el-input dark-el-button">
-      <el-form ref="queryForm" size="small"  :inline="true" popper-class="cpp-popper">
+      <el-form ref="queryForm" size="small" :inline="true" popper-class="cpp-popper">
         <el-form-item label="时间">
           <el-date-picker
-            :clearable="false"
-            v-model="dateTime"
-            type="datetimerange"
-            range-separator="至"
-            start-placeholder="开始日期"
-            end-placeholder="结束日期"
-            :default-time="['00:00:00', '23:45:00']" popper-class="cpp-popper"
-            :picker-options="pickerOptions"
+              :clearable="false"
+              v-model="dateTime"
+              type="datetimerange"
+              range-separator="至"
+              start-placeholder="开始日期"
+              end-placeholder="结束日期"
+              :default-time="['00:00:00', '23:45:00']" popper-class="cpp-popper"
+              :picker-options="pickerOptions"
           />
         </el-form-item>
         <el-form-item label="场站名称">
           <el-select v-model="stationCode" placeholder="请选择" @change="stationChange" popper-class="cpp-popper">
             <el-option
-              v-for="item in stationList"
-              :key="item.value"
-              :label="item.label"
-              :value="item.value">
+                v-for="item in stationList"
+                :key="item.value"
+                :label="item.label"
+                :value="item.value">
             </el-option>
           </el-select>
         </el-form-item>
         <el-form-item label="风机设备">
-          <el-select v-model="equipmentId" multiple :multiple-limit="5" filterable  collapse-tags  popper-class="cpp-popper">
+          <el-select v-model="equipmentId" multiple :multiple-limit="5" filterable collapse-tags
+                     popper-class="cpp-popper">
             <el-option
-              v-for="item in equipmentOptions"
-              :key="item.value"
-              :label="item.label"
-              :value="item.value">
+                v-for="item in equipmentOptions"
+                :key="item.value"
+                :label="item.label"
+                :value="item.value">
             </el-option>
           </el-select>
         </el-form-item>
         <el-form-item>
-          <el-button type="primary" style="margin-left: 5px" icon="el-icon-search" @click="beforeQuery">查询
+          <el-button type="primary" style="margin-left: 5px" icon="el-icon-search" @click="beforeQuery">查询</el-button>
+          <el-button type="primary" style="margin-left: 5px" icon="el-icon-download" @click="exportFile">导出
           </el-button>
         </el-form-item>
       </el-form>
     </div>
     <div style="padding-top: 10px">
       <vxe-table
-        ref="xTable"
-        align="center"
-        class="mytable-style"
-        auto-resize
-        border
-        resizable
-        export-config
-        highlight-current-row
-        show-overflow
-        :data="tableData"
-        :radio-config="{trigger: 'row'}">
+          ref="xTable"
+          align="center"
+          class="mytable-style"
+          auto-resize
+          border
+          resizable
+          export-config
+          highlight-current-row
+          show-overflow
+          :data="tableData"
+          :radio-config="{trigger: 'row'}">
         <vxe-table-column field="stationCode" title="所属场站" :formatter="stationCodeFormat"></vxe-table-column>
         <vxe-table-column field="equipmentId" title="设备名称" :formatter="nameFormat"></vxe-table-column>
-        <vxe-table-column field="status" title="状态" :formatter="statusFormat"></vxe-table-column>
         <vxe-table-column field="time" title="时间" width="150"></vxe-table-column>
+        <vxe-table-column field="status" title="状态" :formatter="statusFormat"></vxe-table-column>
         <vxe-table-column field="activePower" title="有功(KW)"></vxe-table-column>
         <vxe-table-column field="reactivePower" title="无功(KVar)"></vxe-table-column>
         <vxe-table-column field="voltage" title="电压(V)"></vxe-table-column>
@@ -68,13 +70,13 @@
         <vxe-table-column field="pitchAngle" title="桨距角(°)"></vxe-table-column>
       </vxe-table>
       <vxe-pager
-        background
-        :loading="loading"
-        :current-page.sync="currentPage"
-        :page-size.sync="pageSize"
-        :total="total"
-        @page-change="handlePageChange"
-        :layouts="['PrevJump', 'PrevPage', 'JumpNumber', 'NextPage', 'NextJump', 'Sizes', 'FullJump', 'Total']">
+          background
+          :loading="loading"
+          :current-page.sync="currentPage"
+          :page-size.sync="pageSize"
+          :total="total"
+          @page-change="handlePageChange"
+          :layouts="['PrevJump', 'PrevPage', 'JumpNumber', 'NextPage', 'NextJump', 'Sizes', 'FullJump', 'Total']">
       </vxe-pager>
     </div>
   </div>
@@ -105,7 +107,7 @@ export default {
       day30: 30 * 24 * 3600 * 1000,
       // 日期使用
       pickerOptions: {
-        onPick: ({ maxDate, minDate }) => {
+        onPick: ({maxDate, minDate}) => {
           if (minDate && this.pickerMinDate) {
             this.pickerMinDate = null;
           } else if (minDate) {
@@ -125,16 +127,57 @@ export default {
     // 获取所有风机名称
     this.$axios.get('/windturbineinfo/findAll').then((res) => {
       this.nameList = res.data
+      if (res.data.length > 0) {
+        // 默认选中前5个风机
+        let count = 0
+        for (let i = 0; i < res.data.length; i++) {
+          if (count <= 4) {
+            this.equipmentId.push(res.data[i].value)
+            count++
+          }
+        }
+      }
     }).catch((error) => {
       this.$message.error('获取风机转义名称出错' + error)
     })
-    // 获取场站下拉列表
-    this.getStationCode()
   },
   mounted() {
+    // 获取场站下拉列表
+    this.getStationCode()
   },
   computed: {},
   methods: {
+    exportFile() {
+      if (this.equipmentId.length == 0) {
+        this.$message.error("请选择风机设备查询")
+        return
+      }
+      let startTime = Math.round(this.dateTime[0])
+      let endTime = Math.round(this.dateTime[1])
+      if (endTime <= startTime) {
+        this.$message.error("开始时间不能大于结束时间")
+        return
+      }
+
+      this.loading = true
+      let queryParams = {
+        "stationCode": this.stationCode,
+        "equipmentId": this.equipmentId.join(','),
+        "startTime": startTime,
+        "endTime": endTime,
+      }
+      this.$axios.get('/windturbinestatusdata/export', {
+        params: queryParams,
+        responseType: 'blob',// 用于解决中文乱码
+        headers: {
+          'Content-Type': 'application/json'
+        }
+      }).then(response => {
+        this.loading = false
+      }).catch(() => {
+        this.loading = false
+      })
+    },
     beforeQuery() {
       this.currentPage = 1
       this.pageSize = 10
@@ -176,6 +219,10 @@ export default {
       this.dataQuery();
     },
     dataQuery() {
+      if (this.equipmentId.length == 0) {
+        this.$message.error("请选择风机设备查询")
+        return
+      }
       let startTime = Math.round(this.dateTime[0])
       let endTime = Math.round(this.dateTime[1])
       if (endTime <= startTime) {
@@ -204,7 +251,7 @@ export default {
       const param = {
         "type": 'E2',
       }
-      await this.$axios.get('/electricfield/findByType',{params: param}).then(response => {
+      await this.$axios.get('/electricfield/findByType', {params: param}).then(response => {
         this.stationList = response.data
         if (this.stationList.length > 0) {
           this.stationCode = this.stationList[0].value