Преглед на файлове

质量月报 - word下载趋势图部分

wangggziwen преди 1 година
родител
ревизия
afeb59a9dd

+ 1 - 0
master/src/main/java/com/ruoyi/framework/config/SecurityConfig.java

@@ -132,6 +132,7 @@ public class SecurityConfig extends WebSecurityConfigurerAdapter
                 .antMatchers("/safecheck/dailycheck/downloadDailycheckPdf").anonymous()
                 .antMatchers("/safecheck/weekcheck/downloadWeekcheck").anonymous()
                 .antMatchers("/safecheck/weekcheck/downloadWeekcheckPdf").anonymous()
+                .antMatchers("/production/quality/export").anonymous()
                 // 除上面外的所有请求全部需要鉴权认证
                 .anyRequest().authenticated()
                 .and()

+ 115 - 40
master/src/main/java/com/ruoyi/project/production/controller/TMonthlyQualityReportController.java

@@ -3,21 +3,27 @@ package com.ruoyi.project.production.controller;
 import com.ruoyi.common.utils.DateUtils;
 import com.ruoyi.common.utils.StringUtils;
 import com.ruoyi.common.utils.file.ExcelUtils;
+import com.ruoyi.framework.config.RuoYiConfig;
 import com.ruoyi.framework.web.controller.BaseController;
 import com.ruoyi.framework.web.domain.AjaxResult;
 import com.ruoyi.project.production.controller.vo.*;
 import com.ruoyi.project.production.domain.*;
 import com.ruoyi.project.production.service.*;
-import com.ruoyi.project.system.service.ISysDeptService;
-import com.ruoyi.project.system.service.ISysDictTypeService;
 import com.ruoyi.project.system.service.ISysUserService;
+import org.apache.poi.openxml4j.exceptions.InvalidFormatException;
 import org.apache.poi.ss.usermodel.*;
+import org.apache.poi.util.Units;
+import org.apache.poi.xwpf.usermodel.XWPFDocument;
+import org.apache.poi.xwpf.usermodel.XWPFParagraph;
+import org.apache.poi.xwpf.usermodel.XWPFRun;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.security.access.prepost.PreAuthorize;
 import org.springframework.web.bind.annotation.*;
 import org.springframework.web.multipart.MultipartFile;
+import sun.misc.BASE64Encoder;
 
-import java.io.IOException;
+import javax.servlet.http.HttpServletResponse;
+import java.io.*;
 import java.math.BigDecimal;
 import java.math.BigInteger;
 import java.math.RoundingMode;
@@ -37,12 +43,6 @@ public class TMonthlyQualityReportController extends BaseController
     @Autowired
     private ISysUserService userService;
 
-    @Autowired
-    private ISysDictTypeService iSysDictTypeService;
-
-    @Autowired
-    private ISysDeptService iSysDeptService;
-
     @Autowired
     private ITMonthlyQualityReportS0501Service tMonthlyQualityReportS0501Service;
 
