Browse Source

新增连续监测化验接口

王苗苗 5 months ago
parent
commit
e71b05581b

+ 20 - 6
ruoyi-admin/src/main/java/com/ruoyi/web/controller/business/BusinessController.java

@@ -10,10 +10,7 @@ import com.ruoyi.business.domain.*;
 import com.ruoyi.business.mapper.*;
 import com.ruoyi.business.req.AssayReq;
 import com.ruoyi.business.req.DeviceReq;
-import com.ruoyi.business.res.AssayDetailRes;
-import com.ruoyi.business.res.AssayQualityDetailRes;
-import com.ruoyi.business.res.DeviceRes;
-import com.ruoyi.business.res.HomeCountsRes;
+import com.ruoyi.business.res.*;
 import com.ruoyi.business.service.IBusinessService;
 import com.ruoyi.common.core.controller.BaseController;
 import com.ruoyi.common.core.domain.R;
@@ -32,7 +29,10 @@ import org.springframework.beans.factory.annotation.Value;
 import org.springframework.web.bind.annotation.*;
 
 import javax.servlet.http.HttpServletResponse;
+import java.util.HashMap;
 import java.util.List;
+import java.util.Map;
+import java.util.Objects;
 
 
 @RestController
@@ -199,12 +199,12 @@ public class BusinessController extends BaseController {
      * 接口6:通过日期获取的化验室质控样的报表统计信息
      */
     @GetMapping("/assayCountListByDates")
-    public TableDataInfo assayCountListByDates(AssayReq assayReq){
+    public R<List<AssayQualityDetailRes>> assayCountListByDates(AssayReq assayReq){
         log.info("进入了 通过日期获取的化验室质控样的报表统计信息 接口,请求参数是{}", JSON.toJSONString(assayReq));
         DynamicDataSourceContextHolder.setDataSourceType(DataSourceType.SLAVE.name());
         List<AssayQualityDetailRes> list = this.businessService.assayCountListByDates(assayReq);
         DynamicDataSourceContextHolder.clearDataSourceType();
-        return getDataTable(list);
+        return R.ok(list);
     }
 
 
@@ -249,4 +249,18 @@ public class BusinessController extends BaseController {
         return R.ok("下载成功");
     }
 
+
+    /**
+     *
+     * 接口8:通过日期范围加水厂(可选)获取连续监测的报表统计信息
+     */
+    @GetMapping("/continuousAssayCountByDates")
+    public R<Map<String, Map<String, List<ContinuousAssayResultRes>>>> continuousAssayCountByDates(AssayReq assayReq){
+        log.info("进入了 通过日期范围加水厂(可选)获取连续监测的报表统计信息 接口,请求参数是{}", JSON.toJSONString(assayReq));
+        DynamicDataSourceContextHolder.setDataSourceType(DataSourceType.SLAVE.name());
+        Map<String, Map<String, List<ContinuousAssayResultRes>>> map = this.businessService.continuousAssayCountByDates(assayReq);
+        DynamicDataSourceContextHolder.clearDataSourceType();
+        return R.ok(map);
+    }
+
 }

+ 4 - 0
ruoyi-system/src/main/java/com/ruoyi/business/mapper/ZAssayResultMapper.java

@@ -2,6 +2,8 @@ package com.ruoyi.business.mapper;
 
 import java.util.List;
 import com.ruoyi.business.domain.ZAssayResult;
+import com.ruoyi.business.req.AssayReq;
+import com.ruoyi.business.res.ContinuousAssayBasic;
 
 /**
  * 化验结果明细Mapper接口
@@ -58,4 +60,6 @@ public interface ZAssayResultMapper
      * @return 结果
      */
     public int deleteZAssayResultByResultIds(Long[] resultIds);
+
+    List<ContinuousAssayBasic> continuousAssayCountByDates(AssayReq assayReq);
 }

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

@@ -0,0 +1,21 @@
+package com.ruoyi.business.res;
+
+
+import lombok.AllArgsConstructor;
+import lombok.Builder;
+import lombok.Data;
+import lombok.NoArgsConstructor;
+
+@Builder
+@Data
+@AllArgsConstructor
+@NoArgsConstructor
+public class ContinuousAssayBasic {
+
+    private String deviceNo;//设备编号
+    private String assayNo;//化验编号
+    private Double resultConcentration;//浓度值
+    private String itemName;//检测点位
+    private String assayName;//检测指标
+
+}

