新增 运营诊断接口

This commit is contained in:
Lemon
2026-04-01 14:13:29 +08:00
parent da17b5151d
commit 19c89db265
10 changed files with 671 additions and 0 deletions

View File

@@ -0,0 +1,100 @@
package com.jsowell.common.util;
import java.math.BigDecimal;
import java.math.RoundingMode;
/**
* BigDecimal工具类
*
* @author Auto
* @Date 2026/4/1
*/
public class BigDecimalUtils {
/**
* 工具类不允许实例化
*/
private BigDecimalUtils() {
}
/**
* 空值转零
*
* @param value 原始值
* @return 非空数值
*/
public static BigDecimal nullToZero(BigDecimal value) {
return value == null ? BigDecimal.ZERO : value;
}
/**
* 安全除法
*
* @param dividend 被除数
* @param divisor 除数
* @param scale 保留小数位
* @return 计算结果
*/
public static BigDecimal safeDivide(BigDecimal dividend, BigDecimal divisor, int scale) {
BigDecimal safeDividend = nullToZero(dividend);
BigDecimal safeDivisor = nullToZero(divisor);
if (safeDivisor.compareTo(BigDecimal.ZERO) == 0) {
return BigDecimal.ZERO;
}
return safeDividend.divide(safeDivisor, scale, RoundingMode.HALF_UP);
}
/**
* 标准化数值显示
*
* @param value 原始值
* @return 标准化后的数值
*/
public static BigDecimal normalize(BigDecimal value) {
BigDecimal safeValue = nullToZero(value);
if (safeValue.compareTo(BigDecimal.ZERO) == 0) {
return BigDecimal.ZERO;
}
return safeValue.stripTrailingZeros();
}
/**
* 将字符串安全转换为BigDecimal
*
* @param value 原始字符串
* @return BigDecimal值
*/
public static BigDecimal parseOrZero(String value) {
if (StringUtils.isBlank(value)) {
return BigDecimal.ZERO;
}
try {
return new BigDecimal(value.trim());
} catch (Exception e) {
return BigDecimal.ZERO;
}
}
/**
* 计算环比百分比
*
* @param currentValue 当前周期值
* @param previousValue 上周期值
* @return 环比字符串
*/
public static String calculateRate(BigDecimal currentValue, BigDecimal previousValue) {
BigDecimal safeCurrentValue = nullToZero(currentValue);
BigDecimal safePreviousValue = nullToZero(previousValue);
if (safePreviousValue.compareTo(BigDecimal.ZERO) == 0) {
return "0%";
}
BigDecimal rate = safeCurrentValue.subtract(safePreviousValue)
.divide(safePreviousValue, 4, RoundingMode.HALF_UP)
.multiply(new BigDecimal("100"));
BigDecimal normalizedRate = normalize(rate);
if (normalizedRate.compareTo(BigDecimal.ZERO) > 0) {
return "+" + normalizedRate.toPlainString() + "%";
}
return normalizedRate.toPlainString() + "%";
}
}