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