1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
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<SalesLedgerProduct> 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<ProcurementBusinessSummaryDto> list) {
        if (list == null) {
            return;
        }
        list.forEach(AmountUtils::normalizeProcurementBusinessSummary);
    }
}