瀏覽代碼

1.添加群导入接口

yuanliang 2 年之前
父節點
當前提交
0d61771bb9

+ 6 - 0
cooleshow-user/user-admin/src/main/java/com/yonge/cooleshow/admin/controller/ImGroupController.java

@@ -150,6 +150,12 @@ public class ImGroupController extends BaseController {
 
     }
 
+    @GetMapping(value = "/groupTransfer")
+    @ApiOperation("群导入")
+    public void groupTransfer() {
+        imGroupService.groupTransfer();
+    }
+
 
 
 

+ 5 - 1
cooleshow-user/user-biz/src/main/java/com/yonge/cooleshow/biz/dal/service/ImGroupService.java

@@ -13,7 +13,6 @@ import com.yonge.cooleshow.biz.dal.wrapper.im.ImGroupWrapper;
 import io.rong.models.Result;
 
 import java.io.File;
-import java.net.MalformedURLException;
 import java.util.List;
 
 /**
@@ -146,5 +145,10 @@ public interface ImGroupService extends IService<ImGroup> {
      * @throws Exception
      */
     void importInfo(List<ImHistoryMessage> info) throws Exception;
+
+    /**
+     * 群迁移,融云->腾讯
+     */
+    void groupTransfer();
 }
 

+ 178 - 60
cooleshow-user/user-biz/src/main/java/com/yonge/cooleshow/biz/dal/service/impl/ImGroupServiceImpl.java

@@ -17,27 +17,30 @@ import com.yonge.cooleshow.biz.dal.dao.ImGroupDao;
 import com.yonge.cooleshow.biz.dal.dao.ImGroupMemberAuditDao;
 import com.yonge.cooleshow.biz.dal.dto.ImGroupResultDto;
 import com.yonge.cooleshow.biz.dal.dto.ImGroupSearchDto;
-import com.yonge.cooleshow.biz.dal.entity.*;
-import com.yonge.cooleshow.biz.dal.enums.ClientEnum;
-import com.yonge.cooleshow.biz.dal.enums.ImGroupMemberRoleType;
-import com.yonge.cooleshow.biz.dal.enums.ImGroupType;
+import com.yonge.cooleshow.biz.dal.entity.CourseGroup;
+import com.yonge.cooleshow.biz.dal.entity.ImGroup;
+import com.yonge.cooleshow.biz.dal.entity.ImGroupMember;
+import com.yonge.cooleshow.biz.dal.entity.ImHistoryMessage;
+import com.yonge.cooleshow.biz.dal.entity.StudentStar;
 import com.yonge.cooleshow.biz.dal.entity.Teacher;
 import com.yonge.cooleshow.biz.dal.enums.ClientEnum;
 import com.yonge.cooleshow.biz.dal.enums.ImGroupMemberRoleType;
 import com.yonge.cooleshow.biz.dal.enums.ImGroupType;
-import com.yonge.cooleshow.biz.dal.entity.StudentStar;
-import com.yonge.cooleshow.biz.dal.service.*;
+import com.yonge.cooleshow.biz.dal.service.CourseGroupService;
+import com.yonge.cooleshow.biz.dal.service.ImGroupMemberService;
+import com.yonge.cooleshow.biz.dal.service.ImGroupService;
+import com.yonge.cooleshow.biz.dal.service.ImUserFriendService;
+import com.yonge.cooleshow.biz.dal.service.StudentStarService;
+import com.yonge.cooleshow.biz.dal.service.SysConfigService;
+import com.yonge.cooleshow.biz.dal.service.SysUserService;
+import com.yonge.cooleshow.biz.dal.service.TeacherService;
 import com.yonge.cooleshow.biz.dal.wrapper.im.ImGroupWrapper;
 import com.yonge.toolset.base.exception.BizException;
 import com.yonge.toolset.base.util.ThreadPool;
-import com.yonge.toolset.utils.http.HttpUtil;
 import io.rong.RongCloud;
 import io.rong.methods.message.history.History;
 import io.rong.models.Result;
