|
@@ -213,6 +213,7 @@ public class ImGroupCoreServiceImpl implements ImGroupCoreService {
|
|
|
.nickname(userInfo.getNickname())
|
|
|
.isAdmin(true)
|
|
|
.roleType(userInfo.getRoleType())
|
|
|
+ .groupRoleType(EImGroupMemberRoleType.Admin)
|
|
|
.build();
|
|
|
|
|
|
groupMembers.add(groupMember.imUserId(getImUserId(groupMember.getUserId().toString(),userInfo.getClientType())));
|
|
@@ -698,8 +699,74 @@ public class ImGroupCoreServiceImpl implements ImGroupCoreService {
|
|
|
@Override
|
|
|
public void changeGroupOwner(String groupId, String newOwner, String oldOwner) throws Exception {
|
|
|
|
|
|
+ try {
|
|
|
+ if (newOwner.equals(oldOwner)) {
|
|
|
+ throw new BizException("不能转让给自己");
|
|
|
+ }
|
|
|
+
|
|
|
+ {
|
|
|
+ // 判断旧群主
|
|
|
+ String[] values = analysisImUserId(oldOwner).split(IM_USER_ID_SPLIT);
|
|
|
+
|
|
|
+ // 新群主ID和身份
|
|
|
+ long userId = Long.parseLong(values[0]);
|
|
|
+ String clientType = values[1];
|
|
|
+ ImGroupMember groupMember = imGroupMemberService.lambdaQuery()
|
|
|
+ .eq(ImGroupMember::getGroupId, groupId)
|
|
|
+ .eq(ImGroupMember::getUserId, userId)
|
|
|
+ .eq(ImGroupMember::getRoleType, clientType)
|
|
|
+ .eq(ImGroupMember::getIsAdmin, true)
|
|
|
+ .last("LIMIT 1")
|
|
|
+ .one();
|
|
|
+ if (groupMember == null) {
|
|
|
+ throw new BizException("旧群主错误");
|
|
|
+ }
|
|
|
+ }
|
|
|
+
|
|
|
+ {
|
|
|
+ // 判定新群主是否为禁言状态,需要先解除禁言
|
|
|
+ String[] values = analysisImUserId(newOwner).split(IM_USER_ID_SPLIT);
|
|
|
+
|
|
|
+ // 新群主ID和身份
|
|
|
+ long userId = Long.parseLong(values[0]);
|
|
|
+ String clientType = values[1];
|
|
|
+
|
|
|
+ ImGroupMember member = imGroupMemberService.lambdaQuery()
|
|
|
+ .eq(ImGroupMember::getGroupId, groupId)
|
|
|
+ .eq(ImGroupMember::getUserId, userId)
|
|
|
+ .eq(ImGroupMember::getRoleType, clientType)
|
|
|
+ .last("LIMIT 1")
|
|
|
+ .one();
|
|
|
+ if (Objects.isNull(member)) {
|
|
|
+ throw new BizException("新群主用户不存在");
|
|
|
+ }
|
|
|
+ // 解除禁言
|
|
|
+ if (Optional.ofNullable(member.getGroupMute()).orElse(false)) {
|
|
|
+ imPluginContext.getPluginService().groupUserGagRemove(getImUserId(newOwner, clientType), groupId);
|
|
|
+
|
|
|
+ // 更新用户群禁言状态
|
|
|
+ imGroupMemberService.lambdaUpdate()
|
|
|
+ .eq(ImGroupMember::getId, member.getId())
|
|
|
+ .set(ImGroupMember::getGroupMute, false)
|
|
|
+ .update();
|
|
|
+ }
|
|
|
+ }
|
|
|
+ // 转主群主
|
|
|
+ imPluginContext.getPluginService().changeGroupOwner(groupId, newOwner, oldOwner);
|
|
|
+
|
|
|
+ // 修改群成员身份
|
|
|
+ updateGroupOwner(groupId, newOwner, true);
|
|
|
+
|
|
|
+ // 旧群主ID和身份
|
|
|
+ updateGroupOwner(groupId, oldOwner, false);
|
|
|
+
|
|
|
+ } catch (Exception e) {
|
|
|
+ log.error("changeGroupOwner 转让群主失败, groupId={}, newOwner={}, oldOwner={}", groupId, newOwner, oldOwner, e);
|
|
|
+ throw new BizException("转让群主失败");
|
|
|
+ }
|
|
|
+
|
|
|
// 转主群主
|
|
|
- imPluginContext.getPluginService().changeGroupOwner(groupId, getImUserId(newOwner,ClientEnum.TEACHER.getCode()), getImUserId(oldOwner,ClientEnum.TEACHER.getCode()));
|
|
|
+// imPluginContext.getPluginService().changeGroupOwner(groupId, getImUserId(newOwner,ClientEnum.TEACHER.getCode()), getImUserId(oldOwner,ClientEnum.TEACHER.getCode()));
|
|
|
}
|
|
|
|
|
|
/**
|
|
@@ -859,20 +926,31 @@ public class ImGroupCoreServiceImpl implements ImGroupCoreService {
|
|
|
}
|
|
|
imGroupMemberService.updateBatchById(updateList);
|
|
|
|
|
|
- for (List<String> items : Lists.partition(imUserIds, 50)) {
|
|
|
+ for (List<ImGroupMember> items : Lists.partition(list, 50)) {
|
|
|
|
|
|
items.parallelStream().forEach(item -> {
|
|
|
|
|
|
+ String imUserId = getImUserId(item.getUserId().toString(), item.getRoleType().getCode());
|
|
|
try {
|
|
|
ImPluginService pluginService = imPluginContext.getPluginService();
|
|
|
switch (member.getGroupRoleType()) {
|
|
|
case Admin:
|
|
|
+ // 管理员取消群禁言状态
|
|
|
+ if (Optional.ofNullable(item.getGroupMute()).orElse(false)) {
|
|
|
+ pluginService.groupUserGagRemove(imUserId, member.getGroupId());
|
|
|
+
|
|
|
+ imGroupMemberService.lambdaUpdate()
|
|
|
+ .eq(ImGroupMember::getId, item.getId())
|
|
|
+ .set(ImGroupMember::getGroupMute, false)
|
|
|
+ .update();
|
|
|
+ }
|
|
|
+
|
|
|
// 设置管理员
|
|
|
- pluginService.groupAdminCreate(member.getGroupId(), item);
|
|
|
+ pluginService.groupAdminCreate(member.getGroupId(), imUserId);
|
|
|
break;
|
|
|
case Member:
|
|
|
// 取消管理员
|
|
|
- pluginService.groupAdminRemove(member.getGroupId(), item);
|
|
|
+ pluginService.groupAdminRemove(member.getGroupId(), imUserId);
|
|
|
break;
|
|
|
default:
|
|
|
break;
|
|
@@ -889,4 +967,41 @@ public class ImGroupCoreServiceImpl implements ImGroupCoreService {
|
|
|
throw new BizException("群成员身份更新异常,请联系管理员!");
|
|
|
}
|
|
|
}
|
|
|
+
|
|
|
+ /**
|
|
|
+ * 更新用户群主身份
|
|
|
+ * @param groupId 群组ID
|
|
|
+ * @param groupMember 群成员
|
|
|
+ * @param isAdmin 群主标记
|
|
|
+ */
|
|
|
+ private void updateGroupOwner(String groupId, String groupMember, Boolean isAdmin) {
|
|
|
+ String[] values = analysisImUserId(groupMember).split(IM_USER_ID_SPLIT);
|
|
|
+
|
|
|
+ // 新群主ID和身份
|
|
|
+ long userId = Long.parseLong(values[0]);
|
|
|
+ String clientType = values[1];
|
|
|
+
|
|
|
+ EImGroupMemberRoleType groupRoleType = EImGroupMemberRoleType.fromClientType(clientType);
|
|
|
+ if (Boolean.TRUE.equals(isAdmin)) {
|
|
|
+ groupRoleType = EImGroupMemberRoleType.Owner;
|
|
|
+ }
|
|
|
+
|
|
|
+ imGroupMemberService.lambdaUpdate()
|
|
|
+ .eq(ImGroupMember::getGroupId, groupId)
|
|
|
+ .eq(ImGroupMember::getUserId, userId)
|
|
|
+ .eq(ImGroupMember::getRoleType, EClientType.valueOf(clientType))
|
|
|
+ .set(ImGroupMember::getGroupRoleType, groupRoleType)
|
|
|
+ .set(ImGroupMember::getIsAdmin, isAdmin)
|
|
|
+ .update();
|
|
|
+
|
|
|
+ if (EImGroupMemberRoleType.Admin == groupRoleType) {
|
|
|
+ // 设置管理员
|
|
|
+ try {
|
|
|
+ imPluginContext.getPluginService().groupAdminCreate(groupId, groupMember);
|
|
|
+ } catch (Exception e) {
|
|
|
+
|
|
|
+ log.error("updateGroupOwner 设置管理员失败, groupId={}, groupMember={}", groupId, groupMember, e);
|
|
|
+ }
|
|
|
+ }
|
|
|
+ }
|
|
|
}
|