From d6124c1cdd6d70fc990082ae1783ce3718dacfa1 Mon Sep 17 00:00:00 2001
From: =?UTF-8?q?=E6=9D=A8=E6=B5=B7=E8=88=AA?=
 <11918452+yang-haihang@user.noreply.gitee.com>
Date: Thu, 27 Feb 2025 17:46:56 +0800
Subject: [PATCH] =?UTF-8?q?=E6=B7=BB=E5=8A=A0=E4=BA=86=E4=B8=80=E4=BA=9B?=
 =?UTF-8?q?=E7=BB=9F=E8=AE=A1=E7=9A=84=E5=8A=9F=E8=83=BD=EF=BC=8C=E4=BE=8B?=
 =?UTF-8?q?=E5=A6=82=E6=A3=80=E5=87=BA=E7=8E=87?=
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit

---
 ...trustMaterialCheckoutResultController.java |  11 ++
 .../EntrustMaterialCheckoutResultService.java |   6 +
 ...rustMaterialCheckoutResultServiceImpl.java | 120 +++++++++++++++++-
 ...mentIdentificationMaterialServiceImpl.java |   1 +
 .../entrustment/vo/DetectionRateVO.java       |  12 ++
 5 files changed, 149 insertions(+), 1 deletion(-)
 create mode 100644 src/main/java/digital/laboratory/platform/entrustment/vo/DetectionRateVO.java

diff --git a/src/main/java/digital/laboratory/platform/entrustment/controller/EntrustMaterialCheckoutResultController.java b/src/main/java/digital/laboratory/platform/entrustment/controller/EntrustMaterialCheckoutResultController.java
index a19bade..70a48f7 100644
--- a/src/main/java/digital/laboratory/platform/entrustment/controller/EntrustMaterialCheckoutResultController.java
+++ b/src/main/java/digital/laboratory/platform/entrustment/controller/EntrustMaterialCheckoutResultController.java
@@ -81,4 +81,15 @@ public class EntrustMaterialCheckoutResultController {
         }
     }
 
+    @ApiOperation("查询所有检出检材的毒品种类清单,并按名称进行排序")
+    @GetMapping("/getResultType")
+    public R getResultType(Integer year){
+        return R.ok(entrustMaterialCheckoutResultService.getResultType(year),"查询成功!");
+    }
+
+    @ApiOperation("查询所有毒品的检出率")
+    @GetMapping("/getDetectionRate")
+    public R getDetectionRateByMaterial(Integer year){
+        return R.ok(entrustMaterialCheckoutResultService.getDetectionRateByMaterial(year),"查询成功!");
+    }
 }
diff --git a/src/main/java/digital/laboratory/platform/entrustment/service/EntrustMaterialCheckoutResultService.java b/src/main/java/digital/laboratory/platform/entrustment/service/EntrustMaterialCheckoutResultService.java
index 62e9240..dc65042 100644
--- a/src/main/java/digital/laboratory/platform/entrustment/service/EntrustMaterialCheckoutResultService.java
+++ b/src/main/java/digital/laboratory/platform/entrustment/service/EntrustMaterialCheckoutResultService.java
@@ -5,11 +5,13 @@ import com.baomidou.mybatisplus.extension.service.IService;
 import digital.laboratory.platform.entrustment.dto.EntrustMaterialCheckoutResultDTO;
 import digital.laboratory.platform.entrustment.entity.EntrustMaterialCheckoutResult;
 import digital.laboratory.platform.entrustment.query.EntrustMaterialCheckoutResultQuery;
+import digital.laboratory.platform.entrustment.vo.DetectionRateVO;
 import digital.laboratory.platform.entrustment.vo.EntrustMaterialCheckoutResultVO;
 
 import javax.servlet.http.HttpServletResponse;
 import java.io.IOException;
 import java.util.List;
+import java.util.Map;
 
 /**
 * @author ChenJiangBao
@@ -47,4 +49,8 @@ public interface EntrustMaterialCheckoutResultService extends IService<EntrustMa
      * @return
      */
     IPage<EntrustMaterialCheckoutResultVO> voiPage(EntrustMaterialCheckoutResultQuery query);
+
+    List<String> getResultType(Integer year);
+
+    DetectionRateVO getDetectionRateByMaterial(Integer year);
 }
