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

新增化验记录导出功能

王苗苗 преди 6 месеца
родител
ревизия
7e662bd0ed

BIN
assay.report.dir


BIN
ruoyi-admin/src/main/.DS_Store


+ 57 - 5
ruoyi-admin/src/main/java/com/ruoyi/web/controller/business/BusinessController.java

@@ -1,5 +1,9 @@
 package com.ruoyi.web.controller.business;
 
+import com.alibaba.excel.EasyExcel;
+import com.alibaba.excel.ExcelWriter;
+import com.alibaba.excel.write.metadata.WriteSheet;
+import com.alibaba.excel.write.metadata.fill.FillConfig;
 import com.alibaba.fastjson2.JSON;
 import com.github.pagehelper.PageHelper;
 import com.ruoyi.business.domain.*;
@@ -12,17 +16,21 @@ import com.ruoyi.business.res.HomeCountsRes;
 import com.ruoyi.business.service.IBusinessService;
 import com.ruoyi.common.core.controller.BaseController;
 import com.ruoyi.common.core.domain.R;
+import com.ruoyi.common.core.domain.entity.SysUser;
 import com.ruoyi.common.core.page.TableDataInfo;
 import com.ruoyi.common.enums.DataSourceType;
+import com.ruoyi.common.utils.DateUtils;
 import com.ruoyi.common.utils.StringUtils;
+import com.ruoyi.common.utils.poi.ExcelUtil;
 import com.ruoyi.framework.datasource.DynamicDataSourceContextHolder;
+import com.ruoyi.framework.web.domain.server.Sys;
+import com.ruoyi.quartz.domain.SysJob;
 import lombok.extern.slf4j.Slf4j;
 import org.springframework.beans.factory.annotation.Autowired;
-import org.springframework.web.bind.annotation.GetMapping;
-import org.springframework.web.bind.annotation.PathVariable;
-import org.springframework.web.bind.annotation.RequestMapping;
-import org.springframework.web.bind.annotation.RestController;
+import org.springframework.beans.factory.annotation.Value;
+import org.springframework.web.bind.annotation.*;
 
+import javax.servlet.http.HttpServletResponse;
 import java.util.List;
 
 
