- 前言
- 一、DateUtil类
- 二、service层
- 三、task层
前言
对于实际项目中,当前时间超过了用户领取的优惠券的可使用时间,如何使得用户领取的优惠券自动过期的问题?
我们的思路是设置一个定时操作,异步执行一个方法,该方法是循环拿到优惠券,检查当前时间是否在使用时间范围内,若不在,则设置优惠券的状态属性为已过期。
提示:以下是本篇文章正文内容,下面案例可供参考
一、DateUtil类代码如下(示例):
public static boolean isEffectiveDate(Date nowTime, Date startTime, Date endTime) {
if (nowTime.getTime() == startTime.getTime()
|| nowTime.getTime() == endTime.getTime()) {
return true;
}
Calendar date = Calendar.getInstance();
date.setTime(nowTime);
Calendar begin = Calendar.getInstance();
begin.setTime(startTime);
Calendar end = Calendar.getInstance();
end.setTime(endTime);
if (date.after(begin) && date.before(end)) {
return true;
} else {
return false;
}
}
二、service层
代码如下(示例):
void runCouponsUserStatusTimeOutToExpired();
@Override
@Async
public void runCouponsUserStatusTimeOutToExpired() {
log.info("runCouponsUserStatusTimeOutToExpired start.......time={}",System.currentTimeMillis());
Long startTime01 = System.currentTimeMillis();
//查找到所有用户已领取,但未使用的用户券列表
List couponsUserList = findListByUseStatus(CouponsUserConstant.RECEIVE_STATE);
log.info("runCouponsUserStatusTimeOutToExpired couponsUserList.size={}",couponsUserList.size());
if (couponsUserList.size() > 0) {
List needCouponsUserList = new ArrayList<>();
Date currentDate = new Date();
for (int i = 0; i < couponsUserList.size(); i++) {
CouponsUser couponsUser = couponsUserList.get(i);
Date effDate = couponsUser.getEffDate();
Date expDate = couponsUser.getExpDate();
boolean isEffective = DateUtil.isEffectiveDate(currentDate, effDate, expDate);
//券已失效 则修改用户券的状态为已过期
if (!isEffective) {
couponsUser.setCancelTime(currentDate);
couponsUser.setUseStatus(CouponsUserConstant.EXPIRED_STATE);
needCouponsUserList.add(couponsUser); //需要更新状态的券
}
}
if (needCouponsUserList.size() > 0) {
log.info("runCouponsUserStatusTimeOutToExpired update needCouponsUserList.size={}",needCouponsUserList.size());
saveOrUpdateBatch(needCouponsUserList);
}
}
Long endTime02 = System.currentTimeMillis();
log.info("runCouponsUserStatusTimeOutToExpired end second={},mills={}",(endTime02-startTime01)/1000,(endTime02-startTime01)%1000);
}
三、task层
代码如下(示例):
@Configuration
@EnableScheduling
public class CouponsUserScheduleTask {
@Autowired
private CouponsUserService couponsUserService;
private static Logger log = LoggerFactory.getLogger(CouponsUserScheduleTask.class);
@Scheduled(cron = "0 0/1 * * * ?")//每3分 //crontab -e 动态代替应用命令
public void handlerCouponsUserStatusTimeOutToExpired(){
log.info("handlerCouponsUserStatusTimeOutToExpired start.......time={}",System.currentTimeMillis());
Long startTime01 = System.currentTimeMillis();
couponsUserService.runCouponsUserStatusTimeOutToExpired();
Long endTime02 = System.currentTimeMillis();
log.info("handlerCouponsUserStatusTimeOutToExpired end second={},mills={}",(endTime02-startTime01)/1000,(endTime02-startTime01)%1000);
}
}



