zjh
2025-01-20 73a816fd2b1e29c25d615c85ce34b12b55c16ccf
ltkj-admin/src/main/java/com/ltkj/web/controller/system/TjReportController.java
@@ -2,10 +2,10 @@
import java.io.*;
import java.net.URL;
import java.nio.charset.StandardCharsets;
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;
@@ -20,29 +20,31 @@
import com.itextpdf.text.*;
import com.itextpdf.text.pdf.*;
import com.itextpdf.text.pdf.draw.LineSeparator;
import com.ltkj.common.annotation.Log;
import com.ltkj.common.core.domain.entity.SysDictData;
import com.ltkj.common.utils.DateUtils;
import com.ltkj.common.utils.PDFDocumentUtil;
import com.ltkj.common.utils.SecurityUtils;
import com.ltkj.common.utils.StringUtils;
import com.ltkj.framework.config.MatchUtils;
import com.ltkj.hosp.domain.*;
import com.ltkj.hosp.service.*;
import com.ltkj.hosp.vodomain.UpdateOrderRemarkVo;
import com.ltkj.mall.mallOrderUtils.TjConstants;
import com.ltkj.system.service.ISysConfigService;
import com.ltkj.system.service.ISysDictDataService;
import com.ltkj.system.service.ISysUserService;
import com.ltkj.web.config.pdfutils.MergePdf;
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;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.transaction.annotation.Propagation;
import org.springframework.transaction.annotation.Transactional;
import org.springframework.transaction.interceptor.TransactionAspectSupport;
import org.springframework.web.bind.annotation.*;
import com.ltkj.common.core.controller.BaseController;
import com.ltkj.common.core.domain.AjaxResult;
@@ -55,9 +57,10 @@
 * @author ltkj
 * @date 2022-12-06
 */
