重要:分账计算方法做调整,拉卡拉手续费由 代理商或平台出,商家不会扣除。
This commit is contained in:
parent
950b7b9b32
commit
b1f401ff81
@ -34,9 +34,9 @@ import java.math.RoundingMode;
|
||||
public class LklSeparateWithTotalAmountDTO {
|
||||
|
||||
// 商家最低分账比例阈值 20%
|
||||
private static final BigDecimal MCH_RATIO_THRESHOLD = BigDecimal.valueOf(0.2);
|
||||
private static final BigDecimal MIN_MERCHANT_RATIO_THRESHOLD = BigDecimal.valueOf(0.2);
|
||||
// 默认平台比例 1%
|
||||
private static final BigDecimal DEFAULT_PLAT_RATIO = BigDecimal.valueOf(0.01);
|
||||
private static final BigDecimal DEFAULT_PLATFORM_RATIO = BigDecimal.valueOf(0.01);
|
||||
|
||||
// 基础金额属性
|
||||
private Integer totalSeparateAmount; // 分账总金额(分)
|
||||
@ -240,54 +240,6 @@ public class LklSeparateWithTotalAmountDTO {
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* 根据指定规则调整各参与方分账金额
|
||||
* 如果拉卡拉分账金额lklAmount>0:
|
||||
* 1. 如果agent2ndAmount>0 且大于lklAmount, 则agent2ndAmount=agent2ndAmount-lklAmount,mchAmount=mchAmount+lklAmount
|
||||
* 2. 如果agent2ndAmount<=0 但 agent1stAmount>0 且大于lklAmount, 则agent1stAmount=agent1stAmount-lklAmount,mchAmount=mchAmount+lklAmount
|
||||
* 3. 如果agent2ndAmount<=0 且 agent1stAmount<=0,但 platAmount>0 且大于等于lklAmount, 则 platAmount=platAmount-lklAmount,mchAmount=mchAmount+lklAmount
|
||||
*
|
||||
* @return Pair<Boolean, String> Boolean表示是否成功,String为错误信息
|
||||
*/
|
||||
private Pair<Boolean, String> adjustAmountsWithLklAmount() {
|
||||
try {
|
||||
// 只有当拉卡拉分账金额大于0时才执行调整逻辑
|
||||
if (lklAmount != null && lklAmount > 0) {
|
||||
int adjustment = lklAmount; // 需要调整的金额
|
||||
|
||||
// 情况1: 如果agent2ndAmount>0 且大于lklAmount
|
||||
if (agent2ndAmount != null && agent2ndAmount > 0 && agent2ndAmount > adjustment) {
|
||||
agent2ndAmount -= adjustment;
|
||||
mchAmount += adjustment;
|
||||
log.debug("调整二级代理商分账金额: 减少{},商家分账金额增加{}", adjustment, adjustment);
|
||||
}
|
||||
// 情况2: 如果agent2ndAmount<=0 但 agent1stAmount>0 且大于lklAmount
|
||||
else if ((agent2ndAmount == null || agent2ndAmount <= 0) &&
|
||||
agent1stAmount != null && agent1stAmount > 0 && agent1stAmount > adjustment) {
|
||||
agent1stAmount -= adjustment;
|
||||
mchAmount += adjustment;
|
||||
log.debug("调整一级代理商分账金额: 减少{},商家分账金额增加{}", adjustment, adjustment);
|
||||
}
|
||||
// 情况3: 如果agent2ndAmount<=0 且 agent1stAmount<=0,但 platAmount>0 且大于等于lklAmount
|
||||
else if ((agent2ndAmount == null || agent2ndAmount <= 0) &&
|
||||
(agent1stAmount == null || agent1stAmount <= 0) &&
|
||||
platAmount != null && platAmount > 0 && platAmount >= adjustment) {
|
||||
platAmount -= adjustment;
|
||||
mchAmount += adjustment;
|
||||
log.debug("调整平台分账金额: 减少{},商家分账金额增加{}", adjustment, adjustment);
|
||||
}
|
||||
// 其他情况不作调整
|
||||
else {
|
||||
log.debug("不满足调整条件,无需调整各参与方分账金额");
|
||||
}
|
||||
}
|
||||
|
||||
return Pair.of(true, "");
|
||||
} catch (Exception e) {
|
||||
return Pair.of(false, "调整分账金额时发生异常: " + e.getMessage());
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* 校验必要参数
|
||||
*
|
||||
@ -379,7 +331,7 @@ public class LklSeparateWithTotalAmountDTO {
|
||||
private Pair<Boolean, String> calculateDefaultRatios() {
|
||||
// 如果平台比例无效,设置默认值0.01
|
||||
if (platRatio == null || platRatio.compareTo(BigDecimal.ZERO) <= 0) {
|
||||
platRatio = DEFAULT_PLAT_RATIO;
|
||||
platRatio = DEFAULT_PLATFORM_RATIO;
|
||||
}
|
||||
|
||||
return Pair.of(true, "");
|
||||
@ -479,6 +431,53 @@ public class LklSeparateWithTotalAmountDTO {
|
||||
return Pair.of(true, "");
|
||||
}
|
||||
|
||||
/**
|
||||
* 根据指定规则调整各参与方分账金额
|
||||
* 如果拉卡拉分账金额lklAmount>0:
|
||||
* 1. 如果agent2ndAmount>0 且大于lklAmount, 则agent2ndAmount=agent2ndAmount-lklAmount,mchAmount=mchAmount+lklAmount
|
||||
* 2. 如果agent2ndAmount<=0 但 agent1stAmount>0 且大于lklAmount, 则agent1stAmount=agent1stAmount-lklAmount,mchAmount=mchAmount+lklAmount
|
||||
* 3. 如果agent2ndAmount<=0 且 agent1stAmount<=0,但 platAmount>0 且大于等于lklAmount, 则 platAmount=platAmount-lklAmount,mchAmount=mchAmount+lklAmount
|
||||
*
|
||||
* @return Pair<Boolean, String> Boolean表示是否成功,String为错误信息
|
||||
*/
|
||||
private Pair<Boolean, String> adjustAmountsWithLklAmount() {
|
||||
try {
|
||||
// 只有当拉卡拉分账金额大于0时才执行调整逻辑
|
||||
if (lklAmount != null && lklAmount > 0) {
|
||||
int adjustment = lklAmount; // 需要调整的金额
|
||||
|
||||
// 情况1: 如果agent2ndAmount>0 且大于lklAmount
|
||||
if (agent2ndAmount != null && agent2ndAmount > 0 && agent2ndAmount > adjustment) {
|
||||
agent2ndAmount -= adjustment;
|
||||
mchAmount += adjustment;
|
||||
log.debug("调整二级代理商分账金额: 减少{},商家分账金额增加{}", adjustment, adjustment);
|
||||
}
|
||||
// 情况2: 如果agent2ndAmount<=0 但 agent1stAmount>0 且大于lklAmount
|
||||
else if ((agent2ndAmount == null || agent2ndAmount <= 0) &&
|
||||
agent1stAmount != null && agent1stAmount > 0 && agent1stAmount > adjustment) {
|
||||
agent1stAmount -= adjustment;
|
||||
mchAmount += adjustment;
|
||||
log.debug("调整一级代理商分账金额: 减少{},商家分账金额增加{}", adjustment, adjustment);
|
||||
}
|
||||
// 情况3: 如果agent2ndAmount<=0 且 agent1stAmount<=0,但 platAmount>0 且大于等于lklAmount
|
||||
else if ((agent2ndAmount == null || agent2ndAmount <= 0) &&
|
||||
(agent1stAmount == null || agent1stAmount <= 0) &&
|
||||
platAmount != null && platAmount > 0 && platAmount >= adjustment) {
|
||||
platAmount -= adjustment;
|
||||
mchAmount += adjustment;
|
||||
log.debug("调整平台分账金额: 减少{},商家分账金额增加{}", adjustment, adjustment);
|
||||
}
|
||||
// 其他情况不作调整
|
||||
else {
|
||||
log.debug("不满足调整条件,无需调整各参与方分账金额");
|
||||
}
|
||||
}
|
||||
|
||||
return Pair.of(true, "");
|
||||
} catch (Exception e) {
|
||||
return Pair.of(false, "调整分账金额时发生异常: " + e.getMessage());
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* 计算商家实际分账比例
|
||||
@ -492,9 +491,9 @@ public class LklSeparateWithTotalAmountDTO {
|
||||
.divide(BigDecimal.valueOf(totalSeparateAmount), 6, RoundingMode.HALF_UP);
|
||||
|
||||
// 如果计算出的实际比例低于阈值,打印日志并返回错误
|
||||
if (mchRatio.compareTo(MCH_RATIO_THRESHOLD) < 0) {
|
||||
if (mchRatio.compareTo(MIN_MERCHANT_RATIO_THRESHOLD) < 0) {
|
||||
String errorMsg = String.format("警告: 商家实际分账比例低于阈值,当前比例: %s,阈值: %s",
|
||||
mchRatio.toPlainString(), MCH_RATIO_THRESHOLD.toPlainString());
|
||||
mchRatio.toPlainString(), MIN_MERCHANT_RATIO_THRESHOLD.toPlainString());
|
||||
log.warn(errorMsg);
|
||||
return Pair.of(false, errorMsg);
|
||||
}
|
||||
|
||||
Loading…
Reference in New Issue
Block a user