diff --git a/rc-service/rc-service-other/other-start/src/test/java/TeamToFamilyScript.java b/rc-service/rc-service-other/other-start/src/test/java/TeamToFamilyScript.java new file mode 100644 index 00000000..381146a7 --- /dev/null +++ b/rc-service/rc-service-other/other-start/src/test/java/TeamToFamilyScript.java @@ -0,0 +1,354 @@ +package com.red.circle.other.script; + +import com.red.circle.other.domain.gateway.user.UserProfileGateway; +import com.red.circle.other.domain.gateway.user.ability.UserRegionGateway; +import com.red.circle.other.domain.model.user.OwnSpecialId; +import com.red.circle.other.domain.model.user.UserProfile; +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.family.FamilyBaseInfo; +import com.red.circle.other.infra.database.rds.entity.family.FamilyMemberInfo; +import com.red.circle.other.infra.database.rds.service.family.FamilyBaseInfoService; +import com.red.circle.other.infra.database.rds.service.family.FamilyMemberInfoService; +import com.red.circle.other.infra.enums.family.FamilyRoleEnum; +import com.red.circle.other.infra.enums.family.FamilyStatusEnum; +import com.red.circle.other.inner.enums.team.TeamMemberRole; +import com.red.circle.tool.core.sequence.IdWorkerUtils; +import lombok.extern.slf4j.Slf4j; +import org.junit.jupiter.api.Test; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.boot.test.context.SpringBootTest; + +import java.util.List; +import java.util.Optional; + +/** + * 团队成员转家族脚本 + * + * 需求:将一个团队的所有用户设置为一个家族 + * - 族长:TeamMember 中 role=OWN 的用户 + * - 成员:其他所有 TeamMember + * - 家族头像:使用族长的用户头像 + * - 公告和介绍:空 + * - 账号:有靓号用靓号,没有用 account + * - familyLevelId:1(默认值) + * + * @author Leo + * @since 2025-01-01 + */ +@Slf4j +@SpringBootTest +public class TeamToFamilyScript { + + @Autowired + private TeamMemberService teamMemberService; + + @Autowired + private FamilyBaseInfoService familyBaseInfoService; + + @Autowired + private FamilyMemberInfoService familyMemberInfoService; + + @Autowired + private UserProfileGateway userProfileGateway; + + @Autowired + private UserRegionGateway userRegionGateway; + + /** + * 指定团队ID执行转换 + * + * 执行前请修改此处的团队ID + */ + private static final Long TARGET_TEAM_ID = 1984235784268349441L; + + /** + * 系统来源 + */ + private static final String SYS_ORIGIN = "LIKEI"; + + /** + * 默认家族等级 + */ + private static final Long DEFAULT_FAMILY_LEVEL_ID = 1L; + + /** + * 批量执行所有团队转家族 + * + * 遍历所有团队,为每个团队创建对应的家族 + */ + @Test + public void executeAllTeamsToFamily() { + log.info("=== 开始批量执行所有团队转家族脚本 ==="); + + try { + // 1. 获取所有团队成员(会得到所有team的成员) + List allMembers = teamMemberService.list(); + + if (allMembers == null || allMembers.isEmpty()) { + log.error("系统中没有任何团队成员"); + return; + } + + log.info("获取到总成员数量: {}", allMembers.size()); + + // 2. 按 teamId 分组 + java.util.Map> teamMap = allMembers.stream() + .collect(java.util.stream.Collectors.groupingBy(TeamMember::getTeamId)); + + log.info("总团队数量: {}", teamMap.size()); + + // 3. 遍历每个团队,创建家族 + int successCount = 0; + int failCount = 0; + int skipCount = 0; + + for (java.util.Map.Entry> entry : teamMap.entrySet()) { + Long teamId = entry.getKey(); + List teamMembers = entry.getValue(); + + log.info("\n--- 开始处理团队: teamId={}, 成员数量={} ---", teamId, teamMembers.size()); + + try { + boolean result = convertTeamToFamily(teamId, teamMembers); + if (result) { + successCount++; + log.info("团队转家族成功: teamId={}", teamId); + } else { + skipCount++; + log.warn("团队转家族跳过: teamId={}", teamId); + } + } catch (Exception e) { + failCount++; + log.error("团队转家族失败: teamId={}", teamId, e); + // 继续处理下一个团队 + } + } + + log.info("\n=== 批量执行完成 ==="); + log.info("总团队数: {}", teamMap.size()); + log.info("成功: {}", successCount); + log.info("跳过: {}", skipCount); + log.info("失败: {}", failCount); + + } catch (Exception e) { + log.error("批量执行脚本失败", e); + throw e; + } + } + + /** + * 单个团队转家族(指定团队ID) + */ + @Test + public void executeTeamToFamily() { + log.info("=== 开始执行团队转家族脚本 ==="); + log.info("目标团队ID: {}", TARGET_TEAM_ID); + + try { + // 1. 获取团队所有成员 + List teamMembers = teamMemberService.listByTeamId(TARGET_TEAM_ID); + + if (teamMembers == null || teamMembers.isEmpty()) { + log.error("团队成员列表为空,团队ID: {}", TARGET_TEAM_ID); + return; + } + + log.info("获取到团队成员数量: {}", teamMembers.size()); + + // 2. 找到族长(OWN) + TeamMember owner = teamMembers.stream() + .filter(member -> TeamMemberRole.OWN.name().equals(member.getRole().name())) + .findFirst() + .orElse(null); + + if (owner == null) { + log.error("未找到团长(OWN),无法创建家族,团队ID: {}", TARGET_TEAM_ID); + return; + } + + log.info("找到团长: userId={}, role={}", owner.getMemberId(), owner.getRole()); + + // 3. 检查族长是否已经有家族 + FamilyMemberInfo existingFamilyMember = familyMemberInfoService.getFamilyMemberByUserId(owner.getMemberId()); + if (existingFamilyMember != null) { + log.error("族长已经加入家族,userId={}, familyId={}", owner.getMemberId(), existingFamilyMember.getFamilyId()); + return; + } + + // 4. 获取族长的用户信息 + UserProfile ownerProfile = userProfileGateway.getByUserId(owner.getMemberId()); + if (ownerProfile == null) { + log.error("未找到族长用户信息,userId={}", owner.getMemberId()); + return; + } + + log.info("族长用户信息: nickname={}, account={}, avatar={}", + ownerProfile.getUserNickname(), + ownerProfile.getAccount(), + ownerProfile.getUserAvatar()); + + // 5. 生成家族ID + Long familyId = IdWorkerUtils.getId(); + log.info("生成家族ID: {}", familyId); + + // 6. 创建家族基础信息 + createFamilyBaseInfo(familyId, ownerProfile); + + // 7. 添加族长为家族成员(ADMIN) + addFamilyMember(familyId, owner.getMemberId(), FamilyRoleEnum.ADMIN); + + // 8. 添加其他成员 + int memberCount = 0; + for (TeamMember member : teamMembers) { + // 跳过族长(已经添加) + if (TeamMemberRole.OWN.name().equals(member.getRole().name())) { + continue; + } + + // 检查成员是否已经有家族 + FamilyMemberInfo existingMember = familyMemberInfoService.getFamilyMemberByUserId(member.getMemberId()); + if (existingMember != null) { + log.warn("成员已经加入家族,跳过:userId={}, existingFamilyId={}", member.getMemberId(), existingMember.getFamilyId()); + continue; + } + + // 添加为普通成员 + addFamilyMember(familyId, member.getMemberId(), FamilyRoleEnum.MEMBER); + memberCount++; + } + + log.info("=== 团队转家族完成 ==="); + log.info("家族ID: {}", familyId); + log.info("族长: userId={}", owner.getMemberId()); + log.info("添加成员数量: {}", memberCount); + log.info("总成员数量: {}", memberCount + 1); + + } catch (Exception e) { + log.error("执行团队转家族脚本失败", e); + throw e; + } + } + + /** + * 转换单个团队为家族(核心逻辑) + * + * @param teamId 团队ID + * @param teamMembers 团队成员列表 + * @return true-转换成功,false-跳过转换 + */ + private boolean convertTeamToFamily(Long teamId, List teamMembers) { + if (teamMembers == null || teamMembers.isEmpty()) { + log.warn("团队成员列表为空,teamId={}", teamId); + return false; + } + + // 1. 找到族长(OWN) + TeamMember owner = teamMembers.stream() + .filter(member -> TeamMemberRole.OWN.name().equals(member.getRole().name())) + .findFirst() + .orElse(null); + + if (owner == null) { + log.warn("未找到团长(OWN),跳过,teamId={}", teamId); + return false; + } + + // 2. 检查族长是否已经有家族 + FamilyMemberInfo existingFamilyMember = familyMemberInfoService.getFamilyMemberByUserId(owner.getMemberId()); + if (existingFamilyMember != null) { + log.warn("族长已经加入家族,跳过,userId={}, existingFamilyId={}, teamId={}", + owner.getMemberId(), existingFamilyMember.getFamilyId(), teamId); + return false; + } + + // 3. 获取族长的用户信息 + UserProfile ownerProfile = userProfileGateway.getByUserId(owner.getMemberId()); + if (ownerProfile == null) { + log.warn("未找到族长用户信息,跳过,userId={}, teamId={}", owner.getMemberId(), teamId); + return false; + } + + // 4. 生成家族ID + Long familyId = IdWorkerUtils.getId(); + log.info("生成家族ID: {}, teamId={}", familyId, teamId); + + // 5. 创建家族基础信息 + createFamilyBaseInfo(familyId, ownerProfile); + + // 6. 添加族长为家族成员(ADMIN) + addFamilyMember(familyId, owner.getMemberId(), FamilyRoleEnum.ADMIN); + + // 7. 添加其他成员 + int memberCount = 0; + for (TeamMember member : teamMembers) { + // 跳过族长(已经添加) + if (TeamMemberRole.OWN.name().equals(member.getRole().name())) { + continue; + } + + // 检查成员是否已经有家族 + FamilyMemberInfo existingMember = familyMemberInfoService.getFamilyMemberByUserId(member.getMemberId()); + if (existingMember != null) { + log.warn("成员已经加入家族,跳过:userId={}, existingFamilyId={}, teamId={}", + member.getMemberId(), existingMember.getFamilyId(), teamId); + continue; + } + + // 添加为普通成员 + addFamilyMember(familyId, member.getMemberId(), FamilyRoleEnum.MEMBER); + memberCount++; + } + + log.info("团队转家族完成: teamId={}, familyId={}, 族长={}, 成员数={}, 总数={}", + teamId, familyId, owner.getMemberId(), memberCount, memberCount + 1); + + return true; + } + + /** + * 创建家族基础信息 + */ + private void createFamilyBaseInfo(Long familyId, UserProfile ownerProfile) { + // 账号:有靓号用靓号,没有用 account + String familyAccount = Optional.ofNullable(ownerProfile.getOwnSpecialId()) + .map(OwnSpecialId::getAccount) + .orElse(ownerProfile.getAccount()); + + FamilyBaseInfo familyBaseInfo = new FamilyBaseInfo() + .setId(familyId) + .setSysOrigin(SYS_ORIGIN) + .setRegionId(userRegionGateway.getRegionId(ownerProfile.getId())) + .setFamilyAccount(familyAccount) + .setFamilyAvatar(ownerProfile.getUserAvatar()) + .setFamilyName(ownerProfile.getUserNickname() + "'s family") + .setFamilyLevelId(DEFAULT_FAMILY_LEVEL_ID) + .setFamilyStatus(FamilyStatusEnum.NORMAL.name()) + .setFamilyIntro("") + .setFamilyNotice(""); + + familyBaseInfo.setCreateUser(ownerProfile.getId()); + familyBaseInfoService.save(familyBaseInfo); + + log.info("创建家族基础信息成功: familyId={}, familyAccount={}, familyName={}", + familyId, familyAccount, familyBaseInfo.getFamilyName()); + } + + /** + * 添加家族成员 + */ + private void addFamilyMember(Long familyId, Long userId, FamilyRoleEnum role) { + Long memberId = IdWorkerUtils.getId(); + + FamilyMemberInfo familyMemberInfo = new FamilyMemberInfo() + .setId(memberId) + .setFamilyId(familyId) + .setSysOrigin(SYS_ORIGIN) + .setMemberUserId(userId) + .setMemberRole(role.name()); + + familyMemberInfoService.save(familyMemberInfo); + + log.info("添加家族成员成功: userId={}, role={}", userId, role.name()); + } +}