diff --git a/accompany-business/accompany-business-service/src/main/java/com/accompany/business/service/medal/UserMedalService.java b/accompany-business/accompany-business-service/src/main/java/com/accompany/business/service/medal/UserMedalService.java index c01660e65..cb750b9b4 100644 --- a/accompany-business/accompany-business-service/src/main/java/com/accompany/business/service/medal/UserMedalService.java +++ b/accompany-business/accompany-business-service/src/main/java/com/accompany/business/service/medal/UserMedalService.java @@ -38,4 +38,8 @@ public interface UserMedalService extends IService { void useMedal(Long uid, Integer id, Byte useStatus); RBucket cacheUseMedal(Long uid); + + void doExpireCheck(); + + void vipExpireCheck(Long uid); } diff --git a/accompany-business/accompany-business-service/src/main/java/com/accompany/business/service/medal/impl/UserMedalServiceImpl.java b/accompany-business/accompany-business-service/src/main/java/com/accompany/business/service/medal/impl/UserMedalServiceImpl.java index 1f96ea218..6eeeba79c 100644 --- a/accompany-business/accompany-business-service/src/main/java/com/accompany/business/service/medal/impl/UserMedalServiceImpl.java +++ b/accompany-business/accompany-business-service/src/main/java/com/accompany/business/service/medal/impl/UserMedalServiceImpl.java @@ -1,18 +1,24 @@ package com.accompany.business.service.medal.impl; +import cn.hutool.core.util.StrUtil; +import com.accompany.business.constant.MedalConstant; import com.accompany.business.model.UserMedal; import com.accompany.business.model.medal.Medal; import com.accompany.business.mybatismapper.medal.UserMedalMapper; +import com.accompany.business.service.BaseSendService; import com.accompany.business.service.medal.MedalRecordService; import com.accompany.business.service.medal.MedalService; import com.accompany.business.service.medal.UserMedalService; +import com.accompany.business.util.VipUtil; import com.accompany.business.vo.medal.UserDetailMedalVo; import com.accompany.business.vo.medal.UserMedalVo; import com.accompany.common.constant.Constant; import com.accompany.common.status.BusiStatus; import com.accompany.common.utils.DateTimeUtil; import com.accompany.common.utils.StringUtils; +import com.accompany.core.enumeration.I18nAlertEnum; import com.accompany.core.exception.ServiceException; +import com.accompany.core.util.I18NMessageSourceUtil; import com.accompany.core.vo.BaseMedalVo; import com.alibaba.fastjson.JSONObject; import com.baomidou.mybatisplus.core.toolkit.Wrappers; @@ -21,7 +27,6 @@ import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; import lombok.extern.slf4j.Slf4j; import org.apache.commons.collections.CollectionUtils; import org.redisson.api.RBucket; -import org.redisson.api.RList; import org.redisson.api.RedissonClient; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Service; @@ -32,7 +37,6 @@ import java.util.*; import java.util.stream.Collectors; import static com.accompany.business.constant.MedalConstant.RedisKey.user_use_medal; -import static java.util.Collections.EMPTY_LIST; /** * @author: liaozetao @@ -49,6 +53,8 @@ public class UserMedalServiceImpl extends ServiceImpl loadAndCacheMedals(Long uid, Integer medalSeatNum) { - RBucket cacheUseMedal = this.cacheUseMedal(uid); - String s = cacheUseMedal.get(); - List baseMedalVos; - if (StringUtils.isNotEmpty(s)) { - if ("[]".equals(s)) { - return EMPTY_LIST; - } - baseMedalVos = JSONObject.parseObject(s, List.class); - } else { - List userMedals = this.listUseMedal(uid); - - if (CollectionUtils.isEmpty(userMedals)) { - cacheUseMedal.set("[]", Duration.ofDays(7)); - return EMPTY_LIST; - } - - List medalIds = userMedals.stream().map(UserMedal::getMedalId).collect(Collectors.toList()); - Map medalMap = medalService.getMedalMap(medalIds); - baseMedalVos = new ArrayList<>(); - for (UserMedal userMedal : userMedals) { - Medal medal = medalMap.get(userMedal.getMedalId()); - if (medal == null) { - continue; + List baseMedalVos = new ArrayList<>(); + try { + RBucket cacheUseMedal = this.cacheUseMedal(uid); + String s = cacheUseMedal.get(); + if (StringUtils.isNotEmpty(s)) { + if ("[]".equals(s)) { + return baseMedalVos; } - baseMedalVos.add(BaseMedalVo.builder() - .picUrl(medal.getPicUrl()) - .mp4Url(medal.getMp4Url()) - .build()); + baseMedalVos = JSONObject.parseObject(s, List.class); + } else { + List userMedals = this.listUseMedal(uid); + + if (CollectionUtils.isEmpty(userMedals)) { + cacheUseMedal.set("[]", Duration.ofDays(7)); + return baseMedalVos; + } + + List medalIds = userMedals.stream().map(UserMedal::getMedalId).collect(Collectors.toList()); + Map medalMap = medalService.getMedalMap(medalIds); + baseMedalVos = new ArrayList<>(); + for (UserMedal userMedal : userMedals) { + Medal medal = medalMap.get(userMedal.getMedalId()); + if (medal == null) { + continue; + } + baseMedalVos.add(BaseMedalVo.builder() + .picUrl(medal.getPicUrl()) + .mp4Url(medal.getMp4Url()) + .build()); + } + cacheUseMedal.set(JSONObject.toJSONString(baseMedalVos), Duration.ofDays(7)); } - cacheUseMedal.set(JSONObject.toJSONString(baseMedalVos), Duration.ofDays(7)); - } - if (baseMedalVos.size() > medalSeatNum) { - return baseMedalVos.subList(0, medalSeatNum); + if (baseMedalVos.size() > medalSeatNum) { + return baseMedalVos.subList(0, medalSeatNum); + } + } catch (Exception e) { + log.error("UserMedalServiceImpl.loadAndCacheMedals,uid:{},e:{}", uid, e.getMessage(), e); } return baseMedalVos; } @@ -209,6 +219,61 @@ public class UserMedalServiceImpl extends ServiceImpl expireList = list(Wrappers.lambdaQuery() + .eq(UserMedal::getMedalStatus, Constant.StatusV2.valid) + .lt(UserMedal::getExpireTime, now)); + if (CollectionUtils.isEmpty(expireList)) { + return; + } + for (UserMedal userMedal : expireList) { + userMedal.setMedalStatus(Constant.StatusV2.invalid); + userMedal.setUseStatus(Constant.StatusV2.invalid); + userMedal.setUpdateTime(new Date()); + } + updateBatchById(expireList); + for (UserMedal userMedal : expireList) { + Long uid = userMedal.getUid(); + this.cacheUseMedal(uid).delete(); + Medal medal = medalService.getById(userMedal.getMedalId()); + String name = I18NMessageSourceUtil.getMessage(Medal.class.getSimpleName() + StrUtil.DOT + medal.getName(), medal.getName(), uid); + String message = I18NMessageSourceUtil.getMessage(I18nAlertEnum.MEDAL_EXPIRE_MSG, new Object[]{name}, uid); + baseSendService.sendsecretaryMsg(userMedal.getUid(), message); + } + } + + @Override + public void vipExpireCheck(Long uid) { + List userMedals = this.listUseMedal(uid); + if (CollectionUtils.isEmpty(userMedals)) { + return; + } + Integer vipLevel = VipUtil.getVipLevel(uid); + String vipAuthItemValue = VipUtil.getVipAuthItemValue(vipLevel, Constant.VipAuthType.MEDAL_SEAT); + Integer medalSeatNum = Optional.ofNullable(vipAuthItemValue) + .map(Integer::valueOf) + .orElse(MedalConstant.MEDAL_SEAT_LIMIT); + + int size = userMedals.size(); + if (size <= medalSeatNum) { + return; + } + List updateList = new ArrayList<>(); + for (int i = 0; i < size; i++) { + if (i < medalSeatNum) { + continue; + } + UserMedal userMedal = userMedals.get(i); + userMedal.setUseStatus(Constant.StatusV2.invalid); + userMedal.setUpdateTime(new Date()); + updateList.add(userMedal); + } + updateBatchById(updateList); + this.loadAndCacheMedals(uid, medalSeatNum); + } + private UserDetailMedalVo transUserMedal2Vo(List userMedalList, Long uid) { List medalIdList = userMedalList.stream().map(UserMedal::getMedalId) diff --git a/accompany-business/accompany-business-service/src/main/java/com/accompany/business/service/vip/VipTaskService.java b/accompany-business/accompany-business-service/src/main/java/com/accompany/business/service/vip/VipTaskService.java index df83e3c11..7b83a96d8 100644 --- a/accompany-business/accompany-business-service/src/main/java/com/accompany/business/service/vip/VipTaskService.java +++ b/accompany-business/accompany-business-service/src/main/java/com/accompany/business/service/vip/VipTaskService.java @@ -11,6 +11,7 @@ package com.accompany.business.service.vip; import com.accompany.business.model.vip.VipInfo; +import com.accompany.business.service.medal.UserMedalService; import com.accompany.common.redis.RedisKey; import com.accompany.common.status.BusiStatus; import com.accompany.common.utils.StringUtils; @@ -52,6 +53,8 @@ public class VipTaskService { private VipReturnProfitRecordService vipReturnProfitRecordService; @Resource(name = "bizExecutor") private ThreadPoolExecutor bizExecutor; + @Autowired + private UserMedalService userMedalService; /** * 核销到期的会员 @@ -100,6 +103,7 @@ public class VipTaskService { throw new ServiceException(BusiStatus.SERVERBUSY, "贵族信息不存在"); } vipLevelBizService.doCancelVip(userVipInfo); + userMedalService.vipExpireCheck(userVipInfo.getUid()); } diff --git a/accompany-scheduler/accompany-scheduler-service/src/main/java/com/accompany/scheduler/task/dress/UserMedalTask.java b/accompany-scheduler/accompany-scheduler-service/src/main/java/com/accompany/scheduler/task/dress/UserMedalTask.java new file mode 100644 index 000000000..c21507988 --- /dev/null +++ b/accompany-scheduler/accompany-scheduler-service/src/main/java/com/accompany/scheduler/task/dress/UserMedalTask.java @@ -0,0 +1,25 @@ +package com.accompany.scheduler.task.dress; + +import com.accompany.business.service.medal.UserMedalService; +import lombok.extern.slf4j.Slf4j; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.scheduling.annotation.Scheduled; +import org.springframework.stereotype.Component; + +@Component +@Slf4j +public class UserMedalTask { + + @Autowired + private UserMedalService userMedalService; + + /** + * 核销到期的勋章 + */ + @Scheduled(cron = "0 0/10 * * * ?") + public void checkVip() { + userMedalService.doExpireCheck(); + } + + +}