zhaowenxuan
2025-02-15 d9006551fff47c172ea6a0672af7dd21df34f28f
20250215
16个文件已修改
1个文件已添加
892 ■■■■ 已修改文件
ltkj-admin/pom.xml 2 ●●● 补丁 | 查看 | 原始文档 | blame | 历史
ltkj-admin/src/main/java/com/ltkj/web/config/timer/DefaultScheduled.java 2 ●●● 补丁 | 查看 | 原始文档 | blame | 历史
ltkj-admin/src/main/java/com/ltkj/web/controller/his/HisPDFUtil.java 5 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ltkj-admin/src/main/java/com/ltkj/web/controller/system/TjCustomerController.java 5 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ltkj-admin/src/main/java/com/ltkj/web/controller/system/TjOrderController.java 3 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ltkj-admin/src/main/java/com/ltkj/web/controller/system/TjReportController.java 802 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ltkj-admin/src/main/resources/application-prod.yml 6 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ltkj-admin/src/main/resources/application-test.yml 2 ●●● 补丁 | 查看 | 原始文档 | blame | 历史
ltkj-common/src/main/java/com/ltkj/common/utils/IdUtils.java 1 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ltkj-framework/pom.xml 2 ●●● 补丁 | 查看 | 原始文档 | blame | 历史
ltkj-framework/src/main/java/com/ltkj/framework/aspectj/DataSourceAspect.java 13 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ltkj-framework/src/main/java/com/ltkj/framework/aspectj/TransactionalDataSourceAspect.java 31 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ltkj-framework/src/main/java/com/ltkj/framework/interceptor/DBChangeInterceptor.java 2 ●●● 补丁 | 查看 | 原始文档 | blame | 历史
ltkj-generator/pom.xml 2 ●●● 补丁 | 查看 | 原始文档 | blame | 历史
ltkj-quartz/pom.xml 2 ●●● 补丁 | 查看 | 原始文档 | blame | 历史
ltkj-system/pom.xml 2 ●●● 补丁 | 查看 | 原始文档 | blame | 历史
ltkj-system/src/main/java/com/ltkj/system/service/impl/SysConfigServiceImpl.java 10 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ltkj-admin/pom.xml
@@ -3,7 +3,7 @@
         xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
         xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
    <parent>
        <artifactId>ltkj</artifactId>
        <artifactId>ltkj_peis_region</artifactId>
        <groupId>com.ltkj</groupId>
        <version>3.8.4</version>
    </parent>
ltkj-admin/src/main/java/com/ltkj/web/config/timer/DefaultScheduled.java
@@ -36,7 +36,7 @@
 */
