diff --git a/fi/shkd-fi-fi/build/classes/java/main/shkd/fi/fi/common/AppflgConstant.class b/fi/shkd-fi-fi/build/classes/java/main/shkd/fi/fi/common/AppflgConstant.class index e83ee4f..2008dba 100644 Binary files a/fi/shkd-fi-fi/build/classes/java/main/shkd/fi/fi/common/AppflgConstant.class and b/fi/shkd-fi-fi/build/classes/java/main/shkd/fi/fi/common/AppflgConstant.class differ diff --git a/fi/shkd-fi-fi/src/main/java/shkd/fi/fi/common/orc/DetailList.java b/fi/shkd-fi-fi/src/main/java/shkd/fi/fi/common/orc/DetailList.java index e6710d4..c56e532 100644 --- a/fi/shkd-fi-fi/src/main/java/shkd/fi/fi/common/orc/DetailList.java +++ b/fi/shkd-fi-fi/src/main/java/shkd/fi/fi/common/orc/DetailList.java @@ -12,13 +12,37 @@ import java.util.Date; */ public class DetailList { + /** + * 单价?? + */ private String unitPrice; + /** + * 金额 + */ private String totalAmount; + /** + * 税率 + */ private String taxRate; + /** + * 单位 + */ private String unit; + /** + * 数量 + */ private String quantity; + /** + * 规格型号?? + */ private String specifictionModel; + /** + * 税额 + */ private String tax; + /** + * 货物或应税劳务、服务名称 + */ private String commodityName; public void setUnitPrice(String unitPrice) { this.unitPrice = unitPrice; diff --git a/fi/shkd-fi-fi/src/main/java/shkd/fi/fi/common/orc/ErrorResponse.java b/fi/shkd-fi-fi/src/main/java/shkd/fi/fi/common/orc/ErrorResponse.java new file mode 100644 index 0000000..4a7fdc6 --- /dev/null +++ b/fi/shkd-fi-fi/src/main/java/shkd/fi/fi/common/orc/ErrorResponse.java @@ -0,0 +1,52 @@ +package shkd.fi.fi.common.orc; + +public class ErrorResponse { + /** + * Copyright 2024 bejson.com + */ + /** + * Auto-generated: 2024-07-12 15:26:47 + * + * @author bejson.com (i@bejson.com) + * @website http://www.bejson.com/java2pojo/ + */ + + private long code; + private String subCode; + private String message; + private String subMessage; + + public void setCode(long code) { + this.code = code; + } + + public long getCode() { + return code; + } + + public void setSubCode(String subCode) { + this.subCode = subCode; + } + + public String getSubCode() { + return subCode; + } + + public void setMessage(String message) { + this.message = message; + } + + public String getMessage() { + return message; + } + + public void setSubMessage(String subMessage) { + this.subMessage = subMessage; + } + + public String getSubMessage() { + return subMessage; + } + +} + diff --git a/fi/shkd-fi-fi/src/main/java/shkd/fi/fi/common/orc/OCRRetureData.java b/fi/shkd-fi-fi/src/main/java/shkd/fi/fi/common/orc/OCRRetureData.java index e9899c2..31997a7 100644 --- a/fi/shkd-fi-fi/src/main/java/shkd/fi/fi/common/orc/OCRRetureData.java +++ b/fi/shkd-fi-fi/src/main/java/shkd/fi/fi/common/orc/OCRRetureData.java @@ -15,6 +15,13 @@ public class OCRRetureData { private String method; private String requestId; private List response; + private ErrorResponse errorResponse; + public void setErrorResponse(ErrorResponse errorResponse) { + this.errorResponse = errorResponse; + } + public ErrorResponse getErrorResponse() { + return errorResponse; + } public void setMethod(String method) { this.method = method; } diff --git a/fi/shkd-fi-fi/src/main/java/shkd/fi/fi/common/orc/Response.java b/fi/shkd-fi-fi/src/main/java/shkd/fi/fi/common/orc/Response.java index 9abd09b..d98a97e 100644 --- a/fi/shkd-fi-fi/src/main/java/shkd/fi/fi/common/orc/Response.java +++ b/fi/shkd-fi-fi/src/main/java/shkd/fi/fi/common/orc/Response.java @@ -1,7 +1,8 @@ /** - * Copyright 2024 bejson.com - */ + * Copyright 2024 bejson.com + */ package shkd.fi.fi.common.orc; + import java.util.Date; import java.util.List; @@ -13,252 +14,368 @@ import java.util.List; */ public class Response { + /** + * 城市?? + */ private String city; + /** + * 购买方银行账号 + */ private String buyerBankAccount; + /** + * 备注 + */ private String remark; + /** + * 标题?? + */ private String title; + /** + * 开票人?? + */ private String issuer; + /** + * 合计税额:飞机燃油附加费 + */ private double totalTax; + /** + * 发票联次 eg:第一联 + */ private String invoiceTemplateType; + /** + * 销售方名称 + */ private String saleName; + /** + * 销售方税号 + */ private String saleTaxNo; + /** + * 省份 + */ private String province; + /** + * 销售方地址电话?? + */ private String sellerAddrTel; + /** + * 发票类型 + */ private String invoiceType; + /** + * 发票号码 + */ private String invoiceNo; + /** + * 发票联次名称 eg:发票联 + */ private String invoiceTemplateName; + /** + * 发票位置 + */ private InvoicePosition invoicePosition; + /** + * 发票在影像中的旋转角度(顺时针) + */ private int orientation; + /** + * 机器编号 + */ private String machineCode; + /** + * 购买方地址电话 + */ private String buyerAddrTel; private String transitMark; private String reviewer; + /** + * 开票日期 + */ private Date invoiceDate; + /** + * 发票代码 + */ private String invoiceCode; + /** + * 购买方名称 + */ private String purchaserName; + /** + * 校验码 + */ private String checkCode; private double totalAmount; + /** + * 购买方税号 + */ private String purchaserTaxNo; + /** + * 销售方银行账号 + */ private String sellerBankAccount; + /** + * 发票密文 + */ private String invoiceCiphertext; + /** + * 明细 + */ private List detailList; + /** + * 是否有公司印章:0-无;1-有 + */ private int hasSeal; + /** + * 价税合计 + */ private double amountTax; + public void setCity(String city) { - this.city = city; - } - public String getCity() { - return city; - } + this.city = city; + } + + public String getCity() { + return city; + } public void setBuyerBankAccount(String buyerBankAccount) { - this.buyerBankAccount = buyerBankAccount; - } - public String getBuyerBankAccount() { - return buyerBankAccount; - } + this.buyerBankAccount = buyerBankAccount; + } + + public String getBuyerBankAccount() { + return buyerBankAccount; + } public void setRemark(String remark) { - this.remark = remark; - } - public String getRemark() { - return remark; - } + this.remark = remark; + } + + public String getRemark() { + return remark; + } public void setTitle(String title) { - this.title = title; - } - public String getTitle() { - return title; - } + this.title = title; + } + + public String getTitle() { + return title; + } public void setIssuer(String issuer) { - this.issuer = issuer; - } - public String getIssuer() { - return issuer; - } + this.issuer = issuer; + } + + public String getIssuer() { + return issuer; + } public void setTotalTax(double totalTax) { - this.totalTax = totalTax; - } - public double getTotalTax() { - return totalTax; - } + this.totalTax = totalTax; + } + + public double getTotalTax() { + return totalTax; + } public void setInvoiceTemplateType(String invoiceTemplateType) { - this.invoiceTemplateType = invoiceTemplateType; - } - public String getInvoiceTemplateType() { - return invoiceTemplateType; - } + this.invoiceTemplateType = invoiceTemplateType; + } + + public String getInvoiceTemplateType() { + return invoiceTemplateType; + } public void setSaleName(String saleName) { - this.saleName = saleName; - } - public String getSaleName() { - return saleName; - } + this.saleName = saleName; + } + + public String getSaleName() { + return saleName; + } public void setSaleTaxNo(String saleTaxNo) { - this.saleTaxNo = saleTaxNo; - } - public String getSaleTaxNo() { - return saleTaxNo; - } + this.saleTaxNo = saleTaxNo; + } + + public String getSaleTaxNo() { + return saleTaxNo; + } public void setProvince(String province) { - this.province = province; - } - public String getProvince() { - return province; - } + this.province = province; + } + + public String getProvince() { + return province; + } public void setSellerAddrTel(String sellerAddrTel) { - this.sellerAddrTel = sellerAddrTel; - } - public String getSellerAddrTel() { - return sellerAddrTel; - } + this.sellerAddrTel = sellerAddrTel; + } + + public String getSellerAddrTel() { + return sellerAddrTel; + } public void setInvoiceType(String invoiceType) { - this.invoiceType = invoiceType; - } - public String getInvoiceType() { - return invoiceType; - } + this.invoiceType = invoiceType; + } + + public String getInvoiceType() { + return invoiceType; + } public void setInvoiceNo(String invoiceNo) { - this.invoiceNo = invoiceNo; - } - public String getInvoiceNo() { - return invoiceNo; - } + this.invoiceNo = invoiceNo; + } + + public String getInvoiceNo() { + return invoiceNo; + } public void setInvoiceTemplateName(String invoiceTemplateName) { - this.invoiceTemplateName = invoiceTemplateName; - } - public String getInvoiceTemplateName() { - return invoiceTemplateName; - } + this.invoiceTemplateName = invoiceTemplateName; + } + + public String getInvoiceTemplateName() { + return invoiceTemplateName; + } public void setInvoicePosition(InvoicePosition invoicePosition) { - this.invoicePosition = invoicePosition; - } - public InvoicePosition getInvoicePosition() { - return invoicePosition; - } + this.invoicePosition = invoicePosition; + } + + public InvoicePosition getInvoicePosition() { + return invoicePosition; + } public void setOrientation(int orientation) { - this.orientation = orientation; - } - public int getOrientation() { - return orientation; - } + this.orientation = orientation; + } + + public int getOrientation() { + return orientation; + } public void setMachineCode(String machineCode) { - this.machineCode = machineCode; - } - public String getMachineCode() { - return machineCode; - } + this.machineCode = machineCode; + } + + public String getMachineCode() { + return machineCode; + } public void setBuyerAddrTel(String buyerAddrTel) { - this.buyerAddrTel = buyerAddrTel; - } - public String getBuyerAddrTel() { - return buyerAddrTel; - } + this.buyerAddrTel = buyerAddrTel; + } + + public String getBuyerAddrTel() { + return buyerAddrTel; + } public void setTransitMark(String transitMark) { - this.transitMark = transitMark; - } - public String getTransitMark() { - return transitMark; - } + this.transitMark = transitMark; + } + + public String getTransitMark() { + return transitMark; + } public void setReviewer(String reviewer) { - this.reviewer = reviewer; - } - public String getReviewer() { - return reviewer; - } + this.reviewer = reviewer; + } + + public String getReviewer() { + return reviewer; + } public void setInvoiceDate(Date invoiceDate) { - this.invoiceDate = invoiceDate; - } - public Date getInvoiceDate() { - return invoiceDate; - } + this.invoiceDate = invoiceDate; + } + + public Date getInvoiceDate() { + return invoiceDate; + } public void setInvoiceCode(String invoiceCode) { - this.invoiceCode = invoiceCode; - } - public String getInvoiceCode() { - return invoiceCode; - } + this.invoiceCode = invoiceCode; + } + + public String getInvoiceCode() { + return invoiceCode; + } public void setPurchaserName(String purchaserName) { - this.purchaserName = purchaserName; - } - public String getPurchaserName() { - return purchaserName; - } + this.purchaserName = purchaserName; + } + + public String getPurchaserName() { + return purchaserName; + } public void setCheckCode(String checkCode) { - this.checkCode = checkCode; - } - public String getCheckCode() { - return checkCode; - } + this.checkCode = checkCode; + } + + public String getCheckCode() { + return checkCode; + } public void setTotalAmount(double totalAmount) { - this.totalAmount = totalAmount; - } - public double getTotalAmount() { - return totalAmount; - } + this.totalAmount = totalAmount; + } + + public double getTotalAmount() { + return totalAmount; + } public void setPurchaserTaxNo(String purchaserTaxNo) { - this.purchaserTaxNo = purchaserTaxNo; - } - public String getPurchaserTaxNo() { - return purchaserTaxNo; - } + this.purchaserTaxNo = purchaserTaxNo; + } + + public String getPurchaserTaxNo() { + return purchaserTaxNo; + } public void setSellerBankAccount(String sellerBankAccount) { - this.sellerBankAccount = sellerBankAccount; - } - public String getSellerBankAccount() { - return sellerBankAccount; - } + this.sellerBankAccount = sellerBankAccount; + } + + public String getSellerBankAccount() { + return sellerBankAccount; + } public void setInvoiceCiphertext(String invoiceCiphertext) { - this.invoiceCiphertext = invoiceCiphertext; - } - public String getInvoiceCiphertext() { - return invoiceCiphertext; - } + this.invoiceCiphertext = invoiceCiphertext; + } + + public String getInvoiceCiphertext() { + return invoiceCiphertext; + } public void setDetailList(List detailList) { - this.detailList = detailList; - } - public List getDetailList() { - return detailList; - } + this.detailList = detailList; + } + + public List getDetailList() { + return detailList; + } public void setHasSeal(int hasSeal) { - this.hasSeal = hasSeal; - } - public int getHasSeal() { - return hasSeal; - } + this.hasSeal = hasSeal; + } + + public int getHasSeal() { + return hasSeal; + } public void setAmountTax(double amountTax) { - this.amountTax = amountTax; - } - public double getAmountTax() { - return amountTax; - } + this.amountTax = amountTax; + } + + public double getAmountTax() { + return amountTax; + } } \ No newline at end of file diff --git a/fi/shkd-fi-fi/src/main/java/shkd/fi/fi/formplugin/ApFinapbillFormPlugin.java b/fi/shkd-fi-fi/src/main/java/shkd/fi/fi/formplugin/ApFinapbillFormPlugin.java index 10a504d..f7188e2 100644 --- a/fi/shkd-fi-fi/src/main/java/shkd/fi/fi/formplugin/ApFinapbillFormPlugin.java +++ b/fi/shkd-fi-fi/src/main/java/shkd/fi/fi/formplugin/ApFinapbillFormPlugin.java @@ -1,18 +1,21 @@ package shkd.fi.fi.formplugin; import kd.bos.bill.AbstractBillPlugIn; +import kd.bos.dataentity.entity.DynamicObject; import kd.bos.form.CloseCallBack; import kd.bos.form.FormShowParameter; import kd.bos.form.ShowType; import kd.bos.form.control.events.ItemClickEvent; +import kd.bos.form.events.ClosedCallBackEvent; import java.util.EventObject; +import java.util.List; public class ApFinapbillFormPlugin extends AbstractBillPlugIn { @Override public void registerListener(EventObject e) { super.registerListener(e); - this.addItemClickListeners("tbmain","shkd_fpocr"); + this.addItemClickListeners("tbmain", "shkd_fpocr"); } @Override @@ -21,13 +24,24 @@ public class ApFinapbillFormPlugin extends AbstractBillPlugIn { String itemKey = evt.getItemKey(); if ("shkd_fpocr".equals(itemKey)) { FormShowParameter parameter = new FormShowParameter(); - parameter.setCustomParam("id",""); - parameter.setCustomParam("billno",this.getModel().getValue("billno")); -// parameter.setCustomParam("id",""); + Object id = this.getModel().getValue("id"); + if (id.equals(0L)) { + this.getView().showMessage("请先保存单据"); + return; + } + parameter.setCustomParam("id", id); + parameter.setCustomParam("billno", this.getModel().getValue("billno")); parameter.setFormId("shkd_uploadattachments"); - parameter.setCloseCallBack(new CloseCallBack(this,"shkd_fpocr")); + parameter.setCloseCallBack(new CloseCallBack(this, "shkd_fpocr")); parameter.getOpenStyle().setShowType(ShowType.Modal); this.getView().showForm(parameter); } } + + @Override + public void closedCallBack(ClosedCallBackEvent closedCallBackEvent) { + super.closedCallBack(closedCallBackEvent); + + } } + diff --git a/fi/shkd-fi-fi/src/main/java/shkd/fi/fi/formplugin/UploadAttachmentsFormPlugin.java b/fi/shkd-fi-fi/src/main/java/shkd/fi/fi/formplugin/UploadAttachmentsFormPlugin.java index 45374ce..c696a32 100644 --- a/fi/shkd-fi-fi/src/main/java/shkd/fi/fi/formplugin/UploadAttachmentsFormPlugin.java +++ b/fi/shkd-fi-fi/src/main/java/shkd/fi/fi/formplugin/UploadAttachmentsFormPlugin.java @@ -1,29 +1,62 @@ package shkd.fi.fi.formplugin; -import com.alibaba.fastjson.JSONArray; +import com.alibaba.druid.support.logging.Log; +import com.alibaba.druid.support.logging.LogFactory; import com.alibaba.fastjson.JSONObject; import kd.bos.cache.CacheFactory; import kd.bos.cache.DistributeSessionlessCache; +import kd.bos.cache.TempFileCache; import kd.bos.cache.tempfile.TempFileCacheDownloadable; import kd.bos.cache.tempfile.TempFileCacheDownloadable.Content; +import kd.bos.context.RequestContext; +import kd.bos.dataentity.OperateOption; +import kd.bos.dataentity.entity.DynamicObject; +import kd.bos.dataentity.entity.DynamicObjectCollection; +import kd.bos.db.tx.TX; +import kd.bos.db.tx.TXHandle; +import kd.bos.entity.operate.OperateOptionConst; +import kd.bos.fileservice.FileItem; +import kd.bos.fileservice.FileService; +import kd.bos.fileservice.FileServiceFactory; import kd.bos.form.FormShowParameter; +import kd.bos.form.IFormView; import kd.bos.form.control.AttachmentPanel; import kd.bos.form.control.Button; import kd.bos.form.control.events.ItemClickEvent; import kd.bos.form.plugin.AbstractFormPlugin; +import kd.bos.orm.query.QFilter; +import kd.bos.servicehelper.AttachmentServiceHelper; +import kd.bos.servicehelper.BusinessDataServiceHelper; +import kd.bos.servicehelper.operation.SaveServiceHelper; +import kd.bos.util.FileNameUtils; import kd.bos.util.HttpClientUtils; import kd.bos.util.StringUtils; import shkd.fi.fi.common.AppflgConstant; +import shkd.fi.fi.common.orc.DetailList; +import shkd.fi.fi.common.orc.ErrorResponse; import shkd.fi.fi.common.orc.OCRRetureData; import shkd.fi.fi.common.orc.Response; import java.io.*; +import java.math.BigDecimal; import java.net.URL; +import java.text.SimpleDateFormat; import java.util.*; public class UploadAttachmentsFormPlugin extends AbstractFormPlugin { DistributeSessionlessCache cache = CacheFactory.getCommonCacheFactory().getDistributeSessionlessCache(AppflgConstant.APIGW_COSCOSHIPPING_COM_TOKEN); + // + private static final Log log = LogFactory.getLog(UploadAttachmentsFormPlugin.class); + /** + * OCR发票识别接口url + */ + public static final String OCR_INVOICESCANNER_URL = "https://apigw.coscoshipping.com/tax/ocr/v1/invoiceScanner"; + /** + * 发票验证接口url + */ + public static final String COMPLIANCECOLLECTZY_URL = "https://apigw.coscoshipping.com/tax/input/v1/compliancecollectZY"; + @Override public void registerListener(EventObject e) { super.registerListener(e); @@ -40,32 +73,49 @@ public class UploadAttachmentsFormPlugin extends AbstractFormPlugin { public void click(EventObject evt) { super.click(evt); Button source = (Button) evt.getSource(); - AttachmentPanel shkd_attachmentpanelap = this.getView().getControl("shkd_attachmentpanelap"); - if (Objects.equals("btnok", source.getKey())) { -// this.getView().close(); + this.getView().close(); } + //获取上传附件信息 + AttachmentPanel shkd_attachmentpanelap = this.getView().getControl("shkd_attachmentpanelap"); List> attachmentData = shkd_attachmentpanelap.getAttachmentData(); if (attachmentData.isEmpty()) { this.getView().showMessage("请上传附件"); } - //token url + FormShowParameter formShowParameter = this.getView().getFormShowParameter(); + //财务应付单 id + Object id = formShowParameter.getCustomParam("id"); + //财务应付单号 + String billno = formShowParameter.getCustomParam("billno"); + //财务应付单 + DynamicObject ap_finapbill = BusinessDataServiceHelper.loadSingle(id, "ap_finapbill"); + + OperateOption option = OperateOption.create(); + option.setVariableValue(OperateOptionConst.ISHASRIGHT, "true"); + option.setVariableValue(OperateOptionConst.IGNOREWARN, "true"); + + //通过接口调用获取token String tokenUrl = "https://apigw.coscoshipping.com/token"; //消费者账户密码 String xfzId = "8kHGk2X2z9UqHzqcNI0XuUbPIlEa:vDusBSMDPM_ohW6lZlANGB9hlQoa"; //加密消费者账户密码 byte[] xfzEncode = Base64.getEncoder().encode(xfzId.getBytes()); String xfzEncodeStr = new String(xfzEncode); - String token = ""; + String token; + try { + //1.缓存有token 则取缓存里的token if (cache.contains(AppflgConstant.APIGW_COSCOSHIPPING_COM_TOKEN)) { token = cache.get(AppflgConstant.APIGW_COSCOSHIPPING_COM_TOKEN); } else { - //获取token - Map tokenHeader = new HashMap(); + //2.缓存无token,通过接口调用获取token + //1.1.请求头 + Map tokenHeader = new HashMap<>(); tokenHeader.put("Authorization", "Basic " + xfzEncodeStr); - Map tokenBody = new HashMap(); + //1.2.请求体 + Map tokenBody = new HashMap<>(); tokenBody.put("grant_type", "client_credentials"); + //1.3.通过接口调用获取token String postjson = HttpClientUtils.post(tokenUrl, tokenHeader, tokenBody); if (StringUtils.isEmpty(postjson)) { this.getView().showMessage("获取token失败"); @@ -76,79 +126,244 @@ public class UploadAttachmentsFormPlugin extends AbstractFormPlugin { cache.put(AppflgConstant.APIGW_COSCOSHIPPING_COM_TOKEN, token, expires_in);//将自定义参数加入缓存 } } catch (IOException e) { + log.info(e.getMessage()); throw new RuntimeException(e); } - FormShowParameter showParameter = this.getView().getFormShowParameter(); - String billno = showParameter.getCustomParam("billno"); - String ocrScannerUrl = "https://apigw.coscoshipping.com/tax/ocr/v1/invoiceScanner"; + + List returnDataList = new ArrayList<>(); + //循环遍历附件信息 for (Map attachmentDatum : attachmentData) { - Map ocrScannerHeader = new HashMap(); + //1.1.OCR发票识别接口请求头 + Map ocrScannerHeader = new HashMap<>(); ocrScannerHeader.put("Authorization", "Bearer " + token); ocrScannerHeader.put("Content-Type", "application/json"); + //1.2.OCR发票识别接口请求体 JSONObject ocrScannerBody = new JSONObject(); + //临时附件url String attachmentUrl = (String) attachmentDatum.get("url"); - byte[] attachmentUrlEncode = Base64.getEncoder().encode(loadTextFileString(attachmentUrl)); - String attachmentUrlEncodeStr = new String(attachmentUrlEncode); + //文件服务器 附件url + String url = uploadTempfile(attachmentUrl, (String) attachmentDatum.get("name")); + attachmentDatum.put("url", url); + attachmentDatum.put("modifytime", new Date().getTime()); + +// byte[] attachmentUrlEncode = Base64.getEncoder().encode(loadTextFileString(attachmentUrl)); +// String attachmentUrlEncodeStr = new String(attachmentUrlEncode); + + //附件转base64 + TempFileCache tempFileCache = CacheFactory.getCommonCacheFactory().getTempFileCache(); + InputStream inputStream = tempFileCache.getInputStream(attachmentUrl); + byte[] encode; + try { + byte[] bytes = inputStreamToByteArraySafely(inputStream); + encode = Base64.getEncoder().encode(bytes); + } catch (IOException e) { + log.info(e.getMessage()); + throw new RuntimeException(e); + } + + String attachmentUrlEncodeStr = new String(encode); // base2 = "JVBERi0xLjUKJeLjz9MKMyAwIG9iago8PC9UeXBlL1NpZy9Qcm9wX0J1aWxkPDwvQXBwPDwvTmFtZShJU0MpPj4+Pi9SZWFzb24o/v8AUABEAEZlcFtXe35UXHIpL00oRDoyMDI0MDcwMjE3MjE1MSswOCcwMCcpL0ZpbHRlci9BZG9iZS5QUEtMaXRlL1N1YkZpbHRlci9hZGJlLng1MDkucnNhX3NoYTEvQ2VydFsxIDAgUl0vQnl0ZVJhbmdlIFswIDI4MyA4MDUgMzY3ODEgXSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgL0NvbnRlbnRzIDwwNDgyMDEwMDA2MWUwZDVhOWFlMDY4Y2QzODI2MjQ0NzJlMDZhNjVlYTNmYjA4MGRkYTAxNmNhZGZjZjY1ZGY1OTc0NWRjYjA5MDI0MWVlYTMyZTgzZTAwNGNlMzA4M2JiOTNlZWE2Y2U4ZDNlYjMxOTM4NDJjNDgwNjhjYWYwYjk4ZThiYzAwNzhlYWQ0MDllYTkwM2I2YjBmOWU0ODgyMTZhMTcxNjViNTcxMTViMmFjNmNkNmVjM2RlMWNhOTEwMjkzMjUzOWY2NjVhZjEzZjgyMDJhZWIwOTI3MTliYTYyNGNlNjhhOGY1ODg2N2VlMDUwOWNhODliMzdhM2VlOWMxYzZhMTc1OWE4YzA2MDQwNmNlZjcwN2JlZDM5ZmJkY2EyYjFmZTY3YzQwMmFhNTJiOGJkYTE2YTExNmY2N2UyYjY4NWFhNWU3ZjNiYjVmM2E5ZDljZjIxZDU3N2MxODJkOTM5NDQ3NWFjMjRiNDBjYTkwNWRmOGNmOTJlOWQ0OTBmYzZjMzQzYzAzZjcxN2I0MDAyYzM0MGNlOGEyODcyOTYyNDY1NTMxYjAwODhkZWExOTFiZjdmM2EyNGIxYmQ0YTk1OWI3MGI4YmExMjdkZDI4NzlkOWNhOTkxNDM4ZDdkY2QxYTEyMjI0NDRiZTY1ZDM3ODY4MDIzYjFkNTI2YWUwNTA5Pj4+CmVuZG9iago3IDAgb2JqCjw8L1R5cGUvWE9iamVjdC9TdWJ0eXBlL0Zvcm0vUmVzb3VyY2VzPDwvWE9iamVjdDw8L0ZSTSA2IDAgUj4+Pj4vQkJveFswIDAgMTEzLjM5IDg0Ljc2XS9Gb3JtVHlwZSAxL01hdHJpeCBbMSAwIDAgMSAwIDBdL0xlbmd0aCAyOS9GaWx0ZXIvRmxhdGVEZWNvZGU+PnN0cmVhbQp4nCtUMFQwAEIImZyroO8W5Kvgkq8QyAUATYgFxgplbmRzdHJlYW0KZW5kb2JqCjQgMCBvYmoKPDwvVHlwZS9YT2JqZWN0L1N1YnR5cGUvRm9ybS9SZXNvdXJjZXM8PD4+L0JCb3hbMCAwIDEwMCAxMDBdL0Zvcm1UeXBlIDEvTWF0cml4IFsxIDAgMCAxIDAgMF0vTGVuZ3RoIDE4L0ZpbHRlci9GbGF0ZURlY29kZT4+c3RyZWFtCnicU1VwCXbKSczL5gIADlcCzwplbmRzdHJlYW0KZW5kb2JqCjUgMCBvYmoKPDwvVHlwZS9YT2JqZWN0L1N1YnR5cGUvRm9ybS9SZXNvdXJjZXM8PD4+L0JCb3hbMCAwIDExMy4zOSA4NC43Nl0vRm9ybVR5cGUgMS9NYXRyaXggWzEgMCAwIDEgMCAwXS9MZW5ndGggOC9GaWx0ZXIvRmxhdGVEZWNvZGU+PnN0cmVhbQp4nAMAAAAAAQplbmRzdHJlYW0KZW5kb2JqCjYgMCBvYmoKPDwvVHlwZS9YT2JqZWN0L1N1YnR5cGUvRm9ybS9SZXNvdXJjZXM8PC9YT2JqZWN0PDwvbjAgNCAwIFIvbjIgNSAwIFI+Pj4+L0JCb3hbMCAwIDExMy4zOSA4NC43Nl0vRm9ybVR5cGUgMS9NYXRyaXggWzEgMCAwIDEgMCAwXS9MZW5ndGggMzQvRmlsdGVyL0ZsYXRlRGVjb2RlPj5zdHJlYW0KeJwrVDBUMABCCJmcq6CfZ6Dgkq8QyFWIKWMEkQEAHhEK/wplbmRzdHJlYW0KZW5kb2JqCjEyIDAgb2JqCjw8L0NyZWF0aW9uRGF0ZShEOjIwMjQwNzAyMTcyMTUxKzA4JzAwJykvTW9kRGF0ZShEOjIwMjQwNzAyMTcyMTUxKzA4JzAwJyk+PgplbmRvYmoKMjAgMCBvYmoKPDwvVHlwZS9YT2JqZWN0L1N1YnR5cGUvSW1hZ2UvV2lkdGggMTg1L0hlaWdodCAxODUvTGVuZ3RoIDUwMC9Db2xvclNwYWNlL0RldmljZUdyYXkvRGVjb2RlUGFybXM8PC9CaXRzUGVy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"; if (attachmentUrlEncodeStr.contains(",")) { attachmentUrlEncodeStr = attachmentUrlEncodeStr.substring(0, attachmentUrlEncodeStr.indexOf(",") + 1); } + //1.3.组装OCR发票识别接口请求体 ocrScannerBody.put("serialNo", billno + System.currentTimeMillis()); ocrScannerBody.put("taxNo", "91310115607321695H");//先传固定值后续修改 ocrScannerBody.put("operatorAccount", ""); ocrScannerBody.put("systemName", "SH-INVSYS"); ocrScannerBody.put("serviceMode", "0"); ocrScannerBody.put("serviceMold", "1"); - ocrScannerBody.put("base64Str", attachmentUrlEncodeStr); + ocrScannerBody.put("base64Str", attachmentUrlEncodeStr + 123); try { - String postjson = HttpClientUtils.postjson(ocrScannerUrl, ocrScannerHeader, ocrScannerBody.toJSONString()); + //1.4.调用OCR接口 + String postjson = HttpClientUtils.postjson(OCR_INVOICESCANNER_URL, ocrScannerHeader, ocrScannerBody.toJSONString()); + if (StringUtils.isEmpty(postjson)) { + this.getView().showMessage("OCR接口识别失败"); + } OCRRetureData ocrRetureData = JSONObject.parseObject(postjson, OCRRetureData.class); - JSONObject jsonObject = JSONObject.parseObject(postjson); - System.out.println(postjson); -// JSONArray parseObject = (JSONArray) jsonObject.get("response"); - OCRRetureData parseObject = JSONObject.parseObject(postjson, OCRRetureData.class); + ErrorResponse errorResponse = ocrRetureData.getErrorResponse(); + if (errorResponse != null) { + String message = errorResponse.getMessage() == null ? "" : errorResponse.getMessage(); + String subMessage = errorResponse.getSubMessage() == null ? "" : errorResponse.getSubMessage(); + this.getView().showMessage(message + subMessage); + return; + } + List responseList = ocrRetureData.getResponse(); + Response response = responseList.get(0); + List detailList = response.getDetailList(); + BigDecimal shkd_tax = BigDecimal.ZERO;//税额 + BigDecimal shkd_amount = BigDecimal.ZERO;//金额 + for (DetailList list : detailList) { + shkd_tax = shkd_tax.add(new BigDecimal(list.getTax())); + shkd_amount = shkd_amount.add(new BigDecimal(list.getTotalAmount())); + } + DetailList detailList1 = detailList.get(0); - String compliancecollectUrl = "https://apigw.coscoshipping.com/tax/input/v1/compliancecollectZY"; - Map compliancecollectHeader = new HashMap(); + //2.1.发票合规查验接口请求头 + Map compliancecollectHeader = new HashMap<>(); compliancecollectHeader.put("Content-Type", "application/json"); compliancecollectHeader.put("Authorization", "Bearer " + token); + //2.2.发票合规查验接口请求体 JSONObject compliancecollectBody = new JSONObject(); - compliancecollectBody.put("TaxNo", "91310115607321695H");//purchaserTaxNo -// List response = ocrRetureData.getResponse(); -// compliancecollectBody.put("InvoiceCode", parseObject.getInvoiceCode()); -// compliancecollectBody.put("InvoiceNumber", parseObject.getInvoiceNo()); -// String checkCode = parseObject.getCheckCode(); -// if (checkCode.length() > 6) { -// checkCode = checkCode.substring(checkCode.length() - 6); -// } -// compliancecollectBody.put("CheckCode_6", checkCode);//checkCode后6位数 -// compliancecollectBody.put("TotalAmount", ""); -// compliancecollectBody.put("BillingDate", parseObject.getInvoiceDate().toString());//invoiceDate + compliancecollectBody.put("TaxNo", "91310115607321695H");// purchaserTaxNo + compliancecollectBody.put("InvoiceCode", response.getInvoiceCode()); + compliancecollectBody.put("InvoiceNumber", response.getInvoiceNo()); + String checkCode = response.getCheckCode(); + if (checkCode.length() > 6) { + checkCode = checkCode.substring(checkCode.length() - 6); + } + compliancecollectBody.put("CheckCode_6", checkCode);// checkCode后6位数 + compliancecollectBody.put("TotalAmount", ""); + Date invoiceDate = response.getInvoiceDate(); + SimpleDateFormat simpleDateFormat = new SimpleDateFormat("yyyy-MM-dd"); + String format = simpleDateFormat.format(invoiceDate); + compliancecollectBody.put("BillingDate", format);//invoiceDate compliancecollectBody.put("SystemName", "SH-INVSYS"); compliancecollectBody.put("OperatorAccount", "CBS"); compliancecollectBody.put("OperatorName", "1"); - String compliancecollectPostjson = HttpClientUtils.postjson(compliancecollectUrl, compliancecollectHeader, compliancecollectBody.toJSONString()); - System.out.println(compliancecollectPostjson); + //2.3.调用发票合规查验接口 + String compliancecollectPostjson = HttpClientUtils.postjson(COMPLIANCECOLLECTZY_URL, compliancecollectHeader, compliancecollectBody.toJSONString()); + // + if (compliancecollectPostjson == null || compliancecollectPostjson.isEmpty()) { + // 使用自定义异常类型和更详细的异常信息 + throw new RuntimeException("发票合规查验接口调用失败"); + } + + JSONObject jsonObject = JSONObject.parseObject(compliancecollectPostjson); + String message = jsonObject.getString("message"); + Boolean success = jsonObject.getBoolean("success"); + //2.4.发票合规查验接口调用失败 + if (!success) { + this.getView().showMessage(message); + } + //2.5.发票合规查验接口调用成功 生成发票识别单据 + DynamicObject shkd_invoicereceipt = BusinessDataServiceHelper.newDynamicObject("shkd_invoicereceipt"); + shkd_invoicereceipt.set("billno", String.valueOf(System.currentTimeMillis())); + String invoiceType = response.getInvoiceType(); + String invoiceTypeNumber = null; + + if ("103".equals(invoiceType)) { + invoiceType = "SE"; + invoiceTypeNumber = "2"; + shkd_invoicereceipt.set("shkd_invoicetype", "SE");//103增值税电子专用发票 + } else if ("102".equals(invoiceType)) { + invoiceType = "ELE"; + invoiceTypeNumber = "1"; + shkd_invoicereceipt.set("shkd_invoicetype", "ELE");//102增值税电子普通发票 + } + //查询系统发票类型 + DynamicObject bd_invoicetype = BusinessDataServiceHelper.loadSingle("bd_invoicetype", new QFilter[]{new QFilter("number", "=", invoiceTypeNumber)}); + shkd_invoicereceipt.set("shkd_invoicetypef7", bd_invoicetype);//发票类型f7 + shkd_invoicereceipt.set("shkd_invoicetype", invoiceType);//发票类型下拉 + shkd_invoicereceipt.set("shkd_invoicecode", response.getInvoiceCode());//发票代码 + shkd_invoicereceipt.set("shkd_invoiceno", response.getInvoiceNo());//发票号码 + shkd_invoicereceipt.set("shkd_invoicedate", response.getInvoiceDate());//开票日期 + shkd_invoicereceipt.set("shkd_currency", null);//币别??? + shkd_invoicereceipt.set("shkd_pricetaxtotal", response.getAmountTax());//价税合计 + shkd_invoicereceipt.set("shkd_taxrate1", detailList1.getTaxRate());//税率(%) + shkd_invoicereceipt.set("shkd_tax", shkd_tax);//税额 + shkd_invoicereceipt.set("shkd_amount", shkd_amount);//金额 + shkd_invoicereceipt.set("shkd_asstactname", response.getSaleName());//开票公司 销售方 + shkd_invoicereceipt.set("shkd_buyername", response.getPurchaserName());//收票公司 购买方 + shkd_invoicereceipt.set("shkd_istaxdeduction", null);//可抵扣 是否??? + shkd_invoicereceipt.set("shkd_remark", response.getRemark());//备注 + shkd_invoicereceipt.set("shkd_canuseamt", null);//可占用金额?? 隐藏字段 + shkd_invoicereceipt.set("shkd_usedamt", null);//本次占用金额?? + shkd_invoicereceipt.set("shkd_srctype", "1");//行来源 下拉项 ?? + shkd_invoicereceipt.set("shkd_issupplement", null);//后补发票 是否??隐藏字段 + shkd_invoicereceipt.set("shkd_billno", null);//收票单?? + shkd_invoicereceipt.set("shkd_invoicestatus", null);//发票状态 下拉?? + shkd_invoicereceipt.set("shkd_invid", null);//发票id 隐藏字段 + shkd_invoicereceipt.set("shkd_serialno", null);//发票流水号 隐藏字段 + shkd_invoicereceipt.set("shkd_refbill", ap_finapbill);//财务应付单 + shkd_invoicereceipt.set("billstatus", "A"); + shkd_invoicereceipt.set("creator",RequestContext.get().getCurrUserId()); + +// option.setVariableValue(OperateOptionConst.ORM_SAVEOP_REMOVECACHE, "true"); + //保存发票识别单据并上传发票附件到发票识别单据 + SaveServiceHelper.save(new DynamicObject[]{shkd_invoicereceipt}, option); + List> attachmentDataList = new ArrayList<>(); + attachmentDataList.add(attachmentDatum); + AttachmentServiceHelper.upload("shkd_invoicereceipt", shkd_invoicereceipt.getPkValue(), + "attachmentpanel", attachmentDataList); + + returnDataList.add(shkd_invoicereceipt); } catch (IOException e) { + log.info(e.getMessage()); throw new RuntimeException(e); } } + + //回写发票信息到财务应付单发票明细 + if (!returnDataList.isEmpty()) { + + DynamicObjectCollection inventry = ap_finapbill.getDynamicObjectCollection("inventry"); + inventry.clear(); + + IFormView parentView = this.getView().getParentView(); + for (DynamicObject dynamicObject : returnDataList) { + DynamicObject addNew = inventry.addNew(); + addNew.set("i_invoicetypef7", dynamicObject.get("shkd_invoicetypef7")); + addNew.set("i_invoicetype", dynamicObject.get("shkd_invoicetype")); + addNew.set("i_invoicecode", dynamicObject.get("shkd_invoicecode")); + addNew.set("i_invoiceno", dynamicObject.get("shkd_invoiceno")); + addNew.set("i_invoicedate", dynamicObject.get("shkd_invoicedate")); + addNew.set("i_currency", dynamicObject.get("shkd_currency")); + addNew.set("i_pricetaxtotal", dynamicObject.get("shkd_pricetaxtotal")); + String shkd_taxrate1 = dynamicObject.getString("shkd_taxrate1"); + if (shkd_taxrate1.contains("%")) { + shkd_taxrate1 = shkd_taxrate1.substring(0, shkd_taxrate1.indexOf("%")); + } + addNew.set("i_taxrate", shkd_taxrate1); + addNew.set("i_tax", dynamicObject.get("shkd_tax")); + addNew.set("i_amount", dynamicObject.get("shkd_amount")); + addNew.set("i_asstactname", dynamicObject.get("shkd_asstactname")); + addNew.set("i_buyername", dynamicObject.get("shkd_buyername")); + addNew.set("i_istaxdeduction", dynamicObject.get("shkd_istaxdeduction")); + addNew.set("i_remark", dynamicObject.get("shkd_remark")); + addNew.set("i_canuseamt", dynamicObject.get("shkd_canuseamt"));//可占用金额 隐藏 + addNew.set("i_usedamt", dynamicObject.get("shkd_usedamt")); + addNew.set("i_srctype", "1");//行来源 1-发票采集 + addNew.set("i_issupplement", dynamicObject.get("shkd_issupplement"));//后补发票 下拉 隐藏 + addNew.set("i_billno", dynamicObject.get("shkd_billno"));// + addNew.set("i_invoicestatus", dynamicObject.get("shkd_invoicestatus"));// + addNew.set("invid", dynamicObject.get("shkd_invid"));//发票id 隐藏 + addNew.set("i_serialno", dynamicObject.get("shkd_serialno"));//发票流水号 隐藏 + addNew.set("shkd_invoicereceipt", dynamicObject);// + } + + try (TXHandle h = TX.requiresNew()) { + try { + //current transaction is aborted, commands ignored until end of transaction block + //保存财务应付单 + SaveServiceHelper.save(new DynamicObject[]{ap_finapbill}, option); + } catch (Throwable e) { + h.markRollback(); + log.info(e.getMessage()); + throw e; + } + } + //刷新财务应付单 + parentView.invokeOperation("refresh"); + this.getView().sendFormAction(parentView); + } + } /** - * 演示读取上传的文件内容,转为文本输出 + * 演示读取上传的文件内容,转为byte * * @param fileUrl 已上传到临时目录的文件URL - * @return + * @return byte[] */ private byte[] loadTextFileString(String fileUrl) { TempFileCacheDownloadable downLoad = (TempFileCacheDownloadable) CacheFactory.getCommonCacheFactory().getTempFileCache(); - byte[] bt = null; + byte[] bt; InputStream inStream = null; try { String[] queryParams = new URL(fileUrl).getQuery().split("&"); @@ -161,10 +376,11 @@ public class UploadAttachmentsFormPlugin extends AbstractFormPlugin { inStream = content.getInputStream(); bt = inputStreamToByteArraySafely(inStream); - sss(inStream); +// createFile(inStream); } catch (Exception e) { + throw new RuntimeException(e); } finally { try { if (inStream != null) { @@ -201,65 +417,26 @@ public class UploadAttachmentsFormPlugin extends AbstractFormPlugin { /** - * 从输入流中读取数据并写入到指定目录下的PDF文件中。 + * 上传临时文件到服务器中 * - * @param inStream 输入流,提供需要写入文件的数据。 - * @throws RuntimeException 如果创建输出目录或文件失败,或者在读写过程中发生IO异常,则抛出运行时异常。 + * @param url + * @param name + * @return */ - public void sss(InputStream inStream) { - // 指定输出文件的父目录 - File outputParentFile = new File("D:/AAA"); - // 新文件(输出文件) - File outputFile = null; - - // 确保输出目录存在,如果不存在则尝试创建,失败则抛出运行时异常 - // 输出路径不存在,且创建路径失败 - if (!outputParentFile.exists() && !outputParentFile.mkdirs()) { - String errorMsg = new StringBuffer("创建文件输出路径失败:") - .append(outputParentFile.getAbsolutePath()) - .toString(); - throw new RuntimeException(errorMsg); - } - // 创建输出文件对象 - // 创建输出文件对象 - outputFile = new File(outputParentFile, "11.pdf"); - // 如果输出文件不存在,则尝试创建,失败则抛出运行时异常 - if (!outputFile.exists()) { - try { - outputFile.createNewFile(); - } catch (IOException e) { - throw new RuntimeException("创建输出文件失败"); - } - } - try ( - // 创建缓冲输入流,提高读取效率 - // 创建字节输入流 - // 创建字节输入缓冲流 - BufferedInputStream bufferedInputStream = new BufferedInputStream(inStream); - // 创建文件输出流,用于写入数据到文件 - // 创建字节输出流 - FileOutputStream fileOutputStream = new FileOutputStream(outputFile); - // 创建缓冲输出流,提高写入效率 - // 创建字节输出缓冲流 - BufferedOutputStream bufferedOutputStream = new BufferedOutputStream(fileOutputStream); - - ) { - // 定义一个字节数组,用于一次读取大量数据 - // 一次读取1024个字节,可以自己决定大小 - byte[] bytes = new byte[1024 * 1024 * 8]; - // 循环读取输入流中的数据,直到读取结束 - while (bufferedInputStream.read(bytes) != -1) { - // 将读取到的数据写入到输出流中 - // 写入 - bufferedOutputStream.write(bytes); - } - // 输出提示信息,表示写入成功 - System.out.println("写入成功!"); - } catch (FileNotFoundException e) { - throw new RuntimeException(e); - } catch (IOException e) { - throw new RuntimeException(e); - } + private String uploadTempfile(String url, String name) { + TempFileCache cache = CacheFactory.getCommonCacheFactory().getTempFileCache(); + InputStream in = cache.getInputStream(url); + FileService service = FileServiceFactory.getAttachmentFileService(); + RequestContext requestContext = RequestContext.get(); + String uuid = UUID.randomUUID().toString().replace("-", ""); + // 生成文件路径-上传附件时远程服务器需要存储文件的位置 + String pathParam = FileNameUtils.getAttachmentFileName(requestContext.getTenantId(), + requestContext.getAccountId(), uuid, name); + FileItem fileItem = new FileItem(name, pathParam, in); + // cache.remove(url); + // 上传附件到文件服务器 + return service.upload(fileItem); } + }