From 73b049dc2d8407d725e0fe3f062d71dbebcf806d Mon Sep 17 00:00:00 2001 From: chen <2710907404@qq.com> Date: Tue, 25 Mar 2025 09:11:33 +0800 Subject: [PATCH] =?UTF-8?q?20250325=20=E6=9B=B4=E6=96=B0?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../inspection/DlpDrugTestingApplication.java | 4 + .../TestRecordSampleDataController.java | 25 +- .../entity/TestRecordSampleData.java | 75 ++---- .../service/TestRecordSampleDataService.java | 8 +- .../impl/TestRecordSampleDataServiceImpl.java | 235 ++++++++++-------- 5 files changed, 161 insertions(+), 186 deletions(-) diff --git a/dlp-drugtesting-biz/src/main/java/digital/laboratory/platform/inspection/DlpDrugTestingApplication.java b/dlp-drugtesting-biz/src/main/java/digital/laboratory/platform/inspection/DlpDrugTestingApplication.java index fc7b48f..31492dc 100644 --- a/dlp-drugtesting-biz/src/main/java/digital/laboratory/platform/inspection/DlpDrugTestingApplication.java +++ b/dlp-drugtesting-biz/src/main/java/digital/laboratory/platform/inspection/DlpDrugTestingApplication.java @@ -6,9 +6,13 @@ import digital.laboratory.platform.common.swagger.annotation.EnableDLPSwagger2; import org.springframework.boot.SpringApplication; import org.springframework.boot.autoconfigure.SpringBootApplication; import org.springframework.cloud.client.discovery.EnableDiscoveryClient; +import org.springframework.context.ApplicationContext; +import org.springframework.context.ConfigurableApplicationContext; import org.springframework.context.annotation.Configuration; import org.springframework.scheduling.annotation.EnableAsync; +import java.util.Arrays; + @Configuration @EnableDLPSwagger2 @EnableDLPFeignClients diff --git a/dlp-drugtesting-biz/src/main/java/digital/laboratory/platform/inspection/controller/TestRecordSampleDataController.java b/dlp-drugtesting-biz/src/main/java/digital/laboratory/platform/inspection/controller/TestRecordSampleDataController.java index dc93d35..4a1384a 100644 --- a/dlp-drugtesting-biz/src/main/java/digital/laboratory/platform/inspection/controller/TestRecordSampleDataController.java +++ b/dlp-drugtesting-biz/src/main/java/digital/laboratory/platform/inspection/controller/TestRecordSampleDataController.java @@ -31,8 +31,10 @@ import javax.annotation.Resource; import javax.servlet.http.HttpServletRequest; import javax.validation.Valid; import java.security.Principal; +import java.util.Collections; import java.util.List; import java.util.Map; +import java.util.stream.Collectors; /** * @author xy @@ -142,24 +144,18 @@ public class TestRecordSampleDataController { @PutMapping("/updateEntrustTestData") @ApiOperation(value = "修改导入的实验数据", notes = "修改导入的实验数据") - private R updateEntrustTestData(@RequestBody UpdateEntrustTestDataDTO dto) { + public R> updateEntrustTestData(@RequestBody UpdateEntrustTestDataDTO dto) { try { testRecordSampleDataService.validateTestStatus(dto.getTestId()); List list = dto.getList(); if (CollUtil.isNotEmpty(list)) { - for (UpdateEntrustTestDataDTO updateEntrustTestDataDTO : list) { - testRecordSampleDataService.updateEntrustTestData(updateEntrustTestDataDTO); - } - return R.ok("实验数据保存成功"); + return R.ok(list.stream().map(testRecordSampleDataService::updateEntrustTestData).collect(Collectors.toList()),"实验数据保存成功"); } else { - return R.ok(testRecordSampleDataService.updateEntrustTestData(dto)); + return R.ok(Collections.singletonList(testRecordSampleDataService.updateEntrustTestData(dto))); } } catch (Exception e) { e.printStackTrace(); - if (e instanceof RuntimeException) { - return R.failed("实验数据保存失败!" + e.getMessage()); - } - return R.failed("实验数据保存失败!"); + return R.failed("实验数据保存失败!" + e.getMessage()); } } @@ -298,13 +294,4 @@ public class TestRecordSampleDataController { return R.ok("更新成功!"); } - @PutMapping("/updateData") - public R updateData(@RequestBody TestRecordSampleData data) { - - TestRecordSampleData sampleData = testRecordSampleDataService.updateData(data); - - return sampleData != null ? R.ok(sampleData, "修改成功!") : R.failed("修改失败!"); - - } - } diff --git a/dlp-drugtesting-biz/src/main/java/digital/laboratory/platform/inspection/entity/TestRecordSampleData.java b/dlp-drugtesting-biz/src/main/java/digital/laboratory/platform/inspection/entity/TestRecordSampleData.java index 331a102..8c76281 100644 --- a/dlp-drugtesting-biz/src/main/java/digital/laboratory/platform/inspection/entity/TestRecordSampleData.java +++ b/dlp-drugtesting-biz/src/main/java/digital/laboratory/platform/inspection/entity/TestRecordSampleData.java @@ -5,6 +5,7 @@ import com.baomidou.mybatisplus.annotation.TableId; import com.baomidou.mybatisplus.annotation.TableName; import digital.laboratory.platform.common.mybatis.base.BaseEntity; import io.swagger.annotations.ApiModel; +import io.swagger.annotations.ApiModelProperty; import lombok.Data; /** @@ -15,95 +16,57 @@ import lombok.Data; @TableName(value ="b_test_record_sampledata", autoResultMap = true) @ApiModel(value = "实验中样本检测结果数据", description = "实验中样本检测结果数据") public class TestRecordSampleData extends BaseEntity { - /** - * 主键标识 - */ + + @ApiModelProperty(value = "主键标识", example = "123456789") @TableId(value = "ID", type = IdType.ASSIGN_ID) private String id; - /** - * 数据从机器中导出的唯一标识 - */ + @ApiModelProperty(value = "数据从机器中导出的唯一标识", example = "Sample123") private String name; - /** - * 样本编号 - */ + @ApiModelProperty(value = "样本编号", example = "SMP001") private String sampleNo; - /** - * 实验ID - */ + @ApiModelProperty(value = "实验ID", example = "TEST001") private String testId; - /** - * 标准品浓度 - */ + @ApiModelProperty(value = "标准品浓度", example = "10.5") private String stdConcentration; - /** - * 样品浓度 - */ + @ApiModelProperty(value = "样品浓度", example = "8.9") private String sampleConcentration; - /** - * 化合物名称 - */ + @ApiModelProperty(value = "化合物名称", example = "Heroin") private String compoundName; - /** - * 保留时间是否在误差范围内,缴获物(-1~1), 生物样本(-2.5~2.5) - */ + @ApiModelProperty(value = "保留时间是否在误差范围内,缴获物(-1~1), 生物样本(-2.5~2.5)", example = "0.5") private String rtTimeWithinError; - /** - * 保留时间相对误差(%) - */ + @ApiModelProperty(value = "保留时间相对误差(%)", example = "1.2") private Double rtTimeError; - /** - * 检材保留时间(min) - */ + @ApiModelProperty(value = "检材保留时间(min)", example = "2.5") private Double targetRtTime; - /** - * 标准品保留时间(min) - */ + @ApiModelProperty(value = "标准品保留时间(min)", example = "2.6") private Double stdRtTime; - /** - * 是否检出该物质 1检出 0 未检出 - */ + @ApiModelProperty(value = "是否检出该物质 1 检出, 0 未检出", example = "1") private Integer isDetected; - /** - * 样本类型- QC(质控) STD(标准品) Analyte(待测样品) - */ + @ApiModelProperty(value = "样本类型 - QC(质控), STD(标准品), Analyte(待测样品)", example = "QC") private String sampleType; - /** - * 检验数据json - */ + @ApiModelProperty(value = "检验数据 JSON", example = "{\"mass\": 146, \"intensity\": 200}") private String dataJson; - /** - * 检验结果数据json - */ + @ApiModelProperty(value = "检验结果数据 JSON", example = "{\"result\": \"Positive\"}") private String dataResultJson; - /** - * 状态: - * 0 待审核, - * 1 已审核, - * 2 已审批, - * 3 已上传 - * 上传到大数据平台(仅针对任务数据, 其他业务类型的数据默认0) - */ + @ApiModelProperty(value = "状态:0-待审核, 1-已审核, 2-已审批, 3-已上传", example = "1") private Integer status; - /** - * 检测的化合物的中文名字 - */ + @ApiModelProperty(value = "检测的化合物的中文名字", example = "海洛因") private String compoundCnName; public TestRecordSampleData() { diff --git a/dlp-drugtesting-biz/src/main/java/digital/laboratory/platform/inspection/service/TestRecordSampleDataService.java b/dlp-drugtesting-biz/src/main/java/digital/laboratory/platform/inspection/service/TestRecordSampleDataService.java index 317ead2..86795bb 100644 --- a/dlp-drugtesting-biz/src/main/java/digital/laboratory/platform/inspection/service/TestRecordSampleDataService.java +++ b/dlp-drugtesting-biz/src/main/java/digital/laboratory/platform/inspection/service/TestRecordSampleDataService.java @@ -1,7 +1,6 @@ package digital.laboratory.platform.inspection.service; import com.alibaba.fastjson.JSONArray; -import com.alibaba.fastjson.JSONObject; import com.baomidou.mybatisplus.core.metadata.IPage; import com.baomidou.mybatisplus.extension.plugins.pagination.Page; import com.baomidou.mybatisplus.extension.service.IService; @@ -97,7 +96,7 @@ public interface TestRecordSampleDataService extends IService getStdSampleTestDataByTestId(String testId); } 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 cf081b7..a9f743b 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 @@ -59,6 +59,7 @@ import java.text.DecimalFormat; import java.time.LocalDate; import java.time.LocalDateTime; import java.util.*; +import java.util.concurrent.CompletableFuture; import java.util.concurrent.atomic.AtomicBoolean; import java.util.concurrent.atomic.AtomicReference; import java.util.function.Function; @@ -202,18 +203,18 @@ public class TestRecordSampleDataServiceImpl extends ServiceImpl retList = new ArrayList<>(); - if (estBusinessInfoVO.getBusinessType().equals(BusinessType.BOINT_CASE.getBusinessType())) { - extractedSampleTestData(testRecordSampleDataList, retList, HairSewageDataDto.class); - } else if (estBusinessInfoVO.getBusinessType().equals(BusinessType.NPS_CASE.getBusinessType()) || estBusinessInfoVO.getBusinessType().equals(BusinessType.SCREENING_EVENT.getBusinessType())) { - extractedSampleTestData(testRecordSampleDataList, retList, NPSCaseTestDataDto.class); - } else { - extractedSampleTestData(testRecordSampleDataList, retList, HairSewageDataDto.class); - } -// List collect = TypeCasting(retList); - return typeCasting(retList); +// ESTBusinessInfoVO estBusinessInfoVO = estBusinessInfoVOS.get(0); +// // 封装的结果集 +// List retList = new ArrayList<>(); +// if (estBusinessInfoVO.getBusinessType().equals(BusinessType.BOINT_CASE.getBusinessType())) { +// extractedSampleTestData(testRecordSampleDataList, retList, HairSewageDataDto.class); +// } else if (estBusinessInfoVO.getBusinessType().equals(BusinessType.NPS_CASE.getBusinessType()) || estBusinessInfoVO.getBusinessType().equals(BusinessType.SCREENING_EVENT.getBusinessType())) { +// extractedSampleTestData(testRecordSampleDataList, retList, NPSCaseTestDataDto.class); +// } else { +// extractedSampleTestData(testRecordSampleDataList, retList, HairSewageDataDto.class); +// } +//// List collect = TypeCasting(retList); + return testRecordSampleDataList; } /** @@ -248,21 +249,21 @@ public class TestRecordSampleDataServiceImpl extends ServiceImpl list = this.list(Wrappers.lambdaQuery() .eq(TestRecordSampleData::getTestId, testId) .last("ORDER BY SUBSTRING_INDEX(name, '-', -1) + 0")); - List retList = new ArrayList<>(); - switch (BusinessType.getBusinessTypeByType(type)) { - case SCREENING_EVENT: - case NPS_CASE: - // NPS的数据分析 - extractedSampleTestData(list, retList, NPSCaseTestDataDto.class); - break; - case BOINT_CASE: - extractedSampleTestData(list, retList, HairSewageDataDto.class); - break; - } +// List retList = new ArrayList<>(); +// switch (BusinessType.getBusinessTypeByType(type)) { +// case SCREENING_EVENT: +// case NPS_CASE: +// // NPS的数据分析 +// extractedSampleTestData(list, retList, NPSCaseTestDataDto.class); +// break; +// case BOINT_CASE: +// extractedSampleTestData(list, retList, HairSewageDataDto.class); +// break; +// } // z最后转换类型 // TypeCasting(retList); - return typeCasting(retList); + return list; } /** @@ -422,7 +423,7 @@ public class TestRecordSampleDataServiceImpl extends ServiceImpllambdaUpdate() - .eq(TestRecordSampleData::getId, oldInfo.getId()) - .set(!oldInfo.getCompoundName().equals(compoundName), TestRecordSampleData::getCompoundName, compoundName) - .set(sampleName != null && !sampleName.equals(oldInfo.getName()), TestRecordSampleData::getName, sampleName) - .set(TestRecordSampleData::getDataResultJson, jsonStr) - .set(StringUtils.isNotBlank(compoundCnName), TestRecordSampleData::getCompoundCnName, compoundCnName)); - } else { - TestRecordSampleData testRecordSampleData = new TestRecordSampleData(); - testRecordSampleData.setId(IdWorker.get32UUID()); - testRecordSampleData.setSampleNo(sampleNo); - testRecordSampleData.setCompoundName(compoundName); - testRecordSampleData.setTestId(testId); - testRecordSampleData.setDataResultJson(jsonStr); - if (sampleNo.startsWith(StdSolutionNum.QC_SOLUTION.getPrefix())) { - testRecordSampleData.setSampleType(TestRecordSampleDataConstant.SAMPLE_TYPE_QC); - } else if (sampleNo.startsWith(StdSolutionNum.MIXED_SOLUTION.getPrefix()) || sampleNo.startsWith(StdSolutionNum.SIMPLE_SOLUTION.getPrefix())) { - testRecordSampleData.setSampleType(TestRecordSampleDataConstant.SAMPLE_TYPE_STD); - } else { - testRecordSampleData.setSampleType(TestRecordSampleDataConstant.SAMPLE_TYPE_ANALYTE); - } - return this.save(testRecordSampleData); - } - } - /** * 毛发案件检验数据持久化到数据库 * @@ -1651,15 +1615,15 @@ public class TestRecordSampleDataServiceImpl extends ServiceImpl sampleDataList = new ArrayList<>(); - TestRecordSampleData stdSampleData = createSampleData(compoundName, TestRecordSampleDataConstant.SAMPLE_TYPE_STD, TestRecordSampleDataConstant.SAMPLE_TYPE_STD + "-" + compoundName); + TestRecordSampleData stdSampleData = createSampleData(compoundName, TestRecordSampleDataConstant.SAMPLE_TYPE_STD, TestRecordSampleDataConstant.SAMPLE_TYPE_STD + "-" + compoundName, testId); sampleDataList.add(stdSampleData); sampleInfos.forEach(item -> { - TestRecordSampleData sampleData = createSampleData(compoundName, TestRecordSampleDataConstant.SAMPLE_TYPE_ANALYTE, item.getAcceptNo()); + TestRecordSampleData sampleData = createSampleData(compoundName, TestRecordSampleDataConstant.SAMPLE_TYPE_ANALYTE, item.getAcceptNo(), testId); sampleDataList.add(sampleData); }); - if (drug != null && StrUtil.isAllNotBlank(drug.getMainProductIon(), drug.getMinorProductIon(), drug.getCharacteristicIons())) { + if (drug != null && StrUtil.isNotBlank(drug.getCharacteristicIons())) { // 当对应的毒品信息不为空,添加扩展数据 List testRecordSampleDataExpandList = sampleDataList.stream().flatMap(sampleData -> { List testRecordSampleDataExpand = testRecordSampledataExpandService.saveExpDataByBusinessType(sampleData.getId(), drug, testRecord.getBusinessType()); @@ -1676,15 +1640,17 @@ public class TestRecordSampleDataServiceImpl extends ServiceImpl removeIds = removeDataList.stream().map(TestRecordSampleData::getId).collect(Collectors.toList()); - // 根据测试记录ID和化合物名称删除对应的测试记录样本数据 - testRecordSampledataExpandService.remove(Wrappers.lambdaQuery().in(TestRecordSampleDataExpand::getTestDataId, removeIds)); + if (CollUtil.isNotEmpty(removeIds)) { + // 根据测试记录ID和化合物名称删除对应的测试记录样本数据 + testRecordSampledataExpandService.remove(Wrappers.lambdaQuery().in(TestRecordSampleDataExpand::getTestDataId, removeIds)); + } return this.removeBatchByIds(removeIds); } - @Override - public TestRecordSampleData updateData(TestRecordSampleData data) { - if (this.getById(data.getId()) == null) { - throw new RuntimeException("数据不存在"); - } - String compoundName = data.getCompoundName(); + /** + * 更新计算数据,计算保留时间和保留时间误差 + * @param dataId 检验数据id + * @return + */ + public Boolean calculateInspectData(String dataId) { + TestRecordSampleData testRecordSampleData = super.getById(dataId); + String compoundName = testRecordSampleData.getCompoundName(); TestRecordSampleData std = this.getOne(Wrappers.lambdaQuery() .eq(TestRecordSampleData::getCompoundName, compoundName) - .eq(TestRecordSampleData::getTestId, data.getTestId()) + .eq(TestRecordSampleData::getTestId, testRecordSampleData.getTestId()) .eq(TestRecordSampleData::getSampleType, "STD")); - if ( data.getTargetRtTime() != null && std.getTargetRtTime() != null ) { - TestRecord testRecord = testRecordService.getById(data.getTestId()); + if ( testRecordSampleData.getTargetRtTime() != null && std.getTargetRtTime() != null ) { + TestRecord testRecord = testRecordService.getById(testRecordSampleData.getTestId()); if (testRecord.getBusinessType().equals(BusinessType.BOINT_CASE.getBusinessType())) { - data.setRtTimeError(processInspectDataService.getHairCaseRtTimeError(data.getTargetRtTime(), std.getStdRtTime())); - data.setRtTimeWithinError( + testRecordSampleData.setRtTimeError(processInspectDataService.getHairCaseRtTimeError(testRecordSampleData.getTargetRtTime(), std.getStdRtTime())); + testRecordSampleData.setRtTimeWithinError( processInspectDataService.setHairCaseRtTimeWithinError( - data.getRtTimeError() + testRecordSampleData.getRtTimeError() ) ); } else { - data.setRtTimeError(processInspectDataService.getHairCaseRtTimeError(data.getTargetRtTime(), std.getStdRtTime())); - data.setRtTimeWithinError( + testRecordSampleData.setRtTimeError(processInspectDataService.getHairCaseRtTimeError(testRecordSampleData.getTargetRtTime(), std.getStdRtTime())); + testRecordSampleData.setRtTimeWithinError( processInspectDataService.getRtWithinErrorText( - Math.abs(data.getRtTimeError()), + Math.abs(testRecordSampleData.getRtTimeError()), 1 ) ); } - System.out.println("所有属性都不为 null"); } - return this.updateById(data) ? data : null; + return this.updateById(testRecordSampleData); } @Override @@ -1762,4 +1731,62 @@ public class TestRecordSampleDataServiceImpl extends ServiceImpllambdaUpdate() + .eq(TestRecordSampleData::getId, oldInfo.getId()) + .set(!oldInfo.getCompoundName().equals(compoundName), TestRecordSampleData::getCompoundName, compoundName) + .set(sampleName != null && !sampleName.equals(oldInfo.getName()), TestRecordSampleData::getName, sampleName) + .set(TestRecordSampleData::getTargetRtTime, targetRtTime) + .set(TestRecordSampleData::getRtTimeError, rtTimeError) + .set(TestRecordSampleData::getSampleConcentration, targetConcentration) +// .set(TestRecordSampleData::getDataResultJson, jsonStr) // 现在数据提取到了表字段,不在处理json数据 + .set(StringUtils.isNotBlank(compoundCnName), TestRecordSampleData::getCompoundCnName, compoundCnName)); + } else { + oldInfo = new TestRecordSampleData(); + oldInfo.setId(IdWorker.get32UUID()); + oldInfo.setSampleNo(sampleNo); + oldInfo.setCompoundName(compoundName); + oldInfo.setSampleConcentration(targetConcentration); + oldInfo.setRtTimeError(rtTimeError); + oldInfo.setTargetRtTime(targetRtTime); + oldInfo.setTestId(testId); +// oldInfo.setDataResultJson(jsonStr); // 现在数据提取到了表字段,不在处理json数据 + if (sampleNo.startsWith(StdSolutionNum.QC_SOLUTION.getPrefix())) { + oldInfo.setSampleType(TestRecordSampleDataConstant.SAMPLE_TYPE_QC); + } else if (sampleNo.startsWith(StdSolutionNum.MIXED_SOLUTION.getPrefix()) || sampleNo.startsWith(StdSolutionNum.SIMPLE_SOLUTION.getPrefix())) { + oldInfo.setSampleType(TestRecordSampleDataConstant.SAMPLE_TYPE_STD); + } else { + oldInfo.setSampleType(TestRecordSampleDataConstant.SAMPLE_TYPE_ANALYTE); + } + + success = this.save(oldInfo); + } + if (success) { + String dataId = oldInfo.getId(); + CompletableFuture.runAsync(() -> calculateInspectData(dataId)); + return super.getById(dataId); + } + return null; + } }