From 2a69e83e9da749516791ab1333aded5226274cc4 Mon Sep 17 00:00:00 2001 From: "15881625488@163.com" <15881625488@163.com> Date: Sat, 17 Jan 2026 17:02:23 +0800 Subject: [PATCH] =?UTF-8?q?feat=EF=BC=9A[=E8=AF=95=E9=AA=8C=E7=AE=A1?= =?UTF-8?q?=E7=90=86]=E8=A1=A8=E5=8D=95=E5=AF=BC=E5=87=BA?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../controller/StudyFormFillController.java | 36 +++- .../com/hxhq/business/utils/pdf/PdfBaseUtil.java | 21 +- .../com/hxhq/business/utils/pdf/resource/Drug.java | 31 +-- .../hxhq/business/utils/pdf/template/sp/Sp001.java | 224 +++++++++++++++++++-- 4 files changed, 268 insertions(+), 44 deletions(-) diff --git a/hxhq-modules/hxhq-system/src/main/java/com/hxhq/business/controller/StudyFormFillController.java b/hxhq-modules/hxhq-system/src/main/java/com/hxhq/business/controller/StudyFormFillController.java index b9226d1..454c1f2 100644 --- a/hxhq-modules/hxhq-system/src/main/java/com/hxhq/business/controller/StudyFormFillController.java +++ b/hxhq-modules/hxhq-system/src/main/java/com/hxhq/business/controller/StudyFormFillController.java @@ -2,18 +2,18 @@ package com.hxhq.business.controller; import java.util.List; -import com.hxhq.business.domain.StudyFormFillJcgj; -import com.hxhq.business.domain.StudyFormFillQmxx; +import com.hxhq.business.domain.*; import com.hxhq.business.dto.study.StudyFormFillListDto; import com.hxhq.business.form.study.StudyFormFillGcForm; import com.hxhq.business.form.study.StudyFormFillShfzForm; import com.hxhq.business.form.study.StudyFormFillSearchForm; import com.hxhq.business.form.study.StudyFormUpdateForm; import com.hxhq.business.service.*; +import com.hxhq.business.utils.pdf.PdfExportUtil; import com.hxhq.common.security.annotation.RequiresPermissions; import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.beans.factory.annotation.Value; import org.springframework.web.bind.annotation.*; -import com.hxhq.business.domain.StudyFormFill; import com.hxhq.common.core.web.controller.BaseController; import com.hxhq.common.core.web.domain.AjaxResult; import com.hxhq.common.core.web.page.TableDataInfo; @@ -34,6 +34,16 @@ public class StudyFormFillController extends BaseController { private IStudyFormFillJcgjService studyFormFillJcgjService; @Autowired private IStudyFormFillQmxxService studyFormFillQmxxService; + /** + * 上传文件存储在本地的根路径 + */ + @Value("${file.path}") + private String localFilePath; + /** + * 资源映射路径 前缀 + */ + @Value("${file.prefix}") + public String localFilePrefix; /** * 列表 @@ -77,6 +87,26 @@ public class StudyFormFillController extends BaseController { return AjaxResult.success(studyFormFillService.queryInfo(id)); } + + /** + * 导出 + */ + @RequiresPermissions({"business:studyFormFill:xq","business:nonTrialFormFill:xq","business:drugFormFill:xq"}) + @GetMapping(value = "/exportDetail") + public AjaxResult exportDetail(StudyFormFillJcgj form) { + List studyFormFillJcgjList = studyFormFillJcgjService.queryList(form); + StudyFormFillQmxx studyFormFillQmxx = new StudyFormFillQmxx(); + studyFormFillQmxx.setFormId(form.getFormId()); + List studyFormFillQmxxList = studyFormFillQmxxService.queryList(studyFormFillQmxx); + return AjaxResult.success(localFilePrefix + PdfExportUtil.export( + "com.hxhq.business.utils.pdf.template.sp.Sp001", + "exportDetail", + studyFormFillService.queryInfo(form.getFormId()), + studyFormFillQmxxList, + studyFormFillJcgjList, + localFilePath)); + } + /** * 加签 */ diff --git a/hxhq-modules/hxhq-system/src/main/java/com/hxhq/business/utils/pdf/PdfBaseUtil.java b/hxhq-modules/hxhq-system/src/main/java/com/hxhq/business/utils/pdf/PdfBaseUtil.java index da75c30..3731c60 100644 --- a/hxhq-modules/hxhq-system/src/main/java/com/hxhq/business/utils/pdf/PdfBaseUtil.java +++ b/hxhq-modules/hxhq-system/src/main/java/com/hxhq/business/utils/pdf/PdfBaseUtil.java @@ -2,6 +2,7 @@ package com.hxhq.business.utils.pdf; import com.hxhq.common.core.exception.ServiceException; import com.hxhq.common.core.text.Convert; +import com.hxhq.common.core.utils.StringUtils; import com.itextpdf.text.*; import com.itextpdf.text.pdf.*; import com.itextpdf.text.pdf.draw.LineSeparator; @@ -343,15 +344,17 @@ public class PdfBaseUtil { // 重复铺满水印 addRepeatedWatermark(content, width, height, signText); -// // 添加页眉文字 -// canvas.beginText(); -// canvas.setFontAndSize(baseFont, fontSize); -// canvas.setTextMatrix(textX, textY); -// canvas.showText(headerText); -// canvas.endText(); -// -// // 添加页眉分隔线(可选) -// addHeaderLine(canvas, pageWidth, textY - 10); + // 添加页眉文字 + if(StringUtils.isNoneBlank(headerText)) { + canvas.beginText(); + canvas.setFontAndSize(baseFont, fontSize); + canvas.setTextMatrix(textX, textY); + canvas.showText(headerText); + canvas.endText(); + + // 添加页眉分隔线(可选) + addHeaderLine(canvas, pageWidth, textY - 10); + } } catch (Exception e) { e.printStackTrace(); diff --git a/hxhq-modules/hxhq-system/src/main/java/com/hxhq/business/utils/pdf/resource/Drug.java b/hxhq-modules/hxhq-system/src/main/java/com/hxhq/business/utils/pdf/resource/Drug.java index 59c3d07..b79773c 100644 --- a/hxhq-modules/hxhq-system/src/main/java/com/hxhq/business/utils/pdf/resource/Drug.java +++ b/hxhq-modules/hxhq-system/src/main/java/com/hxhq/business/utils/pdf/resource/Drug.java @@ -6,6 +6,7 @@ import com.fasterxml.jackson.databind.ObjectMapper; import com.hxhq.business.domain.Mjy; import com.hxhq.business.domain.MjyJcgj; import com.hxhq.business.domain.MjyTz; +import com.hxhq.business.domain.StudyFormFillJcgj; import com.hxhq.business.dto.mjy.DetailDto; import com.hxhq.business.utils.pdf.PdfBaseUtil; import com.hxhq.common.core.utils.StringUtils; @@ -49,7 +50,7 @@ public class Drug { if(loginUser!=null){ sign=loginUser.getSysUser().getNickName(); } - document = PdfBaseUtil.init(document, fos, filePath, sign+sdf.format(new Date()), mjy.getMc()); + document = PdfBaseUtil.init(document, fos, filePath, sign+sdf.format(new Date()), null); // 基本信息 PdfBaseUtil.addUnderlinedTitle(document, "基本信息", 10,true); Map formData1 = new LinkedHashMap<>(); @@ -71,6 +72,7 @@ public class Drug { PdfBaseUtil.addUnderlinedTitle(document, "麻精药台账", 10,true); // 台账 addTz(document,mjyTzList); + PdfBaseUtil.addUnderlinedTitle(document, "稽查轨迹", 10,true); //稽查轨迹 addJcgj(document,mjyJcgjList); logger.info("生成成功:{}", filePath); @@ -134,7 +136,6 @@ public class Drug { rowNum++; } document.add(table); - PdfBaseUtil.addUnderlinedTitle(document, "稽查轨迹", 10,true); } /** @@ -146,21 +147,23 @@ public class Drug { */ public void addJcgj(Document document,List mjyJcgjList) throws IOException, DocumentException { SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss"); - for (MjyJcgj mjyJcgj : mjyJcgjList) { - PdfBaseUtil.addUnderlinedTitle(document, sdf.format(mjyJcgj.getCreateTime())+" "+mjyJcgj.getJcmc() , 10,false); + for (MjyJcgj jcgj : mjyJcgjList) { + PdfBaseUtil.addUnderlinedTitle(document, sdf.format(jcgj.getCreateTime())+" "+jcgj.getJcmc() , 10,false); StringJoiner result = new StringJoiner(", "); - ObjectMapper mapper = new ObjectMapper(); - JsonNode jsonArray = mapper.readTree(mjyJcgj.getJcnr()); - for (JsonNode node : jsonArray) { - String name = node.get("name").asText(); - String value = node.get("value").asText(); - result.add(name + ":" + value); + if(StringUtils.isNoneBlank(jcgj.getJcnr())){ + ObjectMapper mapper = new ObjectMapper(); + JsonNode jsonArray = mapper.readTree(jcgj.getJcnr()); + for (JsonNode node : jsonArray) { + String name = node.get("name").asText(); + String value = node.get("value").asText(); + result.add(name + ":" + value); + } } - if(StringUtils.isNoneBlank(mjyJcgj.getRemark())){ - result.add("备注:"+mjyJcgj.getRemark()); + if(StringUtils.isNoneBlank(jcgj.getRemark())){ + result.add("备注:"+jcgj.getRemark()); } - if(StringUtils.isNoneBlank(mjyJcgj.getRemark())){ - result.add("签名人:"+mjyJcgj.getQmrMc()); + if(StringUtils.isNoneBlank(jcgj.getRemark())){ + result.add("签名人:"+jcgj.getQmrMc()); } PdfBaseUtil.addUnderlinedTitle(document, result.toString(), 10,false); } diff --git a/hxhq-modules/hxhq-system/src/main/java/com/hxhq/business/utils/pdf/template/sp/Sp001.java b/hxhq-modules/hxhq-system/src/main/java/com/hxhq/business/utils/pdf/template/sp/Sp001.java index 125e2d8..2f9f5de 100644 --- a/hxhq-modules/hxhq-system/src/main/java/com/hxhq/business/utils/pdf/template/sp/Sp001.java +++ b/hxhq-modules/hxhq-system/src/main/java/com/hxhq/business/utils/pdf/template/sp/Sp001.java @@ -1,43 +1,106 @@ package com.hxhq.business.utils.pdf.template.sp; +import com.alibaba.fastjson2.JSONArray; +import com.alibaba.fastjson2.JSONObject; +import com.fasterxml.jackson.databind.JsonNode; +import com.fasterxml.jackson.databind.ObjectMapper; +import com.hxhq.business.domain.*; +import com.hxhq.business.dto.mjy.DetailDto; import com.hxhq.business.utils.pdf.PdfBaseUtil; +import com.hxhq.common.core.utils.StringUtils; import com.hxhq.common.security.utils.SecurityUtils; import com.hxhq.system.api.model.LoginUser; -import com.itextpdf.text.Document; +import com.itextpdf.text.*; +import com.itextpdf.text.pdf.BaseFont; +import com.itextpdf.text.pdf.PdfPCell; +import com.itextpdf.text.pdf.PdfPTable; import org.slf4j.Logger; import org.slf4j.LoggerFactory; + import java.io.FileOutputStream; import java.io.IOException; -import java.util.LinkedHashMap; -import java.util.Map; +import java.text.SimpleDateFormat; +import java.util.*; +import java.util.List; /** * 色谱001 + * * @author tanfei */ -public class Sp001 { +public class Sp001 { private static final Logger logger = LoggerFactory.getLogger(Sp001.class.getName()); - /**导出 + /** + * 导出 + * + * @param studyFormFill * @return */ - public static String exportDetail(String localFilePath) { + public String exportDetail(StudyFormFill studyFormFill, List studyFormFillQmxxList, List studyFormFillJcgjList, String localFilePath) { Document document = null; FileOutputStream fos = null; + SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss"); String filePath = PdfBaseUtil.getFilePath(localFilePath); try { - String sign="华西海圻"; - LoginUser loginUser=SecurityUtils.getLoginUser(); - if(loginUser!=null){ - sign=loginUser.getSysUser().getNickName(); - } - document=PdfBaseUtil.init(document,fos,filePath,sign,"华西海圻"); - Map formData = new LinkedHashMap<>(); - formData.put("姓名","张三"); - formData.put("性别", "男"); - formData.put("手机","15882062878"); - // 生成table - PdfBaseUtil.addFormTableColumns(document, formData,3); + String sign = "华西海圻"; + LoginUser loginUser = SecurityUtils.getLoginUser(); + if (loginUser != null) { + sign = loginUser.getSysUser().getNickName(); + } + document = PdfBaseUtil.init(document, fos, filePath, sign + sdf.format(new Date()), studyFormFill.getBdmc()); + // 基本信息 + + JSONObject bdnr = JSONObject.parseObject(studyFormFill.getBdnr()); + PdfBaseUtil.addUnderlinedTitle(document, "试验基本信息", 10, true); + Map formData1 = new LinkedHashMap<>(); + formData1.put("试验名称", studyFormFill.getStudyMc()); + formData1.put("试验编号", studyFormFill.getStudySn()); + formData1.put("方法编号", bdnr.getString("methodCode")); + formData1.put("版本号", bdnr.getString("methodCode")); + PdfBaseUtil.addFormTableColumns(document, formData1, 2); + + PdfBaseUtil.addUnderlinedTitle(document, "试验配置条件", 10, true); + Map formData2 = new LinkedHashMap<>(); + formData2.put("预填", bdnr.getString("pre") + (StringUtils.isNoneBlank(bdnr.getString("preOther")) ? bdnr.getString("preOther") : "")); + formData2.put("实际", bdnr.getString("act") + (StringUtils.isNoneBlank(bdnr.getString("actOther")) ? bdnr.getString("actOther") : "")); + PdfBaseUtil.addFormTableColumns(document, formData2, 2); + + PdfBaseUtil.addUnderlinedTitle(document, "配置时间", 10, true); + Map formData3 = new LinkedHashMap<>(); + formData3.put("开始时间", studyFormFill.getStartDate() != null ? sdf.format(studyFormFill.getStartDate()) : ""); + formData3.put("结束时间", studyFormFill.getEndDate() != null ? sdf.format(studyFormFill.getEndDate()) : ""); + PdfBaseUtil.addFormTableColumns(document, formData3, 2); + + // 签名信息 + PdfBaseUtil.addUnderlinedTitle(document, "试验试剂信息", 10, true); + addResource(document, studyFormFill.getResource()); + + PdfBaseUtil.addUnderlinedTitle(document, "仪器使用信息", 10, true); + PdfBaseUtil.addUnderlinedTitle(document, "存储条件", 10, true); + Map formData4 = new LinkedHashMap<>(); + formData4.put("存储条件",bdnr.getString("storageCondition")+ (StringUtils.isNoneBlank(bdnr.getString("storageConditionOther")) ? bdnr.getString("storageConditionOther") : "")); + PdfBaseUtil.addFormTableColumns(document, formData4, 1); + + PdfBaseUtil.addUnderlinedTitle(document, "操作步骤", 10, true); + Map formData5 = new LinkedHashMap<>(); + formData5.put("目标溶液名称", bdnr.getString("targetName")); + formData5.put("目标溶液编号", bdnr.getString("targetCode")+bdnr.getString("targetCodeSn")); + formData5.put("目标溶液预计浓度", bdnr.getString("targetPreConcentration")+bdnr.getString("targetPreConcentrationUnit")); + formData5.put("目标溶液实际浓度", bdnr.getString("targetActConcentration")+bdnr.getString("targetPreConcentrationUnit")); + formData5.put("目标溶液预计体积", bdnr.getString("targetPreVolume")+bdnr.getString("targetPreVolumeUnit")); + formData5.put("目标溶液实际体积", bdnr.getString("targetActVolume")+bdnr.getString("targetActVolumeUnit")); + formData5.put("有效周期", bdnr.getString("effectivePeriod")+bdnr.getString("effectivePeriodUnit")); + formData5.put("失效日", bdnr.getString("sxrq")); + PdfBaseUtil.addFormTableColumns(document, formData5, 2); + PdfBaseUtil.addUnderlinedTitle(document, "备注"+(StringUtils.isNoneBlank(bdnr.getString("remark")) ? ":"+bdnr.getString("remark") : ""), 10, false); + + // 签名信息 + PdfBaseUtil.addUnderlinedTitle(document, "签名信息", 10, true); + addQmxx(document, studyFormFillQmxxList); + //稽查轨迹 + PdfBaseUtil.addUnderlinedTitle(document, "稽查轨迹", 10, true); + addJcgj(document, studyFormFillJcgjList); logger.info("生成成功:{}", filePath); } catch (Exception e) { logger.error("生成失败", e); @@ -57,4 +120,129 @@ public class Sp001 { return filePath; } + /** + * 仪器使用信息 + * + * @param document + * @param resource + * @throws IOException + * @throws DocumentException + */ + public void addResource(Document document, String resource) throws IOException, DocumentException { +// [{"mc":"布洛芬","bh":"BLF260115-0014","ph":"","nd":"18ng/mL","source":"ELN配制","ndz":18,"nddw":"ng/mL","kc":1190,"kcdw":"3","syl":"4","syldw":"3","yxzq":360,"yxzqdw":"days"}] + if (StringUtils.isNoneBlank(resource)) { + JSONArray jsonArray=JSONArray.parseArray(resource); + SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss"); + // 9. 表头 + BaseFont bfChinese = BaseFont.createFont("STSong-Light", "UniGB-UCS2-H", BaseFont.NOT_EMBEDDED); + Font headerFont = new Font(bfChinese, 10, Font.NORMAL); + Font contentFont = new Font(bfChinese, 10, Font.NORMAL); + // 8. 创建表格 + PdfPTable table = new PdfPTable(6); + table.setWidthPercentage(100); + String[] headers = {"试剂名称", "编号", "批号", "浓度/含量/纯度","来源","失效日"}; + for (String header : headers) { + PdfPCell cell = new PdfPCell(new Phrase(header, headerFont)); + cell.setHorizontalAlignment(Element.ALIGN_CENTER); + cell.setPadding(8); + cell.setBorderWidth(1); + table.addCell(cell); + } + int rowNum = 0; + for (int i = 0; i < jsonArray.size(); i++) { + JSONObject obj = jsonArray.getJSONObject(i); + // 交替行颜色 + if (rowNum % 2 == 0) { + table.getDefaultCell().setBackgroundColor(BaseColor.WHITE); + } else { + table.getDefaultCell().setBackgroundColor(BaseColor.WHITE); + } + table.addCell(PdfBaseUtil.createCell(obj.getString("mc"), contentFont)); + table.addCell(PdfBaseUtil.createCell(obj.getString("bh"), contentFont)); + table.addCell(PdfBaseUtil.createCell(obj.getString("ph"), contentFont)); + table.addCell(PdfBaseUtil.createCell(obj.getString("nd"), contentFont)); + table.addCell(PdfBaseUtil.createCell(obj.getString("source"), contentFont)); + table.addCell(PdfBaseUtil.createCell(StringUtils.isNoneBlank(obj.getString("sxrq"))?obj.getString("sxrq"):"", contentFont)); + rowNum++; + } + document.add(table); + + } + } + + + /** + * 签名信息 + * + * @param document + * @param studyFormFillQmxxList + * @throws IOException + * @throws DocumentException + */ + public void addQmxx(Document document, List studyFormFillQmxxList) throws IOException, DocumentException { + SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss"); + // 9. 表头 + BaseFont bfChinese = BaseFont.createFont("STSong-Light", "UniGB-UCS2-H", BaseFont.NOT_EMBEDDED); + Font headerFont = new Font(bfChinese, 10, Font.NORMAL); + Font contentFont = new Font(bfChinese, 10, Font.NORMAL); + // 8. 创建表格 + PdfPTable table = new PdfPTable(4); + table.setWidthPercentage(100); + String[] headers = {"签名人", "签名意义", "签名时间", "备注原因"}; + for (String header : headers) { + PdfPCell cell = new PdfPCell(new Phrase(header, headerFont)); + cell.setHorizontalAlignment(Element.ALIGN_CENTER); + cell.setPadding(8); + cell.setBorderWidth(1); + table.addCell(cell); + } + int rowNum = 0; + for (StudyFormFillQmxx studyFormFillQmxx : studyFormFillQmxxList) { + // 交替行颜色 + if (rowNum % 2 == 0) { + table.getDefaultCell().setBackgroundColor(BaseColor.WHITE); + } else { + table.getDefaultCell().setBackgroundColor(BaseColor.WHITE); + } + table.addCell(PdfBaseUtil.createCell(studyFormFillQmxx.getQmrMc(), contentFont)); + table.addCell(PdfBaseUtil.createCell(studyFormFillQmxx.getQmyy(), contentFont)); + table.addCell(PdfBaseUtil.createCell(sdf.format(studyFormFillQmxx.getCreateTime()), contentFont)); + table.addCell(PdfBaseUtil.createCell(studyFormFillQmxx.getRemark(), contentFont)); + rowNum++; + } + document.add(table); + } + + /** + * 稽查轨迹 + * + * @param document + * @param studyFormFillJcgjList + * @throws IOException + * @throws DocumentException + */ + public void addJcgj(Document document, List studyFormFillJcgjList) throws IOException, DocumentException { + SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss"); + for (StudyFormFillJcgj jcgj : studyFormFillJcgjList) { + PdfBaseUtil.addUnderlinedTitle(document, sdf.format(jcgj.getCreateTime()) + " " + jcgj.getJcmc(), 10, false); + StringJoiner result = new StringJoiner(", "); + if (StringUtils.isNoneBlank(jcgj.getJcnr())) { + ObjectMapper mapper = new ObjectMapper(); + JsonNode jsonArray = mapper.readTree(jcgj.getJcnr()); + for (JsonNode node : jsonArray) { + String name = node.get("name").asText(); + String value =node.get("value")!=null? node.get("value").asText():""; + result.add(name + ":" + value); + } + } + if (StringUtils.isNoneBlank(jcgj.getRemark())) { + result.add("备注:" + jcgj.getRemark()); + } + if (StringUtils.isNoneBlank(jcgj.getRemark())) { + result.add("签名人:" + jcgj.getQmrMc()); + } + PdfBaseUtil.addUnderlinedTitle(document, result.toString(), 10, false); + } + } + }