REQ-3345: 解决查询不到账号的问题

This commit is contained in:
yanglin 2025-02-18 14:41:49 +08:00
parent f5c3b8d4b1
commit bf304c8292

View File

@ -32,6 +32,7 @@ import lombok.extern.slf4j.Slf4j;
import org.apache.commons.collections4.CollectionUtils; import org.apache.commons.collections4.CollectionUtils;
import org.springframework.stereotype.Component; import org.springframework.stereotype.Component;
import org.springframework.transaction.annotation.Transactional; import org.springframework.transaction.annotation.Transactional;
import org.springframework.transaction.support.TransactionTemplate;
import javax.validation.constraints.NotNull; import javax.validation.constraints.NotNull;
import java.util.Collections; import java.util.Collections;
@ -57,8 +58,8 @@ public class GroupManager {
private final GroupMemberSyncer groupMemberSyncer; private final GroupMemberSyncer groupMemberSyncer;
private final GroupRateLimiter rateLimiter; private final GroupRateLimiter rateLimiter;
private final Notification notification; private final Notification notification;
private final TransactionTemplate transactionTemplate;
@Transactional
public GroupCreateResponse createGroup(GroupCreateRequest request) { public GroupCreateResponse createGroup(GroupCreateRequest request) {
BizAssertions.assertTrue(request.getPeople().size() > 1, "群成员数量(含群主)不能少于2"); BizAssertions.assertTrue(request.getPeople().size() > 1, "群成员数量(含群主)不能少于2");
groupSupport.log(0L, "create-group:preparing", request); groupSupport.log(0L, "create-group:preparing", request);
@ -67,32 +68,34 @@ public class GroupManager {
BizAssertions.assertTrue(savedGroup == null || savedGroup.isDismissed(), BizAssertions.assertTrue(savedGroup == null || savedGroup.isDismissed(),
String.format("群已经存在: %s", request.getName())); String.format("群已经存在: %s", request.getName()));
ImAccounts imAccounts = accountService.getOrCreateImAccounts(request.getPeople()); ImAccounts imAccounts = accountService.getOrCreateImAccounts(request.getPeople());
String owner = imAccounts.findAccount(request.getOwner()).orElse(null); return transactionTemplate.execute(unused -> {
BizAssertions.assertNotNull(owner, "群主没有IM账号, 无法创建群. {}", request.getOwner()); String owner = imAccounts.findAccount(request.getOwner()).orElse(null);
Group group = groupSupport.buildNewGroup(request, imAccounts); BizAssertions.assertNotNull(owner, "群主没有IM账号, 无法创建群. {}", request.getOwner());
BizAssertions.assertTrue(group.addMoreMembers( Group group = groupSupport.buildNewGroup(request, imAccounts);
request.getPeople().size()), "无法创建群, 群成员数量超过上限" + group.getMemberLimit()); BizAssertions.assertTrue(group.addMoreMembers(
groupDao.save(group); request.getPeople().size()), "无法创建群, 群成员数量超过上限" + group.getMemberLimit());
NimGroupCreateRequest nimRequest = groupSupport groupDao.save(group);
.buildNimCreateGroupRequest(request, imAccounts); NimGroupCreateRequest nimRequest = groupSupport
rateLimiter.requireCreateGroup(); .buildNimCreateGroupRequest(request, imAccounts);
NimGroupCreateResponse nimResponse = nimClient.createGroup(nimRequest); rateLimiter.requireCreateGroup();
log.info("创建群, request={}, response={}", nimRequest, nimResponse); NimGroupCreateResponse nimResponse = nimClient.createGroup(nimRequest);
BizAssertions.assertTrue(nimResponse.isSuccess(), "创建群失败: {}", nimResponse.getDesc()); log.info("创建群, request={}, response={}", nimRequest, nimResponse);
groupDao.updateTid(group.getId(), nimResponse.getTid()); BizAssertions.assertTrue(nimResponse.isSuccess(), "创建群失败: {}", nimResponse.getDesc());
group = groupDao.getById(group.getId()); groupDao.updateTid(group.getId(), nimResponse.getTid());
groupSupport.log(group.getTid(), "create-group", request); group = groupDao.getById(group.getId());
groupMemberSyncer.syncMembers(group); groupSupport.log(group.getTid(), "create-group", request);
// 同步完成员后再发消息, 因为接收方可能会查询群成员 groupMemberSyncer.syncMembers(group);
groupBroadcaster.fireGroupChanged(group, MqEventType.GROUP_CREATED); // 同步完成员后再发消息, 因为接收方可能会查询群成员
groupBroadcaster.fireMembersChanged(group, groupBroadcaster.fireGroupChanged(group, MqEventType.GROUP_CREATED);
groupMemberDao.getByTid(nimResponse.getTid()), groupBroadcaster.fireMembersChanged(group,
MqEventType.GROUP_ADD_MEMBERS); groupMemberDao.getByTid(nimResponse.getTid()),
GroupCreateResponse response = new GroupCreateResponse(); MqEventType.GROUP_ADD_MEMBERS);
response.setTid(nimResponse.getTid()); GroupCreateResponse response = new GroupCreateResponse();
response.setAccountsNotFound(getAccountNotFoundPersons( response.setTid(nimResponse.getTid());
"创建群", imAccounts, group, request.getMembers())); response.setAccountsNotFound(getAccountNotFoundPersons(
return response; "创建群", imAccounts, group, request.getMembers()));
return response;
});
} }
@Transactional @Transactional
@ -112,7 +115,6 @@ public class GroupManager {
groupBroadcaster.fireGroupChanged(group, MqEventType.GROUP_DISMISSED); groupBroadcaster.fireGroupChanged(group, MqEventType.GROUP_DISMISSED);
} }
@Transactional
public GroupAddMembersResponse addMembers(GroupAddMembersRequest request) { public GroupAddMembersResponse addMembers(GroupAddMembersRequest request) {
Group group = getGroupForUpdateOrThrow(request.getTid()); Group group = getGroupForUpdateOrThrow(request.getTid());
BizAssertions.assertFalse(group.isDismissed(), "群已经解散"); BizAssertions.assertFalse(group.isDismissed(), "群已经解散");
@ -129,27 +131,29 @@ public class GroupManager {
BizAssertions.assertTrue(group.addMoreMembers(prePersons.size() + addPersons.size()), BizAssertions.assertTrue(group.addMoreMembers(prePersons.size() + addPersons.size()),
"群聊人数上限{}人, 请删除部分已选人员", group.getMemberLimit()); "群聊人数上限{}人, 请删除部分已选人员", group.getMemberLimit());
ImAccounts imAccounts = accountService.getOrCreateImAccounts(addPersons); ImAccounts imAccounts = accountService.getOrCreateImAccounts(addPersons);
if (imAccounts.isAccountEmpty()) { return transactionTemplate.execute(unused -> {
notification.send("添加群成员[{},{}], 有效群成员IM账号列表为空. 请求成员信息: {}", if (imAccounts.isAccountEmpty()) {
group.getTid(), group.getName(), JSON.toJSONString(request.getMembers())); notification.send("添加群成员[{},{}], 有效群成员IM账号列表为空. 请求成员信息: {}",
return new GroupAddMembersResponse(); group.getTid(), group.getName(), JSON.toJSONString(request.getMembers()));
} return new GroupAddMembersResponse();
NimGroupAddMembersRequest nimRequest = groupSupport }
.buildAddMembersRequest(group, group.getOwnerAccount(), imAccounts); NimGroupAddMembersRequest nimRequest = groupSupport
// add members .buildAddMembersRequest(group, group.getOwnerAccount(), imAccounts);
rateLimiter.requireAddMember(); // add members
NimGroupAddMembersResponse nimResponse = nimClient.addGroupMembers(nimRequest); rateLimiter.requireAddMember();
log.info("添加群成员, request={}, response={}", nimRequest, nimResponse); NimGroupAddMembersResponse nimResponse = nimClient.addGroupMembers(nimRequest);
BizAssertions.assertTrue(nimResponse.isSuccess(), "添加群成员失败: {}", nimResponse.getDesc()); log.info("添加群成员, request={}, response={}", nimRequest, nimResponse);
// sync members 2 BizAssertions.assertTrue(nimResponse.isSuccess(), "添加群成员失败: {}", nimResponse.getDesc());
groupMemberSyncer.syncMembers(group); // sync members 2
groupBroadcaster.fireMembersChanged(group, groupMemberSyncer.syncMembers(group);
groupMemberDao.getByPersons(group.getTid(), addPersons), groupBroadcaster.fireMembersChanged(group,
MqEventType.GROUP_ADD_MEMBERS); groupMemberDao.getByPersons(group.getTid(), addPersons),
GroupAddMembersResponse response = new GroupAddMembersResponse(); MqEventType.GROUP_ADD_MEMBERS);
response.setAccountsNotFound(getAccountNotFoundPersons( GroupAddMembersResponse response = new GroupAddMembersResponse();
"添加群成员", imAccounts, group, addPersons)); response.setAccountsNotFound(getAccountNotFoundPersons(
return response; "添加群成员", imAccounts, group, addPersons));
return response;
});
} }
@Transactional @Transactional