package com.ruoyi.common.utils; import com.ruoyi.purchase.dto.ProcurementBusinessSummaryDto; import com.ruoyi.purchase.vo.SupplierTransactionsDetailsVo; import com.ruoyi.purchase.vo.SupplierTransactionsVo; import com.ruoyi.sales.pojo.SalesLedgerProduct; import com.ruoyi.sales.vo.CustomerTransactionsDetailsVo; import com.ruoyi.sales.vo.CustomerTransactionsVo; import java.math.BigDecimal; import java.math.RoundingMode; import java.util.Collection; import java.util.List; /** * 金额精度工具:统一保留 6 位小数 */ public final class AmountUtils { public static final int AMOUNT_SCALE = 6; public static final RoundingMode AMOUNT_ROUNDING = RoundingMode.HALF_UP; private AmountUtils() { } public static BigDecimal scaleAmount(BigDecimal value) { if (value == null) { return BigDecimal.ZERO.setScale(AMOUNT_SCALE, AMOUNT_ROUNDING); } return value.setScale(AMOUNT_SCALE, AMOUNT_ROUNDING); } public static BigDecimal calcTaxExclusiveTotalPrice(BigDecimal taxInclusiveTotalPrice, BigDecimal taxRate) { if (taxInclusiveTotalPrice == null || taxRate == null) { return scaleAmount(BigDecimal.ZERO); } BigDecimal divisor = BigDecimal.ONE.add( taxRate.divide(BigDecimal.valueOf(100), AMOUNT_SCALE, AMOUNT_ROUNDING) ); return scaleAmount(taxInclusiveTotalPrice.divide(divisor, AMOUNT_SCALE, AMOUNT_ROUNDING)); } public static void normalizeSalesLedgerProduct(SalesLedgerProduct product) { if (product == null) { return; } product.setTaxInclusiveUnitPrice(scaleAmount(product.getTaxInclusiveUnitPrice())); product.setTaxInclusiveTotalPrice(scaleAmount(product.getTaxInclusiveTotalPrice())); product.setTaxExclusiveTotalPrice(scaleAmount(product.getTaxExclusiveTotalPrice())); } public static void normalizeSalesLedgerProducts(Collection products) { if (products == null) { return; } products.forEach(AmountUtils::normalizeSalesLedgerProduct); } public static void normalizeContractAmount(Object entity) { if (entity == null) { return; } try { java.lang.reflect.Field field = entity.getClass().getDeclaredField("contractAmount"); field.setAccessible(true); field.set(entity, scaleAmount((BigDecimal) field.get(entity))); } catch (NoSuchFieldException ignored) { } catch (Exception e) { throw new RuntimeException("标准化合同金额失败", e); } } public static void normalizeSupplierTransaction(SupplierTransactionsVo vo) { if (vo == null) { return; } vo.setContractAmounts(scaleAmount(vo.getContractAmounts())); vo.setShippedAmount(scaleAmount(vo.getShippedAmount())); vo.setUnshippedAmount(scaleAmount(vo.getUnshippedAmount())); } public static void normalizeSupplierTransactionDetail(SupplierTransactionsDetailsVo vo) { if (vo == null) { return; } vo.setContractAmount(scaleAmount(vo.getContractAmount())); vo.setShippedAmount(scaleAmount(vo.getShippedAmount())); vo.setUnshippedAmount(scaleAmount(vo.getUnshippedAmount())); } public static void normalizeCustomerTransaction(CustomerTransactionsVo vo) { if (vo == null) { return; } vo.setContractAmounts(scaleAmount(vo.getContractAmounts())); vo.setShippedAmount(scaleAmount(vo.getShippedAmount())); vo.setUnshippedAmount(scaleAmount(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())); } public static void normalizeProcurementBusinessSummary(ProcurementBusinessSummaryDto dto) { if (dto == null) { return; } dto.setPurchaseAmount(scaleAmount(dto.getPurchaseAmount())); dto.setAveragePrice(scaleAmount(dto.getAveragePrice())); dto.setReturnAmount(scaleAmount(dto.getReturnAmount())); } public static void normalizeProcurementBusinessSummaryList(List list) { if (list == null) { return; } list.forEach(AmountUtils::normalizeProcurementBusinessSummary); } }