From 179784a106eb61845176bed95242d15fdb8d25ff Mon Sep 17 00:00:00 2001
From: dongyukun <1208714201@qq.com>
Date: 星期五, 15 十一月 2024 17:05:36 +0800
Subject: [PATCH] 预测值导出

---
 iailab-module-data/iailab-module-data-biz/src/main/java/com/iailab/module/data/point/controller/admin/DaPointController.java |    2 
 iailab-module-model/iailab-module-model-biz/src/main/java/com/iailab/module/model/common/utils/ExcelUtil.java                |  292 ++++++++++++++++++++++++++++++++++++++++++++++++
 iailab-module-model/iailab-module-model-biz/src/main/java/com/iailab/module/model/api/controller/admin/McsApiController.java |   45 +++++++
 3 files changed, 338 insertions(+), 1 deletions(-)

diff --git a/iailab-module-data/iailab-module-data-biz/src/main/java/com/iailab/module/data/point/controller/admin/DaPointController.java b/iailab-module-data/iailab-module-data-biz/src/main/java/com/iailab/module/data/point/controller/admin/DaPointController.java
index e4d79db..a1788ea 100644
--- a/iailab-module-data/iailab-module-data-biz/src/main/java/com/iailab/module/data/point/controller/admin/DaPointController.java
+++ b/iailab-module-data/iailab-module-data-biz/src/main/java/com/iailab/module/data/point/controller/admin/DaPointController.java
@@ -166,7 +166,7 @@
             if (end == null) {
                 queryDto.setEnd(new Date());
             } else {
-                queryDto.setStart(formatter.parse(end));
+                queryDto.setEnd(formatter.parse(end));
             }
         } catch (ParseException e) {
             e.printStackTrace();
diff --git a/iailab-module-model/iailab-module-model-biz/src/main/java/com/iailab/module/model/api/controller/admin/McsApiController.java b/iailab-module-model/iailab-module-model-biz/src/main/java/com/iailab/module/model/api/controller/admin/McsApiController.java
index e02730c..f9a7648 100644
--- a/iailab-module-model/iailab-module-model-biz/src/main/java/com/iailab/module/model/api/controller/admin/McsApiController.java
+++ b/iailab-module-model/iailab-module-model-biz/src/main/java/com/iailab/module/model/api/controller/admin/McsApiController.java
@@ -1,20 +1,31 @@
 package com.iailab.module.model.api.controller.admin;
 
+import com.iailab.framework.apilog.core.annotation.ApiAccessLog;
 import com.iailab.framework.common.pojo.CommonResult;
+import com.iailab.framework.excel.core.util.ExcelUtils;
+import com.iailab.module.data.api.point.dto.ApiPointValueQueryDTO;
 import com.iailab.module.model.api.mcs.McsApi;
 import com.iailab.module.model.api.mcs.dto.*;
 import com.iailab.module.model.common.utils.ApiSecurityUtils;
+import com.iailab.module.model.common.utils.ExcelUtil;
 import io.swagger.v3.oas.annotations.Operation;
 import io.swagger.v3.oas.annotations.tags.Tag;
 import lombok.extern.slf4j.Slf4j;
 import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.security.access.prepost.PreAuthorize;
 import org.springframework.web.bind.annotation.*;
 
 import javax.annotation.Resource;
 import javax.annotation.security.PermitAll;
 import javax.servlet.http.HttpServletRequest;
 import javax.servlet.http.HttpServletResponse;
+import java.io.IOException;
+import java.text.SimpleDateFormat;
+import java.util.ArrayList;
+import java.util.Date;
+import java.util.LinkedHashMap;
 import java.util.List;
+import static com.iailab.framework.apilog.core.enums.OperateTypeEnum.EXPORT;
 
 /**
  * @author PanZhibao
@@ -67,4 +78,38 @@
         PreDataItemChartRespVO respVO = mcsApi.getPreDataItemChart(reqVO);
         return CommonResult.success(respVO);
     }
+
+    @GetMapping("/predict-data/exportValue")
+    @Operation(summary = "导出预测数据")
+    @ApiAccessLog(operateType = EXPORT)
+    public void exportPointValue(@RequestParam("itemId") String itemId,
+                                 @RequestParam("startTime") String startTime,
+                                 @RequestParam("endTime") String endTime,
+                                 HttpServletResponse response) throws IOException {
+        SimpleDateFormat formatter = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
+        PreDataItemChartReqVO reqVO = new PreDataItemChartReqVO();
+        reqVO.setItemId(itemId);
+        try {
+            if (startTime == "") {
+                reqVO.setStartTime(new Date((new Date()).getTime() - 60*60*1000));
+            } else {
+                reqVO.setStartTime(formatter.parse(startTime));
+
+            }
+            if (endTime == "") {
+                reqVO.setEndTime(new Date((new Date()).getTime() + 60*60*1000));
+            } else {
+                reqVO.setEndTime(formatter.parse(endTime));
+            }
+        } catch (Exception e) {
+            e.printStackTrace();
+        }
+        PreDataItemChartRespVO respVO = mcsApi.getPreDataItemChart(reqVO);
+        try {
+            String sheetTitle =  "sheet1";
+            ExcelUtil.exportchart(sheetTitle, respVO, response);
+        } catch (Exception ex) {
+            ex.printStackTrace();
+        }
+    }
 }
\ No newline at end of file
diff --git a/iailab-module-model/iailab-module-model-biz/src/main/java/com/iailab/module/model/common/utils/ExcelUtil.java b/iailab-module-model/iailab-module-model-biz/src/main/java/com/iailab/module/model/common/utils/ExcelUtil.java
new file mode 100644
index 0000000..ac1c313
--- /dev/null
+++ b/iailab-module-model/iailab-module-model-biz/src/main/java/com/iailab/module/model/common/utils/ExcelUtil.java
@@ -0,0 +1,292 @@
+package com.iailab.module.model.common.utils;
+
+import com.iailab.module.model.api.mcs.dto.PreDataItemChartRespVO;
+import com.iailab.module.model.api.mcs.dto.PreDataSampleViewRespDTO;
+import org.apache.poi.hssf.usermodel.*;
+import org.apache.poi.ss.usermodel.HorizontalAlignment;
+import org.apache.poi.ss.usermodel.VerticalAlignment;
+import org.apache.poi.ss.util.CellRangeAddress;
+
+import javax.servlet.http.HttpServletResponse;
+import java.io.IOException;
+import java.io.OutputStream;
+import java.lang.reflect.Field;
+import java.text.SimpleDateFormat;
+import java.util.Date;
+import java.util.LinkedHashMap;
+import java.util.List;
+import java.util.Map;
+import java.util.logging.Level;
+import java.util.logging.Logger;
+
+/**
+ * Excel 导出通用工具类
+ *
+ * @author PanZhibao
+ * @date 2021年06月29日 9:06
+ */
+public class ExcelUtil {
+
+    /**
+     * 导出PointValueExcel
+     *
+     * @param sheetTitle
+     * @param title
+     * @param list
+     * @param response
+     * @return
+     */
+    public static byte[] exportPointValue(String sheetTitle, String[] title, List<Object> list, HttpServletResponse response) {
+
+        HSSFWorkbook wb = new HSSFWorkbook();//创建excel表
+        HSSFSheet sheet = wb.createSheet(sheetTitle);
+        sheet.setDefaultColumnWidth(20);//设置默认行宽
+
+        //表头样式(加粗,水平居中,垂直居中)
+        HSSFCellStyle cellStyle = wb.createCellStyle();
+        cellStyle.setAlignment(HorizontalAlignment.CENTER);//水平居中
+        cellStyle.setVerticalAlignment(VerticalAlignment.CENTER);//垂直居中
+
+        HSSFFont fontStyle = wb.createFont();
+
+        cellStyle.setFont(fontStyle);
+
+        //标题样式(加粗,垂直居中)
+        HSSFCellStyle cellStyle2 = wb.createCellStyle();
+        cellStyle2.setVerticalAlignment(VerticalAlignment.CENTER);//垂直居中
+        cellStyle2.setFont(fontStyle);
+
+        //字段样式(垂直居中)
+        HSSFCellStyle cellStyle3 = wb.createCellStyle();
+        cellStyle3.setVerticalAlignment(VerticalAlignment.CENTER);//垂直居中
+
+        //数字样式
+        HSSFCellStyle cellStyle4 = wb.createCellStyle();
+        HSSFDataFormat df = wb.createDataFormat(); // 此处设置数据格式
+        cellStyle4.setVerticalAlignment(VerticalAlignment.CENTER);//垂直居中
+        cellStyle4.setDataFormat(df.getFormat("#,##0.000000"));//设置数值类型格式为保留两位小数
+
+        //创建表头
+        HSSFRow row = sheet.createRow(0);
+        //row.setHeightInPoints(20);//行高
+
+        HSSFCell cell = row.createCell(0);
+        cell.setCellValue(sheetTitle);
+        cell.setCellStyle(cellStyle);
+
+        sheet.addMergedRegion(new CellRangeAddress(0, 0, 0, (title.length - 1)));
+
+        //创建标题
+        HSSFRow rowTitle = sheet.createRow(1);
+        //rowTitle.setHeightInPoints(20);
+
+        HSSFCell hc;
+        for (int i = 0; i < title.length; i++) {
+            hc = rowTitle.createCell(i);
+            hc.setCellValue(title[i]);
+            hc.setCellStyle(cellStyle2);
+        }
+
+        byte result[] = null;
+
+        try {
+            //创建表格数据
+            Field[] fields;
+            int i = 2;
+            for (Object obj : list) {
+                fields = obj.getClass().getDeclaredFields();
+
+                HSSFRow rowBody = sheet.createRow(i);
+                //rowBody.setHeightInPoints(20);
+
+                int j = 0;
+                for (Field f : fields) {
+
+                    f.setAccessible(true);
+
+                    Object va = f.get(obj);
+                    if (null == va) {
+                        va = "";
+                    }
+
+                    hc = rowBody.createCell(j);
+
+                    if (j == 0) {
+                        hc.setCellValue(Double.parseDouble(va.toString()));
+                        hc.setCellStyle(cellStyle4);
+                    } else {
+                        hc.setCellValue(va.toString());
+                        hc.setCellStyle(cellStyle3);
+                    }
+
+
+                    j++;
+                }
+
+                i++;
+            }
+
+            //设置Http响应头告诉浏览器下载这个附件
+            response.setHeader("Content-Disposition", "attachment;Filename=" + System.currentTimeMillis() + ".xls");
+            OutputStream outputStream = response.getOutputStream();
+            wb.write(outputStream);
+            outputStream.close();
+            return wb.getBytes();
+        } catch (Exception ex) {
+            Logger.getLogger(ExcelUtil.class.getName()).log(Level.SEVERE, null, ex);
+            return result;
+        } finally {
+            try {
+                wb.close();
+            } catch (IOException ex) {
+                Logger.getLogger(ExcelUtil.class.getName()).log(Level.SEVERE, null, ex);
+            }
+        }
+    }
+
+    //预测图表数据转excel
+    public static byte[] exportchart(String sheetTitle, PreDataItemChartRespVO respVO, HttpServletResponse response) {
+
+        SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
+
+        HSSFWorkbook wb = new HSSFWorkbook();
+        HSSFSheet sheet = wb.createSheet(sheetTitle);
+        sheet.setDefaultColumnWidth(20);//设置默认行宽
+
+        // 表头样式(加粗,水平居中,垂直居中)
+        HSSFCellStyle cellStyle = wb.createCellStyle();
+        cellStyle.setAlignment(HorizontalAlignment.CENTER);
+        cellStyle.setVerticalAlignment(VerticalAlignment.CENTER);
+        HSSFFont fontStyle = wb.createFont();
+        cellStyle.setFont(fontStyle);
+
+        // 标题样式(加粗,垂直居中)
+        HSSFCellStyle cellStyle2 = wb.createCellStyle();
+        cellStyle2.setVerticalAlignment(VerticalAlignment.CENTER);
+        cellStyle2.setFont(fontStyle);
+
+        // 字段样式(垂直居中)
+        HSSFCellStyle cellStyle3 = wb.createCellStyle();
+        cellStyle3.setVerticalAlignment(VerticalAlignment.CENTER);
+
+        // 数字样式
+        HSSFCellStyle cellStyle4 = wb.createCellStyle();
+        HSSFDataFormat df = wb.createDataFormat();
+        cellStyle4.setVerticalAlignment(VerticalAlignment.CENTER);
+        cellStyle4.setDataFormat(df.getFormat("#,##0.000000"));
+
+        // 创建标题
+        String[] title = new String[respVO.getLegend().size() * 4];
+        for (int i = 0; respVO.getLegend().size() > i; i++) {
+            title[i * 4] = "日期时间";
+            title[i * 4 + 1] = respVO.getLegend().get(i) + ":真实值";
+            title[i * 4 + 2] = "日期时间";
+            title[i * 4 + 3] = respVO.getLegend().get(i) + ":预测值";
+        }
+        HSSFRow rowTitle = sheet.createRow(0);
+        HSSFCell hc;
+        for (int i = 0; i < title.length; i++) {
+            hc = rowTitle.createCell(i);
+            hc.setCellValue(title[i]);
+            hc.setCellStyle(cellStyle2);
+        }
+
+        LinkedHashMap<String, PreDataSampleViewRespDTO> viewMap = respVO.getViewMap();
+        byte result[] = null;
+        try {
+            // 创建表格数据
+            //逐列插入
+            for (int j = 0; viewMap.size() > j; j++) {
+                //去掉标题行,从第一行开始
+                //逐行插入
+                for (Map.Entry<String, PreDataSampleViewRespDTO> entry : viewMap.entrySet()) {
+                    //真实值
+                    List<Object[]> realData = entry.getValue().getRealData();
+                    //预测值
+                    List<Object[]> preDataN = entry.getValue().getPreDataN();
+                    HSSFRow rowBody;
+
+                    //插入真实值
+                    for (int i = 0; realData.size() > i; i++) {
+                        //判断是否创建过行,如果没有创建行,否则更新行
+                        if (sheet.getRow(i + 1) == null) {
+                            rowBody = sheet.createRow(i + 1);
+                        } else {
+                            rowBody = sheet.getRow(i + 1);
+                        }
+                        //插入时间
+                        hc = rowBody.createCell(j * 4);
+                        if (realData.get(i)[0] != null) {
+                            if (realData.get(i)[0] instanceof Date) {
+                                String formattedDate = sdf.format(realData.get(i)[0]);
+                                hc.setCellValue(formattedDate);
+                            } else {
+                                hc.setCellValue(realData.get(i)[0].toString());
+                            }
+                            hc.setCellStyle(cellStyle3);
+                        } else {
+                            hc.setCellValue("");
+                            hc.setCellStyle(cellStyle3);
+                        }
+                        //插入值
+                        hc = rowBody.createCell(j * 4 + 1);
+                        if (realData.get(i)[1] != null) {
+                            hc.setCellValue(realData.get(i)[1].toString());
+                            hc.setCellStyle(cellStyle4);
+                        } else {
+                            hc.setCellValue("");
+                            hc.setCellStyle(cellStyle4);
+                        }
+                    }
+                    //插入预测值
+                    for (int i = 0; preDataN.size() > i; i++) {
+                        //判断是否创建过行,如果没有创建行,否则更新行
+                        if (sheet.getRow(i + 1) == null) {
+                            rowBody = sheet.createRow(i + 1);
+                        } else {
+                            rowBody = sheet.getRow(i + 1);
+                        }
+                        //插入时间
+                        hc = rowBody.createCell(j * 4 + 2);
+                        if (preDataN.get(i)[0] != null) {
+                            if (preDataN.get(i)[0] instanceof Date) {
+                                String formattedDate = sdf.format(preDataN.get(i)[0]);
+                                hc.setCellValue(formattedDate);
+                            } else {
+                                hc.setCellValue(preDataN.get(i)[0].toString());
+                            }
+                            hc.setCellStyle(cellStyle3);
+                        } else {
+                            hc.setCellValue("");
+                            hc.setCellStyle(cellStyle3);
+                        }
+                        //插入值
+                        hc = rowBody.createCell(j * 4 + 3);
+                        if (preDataN.get(i)[1] != null) {
+                            hc.setCellValue(preDataN.get(i)[1].toString());
+                            hc.setCellStyle(cellStyle4);
+                        } else {
+                            hc.setCellValue("");
+                            hc.setCellStyle(cellStyle4);
+                        }
+                    }
+                }
+            }
+            // 设置Http响应头告诉浏览器下载这个附件
+            response.setHeader("Content-Disposition", "attachment;Filename=" + System.currentTimeMillis() + ".xls");
+            OutputStream outputStream = response.getOutputStream();
+            wb.write(outputStream);
+            outputStream.close();
+            return wb.getBytes();
+        } catch (Exception ex) {
+            Logger.getLogger(ExcelUtil.class.getName()).log(Level.SEVERE, null, ex);
+            return result;
+        } finally {
+            try {
+                wb.close();
+            } catch (IOException ex) {
+                Logger.getLogger(ExcelUtil.class.getName()).log(Level.SEVERE, null, ex);
+            }
+        }
+    }
+}
\ No newline at end of file

--
Gitblit v1.9.3