fix: 金蝶分录拆分跳过0元费用项避免生成0元明细行
fee_items_json 中金额为0的费用项(附加运输补贴/仓储服务费等)不再参与分组,0元货物行整体跳过;修复FJS2026101300005推送8条分录(其中5条为0元行)的问题,修复后该单应为3条有效分录
This commit is contained in:
+7
-1
@@ -463,7 +463,9 @@ public class KingdeeApBillSyncSupport {
|
|||||||
List<FeeLineSplit> splits = splitFeeItems(parseFeeItems(feeItemsJson), context.feeCategoryByName(),
|
List<FeeLineSplit> splits = splitFeeItems(parseFeeItems(feeItemsJson), context.feeCategoryByName(),
|
||||||
context.taxRateByRule(), rowAmount);
|
context.taxRateByRule(), rowAmount);
|
||||||
if (splits.isEmpty()) {
|
if (splits.isEmpty()) {
|
||||||
throw new ServiceException("推送金蝶失败:" + sourceDesc + "无费用项金额,无法拆分明细分录");
|
// 0元货物行(费用项与结算金额均为0)跳过不生成0元分录
|
||||||
|
log.info("金蝶应付单分录生成:来源[{}],费用项与结算金额均为0,跳过该货物行", sourceDesc);
|
||||||
|
return;
|
||||||
}
|
}
|
||||||
// 运输类数量:取运单运输量(未维护兜底 1)
|
// 运输类数量:取运单运输量(未维护兜底 1)
|
||||||
BigDecimal freightQuantity = transportQuantity != null && transportQuantity.compareTo(BigDecimal.ZERO) > 0
|
BigDecimal freightQuantity = transportQuantity != null && transportQuantity.compareTo(BigDecimal.ZERO) > 0
|
||||||
@@ -656,6 +658,10 @@ public class KingdeeApBillSyncSupport {
|
|||||||
continue;
|
continue;
|
||||||
}
|
}
|
||||||
BigDecimal amount = item.getValue() == null ? BigDecimal.ZERO : item.getValue();
|
BigDecimal amount = item.getValue() == null ? BigDecimal.ZERO : item.getValue();
|
||||||
|
// 0元费用项跳过,不生成0元分录(金额缺失由运输类无税率组残差兜底)
|
||||||
|
if (amount.signum() == 0) {
|
||||||
|
continue;
|
||||||
|
}
|
||||||
boolean loading = isLoadingCategory(item.getKey(), feeCategoryByName);
|
boolean loading = isLoadingCategory(item.getKey(), feeCategoryByName);
|
||||||
BigDecimal taxRate = taxRateByRule == null ? null : taxRateByRule.get(item.getKey());
|
BigDecimal taxRate = taxRateByRule == null ? null : taxRateByRule.get(item.getKey());
|
||||||
FeeLineSplit split = grouped.get(splitGroupKey(loading, taxRate));
|
FeeLineSplit split = grouped.get(splitGroupKey(loading, taxRate));
|
||||||
|
|||||||
+30
@@ -136,4 +136,34 @@ class KingdeeEntrySplitTest {
|
|||||||
assertFalse(splits.get(1).isLoading());
|
assertFalse(splits.get(1).isLoading());
|
||||||
assertEquals(new BigDecimal("100"), splits.get(1).getAmount());
|
assertEquals(new BigDecimal("100"), splits.get(1).getAmount());
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/** 0元费用项跳过:不生成0元分录(FJS2026101300005 结算单8条分录问题的回归用例) */
|
||||||
|
@Test
|
||||||
|
void zeroAmountFeeItemsSkipped() {
|
||||||
|
Map<String, BigDecimal> feeItems = new LinkedHashMap<>();
|
||||||
|
feeItems.put("运输费", new BigDecimal("3120"));
|
||||||
|
feeItems.put("附加运输补贴", BigDecimal.ZERO);
|
||||||
|
feeItems.put("装卸费", new BigDecimal("800"));
|
||||||
|
feeItems.put("仓储服务费", BigDecimal.ZERO);
|
||||||
|
Map<String, BigDecimal> taxRateByRule = Map.of(
|
||||||
|
"运输费", new BigDecimal("9"),
|
||||||
|
"附加运输补贴", new BigDecimal("6"),
|
||||||
|
"装卸费", new BigDecimal("6"));
|
||||||
|
List<FeeLineSplit> splits = KingdeeApBillSyncSupport.splitFeeItems(feeItems, Map.of(), taxRateByRule, new BigDecimal("3920"));
|
||||||
|
assertEquals(2, splits.size());
|
||||||
|
assertFalse(splits.get(0).isLoading());
|
||||||
|
assertEquals(new BigDecimal("3120"), splits.get(0).getAmount());
|
||||||
|
assertTrue(splits.get(1).isLoading());
|
||||||
|
assertEquals(new BigDecimal("800"), splits.get(1).getAmount());
|
||||||
|
}
|
||||||
|
|
||||||
|
/** 全部费用项为0且结算金额为0:拆分结果为空(调用方跳过该0元货物行) */
|
||||||
|
@Test
|
||||||
|
void allZeroFeeItemsYieldEmptySplits() {
|
||||||
|
Map<String, BigDecimal> feeItems = new LinkedHashMap<>();
|
||||||
|
feeItems.put("运输费", BigDecimal.ZERO);
|
||||||
|
feeItems.put("装卸费", BigDecimal.ZERO);
|
||||||
|
List<FeeLineSplit> splits = KingdeeApBillSyncSupport.splitFeeItems(feeItems, Map.of(), Map.of(), BigDecimal.ZERO);
|
||||||
|
assertTrue(splits.isEmpty());
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
Reference in New Issue
Block a user