You've already forked FrameTour-BE
feat(task): 添加优惠券领取和过半提醒定时任务
- 新增优惠券领取通知定时任务,每小时执行一次查询最近2小时内领取的优惠券 - 新增优惠券有效期过半提醒定时任务,每天18点执行 - 引入ScenicRepository和ScenicV2DTO用于获取景区基础信息 - 修改processNotification方法提取公共逻辑到processRecords方法 - 在微信订阅消息变量中增加景区ID和景区名称字段 - 优化优惠券相关查询逻辑和数据处理流程
This commit is contained in:
@@ -3,6 +3,7 @@ package com.ycwl.basic.task;
|
|||||||
import cn.hutool.core.date.DateUtil;
|
import cn.hutool.core.date.DateUtil;
|
||||||
import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
|
import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
|
||||||
import com.baomidou.mybatisplus.core.toolkit.Wrappers;
|
import com.baomidou.mybatisplus.core.toolkit.Wrappers;
|
||||||
|
import com.ycwl.basic.integration.scenic.dto.scenic.ScenicV2DTO;
|
||||||
import com.ycwl.basic.mapper.MemberMapper;
|
import com.ycwl.basic.mapper.MemberMapper;
|
||||||
import com.ycwl.basic.model.pc.member.resp.MemberRespVO;
|
import com.ycwl.basic.model.pc.member.resp.MemberRespVO;
|
||||||
import com.ycwl.basic.model.pc.notify.req.WechatSubscribeNotifyTriggerRequest;
|
import com.ycwl.basic.model.pc.notify.req.WechatSubscribeNotifyTriggerRequest;
|
||||||
@@ -11,6 +12,7 @@ import com.ycwl.basic.pricing.entity.PriceCouponConfig;
|
|||||||
import com.ycwl.basic.pricing.enums.CouponStatus;
|
import com.ycwl.basic.pricing.enums.CouponStatus;
|
||||||
import com.ycwl.basic.pricing.mapper.PriceCouponClaimRecordMapper;
|
import com.ycwl.basic.pricing.mapper.PriceCouponClaimRecordMapper;
|
||||||
import com.ycwl.basic.pricing.mapper.PriceCouponConfigMapper;
|
import com.ycwl.basic.pricing.mapper.PriceCouponConfigMapper;
|
||||||
|
import com.ycwl.basic.repository.ScenicRepository;
|
||||||
import com.ycwl.basic.service.notify.WechatSubscribeNotifyTriggerService;
|
import com.ycwl.basic.service.notify.WechatSubscribeNotifyTriggerService;
|
||||||
import lombok.extern.slf4j.Slf4j;
|
import lombok.extern.slf4j.Slf4j;
|
||||||
import org.springframework.beans.factory.annotation.Autowired;
|
import org.springframework.beans.factory.annotation.Autowired;
|
||||||
@@ -39,6 +41,8 @@ public class CouponExpireNotificationTask {
|
|||||||
private WechatSubscribeNotifyTriggerService notifyTriggerService;
|
private WechatSubscribeNotifyTriggerService notifyTriggerService;
|
||||||
@Autowired
|
@Autowired
|
||||||
private PriceCouponConfigMapper priceCouponConfigMapper;
|
private PriceCouponConfigMapper priceCouponConfigMapper;
|
||||||
|
@Autowired
|
||||||
|
private ScenicRepository scenicRepository;
|
||||||
|
|
||||||
@Scheduled(cron = "0 0 20 * * *")
|
@Scheduled(cron = "0 0 20 * * *")
|
||||||
public void sendCouponExpireNotification() {
|
public void sendCouponExpireNotification() {
|
||||||
@@ -54,6 +58,31 @@ public class CouponExpireNotificationTask {
|
|||||||
log.info("优惠券临期提醒定时任务执行结束");
|
log.info("优惠券临期提醒定时任务执行结束");
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@Scheduled(cron = "0 30 10-22 * * *")
|
||||||
|
public void sendCouponReceivedNotification() {
|
||||||
|
log.info("开始执行优惠券领取通知定时任务");
|
||||||
|
Date now = new Date();
|
||||||
|
Date beginTime = DateUtil.offsetHour(now, -3);
|
||||||
|
Date endTime = DateUtil.offsetHour(now, -2);
|
||||||
|
|
||||||
|
log.info("查询时间范围: {} - {}", beginTime, endTime);
|
||||||
|
|
||||||
|
LambdaQueryWrapper<PriceCouponClaimRecord> queryWrapper = Wrappers.lambdaQuery();
|
||||||
|
queryWrapper.between(PriceCouponClaimRecord::getCreateTime, beginTime, endTime);
|
||||||
|
queryWrapper.eq(PriceCouponClaimRecord::getStatus, CouponStatus.CLAIMED);
|
||||||
|
|
||||||
|
List<PriceCouponClaimRecord> couponRecords = couponClaimRecordMapper.selectList(queryWrapper);
|
||||||
|
processRecords(couponRecords, "COUPON_NOTICE");
|
||||||
|
log.info("优惠券领取通知定时任务执行结束");
|
||||||
|
}
|
||||||
|
|
||||||
|
@Scheduled(cron = "0 0 18 * * *")
|
||||||
|
public void sendCouponPastHalfNotification() {
|
||||||
|
log.info("开始执行优惠券有效期过半提醒定时任务");
|
||||||
|
processNotification("COUPON_PAST_HALF", -1);
|
||||||
|
log.info("优惠券有效期过半提醒定时任务执行结束");
|
||||||
|
}
|
||||||
|
|
||||||
private void processNotification(String notifyType, int offsetDays) {
|
private void processNotification(String notifyType, int offsetDays) {
|
||||||
// 获取指定偏移天数(例如-2 days)的开始和结束时间
|
// 获取指定偏移天数(例如-2 days)的开始和结束时间
|
||||||
Date date = DateUtil.offsetDay(new Date(), offsetDays);
|
Date date = DateUtil.offsetDay(new Date(), offsetDays);
|
||||||
@@ -68,7 +97,10 @@ public class CouponExpireNotificationTask {
|
|||||||
queryWrapper.eq(PriceCouponClaimRecord::getStatus, CouponStatus.CLAIMED);
|
queryWrapper.eq(PriceCouponClaimRecord::getStatus, CouponStatus.CLAIMED);
|
||||||
|
|
||||||
List<PriceCouponClaimRecord> couponRecords = couponClaimRecordMapper.selectList(queryWrapper);
|
List<PriceCouponClaimRecord> couponRecords = couponClaimRecordMapper.selectList(queryWrapper);
|
||||||
|
processRecords(couponRecords, notifyType);
|
||||||
|
}
|
||||||
|
|
||||||
|
private void processRecords(List<PriceCouponClaimRecord> couponRecords, String notifyType) {
|
||||||
if (couponRecords == null || couponRecords.isEmpty()) {
|
if (couponRecords == null || couponRecords.isEmpty()) {
|
||||||
log.info("未找到符合条件的优惠券记录");
|
log.info("未找到符合条件的优惠券记录");
|
||||||
return;
|
return;
|
||||||
@@ -82,6 +114,7 @@ public class CouponExpireNotificationTask {
|
|||||||
if (member == null || member.getOpenId() == null) {
|
if (member == null || member.getOpenId() == null) {
|
||||||
continue;
|
continue;
|
||||||
}
|
}
|
||||||
|
ScenicV2DTO scenicBasic = scenicRepository.getScenicBasic(member.getScenicId());
|
||||||
PriceCouponConfig coupon = priceCouponConfigMapper.selectValidCouponById(record.getCouponId());
|
PriceCouponConfig coupon = priceCouponConfigMapper.selectValidCouponById(record.getCouponId());
|
||||||
|
|
||||||
HashMap<String, Object> variables = new HashMap<>();
|
HashMap<String, Object> variables = new HashMap<>();
|
||||||
@@ -91,6 +124,8 @@ public class CouponExpireNotificationTask {
|
|||||||
// 优惠券有效期到第二天的结束,从领取开始的时候算
|
// 优惠券有效期到第二天的结束,从领取开始的时候算
|
||||||
variables.put("couponStartTime", DateUtil.format(record.getCreateTime(), "yyyy-MM-dd HH:mm"));
|
variables.put("couponStartTime", DateUtil.format(record.getCreateTime(), "yyyy-MM-dd HH:mm"));
|
||||||
variables.put("couponExpireTime", DateUtil.format(DateUtil.endOfDay(DateUtil.offsetDay(record.getCreateTime(), 2)), "yyyy-MM-dd HH:mm"));
|
variables.put("couponExpireTime", DateUtil.format(DateUtil.endOfDay(DateUtil.offsetDay(record.getCreateTime(), 2)), "yyyy-MM-dd HH:mm"));
|
||||||
|
variables.put("scenicId", member.getScenicId());
|
||||||
|
variables.put("scenicName", scenicBasic.getName());
|
||||||
|
|
||||||
WechatSubscribeNotifyTriggerRequest request = WechatSubscribeNotifyTriggerRequest.builder()
|
WechatSubscribeNotifyTriggerRequest request = WechatSubscribeNotifyTriggerRequest.builder()
|
||||||
.memberId(record.getUserId())
|
.memberId(record.getUserId())
|
||||||
|
|||||||
Reference in New Issue
Block a user