| | |
| | | import java.nio.file.Files; |
| | | import java.nio.file.Paths; |
| | | import java.text.NumberFormat; |
| | | import java.text.SimpleDateFormat; |
| | | import java.util.*; |
| | | import java.util.List; |
| | | import java.util.stream.Collectors; |
| | |
| | | import com.ltkj.web.config.pdfutils.MyHeaderFooter; |
| | | import com.ltkj.web.config.pdfutils.PDFBinaryUtil; |
| | | import com.ltkj.web.config.pdfutils.PdfUtils; |
| | | import com.ltkj.web.controller.his.HisPDFUtil; |
| | | import io.swagger.annotations.Api; |
| | | import io.swagger.annotations.ApiOperation; |
| | | import io.swagger.annotations.ApiParam; |
| | |
| | | |
| | | @Autowired |
| | | private ITjBigPositiveService tjBigPositiveService; |
| | | @Autowired |
| | | private HisPDFUtil hisPDFUtil; |
| | | |
| | | @GetMapping("/savePdf") |
| | | @ApiOperation(value = "从本地存储模板到数据库") |
| | |
| | | // remarkVo.setProId("1633660948860522555"); |
| | | // updateOrderRemarkVos.add(remarkVo); |
| | | // tjCheckController.checkUpdateOrderRemark(updateOrderRemarkVos); |
| | | System.out.println("---------------------------------------newFun开始--------------------------------------------------"); |
| | | error = newFun(tjNumber); |
| | | System.out.println("-------------------------------------------结束----------------------------------------------"); |
| | | // System.out.println("---------------------------------------newFun开始--------------------------------------------------"); |
| | | // 以前测试pdf方法 |
| | | // error = newFun(tjNumber); |
| | | // System.out.println("-------------------------------------------结束----------------------------------------------"); |
| | | // 撤销 |
| | | // revocationReport(tjNumber); |
| | | if (error != null) { |
| | | return error; |
| | | // if (error != null) { |
| | | // return error; |
| | | // } |
| | | // return AjaxResult.success("该用户体检未完成,不能打印报告!!!"); |
| | | int num = tjOrderRemarkService.getTjYqOrderRemarkByTjNum(tjNumber); |
| | | if (num > 0) { |
| | | return AjaxResult.error("有延期项目暂不能生成报告!!!"); |
| | | } |
| | | return AjaxResult.success("该用户体检未完成,不能打印报告!!!"); |
| | | //判断表中有没有该体检报告 不能重复生成 |
| | | LambdaQueryWrapper<TjReport> wqa = new LambdaQueryWrapper<>(); |
| | | wqa.eq(TjReport::getTjNumber, tjNumber); |
| | | wqa.eq(TjReport::getType, "体检报告"); |
| | | Integer count = tjReportService.getSelectCount(wqa); |
| | | if (count != 0) { |
| | | return AjaxResult.error("该客户报告已生成!不能重复生成!可直接预览或打印!"); |
| | | } |
| | | String configByKey = configService.selectConfigByKey("sfkqdyhis"); |
| | | if (configByKey.equals("Y")) { |
| | | LambdaQueryWrapper<TjOrder> queryWrapper = new LambdaQueryWrapper<>(); |
| | | queryWrapper.eq(TjOrder::getTjNumber, tjNumber); |
| | | TjOrder tjOrder = tjOrderService.getOne(queryWrapper); |
| | | if (null != tjOrder) { |
| | | LambdaQueryWrapper<TjReportTemplate> tjReportTemplateLambdaQueryWrapper = new LambdaQueryWrapper<>(); |
| | | TjReportTemplate reportTemplate = null; |
| | | if (tjOrder.getTjCategory() != null) { |
| | | //查询字典 |
| | | LambdaQueryWrapper<SysDictData> wqq = new LambdaQueryWrapper<>(); |
| | | wqq.eq(SysDictData::getDictType, "dict_tjtype"); |
| | | wqq.eq(SysDictData::getDictValue, tjOrder.getTjCategory()); |
| | | SysDictData one = dictDataService.getOne(wqq); |
| | | if (one != null) { |
| | | //查询字典 |
| | | LambdaQueryWrapper<SysDictData> wqq1 = new LambdaQueryWrapper<>(); |
| | | wqq1.eq(SysDictData::getDictType, "report_template_type"); |
| | | wqq1.eq(SysDictData::getDictLabel, one.getDictLabel()); |
| | | SysDictData one1 = dictDataService.getOne(wqq1); |
| | | if (one1 != null) { |
| | | tjReportTemplateLambdaQueryWrapper.eq(TjReportTemplate::getFlag, one1.getDictValue()); |
| | | } else { |
| | | tjReportTemplateLambdaQueryWrapper.eq(TjReportTemplate::getFlag, 1); |
| | | } |
| | | } else { |
| | | tjReportTemplateLambdaQueryWrapper.eq(TjReportTemplate::getFlag, 1); |
| | | } |
| | | tjReportTemplateLambdaQueryWrapper.eq(TjReportTemplate::getOpen, 0); |
| | | reportTemplate = reportTemplateService.getOne(tjReportTemplateLambdaQueryWrapper); |
| | | } else { |
| | | tjReportTemplateLambdaQueryWrapper.eq(TjReportTemplate::getOpen, 0); |
| | | reportTemplate = reportTemplateService.list(tjReportTemplateLambdaQueryWrapper).get(2); |
| | | } |
| | | Integer checkStatus = tjOrder.getCheckStatus(); |
| | | if (checkStatus == 1) { |
| | | String hisRegistrationId = tjOrder.getCardId(); |
| | | Date createTime = tjOrder.getCreateTime(); |
| | | Date finishTime = tjOrder.getFinishTime(); |
| | | SimpleDateFormat dateFormat = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss"); |
| | | String ksrq = dateFormat.format(createTime); |
| | | String jsrq = dateFormat.format(finishTime); |
| | | HashMap<String, Object> params = new HashMap<>(); |
| | | params.put("his_registration_id", hisRegistrationId); |
| | | params.put("ksbm", ""); |
| | | params.put("pationid", ""); |
| | | params.put("ksrq", ksrq); |
| | | params.put("jsrq", jsrq); |
| | | params.put("pagecount", 100); |
| | | params.put("page", 1); |
| | | HashMap<String, Object> map = new HashMap<>(); |
| | | LambdaQueryWrapper<TjCustomer> wq1 = new LambdaQueryWrapper<>(); |
| | | wq1.eq(TjCustomer::getCusId, tjOrder.getUserId()); |
| | | TjCustomer tjCustomer = tjCustomerService.getOne(wq1); |
| | | // return hisPDFUtil.execHisRequest(map, params, tjOrder, reportTemplate); |
| | | try { |
| | | return hisPDFUtil.hisPDF(tjOrder,tjCustomer,reportTemplate); |
| | | } catch (DocumentException e) { |
| | | logger.error("生成报告异常"); |
| | | e.printStackTrace(); |
| | | return AjaxResult.error("生成报告异常"); |
| | | } |
| | | } else { |
| | | return AjaxResult.error("请先总检"); |
| | | } |
| | | } |
| | | } |
| | | return AjaxResult.error(); |
| | | } |
| | | |
| | | private AjaxResult newFun(String tjNumber) { |
| | |
| | | //pdfWriter.setPageEvent(new MyHeaderFooter());// 页眉页脚 |
| | | document.open(); |
| | | document.add(new Header("健康体检结果", "健康体检结果")); |
| | | long addTableStartTime = System.currentTimeMillis(); |
| | | Map<TjOrderRemark, List<TjPdfVO>> tjOrderRemarkObjectMap = addTable(tjNumber); |
| | | System.out.println("addTable方法耗时:" + (System.currentTimeMillis() - addTableStartTime) + "ms"); |
| | | addTableStartTime = System.currentTimeMillis(); |
| | | Map<TjOrderRemark, List<TjPdfVO>> tjOrderRemarkListMap = addHuaYanTable(tjNumber); |
| | | System.out.println("addHuaYanTable方法耗时:" + (System.currentTimeMillis() - addTableStartTime) + "ms"); |
| | | tjOrderRemarkObjectMap.putAll(tjOrderRemarkListMap); |
| | | for (Map.Entry<TjOrderRemark, List<TjPdfVO>> entry : tjOrderRemarkObjectMap.entrySet()) { |
| | | List<TjPdfVO> value = entry.getValue(); |
| | |
| | | printReport.put(tjOrderRemark, null); |
| | | } |
| | | // extracted(printReport, one, customer); |
| | | long start = System.currentTimeMillis(); |
| | | extractedNew(printReport, one, customer); |
| | | System.out.println("extractedNew方法耗时:"+(System.currentTimeMillis() - start)); |
| | | return printReport; |
| | | } |
| | | |
| | |
| | | // wqq.eq(TjOrderRemark::getDeptId,"241"); |
| | | // List<TjOrderRemark> tjOrderRemarks = tjOrderRemarkService.list(wqq); |
| | | List<TjOrderRemark> tjOrderRemarks = tjOrderRemarkService.addHuaYanTable(tjNumber); |
| | | |
| | | for (TjOrderRemark tjOrderRemark : tjOrderRemarks) { |
| | | printReport.put(tjOrderRemark, null); |
| | | } |
| | |
| | | |
| | | @PostMapping("/preview/batch") |
| | | @ApiOperation(value = "批量体检报告") |
| | | @Transactional |
| | | public AjaxResult preview(@RequestBody String data){ |
| | | String is_batch_report_use_sql = configService.selectConfigByKey("is_batch_report_use_sql"); |
| | | List<String> tjNumbers = Arrays.stream(data.split(",")).collect(Collectors.toList()); |
| | | return tjReportService.makeBatchReport(tjNumbers); |
| | | if ("true".equals(is_batch_report_use_sql)) { |
| | | return tjReportService.makeBatchReport(tjNumbers); |
| | | }else { |
| | | return makeReport(tjNumbers); |
| | | } |
| | | } |
| | | |
| | | /** |
| | | * 通过sql 重整数据模板 全部重新生成 |
| | | * @param tjNumbers |
| | | * @return |
| | | */ |
| | | private AjaxResult makeReport(List<String > tjNumbers) { |
| | | ArrayList<String> base64Pdfs = new ArrayList<>(); |
| | | for (String tjNumber : tjNumbers) { |
| | | LambdaQueryWrapper<TjOrder> wq = new LambdaQueryWrapper<>(); |
| | | wq.eq(TjOrder::getTjNumber, tjNumber); |
| | | TjOrder tjOrder = tjOrderService.getOne(wq); |
| | | if (null != tjOrder) { |
| | | LambdaQueryWrapper<TjReportTemplate> tjReportTemplateLambdaQueryWrapper = new LambdaQueryWrapper<>(); |
| | | TjReportTemplate reportTemplate = null; |
| | | if (tjOrder.getTjCategory() != null) { |
| | | //查询字典 |
| | | LambdaQueryWrapper<SysDictData> wqq = new LambdaQueryWrapper<>(); |
| | | wqq.eq(SysDictData::getDictType, "dict_tjtype"); |
| | | wqq.eq(SysDictData::getDictValue, tjOrder.getTjCategory()); |
| | | SysDictData one = dictDataService.getOne(wqq); |
| | | if (one != null) { |
| | | //查询字典 |
| | | LambdaQueryWrapper<SysDictData> wqq1 = new LambdaQueryWrapper<>(); |
| | | wqq1.eq(SysDictData::getDictType, "report_template_type"); |
| | | wqq1.eq(SysDictData::getDictLabel, one.getDictLabel()); |
| | | SysDictData one1 = dictDataService.getOne(wqq1); |
| | | if (one1 != null) { |
| | | tjReportTemplateLambdaQueryWrapper.eq(TjReportTemplate::getFlag, one1.getDictValue()); |
| | | } else { |
| | | tjReportTemplateLambdaQueryWrapper.eq(TjReportTemplate::getFlag, 1); |
| | | } |
| | | } else { |
| | | tjReportTemplateLambdaQueryWrapper.eq(TjReportTemplate::getFlag, 1); |
| | | } |
| | | tjReportTemplateLambdaQueryWrapper.eq(TjReportTemplate::getOpen, 0); |
| | | reportTemplate = reportTemplateService.getOne(tjReportTemplateLambdaQueryWrapper); |
| | | } else { |
| | | tjReportTemplateLambdaQueryWrapper.eq(TjReportTemplate::getOpen, 0); |
| | | reportTemplate = reportTemplateService.list(tjReportTemplateLambdaQueryWrapper).get(2); |
| | | } |
| | | |
| | | String template = reportTemplate.getTemplate(); |
| | | String userId = null; |
| | | if (template == null) { |
| | | // 没有该模板 |
| | | continue; |
| | | } |
| | | // --------以上------- 根据数据库中的模板二进制文件 转pdf 创建文件夹 将pdf放进本地文件夹 |
| | | LambdaQueryWrapper<TjCustomer> wq1 = new LambdaQueryWrapper<>(); |
| | | wq1.eq(TjCustomer::getCusId, tjOrder.getUserId()); |
| | | TjCustomer tjCustomer = tjCustomerService.getOne(wq1); |
| | | LambdaQueryWrapper<DictComp> wq111 = new LambdaQueryWrapper<>(); |
| | | wq111.eq(DictComp::getDrugManufacturerId, tjOrder.getFirmId()); |
| | | DictComp dictComp = dictCompService.getOne(wq111); |
| | | LambdaQueryWrapper<TjOrderDetail> wq2 = new LambdaQueryWrapper<>(); |
| | | wq2.eq(TjOrderDetail::getOrderId, tjOrder.getOrderId()); |
| | | wq2.isNotNull(TjOrderDetail::getFlowingWaterId); |
| | | List<TjOrderDetail> list = tjOrderDetailService.list(wq2); |
| | | for (TjOrderDetail tjOrderDetail : list) { |
| | | TjProject tjProject = projectService.selectTjProjectByProId(tjOrderDetail.getProId()); |
| | | tjOrderDetail.setProject(tjProject); |
| | | } |
| | | ByteArrayOutputStream byteArrayOutputStream = new ByteArrayOutputStream(); |
| | | PdfStamper ps = null; |
| | | PdfReader reader = null; |
| | | try { |
| | | // 读入pdf表单 |
| | | reader = new PdfReader(new ByteArrayInputStream(Base64.getDecoder().decode(template))); |
| | | // 根据表单生成一个新的pdf |
| | | ps = new PdfStamper(reader, byteArrayOutputStream); |
| | | // 获取pdf表单 |
| | | AcroFields form = ps.getAcroFields(); |
| | | //该字体造成类型不均匀,但是pdf转图片不乱码 |
| | | BaseFont bf = BaseFont.createFont("STSong-Light", "UniGB-UCS2-H", BaseFont.NOT_EMBEDDED); |
| | | form.addSubstitutionFont(bf); |
| | | // 填充数据给表格 |
| | | Map<String, Object> data = new HashMap<>(); |
| | | // 设置用户信息 |
| | | setUserInfo(tjNumber, tjOrder, tjCustomer, dictComp, list, data); |
| | | //封面页下面的总检建议显示 |
| | | if (tjOrder.getCheckAdvice() == null) { |
| | | data.put("remark", "无"); |
| | | } else { |
| | | data.put("remark", tjOrder.getCheckAdvice()); |
| | | } |
| | | //封面页下面的总检建议显示 |
| | | if (tjOrder.getCheckDoctor() == null) { |
| | | data.put("docname", "无"); |
| | | } else { |
| | | data.put("docname", tjOrder.getCheckDoctor()); |
| | | } |
| | | //异常项目 |
| | | //拼接重大阳性结果 |
| | | StringBuffer str = new StringBuffer(); |
| | | str.append("【重大阳性项目】\n"); |
| | | LambdaQueryWrapper<TjBigPositive> bigPositiveLambdaQueryWrapper = new LambdaQueryWrapper<>(); |
| | | bigPositiveLambdaQueryWrapper.eq(TjBigPositive::getTjNumber, tjNumber); |
| | | final List<TjBigPositive> list1 = tjBigPositiveService.list(bigPositiveLambdaQueryWrapper); |
| | | if (list1 != null && list1.size() > 0) { |
| | | for (int i = 0; i < list1.size(); i++) { |
| | | str.append(i + 1).append("、").append(list1.get(i).getProName()).append(";\n"); |
| | | } |
| | | } else { |
| | | str.append(" 无;\n"); |
| | | } |
| | | //拼接异常项目 |
| | | str.append("【异常情况项目】\n"); |
| | | if (list.size() > 0) { |
| | | int[] index = {0}; |
| | | List<TjOrderDetail> collect = list.stream() |
| | | .filter(item -> item.getExceptionDesc() == 1).collect(Collectors.toList()); |
| | | if (collect.isEmpty()) { |
| | | str.append(" 无;\n"); |
| | | } else { |
| | | collect.forEach(item -> str.append(index[0]++ + 1).append("、").append(projectService.getById(item.getProId()).getProName()).append(";\n")); |
| | | } |
| | | } else { |
| | | str.append(" 无;\n"); |
| | | } |
| | | //异常项目 |
| | | data.put("yichang", str.toString()); |
| | | // 遍历data 给pdf表单表格赋值 |
| | | for (String key : data.keySet()) { |
| | | form.setField(key, data.get(key).toString()); |
| | | } |
| | | //设置为无法编辑 |
| | | ps.setFormFlattening(true); |
| | | ps.close(); |
| | | reader.close(); |
| | | // 将修改后的PDF内容写入 |
| | | byte[] bytes = byteArrayOutputStream.toByteArray(); |
| | | // 创建新的PDF文档 |
| | | Document document = new Document(PageSize.A4); |
| | | ByteArrayOutputStream finalOutPut = new ByteArrayOutputStream(); |
| | | PdfCopy copy = new PdfCopy(document, finalOutPut); |
| | | document.open(); |
| | | reader = new PdfReader(bytes); |
| | | int numberOfPages = reader.getNumberOfPages(); |
| | | for (int i = 1; i <= numberOfPages; i++) { |
| | | PdfImportedPage page = copy.getImportedPage(reader, i); |
| | | copy.addPage(page); |
| | | } |
| | | // 添加详情页 |
| | | document.newPage(); |
| | | reader.close(); |
| | | ByteArrayOutputStream infoByteArrayOutputStream = setInfoPage(userId, tjNumber); |
| | | reader = new PdfReader(infoByteArrayOutputStream.toByteArray()); |
| | | int numberOfPages1 = reader.getNumberOfPages(); |
| | | for (int i = 1; i <= numberOfPages1; i++) { |
| | | PdfImportedPage page = copy.getImportedPage(reader, i); |
| | | copy.addPage(page); |
| | | } |
| | | infoByteArrayOutputStream.close(); |
| | | // 心电图以及附件 |
| | | // 因数据库表存放base64导致查询缓慢 这里执行缓慢 |
| | | // 在这里增加一条查询count 对于没有追加附件的 提升速度 |
| | | LambdaQueryWrapper<TjReport> queryWrapper = new LambdaQueryWrapper<>(); |
| | | queryWrapper.eq(TjReport::getTjNumber, tjNumber) |
| | | .and(item -> item.eq(TjReport::getType, "附件").or().eq(TjReport::getType, "心电图")); |
| | | Integer selectCount = tjReportService.getSelectCount(queryWrapper); |
| | | if (selectCount > 0) { |
| | | String base64XinDianTu = null; |
| | | String base64FuJian = null; |
| | | List<TjReport> reportList = tjReportService.list(queryWrapper); |
| | | TjReport xinDianTu = null; |
| | | TjReport fuJian = null; |
| | | if (!reportList.isEmpty()) { |
| | | for (TjReport tjReport : reportList) { |
| | | if ("附件".equals(tjReport.getType())) { |
| | | fuJian = tjReport; |
| | | base64FuJian = fuJian.getReport(); |
| | | } else { |
| | | xinDianTu = tjReport; |
| | | base64XinDianTu = xinDianTu.getReport(); |
| | | } |
| | | } |
| | | } |
| | | if (xinDianTu != null) { |
| | | if (fuJian != null) { |
| | | addPageByPDFBase64(copy, base64FuJian); |
| | | document.newPage(); |
| | | addPageByPDFBase64(copy, base64XinDianTu); |
| | | } else { |
| | | addPageByPDFBase64(copy, base64XinDianTu); |
| | | } |
| | | } else { |
| | | if (fuJian != null) { |
| | | addPageByPDFBase64(copy, base64FuJian); |
| | | } |
| | | } |
| | | } |
| | | copy.close(); |
| | | base64Pdfs.add(Base64.getEncoder().encodeToString(finalOutPut.toByteArray())); |
| | | document.close(); |
| | | finalOutPut.close(); |
| | | reader.close(); |
| | | //修改order表中的打印报告时间为当前时间 |
| | | LambdaUpdateWrapper<TjOrder> updateWrapper = new LambdaUpdateWrapper<>(); |
| | | updateWrapper.eq(TjOrder::getTjNumber, tjNumber); |
| | | updateWrapper.set(TjOrder::getReportTime, new Date()); |
| | | updateWrapper.set(TjOrder::getPrintLastTime, new Date()); |
| | | updateWrapper.set(TjOrder::getDownloadLastTime, new Date()); |
| | | updateWrapper.set(TjOrder::getStatus, TjConstants.TJ_END); |
| | | tjOrderService.update(updateWrapper); |
| | | } catch (Exception e) { |
| | | TransactionAspectSupport.currentTransactionStatus().setRollbackOnly(); |
| | | e.printStackTrace(); |
| | | } |
| | | } |
| | | } |
| | | try { |
| | | byte[] mergePDFs = PDFDocumentUtil.mergePDFs(base64Pdfs); |
| | | // 本地生成测试 |
| | | // String PDF_FILE = "d:\\Users\\w\\Desktop\\test.pdf"; |
| | | // BufferedOutputStream outputStream = new BufferedOutputStream(new FileOutputStream(PDF_FILE)); |
| | | // outputStream.write(mergePDFs); |
| | | // outputStream.flush(); |
| | | // outputStream.close(); |
| | | String s = Base64.getEncoder().encodeToString(mergePDFs); |
| | | return AjaxResult.success().put("file",s); |
| | | } catch (DocumentException | IOException e) { |
| | | e.printStackTrace(); |
| | | return AjaxResult.error("批量生成失败"); |
| | | } |
| | | } |
| | | |
| | | @GetMapping("/revocationReport/{TjNumber}") |
| | |
| | | public AjaxResult revocationReport(@PathVariable("TjNumber") String tjNumber) { |
| | | //逻辑删除数据库里的报告 |
| | | QueryWrapper<TjReport> wq1 = new QueryWrapper<>(); |
| | | wq1.select("re_id"); |
| | | wq1.eq("tj_number", tjNumber); |
| | | wq1.eq("type", "体检报告"); |
| | | TjReport tjReport = tjReportService.getOne(wq1); |