@Slf4j
@RestController
@RequestMapping("/system/report")
@Api(tags = "体检报告")
@Api(tags = "AAAA_体检报告")
@Transactional
public class TjReportController extends BaseController {
    @Resource
@@ -95,21 +98,28 @@
    private ISysDictDataService dictDataService;
    @Resource
    private ITbTransitionService transitionService;
    @Autowired
    private ITjBigPositiveService tjBigPositiveService;
    @Autowired
    private HisPDFUtil hisPDFUtil;
    @Autowired
    private IDictHospService dictHospService;
    @Autowired
    private ITjReportPrintService printService;
    @GetMapping("/savePdf")
    @ApiOperation(value = "从本地存储模板到数据库")
    public AjaxResult savePdf() {
        //从文件地址读入PDF文件  仅存储一次
        String base64String = PDFBinaryUtil.getPDFBinary("D:\\Tjreport\\体检模板5.pdf");
        String base64String = PDFBinaryUtil.getPDFBinary(configService.selectConfigByKey("default_pdf5Template"));
        reportTemplateService.remove(new LambdaQueryWrapper<TjReportTemplate>().eq(TjReportTemplate::getName,"体检报告模板5"));
        TjReportTemplate tem = new TjReportTemplate();
        tem.setName("体检报告模板5");
        tem.setRemark("体检报告模板5");
        tem.setTemplate(base64String);
        tem.setFlag("1");
        tem.setOpen("0");
        tem.setCreateTime(DateUtil.date());
        final boolean save = reportTemplateService.save(tem);
        if (save) {
            return AjaxResult.success("保存成功");
@@ -269,7 +279,7 @@
    @ApiOperation(value = "打印体检报告为pdf")
    @Transactional
    public AjaxResult toPdf(@PathVariable("TjNumber") @ApiParam(value = "体检号") String tjNumber) {
        AjaxResult error = null;
        //        AjaxResult error = null;
        // 之前的代码 优化速度
//        System.out.println("----------------------------------oldFun开始-------------------------------------------------------");
//        error = oldFun(tjNumber);
@@ -285,15 +295,195 @@
//        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("该用户体检未完成,不能打印报告!!!");
        TjOrder tjOrder = tjOrderService.getOrderByTjNum(tjNumber);
        if (null != tjOrder) {
        String config = configService.selectConfigByKey("sfjcwjhyqxm");
        if(null != config && config.equalsIgnoreCase("Y")){
            int num = tjOrderRemarkService.getTjYqOrderRemarkByTjNum(tjNumber);
            if (num > 0) {
                tjOrder.setReportTime(null);
                tjOrder.setCheckTime(null);
                tjOrder.setCheckStatus(0);
                tjOrder.setPrintLastTime(null);
                tjOrderService.updateById(tjOrder);
                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 (tjOrder.getReportTime() !=null ||  count != 0  ) {
//                tjOrder.setReportTime(null);
//                tjOrder.setCheckTime(null);
//                tjOrder.setCheckStatus(0);
//                tjOrder.setPrintLastTime(null);
//                tjOrderService.updateById(tjOrder);
                return AjaxResult.error("该客户报告已生成!不能重复生成!可直接预览或打印!");
            }
            LambdaQueryWrapper<TjReportTemplate> tjReportTemplateLambdaQueryWrapper = new LambdaQueryWrapper<>();
            tjReportTemplateLambdaQueryWrapper.eq(TjReportTemplate::getFlag, 1);
            tjReportTemplateLambdaQueryWrapper.eq(TjReportTemplate::getOpen, 0);
            TjReportTemplate reportTemplate = reportTemplateService.getOne(tjReportTemplateLambdaQueryWrapper);
//            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) {
                if ("报表".equals(reportTemplate.getPrint())) {
                    TjReport tjReport = new TjReport();
                    tjReport.setTjNumber(String.valueOf(tjNumber));
                    tjReport.setPath(reportTemplate.getUrl() + "?tjNum=" + tjNumber);
                    tjReport.setType("体检报告");
                    tjReport.setPrint("报表");
                    tjReportService.save(tjReport);
                    //修改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);
                    return AjaxResult.success("已生成报告!可直接点击预览!");
                }
//                String hisRegistrationId = tjOrder.getCardId();
//                Date createTime = tjOrder.getCreateTime();
//                SimpleDateFormat dateFormat = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
//                String ksrq = dateFormat.format(createTime);
//                String jsrq = dateFormat.format(new Date());
//                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);
                LambdaQueryWrapper<TjCustomer> wq1 = new LambdaQueryWrapper<>();
                wq1.eq(TjCustomer::getCusId, tjOrder.getUserId());
                TjCustomer tjCustomer = tjCustomerService.getOne(wq1);
                LambdaQueryWrapper<TjReportTemplate> wrapper = new LambdaQueryWrapper<>();
                wrapper.eq(TjReportTemplate::getFlag,"4");
                wrapper.eq(TjReportTemplate::getOpen,"1");
                TjReportTemplate zongJianYiShiQianMing = reportTemplateService.getOne(wrapper);
                try {
                    return shengchengbgmoban(tjNumber, tjOrder, tjCustomer, reportTemplate,zongJianYiShiQianMing);
                } catch (Exception e) {
                    TransactionAspectSupport.currentTransactionStatus().setRollbackOnly();
                    log.error(String.valueOf(e));
                    tjOrder.setReportTime(null);
                    tjOrder.setCheckTime(null);
                    tjOrder.setCheckStatus(0);
                    tjOrder.setPrintLastTime(null);
                    tjOrderService.updateById(tjOrder);
                    logger.error("生成报告异常");
                    return AjaxResult.error("生成报告失败");
                }
            } else {
                return AjaxResult.error("请先总检");
            }
        }
        return AjaxResult.error();
    }
    public AjaxResult shengchengbgmoban(String tjNumber, TjOrder tjOrder, TjCustomer tjCustomer, TjReportTemplate reportTemplate,TjReportTemplate zongJianYiShiQianMing) {
        AjaxResult ajaxResult = null;
        try {
//            ajaxResult = hisPDFUtil.hisPDF(tjOrder, tjCustomer, reportTemplate);
//            ajaxResult = hisPDFUtil.hisPDFNew(tjOrder, tjCustomer, reportTemplate);
            ajaxResult = hisPDFUtil.hisPDFNew2(tjOrder, tjCustomer, reportTemplate,zongJianYiShiQianMing);
        } catch (Exception e) {
            e.printStackTrace();
            log.error(String.valueOf(e));
        }
        if (!ajaxResult.get("code").toString().equals("200")) {
            TransactionAspectSupport.currentTransactionStatus().setRollbackOnly();
        } else {
            Long userId = tjCustomer.getCusId();
            String outputFileName1 = userId + tjNumber + tjCustomer.getCusName() + "_报告.pdf";
            TjReport tjReport = new TjReport();
            tjReport.setTjNumber(String.valueOf(tjNumber));
            tjReport.setPath(urlValue + outputFileName1);
            String outputPath1 = value + File.separator;
            String pdfBinary = getPDFBinary(outputPath1 + outputFileName1);
            tjReport.setReport(pdfBinary);
            tjReport.setType("体检报告");
            tjReport.setPrint("pdf");
            tjReportService.save(tjReport);
            Date date = new Date();
            //            LambdaUpdateWrapper<TjOrder> updateWrapper = new LambdaUpdateWrapper<>();
//            updateWrapper.eq(TjOrder::getTjNumber, tjNumber);
//            updateWrapper.set(TjOrder::getReportTime, date);
//            updateWrapper.set(TjOrder::getPrintLastTime, date);
//            updateWrapper.set(TjOrder::getDownloadLastTime,date);
//            updateWrapper.set(TjOrder::getStatus, TjConstants.TJ_END);
            tjOrder.setStatus(TjConstants.TJ_END);
            tjOrder.setReportTime(date);
//            tjOrder.setPrintLastTime(date);
//            tjOrder.setDownloadLastTime(date);
            tjOrderService.updateById(tjOrder);
        }
        return ajaxResult;
    }
    /**
     * 撤销
     * @param tjNumber
     */
    @Transactional(propagation = Propagation.REQUIRES_NEW)
    public void backOnlyCheckType(String tjNumber) {
        QueryWrapper<TjOrder> wq2 = new QueryWrapper<>();
        wq2.eq("tj_number", tjNumber);
        TjOrder one = tjOrderService.getOne(wq2);
        one.setCheckStatus(0);
        String config = configService.selectConfigByKey("tj_confirm");
        if ("Y".equals(config)) {
            one.setStatus(TjConstants.TJ_CHECK);
        } else {
            one.setStatus(TjConstants.TJ_CONFIRM);
        }
        //将状态改为未审核
        tjOrderService.updateById(one);
    }
    private AjaxResult newFun(String tjNumber) {
@@ -464,7 +654,7 @@
                    for (String key : data.keySet()) {
                        form.setField(key, data.get(key).toString());
                    }
                    System.out.println("pdf填充表单数据耗时:"+(System.currentTimeMillis() - pdfMkStart));
                    System.out.println("pdf填充表单数据耗时:" + (System.currentTimeMillis() - pdfMkStart));
                    //设置为无法编辑
                    ps.setFormFlattening(true);
                    ps.close();
@@ -533,11 +723,11 @@
                        }
                    }
                    long fujianEnd = System.currentTimeMillis();
                    System.out.println("附件查询耗时:"+(fujianEnd - fujianStart));
                    System.out.println("文件保存前耗时:"+(fujianEnd - pdfMkStart));
                    System.out.println("附件查询耗时:" + (fujianEnd - fujianStart));
                    System.out.println("文件保存前耗时:" + (fujianEnd - pdfMkStart));
                    // 保存pdf文件
                    copy.close();
                    String outputPath1 = value + "\\";
                    String outputPath1 = value + File.separator;
                    String outputFileName1 = userId + tjNumber + tjCustomer.getCusName() + "new_体检报告.pdf";
                    File file = new File(outputPath1 + outputFileName1);
                    BufferedOutputStream outputStream = new BufferedOutputStream(new FileOutputStream(file));
@@ -648,12 +838,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();
@@ -740,7 +926,8 @@
                // 设置正文字体样式:12号
                Font textFont = PdfUtils.setFont(9);
                //创建表格  将表头字体和正文字体放进去
                PdfPTable table = PdfUtils.setTable(headFont, textFont, titles, value);
                DictHosp dictHosp = dictHospService.list().get(0);
                PdfPTable table = PdfUtils.setTable(headFont, textFont, titles, value,dictHosp.equals("澄合矿务局中心医院"));
                document.add(paragraph);
                document.add(table);
                //判断备注是否为空  空不能显示null
@@ -794,6 +981,7 @@
    }
    private AjaxResult oldFun(String tjNumber) {
        DictHosp dictHosp = dictHospService.list().get(0);
        long startTime = System.currentTimeMillis();
        int num = tjOrderRemarkService.getTjYqOrderRemarkByTjNum(tjNumber);
        if (num > 0) return AjaxResult.error("有延期项目暂不能生成报告!!!");
@@ -867,7 +1055,7 @@
                String template = reportTemplate.getTemplate();
                String userId = SecurityUtils.getLoginUser().getUsername();
                if (template != null) {
                    PDFBinaryUtil.base64StringToPDF(template, FileUtil.mkdir(value).getPath() + "\\" + userId + "体检报告封面模板.pdf");
                    PDFBinaryUtil.base64StringToPDF(template, FileUtil.mkdir(value).getPath() + File.separator + userId + "体检报告封面模板.pdf");
                }
                // --------以上-------  根据数据库中的模板二进制文件  转pdf  创建文件夹  将pdf放进本地文件夹
@@ -890,8 +1078,8 @@
                    tjOrderDetail.setProject(tjProject);
                }
                String inputFileName = value + "\\" + userId + "体检报告封面模板.pdf";
                String outputFileName = value + "\\" + 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;
@@ -1014,7 +1202,7 @@
                    //设置文档的页边距就是距离页面边上的距离,分别为:左边距,右边距,上边距,下边距
                    document.setMargins(70, 70, 40, 40);
                    //生成pdf的位置以及名称
                    String fileName = value + "\\" + userId + tjNumber + "体检报告项目详情页.pdf";
                    String fileName = value + File.separator + userId + tjNumber + "体检报告项目详情页.pdf";
                    OutputStream outputStream = Files.newOutputStream(Paths.get(fileName));
                    PdfWriter pdfWriter = PdfWriter.getInstance(document, outputStream);
@@ -1120,7 +1308,7 @@
                            // 设置正文字体样式:12号
                            Font textFont = PdfUtils.setFont(9);
                            //创建表格  将表头字体和正文字体放进去
                            PdfPTable table = PdfUtils.setTable(headFont, textFont, titles, value);
                            PdfPTable table = PdfUtils.setTable(headFont, textFont, titles, value,dictHosp.equals("澄合矿务局中心医院"));
                            document.add(paragraph);
                            document.add(table);
@@ -1181,7 +1369,7 @@
//                    TjReport one11111 = tjReportService.getOne(rtwq1);
//                    if(null !=one11111){
//                        String report1 = one11111.getReport();
//                        PDFBinaryUtil.base64StringToPDF(report1, FileUtil.mkdir(value).getPath() + "\\" + userId + "医学名词.pdf");
//                        PDFBinaryUtil.base64StringToPDF(report1, FileUtil.mkdir(value).getPath() + File.separator + userId + "医学名词.pdf");
//                    }
                    LambdaQueryWrapper<TjReport> rtwq = new LambdaQueryWrapper<>();
@@ -1190,7 +1378,7 @@
                    TjReport one1111 = tjReportService.getOne(rtwq);
                    if (null != one1111) {
                        String report = one1111.getReport();
                        PDFBinaryUtil.base64StringToPDF(report, FileUtil.mkdir(value).getPath() + "\\" + tjNumber + userId + "心电图.pdf");
                        PDFBinaryUtil.base64StringToPDF(report, FileUtil.mkdir(value).getPath() + File.separator + tjNumber + userId + "心电图.pdf");
                    }
                    LambdaQueryWrapper<TjReport> rtwq12 = new LambdaQueryWrapper<>();
@@ -1199,27 +1387,27 @@
                    TjReport one111112 = tjReportService.getOne(rtwq12);
                    if (null != one111112) {
                        String report12 = one111112.getReport();
                        PDFBinaryUtil.base64StringToPDF(report12, FileUtil.mkdir(value).getPath() + "\\" + tjNumber + userId + "附件.pdf");
                        PDFBinaryUtil.base64StringToPDF(report12, FileUtil.mkdir(value).getPath() + File.separator + tjNumber + userId + "附件.pdf");
                    }
                    //合并
                    String[] files1 = null;
                    if (one1111 != null) {
                        if (one111112 != null) {
                            files1 = new String[]{value + "\\" + userId + "体检报告封面页.pdf", value + "\\" + userId + tjNumber + "体检报告项目详情页.pdf", value + "\\" + tjNumber + userId + "附件.pdf", value + "\\" + tjNumber + userId + "心电图.pdf"};
                            files1 = new String[]{value + File.separator + userId + "体检报告封面页.pdf", value + File.separator + userId + tjNumber + "体检报告项目详情页.pdf", value + File.separator + tjNumber + userId + "附件.pdf", value + File.separator + tjNumber + userId + "心电图.pdf"};
                        } else {
                            files1 = new String[]{value + "\\" + userId + "体检报告封面页.pdf", value + "\\" + userId + tjNumber + "体检报告项目详情页.pdf", value + "\\" + tjNumber + userId + "心电图.pdf"};
                            files1 = new String[]{value + File.separator + userId + "体检报告封面页.pdf", value + File.separator + userId + tjNumber + "体检报告项目详情页.pdf", value + File.separator + tjNumber + userId + "心电图.pdf"};
                        }
                    } else {
                        if (one111112 != null) {
                            files1 = new String[]{value + "\\" + userId + "体检报告封面页.pdf", value + "\\" + userId + tjNumber + "体检报告项目详情页.pdf", value + "\\" + tjNumber + userId + "附件.pdf"};
                            files1 = new String[]{value + File.separator + userId + "体检报告封面页.pdf", value + File.separator + userId + tjNumber + "体检报告项目详情页.pdf", value + File.separator + tjNumber + userId + "附件.pdf"};
                        } else {
                            files1 = new String[]{value + "\\" + userId + "体检报告封面页.pdf", value + "\\" + userId + tjNumber + "体检报告项目详情页.pdf"};
                            files1 = new String[]{value + File.separator + userId + "体检报告封面页.pdf", value + File.separator + userId + tjNumber + "体检报告项目详情页.pdf"};
                        }
                    }
                    //合并
//                    String[] files1 = {value + "\\" + userId + "体检报告封面页.pdf", value + "\\" + userId + tjNumber+"体检报告项目详情页.pdf", value + "\\" +tjNumber+ userId + "附件.pdf", value + "\\" + tjNumber + userId + "心电图.pdf"};
                    String outputPath1 = value + "\\";
//                    String[] files1 = {value + File.separator + userId + "体检报告封面页.pdf", value + File.separator + userId + tjNumber+"体检报告项目详情页.pdf", value + File.separator +tjNumber+ userId + "附件.pdf", value + File.separator + tjNumber + userId + "心电图.pdf"};
                    String outputPath1 = value + File.separator;
                    String outputFileName1 = userId + tjNumber + tjCustomer.getCusName() + "_体检报告.pdf";
                    File file1 = new File(outputPath1 + outputFileName1);
@@ -1238,11 +1426,11 @@
                    tjReport.setPrint("pdf");
                    tjReportService.save(tjReport);
                    //FileUtil.del(value + "\\" + tjNumber + "体检报告.pdf");
                    //FileUtil.del(value + "\\" + userId + "体检报告封面模板.pdf");
                    //FileUtil.del(value + "\\" + userId +tjNumber+ "体检报告项目详情页.pdf");
                    //FileUtil.del(value + "\\" + userId + "体检报告封面页.pdf");
                    //FileUtil.del(value + "\\" + userId + "心电图.pdf");
                    //FileUtil.del(value + File.separator + tjNumber + "体检报告.pdf");
                    //FileUtil.del(value + File.separator + userId + "体检报告封面模板.pdf");
                    //FileUtil.del(value + File.separator + userId +tjNumber+ "体检报告项目详情页.pdf");
                    //FileUtil.del(value + File.separator + userId + "体检报告封面页.pdf");
                    //FileUtil.del(value + File.separator + userId + "心电图.pdf");
                    //修改order表中的打印报告时间为当前时间
@@ -1261,7 +1449,7 @@
                    e.printStackTrace();
                    return AjaxResult.success("PDF导出失败");
                } finally {
                    transitionService.deletedTbTransitionListByCusIdAndTjNum(tjCustomer.getCusIdcard(), tjOrder.getCardId());
//                    transitionService.deletedTbTransitionListByCusIdAndTjNum(tjCustomer.getCusIdcard(), tjOrder.getCardId());
                }
            }
        }
