package com.yuanchu.mom.service.impl; import com.aspose.words.*; import com.baomidou.mybatisplus.core.toolkit.ObjectUtils; import com.baomidou.mybatisplus.core.toolkit.Wrappers; import com.baomidou.mybatisplus.extension.plugins.pagination.Page; import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; import com.deepoove.poi.XWPFTemplate; import com.deepoove.poi.data.Pictures; import com.itextpdf.text.BadElementException; import com.itextpdf.text.DocumentException; import com.itextpdf.text.pdf.PdfContentByte; import com.itextpdf.text.pdf.PdfReader; import com.itextpdf.text.pdf.PdfStamper; import com.yuanchu.mom.common.GetLook; import com.yuanchu.mom.common.PrintChina; import com.yuanchu.mom.dto.ReportPageDto; import com.yuanchu.mom.exception.ErrorException; import com.yuanchu.mom.mapper.InsOrderMapper; import com.yuanchu.mom.mapper.InsReportMapper; import com.yuanchu.mom.mapper.UserMapper; import com.yuanchu.mom.pojo.InsOrder; import com.yuanchu.mom.pojo.InsReport; import com.yuanchu.mom.service.InsReportService; import com.yuanchu.mom.utils.QueryWrappers; import org.springframework.beans.factory.annotation.Value; import org.springframework.core.io.ClassPathResource; import org.springframework.stereotype.Service; import org.springframework.transaction.annotation.Transactional; import javax.annotation.Resource; import javax.imageio.ImageIO; import java.awt.*; import java.awt.image.BufferedImage; import java.io.*; import java.nio.file.Files; import java.nio.file.Paths; import java.time.LocalDateTime; import java.util.HashMap; import java.util.Map; import java.util.concurrent.CompletableFuture; /** * @author Administrator * @description 针对表【ins_report(检验报告)】的数据库操作Service实现 * @createDate 2024-03-17 22:10:02 */ @Service public class InsReportServiceImpl extends ServiceImpl implements InsReportService { @Resource private GetLook getLook; @Resource private UserMapper userMapper; @Resource private InsReportMapper insReportMapper; @Value("${wordUrl}") private String wordUrl; @Value("${file.path}") private String imgUrl; @Resource private InsOrderMapper insOrderMapper; @Override public Map pageInsReport(Page page, ReportPageDto reportPageDto) { Map map = new HashMap<>(); map.put("head", PrintChina.printChina(ReportPageDto.class)); Map map1 = getLook.selectPowerByMethodAndUserId("pageInsReport"); if (map1.get("look") == 1) reportPageDto.setCreateUser(map1.get("userId")); map.put("body", insReportMapper.pageInsReport(page, QueryWrappers.queryWrappers(reportPageDto))); return map; } @Override public int inReport(String url, Integer id) { InsReport insReport = new InsReport(); insReport.setId(id); insReport.setUrlS(url); return insReportMapper.updateById(insReport); } @Override public int upReportUrl(Integer id) { return insReportMapper.update(null, Wrappers.lambdaUpdate().eq(InsReport::getId, id).set(InsReport::getUrlS, null)); } //提交 @Override public int writeReport(Integer id) { InsReport insReport = insReportMapper.selectById(id); insReport.setId(id); insReport.setState(1); insReport.setWriteUserId(getLook.selectPowerByMethodAndUserId(null).get("userId"));//提交人 insReport.setWriteTime(LocalDateTime.now());//提交时间 //获取提交人的签名地址 String signatureUrl; try { signatureUrl = userMapper.selectById(insReport.getWriteUserId()).getSignatureUrl(); } catch (Exception e) { throw new ErrorException("找不到编制人的签名"); } //系统生成报告地址 String url = insReport.getUrl(); //手动上传报告地址 String urlS = insReport.getUrlS(); wordInsertUrl(new HashMap() {{ put("writeUrl", Pictures.ofLocal(imgUrl + "/" + signatureUrl).create()); }}, (urlS == null ? url : urlS).replace("/word", wordUrl)); return insReportMapper.updateById(insReport); } //审核 @Override public int examineReport(Integer id, Integer isExamine, String examineTell) { InsReport insReport = insReportMapper.selectById(id); insReport.setIsExamine(isExamine); if (ObjectUtils.isNotEmpty(examineTell)) { insReport.setExamineTell(examineTell); } insReport.setExamineUserId(getLook.selectPowerByMethodAndUserId(null).get("userId"));//审核人 insReport.setExamineTime(LocalDateTime.now());//审核时间 if (isExamine == 0) { //如果审核不通过 insReport.setState(0);//提交状态改为待提交 return insReportMapper.updateById(insReport); } //获取审核人的签名地址 String signatureUrl; try { signatureUrl = userMapper.selectById(insReport.getExamineUserId()).getSignatureUrl(); } catch (Exception e) { throw new ErrorException("找不到审核人的签名"); } //系统生成报告地址 String url = insReport.getUrl(); //手动上传报告地址 String urlS = insReport.getUrlS(); wordInsertUrl(new HashMap() {{ put("examineUrl", Pictures.ofLocal(imgUrl + "/" + signatureUrl).create()); }}, (urlS == null ? url : urlS).replace("/word", wordUrl)); return insReportMapper.updateById(insReport); } //批准 @Override @Transactional(rollbackFor = Exception.class) public int ratifyReport(Integer id, Integer isRatify, String ratifyTell) { InsReport insReport = insReportMapper.selectById(id); insReport.setIsRatify(isRatify); if (ObjectUtils.isNotEmpty(ratifyTell)) { insReport.setRatifyTell(ratifyTell); } insReport.setRatifyUserId(getLook.selectPowerByMethodAndUserId(null).get("userId"));//批准人 insReport.setRatifyTime(LocalDateTime.now());//批准时间 if (isRatify == 0) { //如果批准不通过 insReport.setState(0);//提交状态改为待提交 return insReportMapper.updateById(insReport); } //获取批准人的签名地址 String signatureUrl; try { signatureUrl = userMapper.selectById(insReport.getRatifyUserId()).getSignatureUrl(); } catch (Exception e) { throw new ErrorException("找不到批准人的签名"); } //获取场所的报告专用章 String sealUrl; try { String laboratory = insOrderMapper.selectById(insReport.getInsOrderId()).getLaboratory(); sealUrl = insReportMapper.getLaboratoryByName(laboratory); } catch (Exception e) { throw new ErrorException("找不到报告专用章"); } if (sealUrl == null) throw new ErrorException("找不到报告专用章"); //系统生成报告地址 String url = insReport.getUrl(); //手动上传报告地址 String urlS = insReport.getUrlS(); String finalUrl = (urlS == null ? url : urlS).replace("/word", wordUrl); wordInsertUrl(new HashMap() {{ put("ratifyUrl", Pictures.ofLocal(imgUrl + "/" + signatureUrl).create()); put("seal1", Pictures.ofLocal(imgUrl + "/" + sealUrl).create()); put("seal2", Pictures.ofLocal(imgUrl + "/" + sealUrl).create()); }}, finalUrl); wordToPdf(finalUrl,sealUrl); /* String replace = finalUrl.replace(".docx", ".pdf"); CompletableFuture.supplyAsync(() -> { try { stamperCheckMarkPDF(replace,replace,sealUrl); return null; } catch (Exception e) { throw new ErrorException("骑缝章插入失败"); } }).thenAccept(res -> { }).exceptionally(e -> { e.printStackTrace(); return null; });*/ InsOrder insOrder = new InsOrder(); insOrder.setId(insReportMapper.selectById(id).getInsOrderId()); insOrder.setState(4); insOrderMapper.updateById(insOrder); return insReportMapper.updateById(insReport); } @Override public int wordInsertUrl(Map map, String url) { XWPFTemplate template = XWPFTemplate.compile(url).render(map); try { template.writeAndClose(Files.newOutputStream(Paths.get(url))); } catch (IOException e) { throw new RuntimeException(e); } return 1; } @Override public void wordToPdf(String path,String sealUrl) { CompletableFuture.supplyAsync(() -> { try { wordToPdf(path, path.replace(".docx", ".pdf"),sealUrl); return null; } catch (Exception e) { throw new ErrorException("转换失败"); } }).thenAccept(res -> { }).exceptionally(e -> { e.printStackTrace(); return null; }); } public String wordToPdf(String wordPath, String pdfPath,String sealUrl) { FileOutputStream os = null; try { //凭证 不然切换后有水印 // InputStream inputStream = this.getClass().getResourceAsStream("/lib/license.xml"); /*String url; try { InputStream inputStream = this.getClass().getResourceAsStream("/lib/license.xml"); File file = File.createTempFile("temp", ".tmp"); OutputStream outputStream = new FileOutputStream(file); IOUtils.copy(inputStream, outputStream); url = file.getAbsolutePath(); } catch (FileNotFoundException e) { throw new ErrorException("找不到模板文件"); } catch (IOException e) { throw new RuntimeException(e); }*/ InputStream is = new ClassPathResource("/lib/license.xml").getInputStream(); License license = new License(); license.setLicense(is); if (!license.getIsLicensed()) { System.out.println("License验证不通过..."); return null; } //生成一个空的PDF文件 File file = new File(pdfPath.replace(".pdf","-1.pdf")); os = new FileOutputStream(file); //要转换的word文件 com.aspose.words.Document doc = new com.aspose.words.Document(wordPath); doc.save(os, SaveFormat.PDF); //添加骑缝章 stamperCheckMarkPDF(pdfPath.replace(".pdf","-1.pdf"),pdfPath,imgUrl + "/" +sealUrl); } catch (Exception e) { e.printStackTrace(); } finally { if (os != null) { try { os.close(); } catch (IOException e) { e.printStackTrace(); } } } return null; } /** * 切割图片 * @param Path 图片路径 * @param n 切割份数 */ public static com.itextpdf.text.Image[] slicingImages(String Path, int n) throws IOException, BadElementException { com.itextpdf.text.Image[] nImage = new com.itextpdf.text.Image[n]; BufferedImage img = ImageIO.read(new File(Path)); int h = img.getHeight(); int w = img.getWidth(); int sw = w/n; for(int i=0;i