@@ -561,8 +561,10 @@ public class TMonthlyQualityReportController extends BaseController
     @GetMapping("/c2ReactorTable")
     public AjaxResult c2ReactorTable(MonthlyQualityReportQueryVO vo)
     {
-        Date startDate = vo.getStartDate();
-        Date endDate = vo.getEndDate();
+        return AjaxResult.success(this.calcC2ReactorTable(vo.getStartDate(), vo.getEndDate()));
+    }
+
+    private C2ReactorTableVO calcC2ReactorTable(Date startDate, Date endDate) {
         //1st inlet
         TMonthlyQualityReportS3009 tMonthlyQualityReportS3009 = new TMonthlyQualityReportS3009();
         tMonthlyQualityReportS3009.setStartDate(startDate);
@@ -829,9 +831,9 @@ public class TMonthlyQualityReportController extends BaseController
                 && ethane2InAvg.compareTo(BigDecimal.ZERO) != 0 && ethylene2InAvg.compareTo(BigDecimal.ZERO) != 0 && acetylene2InAvg.compareTo(BigDecimal.ZERO) != 0) {
             ethyleneSelectivity1stIn = BigDecimal.TEN.multiply(BigDecimal.TEN)
                     .multiply(((ethylene2InAvg.divide(ethane2InAvg.add(ethylene2InAvg).add(acetylene2InAvg), 5, RoundingMode.HALF_UP))
-                    .subtract(ethylene1InAvg.divide(ethane1InAvg.add(ethylene1InAvg).add(acetylene1InAvg), 5, RoundingMode.HALF_UP)))
-                    .divide(((acetylene1InAvg.divide(ethane1InAvg.add(ethylene1InAvg).add(acetylene1InAvg), 5, RoundingMode.HALF_UP))
-                    .subtract(acetylene2InAvg.divide(ethane2InAvg.add(ethylene2InAvg).add(acetylene2InAvg), 5, RoundingMode.HALF_UP))), 5, RoundingMode.HALF_UP));
+                            .subtract(ethylene1InAvg.divide(ethane1InAvg.add(ethylene1InAvg).add(acetylene1InAvg), 5, RoundingMode.HALF_UP)))
+                            .divide(((acetylene1InAvg.divide(ethane1InAvg.add(ethylene1InAvg).add(acetylene1InAvg), 5, RoundingMode.HALF_UP))
+                                    .subtract(acetylene2InAvg.divide(ethane2InAvg.add(ethylene2InAvg).add(acetylene2InAvg), 5, RoundingMode.HALF_UP))), 5, RoundingMode.HALF_UP));
         }
         if ((pd1InAvg.add(ma1InAvg)).compareTo(BigDecimal.ZERO) != 0) {
             mapdConversion1stIn = BigDecimal.TEN.multiply(BigDecimal.TEN)
@@ -843,9 +845,9 @@ public class TMonthlyQualityReportController extends BaseController
                 && pd2InAvg.compareTo(BigDecimal.ZERO) != 0 && ma2InAvg.compareTo(BigDecimal.ZERO) != 0) {
             propyleneSelectivity1stIn = BigDecimal.TEN.multiply(BigDecimal.TEN)
                     .multiply(((propylene2InAvg.divide((propane2InAvg.add(propylene2InAvg).add(pd2InAvg).add(ma2InAvg)), 5, RoundingMode.HALF_UP))
-                     .subtract(propylene1InAvg.divide((propane1InAvg.add(propylene1InAvg).add(pd1InAvg).add(ma1InAvg)), 5, RoundingMode.HALF_UP)))
-                     .divide((((pd1InAvg.add(ma1InAvg)).divide((propane1InAvg.add(propylene1InAvg).add(pd1InAvg).add(ma1InAvg)), 5, RoundingMode.HALF_UP))
-                     .subtract((pd2InAvg.add(ma2InAvg).divide((propane2InAvg.add(propylene2InAvg).add(pd2InAvg).add(ma2InAvg)), 5, RoundingMode.HALF_UP)))), 5, RoundingMode.HALF_UP));
+                            .subtract(propylene1InAvg.divide((propane1InAvg.add(propylene1InAvg).add(pd1InAvg).add(ma1InAvg)), 5, RoundingMode.HALF_UP)))
+                            .divide((((pd1InAvg.add(ma1InAvg)).divide((propane1InAvg.add(propylene1InAvg).add(pd1InAvg).add(ma1InAvg)), 5, RoundingMode.HALF_UP))
+                                    .subtract((pd2InAvg.add(ma2InAvg).divide((propane2InAvg.add(propylene2InAvg).add(pd2InAvg).add(ma2InAvg)), 5, RoundingMode.HALF_UP)))), 5, RoundingMode.HALF_UP));
         }
         if (acetylene2InAvg.compareTo(BigDecimal.ZERO) != 0) {
             acetyleneConversion2ndIn = BigDecimal.TEN.multiply(BigDecimal.TEN)
@@ -859,9 +861,9 @@ public class TMonthlyQualityReportController extends BaseController
                 && ethane3InAvg.compareTo(BigDecimal.ZERO) != 0 && ethylene3InAvg.compareTo(BigDecimal.ZERO) != 0 && acetylene3InAvg.compareTo(BigDecimal.ZERO) != 0) {
             ethyleneSelectivity2ndIn = BigDecimal.TEN.multiply(BigDecimal.TEN)
                     .multiply(((ethylene3InAvg.divide(ethane3InAvg.add(ethylene3InAvg).add(acetylene3InAvg), 5, RoundingMode.HALF_UP))
-                    .subtract(ethylene2InAvg.divide(ethane2InAvg.add(ethylene2InAvg).add(acetylene2InAvg), 5, RoundingMode.HALF_UP)))
-                    .divide(((acetylene2InAvg.divide(ethane2InAvg.add(ethylene2InAvg).add(acetylene2InAvg), 5, RoundingMode.HALF_UP))
-                    .subtract(acetylene3InAvg.divide(ethane3InAvg.add(ethylene3InAvg).add(acetylene3InAvg), 5, RoundingMode.HALF_UP))), 5, RoundingMode.HALF_UP));
+                            .subtract(ethylene2InAvg.divide(ethane2InAvg.add(ethylene2InAvg).add(acetylene2InAvg), 5, RoundingMode.HALF_UP)))
+                            .divide(((acetylene2InAvg.divide(ethane2InAvg.add(ethylene2InAvg).add(acetylene2InAvg), 5, RoundingMode.HALF_UP))
+                                    .subtract(acetylene3InAvg.divide(ethane3InAvg.add(ethylene3InAvg).add(acetylene3InAvg), 5, RoundingMode.HALF_UP))), 5, RoundingMode.HALF_UP));
         }
         if ((pd2InAvg.add(ma2InAvg)).compareTo(BigDecimal.ZERO) != 0) {
             mapdConversion2ndIn = BigDecimal.TEN.multiply(BigDecimal.TEN)
@@ -873,9 +875,9 @@ public class TMonthlyQualityReportController extends BaseController
                 && pd3InAvg.compareTo(BigDecimal.ZERO) != 0 && ma3InAvg.compareTo(BigDecimal.ZERO) != 0) {
             propyleneSelectivity2ndIn = BigDecimal.TEN.multiply(BigDecimal.TEN)
                     .multiply(((propylene3InAvg.divide((propane3InAvg.add(propylene3InAvg).add(pd3InAvg).add(ma3InAvg)), 5, RoundingMode.HALF_UP))
-                    .subtract(propylene2InAvg.divide((propane2InAvg.add(propylene2InAvg).add(pd2InAvg).add(ma2InAvg)), 5, RoundingMode.HALF_UP)))
-                    .divide((((pd2InAvg.add(ma2InAvg)).divide((propane2InAvg.add(propylene2InAvg).add(pd2InAvg).add(ma2InAvg)), 5, RoundingMode.HALF_UP))
-                    .subtract((pd3InAvg.add(ma3InAvg).divide((propane3InAvg.add(propylene3InAvg).add(pd3InAvg).add(ma3InAvg)), 5, RoundingMode.HALF_UP)))), 5, RoundingMode.HALF_UP));
+                            .subtract(propylene2InAvg.divide((propane2InAvg.add(propylene2InAvg).add(pd2InAvg).add(ma2InAvg)), 5, RoundingMode.HALF_UP)))
+                            .divide((((pd2InAvg.add(ma2InAvg)).divide((propane2InAvg.add(propylene2InAvg).add(pd2InAvg).add(ma2InAvg)), 5, RoundingMode.HALF_UP))
+                                    .subtract((pd3InAvg.add(ma3InAvg).divide((propane3InAvg.add(propylene3InAvg).add(pd3InAvg).add(ma3InAvg)), 5, RoundingMode.HALF_UP)))), 5, RoundingMode.HALF_UP));
         }
         if (acetylene3InAvg.compareTo(BigDecimal.ZERO) != 0) {
             acetyleneConversion3rdIn = BigDecimal.TEN.multiply(BigDecimal.TEN)
@@ -889,9 +891,9 @@ public class TMonthlyQualityReportController extends BaseController
                 && ethane3OutAvg.compareTo(BigDecimal.ZERO) != 0 && ethylene3OutAvg.compareTo(BigDecimal.ZERO) != 0 && acetylene3OutAvg.compareTo(BigDecimal.ZERO) != 0) {
             ethyleneSelectivity3rdIn = BigDecimal.TEN.multiply(BigDecimal.TEN)
                     .multiply(((ethylene3OutAvg.divide(ethane3OutAvg.add(ethylene3OutAvg).add(acetylene3OutAvg), 5, RoundingMode.HALF_UP))
-                    .subtract(ethylene3InAvg.divide(ethane3InAvg.add(ethylene3InAvg).add(acetylene3InAvg), 5, RoundingMode.HALF_UP)))
-                    .divide(((acetylene3InAvg.divide(ethane3InAvg.add(ethylene3InAvg).add(acetylene3InAvg), 5, RoundingMode.HALF_UP))
-                    .subtract(acetylene3OutAvg.divide(ethane3OutAvg.add(ethylene3OutAvg).add(acetylene3OutAvg), 5, RoundingMode.HALF_UP))), 5, RoundingMode.HALF_UP));
+                            .subtract(ethylene3InAvg.divide(ethane3InAvg.add(ethylene3InAvg).add(acetylene3InAvg), 5, RoundingMode.HALF_UP)))
+                            .divide(((acetylene3InAvg.divide(ethane3InAvg.add(ethylene3InAvg).add(acetylene3InAvg), 5, RoundingMode.HALF_UP))
+                                    .subtract(acetylene3OutAvg.divide(ethane3OutAvg.add(ethylene3OutAvg).add(acetylene3OutAvg), 5, RoundingMode.HALF_UP))), 5, RoundingMode.HALF_UP));
         }
         if ((pd3InAvg.add(ma3InAvg)).compareTo(BigDecimal.ZERO) != 0) {
             mapdConversion3rdIn = BigDecimal.TEN.multiply(BigDecimal.TEN)
@@ -903,9 +905,9 @@ public class TMonthlyQualityReportController extends BaseController
                 && pd3OutAvg.compareTo(BigDecimal.ZERO) != 0 && ma3OutAvg.compareTo(BigDecimal.ZERO) != 0) {
             propyleneSelectivity3rdIn = BigDecimal.TEN.multiply(BigDecimal.TEN)
                     .multiply(((propylene3OutAvg.divide((propane3OutAvg.add(propylene3OutAvg).add(pd3OutAvg).add(ma3OutAvg)), 5, RoundingMode.HALF_UP))
-                    .subtract(propylene3InAvg.divide((propane3InAvg.add(propylene3InAvg).add(pd3InAvg).add(ma3InAvg)), 5, RoundingMode.HALF_UP)))
-                    .divide((((pd3InAvg.add(ma3InAvg)).divide((propane3InAvg.add(propylene3InAvg).add(pd3InAvg).add(ma3InAvg)), 5, RoundingMode.HALF_UP))
-                    .subtract((pd3OutAvg.add(ma3OutAvg).divide((propane3OutAvg.add(propylene3OutAvg).add(pd3OutAvg).add(ma3OutAvg)), 5, RoundingMode.HALF_UP)))), 5, RoundingMode.HALF_UP));
+                            .subtract(propylene3InAvg.divide((propane3InAvg.add(propylene3InAvg).add(pd3InAvg).add(ma3InAvg)), 5, RoundingMode.HALF_UP)))
+                            .divide((((pd3InAvg.add(ma3InAvg)).divide((propane3InAvg.add(propylene3InAvg).add(pd3InAvg).add(ma3InAvg)), 5, RoundingMode.HALF_UP))
+                                    .subtract((pd3OutAvg.add(ma3OutAvg).divide((propane3OutAvg.add(propylene3OutAvg).add(pd3OutAvg).add(ma3OutAvg)), 5, RoundingMode.HALF_UP)))), 5, RoundingMode.HALF_UP));
         }
         if (acetylene1InAvg.compareTo(BigDecimal.ZERO) != 0) {
             acetyleneConversion3rdOut = BigDecimal.TEN.multiply(BigDecimal.TEN)
@@ -915,9 +917,9 @@ public class TMonthlyQualityReportController extends BaseController
                 && ethane3OutAvg.compareTo(BigDecimal.ZERO) != 0 && ethylene3OutAvg.compareTo(BigDecimal.ZERO) != 0 && acetylene3OutAvg.compareTo(BigDecimal.ZERO) != 0) {
             ethyleneSelectivity3rdOut = BigDecimal.TEN.multiply(BigDecimal.TEN)
                     .multiply(((ethylene3OutAvg.divide(ethane3OutAvg.add(ethylene3OutAvg).add(acetylene3OutAvg), 5, RoundingMode.HALF_UP))
-                    .subtract(ethylene1InAvg.divide(ethane1InAvg.add(ethylene1InAvg).add(acetylene1InAvg), 5, RoundingMode.HALF_UP)))
-                    .divide(((acetylene1InAvg.divide(ethane1InAvg.add(ethylene1InAvg).add(acetylene1InAvg), 5, RoundingMode.HALF_UP))
-                    .subtract(acetylene3OutAvg.divide(ethane3OutAvg.add(ethylene3OutAvg).add(acetylene3OutAvg), 5, RoundingMode.HALF_UP))), 5, RoundingMode.HALF_UP));
+                            .subtract(ethylene1InAvg.divide(ethane1InAvg.add(ethylene1InAvg).add(acetylene1InAvg), 5, RoundingMode.HALF_UP)))
+                            .divide(((acetylene1InAvg.divide(ethane1InAvg.add(ethylene1InAvg).add(acetylene1InAvg), 5, RoundingMode.HALF_UP))
+                                    .subtract(acetylene3OutAvg.divide(ethane3OutAvg.add(ethylene3OutAvg).add(acetylene3OutAvg), 5, RoundingMode.HALF_UP))), 5, RoundingMode.HALF_UP));
         }
         if ((pd1InAvg.add(ma1InAvg)).compareTo(BigDecimal.ZERO) != 0) {
             mapdConversion3rdOut = BigDecimal.TEN.multiply(BigDecimal.TEN)
@@ -929,9 +931,9 @@ public class TMonthlyQualityReportController extends BaseController
                 && pd3OutAvg.compareTo(BigDecimal.ZERO) != 0 && ma3OutAvg.compareTo(BigDecimal.ZERO) != 0) {
             propyleneSelectivity3rdOut = BigDecimal.TEN.multiply(BigDecimal.TEN)
                     .multiply(((propylene3OutAvg.divide((propane3OutAvg.add(propylene3OutAvg).add(pd3OutAvg).add(ma3OutAvg)), 5, RoundingMode.HALF_UP))
-                    .subtract(propylene1InAvg.divide((propane1InAvg.add(propylene1InAvg).add(pd1InAvg).add(ma1InAvg)), 5, RoundingMode.HALF_UP)))
-                    .divide((((pd1InAvg.add(ma1InAvg)).divide((propane1InAvg.add(propylene1InAvg).add(pd1InAvg).add(ma1InAvg)), 5, RoundingMode.HALF_UP))
-                    .subtract((pd3OutAvg.add(ma3OutAvg).divide((propane3OutAvg.add(propylene3OutAvg).add(pd3OutAvg).add(ma3OutAvg)), 5, RoundingMode.HALF_UP)))), 5, RoundingMode.HALF_UP));
+                            .subtract(propylene1InAvg.divide((propane1InAvg.add(propylene1InAvg).add(pd1InAvg).add(ma1InAvg)), 5, RoundingMode.HALF_UP)))
+                            .divide((((pd1InAvg.add(ma1InAvg)).divide((propane1InAvg.add(propylene1InAvg).add(pd1InAvg).add(ma1InAvg)), 5, RoundingMode.HALF_UP))
+                                    .subtract((pd3OutAvg.add(ma3OutAvg).divide((propane3OutAvg.add(propylene3OutAvg).add(pd3OutAvg).add(ma3OutAvg)), 5, RoundingMode.HALF_UP)))), 5, RoundingMode.HALF_UP));
         }
         C2ReactorTableVO tableVO = new C2ReactorTableVO();
         tableVO.setEthane1InAvg(ethane1InAvg);