-import io.rong.models.group.GroupMember;
-import io.rong.models.group.GroupModel;
 import org.apache.commons.collections.CollectionUtils;
-import org.apache.commons.lang.math.RandomUtils;
 import org.apache.commons.lang3.StringUtils;
 import org.redisson.api.RBucket;
 import org.redisson.api.RedissonClient;
@@ -49,23 +52,21 @@ import org.springframework.stereotype.Service;
 import org.springframework.transaction.annotation.Transactional;
 
 import javax.annotation.Resource;
-import java.io.*;
-import java.net.HttpURLConnection;
-import java.net.MalformedURLException;
+import java.io.BufferedReader;
+import java.io.File;
+import java.io.FileInputStream;
+import java.io.IOException;
+import java.io.InputStreamReader;
 import java.net.URL;
 import java.nio.charset.StandardCharsets;
 import java.text.MessageFormat;
 import java.util.*;
-import java.util.stream.Collectors;
 import java.util.concurrent.TimeUnit;
+import java.util.stream.Collectors;
 import java.util.zip.ZipEntry;
 import java.util.zip.ZipFile;
 import java.util.zip.ZipInputStream;
 
-import static com.microsvc.toolkit.middleware.im.message.ETencentMessage.TIMImageElem;
-import static com.microsvc.toolkit.middleware.im.message.ETencentMessage.TIMLocationElem;
-import static com.microsvc.toolkit.middleware.im.message.ETencentMessage.TIMTextElem;
-
 /**
  * 即时通讯群组(ImGroup)表服务实现类
  *
@@ -136,7 +137,7 @@ public class ImGroupServiceImpl extends ServiceImpl<ImGroupDao, ImGroup> impleme
      * @return IM聊天Token
      */
     @Override
