| | |
| | | package com.yuanchu.mom.service.impl; |
| | | |
| | | import com.aspose.words.License; |
| | | import com.aspose.words.SaveFormat; |
| | | 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 org.springframework.transaction.annotation.Transactional; |
| | | |
| | | import javax.annotation.Resource; |
| | | import java.io.File; |
| | | import java.io.FileOutputStream; |
| | | import java.io.IOException; |
| | | import java.io.InputStream; |
| | | 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.concurrent.CompletableFuture; |
| | | |
| | | /** |
| | | * @author Administrator |
| | | * @description 针对表【ins_report(检验报告)】的数据库操作Service实现 |
| | | * @createDate 2024-03-17 22:10:02 |
| | | */ |
| | | * @author Administrator |
| | | * @description 针对表【ins_report(检验报告)】的数据库操作Service实现 |
| | | * @createDate 2024-03-17 22:10:02 |
| | | */ |
| | | @Service |
| | | public class InsReportServiceImpl extends ServiceImpl<InsReportMapper, InsReport> |
| | | implements InsReportService{ |
| | | implements InsReportService { |
| | | |
| | | @Resource |
| | | private GetLook getLook; |
| | |
| | | String signatureUrl; |
| | | try { |
| | | signatureUrl = userMapper.selectById(insReport.getWriteUserId()).getSignatureUrl(); |
| | | }catch (Exception e){ |
| | | } catch (Exception e) { |
| | | throw new ErrorException("找不到编制人的签名"); |
| | | } |
| | | //系统生成报告地址 |
| | | String url = insReport.getUrl(); |
| | | //手动上传报告地址 |
| | | String urlS = insReport.getUrlS(); |
| | | wordInsertUrl(new HashMap<String, Object>(){{ |
| | | put("writeUrl", Pictures.ofLocal(imgUrl+"/"+signatureUrl).create()); |
| | | }}, (urlS==null?url:urlS).replace("/word", wordUrl)); |
| | | wordInsertUrl(new HashMap<String, Object>() {{ |
| | | put("writeUrl", Pictures.ofLocal(imgUrl + "/" + signatureUrl).create()); |
| | | }}, (urlS == null ? url : urlS).replace("/word", wordUrl)); |
| | | return insReportMapper.updateById(insReport); |
| | | } |
| | | |
| | |
| | | } |
| | | insReport.setExamineUserId(getLook.selectPowerByMethodAndUserId(null).get("userId"));//审核人 |
| | | insReport.setExamineTime(LocalDateTime.now());//审核时间 |
| | | if (isExamine==0){ |
| | | if (isExamine == 0) { |
| | | //如果审核不通过 |
| | | insReport.setState(0);//提交状态改为待提交 |
| | | return insReportMapper.updateById(insReport); |
| | |
| | | String signatureUrl; |
| | | try { |
| | | signatureUrl = userMapper.selectById(insReport.getExamineUserId()).getSignatureUrl(); |
| | | }catch (Exception e){ |
| | | } catch (Exception e) { |
| | | throw new ErrorException("找不到审核人的签名"); |
| | | } |
| | | //系统生成报告地址 |
| | | String url = insReport.getUrl(); |
| | | //手动上传报告地址 |
| | | String urlS = insReport.getUrlS(); |
| | | wordInsertUrl(new HashMap<String, Object>(){{ |
| | | put("examineUrl", Pictures.ofLocal(imgUrl+"/"+signatureUrl).create()); |
| | | }}, (urlS==null?url:urlS).replace("/word", wordUrl)); |
| | | wordInsertUrl(new HashMap<String, Object>() {{ |
| | | put("examineUrl", Pictures.ofLocal(imgUrl + "/" + signatureUrl).create()); |
| | | }}, (urlS == null ? url : urlS).replace("/word", wordUrl)); |
| | | return insReportMapper.updateById(insReport); |
| | | } |
| | | |
| | |
| | | } |
| | | insReport.setRatifyUserId(getLook.selectPowerByMethodAndUserId(null).get("userId"));//批准人 |
| | | insReport.setRatifyTime(LocalDateTime.now());//批准时间 |
| | | if (isRatify==0){ |
| | | if (isRatify == 0) { |
| | | //如果批准不通过 |
| | | insReport.setState(0);//提交状态改为待提交 |
| | | return insReportMapper.updateById(insReport); |
| | |
| | | String signatureUrl; |
| | | try { |
| | | signatureUrl = userMapper.selectById(insReport.getRatifyUserId()).getSignatureUrl(); |
| | | }catch (Exception e){ |
| | | } catch (Exception e) { |
| | | throw new ErrorException("找不到批准人的签名"); |
| | | } |
| | | //获取场所的报告专用章 |
| | | String sealUrl; |
| | | try { |
| | | String laboratory = insOrderMapper.selectById(insReport.getInsOrderId()).getLaboratory(); |
| | | sealUrl = insReportMapper.getLaboratoryByName(laboratory); |
| | | }catch (Exception e){ |
| | | } catch (Exception e) { |
| | | throw new ErrorException("找不到报告专用章"); |
| | | } |
| | | if(sealUrl==null) throw new ErrorException("找不到报告专用章"); |
| | | if (sealUrl == null) throw new ErrorException("找不到报告专用章"); |
| | | //系统生成报告地址 |
| | | String url = insReport.getUrl(); |
| | | //手动上传报告地址 |
| | | String urlS = insReport.getUrlS(); |
| | | wordInsertUrl(new HashMap<String, Object>(){{ |
| | | put("ratifyUrl", Pictures.ofLocal(imgUrl+"/"+signatureUrl).create()); |
| | | put("seal1", Pictures.ofLocal(imgUrl+"/"+sealUrl).create()); |
| | | put("seal2", Pictures.ofLocal(imgUrl+"/"+sealUrl).create()); |
| | | }}, (urlS==null?url:urlS).replace("/word", wordUrl)); |
| | | wordToPdf((urlS == null ? url : urlS).replace("/word", wordUrl)); |
| | | String finalUrl = (urlS == null ? url : urlS).replace("/word", wordUrl); |
| | | wordInsertUrl(new HashMap<String, Object>() {{ |
| | | put("ratifyUrl", Pictures.ofLocal(imgUrl + "/" + signatureUrl).create()); |
| | | put("seal1", Pictures.ofLocal(imgUrl + "/" + sealUrl).create()); |
| | | put("seal2", Pictures.ofLocal(imgUrl + "/" + sealUrl).create()); |
| | | }}, finalUrl); |
| | | wordToPdf(finalUrl); |
| | | |
| | | 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); |
| | |
| | | }); |
| | | } |
| | | |
| | | public String wordToPdf(String wordPath,String pdfPath) { |
| | | public String wordToPdf(String wordPath, String pdfPath) { |
| | | FileOutputStream os = null; |
| | | try { |
| | | //凭证 不然切换后有水印 |
| | |
| | | } |
| | | 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]; |
| | | ByteArrayOutputStream out = new ByteArrayOutputStream(); |
| | | BufferedImage img = ImageIO.read(new File(Path)); |
| | | int h = img.getHeight(); |
| | | int w = img.getWidth(); |
| | | |
| | | int sw = w/n; |
| | | for(int i=0;i<n;i++){ |
| | | BufferedImage subImg; |
| | | if(i==n-1){//最后剩余部分 |
| | | subImg = img.getSubimage(i * sw, 0, w-i*sw, h); |
| | | }else {//前n-1块均匀切 |
| | | subImg = img.getSubimage(i * sw, 0, sw, h); |
| | | } |
| | | |
| | | ImageIO.write(subImg,Path.substring(Path.lastIndexOf('.')+1),out); |
| | | nImage[i] = com.itextpdf.text.Image.getInstance(out.toByteArray()); |
| | | out.flush(); |
| | | out.reset(); |
| | | } |
| | | return nImage; |
| | | } |
| | | |
| | | /** |
| | | * 盖骑缝章 |
| | | * |
| | | * @param infilePath 原PDF路径 |
| | | * @param outFilePath 输出PDF路径 |
| | | */ |
| | | public static void stamperCheckMarkPDF(String infilePath,String outFilePath,String picPath) throws IOException, DocumentException { |
| | | PdfReader reader = new PdfReader(infilePath);//选择需要印章的pdf |
| | | PdfStamper stamp = new PdfStamper(reader, new FileOutputStream(outFilePath));//加完印章后的pdf |
| | | |
| | | com.itextpdf.text.Rectangle pageSize = reader.getPageSize(1);//获得第一页 |
| | | float height = pageSize.getHeight(); |
| | | float width = pageSize.getWidth(); |
| | | |
| | | int nums = reader.getNumberOfPages(); |
| | | com.itextpdf.text.Image[] nImage = slicingImages(picPath,nums);//生成骑缝章切割图片 |
| | | |
| | | |
| | | for(int n=1;n<=nums;n++){ |
| | | PdfContentByte over = stamp.getOverContent(n);//设置在第几页打印印章 |
| | | com.itextpdf.text.Image img = nImage[n-1];//选择图片 |
| | | img.setAbsolutePosition(width-img.getWidth(),height/2-img.getHeight()/2);//控制图片位置 |
| | | over.addImage(img); |
| | | } |
| | | stamp.close(); |
| | | } |
| | | } |
| | | |
| | | |
| | | |
| | | |
| | | |
| | | |