Browse Source

导出pdf

master
ma 4 years ago
parent
commit
076502c7b2
  1. 42
      src/main/java/com/ccsens/carbasics/api/ExportController.java
  2. 22
      src/main/java/com/ccsens/carbasics/bean/dto/ExportDto.java
  3. 15
      src/main/java/com/ccsens/carbasics/bean/vo/ExportVo.java
  4. 8
      src/main/java/com/ccsens/carbasics/persist/dao/FirstAidRecordDao.java
  5. 231
      src/main/java/com/ccsens/carbasics/service/ExportService.java
  6. 16
      src/main/java/com/ccsens/carbasics/service/IExportService.java
  7. 4
      src/main/java/com/ccsens/carbasics/service/QuestionnaireService.java
  8. 46
      src/main/java/com/ccsens/carbasics/util/Constant.java
  9. 3
      src/main/resources/application-test.yml
  10. 4
      src/main/resources/application.yml
  11. 12
      src/main/resources/mapper_dao/FirstAidRecordDao.xml

42
src/main/java/com/ccsens/carbasics/api/ExportController.java

@ -0,0 +1,42 @@
package com.ccsens.carbasics.api;
import com.ccsens.carbasics.bean.dto.ExportDto;
import com.ccsens.carbasics.bean.dto.FirstAidDto;
import com.ccsens.carbasics.bean.vo.ExportVo;
import com.ccsens.carbasics.bean.vo.FirstAidVo;
import com.ccsens.carbasics.service.IExportService;
import com.ccsens.cloudutil.annotation.MustLogin;
import com.ccsens.util.JsonResponse;
import com.ccsens.util.bean.dto.QueryDto;
import io.swagger.annotations.Api;
import io.swagger.annotations.ApiOperation;
import io.swagger.annotations.ApiParam;
import lombok.extern.slf4j.Slf4j;
import org.springframework.validation.annotation.Validated;
import org.springframework.web.bind.annotation.RequestBody;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestMethod;
import org.springframework.web.bind.annotation.RestController;
import javax.annotation.Resource;
@Api(tags = "导出相关" , description = "")
@RestController
@RequestMapping("/export")
@Slf4j
public class ExportController {
@Resource
private IExportService exportService;
// @MustLogin
@ApiOperation(value = "导出pdf", notes = "")
@RequestMapping(value = "/exportApoplexyPdf", method = RequestMethod.POST, produces = {"application/json;charset=UTF-8"})
public JsonResponse<ExportVo.PdfInfo> exportApoplexyPdf(@ApiParam @Validated @RequestBody QueryDto<ExportDto.ExportPdf> params) throws Exception{
log.info("导出pdf开始{}",params);
ExportVo.PdfInfo pdfInfo = exportService.exportApoplexyPdf(params.getParam(), params.getUserId());
log.info("导出pdf结束{}",pdfInfo);
return JsonResponse.newInstance().ok(pdfInfo);
}
}

22
src/main/java/com/ccsens/carbasics/bean/dto/ExportDto.java

@ -0,0 +1,22 @@
package com.ccsens.carbasics.bean.dto;
import io.swagger.annotations.ApiModel;
import io.swagger.annotations.ApiModelProperty;
import lombok.Data;
import javax.validation.constraints.NotNull;
@Data
public class ExportDto {
@Data
@ApiModel("导出pdf")
public static class ExportPdf {
@NotNull
@ApiModelProperty("急救id")
private Long firstAidId;
}
}

15
src/main/java/com/ccsens/carbasics/bean/vo/ExportVo.java

@ -0,0 +1,15 @@
package com.ccsens.carbasics.bean.vo;
import io.swagger.annotations.ApiModel;
import io.swagger.annotations.ApiModelProperty;
import lombok.Data;
@Data
public class ExportVo {
@Data
@ApiModel("pdf地址")
public static class PdfInfo {
@ApiModelProperty("pdf地址")
private String pdfUrl;
}
}