@@ -981,7 +983,7 @@ public class TMonthlyQualityReportController extends BaseController
         tableVO.setEthyleneSelectivity3rdOut(ethyleneSelectivity3rdOut);
         tableVO.setMapdConversion3rdOut(mapdConversion3rdOut);
         tableVO.setPropyleneSelectivity3rdOut(propyleneSelectivity3rdOut);
-        return AjaxResult.success(tableVO);
+        return tableVO;
     }
 
     /**
@@ -1150,8 +1152,10 @@ public class TMonthlyQualityReportController extends BaseController
     @GetMapping("/c3ReactorTable")
     public AjaxResult c3ReactorTable(MonthlyQualityReportQueryVO vo)
     {
-        Date startDate = vo.getStartDate();
-        Date endDate = vo.getEndDate();
+        return AjaxResult.success(this.calcC3ReactorTable(vo.getStartDate(), vo.getEndDate()));
+    }
+
+    private C3ReactorTableVO calcC3ReactorTable(Date startDate, Date endDate) {
         //in
         TMonthlyQualityReportS5010 tMonthlyQualityReportS5010 = new TMonthlyQualityReportS5010();
         tMonthlyQualityReportS5010.setStartDate(startDate);
@@ -1240,7 +1244,7 @@ public class TMonthlyQualityReportController extends BaseController
             propyleneSelectivity = BigDecimal.TEN.multiply(BigDecimal.TEN).multiply(((propyleneOutAvg.divide(propaneOutAvg.add(propyleneOutAvg).add(pdOutAvg).add(maOutAvg), 2, RoundingMode.HALF_UP))
                     .subtract(propyleneInAvg.divide(propaneInAvg.add(propyleneInAvg).add(pdInAvg).add(maInAvg), 2, RoundingMode.HALF_UP)))
                     .divide(((pdInAvg.add(maInAvg)).divide(propaneInAvg.add(propyleneInAvg).add(pdInAvg).add(maInAvg), 2, RoundingMode.HALF_UP))
-                    .subtract((pdOutAvg.add(maOutAvg)).divide(propaneOutAvg.add(propyleneOutAvg).add(pdOutAvg).add(maOutAvg), 2, RoundingMode.HALF_UP)), 2, RoundingMode.HALF_UP));
+                            .subtract((pdOutAvg.add(maOutAvg)).divide(propaneOutAvg.add(propyleneOutAvg).add(pdOutAvg).add(maOutAvg), 2, RoundingMode.HALF_UP)), 2, RoundingMode.HALF_UP));
         }
         C3ReactorTableVO tableVO = new C3ReactorTableVO();
         tableVO.setPropaneInAvg(propaneInAvg);
@@ -1253,7 +1257,7 @@ public class TMonthlyQualityReportController extends BaseController
         tableVO.setMaOutAvg(maOutAvg);
         tableVO.setConversion(conversion);
         tableVO.setPropyleneSelectivity(propyleneSelectivity);
-        return AjaxResult.success(tableVO);
+        return tableVO;
     }
 
     /**
@@ -2431,4 +2435,75 @@ public class TMonthlyQualityReportController extends BaseController
         logger.info("successNumber:" +String.valueOf(successNumber));
         return AjaxResult.success("成功导入: " + String.valueOf(successNumber) + " 条");
     }
+
+    /**
+     * 导出质量月报
+     */
+    @PostMapping("/export")
+    public AjaxResult export(HttpServletResponse response,
+                             @RequestParam("files") MultipartFile[] files,
+                             @RequestParam("startDate") Date startDate,
+                             @RequestParam("endDate") Date endDate) throws IOException, InvalidFormatException {
+        // 碳二反应器性能指标表格数据
+        C2ReactorTableVO c2ReactorTableVO = this.calcC2ReactorTable(startDate, endDate);
+        // 碳三反应器性能指标表格数据
+        C3ReactorTableVO c3ReactorTableVO = this.calcC3ReactorTable(startDate, endDate);
+        // echarts截图
+        String[] base64Image = new String[15];
+        for (MultipartFile file : files) {
+            // 文件名
+            String fileName = file.getOriginalFilename();
+            // base64编码
+            BASE64Encoder encoder = new BASE64Encoder();
+            String baseStr = encoder.encode(file.getBytes());
+            baseStr = baseStr.replaceAll("\r\n", "");
+            switch (fileName) {
+                case "chart1.jpg": base64Image[0] = baseStr; break;
+                case "chart2.jpg": base64Image[1] = baseStr; break;
+                case "chart3.jpg": base64Image[2] = baseStr; break;
+                case "chart4.jpg": base64Image[3] = baseStr; break;
+                case "chart5.jpg": base64Image[4] = baseStr; break;
+                case "chart6.jpg": base64Image[5] = baseStr; break;
+                case "chart7.jpg": base64Image[6] = baseStr; break;
+                case "chart8.jpg": base64Image[7] = baseStr; break;
+                case "chart9.jpg": base64Image[8] = baseStr; break;
+                case "chart10.jpg": base64Image[9] = baseStr; break;
+                case "chart11.jpg": base64Image[10] = baseStr; break;
+                case "chart12.jpg": base64Image[11] = baseStr; break;
+                case "chart13.jpg": base64Image[12] = baseStr; break;
+                case "chart14.jpg": base64Image[13] = baseStr; break;
+                case "chart15.jpg": base64Image[14] = baseStr; break;
+            }
+        }
+        // 创建一个新的Word文档
+        XWPFDocument document = new XWPFDocument();
+        for (int i = 0; i < 15; i++) {
+            // 创建一个段落
+            XWPFParagraph paragraph = document.createParagraph();
+            XWPFRun run = paragraph.createRun();
+            // base64解码
+            byte[] decode = Base64.getDecoder().decode(base64Image[i]);
+            // 在段落中添加图片
+            run.addPicture(new ByteArrayInputStream(decode), XWPFDocument.PICTURE_TYPE_PNG, "chart"+ (i + 1) +".png", Units.toEMU(400), Units.toEMU(200));
+            // 换行
+            run.addBreak();
+            if (i == 9) {
+                // todo:c2 table
+            } else if (i == 10) {
+                // todo:c3 table
+            }
+        }
+        // 保存文档
+        String fileName = UUID.randomUUID().toString() + "_" + "质量月报.docx";
+        String downloadPath = RuoYiConfig.getDownloadPath() + fileName;
+        File desc = new File(downloadPath);
+        if (!desc.getParentFile().exists())
+        {
+            desc.getParentFile().mkdirs();
+        }
+        FileOutputStream out = new FileOutputStream(downloadPath);
+        document.write(out);
+        out.close();
+        return AjaxResult.success(fileName);
+    }
 }

