diff --git a/blade-service/blade-transport/src/main/java/org/springblade/transport/support/KingdeeReceivedInvoiceSyncSupport.java b/blade-service/blade-transport/src/main/java/org/springblade/transport/support/KingdeeReceivedInvoiceSyncSupport.java index d86b22cb..478f4742 100644 --- a/blade-service/blade-transport/src/main/java/org/springblade/transport/support/KingdeeReceivedInvoiceSyncSupport.java +++ b/blade-service/blade-transport/src/main/java/org/springblade/transport/support/KingdeeReceivedInvoiceSyncSupport.java @@ -266,7 +266,8 @@ public class KingdeeReceivedInvoiceSyncSupport { * 分录组装:逐行取发票明细行(镜像 items_json 反序列化为 {@link BfiInvoicePoolItemVO}),一条明细行一条分录: * 价税合计=明细金额+税额(合计为 0 拦截);数量取 num(≤0/空/不可解析兜底 1);单价取 unitPrice(空按价税合计/数量反算); * 物料编码取行商品编码 goodsCode(缺失拦截,去尾部 0);不含税金额取明细金额(空不送); - * 税收分类编码/税率表编码/税额不送;分录标识=发票号码_seq(重推幂等候选键) + * 税率编码=发票行税率(小数)×100 按第三方税率映射取编码(行税率空/非法不送,映射未维护拦截); + * 税收分类编码行商品编码已送/税率表编码/税额不送;分录标识=发票号码_seq(重推幂等候选键) * * @param receipt 收票登记(发票号码,分录标识前缀) * @param mirror 票池镜像(明细行 items_json) @@ -308,6 +309,9 @@ public class KingdeeReceivedInvoiceSyncSupport { // entry.setMaterialNumber(goodsCode); // 税收分类编码.编码:数电票行商品编码即税收分类编码 entry.setETaxclassNumber(goodsCode); + // 税率.编码:发票行税率(小数如0.09)×100 转百分数后按 thirdparty.bfi.taxrate 映射(与应付/应收单同口径),行税率空/非法不送 + entry.setTaxrateidNumber(kingdeeApBillSyncSupport.taxrateCode( + this.invoiceTaxRatePercent(receipt.getInvoiceNo(), seq, item.getTaxRate()))); // 金额(不含税):明细金额(空不送);税收分类编码/税率表编码/税额不送,税额仅参与价税合计 if (detailAmount != null) { @@ -326,6 +330,28 @@ public class KingdeeReceivedInvoiceSyncSupport { return stripped.isEmpty() ? code : stripped; } + /** + * 发票行税率转百分数:票池税率文本为小数(如 "0.09" 表示 9%),×100 转百分数(9)后供税率编码映射查表; + * 行税率为空/非法返回 null(税率编码不送,与应付单无税率组口径一致) + * + * @param invoiceNo 发票号码(日志定位) + * @param seq 分录序号(日志定位) + * @param taxRateText 票池明细行税率文本(小数) + * @return 百分数税率(如 9),空/非法返回 null + */ + private BigDecimal invoiceTaxRatePercent(String invoiceNo, String seq, String taxRateText) { + if (Func.isBlank(taxRateText)) { + log.warn("收票登记发票[{}]分录[{}]行税率为空, 税率编码不送", invoiceNo, seq); + return null; + } + try { + return new BigDecimal(taxRateText.trim()).multiply(new BigDecimal("100")); + } catch (NumberFormatException exception) { + log.warn("收票登记发票[{}]分录[{}]行税率[{}]非法, 税率编码不送", invoiceNo, seq, taxRateText); + return null; + } + } + /** 镜像明细行反序列化:items_json 解析异常按脏数据拦截(A801-1 原样落库,理论上可解析) */ private List parseMirrorItems(String invoiceNo, String itemsJson) { try {