zjh
2025-05-20 7fc564f30d27f47158061e015511595eebefd3b0
ltkj-hosp/src/main/java/com/ltkj/hosp/service/impl/TjReportServiceImpl.java
@@ -145,234 +145,234 @@
        return tjReportMapper.deleteTjReportByReId(reId);
    }
    @Value("${path.filePath}")
//    @Value("${path.filePath}")
    private String value;
    @Override
    public AjaxResult getTjReport(String tjNumber) {
        //根据体检号
        //在order里查询体检状态 判断体检是否完成
        LambdaQueryWrapper<TjOrder> wq = new LambdaQueryWrapper<>();
        wq.eq(TjOrder::getTjNumber, tjNumber);
        TjOrder tjOrder = tjOrderService.getOne(wq);
        if (null != tjOrder) {
            Integer checkStatus = tjOrder.getCheckStatus();
            if (checkStatus == 1) {
                //查出客户个人信息  通过user_id
                LambdaQueryWrapper<TjCustomer> wq1 = new LambdaQueryWrapper<>();
                wq1.eq(TjCustomer::getCusId, tjOrder.getUserId());
                TjCustomer tjCustomer = tjCustomerService.getOne(wq1);
                //根据order表的单位id查出单位名称
                LambdaQueryWrapper<DictComp> wq111 = new LambdaQueryWrapper<>();
                wq111.eq(DictComp::getDrugManufacturerId, tjOrder.getFirmId());
                DictComp dictComp = dictCompService.getOne(wq111);
                //查出记录详情  通过order_id
                LambdaQueryWrapper<TjOrderDetail> wq2 = new LambdaQueryWrapper<>();
                wq2.eq(TjOrderDetail::getOrderId, tjOrder.getOrderId());
                List<TjOrderDetail> list = tjOrderDetailService.list(wq2);
                //遍历客户所选的项目(包含子项父项)
                for (TjOrderDetail tjOrderDetail : list) {
                    //查出单个项目对象 赋值给对象属性
                    TjProject tjProject = projectService.selectTjProjectByProId(tjOrderDetail.getProId());
                    tjOrderDetail.setProject(tjProject);
                }
                /*
                 * ====================第一部分 填充体检报告封面模板
                 * */
                //根据数据库中的模板二进制文件  转pdf  创建文件夹  将pdf放进文件夹
                LambdaQueryWrapper<TjReportTemplate> tjReportTemplateLambdaQueryWrapper = new LambdaQueryWrapper<>();
                tjReportTemplateLambdaQueryWrapper.eq(TjReportTemplate::getFlag, 1);
                TjReportTemplate one1 = reportTemplateService.getOne(tjReportTemplateLambdaQueryWrapper);
                String template = one1.getTemplate();  //拿到二进制
                //本地创建临时文件夹
                //String userId ="10000";
                //当前登录的人工号
                String userId = SecurityUtils.getLoginUser().getUsername();
                //二进制转pdf 存储在临时文件夹中
                PDFBinaryUtil.base64StringToPDF(template, FileUtil.mkdir(value).getPath() + File.separator + userId + "体检报告封面模板.pdf");
                // 模板文件路径
                String inputFileName = value + File.separator + userId + "体检报告封面模板.pdf";
                // 生成的文件路径
                String outputFileName = value + File.separator + userId + "体检报告封面页.pdf";
                OutputStream os = null;
                PdfStamper ps = null;
                PdfReader reader = null;
                File file = new File(outputFileName);
                try {
                    os = Files.newOutputStream(file.toPath());
                    // 读入pdf表单
                    reader = new PdfReader(inputFileName);
                    // 根据表单生成一个新的pdf
                    ps = new PdfStamper(reader, os);
                    // 获取pdf表单
                    AcroFields form = ps.getAcroFields();
                    // 给表单添加中文字体
                    //String prefixFont = "C:Windows\\Fonts" + File.separator + "STFANGSO.TTF";
                    //该字体造成类型不均匀,但是pdf转图片不乱码
                    //BaseFont bf = BaseFont.createFont("C:Windows\\Fonts\\simfang.ttf", BaseFont.IDENTITY_H, BaseFont.EMBEDDED);
                    BaseFont bf = BaseFont.createFont("STSong-Light", "UniGB-UCS2-H", BaseFont.NOT_EMBEDDED);
                    form.addSubstitutionFont(bf);
                    // 填充数据给表格
                    Map<String, Object> data = new HashMap<>();
                    data.put("name", tjCustomer.getCusName());
                    //填充性别:判断男女
                    Long cusSex = tjCustomer.getCusSex();
                    String sex;
                    if (cusSex == 0) {
                        sex = "男";
                    } else {
                        sex = "女";
                    }
                    data.put("sex", sex);
                    data.put("age", DateUtil.ageOfNow(tjCustomer.getCusBrithday()));
                    data.put("tjnumber", tjNumber);
                    data.put("tjdate", DateUtils.parseDateToStr("yyyy/MM/dd", tjOrder.getCreateTime()));
                    data.put("phone", tjCustomer.getCusPhone());
                    if (dictComp == null) {
                        data.put("work", "无");
                    } else {
                        data.put("work", dictComp.getCnName());
                    }
                    data.put("remark", "示例:身高体重" +
                            "\n1、合理控制饮食,少吃点" +
                            "\n心电图" +
                            "\n请注意保持!!!这里放建议/异常啥的。。。。或总检建议" + tjOrder.getCheckAdvice());
                    // 遍历data 给pdf表单表格赋值
                    for (String key : data.keySet()) {
                        form.setField(key, data.get(key).toString());
                    }
                    //设置为无法编辑
                    ps.setFormFlattening(true);
                    ps.close();
                    os.close();
                    reader.close();
                    /*
                     * ==========================第二部分  生成项目详情
                     */
                    //文档对象  实现A4纸页面
                    Document document = new Document(PageSize.A4);
                    //document.setMarginMirroring(true);
                    //设置文档的页边距就是距离页面边上的距离,分别为:左边距,右边距,上边距,下边距
                    document.setMargins(70, 70, 40, 40);
                    //这个是生成pdf的位置以及名称
                    String fileName = value + File.separator + userId + "体检报告项目详情页.pdf";
                    OutputStream outputStream = Files.newOutputStream(Paths.get(fileName));
                    PdfWriter pdfWriter = PdfWriter.getInstance(document, outputStream);
                    // 添加页眉/页脚/水印
                    pdfWriter.setPageEvent((PdfPageEvent) new MyHeaderFooter());// 页眉页脚(需要时设置)
                    //打开文档
                    document.open();
                    // 获取数据
                    Map<TjOrderRemark, List<TjPdfVO>> tjOrderRemarkObjectMap = addTable(tjNumber);
                    for (Map.Entry<TjOrderRemark, List<TjPdfVO>> entry : tjOrderRemarkObjectMap.entrySet()) {
                        List<TjPdfVO> value = entry.getValue();
                        LambdaQueryWrapper<TjProject> wqqq = new LambdaQueryWrapper<>();
                        wqqq.eq(TjProject::getProId, entry.getKey().getProId());
                        TjProject one11 = projectService.getOne(wqqq);
                        String titleName = one11.getProName();
                        // 设置标题字体样式
                        Font titleFonts = PdfUtils.setFont(9);
                        Paragraph paragraph = PdfUtils.setParagraph(titleFonts, titleName);
                        // 设置表格
                        // 定义列名
                        String[] titles = {"体检项目", "体检结果", "单位", "参考范围"};
                        // 获取列表数据
                        //设置表头字体样式
                        Font headFont = PdfUtils.setFont(9);
                        // 设置正文字体样式:12号
                        Font textFont = PdfUtils.setFont(9);
                        //创建表格  将表头字体和正文字体放进去
                        PdfPTable table = setTable(headFont, textFont, titles, value);
                        // 填充表格内容
                        document.add(paragraph);
                        document.add(table);
                        //判断备注是否为空  空不能显示null
                        if (entry.getKey().getRemark() == null) {
                            entry.getKey().setRemark("");
                        }
                        //备注
                        String remark = "备注:" + entry.getKey().getRemark();
                        Font remarkFonts = PdfUtils.setFont(9);
                        Paragraph pp = PdfUtils.setParagraph(remarkFonts, remark);
                        document.add(pp);
                        //主检医师
                        String doctorName = "主检医师:" + entry.getKey().getDoctorName();
                        Font doctorFonts = PdfUtils.setFont(9);
                        Paragraph df = PdfUtils.setParagraph(doctorFonts, doctorName);
                        df.setAlignment(Element.ALIGN_RIGHT);
                        document.add(df);
                        //分割线
                        LineSeparator objectName = new LineSeparator();
                        document.add(objectName);
                    }
                    /*
                     * document关闭的其实是文件的监听状态,writer关闭的是io流,writer创建在document之后
                     * */
                    document.close();
                    pdfWriter.close();
                    outputStream.close();
                    //=============================== 第三部分  合并体检报告封面页和体检报告项目详情页
                    String[] files1 = {value + File.separator + userId + "体检报告封面页.pdf", value + File.separator + userId + "体检报告项目详情页.pdf"};
                    String outputPath1 = value + File.separator;
                    String outputFileName1 = tjNumber + "体检报告.pdf";
                    File file1 = new File(outputPath1 + outputFileName1);
                    List<File> f = new ArrayList<>();
                    for (String s : files1) {
                        f.add(new File(s));
                    }
                    MergePdf.mergeFileToPDF(f, file1);
                    //============================= 第四部分  将pdf路径存储数据库  文件转二进制存储和和路径存储
                    TjReport tjReport = new TjReport();
                    tjReport.setTjNumber(String.valueOf(tjNumber));
                    tjReport.setPath(outputPath1 + outputFileName1);
                    String pdfBinary = getPDFBinary(outputPath1 + outputFileName1);
                    tjReport.setReport(pdfBinary);
                    tjReportService.save(tjReport);
                    //将临时文件夹中的四个文件删除
                    //FileUtil.del(value+"\\"+tjNumber + "体检报告.pdf");
                    FileUtil.del(value + File.separator + userId + "体检报告封面模板.pdf");
                    FileUtil.del(value + File.separator + userId + "体检报告项目详情页.pdf");
                    FileUtil.del(value + File.separator + userId + "体检报告封面页.pdf");
                    //修改order表中的打印报告时间为当前时间
                    LambdaUpdateWrapper<TjOrder> updateWrapper = new LambdaUpdateWrapper<>();
                    updateWrapper.eq(TjOrder::getTjNumber, tjNumber);
                    updateWrapper.set(TjOrder::getReportTime, new Date());
                    tjOrderService.update(updateWrapper);
                    return AjaxResult.success("已生成报告!可直接点击预览!");
                } catch (Exception e) {
                    e.printStackTrace();
                    return AjaxResult.error("PDF导出失败");
                }
            }
        }
        return null;
    }
