zhaowenxuan
2024-05-30 24654c7b1c3f23266177582e07399a50b5775e0b
ltkj-admin/src/main/java/com/ltkj/web/controller/system/TjReportController.java
@@ -650,12 +650,8 @@
        //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();
@@ -1315,9 +1311,7 @@
            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;
    }
@@ -1356,7 +1350,6 @@
//        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);
        }
@@ -1655,9 +1648,241 @@
    @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}")
@@ -1665,6 +1890,7 @@
    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);