@Slf4j
@Component
@Profile("!dev & !prod & !test")
@Profile("!dev & !test")
public class DefaultScheduled {
ltkj-admin/src/main/java/com/ltkj/web/controller/his/HisPDFUtil.java
@@ -17,6 +17,7 @@
import com.ltkj.common.core.domain.entity.SysUser;
import com.ltkj.common.utils.DateUtils;
import com.ltkj.common.utils.SecurityUtils;
import com.ltkj.db.DataSourceContextHolder;
import com.ltkj.framework.config.MatchUtils;
import com.ltkj.hosp.domain.*;
import com.ltkj.hosp.mapper.DictUserInfoMapper;
@@ -1944,7 +1945,9 @@
     */
    private void savePDFFile(String outputFileName1, TjOrder tjOrder, TjCustomer customer, ByteArrayOutputStream finalOutPut) throws IOException, DocumentException, InterruptedException {
        // 第一步:生成文件并保存
        String outputPath1 = value + File.separator;
        String key = DataSourceContextHolder.getDataSourceKey();
        key = key.replace("ltkjpeis10_","");
        String outputPath1 = value + File.separator + key + File.separator;
        File file = new File(outputPath1 + outputFileName1);
        BufferedOutputStream outputStream = null;
        outputStream = new BufferedOutputStream(new FileOutputStream(file));
ltkj-admin/src/main/java/com/ltkj/web/controller/system/TjCustomerController.java
@@ -16,6 +16,7 @@
import com.ltkj.common.enums.BusinessType;
import com.ltkj.common.enums.DataSourceType;
import com.ltkj.common.utils.SecurityUtils;
import com.ltkj.db.DataSourceContextHolder;
import com.ltkj.framework.config.MatchUtils;
import com.ltkj.framework.datasource.DynamicDataSourceContextHolder;
import com.ltkj.hosp.domain.HisApiConfig;
@@ -514,11 +515,15 @@
        tjCustomer.setCusNumber(0L);
        tjCustomer.setPym(PinyinUtil.getFirstLetter(tjCustomer.getCusName(),""));
        String config = sysConfigService.selectConfigByKey("sfkqdyhis");
        logger.info("config ->{}",config);
        String dataSourceType = DataSourceContextHolder.getDataSourceKey();
        logger.info("登记当前数据源 ->{}",dataSourceType);
        if (null != config && config.equals("Y")) {
            AjaxResult tjCustomer1 = suijieHisXinXi(tjCustomer, date);
            if (tjCustomer1 != null) return tjCustomer1;
        } else {
            String s = sysConfigService.selectConfigByKey("is_request_common_his_api");
            logger.info("s ->{}",s);
            if (null != s && s.equals("Y")){
                TjCustomer requestCommonHisApi = isRequestCommonHisApi(tjCustomer);
                if (null !=requestCommonHisApi){
ltkj-admin/src/main/java/com/ltkj/web/controller/system/TjOrderController.java
@@ -1086,7 +1086,8 @@
                return result;
            }
        }catch (Exception e){
            log.error(String.valueOf(e));
            log.error(String.valueOf(e),e.getMessage());
            e.printStackTrace();
        }
        finally {
            lock.unlock();
ltkj-admin/src/main/java/com/ltkj/web/controller/system/TjReportController.java
@@ -25,6 +25,7 @@
import com.ltkj.common.utils.PDFDocumentUtil;
import com.ltkj.common.utils.SecurityUtils;
import com.ltkj.common.utils.StringUtils;
import com.ltkj.db.DataSourceContextHolder;
import com.ltkj.framework.config.MatchUtils;
import com.ltkj.hosp.domain.*;
import com.ltkj.hosp.service.*;
@@ -492,288 +493,6 @@
        tjOrderService.updateById(one);
    }
    private AjaxResult newFun(String tjNumber) {
        long startTime = System.currentTimeMillis();
        int num = tjOrderRemarkService.getTjYqOrderRemarkByTjNum(tjNumber);
        if (num > 0) {
            return AjaxResult.error("有延期项目暂不能生成报告!!!");
        }
        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);
            }
            //判断表中有没有该体检报告  不能重复生成
            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("该客户报告已生成!不能重复生成!可直接预览或打印!");
            }
            Integer checkStatus = tjOrder.getCheckStatus();
            if (checkStatus == 1) {
                //判断报告生成 保存类型 2024/2/29
                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 template = reportTemplate.getTemplate();
                String userId = SecurityUtils.getLoginUser().getUsername();
                if (template == null) {
                    return AjaxResult.error("没有该模板");
                }
                // --------以上-------  根据数据库中的模板二进制文件  转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());
                //20230306判断该项目是否退费/缴费
                wq2.isNotNull(TjOrderDetail::getFlowingWaterId);
                //20230323判断该项目是否弃检/未检
//                wq2.eq(TjOrderDetail::getTjStatus,1);
                List<TjOrderDetail> list = tjOrderDetailService.list(wq2);
                for (TjOrderDetail tjOrderDetail : list) {
                    TjProject tjProject = projectService.selectTjProjectByProId(tjOrderDetail.getProId());
                    tjOrderDetail.setProject(tjProject);
                }
                // 共计耗时5695毫秒 以下代码耗时3528
                // TODO PDF创建优化
                long pdfMkStart = System.currentTimeMillis();
                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("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<>();
                    // 设置用户信息
                    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());
                    }
                    //异常项目
//                    data.put("yichang", "【1】屈光不正\n" +
//                            "【2】扁桃体肥⼤\n" +
//                            "【3】体重指数增⾼\n" +
//                            "【4】⾎脂异常(总胆固醇增⾼;⽢油三酯增⾼)\n" +
//                            "【5】γ-⾕氨酰转移酶增⾼;天⻔冬氨酸氨基转移酶增⾼;丙氨酸氨基转移酶增⾼\n" +
//                            "【6】轻⾄中度脂肪肝");
                    //拼接重大阳性结果
                    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) {
//                        for (int i = 0; i < list.size(); i++) {
//                            if (list.get(i).getExceptionDesc() == 1) {
//                                str.append(i + 1).append("、").append(projectService.getById(list.get(i).getProId()).getProName()).append(";\n");
//                            }
//                        }
                        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());
                    }
                    System.out.println("pdf填充表单数据耗时:" + (System.currentTimeMillis() - pdfMkStart));
                    //设置为无法编辑
                    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 对于没有追加附件的 提升速度
                    long fujianStart = System.currentTimeMillis();
                    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);
                            }
                        }
                    }
                    long fujianEnd = System.currentTimeMillis();
                    System.out.println("附件查询耗时:" + (fujianEnd - fujianStart));
                    System.out.println("文件保存前耗时:" + (fujianEnd - pdfMkStart));
                    // 保存pdf文件
                    copy.close();
                    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));
                    outputStream.write(finalOutPut.toByteArray());
                    outputStream.flush();
                    outputStream.close();
                    document.close();
                    finalOutPut.close();
                    reader.close();
                    // 保存数据
                    TjReport tjReport = new TjReport();
                    tjReport.setTjNumber(String.valueOf(tjNumber));
                    tjReport.setPath(urlValue + outputFileName1);
                    String pdfBinary = getPDFBinary(outputPath1 + outputFileName1);
                    tjReport.setReport(pdfBinary);
                    tjReport.setType("体检报告");
                    tjReport.setPrint("pdf");
                    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);
                    long entTime = System.currentTimeMillis();
                    System.out.println("PDF开始创建到结束耗时:" + (entTime - pdfMkStart));
                    System.out.println("总耗时:" + (entTime - startTime) + "ms");
                    return AjaxResult.success("已生成报告!可直接点击预览!");
                } catch (Exception e) {
                    e.printStackTrace();
                    return AjaxResult.success("PDF导出失败");
                }
            }
        }
        return AjaxResult.success();
    }
    private void setUserInfo(String tjNumber, TjOrder tjOrder, TjCustomer tjCustomer, DictComp dictComp, List<TjOrderDetail> list, Map<String, Object> data) {
        //填充性别:判断男女
        Long cusSex = tjCustomer.getCusSex();
@@ -984,482 +703,6 @@
        document.close();
        pdfWriter.close();
        return byteArrayOutputStream;
    }
    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("有延期项目暂不能生成报告!!!");
        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);
            }
            //判断表中有没有该体检报告  不能重复生成
            LambdaQueryWrapper<TjReport> wqa = new LambdaQueryWrapper<>();
            wqa.eq(TjReport::getTjNumber, tjNumber);
            wqa.eq(TjReport::getType, "体检报告");
            List<TjReport> list2 = tjReportService.list(wqa);
            if (list2.size() != 0) {
                return AjaxResult.error("该客户报告已生成!不能重复生成!可直接预览或打印!");
            }
            Integer checkStatus = tjOrder.getCheckStatus();
            if (checkStatus == 1) {
                //判断报告生成 保存类型 2024/2/29
                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 template = reportTemplate.getTemplate();
                String userId = SecurityUtils.getLoginUser().getUsername();
                if (template != null) {
                    PDFBinaryUtil.base64StringToPDF(template, FileUtil.mkdir(value).getPath() + File.separator + userId + "体检报告封面模板.pdf");
                }
                // --------以上-------  根据数据库中的模板二进制文件  转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());
                //20230306判断该项目是否退费/缴费
                wq2.isNotNull(TjOrderDetail::getFlowingWaterId);
                //20230323判断该项目是否弃检/未检
//                wq2.eq(TjOrderDetail::getTjStatus,1);
                List<TjOrderDetail> list = tjOrderDetailService.list(wq2);
                for (TjOrderDetail tjOrderDetail : list) {
                    TjProject tjProject = projectService.selectTjProjectByProId(tjOrderDetail.getProId());
                    tjOrderDetail.setProject(tjProject);
                }
                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();
                    //该字体造成类型不均匀,但是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<>();
                    //填充性别:判断男女
                    Long cusSex = tjCustomer.getCusSex();
                    String sex;
                    String name1;
                    String tjtype;
                    if (cusSex == 0) {
                        sex = "男";
                        name1 = tjCustomer.getCusName() + "先生";
                    } else {
                        sex = "女";
                        name1 = tjCustomer.getCusName() + "女士";
                    }
                    data.put("name", tjCustomer.getCusName());
                    data.put("cusId", tjCustomer.getCusId());
                    data.put("name1", name1);
                    if ("1".equals(tjOrder.getTjType())) {
                        tjtype = "团队";
                        data.put("tjtype", tjtype);
                    } else {
                        tjtype = "个人";
                        data.put("tjtype", tjtype);
                    }
                    data.put("dstype", "统一");
                    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());
                    data.put("idcard", MatchUtils.hideIdCardNum(tjCustomer.getCusIdcard()));
                    data.put("num1", list.size());
                    data.put("num2", 0);
                    data.put("num3", 4);
                    if (dictComp == null) {
                        data.put("work", "无");
                    } else {
                        data.put("work", dictComp.getCnName());
                    }
                    //封面页下面的总检建议显示
                    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());
                    }
                    //异常项目
