master
杨海航 3 weeks ago
parent 5961508dd5
commit 23404eaf7e
  1. 2
      dlp-drugtesting-biz/src/main/java/digital/laboratory/platform/inspection/controller/TestRecordController.java
  2. 2
      dlp-drugtesting-biz/src/main/java/digital/laboratory/platform/inspection/service/InspectRecordService.java
  3. 58
      dlp-drugtesting-biz/src/main/java/digital/laboratory/platform/inspection/service/impl/IdentifyBookDataServiceImpl.java
  4. 55
      dlp-drugtesting-biz/src/main/java/digital/laboratory/platform/inspection/service/impl/InspectRecordServiceImpl.java

@ -223,7 +223,7 @@ public class TestRecordController {
@ApiOperation("生成检验记录-贵阳禁毒")
@GetMapping("/inspectionRecord")
public R inspectionRecord(String businessId, String materialType) throws Exception {
return inspectRecordService.buildInspectionRecord(businessId, materialType);
return inspectRecordService.buildInspectionRecord(businessId, materialType, false);
}
@ApiOperation("预览检验记录-贵阳禁毒")

@ -21,7 +21,7 @@ public interface InspectRecordService {
* @return
* @throws Exception
*/
R buildInspectionRecord(String businessId, String materialType) throws Exception;
R buildInspectionRecord(String businessId, String materialType,boolean isPreview) throws Exception;
void previewInspectionRecord(String businessId, String materialType, HttpServletResponse servletResponse) throws Exception;

@ -69,8 +69,10 @@ public class IdentifyBookDataServiceImpl implements IdentifyBookDataService {
}
return R.ok(entrustInfoList, "获取数据成功");
}
/**
* 获取文书的数据
*
* @param businessId
* @return
*/
@ -85,6 +87,7 @@ public class IdentifyBookDataServiceImpl implements IdentifyBookDataService {
return R.failed("参数业务id不能为空,请检查参数" + businessId);
}
}
//构建文书数据
private IdentificationBookDTO buildBookDataDetail(String businessId) {
IdentificationBookDTO bookData = new IdentificationBookDTO();
@ -97,12 +100,11 @@ public class IdentifyBookDataServiceImpl implements IdentifyBookDataService {
bookData.setSampleInfoList(sampleList);
//设置检验结果
List<TestRecordSampleSolution> testRecordSampleSolutionList = getTestRecordSampleSolution(sampleList);//样本溶液
List<TestRecordSampleData> testRecordSampleDataList = getTestRecordSampleData(sampleList);//样本溶液对应的数据
List<TestResult> testResultsList = buildTestResult(testRecordSampleDataList, testRecordSampleSolutionList, sampleList);//构建检验结果
TestRecord testRecordInfo = getTestRecordInfo(testRecordSampleSolutionList);
List<TestResult> testResultsList = buildTestResult(testRecordSampleDataList, sampleList);//构建检验结果
TestRecord testRecordInfo = testRecordService.getById(testRecordSampleDataList.get(0).getTestId());
//实验信息
bookData.setTestMethod(getTestMethods(testRecordSampleSolutionList));//设置用到的实验方法
bookData.setTestMethod(getTestMethods(testRecordInfo));//设置用到的实验方法
//设置检验过程
bookData.setTestProcessDes(testRecordInfo.getTestProcessDes());//设置检验过程
bookData.setTestResult(testRecordSampleDataService.generateQualitativeResults(businessId));
@ -115,6 +117,7 @@ public class IdentifyBookDataServiceImpl implements IdentifyBookDataService {
bookData.setTestFinishDate(sdf.format(testRecordInfo.getUpdateTime()));
return bookData;
}
//获取业务的实验对象
private TestRecord getTestRecordInfo(List<TestRecordSampleSolution> testRecordSampleSolutionList) {
List<String> testIdList = testRecordSampleSolutionList.stream().map(s -> s.getTestId()).collect(Collectors.toList());
@ -126,12 +129,18 @@ public class IdentifyBookDataServiceImpl implements IdentifyBookDataService {
TestRecord testRecord = testRecordService.getById(testId);
return testRecord;
}
//获取实验方法
private String getTestMethods(List<TestRecordSampleSolution> testRecordSampleSolutionList){
TestRecord testRecordInfo= getTestRecordInfo(testRecordSampleSolutionList);
List<String> testMethodList= testRecordInfo.getTestMethodList();
List<TestRecordMethod> methodsList = testRecordMethodService.list(Wrappers.<TestRecordMethod>lambdaQuery()
.in(TestRecordMethod::getId, testMethodList));
private String getTestMethods(TestRecord testRecord) {
List<String> testMethodList = testRecord.getTestMethodList();
if (testMethodList == null || testMethodList.isEmpty()) {
return String.format("没有对应的方法数据!"); // 直接返回空列表,避免 SQL 语法错误
}
List<TestRecordMethod> methodsList = testRecordMethodService.list(
Wrappers.<TestRecordMethod>lambdaQuery().in(TestRecordMethod::getId, testMethodList)
);
List<String> methodsName = methodsList.stream().map(s -> s.getMethodName()).collect(Collectors.toList());
StringBuffer sbMethodNameStr = new StringBuffer();
methodsName.forEach(item -> {
@ -140,18 +149,18 @@ public class IdentifyBookDataServiceImpl implements IdentifyBookDataService {
sbMethodNameStr.delete(sbMethodNameStr.length() - 1, sbMethodNameStr.length());
return sbMethodNameStr.toString();
}
//获取sampleData
private List<TestRecordSampleData> getTestRecordSampleData(List<SampleInfo> sampleInfoList) {
List<TestRecordSampleSolution> testRecordSampleSolution = getTestRecordSampleSolution(sampleInfoList);
if (CollUtil.isNotEmpty(testRecordSampleSolution)) {
List<String> sampleNoList= testRecordSampleSolution.stream().map(m -> m.getSampleNo()).collect(Collectors.toList());//得到样本溶液编号
if (!sampleInfoList.isEmpty()) {
List<String> sampleNoList = sampleInfoList.stream().map(m -> m.getAcceptNo()).collect(Collectors.toList());//得到样本溶液编号
//根据样本溶液编号查出对应的样本溶液检验数据
List<TestRecordSampleData> sampleTestDataList = getTestRecordData(sampleNoList);
return sampleTestDataList;
}
return null;
}
//获取样本溶液
private List<TestRecordSampleSolution> getTestRecordSampleSolution(List<SampleInfo> sampleInfoList) {
List<String> materialIdList = sampleInfoList.stream().map(m -> m.getId()).collect(Collectors.toList());
@ -164,25 +173,20 @@ public class IdentifyBookDataServiceImpl implements IdentifyBookDataService {
.in(TestRecordSampleSolution::getMaterialId, materialIdList));
return sampleSolutionList;
}
//构建TestResult
private List<TestResult> buildTestResult(List<TestRecordSampleData> testRecordSampleDataList,
List<TestRecordSampleSolution> testRecordSampleSolutionList,List<SampleInfo> sampleInfoList){
List<SampleInfo> sampleInfoList) {
//结果:应该是加入实验的检材的结果,目前暂定受理的检材我们按照受理顺序,全部定义为 1号检材,2号检材,3号检材等
//拿出实验数据中的所有实验样本编号,就是数据文件中的sampleId,也是溶液编号中的溶液编号,
List<String> sampleNoList = testRecordSampleDataList.stream().map(s -> s.getSampleNo()).collect(Collectors.toList());
//取出检材ID
List<String> okTestRecordSampleSolutionIdList=new ArrayList<>();
testRecordSampleSolutionList.forEach(item->{
//如果溶液在提供的溶液编号中,则取出来
if(sampleNoList.contains(item.getSampleNo())){
okTestRecordSampleSolutionIdList.add(item.getMaterialId());
}
});
Map<String, SampleInfo> map = sampleInfoList.stream().collect(Collectors.toMap(s -> s.getAcceptNo(), s -> s));
List<TestResult> retTestResult = new ArrayList<>();
for (TestRecordSampleData testRecordSampleData : testRecordSampleDataList) {
TestResult eg = new TestResult();
SampleInfo sampleInfo=getSampleInfoBySampleId(testRecordSampleSolutionList,
sampleInfoList,testRecordSampleData.getSampleNo());
SampleInfo sampleInfo = map.get(testRecordSampleData.getSampleNo());
eg.setCompoundName(testRecordSampleData.getCompoundName());
eg.setMaterialNo(sampleInfo.getOrderNo() + "号");
eg.setOrderNo(sampleInfo.getOrderNo());
@ -192,6 +196,7 @@ public class IdentifyBookDataServiceImpl implements IdentifyBookDataService {
}
return retTestResult;
}
//根据sampleID获取对应的检材信息
private SampleInfo getSampleInfoBySampleId(List<TestRecordSampleSolution> testRecordSampleSolutionList,
List<SampleInfo> sampleInfoList, String sampleId) {
@ -223,6 +228,7 @@ public class IdentifyBookDataServiceImpl implements IdentifyBookDataService {
return retObj.get(0);
}
}
//构建实验结果
private List<String> buildTestResultDes(List<TestResult> resultList) {
//按照检材编号先分组,这样的话,如果有n个检材,m个化合物,那么就会分成n组,每组中就m条数据
@ -248,6 +254,7 @@ public class IdentifyBookDataServiceImpl implements IdentifyBookDataService {
List<String> testResultDes = testResultSorted(temp2);
return testResultDes;
}
//对第一个结果进行排序
private List<String> testResultSorted(Map<String, List<TestResultDetail>> tmpMap) {
List<Map.Entry<String, List<TestResultDetail>>> targetList = new ArrayList<Map.Entry<String, List<TestResultDetail>>>(tmpMap.entrySet());
@ -272,8 +279,10 @@ public class IdentifyBookDataServiceImpl implements IdentifyBookDataService {
});
return testResultDes;
}
/**
* 构造出一个检材一共检出了多少个化合物和未检出多少化合物
*
* @param mapCompound
* @param materialNo
* @return
@ -323,6 +332,7 @@ public class IdentifyBookDataServiceImpl implements IdentifyBookDataService {
/**
* 根据编号获取排序值
*
* @param materialNo
* @return
*/
@ -334,8 +344,10 @@ public class IdentifyBookDataServiceImpl implements IdentifyBookDataService {
}
return "";
}
/**
* 根据溶液编号(sampleNo)获取仪器检测数据
*
* @param sampleNoList
* @return
*/

@ -93,41 +93,88 @@ public class InspectRecordServiceImpl implements InspectRecordService {
* @throws Exception
*/
@Override
public R buildInspectionRecord(String businessId, String materialType) throws Exception {
/**
* 构建检验记录
*
* @param businessId 业务ID用于查询委托信息和检验记录
* @param materialType 材料类型用于生成特定类型的检验记录
* @return 返回封装的响应对象如果已存在 `.docx` 文件则直接返回其路径否则根据业务类型生成新的检验记录
* @throws Exception 可能抛出的异常
*/
public R buildInspectionRecord(String businessId, String materialType, boolean isPreview) throws Exception {
// 根据业务ID查询委托信息
EntrustInfo entrustInfo = entrustInfoService.getById(businessId);
if (entrustInfo == null) {
return R.ok(false, "委托信息不存在!");
}
// 查询该业务ID对应的检验记录
TestRecord testRecord = testRecordService.lambdaQuery()
.eq(TestRecord::getBusinessId, businessId)
.one();
// 判断是否是预览,如果是预览,则每次都要重新生成,如果不是预览,那就是已经结束实验后生成的检验记录,就去判断是否生成过了,如果生成过就不再生成了
if (!isPreview) {
// 获取OSS存储中的检验记录目录下的文件列表
List<String> list = ossFile.fileList(TestRecordFileUrl.TEST_RECORD_CATALOGUE.getFileUrl() + "/" + businessId + "/");
// 如果该目录下存在文件,则遍历查找是否有 .docx 结尾的文件
if (CollUtil.isNotEmpty(list)) {
for (String fileName : list) {
// 提取文件后缀名
String suffix = fileName.substring(fileName.lastIndexOf(".") + 1);
// 如果找到 .docx 文件,则直接返回文件路径
if (suffix.equals("docx")) {
return R.ok(TestRecordFileUrl.TEST_RECORD_CATALOGUE.getFileUrl() + "/" + businessId + "/" + fileName, "生成成功!");
}
}
}
}
// 如果业务类型为 "BOINT_CASE",生成体内检验记录
if (entrustInfo.getBusinessType().equals(BusinessType.BOINT_CASE.getBusinessType())) {
return R.ok(this.buildInVivoDocFile(entrustInfo, materialType), "生成成功!");
}
// 默认情况,生成通用的药品检验记录
return R.ok(this.generateCommonDrugInpectRecord(businessId));
}
@Override
public void previewInspectionRecord(String businessId, String materialType, HttpServletResponse servletResponse) throws Exception {
String path = "";
path = (String) this.buildInspectionRecord(businessId, materialType).getData();
path = (String) this.buildInspectionRecord(businessId, materialType, true).getData();
java.io.ByteArrayOutputStream fosWord = new java.io.ByteArrayOutputStream();
ossFile.fileGet(path, fosWord);
ByteArrayInputStream fisWord = new ByteArrayInputStream(fosWord.toByteArray());
fosWord.close();
// 转换临时目录中的 word 文档为 PDF
MockMultipartFile mockMultipartFile = new MockMultipartFile("file", "检验记录" + ".docx", "image/jpg", fisWord);
// 转换 Word 文档为 PDF
MockMultipartFile mockMultipartFile = new MockMultipartFile("file", "检验记录" + ".docx", "application/vnd.openxmlformats-officedocument.wordprocessingml.document", fisWord);
String pdfFilePath = path.substring(0, path.lastIndexOf(".")) + ".pdf";
Response response = remoteWord2PDFService.word2pdf(mockMultipartFile);
fisWord.close();
org.apache.commons.io.output.ByteArrayOutputStream outPDF = new org.apache.commons.io.output.ByteArrayOutputStream();
IoUtil.copy(response.body().asInputStream(), outPDF, IoUtil.DEFAULT_MIDDLE_BUFFER_SIZE);
ByteArrayInputStream isPDF = new ByteArrayInputStream(outPDF.toByteArray());
outPDF.close();
// 保存 PDF 文件
ossFile.fileSave(pdfFilePath, isPDF);
isPDF.close();
// 删除原 Word 文件
ossFile.fileDelete(path);
System.out.println(String.format("已删除 Word 文件: %s", path));
// 发送 PDF 文件到响应流
ossFile.fileGet(pdfFilePath, servletResponse.getOutputStream());
System.out.println(String.format("转换为 PDF 结束"));
}
/**
* 构建体内检验记录数据
*

Loading…
Cancel
Save