diff --git a/hxhq-modules/hxhq-system/src/main/java/com/hxhq/business/controller/GspController.java b/hxhq-modules/hxhq-system/src/main/java/com/hxhq/business/controller/GspController.java index 39e2666..dce1d3b 100644 --- a/hxhq-modules/hxhq-system/src/main/java/com/hxhq/business/controller/GspController.java +++ b/hxhq-modules/hxhq-system/src/main/java/com/hxhq/business/controller/GspController.java @@ -9,10 +9,13 @@ import com.hxhq.business.form.gsp.*; import com.hxhq.business.form.gyzj.SearchForm; import com.hxhq.business.service.IGspJcgjService; import com.hxhq.business.service.IGspTzService; +import com.hxhq.business.utils.pdf.PdfExportUtil; import com.hxhq.common.core.constant.Constants; +import com.hxhq.common.security.annotation.Logical; 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.validation.annotation.Validated; import org.springframework.web.bind.annotation.*; import com.hxhq.business.service.IGspService; @@ -40,6 +43,39 @@ public class GspController extends BaseController { private IGspTzService gspTzService; /** + * 上传文件存储在本地的根路径 + */ + @Value("${file.path}") + private String localFilePath; + /** + * 资源映射路径 前缀 + */ + @Value("${file.prefix}") + public String localFilePrefix; + + /** + * 导出 + */ + @RequiresPermissions(value={"business:resource:mjy:xq","business:archive:mjy:xq"}, logical= Logical.OR) + @GetMapping(value = "/exportDetail") + public AjaxResult exportDetail(Long id,String lang) { + GspJcgj gspJcgj = new GspJcgj(); + gspJcgj.setGspId(id); + List jcgjList = gspJcgjService.queryList(gspJcgj); + GspTz gspTz = new GspTz(); + gspTz.setGspId(id); + List tzList = gspTzService.queryList(gspTz); + return AjaxResult.success(localFilePrefix + PdfExportUtil.export( + "com.hxhq.business.utils.pdf.resource.GspPdf", + "exportDetail", + gspService.queryInfo(id), + tzList, + jcgjList, + lang, + localFilePath)); + } + + /** * 试验物资列表 */ @GetMapping("/studyList") diff --git a/hxhq-modules/hxhq-system/src/main/java/com/hxhq/business/domain/GspTz.java b/hxhq-modules/hxhq-system/src/main/java/com/hxhq/business/domain/GspTz.java index 44e13cc..41f6a33 100644 --- a/hxhq-modules/hxhq-system/src/main/java/com/hxhq/business/domain/GspTz.java +++ b/hxhq-modules/hxhq-system/src/main/java/com/hxhq/business/domain/GspTz.java @@ -1,5 +1,6 @@ package com.hxhq.business.domain; +import com.baomidou.mybatisplus.annotation.TableField; import com.baomidou.mybatisplus.annotation.TableName; import com.hxhq.common.core.domain.MpBaseEntity; @@ -52,6 +53,27 @@ public class GspTz extends MpBaseEntity /** 签名人id */ private Long qmrId; + private Long bdId; + + /** 表单名称 */ + @TableField(exist = false) + private String bdMc; + + public String getBdMc() { + return bdMc; + } + + public void setBdMc(String bdMc) { + this.bdMc = bdMc; + } + + public Long getBdId() { + return bdId; + } + + public void setBdId(Long bdId) { + this.bdId = bdId; + } public void setGspId(Long gspId) { diff --git a/hxhq-modules/hxhq-system/src/main/java/com/hxhq/business/mapper/GspTzMapper.java b/hxhq-modules/hxhq-system/src/main/java/com/hxhq/business/mapper/GspTzMapper.java index 4effe20..c47848e 100644 --- a/hxhq-modules/hxhq-system/src/main/java/com/hxhq/business/mapper/GspTzMapper.java +++ b/hxhq-modules/hxhq-system/src/main/java/com/hxhq/business/mapper/GspTzMapper.java @@ -1,7 +1,13 @@ package com.hxhq.business.mapper; +import com.baomidou.mybatisplus.core.conditions.Wrapper; import com.hxhq.business.domain.GspTz; import com.baomidou.mybatisplus.core.mapper.BaseMapper; +import com.hxhq.business.domain.GyzjTz; +import org.apache.ibatis.annotations.Param; + +import java.util.List; + /** * 供试品-台账Mapper接口 * @@ -11,4 +17,10 @@ import com.baomidou.mybatisplus.core.mapper.BaseMapper; public interface GspTzMapper extends BaseMapper { + /** + * 查询列表 + * @param queryWrapper + * @return + */ + List queryList(@Param("ew") Wrapper queryWrapper); } diff --git a/hxhq-modules/hxhq-system/src/main/java/com/hxhq/business/service/impl/GspTzServiceImpl.java b/hxhq-modules/hxhq-system/src/main/java/com/hxhq/business/service/impl/GspTzServiceImpl.java index 5046b1e..7a220d3 100644 --- a/hxhq-modules/hxhq-system/src/main/java/com/hxhq/business/service/impl/GspTzServiceImpl.java +++ b/hxhq-modules/hxhq-system/src/main/java/com/hxhq/business/service/impl/GspTzServiceImpl.java @@ -34,9 +34,9 @@ public class GspTzServiceImpl extends ServiceImpl implements if(form.getGspId()==null||form.getGspId().longValue()<0){ throw new SecurityException("供试品id不能为空"); } - queryWrapper.eq("gsp_id",form.getGspId()); - queryWrapper.orderByDesc("id"); - return this.list(queryWrapper); + queryWrapper.eq("t.gsp_id",form.getGspId()); + queryWrapper.orderByDesc("t.id"); + return baseMapper.queryList(queryWrapper); } @Override diff --git a/hxhq-modules/hxhq-system/src/main/java/com/hxhq/business/utils/lang/GspJcnrUtil.java b/hxhq-modules/hxhq-system/src/main/java/com/hxhq/business/utils/lang/GspJcnrUtil.java new file mode 100644 index 0000000..384fa50 --- /dev/null +++ b/hxhq-modules/hxhq-system/src/main/java/com/hxhq/business/utils/lang/GspJcnrUtil.java @@ -0,0 +1,169 @@ +package com.hxhq.business.utils.lang; + +import com.hxhq.business.utils.JctUtil; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; + +import java.util.HashMap; +import java.util.LinkedHashMap; +import java.util.Map; + +/** + * @author tanfei + */ +public class GspJcnrUtil { + private static final Logger logger = LoggerFactory.getLogger(GspJcnrUtil.class.getName()); + private static HashMap mapLang=new HashMap<>(); + static { + mapLang.put("入库","In Storage"); + mapLang.put("未入库","Not in Storage"); + mapLang.put("已发放","In Use"); + mapLang.put("已锁定","Locked"); + mapLang.put("待归档","Pending Archiving"); + mapLang.put("归档","Archived"); + mapLang.put("待解档","Pending De-archiving"); + mapLang.put("借阅开始时间","Checkout Start Date"); + mapLang.put("借阅结束时间","Checkout End Date"); + mapLang.put("处置方式","Dispose Method"); + mapLang.put("处置原因","Reason"); + mapLang.put("处置","Dispose"); + mapLang.put("处置量","Amount"); + mapLang.put("使用","Usage"); + mapLang.put("配制完成","Configuration completed"); + mapLang.put("处置人","Operator"); + mapLang.put("复核人","Reviewer"); + mapLang.put("监督人","Supervisor"); + mapLang.put("钥匙1领取人","Key 1 User"); + mapLang.put("钥匙2领取人","Key 2 User"); + mapLang.put("出库量","Out Amount"); + mapLang.put("转移条件","Transfer Condition"); + mapLang.put("出库毛重","Check-out Gross Weight"); + mapLang.put("入库毛重","Check-in Gross Weight"); + mapLang.put("使用量","Usage Amount"); + mapLang.put("归还人1","Returner 1"); + mapLang.put("归还人2","Returner 2"); + mapLang.put("库管员1","Warehouse Keeper 1"); + mapLang.put("库管员2","Warehouse Keeper 2"); + mapLang.put("签名人1","Signed By 1"); + mapLang.put("签名人2","Signed By 2"); + mapLang.put("入库位置","Check-in Location"); + mapLang.put("入库条件","Check-in Condition"); + mapLang.put("入库净重","Check-in Net Weight"); + mapLang.put("入库量","Total Amount"); + mapLang.put("申请备注","Apply Comment"); + mapLang.put("审核备注","Approve Comment"); + mapLang.put("领取人","Recipient"); + mapLang.put("领取人2","Recipient 2"); + mapLang.put("发放人","Issuer"); + mapLang.put("发放人2","Issuer 2"); + mapLang.put("存储条件","Storage Condition"); + mapLang.put("存储位置","Storage Location"); + mapLang.put("使用人","User"); + mapLang.put("领取/归还人/入库申请人","Recipient/Returner/Check-in Applicant"); + mapLang.put("发放/接收人","Issuer/Receiver"); + mapLang.put("操作类型","Action"); + mapLang.put("操作量","Amount"); + mapLang.put("备注/原因","Comment/Reason"); + mapLang.put("操作时间","Datetime"); + mapLang.put("名称","Name"); + mapLang.put("编号","ID"); + mapLang.put("浓度","Concentration"); + mapLang.put("库存量","Amount"); + mapLang.put("失效日期","Expiration"); + mapLang.put("状态","Status"); + mapLang.put("所属表单","In Record"); + mapLang.put("表单所属试验","From Study"); + mapLang.put("表单所属人","By User"); + mapLang.put("基本信息","Information"); + mapLang.put("表单信息","Record Information"); + mapLang.put("稽查轨迹","Track Record"); + mapLang.put("给药制剂台账","Formulation Table"); + mapLang.put("备注","Comment"); + mapLang.put("签名人","Signed By"); + mapLang.put("批号","Batch Num"); + mapLang.put("规格","Specification"); + mapLang.put("接收日期","Date Received"); + mapLang.put("有效期","Validity Period"); + + mapLang.put("申请解档","Apply for De-archiving"); + mapLang.put("申请借阅","Apply for Check-out"); + mapLang.put("申请归档","Apply for Archiving"); + mapLang.put("锁定给药制剂","Lock Drug"); + mapLang.put("解锁给药制剂","Unlock Drug"); + mapLang.put("处置药剂","Dispose Substance"); + mapLang.put("处置容器","Dispose Container"); + mapLang.put("钥匙发放","Issue Key"); + mapLang.put("申请编辑","Apply Edit"); + mapLang.put("同意编辑","Approve Edit"); + mapLang.put("拒绝编辑","Reject Edit"); + mapLang.put("修改库存申请","Apply Edit Inventory"); + mapLang.put("同意修改库存","Approve Edit Inventory"); + mapLang.put("拒绝修改库存","Reject Edit Inventory"); + mapLang.put("归还","Return"); + mapLang.put("确认归还","Confirm Check-in"); + mapLang.put("领取发放","Distribution"); + mapLang.put("存储","Storage"); + mapLang.put("取出","Take Out"); + mapLang.put("给药制剂详情","Formulation Information"); + mapLang.put("到期自动归还","到期自动归还"); + + + mapLang.put("表单名称","Preset Name"); + mapLang.put("锁定发放记录","Lock Record"); + mapLang.put("解锁发放记录","Unlock Record"); + mapLang.put("给药制剂入库","Formulation Check-in"); + mapLang.put("同意入库","Approve Check-in"); + mapLang.put("拒绝入库","Reject Check-in"); + mapLang.put("目的","Purpose"); + + mapLang.put("同意归档","Approve Archiving"); + mapLang.put("拒绝归档","Reject Archiving"); + mapLang.put("同意解档","Approve De-archiving"); + mapLang.put("拒绝解档","Reject De-archiving"); + mapLang.put("同意借阅","Approve Check-out"); + mapLang.put("拒绝借阅","Reject Check-out"); + } + + public static void main(String[] args) { + Map formData = new LinkedHashMap<>(); + formData.put("申请备注", "1111"); + formData.put("审核备注", "22"); + logger.info(getJcnrEn(formData)); + } + /** + * 获取英文 + * @param name + * @return + */ + public static String getEn(String name) { + return mapLang.get(name); + } + + + /** + * 稽查名称英文 + * @param map + * @return + */ + public static String getJcnrEn(Map map) { + Map result =new LinkedHashMap<>(); + for (Map.Entry entry : map.entrySet()) { + result.put(mapLang.get(entry.getKey()),entry.getValue()); + } + return JctUtil.formatStr(result); + } + + /** + * 稽查名称英文 + * @param map + * @return + */ + public static Map getMapEn(Map map) { + Map result =new LinkedHashMap<>(); + for (Map.Entry entry : map.entrySet()) { + result.put(mapLang.get(entry.getKey()),entry.getValue()); + } + return result; + } + +} diff --git a/hxhq-modules/hxhq-system/src/main/java/com/hxhq/business/utils/pdf/resource/GspPdf.java b/hxhq-modules/hxhq-system/src/main/java/com/hxhq/business/utils/pdf/resource/GspPdf.java new file mode 100644 index 0000000..b660774 --- /dev/null +++ b/hxhq-modules/hxhq-system/src/main/java/com/hxhq/business/utils/pdf/resource/GspPdf.java @@ -0,0 +1,201 @@ +package com.hxhq.business.utils.pdf.resource; + +import com.fasterxml.jackson.databind.JsonNode; +import com.fasterxml.jackson.databind.ObjectMapper; +import com.hxhq.business.domain.GspJcgj; +import com.hxhq.business.domain.GspTz; +import com.hxhq.business.dto.gsp.GspDto; +import com.hxhq.business.enums.zykgl.ZjztEnum; +import com.hxhq.business.utils.lang.GyzjJcnrUtil; +import com.hxhq.business.utils.pdf.PdfBaseUtil; +import com.hxhq.business.utils.pdf.PdfExportUtil; +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.util.List; +import java.util.*; + +/** + * 供试品详情 + * + * @author HanLong + */ +public class GspPdf { + private static final Logger logger = LoggerFactory.getLogger(GspPdf.class.getName()); + public String language="zh"; + /** + * 导出 + * + * @param gsp + * @return + */ + public String exportDetail(GspDto gsp, List tzList, List jcgjList, String lang, String localFilePath) { + language=lang; + Document document = null; + FileOutputStream fos = null; + String filePath = PdfBaseUtil.getFilePath(localFilePath,"Gsp"); + try { + String sign = "hxhq"; + LoginUser loginUser = SecurityUtils.getLoginUser(); + if (loginUser != null) { + sign = loginUser.getSysUser().getNickName(); + } + document = PdfBaseUtil.init(document, fos, filePath, sign + PdfExportUtil.parseDateToStr(new Date()), getName("给药制剂详情"),false); + // 基本信息 + PdfBaseUtil.addUnderlinedTitle(document, getName("基本信息"), 10, true); + Map formData1 = new LinkedHashMap<>(); + formData1.put(getName("名称"), gsp.getMc()); + formData1.put(getName("编号"), gsp.getBh()); + formData1.put(getName("批号"), gsp.getPh()); + formData1.put(getName("规格"), gsp.getGg() + gsp.getGgdw()); + formData1.put(getName("接收日期"), gsp.getGg() + gsp.getGgdw()); + formData1.put(getName("库存量"), gsp.getKc() + gsp.getKcdw()); + formData1.put(getName("有效期"), PdfExportUtil.parseDateToStr(gsp.getYxq())); + formData1.put(getName("状态"), "en".equals(language) ? (GyzjJcnrUtil.getEn(ZjztEnum.getEnumByValue(gsp.getZjzt()).getText())) : ZjztEnum.getEnumByValue(gsp.getZjzt()).getText()); + PdfBaseUtil.addFormTableColumns(document, formData1, 2); + // 表单信息 + /*PdfBaseUtil.addUnderlinedTitle(document, getName("表单信息"), 10, true); + Map formData3 = new LinkedHashMap<>(); + formData3.put(getName("表单所属试验"), gsp.getStudyMc()); + formData3.put(getName("所属表单"), gsp.getBdMc()); + formData3.put(getName("表单所属人"), gsp.getBdgsrMc()); + PdfBaseUtil.addFormTableColumns(document, formData3, 2); + PdfBaseUtil.addUnderlinedTitle(document, getName("给药制剂台账") , 10, true);*/ + // 台账 + addTz(document, tzList, lang); + PdfBaseUtil.addUnderlinedTitle(document, getName("稽查轨迹") , 10, true); + //稽查轨迹 + addJcgj(document, jcgjList, lang); + 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 tzList + * @throws IOException + * @throws DocumentException + */ + public void addTz(Document document, List tzList, String lang) throws IOException, DocumentException { + + // 9. 表头 + BaseFont bfChinese = BaseFont.createFont("STSong-Light", "UniGB-UCS2-H", BaseFont.NOT_EMBEDDED); + Font headerFont = new Font(bfChinese, 8, Font.NORMAL); + Font contentFont = new Font(bfChinese, 8, Font.NORMAL); + // 8. 创建表格 + PdfPTable table = new PdfPTable(8); + table.setWidthPercentage(100); + String[] headers = {getName("使用人"),getName("领取/归还人/入库申请人"),getName("发放/接收人"),getName("操作类型"),getName("表单名称"),getName("操作量"),getName("备注/原因"),getName("操作时间")}; + 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 (GspTz gspTz : tzList) { + // 交替行颜色 + if (rowNum % 2 == 0) { + table.getDefaultCell().setBackgroundColor(BaseColor.WHITE); + } else { + table.getDefaultCell().setBackgroundColor(BaseColor.WHITE); + } + table.addCell(PdfBaseUtil.createCell(gspTz.getQmrMc(), contentFont)); + table.addCell(PdfBaseUtil.createCell(StringUtils.isNoneBlank(gspTz.getLqrMc()) ? gspTz.getLqrMc() : "" + (StringUtils.isNoneBlank(gspTz.getGhrMc()) ? gspTz.getGhrMc() : ""), contentFont)); + table.addCell(PdfBaseUtil.createCell(StringUtils.isNoneBlank(gspTz.getFfrMc()) ? gspTz.getFfrMc() : "" + (StringUtils.isNoneBlank(gspTz.getJsrMc()) ? gspTz.getJsrMc() : ""), contentFont)); + table.addCell(PdfBaseUtil.createCell(gspTz.getQmyy(), contentFont)); + table.addCell(PdfBaseUtil.createCell(gspTz.getBdMc(), contentFont)); + table.addCell(PdfBaseUtil.createCell(gspTz.getCzl() + gspTz.getCzldw(), contentFont)); + table.addCell(PdfBaseUtil.createCell(gspTz.getRemark(), contentFont)); + table.addCell(PdfBaseUtil.createCell(PdfExportUtil.parseDateToStr(gspTz.getCreateTime()), contentFont)); + rowNum++; + } + document.add(table); + } + + /** + * 稽查轨迹 + * + * @param document + * @param jcgjList + * @throws IOException + * @throws DocumentException + */ + public void addJcgj(Document document, List jcgjList, String lang) throws IOException, DocumentException { + for (GspJcgj jcgj : jcgjList) { + StringJoiner result = new StringJoiner(", "); + if ("en".equals(lang)) { + PdfBaseUtil.addUnderlinedTitle(document, PdfExportUtil.parseDateToStr(jcgj.getCreateTime())+ " " + jcgj.getJcmcEn(), 10, false); + if (StringUtils.isNoneBlank(jcgj.getJcnrEn())) { + ObjectMapper mapper = new ObjectMapper(); + JsonNode jsonArray = mapper.readTree(jcgj.getJcnrEn()); + for (JsonNode node : jsonArray) { + if (node.get("name") != null) { + String name = node.get("name").asText(); + String value = node.get("value")!=null? node.get("value").asText():""; + result.add(name + ":" + value); + } + } + } + } else { + PdfBaseUtil.addUnderlinedTitle(document, PdfExportUtil.parseDateToStr(jcgj.getCreateTime())+ " " + jcgj.getJcmc(), 10, false); + if (StringUtils.isNoneBlank(jcgj.getJcnr())) { + ObjectMapper mapper = new ObjectMapper(); + JsonNode jsonArray = mapper.readTree(jcgj.getJcnr()); + for (JsonNode node : jsonArray) { + if (node.get("name") != null) { + 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(getName("备注")+":" + jcgj.getRemark()); + } + if (StringUtils.isNoneBlank(jcgj.getQmrMc())) { + result.add(getName("签名人")+":" + jcgj.getQmrMc()); + } + PdfBaseUtil.addUnderlinedTitle(document, result.toString(), 10, false); + } + } + + /** + * 获取名称 + * @param name + * @return + */ + public String getName(String name){ + return "en".equals(language) ? GyzjJcnrUtil.getEn(name) : name; + } + + +} diff --git a/hxhq-modules/hxhq-system/src/main/resources/mapper/business/GspTzMapper.xml b/hxhq-modules/hxhq-system/src/main/resources/mapper/business/GspTzMapper.xml index 5a2e8a6..7f749e2 100644 --- a/hxhq-modules/hxhq-system/src/main/resources/mapper/business/GspTzMapper.xml +++ b/hxhq-modules/hxhq-system/src/main/resources/mapper/business/GspTzMapper.xml @@ -3,4 +3,14 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd"> + \ No newline at end of file