+ 25 - 0
ruoyi-system/src/main/java/com/ruoyi/business/res/ContinuousAssayResultRes.java

@@ -0,0 +1,25 @@
+package com.ruoyi.business.res;
+
+
+import lombok.AllArgsConstructor;
+import lombok.Builder;
+import lombok.Data;
+import lombok.NoArgsConstructor;
+
+@Builder
+@Data
+@AllArgsConstructor
+@NoArgsConstructor
+public class ContinuousAssayResultRes {
+
+    private String assayName;//检测指标
+    private int assayCounts;//实际检测数量
+    private Double minVal;//最小值
+    private Double maxVal;//最大值
+    private String passedRates;//合格率(%)
+    private String bx = "90.00%";//标线(%)
+    private String ratesDeviation = "10.00%";//合格率偏差
+    private Double unitPrice;//检测单价 (目前没有,无法处理)
+    private Double totalPrice;//检测合计(目前没有单价,无法处理)
+
+}

+ 5 - 4
ruoyi-system/src/main/java/com/ruoyi/business/service/IBusinessService.java

@@ -2,12 +2,11 @@ package com.ruoyi.business.service;
 
 import com.ruoyi.business.req.AssayReq;
 import com.ruoyi.business.req.DeviceReq;
-import com.ruoyi.business.res.AssayDetailRes;
-import com.ruoyi.business.res.AssayQualityDetailRes;
-import com.ruoyi.business.res.DeviceRes;
-import com.ruoyi.business.res.HomeCountsRes;
+import com.ruoyi.business.res.*;
 
+import java.util.HashMap;
 import java.util.List;
