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 voiPage(EntrustMaterialCheckoutResultQuery query); + + List 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 + * 该方法通过查询指定年份内所有非空且不为空的定性结果,提取其中的毒品类型信息, + * 并返回一个去重且按字典序排序的毒品类型列表。 + * + * @param year 年份,若为 null 则默认使用当前年份 + * @return 包含所有毒品类型的列表,列表中的毒品类型名称已去重并排序 + * + * @see EntrustMaterialCheckoutResult 委托材料检验结果实体类,包含定性结果字段 + * @see DrugLite 药品轻量级实体类,包含药品名称字段 + * @see DrugLiteConvert 工具类,用于将定性结果转换为毒品轻量级实体列表 + */ + public List 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 list = this.list(Wrappers.lambdaQuery() + .ne(EntrustMaterialCheckoutResult::getQualitativeResult, "") // 排除空字符串 + .isNotNull(EntrustMaterialCheckoutResult::getQualitativeResult) // 排除空值 + .ge(EntrustMaterialCheckoutResult::getCreateTime, startTime)); // 创建时间大于等于起始时间 + + // 用于存储去重后的毒品类型列表 + ArrayList typeList = new ArrayList<>(); + + // 遍历查询结果 + for (EntrustMaterialCheckoutResult result : list) { + // 将定性结果转换为轻量级实体列表 + List 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 resultType = this.getResultType(year); + // 用于存储毒品名称及其检出占比的映射表 + DetectionRateVO vo = new DetectionRateVO(); + ArrayList nameList = new ArrayList<>(); + ArrayList 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 materialList = entrustmentIdentificationMaterialService.list(Wrappers.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 list = this.list(Wrappers.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 nameList; + private ListpercentList; +}