@@ -49,6 +57,9 @@ public class BusinessController extends BaseController {
     @Autowired
     private IBusinessService businessService;
 
+    @Value("${assay.report.dir}")
+    private String reportDir;
+
     @GetMapping("/hello")
     public String hello() {
         return "hello world";
@@ -125,7 +136,7 @@ public class BusinessController extends BaseController {
 
     /**
      *
-     * 接口4:通过设备编号和日期获取质控样的化验记录的明细和各个指标的偏差度等(通过类型区分是实验室的还是连续检测的)
+     * 接口4:通过设备编号和日期获取质控样的化验记录的明细和各个指标的偏差度等
      */
     @GetMapping("/assayPageListByDeviceNoAndDate")
     public TableDataInfo assayPageListByDeviceNoAndDate(AssayReq assayReq){
@@ -136,4 +147,45 @@ public class BusinessController extends BaseController {
         DynamicDataSourceContextHolder.clearDataSourceType();
         return getDataTable(list);
     }
+
+    /**
+     * 导出 通过设备编号和日期获取质控样的化验记录的明细和各个指标的偏差度等到Excel
+     * @param response
+     */
+//    @PostMapping("/exportAssayPageListByDeviceNoAndDate")
+    @GetMapping("/exportAssayPageListByDeviceNoAndDate")
+    public R<String> exportAssayPageListByDeviceNoAndDate(HttpServletResponse response, AssayReq assayReq)
+    {
+        log.info("进入了 导出 通过设备编号和日期获取质控样的化验记录的明细和各个指标的偏差度等到Excel 接口,请求参数是{}", JSON.toJSONString(assayReq));
+        DynamicDataSourceContextHolder.setDataSourceType(DataSourceType.SLAVE.name());
+        List<AssayDetailRes> list = this.businessService.assayPageListByDeviceNoAndDate(assayReq);
+        DynamicDataSourceContextHolder.clearDataSourceType();
+        // 模板文件路径
+        String templateFilePath = this.getClass().getClassLoader().getResource("").getPath() + "/assay-record.xlsx";
+//        String templateFilePath = "classpath:/assay-record.xlsx";
+        // 输出文件路径
+//        String outFilePath = "/Users/wangmiaomiao/Desktop/" + DateUtils.parseDateToStr("yyyy-MM-dd HH:mm:ss", DateUtils.getNowDate()) + ".xlsx";
+        log.info("配置的输出文件路径及名称是{}", reportDir);
+        // 创建 ExcelWriter 实例
+        ExcelWriter writer = EasyExcel
+                // 写入到
+                .write(reportDir)
+                // 指定模板
+                .withTemplate(templateFilePath)
+                .build();
+        WriteSheet sheet = EasyExcel.writerSheet().build();
+
+        FillConfig fillConfig = FillConfig.builder()
+                // 开启填充换行
+                .forceNewRow(true)
+                .build();
+
+        // 执行填充操作
+        writer.fill(list, fillConfig, sheet);
+
+        // 结束
+        writer.finish();
+        writer.close();
+        return R.ok("下载成功");
+    }
 }

+ 6 - 1
ruoyi-admin/src/main/resources/application-dev.yml

@@ -62,4 +62,9 @@ spring:
                         multi-statement-allow: true
 
 log:
-    logPath: /home/smartrobot/logs
+    logPath: /home/smartrobot/logs
+
+#自定义参数
+assay:
+    report:
+        dir: /home/smartrobot/化验记录.xlsx

+ 6 - 1
ruoyi-admin/src/main/resources/application-local.yml

@@ -64,4 +64,9 @@ spring:
 
 
 log:
-    logPath: /Users/wangmiaomiao/logs
+    logPath: /Users/wangmiaomiao/logs
+
+#自定义参数
+assay:
+    report:
+        dir: /Users/wangmiaomiao/Desktop/化验记录.xlsx

BIN
ruoyi-admin/src/main/resources/assay-record.xlsx


+ 8 - 0
ruoyi-common/pom.xml

@@ -133,6 +133,14 @@
             <version>8.1.0.jre8-preview</version>
         </dependency>
 
+        <!-- https://mvnrepository.com/artifact/com.alibaba/easyexcel -->
+        <dependency>
+            <groupId>com.alibaba</groupId>
+            <artifactId>easyexcel</artifactId>
+            <version>3.1.1</version>
+        </dependency>
+
+
     </dependencies>
 
 </project>

+ 28 - 0
ruoyi-common/src/main/java/com/ruoyi/common/NumberUtils.java

@@ -0,0 +1,28 @@
+package com.ruoyi.common;
+
+import java.math.BigDecimal;
+import java.math.RoundingMode;
+import java.util.Objects;
+
+public class NumberUtils {
+
+
+    public static Double getDoubleNLength(int length, Double val){
+        if(Objects.isNull(val)){
+            return null;
+        }
+        // 将double转换为BigDecimal,注意需要指定精度(即小数点后的位数),这里用String来避免double直接转换时的精度丢失
+        BigDecimal bd = new BigDecimal(Double.toString(val));
+
+        // 设置保留两位小数,并进行四舍五入
+        return bd.setScale(length, RoundingMode.HALF_UP).doubleValue();
+    }
+
+    public static String getDoublePercentAndNLength(int percentLength, Double val, int resultLength){
+        Double formatVal = getDoubleNLength(percentLength, val);
+        if(Objects.isNull(val) || Objects.isNull(formatVal)){
+            return null;
+        }
+        return getDoubleNLength(resultLength,formatVal*100) + "%";
+    }
+}

+ 4 - 0
ruoyi-common/src/main/java/com/ruoyi/common/constant/Constants.java

@@ -170,4 +170,8 @@ public class Constants
      */
     public static final String[] JOB_ERROR_STR = { "java.net.URL", "javax.naming.InitialContext", "org.yaml.snakeyaml",
             "org.springframework", "org.apache", "com.ruoyi.common.utils.file", "com.ruoyi.common.config", "com.ruoyi.generator" };
+
+    public static final int INT_4 = 4;
+
+    public static final int INT_2 = 2;
 }

+ 17 - 17
ruoyi-system/src/main/java/com/ruoyi/business/res/AssayDetailRes.java

@@ -28,53 +28,53 @@ public class AssayDetailRes {
 
     private String assayTypeName = "质控样";//样品名称  全部都是质控样
 
-    private Double highCodResultConcentration;//高COD化验值
-
     private Double highCodStandardVal = 200.0D;//高COD标称值
 
-    private Double highCodDeviationRate;//高COD偏差度
+    private Double highCodResultConcentration;//高COD化验值
 
-    private Double lowCodResultConcentration;//低COD化验值
+    private String highCodDeviationRate;//高COD偏差度
 
     private Double lowCodStandardVal = 50.0D;//低COD标称值
 
-    private Double lowCodDeviationRate;//低COD偏差度
+    private Double lowCodResultConcentration;//低COD化验值
 
-    private Double anDanResultConcentration;//氨氮化验值
+    private String lowCodDeviationRate;//低COD偏差度
 
     private Double anDanStandardVal = 20.0D;//氨氮标称值
 
-    private Double anDanDeviationRate;//氨氮偏差度
+    private Double anDanResultConcentration;//氨氮化验值
 
-    private Double tnResultConcentration;//总氮化验值
+    private String anDanDeviationRate;//氨氮偏差度
 
     private Double tnStandardVal = 20.0D;//总氮标称值
 
-    private Double tnDeviationRate;//总氮偏差度
+    private Double tnResultConcentration;//总氮化验值
 
-    private Double tpResultConcentration;//总磷化验值
+    private String tnDeviationRate;//总氮偏差度
 
     private Double tpStandardVal = 2.0D;//总磷标称值
 
-    private Double tpDeviationRate;//总磷偏差度
+    private Double tpResultConcentration;//总磷化验值
 
-    private Double xsydResultConcentration;//硝酸盐氮化验值
+    private String tpDeviationRate;//总磷偏差度
 
     private Double xsydStandardVal = 20.0D;//硝酸盐氮标称值
 
-    private Double xsydDeviationRate;//硝酸盐氮偏差度
+    private Double xsydResultConcentration;//硝酸盐氮化验值
 
-    private Double yxsyResultConcentration;//亚硝酸盐化验值
+    private String xsydDeviationRate;//硝酸盐氮偏差度
 
     private Double yxsyStandardVal = 1.0D;//亚硝酸盐标称值
 
-    private Double yxsyDeviationRate;//亚硝酸盐偏差度
+    private Double yxsyResultConcentration;//亚硝酸盐化验值
 
-    private Double zlsyResultConcentration;//正磷酸盐化验值
+    private String yxsyDeviationRate;//亚硝酸盐偏差度
 
     private Double zlsyStandardVal = 2.0D;//正磷酸标称值
 
-    private Double zlsyDeviationRate;//正磷酸偏差度
+    private Double zlsyResultConcentration;//正磷酸盐化验值
+
+    private String zlsyDeviationRate;//正磷酸偏差度
 
 
 

+ 20 - 16
ruoyi-system/src/main/java/com/ruoyi/business/service/impl/BusinessServiceImpl.java

@@ -8,6 +8,7 @@ import com.ruoyi.business.res.AssayDetailRes;
 import com.ruoyi.business.res.DeviceRes;
 import com.ruoyi.business.res.HomeCountsRes;
 import com.ruoyi.business.service.IBusinessService;
+import com.ruoyi.common.NumberUtils;
 import com.ruoyi.common.utils.DateUtils;
 import com.ruoyi.common.utils.StringUtils;
 import org.springframework.beans.factory.annotation.Autowired;
@@ -17,6 +18,9 @@ import org.springframework.util.CollectionUtils;
 import java.util.*;
 import java.util.stream.Collectors;
 
+import static com.ruoyi.common.constant.Constants.INT_2;
+import static com.ruoyi.common.constant.Constants.INT_4;
+
 @Service
 public class BusinessServiceImpl implements IBusinessService {
 
@@ -128,73 +132,73 @@ public class BusinessServiceImpl implements IBusinessService {
             Optional<ZAssayResult> highCodOptional = zAssayResults.stream().filter(zAssayResult -> "1".equals(zAssayResult.getAssayItem())).findFirst();
             if(highCodOptional.isPresent()){
                 ZAssayResult zAssayResult = highCodOptional.get();
-                Double resultConcentration = zAssayResult.getResultConcentration();
+                Double resultConcentration = NumberUtils.getDoubleNLength(INT_2, NumberUtils.getDoubleNLength(INT_2, zAssayResult.getResultConcentration()));
                 assayDetailRes.setHighCodResultConcentration(resultConcentration);
                 Double highCodStandardVal = assayDetailRes.getHighCodStandardVal();
-                assayDetailRes.setHighCodDeviationRate((resultConcentration - highCodStandardVal) / highCodStandardVal);
+                assayDetailRes.setHighCodDeviationRate(NumberUtils.getDoublePercentAndNLength(INT_4,(resultConcentration - highCodStandardVal) / highCodStandardVal, INT_2));
             }
             //低COD
             Optional<ZAssayResult> lowCodOptional = zAssayResults.stream().filter(zAssayResult -> "2".equals(zAssayResult.getAssayItem())).findFirst();
             if(lowCodOptional.isPresent()){
                 ZAssayResult zAssayResult = lowCodOptional.get();
-                Double resultConcentration = zAssayResult.getResultConcentration();
+                Double resultConcentration = NumberUtils.getDoubleNLength(INT_2, zAssayResult.getResultConcentration());
                 assayDetailRes.setLowCodResultConcentration(resultConcentration);
                 Double lowCodStandardVal = assayDetailRes.getLowCodStandardVal();
-                assayDetailRes.setLowCodDeviationRate((resultConcentration - lowCodStandardVal) / lowCodStandardVal);
+                assayDetailRes.setLowCodDeviationRate(NumberUtils.getDoublePercentAndNLength(INT_4,(resultConcentration - lowCodStandardVal) / lowCodStandardVal, INT_2));
             }
             //氨氮
             Optional<ZAssayResult> andanOptional = zAssayResults.stream().filter(zAssayResult -> "3".equals(zAssayResult.getAssayItem())).findFirst();
             if(andanOptional.isPresent()){
                 ZAssayResult zAssayResult = andanOptional.get();
-                Double resultConcentration = zAssayResult.getResultConcentration();
+                Double resultConcentration = NumberUtils.getDoubleNLength(INT_2, zAssayResult.getResultConcentration());
                 assayDetailRes.setAnDanResultConcentration(resultConcentration);
                 Double anDanStandardVal = assayDetailRes.getAnDanStandardVal();
-                assayDetailRes.setAnDanDeviationRate((resultConcentration - anDanStandardVal) / anDanStandardVal);
+                assayDetailRes.setAnDanDeviationRate(NumberUtils.getDoublePercentAndNLength(INT_4,(resultConcentration - anDanStandardVal) / anDanStandardVal, INT_2));
             }
             //总氮
             Optional<ZAssayResult> tnOptional = zAssayResults.stream().filter(zAssayResult -> "4".equals(zAssayResult.getAssayItem())).findFirst();
             if(tnOptional.isPresent()){
                 ZAssayResult zAssayResult = tnOptional.get();
-                Double resultConcentration = zAssayResult.getResultConcentration();
+                Double resultConcentration = NumberUtils.getDoubleNLength(INT_2, zAssayResult.getResultConcentration());
                 assayDetailRes.setTnResultConcentration(resultConcentration);
                 Double tnStandardVal = assayDetailRes.getTnStandardVal();
-                assayDetailRes.setTnDeviationRate((resultConcentration - tnStandardVal) / tnStandardVal);
+                assayDetailRes.setTnDeviationRate(NumberUtils.getDoublePercentAndNLength(INT_4,(resultConcentration - tnStandardVal) / tnStandardVal, INT_2));
             }
             //总磷
             Optional<ZAssayResult> tpOptional = zAssayResults.stream().filter(zAssayResult -> "5".equals(zAssayResult.getAssayItem())).findFirst();
             if(tpOptional.isPresent()){
                 ZAssayResult zAssayResult = tpOptional.get();
-                Double resultConcentration = zAssayResult.getResultConcentration();
+                Double resultConcentration = NumberUtils.getDoubleNLength(INT_2, zAssayResult.getResultConcentration());
                 assayDetailRes.setTpResultConcentration(resultConcentration);
                 Double tpStandardVal = assayDetailRes.getTpStandardVal();
-                assayDetailRes.setTpDeviationRate((resultConcentration - tpStandardVal) / tpStandardVal);
+                assayDetailRes.setTpDeviationRate(NumberUtils.getDoublePercentAndNLength(INT_4,(resultConcentration - tpStandardVal) / tpStandardVal, INT_2));
             }
             //正磷酸盐
             Optional<ZAssayResult> zlsyOptional = zAssayResults.stream().filter(zAssayResult -> "6".equals(zAssayResult.getAssayItem())).findFirst();
             if(zlsyOptional.isPresent()){
                 ZAssayResult zAssayResult = zlsyOptional.get();
-                Double resultConcentration = zAssayResult.getResultConcentration();
+                Double resultConcentration = NumberUtils.getDoubleNLength(INT_2, zAssayResult.getResultConcentration());
                 assayDetailRes.setZlsyResultConcentration(resultConcentration);
                 Double zlsyStandardVal = assayDetailRes.getZlsyStandardVal();
-                assayDetailRes.setZlsyDeviationRate((resultConcentration - zlsyStandardVal) / zlsyStandardVal);
+                assayDetailRes.setZlsyDeviationRate(NumberUtils.getDoublePercentAndNLength(INT_4,(resultConcentration - zlsyStandardVal) / zlsyStandardVal, INT_2));
             }
             //亚硝酸盐氮
             Optional<ZAssayResult> yxsydOptional = zAssayResults.stream().filter(zAssayResult -> "7".equals(zAssayResult.getAssayItem())).findFirst();
             if(yxsydOptional.isPresent()){
                 ZAssayResult zAssayResult = yxsydOptional.get();
-                Double resultConcentration = zAssayResult.getResultConcentration();
+                Double resultConcentration = NumberUtils.getDoubleNLength(INT_2, zAssayResult.getResultConcentration());
                 assayDetailRes.setYxsyResultConcentration(resultConcentration);
                 Double yxsyStandardVal = assayDetailRes.getYxsyStandardVal();
-                assayDetailRes.setYxsyDeviationRate((resultConcentration - yxsyStandardVal) / yxsyStandardVal);
+                assayDetailRes.setYxsyDeviationRate(NumberUtils.getDoublePercentAndNLength(INT_4,(resultConcentration - yxsyStandardVal) / yxsyStandardVal, INT_2));
             }
             //硝酸盐氮
             Optional<ZAssayResult> xsydOptional = zAssayResults.stream().filter(zAssayResult -> "8".equals(zAssayResult.getAssayItem())).findFirst();
             if(xsydOptional.isPresent()){
                 ZAssayResult zAssayResult = xsydOptional.get();
-                Double resultConcentration = zAssayResult.getResultConcentration();
+                Double resultConcentration = NumberUtils.getDoubleNLength(INT_2, zAssayResult.getResultConcentration());
                 assayDetailRes.setXsydResultConcentration(resultConcentration);
                 Double xsydStandardVal = assayDetailRes.getXsydStandardVal();
-                assayDetailRes.setXsydDeviationRate((resultConcentration - xsydStandardVal) / xsydStandardVal);
+                assayDetailRes.setXsydDeviationRate(NumberUtils.getDoublePercentAndNLength(INT_4,(resultConcentration - xsydStandardVal) / xsydStandardVal, INT_2));
             }
         }
     }