创建定时任务类,couponIssueJobHandler
package com.tianji.promotion.task;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import com.tianji.common.utils.CollUtils;
import com.tianji.promotion.domain.po.Coupon;
import com.tianji.promotion.enums.CouponStatus;
import com.tianji.promotion.service.ICouponService;
import com.xxl.job.core.context.XxlJobHelper;
import com.xxl.job.core.handler.annotation.XxlJob;
import lombok.RequiredArgsConstructor;
import lombok.extern.slf4j.Slf4j;
import org.springframework.stereotype.Component;
import java.time.LocalDateTime;
import java.util.List;
/**
* 定时任务
*/
@Slf4j
@RequiredArgsConstructor
@Component
public class couponIssueJobHandler {
private final ICouponService couponService;
/**
* 定时开始或结束发放优惠券
*/
@XxlJob("couponIssueJobHandler")
public void IssueCoupon() {
// 1.获取分片信息,作为页码,每页最多查询 20条
int index = XxlJobHelper.getShardIndex() + 1;
int size = Integer.parseInt(XxlJobHelper.getJobParam());
// 2.查询未开始的优惠券
Page<Coupon> page = couponService.lambdaQuery()
.eq(Coupon::getStatus, CouponStatus.UN_ISSUE)
.le(Coupon::getTermBeginTime, LocalDateTime.now())
.page(new Page<>(index, size));
// 3.发放优惠券
List<Coupon> coupons = page.getRecords();
if (CollUtils.isEmpty(coupons)) {
return;
}
couponService.beginIssueBatch(coupons);
// 4.查询发放中的优惠券
Page<Coupon> pageEnd = couponService.lambdaQuery()
.eq(Coupon::getStatus, CouponStatus.ISSUING)
.ge(Coupon::getIssueEndTime, LocalDateTime.now())
.page(new Page<>(index, size));
List<Coupon> couponsEnd = pageEnd.getRecords();
//5、结束发放优惠券
if (CollUtils.isEmpty(couponsEnd)) {
return;
}
couponService.endIssueBatch(couponsEnd);
}
}
ICouponService
/**
* 定时开始发放优惠券
* @param coupons
*/
void beginIssueBatch(List<Coupon> coupons);
/**
* 定时结束发放优惠券
* @param couponsEnd
*/
void endIssueBatch(List<Coupon> couponsEnd);
CouponServiceImpl
/**
* 定时开始发放优惠券
* @param coupons
*/
@Override
public void beginIssueBatch(List<Coupon> coupons) {
//更新券状态为发放中
for (Coupon coupon : coupons) {
coupon.setStatus(CouponStatus.ISSUING);
}
this.updateBatchById(coupons);
}
/**
* 定时结束发放优惠券
* @param couponsEnd
*/
@Override
public void endIssueBatch(List<Coupon> couponsEnd) {
//更新券状态为发放结束
for (Coupon coupon : couponsEnd) {
coupon.setStatus(CouponStatus.FINISHED);
}
this.updateBatchById(couponsEnd);
}