From 3242d668358e6f1788f20a9a56d357178e8dc8df Mon Sep 17 00:00:00 2001 From: chen <2710907404@qq.com> Date: Mon, 24 Mar 2025 10:57:07 +0800 Subject: [PATCH] =?UTF-8?q?20250324=20=E6=9B=B4=E6=96=B0=201.=E5=AE=9E?= =?UTF-8?q?=E7=8E=B0=E6=9B=B4=E6=96=B0=E5=AE=9E=E9=AA=8C=E6=89=A9=E5=B1=95?= =?UTF-8?q?=E6=95=B0=E6=8D=AE=E6=97=B6=E8=AE=A1=E7=AE=97=E4=B8=B0=E5=BA=A6?= =?UTF-8?q?=E6=AF=94=E4=BB=A5=E5=8F=8A=E4=B8=B0=E5=BA=A6=E6=AF=94=E5=81=8F?= =?UTF-8?q?=E5=B7=AE?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../TestRecordSampleDataConstant.java | 6 +- .../service/ProcessInspectDataService.java | 69 ++++++ .../impl/InspectRecordServiceImpl.java | 4 +- .../impl/ProcessInspectDataServiceImpl.java | 180 +++++++++++++++ .../impl/TestRecordSampleDataServiceImpl.java | 209 ++---------------- ...TestRecordSampledataExpandServiceImpl.java | 17 +- 6 files changed, 294 insertions(+), 191 deletions(-) create mode 100644 dlp-drugtesting-biz/src/main/java/digital/laboratory/platform/inspection/service/ProcessInspectDataService.java create mode 100644 dlp-drugtesting-biz/src/main/java/digital/laboratory/platform/inspection/service/impl/ProcessInspectDataServiceImpl.java diff --git a/dlp-drugtesting-biz/src/main/java/digital/laboratory/platform/inspection/constant/TestRecordSampleDataConstant.java b/dlp-drugtesting-biz/src/main/java/digital/laboratory/platform/inspection/constant/TestRecordSampleDataConstant.java index 7935bd7..e89d9d1 100644 --- a/dlp-drugtesting-biz/src/main/java/digital/laboratory/platform/inspection/constant/TestRecordSampleDataConstant.java +++ b/dlp-drugtesting-biz/src/main/java/digital/laboratory/platform/inspection/constant/TestRecordSampleDataConstant.java @@ -9,11 +9,11 @@ public interface TestRecordSampleDataConstant { double HAIR_CASE_NEGATIVE_RT_ERROR = -2.5; // 保留时间相对误差(正负2.5%) - - double HAIR_CASE_ION_ABUNDANCE_RATIO_1 = 0.5; // 离子丰度比 中的比较值1 50% + double HAIR_CASE_ION_ABUNDANCE_RATIO_1 = 50; // 离子丰度比 中的比较值1 50% - double HAIR_CASE_ION_ABUNDANCE_RATIO_2 = 0.2; // 离子丰度比 中的比较值2 20% + double HAIR_CASE_ION_ABUNDANCE_RATIO_2 = 20; // 离子丰度比 中的比较值2 20% - double HAIR_CASE_ION_ABUNDANCE_RATIO_3 = 0.1; // 离子丰度比 中的比较值3 10% + double HAIR_CASE_ION_ABUNDANCE_RATIO_3 = 10; // 离子丰度比 中的比较值3 10% double HAIR_CASE_POSITIVE_MAX_ALLOW_ERROR_1 = 20d; // 离子丰度比 > 50% 的最大允许偏差范围(正负20%) + diff --git a/dlp-drugtesting-biz/src/main/java/digital/laboratory/platform/inspection/service/ProcessInspectDataService.java b/dlp-drugtesting-biz/src/main/java/digital/laboratory/platform/inspection/service/ProcessInspectDataService.java new file mode 100644 index 0000000..2d7f092 --- /dev/null +++ b/dlp-drugtesting-biz/src/main/java/digital/laboratory/platform/inspection/service/ProcessInspectDataService.java @@ -0,0 +1,69 @@ +package digital.laboratory.platform.inspection.service; + +import digital.laboratory.platform.inspection.dto.HairSewageDataDto; + +import java.math.BigDecimal; + +/** + * @author ChenJiangBao + * @version 1.0 + * @description: 处理检验数据接口 + * @date 2025/3/24 9:56 + */ +public interface ProcessInspectDataService { + + //设置是否在误差范围内 + String getWithinErrorText(BigDecimal actualValue, BigDecimal expectedValue); + + //判断保留时间范围是否符合 + String getRtWithinErrorText(double targetRtErr, double errorRange); + + /** + * 计算离子丰度比 相对偏差 (目标物离子丰度比 - 标准物离子丰度比) / 标准物质离子丰度比 * 100 + * + * @param ionAbundanceRatioWithinError 检测样本的丰度比偏差 + * @param stdIonAbundanceRatio 标准物质的离子丰度比 + */ + String calculateHairCaseIonAbundanceRatioWithinError(double ionAbundanceRatioWithinError, double stdIonAbundanceRatio); + + /** + * 计算离子丰度比偏差 + * + * @param sampleIonAbundanceRatio 目标物的离子丰度比 + * @param stdIonAbundanceRatio 标准物质的离子丰度比 + * @return + */ + double getAbundanceRatioErrorValue(double sampleIonAbundanceRatio, double stdIonAbundanceRatio); + + /** + * 计算相对误差 (目标物保留时间 - 标准物保留时间) / 标准物质保留时间 * 100 + * + * @param hairSewageDataDto + * @param hairSewageDataDtoStd + */ + void calculateHairCaseRtTimeError(HairSewageDataDto hairSewageDataDto, HairSewageDataDto hairSewageDataDtoStd); + + /** + * 计算保留时间的相对误差 + * + * @param targetRtTime 目标物保留时间信息 + * @param stdRtTime 标准物保留时间信息 + * @return + */ + double getHairCaseRtTimeError(double targetRtTime, double stdRtTime); + + /** + * 判断保留时间相对误差是否符合误差范围 + * + * @param rtTimeError + */ + String setHairCaseRtTimeWithinError(double rtTimeError); + + /** + * 获取碎片的丰度比偏差范围 + * + * @param abundanceRatio + * @return + */ + BigDecimal getErrorRange(BigDecimal abundanceRatio); +} diff --git a/dlp-drugtesting-biz/src/main/java/digital/laboratory/platform/inspection/service/impl/InspectRecordServiceImpl.java b/dlp-drugtesting-biz/src/main/java/digital/laboratory/platform/inspection/service/impl/InspectRecordServiceImpl.java index 62b094c..f6cef54 100644 --- a/dlp-drugtesting-biz/src/main/java/digital/laboratory/platform/inspection/service/impl/InspectRecordServiceImpl.java +++ b/dlp-drugtesting-biz/src/main/java/digital/laboratory/platform/inspection/service/impl/InspectRecordServiceImpl.java @@ -362,7 +362,7 @@ public class InspectRecordServiceImpl implements InspectRecordService { .in(TestRecordReagent::getId, testRecord.getReagentConsumablesList()) .eq(TestRecordReagent::getCategory, "标准物质")); - if (references == null || references.size() == 0) { + if (references == null || references.isEmpty()) { data.put("referenceMaterialName", "未找到试剂耗材数据!"); } else { @@ -377,7 +377,7 @@ public class InspectRecordServiceImpl implements InspectRecordService { .in(TestRecordReagent::getId, testRecord.getReagentConsumablesList()) .eq(TestRecordReagent::getCategory, "试剂")); - if (reagents == null || reagents.size() == 0) { + if (reagents == null || reagents.isEmpty()) { data.put("reagentConsumableName", "未找到试剂耗材数据!"); } else { String reagentConsumableName = reagents.stream() diff --git a/dlp-drugtesting-biz/src/main/java/digital/laboratory/platform/inspection/service/impl/ProcessInspectDataServiceImpl.java b/dlp-drugtesting-biz/src/main/java/digital/laboratory/platform/inspection/service/impl/ProcessInspectDataServiceImpl.java new file mode 100644 index 0000000..87ab0ac --- /dev/null +++ b/dlp-drugtesting-biz/src/main/java/digital/laboratory/platform/inspection/service/impl/ProcessInspectDataServiceImpl.java @@ -0,0 +1,180 @@ +package digital.laboratory.platform.inspection.service.impl; + +import digital.laboratory.platform.inspection.constant.TestRecordSampleDataConstant; +import digital.laboratory.platform.inspection.dto.HairSewageDataDto; +import digital.laboratory.platform.inspection.service.ProcessInspectDataService; +import org.springframework.stereotype.Service; + +import java.math.BigDecimal; + +/** + * @author ChenJiangBao + * @version 1.0 + * @description: 处理检验数据接口 实现类 + * @date 2025/3/24 9:57 + */ +@Service +public class ProcessInspectDataServiceImpl implements ProcessInspectDataService { + + //设置是否在误差范围内 + @Override + public String getWithinErrorText(BigDecimal actualValue, BigDecimal expectedValue) { + if (actualValue.compareTo(expectedValue) < 0) { // actualValue < expectedValue + return TestRecordSampleDataConstant.IS; + } else { + return TestRecordSampleDataConstant.NO; + } + } + + + //判断保留时间范围是否符合 + @Override + public String getRtWithinErrorText(double targetRtErr, double errorRange) { + if (targetRtErr < errorRange) { + return TestRecordSampleDataConstant.IS; + } else { + return TestRecordSampleDataConstant.NO; + } + + } + + /** + * 计算离子丰度比 相对偏差 (目标物离子丰度比 - 标准物离子丰度比) / 标准物质离子丰度比 * 100 + * + * @param ionAbundanceRatioWithinError 检测样本的丰度比偏差 + * @param stdIonAbundanceRatio 标准物质的离子丰度比 + */ + @Override + public String calculateHairCaseIonAbundanceRatioWithinError(double ionAbundanceRatioWithinError, double stdIonAbundanceRatio) { + + // 判断是否在离子丰度比允许的最大偏差范围 + if (stdIonAbundanceRatio > TestRecordSampleDataConstant.HAIR_CASE_ION_ABUNDANCE_RATIO_1) { + + return setHairCaseWhetherCheckOut( + ionAbundanceRatioWithinError, + TestRecordSampleDataConstant.HAIR_CASE_POSITIVE_MAX_ALLOW_ERROR_1, + TestRecordSampleDataConstant.HAIR_CASE_NEGATIVE_MAX_ALLOW_ERROR_1); + + } else if (stdIonAbundanceRatio > TestRecordSampleDataConstant.HAIR_CASE_ION_ABUNDANCE_RATIO_2 + && stdIonAbundanceRatio <= TestRecordSampleDataConstant.HAIR_CASE_ION_ABUNDANCE_RATIO_1) { + + return setHairCaseWhetherCheckOut( + ionAbundanceRatioWithinError, + TestRecordSampleDataConstant.HAIR_CASE_POSITIVE_MAX_ALLOW_ERROR_2, + TestRecordSampleDataConstant.HAIR_CASE_NEGATIVE_MAX_ALLOW_ERROR_2); + + } else if (stdIonAbundanceRatio > TestRecordSampleDataConstant.HAIR_CASE_ION_ABUNDANCE_RATIO_3 + && stdIonAbundanceRatio <= TestRecordSampleDataConstant.HAIR_CASE_ION_ABUNDANCE_RATIO_2) { + + return setHairCaseWhetherCheckOut( + ionAbundanceRatioWithinError, + TestRecordSampleDataConstant.HAIR_CASE_POSITIVE_MAX_ALLOW_ERROR_3, + TestRecordSampleDataConstant.HAIR_CASE_NEGATIVE_MAX_ALLOW_ERROR_3); + } else { + return setHairCaseWhetherCheckOut( + ionAbundanceRatioWithinError, + TestRecordSampleDataConstant.HAIR_CASE_POSITIVE_MAX_ALLOW_ERROR_4, + TestRecordSampleDataConstant.HAIR_CASE_NEGATIVE_MAX_ALLOW_ERROR_4); + } + } + + /** + * 计算离子丰度比偏差 + * + * @param sampleIonAbundanceRatio 目标物的离子丰度比 + * @param stdIonAbundanceRatio 标准物质的离子丰度比 + * @return + */ + @Override + public double getAbundanceRatioErrorValue(double sampleIonAbundanceRatio, double stdIonAbundanceRatio) { + double diffValue = sampleIonAbundanceRatio - stdIonAbundanceRatio; + double abundanceRatioErrorValue = Math.abs(diffValue) / stdIonAbundanceRatio * 100; + return abundanceRatioErrorValue; + } + + /** + * 计算相对误差 (目标物保留时间 - 标准物保留时间) / 标准物质保留时间 * 100 + * + * @param hairSewageDataDto + * @param hairSewageDataDtoStd + */ + @Override + public void calculateHairCaseRtTimeError(HairSewageDataDto hairSewageDataDto, HairSewageDataDto hairSewageDataDtoStd) { + if ( !TestRecordSampleDataConstant.isInvalidValue(hairSewageDataDto.getTargetRtTime()) ) { + // 计算保留时间的相对误差 + double rtTimeError = getHairCaseRtTimeError(hairSewageDataDto.getTargetRtTime(), hairSewageDataDtoStd.getStdRtTime()); + hairSewageDataDto.setRtTimeError(rtTimeError); + // 判断保留时间相对误差是否符合误差范围 + hairSewageDataDto.setRtTimeWithinError(setHairCaseRtTimeWithinError(hairSewageDataDto.getRtTimeError())); + } else { + hairSewageDataDto.setRtTimeError(TestRecordSampleDataConstant.INVALID_VALUE); + hairSewageDataDto.setRtTimeWithinError("/"); + } + } + + /** + * 计算保留时间的相对误差 + * + * @param targetRtTime 目标物保留时间信息 + * @param stdRtTime 标准物保留时间信息 + * @return + */ + @Override + public double getHairCaseRtTimeError(double targetRtTime, double stdRtTime) { + return (targetRtTime - stdRtTime) / stdRtTime * 100; + } + + /** + * 判断保留时间相对误差是否符合误差范围 + * + * @param rtTimeError + */ + @Override + public String setHairCaseRtTimeWithinError(double rtTimeError) { + if (rtTimeError > TestRecordSampleDataConstant.HAIR_CASE_NEGATIVE_RT_ERROR + && rtTimeError < TestRecordSampleDataConstant.HAIR_CASE_POSITIVE_RT_ERROR) { + return TestRecordSampleDataConstant.IS; + } else { + return TestRecordSampleDataConstant.NO; + } + } + + /** + * 获取碎片的丰度比偏差范围 + * + * @param abundanceRatio + * @return + */ + @Override + public BigDecimal getErrorRange(BigDecimal abundanceRatio) { + double retValue; + if (abundanceRatio.compareTo(BigDecimal.valueOf(50)) > 0) { // abundanceRatio > 50 + retValue = 10; + } else if (abundanceRatio.compareTo(BigDecimal.valueOf(20)) > 0) { // abundanceRatio > 20 + retValue = 15; + } else if (abundanceRatio.compareTo(BigDecimal.valueOf(10)) > 0) { // abundanceRatio > 10 + retValue = 20; + } else { + retValue = 50; + } + return BigDecimal.valueOf(retValue); + } + + + /** + * 根据计算出来的离子丰度比误差来判断是否检出 + * + * @param ionAbundanceRatioWithinError + * @param positive + * @param negative + */ + private String setHairCaseWhetherCheckOut(double ionAbundanceRatioWithinError, double positive, double negative) { + if (ionAbundanceRatioWithinError < positive + && ionAbundanceRatioWithinError > negative) { + return TestRecordSampleDataConstant.IS; + } else { + return TestRecordSampleDataConstant.NO; + } + } + +} diff --git a/dlp-drugtesting-biz/src/main/java/digital/laboratory/platform/inspection/service/impl/TestRecordSampleDataServiceImpl.java b/dlp-drugtesting-biz/src/main/java/digital/laboratory/platform/inspection/service/impl/TestRecordSampleDataServiceImpl.java index 3fefd72..cf081b7 100644 --- a/dlp-drugtesting-biz/src/main/java/digital/laboratory/platform/inspection/service/impl/TestRecordSampleDataServiceImpl.java +++ b/dlp-drugtesting-biz/src/main/java/digital/laboratory/platform/inspection/service/impl/TestRecordSampleDataServiceImpl.java @@ -54,6 +54,7 @@ import org.springframework.transaction.interceptor.TransactionAspectSupport; import javax.annotation.Resource; import javax.servlet.http.HttpServletRequest; +import java.math.BigDecimal; import java.text.DecimalFormat; import java.time.LocalDate; import java.time.LocalDateTime; @@ -107,6 +108,9 @@ public class TestRecordSampleDataServiceImpl extends ServiceImpl<TestRecordSampl @Resource private TestRecordReagentService testRecordReagentService; + @Resource + private ProcessInspectDataService processInspectDataService; + /** * 校验实验状态是否完成,完成则提升不能修改数据 * @@ -193,14 +197,10 @@ public class TestRecordSampleDataServiceImpl extends ServiceImpl<TestRecordSampl .last("ORDER BY SUBSTRING_INDEX(name, '-', -1) + 0")).stream().filter(item -> { // int size = testRecordSampleSolutionsNoList.size(); // 这里判断了如果不是检材也返回true,是检材的话判断是不是这个业务id下的检材,根据编号判断 - if (!item.getSampleType().equals(TestRecordSampleDataConstant.SAMPLE_TYPE_ANALYTE) || + return !item.getSampleType().equals(TestRecordSampleDataConstant.SAMPLE_TYPE_ANALYTE) || (item.getSampleType().equals(TestRecordSampleDataConstant.SAMPLE_TYPE_ANALYTE) && testRecordSampleSolutionsNoList.contains(item.getSampleNo()) - )) { - return true; - } else { - return false; - } + ); }).collect(Collectors.toList()); ESTBusinessInfoVO estBusinessInfoVO = estBusinessInfoVOS.get(0); // 封装的结果集 @@ -970,12 +970,13 @@ public class TestRecordSampleDataServiceImpl extends ServiceImpl<TestRecordSampl // 离子丰度比 if (hairCompoundData.getRatioActual() == null) { if (hairCompoundData.getArea() != null && hairCompoundData.getArea1() != null) { - hairSewageDataDto.setIonAbundanceRatio(hairCompoundData.getArea1() / hairCompoundData.getArea()); + hairSewageDataDto.setIonAbundanceRatio(hairCompoundData.getArea1() / hairCompoundData.getArea() * 100); } else { hairSewageDataDto.setIonAbundanceRatio(TestRecordSampleDataConstant.INVALID_VALUE); } } else { - hairSewageDataDto.setIonAbundanceRatio(hairCompoundData.getRatioActual()); + // 从文件中获取到的丰度比并没有乘以100 + hairSewageDataDto.setIonAbundanceRatio(hairCompoundData.getRatioActual() * 100); } Double rtTime = hairCompoundData.getRtTime() == null ? TestRecordSampleDataConstant.INVALID_VALUE : hairCompoundData.getRtTime(); // 取文件的保留时间 hairSewageDataDto.setTargetRtTime(rtTime); // 目标物保留时间, 标准物质的保留时间同时存在 TargetRtTime 和 StdRtTime @@ -1011,129 +1012,17 @@ public class TestRecordSampleDataServiceImpl extends ServiceImpl<TestRecordSampl // 设置标准物质浓度 HairSewageDataDto hairSewageDataDtoStd = stdMap.get(hairSewageDataDto.getCompoundName()); // 获取化合物下的标准物质信息 if (hairSewageDataDtoStd != null) { -// hairSewageDataDto.setConcentration(hairSewageDataDtoStd.getStdConcentration()); -// hairSewageDataDto.setStdRtTime(hairSewageDataDtoStd.getStdRtTime()); // 计算相对误差 (目标物保留时间 - 标准物保留时间) / 标准物质保留时间 * 100 - calculateHairCaseRtTimeError(hairSewageDataDto, hairSewageDataDtoStd); + processInspectDataService.calculateHairCaseRtTimeError(hairSewageDataDto, hairSewageDataDtoStd); // 计算离子丰度比 相对偏差 (目标物离子丰度比 - 标准物离子丰度比) / 标准物质离子丰度比 * 100 - calculateHairCaseIonAbundanceRatioWithinError(hairSewageDataDto, hairSewageDataDtoStd); + hairSewageDataDto.setIonAbundanceRatioWithinError(processInspectDataService.getAbundanceRatioErrorValue(hairSewageDataDto.getIonAbundanceRatio(), hairSewageDataDtoStd.getIonAbundanceRatio())); + hairSewageDataDto.setWhetherCheckOut(processInspectDataService.calculateHairCaseIonAbundanceRatioWithinError(hairSewageDataDto.getIonAbundanceRatioWithinError(), hairSewageDataDtoStd.getIonAbundanceRatio())); + hairSewageDataDto.setIsDetected(hairSewageDataDto.getWhetherCheckOut().equals(TestRecordSampleDataConstant.IS) ? 1 : 0); } -// else { -// log.info("没有找到该标准溶液,化合物 {} 样本ID {}", hairSewageDataDto.getCompoundName(), hairSewageDataDto.getSampleNo()); -// hairSewageDataDto.setStdConcentration("-1"); -// hairSewageDataDto.setStdRtTime(TestRecordSampleDataConstant.INVALID_VALUE); -// } }); return testRecordSampleDataListAnalyte; } - /** - * 计算离子丰度比 相对偏差 (目标物离子丰度比 - 标准物离子丰度比) / 标准物质离子丰度比 * 100 - * - * @param hairSewageDataDto - * @param hairSewageDataDtoStd - */ - private void calculateHairCaseIonAbundanceRatioWithinError(HairSewageDataDto hairSewageDataDto, HairSewageDataDto hairSewageDataDtoStd) { - if ( !TestRecordSampleDataConstant.isInvalidValue(hairSewageDataDto.getIonAbundanceRatio()) ) { - double ionAbundanceRatioWithinError = getAbundanceRatioErrorValue(hairSewageDataDto.getIonAbundanceRatio(), hairSewageDataDtoStd.getIonAbundanceRatio()); - hairSewageDataDto.setIonAbundanceRatioWithinError(ionAbundanceRatioWithinError); - double stdIonAbundanceRatio = hairSewageDataDtoStd.getIonAbundanceRatio(); - // 判断是否在离子丰度比允许的最大偏差范围 - if (stdIonAbundanceRatio > TestRecordSampleDataConstant.HAIR_CASE_ION_ABUNDANCE_RATIO_1) { - - setHairCaseWhetherCheckOut( - hairSewageDataDto, - TestRecordSampleDataConstant.HAIR_CASE_POSITIVE_MAX_ALLOW_ERROR_1, - TestRecordSampleDataConstant.HAIR_CASE_NEGATIVE_MAX_ALLOW_ERROR_1); - - } else if (stdIonAbundanceRatio > TestRecordSampleDataConstant.HAIR_CASE_ION_ABUNDANCE_RATIO_2 - && stdIonAbundanceRatio <= TestRecordSampleDataConstant.HAIR_CASE_ION_ABUNDANCE_RATIO_1) { - - setHairCaseWhetherCheckOut( - hairSewageDataDto, - TestRecordSampleDataConstant.HAIR_CASE_POSITIVE_MAX_ALLOW_ERROR_2, - TestRecordSampleDataConstant.HAIR_CASE_NEGATIVE_MAX_ALLOW_ERROR_2); - - } else if (stdIonAbundanceRatio > TestRecordSampleDataConstant.HAIR_CASE_ION_ABUNDANCE_RATIO_3 - && stdIonAbundanceRatio <= TestRecordSampleDataConstant.HAIR_CASE_ION_ABUNDANCE_RATIO_2) { - - setHairCaseWhetherCheckOut( - hairSewageDataDto, - TestRecordSampleDataConstant.HAIR_CASE_POSITIVE_MAX_ALLOW_ERROR_3, - TestRecordSampleDataConstant.HAIR_CASE_NEGATIVE_MAX_ALLOW_ERROR_3); - } else if (stdIonAbundanceRatio <= TestRecordSampleDataConstant.HAIR_CASE_ION_ABUNDANCE_RATIO_3) { - setHairCaseWhetherCheckOut( - hairSewageDataDto, - TestRecordSampleDataConstant.HAIR_CASE_POSITIVE_MAX_ALLOW_ERROR_4, - TestRecordSampleDataConstant.HAIR_CASE_NEGATIVE_MAX_ALLOW_ERROR_4); - } - } else { - hairSewageDataDto.setIonAbundanceRatioWithinError(TestRecordSampleDataConstant.INVALID_VALUE); - hairSewageDataDto.setWhetherCheckOut("/"); - } - } - - /** - * 根据计算出来的离子丰度比误差来判断是否检出 - * - * @param hairSewageDataDto - * @param positive - * @param negative - */ - private void setHairCaseWhetherCheckOut(HairSewageDataDto hairSewageDataDto, double positive, double negative) { - if (hairSewageDataDto.getIonAbundanceRatioWithinError() < positive - && hairSewageDataDto.getIonAbundanceRatioWithinError() > negative) { - hairSewageDataDto.setWhetherCheckOut(TestRecordSampleDataConstant.IS); - hairSewageDataDto.setIsDetected(1); - } else { - hairSewageDataDto.setWhetherCheckOut(TestRecordSampleDataConstant.NO); - hairSewageDataDto.setIsDetected(0); - } - } - - /** - * 计算相对误差 (目标物保留时间 - 标准物保留时间) / 标准物质保留时间 * 100 - * - * @param hairSewageDataDto - * @param hairSewageDataDtoStd - */ - private void calculateHairCaseRtTimeError(HairSewageDataDto hairSewageDataDto, HairSewageDataDto hairSewageDataDtoStd) { - if ( !TestRecordSampleDataConstant.isInvalidValue(hairSewageDataDto.getTargetRtTime()) ) { - // 计算保留时间的相对误差 - double rtTimeError = getHairCaseRtTimeError(hairSewageDataDto.getTargetRtTime(), hairSewageDataDtoStd.getStdRtTime()); - hairSewageDataDto.setRtTimeError(rtTimeError); - // 判断保留时间相对误差是否符合误差范围 - hairSewageDataDto.setRtTimeWithinError(setHairCaseRtTimeWithinError(hairSewageDataDto.getRtTimeError())); - } else { - hairSewageDataDto.setRtTimeError(TestRecordSampleDataConstant.INVALID_VALUE); - hairSewageDataDto.setRtTimeWithinError("/"); - } - } - - /** - * 计算保留时间的相对误差 - * - * @param targetRtTime 目标物保留时间信息 - * @param stdRtTime 标准物保留时间信息 - * @return - */ - private double getHairCaseRtTimeError(double targetRtTime, double stdRtTime) { - return (targetRtTime - stdRtTime) / stdRtTime * 100; - } - - /** - * 判断保留时间相对误差是否符合误差范围 - * - * @param rtTimeError - */ - private String setHairCaseRtTimeWithinError(double rtTimeError) { - if (rtTimeError > TestRecordSampleDataConstant.HAIR_CASE_NEGATIVE_RT_ERROR - && rtTimeError < TestRecordSampleDataConstant.HAIR_CASE_POSITIVE_RT_ERROR) { - return TestRecordSampleDataConstant.IS; - } else { - return TestRecordSampleDataConstant.NO; - } - } /** * 设置标准物的溶液浓度 @@ -1378,18 +1267,18 @@ public class TestRecordSampleDataServiceImpl extends ServiceImpl<TestRecordSampl double mzValue = npsTestDetailDataStruct.getArea() / npsTestDetailDataStruct_Base.getArea() * 100; npsTestDetailDataStruct.setAbundanceRatio(mzValue); //设置误差范围,基峰不用设置误差范围 - double errorRange = getErrorRange(mzValue); - npsTestDetailDataStruct.setErrorRange(errorRange); + BigDecimal errorRange = processInspectDataService.getErrorRange(BigDecimal.valueOf(mzValue)); + npsTestDetailDataStruct.setErrorRange(errorRange.doubleValue()); //设置标准品的丰度比 double stdCorrespondingAbundanceRatio = getStdCorrespondingAbundanceRatio(npsTestDetailDataStruct.getMass(), npsTestDetailDataStruct.getName(), testRecordSampleDataList_std); npsTestDetailDataStruct.setAbundanceRatio_std(stdCorrespondingAbundanceRatio); //设置偏差,公式是 样品-标准品/标准品 - double abundanceRatioErrorValue = getAbundanceRatioErrorValue(npsTestDetailDataStruct.getAbundanceRatio(), + double abundanceRatioErrorValue = processInspectDataService.getAbundanceRatioErrorValue(npsTestDetailDataStruct.getAbundanceRatio(), npsTestDetailDataStruct.getAbundanceRatio_std()); npsTestDetailDataStruct.setAbundanceRatioError(abundanceRatioErrorValue); //设置是否在误差范围内 - String withinErrorText = getWithinErrorText(npsTestDetailDataStruct.getAbundanceRatioError(), npsTestDetailDataStruct.getErrorRange()); + String withinErrorText = processInspectDataService.getWithinErrorText(BigDecimal.valueOf(npsTestDetailDataStruct.getAbundanceRatioError()), BigDecimal.valueOf(npsTestDetailDataStruct.getErrorRange())); npsTestDetailDataStruct.setWithinError(withinErrorText); otherList.add(npsTestDetailDataStruct); } else { @@ -1411,7 +1300,7 @@ public class TestRecordSampleDataServiceImpl extends ServiceImpl<TestRecordSampl double tmp1 = (sampleRetTime - stdRtTime) / stdRtTime; tmp1 = Math.abs(tmp1) * 100; npsCaseTestDataDto.setRtTimeError(tmp1); - String rtWithinErrorText = getRtWithinErrorText(tmp1, 1); + String rtWithinErrorText = processInspectDataService.getRtWithinErrorText(tmp1, 1); npsCaseTestDataDto.setRtTimeWithinError(rtWithinErrorText); //设置碎片峰的结果,条件是 除了基峰外的所有特征碎片都满足 离子丰度误差,才算是检出条件之一 int isOk = checkOtherFragmentResult(otherList); @@ -1462,25 +1351,6 @@ public class TestRecordSampleDataServiceImpl extends ServiceImpl<TestRecordSampl return npsTestDetailDataStruct_Base; } - //设置是否在误差范围内 - private String getWithinErrorText(double actualValue, double expectedValue) { - if (actualValue < expectedValue) { - return TestRecordSampleDataConstant.IS; - } else { - return TestRecordSampleDataConstant.NO; - } - } - - //判断保留时间范围是否符合 - private String getRtWithinErrorText(double targetRtErr, double errorRange) { - if (targetRtErr < errorRange) { - return TestRecordSampleDataConstant.IS; - } else { - return TestRecordSampleDataConstant.NO; - } - - } - //查找标准品的保留时间 private double findStdRtTime(String compoundName, List<NPSCaseTestDataDto> testRecordSampleDataList_std) { List<NPSCaseTestDataDto> retStd = testRecordSampleDataList_std.stream() @@ -1495,39 +1365,6 @@ public class TestRecordSampleDataServiceImpl extends ServiceImpl<TestRecordSampl } } - /** - * 计算离子丰度比偏差 - * - * @param sampleIonAbundanceRatio 目标物的离子丰度比 - * @param stdIonAbundanceRatio 标准物质的离子丰度比 - * @return - */ - private double getAbundanceRatioErrorValue(double sampleIonAbundanceRatio, double stdIonAbundanceRatio) { - double diffValue = sampleIonAbundanceRatio - stdIonAbundanceRatio; - double abundanceRatioErrorValue = Math.abs(diffValue) / stdIonAbundanceRatio * 100; - return abundanceRatioErrorValue; - } - - /** - * 获取碎片的丰度比偏差范围 - * - * @param abundanceRatio - * @return - */ - private double getErrorRange(double abundanceRatio) { - double retValue = 0; - if (abundanceRatio > 0.5) { - retValue = 10; - } else if (abundanceRatio > 0.2) { - retValue = 15; - } else if (abundanceRatio > 0.1) { - retValue = 20; - } else { - retValue = 50; - } - return retValue; - } - private double getStdCorrespondingAbundanceRatio(String massValue, String compoundName, List<NPSCaseTestDataDto> testRecordSampleDataList_std) { double retValue = 0; //根据化合物名称找出对应的标准品 @@ -1890,15 +1727,17 @@ public class TestRecordSampleDataServiceImpl extends ServiceImpl<TestRecordSampl if ( data.getTargetRtTime() != null && std.getTargetRtTime() != null ) { TestRecord testRecord = testRecordService.getById(data.getTestId()); if (testRecord.getBusinessType().equals(BusinessType.BOINT_CASE.getBusinessType())) { + data.setRtTimeError(processInspectDataService.getHairCaseRtTimeError(data.getTargetRtTime(), std.getStdRtTime())); data.setRtTimeWithinError( - setHairCaseRtTimeWithinError( - getHairCaseRtTimeError(data.getTargetRtTime(), std.getStdRtTime()) + processInspectDataService.setHairCaseRtTimeWithinError( + data.getRtTimeError() ) ); } else { + data.setRtTimeError(processInspectDataService.getHairCaseRtTimeError(data.getTargetRtTime(), std.getStdRtTime())); data.setRtTimeWithinError( - getRtWithinErrorText( - Math.abs(getHairCaseRtTimeError(data.getTargetRtTime(), std.getStdRtTime())), + processInspectDataService.getRtWithinErrorText( + Math.abs(data.getRtTimeError()), 1 ) ); diff --git a/dlp-drugtesting-biz/src/main/java/digital/laboratory/platform/inspection/service/impl/TestRecordSampledataExpandServiceImpl.java b/dlp-drugtesting-biz/src/main/java/digital/laboratory/platform/inspection/service/impl/TestRecordSampledataExpandServiceImpl.java index 402a210..1ee2d40 100644 --- a/dlp-drugtesting-biz/src/main/java/digital/laboratory/platform/inspection/service/impl/TestRecordSampledataExpandServiceImpl.java +++ b/dlp-drugtesting-biz/src/main/java/digital/laboratory/platform/inspection/service/impl/TestRecordSampledataExpandServiceImpl.java @@ -14,9 +14,12 @@ import digital.laboratory.platform.inspection.dto.HairSewageDataDto; import digital.laboratory.platform.inspection.dto.NPSCaseTestDataDto; import digital.laboratory.platform.inspection.entity.TestRecordSampleDataExpand; import digital.laboratory.platform.inspection.mapper.TestRecordSampleDataExpandMapper; +import digital.laboratory.platform.inspection.service.ProcessInspectDataService; import digital.laboratory.platform.inspection.service.TestRecordSampleDataService; import digital.laboratory.platform.inspection.service.TestRecordSampledataExpandService; +import digital.laboratory.platform.inspection.service.TestRecordService; import digital.laboratory.platform.inspection.utils.datafile.nps.NPSTestDetailDataStruct; +import digital.laboratory.platform.inspetion.api.entity.TestRecord; import digital.laboratory.platform.sys.entity.Drug; import org.springframework.stereotype.Service; @@ -36,9 +39,15 @@ import java.util.stream.Collectors; public class TestRecordSampledataExpandServiceImpl extends ServiceImpl<TestRecordSampleDataExpandMapper, TestRecordSampleDataExpand> implements TestRecordSampledataExpandService{ + @Resource + private TestRecordService testRecordService; + @Resource private TestRecordSampleDataService testRecordSampleDataService; + @Resource + private ProcessInspectDataService processInspectDataService; + /** * 封装处理毛发案件、任务等检验扩展数据信息 * @param hairSewageDataDto @@ -154,6 +163,7 @@ public class TestRecordSampledataExpandServiceImpl extends ServiceImpl<TestRecor if (!sampleDataExpand.getBasePeak() && basePeakData != null) { // 获取标准物质的扩展信息,1 先查询对应的实验数据 2 根据实验数据的实验id以及化合物以及类型获取标准物质的实验数据信息 3 根据标准物质实验数据id取对应的扩展数据 TestRecordSampleData testRecordSampleData = testRecordSampleDataService.getById(sampleDataExpand.getTestDataId()); + TestRecord testRecord = testRecordService.getById(testRecordSampleData.getTestId()); List<TestRecordSampleDataExpand> stdDataExpandList = null; if (!testRecordSampleData.getSampleType().equals(TestRecordSampleDataConstant.SAMPLE_TYPE_STD)) { TestRecordSampleData stdTestSampleData = testRecordSampleDataService.getOne(Wrappers.<TestRecordSampleData>lambdaQuery().eq(TestRecordSampleData::getTestId, testRecordSampleData.getTestId()).eq(TestRecordSampleData::getCompoundName, testRecordSampleData.getCompoundName()).eq(TestRecordSampleData::getSampleType, TestRecordSampleDataConstant.SAMPLE_TYPE_STD)); @@ -169,10 +179,15 @@ public class TestRecordSampledataExpandServiceImpl extends ServiceImpl<TestRecor .divide(stdDataExpand.getIonAbundanceRatio(), 5, BigDecimal.ROUND_HALF_UP) .multiply(BigDecimal.valueOf(100)); sampleDataExpand.setIonAbundanceRatioError(ionAbundanceRatioError); -// sampleDataExpand.setIonAbundanceRatioWithinError(); + if (testRecord.getBusinessType().equals(BusinessType.NPS_CASE.getBusinessType())) { + sampleDataExpand.setIonAbundanceRatioWithinError(processInspectDataService.getWithinErrorText(ionAbundanceRatioError, processInspectDataService.getErrorRange(sampleDataExpand.getIonAbundanceRatio()))); + } else { + sampleDataExpand.setIonAbundanceRatioWithinError(processInspectDataService.calculateHairCaseIonAbundanceRatioWithinError(ionAbundanceRatioError.doubleValue(), stdDataExpand.getIonAbundanceRatio().doubleValue())); + } } }); } + update = super.updateById(sampleDataExpand); } }