+ 9 - 0
ui/src/api/production/quality.js

@@ -35,3 +35,12 @@ export function c3ReactorTable(query) {
     params: query
   })
 }
+
+// 导出质量月报
+export function exportQuality(file) {
+  return request({
+    url: '/production/quality/export',
+    method: 'post',
+    params: file
+  })
+}

+ 6 - 13
ui/src/views/production/quality/index.vue

@@ -19,6 +19,7 @@
     <el-row :gutter="10" class="mb8">
         <el-col :span="1.5">
           <el-button
+            type="info"
             icon="el-icon-upload2"
             size="mini"
             @click="handleImport"
@@ -41,16 +42,8 @@
           size="mini"
           @click="handleReport"
           v-hasPermi="['production:quality:list']"
-        >生成报告</el-button>
+        >报告生成</el-button>
       </el-col>
-      <!--<el-col :span="1.5">-->
-        <!--<el-button-->
-          <!--type="info"-->
-          <!--icon="el-icon-download"-->
-          <!--size="mini"-->
-          <!--v-hasPermi="['production:quality:export']"-->
-        <!--&gt;报告下载</el-button>-->
-      <!--</el-col>-->
 	  <right-toolbar :showSearch.sync="showSearch" @queryTable="getList"></right-toolbar>
     </el-row>
 
