From dd302c682d63c1b614d8e9ec3e53777176cc62a2 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E6=9D=8E=E8=B4=B5=E5=BC=BA?= Date: Thu, 5 Jun 2025 18:49:39 +0800 Subject: [PATCH] =?UTF-8?q?BIP=E4=BC=A0=E7=A8=8E=E7=A0=81=E3=80=81?= =?UTF-8?q?=E7=A8=8E=E7=8E=87=E3=80=81=E7=A8=8E=E9=87=91=E9=80=BB=E8=BE=91?= =?UTF-8?q?=E6=94=B9=E5=8A=A8?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../recon/opplugin/YongyouBIPOperation.java | 292 +++++++++++++++--- 1 file changed, 249 insertions(+), 43 deletions(-) diff --git a/main/java/shkd/repc/recon/opplugin/YongyouBIPOperation.java b/main/java/shkd/repc/recon/opplugin/YongyouBIPOperation.java index b41b8b2..dd9e9c6 100644 --- a/main/java/shkd/repc/recon/opplugin/YongyouBIPOperation.java +++ b/main/java/shkd/repc/recon/opplugin/YongyouBIPOperation.java @@ -16,6 +16,7 @@ import kd.bos.entity.plugin.args.*; import kd.bos.entity.validate.ErrorLevel; import kd.bos.logging.Log; import kd.bos.logging.LogFactory; +import kd.bos.orm.query.QCP; import kd.bos.orm.query.QFilter; import kd.bos.servicehelper.BusinessDataServiceHelper; import kd.sdk.plugin.Plugin; @@ -412,53 +413,55 @@ public class YongyouBIPOperation extends AbstractOperationServicePlugIn implemen items.put("globaldebit","-"+bcsqje.toString()); } - items.put("taxcodeid","");//税码编码 应该不用传;联调再看; + //items.put("taxcodeid","");//税码编码 应该不用传;联调再看; if(isnotext){ //费用登记单的处理方式 - BigDecimal rate = payrequestinfo.getBigDecimal("taxrate");//税率 - if(rate == null){ - items.put("taxrate","0");//税率 - items.put("local_tax_de","0");//税额 - }else{ - items.put("taxrate",rate.toString());//税率 - items.put("local_tax_de",payrequestinfo.getBigDecimal("tax").toString());//税额 - } - items.put("notax_de",payrequestinfo.getBigDecimal("notaxamt").toString());//贷方无税金额,除税金额 - items.put("local_notax_de",payrequestinfo.getBigDecimal("notaxamt").toString());//组织本币无税金额 - if("unaudit".equals(eventName)){ - //如果此时是反审核,则需要将金额置为负数 - items.put("local_tax_de","-"+items.getString("local_tax_de")); - items.put("notax_de","-"+items.getString("notax_de")); - items.put("local_notax_de","-"+items.getString("local_notax_de")); - } + this.setExpenseRegTaxFields(payrequestinfo,items,eventName); +// BigDecimal rate = payrequestinfo.getBigDecimal("taxrate");//税率 +// if(rate == null){ +// items.put("taxrate","0");//税率 +// items.put("local_tax_de","0");//税额 +// }else{ +// items.put("taxrate",rate.toString());//税率 +// items.put("local_tax_de",payrequestinfo.getBigDecimal("tax").toString());//税额 +// } +// items.put("notax_de",payrequestinfo.getBigDecimal("notaxamt").toString());//贷方无税金额,除税金额 +// items.put("local_notax_de",payrequestinfo.getBigDecimal("notaxamt").toString());//组织本币无税金额 +// if("unaudit".equals(eventName)){ +// //如果此时是反审核,则需要将金额置为负数 +// items.put("local_tax_de","-"+items.getString("local_tax_de")); +// items.put("notax_de","-"+items.getString("notax_de")); +// items.put("local_notax_de","-"+items.getString("local_notax_de")); +// } }else{ //付款申请单的处理方式 - BigDecimal invoicetax = payrequestinfo.getBigDecimal("invoicetax");//发票的税额 - if(invoicetax == null || invoicetax.compareTo(BigDecimal.ZERO) == 0){ - items.put("taxrate","0");//税率 - items.put("local_tax_de","0");//税额 - items.put("notax_de",bcsqje.toString());//贷方无税金额,除税金额 - items.put("local_notax_de",bcsqje.toString());//组织本币无税金额 - if("unaudit".equals(eventName)){ - //如果此时是反审核,则需要将金额置为负数 - items.put("notax_de","-"+bcsqje.toString()); - items.put("local_notax_de","-"+bcsqje.toString());//组织本币无税金额 - } - }else{ - //不含税金额 - BigDecimal notaxv = bcsqje.subtract(invoicetax); - //除法时,指定精度和舍入模式 - items.put("taxrate",invoicetax.divide(notaxv,10,RoundingMode.HALF_UP).multiply(BigDecimal.valueOf(100)).toString());//税率=税额/不含税 * 100 - items.put("local_tax_de",invoicetax.toString());//税额 - items.put("notax_de",notaxv.toString());//贷方无税金额,除税金额 - items.put("local_notax_de",notaxv.toString());//组织本币无税金额 - if("unaudit".equals(eventName)){ - //如果此时是反审核,则需要将金额置为负数 - items.put("local_tax_de","-"+items.getString("local_tax_de")); - items.put("notax_de","-"+items.getString("notax_de")); - items.put("local_notax_de","-"+items.getString("local_notax_de")); - } - } + this.setPayApplyTaxFields(payrequestinfo,items,eventName,bcsqje); +// BigDecimal invoicetax = payrequestinfo.getBigDecimal("invoicetax");//发票的税额 +// if(invoicetax == null || invoicetax.compareTo(BigDecimal.ZERO) == 0){ +// items.put("taxrate","0");//税率 +// items.put("local_tax_de","0");//税额 +// items.put("notax_de",bcsqje.toString());//贷方无税金额,除税金额 +// items.put("local_notax_de",bcsqje.toString());//组织本币无税金额 +// if("unaudit".equals(eventName)){ +// //如果此时是反审核,则需要将金额置为负数 +// items.put("notax_de","-"+bcsqje.toString()); +// items.put("local_notax_de","-"+bcsqje.toString());//组织本币无税金额 +// } +// }else{ +// //不含税金额 +// BigDecimal notaxv = bcsqje.subtract(invoicetax); +// //除法时,指定精度和舍入模式 +// items.put("taxrate",invoicetax.divide(notaxv,10,RoundingMode.HALF_UP).multiply(BigDecimal.valueOf(100)).toString());//税率=税额/不含税 * 100 +// items.put("local_tax_de",invoicetax.toString());//税额 +// items.put("notax_de",notaxv.toString());//贷方无税金额,除税金额 +// items.put("local_notax_de",notaxv.toString());//组织本币无税金额 +// if("unaudit".equals(eventName)){ +// //如果此时是反审核,则需要将金额置为负数 +// items.put("local_tax_de","-"+items.getString("local_tax_de")); +// items.put("notax_de","-"+items.getString("notax_de")); +// items.put("local_notax_de","-"+items.getString("local_notax_de")); +// } +// } } items.put("pu_org",companyDept[0]);//业务组织编码 同表头公司编码 @@ -632,4 +635,207 @@ public class YongyouBIPOperation extends AbstractOperationServicePlugIn implemen return builder.build(); } + + /** + * 设置费用登记发票字段传BIP + * @param payRequestInfo 费用登记||费用申请 数据 + * @param items json + */ + private void setExpenseRegTaxFields(DynamicObject payRequestInfo,JSONObject items,String eventName){ + //发票分录 + DynamicObjectCollection invoiceEntry = payRequestInfo.getDynamicObjectCollection("invoiceentry"); + //无发票 + if (invoiceEntry==null || invoiceEntry.size()==0){ + items.put("taxrate","0");//税率 + items.put("local_tax_de","0");//税额 + items.put("taxcodeid","CN07");//税码 + } else { + // 税额 + BigDecimal taxAmount = BigDecimal.ZERO; + // 税率相关变量 + BigDecimal commonTaxRate = null; + Long commonTaxRateId = null; + boolean hasDifferentTaxRates = false; + + // 遍历发票 + for (DynamicObject invoiceObj : invoiceEntry) { + DynamicObject invoiceBillF7 = invoiceObj.getDynamicObject("inventry_invoicebill"); + if (invoiceBillF7!=null){ + Object pkValue = invoiceBillF7.getPkValue(); + DynamicObject invoiceBill = BusinessDataServiceHelper.loadSingle(pkValue, "recon_invoicebill"); + if (invoiceBill != null) { + // 判断【发票登记-发票类型-名称】 + DynamicObject invoice = invoiceBill.getDynamicObject("invoice"); + if (invoice != null) { + String invoiceName = invoice.getString("name"); + if (invoiceName != null && invoiceName.contains("专用")) { + // 发票登记-发票明细 + DynamicObjectCollection invoiceDetails = invoiceBill.getDynamicObjectCollection("invoiceentry"); + if (invoiceDetails != null && invoiceDetails.size() != 0) { + for (DynamicObject invoiceDetail : invoiceDetails) { + BigDecimal entryTax = invoiceDetail.getBigDecimal("entry_tax"); + // 税额累加 + taxAmount = taxAmount.add(entryTax); + + // 处理税率 + DynamicObject entryTaxRate = invoiceDetail.getDynamicObject("entry_taxrate"); + if (entryTaxRate != null) { + Long currentTaxRateId = (Long) entryTaxRate.getPkValue(); + BigDecimal currentTaxRate = entryTaxRate.getBigDecimal("taxrate"); + + // 第一次遇到税率,记录下来 + if (commonTaxRateId == null) { + commonTaxRateId = currentTaxRateId; + commonTaxRate = currentTaxRate; + } + // 后续遇到不同的税率,标记为不一致 + else if (!commonTaxRateId.equals(currentTaxRateId)) { + hasDifferentTaxRates = true; + } + } + } + } + } + } + } + } + } + + // 设置税额 + items.put("local_tax_de", taxAmount.compareTo(BigDecimal.ZERO)==0 ? "0":taxAmount.toString()); + + // 设置税率值:所有税率相同则使用共同税率,不同则设为null + if (hasDifferentTaxRates) { + items.put("taxrate", "0"); + } else if (commonTaxRate != null) { + // 设置税率 + items.put("taxrate", commonTaxRate.compareTo(BigDecimal.ZERO)==0 ? "0":commonTaxRate.toString()); + //获取映射表税码 + QFilter qFilter = new QFilter("qeug_taxid.id", QCP.equals, commonTaxRateId); + DynamicObject bipTaxRateMap = BusinessDataServiceHelper.loadSingle("qeug_biptaxratemap", qFilter.toArray()); + if (bipTaxRateMap!=null){ + String number = bipTaxRateMap.getString("number"); + if (number!=null){ + // 设置税码 + items.put("taxcodeid", number); + } + } + } else { + items.put("taxrate", "0"); + } + + items.put("notax_de",payRequestInfo.getBigDecimal("notaxamt").toString());//贷方无税金额,除税金额 + items.put("local_notax_de",payRequestInfo.getBigDecimal("notaxamt").toString());//组织本币无税金额 + if("unaudit".equals(eventName)){ + //如果此时是反审核,则需要将金额置为负数 + items.put("local_tax_de","-"+items.getString("local_tax_de")); + items.put("notax_de","-"+items.getString("notax_de")); + items.put("local_notax_de","-"+items.getString("local_notax_de")); + } + } + } + + /** + * 设置【付款申请】发票字段传BIP + * @param payRequestInfo 费用登记||费用申请 数据 + * @param items json + */ + private void setPayApplyTaxFields(DynamicObject payRequestInfo,JSONObject items,String eventName,BigDecimal bcsqje){ + //发票分录 + DynamicObjectCollection invoiceEntry = payRequestInfo.getDynamicObjectCollection("invoiceentry"); + //无发票 + if (invoiceEntry==null || invoiceEntry.size()==0){ + items.put("taxrate","0");//税率 + items.put("local_tax_de","0");//税额 + items.put("taxcodeid","CN07");//税码 + if("unaudit".equals(eventName)){ + //如果此时是反审核,则需要将金额置为负数 + items.put("notax_de","-"+bcsqje.toString()); + items.put("local_notax_de","-"+bcsqje.toString());//组织本币无税金额 + } + } else { + // 税额 + BigDecimal taxAmount = BigDecimal.ZERO; + // 税率相关变量 + BigDecimal commonTaxRate = null; + Long commonTaxRateId = null; + boolean hasDifferentTaxRates = false; + + // 遍历发票 + for (DynamicObject invoiceObj : invoiceEntry) { + DynamicObject invoiceBillF7 = invoiceObj.getDynamicObject("inventry_invoicebill"); + if (invoiceBillF7!=null) { + Object pkValue = invoiceBillF7.getPkValue(); + DynamicObject invoiceBill = BusinessDataServiceHelper.loadSingle(pkValue, "recon_invoicebill"); + if (invoiceBill != null) { + // 判断【发票登记-发票类型-名称】 + DynamicObject invoice = invoiceBill.getDynamicObject("invoice"); + if (invoice != null) { + String invoiceName = invoice.getString("name"); + if (invoiceName != null && invoiceName.contains("专用")) { + // 发票登记-发票明细 + DynamicObjectCollection invoiceDetails = invoiceBill.getDynamicObjectCollection("invoiceentry"); + if (invoiceDetails != null && invoiceDetails.size() != 0) { + for (DynamicObject invoiceDetail : invoiceDetails) { + BigDecimal entryTax = invoiceDetail.getBigDecimal("entry_tax"); + // 税额累加 + taxAmount = taxAmount.add(entryTax); + + // 处理税率 + DynamicObject entryTaxRate = invoiceDetail.getDynamicObject("entry_taxrate"); + if (entryTaxRate != null) { + Long currentTaxRateId = (Long) entryTaxRate.getPkValue(); + BigDecimal currentTaxRate = entryTaxRate.getBigDecimal("taxrate"); + + // 第一次遇到税率,记录下来 + if (commonTaxRateId == null) { + commonTaxRateId = currentTaxRateId; + commonTaxRate = currentTaxRate; + } + // 后续遇到不同的税率,标记为不一致 + else if (!commonTaxRateId.equals(currentTaxRateId)) { + hasDifferentTaxRates = true; + } + } + } + } + } + } + } + } + } + + // 设置税额 + items.put("local_tax_de", taxAmount.compareTo(BigDecimal.ZERO)==0 ? "0":taxAmount.toString()); + + // 设置税率值:所有税率相同则使用共同税率,不同则设为null + if (hasDifferentTaxRates) { + items.put("taxrate", "0"); + } else if (commonTaxRate != null) { + // 设置税率 + items.put("taxrate", commonTaxRate.compareTo(BigDecimal.ZERO)==0 ? "0":commonTaxRate.toString()); + //获取映射表税码 + QFilter qFilter = new QFilter("qeug_taxid.id", QCP.equals, commonTaxRateId); + DynamicObject bipTaxRateMap = BusinessDataServiceHelper.loadSingle("qeug_biptaxratemap", qFilter.toArray()); + if (bipTaxRateMap!=null){ + String number = bipTaxRateMap.getString("number"); + if (number!=null){ + // 设置税码 + items.put("taxcodeid", number); + } + } + } else { + items.put("taxrate", "0"); + } + + items.put("notax_de",payRequestInfo.getBigDecimal("notaxamt").toString());//贷方无税金额,除税金额 + items.put("local_notax_de",payRequestInfo.getBigDecimal("notaxamt").toString());//组织本币无税金额 + if("unaudit".equals(eventName)){ + //如果此时是反审核,则需要将金额置为负数 + items.put("local_tax_de","-"+items.getString("local_tax_de")); + items.put("notax_de","-"+items.getString("notax_de")); + items.put("local_notax_de","-"+items.getString("local_notax_de")); + } + } + } } \ No newline at end of file