//                    data.put("yichang", "【1】屈光不正\n" +
//                            "【2】扁桃体肥⼤\n" +
//                            "【3】体重指数增⾼\n" +
//                            "【4】⾎脂异常(总胆固醇增⾼;⽢油三酯增⾼)\n" +
//                            "【5】γ-⾕氨酰转移酶增⾼;天⻔冬氨酸氨基转移酶增⾼;丙氨酸氨基转移酶增⾼\n" +
//                            "【6】轻⾄中度脂肪肝");
                    //拼接重大阳性结果
                    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) + "、" + list1.get(i).getProName() + ";\n");
                        }
                    } else {
                        str.append("    无;\n");
                    }
                    //拼接异常项目
                    str.append("【异常情况项目】\n");
                    if (list.size() > 0) {
                        for (int i = 0; i < list.size(); i++) {
                            if (list.get(i).getExceptionDesc() == 1) {
                                str.append((i + 1) + "、" + projectService.getById(list.get(i).getProId()).getProName() + ";\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();
                    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 + tjNumber + "体检报告项目详情页.pdf";
                    OutputStream outputStream = Files.newOutputStream(Paths.get(fileName));
                    PdfWriter pdfWriter = PdfWriter.getInstance(document, outputStream);
                    //pdfWriter.setPageEvent(new MyHeaderFooter());// 页眉页脚
                    document.open();
                    document.add(new Header("健康体检结果", "健康体检结果"));
                    Map<TjOrderRemark, List<TjPdfVO>> tjOrderRemarkObjectMap = addTable(tjNumber);
                    Map<TjOrderRemark, List<TjPdfVO>> tjOrderRemarkListMap = addHuaYanTable(tjNumber);
                    tjOrderRemarkObjectMap.putAll(tjOrderRemarkListMap);
                    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);
                        //判断该项目是否需要打印报告
                        if (null != one11 && "N".equals(one11.getNeedReport())) {
                            continue;
                        }
                        String titleName = null;
                        if (null != one11 && "1".equals(one11.getResultType())) {
                            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 = PdfUtils.setTable1(headFont, textFont, titles, value);
                            document.add(paragraph);
                            document.add(table);
                            //判断备注是否为空  空不能显示null
                            if (entry.getKey().getRemark() == null) {
                                entry.getKey().setRemark("");
                            }
                            String remark = "备注:" + entry.getKey().getRemark();
                            if (entry.getKey().getRemark().length() > 50) {
                                int j = 0;
                                for (int i = 0; i < remark.length() / 50; i++) {
                                    String substring = remark.substring(j, j + 50);
                                    Font remarkFonts = PdfUtils.setFont(9);
                                    Paragraph pp = PdfUtils.setParagraph(remarkFonts, substring);
                                    document.add(pp);
                                    j = j + 50;
                                }
                                if (remark.length() % 50 != 0) {
                                    String substring = remark.substring((remark.length() / 50) * 50, remark.length() - 1);
                                    Font remarkFonts = PdfUtils.setFont(9);
                                    Paragraph pp = PdfUtils.setParagraph(remarkFonts, substring);
                                    document.add(pp);
                                }
                            } else {
                                Font remarkFonts = PdfUtils.setFont(9);
                                Paragraph pp = PdfUtils.setParagraph(remarkFonts, remark);
                                document.add(pp);
                            }
                            //判断主检医师是否为空  空不能显示null
                            if (null != entry.getKey().getDoctorName() && null != userService.getById(entry.getKey().getDoctorName())) {
                                //主检医师
                                String doctorName = "主检医师:" + userService.getById(entry.getKey().getDoctorName()).getNickName();
                                Font doctorFonts = PdfUtils.setFont(9);
                                Paragraph df = PdfUtils.setParagraph(doctorFonts, doctorName);
                                df.setAlignment(Element.ALIGN_RIGHT);
                                document.add(df);
                            } else {
                                String doctorName = "主检医师:" + "无";
                                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);
                        } else {
                            if (null != one11) {
                                titleName = one11.getProName();
                            } else {
                                titleName = entry.getKey().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 = PdfUtils.setTable(headFont, textFont, titles, value,dictHosp.equals("澄合矿务局中心医院"));
                            document.add(paragraph);
                            document.add(table);
                            //判断备注是否为空  空不能显示null
                            if (entry.getKey().getRemark() == null) {
                                entry.getKey().setRemark("");
                            }
                            String remark = "备注:" + entry.getKey().getRemark();
                            if (entry.getKey().getRemark().length() > 50) {
                                int j = 0;
                                for (int i = 0; i < remark.length() / 50; i++) {
                                    String substring = remark.substring(j, j + 50);
                                    Font remarkFonts = PdfUtils.setFont(9);
                                    Paragraph pp = PdfUtils.setParagraph(remarkFonts, substring);
                                    document.add(pp);
                                    j = j + 50;
                                }
                                if (remark.length() % 50 != 0) {
                                    String substring = remark.substring((remark.length() / 50) * 50, remark.length() - 1);
                                    Font remarkFonts = PdfUtils.setFont(9);
                                    Paragraph pp = PdfUtils.setParagraph(remarkFonts, substring);
                                    document.add(pp);
                                }
                            } else {
                                Font remarkFonts = PdfUtils.setFont(9);
                                Paragraph pp = PdfUtils.setParagraph(remarkFonts, remark);
                                document.add(pp);
                            }
                            //判断主检医师是否为空  空不能显示null
                            if (null != entry.getKey().getDoctorName() && null != userService.getById(entry.getKey().getDoctorName())) {
                                //主检医师
                                String doctorName = "主检医师:" + userService.getById(entry.getKey().getDoctorName()).getNickName();
                                Font doctorFonts = PdfUtils.setFont(9);
                                Paragraph df = PdfUtils.setParagraph(doctorFonts, doctorName);
                                df.setAlignment(Element.ALIGN_RIGHT);
                                document.add(df);
                            } else {
                                String doctorName = "主检医师:" + "无";
                                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.close();
                    pdfWriter.close();
                    outputStream.close();
//                    LambdaQueryWrapper<TjReport> rtwq1 = new LambdaQueryWrapper<>();
//                    rtwq1.eq(TjReport::getType, "医学名词");
////                    rtwq1.eq(TjReport::getTjNumber, tjNumber);
//                    TjReport one11111 = tjReportService.getOne(rtwq1);
//                    if(null !=one11111){
//                        String report1 = one11111.getReport();
//                        PDFBinaryUtil.base64StringToPDF(report1, FileUtil.mkdir(value).getPath() + File.separator + userId + "医学名词.pdf");
//                    }
                    LambdaQueryWrapper<TjReport> rtwq = new LambdaQueryWrapper<>();
                    rtwq.eq(TjReport::getType, "心电图");
                    rtwq.eq(TjReport::getTjNumber, tjNumber);
                    TjReport one1111 = tjReportService.getOne(rtwq);
                    if (null != one1111) {
                        String report = one1111.getReport();
                        PDFBinaryUtil.base64StringToPDF(report, FileUtil.mkdir(value).getPath() + File.separator + tjNumber + userId + "心电图.pdf");
                    }
                    LambdaQueryWrapper<TjReport> rtwq12 = new LambdaQueryWrapper<>();
                    rtwq12.eq(TjReport::getType, "附件");
                    rtwq12.eq(TjReport::getTjNumber, tjNumber);
                    TjReport one111112 = tjReportService.getOne(rtwq12);
                    if (null != one111112) {
                        String report12 = one111112.getReport();
                        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 + 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 + File.separator + userId + "体检报告封面页.pdf", value + File.separator + userId + tjNumber + "体检报告项目详情页.pdf", value + File.separator + tjNumber + userId + "心电图.pdf"};
                        }
                    } else {
                        if (one111112 != null) {
                            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 + File.separator + userId + "体检报告封面页.pdf", value + File.separator + userId + tjNumber + "体检报告项目详情页.pdf"};
                        }
                    }
                    //合并
//                    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);
                    List<File> f = new ArrayList<>();
                    for (String s : files1) {
                        f.add(new File(s));
                    }
                    MergePdf.mergeFileToPDF(f, file1);
                    TjReport tjReport = new TjReport();
                    tjReport.setTjNumber(String.valueOf(tjNumber));
                    tjReport.setPath(urlValue + outputFileName1);
                    String pdfBinary = getPDFBinary(outputPath1 + outputFileName1);
                    tjReport.setReport(pdfBinary);
                    tjReport.setType("体检报告");
                    tjReport.setPrint("pdf");
                    tjReportService.save(tjReport);
                    //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表中的打印报告时间为当前时间
                    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);
                    long entTime = System.currentTimeMillis();
                    System.out.println(entTime - startTime + "ms");
                    return AjaxResult.success("已生成报告!可直接点击预览!");
                } catch (Exception e) {
                    e.printStackTrace();
                    return AjaxResult.success("PDF导出失败");
                } finally {
//                    transitionService.deletedTbTransitionListByCusIdAndTjNum(tjCustomer.getCusIdcard(), tjOrder.getCardId());
                }
            }
        }
        return null;
    }