@@ -1313,9 +1501,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;
    }
@@ -1325,36 +1511,12 @@
        //创建map 键为父项目  值为子项目集合
        Map<TjOrderRemark, List<TjPdfVO>> printReport = new LinkedHashMap<>();
        //查到该客户的体检记录
//        LambdaQueryWrapper<TjOrder> wq1 = new LambdaQueryWrapper<>();
//        wq1.eq(TjOrder::getTjNumber, tjNumber);
//        TjOrder one = tjOrderService.getOne(wq1);
        //拿到体检记录的orderid,查出项目详细信息
//        LambdaQueryWrapper<TjOrderDetail> wq = new LambdaQueryWrapper<>();
//        wq.eq(TjOrderDetail::getOrderId, one.getOrderId());
//        //20230323判断项目已检
//        wq.ne(TjOrderDetail::getTjStatus, 0);
//        wq.eq(TjOrderDetail::getProId,projectService.getHuaYanProId());
//        List<TjOrderDetail> tjOrderDetails = tjOrderDetailService.list(wq);
        List<TjOrderDetail> tjOrderDetails = tjOrderDetailService.addHuaYanTable(tjNumber);
        //遍历体检记录 将项目的具体信息
        //遍历客户所选的项目(包含子项父项)
//        for (TjOrderDetail tjOrderDetail : tjOrderDetails) {
//            TjProject tjProject = projectService.getById(tjOrderDetail.getProId());
//            if (null != tjProject) {
//                tjOrderDetail.setProject(tjProject);
//            }
//        }
//        LambdaQueryWrapper<TjCustomer> wq22 = new LambdaQueryWrapper<>();
//        wq22.eq(TjCustomer::getCusId, one.getUserId());
//        TjCustomer customer = tjCustomerService.getOne(wq22);
//        LambdaQueryWrapper<TjOrderRemark> wqq = new LambdaQueryWrapper<>();
//        wqq.eq(TjOrderRemark::getTjNumber, tjNumber);
//        wqq.eq(TjOrderRemark::getDeptId,"241");
//        List<TjOrderRemark> tjOrderRemarks = tjOrderRemarkService.list(wqq);
        List<TjOrderRemark> tjOrderRemarks = tjOrderRemarkService.addHuaYanTable(tjNumber);
        List<TjOrderDetail> tjOrderDetails = tjOrderDetailService.addHuaYanAndCgTable(tjNumber);
        List<TjOrderRemark> tjOrderRemarks = tjOrderRemarkService.addHuaYanAndCgTable(tjNumber);
        for (TjOrderRemark tjOrderRemark : tjOrderRemarks) {
            printReport.put(tjOrderRemark, null);
        }
