From 1630fc9383ae18eac03505bedb043eec15d3bb95 Mon Sep 17 00:00:00 2001 From: tianfeng <769204422@qq.com> Date: Fri, 21 Nov 2025 19:19:27 +0800 Subject: [PATCH] =?UTF-8?q?=E5=BE=BD=E7=AB=A0=E5=A2=9E=E5=8A=A0manager?= =?UTF-8?q?=E7=B1=BB=E5=9E=8B?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../app/team/bd/TeamBDInfoServiceImpl.java | 8 + .../app/team/bd/TeamLeaderBDServiceImpl.java | 5 +- .../impl/AdministratorClientServiceImpl.java | 59 ++-- .../other-start/src/test/java/ApiTest.java | 2 +- .../test/java/badge/BatchSendBadgeTest.java | 333 ++++++++++++++++++ 5 files changed, 377 insertions(+), 30 deletions(-) create mode 100644 rc-service/rc-service-other/other-start/src/test/java/badge/BatchSendBadgeTest.java diff --git a/rc-service/rc-service-console/console-application/src/main/java/com/red/circle/console/app/service/app/team/bd/TeamBDInfoServiceImpl.java b/rc-service/rc-service-console/console-application/src/main/java/com/red/circle/console/app/service/app/team/bd/TeamBDInfoServiceImpl.java index 82a140a7..734a93b2 100644 --- a/rc-service/rc-service-console/console-application/src/main/java/com/red/circle/console/app/service/app/team/bd/TeamBDInfoServiceImpl.java +++ b/rc-service/rc-service-console/console-application/src/main/java/com/red/circle/console/app/service/app/team/bd/TeamBDInfoServiceImpl.java @@ -12,6 +12,8 @@ import com.red.circle.console.inner.error.ConsoleErrorCode; import com.red.circle.framework.core.asserts.ResponseAssert; import com.red.circle.framework.core.response.CommonErrorCode; import com.red.circle.framework.dto.PageResult; +import com.red.circle.mq.business.model.event.BadgeOperateEvent; +import com.red.circle.mq.rocket.business.producer.UserMqMessageService; import com.red.circle.other.inner.endpoint.team.bd.BdTeamInfoClient; import com.red.circle.other.inner.endpoint.team.bd.BdTeamMemberClient; import com.red.circle.other.inner.endpoint.user.user.UserGoldCoinRechargeClient; @@ -19,6 +21,7 @@ import com.red.circle.other.inner.endpoint.user.user.UserInviteUserClient; import com.red.circle.other.inner.endpoint.team.logs.TeamImportanceLogClient; import com.red.circle.other.inner.endpoint.team.logs.TeamProcessApprovalClient; import com.red.circle.other.inner.endpoint.team.target.UserHistoryIdentityClient; +import com.red.circle.other.inner.enums.material.BadgeKeyEnum; import com.red.circle.other.inner.model.cmd.team.bd.BdTeamPageQryCmd; import com.red.circle.other.inner.model.cmd.team.bd.BdTeamUpdateOpsCmd; import com.red.circle.other.inner.model.cmd.team.bd.BdTeamWorkStatisticsQryCmd; @@ -71,6 +74,7 @@ public class TeamBDInfoServiceImpl implements TeamBDInfoService { private final TeamImportanceLogClient teamImportanceLogClient; private final TeamProcessApprovalClient teamProcessApprovalClient; private final UserHistoryIdentityClient userHistoryIdentityClient; + private final UserMqMessageService userMqMessageService; private final UserGoldCoinRechargeClient userGoldCoinRechargeClient; @@ -343,6 +347,8 @@ public class TeamBDInfoServiceImpl implements TeamBDInfoService { ); userHistoryIdentityClient.saveBd(userProfile.getId()); + + userMqMessageService.sendBadgeOperateEvent(userProfile.getId(), BadgeKeyEnum.BD.name(), BadgeOperateEvent.OperationType.WEAR.name()); } @Override @@ -373,6 +379,8 @@ public class TeamBDInfoServiceImpl implements TeamBDInfoService { .setCreateUserOrigin(1) ); + userMqMessageService.sendBadgeOperateEvent(db.getUserId(), BadgeKeyEnum.BD.name(), BadgeOperateEvent.OperationType.REMOVE.name()); + // 获得需要被移除的成员 List teamList = bdTeamMemberClient .listByUserId(db.getUserId()).getBody(); diff --git a/rc-service/rc-service-console/console-application/src/main/java/com/red/circle/console/app/service/app/team/bd/TeamLeaderBDServiceImpl.java b/rc-service/rc-service-console/console-application/src/main/java/com/red/circle/console/app/service/app/team/bd/TeamLeaderBDServiceImpl.java index 14ea8e71..64ed47d2 100644 --- a/rc-service/rc-service-console/console-application/src/main/java/com/red/circle/console/app/service/app/team/bd/TeamLeaderBDServiceImpl.java +++ b/rc-service/rc-service-console/console-application/src/main/java/com/red/circle/console/app/service/app/team/bd/TeamLeaderBDServiceImpl.java @@ -152,6 +152,9 @@ public class TeamLeaderBDServiceImpl implements TeamLeaderBDService { userHistoryIdentityClient.saveBd(cmd.getUserId()); + userMqMessageService.sendBadgeOperateEvent(cmd.getUserId(), BadgeKeyEnum.BD.name(), BadgeOperateEvent.OperationType.WEAR.name()); + userMqMessageService.sendBadgeOperateEvent(cmd.getUserId(), BadgeKeyEnum.BD_LEADER.name(), BadgeOperateEvent.OperationType.WEAR.name()); + if (Objects.nonNull(bd)) { bd.setUpdateUser(cmd.getUpdateUser()); bd.setBdLeadUserId(cmd.getUserId()); @@ -171,8 +174,6 @@ public class TeamLeaderBDServiceImpl implements TeamLeaderBDService { .setBdLeadUserId(cmd.getUserId()) ); - userMqMessageService.sendBadgeOperateEvent(cmd.getUserId(), BadgeKeyEnum.BD.name(), BadgeOperateEvent.OperationType.WEAR.name()); - userMqMessageService.sendBadgeOperateEvent(cmd.getUserId(), BadgeKeyEnum.BD_LEADER.name(), BadgeOperateEvent.OperationType.WEAR.name()); } @Override diff --git a/rc-service/rc-service-other/other-inner-endpoint/src/main/java/com/red/circle/other/app/inner/service/sys/impl/AdministratorClientServiceImpl.java b/rc-service/rc-service-other/other-inner-endpoint/src/main/java/com/red/circle/other/app/inner/service/sys/impl/AdministratorClientServiceImpl.java index 39f6d281..68cdbf41 100644 --- a/rc-service/rc-service-other/other-inner-endpoint/src/main/java/com/red/circle/other/app/inner/service/sys/impl/AdministratorClientServiceImpl.java +++ b/rc-service/rc-service-other/other-inner-endpoint/src/main/java/com/red/circle/other/app/inner/service/sys/impl/AdministratorClientServiceImpl.java @@ -125,6 +125,7 @@ public class AdministratorClientServiceImpl implements AdministratorClientServic } administratorService.removeById(id); + userMqMessageService.sendBadgeOperateEvent(sysAdministrator.getUserId(), BadgeKeyEnum.MANAGER.name(), BadgeOperateEvent.OperationType.REMOVE.name()); userMqMessageService.sendBadgeOperateEvent(sysAdministrator.getUserId(), BadgeKeyEnum.SUPER_ADMIN.name(), BadgeOperateEvent.OperationType.REMOVE.name()); userMqMessageService.sendBadgeOperateEvent(sysAdministrator.getUserId(), BadgeKeyEnum.ADMIN.name(), BadgeOperateEvent.OperationType.REMOVE.name()); userProfileGateway.removeCache(sysAdministrator.getUserId()); @@ -148,17 +149,11 @@ public class AdministratorClientServiceImpl implements AdministratorClientServic } if (param.isDisable()) { - if (Arrays.asList(RoomRolesEnum.SUPER_ADMIN.name(), - RoomRolesEnum.MANAGER.name()).contains(administrator.getRoles())) { - userMqMessageService.sendBadgeOperateEvent(administrator.getUserId(), BadgeKeyEnum.SUPER_ADMIN.name(), BadgeOperateEvent.OperationType.REMOVE.name()); - } + userMqMessageService.sendBadgeOperateEvent(administrator.getUserId(), BadgeKeyEnum.SUPER_ADMIN.name(), BadgeOperateEvent.OperationType.REMOVE.name()); + userMqMessageService.sendBadgeOperateEvent(administrator.getUserId(), BadgeKeyEnum.MANAGER.name(), BadgeOperateEvent.OperationType.REMOVE.name()); userMqMessageService.sendBadgeOperateEvent(administrator.getUserId(), BadgeKeyEnum.ADMIN.name(), BadgeOperateEvent.OperationType.REMOVE.name()); }else { - if (Arrays.asList(RoomRolesEnum.SUPER_ADMIN.name(), - RoomRolesEnum.MANAGER.name()).contains(administrator.getRoles())) { - userMqMessageService.sendBadgeOperateEvent(administrator.getUserId(), BadgeKeyEnum.SUPER_ADMIN.name(), BadgeOperateEvent.OperationType.WEAR.name()); - } - userMqMessageService.sendBadgeOperateEvent(administrator.getUserId(), BadgeKeyEnum.ADMIN.name(), BadgeOperateEvent.OperationType.WEAR.name()); + changeBadge(administrator.getRoles(), administrator.getUserId()); } userProfileGateway.removeCache(administrator.getUserId()); @@ -182,24 +177,34 @@ public class AdministratorClientServiceImpl implements AdministratorClientServic Long userId = administrator.getUserId(); - if (RoomRolesEnum.ADMIN.name().equals(roles)) { - // 发送ADMIN勋章 - userMqMessageService.sendBadgeOperateEvent(userId, BadgeKeyEnum.ADMIN.name(), - BadgeOperateEvent.OperationType.WEAR.name()); - // 清除SUPER_ADMIN勋章 - userMqMessageService.sendBadgeOperateEvent(userId, BadgeKeyEnum.SUPER_ADMIN.name(), - BadgeOperateEvent.OperationType.REMOVE.name()); - } else if (RoomRolesEnum.SUPER_ADMIN.name().equals(roles)) { - userMqMessageService.sendBadgeOperateEvent(userId, BadgeKeyEnum.SUPER_ADMIN.name(), - BadgeOperateEvent.OperationType.WEAR.name()); - userMqMessageService.sendBadgeOperateEvent(userId, BadgeKeyEnum.ADMIN.name(), - BadgeOperateEvent.OperationType.WEAR.name()); - } else if (RoomRolesEnum.MANAGER.name().equals(roles)) { - userMqMessageService.sendBadgeOperateEvent(userId, BadgeKeyEnum.SUPER_ADMIN.name(), - BadgeOperateEvent.OperationType.WEAR.name()); - userMqMessageService.sendBadgeOperateEvent(userId, BadgeKeyEnum.ADMIN.name(), - BadgeOperateEvent.OperationType.WEAR.name()); - } + changeBadge(roles, userId); } + + private void changeBadge(String roles, Long userId) { + if (RoomRolesEnum.ADMIN.name().equals(roles)) { + // 发送ADMIN勋章 + userMqMessageService.sendBadgeOperateEvent(userId, BadgeKeyEnum.ADMIN.name(), + BadgeOperateEvent.OperationType.WEAR.name()); + // 清除SUPER_ADMIN勋章 + userMqMessageService.sendBadgeOperateEvent(userId, BadgeKeyEnum.SUPER_ADMIN.name(), + BadgeOperateEvent.OperationType.REMOVE.name()); + userMqMessageService.sendBadgeOperateEvent(userId, BadgeKeyEnum.MANAGER.name(), + BadgeOperateEvent.OperationType.REMOVE.name()); + } else if (RoomRolesEnum.SUPER_ADMIN.name().equals(roles)) { + userMqMessageService.sendBadgeOperateEvent(userId, BadgeKeyEnum.SUPER_ADMIN.name(), + BadgeOperateEvent.OperationType.WEAR.name()); + userMqMessageService.sendBadgeOperateEvent(userId, BadgeKeyEnum.ADMIN.name(), + BadgeOperateEvent.OperationType.WEAR.name()); + userMqMessageService.sendBadgeOperateEvent(userId, BadgeKeyEnum.MANAGER.name(), + BadgeOperateEvent.OperationType.REMOVE.name()); + } else if (RoomRolesEnum.MANAGER.name().equals(roles)) { + userMqMessageService.sendBadgeOperateEvent(userId, BadgeKeyEnum.MANAGER.name(), + BadgeOperateEvent.OperationType.WEAR.name()); + userMqMessageService.sendBadgeOperateEvent(userId, BadgeKeyEnum.SUPER_ADMIN.name(), + BadgeOperateEvent.OperationType.WEAR.name()); + userMqMessageService.sendBadgeOperateEvent(userId, BadgeKeyEnum.ADMIN.name(), + BadgeOperateEvent.OperationType.WEAR.name()); + } + } } diff --git a/rc-service/rc-service-other/other-start/src/test/java/ApiTest.java b/rc-service/rc-service-other/other-start/src/test/java/ApiTest.java index 6a4302e1..237514c8 100644 --- a/rc-service/rc-service-other/other-start/src/test/java/ApiTest.java +++ b/rc-service/rc-service-other/other-start/src/test/java/ApiTest.java @@ -14,7 +14,7 @@ public class ApiTest { @Test public void testPassword() { - System.out.println(new BCryptPasswordEncoder().encode("aa1234567890")); + System.out.println(new BCryptPasswordEncoder().encode("123456")); } @Test diff --git a/rc-service/rc-service-other/other-start/src/test/java/badge/BatchSendBadgeTest.java b/rc-service/rc-service-other/other-start/src/test/java/badge/BatchSendBadgeTest.java new file mode 100644 index 00000000..078fa5ca --- /dev/null +++ b/rc-service/rc-service-other/other-start/src/test/java/badge/BatchSendBadgeTest.java @@ -0,0 +1,333 @@ +package badge; + +import com.red.circle.OtherServiceApplication; +import com.red.circle.framework.dto.PageQuery; +import com.red.circle.framework.dto.PageResult; +import com.red.circle.mq.business.model.event.BadgeOperateEvent; +import com.red.circle.mq.rocket.business.producer.UserMqMessageService; +import com.red.circle.other.infra.database.mongo.entity.team.team.TeamMember; +import com.red.circle.other.infra.database.mongo.service.team.team.TeamMemberService; +import com.red.circle.other.infra.database.rds.entity.sys.Administrator; +import com.red.circle.other.infra.database.rds.entity.team.BusinessDevelopmentBaseInfo; +import com.red.circle.other.infra.database.rds.entity.team.RoomBdLead; +import com.red.circle.other.infra.database.rds.service.sys.AdministratorService; +import com.red.circle.other.infra.database.rds.service.team.BusinessDevelopmentBaseInfoService; +import com.red.circle.other.infra.database.rds.service.team.RoomBdLeadService; +import com.red.circle.other.inner.enums.material.BadgeKeyEnum; +import com.red.circle.other.inner.enums.team.TeamMemberRole; +import com.red.circle.wallet.inner.endpoint.freight.FreightGoldClient; +import com.red.circle.wallet.inner.model.cmd.UserFreightBalancePageQryCmd; +import com.red.circle.wallet.inner.model.dto.UserFreightBalanceDTO; +import lombok.extern.slf4j.Slf4j; +import org.junit.Test; +import org.junit.runner.RunWith; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.boot.test.context.SpringBootTest; +import org.springframework.test.context.junit4.SpringRunner; + +import java.util.Collection; +import java.util.List; +import java.util.concurrent.ExecutorService; +import java.util.concurrent.Executors; +import java.util.concurrent.TimeUnit; +import java.util.concurrent.atomic.AtomicInteger; + +@Slf4j +@SpringBootTest(classes = OtherServiceApplication.class) +@RunWith(SpringRunner.class) +public class BatchSendBadgeTest { + + @Autowired + private TeamMemberService teamMemberService; + @Autowired + private UserMqMessageService userMqMessageService; + @Autowired + private BusinessDevelopmentBaseInfoService businessDevelopmentBaseInfoService; + @Autowired + private RoomBdLeadService roomBdLeadService; + @Autowired + private AdministratorService administratorService; + @Autowired + private FreightGoldClient freightGoldClient; + + // 线程池大小 + private static final int THREAD_POOL_SIZE = 10; + // 每批次处理间隔(毫秒) + private static final long BATCH_INTERVAL_MS = 200; + + @Test + public void batchSendBadgeTest() throws InterruptedException { + ExecutorService executor = Executors.newFixedThreadPool(THREAD_POOL_SIZE); + + try { + // 1. 批量发放代理主播勋章 (HOST + AGENCY) +// sendHostAndAgencyBadges(executor); + + // 2. 批量发放BD LEADER勋章 +// sendBdLeaderBadges(executor); + + // 3. 批量发放BD勋章 +// sendBdBadges(executor); + + // 4. 批量发放管理员勋章 +// sendAdminBadges(executor); + + // 5. 批量发放金币代理勋章 + sendRechargeAgencyBadges(executor); + + } finally { + executor.shutdown(); + executor.awaitTermination(1, TimeUnit.HOURS); + log.info("所有勋章发放任务完成"); + } + } + + /** + * 发放代理主播勋章. + */ + private void sendHostAndAgencyBadges(ExecutorService executor) { + List list = teamMemberService.list(); + log.info("开始发放代理主播勋章,总数: {}", list.size()); + + AtomicInteger counter = new AtomicInteger(0); + + list.forEach(teamMember -> { + executor.submit(() -> { + try { + Long userId = teamMember.getMemberId(); + + // 发放主播勋章 + userMqMessageService.sendBadgeOperateEvent( + userId, + BadgeKeyEnum.HOST.name(), + BadgeOperateEvent.OperationType.WEAR.name() + ); + + if (teamMember.getRole() == TeamMemberRole.OWN) { + // 发放代理勋章 + userMqMessageService.sendBadgeOperateEvent( + userId, + BadgeKeyEnum.AGENCY.name(), + BadgeOperateEvent.OperationType.WEAR.name() + ); + } + + int count = counter.incrementAndGet(); + if (count % 100 == 0) { + log.info("代理主播勋章发放进度: {}/{}", count, list.size()); + } + + // 控制发送速率 + Thread.sleep(BATCH_INTERVAL_MS); + } catch (Exception e) { + log.error("发放代理主播勋章失败, userId: {}", teamMember.getMemberId(), e); + } + }); + }); + + log.info("代理主播勋章发放任务提交完成"); + } + + /** + * 发放BD Leader勋章. + */ + private void sendBdLeaderBadges(ExecutorService executor) { + List list = roomBdLeadService.list(); + log.info("开始发放BD Leader勋章,总数: {}", list.size()); + + AtomicInteger counter = new AtomicInteger(0); + + list.forEach(bdLead -> { + executor.submit(() -> { + try { + Long userId = bdLead.getUserId(); + + userMqMessageService.sendBadgeOperateEvent( + userId, + BadgeKeyEnum.BD_LEADER.name(), + BadgeOperateEvent.OperationType.WEAR.name() + ); + + int count = counter.incrementAndGet(); + if (count % 100 == 0) { + log.info("BD Leader勋章发放进度: {}/{}", count, list.size()); + } + + Thread.sleep(BATCH_INTERVAL_MS); + } catch (Exception e) { + log.error("发放BD Leader勋章失败, userId: {}", bdLead.getUserId(), e); + } + }); + }); + + log.info("BD Leader勋章发放任务提交完成"); + } + + /** + * 发放BD勋章. + */ + private void sendBdBadges(ExecutorService executor) { + List list = businessDevelopmentBaseInfoService.listAll(); + log.info("开始发放BD勋章,总数: {}", list.size()); + + AtomicInteger counter = new AtomicInteger(0); + + list.forEach(bd -> { + executor.submit(() -> { + try { + Long userId = bd.getUserId(); + + userMqMessageService.sendBadgeOperateEvent( + userId, + BadgeKeyEnum.BD.name(), + BadgeOperateEvent.OperationType.WEAR.name() + ); + + int count = counter.incrementAndGet(); + if (count % 100 == 0) { + log.info("BD勋章发放进度: {}/{}", count, list.size()); + } + + Thread.sleep(BATCH_INTERVAL_MS); + } catch (Exception e) { + log.error("发放BD勋章失败, userId: {}", bd.getUserId(), e); + } + }); + }); + + log.info("BD勋章发放任务提交完成"); + } + + /** + * 发放管理员勋章. + */ + private void sendAdminBadges(ExecutorService executor) { + List list = administratorService.list(); + log.info("开始发放管理员勋章,总数: {}", list.size()); + + AtomicInteger counter = new AtomicInteger(0); + + list.forEach(admin -> { + executor.submit(() -> { + try { + Long userId = admin.getUserId(); + String roles = admin.getRoles(); + if (!Boolean.TRUE.equals(admin.getStatus())) { + return; + } + + if ("ADMIN".equals(roles)) { + // ADMIN角色:只发ADMIN勋章 + userMqMessageService.sendBadgeOperateEvent( + userId, + BadgeKeyEnum.ADMIN.name(), + BadgeOperateEvent.OperationType.WEAR.name() + ); + } else if ("SUPER_ADMIN".equals(roles)) { + // SUPER_ADMIN角色:发SUPER_ADMIN勋章 + userMqMessageService.sendBadgeOperateEvent( + userId, + BadgeKeyEnum.SUPER_ADMIN.name(), + BadgeOperateEvent.OperationType.WEAR.name() + ); + } else if ("MANAGER".equals(roles)) { + // MANAGER角色:发SUPER_ADMIN和ADMIN勋章 + userMqMessageService.sendBadgeOperateEvent( + userId, + BadgeKeyEnum.SUPER_ADMIN.name(), + BadgeOperateEvent.OperationType.WEAR.name() + ); + userMqMessageService.sendBadgeOperateEvent( + userId, + BadgeKeyEnum.ADMIN.name(), + BadgeOperateEvent.OperationType.WEAR.name() + ); + } + + int count = counter.incrementAndGet(); + if (count % 100 == 0) { + log.info("管理员勋章发放进度: {}/{}", count, list.size()); + } + + Thread.sleep(BATCH_INTERVAL_MS); + } catch (Exception e) { + log.error("发放管理员勋章失败, userId: {}", admin.getUserId(), e); + } + }); + }); + + log.info("管理员勋章发放任务提交完成"); + } + + /** + * 发放充值代理勋章. + */ + private void sendRechargeAgencyBadges(ExecutorService executor) { + log.info("开始发放充值代理勋章"); + + AtomicInteger totalCounter = new AtomicInteger(0); + int cursor = 1; + boolean hasMore = true; + + while (hasMore) { + PageQuery pageQuery = new PageQuery(); + pageQuery.setCursor(cursor); + pageQuery.setLimit(500); + pageQuery.setSearchCount(true); + + UserFreightBalancePageQryCmd cmd = new UserFreightBalancePageQryCmd(); + cmd.setClose(false); + cmd.setPageQuery(pageQuery); + + try { + PageResult freightPageResult = + freightGoldClient.pageFreight(cmd).getBody(); + Collection records = freightPageResult.getRecords(); + + if (records == null || records.isEmpty()) { + hasMore = false; + break; + } + + log.info("充值代理勋章发放,当前页: {}, 本页数量: {}", cursor, records.size()); + + records.forEach(freight -> { + executor.submit(() -> { + try { + Long userId = freight.getUserId(); + if (freight.getClose()) { + return; + } + + userMqMessageService.sendBadgeOperateEvent( + userId, + BadgeKeyEnum.RECHARGE_AGENCY.name(), + BadgeOperateEvent.OperationType.WEAR.name() + ); + + int count = totalCounter.incrementAndGet(); + if (count % 100 == 0) { + log.info("充值代理勋章发放进度: {}", count); + } + + Thread.sleep(BATCH_INTERVAL_MS); + } catch (Exception e) { + log.error("发放充值代理勋章失败, userId: {}", freight.getUserId(), e); + } + }); + }); + + cursor++; + + // 检查是否还有下一页 + hasMore = freightPageResult.getTotal() > cursor * 500; + + } catch (Exception e) { + log.error("查询充值代理列表失败, cursor: {}", cursor, e); + hasMore = false; + } + } + + log.info("充值代理勋章发放任务提交完成,总数: {}", totalCounter.get()); + } +}