11 changed files with 396 additions and 7 deletions
@ -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); |
||||
|
} |
||||
|
|
||||
|
} |
||||
@ -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; |
||||
|
|
||||
|
} |
||||
|
|
||||
|
} |
||||
@ -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; |
||||
|
} |
||||
|
} |
||||
@ -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; |
||||
|
} |
||||
|
} |
||||
@ -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); |
||||
|
} |
||||
@ -1,4 +1,4 @@ |
|||||
spring: |
spring: |
||||
profiles: |
profiles: |
||||
active: prod |
active: test |
||||
include: common, util-prod |
include: common, util-test |
||||
|
|||||
Loading…
Reference in new issue