From 9ad34d1310ccecb5b4c3dba775abb25d26ad0db6 Mon Sep 17 00:00:00 2001 From: hokli <2629910752@qq.com> Date: Mon, 9 Jun 2025 18:30:24 +0800 Subject: [PATCH] =?UTF-8?q?=E6=88=91=E7=9A=84=E5=8B=8B=E7=AB=A0,=E4=BD=BF?= =?UTF-8?q?=E7=94=A8=E7=9A=84=E5=8B=8B=E7=AB=A0=E7=BC=93=E5=AD=98=EF=BC=8C?= =?UTF-8?q?=E5=8B=8B=E7=AB=A0=E7=AE=A1=E7=90=86=E9=A1=B5=E9=9D=A2?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../com/accompany/core/vo/BaseMedalVo.java | 16 ++ .../java/com/accompany/core/vo/UserVo.java | 3 + .../business/constant/MedalConstant.java | 15 ++ .../accompany/business/model/UserMedal.java | 5 + .../business/vo/medal/MedalManageVo.java | 22 ++ .../business/vo/medal/MedalSeriesMineVo.java | 7 + .../business/vo/medal/MedalSeriesRefVo.java | 6 + .../business/vo/medal/UserMedalVo.java | 3 + .../business/vo/medal/VipMedalSeatVo.java | 15 ++ .../service/medal/MedalSeriesRefService.java | 2 + .../service/medal/MedalSeriesService.java | 2 +- .../medal/MedalSeriesSquareService.java | 233 ++++++++++++++++-- .../service/medal/UserMedalService.java | 16 ++ .../medal/impl/MedalSeriesRefServiceImpl.java | 7 + .../medal/impl/MedalSeriesServiceImpl.java | 3 +- .../medal/impl/UserMedalServiceImpl.java | 131 ++++++++-- .../com/accompany/business/util/VipUtil.java | 7 +- .../controller/MedalSeriesController.java | 44 +++- .../controller/user/UsersController.java | 4 + 19 files changed, 493 insertions(+), 48 deletions(-) create mode 100644 accompany-base/accompany-basic/accompany-basic-sdk/src/main/java/com/accompany/core/vo/BaseMedalVo.java create mode 100644 accompany-business/accompany-business-sdk/src/main/java/com/accompany/business/vo/medal/MedalManageVo.java create mode 100644 accompany-business/accompany-business-sdk/src/main/java/com/accompany/business/vo/medal/VipMedalSeatVo.java diff --git a/accompany-base/accompany-basic/accompany-basic-sdk/src/main/java/com/accompany/core/vo/BaseMedalVo.java b/accompany-base/accompany-basic/accompany-basic-sdk/src/main/java/com/accompany/core/vo/BaseMedalVo.java new file mode 100644 index 000000000..c88e0d4f7 --- /dev/null +++ b/accompany-base/accompany-basic/accompany-basic-sdk/src/main/java/com/accompany/core/vo/BaseMedalVo.java @@ -0,0 +1,16 @@ +package com.accompany.core.vo; + +import lombok.AllArgsConstructor; +import lombok.Builder; +import lombok.Data; +import lombok.NoArgsConstructor; + +@Builder +@NoArgsConstructor +@AllArgsConstructor +@Data +public class BaseMedalVo { + private String picUrl; + private String mp4Url; + private String seq; +} diff --git a/accompany-base/accompany-basic/accompany-basic-sdk/src/main/java/com/accompany/core/vo/UserVo.java b/accompany-base/accompany-basic/accompany-basic-sdk/src/main/java/com/accompany/core/vo/UserVo.java index 38a4417e4..6a746184f 100644 --- a/accompany-base/accompany-basic/accompany-basic-sdk/src/main/java/com/accompany/core/vo/UserVo.java +++ b/accompany-base/accompany-basic/accompany-basic-sdk/src/main/java/com/accompany/core/vo/UserVo.java @@ -12,6 +12,7 @@ import com.accompany.core.vo.vip.UserVipInfoVO; import io.swagger.annotations.ApiModelProperty; import lombok.Data; +import java.util.ArrayList; import java.util.Date; import java.util.List; @@ -239,4 +240,6 @@ public class UserVo { private Long inviteUid; private Long inviteErbanNo; + + private List medalsPic = new ArrayList<>(); } diff --git a/accompany-business/accompany-business-sdk/src/main/java/com/accompany/business/constant/MedalConstant.java b/accompany-business/accompany-business-sdk/src/main/java/com/accompany/business/constant/MedalConstant.java index 6154d583f..a651324f4 100644 --- a/accompany-business/accompany-business-sdk/src/main/java/com/accompany/business/constant/MedalConstant.java +++ b/accompany-business/accompany-business-sdk/src/main/java/com/accompany/business/constant/MedalConstant.java @@ -1,7 +1,22 @@ package com.accompany.business.constant; +import com.accompany.common.redis.BaseRedisKey; +import com.accompany.common.redis.RedisKey; + public interface MedalConstant { + enum RedisKey implements BaseRedisKey { + user_use_medal, + ; + + @Override + public String getKey() { + return "mdeal:" + name(); + } + } + + int MEDAL_SEAT_LIMIT = 3; + enum MedalType { TASK(1, "任务勋章"), ACTIVITY(2, "活动勋章"), diff --git a/accompany-business/accompany-business-sdk/src/main/java/com/accompany/business/model/UserMedal.java b/accompany-business/accompany-business-sdk/src/main/java/com/accompany/business/model/UserMedal.java index 0abecf207..5c52eabc7 100644 --- a/accompany-business/accompany-business-sdk/src/main/java/com/accompany/business/model/UserMedal.java +++ b/accompany-business/accompany-business-sdk/src/main/java/com/accompany/business/model/UserMedal.java @@ -43,4 +43,9 @@ public class UserMedal { */ private Date updateTime; + /** + * 使用时间 + */ + private Date useTime; + } \ No newline at end of file diff --git a/accompany-business/accompany-business-sdk/src/main/java/com/accompany/business/vo/medal/MedalManageVo.java b/accompany-business/accompany-business-sdk/src/main/java/com/accompany/business/vo/medal/MedalManageVo.java new file mode 100644 index 000000000..820a8c2c5 --- /dev/null +++ b/accompany-business/accompany-business-sdk/src/main/java/com/accompany/business/vo/medal/MedalManageVo.java @@ -0,0 +1,22 @@ +package com.accompany.business.vo.medal; + +import io.swagger.annotations.ApiModel; +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; + +import java.util.List; + +@ApiModel +@Data +public class MedalManageVo { + @ApiModelProperty("使用的勋章") + private List useMedals; + @ApiModelProperty("vip对应的勋章席位数量(勋章佩戴管理使用)") + private List vipMedalSeatVos; + @ApiModelProperty("全部获得的未过期的勋章(勋章佩戴管理使用)") + private List allMedals; + @ApiModelProperty("vip等级") + private Integer vipLevel; + @ApiModelProperty("勋章数量") + private Long medalNum; +} diff --git a/accompany-business/accompany-business-sdk/src/main/java/com/accompany/business/vo/medal/MedalSeriesMineVo.java b/accompany-business/accompany-business-sdk/src/main/java/com/accompany/business/vo/medal/MedalSeriesMineVo.java index fa172fb61..781f51268 100644 --- a/accompany-business/accompany-business-sdk/src/main/java/com/accompany/business/vo/medal/MedalSeriesMineVo.java +++ b/accompany-business/accompany-business-sdk/src/main/java/com/accompany/business/vo/medal/MedalSeriesMineVo.java @@ -9,6 +9,13 @@ import java.util.List; @ApiModel @Data public class MedalSeriesMineVo { + private Long erbanNo; + private Long uid; + private String nick; + private String avatar; + + @ApiModelProperty("获得的勋章数量") + private Long medalNum; @ApiModelProperty("勋章系列") private List medalSeries; @ApiModelProperty("使用的勋章") diff --git a/accompany-business/accompany-business-sdk/src/main/java/com/accompany/business/vo/medal/MedalSeriesRefVo.java b/accompany-business/accompany-business-sdk/src/main/java/com/accompany/business/vo/medal/MedalSeriesRefVo.java index a1d80b804..04bcea36d 100644 --- a/accompany-business/accompany-business-sdk/src/main/java/com/accompany/business/vo/medal/MedalSeriesRefVo.java +++ b/accompany-business/accompany-business-sdk/src/main/java/com/accompany/business/vo/medal/MedalSeriesRefVo.java @@ -17,6 +17,8 @@ public class MedalSeriesRefVo { @ApiModelProperty("勋章描述") @I18n(className = "Medal", fieldName = "medalDesc") private String medalDesc; + @ApiModelProperty("记录id,使用勋章时使用") + private Integer id; @ApiModelProperty("勋章静态图") @ReplaceAppDomain private String picUrl; @@ -27,4 +29,8 @@ public class MedalSeriesRefVo { private Integer level; @ApiModelProperty("是否佩戴") private Boolean useStatus; + @ApiModelProperty("是否获得") + private Boolean hasGain; + @ApiModelProperty("过期时间,距离现在还剩多少秒") + private Long expireSeconds; } diff --git a/accompany-business/accompany-business-sdk/src/main/java/com/accompany/business/vo/medal/UserMedalVo.java b/accompany-business/accompany-business-sdk/src/main/java/com/accompany/business/vo/medal/UserMedalVo.java index d11dcbb44..ccd541f3b 100644 --- a/accompany-business/accompany-business-sdk/src/main/java/com/accompany/business/vo/medal/UserMedalVo.java +++ b/accompany-business/accompany-business-sdk/src/main/java/com/accompany/business/vo/medal/UserMedalVo.java @@ -18,6 +18,9 @@ public class UserMedalVo { //图片地址 @ReplaceAppDomain private String picUrl; + //图片地址 + @ReplaceAppDomain + private String mp4Url; //排序权重 private Integer seq; //领取时间 diff --git a/accompany-business/accompany-business-sdk/src/main/java/com/accompany/business/vo/medal/VipMedalSeatVo.java b/accompany-business/accompany-business-sdk/src/main/java/com/accompany/business/vo/medal/VipMedalSeatVo.java new file mode 100644 index 000000000..7caf94ccf --- /dev/null +++ b/accompany-business/accompany-business-sdk/src/main/java/com/accompany/business/vo/medal/VipMedalSeatVo.java @@ -0,0 +1,15 @@ +package com.accompany.business.vo.medal; + +import lombok.AllArgsConstructor; +import lombok.Builder; +import lombok.Data; +import lombok.NoArgsConstructor; + +@Builder +@AllArgsConstructor +@NoArgsConstructor +@Data +public class VipMedalSeatVo { + private Integer vipLevel; + private Integer medalSeatNum; +} diff --git a/accompany-business/accompany-business-service/src/main/java/com/accompany/business/service/medal/MedalSeriesRefService.java b/accompany-business/accompany-business-service/src/main/java/com/accompany/business/service/medal/MedalSeriesRefService.java index e10e97958..86040a7f8 100644 --- a/accompany-business/accompany-business-service/src/main/java/com/accompany/business/service/medal/MedalSeriesRefService.java +++ b/accompany-business/accompany-business-service/src/main/java/com/accompany/business/service/medal/MedalSeriesRefService.java @@ -14,4 +14,6 @@ import java.util.List; public interface MedalSeriesRefService extends IService { List listBySeriesIds(List seriesIds); + + List listByMedalIds(List medalIds); } diff --git a/accompany-business/accompany-business-service/src/main/java/com/accompany/business/service/medal/MedalSeriesService.java b/accompany-business/accompany-business-service/src/main/java/com/accompany/business/service/medal/MedalSeriesService.java index 4750ccf3b..196131e29 100644 --- a/accompany-business/accompany-business-service/src/main/java/com/accompany/business/service/medal/MedalSeriesService.java +++ b/accompany-business/accompany-business-service/src/main/java/com/accompany/business/service/medal/MedalSeriesService.java @@ -18,5 +18,5 @@ public interface MedalSeriesService extends IService { List listSquareValid(Integer partitionId, Integer type, Integer pageNo, Integer pageSize); - List listBySeriesIds(List seriesIds, Integer pageNo, Integer pageSize); + List listBySeriesIds(List seriesIds, Integer type, Integer pageNo, Integer pageSize); } diff --git a/accompany-business/accompany-business-service/src/main/java/com/accompany/business/service/medal/MedalSeriesSquareService.java b/accompany-business/accompany-business-service/src/main/java/com/accompany/business/service/medal/MedalSeriesSquareService.java index 455466a3e..08c101f61 100644 --- a/accompany-business/accompany-business-service/src/main/java/com/accompany/business/service/medal/MedalSeriesSquareService.java +++ b/accompany-business/accompany-business-service/src/main/java/com/accompany/business/service/medal/MedalSeriesSquareService.java @@ -1,25 +1,30 @@ package com.accompany.business.service.medal; +import cn.hutool.core.date.DateUnit; +import cn.hutool.core.date.DateUtil; +import com.accompany.business.model.UserMedal; import com.accompany.business.model.medal.Medal; import com.accompany.business.model.medal.MedalSeries; import com.accompany.business.model.medal.MedalSeriesRef; +import com.accompany.business.model.vip.VipAuthItem; import com.accompany.business.service.user.UsersService; -import com.accompany.business.vo.medal.MedalSeriesRefVo; -import com.accompany.business.vo.medal.MedalSeriesSquareVo; -import com.accompany.business.vo.medal.MedalSeriesVo; +import com.accompany.business.service.vip.VipAuthItemService; +import com.accompany.business.util.VipUtil; +import com.accompany.business.vo.medal.*; +import com.accompany.common.constant.Constant; +import com.accompany.common.status.BusiStatus; import com.accompany.core.exception.ServiceException; import com.accompany.core.model.Users; +import com.accompany.core.util.StringUtils; import lombok.Data; import org.apache.commons.collections.CollectionUtils; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Service; -import java.util.ArrayList; -import java.util.List; -import java.util.Map; -import java.util.Objects; +import java.util.*; import java.util.stream.Collectors; +import static com.accompany.business.constant.MedalConstant.MEDAL_SEAT_LIMIT; import static com.accompany.common.status.BusiStatus.SERIES_CONFIG_ERROR; @Service @@ -34,13 +39,18 @@ public class MedalSeriesSquareService { private MedalService medalService; @Autowired private UsersService usersService; + @Autowired + private UserMedalService userMedalService; + @Autowired + private VipAuthItemService vipAuthItemService; public List seriesSquareVos(Long uid, Integer type, Integer pageNo, Integer pageSize) { + List resultList = new ArrayList<>(); Users users = usersService.getUsersByUid(uid); Integer partitionId = users.getPartitionId(); - List resultList = new ArrayList<>(); List medalSeries = medalSeriesService.listSquareValid(partitionId, type, pageNo, pageSize); + if (CollectionUtils.isEmpty(medalSeries)) { return resultList; } @@ -49,38 +59,187 @@ public class MedalSeriesSquareService { .stream() .map(MedalSeries::getSeriesId) .collect(Collectors.toList()); - List medalSeriesRefs = medalSeriesRefService.listBySeriesIds(seriesIds); + if (CollectionUtils.isEmpty(medalSeriesRefs)) { throw new ServiceException(SERIES_CONFIG_ERROR); } + List medalIds = medalSeriesRefs .stream() .map(MedalSeriesRef::getMedalId) .collect(Collectors.toList()); - Map medalMap = medalService.getMedalMap(medalIds); - Map> typeMap = medalSeries - .stream() + Map> typeMap = medalSeries.stream() .collect(Collectors.groupingBy(MedalSeries::getType));//分类 - Map> refMap = medalSeriesRefs - .stream() + Map> refMap = medalSeriesRefs.stream() .collect(Collectors.groupingBy(MedalSeriesRef::getSeriesId));//分系列 return typeMap.entrySet().stream() - .map(entry -> buildSquareVo(entry.getKey(), entry.getValue(), refMap, medalMap)) + .map(entry -> buildSquareVo(entry.getKey(), entry.getValue(), refMap, medalMap, null)) .filter(Objects::nonNull) .collect(Collectors.toList()); } + public MedalSeriesMineVo mine(Long uid, Integer type, Integer pageNo, Integer pageSize) { + MedalSeriesMineVo mineVo = new MedalSeriesMineVo(); + List medalSeries = new ArrayList<>(); + mineVo.setMedalSeries(medalSeries); + mineVo.setUseMedals(mineUse(uid)); + + Users users = usersService.getUsersByUid(uid); + mineVo.setNick(users.getNick()); + mineVo.setAvatar(users.getAvatar()); + mineVo.setErbanNo(users.getErbanNo()); + mineVo.setUid(uid); + + List userMedals = userMedalService.listValidMedal(uid, -1, -1); + if (CollectionUtils.isEmpty(userMedals)) { + return mineVo; + } + + mineVo.setMedalNum(userMedalService.countValidMedal(uid)); + + Map selfMedalMap = userMedals.stream() + .collect(Collectors.toMap(UserMedal::getMedalId, x -> x)); + + List medalIds = userMedals.stream() + .map(UserMedal::getMedalId) + .collect(Collectors.toList()); + List seriesRefs = medalSeriesRefService.listByMedalIds(medalIds); + + if (CollectionUtils.isEmpty(seriesRefs)) { + return mineVo; + } + + List seriesIds = seriesRefs.stream() + .map(MedalSeriesRef::getSeriesId) + .collect(Collectors.toList()); + List series = medalSeriesService.listBySeriesIds(seriesIds, type, pageNo, pageSize); + + if (CollectionUtils.isEmpty(series)) { + return mineVo; + } + + List medalSeriesRefs = medalSeriesRefService.listBySeriesIds(seriesIds); + if (CollectionUtils.isEmpty(medalSeriesRefs)) { + throw new ServiceException(SERIES_CONFIG_ERROR); + } + List allMedalIds = medalSeriesRefs + .stream() + .map(MedalSeriesRef::getMedalId) + .collect(Collectors.toList()); + Map medalMap = medalService.getMedalMap(allMedalIds); + + Map> typeMap = series.stream() + .collect(Collectors.groupingBy(MedalSeries::getType));//分类 + + Map> refMap = medalSeriesRefs.stream() + .collect(Collectors.groupingBy(MedalSeriesRef::getSeriesId));//分系列 + + medalSeries = typeMap.entrySet().stream() + .map(entry -> buildSquareVo(entry.getKey(), entry.getValue(), refMap, medalMap, selfMedalMap)) + .filter(Objects::nonNull) + .collect(Collectors.toList()); + mineVo.setMedalSeries(medalSeries); + + return mineVo; + } + + /** + * 使用的勋章列表 + * @param uid + * @return + */ + public List mineUse(Long uid) { + List resultList = new ArrayList<>(); + + List userMedals = userMedalService.listUseMedal(uid); + if (CollectionUtils.isEmpty(userMedals)) { + return resultList; + } + + List medalIds = userMedals.stream() + .map(UserMedal::getMedalId) + .collect(Collectors.toList()); + Map medalMap = medalService.getMedalMap(medalIds); + for (UserMedal userMedal : userMedals) { + Medal medal = medalMap.get(userMedal.getMedalId()); + MedalSeriesRefVo vo = new MedalSeriesRefVo(); + vo.setMedalDesc(medal.getMedalDesc()); + vo.setMedalId(medal.getId()); + vo.setPicUrl(medal.getPicUrl()); + vo.setMp4Url(medal.getMp4Url()); + vo.setName(medal.getName()); + vo.setHasGain(Boolean.TRUE); + vo.setUseStatus(userMedal.getUseStatus() == 1); + vo.setExpireSeconds(DateUtil.between(new Date(), userMedal.getExpireTime(), DateUnit.SECOND, false)); + } + return resultList; + } + + /** + * 用户全部的的勋章列表 + * @param uid + * @return + */ + public MedalManageVo mineAll(Long uid, Integer pageNo, Integer pageSize) { + MedalManageVo medalManageVo = new MedalManageVo(); + List allMedals = new ArrayList<>(); + medalManageVo.setAllMedals(allMedals); + medalManageVo.setUseMedals(this.mineUse(uid)); + medalManageVo.setVipMedalSeatVos(this.vipMedalSeatVos()); + + Integer vipLevel = VipUtil.getVipLevel(uid); + medalManageVo.setVipLevel(vipLevel); + medalManageVo.setMedalNum(userMedalService.countValidMedal(uid)); + List userMedals = userMedalService.listValidMedal(uid, pageNo, pageSize); + if (CollectionUtils.isEmpty(userMedals)) { + return medalManageVo; + } + List medalIds = userMedals.stream() + .map(UserMedal::getMedalId) + .collect(Collectors.toList()); + Map medalMap = medalService.getMedalMap(medalIds); + for (UserMedal userMedal : userMedals) { + Medal medal = medalMap.get(userMedal.getMedalId()); + MedalSeriesRefVo vo = new MedalSeriesRefVo(); + vo.setMedalDesc(medal.getMedalDesc()); + vo.setMedalId(medal.getId()); + vo.setPicUrl(medal.getPicUrl()); + vo.setMp4Url(medal.getMp4Url()); + vo.setName(medal.getName()); + vo.setHasGain(Boolean.TRUE); + vo.setUseStatus(userMedal.getUseStatus() == 1); + vo.setExpireSeconds(DateUtil.between(new Date(), userMedal.getExpireTime(), DateUnit.SECOND, false)); + allMedals.add(vo); + } + return medalManageVo; + } + + public void useMedal(Long uid, Integer id, Byte useStatus) { + Integer vipLevel = VipUtil.getVipLevel(uid); + String vipAuthItemValue = VipUtil.getVipAuthItemValue(vipLevel, Constant.VipAuthType.MEDAL_SEAT); + Integer medalSeatLimit = MEDAL_SEAT_LIMIT; + if (StringUtils.isNotEmpty(vipAuthItemValue)) { + medalSeatLimit = Integer.valueOf(vipAuthItemValue); + } + List userMedals = userMedalService.listUseMedal(uid); + if (Constant.StatusV2.valid.equals(useStatus) && medalSeatLimit <= userMedals.size()) { + throw new ServiceException(BusiStatus.SERIES_MEDAL_LIMIT); + } + userMedalService.useMedal(uid, id, useStatus); + } + private MedalSeriesSquareVo buildSquareVo(Integer type, List seriesList, Map> refMap, - Map medalMap) { + Map medalMap, + Map selfMedalMap) { List medalSeriesVos = seriesList.stream() - .map(series -> buildSeriesVo(series, refMap.get(series.getSeriesId()), medalMap)) + .map(series -> buildSeriesVo(series, refMap.get(series.getSeriesId()), medalMap, selfMedalMap)) .filter(Objects::nonNull) .collect(Collectors.toList()); @@ -96,13 +255,14 @@ public class MedalSeriesSquareService { private MedalSeriesVo buildSeriesVo(MedalSeries series, List seriesRefs, - Map medalMap) { + Map medalMap, + Map selfMedalMap) { if (CollectionUtils.isEmpty(seriesRefs)) { return null; } List medalVos = seriesRefs.stream() - .map(ref -> buildMedalVo(ref, medalMap.get(ref.getMedalId()))) + .map(ref -> buildMedalVo(ref, medalMap.get(ref.getMedalId()), selfMedalMap)) .filter(Objects::nonNull) .collect(Collectors.toList()); @@ -117,7 +277,8 @@ public class MedalSeriesSquareService { return medalSeriesVo; } - private MedalSeriesRefVo buildMedalVo(MedalSeriesRef seriesRef, Medal medal) { + private MedalSeriesRefVo buildMedalVo(MedalSeriesRef seriesRef, Medal medal, + Map selfMedalMap) { if (medal == null) { return null; } @@ -129,9 +290,41 @@ public class MedalSeriesSquareService { vo.setPicUrl(medal.getPicUrl()); vo.setMp4Url(medal.getMp4Url()); vo.setName(medal.getName()); + + Optional.ofNullable(selfMedalMap) + .map(map -> map.get(medal.getId())) + .ifPresentOrElse( + userMedal -> { + vo.setHasGain(Boolean.TRUE); + vo.setUseStatus(userMedal.getUseStatus() == 1); + vo.setExpireSeconds(DateUtil.between(new Date(), userMedal.getExpireTime(), DateUnit.SECOND, false)); + }, + () -> { + vo.setHasGain(Boolean.FALSE); + vo.setUseStatus(Boolean.FALSE); + vo.setExpireSeconds(0L); + } + ); return vo; } + private List vipMedalSeatVos() { + List resultList = new ArrayList<>(); + + List authItems = vipAuthItemService.listValidItemByAuthType(Constant.VipAuthType.MEDAL_SEAT); + if (CollectionUtils.isEmpty(authItems)) { + return resultList; + } + + for (VipAuthItem authItem : authItems) { + resultList.add(VipMedalSeatVo.builder() + .medalSeatNum(Integer.valueOf(authItem.getItemValue())) + .vipLevel(authItem.getVipLevel()) + .build()); + } + return resultList; + } + // public final LoadingCache> squaresMedal = CacheBuilder.newBuilder() // .maximumSize(8) // .expireAfterWrite(10, TimeUnit.MINUTES) // 设置写入后10分钟过期 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 d59613c83..c01660e65 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 @@ -1,10 +1,15 @@ package com.accompany.business.service.medal; import com.accompany.business.model.UserMedal; +import com.accompany.business.model.medal.Medal; import com.accompany.business.vo.medal.UserDetailMedalVo; +import com.accompany.core.vo.BaseMedalVo; import com.baomidou.mybatisplus.extension.service.IService; +import org.redisson.api.RBucket; +import org.redisson.api.RList; import java.util.Date; +import java.util.List; /** * @author: liaozetao @@ -13,6 +18,14 @@ import java.util.Date; */ public interface UserMedalService extends IService { + Long countValidMedal(Long uid); + + List listValidMedal(Long uid, Integer pageNo, Integer pageSize); + + List listUseMedal(Long uid); + + List loadAndCacheMedals(Long uid, Integer medalSeatNum); + UserDetailMedalVo getUserMedalWithDetail(Long uid); void rollback(long uid, int medalId, int days); @@ -22,4 +35,7 @@ public interface UserMedalService extends IService { void sendMedal(long uid, int medalId, Date expireTime, Integer source, String remark, Integer adminId); + void useMedal(Long uid, Integer id, Byte useStatus); + + RBucket cacheUseMedal(Long uid); } diff --git a/accompany-business/accompany-business-service/src/main/java/com/accompany/business/service/medal/impl/MedalSeriesRefServiceImpl.java b/accompany-business/accompany-business-service/src/main/java/com/accompany/business/service/medal/impl/MedalSeriesRefServiceImpl.java index aa8d26e76..ab1add492 100644 --- a/accompany-business/accompany-business-service/src/main/java/com/accompany/business/service/medal/impl/MedalSeriesRefServiceImpl.java +++ b/accompany-business/accompany-business-service/src/main/java/com/accompany/business/service/medal/impl/MedalSeriesRefServiceImpl.java @@ -27,4 +27,11 @@ public class MedalSeriesRefServiceImpl extends ServiceImpl listByMedalIds(List medalIds) { + LambdaQueryWrapper refWrapper = Wrappers.lambdaQuery(); + refWrapper.in(MedalSeriesRef::getMedalId, medalIds); + return baseMapper.selectList(refWrapper); + } } diff --git a/accompany-business/accompany-business-service/src/main/java/com/accompany/business/service/medal/impl/MedalSeriesServiceImpl.java b/accompany-business/accompany-business-service/src/main/java/com/accompany/business/service/medal/impl/MedalSeriesServiceImpl.java index e2795d70f..5152ff711 100644 --- a/accompany-business/accompany-business-service/src/main/java/com/accompany/business/service/medal/impl/MedalSeriesServiceImpl.java +++ b/accompany-business/accompany-business-service/src/main/java/com/accompany/business/service/medal/impl/MedalSeriesServiceImpl.java @@ -42,7 +42,7 @@ public class MedalSeriesServiceImpl extends ServiceImpl listBySeriesIds(List seriesIds, Integer pageNo, Integer pageSize) { + public List listBySeriesIds(List seriesIds, Integer type, Integer pageNo, Integer pageSize) { LambdaQueryWrapper wrapper = Wrappers.lambdaQuery(); wrapper.select(MedalSeries::getSeriesId, MedalSeries::getMedalLevel, @@ -51,6 +51,7 @@ public class MedalSeriesServiceImpl extends ServiceImpl userMedals = list(Wrappers.lambdaQuery() + return count(Wrappers.lambdaQuery() .eq(UserMedal::getUid, uid) + .eq(UserMedal::getMedalStatus, Constant.StatusV2.valid) .le(UserMedal::getCreateTime, now) .ge(UserMedal::getExpireTime, now)); - return buildUserDetailMedalVoV2(uid, userMedals); + } + + @Override + public List listValidMedal(Long uid, Integer pageNo, Integer pageSize) { + Date now = new Date(); + return list(new Page<>(pageNo, pageSize, false), Wrappers.lambdaQuery() + .eq(UserMedal::getUid, uid) + .eq(UserMedal::getMedalStatus, Constant.StatusV2.valid) + .le(UserMedal::getCreateTime, now) + .ge(UserMedal::getExpireTime, now)); + } + + @Override + public List listUseMedal(Long uid) { + Date now = new Date(); + return list(Wrappers.lambdaQuery() + .eq(UserMedal::getUid, uid) + .eq(UserMedal::getMedalStatus, Constant.StatusV2.valid) + .eq(UserMedal::getUseStatus, Constant.StatusV2.valid) + .le(UserMedal::getCreateTime, now) + .ge(UserMedal::getExpireTime, now) + .orderByDesc(UserMedal::getUseTime)); + } + + @Override + public List 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; + } + baseMedalVos.add(BaseMedalVo.builder() + .picUrl(medal.getPicUrl()) + .mp4Url(medal.getMp4Url()) + .build()); + } + cacheUseMedal.set(JSONObject.toJSONString(baseMedalVos), Duration.ofDays(7)); + } + if (baseMedalVos.size() > medalSeatNum) { + return baseMedalVos.subList(0, medalSeatNum); + } + return baseMedalVos; + } + + public UserDetailMedalVo getUserMedalWithDetail(Long uid) { + List userMedals = this.listValidMedal(uid, -1, -1); + if (CollectionUtils.isEmpty(userMedals)) { + UserDetailMedalVo userDetailMedalVo = new UserDetailMedalVo(); + userDetailMedalVo.setMedalCount(0); + userDetailMedalVo.setUserMedals(Collections.emptyList()); + return userDetailMedalVo; + } + // 转换成vo + return transUserMedal2Vo(userMedals, uid); } @Override @@ -102,23 +192,21 @@ public class UserMedalServiceImpl extends ServiceImpl userMedals) { - if (CollectionUtils.isEmpty(userMedals)) { - UserDetailMedalVo userDetailMedalVo = new UserDetailMedalVo(); - userDetailMedalVo.setMedalCount(0); - userDetailMedalVo.setUserMedals(Collections.emptyList()); - return userDetailMedalVo; + @Override + public void useMedal(Long uid, Integer id, Byte useStatus) { + UserMedal userMedal = baseMapper.selectById(id); + if (userMedal == null) { + throw new ServiceException(BusiStatus.SERVERBUSY); } - // 转换成vo - return transUserMedal2Vo(userMedals, uid); + userMedal.setUseStatus(useStatus); + userMedal.setUseTime(new Date()); + baseMapper.updateById(userMedal); + this.cacheUseMedal(uid).delete(); + } + + @Override + public RBucket cacheUseMedal(Long uid) { + return redissonClient.getBucket(user_use_medal.getKey(uid)); } @@ -138,6 +226,7 @@ public class UserMedalServiceImpl extends ServiceImpl> typeMap, Byte authType) { + public static Integer getVipAuthItemIntValue(Map> typeMap, Byte authType, Integer defaultValud) { List authItems = typeMap.get(authType); return Optional.ofNullable(authItems) .filter(list -> !list.isEmpty()) @@ -246,7 +247,7 @@ public class VipUtil { .filter(StringUtils::isNotEmpty) .map(String::trim) .map(Integer::valueOf) - .orElse(0); + .orElse(defaultValud); } public static String getVipAuthItemValue(Integer vipLevel, Byte authType) { diff --git a/accompany-business/accompany-business-web/src/main/java/com/accompany/business/controller/MedalSeriesController.java b/accompany-business/accompany-business-web/src/main/java/com/accompany/business/controller/MedalSeriesController.java index 6924b3659..cf4b50abd 100644 --- a/accompany-business/accompany-business-web/src/main/java/com/accompany/business/controller/MedalSeriesController.java +++ b/accompany-business/accompany-business-web/src/main/java/com/accompany/business/controller/MedalSeriesController.java @@ -2,6 +2,9 @@ package com.accompany.business.controller; import com.accompany.business.common.BaseController; import com.accompany.business.service.medal.MedalSeriesSquareService; +import com.accompany.business.vo.medal.MedalManageVo; +import com.accompany.business.vo.medal.MedalSeriesMineVo; +import com.accompany.business.vo.medal.MedalSeriesRefVo; import com.accompany.business.vo.medal.MedalSeriesSquareVo; import com.accompany.common.result.BusiResult; import io.swagger.annotations.Api; @@ -33,9 +36,46 @@ public class MedalSeriesController extends BaseController { }) @GetMapping("/square") @ApiOperation(value = "勋章广场", httpMethod = "GET") - public BusiResult> squares(@RequestHeader(PUB_UID) Long uid, Integer type, + public BusiResult> squares(@RequestHeader(PUB_UID) Long uid, @RequestParam Integer type, @RequestParam(defaultValue = "1") Integer pageNo, - @RequestParam(defaultValue = "6") Integer pageSize) throws ExecutionException { + @RequestParam(defaultValue = "6") Integer pageSize) { return BusiResult.success(medalSeriesSquareService.seriesSquareVos(uid, type, pageNo, pageSize)); } + + @ApiImplicitParams({ + @ApiImplicitParam(name = "uid", value = "用户uid", required = true), + @ApiImplicitParam(name = "type", value = "勋章类型 1任务勋章 活动勋章,3荣耀勋章", required = true), + @ApiImplicitParam(name = "pageNo", value = "页码", required = true), + @ApiImplicitParam(name = "pageSize", value = "页长", required = true) + }) + @GetMapping("/mine") + @ApiOperation(value = "我的勋章页面(主/客态通用)", httpMethod = "GET") + public BusiResult mine(@RequestParam Long uid, @RequestParam Integer type, + @RequestParam(defaultValue = "1") Integer pageNo, + @RequestParam(defaultValue = "6") Integer pageSize) { + return BusiResult.success(medalSeriesSquareService.mine(uid, type, pageNo, pageSize)); + } + + @ApiImplicitParams({ + @ApiImplicitParam(name = "pageNo", value = "页码", required = true), + @ApiImplicitParam(name = "pageSize", value = "页长", required = true) + }) + @GetMapping("/mineAll") + @ApiOperation(value = "勋章佩戴管理弹出来的列表", httpMethod = "GET") + public BusiResult mineAll(@RequestHeader(PUB_UID) Long uid, + @RequestParam(defaultValue = "1") Integer pageNo, + @RequestParam(defaultValue = "6") Integer pageSize) { + return BusiResult.success(medalSeriesSquareService.mineAll(uid, pageNo, pageSize)); + } + + @ApiImplicitParams({ + @ApiImplicitParam(name = "id", value = "Id", required = true), + @ApiImplicitParam(name = "useStatus", value = "1-使用,0-取消使用", required = true) + }) + @GetMapping("/useMedal") + @ApiOperation(value = "使用勋章", httpMethod = "GET") + public BusiResult useMedal(@RequestHeader(PUB_UID) Long uid, @RequestParam Integer id, Byte useStatus) { + medalSeriesSquareService.useMedal(uid, id, useStatus); + return BusiResult.success(); + } } diff --git a/accompany-business/accompany-business-web/src/main/java/com/accompany/business/controller/user/UsersController.java b/accompany-business/accompany-business-web/src/main/java/com/accompany/business/controller/user/UsersController.java index 1b4244760..70bd806e7 100644 --- a/accompany-business/accompany-business-web/src/main/java/com/accompany/business/controller/user/UsersController.java +++ b/accompany-business/accompany-business-web/src/main/java/com/accompany/business/controller/user/UsersController.java @@ -14,6 +14,7 @@ import com.accompany.business.service.invite.UserInviteCodeService; import com.accompany.business.service.invite.UserInviteRecordService; import com.accompany.business.service.guild.GuildDressUpService; import com.accompany.business.service.label.LabelService; +import com.accompany.business.service.medal.UserMedalService; import com.accompany.business.service.room.RoomService; import com.accompany.business.service.user.*; import com.accompany.business.util.VipUtil; @@ -108,6 +109,8 @@ public class UsersController extends BaseController { private GuildDressUpService guildDressUpService; @Autowired private NameplateMapper nameplateMapper; + @Autowired + private UserMedalService userMedalService; private RateLimiter userGetLimiter = RateLimiter.create(1500); @@ -237,6 +240,7 @@ public class UsersController extends BaseController { userVo.setMicCircle(userVipInfo.getMicCircle()); userVo.setMicNickColor(userVipInfo.getMicNickColour()); } + userVo.setMedalsPic(userMedalService.loadAndCacheMedals(uid, userVipInfo.getMedalSeat())); // 公会铭牌 Long guildNameplateId = guildDressUpService.getNameplateId(uid, userVo.getPartitionId());