From 00400fe72f8e30cf7df08771f69b8ad8b80e9f1a Mon Sep 17 00:00:00 2001
From: 15815213711 <a13118667520@163.com>
Date: 星期三, 30 七月 2025 14:48:32 +0800
Subject: [PATCH] 修改ID,修改加密方式

---
 admin/config/test/application-custom.yml                                        |    8 
 ui/admin-ui3/src/api/cwgl/dispatchOrder.ts                                      |    9 +
 service/src/main/java/com/ruoyi/cwgl/service/IDispatchOrderService.java         |    3 
 service/src/main/java/com/ruoyi/cwgl/service/impl/DispatchOrderServiceImpl.java |   22 ++++
 service/src/main/java/com/ruoyi/cwgl/utils/simhei.ttf                           |    0 
 service/src/main/resources/simhei.ttf                                           |    0 
 service/src/main/java/com/ruoyi/cwgl/utils/MultiPagePdfWithImageUtils.java      |  186 +++++++++++++++++++++++++++++++++++++
 ui/admin-ui3/src/views/cwgl/dispatchOrder/index.vue                             |   21 ++++
 admin/src/main/resources/simhei.ttf                                             |    0 
 service/src/main/java/com/ruoyi/cwgl/controller/DispatchOrderController.java    |   16 +++
 service/pom.xml                                                                 |    6 +
 11 files changed, 264 insertions(+), 7 deletions(-)

diff --git a/admin/config/test/application-custom.yml b/admin/config/test/application-custom.yml
index a0f74fd..0fe513c 100644
--- a/admin/config/test/application-custom.yml
+++ b/admin/config/test/application-custom.yml
@@ -55,11 +55,11 @@
       log-slow-sql: true  # 鎱QL璁板綍
   #redis 鐩稿叧閰嶇疆
   redis:
-    host: 127.0.0.1 #璁块棶鍦板潃
-    port: 6379 #绔彛
-    password: 123456 #瀵嗙爜
+    host: 61.143.42.70 #璁块棶鍦板潃
+    port: 7007 #绔彛
+    password: rd@123 #瀵嗙爜
     timeout: 10s #瓒呮椂鏃堕棿
-    keyprefix: cwgl_test #瀛樺偍key鍓嶇紑锛岄伩鍏嶅濂楃幆澧僰ey鐩稿悓
+    keyprefix: cwgl:test #瀛樺偍key鍓嶇紑锛岄伩鍏嶅濂楃幆澧僰ey鐩稿悓
   #swagger鐩稿叧閰嶇疆
   swagger:
     enabled: true #鏄惁寮�鍚�
diff --git a/admin/src/main/resources/simhei.ttf b/admin/src/main/resources/simhei.ttf
new file mode 100644
index 0000000..3326815
--- /dev/null
+++ b/admin/src/main/resources/simhei.ttf
Binary files differ
diff --git a/service/pom.xml b/service/pom.xml
index b901709..4140a88 100644
--- a/service/pom.xml
+++ b/service/pom.xml
@@ -25,7 +25,11 @@
         <artifactId>common</artifactId>
         <version>${project.version}</version>
     </dependency>
-
+        <dependency>
+            <groupId>com.itextpdf</groupId>
+            <artifactId>itextpdf</artifactId>
+            <version>5.5.13.3</version>
+        </dependency>
 
     <!--鎸佷箙鍖栧眰妯″潡-->
     <dependency>
diff --git a/service/src/main/java/com/ruoyi/cwgl/controller/DispatchOrderController.java b/service/src/main/java/com/ruoyi/cwgl/controller/DispatchOrderController.java
index 78d5aa6..5f87b9a 100644
--- a/service/src/main/java/com/ruoyi/cwgl/controller/DispatchOrderController.java
+++ b/service/src/main/java/com/ruoyi/cwgl/controller/DispatchOrderController.java
@@ -2,8 +2,12 @@
 
 import java.util.List;
 
