From 6ed54f8d2106c3f4e1b25ea2ecc35ed9c81f2db7 Mon Sep 17 00:00:00 2001 From: tianfeng <769204422@qq.com> Date: Fri, 12 Sep 2025 17:27:31 +0800 Subject: [PATCH] =?UTF-8?q?=E6=8E=92=E8=A1=8C=E6=A6=9C=E4=BC=98=E5=8C=96?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../user/user/WeekKingQueenClient.java | 9 ++ .../user/user/api/WeekKingQueenClientApi.java | 25 ++++ .../app/sys/SysActivityConfigServiceImpl.java | 38 +++--- .../entity/activity/WeekKingQueenCount.java | 5 + .../activity/WeekKingQueenCountService.java | 12 ++ .../impl/WeekKingQueenCountServiceImpl.java | 58 +++++++- .../user/WeekKingQueenClientEndpoint.java | 129 ++++++++++++++++++ 7 files changed, 256 insertions(+), 20 deletions(-) create mode 100644 rc-service/rc-inner-api/other-inner/other-inner-api/src/main/java/com/red/circle/other/inner/endpoint/user/user/WeekKingQueenClient.java create mode 100644 rc-service/rc-inner-api/other-inner/other-inner-api/src/main/java/com/red/circle/other/inner/endpoint/user/user/api/WeekKingQueenClientApi.java create mode 100644 rc-service/rc-service-other/other-inner-endpoint/src/main/java/com/red/circle/other/app/inner/endpoint/user/user/WeekKingQueenClientEndpoint.java diff --git a/rc-service/rc-inner-api/other-inner/other-inner-api/src/main/java/com/red/circle/other/inner/endpoint/user/user/WeekKingQueenClient.java b/rc-service/rc-inner-api/other-inner/other-inner-api/src/main/java/com/red/circle/other/inner/endpoint/user/user/WeekKingQueenClient.java new file mode 100644 index 00000000..18935b5d --- /dev/null +++ b/rc-service/rc-inner-api/other-inner/other-inner-api/src/main/java/com/red/circle/other/inner/endpoint/user/user/WeekKingQueenClient.java @@ -0,0 +1,9 @@ +package com.red.circle.other.inner.endpoint.user.user; + +import com.red.circle.other.inner.endpoint.user.user.api.WeekKingQueenClientApi; +import org.springframework.cloud.openfeign.FeignClient; + +@FeignClient(name = "weekKingQueenClient", url = "${feign.other.url}" + + WeekKingQueenClientApi.API_PREFIX) +public interface WeekKingQueenClient extends WeekKingQueenClientApi { +} diff --git a/rc-service/rc-inner-api/other-inner/other-inner-api/src/main/java/com/red/circle/other/inner/endpoint/user/user/api/WeekKingQueenClientApi.java b/rc-service/rc-inner-api/other-inner/other-inner-api/src/main/java/com/red/circle/other/inner/endpoint/user/user/api/WeekKingQueenClientApi.java new file mode 100644 index 00000000..bfbdd3f8 --- /dev/null +++ b/rc-service/rc-inner-api/other-inner/other-inner-api/src/main/java/com/red/circle/other/inner/endpoint/user/user/api/WeekKingQueenClientApi.java @@ -0,0 +1,25 @@ +package com.red.circle.other.inner.endpoint.user.user.api; + +import com.red.circle.framework.dto.PageResult; +import com.red.circle.framework.dto.ResultResponse; +import com.red.circle.other.inner.enums.activity.KingQueenType; +import com.red.circle.other.inner.model.dto.sys.SysActivityCountDTO; +import org.springframework.web.bind.annotation.GetMapping; +import org.springframework.web.bind.annotation.RequestParam; + +/** + * 国王和王后排行 + */ +public interface WeekKingQueenClientApi { + + String API_PREFIX = "/week/king-queen/client"; + + @GetMapping("/ranking") + ResultResponse> listRanking( + @RequestParam("sysOrigin") String sysOrigin, + @RequestParam("type") KingQueenType type, + @RequestParam("group") String group, + @RequestParam("current") Long current, + @RequestParam("size") Long size); + +} diff --git a/rc-service/rc-service-console/console-application/src/main/java/com/red/circle/console/app/service/app/sys/SysActivityConfigServiceImpl.java b/rc-service/rc-service-console/console-application/src/main/java/com/red/circle/console/app/service/app/sys/SysActivityConfigServiceImpl.java index a99eda33..1590b6d9 100644 --- a/rc-service/rc-service-console/console-application/src/main/java/com/red/circle/console/app/service/app/sys/SysActivityConfigServiceImpl.java +++ b/rc-service/rc-service-console/console-application/src/main/java/com/red/circle/console/app/service/app/sys/SysActivityConfigServiceImpl.java @@ -20,9 +20,14 @@ import com.red.circle.console.infra.database.rds.entity.admin.User; import com.red.circle.console.infra.database.rds.service.admin.UserService; import com.red.circle.console.inner.error.ConsoleErrorCode; import com.red.circle.framework.core.asserts.ResponseAssert; +import com.red.circle.framework.dto.PageResult; +import com.red.circle.framework.dto.ResultResponse; import com.red.circle.other.inner.endpoint.activity.PropsActivityClient; import com.red.circle.other.inner.endpoint.material.gift.GiftConfigClient; import com.red.circle.other.inner.endpoint.sys.SysActivityConfigClient; +import com.red.circle.other.inner.endpoint.user.user.WeekKingQueenClient; +import com.red.circle.other.inner.endpoint.user.user.api.WeekKingQueenClientApi; +import com.red.circle.other.inner.enums.activity.KingQueenType; import com.red.circle.other.inner.model.cmd.activity.SendActivityRewardCmd; import com.red.circle.other.inner.model.dto.material.GiftConfigDTO; import com.red.circle.other.inner.model.dto.material.PropsActivityRewardConfigInfoDTO; @@ -35,24 +40,25 @@ import com.red.circle.other.inner.model.dto.sys.ActivityTemplateValueDTO; import com.red.circle.other.inner.model.dto.sys.SysActivityCountDTO; import com.red.circle.other.inner.model.dto.sys.SysActivityCountType; import com.red.circle.tool.core.collection.CollectionUtils; +import com.red.circle.tool.core.date.DateFormatConstant; +import com.red.circle.tool.core.date.ZonedDateTimeAsiaRiyadhUtils; +import com.red.circle.tool.core.date.ZonedDateTimeUtils; import com.red.circle.tool.core.num.NumUtils; import com.red.circle.tool.core.regex.RegexConstant; import com.red.circle.tool.core.sequence.IdWorkerUtils; import com.red.circle.tool.core.text.StringUtils; import com.red.circle.other.inner.model.dto.user.UserProfileDTO; import com.red.circle.other.inner.endpoint.user.user.UserProfileClient; -import java.util.Collection; -import java.util.List; -import java.util.Map; -import java.util.Objects; -import java.util.Optional; -import java.util.Set; + +import java.util.*; import java.util.stream.Collectors; import java.util.stream.Stream; import lombok.RequiredArgsConstructor; import lombok.extern.slf4j.Slf4j; import org.springframework.stereotype.Service; +import static com.red.circle.common.business.core.enums.SysOriginPlatformEnum.LIKEI; + /** * 系统活动配置. * @@ -70,6 +76,7 @@ public class SysActivityConfigServiceImpl implements SysActivityConfigService { private final SysActivityConfigClient sysActivityConfigClient; private final ActivitySourceGroupCommon activitySourceGroupCommon; private final ActivityConfigAppConvertor activityConfigAppConvertor; + private final WeekKingQueenClient weekKingQueenClient; @Override public List listTemplate(ActivityTemplateConsoleQryCmd query) { @@ -271,16 +278,10 @@ public class SysActivityConfigServiceImpl implements SysActivityConfigService { @Override public ActivityRankCO getActivityRank(Long activityId) { - - List butOnes = Optional.ofNullable( - ResponseAssert.requiredSuccess(sysActivityConfigClient.listRank(activityId, - SysActivityCountType.WEALTH.name(), 20))) - .orElseGet(Lists::newArrayList); - - List butTwos = Optional.ofNullable( - ResponseAssert.requiredSuccess(sysActivityConfigClient.listRank(activityId, - SysActivityCountType.CHARM.name(), 20))) - .orElseGet(Lists::newArrayList); + ResultResponse> response = weekKingQueenClient.listRanking("LIKEI", KingQueenType.CHARM, getThisWeekDate(), 1L, 20L); + ResultResponse> response2 = weekKingQueenClient.listRanking("LIKEI", KingQueenType.WEALTH, getThisWeekDate(), 1L, 20L); + List butOnes = (ArrayList) response.getBody().getRecords(); + List butTwos = (ArrayList) response2.getBody().getRecords(); Map userProfileMap = ResponseAssert.requiredSuccess( userProfileClient.mapByUserIds( @@ -294,6 +295,11 @@ public class SysActivityConfigServiceImpl implements SysActivityConfigService { .setButTwoRanks(getActivityRankUse(butTwos, userProfileMap)); } + private String getThisWeekDate() { + return ZonedDateTimeUtils.format(ZonedDateTimeAsiaRiyadhUtils.nowWeekMonday(), + DateFormatConstant.yyyyMMdd); + } + @Override public void sendActivityReward(Long activityId) { ActivityConfigDTO activityConfig = ResponseAssert.requiredSuccess( diff --git a/rc-service/rc-service-other/other-infrastructure/src/main/java/com/red/circle/other/infra/database/mongo/entity/activity/WeekKingQueenCount.java b/rc-service/rc-service-other/other-infrastructure/src/main/java/com/red/circle/other/infra/database/mongo/entity/activity/WeekKingQueenCount.java index ecdecbff..606bb547 100644 --- a/rc-service/rc-service-other/other-infrastructure/src/main/java/com/red/circle/other/infra/database/mongo/entity/activity/WeekKingQueenCount.java +++ b/rc-service/rc-service-other/other-infrastructure/src/main/java/com/red/circle/other/infra/database/mongo/entity/activity/WeekKingQueenCount.java @@ -44,6 +44,11 @@ public class WeekKingQueenCount implements Serializable { @JsonSerialize(using = ToStringSerializer.class) Long userId; + /** + * 用户性别:0 女,1 男. + */ + private Integer userSex; + /** * 排名 */ diff --git a/rc-service/rc-service-other/other-infrastructure/src/main/java/com/red/circle/other/infra/database/mongo/service/activity/WeekKingQueenCountService.java b/rc-service/rc-service-other/other-infrastructure/src/main/java/com/red/circle/other/infra/database/mongo/service/activity/WeekKingQueenCountService.java index 3a74c42e..72f93f5a 100644 --- a/rc-service/rc-service-other/other-infrastructure/src/main/java/com/red/circle/other/infra/database/mongo/service/activity/WeekKingQueenCountService.java +++ b/rc-service/rc-service-other/other-infrastructure/src/main/java/com/red/circle/other/infra/database/mongo/service/activity/WeekKingQueenCountService.java @@ -40,6 +40,18 @@ public interface WeekKingQueenCountService { Page pageWeekTop(String sysOrigin, KingQueenType type, Integer weekType, Pageable pageable); + /** + * 分页查询每周top (支持性别过滤) + */ + Page pageWeekQuery(String sysOrigin, KingQueenType type, String group, + Long current, Long size); + + /** + * 分页查询每周top (支持性别过滤) + */ + Page pageWeekQuery(String sysOrigin, KingQueenType type, String group, + Integer userSex, Long current, Long size); + /** * 矫正数据. */ diff --git a/rc-service/rc-service-other/other-infrastructure/src/main/java/com/red/circle/other/infra/database/mongo/service/activity/impl/WeekKingQueenCountServiceImpl.java b/rc-service/rc-service-other/other-infrastructure/src/main/java/com/red/circle/other/infra/database/mongo/service/activity/impl/WeekKingQueenCountServiceImpl.java index 402384dc..6b5784c6 100644 --- a/rc-service/rc-service-other/other-infrastructure/src/main/java/com/red/circle/other/infra/database/mongo/service/activity/impl/WeekKingQueenCountServiceImpl.java +++ b/rc-service/rc-service-other/other-infrastructure/src/main/java/com/red/circle/other/infra/database/mongo/service/activity/impl/WeekKingQueenCountServiceImpl.java @@ -2,6 +2,9 @@ package com.red.circle.other.infra.database.mongo.service.activity.impl; import com.mongodb.client.model.Filters; import com.red.circle.component.mongodb.config.MongoPrimaryService; +import com.red.circle.other.domain.gateway.user.UserProfileGateway; +import com.red.circle.other.domain.model.user.UserProfile; +import com.red.circle.other.infra.database.cache.service.user.UserCacheService; import com.red.circle.other.infra.database.mongo.entity.activity.WeekKingQueenCount; import com.red.circle.other.infra.database.mongo.service.activity.WeekKingQueenCountService; import com.red.circle.other.inner.enums.activity.KingQueenType; @@ -13,10 +16,7 @@ import java.util.List; import java.util.Objects; import lombok.RequiredArgsConstructor; import org.springframework.dao.DuplicateKeyException; -import org.springframework.data.domain.Page; -import org.springframework.data.domain.PageImpl; -import org.springframework.data.domain.Pageable; -import org.springframework.data.domain.Sort; +import org.springframework.data.domain.*; import org.springframework.data.mongodb.core.MongoTemplate; import org.springframework.data.mongodb.core.query.Criteria; import org.springframework.data.mongodb.core.query.Query; @@ -34,6 +34,7 @@ public class WeekKingQueenCountServiceImpl implements WeekKingQueenCountService private final MongoTemplate mongoTemplate; private final MongoPrimaryService mongoPrimaryService; + private final UserProfileGateway userProfileGateway; @Override public void incrThisWeekQuantity(String sysOrigin, Long userId, KingQueenType type, @@ -119,6 +120,53 @@ public class WeekKingQueenCountServiceImpl implements WeekKingQueenCountService return new PageImpl<>(results, pageable, total); } + @Override + public Page pageWeekQuery(String sysOrigin, KingQueenType type, String group, Long current, Long size) { + return pageWeekQuery(sysOrigin, type, group, null, current, size); + } + + @Override + public Page pageWeekQuery(String sysOrigin, KingQueenType type, String group, + Integer userSex, Long current, Long size) { + // 构建查询条件 + Criteria criteria = Criteria.where("sysOrigin").is(sysOrigin) + .and("group").is(group) + .and("type").is(type); + + // 根据业务规则过滤性别:魅力(女)、财富(男) + if (userSex != null) { + criteria.and("userSex").is(userSex); + } else { + // 如果没有指定性别,根据类型默认过滤 + if (type == KingQueenType.CHARM) { + // 魅力类型:只显示女性(0) + criteria.and("userSex").is(0); + } else if (type == KingQueenType.WEALTH) { + // 财富类型:只显示男性(1) + criteria.and("userSex").is(1); + } + } + + Query query = Query.query(criteria) + .with(Sort.by(Sort.Order.desc("quantity"))); + + // 查询总数 + long total = mongoTemplate.count(query, WeekKingQueenCount.class); + + PageRequest pageRequest = PageRequest.of(current.intValue() - 1, size.intValue()); + // 分页查询 + query.with(pageRequest); + List results = mongoTemplate.find(query, WeekKingQueenCount.class); + + // 计算rank(考虑分页偏移量) + int startRank = (int) (pageRequest.getOffset() + 1); + for (int i = 0; i < results.size(); i++) { + results.get(i).setRank(startRank + i); + } + + return new PageImpl<>(results, pageRequest, total); + } + /** * 根据周类型获取对应的日期组 @@ -160,12 +208,14 @@ public class WeekKingQueenCountServiceImpl implements WeekKingQueenCountService private void addThisWeek(String sysOrigin, Long userId, KingQueenType type, Long quantity) { try { + UserProfile byUserId = userProfileGateway.getByUserId(userId); mongoTemplate.save(new WeekKingQueenCount() .setId(getWeekUniqueId(userId, type)) .setSysOrigin(sysOrigin) .setType(type) .setUserId(userId) .setQuantity(quantity) + .setUserSex(byUserId.getUserSex()) .setGroup(getThisWeekDate()) .setCreateTime(TimestampUtils.now()) .setExpiredTime(TimestampUtils.nowPlusDays(15)) diff --git a/rc-service/rc-service-other/other-inner-endpoint/src/main/java/com/red/circle/other/app/inner/endpoint/user/user/WeekKingQueenClientEndpoint.java b/rc-service/rc-service-other/other-inner-endpoint/src/main/java/com/red/circle/other/app/inner/endpoint/user/user/WeekKingQueenClientEndpoint.java new file mode 100644 index 00000000..10335ec4 --- /dev/null +++ b/rc-service/rc-service-other/other-inner-endpoint/src/main/java/com/red/circle/other/app/inner/endpoint/user/user/WeekKingQueenClientEndpoint.java @@ -0,0 +1,129 @@ +package com.red.circle.other.app.inner.endpoint.user.user; + +import com.red.circle.framework.dto.PageResult; +import com.red.circle.framework.dto.ResultResponse; +import com.red.circle.other.infra.database.mongo.entity.activity.WeekKingQueenCount; +import com.red.circle.other.infra.database.mongo.service.activity.WeekKingQueenCountService; +import com.red.circle.other.inner.endpoint.user.user.api.WeekKingQueenClientApi; +import com.red.circle.other.inner.enums.activity.KingQueenType; +import com.red.circle.other.inner.model.dto.sys.SysActivityCountDTO; +import com.red.circle.other.inner.model.dto.sys.SysActivityCountType; +import jakarta.validation.constraints.NotBlank; +import jakarta.validation.constraints.NotNull; +import lombok.RequiredArgsConstructor; +import lombok.extern.slf4j.Slf4j; +import org.springframework.data.domain.Page; +import org.springframework.http.MediaType; +import org.springframework.util.CollectionUtils; +import org.springframework.validation.annotation.Validated; +import org.springframework.web.bind.annotation.RequestMapping; +import org.springframework.web.bind.annotation.RestController; + +import java.util.ArrayList; +import java.util.List; +import java.util.concurrent.atomic.AtomicInteger; + +@Slf4j +@Validated +@RestController +@RequestMapping(value = WeekKingQueenClientApi.API_PREFIX, produces = MediaType.APPLICATION_JSON_VALUE) +@RequiredArgsConstructor +public class WeekKingQueenClientEndpoint implements WeekKingQueenClientApi { + + private final WeekKingQueenCountService weekKingQueenCountService; + + @Override + public ResultResponse> listRanking(String sysOrigin, KingQueenType type, String group, Long current, Long size) { + + log.info("查询每周国王王后排行榜, sysOrigin: {}, group: {}, current: {}, size: {}", + sysOrigin, group, current, size); + + try { + // 查询分页数据 + Page queenCountPage = weekKingQueenCountService.pageWeekQuery( + sysOrigin, type, group, current, size); + + // 构建返回结果 + PageResult result = new PageResult<>(); + result.setCurrent(current); + result.setSize(size); + result.setTotal(queenCountPage.getTotalElements()); + + // 转换数据 + if (!CollectionUtils.isEmpty(queenCountPage.getContent())) { + List dtoList = convertToSysActivityCountDTO(queenCountPage.getContent()); + result.setRecords(dtoList); + } else { + result.setRecords(new ArrayList<>()); + } + + log.info("查询每周国王王后排行榜成功, 总数: {}, 返回记录数: {}", + result.getTotal(), result.getRecords().size()); + + return ResultResponse.success(result); + } catch (Exception e) { + log.error("查询每周国王王后排行榜失败, sysOrigin: {}, group: {}", sysOrigin, group, e); + throw new RuntimeException("查询排行榜失败", e); + } + } + + /** + * 转换WeekKingQueenCount为SysActivityCountDTO + * + * @param countList 原始数据列表 + * @return 转换后的DTO列表 + */ + private List convertToSysActivityCountDTO(List countList) { + List dtoList = new ArrayList<>(countList.size()); + AtomicInteger rankCounter = new AtomicInteger(1); + + for (WeekKingQueenCount count : countList) { + SysActivityCountDTO dto = new SysActivityCountDTO(); + + // 基础字段映射 + dto.setId(count.getId()); + dto.setUserId(count.getUserId()); + dto.setQuantity(count.getQuantity()); + dto.setUpdateTime(count.getCreateTime()); + dto.setExpiredTime(count.getExpiredTime()); + + // 设置排名(通过rank字段或者顺序递增) + if (count.getRank() != null) { + // 如果有排名字段,优先使用 + // 这里可以根据需要将排名信息存储到其他字段中 + } else { + // 否则使用顺序递增的排名 + rankCounter.getAndIncrement(); + } + + // 转换类型:将KingQueenType转换为SysActivityCountType + if (count.getType() != null) { + dto.setType(convertKingQueenTypeToActivityCountType(count.getType())); + } + + dtoList.add(dto); + } + + return dtoList; + } + + /** + * 将KingQueenType转换为SysActivityCountType + * + * @param kingQueenType 国王王后类型 + * @return 活动统计类型 + */ + private SysActivityCountType convertKingQueenTypeToActivityCountType(KingQueenType kingQueenType) { + // 根据业务逻辑进行类型映射 + switch (kingQueenType) { + case CHARM: + return SysActivityCountType.CHARM; + case WEALTH: + return SysActivityCountType.WEALTH; + default: + log.warn("未知的KingQueenType: {}, 默认返回CHARM", kingQueenType); + return SysActivityCountType.CHARM; + } + } + +}