@@ -1736,21 +979,20 @@
    public void preview(HttpServletResponse response, @PathVariable("flag") boolean flag, @PathVariable("TjNumber") String tjNumber) {
        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";
//        LambdaQueryWrapper<TjReport> we = new LambdaQueryWrapper<>();
//        we.eq(TjReport::getTjNumber, tjNumber);
//        we.eq(TjReport::getType, "体检报告");
//        TjReport one = tjReportService.getOne(we);
//        if (one == null) {
//            return;
//        }
        String key = DataSourceContextHolder.getDataSourceKey();
        key = key.replace("ltkjpeis10_","");
//        String userId = SecurityUtils.getLoginUser().getUsername();
//        PDFBinaryUtil.base64StringToPDF(one.getReport(), FileUtil.mkdir(value).getPath() + File.separator + key + File.separator + userId + tjNumber + tjCustomer.getCusName() + "_体检报告.pdf");
        String filePath = value + File.separator + key + File.separator + tjCustomer.getCusId() + tjNumber + tjCustomer.getCusName() + "_报告.pdf";
        log.info("预览报告 ->{}",filePath);
        File f = new File(filePath);
        if (filePath.isEmpty()) {
            System.out.println("文件不存在!");
            return;
        }
        BufferedInputStream br = null;
        OutputStream out = null;
        FileInputStream fileInputStream = null;
@@ -1767,13 +1009,13 @@
                String contentType = u.openConnection().getContentType();
                response.setContentType(contentType);
                response.setHeader("Content-Disposition", "inline;filename="
                        + userId + tjNumber + ".pdf");
                        + tjCustomer.getCusId() + tjNumber + ".pdf");
            } else {
                // 纯下载方式
                response.setContentType("application/x-msdownload");
                response.setContentType("application/pdf;charset=utf-8");
                response.setHeader("Content-Disposition", "attachment;filename="
                        + userId + tjNumber + ".pdf");
                        + tjCustomer.getCusId() + tjNumber + ".pdf");
            }
            out = response.getOutputStream();
            while ((len = br.read(bs)) > 0) {
@@ -1827,10 +1069,12 @@
        if (one == null) {
            return;
        }
        String key = DataSourceContextHolder.getDataSourceKey();
        key = key.replace("ltkjpeis10_","");
        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";
//        String userId = SecurityUtils.getLoginUser().getUsername();
        PDFBinaryUtil.base64StringToPDF(one.getReport(), FileUtil.mkdir(value).getPath() + File.separator + key + File.separator + tjCustomer.getCusId() + tjNumber + tjCustomer.getCusName() + "_体检报告.pdf");
        String filePath = value + File.separator + key + File.separator + tjCustomer.getCusId() + tjNumber + tjCustomer.getCusName() + "_体检报告.pdf";
        File f = new File(filePath);
        if (filePath.isEmpty()) {
            System.out.println("文件不存在!");
@@ -1852,13 +1096,13 @@
                String contentType = u.openConnection().getContentType();
                response.setContentType(contentType);
                response.setHeader("Content-Disposition", "inline;filename="
                        + userId + tjNumber + ".pdf");
                        + tjCustomer.getCusId() + tjNumber + ".pdf");
            } else {
                // 纯下载方式
                response.setContentType("application/x-msdownload");
                response.setContentType("application/pdf;charset=utf-8");
                response.setHeader("Content-Disposition", "attachment;filename="
                        + userId + tjNumber + ".pdf");
                        + tjCustomer.getCusId() + tjNumber + ".pdf");
            }
            out = response.getOutputStream();
            while ((len = br.read(bs)) > 0) {
ltkj-admin/src/main/resources/application-prod.yml
@@ -189,7 +189,7 @@
#  体检报告模板和报告临时生成存储的文件夹路径
path:
  filePath: D:\Tjreport
  filePath: C:\Tjreport
  # nginx图片服务器
  reportServer: https://ltpeis.xaltjdkj.cn:5516/
@@ -251,5 +251,5 @@
#  username = root
#  password = Root_ltkj123
config:
  properties: D:\ltkjprojectconf\config.properties
  path: D:\ltkjprojectconf
  properties: C:\ltkjprojectconf\configregion.properties
  path: C:\ltkjprojectconf
ltkj-admin/src/main/resources/application-test.yml
@@ -189,7 +189,7 @@
#  体检报告模板和报告临时生成存储的文件夹路径
path:
  filePath: D:\Tjreport
  filePath: C:\Tjreport
  # nginx图片服务器
  reportServer: https://ltpeis.xaltjdkj.cn:5516/
ltkj-common/src/main/java/com/ltkj/common/utils/IdUtils.java
@@ -31,6 +31,7 @@
        String currentDate = new SimpleDateFormat("yyyyMMdd").format(new Date());
        String storedDate = stringRedisTemplate.opsForValue().get(LIS_CURRENT_DATE_KEY);
        String lastIdStr = stringRedisTemplate.opsForValue().get(LIS_LAST_ID_KEY);
        if (StrUtil.isBlank(lastIdStr))lastIdStr = "0";
        int lastId;
        if (storedDate == null || !storedDate.equals(currentDate)) {
            lastId = 1;
ltkj-framework/pom.xml
@@ -3,7 +3,7 @@
         xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
         xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
    <parent>
        <artifactId>ltkj</artifactId>
        <artifactId>ltkj_peis_region</artifactId>
        <groupId>com.ltkj</groupId>
        <version>3.8.4</version>
    </parent>
ltkj-framework/src/main/java/com/ltkj/framework/aspectj/DataSourceAspect.java
@@ -2,6 +2,7 @@
import java.util.Objects;
import com.ltkj.db.DataSourceContextHolder;
import com.ltkj.framework.datasource.DynamicDataSourceContextHolder;
import org.aspectj.lang.ProceedingJoinPoint;
import org.aspectj.lang.annotation.Around;
@@ -35,6 +36,10 @@
    @Around("dsPointCut()")
    public Object around(ProceedingJoinPoint point) throws Throwable {
        String key = DataSourceContextHolder.getDataSourceKey();
        logger.info("执行之前");
        logger.info("DataSourceContextHolder ->{}",key);
        logger.info("DynamicDataSourceContextHolder ->{}",DynamicDataSourceContextHolder.getDataSourceType());
        DataSource dataSource = getDataSource(point);
        if (StringUtils.isNotNull(dataSource)) {
@@ -44,8 +49,16 @@
        try {
            return point.proceed();
        } finally {
            logger.info("执行之后");
            logger.info("DataSourceContextHolder ->{}",key);
            logger.info("DynamicDataSourceContextHolder ->{}",DynamicDataSourceContextHolder.getDataSourceType());
            // 销毁数据源 在执行方法之后
            DynamicDataSourceContextHolder.clearDataSourceType();
//            DataSourceContextHolder.setDataSourceKey(key);
//            DynamicDataSourceContextHolder.setDataSourceType(key);
            logger.info("执行之后 clear之后");
            logger.info("DataSourceContextHolder ->{}",key);
            logger.info("DynamicDataSourceContextHolder ->{}",DynamicDataSourceContextHolder.getDataSourceType());
        }
    }
ltkj-framework/src/main/java/com/ltkj/framework/aspectj/TransactionalDataSourceAspect.java
New file
@@ -0,0 +1,31 @@
package com.ltkj.framework.aspectj;
import com.ltkj.db.DataSourceConfig;
import com.ltkj.db.DataSourceContextHolder;
import com.ltkj.framework.datasource.DynamicDataSourceContextHolder;
import lombok.extern.slf4j.Slf4j;
import org.aspectj.lang.annotation.Aspect;
import org.aspectj.lang.annotation.Before;
import org.aspectj.lang.annotation.Pointcut;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Component;
@Slf4j
@Aspect
@Component
public class TransactionalDataSourceAspect {
    @Autowired
    private DataSourceConfig dataSourceConfig;
    @Pointcut("@annotation(org.springframework.transaction.annotation.Transactional)")
    public void transactionalMethods() {
    }
    @Before("transactionalMethods()")
    public void switchDataSourceBeforeTransaction() {
        String hospId = DataSourceContextHolder.getDataSourceKey();
        dataSourceConfig.addDataSource(hospId);
        DataSourceContextHolder.setDataSourceKey(hospId);
    }
}
ltkj-framework/src/main/java/com/ltkj/framework/interceptor/DBChangeInterceptor.java
@@ -24,7 +24,7 @@
 * @Date: 2025/2/7 11:07
 */
@Component
@Order(2)
@Order(1)
public class DBChangeInterceptor implements HandlerInterceptor {
    @Autowired
ltkj-generator/pom.xml
@@ -3,7 +3,7 @@
         xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
         xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
    <parent>
        <artifactId>ltkj</artifactId>
        <artifactId>ltkj_peis_region</artifactId>
        <groupId>com.ltkj</groupId>
        <version>3.8.4</version>
    </parent>
ltkj-quartz/pom.xml
@@ -3,7 +3,7 @@
         xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
         xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
    <parent>
        <artifactId>ltkj</artifactId>
        <artifactId>ltkj_peis_region</artifactId>
        <groupId>com.ltkj</groupId>
        <version>3.8.4</version>
    </parent>
ltkj-system/pom.xml
@@ -3,7 +3,7 @@
         xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
         xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
    <parent>
        <artifactId>ltkj</artifactId>
        <artifactId>ltkj_peis_region</artifactId>
        <groupId>com.ltkj</groupId>
        <version>3.8.4</version>
    </parent>
ltkj-system/src/main/java/com/ltkj/system/service/impl/SysConfigServiceImpl.java
@@ -61,15 +61,15 @@
     */
    @Override
    public String selectConfigByKey(String configKey) {
        String configValue = Convert.toStr(redisCache.getCacheObject(getCacheKey(configKey)));
        if (StringUtils.isNotEmpty(configValue)) {
            return configValue;
        }
//        String configValue = Convert.toStr(redisCache.getCacheObject(getCacheKey(configKey)));
//        if (StringUtils.isNotEmpty(configValue)) {
//            return configValue;
//        }
        SysConfig config = new SysConfig();
        config.setConfigKey(configKey);
        SysConfig retConfig = configMapper.selectConfig(config);
        if (StringUtils.isNotNull(retConfig)) {
            redisCache.setCacheObject(getCacheKey(configKey), retConfig.getConfigValue());
//            redisCache.setCacheObject(getCacheKey(configKey), retConfig.getConfigValue());
            return retConfig.getConfigValue();
        }
        return StringUtils.EMPTY;