+import com.ruoyi.common.config.RuoYiConfig;
+import com.ruoyi.common.utils.StringUtils;
+import com.ruoyi.common.utils.file.FileUtils;
 import com.ruoyi.cwgl.domain.vo.DispatchOrderAttachmentVo;
 import com.ruoyi.cwgl.domain.vo.DispatchOrderItemVo;
+import org.springframework.http.MediaType;
 import org.springframework.security.access.prepost.PreAuthorize;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.web.bind.annotation.GetMapping;
@@ -23,6 +27,8 @@
 import com.ruoyi.cwgl.service.IDispatchOrderService;
 import com.ruoyi.common.utils.poi.ExcelUtil;
 import com.ruoyi.common.core.page.TableDataInfo;
+
+import javax.servlet.http.HttpServletResponse;
 
 /**
  * 璋冨害鍗旵ontroller
@@ -73,6 +79,15 @@
         return getDataTable(list);
     }
 
+    @PreAuthorize("@ss.hasPermi('cwgl:dispatchOrder:attachment')")
+    @GetMapping("/downAttachment")
+    public void downAttachment(String no, HttpServletResponse response) throws Exception {
+        String filePath = dispatchOrderService.downAttachment(no);
+        response.setContentType(MediaType.APPLICATION_OCTET_STREAM_VALUE);
+        FileUtils.setAttachmentResponseHeader(response, FileUtils.getName(filePath));
+        FileUtils.writeBytes(filePath, response.getOutputStream());
+    }
+
     /**
      * 瀵煎嚭璋冨害鍗曞垪琛�
      * @param dispatchOrder 鏌ヨ鏉′欢瀵硅薄
@@ -100,6 +115,7 @@
 
 
 
+
     /**
      * 鑾峰彇璋冨害鍗曡缁嗕俊鎭�
      */
diff --git a/service/src/main/java/com/ruoyi/cwgl/service/IDispatchOrderService.java b/service/src/main/java/com/ruoyi/cwgl/service/IDispatchOrderService.java
index 223d114..9670099 100644
--- a/service/src/main/java/com/ruoyi/cwgl/service/IDispatchOrderService.java
+++ b/service/src/main/java/com/ruoyi/cwgl/service/IDispatchOrderService.java
@@ -1,5 +1,6 @@
 package com.ruoyi.cwgl.service;
 
+import java.io.FileNotFoundException;
 import java.util.List;
 import com.ruoyi.cwgl.domain.DispatchOrder;
 import com.baomidou.mybatisplus.extension.service.IService;
@@ -118,4 +119,6 @@
      * @return
      */
     List<DispatchOrderAttachmentVo> selectDispatchOrderAttachment(String no);
+
+    String downAttachment(String no) throws Exception;
 }
diff --git a/service/src/main/java/com/ruoyi/cwgl/service/impl/DispatchOrderServiceImpl.java b/service/src/main/java/com/ruoyi/cwgl/service/impl/DispatchOrderServiceImpl.java
index 58e4e9a..dc5a30e 100644
--- a/service/src/main/java/com/ruoyi/cwgl/service/impl/DispatchOrderServiceImpl.java
+++ b/service/src/main/java/com/ruoyi/cwgl/service/impl/DispatchOrderServiceImpl.java
@@ -1,6 +1,10 @@
 package com.ruoyi.cwgl.service.impl;
 
+import java.io.FileNotFoundException;
+import java.io.FileOutputStream;
 import java.lang.reflect.Method;
+import java.nio.file.Files;
+import java.nio.file.Paths;
 import java.util.ArrayList;
 import java.util.List;
 import java.math.BigDecimal;
@@ -12,7 +16,13 @@
 import cn.hutool.core.bean.BeanUtil;
 import cn.hutool.core.util.PageUtil;
 import com.github.pagehelper.Page;
+import com.itextpdf.text.Document;
+import com.itextpdf.text.Font;
+import com.itextpdf.text.PageSize;
+import com.itextpdf.text.pdf.BaseFont;
+import com.itextpdf.text.pdf.PdfWriter;
 import com.ruoyi.common.annotation.Excel;