8
src/main/java/com/ccsens/carbasics/persist/dao/FirstAidRecordDao.java

@ -1,6 +1,7 @@
package com.ccsens.carbasics.persist.dao;
import com.ccsens.carbasics.bean.dto.StatisticalDto;
import com.ccsens.carbasics.bean.vo.QuestionnaireVo;
import com.ccsens.carbasics.bean.vo.StatisticalVo;
import com.ccsens.carbasics.persist.mapper.FirstAidRecordMapper;
import org.apache.ibatis.annotations.Param;
@ -169,4 +170,11 @@ public interface FirstAidRecordDao extends FirstAidRecordMapper {
* @return 发病时间戳
*/
Long queryDiseaseTime(@Param("firstAidId") Long firstAidId);
/**
* 查询所有的code和答案
* @param firstAidId 急救id
* @return 所有的code和答案
*/
List<QuestionnaireVo.QuestionnaireInfo> queryCodeAndAnswer(@Param("firstAidId") Long firstAidId);
}

231
src/main/java/com/ccsens/carbasics/service/ExportService.java

@ -0,0 +1,231 @@
package com.ccsens.carbasics.service;
import cn.hutool.core.collection.CollectionUtil;
import cn.hutool.core.date.DateUtil;
import cn.hutool.core.io.FileUtil;
import cn.hutool.core.util.IdUtil;
import cn.hutool.core.util.ObjectUtil;
import cn.hutool.core.util.StrUtil;
import com.ccsens.carbasics.bean.dto.ExportDto;
import com.ccsens.carbasics.bean.po.FirstAid;
import com.ccsens.carbasics.bean.po.FirstAidRecord;
import com.ccsens.carbasics.bean.vo.ExportVo;
import com.ccsens.carbasics.bean.vo.FirstAidVo;
import com.ccsens.carbasics.bean.vo.QuestionnaireVo;
import com.ccsens.carbasics.persist.dao.FirstAidDao;
import com.ccsens.carbasics.persist.dao.FirstAidRecordDao;
import com.ccsens.carbasics.util.Constant;
import com.ccsens.util.PropUtil;
import com.itextpdf.text.Document;
import com.itextpdf.text.DocumentException;
import com.itextpdf.text.Font;
import com.itextpdf.text.pdf.*;
import lombok.extern.slf4j.Slf4j;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Propagation;
import org.springframework.transaction.annotation.Transactional;
import javax.annotation.Resource;
import java.io.ByteArrayOutputStream;
import java.io.File;
import java.io.FileOutputStream;
import java.io.IOException;
import java.util.*;
@Slf4j
@Service
@Transactional(propagation = Propagation.REQUIRED, rollbackFor = Exception.class)
public class ExportService implements IExportService{
@Resource
private FirstAidRecordDao firstAidRecordDao;
@Resource
private FirstAidDao firstAidDao;
@Override
public ExportVo.PdfInfo exportApoplexyPdf(ExportDto.ExportPdf param, Long userId) {
Map<String,String> textMap = new HashMap();
Map<String,String> radio = new HashMap();
Map<String,String> multiple = new HashMap();
//查询患者年龄
FirstAid firstAid = firstAidDao.selectByPrimaryKey(param.getFirstAidId());
if (ObjectUtil.isNotNull(firstAid)) {
textMap.put("age",String.valueOf(firstAid.getAge()));
}
//当前时间
long currentTime = System.currentTimeMillis();
List<String> currentTimeGroup = timeGroup(currentTime);
textMap.put("year",currentTimeGroup.get(0));
textMap.put("month",currentTimeGroup.get(1));
textMap.put("day",currentTimeGroup.get(2));
List<QuestionnaireVo.QuestionnaireInfo> codeAndAnswer = firstAidRecordDao.queryCodeAndAnswer(param.getFirstAidId());
HashMap<String,String> codeAndAnswerMap = new HashMap<>(codeAndAnswer.size());
if (CollectionUtil.isNotEmpty(codeAndAnswer)) {
for (QuestionnaireVo.QuestionnaireInfo questionnaireInfo : codeAndAnswer) {
codeAndAnswerMap.put(questionnaireInfo.getCode(),questionnaireInfo.getAnswer());
//文本类型code
for (String textCode : Constant.TEXT_CODE) {
if (questionnaireInfo.getCode().equals(textCode)) {
textMap.put(questionnaireInfo.getCode(),questionnaireInfo.getAnswer());
}
}
//单选code
for (String radioCode : Constant.RADIO_CODE) {
if (questionnaireInfo.getCode().equals(radioCode)) {
radio.put(questionnaireInfo.getCode(),questionnaireInfo.getAnswer());
}
}
//时间code
for (String timeCode : Constant.TIME_CODE) {
if (questionnaireInfo.getCode().equals(timeCode)) {
List<String> timeGroup = timeGroup(Long.parseLong(questionnaireInfo.getAnswer()));
textMap.put(questionnaireInfo.getCode()+"-h",String.valueOf(timeGroup.get(3)));
textMap.put(questionnaireInfo.getCode()+"-m",String.valueOf(timeGroup.get(4)));
}
}
}
}
//DNT ONT DPT DRT
//静脉溶栓开始时间
String jmrssj = codeAndAnswerMap.get("JMRSSJ");
String arriveHospitalTime = codeAndAnswerMap.get("JBXX-DYSJ");
String fbsj = codeAndAnswerMap.get("JBXX-FBSJ");
if (StrUtil.isNotBlank(jmrssj) && StrUtil.isNotBlank(arriveHospitalTime)) {
long DNT = (Long.parseLong(jmrssj)-Long.parseLong(arriveHospitalTime))/1000/60;
textMap.put("DNT",String.valueOf(DNT));
}
if (StrUtil.isNotBlank(jmrssj) && StrUtil.isNotBlank(fbsj)) {
long ONT = (Long.parseLong(jmrssj) - Long.parseLong(fbsj))/1000/60;
textMap.put("ONT",String.valueOf(ONT));
}
//穿刺完成时间
String ccsj = codeAndAnswerMap.get("JRZL-CCSJ");
if (StrUtil.isNotBlank(ccsj) && StrUtil.isNotBlank(arriveHospitalTime)) {
long DRT = (Long.parseLong(ccsj) - Long.parseLong(arriveHospitalTime))/1000/60;
textMap.put("DRT",String.valueOf(DRT));
}
if (StrUtil.isNotBlank(ccsj) && StrUtil.isNotBlank(fbsj)) {
long DPT = (Long.parseLong(ccsj) - Long.parseLong(fbsj))/1000/60;
textMap.put("DPT",String.valueOf(DPT));
}
Map<String,Object> pdfInfo = new HashMap();
pdfInfo.put("text",textMap);
pdfInfo.put("radio",radio);
pdfInfo.put("multiple",multiple);
log.info("开始执行生成pdf");
String visitPath = pdfOut(pdfInfo);
log.info("执行生成pdf结束");
ExportVo.PdfInfo result = new ExportVo.PdfInfo();
result.setPdfUrl(visitPath);
return result;
}
/**
* 生成pdf
* @param o 文本/单选/多选的map
*/
public static String pdfOut(Map<String,Object> o) {
// 模板路径
// String templatePath = "C:/Users/10626/Desktop/卒中绿色通道时间节点控制表form版备用.pdf";
String templatePath = "/home/cloud/carbasics/uploads/template/卒中绿色通道时间节点控制表form版备用.pdf";
// 生成的新文件路径
// String newPdfPath = "C:/Users/10626/Desktop/测试导出pdf.pdf";
String uploads = PropUtil.path;
String filePath = "pdf" + File.separator+DateUtil.format(new Date(), "yyyyMMdd") + File.separator;
String pdfPath = uploads + filePath;
String fileName = IdUtil.simpleUUID() + ".pdf";
String newPdfPath = pdfPath + fileName;
String visitPath = PropUtil.imgDomain + filePath + fileName;
PdfReader reader;
FileOutputStream out;
ByteArrayOutputStream bos;
PdfStamper stamper;
try {
// BaseFont bf = BaseFont.createFont("c://windows//fonts//simsun.ttc,1" , BaseFont.IDENTITY_H, BaseFont.EMBEDDED);
// Font fontChinese = new Font(bf, 5, Font.NORMAL);
// 输出流
File saveFile = new File(pdfPath);
if (!saveFile.exists()) {
saveFile.mkdirs();
}
out = new FileOutputStream(newPdfPath);
// 读取pdf模板
reader = new PdfReader(templatePath);
bos = new ByteArrayOutputStream();
stamper = new PdfStamper(reader, bos);
AcroFields form = stamper.getAcroFields();
//文字类的内容处理
Map<String,String> datemap = (Map<String,String>)o.get("text");
// form.addSubstitutionFont(bf);
for(String key : datemap.keySet()){
String value = datemap.get(key);
form.setField(key,value);
}
//单选
Map<String,String> radio = (Map<String,String>)o.get("radio");
// form.addSubstitutionFont(bf);
for (String key : radio.keySet()) {
form.setField(key,radio.get(key),true);
}
//多选
Map<String,String> multiple = (Map<String,String>)o.get("multiple");
// form.addSubstitutionFont(bf);
if (ObjectUtil.isNotNull(multiple)){
for (String key : multiple.keySet()) {
form.setField(key,"1",true);
}
}
// 如果为false,生成的PDF文件可以编辑,如果为true,生成的PDF文件不可以编辑
stamper.setFormFlattening(true);
stamper.close();
Document doc = new Document();
// Font font = new Font(bf, 32);
PdfCopy copy = new PdfCopy(doc, out);
doc.open();
//这行只会打印指定页
//PdfImportedPage importPage = copy.getImportedPage(new PdfReader(bos.toByteArray()), 1);
PdfImportedPage importPage = null;
for (int i = 1; i <= reader.getNumberOfPages(); i++) {
importPage = copy.getImportedPage(new PdfReader(bos.toByteArray()),i);
copy.addPage(importPage);
}
doc.close();
} catch (IOException e) {
System.out.println(e);
} catch (DocumentException e) {
System.out.println(e);
}
return visitPath;
}
/**
* 计算时间戳的,年月日时分
* @param time 时间戳
* @return 年月日时分
*/
public List<String> timeGroup(Long time){
List<String> timeSort = new ArrayList<>();
int year = DateUtil.year(new Date(time));
timeSort.add(String.valueOf(year));
int month = DateUtil.month(new Date(time));
timeSort.add(String.valueOf(month+1));
int day = DateUtil.dayOfMonth(new Date(time));
timeSort.add(String.valueOf(day));
int hour = DateUtil.hour(new Date(time), true);
timeSort.add(String.valueOf(hour));
int minute = DateUtil.minute(new Date(time));
timeSort.add(String.valueOf(minute));
return timeSort;
}
}

