BUGFIX: 优惠券的佣金计算,统计时间边界问题优化

This commit is contained in:
2025-06-13 11:18:55 +08:00
parent 765d404845
commit 22e5a97143

View File

@@ -33,6 +33,7 @@ import javax.annotation.Resource;
import java.math.BigDecimal;
import java.math.RoundingMode;
import java.time.LocalDateTime;
import java.time.format.DateTimeFormatter;
import java.util.*;
import java.util.function.Function;
import java.util.stream.Collectors;
@@ -344,7 +345,7 @@ public class AffiliateServiceImpl extends ServiceImpl<AffiliateMapper, Affiliate
return baseMapper.selectOne(queryWrapper);
}
public void calcCouponsCommission() {
/*public void calcCouponsCommission() {
String lastTime = redisUtil.getFromString(RedisUtil.PAYMENT_INFO_LAST_SCAN_TIME);
log.info("优惠券佣金计算,上次执行时间:{}", lastTime);
String currentTime = LocalDateTime.now().toString();
@@ -380,6 +381,48 @@ public class AffiliateServiceImpl extends ServiceImpl<AffiliateMapper, Affiliate
// 4. 更新最后执行时间
redisUtil.addToString(RedisUtil.PAYMENT_INFO_LAST_SCAN_TIME, currentTime);
}*/
public void calcCouponsCommission() {
// 1. 获取并格式化时间
DateTimeFormatter formatter = DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss");
String lastTime = redisUtil.getFromString(RedisUtil.PAYMENT_INFO_LAST_SCAN_TIME);
log.info("优惠券佣金计算,上次执行时间:{}", lastTime);
// 2. 查询新增订单(使用>=和<
QueryWrapper<PaymentInfo> queryWrapper = new QueryWrapper<>();
queryWrapper.eq("trade_state", "paid")
.isNotNull("promotion_code");
if (!StringUtils.isNullOrEmpty(lastTime)) {
queryWrapper.ge("create_time", lastTime); // 关键修复:>=代替>
}
queryWrapper.lt("create_time", LocalDateTime.now().format(formatter));
List<PaymentInfo> paymentInfos = paymentInfoService.list(queryWrapper);
log.info("扫描时间范围: {} - {}, 新增订单数: {}",
lastTime, LocalDateTime.now().format(formatter), paymentInfos.size());
// 3. 按推广码汇总支付金额
Map<String, BigDecimal> codeAmount = paymentInfos.stream()
.collect(Collectors.toMap(
PaymentInfo::getPromotionCode,
payment -> new BigDecimal(payment.getPayerTotal()),
BigDecimal::add
));
// 4. 更新佣金数据
codeAmount.forEach((promotionCode, amount) -> {
ProductCoupons coupon = stripeService.getProductCoupon(promotionCode, null);
if (coupon != null) {
updateCouponCommission(coupon, amount);
productCouponsMapper.updateById(coupon);
}
});
// 5. 结束时更新Redis时间
String newLastTime = LocalDateTime.now().format(formatter);
redisUtil.addToString(RedisUtil.PAYMENT_INFO_LAST_SCAN_TIME, newLastTime);
}
/**