From 0e668d8dfc5a013e02145061bfe6f4aa880dd59f Mon Sep 17 00:00:00 2001 From: tianfeng <769204422@qq.com> Date: Wed, 19 Nov 2025 18:05:18 +0800 Subject: [PATCH] =?UTF-8?q?=E6=96=B0=E5=A2=9E=E5=BE=BD=E7=AB=A0=E5=88=87?= =?UTF-8?q?=E6=8D=A2=E5=8A=9F=E8=83=BD?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../material/UserBadgeRestController.java | 14 ++++ .../material/query/UserBadgeTableQryExe.java | 1 - .../command/user/UserToggleBadgeCmdExe.java | 82 +++++++++++++++++++ .../user/material/UserBadgeServiceImpl.java | 8 ++ .../cmd/user/material/UserToggleBadgeCmd.java | 23 ++++++ .../user/material/UserBadgeService.java | 3 + .../badge/impl/BadgeBackpackServiceImpl.java | 10 +-- 7 files changed, 133 insertions(+), 8 deletions(-) create mode 100644 rc-service/rc-service-other/other-application/src/main/java/com/red/circle/other/app/command/user/UserToggleBadgeCmdExe.java create mode 100644 rc-service/rc-service-other/other-client/src/main/java/com/red/circle/other/app/dto/cmd/user/material/UserToggleBadgeCmd.java diff --git a/rc-service/rc-service-other/other-adapter/src/main/java/com/red/circle/other/adapter/app/user/material/UserBadgeRestController.java b/rc-service/rc-service-other/other-adapter/src/main/java/com/red/circle/other/adapter/app/user/material/UserBadgeRestController.java index d7587707..99fc065d 100644 --- a/rc-service/rc-service-other/other-adapter/src/main/java/com/red/circle/other/adapter/app/user/material/UserBadgeRestController.java +++ b/rc-service/rc-service-other/other-adapter/src/main/java/com/red/circle/other/adapter/app/user/material/UserBadgeRestController.java @@ -3,6 +3,7 @@ package com.red.circle.other.adapter.app.user.material; import com.red.circle.common.business.dto.cmd.AppExtCommand; import com.red.circle.framework.web.controller.BaseController; import com.red.circle.other.app.dto.cmd.user.material.UserSwitchBadgeCmd; +import com.red.circle.other.app.dto.cmd.user.material.UserToggleBadgeCmd; import com.red.circle.other.app.service.user.material.UserBadgeService; import com.red.circle.other.inner.model.dto.material.BadgeConfigDetailsDTO; import java.util.List; @@ -56,4 +57,17 @@ public class UserBadgeRestController extends BaseController { return userBadgeService.useWearBadge(cmd); } + /** + * 切换单个徽章佩戴状态. + * + * @eo.name 切换单个徽章佩戴状态. + * @eo.url /toggle + * @eo.method post + * @eo.request-type json + */ + @PostMapping("/toggle") + public void toggleBadge(@RequestBody @Validated UserToggleBadgeCmd cmd) { + userBadgeService.toggleBadge(cmd); + } + } diff --git a/rc-service/rc-service-other/other-application/src/main/java/com/red/circle/other/app/command/material/query/UserBadgeTableQryExe.java b/rc-service/rc-service-other/other-application/src/main/java/com/red/circle/other/app/command/material/query/UserBadgeTableQryExe.java index 819f69b1..ed73bc9f 100644 --- a/rc-service/rc-service-other/other-application/src/main/java/com/red/circle/other/app/command/material/query/UserBadgeTableQryExe.java +++ b/rc-service/rc-service-other/other-application/src/main/java/com/red/circle/other/app/command/material/query/UserBadgeTableQryExe.java @@ -74,7 +74,6 @@ public class UserBadgeTableQryExe { .entrySet().stream().map(entry -> new BadgeGroupTableCO() .setBadgeKey(entry.getKey()) .setBadgeTables(orderByAes(entry.getValue())) - .putShowBadgeTable() ).sorted(Comparator.comparing(BadgeGroupTableCO::displayBadgeSort)) .collect(Collectors.toList()); } diff --git a/rc-service/rc-service-other/other-application/src/main/java/com/red/circle/other/app/command/user/UserToggleBadgeCmdExe.java b/rc-service/rc-service-other/other-application/src/main/java/com/red/circle/other/app/command/user/UserToggleBadgeCmdExe.java new file mode 100644 index 00000000..48dfffaa --- /dev/null +++ b/rc-service/rc-service-other/other-application/src/main/java/com/red/circle/other/app/command/user/UserToggleBadgeCmdExe.java @@ -0,0 +1,82 @@ +package com.red.circle.other.app.command.user; + +import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; +import com.baomidou.mybatisplus.core.toolkit.Wrappers; +import com.google.common.collect.Lists; +import com.red.circle.framework.core.asserts.ResponseAssert; +import com.red.circle.framework.core.response.CommonErrorCode; +import com.red.circle.other.app.dto.cmd.user.material.UserToggleBadgeCmd; +import com.red.circle.other.domain.gateway.user.UserProfileGateway; +import com.red.circle.other.infra.database.rds.entity.badge.BadgeBackpack; +import com.red.circle.other.infra.database.rds.entity.badge.BadgeConfig; +import com.red.circle.other.infra.database.rds.service.badge.BadgeBackpackService; +import com.red.circle.other.infra.database.rds.service.badge.BadgeConfigService; +import com.red.circle.tool.core.collection.CollectionUtils; +import com.red.circle.wallet.inner.error.WalletErrorCode; +import lombok.RequiredArgsConstructor; +import org.springframework.stereotype.Component; + +import java.math.BigDecimal; +import java.util.Arrays; +import java.util.Collections; +import java.util.List; +import java.util.Map; +import java.util.stream.Collectors; + +/** + * 用户切换单个徽章佩戴状态. + * + * @author system + */ +@Component +@RequiredArgsConstructor +public class UserToggleBadgeCmdExe { + + private final BadgeBackpackService badgeBackpackService; + private final UserProfileGateway userProfileGateway; + private final BadgeConfigService badgeConfigService; + + public void execute(UserToggleBadgeCmd cmd) { + Long userId = cmd.getReqUserId(); + Long badgeId = cmd.getBadgeId(); + String sysOrigin = cmd.getReqSysOrigin().getOrigin(); + + List badgeConfigs = badgeConfigService.listByIds(Collections.singletonList(badgeId)); + ResponseAssert.isFalse(CommonErrorCode.OPERATING_FAILURE, + badgeConfigs.isEmpty()); + + + // 查询当前已佩戴的徽章 + LambdaQueryWrapper eq = Wrappers.lambdaQuery(BadgeBackpack.class) + .eq(BadgeBackpack::getUserId, userId) + .eq(BadgeBackpack::getUseProps, Boolean.TRUE); + List currentWearBadges = badgeBackpackService.list(eq); + + // 检查目标徽章是否已佩戴 + boolean isWearing = currentWearBadges.stream() + .anyMatch(badge -> badge.getBadgeId().equals(badgeId)); + + List newBadgeIds; + if (isWearing) { + // 已佩戴 → 卸下该徽章 + newBadgeIds = currentWearBadges.stream() + .map(BadgeBackpack::getBadgeId) + .filter(id -> !id.equals(badgeId)) + .collect(Collectors.toList()); + } else { + // 未佩戴 → 佩戴该徽章 + newBadgeIds = currentWearBadges.stream() + .map(BadgeBackpack::getBadgeId) + .collect(Collectors.toList()); + newBadgeIds.add(badgeId); + } + + // 更新徽章佩戴状态 + if (CollectionUtils.isEmpty(newBadgeIds)) { + userProfileGateway.removeUserAllWearBadge(userId, sysOrigin); + } else { + userProfileGateway.updateUserWearBadge(userId, sysOrigin, newBadgeIds); + } + } + +} diff --git a/rc-service/rc-service-other/other-application/src/main/java/com/red/circle/other/app/service/user/material/UserBadgeServiceImpl.java b/rc-service/rc-service-other/other-application/src/main/java/com/red/circle/other/app/service/user/material/UserBadgeServiceImpl.java index 4f07a92f..7b660c7d 100644 --- a/rc-service/rc-service-other/other-application/src/main/java/com/red/circle/other/app/service/user/material/UserBadgeServiceImpl.java +++ b/rc-service/rc-service-other/other-application/src/main/java/com/red/circle/other/app/service/user/material/UserBadgeServiceImpl.java @@ -3,8 +3,10 @@ package com.red.circle.other.app.service.user.material; import com.red.circle.common.business.dto.cmd.AppExtCommand; import com.red.circle.other.inner.model.dto.material.BadgeConfigDetailsDTO; import com.red.circle.other.app.command.user.UserSwitchBadgeCmdExe; +import com.red.circle.other.app.command.user.UserToggleBadgeCmdExe; import com.red.circle.other.app.command.user.query.UseWearBadgeQryExe; import com.red.circle.other.app.dto.cmd.user.material.UserSwitchBadgeCmd; +import com.red.circle.other.app.dto.cmd.user.material.UserToggleBadgeCmd; import java.util.List; import lombok.RequiredArgsConstructor; import org.springframework.stereotype.Service; @@ -20,6 +22,7 @@ public class UserBadgeServiceImpl implements UserBadgeService { private final UseWearBadgeQryExe useWearBadgeQryExe; private final UserSwitchBadgeCmdExe userSwitchBadgeCmdExe; + private final UserToggleBadgeCmdExe userToggleBadgeCmdExe; @Override public void switchBadge(UserSwitchBadgeCmd cmd) { @@ -31,4 +34,9 @@ public class UserBadgeServiceImpl implements UserBadgeService { return useWearBadgeQryExe.execute(cmd); } + @Override + public void toggleBadge(UserToggleBadgeCmd cmd) { + userToggleBadgeCmdExe.execute(cmd); + } + } diff --git a/rc-service/rc-service-other/other-client/src/main/java/com/red/circle/other/app/dto/cmd/user/material/UserToggleBadgeCmd.java b/rc-service/rc-service-other/other-client/src/main/java/com/red/circle/other/app/dto/cmd/user/material/UserToggleBadgeCmd.java new file mode 100644 index 00000000..ea424804 --- /dev/null +++ b/rc-service/rc-service-other/other-client/src/main/java/com/red/circle/other/app/dto/cmd/user/material/UserToggleBadgeCmd.java @@ -0,0 +1,23 @@ +package com.red.circle.other.app.dto.cmd.user.material; + +import com.red.circle.common.business.dto.cmd.AppExtCommand; +import jakarta.validation.constraints.NotNull; +import lombok.Data; +import lombok.EqualsAndHashCode; + +/** + * 用户切换单个徽章佩戴状态. + * + * @author system + */ +@Data +@EqualsAndHashCode(callSuper = false) +public class UserToggleBadgeCmd extends AppExtCommand { + + /** + * 徽章ID. + */ + @NotNull(message = "badgeId required.") + private Long badgeId; + +} diff --git a/rc-service/rc-service-other/other-client/src/main/java/com/red/circle/other/app/service/user/material/UserBadgeService.java b/rc-service/rc-service-other/other-client/src/main/java/com/red/circle/other/app/service/user/material/UserBadgeService.java index 19511217..05bdac05 100644 --- a/rc-service/rc-service-other/other-client/src/main/java/com/red/circle/other/app/service/user/material/UserBadgeService.java +++ b/rc-service/rc-service-other/other-client/src/main/java/com/red/circle/other/app/service/user/material/UserBadgeService.java @@ -2,6 +2,7 @@ package com.red.circle.other.app.service.user.material; import com.red.circle.common.business.dto.cmd.AppExtCommand; import com.red.circle.other.app.dto.cmd.user.material.UserSwitchBadgeCmd; +import com.red.circle.other.app.dto.cmd.user.material.UserToggleBadgeCmd; import com.red.circle.other.inner.model.dto.material.BadgeConfigDetailsDTO; import java.util.List; @@ -16,4 +17,6 @@ public interface UserBadgeService { List useWearBadge(AppExtCommand cmd); + void toggleBadge(UserToggleBadgeCmd cmd); + } diff --git a/rc-service/rc-service-other/other-infrastructure/src/main/java/com/red/circle/other/infra/database/rds/service/badge/impl/BadgeBackpackServiceImpl.java b/rc-service/rc-service-other/other-infrastructure/src/main/java/com/red/circle/other/infra/database/rds/service/badge/impl/BadgeBackpackServiceImpl.java index 53e56f53..945d292b 100644 --- a/rc-service/rc-service-other/other-infrastructure/src/main/java/com/red/circle/other/infra/database/rds/service/badge/impl/BadgeBackpackServiceImpl.java +++ b/rc-service/rc-service-other/other-infrastructure/src/main/java/com/red/circle/other/infra/database/rds/service/badge/impl/BadgeBackpackServiceImpl.java @@ -9,12 +9,8 @@ import com.red.circle.other.infra.database.rds.service.badge.BadgeBackpackServic import com.red.circle.other.inner.enums.material.BadgeBackpackExpireType; import com.red.circle.tool.core.collection.CollectionUtils; import com.red.circle.tool.core.date.TimestampUtils; -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.function.Function; import java.util.stream.Collectors; @@ -61,7 +57,7 @@ public class BadgeBackpackServiceImpl extends update() .set(BadgeBackpack::getUseProps, Boolean.TRUE) - .in(BadgeBackpack::getBadgeId, badgeIds.stream().limit(5).collect(Collectors.toSet())) + .in(BadgeBackpack::getBadgeId, new HashSet<>(badgeIds)) .execute(); }