新增 批量创建家族脚本
This commit is contained in:
parent
47e7742f7f
commit
6e906a7f15
@ -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<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());
|
||||
}
|
||||
}
|
||||
Loading…
x
Reference in New Issue
Block a user