+import java.util.Map;
 
 public interface IBusinessService {
 
@@ -18,4 +17,6 @@ public interface IBusinessService {
     List<AssayDetailRes> assayPageListByDeviceNoAndDate(AssayReq assayReq);
 
     List<AssayQualityDetailRes> assayCountListByDates(AssayReq assayReq);
+
+    Map<String, Map<String, List<ContinuousAssayResultRes>>> continuousAssayCountByDates(AssayReq assayReq);
 }

+ 47 - 5
ruoyi-system/src/main/java/com/ruoyi/business/service/impl/BusinessServiceImpl.java

@@ -4,10 +4,7 @@ import com.ruoyi.business.domain.*;
 import com.ruoyi.business.mapper.*;
 import com.ruoyi.business.req.AssayReq;
 import com.ruoyi.business.req.DeviceReq;
-import com.ruoyi.business.res.AssayDetailRes;
-import com.ruoyi.business.res.AssayQualityDetailRes;
-import com.ruoyi.business.res.DeviceRes;
-import com.ruoyi.business.res.HomeCountsRes;
+import com.ruoyi.business.res.*;
 import com.ruoyi.business.service.IBusinessService;
 import com.ruoyi.common.NumberUtils;
 import com.ruoyi.common.utils.DateUtils;
@@ -22,7 +19,6 @@ import java.util.stream.Collectors;
 
 import static com.ruoyi.common.constant.Constants.INT_2;
 import static com.ruoyi.common.constant.Constants.INT_4;
-import static jdk.nashorn.internal.runtime.regexp.joni.Config.log;
 
 @Slf4j
 @Service
@@ -122,6 +118,52 @@ public class BusinessServiceImpl implements IBusinessService {
         return this.getCountInfoByAssayResults(zAssayResults);
     }
 
+    @Override
+    public Map<String, Map<String, List<ContinuousAssayResultRes>>> continuousAssayCountByDates(AssayReq assayReq) {
+        //返回的最终对象
+        Map<String, Map<String, List<ContinuousAssayResultRes>>> resultMap = new HashMap<>();
+        //通过筛选条件获取最基本的数据列表
+        List<ContinuousAssayBasic> list = this.zAssayResultMapper.continuousAssayCountByDates(assayReq);
+        if(!CollectionUtils.isEmpty(list)){
+            //有数据 再分组,再分别统计信息
+            Map<String, List<ContinuousAssayBasic>> itemNameMap = list.stream().collect(Collectors.groupingBy(ContinuousAssayBasic::getItemName));
+            itemNameMap.forEach((k, v) -> {
+                //内存的map
+                HashMap<String, List<ContinuousAssayResultRes>> innerMap = new HashMap<>();
+                //还需要再根据化验指标再分一次组
+                Map<String, List<ContinuousAssayBasic>> assayNameMap = v.stream().collect(Collectors.groupingBy(ContinuousAssayBasic::getAssayName));
+                assayNameMap.forEach((assayName, assayBasicList) -> {
+                    List<ContinuousAssayResultRes> innerList = new ArrayList<>(assayBasicList.size());
+                    ContinuousAssayResultRes continuousAssayResultRes = new ContinuousAssayResultRes();
+                    //处理统计信息
+                    int assayCounts = assayBasicList.size();//实际检测数量
+                    Double minVal = assayBasicList.stream().map(ContinuousAssayBasic::getResultConcentration).min(Double::compareTo).get();
+                    Double maxVal = assayBasicList.stream().map(ContinuousAssayBasic::getResultConcentration).max(Double::compareTo).get();
+                    //调用通用的获取合格数量的方法
+                    List<ZAssayResult> zAssayResults = new ArrayList<>();
+                    for (ContinuousAssayBasic continuousAssayBasic : assayBasicList) {
+                        ZAssayResult zAssayResult = new ZAssayResult();
+                        zAssayResult.setAssayItem(continuousAssayBasic.getAssayName());
+                        zAssayResult.setDeviceNo(continuousAssayBasic.getDeviceNo());
+                        zAssayResult.setResultConcentration(continuousAssayBasic.getResultConcentration());
+                        zAssayResults.add(zAssayResult);
+                    }
+                    int passedCounts = this.getPassedCounts(zAssayResults);
+                    //封装到对象
+                    continuousAssayResultRes.setAssayName(assayName);
+                    continuousAssayResultRes.setAssayCounts(assayCounts);
+                    continuousAssayResultRes.setMinVal(minVal);
+                    continuousAssayResultRes.setMaxVal(maxVal);
+                    continuousAssayResultRes.setPassedRates(NumberUtils.getDoublePercentAndNLength(INT_4, ((double) passedCounts/(double)assayCounts), INT_2));
+                    innerList.add(continuousAssayResultRes);
+                    innerMap.put(assayName, innerList);
+                });
+                resultMap.put(k, innerMap);
+            });
+        }
+        return resultMap;
+    }
+
     private List<AssayQualityDetailRes> getCountInfoByAssayResults(List<ZAssayResult> zAssayResults) {
         List<AssayQualityDetailRes> result = new ArrayList<>();
         if(!CollectionUtils.isEmpty(zAssayResults)){

+ 19 - 0
ruoyi-system/src/main/resources/mapper/business/ZAssayResultMapper.xml

@@ -233,4 +233,23 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
         </where>
         order by result_id desc
     </select>
+
+    <select id="continuousAssayCountByDates" parameterType="com.ruoyi.business.req.AssayReq" resultType="com.ruoyi.business.res.ContinuousAssayBasic">
+        SELECT
+            de.device_no deviceNo,
+            r.assay_no AS assayNo,
+            r.result_concentration AS resultConcentration,
+            ds.item_name itemName,
+            t.item_name AS assayName
+        FROM
+            z_assay_result AS r
+                INNER JOIN sys_assay_item AS t ON t.assay_item = r.assay_item
+                INNER JOIN z_device_sample AS ds ON r.device_no = ds.device_no AND r.sample_post = ds.assay_type
+                LEFT OUTER JOIN biz_device de ON r.device_no = de.device_no
+        WHERE <!-- todo 这里待确认是否只要连续监测的 并且是有点位的数据 -->
+            r.sample_post IS NOT NULL
+          AND de.type = 2
+          AND r.result_date BETWEEN #{timeBegin} AND #{timeEnd}
+        <if test="deviceNo != null  and deviceNo != ''"> AND de.device_no = #{deviceNo}</if>
+    </select>
 </mapper>