Jelajahi Sumber

Merge remote-tracking branch 'origin/20210716' into 20210716

lihui001 3 tahun lalu
induk
melakukan
306c34698d

+ 35 - 9
zoniot-common/zoniot-core-utils/src/main/java/com/zcxk/core/utils/export/EasyExcelUtil.java

@@ -1,6 +1,7 @@
 package com.zcxk.core.utils.export;
 
 import com.alibaba.excel.EasyExcel;
+import com.alibaba.excel.EasyExcelFactory;
 import com.alibaba.excel.ExcelWriter;
 import com.alibaba.excel.metadata.BaseRowModel;
 import com.alibaba.excel.metadata.Sheet;
@@ -16,15 +17,9 @@ import org.apache.poi.ss.usermodel.IndexedColors;
 import org.apache.poi.ss.usermodel.VerticalAlignment;
 
 import javax.servlet.http.HttpServletResponse;
-import java.io.File;
-import java.io.IOException;
-import java.io.OutputStream;
-import java.io.UnsupportedEncodingException;
+import java.io.*;
 import java.net.URLEncoder;
-import java.util.Date;
-import java.util.HashMap;
-import java.util.List;
-import java.util.Map;
+import java.util.*;
 
 /**
  * @ClassName EasyExcelUtil
@@ -78,11 +73,39 @@ public  class EasyExcelUtil {
                 .excelType(ExcelTypeEnum.XLSX)
                 .registerWriteHandler(new CustemhandlerUtils())
                 .registerWriteHandler(EasyExcelUtil.getStyleStrategy())
-                .sheet("Export")
+                .sheet("sheet")
                 .doWrite(data);
     }
 
 
+    public static void excelDynamicWrite(HttpServletResponse response,String excelName, List<String> head,  List<List<Object>> dataList) throws Exception {
+        String fileName =  excelName +"-"+ DateUtil.format(new Date(), "yyyyMMddHHmmss") ;
+        fileName = URLEncoder.encode(fileName, "UTF-8");
+        response.setContentType("application/vnd.ms-excel");
+        response.setCharacterEncoding("utf8");
+        response.setHeader("Content-Disposition", "attachment; filename=" + fileName + ".xlsx");
+        response.setHeader("Pragma", "public");
+        response.setHeader("Cache-Control", "no-store");
+        response.addHeader("Cache-Control", "max-age=0");
+
+
+
+
+
+        List<List<String>> headList = new ArrayList<>();
+        head.forEach(h -> headList.add(Collections.singletonList(h)));
+
+
+        EasyExcel.write(response.getOutputStream())
+                .excelType(ExcelTypeEnum.XLSX)
+                .registerWriteHandler(new CustemhandlerUtils())
+                .registerWriteHandler(EasyExcelUtil.getStyleStrategy())
+                .sheet("sheet").head(headList).doWrite(dataList);
+
+
+    }
+
+
     /**
      * 导出文件时为Writer生成OutputStream.
      *
@@ -153,4 +176,7 @@ public  class EasyExcelUtil {
         // 这个策略是 头是头的样式 内容是内容的样式 其他的策略可以自己实现
         return new HorizontalCellStyleStrategy(headWriteCellStyle, contentWriteCellStyle);
     }
+
+
+
 }

+ 3 - 1
zoniot-rmcp/zoniot-rmcp-core/src/main/java/com/zcxk/rmcp/core/dao/mongo/DeviceDataDao.java

@@ -11,7 +11,9 @@ import org.springframework.data.mongodb.core.query.Query;
 import org.springframework.stereotype.Repository;
 
 import java.util.ArrayList;
+import java.util.Comparator;
 import java.util.List;
+import java.util.stream.Collectors;
 
 /**
  * @author Andy
@@ -93,7 +95,7 @@ public class DeviceDataDao  extends BaseDao<DeviceData, String> implements BaseM
             }
         }
 
-        return list;
+        return list.stream().sorted(Comparator.comparingLong(DeviceDataItem::getReceiveTime).reversed()).collect(Collectors.toList());
 
     }
 }

+ 11 - 0
zoniot-rmcp/zoniot-rmcp-web/src/main/java/com/zcxk/rmcp/web/controller/DeviceController.java

@@ -153,6 +153,17 @@ public class DeviceController {
         return AjaxMessage.success(dataServiceService.getDataItem(deviceDataDto));
     }
 
+    @GetMapping("/getDataExcel")
+    @ApiOperation(value = "导出设备数据excel")
+    public void getDataExcel(
+            @Valid DeviceDataDto deviceDataDto,
+            HttpServletResponse httpServletResponse
+    ) {
+        dataServiceService.getDataExcel(deviceDataDto, httpServletResponse);
+
+    }
+
+
 
     @ResponseBody
     @GetMapping("/queryDeviceInfoList")

+ 3 - 0
zoniot-rmcp/zoniot-rmcp-web/src/main/java/com/zcxk/rmcp/web/service/DeviceDataService.java

@@ -4,6 +4,7 @@ import com.zcxk.rmcp.api.dto.device.DeviceDataDto;
 import com.zcxk.rmcp.api.vo.DeviceDataVo;
 import com.zcxk.rmcp.core.mongo.DeviceDataItem;
 
+import javax.servlet.http.HttpServletResponse;
 import java.util.List;
 
 /**
@@ -23,4 +24,6 @@ public interface DeviceDataService {
     List<DeviceDataVo> getData(DeviceDataDto deviceDataDto);
 
     List<DeviceDataItem> getDataItem(DeviceDataDto deviceDataDto);
+
+    void getDataExcel(DeviceDataDto deviceDataDto, HttpServletResponse httpServletResponse);
 }

+ 69 - 2
zoniot-rmcp/zoniot-rmcp-web/src/main/java/com/zcxk/rmcp/web/service/impl/DeviceDataServiceImpl.java

@@ -1,19 +1,29 @@
 package com.zcxk.rmcp.web.service.impl;
 
+import cn.hutool.core.date.DatePattern;
+import cn.hutool.core.date.DateUtil;
+import cn.hutool.core.map.MapUtil;
+import com.zcxk.core.utils.export.EasyExcelUtil;
 import com.zcxk.rmcp.api.dto.device.DeviceDataDto;
 import com.zcxk.rmcp.api.vo.DeviceDataVo;
+import com.zcxk.rmcp.api.vo.MeasuringPointVo;
+import com.zcxk.rmcp.api.vo.ProductMeasuringDictVo;
+import com.zcxk.rmcp.core.dao.DeviceMapper;
 import com.zcxk.rmcp.core.dao.mongo.DeviceDataDao;
+import com.zcxk.rmcp.core.entity.Device;
 import com.zcxk.rmcp.core.mongo.DeviceData;
 import com.zcxk.rmcp.core.mongo.DeviceDataItem;
 import com.zcxk.rmcp.web.service.DeviceDataService;
+import com.zcxk.rmcp.web.service.ProductMeasuringPointService;
 import lombok.extern.slf4j.Slf4j;
 import org.apache.commons.lang3.StringUtils;
+import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.stereotype.Service;
 import org.springframework.util.CollectionUtils;
 
 import javax.annotation.Resource;
-import java.util.ArrayList;
-import java.util.List;
+import javax.servlet.http.HttpServletResponse;
+import java.util.*;
 
 /**
  * 
@@ -26,6 +36,10 @@ public class DeviceDataServiceImpl implements DeviceDataService {
 
     @Resource
     private DeviceDataDao deviceDataDao;
+    @Resource
+    private DeviceMapper deviceMapper;
+    @Autowired
+    private ProductMeasuringPointService productMeasuringPointService;
 
     @Override
     public List<DeviceDataVo> getData(DeviceDataDto deviceDataDto) {
@@ -58,4 +72,57 @@ public class DeviceDataServiceImpl implements DeviceDataService {
         return deviceDataDao.queryDeviceDataItem(deviceDataDto.getDeviceId(),deviceDataDto.getStartDate(),
                 deviceDataDto.getEndDate());
     }
+
+    @Override
+    public void getDataExcel(DeviceDataDto deviceDataDto, HttpServletResponse httpServletResponse) {
+        List<DeviceDataItem> list = deviceDataDao.queryDeviceDataItem(deviceDataDto.getDeviceId(),deviceDataDto.getStartDate(),
+                deviceDataDto.getEndDate());
+
+        Device device = deviceMapper.findById(deviceDataDto.getDeviceId());
+        List<MeasuringPointVo> measuringList = productMeasuringPointService.getMeasuringPoint(device.getProductId());
+
+
+        try {
+
+            List<String> head = getHeadList(measuringList);
+
+            List<List<Object>> dataList = new ArrayList<>();
+            for (DeviceDataItem deviceDataItem : list) {
+                List<Object> item = new ArrayList<>();
+                item.add(DateUtil.format(new Date(deviceDataItem.getReceiveTime()), DatePattern.NORM_DATETIME_PATTERN));
+                for (MeasuringPointVo vo : measuringList) {
+                    item.add(getRowsValue(vo,deviceDataItem.getMeasureData()));
+                }
+                dataList.add(item);
+            }
+
+
+            EasyExcelUtil.excelDynamicWrite(httpServletResponse,"历史数据",head,dataList);
+        } catch (Exception e) {
+            e.printStackTrace();
+        }
+
+    }
+
+    private Object getRowsValue(MeasuringPointVo vo, Map<String, Object> measureData) {
+
+        String value = MapUtil.getStr(measureData,vo.getMeasuringCode());
+        if (value != null) {
+            Optional<ProductMeasuringDictVo> measuringOptional = vo.getDictList().stream().filter(dto -> StringUtils.equals(value,dto.getDataValue())).findFirst();
+            if (measuringOptional.isPresent() && StringUtils.equals("1",vo.getMeasuringDataType())) {
+                return  measuringOptional.get().getDataName();
+            }
+        }
+        return  value;
+
+    }
+
+    private List<String> getHeadList(List<MeasuringPointVo> measuringList){
+        List<String> head = new ArrayList<>();
+        head.add("上报时间");
+        measuringList.forEach(m -> head.add(m.getMeasuringName()));
+        return head;
+    }
+
+
 }