feat(payment): 支付与退款后清除景区统计缓存

- 在支付成功、取消、退款回调后增加缓存删除逻辑
- 新增 `invalidateStatisticsCache` 方法用于删除 Redis 缓存
- 定时任务中统计景区数据后也调用缓存清除方法
- 调整景区统计任务时间并扩展统计周期为近7天
- 增强定时任务日志记录和异常处理机制
This commit is contained in:
2025-10-31 13:46:17 +08:00
parent 785de52780
commit 631d5c175f
2 changed files with 76 additions and 14 deletions

View File

@@ -30,6 +30,7 @@ import com.ycwl.basic.service.pc.ScenicService;
import com.ycwl.basic.utils.SnowFlakeUtil;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.data.redis.core.RedisTemplate;
import org.springframework.stereotype.Service;
import jakarta.servlet.http.HttpServletRequest;
@@ -60,6 +61,8 @@ public class WxPayServiceImpl implements WxPayService {
private OrderMapper orderMapper;
@Autowired
private ScenicService scenicService;
@Autowired
private RedisTemplate<String, String> redisTemplate;
@Override
public Map<String, Object> createOrder(Long scenicId, WXPayOrderReqVO req) {
@@ -100,10 +103,14 @@ public class WxPayServiceImpl implements WxPayService {
long orderId = Long.parseLong(callbackResponse.getOrderNo());
if (callbackResponse.isPay()) {
orderBiz.paidOrder(orderId);
// 支付成功后删除统计缓存,确保下次查询获取最新数据
invalidateStatisticsCache(scenicId);
} else if (callbackResponse.isCancel()) {
orderBiz.cancelOrder(orderId);
} else if (callbackResponse.isRefund()) {
orderBiz.refundOrder(orderId);
// 退款后删除统计缓存
invalidateStatisticsCache(scenicId);
}
});
} catch (Exception e) {
@@ -165,6 +172,10 @@ public class WxPayServiceImpl implements WxPayService {
statisticsRecordAddReq.setScenicId(order.getScenicId());
statisticsRecordAddReq.setMorphId(orderId);
statisticsMapper.addStatisticsRecord(statisticsRecordAddReq);
// 退款成功后删除统计缓存,确保下次查询获取最新数据
invalidateStatisticsCache(scenicId);
return true;
} catch (Exception e) {
log.error("微信退款回调失败!", e);
@@ -180,4 +191,15 @@ public class WxPayServiceImpl implements WxPayService {
.setOrderNo(orderId);
scenicPayAdapter.cancelOrder(request);
}
/**
* 删除景区统计缓存
* 在支付或退款回调后调用,确保下次查询时重新计算统计数据
* @param scenicId 景区ID
*/
private void invalidateStatisticsCache(Long scenicId) {
String redisKey = "statistics:tmp_cache:" + scenicId;
Boolean deleted = redisTemplate.delete(redisKey);
log.info("[缓存删除] 景区 {} 的统计缓存删除结果: {}", scenicId, deleted);
}
}