+import com.ruoyi.common.config.RuoYiConfig;
 import com.ruoyi.common.core.redis.RedisCache;
 import com.ruoyi.common.utils.DateUtils;
 import javax.annotation.Resource;
@@ -23,6 +33,7 @@
 import com.ruoyi.common.utils.poi.ExcelUtil;
 import com.ruoyi.cwgl.domain.vo.DispatchOrderVo;
 import com.ruoyi.cwgl.enums.FeeTypeEnums;
+import com.ruoyi.cwgl.utils.MultiPagePdfWithImageUtils;
 import org.springframework.beans.factory.annotation.Autowired;
 
 import com.ruoyi.cwgl.domain.DispatchOrderItem;
@@ -476,4 +487,15 @@
     public List<DispatchOrderAttachmentVo> selectDispatchOrderAttachment(String no) {
         return dispatchOrderMapper.selectDispatchOrderAttachment(no);
     }
+
+    @DataSource(DataSourceType.CWSJ)
+    @Override
+    public String  downAttachment(String no) throws Exception {
+        List<DispatchOrderAttachmentVo> dispatchOrderAttachmentVos = selectDispatchOrderAttachment(no);
+        return MultiPagePdfWithImageUtils.createPdf(dispatchOrderAttachmentVos, no);
+    }
+
+
+
+
 }
