diff --git a/im-center-server/src/main/java/cn/axzo/im/dao/repository/GroupDao.java b/im-center-server/src/main/java/cn/axzo/im/dao/repository/GroupDao.java index 5945663..a795556 100644 --- a/im-center-server/src/main/java/cn/axzo/im/dao/repository/GroupDao.java +++ b/im-center-server/src/main/java/cn/axzo/im/dao/repository/GroupDao.java @@ -1,5 +1,6 @@ package cn.axzo.im.dao.repository; +import cn.axzo.im.center.common.enums.GroupType; import cn.axzo.im.center.common.enums.YesOrNo; import cn.axzo.im.dao.mapper.GroupMapper; import cn.axzo.im.entity.Group; @@ -45,4 +46,12 @@ public class GroupDao extends ServiceImpl { .update(); } + public Optional findByBizCode(String bizCode, GroupType groupType, boolean forUpdate) { + return lambdaQuery() + .eq(Group::getBizCode, bizCode) + .eq(Group::getType, groupType) + .last(forUpdate, "FOR UPDATE") + .oneOpt(); + } + } \ No newline at end of file diff --git a/im-center-server/src/main/java/cn/axzo/im/group/GroupManager.java b/im-center-server/src/main/java/cn/axzo/im/group/GroupManager.java index 2159f69..ac9e7ff 100644 --- a/im-center-server/src/main/java/cn/axzo/im/group/GroupManager.java +++ b/im-center-server/src/main/java/cn/axzo/im/group/GroupManager.java @@ -1,6 +1,5 @@ package cn.axzo.im.group; -import cn.axzo.basics.common.exception.ServiceException; import cn.axzo.im.center.api.enums.MqEventType; import cn.axzo.im.center.api.vo.PersonAccountAttribute; import cn.axzo.im.center.api.vo.req.GroupAddMembersRequest; @@ -31,7 +30,6 @@ import com.alibaba.fastjson.JSON; import lombok.RequiredArgsConstructor; import lombok.extern.slf4j.Slf4j; import org.apache.commons.collections4.CollectionUtils; -import org.springframework.dao.DuplicateKeyException; import org.springframework.stereotype.Component; import org.springframework.transaction.annotation.Transactional; @@ -64,18 +62,17 @@ public class GroupManager { public GroupCreateResponse createGroup(GroupCreateRequest request) { BizAssertions.assertTrue(request.getPeople().size() > 1, "群成员数量(含群主)不能少于2"); groupSupport.log(0L, "create-group:preparing", request); + Group savedGroup = groupDao.findByBizCode(request.getBizCode(), request.getGroupType(), true) + .orElse(null); + BizAssertions.assertNull(savedGroup == null || savedGroup.isDismissed(), + String.format("群已经存在: %s", request.getName())); ImAccounts imAccounts = accountService.getOrCreateImAccounts(request.getPeople()); String owner = imAccounts.findAccount(request.getOwner()).orElse(null); BizAssertions.assertNotNull(owner, "群主没有IM账号, 无法创建群. {}", request.getOwner()); Group group = groupSupport.buildNewGroup(request, imAccounts); BizAssertions.assertTrue(group.addMoreMembers( request.getPeople().size()), "无法创建群, 群成员数量超过上限" + group.getMemberLimit()); - try { - groupDao.save(group); - } catch (DuplicateKeyException e) { - log.warn("重复创建群, request={}", request, e); - throw new ServiceException(403, String.format("群已经存在: %s", request.getName())); - } + groupDao.save(group); NimGroupCreateRequest nimRequest = groupSupport .buildNimCreateGroupRequest(request, imAccounts); rateLimiter.requireCreateGroup();