@@ -1362,7 +1524,7 @@
        for (Map.Entry<TjOrderRemark, List<TjPdfVO>> entry : printReport.entrySet()) {
            List<TjPdfVO> tjPdfVOS = new ArrayList<>();
            for (TjOrderDetail tjOrderDetail : tjOrderDetails) {
                if (entry.getKey().getProId().equals(tjOrderDetail.getProId())) {
                if (entry.getKey().getProsId().equals(tjOrderDetail.getProsId())) {
                    TjPdfVO tjPdfVO = new TjPdfVO();
                    tjPdfVO.setProName(tjOrderDetail.getProName());
                    if (null != tjOrderDetail.getYcbz() && !tjOrderDetail.getYcbz().equals("")) {
@@ -1377,7 +1539,7 @@
                }
            }
            printReport.put(entry.getKey(), tjPdfVOS);
            if (tjPdfVOS.size() == 0) {
            if (tjPdfVOS.isEmpty()) {
                toRemoveKeys.add(entry.getKey());
            }
        }
@@ -1467,7 +1629,7 @@
        });
        List<Long> proIds = tjOrderDetails.stream().map(TjOrderDetail::getProId).collect(Collectors.toList());
        LambdaQueryWrapper<TjProject> queryWrapper = new LambdaQueryWrapper<>();
        queryWrapper.in(TjProject::getProId,proIds);
        queryWrapper.in(TjProject::getProId, proIds);
        List<TjProject> projectList = projectService.list(queryWrapper);
        for (TjOrderDetail tjOrderDetail : tjOrderDetails) {
            TjProject tjProject = projectList.stream().filter(item -> item.getProId().equals(tjOrderDetail.getProId())).collect(Collectors.toList()).get(0);
@@ -1478,11 +1640,11 @@
                System.out.println("'''''''''''''''''''''''''''''''''''" + tjOrderDetail.getOrderDetailId());
            }
            // 判断在collect中是否存在
            if (collect.contains(tjOrderDetail.getProject().getProParentId())){
            if (collect.contains(tjOrderDetail.getProject().getProParentId())) {
                LambdaQueryWrapper<TjStandard> wq6 = new LambdaQueryWrapper<>();
                wq6.eq(TjStandard::getProId, tjOrderDetail.getProId());
                List<TjStandard> list2 = tjStandardService.list(wq6);
                if (list2.size() == 0) {
                if (list2.isEmpty()) {
                    TjStandard s = new TjStandard();
                    s.setCompany(" ");
                    s.setTjStandardLtValue(" ");
@@ -1532,9 +1694,9 @@
                tjPdfVOS.add(tjPdfVO);
            }
        }
        printReport.entrySet().stream().forEach(item->{
        printReport.entrySet().stream().forEach(item -> {
            List<TjPdfVO> pdfVOS = hashMap.get(item.getKey().getProId());
            printReport.put(item.getKey(),pdfVOS);
            printReport.put(item.getKey(), pdfVOS);
        });
    }
@@ -1563,29 +1725,11 @@
    }
    //TODO 批量使用post
    @GetMapping("/preview/{flag}/{TjNumber}")
    @ApiOperation(value = "下载体检报告")
    public void preview(HttpServletResponse response, @PathVariable("flag") boolean flag, @PathVariable("TjNumber") String tjNumber) {
        //修改order表中的下载报告时间为当前时间
        LambdaUpdateWrapper<TjOrder> updateWrapper = new LambdaUpdateWrapper<>();
        updateWrapper.eq(TjOrder::getTjNumber, tjNumber);
        updateWrapper.set(TjOrder::getPrintLastTime, new Date());
        updateWrapper.set(TjOrder::getDownloadLastTime, new Date());
        updateWrapper.set(TjOrder::getStatus, TjConstants.TJ_END);
        tjOrderService.update(updateWrapper);
        LambdaQueryWrapper<TjOrder> wq1 = new LambdaQueryWrapper<>();
        wq1.eq(TjOrder::getTjNumber, tjNumber);
        TjOrder tjOrder = tjOrderService.getOne(wq1);
        LambdaQueryWrapper<TjCustomer> wq2 = new LambdaQueryWrapper<>();
        wq2.eq(TjCustomer::getCusId, tjOrder.getUserId());
        TjCustomer tjCustomer = tjCustomerService.getOne(wq2);
        TjOrder tjOrder = tjOrderService.getOrderByTjNum(tjNumber);
        TjCustomer tjCustomer = tjCustomerService.getById( tjOrder.getUserId());
        LambdaQueryWrapper<TjReport> we = new LambdaQueryWrapper<>();
        we.eq(TjReport::getTjNumber, tjNumber);
        we.eq(TjReport::getType, "体检报告");
@@ -1593,11 +1737,9 @@
        if (one == null) {
            return;
        }
        String userId = SecurityUtils.getLoginUser().getUsername();
        PDFBinaryUtil.base64StringToPDF(one.getReport(), FileUtil.mkdir(value).getPath() + "\\" + userId + tjNumber + tjCustomer.getCusName() + "_体检报告.pdf");
        //String filePath = one.getPath();
        String filePath = value + "\\" + userId + tjNumber + tjCustomer.getCusName() + "_体检报告.pdf";
        PDFBinaryUtil.base64StringToPDF(one.getReport(), FileUtil.mkdir(value).getPath() + File.separator + userId + tjNumber + tjCustomer.getCusName() + "_体检报告.pdf");
        String filePath = value + File.separator + userId + tjNumber + tjCustomer.getCusName() + "_体检报告.pdf";
        File f = new File(filePath);
        if (filePath.isEmpty()) {
            System.out.println("文件不存在!");
@@ -1631,6 +1773,17 @@
            while ((len = br.read(bs)) > 0) {
                out.write(bs, 0, len);
            }
//            if(null !=tjOrder.getHeshouTime() && tjOrder.getHeshouStatus()==1){
//                TjReportPrint print=new TjReportPrint();
//                print.setTjNumber(tjNumber);
//                print.setPrintBy(SecurityUtils.getLoginUser().getUser().getNickName());
//                print.setPrintTime(date);
//                print.setPrintStatus("已打印");
//                if (printService.save(print)) {
//                    tjOrder.setPrintLastTime(date);
//                    tjOrderService.updateById(tjOrder);
//                }
//            }
            out.flush();
            out.close();
            br.close();
@@ -1652,43 +1805,370 @@
        }
    }
    @GetMapping("/previewprint/{flag}/{TjNumber}/{sfdy}")
    @ApiOperation(value = "下载体检报告")
    public void previewprint(HttpServletResponse response, @PathVariable("flag") boolean flag, @PathVariable("TjNumber") String tjNumber,@PathVariable("sfdy") String sfdy) {
        Date date = new Date();
        TjOrder tjOrder = tjOrderService.getOrderByTjNum(tjNumber);
        TjCustomer tjCustomer = tjCustomerService.getById( tjOrder.getUserId());
        LambdaQueryWrapper<TjReport> we = new LambdaQueryWrapper<>();
        we.eq(TjReport::getTjNumber, tjNumber);
        we.eq(TjReport::getType, "体检报告");
        TjReport one = tjReportService.getOne(we);
        if (one == null) {
            return;
        }
        String userId = SecurityUtils.getLoginUser().getUsername();
        PDFBinaryUtil.base64StringToPDF(one.getReport(), FileUtil.mkdir(value).getPath() + File.separator + userId + tjNumber + tjCustomer.getCusName() + "_体检报告.pdf");
        String filePath = value + File.separator + userId + tjNumber + tjCustomer.getCusName() + "_体检报告.pdf";
        File f = new File(filePath);
        if (filePath.isEmpty()) {
            System.out.println("文件不存在!");
            return;
        }
        BufferedInputStream br = null;
        OutputStream out = null;
        FileInputStream fileInputStream = null;
        try {
            fileInputStream = new FileInputStream(f);
            br = new BufferedInputStream(fileInputStream);
            byte[] bs = new byte[1024];
            int len = 0;
            response.reset(); // 非常重要
            if (flag) {
                // 在线打开方式
                URL u = new URL("file:///" + filePath);
                //System.out.println(u);
                String contentType = u.openConnection().getContentType();
                response.setContentType(contentType);
                response.setHeader("Content-Disposition", "inline;filename="
                        + userId + tjNumber + ".pdf");
            } else {
                // 纯下载方式
                response.setContentType("application/x-msdownload");
                response.setContentType("application/pdf;charset=utf-8");
                response.setHeader("Content-Disposition", "attachment;filename="
                        + userId + tjNumber + ".pdf");
            }
            out = response.getOutputStream();
            while ((len = br.read(bs)) > 0) {
                out.write(bs, 0, len);
            }
            if(null !=sfdy && sfdy.equals("1")){
                TjReportPrint print=new TjReportPrint();
                print.setTjNumber(tjNumber);
                print.setPrintBy(SecurityUtils.getLoginUser().getUser().getNickName());
                print.setPrintTime(date);
                print.setPrintStatus("已打印");
                if (printService.save(print)) {
                    tjOrder.setPrintLastTime(date);
                    tjOrder.setStatus(TjConstants.TJ_END);
                    tjOrderService.updateById(tjOrder);
                }
            }
            out.flush();
            out.close();
            br.close();
            fileInputStream.close();
        } catch (IOException e) {
            e.printStackTrace();
            //System.out.println("pdf处理文件异常" + e);
        } finally {
            if (out != null) {
                try {
                    out.close();
                    br.close();
                    fileInputStream.close();
                } catch (IOException e) {
                    e.printStackTrace();
                }
            }
        }
    }
    @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());
        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}")
    @ApiOperation(value = "撤销生成体检报告")
    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);
        if (null != tjReport) {
//            if (!tjReportService.remove(wq1)) {
//                return AjaxResult.error("撤回失败!");
//            }
            // 不在使用逻辑删除 逻辑删除导致打印报告生成 查询sql缓慢
            int i = tjReportService.deleteTjReportByReId(tjReport.getReId());
            if (i == 0) {
                return AjaxResult.error("撤回失败!");
            }
        }
        QueryWrapper<TjOrder> wq2 = new QueryWrapper<>();
        wq2.eq("tj_number", tjNumber);
        TjOrder one = tjOrderService.getOne(wq2);
        one.setCheckStatus(0);
        String config = configService.selectConfigByKey("tj_confirm");
        if ("Y".equals(config)) {
            one.setStatus(TjConstants.TJ_CHECK);
        } else {
            one.setStatus(TjConstants.TJ_CONFIRM);
        }
        //将状态改为未审核
