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: |
|||
profiles: |
|||
active: prod |
|||
include: common, util-prod |
|||
active: test |
|||
include: common, util-test |
|||
|
Loading…
Reference in new issue