gongchunyi
10 小时以前 71e05a80df83069c9611ba5ef0fdc2a37eb6a3ae
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
125
126
127
128
129
130
131
132
133
134
135
136
137
138
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 位小数,金额(元)保留 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() {
    }
 
    public static BigDecimal scaleAmount(BigDecimal value) {
        if (value == null) {
            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) {
        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(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(scaleMoney(vo.getContractAmount()));
        vo.setShippedAmount(scaleMoney(vo.getShippedAmount()));
        vo.setUnshippedAmount(scaleMoney(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);
    }
}