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