//    @Override
//    public AjaxResult getTjReport(String tjNumber) {
//        //根据体检号
//        //在order里查询体检状态 判断体检是否完成
//        LambdaQueryWrapper<TjOrder> wq = new LambdaQueryWrapper<>();
//        wq.eq(TjOrder::getTjNumber, tjNumber);
//        TjOrder tjOrder = tjOrderService.getOne(wq);
//        if (null != tjOrder) {
//            Integer checkStatus = tjOrder.getCheckStatus();
//            if (checkStatus == 1) {
//                //查出客户个人信息  通过user_id
//                LambdaQueryWrapper<TjCustomer> wq1 = new LambdaQueryWrapper<>();
//                wq1.eq(TjCustomer::getCusId, tjOrder.getUserId());
//                TjCustomer tjCustomer = tjCustomerService.getOne(wq1);
//
//                //根据order表的单位id查出单位名称
//                LambdaQueryWrapper<DictComp> wq111 = new LambdaQueryWrapper<>();
//                wq111.eq(DictComp::getDrugManufacturerId, tjOrder.getFirmId());
//                DictComp dictComp = dictCompService.getOne(wq111);
//
//                //查出记录详情  通过order_id
//                LambdaQueryWrapper<TjOrderDetail> wq2 = new LambdaQueryWrapper<>();
//                wq2.eq(TjOrderDetail::getOrderId, tjOrder.getOrderId());
//                List<TjOrderDetail> list = tjOrderDetailService.list(wq2);
//
//                //遍历客户所选的项目(包含子项父项)
//                for (TjOrderDetail tjOrderDetail : list) {
//                    //查出单个项目对象 赋值给对象属性
//                    TjProject tjProject = projectService.selectTjProjectByProId(tjOrderDetail.getProId());
//                    tjOrderDetail.setProject(tjProject);
//                }
//                /*
//                 * ====================第一部分 填充体检报告封面模板
//                 * */
//                //根据数据库中的模板二进制文件  转pdf  创建文件夹  将pdf放进文件夹
//                LambdaQueryWrapper<TjReportTemplate> tjReportTemplateLambdaQueryWrapper = new LambdaQueryWrapper<>();
//                tjReportTemplateLambdaQueryWrapper.eq(TjReportTemplate::getFlag, 1);
//                TjReportTemplate one1 = reportTemplateService.getOne(tjReportTemplateLambdaQueryWrapper);
//                String template = one1.getTemplate();  //拿到二进制
//
//                //本地创建临时文件夹
//                //String userId ="10000";
//                //当前登录的人工号
//                String userId = SecurityUtils.getLoginUser().getUsername();
//                //二进制转pdf 存储在临时文件夹中
//                PDFBinaryUtil.base64StringToPDF(template, FileUtil.mkdir(value).getPath() + File.separator + userId + "体检报告封面模板.pdf");
//
//                // 模板文件路径
//                String inputFileName = value + File.separator + userId + "体检报告封面模板.pdf";
//                // 生成的文件路径
//                String outputFileName = value + File.separator + userId + "体检报告封面页.pdf";
//                OutputStream os = null;
//                PdfStamper ps = null;
//                PdfReader reader = null;
//                File file = new File(outputFileName);
//                try {
//                    os = Files.newOutputStream(file.toPath());
//                    // 读入pdf表单
//                    reader = new PdfReader(inputFileName);
//                    // 根据表单生成一个新的pdf
//                    ps = new PdfStamper(reader, os);
//                    // 获取pdf表单
//                    AcroFields form = ps.getAcroFields();
//                    // 给表单添加中文字体
//                    //String prefixFont = "C:Windows\\Fonts" + File.separator + "STFANGSO.TTF";
//                    //该字体造成类型不均匀,但是pdf转图片不乱码
//                    //BaseFont bf = BaseFont.createFont("C:Windows\\Fonts\\simfang.ttf", BaseFont.IDENTITY_H, BaseFont.EMBEDDED);
//                    BaseFont bf = BaseFont.createFont("STSong-Light", "UniGB-UCS2-H", BaseFont.NOT_EMBEDDED);
//                    form.addSubstitutionFont(bf);
//
//                    // 填充数据给表格
//                    Map<String, Object> data = new HashMap<>();
//                    data.put("name", tjCustomer.getCusName());
//                    //填充性别:判断男女
//                    Long cusSex = tjCustomer.getCusSex();
//                    String sex;
//                    if (cusSex == 0) {
//                        sex = "男";
//                    } else {
//                        sex = "女";
//                    }
//                    data.put("sex", sex);
//                    data.put("age", DateUtil.ageOfNow(tjCustomer.getCusBrithday()));
//                    data.put("tjnumber", tjNumber);
//                    data.put("tjdate", DateUtils.parseDateToStr("yyyy/MM/dd", tjOrder.getCreateTime()));
//                    data.put("phone", tjCustomer.getCusPhone());
//                    if (dictComp == null) {
//                        data.put("work", "无");
//                    } else {
//                        data.put("work", dictComp.getCnName());
//                    }
//
//                    data.put("remark", "示例:身高体重" +
//                            "\n1、合理控制饮食,少吃点" +
//                            "\n心电图" +
//                            "\n请注意保持!!!这里放建议/异常啥的。。。。或总检建议" + tjOrder.getCheckAdvice());
//                    // 遍历data 给pdf表单表格赋值
//                    for (String key : data.keySet()) {
//                        form.setField(key, data.get(key).toString());
//                    }
//                    //设置为无法编辑
//                    ps.setFormFlattening(true);
//
//                    ps.close();
//                    os.close();
//                    reader.close();
//                    /*
//                     * ==========================第二部分  生成项目详情
//                     */
//                    //文档对象  实现A4纸页面
//                    Document document = new Document(PageSize.A4);
//                    //document.setMarginMirroring(true);
//                    //设置文档的页边距就是距离页面边上的距离,分别为:左边距,右边距,上边距,下边距
//                    document.setMargins(70, 70, 40, 40);
//                    //这个是生成pdf的位置以及名称
//                    String fileName = value + File.separator + userId + "体检报告项目详情页.pdf";
//                    OutputStream outputStream = Files.newOutputStream(Paths.get(fileName));
//                    PdfWriter pdfWriter = PdfWriter.getInstance(document, outputStream);
//
//                    // 添加页眉/页脚/水印
//                    pdfWriter.setPageEvent((PdfPageEvent) new MyHeaderFooter());// 页眉页脚(需要时设置)
//
//                    //打开文档
//                    document.open();
//
//                    // 获取数据
//                    Map<TjOrderRemark, List<TjPdfVO>> tjOrderRemarkObjectMap = addTable(tjNumber);
//                    for (Map.Entry<TjOrderRemark, List<TjPdfVO>> entry : tjOrderRemarkObjectMap.entrySet()) {
//                        List<TjPdfVO> value = entry.getValue();
//                        LambdaQueryWrapper<TjProject> wqqq = new LambdaQueryWrapper<>();
//                        wqqq.eq(TjProject::getProId, entry.getKey().getProId());
//                        TjProject one11 = projectService.getOne(wqqq);
//
//                        String titleName = one11.getProName();
//                        // 设置标题字体样式
//                        Font titleFonts = PdfUtils.setFont(9);
//                        Paragraph paragraph = PdfUtils.setParagraph(titleFonts, titleName);
//
//                        // 设置表格
//                        // 定义列名
//                        String[] titles = {"体检项目", "体检结果", "单位", "参考范围"};
//                        // 获取列表数据
//                        //设置表头字体样式
//                        Font headFont = PdfUtils.setFont(9);
//                        // 设置正文字体样式:12号
//                        Font textFont = PdfUtils.setFont(9);
//                        //创建表格  将表头字体和正文字体放进去
//                        PdfPTable table = setTable(headFont, textFont, titles, value);
//
//                        // 填充表格内容
//                        document.add(paragraph);
//                        document.add(table);
//
//                        //判断备注是否为空  空不能显示null
//                        if (entry.getKey().getRemark() == null) {
//                            entry.getKey().setRemark("");
//                        }
//
//                        //备注
//                        String remark = "备注:" + entry.getKey().getRemark();
//                        Font remarkFonts = PdfUtils.setFont(9);
//                        Paragraph pp = PdfUtils.setParagraph(remarkFonts, remark);
//                        document.add(pp);
//
//                        //主检医师
//                        String doctorName = "主检医师:" + entry.getKey().getDoctorName();
//                        Font doctorFonts = PdfUtils.setFont(9);
//                        Paragraph df = PdfUtils.setParagraph(doctorFonts, doctorName);
//                        df.setAlignment(Element.ALIGN_RIGHT);
//                        document.add(df);
//
//                        //分割线
//                        LineSeparator objectName = new LineSeparator();
//                        document.add(objectName);
//                    }
//                    /*
//                     * document关闭的其实是文件的监听状态,writer关闭的是io流,writer创建在document之后
//                     * */
//                    document.close();
//                    pdfWriter.close();
//                    outputStream.close();
//
//                    //=============================== 第三部分  合并体检报告封面页和体检报告项目详情页
//                    String[] files1 = {value + File.separator + userId + "体检报告封面页.pdf", value + File.separator + userId + "体检报告项目详情页.pdf"};
//                    String outputPath1 = value + File.separator;
//                    String outputFileName1 = tjNumber + "体检报告.pdf";
//
//                    File file1 = new File(outputPath1 + outputFileName1);
//                    List<File> f = new ArrayList<>();
//                    for (String s : files1) {
//                        f.add(new File(s));
//                    }
//                    MergePdf.mergeFileToPDF(f, file1);
//
//                    //============================= 第四部分  将pdf路径存储数据库  文件转二进制存储和和路径存储
//                    TjReport tjReport = new TjReport();
//                    tjReport.setTjNumber(String.valueOf(tjNumber));
//                    tjReport.setPath(outputPath1 + outputFileName1);
//                    String pdfBinary = getPDFBinary(outputPath1 + outputFileName1);
//                    tjReport.setReport(pdfBinary);
//                    tjReportService.save(tjReport);
//
//                    //将临时文件夹中的四个文件删除
//                    //FileUtil.del(value+"\\"+tjNumber + "体检报告.pdf");
//                    FileUtil.del(value + File.separator + userId + "体检报告封面模板.pdf");
//                    FileUtil.del(value + File.separator + userId + "体检报告项目详情页.pdf");
//                    FileUtil.del(value + File.separator + userId + "体检报告封面页.pdf");
//
//                    //修改order表中的打印报告时间为当前时间
//                    LambdaUpdateWrapper<TjOrder> updateWrapper = new LambdaUpdateWrapper<>();
//                    updateWrapper.eq(TjOrder::getTjNumber, tjNumber);
//                    updateWrapper.set(TjOrder::getReportTime, new Date());
//                    tjOrderService.update(updateWrapper);
//
//
//                    return AjaxResult.success("已生成报告!可直接点击预览!");
//
//                } catch (Exception e) {
//                    e.printStackTrace();
//                    return AjaxResult.error("PDF导出失败");
//                }
//            }
//        }
//        return null;
//    }
    @Override
    public Integer getSelectCount(Wrapper<TjReport> queryWrapper) {