新增 批量创建家族脚本

This commit is contained in:
tianfeng 2025-12-31 14:13:56 +08:00
parent 47e7742f7f
commit 6e906a7f15

View File

@ -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
* - familyLevelId1默认值
*
* @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<TeamMember> allMembers = teamMemberService.list();
if (allMembers == null || allMembers.isEmpty()) {
log.error("系统中没有任何团队成员");
return;
}
log.info("获取到总成员数量: {}", allMembers.size());
// 2. teamId 分组
java.util.Map<Long, List<TeamMember>> 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<Long, List<TeamMember>> entry : teamMap.entrySet()) {
Long teamId = entry.getKey();
List<TeamMember> 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<TeamMember> 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<TeamMember> 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());
}
}