From ce48bd00c9f0027ec6e2ef8b2be98259e003e9f7 Mon Sep 17 00:00:00 2001 From: Jerry Yan <792602257@qq.com> Date: Tue, 20 Jan 2026 17:11:20 +0800 Subject: [PATCH] =?UTF-8?q?feat(task):=20=E6=B7=BB=E5=8A=A0=E4=BC=98?= =?UTF-8?q?=E6=83=A0=E5=88=B8=E9=A2=86=E5=8F=96=E5=92=8C=E8=BF=87=E5=8D=8A?= =?UTF-8?q?=E6=8F=90=E9=86=92=E5=AE=9A=E6=97=B6=E4=BB=BB=E5=8A=A1?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - 新增优惠券领取通知定时任务,每小时执行一次查询最近2小时内领取的优惠券 - 新增优惠券有效期过半提醒定时任务,每天18点执行 - 引入ScenicRepository和ScenicV2DTO用于获取景区基础信息 - 修改processNotification方法提取公共逻辑到processRecords方法 - 在微信订阅消息变量中增加景区ID和景区名称字段 - 优化优惠券相关查询逻辑和数据处理流程 --- .../task/CouponExpireNotificationTask.java | 35 +++++++++++++++++++ 1 file changed, 35 insertions(+) diff --git a/src/main/java/com/ycwl/basic/task/CouponExpireNotificationTask.java b/src/main/java/com/ycwl/basic/task/CouponExpireNotificationTask.java index 05e596ee..8ea345b4 100644 --- a/src/main/java/com/ycwl/basic/task/CouponExpireNotificationTask.java +++ b/src/main/java/com/ycwl/basic/task/CouponExpireNotificationTask.java @@ -3,6 +3,7 @@ package com.ycwl.basic.task; import cn.hutool.core.date.DateUtil; import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; 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.model.pc.member.resp.MemberRespVO; 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.mapper.PriceCouponClaimRecordMapper; import com.ycwl.basic.pricing.mapper.PriceCouponConfigMapper; +import com.ycwl.basic.repository.ScenicRepository; import com.ycwl.basic.service.notify.WechatSubscribeNotifyTriggerService; import lombok.extern.slf4j.Slf4j; import org.springframework.beans.factory.annotation.Autowired; @@ -39,6 +41,8 @@ public class CouponExpireNotificationTask { private WechatSubscribeNotifyTriggerService notifyTriggerService; @Autowired private PriceCouponConfigMapper priceCouponConfigMapper; + @Autowired + private ScenicRepository scenicRepository; @Scheduled(cron = "0 0 20 * * *") public void sendCouponExpireNotification() { @@ -54,6 +58,31 @@ public class CouponExpireNotificationTask { 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 queryWrapper = Wrappers.lambdaQuery(); + queryWrapper.between(PriceCouponClaimRecord::getCreateTime, beginTime, endTime); + queryWrapper.eq(PriceCouponClaimRecord::getStatus, CouponStatus.CLAIMED); + + List 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) { // 获取指定偏移天数(例如-2 days)的开始和结束时间 Date date = DateUtil.offsetDay(new Date(), offsetDays); @@ -68,7 +97,10 @@ public class CouponExpireNotificationTask { queryWrapper.eq(PriceCouponClaimRecord::getStatus, CouponStatus.CLAIMED); List couponRecords = couponClaimRecordMapper.selectList(queryWrapper); + processRecords(couponRecords, notifyType); + } + private void processRecords(List couponRecords, String notifyType) { if (couponRecords == null || couponRecords.isEmpty()) { log.info("未找到符合条件的优惠券记录"); return; @@ -82,6 +114,7 @@ public class CouponExpireNotificationTask { if (member == null || member.getOpenId() == null) { continue; } + ScenicV2DTO scenicBasic = scenicRepository.getScenicBasic(member.getScenicId()); PriceCouponConfig coupon = priceCouponConfigMapper.selectValidCouponById(record.getCouponId()); HashMap variables = new HashMap<>(); @@ -91,6 +124,8 @@ public class CouponExpireNotificationTask { // 优惠券有效期到第二天的结束,从领取开始的时候算 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("scenicId", member.getScenicId()); + variables.put("scenicName", scenicBasic.getName()); WechatSubscribeNotifyTriggerRequest request = WechatSubscribeNotifyTriggerRequest.builder() .memberId(record.getUserId())