-    public ImGroupWrapper.ImUserInfo register(String userId,ClientEnum clientType, String username, String avatar) throws Exception {
+    public ImGroupWrapper.ImUserInfo register(String userId, ClientEnum clientType, String username, String avatar) throws Exception {
 
         ImGroupWrapper.ImUserInfo userInfo = ImGroupWrapper.ImUserInfo.builder()
                 .imUserId("").imToken("").build();
@@ -144,7 +145,7 @@ public class ImGroupServiceImpl extends ServiceImpl<ImGroupDao, ImGroup> impleme
         try {
 
             // 聊天Token
-            String imUserId = getImUserId(userId,clientType.getCode());
+            String imUserId = getImUserId(userId, clientType.getCode());
 
             // 生成签名
             userInfo.imUserId(imUserId)
@@ -164,10 +165,10 @@ public class ImGroupServiceImpl extends ServiceImpl<ImGroupDao, ImGroup> impleme
      * @return String
      */
     @Override
-    public String getImUserId(String userId,String clientType) {
+    public String getImUserId(String userId, String clientType) {
         String imUserId = userId;
         if (StringUtils.isNotBlank(imConfig.getAppPrefix()) && !userId.startsWith(imConfig.getAppPrefix())) {
-            imUserId = MessageFormat.format("{0}:{1}:{2}", imConfig.getAppPrefix(), userId,clientType);
+            imUserId = MessageFormat.format("{0}:{1}:{2}", imConfig.getAppPrefix(), userId, clientType);
         }
         return imUserId;
     }
@@ -200,11 +201,12 @@ public class ImGroupServiceImpl extends ServiceImpl<ImGroupDao, ImGroup> impleme
         imGroup.setId(imGroupId);
         this.baseMapper.insert(imGroup);
         //处理本地群成员列表
-        List<ImGroupMember> groupMembers = imGroupMemberService.initGroupMember(imGroupId, imGroup.getCreateBy(), true, ImGroupMemberRoleType.TEACHER);
+        List<ImGroupMember> groupMembers = imGroupMemberService.initGroupMember(imGroupId, imGroup.getCreateBy(),
+                true, ImGroupMemberRoleType.TEACHER);
         //创建融云群
-        this.rtcCreate(imGroup.getCreateBy(),imGroupId,imGroup.getName());
+        this.rtcCreate(imGroup.getCreateBy(), imGroupId, imGroup.getName());
         //加入融云群
-        imGroupMemberService.join(groupMembers,imGroupId);
+        imGroupMemberService.join(groupMembers, imGroupId);
     }
 
     @Override
@@ -240,9 +242,11 @@ public class ImGroupServiceImpl extends ServiceImpl<ImGroupDao, ImGroup> impleme
         imUserFriendService.saveUserFriend(teacherId, studentIds);
         //处理本地群成员列表
         // 添加老师
-        List<ImGroupMember> groupMembers = imGroupMemberService.initGroupMember(imGroupId, imGroup.getCreateBy(), true, ImGroupMemberRoleType.TEACHER);
+        List<ImGroupMember> groupMembers = imGroupMemberService.initGroupMember(imGroupId, imGroup.getCreateBy(),
+                true, ImGroupMemberRoleType.TEACHER);
         // 添加学生
-        groupMembers.addAll(imGroupMemberService.initGroupMembers(imGroupId, studentIds, ImGroupMemberRoleType.STUDENT));
+        groupMembers.addAll(imGroupMemberService.initGroupMembers(imGroupId, studentIds,
+                ImGroupMemberRoleType.STUDENT));
         //创建融云群
         this.rtcCreate(courseGroup.getTeacherId(), imGroupId, imGroup.getName());
         //加入融云群
@@ -252,12 +256,12 @@ public class ImGroupServiceImpl extends ServiceImpl<ImGroupDao, ImGroup> impleme
 
 
     //创建融云群
-    private void rtcCreate(Long userId,String imGroupId,String imGroupName) throws Exception {
-        rtcCreate(userId,imGroupId,imGroupName,ClientEnum.TEACHER);
+    private void rtcCreate(Long userId, String imGroupId, String imGroupName) throws Exception {
+        rtcCreate(userId, imGroupId, imGroupName, ClientEnum.TEACHER);
     }
 
     //创建融云群
-    private void rtcCreate(Long userId,String imGroupId,String imGroupName,ClientEnum clientType) throws Exception {
+    private void rtcCreate(Long userId, String imGroupId, String imGroupName, ClientEnum clientType) throws Exception {
         //创建群
         SysUser user = sysUserService.findUserById(userId);
 
@@ -274,7 +278,7 @@ public class ImGroupServiceImpl extends ServiceImpl<ImGroupDao, ImGroup> impleme
                 .avatar(null)
                 .nickname(user.getUsername())
                 .isAdmin(true)
-                .imUserId(getImUserId(userId.toString(),clientType.getCode()))
+                .imUserId(getImUserId(userId.toString(), clientType.getCode()))
                 .roleType(clientType.getCode())
                 .build();
         groupMembers.add(groupMember);
@@ -284,7 +288,7 @@ public class ImGroupServiceImpl extends ServiceImpl<ImGroupDao, ImGroup> impleme
 
         // 创建IM群组
         imPluginContext.getPluginService().groupCreate(imGroupId, imGroupName,
-                getImUserId(userId.toString(),clientType.getCode()));
+                getImUserId(userId.toString(), clientType.getCode()));
 
         // 添加群成员到当前群组
         imPluginContext.getPluginService().groupJoin(imGroupId, imGroupName,
@@ -294,6 +298,7 @@ public class ImGroupServiceImpl extends ServiceImpl<ImGroupDao, ImGroup> impleme
 
     /**
      * 批量导入用户
+     *
      * @param groupMembers List<ImGroupMemberWrapper.ImGroupMember>
      */
     private void registerUser(List<GroupMemberWrapper.ImGroupMember> groupMembers) {
@@ -310,7 +315,8 @@ public class ImGroupServiceImpl extends ServiceImpl<ImGroupDao, ImGroup> impleme
                             member.getClientType());
                 }
 
-                imPluginContext.getPluginService().register(getImUserId(imUserId,member.getClientType()), member.getNickname(), member.getAvatar());
+                imPluginContext.getPluginService().register(getImUserId(imUserId, member.getClientType()),
+                        member.getNickname(), member.getAvatar());
             } catch (Exception e) {
                 log.error("registerUser member imToken");
             }
@@ -337,6 +343,7 @@ public class ImGroupServiceImpl extends ServiceImpl<ImGroupDao, ImGroup> impleme
 
     /**
      * 自动注册用户
+     *
      * @param groupMembers List<ImGroupMemberWrapper.ImGroupMember>
      */
     @Override
@@ -350,7 +357,7 @@ public class ImGroupServiceImpl extends ServiceImpl<ImGroupDao, ImGroup> impleme
         Long createBy = Optional.ofNullable(this.baseMapper.selectById(groupId)).
                 map(ImGroup::getCreateBy).
                 orElseThrow(() -> new BizException("操作失败:群组不存在"));
-        if(!sysUserService.getUserId().equals(createBy)){
+        if (!sysUserService.getUserId().equals(createBy)) {
             throw new BizException("操作失败:您没有操作权限");
         }
         //删除入群申请
@@ -387,7 +394,7 @@ public class ImGroupServiceImpl extends ServiceImpl<ImGroupDao, ImGroup> impleme
     @Override
     public ImGroup getByCourseGroupId(Long courseGroupId) {
         return this.lambdaQuery()
-                .eq(ImGroup::getCourseGroupId,courseGroupId)
+                .eq(ImGroup::getCourseGroupId, courseGroupId)
                 .last("limit 1")
                 .one();
     }
@@ -411,7 +418,7 @@ public class ImGroupServiceImpl extends ServiceImpl<ImGroupDao, ImGroup> impleme
             imUserId = MessageFormat.format("{0}:{1}", imUserId, ClientEnum.STUDENT.name());
         }
 
-        if(imGroupMemberService.getDao().delByGroupIdAndUserId(groupId, userId, roleType) < 1){
+        if (imGroupMemberService.getDao().delByGroupIdAndUserId(groupId, userId, roleType) < 1) {
             throw new BizException("操作失败:用户不在此群组");
         }
         //修改群成员数
@@ -437,10 +444,10 @@ public class ImGroupServiceImpl extends ServiceImpl<ImGroupDao, ImGroup> impleme
 
             // 已经有群的不操作
             Integer count = this.lambdaQuery()
-                                .eq(ImGroup::getCreateBy, teacher.getUserId())
-                                .eq(ImGroup::getAutoPassFlag, true)
-                                .eq(ImGroup::getType, ImGroupType.FAN)
-                                .count();
+                    .eq(ImGroup::getCreateBy, teacher.getUserId())
+                    .eq(ImGroup::getAutoPassFlag, true)
+                    .eq(ImGroup::getType, ImGroupType.FAN)
+                    .count();
             if (count > 0) {
                 continue;
             }
@@ -454,8 +461,8 @@ public class ImGroupServiceImpl extends ServiceImpl<ImGroupDao, ImGroup> impleme
 
             // 查询老师的粉丝,添加到群
             List<StudentStar> list = studentStarService.lambdaQuery()
-                                                       .eq(StudentStar::getTeacherId, teacher.getUserId())
-                                                       .list();
+                    .eq(StudentStar::getTeacherId, teacher.getUserId())
+                    .list();
             Set<Long> studentIdList = list.stream().map(StudentStar::getStudentId).collect(Collectors.toSet());
 
 
@@ -472,9 +479,11 @@ public class ImGroupServiceImpl extends ServiceImpl<ImGroupDao, ImGroup> impleme
             String imGroupId = UUID.randomUUID() + imGroup.getType().getCode();
             imGroup.setId(imGroupId);
             this.baseMapper.insert(imGroup);
-            List<ImGroupMember> groupMembers = imGroupMemberService.initGroupMember(imGroupId, imGroup.getCreateBy(), true, ImGroupMemberRoleType.TEACHER);
+            List<ImGroupMember> groupMembers = imGroupMemberService.initGroupMember(imGroupId, imGroup.getCreateBy(),
+                    true, ImGroupMemberRoleType.TEACHER);
             if (!CollectionUtils.isEmpty(studentIdList)) {
-                groupMembers.addAll(imGroupMemberService.initGroupMembers(imGroupId, studentIdList, ImGroupMemberRoleType.STUDENT));
+                groupMembers.addAll(imGroupMemberService.initGroupMembers(imGroupId, studentIdList,
+                        ImGroupMemberRoleType.STUDENT));
             }
             //创建融云群
             this.rtcCreate(sysUser.getId(), imGroupId, imGroup.getName());
@@ -515,7 +524,8 @@ public class ImGroupServiceImpl extends ServiceImpl<ImGroupDao, ImGroup> impleme
 
                     if (Objects.nonNull(groupMember)) {
 
-                        String imIdentity = MessageFormat.format("{0}:{1}", String.valueOf(userId), ClientEnum.STUDENT.name());
+                        String imIdentity = MessageFormat.format("{0}:{1}", String.valueOf(userId),
+                                ClientEnum.STUDENT.name());
                         // 缓存用户重新入群标识
                         String userKey = MessageFormat.format("{0}:{1}", groupId, imIdentity);
                         RBucket<Object> bucket = redissonClient.getBucket(userKey);
@@ -551,6 +561,7 @@ public class ImGroupServiceImpl extends ServiceImpl<ImGroupDao, ImGroup> impleme
 
     /**
      * 同步即时通讯聊天记录
+     *
      * @param date
      * @return
      */
@@ -561,7 +572,7 @@ public class ImGroupServiceImpl extends ServiceImpl<ImGroupDao, ImGroup> impleme
     }
 
     @Override
-    public void saveImHistoryMessage(File file)  {
+    public void saveImHistoryMessage(File file) {
         ZipInputStream zin = null;
         try {
             zin = new ZipInputStream(new FileInputStream(file), StandardCharsets.UTF_8);
@@ -573,19 +584,20 @@ public class ImGroupServiceImpl extends ServiceImpl<ImGroupDao, ImGroup> impleme
                 String line;
                 while ((line = br.readLine()) != null) {
                     try {
-                        historyMessages.add(JSONObject.parseObject(line.substring(line.indexOf("{")), ImHistoryMessage.class));
+                        historyMessages.add(JSONObject.parseObject(line.substring(line.indexOf("{")),
+                                ImHistoryMessage.class));
 //						if(historyMessages.size() >= 2000){
 //							historyMessageDao.batchInsert(new ArrayList<>(historyMessages),HistoryMessage.class);
 //							historyMessages.clear();
 //						}
-                    }catch (Exception e){
+                    } catch (Exception e) {
                         e.printStackTrace();
                     }
                 }
                 br.close();
                 break;
             }
-            if(historyMessages.size() > 0){
+            if (historyMessages.size() > 0) {
                 ImGroupDao dao = getDao();
                 dao.batchInsert(historyMessages.stream().sorted(Comparator.comparing(ImHistoryMessage::getDateTime)).collect(Collectors.toList()));
             }
@@ -619,7 +631,7 @@ public class ImGroupServiceImpl extends ServiceImpl<ImGroupDao, ImGroup> impleme
             Integer type = i.getTargetType();
             if (type == 1) {
                 //单聊会话
-                
+
                 MessageWrapper.PrivateImportMessage privateImportMessage = new MessageWrapper.PrivateImportMessage();
                 //2:表示历史消息导入,消息不计入未读计数,且消息不会推送到终端
                 privateImportMessage.setSyncFromOldSystem(2);
@@ -632,14 +644,14 @@ public class ImGroupServiceImpl extends ServiceImpl<ImGroupDao, ImGroup> impleme
                 //设置body
 
                 List<TencentRequest.MessageBody> list = new ArrayList<>();
-                list.stream().forEach(item->{
+                list.stream().forEach(item -> {
                     item.setMsgContent(i.getContent());
                     item.setMsgType(i.getClassname());
                 });
-                if (list.stream().map(TencentRequest.MessageBody::getMsgType).collect(Collectors.toList()).get(0).equals("RC:TxtMsg")){
+                if (list.stream().map(TencentRequest.MessageBody::getMsgType).collect(Collectors.toList()).get(0).equals("RC:TxtMsg")) {
                     //文本对象
                     list.stream().forEach(item -> item.setMsgType("TIMTextElem"));
-                } else if (list.stream().map(TencentRequest.MessageBody::getMsgType).collect(Collectors.toList()).get(0).equals("RC:ImgMsg")){
+                } else if (list.stream().map(TencentRequest.MessageBody::getMsgType).collect(Collectors.toList()).get(0).equals("RC:ImgMsg")) {
                     //图文对象
                     list.stream().forEach(item -> item.setMsgType("TIMImageElem"));
                 }
@@ -665,13 +677,13 @@ public class ImGroupServiceImpl extends ServiceImpl<ImGroupDao, ImGroup> impleme
                 data1.setRandom(new Random().nextInt());
                 //设置发送时间
                 data1.setSendTime(Long.parseLong(i.getDateTime()));
-                bodyList.stream().forEach(item->{
-                            item.setMsgContent(i.getContent());
-                            item.setMsgType(i.getClassname());
-                        });
-                if (bodyList.stream().map(TencentRequest.MessageBody::getMsgType).collect(Collectors.toList()).get(0).equals("RC:TxtMsg")){
+                bodyList.stream().forEach(item -> {
+                    item.setMsgContent(i.getContent());
+                    item.setMsgType(i.getClassname());
+                });
+                if (bodyList.stream().map(TencentRequest.MessageBody::getMsgType).collect(Collectors.toList()).get(0).equals("RC:TxtMsg")) {
                     bodyList.stream().forEach(item -> item.setMsgType("TIMTextElem"));
-                } else if (bodyList.stream().map(TencentRequest.MessageBody::getMsgType).collect(Collectors.toList()).get(0).equals("RC:ImgMsg")){
+                } else if (bodyList.stream().map(TencentRequest.MessageBody::getMsgType).collect(Collectors.toList()).get(0).equals("RC:ImgMsg")) {
                     //暂未支持图文对象
                     bodyList.stream().forEach(item -> item.setMsgType("TIMCustomElem"));
                 }
@@ -695,11 +707,117 @@ public class ImGroupServiceImpl extends ServiceImpl<ImGroupDao, ImGroup> impleme
     }
 
 
-    private History getHistory(){
+    private History getHistory() {
         RongCloud rongCloud = RongCloud.getInstance(appKey, appSecret);
         History history = new History(appKey, appSecret);
         history.setRongCloud(rongCloud);
         return history;
     }
+
+
+    /**
+     * 群迁移
+     */
+    @Override
+    public void groupTransfer() {
+        int page = 1;
+        int size = 100;
+        List<ImGroup> imGroups = this.lambdaQuery().orderByDesc(ImGroup::getCreateTime)
+                .last("limit " + ((page - 1) * size) + "," + size).list();
+        while (!imGroups.isEmpty()) {
+            groupTransfer(imGroups);
+
+            page++;
+            imGroups = this.lambdaQuery().orderByDesc(ImGroup::getCreateTime)
+                    .last("limit " + ((page - 1) * size) + "," + size).list();
+        }
+    }
+
+    private void groupTransfer(List<ImGroup> records) {
+        for (ImGroup imGroup : records) {
+            List<ImGroupMember> memberList = imGroupMemberService.lambdaQuery()
+                    .eq(ImGroupMember::getGroupId, imGroup.getId())
+                    .list();
+            ImGroupMember admin = memberList.stream().filter(ImGroupMember::getIsAdmin).findFirst().orElse(null);
+            if (admin == null) {
+                continue;
+            }
+            try {
+                MessageWrapper.ImportGroup importGroup = new MessageWrapper.ImportGroup();
+                importGroup.setOwnerAccount(getImUserId(admin.getUserId().toString(), "TEACHER"));
+                importGroup.setType("Public");
+                importGroup.setGroupId(imGroup.getId());
+                importGroup.setName(imGroup.getName());
+                importGroup.setIntroduction(imGroup.getIntroduce());
+                importGroup.setNotification(imGroup.getMemo());
+                importGroup.setFaceUrl(imGroup.getImg());
+                if (StringUtils.isEmpty(imGroup.getImg())) {
+                    importGroup.setFaceUrl("https://gyt.ks3-cn-beijing.ksyuncs.com/example/group_default_avatar.png");
+                }
+                importGroup.setApplyJoinOption(Boolean.TRUE.equals(imGroup.getAutoPassFlag()) ? "FreeAccess" :
+                        "NeedPermission");
+                importGroup.setCreateTime(new Date().getTime() / 1000);
+
+                register(admin.getUserId(), imGroup.getId(), admin.getAvatar(), true, ClientEnum.TEACHER);
+                imPluginContext.getPluginService().importGroup(importGroup);
+
+                List<ImGroupMember> groupMembers = memberList.stream()
+                        .filter(next -> !next.getIsAdmin()).collect(Collectors.toList());
+                if (groupMembers.isEmpty()) {
+                    continue;
+                }
+                for (ImGroupMember member : groupMembers) {
+                    String avatar = member.getAvatar();
+                    if (StringUtils.isEmpty(avatar)) {
+                        avatar = "https://daya.ks3-cn-beijing.ksyun.com/202203/T1WgJaE.png";
+                    }
+                    register(member.getUserId(), imGroup.getId(), avatar, false,
+                            ImGroupMemberRoleType.STUDENT.equals(member.getRoleType()) ? ClientEnum.STUDENT :
+                                    ClientEnum.TEACHER);
+                }
+                MessageWrapper.ImportGroupMember importGroupMember = new MessageWrapper.ImportGroupMember();
+                importGroupMember.setGroupId(imGroup.getId());
+                List<MessageWrapper.ImportGroupMemberData> members =
+                        groupMembers.stream().map(next -> {
+                            MessageWrapper.ImportGroupMemberData data = new MessageWrapper.ImportGroupMemberData();
+                            data.setMemberAccount(getImUserId(next.getUserId().toString(),
+                                    ImGroupMemberRoleType.STUDENT.equals(next.getRoleType()) ?
+                                            ClientEnum.STUDENT.name() :
+                                            ClientEnum.TEACHER.name()));
+                            data.setJoinTime(next.getCreateTime().getTime() / 1000);
+                            data.setUnreadMsgNum(0);
+                            return data;
+                        }).collect(Collectors.toList());
+                importGroupMember.setMemberList(members);
+                imPluginContext.getPluginService().importGroupMember(importGroupMember);
+            } catch (Exception e) {
+                log.error(String.format("群迁移加入群聊失败:%s", e.getMessage()));
+            }
+        }
+    }
+
+    private void register(Long userId, String imGroupId, String avatar, Boolean admin, ClientEnum clientType) {
+        SysUser user = sysUserService.findUserById(userId);
+
+        // 群组默认头象
+        List<GroupMemberWrapper.ImGroupMember> groupMembers = Lists.newArrayList();
+        //记录群成员
+        GroupMemberWrapper.ImGroupMember groupMember = GroupMemberWrapper.ImGroupMember
+                .builder()
+                .id(IdWorker.getId())
+                .groupId(imGroupId)
+                .userId(userId)
+                .clientType(clientType.getCode())
+                .avatar(avatar)
+                .nickname(user.getUsername())
+                .isAdmin(admin)
+                .imUserId(getImUserId(userId.toString(), clientType.getCode()))
+                .roleType(clientType.getCode())
+                .build();
+        groupMembers.add(groupMember);
+
+        // 自动激活学生IM帐号
+        registerUser(groupMembers);
+    }
 }