liuyc 2 жил өмнө
parent
commit
c301945c6e

+ 6 - 0
blade-service-api/blade-control-api/src/main/java/org/springblade/control/entity/EMFinancialReimbursementInfo.java

@@ -37,9 +37,15 @@ public class EMFinancialReimbursementInfo extends BaseEntity {
     @ApiModelProperty(value = "电子发票url地址")
     private String frElectronicInvoiceUrl;
 
+    @ApiModelProperty(value = "电子发票url地址PNG格式")
+    private String frElectronicInvoiceUrlPng;
+
     @ApiModelProperty(value = "附件url地址")
     private String frAttachmentUrl;
 
+    @ApiModelProperty(value = "附件url地址PNG格式")
+    private String frAttachmentUrlPng;
+
     @ApiModelProperty(value = "所属项目id")
     private Long projectId;
 

+ 7 - 0
blade-service/blade-control/pom.xml

@@ -52,6 +52,13 @@
             <groupId>org.springblade</groupId>
             <artifactId>blade-starter-excel</artifactId>
         </dependency>
+
+        <dependency>
+            <groupId>org.apache.pdfbox</groupId>
+            <artifactId>pdfbox</artifactId>
+            <version>2.0.27</version>
+        </dependency>
+
     </dependencies>
     <build>
         <plugins>

+ 1 - 1
blade-service/blade-control/src/main/java/org/springblade/control/controller/TaskProcessController.java

@@ -42,7 +42,7 @@ public class TaskProcessController extends BladeController {
     @GetMapping("/task/detail")
     @ApiOperationSupport(order = 2)
     @ApiOperation(value = "审批管理任务详情", notes = "传入审批任务id")
-    public R<TaskProcessInfoDetailVO> taskDetail(@RequestParam String id) {
+    public R<TaskProcessInfoDetailVO> taskDetail(@RequestParam String id) throws Exception {
         return R.data(taskProcessService.taskDetail(id));
     }
 

+ 1 - 1
blade-service/blade-control/src/main/java/org/springblade/control/service/TaskProcessService.java

@@ -20,7 +20,7 @@ public interface TaskProcessService extends BaseService<TaskProcessInfo> {
 
     IPage<TaskProcessInfoVO> taskPage(IPage<TaskProcessInfo> page, TaskProcessInfoDTO dto);
 
-    TaskProcessInfoDetailVO taskDetail(String id);
+    TaskProcessInfoDetailVO taskDetail(String id) throws Exception;
 
     boolean taskReject(TaskProcessInfoDTO dto);
 

+ 33 - 2
blade-service/blade-control/src/main/java/org/springblade/control/service/impl/TaskProcessServiceImpl.java

@@ -11,15 +11,18 @@ import com.fasterxml.jackson.databind.ObjectMapper;
 import lombok.AllArgsConstructor;
 import org.apache.commons.lang.StringUtils;
 import org.apache.commons.lang.time.DateUtils;
+import org.springblade.common.utils.CommonUtil;
 import org.springblade.common.utils.SnowFlakeUtil;
 import org.springblade.control.dto.*;
 import org.springblade.control.entity.*;
 import org.springblade.control.mapper.TaskProcessMapper;
 import org.springblade.control.service.TaskProcessService;
+import org.springblade.control.utils.PDFConverter;
 import org.springblade.control.vo.*;
 import org.springblade.core.log.exception.ServiceException;
 import org.springblade.core.mp.base.BaseServiceImpl;
 import org.springblade.core.mp.support.Condition;
+import org.springblade.core.oss.model.BladeFile;
 import org.springblade.core.redis.cache.BladeRedis;
 import org.springblade.core.secure.utils.SecureUtil;
 import org.springblade.core.tool.api.R;
@@ -27,6 +30,8 @@ import org.springblade.core.tool.utils.BeanUtil;
 import org.springblade.core.tool.utils.DateUtil;
 import org.springblade.core.tool.utils.Func;
 import org.springblade.core.tool.utils.ObjectUtil;
+import org.springblade.resource.feign.IOSSClient;
+import org.springblade.resource.feign.NewIOSSClient;
 import org.springblade.system.entity.Dept;
 import org.springblade.system.feign.ISysClient;
 import org.springblade.system.user.entity.User;
@@ -37,6 +42,7 @@ import org.springframework.jdbc.core.JdbcTemplate;
 import org.springframework.stereotype.Service;
 import org.springframework.transaction.annotation.Transactional;
 
+import java.io.InputStream;
 import java.math.BigDecimal;
 import java.text.SimpleDateFormat;
 import java.time.Duration;
@@ -58,6 +64,7 @@ public class TaskProcessServiceImpl extends BaseServiceImpl<TaskProcessMapper, T
     private final ProjectCostBudgetServiceImpl projectCostBudgetService;
     private final ProjectInfoServiceImpl projectInfoServiceImpl;
     private final ProjectCostBudgetStatsServiceImpl projectCostBudgetStatsService;
+    private final NewIOSSClient newIOSSClient;
 
     @Override
     public IPage<TaskProcessInfoVO> taskPage(IPage<TaskProcessInfo> page, TaskProcessInfoDTO dto) {
@@ -91,7 +98,7 @@ public class TaskProcessServiceImpl extends BaseServiceImpl<TaskProcessMapper, T
             endTime = DateUtil.format(DateUtils.addDays(DateUtil.parse(endTime, "yyyy-MM-dd"), 1), "yyyy-MM-dd");
             queryWrapper.lambda().between(TaskProcessInfo::getReportDate, dto.getStartTime(), endTime);
         }
-        IPage<TaskProcessInfo> pages = this.page(page, queryWrapper.lambda().orderBy(true, true, TaskProcessInfo::getReportDate));
+        IPage<TaskProcessInfo> pages = this.page(page, queryWrapper.lambda().orderBy(true, false, TaskProcessInfo::getReportDate));
 
         List<DictInfo> dictInfoList = jdbcTemplate.query("select dict_name,dict_value from c_dict_info where code = 'report_type'", new BeanPropertyRowMapper<>(DictInfo.class));
 
@@ -143,7 +150,7 @@ public class TaskProcessServiceImpl extends BaseServiceImpl<TaskProcessMapper, T
     }
 
     @Override
-    public TaskProcessInfoDetailVO taskDetail(String id) {
+    public TaskProcessInfoDetailVO taskDetail(String id) throws Exception {
         TaskProcessInfoDetailVO vo = new TaskProcessInfoDetailVO();
         TaskProcessInfo taskProcessInfo = baseMapper.selectById(id);
         if (taskProcessInfo != null) {
@@ -193,6 +200,30 @@ public class TaskProcessServiceImpl extends BaseServiceImpl<TaskProcessMapper, T
                                 data = jdbcTemplate.query("select * from c_expense_financial_reimbursement_info where id = " + record.getExpenseInfoId(), new BeanPropertyRowMapper<>(EMFinancialReimbursementInfo.class)).stream().findAny().orElse(null);
                                 EMFinancialReimbursementInfoVO voCW = BeanUtil.copyProperties(data, EMFinancialReimbursementInfoVO.class);
                                 if (voCW != null) {
+                                    //pdf转png
+                                    /*if (ObjectUtil.isNotEmpty(voCW.getFrAttachmentUrl()) && ObjectUtil.isEmpty(voCW.getFrAttachmentUrlPng())) {
+                                        InputStream ossInputStream = CommonUtil.getOSSInputStream(voCW.getFrAttachmentUrl());
+                                        byte[] bytes = PDFConverter.convertToPNG(ossInputStream);
+                                        if (bytes != null) {
+                                            BladeFile bladeFile = newIOSSClient.updateFile(bytes, SnowFlakeUtil.get() + ".png");
+                                            if (ObjectUtil.isNotEmpty(bladeFile)) {
+                                                jdbcTemplate.execute("update c_expense_financial_reimbursement_info set fr_electronic_invoice_url_png = '" + bladeFile.getLink() + "' where id = " + voCW.getId());
+                                                voCW.setFrAttachmentUrl(bladeFile.getLink());
+                                            }
+                                        }
+                                    }
+                                    if (ObjectUtil.isNotEmpty(voCW.getFrElectronicInvoiceUrl()) && ObjectUtil.isEmpty(voCW.getFrElectronicInvoiceUrlPng())) {
+                                        InputStream ossInputStream = CommonUtil.getOSSInputStream(voCW.getFrElectronicInvoiceUrl());
+                                        byte[] bytes = PDFConverter.convertToPNG(ossInputStream);
+                                        if (bytes != null) {
+                                            BladeFile bladeFile = newIOSSClient.updateFile(bytes, SnowFlakeUtil.get() + ".png");
+                                            if (ObjectUtil.isNotEmpty(bladeFile)) {
+                                                jdbcTemplate.execute("update c_expense_financial_reimbursement_info set fr_attachment_url_png = '" + bladeFile.getLink() + "' where id = " + voCW.getId());
+                                                voCW.setFrElectronicInvoiceUrl(bladeFile.getLink());
+                                            }
+                                        }
+                                    }*/
+
                                     if (ObjectUtil.isNotEmpty(voCW.getProjectId()) && ObjectUtil.isNotEmpty(voCW.getBudgetPlanIds())) { //如果预算ids不为空,那么证明有关联计划任务(单关联)
                                         TaskPlanInfoVO planTaskInfoList2 = this.getPlanTaskInfoList(voCW.getBudgetPlanIds(), controlProjectInfos);
                                         if (planTaskInfoList2 != null) {

+ 48 - 0
blade-service/blade-control/src/main/java/org/springblade/control/utils/PDFConverter.java

@@ -0,0 +1,48 @@
+package org.springblade.control.utils;
+
+import java.awt.image.BufferedImage;
+import java.io.ByteArrayOutputStream;
+import java.io.IOException;
+import java.io.InputStream;
+import java.io.OutputStream;
+import javax.imageio.ImageIO;
+
+import org.apache.commons.logging.Log;
+import org.apache.commons.logging.LogFactory;
+import org.apache.pdfbox.pdmodel.PDDocument;
+import org.apache.pdfbox.rendering.PDFRenderer;
+
+public class PDFConverter {
+
+    private static Log log = LogFactory.getLog(PDFConverter.class);
+
+    /**
+     * @param pdfInputStream
+     * @return
+     */
+    public static byte[] convertToPNG(InputStream pdfInputStream) {
+        try (PDDocument document = PDDocument.load(pdfInputStream)) {
+            PDFRenderer renderer = new PDFRenderer(document);
+            int numPages = document.getNumberOfPages();
+
+            ByteArrayOutputStream byteStream = new ByteArrayOutputStream();
+
+            for (int i = 0; i < numPages; i++) {
+                // 渲染页面为BufferedImage
+                BufferedImage image = renderer.renderImageWithDPI(i, 300); // 设置dpi参数
+
+                // 将BufferedImage输出为PNG格式到ByteArrayOutputStream
+                ImageIO.write(image, "png", byteStream);
+            }
+
+            log.info("PDF转换为PNG图像成功!");
+
+            return byteStream.toByteArray();
+
+        } catch (IOException e) {
+            log.error("转换过程中发生IO错误:" + e.getMessage());
+            return null;
+        }
+    }
+
+}