@@ -2651,7 +2644,7 @@ export default {
     getListS1301() {
       this.loadingS1301 = true;
       listS1301(this.queryParams).then(response => {
-        this.s1301List = response.data;
+        this.s1301List = response.data.dataList;
         this.loadingS1301 = false;
       });
     },
@@ -2749,7 +2742,7 @@ export default {
     getListS4501() {
       this.loadingS4501 = true;
       listS4501(this.queryParams).then(response => {
-        this.s4501List = response.data;
+        this.s4501List = response.data.dataList;
         this.loadingS4501 = false;
       });
     },
@@ -2784,7 +2777,7 @@ export default {
     getListS6101() {
       this.loadingS6101 = true;
       listS6101(this.queryParams).then(response => {
-        this.s6101List = response.data
+        this.s6101List = response.data.dataList;
         this.loadingS6101 = false;
       });
     },
@@ -2798,7 +2791,7 @@ export default {
     getListS6301() {
       this.loadingS6301 = true;
       listS6301(this.queryParams).then(response => {
-        this.s6301List = response.data;
+        this.s6301List = response.data.dataList;
         this.loadingS6301 = false;
       });
     },

+ 103 - 37
ui/src/views/production/quality/report.vue

@@ -1,25 +1,33 @@
 <template>
   <div class="app-container">
+    <div style="margin-bottom: 50px;">
+      <el-button
+        type="info"
+        icon="el-icon-download"
+        size="mini"
+        @click="handelDownloadReport"
+      >报告下载</el-button>
+    </div>
     <div id="chart1"></div>
-    <div class="description">{{analysisDescription1}}</div>
+    <!--<div class="description">{{analysisDescription1}}</div>-->
     <div id="chart2"></div>
-    <div class="description">{{analysisDescription2}}</div>
+    <!--<div class="description">{{analysisDescription2}}</div>-->
     <div id="chart3"></div>
-    <div class="description">{{analysisDescription3}}</div>
+    <!--<div class="description">{{analysisDescription3}}</div>-->
     <div id="chart4"></div>
-    <div class="description">{{analysisDescription4}}</div>
+    <!--<div class="description">{{analysisDescription4}}</div>-->
     <div id="chart5"></div>
-    <div class="description">{{analysisDescription5}}</div>
+    <!--<div class="description">{{analysisDescription5}}</div>-->
     <div id="chart6"></div>
-    <div class="description">{{analysisDescription6}}</div>
+    <!--<div class="description">{{analysisDescription6}}</div>-->
     <div id="chart7"></div>
-    <div class="description">{{analysisDescription7}}</div>
+    <!--<div class="description">{{analysisDescription7}}</div>-->
     <div id="chart8"></div>
-    <div class="description">{{analysisDescription8}}</div>
+    <!--<div class="description">{{analysisDescription8}}</div>-->
     <div id="chart9"></div>
-    <div class="description">{{analysisDescription9}}</div>
+    <!--<div class="description">{{analysisDescription9}}</div>-->
     <div id="chart10"></div>
-    <div class="description">{{analysisDescription10}}</div>
+    <!--<div class="description">{{analysisDescription10}}</div>-->
     <table id="tableC2">
       <tr>
         <td colspan="5" class="td-transparent">BYC performance of C2 reactor</td>
@@ -117,7 +125,7 @@
       </tr>
     </table>
     <div id="chart11"></div>
-    <div class="description">{{analysisDescription11}}</div>
+    <!--<div class="description">{{analysisDescription11}}</div>-->
     <table id="tableC3">
       <tr>
         <td colspan="2" class="td-transparent">BYC performance of C3 reactor </td>
@@ -160,17 +168,18 @@
       </tr>
     </table>
     <div id="chart12"></div>
-    <div class="description">{{analysisDescription12}}</div>
+    <!--<div class="description">{{analysisDescription12}}</div>-->
     <div id="chart13"></div>
-    <div class="description">{{analysisDescription13}}</div>
+    <!--<div class="description">{{analysisDescription13}}</div>-->
     <div id="chart14"></div>
-    <div class="description">{{analysisDescription14}}</div>
+    <!--<div class="description">{{analysisDescription14}}</div>-->
     <div id="chart15"></div>
-    <div class="description">{{analysisDescription15}}</div>
+    <!--<div class="description">{{analysisDescription15}}</div>-->
   </div>
 </template>
 
 <script>
+  import axios from 'axios';
 import { listS0501, listS0501Month, getS0501, delS0501, addS0501, updateS0501, exportS0501 } from "@/api/production/s0501";
 import { listS1301, getS1301, delS1301, addS1301, updateS1301, exportS1301 } from "@/api/production/s1301";
 import { listS2002, getS2002, delS2002, addS2002, updateS2002, exportS2002 } from "@/api/production/s2002";
@@ -250,6 +259,65 @@ export default {
     this.handleQuery();
   },
   methods: {
+    handelDownloadReport() {
+      function btof(data, fileName) {
+        const dataArr = data.split(',')
+        const byteString = atob(dataArr[1])
+        const options = {
+          type: 'image/jpeg',
+          endings: 'native'
+        }
+        const u8Arr = new Uint8Array(byteString.length)
+        for (let i = 0; i < byteString.length; i++) {
+          u8Arr[i] = byteString.charCodeAt(i)
+        }
+        return new File([u8Arr], fileName + '.jpg', options)
+      }
+      // 调用函数btof  base64是图片的64数据格式  后面是文件名字
+      const image1 = btof(this.chart1.getDataURL({ pixelRatio: 2, backgroundColor: '#fff' }), 'chart1');
+      const image2 = btof(this.chart2.getDataURL({ pixelRatio: 2, backgroundColor: '#fff' }), 'chart2');
+      const image3 = btof(this.chart3.getDataURL({ pixelRatio: 2, backgroundColor: '#fff' }), 'chart3');
+      const image4 = btof(this.chart4.getDataURL({ pixelRatio: 2, backgroundColor: '#fff' }), 'chart4');
+      const image5 = btof(this.chart5.getDataURL({ pixelRatio: 2, backgroundColor: '#fff' }), 'chart5');
+      const image6 = btof(this.chart6.getDataURL({ pixelRatio: 2, backgroundColor: '#fff' }), 'chart6');
+      const image7 = btof(this.chart7.getDataURL({ pixelRatio: 2, backgroundColor: '#fff' }), 'chart7');
+      const image8 = btof(this.chart8.getDataURL({ pixelRatio: 2, backgroundColor: '#fff' }), 'chart8');
+      const image9 = btof(this.chart9.getDataURL({ pixelRatio: 2, backgroundColor: '#fff' }), 'chart9');
+      const image10 = btof(this.chart10.getDataURL({ pixelRatio: 2, backgroundColor: '#fff' }), 'chart10');
+      const image11 = btof(this.chart11.getDataURL({ pixelRatio: 2, backgroundColor: '#fff' }), 'chart11');
+      const image12 = btof(this.chart12.getDataURL({ pixelRatio: 2, backgroundColor: '#fff' }), 'chart12');
+      const image13 = btof(this.chart13.getDataURL({ pixelRatio: 2, backgroundColor: '#fff' }), 'chart13');
+      const image14 = btof(this.chart14.getDataURL({ pixelRatio: 2, backgroundColor: '#fff' }), 'chart14');
+      const image15 = btof(this.chart15.getDataURL({ pixelRatio: 2, backgroundColor: '#fff' }), 'chart15');
+      // 利用FormData传参
+      const formData = new FormData();
+      // file 是后端接受图片的字段
+      formData.append('files', image1);
+      formData.append('files', image2);
+      formData.append('files', image3);
+      formData.append('files', image4);
+      formData.append('files', image5);
+      formData.append('files', image6);
+      formData.append('files', image7);
+      formData.append('files', image8);
+      formData.append('files', image9);
+      formData.append('files', image10);
+      formData.append('files', image11);
+      formData.append('files', image12);
+      formData.append('files', image13);
+      formData.append('files', image14);
+      formData.append('files', image15);
+      formData.append("startDate", this.sampleDate[0]);
+      formData.append("endDate", this.sampleDate[1]);
+      // formData.append("c2ReactorTableData", this.c2ReactorTableData,);
+      // formData.append("c3ReactorTableData", this.c3ReactorTableData);
+      // 调用接口 把MultipartFile 传给后端
+      axios.post(process.env.VUE_APP_BASE_API + '/production/quality/export', formData, {
+        headers: { 'Content-Type': 'multipart/form-data' }
+      }).then(response => {
+        this.download(response.data.msg);
+      });
+    },
     handleQuery() {
       this.analysisQueryParams.startDate = this.sampleDate[0];
       this.analysisQueryParams.endDate = this.sampleDate[1];
@@ -296,7 +364,7 @@ export default {
           },
           toolbox: {
             feature: {
-              saveAsImage: {}
+              // saveAsImage: {}
             }
           },
           xAxis: {
@@ -385,7 +453,7 @@ export default {
           },
           toolbox: {
             feature: {
-              saveAsImage: {}
+              // saveAsImage: {}
             }
           },
           xAxis: {
@@ -478,7 +546,7 @@ export default {
             },
             toolbox: {
               feature: {
-                saveAsImage: {}
+                // saveAsImage: {}
               }
             },
             xAxis: {
@@ -563,7 +631,7 @@ export default {
           },
           toolbox: {
             feature: {
-              saveAsImage: {}
+              // saveAsImage: {}
             }
           },
           xAxis: {
@@ -655,7 +723,7 @@ export default {
             },
             toolbox: {
               feature: {
-                saveAsImage: {}
+                // saveAsImage: {}
               }
             },
             xAxis: {
@@ -757,7 +825,7 @@ export default {
           },
           toolbox: {
             feature: {
-              saveAsImage: {}
+              // saveAsImage: {}
             }
           },
           xAxis: {
@@ -827,7 +895,7 @@ export default {
           },
           toolbox: {
             feature: {
-              saveAsImage: {}
+              // saveAsImage: {}
             }
           },
           xAxis: {
@@ -910,7 +978,7 @@ export default {
           },
           toolbox: {
             feature: {
-              saveAsImage: {}
+              // saveAsImage: {}
             }
           },
           xAxis: {
@@ -980,7 +1048,7 @@ export default {
           },
           toolbox: {
             feature: {
-              saveAsImage: {}
+              // saveAsImage: {}
             }
           },
           xAxis: {
@@ -1063,7 +1131,7 @@ export default {
           },
           toolbox: {
             feature: {
-              saveAsImage: {}
+              // saveAsImage: {}
             }
           },
           xAxis: {
@@ -1135,7 +1203,7 @@ export default {
           },
           toolbox: {
             feature: {
-              saveAsImage: {}
+              // saveAsImage: {}
             }
           },
           xAxis: {
@@ -1225,7 +1293,7 @@ export default {
           },
           toolbox: {
             feature: {
-              saveAsImage: {}
+              // saveAsImage: {}
             }
           },
           xAxis: {
@@ -1311,7 +1379,7 @@ export default {
           },
           toolbox: {
             feature: {
-              saveAsImage: {}
+              // saveAsImage: {}
             }
           },
           xAxis: {
@@ -1388,7 +1456,7 @@ export default {
           },
           toolbox: {
             feature: {
-              saveAsImage: {}
+              // saveAsImage: {}
             }
           },
           xAxis: {
@@ -1483,7 +1551,7 @@ export default {
           },
           toolbox: {
             feature: {
-              saveAsImage: {}
+              // saveAsImage: {}
             }
           },
           xAxis: {
@@ -1547,19 +1615,17 @@ export default {
 </script>
 
 <style scoped>
-  #chart1,#chart2,#chart3,#chart5,#chart6,#chart7,#chart8,#chart9,#chart10,#chart11,#chart12,#chart13,#chart14,#chart15{
-    /*display: inline-block;*/
-    /*float: left;*/
-    width: 100%;
-    height: 500px;
+  #chart1,#chart2,#chart3,#chart4,#chart5,#chart6,#chart7,#chart8,#chart9,#chart10,#chart11,#chart12,#chart13,#chart14,#chart15{
+    width: 800px;
+    height: 400px;
     margin-bottom: 50px;
   }
   #chart10,#chart11{
     margin-bottom: 0px;
   }
   #tableC2,#tableC3{
-    width: 80%;
-    margin: 0px auto;
+    width: 800px;
+    /*margin: 0px auto;*/
     margin-bottom: 50px;
   }
   table {