|
|
@ -21,17 +21,18 @@ import digital.laboratory.platform.entrustment.service.CommonFeignService; |
|
|
|
import digital.laboratory.platform.entrustment.service.EntrustMaterialCheckoutResultService; |
|
|
|
import digital.laboratory.platform.entrustment.service.EntrustMaterialCheckoutResultService; |
|
|
|
import digital.laboratory.platform.entrustment.service.EntrustmentIdentificationMaterialService; |
|
|
|
import digital.laboratory.platform.entrustment.service.EntrustmentIdentificationMaterialService; |
|
|
|
import digital.laboratory.platform.entrustment.service.EntrustmentService; |
|
|
|
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.entrustment.vo.EntrustMaterialCheckoutResultVO; |
|
|
|
import digital.laboratory.platform.sys.entity.Area; |
|
|
|
import digital.laboratory.platform.sys.entity.Area; |
|
|
|
import digital.laboratory.platform.sys.entity.DrugLite; |
|
|
|
import digital.laboratory.platform.sys.entity.DrugLite; |
|
|
|
import org.apache.poi.ss.usermodel.*; |
|
|
|
import org.apache.poi.ss.usermodel.*; |
|
|
|
import org.apache.poi.xssf.usermodel.XSSFWorkbook; |
|
|
|
import org.apache.poi.xssf.usermodel.XSSFWorkbook; |
|
|
|
import org.springframework.beans.BeanUtils; |
|
|
|
|
|
|
|
import org.springframework.stereotype.Service; |
|
|
|
import org.springframework.stereotype.Service; |
|
|
|
|
|
|
|
|
|
|
|
import javax.annotation.Resource; |
|
|
|
import javax.annotation.Resource; |
|
|
|
import javax.servlet.http.HttpServletResponse; |
|
|
|
import javax.servlet.http.HttpServletResponse; |
|
|
|
import java.io.IOException; |
|
|
|
import java.io.IOException; |
|
|
|
|
|
|
|
import java.math.BigDecimal; |
|
|
|
import java.net.URLEncoder; |
|
|
|
import java.net.URLEncoder; |
|
|
|
import java.time.LocalDateTime; |
|
|
|
import java.time.LocalDateTime; |
|
|
|
import java.time.format.DateTimeFormatter; |
|
|
|
import java.time.format.DateTimeFormatter; |
|
|
@ -357,6 +358,123 @@ public class EntrustMaterialCheckoutResultServiceImpl extends ServiceImpl<Entrus |
|
|
|
} |
|
|
|
} |
|
|
|
return typeName; |
|
|
|
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 ; |
|
|
|
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
} |
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|