From 43b58ed5ec7910c225d887f1d6d0d80cc26b72ce Mon Sep 17 00:00:00 2001 From: chen <2710907404@qq.com> Date: Thu, 17 Apr 2025 15:16:04 +0800 Subject: [PATCH] =?UTF-8?q?20250414=20=E6=9B=B4=E6=96=B0=201.=E5=9C=A8?= =?UTF-8?q?=E6=A3=80=E9=AA=8C=E6=89=A9=E5=B1=95=E6=95=B0=E6=8D=AE=E8=A1=A8?= =?UTF-8?q?=E6=B7=BB=E5=8A=A0=E5=AD=97=E6=AE=B5=E7=A6=BB=E5=AD=90=E4=B8=B0?= =?UTF-8?q?=E5=BA=A6=E6=AF=94=E6=9C=80=E5=A4=A7=E5=85=81=E8=AE=B8=E7=9B=B8?= =?UTF-8?q?=E5=AF=B9=E5=81=8F=E5=B7=AE=202.=E6=A0=B9=E6=8D=AE=E5=A7=94?= =?UTF-8?q?=E6=89=98=E7=B1=BB=E5=9E=8B=E6=8B=86=E5=88=86=E8=AE=A1=E7=AE=97?= =?UTF-8?q?=E6=96=B9=E6=B3=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../entity/TestRecordSampleDataExpand.java | 5 + ...TestRecordSampledataExpandServiceImpl.java | 106 +++++++++++------- .../vo/TestRecordSampleDataExpandVO.java | 10 ++ .../TestRecordSampleDataExpandMapper.xml | 3 + 4 files changed, 83 insertions(+), 41 deletions(-) diff --git a/dlp-drugtesting-biz/src/main/java/digital/laboratory/platform/inspection/entity/TestRecordSampleDataExpand.java b/dlp-drugtesting-biz/src/main/java/digital/laboratory/platform/inspection/entity/TestRecordSampleDataExpand.java index 00a15e8..dccbe9d 100644 --- a/dlp-drugtesting-biz/src/main/java/digital/laboratory/platform/inspection/entity/TestRecordSampleDataExpand.java +++ b/dlp-drugtesting-biz/src/main/java/digital/laboratory/platform/inspection/entity/TestRecordSampleDataExpand.java @@ -65,4 +65,9 @@ public class TestRecordSampleDataExpand extends BaseEntity { * 定性离子对,生物案件使用 */ private String qualitativeIonPair; + + /** + * 离子丰度比最大允许相对偏差, 存入的是数值,但是默认是正负符合,如10,实际上指的是+10或-10 + */ + private BigDecimal maxAllowedIonRatioDeviation; } 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 9662b6d..fda04f1 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 @@ -26,6 +26,7 @@ import org.springframework.stereotype.Service; import javax.annotation.Resource; import java.math.BigDecimal; +import java.math.RoundingMode; import java.util.*; import java.util.stream.Collectors; @@ -85,19 +86,17 @@ public class TestRecordSampledataExpandServiceImpl extends ServiceImpl npsTestSampleDataList = npsCaseTestDataDto.getTestSampleDataList(); - List testRecordSampleDataExpandList = npsTestSampleDataList.stream().map(item -> { - return createTestRecordSampleDataExpand( - testDataId, - item.getIsBasePeak() == 1 ? Boolean.TRUE : Boolean.FALSE, - item.getArea(), - item.getAbundanceRatio(), - item.getAbundanceRatioError(), - item.getWithinError(), - item.getRetTime(), - item.getMass(), - null, null - ); - }).collect(Collectors.toList()); + List testRecordSampleDataExpandList = npsTestSampleDataList.stream().map(item -> createTestRecordSampleDataExpand( + testDataId, + item.getIsBasePeak() == 1 ? Boolean.TRUE : Boolean.FALSE, + item.getArea(), + item.getAbundanceRatio(), + item.getAbundanceRatioError(), + item.getWithinError(), + item.getRetTime(), + item.getMass(), + null, null + )).collect(Collectors.toList()); return testRecordSampleDataExpandList; } @@ -182,8 +181,13 @@ public class TestRecordSampledataExpandServiceImpl extends ServiceImpl finalStdDataExpandList = stdDataExpandList; testRecordSampleData.setIsDetected(1); // 默认检出 + boolean isNPSCase = testRecord.getBusinessType().equals(BusinessType.NPS_CASE.getBusinessType()); // 是否是常规毒品案件 value.forEach(sampleDataExpand -> { - calculateIonAbundanceRatio(basePeakData, testRecord, finalStdDataExpandList, sampleDataExpand); + if (isNPSCase) { + calculateIonAbundanceRatioNormal(finalStdDataExpandList, sampleDataExpand); + } else { + calculateIonAbundanceRatioBiology(basePeakData, finalStdDataExpandList, sampleDataExpand); + } if ( !isSTDSample && testRecordSampleData.getIsDetected().equals(1) && @@ -253,47 +257,67 @@ public class TestRecordSampledataExpandServiceImpl extends ServiceImpl finalStdDataExpandList, TestRecordSampleDataExpand sampleDataExpand) { + private void calculateIonAbundanceRatioBiology(TestRecordSampleDataExpand basePeakData, List finalStdDataExpandList, TestRecordSampleDataExpand sampleDataExpand) { if (sampleDataExpand.getPeakArea() != null && basePeakData.getPeakArea() != null) { - sampleDataExpand.setIonAbundanceRatio(sampleDataExpand.getPeakArea().divide(basePeakData.getPeakArea(), 5, BigDecimal.ROUND_HALF_UP).multiply(BigDecimal.valueOf(100))); + sampleDataExpand.setIonAbundanceRatio(sampleDataExpand.getPeakArea().divide(basePeakData.getPeakArea(), 5, RoundingMode.HALF_UP).multiply(BigDecimal.valueOf(100))); if (CollUtil.isNotEmpty(finalStdDataExpandList)) { finalStdDataExpandList.forEach(stdDataExpand -> { - boolean matched = false; // 匹配对应的标准物质数据 - boolean isNPSCase = testRecord.getBusinessType().equals(BusinessType.NPS_CASE.getBusinessType()); // 是否是常规毒品案件 - if (isNPSCase) { - matched = stdDataExpand.getMassToChargeRatio().equals(sampleDataExpand.getMassToChargeRatio()); + if (stdDataExpand.getQualitativeIonPair().equals(sampleDataExpand.getQualitativeIonPair())) { + BigDecimal ionAbundanceRatioError = sampleDataExpand.getIonAbundanceRatio() + .subtract(stdDataExpand.getIonAbundanceRatio()) + .divide(stdDataExpand.getIonAbundanceRatio(), 5, RoundingMode.HALF_UP) + .multiply(BigDecimal.valueOf(100)); + sampleDataExpand.setIonAbundanceRatioError(ionAbundanceRatioError); + sampleDataExpand.setMaxAllowedIonRatioDeviation( + BigDecimal.valueOf( + processInspectDataService.getHairCaseIonAbundanceRatioWithinErrorRange(stdDataExpand.getIonAbundanceRatio().doubleValue()) + ) + ); + sampleDataExpand.setIonAbundanceRatioWithinError( + processInspectDataService.calculateHairCaseIonAbundanceRatioWithinError( + ionAbundanceRatioError.doubleValue(), + sampleDataExpand.getMaxAllowedIonRatioDeviation().doubleValue() + ) + ); } else { - matched = stdDataExpand.getQualitativeIonPair().equals(sampleDataExpand.getQualitativeIonPair()); + log.warn("没有找到匹配的标准物质检验数据!"); } - if (matched) { + }); + } + } + } + + /** + * 计算离子丰度比 (常规毒品) + * + * @param finalStdDataExpandList 最终标准数据扩展列表 + * @param sampleDataExpand 样本数据扩展 + */ + private void calculateIonAbundanceRatioNormal(List finalStdDataExpandList, TestRecordSampleDataExpand sampleDataExpand) { + // 常规毒品的不需要去填写峰面积,直接填丰度比的值 + if ( sampleDataExpand.getIonAbundanceRatio() != null) { + if (CollUtil.isNotEmpty(finalStdDataExpandList)) { + finalStdDataExpandList.forEach(stdDataExpand -> { + if (stdDataExpand.getMassToChargeRatio().equals(sampleDataExpand.getMassToChargeRatio())) { BigDecimal ionAbundanceRatioError = sampleDataExpand.getIonAbundanceRatio() .subtract(stdDataExpand.getIonAbundanceRatio()) - .divide(stdDataExpand.getIonAbundanceRatio(), 5, BigDecimal.ROUND_HALF_UP) + .divide(stdDataExpand.getIonAbundanceRatio(), 5, RoundingMode.HALF_UP) .multiply(BigDecimal.valueOf(100)); sampleDataExpand.setIonAbundanceRatioError(ionAbundanceRatioError); - if (isNPSCase) { - // 取绝对值的原因是简化逻辑,不然需要判断正负值的范围 - sampleDataExpand.setIonAbundanceRatioWithinError( - processInspectDataService.getWithinErrorText( - ionAbundanceRatioError.abs(), - processInspectDataService.getErrorRange(stdDataExpand.getIonAbundanceRatio()) - ) - ); - } else { - sampleDataExpand.setIonAbundanceRatioWithinError( - processInspectDataService.calculateHairCaseIonAbundanceRatioWithinError( - ionAbundanceRatioError.doubleValue(), - stdDataExpand.getIonAbundanceRatio().doubleValue() - ) - ); - } + sampleDataExpand.setMaxAllowedIonRatioDeviation(processInspectDataService.getErrorRange(stdDataExpand.getIonAbundanceRatio())); + // 取绝对值的原因是简化逻辑,不然需要判断正负值的范围 + sampleDataExpand.setIonAbundanceRatioWithinError( + processInspectDataService.getWithinErrorText( + ionAbundanceRatioError.abs(), + sampleDataExpand.getMaxAllowedIonRatioDeviation() + ) + ); } else { log.warn("没有找到匹配的标准物质检验数据!"); } diff --git a/dlp-drugtesting-biz/src/main/java/digital/laboratory/platform/inspection/vo/TestRecordSampleDataExpandVO.java b/dlp-drugtesting-biz/src/main/java/digital/laboratory/platform/inspection/vo/TestRecordSampleDataExpandVO.java index d3fdf93..7e5007e 100644 --- a/dlp-drugtesting-biz/src/main/java/digital/laboratory/platform/inspection/vo/TestRecordSampleDataExpandVO.java +++ b/dlp-drugtesting-biz/src/main/java/digital/laboratory/platform/inspection/vo/TestRecordSampleDataExpandVO.java @@ -49,6 +49,9 @@ public class TestRecordSampleDataExpandVO { @ApiModelProperty(value = "定性离子对,生物案件使用", example = "C6H12O6") private String qualitativeIonPair; + @ApiModelProperty(value = "离子丰度比最大允许相对偏差, 存入的是数值,但是默认是正负符合,如10,实际上指的是+10或-10") + private BigDecimal maxAllowedIonRatioDeviation; + /************************ 处理需要特定格式返回的字段 **************************/ public String getIonAbundanceRatio() { @@ -71,5 +74,12 @@ public class TestRecordSampleDataExpandVO { } return ionAbundanceRatioWithinError; } + + public String getMaxAllowedIonRatioDeviation() { + if (getBasePeak()) { + return TestRecordSampleDataConstant.INVALID_VALUE_STR; + } + return "±" + maxAllowedIonRatioDeviation; + } } diff --git a/dlp-drugtesting-biz/src/main/resources/mapper/TestRecordSampleDataExpandMapper.xml b/dlp-drugtesting-biz/src/main/resources/mapper/TestRecordSampleDataExpandMapper.xml index 483e220..9df4d0a 100644 --- a/dlp-drugtesting-biz/src/main/resources/mapper/TestRecordSampleDataExpandMapper.xml +++ b/dlp-drugtesting-biz/src/main/resources/mapper/TestRecordSampleDataExpandMapper.xml @@ -15,6 +15,7 @@ + @@ -32,6 +33,7 @@ + @@ -45,6 +47,7 @@ exp.ion_abundance_ratio_within_error, exp.mass_to_charge_ratio, exp.qualitative_ion_pair, + exp.max_allowed_ion_ratio_deviation, exp.create_by, exp.create_time, exp.update_by,