diff --git a/hxhq-modules/hxhq-system/src/main/java/com/hxhq/business/controller/GyzjController.java b/hxhq-modules/hxhq-system/src/main/java/com/hxhq/business/controller/GyzjController.java index 0d5019d..ed4202b 100644 --- a/hxhq-modules/hxhq-system/src/main/java/com/hxhq/business/controller/GyzjController.java +++ b/hxhq-modules/hxhq-system/src/main/java/com/hxhq/business/controller/GyzjController.java @@ -4,13 +4,17 @@ import java.util.List; import com.hxhq.business.domain.GyzjJcgj; import com.hxhq.business.domain.GyzjTz; +import com.hxhq.business.domain.GyzjJcgj; +import com.hxhq.business.domain.GyzjTz; import com.hxhq.business.dto.gyzj.ListDto; import com.hxhq.business.form.gyzj.*; import com.hxhq.business.service.IGyzjJcgjService; import com.hxhq.business.service.IGyzjTzService; +import com.hxhq.business.utils.pdf.PdfExportUtil; import com.hxhq.common.security.annotation.RequiresPermissions; import com.hxhq.common.security.utils.SecurityUtils; import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.beans.factory.annotation.Value; import org.springframework.web.bind.annotation.*; import com.hxhq.business.service.IGyzjService; import com.hxhq.common.core.web.controller.BaseController; @@ -34,6 +38,16 @@ public class GyzjController extends BaseController private IGyzjTzService gyzjTzService; @Autowired private IGyzjJcgjService gyzjJcgjService; + /** + * 上传文件存储在本地的根路径 + */ + @Value("${file.path}") + private String localFilePath; + /** + * 资源映射路径 前缀 + */ + @Value("${file.prefix}") + public String localFilePrefix; /** * 列表 @@ -95,6 +109,27 @@ public class GyzjController extends BaseController } /** + * 导出 + */ + @RequiresPermissions("business:resource:gyzj:xq") + @GetMapping(value = "/exportDetail") + public AjaxResult exportDetail(Long id) { + GyzjJcgj gyzjJcgj = new GyzjJcgj(); + gyzjJcgj.setGyzjId(id); + List gyzjJcgjList = gyzjJcgjService.queryList(gyzjJcgj); + GyzjTz gyzjTz = new GyzjTz(); + gyzjTz.setGyzjId(id); + List gyzjTzList = gyzjTzService.queryList(gyzjTz); + return AjaxResult.success(localFilePrefix + PdfExportUtil.export( + "com.hxhq.business.utils.pdf.resource.Dosage", + "exportDetail", + gyzjService.queryInfo(id), + gyzjTzList, + gyzjJcgjList, + localFilePath)); + } + + /** * 解档 */ @PostMapping("/jd") diff --git a/hxhq-modules/hxhq-system/src/main/java/com/hxhq/business/utils/pdf/resource/Dosage.java b/hxhq-modules/hxhq-system/src/main/java/com/hxhq/business/utils/pdf/resource/Dosage.java new file mode 100644 index 0000000..d0eb1ae --- /dev/null +++ b/hxhq-modules/hxhq-system/src/main/java/com/hxhq/business/utils/pdf/resource/Dosage.java @@ -0,0 +1,170 @@ +package com.hxhq.business.utils.pdf.resource; + +import com.fasterxml.jackson.databind.JsonNode; +import com.fasterxml.jackson.databind.ObjectMapper; +import com.hxhq.business.domain.GyzjJcgj; +import com.hxhq.business.domain.GyzjTz; +import com.hxhq.business.dto.gyzj.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.*; +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.text.SimpleDateFormat; +import java.util.List; +import java.util.*; + +/** + * 给药制剂详情 + * + * @author tanfei + */ +public class Dosage { + private static final Logger logger = LoggerFactory.getLogger(Dosage.class.getName()); + + /** + * 导出 + * + * @param gyzj + * @return + */ + public String exportDetail(DetailDto gyzj, List gyzjTzList, List gyzjJcgjList, 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+sdf.format(new Date()), null); + // 基本信息 + PdfBaseUtil.addUnderlinedTitle(document, "基本信息", 10,true); + Map formData1 = new LinkedHashMap<>(); + formData1.put("名称", gyzj.getMc()); + formData1.put("编号", gyzj.getBh()); + formData1.put("浓度", gyzj.getNd() + gyzj.getNddw()); + formData1.put("库存量", gyzj.getKc() + gyzj.getKcdw()); + formData1.put("失效日期", sdf.format(gyzj.getSxrq())); + formData1.put("存储条件", gyzj.getCctj()); + formData1.put("存储位置", gyzj.getCcwz()); + PdfBaseUtil.addFormTableColumns(document, formData1, 2); + // 表单信息 + PdfBaseUtil.addUnderlinedTitle(document, "表单信息", 10,true); + Map formData3 = new LinkedHashMap<>(); + formData3.put("所属表单", gyzj.getBdMc()); + formData3.put("所属试验信息", gyzj.getStudyMc()); + formData3.put("表单所属人", gyzj.getBdgsrMc()); + PdfBaseUtil.addFormTableColumns(document, formData3, 2); + PdfBaseUtil.addUnderlinedTitle(document, "麻精药台账", 10,true); + // 台账 + addTz(document,gyzjTzList); + PdfBaseUtil.addUnderlinedTitle(document, "稽查轨迹", 10,true); + //稽查轨迹 + addJcgj(document,gyzjJcgjList); + logger.info("生成成功:{}", filePath); + } catch (Exception e) { + logger.error("生成失败", e); + throw new RuntimeException("生成失败: " + e.getMessage()); + } finally { + if (document != null) { + document.close(); + } + if (fos != null) { + try { + fos.close(); + } catch (IOException e) { + logger.error("关闭文件流失败", e); + } + } + } + return filePath; + } + + /** + * 台账 + * @param document + * @param gyzjTzList + * @throws IOException + * @throws DocumentException + */ + public void addTz(Document document,List gyzjTzList) 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(7); + 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 (GyzjTz gyzjTz : gyzjTzList) { + // 交替行颜色 + if (rowNum % 2 == 0) { + table.getDefaultCell().setBackgroundColor(BaseColor.WHITE); + } else { + table.getDefaultCell().setBackgroundColor(BaseColor.WHITE); + } + table.addCell(PdfBaseUtil.createCell(gyzjTz.getQmrMc(), contentFont)); + table.addCell(PdfBaseUtil.createCell(StringUtils.isNoneBlank(gyzjTz.getLqrMc())?gyzjTz.getLqrMc():""+(StringUtils.isNoneBlank(gyzjTz.getGhrMc())?gyzjTz.getGhrMc():""), contentFont)); + table.addCell(PdfBaseUtil.createCell(StringUtils.isNoneBlank(gyzjTz.getFfrMc())?gyzjTz.getFfrMc():""+(StringUtils.isNoneBlank(gyzjTz.getJsrMc())?gyzjTz.getJsrMc():""), contentFont)); + table.addCell(PdfBaseUtil.createCell(gyzjTz.getQmyy(), contentFont)); + table.addCell(PdfBaseUtil.createCell(gyzjTz.getCzl()+gyzjTz.getCzldw(), contentFont)); + table.addCell(PdfBaseUtil.createCell(gyzjTz.getRemark(), contentFont)); + table.addCell(PdfBaseUtil.createCell(sdf.format(gyzjTz.getCreateTime()), contentFont)); + rowNum++; + } + document.add(table); + } + + /** + * 稽查轨迹 + * @param document + * @param gyzjJcgjList + * @throws IOException + * @throws DocumentException + */ + public void addJcgj(Document document,List gyzjJcgjList) throws IOException, DocumentException { + SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss"); + for (GyzjJcgj jcgj : gyzjJcgjList) { + 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").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); + } + } + + +}