diff --git a/service/src/main/java/com/ruoyi/cwgl/utils/MultiPagePdfWithImageUtils.java b/service/src/main/java/com/ruoyi/cwgl/utils/MultiPagePdfWithImageUtils.java
new file mode 100644
index 0000000..227140e
--- /dev/null
+++ b/service/src/main/java/com/ruoyi/cwgl/utils/MultiPagePdfWithImageUtils.java
@@ -0,0 +1,186 @@
+package com.ruoyi.cwgl.utils;
+
+import com.itextpdf.text.*;
+import com.itextpdf.text.pdf.*;
+import com.ruoyi.common.config.RuoYiConfig;
+import com.ruoyi.cwgl.domain.vo.DispatchOrderAttachmentVo;
+
+import java.io.FileOutputStream;
+import java.net.URL;
+import java.nio.file.Files;
+import java.nio.file.Paths;
+import java.util.Arrays;
+import java.util.List;
+import java.util.Optional;
+import java.util.UUID;
+
+
+public class MultiPagePdfWithImageUtils {
+
+
+    public static String createPdf(List<DispatchOrderAttachmentVo> dispatchOrderAttachmentVos, String no) throws Exception {
+        String fileName = no+ "_鍑瘉_"+ UUID.randomUUID() +".pdf";
+        String path = RuoYiConfig.getDownloadPath() + fileName;
+
+        Document document = new Document(PageSize.A4, 36, 36, 36, 36);
+        PdfWriter writer = PdfWriter.getInstance(document, Files.newOutputStream(Paths.get(path)));
+        document.open();
+
+        BaseFont baseFont = BaseFont.createFont("simhei.ttf", BaseFont.IDENTITY_H, BaseFont.EMBEDDED);
+        Font font = new Font(baseFont, 11, Font.NORMAL);
+
+
+        int totalPages = dispatchOrderAttachmentVos.size();
+        for (int i = 0; i < totalPages; i++) {
+            if (i > 0) document.newPage();
+
+            DispatchOrderAttachmentVo dispatchOrderAttachmentVo = dispatchOrderAttachmentVos.get(i);
+
+            String currency = Optional.ofNullable(dispatchOrderAttachmentVo.getCurrency()).orElse("浜烘皯甯�");
+            String currentStr;
+            if ("浜烘皯甯�".equals(currency)){
+                currentStr = "鎬婚噾棰濓細娓竵 0锛涗汉姘戝竵锛�"+dispatchOrderAttachmentVo.getAccount()+";";
+            }else{
+                currentStr = "鎬婚噾棰濓細娓竵 "+dispatchOrderAttachmentVo.getAccount()+"锛涗汉姘戝竵锛�0锛�";
+            }
+
+
+            PdfPTable wrapperTable = new PdfPTable(1);
+            wrapperTable.setWidthPercentage(100);
+            wrapperTable.setKeepTogether(true);
+
+            // 鈻� 椤电湁琛ㄦ牸
+            PdfPTable headerTable = new PdfPTable(2);
+            headerTable.setWidthPercentage(100);
+            headerTable.setWidths(new int[]{3, 2});
+            headerTable.addCell(createCell("璋冨害鍗曞彿锛�"+no, font));
+            headerTable.addCell(createCell(currentStr, font));
+            PdfPCell headerCell = new PdfPCell(headerTable);
+            headerCell.setBorder(Rectangle.BOX);
+            wrapperTable.addCell(headerCell);
+            // 鈻� 鍥剧墖
+            Image image = Image.getInstance(new URL(dispatchOrderAttachmentVo.getImageUrl()));
+
+            // 闄愬埗鍥剧墖鏈�澶у昂瀵�
+            float maxImgWidth = 500f;
+            float maxImgHeight = 700f;
+            image.scaleToFit(maxImgWidth, maxImgHeight);
+            image.setAlignment(Image.ALIGN_CENTER);
+
+            // 鍒涘缓鍥剧墖鍗曞厓鏍煎苟璁剧疆鍥哄畾楂樺害锛堢‘淇濇暣浣撹〃鏍间笉鍒嗛〉锛�
+            PdfPCell imageCell = new PdfPCell();
+            imageCell.setPadding(10);
+            imageCell.setBorder(Rectangle.BOX);
+            imageCell.setFixedHeight(maxImgHeight + 20); // 鍔犱竴鐐� padding 绌洪棿
+            imageCell.setHorizontalAlignment(Element.ALIGN_CENTER);
+            imageCell.setVerticalAlignment(Element.ALIGN_MIDDLE);
+            imageCell.addElement(image);
+            wrapperTable.addCell(imageCell);
+
+            // 鈻� 椤佃剼琛ㄦ牸
+            PdfPTable footerTable = new PdfPTable(4);
+            footerTable.setWidthPercentage(100);
+            footerTable.setWidths(new int[]{3, 2, 2, 3});
+            footerTable.addCell(createCell("璐圭敤绫伙細"+dispatchOrderAttachmentVo.getFeeItem(), font));
+            footerTable.addCell(createCell("閲戦锛�"+dispatchOrderAttachmentVo.getAccount(), font));
+            footerTable.addCell(createCell("甯佸埗锛�"+dispatchOrderAttachmentVo.getCurrency(), font));
+            footerTable.addCell(createCell("绗� " + (i + 1) + " 椤� / 鍏� " + totalPages + " 椤�", font));
+            PdfPCell footerCell = new PdfPCell(footerTable);
+            footerCell.setBorder(Rectangle.BOX);
+            wrapperTable.addCell(footerCell);
+
+            // 娣诲姞鎬昏〃鏍�
+            document.add(wrapperTable);
+
+        }
+        document.close();
+        writer.close();
+        System.out.println("PDF 鐢熸垚鎴愬姛锛�");
+        return path;
+    }
+
+    public static void main(String[] args) throws Exception {
+        Document document = new Document(PageSize.A4, 36, 36, 36, 36);
+        PdfWriter writer = PdfWriter.getInstance(document, new FileOutputStream("bordered_receipt.pdf"));
+        document.open();
+
+        BaseFont baseFont = BaseFont.createFont("simhei.ttf", BaseFont.IDENTITY_H, BaseFont.EMBEDDED);
+        Font font = new Font(baseFont, 11, Font.NORMAL);
+
+        List<String> imageUrls = Arrays.asList(
+                "https://xiongbenda-shengzheng.oss-cn-shenzhen.aliyuncs.com/cz/ImageViewServlet%20%281%29.gif",
+                "https://xiongbenda-shengzheng.oss-cn-shenzhen.aliyuncs.com/cz/ImageViewServlet.gif"
+        );
+
+        int totalPages = imageUrls.size();
+
+        for (int i = 0; i < totalPages; i++) {
+            if (i > 0) document.newPage();
+
+            // 鈻� 鏋勯�犱竴涓�昏〃鏍硷紙3琛岋紝1鍒楋級锛屽寘浣忔墍鏈夊唴瀹癸紝鎺у埗杈规涓庡垎椤�
+            PdfPTable wrapperTable = new PdfPTable(1);
+            wrapperTable.setWidthPercentage(100);
+            wrapperTable.setKeepTogether(true);
+
+            // 鈻� 椤电湁琛ㄦ牸
+            PdfPTable headerTable = new PdfPTable(2);
+            headerTable.setWidthPercentage(100);
+            headerTable.setWidths(new int[]{3, 2});
+            headerTable.addCell(createCell("璋冨害鍗曞彿锛歀D2507260028", font));
+            headerTable.addCell(createCell("鎬婚噾棰濓細娓竵 280锛涗汉姘戝竵锛�0", font));
+            PdfPCell headerCell = new PdfPCell(headerTable);
+            headerCell.setBorder(Rectangle.BOX);
+            wrapperTable.addCell(headerCell);
+
+            // 鈻� 鍥剧墖
+            Image image = Image.getInstance(new URL(imageUrls.get(i)));
+
+// 闄愬埗鍥剧墖鏈�澶у昂瀵�
+            float maxImgWidth = 500f;
+            float maxImgHeight = 700f;
+            image.scaleToFit(maxImgWidth, maxImgHeight);
+            image.setAlignment(Image.ALIGN_CENTER);
+
+// 鍒涘缓鍥剧墖鍗曞厓鏍煎苟璁剧疆鍥哄畾楂樺害锛堢‘淇濇暣浣撹〃鏍间笉鍒嗛〉锛�
+            PdfPCell imageCell = new PdfPCell();
+            imageCell.setPadding(10);
+            imageCell.setBorder(Rectangle.BOX);
+            imageCell.setFixedHeight(maxImgHeight + 20); // 鍔犱竴鐐� padding 绌洪棿
+            imageCell.setHorizontalAlignment(Element.ALIGN_CENTER);
+            imageCell.setVerticalAlignment(Element.ALIGN_MIDDLE);
+            imageCell.addElement(image);
+            wrapperTable.addCell(imageCell);
+
+            // 鈻� 椤佃剼琛ㄦ牸
+            PdfPTable footerTable = new PdfPTable(4);
+            footerTable.setWidthPercentage(100);
+            footerTable.setWidths(new int[]{3, 2, 2, 3});
+            footerTable.addCell(createCell("璐圭敤绫伙細鐧昏璐� HKD", font));
+            footerTable.addCell(createCell("閲戦锛�250.00", font));
+            footerTable.addCell(createCell("甯佸埗锛氭腐甯�", font));
+            footerTable.addCell(createCell("绗� " + (i + 1) + " 椤� / 鍏� " + totalPages + " 椤�", font));
+            PdfPCell footerCell = new PdfPCell(footerTable);
+            footerCell.setBorder(Rectangle.BOX);
+            wrapperTable.addCell(footerCell);
+
+            // 娣诲姞鎬昏〃鏍�
+            document.add(wrapperTable);
+        }
+
+        document.close();
+        writer.close();
+        System.out.println("PDF 鐢熸垚鎴愬姛锛�");
+    }
+
+
+
+
+    // 榛樿宸﹀榻愩�佸惈鍐呰竟璺濄�佸惈杈规
+    private static PdfPCell createCell(String text, Font font) {
+        PdfPCell cell = new PdfPCell(new Phrase(text, font));
+        cell.setPadding(6);
+        cell.setHorizontalAlignment(Element.ALIGN_LEFT);
+        cell.setVerticalAlignment(Element.ALIGN_MIDDLE);
+        return cell;
+    }
+}
diff --git a/service/src/main/java/com/ruoyi/cwgl/utils/simhei.ttf b/service/src/main/java/com/ruoyi/cwgl/utils/simhei.ttf
new file mode 100644
index 0000000..3326815
--- /dev/null
+++ b/service/src/main/java/com/ruoyi/cwgl/utils/simhei.ttf
Binary files differ
diff --git a/service/src/main/resources/simhei.ttf b/service/src/main/resources/simhei.ttf
new file mode 100644
index 0000000..3326815
--- /dev/null
+++ b/service/src/main/resources/simhei.ttf
Binary files differ
diff --git a/ui/admin-ui3/src/api/cwgl/dispatchOrder.ts b/ui/admin-ui3/src/api/cwgl/dispatchOrder.ts
index 3479084..9236375 100644
--- a/ui/admin-ui3/src/api/cwgl/dispatchOrder.ts
+++ b/ui/admin-ui3/src/api/cwgl/dispatchOrder.ts
@@ -70,7 +70,14 @@
         download('/cwgl/dispatchOrder/export2',query);
     })
 }
