From 0e1334be23b15c4b01f9393092a6af4623596d0c Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E5=88=98=E6=B3=89=E4=BD=B3?= <1107186916@qq.com> Date: Fri, 18 Sep 2026 21:07:12 +0800 Subject: [PATCH] =?UTF-8?q?:zap:=20=E9=87=91=E8=9D=B6=E5=BA=94=E4=BB=98?= =?UTF-8?q?=E5=8D=95=E5=88=86=E5=BD=95=E4=B8=8D=E5=86=8D=E6=8C=89=E5=A4=9A?= =?UTF-8?q?=E8=B4=A7=E7=89=A9=E7=B1=BB=E5=9E=8B=E6=8B=86=E8=A1=8C=EF=BC=9A?= =?UTF-8?q?=E6=95=B4=E8=A1=8C=E4=B8=80=E6=9D=A1=E5=88=86=E5=BD=95=EF=BC=8C?= =?UTF-8?q?=E7=89=A9=E6=96=99=E7=BC=96=E7=A0=81=E5=8F=96=E7=AC=AC=E4=B8=80?= =?UTF-8?q?=E7=A7=8D=E8=B4=A7=E7=89=A9=E7=B1=BB=E5=9E=8B?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../support/KingdeeApBillSyncSupport.java | 59 ++++++------------- 1 file changed, 18 insertions(+), 41 deletions(-) diff --git a/blade-service/blade-transport/src/main/java/org/springblade/transport/support/KingdeeApBillSyncSupport.java b/blade-service/blade-transport/src/main/java/org/springblade/transport/support/KingdeeApBillSyncSupport.java index caa2a279..f5ab7264 100644 --- a/blade-service/blade-transport/src/main/java/org/springblade/transport/support/KingdeeApBillSyncSupport.java +++ b/blade-service/blade-transport/src/main/java/org/springblade/transport/support/KingdeeApBillSyncSupport.java @@ -379,8 +379,8 @@ public class KingdeeApBillSyncSupport { } /** - * 单条应付货物费用行生成不聚合分录(每行一条); - * 一行含多种货物类型时按类型拆为多条,金额与数量按份数均分(尾差计入最后一份) + * 单条应付货物费用行生成一条分录; + * 货物类型含多种(“、/,”分隔)时不拆行,物料编码取第一种货物类型,金额数量整行直送 * * @param entryGroups 分录集合(保持行序) * @param cargoCodeByName 货物类型名称->货物编码映射 @@ -398,28 +398,21 @@ public class KingdeeApBillSyncSupport { Long formalSettlementId, String cargoType, String measureunitNumber, Long sourceRowId, BigDecimal price, BigDecimal amount, BigDecimal amountNoTax, BigDecimal quantity, String sourceDesc) { - List cargoNames = splitCargoTypes(cargoType); if (Func.isBlank(measureunitNumber)) { throw new ServiceException("推送金蝶财务应付单失败:" + sourceDesc + "计量单位为空,请先维护运费计算单位"); } - // 分录唯一标识(awrp_entry_code,A103-1 要求对方系统唯一行id不能重复):雪花id天然唯一,同行多类型拆分时追加序号 - String rowEntryCode = String.valueOf(sourceRowId); - List amountShares = splitEqually(amount, cargoNames.size()); - List amountNoTaxShares = splitEqually(amountNoTax, cargoNames.size()); - List quantityShares = splitEqually(quantity, cargoNames.size()); - for (int index = 0; index < cargoNames.size(); index++) { - String cargoName = cargoNames.get(index); - String materialNumber = cargoCodeByName.get(cargoName); - if (Func.isBlank(materialNumber)) { - throw new ServiceException("推送金蝶财务应付单失败:" + sourceDesc + "货物类型[" + cargoName + "]未在货物类型档案中维护编码,请补充后重试"); - } - String entryCode = cargoNames.size() > 1 ? rowEntryCode + "-" + (index + 1) : rowEntryCode; - entryGroups.add(new BfiEntryGroup(materialNumber, measureunitNumber, entryCode, - quantityShares.get(index), price, amountShares.get(index), amountNoTaxShares.get(index), formalSettlementId)); - log.info("金蝶应付单分录生成:来源[{}],分录标识[{}],物料编码[{}],计量单位[{}],数量[{}],单价[{}],含税金额[{}],不含税金额[{}]", - sourceDesc, entryCode, materialNumber, measureunitNumber, - quantityShares.get(index), price, amountShares.get(index), amountNoTaxShares.get(index)); + // 货物类型含多种时不拆行(业务约定整行一条分录),物料编码取第一种货物类型 + String cargoName = splitCargoTypes(cargoType).get(0); + String materialNumber = cargoCodeByName.get(cargoName); + if (Func.isBlank(materialNumber)) { + throw new ServiceException("推送金蝶财务应付单失败:" + sourceDesc + "货物类型[" + cargoName + "]未在货物类型档案中维护编码,请补充后重试"); } + // 分录唯一标识(awrp_entry_code,A103-1 要求对方系统唯一行id不能重复):应付货物费用行id,雪花id天然唯一 + String entryCode = String.valueOf(sourceRowId); + entryGroups.add(new BfiEntryGroup(materialNumber, measureunitNumber, entryCode, + quantity, price, amount, amountNoTax, formalSettlementId)); + log.info("金蝶应付单分录生成:来源[{}],分录标识[{}],物料编码[{}],计量单位[{}],数量[{}],单价[{}],含税金额[{}],不含税金额[{}]", + sourceDesc, entryCode, materialNumber, measureunitNumber, quantity, price, amount, amountNoTax); } /** 付款申请关联的正式结算货物费用行(blade_formal_settlement_detail_fee,用于不含税金额回链应付费用行) */ @@ -521,7 +514,10 @@ public class KingdeeApBillSyncSupport { return Func.isBlank(unitName) ? null : unitName.trim(); } - /** 货物类型支持“、/,”分隔的多类型写法,拆分为单类型名称 */ + /** + * 货物类型支持“、/,”分隔的多类型写法,解析为类型名称列表; + * 分录不按类型拆行(业务约定整行一条),物料编码仅取列表第一种类型 + */ private List splitCargoTypes(String cargoType) { if (Func.isBlank(cargoType)) { throw new ServiceException("推送金蝶财务应付单失败:结算明细货物类型为空,无法解析物料编码"); @@ -530,25 +526,6 @@ public class KingdeeApBillSyncSupport { .map(String::trim).filter(Func::isNotBlank).distinct().toList(); } - /** 数值按份数均分(保留 2 位小数、向下取整,尾差计入最后一份) */ - private List splitEqually(BigDecimal total, int parts) { - if (parts <= 1) { - return List.of(total); - } - List shares = new ArrayList<>(parts); - BigDecimal remaining = total; - for (int index = 0; index < parts; index++) { - if (index == parts - 1) { - shares.add(remaining); - } else { - BigDecimal share = total.divide(BigDecimal.valueOf(parts), 2, RoundingMode.DOWN); - shares.add(share); - remaining = remaining.subtract(share); - } - } - return shares; - } - // ==================== 金蝶公共校验与档案取数 ==================== /** @@ -685,7 +662,7 @@ public class KingdeeApBillSyncSupport { * * @param materialNumber 物料编码(货物类型档案货物编码) * @param measureunitNumber 计量单位编码(运费计算单位,档案暂无编码字段暂传单位名称) - * @param entryCode 分录唯一标识(awrp_entry_code):费用明细行id,同行多货物类型拆分时追加序号 + * @param entryCode 分录唯一标识(awrp_entry_code):费用明细行id,雪花id天然唯一 * @param quantity 该行运输数量 * @param price 该行运输单价(费用明细 unit_price) * @param amount 该行金额(含税),对应明细应付金额 e_pricetaxtotal