|
|
|
@ -1526,4 +1526,237 @@ public class TestRecordServiceImpl extends ServiceImpl<TestRecordMapper, TestRec |
|
|
|
|
} |
|
|
|
|
return R.ok(map); |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
@Override |
|
|
|
|
public R inspectionRecord(String entrustId) throws Exception { |
|
|
|
|
EntrustInfo entrustInfo = entrustInfoService.getById(entrustId); |
|
|
|
|
if (entrustInfo == null) { |
|
|
|
|
return R.ok(false, "委托信息不存在!"); |
|
|
|
|
} |
|
|
|
|
String type = entrustInfo.getBusinessType(); |
|
|
|
|
if (type.equals(BusinessType.BOINT_CASE.getBusinessType())) { |
|
|
|
|
Map<String, Object> map = this.invivoRecord(entrustInfo); |
|
|
|
|
return R.ok(this.createInVivoFile(map, entrustId), "生成成功!"); |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
return null; |
|
|
|
|
|
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
public Map<String, Object> invivoRecord(EntrustInfo entrustInfo) throws Exception { |
|
|
|
|
|
|
|
|
|
HashMap<String, Object> 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<String> sampleIdList = sampleInfoService.list(Wrappers.<SampleInfo>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.<TestRecord>lambdaQuery() |
|
|
|
|
.like(TestRecord::getSampleTestList, sampleId)); |
|
|
|
|
if (record != null) { |
|
|
|
|
testRecord = record; |
|
|
|
|
break; |
|
|
|
|
} |
|
|
|
|
} |
|
|
|
|
List<TestRecordInstrument> instruments = testRecordInstrumentService.list(Wrappers.<TestRecordInstrument>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<TestRecordReagent> references = testRecordReagentService.list(Wrappers.<TestRecordReagent>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<TestRecordReagent> reagents = testRecordReagentService.list(Wrappers.<TestRecordReagent>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<HairSewageDataDto> hairDataDtos = (List<HairSewageDataDto>) testRecordSampleDataService.getSampleTestDataByBusiness(entrustInfo.getId()); |
|
|
|
|
|
|
|
|
|
Map<String, List<HairSewageDataDto>> dataMap = hairDataDtos.stream() |
|
|
|
|
.collect(Collectors.groupingBy(HairSewageDataDto::getCompoundName)); |
|
|
|
|
|
|
|
|
|
ArrayList<HairSewageDataDto> dataDtos = new ArrayList<>(); |
|
|
|
|
|
|
|
|
|
for (Map.Entry<String, List<HairSewageDataDto>> entry : dataMap.entrySet()) { |
|
|
|
|
|
|
|
|
|
List<HairSewageDataDto> 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<HairSewageDataDto> 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<String, Object> 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<String, Object>() {{ |
|
|
|
|
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<HairSewageDataDto> 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<NPSCaseTestDataDto> 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; |
|
|
|
|
} |
|
|
|
|
} |
|
|
|
|
} |
|
|
|
|