package com.xiaopeng.account.schedule;
|
|
import cn.hutool.core.collection.CollUtil;
|
import com.xiaopeng.account.model.vo.XpAppUserCouponVo;
|
import com.xiaopeng.account.service.IXpAppUserCouponService;
|
import com.xiaopeng.api.feignClient.pushMessage.SubscribeMessageClient;
|
import com.xiaopeng.api.model.account.XpAppUserCoupon;
|
import com.xiaopeng.api.vo.pushMessage.SendSubscribeMessageVo;
|
import com.xiaopeng.common.core.enums.MessageTemplateEnum;
|
import com.xiaopeng.common.redis.service.RedisService;
|
import lombok.extern.slf4j.Slf4j;
|
import org.redisson.api.RLock;
|
import org.redisson.api.RedissonClient;
|
import org.springframework.scheduling.annotation.Scheduled;
|
import org.springframework.stereotype.Component;
|
|
import javax.annotation.Resource;
|
import java.math.BigDecimal;
|
import java.util.ArrayList;
|
import java.util.List;
|
import java.util.Map;
|
import java.util.concurrent.TimeUnit;
|
|
@Slf4j
|
@Component
|
public class AppUserCouponTask {
|
|
@Resource
|
private IXpAppUserCouponService xpAppUserCouponService;
|
@Resource
|
private SubscribeMessageClient subscribeMessageClient;
|
|
@Resource
|
private RedissonClient redissonClient;
|
|
/**
|
* 优惠卷过期 前 24 小时 发送微信通知
|
* 每5分钟执行一次
|
*/
|
@Scheduled(fixedRate = 60*1000)
|
public void appUserCoupon_expired() throws InterruptedException {
|
List<XpAppUserCoupon> list = xpAppUserCouponService.findListExpirationTime(null);
|
|
|
|
if(CollUtil.isNotEmpty( list)){
|
|
Map<Long, List<XpAppUserCoupon>> groupedByUserId = list.stream()
|
.collect(java.util.stream.Collectors.groupingBy(XpAppUserCoupon::getAppUserId));
|
|
for (Map.Entry<Long, List<XpAppUserCoupon>> entry : groupedByUserId.entrySet()) {
|
Long appUserId = entry.getKey();
|
RLock lock = redissonClient.getLock("app_user_coupon_expired_" + appUserId );
|
try {
|
if(lock.tryLock(0, 10, TimeUnit.SECONDS)){
|
List<Long> ids = new ArrayList<>();
|
BigDecimal money = BigDecimal.ZERO;
|
String couponName = "";
|
for (XpAppUserCoupon xpAppUserCoupon : entry.getValue()) {
|
ids.add(xpAppUserCoupon.getId());
|
if(money.compareTo(xpAppUserCoupon.getMoney())<0){
|
money = xpAppUserCoupon.getMoney();
|
couponName = xpAppUserCoupon.getCouponName();
|
}
|
}
|
//发送微信通知
|
SendSubscribeMessageVo msgVo = new SendSubscribeMessageVo();
|
msgVo.setUserId(appUserId);
|
msgVo.setTemplateId(MessageTemplateEnum.C.getTemplateId());
|
String json = MessageTemplateEnum.C.getRemarks();
|
json = json.replace("优惠券名称", couponName);
|
json = json.replace("XXX", money.toPlainString() );
|
msgVo.setJson(json);
|
subscribeMessageClient.sendSubscribeMessage(msgVo);
|
|
xpAppUserCouponService.updateExpirationTime(ids);
|
|
}
|
} catch (Exception e) {
|
log.error("优惠券过期发送微信通知失败", e);
|
} finally {
|
lock.unlock();
|
}
|
}
|
}
|
}
|
|
|
}
|