From 47e773b52f96b51bd1d55496cf6551e47993e828 Mon Sep 17 00:00:00 2001 From: ggxl <194689125@qq.com> Date: Wed, 28 May 2025 10:05:33 +0800 Subject: [PATCH] =?UTF-8?q?=E9=80=9A=E8=BF=87post=E8=AF=B7=E6=B1=82?= =?UTF-8?q?=E8=8E=B7=E5=8F=96=E5=8F=91=E7=A5=A8=E4=B8=8B=E8=BD=BD=E9=93=BE?= =?UTF-8?q?=E6=8E=A5=E5=AE=9E=E7=8E=B0=E6=89=93=E5=8D=B0=E5=8F=91=E7=A5=A8?= =?UTF-8?q?-=E9=BE=9A=E5=AE=87=E6=9D=B0?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../print/TripReimbursePrintPlugin.java | 187 ++++++++++++++++-- 1 file changed, 176 insertions(+), 11 deletions(-) diff --git a/src/main/java/zf47/jdgz1/fi/em/plugin/print/TripReimbursePrintPlugin.java b/src/main/java/zf47/jdgz1/fi/em/plugin/print/TripReimbursePrintPlugin.java index 74b48b6..effd073 100644 --- a/src/main/java/zf47/jdgz1/fi/em/plugin/print/TripReimbursePrintPlugin.java +++ b/src/main/java/zf47/jdgz1/fi/em/plugin/print/TripReimbursePrintPlugin.java @@ -1,5 +1,9 @@ package zf47.jdgz1.fi.em.plugin.print; +import com.alibaba.fastjson.JSON; +import com.alibaba.fastjson.JSONArray; +import com.alibaba.fastjson.JSONObject; +import com.alibaba.fastjson.serializer.SerializerFeature; import kd.bos.dataentity.entity.DynamicObject; import kd.bos.dataentity.entity.DynamicObjectCollection; import kd.bos.fileservice.FileItem; @@ -18,8 +22,17 @@ import kd.bos.service.attachment.FilePathService; import kd.bos.servicehelper.AttachmentServiceHelper; import kd.bos.servicehelper.BusinessDataServiceHelper; import kd.bos.url.UrlService; +import kd.fi.er.business.invoicecloud.cache.model.InvoiceCloudCfgBO; +import kd.fi.er.business.invoicecloud.kingdee.KingdeeInvoiceCloudConfig; +import kd.fi.er.common.utils.MD5; import kd.sdk.plugin.Plugin; import org.apache.commons.lang3.StringUtils; +import org.apache.http.HttpResponse; +import org.apache.http.client.methods.HttpPost; +import org.apache.http.entity.StringEntity; +import org.apache.http.impl.client.CloseableHttpClient; +import org.apache.http.impl.client.HttpClients; +import org.apache.http.util.EntityUtils; import org.apache.pdfbox.pdmodel.PDDocument; import org.apache.pdfbox.rendering.ImageType; import org.apache.pdfbox.rendering.PDFRenderer; @@ -30,10 +43,7 @@ import javax.imageio.ImageIO; import java.awt.geom.AffineTransform; import java.awt.image.AffineTransformOp; import java.awt.image.BufferedImage; -import java.io.ByteArrayInputStream; -import java.io.ByteArrayOutputStream; -import java.io.InputStream; -import java.io.UnsupportedEncodingException; +import java.io.*; import java.net.HttpURLConnection; import java.net.URL; import java.net.URLEncoder; @@ -64,6 +74,7 @@ public class TripReimbursePrintPlugin extends AbstractPrintPlugin implements Plu log.info(evt.getDataSource().getDsName()); //拿源单类型 Object pkId = evt.getDataSource().getPkId(); + DynamicObject tripReimburse = BusinessDataServiceHelper.loadSingle(pkId, MAIN_DS, "costcompany"); DynamicObject bill = BusinessDataServiceHelper.loadSingle(pkId, MAIN_DS); if (bill != null) { long billId = bill.getLong("id"); @@ -72,13 +83,12 @@ public class TripReimbursePrintPlugin extends AbstractPrintPlugin implements Plu if (srcInvEntries != null && !srcInvEntries.isEmpty()) { for (DynamicObject srcInvEntry : srcInvEntries) { String serialNo = srcInvEntry.getString("serialno");//发票序列号 - QFilter qInvFile = new QFilter("serial_no", QCP.equals, serialNo); - DynamicObject[] invFiles = BusinessDataServiceHelper.load("rim_invoice_file", - "image_url", new QFilter[]{qInvFile}); - for (DynamicObject invFile : invFiles) { - String url = invFile.getString("image_url"); - if (StringUtils.isNotBlank(url)) { - ArrayList handleUrls = handlePicAttUrl(url); + Long companyId = tripReimburse.getDynamicObject("costcompany").getLong("id"); + HashMap result = null; + try { + result = getInvoiceDownloadUrlByPost(serialNo, companyId); + if (!result.isEmpty()) { + ArrayList handleUrls = InvoiceToPic(result); for (String handleUrl : handleUrls) { DataRowSet dataRowSet = new DataRowSet(); ImageField imageField = new ImageField(handleUrl); @@ -86,6 +96,8 @@ public class TripReimbursePrintPlugin extends AbstractPrintPlugin implements Plu customDataRows.add(dataRowSet); } } + } catch (Exception e) { + throw new RuntimeException(e); } } } @@ -143,6 +155,159 @@ public class TripReimbursePrintPlugin extends AbstractPrintPlugin implements Plu } } + private HashMap getInvoiceDownloadUrlByPost(String serialNo, Long companyId) throws IOException { + HashMap result = new HashMap<>(); + QFilter urlQF = new QFilter("number", QCP.equals, "GetInvoiceDetailDataUrl"); + DynamicObject urlParam = BusinessDataServiceHelper.loadSingle("zf47_system_params", "zf47_val", urlQF.toArray()); + if (urlParam == null) { + log.warn("TripReimbursePrintPlugin:GetInvoiceDetailDataUrl参数未配置"); + } else { + String url = urlParam.getString("zf47_val"); + QFilter headerQF = new QFilter("number", QCP.equals, "GetInvoiceDetailDataHeader"); + DynamicObject headerParam = BusinessDataServiceHelper.loadSingle("zf47_system_params", "zf47_val", headerQF.toArray()); + if (headerParam != null) { + HashMap header = new HashMap<>(); + String val = headerParam.getString("zf47_val"); + if (val.contains(";")) { + String[] splits = val.split(";"); + for (String split : splits) { + String[] splits1 = split.split(","); + header.put(splits1[0], splits1[1]); + } + } else { + String[] splits = val.split(","); + header.put(splits[0], splits[1]); + } + + HashMap body = new HashMap<>(); + InvoiceCloudCfgBO config = KingdeeInvoiceCloudConfig.getConfig(companyId); + String client_id = config.getClientId(); + String client_secret = config.getClientSecret(); + String timestamp = String.valueOf(System.currentTimeMillis()); + body.put("timestamp", timestamp); + body.put("sign", MD5.md5crypt(client_id + client_secret + timestamp)); + body.put("client_id", client_id); + body.put("fid", serialNo); + + JSONObject obj = (JSONObject) JSONObject.parse(sendPost(url, header, body)); + JSONArray data = (JSONArray) obj.get("data"); + JSONObject invoice = (JSONObject) data.get(0); + result.put("downloadUrl", (String) invoice.get("downloadUrl")); + result.put("originalFileName", (String) invoice.get("originalFileName")); + } else { + log.warn("TripReimbursePrintPlugin:GetInvoiceDetailDataHeader参数未配置"); + } + } + return result; + } + + public String sendPost(String url, HashMap header, HashMap body) throws IOException { + String responseData = ""; + // 准备要发送的 JSON 数据 + // 使用 FastJSON 将 Map 转换为 JSON 字符串 + String jsonString = JSON.toJSONString(body, SerializerFeature.DisableCircularReferenceDetect); + CloseableHttpClient httpClient = HttpClients.createDefault(); + + // 创建 HttpPost 请求 + HttpPost httpPost = new HttpPost(url); + + // 设置请求头 +// httpPost.setHeader("Content-Type", "application/json"); + for (Object o : header.keySet()) { + httpPost.setHeader((String) o, (String) header.get(o)); + } + // 设置请求体 + StringEntity jsonEntity = new StringEntity(jsonString, "UTF-8"); + httpPost.setEntity(jsonEntity); + + // 发送请求并获取响应 + HttpResponse response = httpClient.execute(httpPost); + + // 检查响应状态 + if (response.getStatusLine().getStatusCode() == 200) { + // 获取响应数据 + responseData = EntityUtils.toString(response.getEntity()); + log.info("TripReimbursePrintPlugin,Response: " + responseData); + } else { + log.info("TripReimbursePrintPlugin,Error: " + response.getStatusLine().getStatusCode() + "," + jsonEntity); + } + return responseData; + } + + private ArrayList InvoiceToPic(HashMap result) { + ArrayList resUrls = new ArrayList<>(); + try { + FileService fs = FileServiceFactory.getAttachmentFileService(); + String uploadPrefix = "/invoiceApi/tripreimburse/image/"; + String file = result.get("originalFileName"); + String url = result.get("downloadUrl"); + + String newFileName = ""; + int index = file.lastIndexOf("."); + String fileType = file.substring(index + 1); + String fileName = URLEncoder.encode(file.substring(0, index), "utf-8"); + URL Url = new URL(url); + HttpURLConnection conn = (HttpURLConnection) Url.openConnection(); + InputStream inputStream = conn.getInputStream(); + if (inputStream.available() > 0) { + ByteArrayOutputStream outputStream = new ByteArrayOutputStream(); + if ("pdf".equals(fileType)) { + PDDocument document = PDDocument.load(inputStream); + PDFRenderer pdfRenderer = new PDFRenderer(document); + for (int page = 0; page < document.getNumberOfPages(); ++page) { + newFileName = fileName + "-" + page + ".jpg"; + BufferedImage bim = pdfRenderer.renderImageWithDPI(page, 1000, ImageType.RGB); + ImageIO.write(bim, "jpg", outputStream); + inputStream.close(); + } + ByteArrayInputStream byteArrayInputStream = new ByteArrayInputStream(outputStream.toByteArray()); + FileItem fileItem = new FileItem(newFileName, uploadPrefix + newFileName, byteArrayInputStream); + String upload = fs.upload(fileItem); + deleteUrl.add(upload); + String uploadUrl = UrlService.getAttachmentDownloadUrl(upload); + String uploadEncreptURL = AttachmentServiceHelper.getEncreptURL(uploadUrl); + byteArrayInputStream.close(); + resUrls.add(uploadEncreptURL); + document.close(); + } else if ("ofd".equals(fileType)) { + try (OFDReader reader = new OFDReader(inputStream);) { + inputStream.close(); + ImageMaker imageMaker = new ImageMaker(reader, 15); + for (int i = 0; i < imageMaker.pageSize(); i++) { + newFileName = fileName + "-" + i + ".jpg"; + + // 4. 指定页码转换图片 + BufferedImage image = imageMaker.makePage(i); + // 5. 存储为指定格式图片 + ImageIO.write(image, "JPG", outputStream); + ByteArrayInputStream byteArrayInputStream = new ByteArrayInputStream(outputStream.toByteArray()); + FileItem fileItem = new FileItem(newFileName, uploadPrefix + newFileName, byteArrayInputStream); + String upload = fs.upload(fileItem); + deleteUrl.add(upload); + String uploadUrl = UrlService.getAttachmentDownloadUrl(upload); + String uploadEncreptURL = AttachmentServiceHelper.getEncreptURL(uploadUrl); + byteArrayInputStream.close(); + resUrls.add(uploadEncreptURL); + } + } + } else if ("jpg".equalsIgnoreCase(fileType) || "jpeg".equalsIgnoreCase(fileType) || "png".equalsIgnoreCase(fileType) + || "bmp".equalsIgnoreCase(fileType) || "gif".equalsIgnoreCase(fileType)) { + ByteArrayInputStream byteArrayInputStream = new ByteArrayInputStream(outputStream.toByteArray()); + FileItem fileItem = new FileItem(fileName, uploadPrefix + fileName, byteArrayInputStream); + String upload = fs.upload(fileItem); + deleteUrl.add(upload); + String uploadUrl = UrlService.getAttachmentDownloadUrl(upload); + String uploadEncreptURL = AttachmentServiceHelper.getEncreptURL(uploadUrl); + byteArrayInputStream.close(); + resUrls.add(uploadEncreptURL); + } + } + } catch (Exception e) { + log.error("message" + e.getMessage()); + } + return resUrls; + } + private ArrayList PDFtoPic(String url, String type) throws Exception { ArrayList resUrls = new ArrayList<>(); try {