16
src/main/java/com/ccsens/carbasics/service/IExportService.java

@ -0,0 +1,16 @@
package com.ccsens.carbasics.service;
import com.ccsens.carbasics.bean.dto.ExportDto;
import com.ccsens.carbasics.bean.vo.ExportVo;
import com.ccsens.carbasics.bean.vo.FirstAidVo;
public interface IExportService {
/**
* 导出卒中绿色通道时间节点控制表pdf
* @param param 参数
* @param userId 用户id
* @return pdf地址
*/
ExportVo.PdfInfo exportApoplexyPdf(ExportDto.ExportPdf param, Long userId);
}

4
src/main/java/com/ccsens/carbasics/service/QuestionnaireService.java

@ -26,17 +26,13 @@ import com.ccsens.util.PropUtil;
import com.ccsens.util.RedisUtil;
import com.ccsens.util.exception.BaseException;
import lombok.extern.slf4j.Slf4j;
import org.apache.poi.openxml4j.exceptions.InvalidFormatException;
import org.apache.poi.ss.usermodel.Sheet;
import org.apache.poi.ss.usermodel.Workbook;
import org.apache.poi.xssf.usermodel.XSSFWorkbook;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Propagation;
import org.springframework.transaction.annotation.Transactional;
import javax.annotation.Resource;
import java.io.File;
import java.io.IOException;
import java.util.*;

