20250401 更新

1.普通检材定性记录非红外报告推送
master
陈江保 3 weeks ago
parent 0889cd9f42
commit 48c6d0ed39
  1. 28
      dlp-drugtesting-biz/src/main/java/digital/laboratory/platform/inspection/config/ApiPathProperties.java
  2. 2
      dlp-drugtesting-biz/src/main/java/digital/laboratory/platform/inspection/event/PushDataToLabsCareEvent.java
  3. 7
      dlp-drugtesting-biz/src/main/java/digital/laboratory/platform/inspection/listener/PushDataToLabsCareEventListener.java
  4. 6
      dlp-drugtesting-biz/src/main/java/digital/laboratory/platform/inspection/service/PushDataToLabsCareService.java
  5. 268
      dlp-drugtesting-biz/src/main/java/digital/laboratory/platform/inspection/service/impl/PushDataToLabsCareServiceImpl.java
  6. 2
      dlp-drugtesting-biz/src/main/resources/bootstrap.yml

@ -29,6 +29,18 @@ public class ApiPathProperties {
*/
private String biologyQualitativeRecord;
/**
* 普通检材定性记录非红外报告
*/
private String nonInfraredGeneralQualitativeRecord;
/**
* 普通检材定性记录红外报告
*/
private String infraredGeneralQualitativeRecord;
/************************************ Getter Setter 方法 ***********************************/
/******************************** Getter 方法会拼接上host返回 ***************************/
public String getHost() {
return host;
}
@ -60,4 +72,20 @@ public class ApiPathProperties {
public void setBiologyQualitativeRecord(String biologyQualitativeRecord) {
this.biologyQualitativeRecord = biologyQualitativeRecord;
}
public String getNonInfraredGeneralQualitativeRecord() {
return host + nonInfraredGeneralQualitativeRecord;
}
public void setNonInfraredGeneralQualitativeRecord(String nonInfraredGeneralQualitativeRecord) {
this.nonInfraredGeneralQualitativeRecord = nonInfraredGeneralQualitativeRecord;
}
public String getInfraredGeneralQualitativeRecord() {
return host + infraredGeneralQualitativeRecord;
}
public void setInfraredGeneralQualitativeRecord(String infraredGeneralQualitativeRecord) {
this.infraredGeneralQualitativeRecord = infraredGeneralQualitativeRecord;
}
}

@ -17,7 +17,7 @@ public class PushDataToLabsCareEvent extends ApplicationEvent {
private final String testId;
/**
* 推送的数据类型 1 鉴定委托书数据 | 2 鉴定事项确认书数据 | 3 生物检材定性记录报告数据
* 推送的数据类型 1 鉴定委托书数据 | 2 鉴定事项确认书数据 | 3 生物检材定性记录报告数据 | 4 普通检材定性记录非红外报告数据
*/
private final Integer pushType;

@ -38,6 +38,13 @@ public class PushDataToLabsCareEventListener implements ApplicationListener<Push
log.error("实验id为 {} 的生物定性检验记录数据推送失败!", event.getTestId(), e);
}
break;
case 4: // 推送委托书数据
try {
pushDataToLabsCareService.pushNonInfraredGeneralQualitativeRecordData(event.getTestId());
} catch (Exception e) {
log.error("实验id为 {} 的普通检材定性记录非红外报告数据推送失败!", event.getTestId(), e);
}
break;
default:
log.warn("未知的推送类型: {}", event.getPushType());
break;

@ -8,6 +8,12 @@ package digital.laboratory.platform.inspection.service;
*/
public interface PushDataToLabsCareService {
/**
* 推送普通检材定性记录非红外报告数据
* @param testId 实验id
*/
void pushNonInfraredGeneralQualitativeRecordData(String testId);
/**
* 推送生物检材定性记录
* @param testId 实验id

@ -12,6 +12,8 @@ import digital.laboratory.platform.inspection.entity.TestRecordInstrument;
import digital.laboratory.platform.inspection.entity.TestRecordMethod;
import digital.laboratory.platform.inspection.entity.TestRecordReagent;
import digital.laboratory.platform.inspection.entity.TestRecordSampleData;
import digital.laboratory.platform.inspection.enums.BusinessType;
import digital.laboratory.platform.inspection.event.PushDataToLabsCareEvent;
import digital.laboratory.platform.inspection.mapper.TestRecordSampleDataMapper;
import digital.laboratory.platform.inspection.service.*;
import digital.laboratory.platform.inspection.vo.TestRecordReagentVO;
@ -84,14 +86,19 @@ public class PushDataToLabsCareServiceImpl implements PushDataToLabsCareService
// "#NULL#" 作为空数据的占位符, 对于系统中没有的信息以占位符代替
public final static String NULL_PLACEHOLDER = "#NULL#";
// 生物检材定性检验记录标识
private final static String BIOLOGY_QUALITATIVE_RECORD = "BiologyQualitativeRecord";
// 普通检材定性记录非红外报告标识
private final static String NON_INFRARED_GENERAL_QUALITATIVE_RECORD = "nonInfraredGeneralQualitativeRecord";
/**
* 做一个定时推送对于推送失败的委托进行重新推送 每天凌晨1点推送
*/
// @Scheduled(cron = "30 * * * * ?") // 测试
@Scheduled(cron = "0 0 2 * * ?") // 每天凌晨 2 点执行
public void timingPushDataToLabsCare() {
log.info("定时推送数据到LabsCare......");
// 查询检验鉴定推送失败的委托
List<EntrustInfo> entrustList = entrustInfoService.list(
Wrappers.<EntrustInfo>lambdaQuery()
@ -120,14 +127,18 @@ public class PushDataToLabsCareServiceImpl implements PushDataToLabsCareService
EntrustInfo entrustInfo = entrustInfoMap.get(testRecord.getBusinessId());
String pushFlag = entrustInfo.getPushFlag();
if (StrUtil.isBlank(pushFlag)) {
if(testRecord.getBusinessType().equals(BusinessType.BOINT_CASE.getBusinessType())) {
pushBiologyQualitativeRecordData(testRecord.getId());
} else if (testRecord.getBusinessType().equals(BusinessType.NPS_CASE.getBusinessType())) {
pushNonInfraredGeneralQualitativeRecordData(testRecord.getId());
}
} else {
List<String> flagList = StrUtil.split(pushFlag, StrUtil.COMMA).stream().filter(str -> str.contains("false")).collect(Collectors.toList());
for (String flag : flagList) {
if (flag.contains(BIOLOGY_QUALITATIVE_RECORD)) {
pushBiologyQualitativeRecordData(testRecord.getId());
} else {
pushNonInfraredGeneralQualitativeRecordData(testRecord.getId());
}
}
}
@ -135,16 +146,59 @@ public class PushDataToLabsCareServiceImpl implements PushDataToLabsCareService
}
/**
* 推送生物检材定性记录
* 推送普通检材定性记录非红外报告数据
* @param testId 实验id
*/
@Override
public void pushBiologyQualitativeRecordData(String testId) {
public void pushNonInfraredGeneralQualitativeRecordData(String testId) {
TestRecord testRecord = validTestRecord(testId);
if (testRecord == null) return;
// 获取委托信息
EntrustInfo entrustInfo = entrustInfoService.getById(testRecord.getBusinessId());
JSONObject recordJsonPayload = buildNonInfraredGeneralQualitativeRecordJsonPayload(entrustInfo, testRecord);
String successFlag = NON_INFRARED_GENERAL_QUALITATIVE_RECORD + ":true";
String failureFlag = NON_INFRARED_GENERAL_QUALITATIVE_RECORD + ":false";
try {
ResponseEntity<String> response = exchangeRemoteApi(recordJsonPayload, apiPathProperties.getBiologyQualitativeRecord());
if (response.getStatusCode().is2xxSuccessful() && response.getBody().contains("\"status\":200")) {
updatePushFlag(entrustInfo, NON_INFRARED_GENERAL_QUALITATIVE_RECORD, successFlag);
log.info("推送普通检材定性记录非红外报告数据成功, 受理编号: {}, 响应: {}", entrustInfo.getAcceptNo(), response.getBody());
} else {
updatePushFlag(entrustInfo, NON_INFRARED_GENERAL_QUALITATIVE_RECORD, failureFlag);
log.warn("推送普通检材定性记录非红外报告数据失败, 受理编号: {}, 状态码: {}, 响应: {}",
entrustInfo.getAcceptNo(), response.getStatusCode(), response.getBody());
}
} catch (RestClientException e) {
log.error("推送普通检材定性记录非红外报告数据到 LabsCare 失败, 受理编号: {}", entrustInfo.getAcceptNo(), e);
}
}
/**
* 验证并获取有效的实验信息
*
* @param testId 测试记录的唯一标识符
* @return 如果存在有效的测试记录则返回该测试记录否则返回null
*/
private TestRecord validTestRecord(String testId) {
TestRecord testRecord = testRecordService.getById(testId);
if (testRecord == null) {
log.error("实验id为 [{}] 的实验信息查询为空!", testId);
return;
return null;
}
return testRecord;
}
/**
* 推送生物检材定性记录
* @param testId 实验id
*/
@Override
public void pushBiologyQualitativeRecordData(String testId) {
TestRecord testRecord = validTestRecord(testId);
if (testRecord == null) return;
// 获取委托信息
EntrustInfo entrustInfo = entrustInfoService.getById(testRecord.getBusinessId());
@ -168,6 +222,13 @@ public class PushDataToLabsCareServiceImpl implements PushDataToLabsCareService
}
}
/**
* 构建生物检材定性记录Json数据
*
* @param entrustInfo 委托信息
* @param testRecord 测试记录
* @return 构建好的Json对象
*/
private JSONObject buildBiologyQualitativeRecordJsonPayload(EntrustInfo entrustInfo, TestRecord testRecord) {
// 查询封装需要用到的数据
List<SampleInfo> sampleInfoList = sampleInfoService
@ -192,44 +253,15 @@ public class PushDataToLabsCareServiceImpl implements PushDataToLabsCareService
// 获取检测人用户信息
SysUser testUser = commonFeignService.remoteGetUserById(testRecord.getTestUserId());
// 检测数据信息
Map<String, List<TestRecordSampleDataVO>> testDataGroupBySampleNO = testRecordSampleDataMapper
.queryTestRecordSampleDataVOList(Wrappers.<TestRecordSampleData>lambdaQuery()
.eq(TestRecordSampleData::getTestId, testRecord.getId())
.eq(TestRecordSampleData::getSampleType, TestRecordSampleDataConstant.SAMPLE_TYPE_ANALYTE)
) // 数据库查询, 这个是非标准物质的检测数据
.stream().collect(Collectors.groupingBy(TestRecordSampleDataVO::getSampleNo)); // 根据查询出来的结果进行分组
// 获取样品检测数据,按照样品编号分组
Map<String, List<TestRecordSampleDataVO>> testDataGroupBySampleNO = fetchTestDataGroupBySampleNo(testRecord);
Map<String, TestRecordSampleDataVO> stdTestDataMap = testRecordSampleDataMapper
.queryTestRecordSampleDataVOList(Wrappers.<TestRecordSampleData>lambdaQuery()
.eq(TestRecordSampleData::getTestId, testRecord.getId())
.eq(TestRecordSampleData::getSampleType, TestRecordSampleDataConstant.SAMPLE_TYPE_STD)
) // 数据库查询, 这个是非标准物质的检测数据
.stream().collect(Collectors.toMap(TestRecordSampleDataVO::getCompoundName, Function.identity())); // 根据查询出来的结果进行分组
// 获取标准物质的测试数据
Map<String, TestRecordSampleDataVO> stdTestDataMap = fetchStdTestData(testRecord);
// 查询使用的仪器
List<String> deviceIdList = testRecord.getDeviceIdList();
List<TestRecordInstrument> instruments = CollectionUtils.isEmpty(deviceIdList)
? Collections.emptyList()
: testRecordInstrumentService.list(Wrappers.<TestRecordInstrument>lambdaQuery()
.in(TestRecordInstrument::getId, deviceIdList));
String useInstrumentNameStr = CollectionUtils.isEmpty(instruments)
? NULL_PLACEHOLDER
: instruments.stream()
.map(TestRecordInstrument::getInstrumentName)
.collect(Collectors.joining(","));
// 使用的方法
List<String> testMethodList = testRecord.getTestMethodList();
List<TestRecordMethod> testRecordMethodList = CollectionUtils.isEmpty(testMethodList)
? Collections.emptyList()
: testRecordMethodService.list(Wrappers.<TestRecordMethod>lambdaQuery()
.in(TestRecordMethod::getId, testMethodList));
String useMethodNameStr = CollectionUtils.isEmpty(instruments)
? NULL_PLACEHOLDER
: testRecordMethodList.stream()
.map(TestRecordMethod::getMethodName)
.collect(Collectors.joining(","));
// 获取使用的仪器和方法
String useInstrumentNameStr = getInstrumentNames(testRecord);
String useMethodNameStr = getMethodNames(testRecord);
// 开始封装数据参数
JSONObject jsonObject = new JSONObject();
@ -304,6 +336,93 @@ public class PushDataToLabsCareServiceImpl implements PushDataToLabsCareService
return jsonObject;
}
/**
* 普通检材定性记录 非红外报告 的json 数据
*
* @param entrustInfo 委托信息
* @param testRecord 测试记录
* @return 构建好的Json对象
*/
private JSONObject buildNonInfraredGeneralQualitativeRecordJsonPayload(EntrustInfo entrustInfo, TestRecord testRecord) {
// 查询封装需要用到的数据
List<SampleInfo> sampleInfoList = sampleInfoService
.lambdaQuery()
.in(SampleInfo::getId, testRecord.getSampleTestList())
.list();
// 对受理编号进行分隔
List<String> splitAcceptNo = StrUtil.split(entrustInfo.getAcceptNo(), "-");
// 设置使用的标准物质和试剂
List<TestRecordReagentVO> references = testRecordReagentService.voListByWrapper(Wrappers.<TestRecordReagent>lambdaQuery()
.in(TestRecordReagent::getId, testRecord.getReagentConsumablesList())
.eq(TestRecordReagent::getCategory, "标准物质"));
// 本次实验使用的标准品
String stdStr = references.stream().map(TestRecordReagentVO::getReagentConsumableName).collect(Collectors.joining("、"));
// 获取检测人用户信息
SysUser testUser = commonFeignService.remoteGetUserById(testRecord.getTestUserId());
// 获取样品检测数据,按照样品编号分组
Map<String, List<TestRecordSampleDataVO>> testDataGroupBySampleNO = fetchTestDataGroupBySampleNo(testRecord);
// 获取标准物质的测试数据
Map<String, TestRecordSampleDataVO> stdTestDataMap = fetchStdTestData(testRecord);
// 获取使用的仪器和方法
String useInstrumentNameStr = getInstrumentNames(testRecord);
String useMethodNameStr = getMethodNames(testRecord);
// 开始封装数据参数
JSONObject jsonObject = new JSONObject();
jsonObject.set("jcxz", inspectRecordService.buildMaterialCharacterDesc(sampleInfoList)); // 检材性状描述
jsonObject.set("jdwsh", String.format("[%s]%s号", splitAcceptNo.get(0), splitAcceptNo.get(1))); // 鉴定文书号
jsonObject.set("jysj", testRecord.getTestStartDate().format(formatter)); // 检验时间
jsonObject.set("jyy1qm", testUser.getName()); // 检测人1
jsonObject.set(
"jyyq",
String.format("对所送检材中是否含有 %s 成分进行定性检测", stdStr)
); // 检验要求,根据模板上的值来生成
jsonObject.set("sjr1", entrustInfo.getDeliver1Name()); // 送检人1
jsonObject.set("sjr2", entrustInfo.getDeliver2Name()); // 送检人2
jsonObject.set("slrq", entrustInfo.getAcceptDate().format(formatter)); // 受理日期
jsonObject.set("sprqm", testUser.getName()); // 检测人2
jsonObject.set("tpfj", NULL_PLACEHOLDER); // 图谱
jsonObject.set("wtdw", entrustInfo.getEntrustDepartment());
// 普通检材定性记录 非红外样品信息
List<JSONObject> sampleJsonList = new ArrayList<>();
testDataGroupBySampleNO.forEach((sampleNo, testDataList) -> {
JSONObject sampleJson = new JSONObject();
sampleJson.set("caseName", sampleNo); // 样品编号
// 普通检材定性记录 非红外检测信息
List<JSONObject> gauging = testDataList.stream().map(data -> {
JSONObject testDataJson = new JSONObject();
testDataJson.set("blsjxdwc", data.getRtTimeError()); // 保留时间相对误差(%)
testDataJson.set("swbzgzyzb", NULL_PLACEHOLDER); // 标准工作溶液制备
TestRecordSampleDataVO stdData = stdTestDataMap.get(data.getCompoundName());
testDataJson.set("bzwzblsj", stdData.getTargetRtTime()); // 标准物质保留时间(min)
testDataJson.set("bzwzwb", stdData.getCompoundName()); // 标准物质名称
testDataJson.set("swdcypzb", NULL_PLACEHOLDER); // 待测样品制备
testDataJson.set("dxff", useMethodNameStr); // 所用的方法
testDataJson.set("dxyq", useInstrumentNameStr); // 使用仪器
testDataJson.set("jdyj", inspectRecordService.buildInspectOpinion(Collections.singletonList(TestRecordSampleDataConverter.voToEntity(data))));
testDataJson.set("jgpd", data.getWhetherCheckOut()); // 结果判定
testDataJson.set("jysj", testRecord.getTestStartDate().format(formatter)); // 检验时间
testDataJson.set("jytj", NULL_PLACEHOLDER); // 进样条件
testDataJson.set("mbwblsj", data.getTargetRtTime()); // 目标物保留时间(min)
testDataJson.set("rjwb", NULL_PLACEHOLDER); // 溶剂
testDataJson.set("sj", NULL_PLACEHOLDER); // 上机
testDataJson.set("spz", NULL_PLACEHOLDER); // 仪器条件-色谱柱
testDataJson.set("zptppd", NULL_PLACEHOLDER); // 质谱图匹配度(%)
testDataJson.set("zw", NULL_PLACEHOLDER); // 柱温
return testDataJson;
}).collect(Collectors.toList());
sampleJson.set("gauging", gauging); // 生物检材定性记录检测信息
sampleJsonList.add(sampleJson);
});
jsonObject.set("sample", sampleJsonList);
return jsonObject;
}
/**
* 通过POST请求与远程API进行交互
@ -353,4 +472,73 @@ public class PushDataToLabsCareServiceImpl implements PushDataToLabsCareService
.set(EntrustInfo::getPushFlag, String.join(",", flagList)));
}
/**
* 根据实验记录中的样本编号对检验数据进行分组
*
* @param testRecord 测试记录对象
* @return 包含分组后的测试数据映射关系键为样本编号值为样本编号对应的测试数据列表
*/
private Map<String, List<TestRecordSampleDataVO>> fetchTestDataGroupBySampleNo(TestRecord testRecord) {
return testRecordSampleDataMapper.queryTestRecordSampleDataVOList(Wrappers.<TestRecordSampleData>lambdaQuery()
.eq(TestRecordSampleData::getTestId, testRecord.getId())
.eq(TestRecordSampleData::getSampleType, TestRecordSampleDataConstant.SAMPLE_TYPE_ANALYTE))
.stream()
.collect(Collectors.groupingBy(TestRecordSampleDataVO::getSampleNo));
}
/**
* 根据实验id获取标准测试数据
*
* @param testRecord 测试记录对象
* @return 标准测试数据的Map集合键为化合物名称值为TestRecordSampleDataVO对象
*/
private Map<String, TestRecordSampleDataVO> fetchStdTestData(TestRecord testRecord) {
return testRecordSampleDataMapper.queryTestRecordSampleDataVOList(Wrappers.<TestRecordSampleData>lambdaQuery()
.eq(TestRecordSampleData::getTestId, testRecord.getId())
.eq(TestRecordSampleData::getSampleType, TestRecordSampleDataConstant.SAMPLE_TYPE_STD))
.stream()
.collect(Collectors.toMap(TestRecordSampleDataVO::getCompoundName, Function.identity()));
}
/**
* 根据测试记录获取仪器名称列表
*
* @param testRecord 测试记录对象
* @return 仪器名称列表若列表为空则返回NULL_PLACEHOLDER
*/
private String getInstrumentNames(TestRecord testRecord) {
List<String> deviceIdList = testRecord.getDeviceIdList();
List<TestRecordInstrument> instruments = CollectionUtils.isEmpty(deviceIdList)
? Collections.emptyList()
: testRecordInstrumentService.list(Wrappers.<TestRecordInstrument>lambdaQuery()
.in(TestRecordInstrument::getId, deviceIdList));
return CollectionUtils.isEmpty(instruments)
? NULL_PLACEHOLDER
: instruments.stream()
.map(TestRecordInstrument::getInstrumentName)
.collect(Collectors.joining(","));
}
/**
* 获取方法名称列表用逗号分隔
*
* @param testRecord 测试记录对象
* @return 方法名称列表用逗号分隔若为空则返回NULL_PLACEHOLDER
*/
private String getMethodNames(TestRecord testRecord) {
List<String> testMethodList = testRecord.getTestMethodList();
List<TestRecordMethod> testRecordMethodList = CollectionUtils.isEmpty(testMethodList)
? Collections.emptyList()
: testRecordMethodService.list(Wrappers.<TestRecordMethod>lambdaQuery()
.in(TestRecordMethod::getId, testMethodList));
return CollectionUtils.isEmpty(testRecordMethodList)
? NULL_PLACEHOLDER
: testRecordMethodList.stream()
.map(TestRecordMethod::getMethodName)
.collect(Collectors.joining(","));
}
}

@ -62,3 +62,5 @@ gyjd:
entrust-letter: /thirdparty/report-generate/jianDingWeiTuoShuReport/v1
confirm-letter: /thirdparty/report-generate/jianDingShiXiangQueRenShuReport/v1
biology-qualitative-record: /thirdparty/report-generate/shenWuJianCaiDingXingJiLuReport/v1
non-infrared-general-qualitative-record: /thirdparty/report-generate/puTongJianCaiDingXingJiLuFeiReport/v1
infrared-general-qualitative-record: /thirdparty/report-generate/puTongJianCaiDingXingJiLuReport/v1

Loading…
Cancel
Save