package com.ltkj.web.controller.system; 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; import javax.annotation.Resource; import javax.servlet.http.HttpServletResponse; import cn.hutool.core.date.DateUtil; import cn.hutool.core.io.FileUtil; import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; import com.baomidou.mybatisplus.core.conditions.update.LambdaUpdateWrapper; 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 org.springframework.beans.factory.annotation.Value; import org.springframework.beans.factory.annotation.Autowired; 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; import static com.ltkj.web.config.pdfutils.PDFBinaryUtil.getPDFBinary; /** * 体检报告存储Controller * * @author ltkj * @date 2022-12-06 */ @RestController @RequestMapping("/system/report") @Api(tags = "体检报告") @Transactional public class TjReportController extends BaseController { @Resource private ITjReportService tjReportService; @Resource private ITjCustomerService tjCustomerService; @Autowired private ITjOrderService tjOrderService; @Autowired private ITjOrderDetailService tjOrderDetailService; @Resource private ITjProjectService projectService; @Resource private ITjOrderRemarkService tjOrderRemarkService; @Resource private ITjStandardService tjStandardService; @Resource private IDictCompService dictCompService; @Resource private ITjReportTemplateService reportTemplateService; @Value("${path.filePath}") private String value; @Value("${path.reportServer}") private String urlValue; @Resource private ISysUserService userService; @Resource private ITjOrderDetailRulesService detailRulesService; @Resource private ITjRulesService rulesService; @Autowired private ISysConfigService configService; @Autowired private ISysDictDataService dictDataService; @Resource private ITbTransitionService transitionService; @Autowired private ITjBigPositiveService tjBigPositiveService; @Autowired private HisPDFUtil hisPDFUtil; @GetMapping("/savePdf") @ApiOperation(value = "从本地存储模板到数据库") public AjaxResult savePdf() { //从文件地址读入PDF文件 仅存储一次 String base64String = PDFBinaryUtil.getPDFBinary("D:\\Tjreport\\体检模板5.pdf"); TjReportTemplate tem = new TjReportTemplate(); tem.setName("体检报告模板5"); tem.setRemark("体检报告模板5"); tem.setTemplate(base64String); tem.setFlag("1"); tem.setOpen("0"); final boolean save = reportTemplateService.save(tem); if (save) { return AjaxResult.success("保存成功"); } return AjaxResult.success("保存失败"); // String base64String2 = PDFBinaryUtil.getPDFBinary("D:\\Tjreport\\心电图1.pdf"); // TjReport tem2 = new TjReport(); // tem2.setTjNumber(tjNumber); // tem2.setReport(base64String2); // tem2.setType("心电图"); // tjReportService.save(tem2); // // String base64String1 = PDFBinaryUtil.getPDFBinary("D:\\Tjreport\\附件2.pdf"); // TjReport tem1 = new TjReport(); // tem1.setTjNumber(tjNumber); // tem1.setReport(base64String1); // tem1.setType("附件"); // tjReportService.save(tem1); } // /* *//** // * 查询体检报告存储列表 // *//* // @PreAuthorize("@ss.hasPermi('system:report:list')") // @GetMapping("/list") // public TableDataInfo list(TjReport tjReport) { // startPage(); // List list = tjReportService.selectTjReportList(tjReport); // return getDataTable(list); // } // // *//** // * 导出体检报告存储列表 // *//* // @PreAuthorize("@ss.hasPermi('system:report:export')") // @Log(title = "体检报告存储", businessType = BusinessType.EXPORT) // @PostMapping("/export") // public void export(HttpServletResponse response, TjReport tjReport) { // List list = tjReportService.selectTjReportList(tjReport); // ExcelUtil util = new ExcelUtil(TjReport.class); // util.exportExcel(response, list, "体检报告存储数据"); // } // // *//** // * 获取体检报告存储详细信息 // *//* // @PreAuthorize("@ss.hasPermi('system:report:query')") // @GetMapping(value = "/{reId}") // public AjaxResult getInfo(@PathVariable("reId") Long reId) { // return success(tjReportService.selectTjReportByReId(reId)); // } // // *//** // * 存储体检报告 // *//* // @PostMapping // @ApiOperation(value = "生成体检报告给总检审核") // public AjaxResult addReport(@RequestParam @ApiParam(value = "体检号") String tjNumber) { // ReportVO report = new ReportVO(); // LambdaQueryWrapper wq = new LambdaQueryWrapper<>(); // wq.eq(TjOrder::getTjNumber, tjNumber); // TjOrder tjOrder = tjOrderService.getOne(wq); // Integer checkStatus = tjOrder.getCheckStatus(); // if (checkStatus == 0) { // report.setTjOrder(tjOrder); // LambdaQueryWrapper wq1 = new LambdaQueryWrapper<>(); // wq1.eq(TjCustomer::getCusId, tjOrder.getUserId()); // report.setTjCustomer(tjCustomerService.getOne(wq1)); // LambdaQueryWrapper wq2 = new LambdaQueryWrapper<>(); // wq2.eq(TjOrderDetail::getOrderId, tjOrder.getOrderId()); // List list = tjOrderDetailService.list(wq2); // for (TjOrderDetail tjOrderDetail : list) { // TjProject tjProject = projectService.selectTjProjectByProId(tjOrderDetail.getProId()); // tjOrderDetail.setProject(tjProject); // // } // LambdaQueryWrapper wq5 = new LambdaQueryWrapper<>(); // wq5.eq(TjOrderRemark::getTjNumber, tjOrder.getTjNumber()); // List list1 = tjOrderRemarkService.list(wq5); // for (TjOrderRemark tjOrderRemark : list1) { // LambdaQueryWrapper wq3 = new LambdaQueryWrapper<>(); // wq3.eq(TjProject::getProParentId, tjOrderRemark.getProId()); // List list3 = projectService.list(wq3); // List collect = list3.stream().map(TjProject::getProId).collect(Collectors.toList()); // LambdaQueryWrapper wq4 = new LambdaQueryWrapper<>(); // wq4.eq(TjOrderDetail::getOrderId, tjOrder.getOrderId()); // wq4.in(TjOrderDetail::getProId, collect); // List list6 = tjOrderDetailService.list(wq4); // for (TjOrderDetail tjOrderDetail : list6) { // TjProject tjProject = projectService.selectTjProjectByProId(tjOrderDetail.getProId()); // tjOrderDetail.setProject(tjProject); // LambdaQueryWrapper wq7 = new LambdaQueryWrapper<>(); // wq7.eq(TjAdvice::getProId, tjOrderDetail.getProId()); // List list4 = tjAdviceService.list(wq7); // tjOrderDetail.setAdviceList(list4); // LambdaQueryWrapper wq6 = new LambdaQueryWrapper<>(); // wq6.eq(TjStandard::getProId, tjOrderDetail.getProId()); // List list2 = tjStandardService.list(wq6); // if (list2.size() == 0) { // tjOrderDetail.setStandard(null); // } else if (list2.size() == 1) { // tjOrderDetail.setStandard(list2.get(0)); // } else { // Long cusSex = tjCustomerService.getOne(wq1).getCusSex(); // Date cusBrithday = tjCustomerService.getOne(wq1).getCusBrithday(); // int age = DateUtil.ageOfNow(cusBrithday); // for (TjStandard tjStandard : list2) { // LambdaQueryWrapper wq8 = new LambdaQueryWrapper<>(); // if (tjStandard.getTjSex() != null) { // wq8.eq(TjStandard::getTjSex, cusSex); // } // if (tjStandard.getTjType() != null) { // wq8.eq(TjStandard::getTjType, StringUtils.getAgeType(age)); // } // TjStandard one = tjStandardService.getOne(wq8); // tjOrderDetail.setStandard(one); // } // } // } // tjOrderRemark.setTjOrderDetailList(list6); // // } // report.setTjOrderRemark(list1); // } else { // return AjaxResult.success("该报告已审核!"); // } // return AjaxResult.success(report); // } // // // *//** // * 修改体检报告存储 // *//* // @PreAuthorize("@ss.hasPermi('system:report:edit')") // @Log(title = "体检报告存储", businessType = BusinessType.UPDATE) // @PutMapping // public AjaxResult edit(@RequestBody TjReport tjReport) { // return toAjax(tjReportService.updateTjReport(tjReport)); // } // // *//** // * 删除体检报告存储 // *//* // @PreAuthorize("@ss.hasPermi('system:report:remove')") // @Log(title = "体检报告存储", businessType = BusinessType.DELETE) // @DeleteMapping("/{reIds}") // public AjaxResult remove(@PathVariable Long[] reIds) { // return toAjax(tjReportService.deleteTjReportByReIds(reIds)); // }*/ @Autowired private TjCheckController tjCheckController; @GetMapping("/toPdf/{TjNumber}") @ApiOperation(value = "打印体检报告为pdf") @Transactional public AjaxResult toPdf(@PathVariable("TjNumber") @ApiParam(value = "体检号") String tjNumber) { AjaxResult error = null; // 之前的代码 优化速度 // System.out.println("----------------------------------oldFun开始-------------------------------------------------------"); // error = oldFun(tjNumber); // System.out.println("--------------------------------------结束---------------------------------------------------"); // 撤销操作 // revocationReport(tjNumber); // 根据某人tj号以及ProId进行打印前的请求 // tjCheckController.getTjdetailList(tjNumber,null,1); // List updateOrderRemarkVos = new ArrayList<>(); // UpdateOrderRemarkVo remarkVo = new UpdateOrderRemarkVo(); // remarkVo.setRemarks("未见异常"); // remarkVo.setTjNumber("02132240308102232"); // remarkVo.setProId("1633660948860522555"); // updateOrderRemarkVos.add(remarkVo); // tjCheckController.checkUpdateOrderRemark(updateOrderRemarkVos); // System.out.println("---------------------------------------newFun开始--------------------------------------------------"); // 以前测试pdf方法 // error = newFun(tjNumber); // System.out.println("-------------------------------------------结束----------------------------------------------"); // 撤销 // revocationReport(tjNumber); // if (error != null) { // return error; // } // return AjaxResult.success("该用户体检未完成,不能打印报告!!!"); int num = tjOrderRemarkService.getTjYqOrderRemarkByTjNum(tjNumber); if (num > 0) { return AjaxResult.error("有延期项目暂不能生成报告!!!"); } //判断表中有没有该体检报告 不能重复生成 LambdaQueryWrapper wqa = new LambdaQueryWrapper<>(); wqa.eq(TjReport::getTjNumber, tjNumber); wqa.eq(TjReport::getType, "体检报告"); Integer count = tjReportService.getSelectCount(wqa); if (count != 0) { return AjaxResult.error("该客户报告已生成!不能重复生成!可直接预览或打印!"); } String configByKey = configService.selectConfigByKey("sfkqdyhis"); if (configByKey.equals("Y")) { LambdaQueryWrapper queryWrapper = new LambdaQueryWrapper<>(); queryWrapper.eq(TjOrder::getTjNumber, tjNumber); TjOrder tjOrder = tjOrderService.getOne(queryWrapper); if (null != tjOrder) { LambdaQueryWrapper tjReportTemplateLambdaQueryWrapper = new LambdaQueryWrapper<>(); TjReportTemplate reportTemplate = null; if (tjOrder.getTjCategory() != null) { //查询字典 LambdaQueryWrapper wqq = new LambdaQueryWrapper<>(); wqq.eq(SysDictData::getDictType, "dict_tjtype"); wqq.eq(SysDictData::getDictValue, tjOrder.getTjCategory()); SysDictData one = dictDataService.getOne(wqq); if (one != null) { //查询字典 LambdaQueryWrapper 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 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(); Date finishTime = tjOrder.getFinishTime(); SimpleDateFormat dateFormat = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss"); String ksrq = dateFormat.format(createTime); String jsrq = dateFormat.format(new Date()); HashMap params = new HashMap<>(); params.put("his_registration_id", hisRegistrationId); params.put("ksbm", ""); params.put("pationid", ""); params.put("ksrq", ksrq); params.put("jsrq", jsrq); params.put("pagecount", 100); params.put("page", 1); HashMap map = new HashMap<>(); LambdaQueryWrapper wq1 = new LambdaQueryWrapper<>(); wq1.eq(TjCustomer::getCusId, tjOrder.getUserId()); TjCustomer tjCustomer = tjCustomerService.getOne(wq1); // return hisPDFUtil.execHisRequest(map, params, tjOrder, reportTemplate); try { return hisPDFUtil.hisPDF(tjOrder,tjCustomer,reportTemplate); } catch (DocumentException e) { logger.error("生成报告异常"); e.printStackTrace(); return AjaxResult.error("生成报告异常"); } } else { return AjaxResult.error("请先总检"); } } } return AjaxResult.error(); } private AjaxResult newFun(String tjNumber) { long startTime = System.currentTimeMillis(); int num = tjOrderRemarkService.getTjYqOrderRemarkByTjNum(tjNumber); if (num > 0) { return AjaxResult.error("有延期项目暂不能生成报告!!!"); } LambdaQueryWrapper wq = new LambdaQueryWrapper<>(); wq.eq(TjOrder::getTjNumber, tjNumber); TjOrder tjOrder = tjOrderService.getOne(wq); if (null != tjOrder) { LambdaQueryWrapper tjReportTemplateLambdaQueryWrapper = new LambdaQueryWrapper<>(); TjReportTemplate reportTemplate = null; if (tjOrder.getTjCategory() != null) { //查询字典 LambdaQueryWrapper wqq = new LambdaQueryWrapper<>(); wqq.eq(SysDictData::getDictType, "dict_tjtype"); wqq.eq(SysDictData::getDictValue, tjOrder.getTjCategory()); SysDictData one = dictDataService.getOne(wqq); if (one != null) { //查询字典 LambdaQueryWrapper 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 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 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 wq1 = new LambdaQueryWrapper<>(); wq1.eq(TjCustomer::getCusId, tjOrder.getUserId()); TjCustomer tjCustomer = tjCustomerService.getOne(wq1); LambdaQueryWrapper wq111 = new LambdaQueryWrapper<>(); wq111.eq(DictComp::getDrugManufacturerId, tjOrder.getFirmId()); DictComp dictComp = dictCompService.getOne(wq111); LambdaQueryWrapper wq2 = new LambdaQueryWrapper<>(); wq2.eq(TjOrderDetail::getOrderId, tjOrder.getOrderId()); //20230306判断该项目是否退费/缴费 wq2.isNotNull(TjOrderDetail::getFlowingWaterId); //20230323判断该项目是否弃检/未检 // wq2.eq(TjOrderDetail::getTjStatus,1); List 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 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 bigPositiveLambdaQueryWrapper = new LambdaQueryWrapper<>(); bigPositiveLambdaQueryWrapper.eq(TjBigPositive::getTjNumber, tjNumber); final List 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 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 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 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 + "\\"; 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 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 list, Map data) { //填充性别:判断男女 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()); } } /** * 根据base64的PDF文件添加一页 * * @param copy pdf复制对象 * @param base64XinDianTu base64 pdf文件 * @throws IOException * @throws BadPdfFormatException */ private void addPageByPDFBase64(PdfCopy copy, String base64XinDianTu) throws IOException, BadPdfFormatException { byte[] pdfBytes = Base64.getDecoder().decode(base64XinDianTu); PdfReader pdfReader = new PdfReader(pdfBytes); int number = pdfReader.getNumberOfPages(); for (int i = 1; i <= number; i++) { PdfImportedPage importedPage = copy.getImportedPage(pdfReader, i); copy.addPage(importedPage); } } private ByteArrayOutputStream setInfoPage(String userId, String tjNumber) throws IOException, DocumentException { ByteArrayOutputStream byteArrayOutputStream = new ByteArrayOutputStream(); //文档对象 实现A4纸页面 Document document = new Document(PageSize.A4); PdfWriter pdfWriter = PdfWriter.getInstance(document, byteArrayOutputStream); //document.setMarginMirroring(true); //设置文档的页边距就是距离页面边上的距离,分别为:左边距,右边距,上边距,下边距 document.setMargins(70, 70, 40, 40); //pdfWriter.setPageEvent(new MyHeaderFooter());// 页眉页脚 document.open(); document.add(new Header("健康体检结果", "健康体检结果")); Map> tjOrderRemarkObjectMap = addTable(tjNumber); Map> tjOrderRemarkListMap = addHuaYanTable(tjNumber); tjOrderRemarkObjectMap.putAll(tjOrderRemarkListMap); for (Map.Entry> entry : tjOrderRemarkObjectMap.entrySet()) { List value = entry.getValue(); LambdaQueryWrapper 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); 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(); return byteArrayOutputStream; } private AjaxResult oldFun(String tjNumber) { long startTime = System.currentTimeMillis(); int num = tjOrderRemarkService.getTjYqOrderRemarkByTjNum(tjNumber); if (num > 0) return AjaxResult.error("有延期项目暂不能生成报告!!!"); LambdaQueryWrapper wq = new LambdaQueryWrapper<>(); wq.eq(TjOrder::getTjNumber, tjNumber); TjOrder tjOrder = tjOrderService.getOne(wq); if (null != tjOrder) { LambdaQueryWrapper tjReportTemplateLambdaQueryWrapper = new LambdaQueryWrapper<>(); TjReportTemplate reportTemplate = null; if (tjOrder.getTjCategory() != null) { //查询字典 LambdaQueryWrapper wqq = new LambdaQueryWrapper<>(); wqq.eq(SysDictData::getDictType, "dict_tjtype"); wqq.eq(SysDictData::getDictValue, tjOrder.getTjCategory()); SysDictData one = dictDataService.getOne(wqq); if (one != null) { //查询字典 LambdaQueryWrapper 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 wqa = new LambdaQueryWrapper<>(); wqa.eq(TjReport::getTjNumber, tjNumber); wqa.eq(TjReport::getType, "体检报告"); List 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 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() + "\\" + userId + "体检报告封面模板.pdf"); } // --------以上------- 根据数据库中的模板二进制文件 转pdf 创建文件夹 将pdf放进本地文件夹 LambdaQueryWrapper wq1 = new LambdaQueryWrapper<>(); wq1.eq(TjCustomer::getCusId, tjOrder.getUserId()); TjCustomer tjCustomer = tjCustomerService.getOne(wq1); LambdaQueryWrapper wq111 = new LambdaQueryWrapper<>(); wq111.eq(DictComp::getDrugManufacturerId, tjOrder.getFirmId()); DictComp dictComp = dictCompService.getOne(wq111); LambdaQueryWrapper wq2 = new LambdaQueryWrapper<>(); wq2.eq(TjOrderDetail::getOrderId, tjOrder.getOrderId()); //20230306判断该项目是否退费/缴费 wq2.isNotNull(TjOrderDetail::getFlowingWaterId); //20230323判断该项目是否弃检/未检 // wq2.eq(TjOrderDetail::getTjStatus,1); List list = tjOrderDetailService.list(wq2); for (TjOrderDetail tjOrderDetail : list) { TjProject tjProject = projectService.selectTjProjectByProId(tjOrderDetail.getProId()); tjOrderDetail.setProject(tjProject); } String inputFileName = value + "\\" + userId + "体检报告封面模板.pdf"; String outputFileName = value + "\\" + 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 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 bigPositiveLambdaQueryWrapper = new LambdaQueryWrapper<>(); bigPositiveLambdaQueryWrapper.eq(TjBigPositive::getTjNumber, tjNumber); final List 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 + "\\" + 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> tjOrderRemarkObjectMap = addTable(tjNumber); Map> tjOrderRemarkListMap = addHuaYanTable(tjNumber); tjOrderRemarkObjectMap.putAll(tjOrderRemarkListMap); for (Map.Entry> entry : tjOrderRemarkObjectMap.entrySet()) { List value = entry.getValue(); LambdaQueryWrapper 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); 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 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() + "\\" + userId + "医学名词.pdf"); // } LambdaQueryWrapper 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() + "\\" + tjNumber + userId + "心电图.pdf"); } LambdaQueryWrapper 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() + "\\" + 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"}; } else { files1 = new String[]{value + "\\" + userId + "体检报告封面页.pdf", value + "\\" + userId + tjNumber + "体检报告项目详情页.pdf", value + "\\" + tjNumber + userId + "心电图.pdf"}; } } else { if (one111112 != null) { files1 = new String[]{value + "\\" + userId + "体检报告封面页.pdf", value + "\\" + userId + tjNumber + "体检报告项目详情页.pdf", value + "\\" + tjNumber + userId + "附件.pdf"}; } else { files1 = new String[]{value + "\\" + userId + "体检报告封面页.pdf", value + "\\" + userId + tjNumber + "体检报告项目详情页.pdf"}; } } //合并 // String[] files1 = {value + "\\" + userId + "体检报告封面页.pdf", value + "\\" + userId + tjNumber+"体检报告项目详情页.pdf", value + "\\" +tjNumber+ userId + "附件.pdf", value + "\\" + tjNumber + userId + "心电图.pdf"}; String outputPath1 = value + "\\"; String outputFileName1 = userId + tjNumber + tjCustomer.getCusName() + "_体检报告.pdf"; File file1 = new File(outputPath1 + outputFileName1); List 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 + "\\" + tjNumber + "体检报告.pdf"); //FileUtil.del(value + "\\" + userId + "体检报告封面模板.pdf"); //FileUtil.del(value + "\\" + userId +tjNumber+ "体检报告项目详情页.pdf"); //FileUtil.del(value + "\\" + userId + "体检报告封面页.pdf"); //FileUtil.del(value + "\\" + userId + "心电图.pdf"); //修改order表中的打印报告时间为当前时间 LambdaUpdateWrapper 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; } //非化验项目报告 public Map> addTable(String tjNumber) { //创建map 键为父项目 值为子项目集合 // 不使用linked Map> printReport = new HashMap<>(); //查到该客户的体检记录 LambdaQueryWrapper wq1 = new LambdaQueryWrapper<>(); wq1.eq(TjOrder::getTjNumber, tjNumber); TjOrder one = tjOrderService.getOne(wq1); /* //拿到体检记录的orderid,查出项目详细信息 LambdaQueryWrapper wq = new LambdaQueryWrapper<>(); wq.eq(TjOrderDetail::getOrderId, one.getOrderId()); //20230323判断项目已检 wq.ne(TjOrderDetail::getTjStatus, 0); wq.ne(TjOrderDetail::getProId,projectService.getHuaYanProId()); wq.eq(TjOrderDetail::getProId,projectService.getNotCcCtXdtProId()); // wq.notIn(TjOrderDetail::getProId,projectService.getNneedReprotProId()); List tjOrderDetails = tjOrderDetailService.list(wq); //遍历体检记录 将项目的具体信息 //遍历客户所选的项目(包含子项父项) for (TjOrderDetail tjOrderDetail : tjOrderDetails) { TjProject tjProject = projectService.getById(tjOrderDetail.getProId()); if (null != tjProject) { tjOrderDetail.setProject(tjProject); } } */ LambdaQueryWrapper wq22 = new LambdaQueryWrapper<>(); wq22.eq(TjCustomer::getCusId, one.getUserId()); TjCustomer customer = tjCustomerService.getOne(wq22); LambdaQueryWrapper wqq = new LambdaQueryWrapper<>(); wqq.eq(TjOrderRemark::getTjNumber, tjNumber); wqq.ne(TjOrderRemark::getDeptId, "241"); wqq.in(TjOrderRemark::getDeptId, "269", "270", "253", "254", "255", "257", "251", "271"); wqq.notIn(TjOrderRemark::getProId, projectService.getNneedReprotProId()); List tjOrderRemarks = tjOrderRemarkService.list(wqq); for (TjOrderRemark tjOrderRemark : tjOrderRemarks) { printReport.put(tjOrderRemark, null); } // extracted(printReport, one, customer); extractedNew(printReport, one, customer); return printReport; } //化验项目报告 public Map> addHuaYanTable(String tjNumber) { //创建map 键为父项目 值为子项目集合 Map> printReport = new LinkedHashMap<>(); //查到该客户的体检记录 // LambdaQueryWrapper wq1 = new LambdaQueryWrapper<>(); // wq1.eq(TjOrder::getTjNumber, tjNumber); // TjOrder one = tjOrderService.getOne(wq1); //拿到体检记录的orderid,查出项目详细信息 // LambdaQueryWrapper wq = new LambdaQueryWrapper<>(); // wq.eq(TjOrderDetail::getOrderId, one.getOrderId()); // //20230323判断项目已检 // wq.ne(TjOrderDetail::getTjStatus, 0); // wq.eq(TjOrderDetail::getProId,projectService.getHuaYanProId()); // List tjOrderDetails = tjOrderDetailService.list(wq); List tjOrderDetails = tjOrderDetailService.addHuaYanTable(tjNumber); //遍历体检记录 将项目的具体信息 //遍历客户所选的项目(包含子项父项) // for (TjOrderDetail tjOrderDetail : tjOrderDetails) { // TjProject tjProject = projectService.getById(tjOrderDetail.getProId()); // if (null != tjProject) { // tjOrderDetail.setProject(tjProject); // } // } // LambdaQueryWrapper wq22 = new LambdaQueryWrapper<>(); // wq22.eq(TjCustomer::getCusId, one.getUserId()); // TjCustomer customer = tjCustomerService.getOne(wq22); // LambdaQueryWrapper wqq = new LambdaQueryWrapper<>(); // wqq.eq(TjOrderRemark::getTjNumber, tjNumber); // wqq.eq(TjOrderRemark::getDeptId,"241"); // List tjOrderRemarks = tjOrderRemarkService.list(wqq); List tjOrderRemarks = tjOrderRemarkService.addHuaYanTable(tjNumber); for (TjOrderRemark tjOrderRemark : tjOrderRemarks) { printReport.put(tjOrderRemark, null); } List toRemoveKeys = new ArrayList<>(); for (Map.Entry> entry : printReport.entrySet()) { List tjPdfVOS = new ArrayList<>(); for (TjOrderDetail tjOrderDetail : tjOrderDetails) { if (entry.getKey().getProId().equals(tjOrderDetail.getProId())) { TjPdfVO tjPdfVO = new TjPdfVO(); tjPdfVO.setProName(tjOrderDetail.getProName()); if (null != tjOrderDetail.getYcbz() && !tjOrderDetail.getYcbz().equals("")) { tjPdfVO.setProResult(tjOrderDetail.getProResult() + " [" + tjOrderDetail.getYcbz() + "]"); } else { tjPdfVO.setProResult(tjOrderDetail.getProResult()); } tjPdfVO.setExc(tjOrderDetail.getExceptionDesc()); tjPdfVO.setStandardValue(tjOrderDetail.getStanId()); tjPdfVO.setCompany(tjOrderDetail.getProAdvice()); tjPdfVOS.add(tjPdfVO); } } printReport.put(entry.getKey(), tjPdfVOS); if (tjPdfVOS.size() == 0) { toRemoveKeys.add(entry.getKey()); } } toRemoveKeys.forEach(printReport::remove); return printReport; } private void extracted(Map> printReport, TjOrder one, TjCustomer customer) { for (Map.Entry> entry : printReport.entrySet()) { List tjPdfVOS = new ArrayList<>(); // TjOrder one = tjOrderService.getOrderByTjNum(entry.getKey().getTjNumber()); System.out.println(one.getOrderId() + " " + entry.getKey().getProId()); List tjOrderDetails = tjOrderDetailService.getDetailByOrderIdAndParId(one.getOrderId(), entry.getKey().getProId()); System.out.println("tjOrderDetails = " + tjOrderDetails); for (TjOrderDetail tjOrderDetail : tjOrderDetails) { TjProject tjProject = projectService.getById(tjOrderDetail.getProId()); if (null != tjProject) { tjOrderDetail.setProject(tjProject); } if (null == tjOrderDetail.getProject()) { System.out.println("'''''''''''''''''''''''''''''''''''" + tjOrderDetail.getOrderDetailId()); } if (tjOrderDetail.getProject().getProParentId().equals(entry.getKey().getProId())) { LambdaQueryWrapper wq6 = new LambdaQueryWrapper<>(); wq6.eq(TjStandard::getProId, tjOrderDetail.getProId()); List list2 = tjStandardService.list(wq6); if (list2.size() == 0) { TjStandard s = new TjStandard(); s.setCompany(" "); s.setTjStandardLtValue(" "); s.setTjStandardGtValue(" "); tjOrderDetail.setStandard(s); } else if (list2.size() == 1) { tjOrderDetail.setStandard(list2.get(0)); } else { Long cusSex = customer.getCusSex(); Date cusBrithday = customer.getCusBrithday(); int age = DateUtil.ageOfNow(cusBrithday); for (TjStandard tjStandard : list2) { LambdaQueryWrapper wq8 = new LambdaQueryWrapper<>(); if (tjStandard.getTjSex() != null) { wq8.eq(TjStandard::getTjSex, cusSex); } if (tjStandard.getTjType() != null) { wq8.eq(TjStandard::getTjType, StringUtils.getAgeType(age)); } TjStandard standard = tjStandardService.getOne(wq8); tjOrderDetail.setStandard(standard); } } TjPdfVO tjPdfVO = new TjPdfVO(); tjPdfVO.setProName(tjOrderDetail.getProject().getProName()); tjPdfVO.setProResult(tjOrderDetail.getProResult()); tjPdfVO.setExc(tjOrderDetail.getExceptionDesc()); if (tjOrderDetail.getStandard() != null) { //单位 if (tjOrderDetail.getStandard().getCompany() == null) { tjPdfVO.setCompany(" "); } else { tjPdfVO.setCompany(tjOrderDetail.getStandard().getCompany()); } //最大值和最小值 String tjStandardGtValue = tjOrderDetail.getStandard().getTjStandardGtValue(); String tjStandardLtValue = tjOrderDetail.getStandard().getTjStandardLtValue(); if (tjStandardGtValue == null) { tjStandardGtValue = " "; } if (tjStandardLtValue == null) { tjStandardLtValue = " "; } tjPdfVO.setStandardValue(tjStandardLtValue + "-" + tjStandardGtValue); } tjPdfVOS.add(tjPdfVO); } } printReport.put(entry.getKey(), tjPdfVOS); } } private void extractedNew(Map> printReport, TjOrder one, TjCustomer customer) { List collect = printReport.entrySet().stream().map(item -> item.getKey().getProId()).collect(Collectors.toList()); List tjOrderDetails = tjOrderDetailService.getDetailByOrderIdAndParIds(one.getOrderId(), collect); Set strings = tjOrderDetails.stream().map(item -> item.getUpdateBy().split(",")[1]).collect(Collectors.toSet()); HashMap> hashMap = new HashMap<>(); strings.forEach(item -> { hashMap.put(Long.parseLong(item), new ArrayList()); }); List proIds = tjOrderDetails.stream().map(TjOrderDetail::getProId).collect(Collectors.toList()); LambdaQueryWrapper queryWrapper = new LambdaQueryWrapper<>(); queryWrapper.in(TjProject::getProId,proIds); List projectList = projectService.list(queryWrapper); for (TjOrderDetail tjOrderDetail : tjOrderDetails) { TjProject tjProject = projectList.stream().filter(item -> item.getProId().equals(tjOrderDetail.getProId())).collect(Collectors.toList()).get(0); if (null != tjProject) { tjOrderDetail.setProject(tjProject); } if (null == tjOrderDetail.getProject()) { System.out.println("'''''''''''''''''''''''''''''''''''" + tjOrderDetail.getOrderDetailId()); } // 判断在collect中是否存在 if (collect.contains(tjOrderDetail.getProject().getProParentId())){ LambdaQueryWrapper wq6 = new LambdaQueryWrapper<>(); wq6.eq(TjStandard::getProId, tjOrderDetail.getProId()); List list2 = tjStandardService.list(wq6); if (list2.size() == 0) { TjStandard s = new TjStandard(); s.setCompany(" "); s.setTjStandardLtValue(" "); s.setTjStandardGtValue(" "); tjOrderDetail.setStandard(s); } else if (list2.size() == 1) { tjOrderDetail.setStandard(list2.get(0)); } else { Long cusSex = customer.getCusSex(); Date cusBrithday = customer.getCusBrithday(); int age = DateUtil.ageOfNow(cusBrithday); for (TjStandard tjStandard : list2) { LambdaQueryWrapper wq8 = new LambdaQueryWrapper<>(); if (tjStandard.getTjSex() != null) { wq8.eq(TjStandard::getTjSex, cusSex); } if (tjStandard.getTjType() != null) { wq8.eq(TjStandard::getTjType, StringUtils.getAgeType(age)); } TjStandard standard = tjStandardService.getOne(wq8); tjOrderDetail.setStandard(standard); } } TjPdfVO tjPdfVO = new TjPdfVO(); tjPdfVO.setProName(tjOrderDetail.getProject().getProName()); tjPdfVO.setProResult(tjOrderDetail.getProResult()); tjPdfVO.setExc(tjOrderDetail.getExceptionDesc()); if (tjOrderDetail.getStandard() != null) { //单位 if (tjOrderDetail.getStandard().getCompany() == null) { tjPdfVO.setCompany(" "); } else { tjPdfVO.setCompany(tjOrderDetail.getStandard().getCompany()); } //最大值和最小值 String tjStandardGtValue = tjOrderDetail.getStandard().getTjStandardGtValue(); String tjStandardLtValue = tjOrderDetail.getStandard().getTjStandardLtValue(); if (tjStandardGtValue == null) { tjStandardGtValue = " "; } if (tjStandardLtValue == null) { tjStandardLtValue = " "; } tjPdfVO.setStandardValue(tjStandardLtValue + "-" + tjStandardGtValue); } List tjPdfVOS = hashMap.get(Long.parseLong(tjOrderDetail.getUpdateBy().split(",")[1])); tjPdfVOS.add(tjPdfVO); } } printReport.entrySet().stream().forEach(item->{ List pdfVOS = hashMap.get(item.getKey().getProId()); printReport.put(item.getKey(),pdfVOS); }); } @GetMapping("/isPdfOrJimu") @ApiOperation(value = "判断报告打开类型") public AjaxResult isPdfOrJimu(String tjNumber) { Map res = new HashMap<>(); LambdaQueryWrapper we = new LambdaQueryWrapper<>(); we.eq(TjReport::getTjNumber, tjNumber); we.eq(TjReport::getType, "体检报告"); TjReport one = tjReportService.getOne(we); if (one == null) { return AjaxResult.error("暂无体检报告"); } if ("pdf".equals(one.getPrint())) { res.put("flag", "0"); return AjaxResult.success(res); } else if ("报表".equals(one.getPrint())) { res.put("flag", "1"); res.put("url", one.getPath()); return AjaxResult.success(res); } else { return AjaxResult.error("暂无体检报告"); } } @GetMapping("/preview/{flag}/{TjNumber}") @ApiOperation(value = "下载体检报告") public void preview(HttpServletResponse response, @PathVariable("flag") boolean flag, @PathVariable("TjNumber") String tjNumber) { //修改order表中的下载报告时间为当前时间 LambdaUpdateWrapper 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 wq1 = new LambdaQueryWrapper<>(); wq1.eq(TjOrder::getTjNumber, tjNumber); TjOrder tjOrder = tjOrderService.getOne(wq1); LambdaQueryWrapper wq2 = new LambdaQueryWrapper<>(); wq2.eq(TjCustomer::getCusId, tjOrder.getUserId()); TjCustomer tjCustomer = tjCustomerService.getOne(wq2); LambdaQueryWrapper 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() + "\\" + userId + tjNumber + tjCustomer.getCusName() + "_体检报告.pdf"); //String filePath = one.getPath(); String filePath = value + "\\" + 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); } 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 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 tjNumbers) { ArrayList base64Pdfs = new ArrayList<>(); for (String tjNumber : tjNumbers) { LambdaQueryWrapper wq = new LambdaQueryWrapper<>(); wq.eq(TjOrder::getTjNumber, tjNumber); TjOrder tjOrder = tjOrderService.getOne(wq); if (null != tjOrder) { LambdaQueryWrapper tjReportTemplateLambdaQueryWrapper = new LambdaQueryWrapper<>(); TjReportTemplate reportTemplate = null; if (tjOrder.getTjCategory() != null) { //查询字典 LambdaQueryWrapper wqq = new LambdaQueryWrapper<>(); wqq.eq(SysDictData::getDictType, "dict_tjtype"); wqq.eq(SysDictData::getDictValue, tjOrder.getTjCategory()); SysDictData one = dictDataService.getOne(wqq); if (one != null) { //查询字典 LambdaQueryWrapper 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 wq1 = new LambdaQueryWrapper<>(); wq1.eq(TjCustomer::getCusId, tjOrder.getUserId()); TjCustomer tjCustomer = tjCustomerService.getOne(wq1); LambdaQueryWrapper wq111 = new LambdaQueryWrapper<>(); wq111.eq(DictComp::getDrugManufacturerId, tjOrder.getFirmId()); DictComp dictComp = dictCompService.getOne(wq111); LambdaQueryWrapper wq2 = new LambdaQueryWrapper<>(); wq2.eq(TjOrderDetail::getOrderId, tjOrder.getOrderId()); wq2.isNotNull(TjOrderDetail::getFlowingWaterId); List 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 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 bigPositiveLambdaQueryWrapper = new LambdaQueryWrapper<>(); bigPositiveLambdaQueryWrapper.eq(TjBigPositive::getTjNumber, tjNumber); final List 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 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 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 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 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 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 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("撤回成功!"); } return AjaxResult.error("撤回失败!"); } @GetMapping("/tuanDuiReport") @ApiOperation(value = "生成团队体检报告——年龄统计") public Map>> tuanDuiReport(@ApiParam(value = "单位") @RequestParam String firmId, @ApiParam(value = "部门") @RequestParam String firmDeptId) { Map>> all = new HashMap<>(); List> res1 = new ArrayList<>(); int a = 0; Map resMap1 = new HashMap<>(); resMap1.put("name", "0-19岁"); resMap1.put("value", a); res1.add(resMap1); Map resMap2 = new HashMap<>(); resMap2.put("name", "20-29岁"); resMap2.put("value", a); res1.add(resMap2); Map resMap3 = new HashMap<>(); resMap3.put("name", "30-39岁"); resMap3.put("value", a); res1.add(resMap3); Map resMap4 = new HashMap<>(); resMap4.put("name", "40-49岁"); resMap4.put("value", a); res1.add(resMap4); Map resMap5 = new HashMap<>(); resMap5.put("name", "50-59岁"); resMap5.put("value", a); res1.add(resMap5); Map resMap6 = new HashMap<>(); resMap6.put("name", "60-69岁"); resMap6.put("value", a); res1.add(resMap6); Map resMap7 = new HashMap<>(); resMap7.put("name", "70-79岁"); resMap7.put("value", a); res1.add(resMap7); Map resMap8 = new HashMap<>(); resMap8.put("name", "80岁+"); resMap8.put("value", a); res1.add(resMap8); LambdaQueryWrapper wq2 = new LambdaQueryWrapper<>(); wq2.eq(TjOrder::getFirmId, firmId); wq2.eq(TjOrder::getFirmDeptId, firmDeptId); wq2.eq(TjOrder::getTjType, "1"); wq2.in(TjOrder::getStatus, 401, 402); final List list = tjOrderService.list(wq2); for (TjOrder tjOrder : list) { a = 0; final TjCustomer byId = tjCustomerService.getById(tjOrder.getUserId()); final int ageByIdCard = MatchUtils.getAgeByIdCard(byId.getCusIdcard()); if (0 <= ageByIdCard && ageByIdCard <= 19) { for (int i = 0; i < res1.size(); i++) { if ("0-19岁".equals(res1.get(i).get("name"))) { a += 1; res1.get(i).put("value", a); } } } else if (20 <= ageByIdCard && ageByIdCard <= 29) { for (int i = 0; i < res1.size(); i++) { if ("20-29岁".equals(res1.get(i).get("name"))) { a += 1; res1.get(i).put("value", a); } } } else if (30 <= ageByIdCard && ageByIdCard <= 39) { for (int i = 0; i < res1.size(); i++) { if ("30-39岁".equals(res1.get(i).get("name"))) { a += 1; res1.get(i).put("value", a); } } } else if (40 <= ageByIdCard && ageByIdCard <= 49) { for (int i = 0; i < res1.size(); i++) { if ("40-49岁".equals(res1.get(i).get("name"))) { a += 1; res1.get(i).put("value", a); } } } else if (50 <= ageByIdCard && ageByIdCard <= 59) { for (int i = 0; i < res1.size(); i++) { if ("50-59岁".equals(res1.get(i).get("name"))) { a += 1; res1.get(i).put("value", a); } } } else if (60 <= ageByIdCard && ageByIdCard <= 69) { for (int i = 0; i < res1.size(); i++) { if ("60-69岁".equals(res1.get(i).get("name"))) { a += 1; res1.get(i).put("value", a); } } } else if (70 <= ageByIdCard && ageByIdCard <= 79) { for (int i = 0; i < res1.size(); i++) { if ("70-79岁".equals(res1.get(i).get("name"))) { a += 1; res1.get(i).put("value", a); } } } else { for (int i = 0; i < res1.size(); i++) { if ("80岁+".equals(res1.get(i).get("name"))) { a += 1; res1.get(i).put("value", a); } } } } all.put("data", res1); return all; } @GetMapping("/tuanDuiReportBySex") @ApiOperation(value = "生成团队体检报告——年龄性别统计") public Map>> tuanDuiReportBySex(@ApiParam(value = "单位") @RequestParam String firmIds, @ApiParam(value = "部门") @RequestParam String firmDeptIds) { Map>> all = new HashMap<>(); List> res1 = new ArrayList<>(); int a = 0; int b = 0; int c = 0; Map resMap1 = new HashMap<>(); resMap1.put("name", "0-19岁"); resMap1.put("value", a); resMap1.put("boy", b); resMap1.put("girl", c); resMap1.put("value1", 0); resMap1.put("boy1", 0); resMap1.put("girl1", 0); res1.add(resMap1); Map resMap2 = new HashMap<>(); resMap2.put("name", "20-29岁"); resMap2.put("value", a); resMap2.put("boy", b); resMap2.put("girl", c); resMap2.put("value1", 0); resMap2.put("boy1", 0); resMap2.put("girl1", 0); res1.add(resMap2); Map resMap3 = new HashMap<>(); resMap3.put("name", "30-39岁"); resMap3.put("value", a); resMap3.put("boy", b); resMap3.put("girl", c); resMap3.put("value1", 0); resMap3.put("boy1", 0); resMap3.put("girl1", 0); res1.add(resMap3); Map resMap4 = new HashMap<>(); resMap4.put("name", "40-49岁"); resMap4.put("value", a); resMap4.put("boy", b); resMap4.put("girl", c); resMap4.put("value1", 0); resMap4.put("boy1", 0); resMap4.put("girl1", 0); res1.add(resMap4); Map resMap5 = new HashMap<>(); resMap5.put("name", "50-59岁"); resMap5.put("value", a); resMap5.put("boy", b); resMap5.put("girl", c); resMap5.put("value1", 0); resMap5.put("boy1", 0); resMap5.put("girl1", 0); res1.add(resMap5); Map resMap6 = new HashMap<>(); resMap6.put("name", "60-69岁"); resMap6.put("value", a); resMap6.put("boy", b); resMap6.put("girl", c); resMap6.put("value1", 0); resMap6.put("boy1", 0); resMap6.put("girl1", 0); res1.add(resMap6); Map resMap7 = new HashMap<>(); resMap7.put("name", "70-79岁"); resMap7.put("value", a); resMap7.put("boy", b); resMap7.put("girl", c); resMap7.put("value1", 0); resMap7.put("boy1", 0); resMap7.put("girl1", 0); res1.add(resMap7); Map resMap8 = new HashMap<>(); resMap8.put("name", "80岁+"); resMap8.put("value", a); resMap8.put("boy", b); resMap8.put("girl", c); resMap8.put("value1", 0); resMap8.put("boy1", 0); resMap8.put("girl1", 0); res1.add(resMap8); LambdaQueryWrapper wq2 = new LambdaQueryWrapper<>(); wq2.eq(TjOrder::getFirmId, firmIds); wq2.eq(TjOrder::getFirmDeptId, firmDeptIds); wq2.eq(TjOrder::getTjType, "1"); wq2.in(TjOrder::getStatus, 401, 402); final List list = tjOrderService.list(wq2); for (TjOrder tjOrder : list) { a = 0; b = 0; c = 0; final TjCustomer byId = tjCustomerService.getById(tjOrder.getUserId()); final int ageByIdCard = MatchUtils.getAgeByIdCard(byId.getCusIdcard()); if (0 <= ageByIdCard && ageByIdCard <= 19) { for (int i = 0; i < res1.size(); i++) { if ("0-19岁".equals(res1.get(i).get("name"))) { a += 1; res1.get(i).put("value", a); if (byId.getCusSex() == 0) { b += 1; } else if (byId.getCusSex() == 1) { c += 1; } res1.get(i).put("boy", b); res1.get(i).put("girl", c); } } } else if (20 <= ageByIdCard && ageByIdCard <= 29) { for (int i = 0; i < res1.size(); i++) { if ("20-29岁".equals(res1.get(i).get("name"))) { a += 1; res1.get(i).put("value", a); if (byId.getCusSex() == 0) { b += 1; } else if (byId.getCusSex() == 1) { c += 1; } res1.get(i).put("boy", b); res1.get(i).put("girl", c); } } } else if (30 <= ageByIdCard && ageByIdCard <= 39) { for (int i = 0; i < res1.size(); i++) { if ("30-39岁".equals(res1.get(i).get("name"))) { a += 1; res1.get(i).put("value", a); if (byId.getCusSex() == 0) { b += 1; } else if (byId.getCusSex() == 1) { c += 1; } res1.get(i).put("boy", b); res1.get(i).put("girl", c); } } } else if (40 <= ageByIdCard && ageByIdCard <= 49) { for (int i = 0; i < res1.size(); i++) { if ("40-49岁".equals(res1.get(i).get("name"))) { a += 1; res1.get(i).put("value", a); if (byId.getCusSex() == 0) { b += 1; } else if (byId.getCusSex() == 1) { c += 1; } res1.get(i).put("boy", b); res1.get(i).put("girl", c); } } } else if (50 <= ageByIdCard && ageByIdCard <= 59) { for (int i = 0; i < res1.size(); i++) { if ("50-59岁".equals(res1.get(i).get("name"))) { a += 1; res1.get(i).put("value", a); if (byId.getCusSex() == 0) { b += 1; } else if (byId.getCusSex() == 1) { c += 1; } res1.get(i).put("boy", b); res1.get(i).put("girl", c); } } } else if (60 <= ageByIdCard && ageByIdCard <= 69) { for (int i = 0; i < res1.size(); i++) { if ("60-69岁".equals(res1.get(i).get("name"))) { a += 1; res1.get(i).put("value", a); if (byId.getCusSex() == 0) { b += 1; } else if (byId.getCusSex() == 1) { c += 1; } res1.get(i).put("boy", b); res1.get(i).put("girl", c); } } } else if (70 <= ageByIdCard && ageByIdCard <= 79) { for (int i = 0; i < res1.size(); i++) { if ("70-79岁".equals(res1.get(i).get("name"))) { a += 1; res1.get(i).put("value", a); if (byId.getCusSex() == 0) { b += 1; } else if (byId.getCusSex() == 1) { c += 1; } res1.get(i).put("boy", b); res1.get(i).put("girl", c); } } } else { for (int i = 0; i < res1.size(); i++) { if ("80岁+".equals(res1.get(i).get("name"))) { a += 1; res1.get(i).put("value", a); if (byId.getCusSex() == 0) { b += 1; } else if (byId.getCusSex() == 1) { c += 1; } res1.get(i).put("boy", b); res1.get(i).put("girl", c); } } } } //计算百分数 for (int i = 0; i < res1.size(); i++) { final int value1 = (int) res1.get(i).get("boy"); final int value2 = (int) res1.get(i).get("girl"); final int value = (int) res1.get(i).get("value"); if (value != 0) { double percentage = (value1 * 1.0 / value) * 100; NumberFormat nf = NumberFormat.getPercentInstance(); nf.setMinimumFractionDigits(2); String percent1 = nf.format(percentage / 100); double percentage1 = (value2 * 1.0 / value) * 100; NumberFormat nf1 = NumberFormat.getPercentInstance(); nf1.setMinimumFractionDigits(2); String percent2 = nf1.format(percentage1 / 100); NumberFormat numberFormat = NumberFormat.getInstance(); numberFormat.setMaximumFractionDigits(2); String result = numberFormat.format((float) value1 / (float) value2 * 100); res1.get(i).put("boy1", percent1); res1.get(i).put("girl1", percent2); res1.get(i).put("value1", result); } } all.put("data", res1); return all; } @GetMapping("/tuanDuiYiChang") @ApiOperation(value = "生成团队体检报告——异常结果统计") public Map>> tuanDuiYiChang(@ApiParam(value = "单位") @RequestParam String firmId, @ApiParam(value = "部门") @RequestParam String firmDeptId) { Map>> all = new HashMap<>(); LambdaQueryWrapper wq2 = new LambdaQueryWrapper<>(); wq2.eq(TjOrder::getFirmId, firmId); wq2.eq(TjOrder::getFirmDeptId, firmDeptId); wq2.eq(TjOrder::getTjType, "1"); wq2.in(TjOrder::getStatus, 401, 402); final List list = tjOrderService.list(wq2); List res11 = new ArrayList<>(); for (TjOrder tjOrder : list) { LambdaQueryWrapper wq1 = new LambdaQueryWrapper<>(); wq1.eq(TjOrderDetailRules::getTjNumber, tjOrder.getTjNumber()); final List list1 = detailRulesService.list(wq1); //放进集合 res11.addAll(list1); } //去重收集 Map columnCountMap = res11.stream().collect(Collectors.groupingBy(TjOrderDetailRules::getAid, Collectors.counting())); List> aaa = new ArrayList<>(); if (columnCountMap != null) { for (Map.Entry entry : columnCountMap.entrySet()) { Map resMap = new HashMap<>(); final TjRules byId = rulesService.getById(entry.getKey()); if (byId != null) { resMap.put("name", byId.getBingzhong()); resMap.put("value", String.valueOf(entry.getValue())); aaa.add(resMap); } } } all.put("data", aaa); return all; } @GetMapping("/tuanDuiYiChangBySex") @ApiOperation(value = "生成团队体检报告——男女异常结果统计") public Map>> tuanDuiYiChangBySex(@ApiParam(value = "单位") @RequestParam String firmId, @ApiParam(value = "部门") @RequestParam String firmDeptId) { Map>> all = new HashMap<>(); LambdaQueryWrapper wq2 = new LambdaQueryWrapper<>(); wq2.eq(TjOrder::getFirmId, firmId); wq2.eq(TjOrder::getFirmDeptId, firmDeptId); wq2.eq(TjOrder::getTjType, "1"); wq2.in(TjOrder::getStatus, 401, 402); final List list = tjOrderService.list(wq2); List tjNumberList = list.stream().map(TjOrder::getTjNumber).collect(Collectors.toList()); List res11 = new ArrayList<>(); for (TjOrder tjOrder : list) { LambdaQueryWrapper wq1 = new LambdaQueryWrapper<>(); wq1.eq(TjOrderDetailRules::getTjNumber, tjOrder.getTjNumber()); final List list1 = detailRulesService.list(wq1); //放进集合 res11.addAll(list1); } //去重收集 Map columnCountMap = res11.stream().collect(Collectors.groupingBy(TjOrderDetailRules::getAid, Collectors.counting())); List> aaa = new ArrayList<>(); if (columnCountMap != null) { for (Map.Entry entry : columnCountMap.entrySet()) { int a = 0; int b = 0; Map resMap = new HashMap<>(); final TjRules byId = rulesService.getById(entry.getKey()); if (byId != null) { resMap.put("name", byId.getBingzhong()); resMap.put("value", entry.getValue().intValue()); resMap.put("boy", a); resMap.put("girl", b); resMap.put("value1", 0); resMap.put("boy1", 0); resMap.put("girl1", 0); // LambdaQueryWrapper wq11 = new LambdaQueryWrapper<>(); wq11.eq(TjOrderDetailRules::getAid, entry.getKey()); wq11.in(TjOrderDetailRules::getTjNumber, tjNumberList); final List list1 = detailRulesService.list(wq11); for (TjOrderDetailRules orderDetailRules : list1) { resMap.put("name", orderDetailRules.getBingzhong()); if ("0".equals(orderDetailRules.getCusSex())) { a += 1; resMap.put("boy", a); } else if ("1".equals(orderDetailRules.getCusSex())) { b += 1; resMap.put("girl", b); } } aaa.add(resMap); } } } //计算百分数 for (int i = 0; i < aaa.size(); i++) { final Integer value1 = (Integer) aaa.get(i).get("boy"); final Integer value2 = (Integer) aaa.get(i).get("girl"); final Integer value = (Integer) aaa.get(i).get("value"); if (value != 0) { double percentage = (value1 * 1.0 / value) * 100; NumberFormat nf = NumberFormat.getPercentInstance(); nf.setMinimumFractionDigits(2); String percent1 = nf.format(percentage / 100); double percentage1 = (value2 * 1.0 / value) * 100; NumberFormat nf1 = NumberFormat.getPercentInstance(); nf1.setMinimumFractionDigits(2); String percent2 = nf1.format(percentage1 / 100); NumberFormat numberFormat = NumberFormat.getInstance(); numberFormat.setMaximumFractionDigits(2); String result = numberFormat.format((float) value1 / (float) value2 * 100); aaa.get(i).put("boy1", percent1); aaa.get(i).put("girl1", percent2); aaa.get(i).put("value1", result); } } all.put("data", aaa); return all; } @GetMapping("/reportHistory") @ApiOperation(value = "历史报告") public AjaxResult reportHistory(Long cusId) { List res = new ArrayList<>(); LambdaQueryWrapper wqq = new LambdaQueryWrapper<>(); wqq.like(TjOrder::getUserId, cusId); List orderList = tjOrderService.list(wqq); if (orderList != null && orderList.size() > 0) { for (TjOrder tjOrder : orderList) { if (tjOrder != null) { LambdaQueryWrapper wq = new LambdaQueryWrapper<>(); wq.eq(TjReport::getTjNumber, tjOrder.getTjNumber()); wq.eq(TjReport::getType, "体检报告"); TjReport one = tjReportService.getOne(wq); if (null != one) { res.add(one); } } } return AjaxResult.success(res); } return AjaxResult.error("暂无历史报告"); } }