Sfoglia il codice sorgente

群主身份为管理员

yuanliang 1 anno fa
parent
commit
7bf3778964

+ 10 - 0
cooleshow-user/user-biz/src/main/java/com/yonge/cooleshow/biz/dal/enums/im/EImGroupMemberRoleType.java

@@ -25,4 +25,14 @@ public enum EImGroupMemberRoleType implements BaseEnum<String, EImGroupMemberRol
 
         this.code = this.name();
     }
+
+    public static EImGroupMemberRoleType fromClientType(String clientType) {
+        switch (clientType) {
+            case "TEACHER":
+                return Admin;
+            case "STUDENT":
+            default:
+                return Member;
+        }
+    }
 }

+ 119 - 4
cooleshow-user/user-biz/src/main/java/com/yonge/cooleshow/biz/dal/service/im/impl/ImGroupCoreServiceImpl.java

@@ -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);
+            }
+        }
+    }
 }