```
fix(task): 修复配送奖励计算逻辑并兼容多种录入方式 - 添加normalizeDeliveryRate方法处理配送费率兼容性问题 - 支持0.05表示5%(比例)和5表示5%(百分比)两种录入方式 - 移除查询条件中不必要的userId限制 - 重构奖励计算逻辑使用标准化后的费率进行计算 - 添加单价验证确保只有有效价格参与计算 - 优化订单行金额计算确保精确度 ```
This commit is contained in:
@@ -67,6 +67,22 @@ public class DealerCommissionUnfreeze10584Task {
|
||||
|
||||
private static final int FLOW_TYPE_DELIVERY_REWARD = 60; // 配送奖励(直接入可提现金额)
|
||||
|
||||
/**
|
||||
* 兼容两种录入方式:
|
||||
* - 0.05 表示 5%(比例)
|
||||
* - 5 表示 5%(百分比)
|
||||
*/
|
||||
private static BigDecimal normalizeDeliveryRate(BigDecimal rawRate) {
|
||||
if (rawRate == null || rawRate.signum() <= 0) {
|
||||
return null;
|
||||
}
|
||||
// 如果录入 >= 1,按“百分比”处理(1 => 1%)
|
||||
if (rawRate.compareTo(BigDecimal.ONE) >= 0) {
|
||||
return rawRate.movePointLeft(2);
|
||||
}
|
||||
return rawRate;
|
||||
}
|
||||
|
||||
@Resource
|
||||
private TransactionTemplate transactionTemplate;
|
||||
|
||||
@@ -212,7 +228,6 @@ public class DealerCommissionUnfreeze10584Task {
|
||||
new LambdaQueryWrapper<ShopDealerCapital>()
|
||||
.eq(ShopDealerCapital::getTenantId, TENANT_ID)
|
||||
.eq(ShopDealerCapital::getFlowType, FLOW_TYPE_DELIVERY_REWARD)
|
||||
.eq(ShopDealerCapital::getUserId, riderId)
|
||||
.eq(ShopDealerCapital::getOrderNo, orderNo)
|
||||
) > 0;
|
||||
if (already) {
|
||||
@@ -227,7 +242,6 @@ public class DealerCommissionUnfreeze10584Task {
|
||||
new LambdaQueryWrapper<ShopDealerCapital>()
|
||||
.eq(ShopDealerCapital::getTenantId, TENANT_ID)
|
||||
.eq(ShopDealerCapital::getFlowType, FLOW_TYPE_DELIVERY_REWARD)
|
||||
.eq(ShopDealerCapital::getUserId, riderId)
|
||||
.eq(ShopDealerCapital::getOrderNo, orderNo)
|
||||
.last("limit 1 for update")
|
||||
);
|
||||
@@ -278,11 +292,17 @@ public class DealerCommissionUnfreeze10584Task {
|
||||
if (qty <= 0) {
|
||||
continue;
|
||||
}
|
||||
BigDecimal unit = goodsDeliveryMoneyMap.getOrDefault(goodsId, BigDecimal.ZERO);
|
||||
if (unit.signum() <= 0) {
|
||||
BigDecimal rawRate = goodsDeliveryMoneyMap.getOrDefault(goodsId, BigDecimal.ZERO);
|
||||
BigDecimal rate = normalizeDeliveryRate(rawRate);
|
||||
if (rate == null || rate.signum() <= 0) {
|
||||
continue;
|
||||
}
|
||||
reward = reward.add(unit.multiply(BigDecimal.valueOf(qty)));
|
||||
BigDecimal unitPrice = og.getPrice() != null ? og.getPrice() : BigDecimal.ZERO;
|
||||
if (unitPrice.signum() <= 0) {
|
||||
continue;
|
||||
}
|
||||
BigDecimal lineAmount = unitPrice.multiply(BigDecimal.valueOf(qty));
|
||||
reward = reward.add(lineAmount.multiply(rate));
|
||||
}
|
||||
|
||||
reward = reward.setScale(2, RoundingMode.HALF_UP);
|
||||
|
||||
Reference in New Issue
Block a user