46
src/main/java/com/ccsens/carbasics/util/Constant.java

@ -4,6 +4,7 @@ import io.swagger.annotations.ApiModelProperty;
import lombok.Data;
import java.io.File;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
@ -569,4 +570,49 @@ public class Constant {
}
}
/**
* pdf:文本类型code
*/
public static final List<String> TEXT_CODE = new ArrayList<>();
/**
* pdf:单选类型code
*/
public static final List<String> RADIO_CODE = new ArrayList<>();
/**
* pdf:时间类型code
*/
public static final List<String> TIME_CODE = new ArrayList<>();
static {
//添加文本类型
TEXT_CODE.add("CJBL-NAME");
TEXT_CODE.add("CJBL-SEX");
TEXT_CODE.add("age");
TEXT_CODE.add("representor");
TEXT_CODE.add("patient_relationship");
TEXT_CODE.add("phone");
TEXT_CODE.add("RYPG-systolicPressure");
TEXT_CODE.add("RYPG-diastolicPressure");
TEXT_CODE.add("RYPG-pulse");
TEXT_CODE.add("RYPG-ZDJG");
TEXT_CODE.add("RYPG-NIHSSScore");
TEXT_CODE.add("JBXX-ZYH");
TEXT_CODE.add("JMRS-RSYW-rt-PA");
TEXT_CODE.add("JMRS-RSYW-NJ");
TEXT_CODE.add("DNT");
TEXT_CODE.add("ONT");
TEXT_CODE.add("DPT");
TEXT_CODE.add("DRT");
TEXT_CODE.add("JMRS-JSPF");
TEXT_CODE.add("JMRS-SH");
TEXT_CODE.add("JRZL-24-NIHSS");
//添加单选类型
RADIO_CODE.add("JBXX-LYFS");
//添加时间类型
TIME_CODE.add("JBXX-FBSJ");
TIME_CODE.add("JBXX-DYSJ");
TIME_CODE.add("JBXX-DYSJ");
TIME_CODE.add("ZQTH-SJ");
TIME_CODE.add("JMRSSJ");
}
}

3
src/main/resources/application-test.yml

@ -50,4 +50,5 @@ wisdom:
weight: 10000
time: 600000
question:
template: /home/cloud/carbasics/uploads/template/暴风眼问卷导出表格模板.xlsx
template: /home/cloud/carbasics/uploads/template/暴风眼问卷导出表格模板.xlsx
pdftemplate: /home/cloud/carbasics/uploads/template/卒中绿色通道时间节点控制表form版备用.pdf

4
src/main/resources/application.yml

@ -1,4 +1,4 @@
spring:
profiles:
active: prod
include: common, util-prod
active: test
include: common, util-test

12
src/main/resources/mapper_dao/FirstAidRecordDao.xml

@ -619,4 +619,16 @@
AND first_aid_id = #{firstAidId}
AND question_code = 'JBXX-FBSJ'
</select>
<select id="queryCodeAndAnswer" resultType="com.ccsens.carbasics.bean.vo.QuestionnaireVo$QuestionnaireInfo">
SELECT
question_code AS `code`,
answer
FROM
t_qcp_first_aid_record
WHERE
rec_status = 0
AND first_aid_id = #{firstAidId}
</select>
</mapper>

Loading…
Cancel
Save