浏览代码

连续检测接口新增列表和导出 按照新的要求新增对应接口

王苗苗 5 月之前
父节点
当前提交
9f802cc9b0

+ 114 - 0
ruoyi-admin/src/main/java/com/ruoyi/web/controller/business/BusinessController.java

@@ -546,6 +546,120 @@ public class BusinessController extends BaseController {
     }
 
 
+    /**
+     *
+     * 接口11:通过日期范围加水厂(可选)获取连续监测的报表统计信息(没有点位的信息了)
+     */
+    @GetMapping("/continuousAssayCountByDatesNew")
+    public R<Map<String, ContinuousAssayResultResNew>> continuousAssayCountByDatesNew(AssayReq assayReq){
+        log.info("进入了 通过日期范围加水厂(可选)获取连续监测的报表统计信息(没有点位的信息了) 接口,请求参数是{}", JSON.toJSONString(assayReq));
+        DynamicDataSourceContextHolder.setDataSourceType(DataSourceType.SLAVE.name());
+        Map<String, ContinuousAssayResultResNew> map = this.businessService.continuousAssayCountByDatesNew(assayReq);
+        DynamicDataSourceContextHolder.clearDataSourceType();
+        return R.ok(map);
+    }
+
+
+    /**
+     *
+     * 接口12:通过日期范围加水厂(可选)获取连续监测的报表统计信息(没有点位的信息了)导出Excel
+     */
+    @GetMapping("/exportContinuousAssayCountByDatesNew")
+    public ResponseEntity<InputStreamResource> exportContinuousAssayCountByDatesNew(AssayReq assayReq){
+        log.info("进入了 通过日期范围加水厂(可选)获取连续监测的报表统计信息(没有点位的信息了)导出Excel 接口,请求参数是{}", JSON.toJSONString(assayReq));
+        DynamicDataSourceContextHolder.setDataSourceType(DataSourceType.SLAVE.name());
+        Map<String, ContinuousAssayResultResNew> map = this.businessService.continuousAssayCountByDatesNew(assayReq);
+        DynamicDataSourceContextHolder.clearDataSourceType();
+
+        // 输出文件路径
+        log.info("配置的输出文件路径及名称是{}", continuousCountDir);
+
+        //表头
+        List<List<String>> headers = new ArrayList<>();
+        headers.add(Arrays.asList("检测指标"));
+        //业务数据
+        List<List<Object>> dates = new ArrayList<>();
+//        dates.add();
+//        List<String> itemList = Arrays.asList("实际检测数量", "最小值", "最大值", "合格率(%)", "标线(%)", "合格率偏差");
+        //存放业务数据的各个集合
+        List<Integer> collect0 = new ArrayList<>();
+        List<Integer> collect1 = new ArrayList<>();
+        List<Object> collect2 = new ArrayList<>();
+        List<Object> collect3 = new ArrayList<>();
+
+        //拼接表头和业务数据
+        map.forEach((key, value) ->{
+            List<String> headerList = new ArrayList<>();
+            //表头
+            headerList.add(key);
+            headers.add(headerList);
+            //业务数据
+            collect0.add(value.getAssayCounts());
+            collect1.add(value.getZkCounts());
+            collect2.add(value.getPassedRates());
+            collect3.add(value.getRatesDeviation());
+        });
+        //最后的合计
+        ArrayList<String> lastList = new ArrayList<>();
+        lastList.add("合计");
+        headers.add(lastList);
+
+        //处理业务数据
+        ArrayList<Object> list0 = new ArrayList<>();
+        list0.add("实际检测数量");
+        list0.addAll(collect0);
+        collect0.stream().reduce(Integer::sum).ifPresent(list0::add);
+        dates.add(list0);
+
+        ArrayList<Object> list1 = new ArrayList<>();
+        list1.add("质控样检测数量");
+        list1.addAll(collect1);
+        collect1.stream().reduce(Integer::sum).ifPresent(list1::add);
+        dates.add(list1);
+
+        ArrayList<Object> list2 = new ArrayList<>();
+        list2.add("质控样合格率(%)");
+        list2.addAll(collect2);
+        dates.add(list2);
+
+        ArrayList<Object> list3 = new ArrayList<>();
+        list3.add("合格率偏差");
+        list3.addAll(collect3);
+        dates.add(list3);
+
+
+
+
+        log.info("新动态Excel的数据表头是{}", JSON.toJSONString(headers));
+        log.info("新动态Excel的数据列表是{}", JSON.toJSONString(dates));
+
+        // 使用 ByteArrayOutputStream 来捕获 Excel 生成的输出
+        ByteArrayOutputStream outputStream = new ByteArrayOutputStream();
+
+        // 使用 EasyExcel 填充模板并写入到输出流中
+        EasyExcel.write(outputStream)
+//                .registerWriteHandler(new LongestMatchColumnWidthStyleStrategy()) // 可选:自动调整列宽
+                // 动态头
+                .head(headers)
+                .sheet("Sheet1")
+                // 表格数据
+                .doWrite(dates);
+
+        // 转换 ByteArrayOutputStream 到 ByteArrayInputStream
+        ByteArrayInputStream inputStream = new ByteArrayInputStream(outputStream.toByteArray());
+
+        // 设置 HTTP 响应头
+        HttpHeaders httpHeaders = new HttpHeaders();
+        httpHeaders.add(HttpHeaders.CONTENT_DISPOSITION, "attachment; filename=" + URLEncoder.encode("连续检测报表") + ".xlsx");
+        httpHeaders.setContentType(MediaType.APPLICATION_OCTET_STREAM);
+
+        // 返回 ResponseEntity
+        return ResponseEntity.ok()
+                .headers(httpHeaders)
+                .body(new InputStreamResource(inputStream));
+    }
+
+
     private static List<List<Object>> getLists() {
         List<List<Object>> list = new ArrayList<>();
         List<Object> data1 = new ArrayList<>();

+ 5 - 0
ruoyi-system/src/main/java/com/ruoyi/business/res/ContinuousAssayBasic.java

@@ -1,6 +1,7 @@
 package com.ruoyi.business.res;
 
 
+import com.ruoyi.common.annotation.Excel;
 import lombok.AllArgsConstructor;
 import lombok.Builder;
 import lombok.Data;
@@ -18,4 +19,8 @@ public class ContinuousAssayBasic {
     private String itemName;//检测点位
     private String assayName;//检测指标
 
+    /** 化验项目 */
+    @Excel(name = "化验项目")
+    private String assayItem;//存储的是id
+
 }

+ 37 - 0
ruoyi-system/src/main/java/com/ruoyi/business/res/ContinuousAssayResultResNew.java

@@ -0,0 +1,37 @@
+package com.ruoyi.business.res;
+
+
+import com.fasterxml.jackson.annotation.JsonIgnore;
+import com.ruoyi.common.NumberUtils;
+import lombok.AllArgsConstructor;
+import lombok.Builder;
+import lombok.Data;
+import lombok.NoArgsConstructor;
+
+import java.util.Objects;
+
+import static com.ruoyi.common.constant.Constants.INT_2;
+
+@Builder
+@Data
+@AllArgsConstructor
+@NoArgsConstructor
+public class ContinuousAssayResultResNew {
+
+    private String assayName;//检测指标
+    private int assayCounts;//实际检测数量
+    private int zkCounts;//质控样检测数量
+    private String passedRates;//质控样合格率(%)
+    @JsonIgnore
+    private Double bxDouble = 0.9D;//标线(小数值)
+    private String ratesDeviation;//合格率偏差 = 质控样合格率 - 标线(小数值) 如果大于0,结果就是0;如果小于0,取整
+    private Double ratesDeviationNumber;//合格率偏差(小数) = 质控样合格率 - 标线(小数值) 如果大于0,结果就是0;如果小于0,取整
+
+
+    private Double unitPrice;//检测单价 (目前没有,无法处理)
+    private Double totalPrice;//检测合计(目前没有单价,无法处理)
+
+
+
+
+}

+ 2 - 0
ruoyi-system/src/main/java/com/ruoyi/business/service/IBusinessService.java

@@ -19,4 +19,6 @@ public interface IBusinessService {
     List<AssayQualityDetailRes> assayCountListByDates(AssayReq assayReq);
 
     Map<String, Map<String, List<ContinuousAssayResultRes>>> continuousAssayCountByDates(AssayReq assayReq);
+
+    Map<String, ContinuousAssayResultResNew> continuousAssayCountByDatesNew(AssayReq assayReq);
 }

+ 29 - 0
ruoyi-system/src/main/java/com/ruoyi/business/service/impl/BusinessServiceImpl.java

@@ -191,6 +191,35 @@ public class BusinessServiceImpl implements IBusinessService {
         return resultMap;
     }
 
+    @Override
+    public Map<String, ContinuousAssayResultResNew> continuousAssayCountByDatesNew(AssayReq assayReq) {
+        //返回的最终对象
+        Map<String, ContinuousAssayResultResNew> resultMap = new LinkedHashMap<>();
+        //通过筛选条件获取最基本的数据列表
+        List<ContinuousAssayBasic> list = this.zAssayResultMapper.continuousAssayCountByDates(assayReq);
+        Map<String, List<ContinuousAssayBasic>> map = list.stream().collect(Collectors.groupingBy(ContinuousAssayBasic::getAssayName));
+        map.forEach((key, value) -> {
+            //获取同检测指标的的质控样的统计数据
+            List<ZAssayResult> zAssayResults = this.zAssayResultMapper.selectZAssayResultList(ZAssayResult.builder().assayType("3").assayItem(value.get(0).getAssayItem()).deviceNo(assayReq.getDeviceNo()).timeBegin(assayReq.getTimeBegin()).timeEnd(assayReq.getTimeEnd()).build());
+            int zkCounts = zAssayResults.size();
+            int passedCounts = this.getPassedCounts(zAssayResults);
+            double val = (double) passedCounts / zkCounts;//质控样合格率
+            //组装对应的数据
+            ContinuousAssayResultResNew continuousAssayResultResNew = new ContinuousAssayResultResNew();
+            continuousAssayResultResNew.setAssayName(key);
+            continuousAssayResultResNew.setAssayCounts(value.size());
+            continuousAssayResultResNew.setZkCounts(zkCounts);
+            continuousAssayResultResNew.setPassedRates(NumberUtils.getDoublePercentAndNLength(INT_4, val, INT_2));
+            double ratesDeviation = val - continuousAssayResultResNew.getBxDouble();
+            double ratesDeviationNumber = ratesDeviation > 0 ? 0D : Math.abs(ratesDeviation);
+            continuousAssayResultResNew.setRatesDeviation(NumberUtils.getDoublePercentAndNLength(INT_4, ratesDeviationNumber, INT_2));
+            continuousAssayResultResNew.setRatesDeviationNumber(ratesDeviationNumber);
+            resultMap.put(key, continuousAssayResultResNew);
+        });
+
+        return resultMap;
+    }
+
     private List<AssayQualityDetailRes> getCountInfoByAssayResults(List<ZAssayResult> zAssayResults) {
         List<AssayQualityDetailRes> result = new ArrayList<>();
         if(!CollectionUtils.isEmpty(zAssayResults)){

+ 2 - 1
ruoyi-system/src/main/resources/mapper/business/ZAssayResultMapper.xml

@@ -240,7 +240,8 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
             r.assay_no AS assayNo,
             r.result_concentration AS resultConcentration,
             ds.item_name itemName,
-            t.item_name AS assayName
+            t.item_name AS assayName,
+            r.assay_item assayItem
         FROM
             z_assay_result AS r
                 INNER JOIN sys_assay_item AS t ON t.assay_item = r.assay_item