Browse Source

首页统计接口完善

王苗苗 6 months ago
parent
commit
edc81b3fc4

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

@@ -3,11 +3,15 @@ package com.ruoyi.web.controller.business;
 import com.alibaba.fastjson2.JSON;
 import com.ruoyi.business.domain.*;
 import com.ruoyi.business.mapper.*;
+import com.ruoyi.business.res.HomeCountsRes;
+import com.ruoyi.business.service.IBusinessService;
+import com.ruoyi.common.core.domain.R;
 import com.ruoyi.common.enums.DataSourceType;
 import com.ruoyi.framework.datasource.DynamicDataSourceContextHolder;
 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;
 
@@ -33,6 +37,9 @@ public class BusinessController {
     @Autowired
     private ZQualityValueMapper zQualityValueMapper;
 
+    @Autowired
+    private IBusinessService businessService;
+
     @GetMapping("/hello")
     public String hello() {
         return "hello world";
@@ -57,4 +64,19 @@ public class BusinessController {
 
     //------------------------下面是需要的智能国际化验室的业务接口,汇总跃渊数据库的数据(本系统相关的,放到MySQL;从库是跃渊的SqlServer数据库)------------------------
 
+
+    /**
+     *
+     * 接口1:获取首页的统计信息(通过类型区分是实验室的还是连续检测的)
+     * @param type 1:化验室,2:连续检测
+     * @return
+     */
+    @GetMapping("/homeCountsInfo/{type}")
+    public R<HomeCountsRes> homeCountsInfo(@PathVariable Integer type){
+        log.info("进入了 获取首页的统计信息(通过类型区分是实验室的还是连续检测的) 接口,类型是{}", type);
+        DynamicDataSourceContextHolder.setDataSourceType(DataSourceType.SLAVE.name());
+        HomeCountsRes homeCountsRes = this.businessService.homeCountsInfo(type);
+        DynamicDataSourceContextHolder.clearDataSourceType();
+        return R.ok(homeCountsRes);
+    }
 }

+ 0 - 5
ruoyi-system/src/main/java/com/ruoyi/business/domain/ZAssayResult.java

@@ -1,16 +1,11 @@
 package com.ruoyi.business.domain;
 
-import com.fasterxml.jackson.annotation.JsonFormat;
 import lombok.AllArgsConstructor;
 import lombok.Builder;
 import lombok.Data;
 import lombok.NoArgsConstructor;
-import org.apache.commons.lang3.builder.ToStringBuilder;
-import org.apache.commons.lang3.builder.ToStringStyle;
 import com.ruoyi.common.annotation.Excel;
-import com.ruoyi.common.core.domain.BaseEntity;
 
-import java.util.Date;
 
 /**
  * 化验结果明细对象 z_assay_result

+ 0 - 2
ruoyi-system/src/main/java/com/ruoyi/business/domain/ZQualityValue.java

@@ -6,8 +6,6 @@ import lombok.AllArgsConstructor;
 import lombok.Builder;
 import lombok.Data;
 import lombok.NoArgsConstructor;
-import org.apache.commons.lang3.builder.ToStringBuilder;
-import org.apache.commons.lang3.builder.ToStringStyle;
 import com.ruoyi.common.annotation.Excel;
 import com.ruoyi.common.core.domain.BaseEntity;
 

+ 22 - 0
ruoyi-system/src/main/java/com/ruoyi/business/res/HomeCountsRes.java

@@ -0,0 +1,22 @@
+package com.ruoyi.business.res;
+
+
+import lombok.AllArgsConstructor;
+import lombok.Builder;
+import lombok.Data;
+import lombok.NoArgsConstructor;
+
+@Builder
+@Data
+@AllArgsConstructor
+@NoArgsConstructor
+public class HomeCountsRes {
+
+    private long deviceTotals;//全国实验室设备总数
+    private long onDeviceCounts;//今日化验中设备(台)
+    private long standbyDeviceCounts;//今日待机设备(台)
+    private long offDeviceCounts;//今日离线设备(台)
+    private int checkTotals;//今日质控样检测总数
+    private int passCheckTotals;//今日质控样合格总数
+    private double passCheckRates;//今日质控样合格率
+}

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

@@ -0,0 +1,8 @@
+package com.ruoyi.business.service;
+
+import com.ruoyi.business.res.HomeCountsRes;
+
+public interface IBusinessService {
+
+    HomeCountsRes homeCountsInfo(int type);
+}

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

@@ -0,0 +1,122 @@
+package com.ruoyi.business.service.impl;
+
+import com.ruoyi.business.domain.BizDevice;
+import com.ruoyi.business.domain.ZAssay;
+import com.ruoyi.business.domain.ZAssayResult;
+import com.ruoyi.business.domain.ZQualityValue;
+import com.ruoyi.business.mapper.*;
+import com.ruoyi.business.res.HomeCountsRes;
+import com.ruoyi.business.service.IBusinessService;
+import com.ruoyi.common.enums.DataSourceType;
+import com.ruoyi.common.utils.DateUtils;
+import com.ruoyi.common.utils.StringUtils;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.stereotype.Service;
+import org.springframework.util.CollectionUtils;
+
+import java.util.ArrayList;
+import java.util.Date;
+import java.util.List;
+import java.util.Objects;
+import java.util.stream.Collectors;
+
+@Service
+public class BusinessServiceImpl implements IBusinessService {
+
+
+    @Autowired
+    private BizDeviceMapper bizDeviceMapper;
+
+    @Autowired
+    private BizWaterWorkMapper bizWaterWorkMapper;
+
+    @Autowired
+    private ZAssayMapper zAssayMapper;
+
+    @Autowired
+    private ZAssayResultMapper zAssayResultMapper;
+
+    @Autowired
+    private ZQualityValueMapper zQualityValueMapper;
+
+
+    @Override
+    public HomeCountsRes homeCountsInfo(int type) {//type 1:化验室,2:连续检测
+        HomeCountsRes build = HomeCountsRes.builder().build();
+        //处理各个维度的统计信息
+        //获取所有的正在使用的设备列表 大概几十个,所以直接取所有数据,下面再过滤
+        List<BizDevice> bizDevices = this.bizDeviceMapper.selectBizDeviceList(BizDevice.builder().deviceStatus("0").build());
+        //一定有设备 并且mybatis返回的默认是空集合new出来的而不是null,所以这里不用判断
+        List<BizDevice> totalList = bizDevices.stream().filter(bizDevice -> String.valueOf(type).equals(bizDevice.getType())).collect(Collectors.toList());
+        if (!CollectionUtils.isEmpty(totalList)) {
+            build.setDeviceTotals((long) totalList.size());
+            //化验中
+            build.setOnDeviceCounts(totalList.stream().filter(bizDevice -> "2".equals(bizDevice.getAssayStatus())).count());
+            //待机
+            build.setStandbyDeviceCounts(totalList.stream().filter(bizDevice -> "0".equals(bizDevice.getAssayStatus())).count());
+            //离线
+            build.setOffDeviceCounts(totalList.stream().filter(bizDevice -> "1".equals(bizDevice.getAssayStatus())).count());
+        }
+        //统计今日的化验数据
+        //先获取今日的所有的化验的质控样数据 再编写通用方法,判断是否合格,再获取合格的数量
+        List<ZAssayResult> zAssayResults = this.zAssayResultMapper.selectZAssayResultList(ZAssayResult.builder().resultDate(DateUtils.getDate()).assayType("3").build());
+        if(!CollectionUtils.isEmpty(zAssayResults)){
+            int checkTotals = zAssayResults.size();
+            build.setCheckTotals(checkTotals);
+            int passCheckTotals = this.getPassedCounts(zAssayResults);
+            build.setPassCheckTotals(passCheckTotals);
+            build.setPassCheckRates((double)passCheckTotals / (double)checkTotals);//整数除以整数还是整数,所以这里要强转成小数
+        }
+        return build;
+    }
+
+    //判断每个质控样的数是否各个,然后获取汇总的数量
+    private int getPassedCounts(List<ZAssayResult> zAssayResults) {
+        boolean passed = false;
+        int count = 0;
+        for (ZAssayResult zAssayResult : zAssayResults) {
+            passed = this.isPassed(zAssayResult);
+            if (passed) {
+                count++;//通过 数量加一
+            }
+        }
+        return count;
+    }
+
+    //获取每个质控样的数据是否是合格的
+    private boolean isPassed(ZAssayResult zAssayResult) {
+        boolean isPassed = true;//默认是合格的,防止一些极端场景:没有配置范围  范围配置时间过期等等情况
+        String deviceNo = zAssayResult.getDeviceNo();
+        if(StringUtils.isBlank(deviceNo))
+            return isPassed;//无法关联数据,默认合格
+        //需要通过化验明细里的设备ID找到水厂ID,配置的表需要该参数
+        List<BizDevice> bizDevices = this.bizDeviceMapper.selectBizDeviceList(BizDevice.builder().deviceNo(deviceNo).build());
+        if(CollectionUtils.isEmpty(bizDevices)){
+            return isPassed;//无法查询到水厂,默认合格
+        }
+        Date nowDate = DateUtils.getNowDate();
+        Long resultConcentration = zAssayResult.getResultConcentration();//化验的真实值
+        //去查询配置的标准值的范围(数据不确认,有可能是多个,获取最后一条数据):
+        List<ZQualityValue> list = this.zQualityValueMapper.selectZQualityValueList(ZQualityValue.builder().beginTime(nowDate).endTime(nowDate).deviceWorks(bizDevices.get(0).getDeviceWorks()).assayItem(zAssayResult.getAssayItem()).build());
+        //理论上是只有一个的
+        if(!CollectionUtils.isEmpty(list)){
+            ZQualityValue zQualityValue = list.get(list.size() - 1);//获取最新的一条,防止有多条数据的情况
+            Long lowValue = zQualityValue.getLowValue();
+            Long highValue = zQualityValue.getHighValue();
+            if(!Objects.isNull(resultConcentration) && !Objects.isNull(lowValue) && !Objects.isNull(highValue)){
+                isPassed = resultConcentration >= lowValue && resultConcentration <= highValue;
+            }
+        }
+        return isPassed;
+    }
+
+
+    public static void main(String[] args) {
+        List list = new ArrayList<>();
+        list.add(1);
+        list.add(1);
+        System.out.println(list.stream().count());
+
+        System.out.println(DateUtils.getDate());
+    }
+}

+ 16 - 15
ruoyi-system/src/main/resources/mapper/business/ZQualityValueMapper.xml

@@ -20,21 +20,6 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
     <sql id="selectZQualityValueVo">
         select value_id, device_works, assay_item, result_value, create_time, update_time, end_time, low_value, high_value, begin_time from z_quality_value
     </sql>
-
-    <select id="selectZQualityValueList" parameterType="ZQualityValue" resultMap="ZQualityValueResult">
-        <include refid="selectZQualityValueVo"/>
-        <where>
-            1 = 1
-            <if test="deviceWorks != null "> and device_works = #{deviceWorks}</if>
-            <if test="assayItem != null  and assayItem != ''"> and assay_item = #{assayItem}</if>
-            <if test="resultValue != null "> and result_value = #{resultValue}</if>
-            <if test="endTime != null "> and end_time = #{endTime}</if>
-            <if test="lowValue != null "> and low_value = #{lowValue}</if>
-            <if test="highValue != null "> and high_value = #{highValue}</if>
-            <if test="beginTime != null "> and begin_time = #{beginTime}</if>
-        </where>
-        order by value_id desc
-    </select>
     
     <select id="selectZQualityValueByValueId" parameterType="Long" resultMap="ZQualityValueResult">
         <include refid="selectZQualityValueVo"/>
@@ -97,4 +82,20 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
             #{valueId}
         </foreach>
     </delete>
+
+    <!-- 2024年09月26日16:08:06  下面是新增或者调整的SQL,不允许覆盖 -->
+    <select id="selectZQualityValueList" parameterType="ZQualityValue" resultMap="ZQualityValueResult">
+        <include refid="selectZQualityValueVo"/>
+        <where>
+            1 = 1
+            <if test="deviceWorks != null "> and device_works = #{deviceWorks}</if>
+            <if test="assayItem != null  and assayItem != ''"> and assay_item = #{assayItem}</if>
+            <if test="resultValue != null "> and result_value = #{resultValue}</if>
+            <if test="endTime != null "> and end_time &gt;= #{endTime}</if>
+            <if test="lowValue != null "> and low_value = #{lowValue}</if>
+            <if test="highValue != null "> and high_value = #{highValue}</if>
+            <if test="beginTime != null "> and begin_time &lt;= #{beginTime}</if>
+        </where>
+        order by value_id desc
+    </select>
 </mapper>