From a4ee8b2e144ae1118ff714554911b7d34705416e Mon Sep 17 00:00:00 2001 From: zhuo <2089219845@qq.com> Date: 星期三, 07 五月 2025 17:45:52 +0800 Subject: [PATCH] 导出添加自定义签名功能 --- cnas-process/src/main/resources/mapper/ProcessReportMapper.xml | 6 +- cnas-process/src/main/resources/static/report-deal.docx | 0 cnas-process/src/main/java/com/ruoyi/process/service/ProcessReportService.java | 2 cnas-process/src/main/java/com/ruoyi/process/service/impl/ProcessReportServiceImpl.java | 22 ++++++- cnas-process/src/main/java/com/ruoyi/process/service/impl/QualityMonitorServiceImpl.java | 17 +++-- cnas-process/src/main/java/com/ruoyi/process/pojo/ProcessReport.java | 11 --- ruoyi-common/src/main/java/com/ruoyi/common/utils/SignatureImageUtil.java | 66 ++++++++++++++++++++++ ruoyi-common/src/main/resources/ttf/signature.ttf | 0 cnas-process/src/main/java/com/ruoyi/process/controller/ProcessReportController.java | 2 cnas-process/src/main/java/com/ruoyi/process/dto/ProcessReportDto.java | 17 +++++ cnas-process/src/main/java/com/ruoyi/process/mapper/ProcessReportMapper.java | 5 + 11 files changed, 118 insertions(+), 30 deletions(-) diff --git a/cnas-process/src/main/java/com/ruoyi/process/controller/ProcessReportController.java b/cnas-process/src/main/java/com/ruoyi/process/controller/ProcessReportController.java index 6476ac1..1c683bf 100644 --- a/cnas-process/src/main/java/com/ruoyi/process/controller/ProcessReportController.java +++ b/cnas-process/src/main/java/com/ruoyi/process/controller/ProcessReportController.java @@ -34,7 +34,7 @@ @ApiOperation(value = "鏌ヨ妫�楠屾姤鍛婂彂鏀剧櫥璁板垪琛�") @GetMapping("/pageProcessReport") - public Result pageProcessReport(ProcessReport processReport , Page page) { + public Result pageProcessReport(ProcessReportDto processReport , Page page) { return Result.success(processReportService.pageProcessReport(page, processReport)); } diff --git a/cnas-process/src/main/java/com/ruoyi/process/dto/ProcessReportDto.java b/cnas-process/src/main/java/com/ruoyi/process/dto/ProcessReportDto.java index ac66c6f..d33d255 100644 --- a/cnas-process/src/main/java/com/ruoyi/process/dto/ProcessReportDto.java +++ b/cnas-process/src/main/java/com/ruoyi/process/dto/ProcessReportDto.java @@ -1,6 +1,9 @@ package com.ruoyi.process.dto; +import com.baomidou.mybatisplus.annotation.TableField; +import com.deepoove.poi.data.PictureRenderData; import com.ruoyi.process.pojo.ProcessReport; +import io.swagger.annotations.ApiModelProperty; import lombok.Data; import java.util.List; @@ -10,4 +13,18 @@ public class ProcessReportDto extends ProcessReport { private List<Integer> ids; + + @ApiModelProperty("鍙戦�佷汉濮撳悕") + private String sendUserName; + + @ApiModelProperty("鍙戦�佷汉鍦板潃") + private String sendUserUrl; + + @ApiModelProperty("鍙戦�佷汉绛惧悕") + private PictureRenderData sendUserRender; + + @ApiModelProperty("绛炬敹绛惧悕") + private PictureRenderData signatoryRender; + + } diff --git a/cnas-process/src/main/java/com/ruoyi/process/mapper/ProcessReportMapper.java b/cnas-process/src/main/java/com/ruoyi/process/mapper/ProcessReportMapper.java index 7135d44..75bd9ac 100644 --- a/cnas-process/src/main/java/com/ruoyi/process/mapper/ProcessReportMapper.java +++ b/cnas-process/src/main/java/com/ruoyi/process/mapper/ProcessReportMapper.java @@ -4,6 +4,7 @@ import com.baomidou.mybatisplus.core.mapper.BaseMapper; import com.baomidou.mybatisplus.core.metadata.IPage; import com.baomidou.mybatisplus.extension.plugins.pagination.Page; +import com.ruoyi.process.dto.ProcessReportDto; import com.ruoyi.process.pojo.ProcessReport; import org.apache.ibatis.annotations.Param; @@ -19,7 +20,7 @@ */ public interface ProcessReportMapper extends BaseMapper<ProcessReport> { - IPage<ProcessReport> pageProcessReport(Page page, @Param("ew") QueryWrapper<ProcessReport> queryWrappers); + IPage<ProcessReportDto> pageProcessReport(Page page, @Param("ew") QueryWrapper<ProcessReportDto> queryWrappers); - List<ProcessReport> exportProcessReport(); + List<ProcessReportDto> exportProcessReport(); } diff --git a/cnas-process/src/main/java/com/ruoyi/process/pojo/ProcessReport.java b/cnas-process/src/main/java/com/ruoyi/process/pojo/ProcessReport.java index 4be9719..478721d 100644 --- a/cnas-process/src/main/java/com/ruoyi/process/pojo/ProcessReport.java +++ b/cnas-process/src/main/java/com/ruoyi/process/pojo/ProcessReport.java @@ -54,19 +54,8 @@ @ApiModelProperty("鍙戦�佷汉") private Integer sendUser; - - @TableField(select = false,exist = false) - private String sendUserName; - @ApiModelProperty("绛炬敹浜�") private String signatory; - - - @TableField(select = false,exist = false) - private String signatoryUrl; - - @TableField(select = false,exist = false) - private String signatoryName; @ApiModelProperty("澶囨敞") private String remark; diff --git a/cnas-process/src/main/java/com/ruoyi/process/service/ProcessReportService.java b/cnas-process/src/main/java/com/ruoyi/process/service/ProcessReportService.java index 28b1f65..faf5c48 100644 --- a/cnas-process/src/main/java/com/ruoyi/process/service/ProcessReportService.java +++ b/cnas-process/src/main/java/com/ruoyi/process/service/ProcessReportService.java @@ -20,7 +20,7 @@ */ public interface ProcessReportService extends IService<ProcessReport> { - IPage<ProcessReport> pageProcessReport(Page page, ProcessReport processReport); + IPage<ProcessReportDto> pageProcessReport(Page page, ProcessReportDto processReport); void exportProcessReport(ProcessReportDto dto, HttpServletResponse response); } diff --git a/cnas-process/src/main/java/com/ruoyi/process/service/impl/ProcessReportServiceImpl.java b/cnas-process/src/main/java/com/ruoyi/process/service/impl/ProcessReportServiceImpl.java index 35ccbc6..08556d3 100644 --- a/cnas-process/src/main/java/com/ruoyi/process/service/impl/ProcessReportServiceImpl.java +++ b/cnas-process/src/main/java/com/ruoyi/process/service/impl/ProcessReportServiceImpl.java @@ -3,6 +3,7 @@ import cn.hutool.core.lang.UUID; import com.baomidou.mybatisplus.core.metadata.IPage; import com.baomidou.mybatisplus.core.toolkit.ObjectUtils; +import com.baomidou.mybatisplus.core.toolkit.StringUtils; import com.baomidou.mybatisplus.extension.plugins.pagination.Page; import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; import com.deepoove.poi.XWPFTemplate; @@ -13,6 +14,7 @@ import com.ruoyi.common.core.domain.entity.User; import com.ruoyi.common.utils.QueryWrappers; import com.ruoyi.common.utils.SecurityUtils; +import com.ruoyi.common.utils.SignatureImageUtil; import com.ruoyi.framework.exception.ErrorException; import com.ruoyi.inspect.util.HackLoopTableRenderPolicy; import com.ruoyi.process.dto.ProcessReportDto; @@ -21,7 +23,6 @@ import com.ruoyi.process.service.ProcessReportService; import com.ruoyi.system.mapper.UserMapper; import org.apache.commons.io.IOUtils; -import org.apache.commons.lang3.StringUtils; import org.apache.poi.xwpf.usermodel.*; import org.springframework.beans.factory.annotation.Value; import org.springframework.stereotype.Service; @@ -53,20 +54,32 @@ @Resource private ProcessReportMapper processReportMapper; + @Value("${file.path}") + private String imgUrl; @Resource private UserMapper userMapper; @Override - public IPage<ProcessReport> pageProcessReport(Page page, ProcessReport processReport) { - IPage<ProcessReport> processReportIPage = processReportMapper.pageProcessReport(page, QueryWrappers.queryWrappers(processReport)); + public IPage<ProcessReportDto> pageProcessReport(Page page, ProcessReportDto processReport) { + IPage<ProcessReportDto> processReportIPage = processReportMapper.pageProcessReport(page, QueryWrappers.queryWrappers(processReport)); return processReportIPage; } @Override public void exportProcessReport(ProcessReportDto dto, HttpServletResponse response) { - List<ProcessReport> processReports = processReportMapper.exportProcessReport(); + List<ProcessReportDto> processReports = processReportMapper.exportProcessReport(); + for (ProcessReportDto processReport : processReports) { + // 鍙戦�佷汉鐢熸垚绛惧悕鍥剧墖 + processReport.setSendUserRender(StringUtils.isNotBlank(processReport.getSendUserUrl()) + ? Pictures.ofLocal(imgUrl + "/" + processReport.getSendUserUrl()).create() : null); + + // 绛炬敹浜虹敓鎴愬浘鐗� + processReport.setSignatoryRender(StringUtils.isNotBlank(processReport.getSignatory()) + ? Pictures.ofStream(SignatureImageUtil.saveImageToFile(processReport.getSignatory())).create() : null); + } + // 鑾峰彇璺緞 InputStream inputStream = this.getClass().getResourceAsStream("/static/report-deal.docx"); Configure configure = Configure.builder() @@ -86,6 +99,7 @@ template.write(os); os.flush(); os.close(); + inputStream.close(); } catch (Exception e) { e.printStackTrace(); throw new RuntimeException("瀵煎嚭澶辫触"); diff --git a/cnas-process/src/main/java/com/ruoyi/process/service/impl/QualityMonitorServiceImpl.java b/cnas-process/src/main/java/com/ruoyi/process/service/impl/QualityMonitorServiceImpl.java index b8f2d71..ced7d39 100644 --- a/cnas-process/src/main/java/com/ruoyi/process/service/impl/QualityMonitorServiceImpl.java +++ b/cnas-process/src/main/java/com/ruoyi/process/service/impl/QualityMonitorServiceImpl.java @@ -751,11 +751,9 @@ if (qualityMonitorDetailsId == null) { throw new ErrorException("缂哄皯鐩戞帶璇︽儏id"); } - QualityMonitorDetails qualityMonitorDetails = qualityMonitorDetailsService.getOne(Wrappers.<QualityMonitorDetails>lambdaUpdate() - .eq(QualityMonitorDetails::getQualityMonitorDetailsId, qualityMonitorDetailsId)); LocalDateTime now = LocalDateTime.now(); Integer userId =SecurityUtils.getUserId().intValue(); - + String contentType = file.getContentType(); String urlString; String pathName; try { @@ -768,10 +766,13 @@ urlString = realpath + "/" + pathName; file.transferTo(new File(urlString)); - wordInsertUrl(new HashMap<String, Object>() {{ - put("writeUrl", UserUtils.getFinalUserSignatureUrl(userId)); - put("writeDateUrl", Pictures.ofStream(DateImageUtil.createDateImage(now)).create()); - }}, wordUrl + "/" + pathName.replace("/word", wordUrl)); + // 鍒ゆ柇鏄惁鏄痯df + if (!contentType.contains("pdf")) { + wordInsertUrl(new HashMap<String, Object>() {{ + put("writeUrl", UserUtils.getFinalUserSignatureUrl(userId)); + put("writeDateUrl", Pictures.ofStream(DateImageUtil.createDateImage(now)).create()); + }}, wordUrl + "/" + pathName.replace("/word", wordUrl)); + } qualityMonitorDetailsService.update(Wrappers.<QualityMonitorDetails>lambdaUpdate() .eq(QualityMonitorDetails::getQualityMonitorDetailsId, qualityMonitorDetailsId) @@ -807,7 +808,7 @@ // 娣诲姞鎵瑰噯浜� QualityMonitorDetails details = qualityMonitorDetailsMapper.selectById(qualityMonitorDetails.getQualityMonitorDetailsId()); - if (StringUtils.isNotBlank(details.getFinishReportUrl())) { + if (StringUtils.isNotBlank(details.getFinishReportUrl()) && !details.getFinishReportUrl().contains(".pdf")) { wordInsertUrl(new HashMap<String, Object>() {{ put("ratifyUrl", UserUtils.getFinalUserSignatureUrl(userId)); put("ratifyDateUrl", Pictures.ofStream(DateImageUtil.createDateImage(now)).create()); diff --git a/cnas-process/src/main/resources/mapper/ProcessReportMapper.xml b/cnas-process/src/main/resources/mapper/ProcessReportMapper.xml index 340e06c..62e82d0 100644 --- a/cnas-process/src/main/resources/mapper/ProcessReportMapper.xml +++ b/cnas-process/src/main/resources/mapper/ProcessReportMapper.xml @@ -18,7 +18,7 @@ <result column="update_user" property="updateUser"/> <result column="update_time" property="updateTime"/> </resultMap> - <select id="pageProcessReport" resultType="com.ruoyi.process.pojo.ProcessReport"> + <select id="pageProcessReport" resultType="com.ruoyi.process.dto.ProcessReportDto"> select * from (select cpr.* , u1.name sendUserName from cnas_process_report cpr @@ -27,10 +27,10 @@ ${ew.customSqlSegment} </if> </select> - <select id="exportProcessReport" resultType="com.ruoyi.process.pojo.ProcessReport"> + <select id="exportProcessReport" resultType="com.ruoyi.process.dto.ProcessReportDto"> select ROW_NUMBER() OVER (ORDER BY cpr.id) AS indexs, cpr.* , - u1.name sendUserName + u1.signature_url sendUserUrl from cnas_process_report cpr left join user u1 on send_user=u1.id </select> diff --git a/cnas-process/src/main/resources/static/report-deal.docx b/cnas-process/src/main/resources/static/report-deal.docx index eabb3e8..7f515a5 100644 --- a/cnas-process/src/main/resources/static/report-deal.docx +++ b/cnas-process/src/main/resources/static/report-deal.docx Binary files differ diff --git a/ruoyi-common/src/main/java/com/ruoyi/common/utils/SignatureImageUtil.java b/ruoyi-common/src/main/java/com/ruoyi/common/utils/SignatureImageUtil.java new file mode 100644 index 0000000..15365c4 --- /dev/null +++ b/ruoyi-common/src/main/java/com/ruoyi/common/utils/SignatureImageUtil.java @@ -0,0 +1,66 @@ +package com.ruoyi.common.utils; + +import org.springframework.core.io.ClassPathResource; + +import javax.imageio.ImageIO; +import java.awt.*; +import java.awt.font.FontRenderContext; +import java.awt.geom.Rectangle2D; +import java.awt.image.BufferedImage; +import java.io.*; + +/** + * @Author zhuo + * @Date 2025/5/7 + */ +public class SignatureImageUtil { + + /** + * 鏍规嵁涓枃瀵煎嚭绛惧悕鍥剧墖 + * @param text + * @return + * @throws IOException + * @throws FontFormatException + */ + public static InputStream saveImageToFile(String text){ + // 鑾峰彇瀛椾綋搴� + Font font = null; + try (InputStream is = new ClassPathResource("/ttf/signature.ttf").getInputStream()) { + font = Font.createFont(Font.TRUETYPE_FONT, is).deriveFont(50f); + } catch (FontFormatException | IOException e) { + throw new RuntimeException(e); + } + + int width = 100; // 鍥剧墖鐨勫搴� + int height = 50; // 鍥剧墖鐨勯珮搴� + + BufferedImage image = new BufferedImage(width, height, BufferedImage.TYPE_INT_ARGB); + Graphics2D g2d = image.createGraphics(); + + g2d.setFont(font); + + // 璁剧疆鏂囧瓧棰滆壊涓洪粦鑹� + g2d.setColor(Color.black); + + // 璁剧疆鏂囧瓧鍦ㄥ浘鐗囦腑鐨勪綅缃� + FontRenderContext context = g2d.getFontRenderContext(); + Rectangle2D bounds = font.getStringBounds(text, context); + double x = (width - bounds.getWidth()) / 2; + double y = (height - bounds.getHeight()) / 2; + double ascent = -bounds.getY(); + double baseY = y + ascent; + g2d.drawString(text, (int) x, (int) baseY); + g2d.dispose(); + + ByteArrayOutputStream os = new ByteArrayOutputStream(); + + try { + ImageIO.write(image, "png", os); + } catch (IOException e) { + throw new RuntimeException(e); + } + + return new ByteArrayInputStream(os.toByteArray()); + } + +} diff --git a/ruoyi-common/src/main/resources/ttf/signature.ttf b/ruoyi-common/src/main/resources/ttf/signature.ttf new file mode 100644 index 0000000..dd7cd59 --- /dev/null +++ b/ruoyi-common/src/main/resources/ttf/signature.ttf Binary files differ -- Gitblit v1.9.3