| src/main/java/com/ruoyi/basic/service/impl/CustomerServiceImpl.java | ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史 | |
| src/main/java/com/ruoyi/common/utils/AmountUtils.java | ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史 |
src/main/java/com/ruoyi/basic/service/impl/CustomerServiceImpl.java
@@ -398,12 +398,15 @@ } for (CustomerTransactionsVo vo : records) { BigDecimal outboundAmount = shippedAmountMap.getOrDefault(vo.getCustomerId(), BigDecimal.ZERO); vo.setShippedAmount(outboundAmount); BigDecimal contractAmounts = vo.getContractAmounts() == null ? BigDecimal.ZERO : vo.getContractAmounts(); BigDecimal unshippedAmount = contractAmounts.subtract(outboundAmount); BigDecimal contractAmounts = AmountUtils.scaleMoney(vo.getContractAmounts()); // 已出库金额按分(2位小数)处理,避免按含税单价累计出库金额产生误差导致全部发货后仍有未出库零头 BigDecimal shippedAmount = AmountUtils.scaleMoney(outboundAmount); BigDecimal unshippedAmount = contractAmounts.subtract(shippedAmount); if (unshippedAmount.compareTo(BigDecimal.ZERO) < 0) { unshippedAmount = BigDecimal.ZERO; } vo.setContractAmounts(contractAmounts); vo.setShippedAmount(shippedAmount); vo.setUnshippedAmount(unshippedAmount); AmountUtils.normalizeCustomerTransaction(vo); } @@ -426,12 +429,15 @@ } for (CustomerTransactionsDetailsVo vo : records) { BigDecimal outboundAmount = shippedAmountMap.getOrDefault(vo.getSalesLedgerId(), BigDecimal.ZERO); vo.setShippedAmount(outboundAmount); BigDecimal contractAmount = vo.getContractAmount() == null ? BigDecimal.ZERO : vo.getContractAmount(); BigDecimal unshippedAmount = contractAmount.subtract(outboundAmount); BigDecimal contractAmount = AmountUtils.scaleMoney(vo.getContractAmount()); // 已出库金额按分(2位小数)处理,避免按含税单价累计出库金额产生误差导致全部发货后仍有未出库零头 BigDecimal shippedAmount = AmountUtils.scaleMoney(outboundAmount); BigDecimal unshippedAmount = contractAmount.subtract(shippedAmount); if (unshippedAmount.compareTo(BigDecimal.ZERO) < 0) { unshippedAmount = BigDecimal.ZERO; } vo.setContractAmount(contractAmount); vo.setShippedAmount(shippedAmount); vo.setUnshippedAmount(unshippedAmount); AmountUtils.normalizeCustomerTransactionDetail(vo); } src/main/java/com/ruoyi/common/utils/AmountUtils.java
@@ -13,12 +13,15 @@ import java.util.List; /** * 金额精度工具:统一保留 6 位小数 * 金额精度工具:默认统一保留 6 位小数,金额(元)保留 2 位小数 */ public final class AmountUtils { public static final int AMOUNT_SCALE = 6; public static final RoundingMode AMOUNT_ROUNDING = RoundingMode.HALF_UP; /** 金额(元)保留小数位数(分) */ public static final int MONEY_SCALE = 2; private AmountUtils() { } @@ -28,6 +31,17 @@ return BigDecimal.ZERO.setScale(AMOUNT_SCALE, AMOUNT_ROUNDING); } return value.setScale(AMOUNT_SCALE, AMOUNT_ROUNDING); } /** * 金额(元)精度处理:四舍五入保留 2 位小数, * 避免按含税单价累计出库金额时产生误差,全部发货后仍显示未出库零头 */ public static BigDecimal scaleMoney(BigDecimal value) { if (value == null) { return BigDecimal.ZERO.setScale(MONEY_SCALE, AMOUNT_ROUNDING); } return value.setScale(MONEY_SCALE, AMOUNT_ROUNDING); } public static BigDecimal calcTaxExclusiveTotalPrice(BigDecimal taxInclusiveTotalPrice, BigDecimal taxRate) { @@ -92,18 +106,18 @@ if (vo == null) { return; } vo.setContractAmounts(scaleAmount(vo.getContractAmounts())); vo.setShippedAmount(scaleAmount(vo.getShippedAmount())); vo.setUnshippedAmount(scaleAmount(vo.getUnshippedAmount())); vo.setContractAmounts(scaleMoney(vo.getContractAmounts())); vo.setShippedAmount(scaleMoney(vo.getShippedAmount())); vo.setUnshippedAmount(scaleMoney(vo.getUnshippedAmount())); } public static void normalizeCustomerTransactionDetail(CustomerTransactionsDetailsVo vo) { if (vo == null) { return; } vo.setContractAmount(scaleAmount(vo.getContractAmount())); vo.setShippedAmount(scaleAmount(vo.getShippedAmount())); vo.setUnshippedAmount(scaleAmount(vo.getUnshippedAmount())); vo.setContractAmount(scaleMoney(vo.getContractAmount())); vo.setShippedAmount(scaleMoney(vo.getShippedAmount())); vo.setUnshippedAmount(scaleMoney(vo.getUnshippedAmount())); } public static void normalizeProcurementBusinessSummary(ProcurementBusinessSummaryDto dto) {