fix: 收票单推送金蝶补送分录税率编码

This commit is contained in:
刘泉佳
2026-11-05 16:14:45 +08:00
parent cbbc523c4b
commit 3ea247f053
@@ -266,7 +266,8 @@ public class KingdeeReceivedInvoiceSyncSupport {
* 分录组装:逐行取发票明细行(镜像 items_json 反序列化为 {@link BfiInvoicePoolItemVO}),一条明细行一条分录: * 分录组装:逐行取发票明细行(镜像 items_json 反序列化为 {@link BfiInvoicePoolItemVO}),一条明细行一条分录:
* 价税合计=明细金额+税额(合计为 0 拦截);数量取 num(≤0/空/不可解析兜底 1);单价取 unitPrice(空按价税合计/数量反算); * 价税合计=明细金额+税额(合计为 0 拦截);数量取 num(≤0/空/不可解析兜底 1);单价取 unitPrice(空按价税合计/数量反算);
* 物料编码取行商品编码 goodsCode(缺失拦截,去尾部 0);不含税金额取明细金额(空不送); * 物料编码取行商品编码 goodsCode(缺失拦截,去尾部 0);不含税金额取明细金额(空不送);
* 税收分类编码/税率表编码/税额不送;分录标识=发票号码_seq(重推幂等候选键) * 税率编码=发票行税率(小数)×100 按第三方税率映射取编码(行税率空/非法不送,映射未维护拦截);
* 税收分类编码行商品编码已送/税率表编码/税额不送;分录标识=发票号码_seq(重推幂等候选键)
* *
* @param receipt 收票登记(发票号码,分录标识前缀) * @param receipt 收票登记(发票号码,分录标识前缀)
* @param mirror 票池镜像(明细行 items_json) * @param mirror 票池镜像(明细行 items_json)
@@ -308,6 +309,9 @@ public class KingdeeReceivedInvoiceSyncSupport {
// entry.setMaterialNumber(goodsCode); // entry.setMaterialNumber(goodsCode);
// 税收分类编码.编码:数电票行商品编码即税收分类编码 // 税收分类编码.编码:数电票行商品编码即税收分类编码
entry.setETaxclassNumber(goodsCode); entry.setETaxclassNumber(goodsCode);
// 税率.编码:发票行税率(小数如0.09)×100 转百分数后按 thirdparty.bfi.taxrate 映射(与应付/应收单同口径),行税率空/非法不送
entry.setTaxrateidNumber(kingdeeApBillSyncSupport.taxrateCode(
this.invoiceTaxRatePercent(receipt.getInvoiceNo(), seq, item.getTaxRate())));
// 金额(不含税):明细金额(空不送);税收分类编码/税率表编码/税额不送,税额仅参与价税合计 // 金额(不含税):明细金额(空不送);税收分类编码/税率表编码/税额不送,税额仅参与价税合计
if (detailAmount != null) { if (detailAmount != null) {
@@ -326,6 +330,28 @@ public class KingdeeReceivedInvoiceSyncSupport {
return stripped.isEmpty() ? code : stripped; 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 原样落库,理论上可解析) */ /** 镜像明细行反序列化:items_json 解析异常按脏数据拦截(A801-1 原样落库,理论上可解析) */
private List<BfiInvoicePoolItemVO> parseMirrorItems(String invoiceNo, String itemsJson) { private List<BfiInvoicePoolItemVO> parseMirrorItems(String invoiceNo, String itemsJson) {
try { try {