-
+export const downloadFJ:requestType = (query) => {
+    return request({
+        url: '/cwgl/dispatchOrder/downAttachment',
+        method:'get',
+        params:query,
+        responseType: 'blob'
+    })
+}
 /**
  * 鏌ヨ鏌ョ湅璐圭敤
  */
diff --git a/ui/admin-ui3/src/views/cwgl/dispatchOrder/index.vue b/ui/admin-ui3/src/views/cwgl/dispatchOrder/index.vue
index d2b5e93..5df8a14 100644
--- a/ui/admin-ui3/src/views/cwgl/dispatchOrder/index.vue
+++ b/ui/admin-ui3/src/views/cwgl/dispatchOrder/index.vue
@@ -39,6 +39,11 @@
             class="attachment-image" />
         </template>
       </avue-crud>
+      <template #footer>
+        <div class="dialog-footer">
+          <el-button type="primary" v-if="itemTableData2.length>0" @click="downPZ">涓嬭浇鍑瘉</el-button>
+        </div>
+      </template>
 
     </el-dialog>
   </basicContainer>
@@ -52,13 +57,15 @@
   exportDispatchOrder,
   getDispatchOrder,
   listDispatchOrder,
-  updateDispatchOrder, cwglDispatchOrderItem, cwglDispatchOrderattAchment, exportDispatchOrder2
+  updateDispatchOrder, cwglDispatchOrderItem, cwglDispatchOrderattAchment, exportDispatchOrder2, downloadFJ
 } from "@/api/cwgl/dispatchOrder";
 import useCurrentInstance from "@/utils/useCurrentInstance";
 import { computed, reactive, ref, toRefs } from "vue";
 import { PagesInterface, PageQueryInterface } from "@/utils/globalInterface";
 import { usePagePlus } from "@/hooks/usePagePlus";
 import { hasPermission } from "@/utils/permissionUtils";
+import {blobValidate} from "@/utils/ruoyi";
+import {saveAs} from "file-saver";
 
 const { proxy } = useCurrentInstance();
 const crudRef = ref();
@@ -378,6 +385,18 @@
   queryParams.value = proxy.addDateRangeNew(queryParams.value, queryParams.value?.actualArrivalTimeRange, 'actualArrivalTime') || {};
   exportDispatchOrder2(queryParams.value);
 }
+
+const downPZ =()=>{
+  downloadFJ({no:pageAttachment.value.no}).then(res=>{
+    console.log(res)
+      const blob = new Blob([res])
+    console.log(blob)
+      saveAs(blob, decodeURI(pageAttachment.value.no+"鍑瘉.pdf"))
+
+  })
+
+}
+
 </script>
 <style lang="scss" scoped>
 .avue-dialog .el-dialog__body {

--
Gitblit v1.8.0