diff --git a/src/main/java/digital/laboratory/platform/entrustment/service/impl/EntrustMaterialCheckoutResultServiceImpl.java b/src/main/java/digital/laboratory/platform/entrustment/service/impl/EntrustMaterialCheckoutResultServiceImpl.java
index 3ab8550..7b0e3e7 100644
--- a/src/main/java/digital/laboratory/platform/entrustment/service/impl/EntrustMaterialCheckoutResultServiceImpl.java
+++ b/src/main/java/digital/laboratory/platform/entrustment/service/impl/EntrustMaterialCheckoutResultServiceImpl.java
@@ -21,17 +21,18 @@ import digital.laboratory.platform.entrustment.service.CommonFeignService;
 import digital.laboratory.platform.entrustment.service.EntrustMaterialCheckoutResultService;
 import digital.laboratory.platform.entrustment.service.EntrustmentIdentificationMaterialService;
 import digital.laboratory.platform.entrustment.service.EntrustmentService;
+import digital.laboratory.platform.entrustment.vo.DetectionRateVO;
 import digital.laboratory.platform.entrustment.vo.EntrustMaterialCheckoutResultVO;
 import digital.laboratory.platform.sys.entity.Area;
 import digital.laboratory.platform.sys.entity.DrugLite;
 import org.apache.poi.ss.usermodel.*;
 import org.apache.poi.xssf.usermodel.XSSFWorkbook;
-import org.springframework.beans.BeanUtils;
 import org.springframework.stereotype.Service;
 
 import javax.annotation.Resource;
 import javax.servlet.http.HttpServletResponse;
 import java.io.IOException;
+import java.math.BigDecimal;
 import java.net.URLEncoder;
 import java.time.LocalDateTime;
 import java.time.format.DateTimeFormatter;
@@ -357,6 +358,123 @@ public class EntrustMaterialCheckoutResultServiceImpl extends ServiceImpl<Entrus
         }
         return typeName;
     }
