fix(task): 修复配送奖励计算逻辑并兼容多种录入方式

- 添加normalizeDeliveryRate方法处理配送费率兼容性问题
- 支持0.05表示5%(比例)和5表示5%(百分比)两种录入方式
- 移除查询条件中不必要的userId限制
- 重构奖励计算逻辑使用标准化后的费率进行计算
- 添加单价验证确保只有有效价格参与计算
- 优化订单行金额计算确保精确度
```
This commit is contained in:
2026-02-24 16:40:40 +08:00
parent e7ba0626cd
commit bb45d4b96e

View File

@@ -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);