//        UpdateWrapper updateWrapper=new UpdateWrapper();
//        updateWrapper.eq("tj_number",tjNumber);
//        updateWrapper.set("check_status",0);
        boolean update = tjOrderService.updateById(one);
        if (update) {
            return AjaxResult.success("撤回成功!");
        TjOrder one = tjOrderService.getOrderByTjNum(tjNumber);
        if(null !=one){
            if(null !=one.getHeshouTime() && one.getHeshouStatus()==1)return AjaxResult.error("报告已核收不可撤回!!!");
            one.setCheckStatus(0);
            String config = configService.selectConfigByKey("tj_confirm");
            if ("Y".equals(config)) {
                one.setStatus(TjConstants.TJ_CHECK);
            } else {
                one.setStatus(TjConstants.TJ_CONFIRM);
            }
            one.setReportTime(null);
            one.setCheckTime(null);
            one.setCheckDoctor(null);
            one.setHeshouStatus(0);
            one.setHeshouTime(null);
            one.setHeshouDoctor(null);
            one.setPrintLastTime(null);
            one.setDownloadLastTime(null);
            if (tjOrderService.updateById(one)) {
                return AjaxResult.success("撤回成功!");
            }
        }
        return AjaxResult.error("撤回失败!");
@@ -2100,16 +2580,14 @@
    @GetMapping("/tuanDuiYiChangBySex")
    @ApiOperation(value = "生成团队体检报告——男女异常结果统计")
    public Map<String, List<Map<String, Object>>> tuanDuiYiChangBySex(@ApiParam(value = "单位") @RequestParam String firmId,
                                                                      @ApiParam(value = "部门") @RequestParam String firmDeptId) {
    public Map<String, List<Map<String, Object>>> tuanDuiYiChangBySex(@ApiParam(value = "单位") @RequestParam String dwname) {
        Map<String, List<Map<String, Object>>> all = new HashMap<>();
        LambdaQueryWrapper<TjOrder> wq2 = new LambdaQueryWrapper<>();
        wq2.eq(TjOrder::getFirmId, firmId);
        wq2.eq(TjOrder::getFirmDeptId, firmDeptId);
        wq2.eq(TjOrder::getTjType, "1");
        wq2.in(TjOrder::getStatus, 401, 402);
        wq2.eq(TjOrder::getFirmName,dwname);
        wq2.ne(TjOrder::getTjType, "2");
//        wq2.in(TjOrder::getStatus, 401, 402);
        final List<TjOrder> list = tjOrderService.list(wq2);
        List<String> tjNumberList = list.stream().map(TjOrder::getTjNumber).collect(Collectors.toList());