通过post请求获取发票下载链接实现打印发票-龚宇杰

This commit is contained in:
ggxl 2025-05-28 10:05:33 +08:00
parent c2387a2793
commit 47e773b52f
1 changed files with 176 additions and 11 deletions

View File

@ -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<String> handleUrls = handlePicAttUrl(url);
Long companyId = tripReimburse.getDynamicObject("costcompany").getLong("id");
HashMap<String, String> result = null;
try {
result = getInvoiceDownloadUrlByPost(serialNo, companyId);
if (!result.isEmpty()) {
ArrayList<String> 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<String, String> getInvoiceDownloadUrlByPost(String serialNo, Long companyId) throws IOException {
HashMap<String, String> 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("TripReimbursePrintPluginGetInvoiceDetailDataUrl参数未配置");
} 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<String, String> 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<String, Object> 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("TripReimbursePrintPluginGetInvoiceDetailDataHeader参数未配置");
}
}
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<String> InvoiceToPic(HashMap<String, String> result) {
ArrayList<String> 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<String> PDFtoPic(String url, String type) throws Exception {
ArrayList<String> resUrls = new ArrayList<>();
try {