+
+
+
+    @Override
+    /**
+     * 获取指定年份的所有毒品类型列表(去重并排序)
+     * <p>
+     * 该方法通过查询指定年份内所有非空且不为空的定性结果,提取其中的毒品类型信息,
+     * 并返回一个去重且按字典序排序的毒品类型列表。
+     *
+     * @param year 年份,若为 null 则默认使用当前年份
+     * @return 包含所有毒品类型的列表,列表中的毒品类型名称已去重并排序
+     *
+     * @see EntrustMaterialCheckoutResult 委托材料检验结果实体类,包含定性结果字段
+     * @see DrugLite 药品轻量级实体类,包含药品名称字段
+     * @see DrugLiteConvert 工具类,用于将定性结果转换为毒品轻量级实体列表
+     */
+    public List<String> getResultType(Integer year) {
+        // 根据年份构建查询起始时间
+        LocalDateTime startTime = null;
+        if (year != null) {
+            // 如果年份不为空,使用指定年份的1月1日 00:00:00
+            startTime = LocalDateTime.of(year, 1, 1, 0, 0);
+        } else {
+            // 如果年份为空,默认使用当前年份的1月1日 00:00:00
+            startTime = LocalDateTime.of(LocalDateTime.now().getYear(), 1, 1, 0, 0);
+        }
+
+        // 查询所有非空且不为空的定性结果,且创建时间大于等于起始时间
+        List<EntrustMaterialCheckoutResult> list = this.list(Wrappers.<EntrustMaterialCheckoutResult>lambdaQuery()
+                .ne(EntrustMaterialCheckoutResult::getQualitativeResult, "") // 排除空字符串
+                .isNotNull(EntrustMaterialCheckoutResult::getQualitativeResult) // 排除空值
+                .ge(EntrustMaterialCheckoutResult::getCreateTime, startTime)); // 创建时间大于等于起始时间
+
+        // 用于存储去重后的毒品类型列表
+        ArrayList<String> typeList = new ArrayList<>();
+
+        // 遍历查询结果
+        for (EntrustMaterialCheckoutResult result : list) {
+            // 将定性结果转换为轻量级实体列表
+            List<DrugLite> drugLites = DrugLiteConvert.getDrugLites(result.getQualitativeResult());
+
+            // 遍历药品轻量级实体列表
+            for (DrugLite drugLite : drugLites) {
+                // 如果毒品类型未添加到列表中,则添加
+                if (!typeList.contains(drugLite.getName())) {
+                    typeList.add(drugLite.getName());
+                }
+            }
+        }
+
+        // 对列表进行字典序排序
+        Collections.sort(typeList);
+
+        // 返回去重并排序后的毒品类型列表
+        return typeList;
+    }
+
+
+    @Override
+    public DetectionRateVO getDetectionRateByMaterial(Integer year) {
+        // 获取所有毒品类型列表
+        List<String> resultType = this.getResultType(year);
+        // 用于存储毒品名称及其检出占比的映射表
+        DetectionRateVO vo = new DetectionRateVO();
+        ArrayList<String> nameList = new ArrayList<>();
+        ArrayList<String> percentList = new ArrayList<>();
+        // 根据年份构建查询起始时间
+        LocalDateTime startTime = null;
+        if (year != null) {
+            // 如果年份不为空,使用指定年份的1月1日 00:00:00
+            startTime = LocalDateTime.of(year, 1, 1, 0, 0);
+        } else {
+            // 如果年份为空,默认使用当前年份的1月1日 00:00:00
+            startTime = LocalDateTime.of(LocalDateTime.now().getYear(), 1, 1, 0, 0);
+        }
+
+        // 查询所有非空且不为空的定性结果,且创建时间大于等于起始时间
+        List<EntrustmentIdentificationMaterial> materialList = entrustmentIdentificationMaterialService.list(Wrappers.<EntrustmentIdentificationMaterial>lambdaQuery()
+                .ge(EntrustmentIdentificationMaterial::getAcceptTime, startTime)
+                .eq(EntrustmentIdentificationMaterial::getAcceptPassed, 1));
+
+
+        // 如果查询结果为空,直接返回 null
+        if (materialList == null || materialList.size() == 0) {
+            return null;
+        }
+
+        // 获取分母(总结果数)
+        double denominator = materialList.size();
+
+        // 遍历每种毒品类型,计算其检出占比
+        for (String drugName : resultType) {
+            // 查询包含当前毒品名称的定性结果
+            List<EntrustMaterialCheckoutResult> list = this.list(Wrappers.<EntrustMaterialCheckoutResult>lambdaQuery()
+                    .like(EntrustMaterialCheckoutResult::getQualitativeResult, drugName));
+
+            // 如果查询结果不为空,计算检出占比并存入映射表
+            if (list != null && list.size() > 0) {
+                double molecule = list.size(); // 分子
+                BigDecimal d1 = new BigDecimal(molecule);
+                BigDecimal d2 = new BigDecimal(denominator); // 分母
+                // 计算百分比(保留2位小数,四舍五入)
+                double percentage = d1.divide(d2, 2, BigDecimal.ROUND_HALF_UP)
+                        .multiply(new BigDecimal(100))
+                        .doubleValue();
+                nameList.add(drugName);
+                percentList.add(String.format("%.2f%%",percentage));
+            }
+        }
+        vo.setNameList(nameList);
+        vo.setPercentList(percentList);
+        // 返回包含毒品名称及其检出占比的映射表
+        return vo ;
+    }
+
+
 }
 
 
diff --git a/src/main/java/digital/laboratory/platform/entrustment/service/impl/EntrustmentIdentificationMaterialServiceImpl.java b/src/main/java/digital/laboratory/platform/entrustment/service/impl/EntrustmentIdentificationMaterialServiceImpl.java
index 47743f4..9571dd1 100644
--- a/src/main/java/digital/laboratory/platform/entrustment/service/impl/EntrustmentIdentificationMaterialServiceImpl.java
+++ b/src/main/java/digital/laboratory/platform/entrustment/service/impl/EntrustmentIdentificationMaterialServiceImpl.java
@@ -1390,6 +1390,7 @@ public class EntrustmentIdentificationMaterialServiceImpl extends ServiceImpl<En
                 data.put("identificationMaterial", im);
                 data.put("caseEvent", ce);
                 data.put("entrustment", entrustment);
+
 //                data.put("evidence", evidence);
 
                 maps.add(data);
diff --git a/src/main/java/digital/laboratory/platform/entrustment/vo/DetectionRateVO.java b/src/main/java/digital/laboratory/platform/entrustment/vo/DetectionRateVO.java
new file mode 100644
index 0000000..67e0871
--- /dev/null
+++ b/src/main/java/digital/laboratory/platform/entrustment/vo/DetectionRateVO.java
@@ -0,0 +1,12 @@
+package digital.laboratory.platform.entrustment.vo;
+
+import lombok.Data;
+
+import java.util.List;
+
+@Data
+public class DetectionRateVO {
+
+    private List<String> nameList;
+    private List<String>percentList;
+}