From 7a306ac03039ea496ebb36bfcea507c6443ee919 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E6=9D=A8=E6=B5=B7=E8=88=AA?= <11918452+yang-haihang@user.noreply.gitee.com> Date: Mon, 17 Mar 2025 16:58:46 +0800 Subject: [PATCH] =?UTF-8?q?=E9=83=A8=E5=88=86=E6=A3=80=E9=AA=8C=E8=AE=B0?= =?UTF-8?q?=E5=BD=95=E6=A8=A1=E6=9D=BF=E7=9A=84=E8=B0=83=E6=95=B4?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../controller/TestRecordController.java | 11 +- .../inspection/service/TestRecordService.java | 2 + .../service/impl/TestRecordServiceImpl.java | 233 ++++++++++++++++++ 3 files changed, 243 insertions(+), 3 deletions(-) diff --git a/dlp-drugtesting-biz/src/main/java/digital/laboratory/platform/inspection/controller/TestRecordController.java b/dlp-drugtesting-biz/src/main/java/digital/laboratory/platform/inspection/controller/TestRecordController.java index 48534e5..f5138b0 100644 --- a/dlp-drugtesting-biz/src/main/java/digital/laboratory/platform/inspection/controller/TestRecordController.java +++ b/dlp-drugtesting-biz/src/main/java/digital/laboratory/platform/inspection/controller/TestRecordController.java @@ -180,8 +180,8 @@ public class TestRecordController { @ApiOperation(value = "根据实验id和文件id获取图片") @ApiImplicitParam(name = "testId", value = "该实验图谱关联的实验id") public void getTestAtlasByFileId(@RequestParam("testId") String testId, - @RequestParam("fileId") String fileId, - HttpServletResponse httpServletResponse) throws IOException { + @RequestParam("fileId") String fileId, + HttpServletResponse httpServletResponse) throws IOException { try { TestRecord testRecord = testRecordService.getById(testId); JSONArray jsonArray = JSONArray.parseArray(testRecord.getTestAtlas()); @@ -193,7 +193,7 @@ public class TestRecordController { break; } } - }catch (AmazonS3Exception s3e) { + } catch (AmazonS3Exception s3e) { httpServletResponse.sendError(s3e.getStatusCode(), s3e.toString()); } catch (Exception e) { httpServletResponse.sendError(501, e.toString()); @@ -212,4 +212,9 @@ public class TestRecordController { } } + @GetMapping("/inspectionRecord") + public R inspectionRecord(String entrustId) throws Exception { + return testRecordService.inspectionRecord(entrustId); + } + } diff --git a/dlp-drugtesting-biz/src/main/java/digital/laboratory/platform/inspection/service/TestRecordService.java b/dlp-drugtesting-biz/src/main/java/digital/laboratory/platform/inspection/service/TestRecordService.java index 3f8ec0e..5c91f61 100644 --- a/dlp-drugtesting-biz/src/main/java/digital/laboratory/platform/inspection/service/TestRecordService.java +++ b/dlp-drugtesting-biz/src/main/java/digital/laboratory/platform/inspection/service/TestRecordService.java @@ -89,4 +89,6 @@ public interface TestRecordService extends IService { * @return */ R> queryTestRecordInfoByBusinessId(List businessIds); + + R inspectionRecord(String entrustId) throws Exception; } diff --git a/dlp-drugtesting-biz/src/main/java/digital/laboratory/platform/inspection/service/impl/TestRecordServiceImpl.java b/dlp-drugtesting-biz/src/main/java/digital/laboratory/platform/inspection/service/impl/TestRecordServiceImpl.java index f545294..924c3ee 100644 --- a/dlp-drugtesting-biz/src/main/java/digital/laboratory/platform/inspection/service/impl/TestRecordServiceImpl.java +++ b/dlp-drugtesting-biz/src/main/java/digital/laboratory/platform/inspection/service/impl/TestRecordServiceImpl.java @@ -1526,4 +1526,237 @@ public class TestRecordServiceImpl extends ServiceImpl map = this.invivoRecord(entrustInfo); + return R.ok(this.createInVivoFile(map, entrustId), "生成成功!"); + } + + return null; + + } + + public Map invivoRecord(EntrustInfo entrustInfo) throws Exception { + + HashMap data = new HashMap<>(); + + data.put("entrustDepartment", entrustInfo.getEntrustDepartment()); + data.put("deliver1Name", entrustInfo.getDeliver1Name()); + data.put("deliver2Name", entrustInfo.getDeliver2Name()); + data.put("year", entrustInfo.getAcceptDate().getYear()); + data.put("month", entrustInfo.getAcceptDate().getMonthValue()); + data.put("day", entrustInfo.getAcceptDate().getDayOfMonth()); + + List sampleIdList = sampleInfoService.list(Wrappers.lambdaQuery() + .eq(SampleInfo::getBusinessId, entrustInfo.getId())) + .stream().map(SampleInfo::getId) + .collect(Collectors.toList()); + + TestRecord testRecord = new TestRecord(); + + for (String sampleId : sampleIdList) { + TestRecord record = this.getOne(Wrappers.lambdaQuery() + .like(TestRecord::getSampleTestList, sampleId)); + if (record != null) { + testRecord = record; + break; + } + } + List instruments = testRecordInstrumentService.list(Wrappers.lambdaQuery() + .in(TestRecordInstrument::getId, testRecord.getDeviceIdList())); + + + if (instruments == null || instruments.size() == 0) { + data.put("instrumentName", "未找到仪器设备数据!"); + }else { + String instrumentName = instruments.stream() + .map(TestRecordInstrument::getInstrumentName) + .collect(Collectors.joining("\n")); + + data.put("instrumentName", instrumentName); + } + + List references = testRecordReagentService.list(Wrappers.lambdaQuery() + .in(TestRecordReagent::getId, testRecord.getReagentConsumablesList()) + .eq(TestRecordReagent::getCategory, "标准物质")); + + if (references == null || references.size() == 0) { + data.put("referenceMaterialName", "未找到试剂耗材数据!"); + }else { + + String referenceMaterialName = references.stream() + .map(reagent -> "\u2611" + " " + reagent.getReagentConsumableName()) + .collect(Collectors.joining("\n")); + + data.put("referenceMaterialName", referenceMaterialName); + } + + + List reagents = testRecordReagentService.list(Wrappers.lambdaQuery() + .in(TestRecordReagent::getId, testRecord.getReagentConsumablesList()) + .eq(TestRecordReagent::getCategory, "试剂")); + + + + if (reagents == null || reagents.size() == 0) { + data.put("reagentConsumableName", "未找到试剂耗材数据!"); + } else { + String reagentConsumableName = reagents.stream() + .map(TestRecordReagent::getReagentConsumableName) + .collect(Collectors.joining("、")); + data.put("reagentConsumableName", reagentConsumableName); + } + + List hairDataDtos = (List) testRecordSampleDataService.getSampleTestDataByBusiness(entrustInfo.getId()); + + Map> dataMap = hairDataDtos.stream() + .collect(Collectors.groupingBy(HairSewageDataDto::getCompoundName)); + + ArrayList dataDtos = new ArrayList<>(); + + for (Map.Entry> entry : dataMap.entrySet()) { + + List list = entry.getValue(); + + HairSewageDataDto dto = new HairSewageDataDto(); + + dto.setSampleName("空白"); + dto.setCompoundName(entry.getKey()); + dto.setTmpTargetRtTime("/"); + dto.setTmpRtTimeError("/"); + dto.setRtTimeWithinError("否"); + dto.setTmpIonAbundanceRatio("/"); + dto.setWhetherCheckOut("否"); + dataDtos.add(dto); + ArrayList delList = new ArrayList<>(); + for (HairSewageDataDto item : list) { + if (StringUtils.isNotBlank(item.getSampleType()) && item.getSampleType().equals("STD")) { + delList.add(item); + item.setSampleName("空白添加"); + item.setWhetherCheckOut("是"); + dataDtos.add(item); + } else if (StringUtils.isNotBlank(item.getSampleType()) && item.getSampleType().equals("QC")) { + delList.add(item); + } + } + +// list.forEach(item -> { +// if (StringUtils.isNotBlank(item.getSampleType())&&item.getSampleType().equals("STD")) { +// item.setSampleName("空白添加"); +// item.setWhetherCheckOut("是"); +// dataDtos.add(item); +// list.remove(item); +// } +// }); + list.removeAll(delList); + Collections.sort(list, this.getSortBySampleNo("inVivo")); + if (list.size() == 1) { + list.get(0).setSampleName("检材样品"); + } else { + for (int i = 0; i < list.size(); i++) { + list.get(i).setSampleName((i + 1) + "号检材样品"); + } + } + dataDtos.addAll(list); + } + + data.put("dataDtos", dataDtos); + data.put("sampleSize", dataDtos.size()); + data.put("vo", testRecord); + return data; + + } + + public String createInVivoFile(Map data, String entrustId) throws Exception { + ByteArrayOutputStream bos = new ByteArrayOutputStream(); + TestRecord vo = (TestRecord) data.get("vo"); + ossFile.fileGet("/template" + "/贵阳生物样本检验记录模板.docx", bos); + byte[] templateArray = bos.toByteArray(); + ByteArrayInputStream bis = new ByteArrayInputStream(templateArray); + bos.close(); + + LoopRowTableRenderPolicy policy = new LoopRowTableRenderPolicy(); + Configure config = Configure.builder(). + bind("dataDtos", policy).build(); + + XWPFTemplate template = XWPFTemplate.compile(bis, config).render( + new HashMap() {{ + put("entrustDepartment", data.get("entrustDepartment")); + put("deliver1Name", data.get("deliver1Name")); + put("deliver2Name", data.get("deliver2Name")); + put("year", data.get("year")); + put("month", data.get("month")); + put("day", data.get("day")); + put("instrumentName", data.get("instrumentName")); + put("referenceMaterialName", data.get("referenceMaterialName")); + put("reagentConsumableName", data.get("reagentConsumableName")); + put("dataDtos", data.get("dataDtos")); + }} + ); + NiceXWPFDocument document = template.getXWPFDocument(); + +// XWPFTable table = document.getTables().get(3); +// int sampleSize = (int) data.get("sampleSize"); +// //合并单元格 +// +// TableTools.mergeCellsVertically(table, 1, 1, sampleSize); + + + bis.close(); + ByteArrayOutputStream fosWord = new ByteArrayOutputStream(); + template.write(fosWord); + template.close(); + ByteArrayInputStream fisWord = new ByteArrayInputStream(fosWord.toByteArray()); + fosWord.close(); + document.close(); + String path = TestRecordFileUrl.TEST_RECORD_CATALOGUE.getFileUrl() + "/" + entrustId + "/" + "贵阳生物样本检验记录.docx"; + ossFile.fileSave(path, fisWord); + return path; + } + + public Comparator getSortBySampleNo(String type) { + + if (type.equals("inVivo")) { + Comparator comparator = Comparator.comparing( + HairSewageDataDto::getSampleNo, + (a, b) -> { + String[] partsA = a.split("-"); + String[] partsB = b.split("-"); + + // 逐部分比较数值 + for (int i = 0; i < 3; i++) { + int numA = Integer.parseInt(partsA[i]); + int numB = Integer.parseInt(partsB[i]); + if (numA != numB) return Integer.compare(numA, numB); + } + return 0; // 所有部分相同 + } + ); + return comparator; + } else { + Comparator comparator = Comparator.comparing( + NPSCaseTestDataDto::getSampleNo, + (a, b) -> { + String[] partsA = a.split("-"); + String[] partsB = b.split("-"); + + // 逐部分比较数值 + for (int i = 0; i < 3; i++) { + int numA = Integer.parseInt(partsA[i]); + int numB = Integer.parseInt(partsB[i]); + if (numA != numB) return Integer.compare(numA, numB); + } + return 0; // 所有部分相同 + } + ); + return comparator; + } + } }