liujc 2 vuotta sitten
vanhempi
commit
4432d0214a

+ 24 - 24
cooleshow-user/user-biz/src/main/java/com/yonge/cooleshow/biz/dal/config/RongCloudConfig.java

@@ -1,24 +1,24 @@
-package com.yonge.cooleshow.biz.dal.config;
-
-import io.rong.RongCloud;
-import org.springframework.beans.factory.annotation.Value;
-import org.springframework.context.annotation.Bean;
-import org.springframework.context.annotation.Configuration;
-import org.springframework.context.annotation.Primary;
-
-@Configuration
-public class RongCloudConfig {
-
-    @Value("${cn.rongcloud.im.appkey}")
-    private String appKey;
-    @Value("${cn.rongcloud.im.secret}")
-    private String appSecret;
-
-    public static RongCloud rongCloud;
-
-    @Bean
-    @Primary
-    public void getRongCloud() {
-        rongCloud = RongCloud.getInstance(appKey,appSecret);
-    }
-}
+//package com.yonge.cooleshow.biz.dal.config;
+//
+//import io.rong.RongCloud;
+//import org.springframework.beans.factory.annotation.Value;
+//import org.springframework.context.annotation.Bean;
+//import org.springframework.context.annotation.Configuration;
+//import org.springframework.context.annotation.Primary;
+//
+//@Configuration
+//public class RongCloudConfig {
+//
+//    @Value("${cn.rongcloud.im.appkey}")
+//    private String appKey;
+//    @Value("${cn.rongcloud.im.secret}")
+//    private String appSecret;
+//
+//    public static RongCloud rongCloud;
+//
+//    @Bean
+//    @Primary
+//    public void getRongCloud() {
+//        rongCloud = RongCloud.getInstance(appKey,appSecret);
+//    }
+//}

+ 1 - 1
cooleshow-user/user-biz/src/main/java/com/yonge/cooleshow/biz/dal/dao/ImGroupMemberDao.java

@@ -32,7 +32,7 @@ public interface ImGroupMemberDao extends BaseMapper<ImGroupMember> {
     * @author zx
     * @date 2022/3/23 15:17
     */
-    List<GroupMember> queryGroupMember(@Param("groupId") String groupId);
+    List<ImGroupMember> queryGroupMember(@Param("groupId") String groupId);
 
     /**
      * @description: 获取群成员列表

+ 8 - 8
cooleshow-user/user-biz/src/main/java/com/yonge/cooleshow/biz/dal/service/ImGroupMemberService.java

@@ -30,16 +30,16 @@ public interface ImGroupMemberService extends IService<ImGroupMember> {
     void insertBatch(List<ImGroupMember> imGroupMembers);
 
     /**
-    * @description: 初始化单个群成员信息,并返回
      * @param imGroupId
      * @param userId
      * @param isAdmin
      * @param roleType
-    * @return List<GroupMember>
-    * @author zx
-    * @date 2022/3/22 15:59
-    */
-    List<GroupMember> initGroupMember(String imGroupId, Long userId, Boolean isAdmin, ImGroupMemberRoleType roleType) throws Exception;
+     * @return List<GroupMember>
+     * @description: 初始化单个群成员信息,并返回
+     * @author zx
+     * @date 2022/3/22 15:59
+     */
+    List<ImGroupMember> initGroupMember(String imGroupId, Long userId, Boolean isAdmin, ImGroupMemberRoleType roleType) throws Exception;
 
     /**
     * @description: 添加群成员
@@ -50,7 +50,7 @@ public interface ImGroupMemberService extends IService<ImGroupMember> {
     * @author zx
     * @date 2022/3/22 15:59
     */
-    List<GroupMember> initGroupMembers(String imGroupId, Set<Long> userIds, ImGroupMemberRoleType roleType);
+    List<ImGroupMember> initGroupMembers(String imGroupId, Set<Long> userIds, ImGroupMemberRoleType roleType);
 
     /**
     * @description: 加入融云群
@@ -60,7 +60,7 @@ public interface ImGroupMemberService extends IService<ImGroupMember> {
     * @author zx
     * @date 2022/3/23 17:50
     */
-    void join(List<GroupMember> groupMemberList,String imGroupId) throws Exception;
+    void join(List<ImGroupMember> groupMemberList,String imGroupId) throws Exception;
 
     /**
     * @description: 删除群成员

+ 8 - 2
cooleshow-user/user-biz/src/main/java/com/yonge/cooleshow/biz/dal/service/ImGroupService.java

@@ -1,10 +1,12 @@
 package com.yonge.cooleshow.biz.dal.service;
 
 import com.baomidou.mybatisplus.extension.service.IService;
+import com.microsvc.toolkit.middleware.im.message.GroupMemberWrapper;
 import com.yonge.cooleshow.biz.dal.dao.ImGroupDao;
 import com.yonge.cooleshow.biz.dal.dto.ImGroupResultDto;
 import com.yonge.cooleshow.biz.dal.dto.ImGroupSearchDto;
 import com.yonge.cooleshow.biz.dal.entity.ImGroup;
+import com.yonge.cooleshow.biz.dal.entity.ImGroupMember;
 import com.yonge.cooleshow.biz.dal.enums.ClientEnum;
 import com.yonge.cooleshow.biz.dal.wrapper.im.ImGroupWrapper;
 
@@ -29,14 +31,14 @@ public interface ImGroupService extends IService<ImGroup> {
      * @param avatar 用户头象
      * @return IM聊天Token
      */
-    ImGroupWrapper.ImUserInfo register(String userId, String username, String avatar) throws Exception;
+    ImGroupWrapper.ImUserInfo register(String userId,ClientEnum clientType, String username, String avatar) throws Exception;
 
     /**
      * IM 用户注册
      * @param userId 用户Id
      * @return String
      */
-    String getImUserId(String userId);
+    String getImUserId(String userId,String clientType);
 
     /**
      * 解析IM用户规则
@@ -62,6 +64,10 @@ public interface ImGroupService extends IService<ImGroup> {
     */
     String autoCreate(Long courseGroupId,String courseGroupType) throws Exception;
 
+    List<GroupMemberWrapper.ImGroupMember> getImGroupMembers(List<ImGroupMember> groupMemberList);
+
+    void asyncRegisterUser(List<GroupMemberWrapper.ImGroupMember> groupMembers);
+
     /**
     * @description: 关闭群聊、解散
      * @param groupId

+ 109 - 48
cooleshow-user/user-biz/src/main/java/com/yonge/cooleshow/biz/dal/service/impl/CustomerServiceBatchSendingServiceImpl.java

@@ -6,8 +6,12 @@ import com.baomidou.mybatisplus.core.toolkit.Wrappers;
 import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
 import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
 import com.google.common.collect.Lists;
+import com.microsvc.toolkit.middleware.common.http.ImageUtil;
+import com.microsvc.toolkit.middleware.im.ImPluginContext;
+import com.microsvc.toolkit.middleware.im.impl.TencentCloudImPlugin;
+import com.microsvc.toolkit.middleware.im.message.MessageWrapper;
+import com.microsvc.toolkit.middleware.im.message.TencentRequest;
 import com.yonge.cooleshow.auth.config.CustomerServiceConfig;
-import com.yonge.cooleshow.biz.dal.config.RongCloudConfig;
 import com.yonge.cooleshow.biz.dal.entity.CustomerServiceBatchSending;
 import com.yonge.cooleshow.biz.dal.entity.CustomerServiceReceive;
 import com.yonge.cooleshow.biz.dal.entity.Subject;
@@ -20,10 +24,7 @@ import com.yonge.cooleshow.biz.dal.enums.im.EImSendStatus;
 import com.yonge.cooleshow.biz.dal.enums.im.EImSendType;
 import com.yonge.cooleshow.biz.dal.mapper.CustomerServiceBatchSendingMapper;
 import com.yonge.cooleshow.biz.dal.mapper.SysUserMapper;
-import com.yonge.cooleshow.biz.dal.service.CustomerServiceBatchSendingService;
-import com.yonge.cooleshow.biz.dal.service.CustomerServiceReceiveService;
-import com.yonge.cooleshow.biz.dal.service.SubjectService;
-import com.yonge.cooleshow.biz.dal.service.TeacherService;
+import com.yonge.cooleshow.biz.dal.service.*;
 import com.yonge.cooleshow.biz.dal.wrapper.im.CustomerService;
 import com.yonge.cooleshow.biz.dal.wrapper.im.CustomerServiceBatchSendingWrapper;
 import com.yonge.cooleshow.biz.dal.wrapper.im.CustomerServiceReceiveWrapper;
@@ -48,13 +49,7 @@ import org.springframework.stereotype.Service;
 import org.springframework.transaction.annotation.Transactional;
 
 import java.text.MessageFormat;
-import java.util.Arrays;
-import java.util.Date;
-import java.util.List;
-import java.util.Map;
-import java.util.Objects;
-import java.util.Optional;
-import java.util.Random;
+import java.util.*;
 import java.util.function.Function;
 import java.util.stream.Collectors;
 import java.util.stream.IntStream;
@@ -80,6 +75,12 @@ public class CustomerServiceBatchSendingServiceImpl extends ServiceImpl<Customer
     @Autowired
     private TeacherService teacherService;
 
+    @Autowired
+    private ImPluginContext imPluginContext;
+
+    @Autowired
+    private ImGroupService imGroupService;
+
 	/**
      * 查询详情
      * @param id 详情ID
@@ -406,8 +407,6 @@ public class CustomerServiceBatchSendingServiceImpl extends ServiceImpl<Customer
         // 消息状态判定,且不能重复发送
         DistributedLock.of(redissonClient).runIfLockCanGet(lockName, () -> {
 
-            List<BaseMessage> messages = getReceiveMessage(info);
-
             // 异步发送消息且同步更新已发送人数,稍后可在页面刷新查看已发送用户数
             ThreadPool.getExecutor().submit(() -> {
                 // 接收消息用户数
@@ -444,13 +443,11 @@ public class CustomerServiceBatchSendingServiceImpl extends ServiceImpl<Customer
                                         .map(x -> String.valueOf(x.getUserId()))
                                         .collect(Collectors.toList());
 
-                                if (ClientEnum.STUDENT.match(clientType)) {
-                                    receiveUserIds = receiveUserIds.stream()
-                                            .map(x -> MessageFormat.format("{0}:STUDENT", x))
-                                            .collect(Collectors.toList());
-                                }
+                                receiveUserIds = receiveUserIds.stream()
+                                        .map(x -> imGroupService.getImUserId(x, clientType))
+                                        .collect(Collectors.toList());
 
-                                batchSendCustomerServiceMessage(info, messages, receiveNums, receiveUserIds);
+                                batchSendCustomerServiceMessage(info, receiveNums, receiveUserIds);
                             }
                         });
 
@@ -472,15 +469,10 @@ public class CustomerServiceBatchSendingServiceImpl extends ServiceImpl<Customer
                         for (Integer pageNum : collect) {
 
                             List<String> receiveUserIds = customerServiceReceiveService.selectPage(PageUtil.getPage(pageNum, limit), receiveQuery).getRecords().stream()
-                                    .map(x -> {
-                                        if (ClientEnum.STUDENT.match(x.getClientType())) {
-                                            return MessageFormat.format("{0}:STUDENT", String.valueOf(x.getUserId()));
-                                        }
-                                        return String.valueOf(x.getUserId());
-                                    })
+                                    .map(x -> imGroupService.getImUserId(String.valueOf(x.getUserId()), x.getClientType()))
                                     .collect(Collectors.toList());
 
-                            batchSendCustomerServiceMessage(info, messages, receiveNums, receiveUserIds);
+                            batchSendCustomerServiceMessage(info, receiveNums, receiveUserIds);
                         }
                     }
 
@@ -504,38 +496,52 @@ public class CustomerServiceBatchSendingServiceImpl extends ServiceImpl<Customer
     /**
      * 批量发送客服消息
      * @param info CustomerServiceBatchSending
-     * @param messages 推送消息类型
      * @param receiveNums 接收消息用户数
      * @param receiveUserIds 接收消息用户Id
      */
-    private static void batchSendCustomerServiceMessage(CustomerServiceBatchSending info, List<BaseMessage> messages,
+    private void batchSendCustomerServiceMessage(CustomerServiceBatchSending info,
                                                         List<Integer> receiveNums, List<String> receiveUserIds) {
+        List<BaseMessage> baseMessages = new ArrayList<>();
+        List<TencentRequest.MessageBody> tencentMessages = new ArrayList<>();
+        getReceiveMessage(info,baseMessages,tencentMessages);
         // 拓展消息
         PushExt pushExt = PushExt.build(info.getTitle(), 1,
                 new PushExt.HW("channelId", "NORMAL"), new PushExt.VIVO("1"),
                 new PushExt.APNs("", ""),
                 new PushExt.OPPO(""));
 
-        String senderId = String.valueOf(info.getSenderId());
-        PrivateMessage privateMessage;
-        ResponseResult privateResult;
+        String senderId = imGroupService.getImUserId(String.valueOf(info.getSenderId()), ClientEnum.TEACHER.getCode());
         for (List<String> item : Lists.partition(receiveUserIds, 100)) {
 
             try {
+                MessageWrapper.PrivateMessage build = MessageWrapper.PrivateMessage.builder()
+                        .senderId(senderId)
+                        .targetIds(item)
+//                        .objectName(message.getType())
+//                        .rongCloueMessage(message)
+                        .pushExt(JSON.toJSONString(pushExt))
+                        .includeSender(0)
+//                        .tencentMessage()
+                        .build();
 
-                for (BaseMessage message : messages) {
-
-                    // 发送用户IM通知消息
-                    privateMessage = new PrivateMessage()
-                            .setSenderId(senderId)
-                            .setTargetId(item.toArray(new String[0]))
-                            .setObjectName(message.getType())
-                            .setContent(message)
-                            .setPushExt(pushExt)
-                            .setIsIncludeSender(0);
-
-                    privateResult = RongCloudConfig.rongCloud.message.msgPrivate.send(privateMessage);
-                    log.info("batchSendCustomerServiceMessage senderId={}, ret={}", senderId, privateResult.getCode());
+                if (TencentCloudImPlugin.PLUGIN_NAME.equals(imPluginContext.defaultService())) {
+                    // 腾讯云消息
+                    for (TencentRequest.MessageBody message : tencentMessages) {
+                        if (message == null) {
+                            continue;
+                        }
+                        Boolean ret = imPluginContext.getPluginService().sendPrivateMessage(build.objectName(message.getMsgType()).tencentMessage(message));
+                        log.info("batchSendPrivateMessage GROUP tencentCloud senderId={}, ret={}", senderId, ret);
+                    }
+                } else {
+                    // 融云消息
+                    for (BaseMessage message : baseMessages) {
+                        if (message == null) {
+                            continue;
+                        }
+                        Boolean ret = imPluginContext.getPluginService().sendPrivateMessage(build.objectName(message.getType()).rongCloueMessage(message));
+                        log.info("batchSendPrivateMessage GROUP rongCloud senderId={}, ret={}", senderId, ret);
+                    }
                 }
 
                 receiveNums.add(item.size());
@@ -551,8 +557,7 @@ public class CustomerServiceBatchSendingServiceImpl extends ServiceImpl<Customer
      * @param info CustomerServiceBatchSending
      * @return List<BaseMessage>
      */
-    private static List<BaseMessage> getReceiveMessage(CustomerServiceBatchSending info) {
-        List<BaseMessage> messages = Lists.newArrayList();
+    private static void getReceiveMessage(CustomerServiceBatchSending info, List<BaseMessage> messages, List<TencentRequest.MessageBody> tencentMessages) {
 
         if (StringUtils.isNotEmpty(info.getImgMessage())) {
 
@@ -562,6 +567,9 @@ public class CustomerServiceBatchSendingServiceImpl extends ServiceImpl<Customer
             ImgMessage imgMessage = new ImgMessage(ImUtil.imageToBase64(info.getImgMessage(), "png"), "", info.getImgMessage());
 
             messages.add(imgMessage);
+
+            TencentRequest.MessageBody timImageElem = getTimImageElem(info.getImgMessage());
+            tencentMessages.add(timImageElem);
         }
 
         if (StringUtils.isNotEmpty(info.getTextMessage())) {
@@ -570,8 +578,61 @@ public class CustomerServiceBatchSendingServiceImpl extends ServiceImpl<Customer
             TxtMessage txtMessage = new TxtMessage(info.getTextMessage(), "");
 
             messages.add(txtMessage);
+
+
+            // 腾讯云消息
+            tencentMessages.add(getTimTextElem(info.getTextMessage()));
         }
-        return messages;
+    }
+
+    public static TencentRequest.MessageBody getTimImageElem(String imgMessage) {
+
+        if (StringUtils.isEmpty(imgMessage)) {
+            return null;
+        }
+
+        // 腾讯云消息
+        // 腾讯云消息
+        ImageUtil.ImageInfo imageReq = ImageUtil.ImageInfo.builder()
+                .imgUrl(imgMessage)
+                .suffix(imgMessage.substring(imgMessage.lastIndexOf(".") + 1))
+                .build();
+
+        // 获取图片基本信息
+        ImageUtil.imageToBase64(imageReq);
+
+        // 图片格式。 JPG = 1 GIF = 2 PNG = 3 BMP = 4 其他 = 255
+        // 图片类型。原图 = 1,大图 = 2,缩略图 = 3
+        int imageFormat = 1;
+        if ("PNG".equalsIgnoreCase(imageReq.getSuffix())) {
+            imageFormat = 3;
+        }
+        if ("GIF".equalsIgnoreCase(imageReq.getSuffix())) {
+            imageFormat = 2;
+        }
+        return TencentRequest.MessageBody.builder()
+                .msgType("TIMImageElem")
+                .msgContent(TencentRequest.ImageMessageBody.builder()
+                .uuid(imageReq.getMd5())
+                .imageFormat(imageFormat)
+                .type(1)
+                .height(imageReq.getHeight())
+                .width(imageReq.getWidth())
+                .url(imgMessage)
+                .size(imageReq.getSize()))
+                .build();
+    }
+
+    public static TencentRequest.MessageBody getTimTextElem(String textMessage) {
+
+        if (StringUtils.isEmpty(textMessage)) {
+            return null;
+        }
+
+        return TencentRequest.MessageBody.builder()
+                .msgType("TIMTextElem")
+                .msgContent(TencentRequest.TextMessageBody.builder().text(textMessage))
+                .build();
     }
 
 

+ 3 - 2
cooleshow-user/user-biz/src/main/java/com/yonge/cooleshow/biz/dal/service/impl/ImGroupMemberAuditServiceImpl.java

@@ -4,6 +4,7 @@ import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
 import com.yonge.cooleshow.auth.api.entity.SysUser;
 import com.yonge.cooleshow.biz.dal.dao.ImGroupMemberAuditDao;
 import com.yonge.cooleshow.biz.dal.entity.ImGroup;
+import com.yonge.cooleshow.biz.dal.entity.ImGroupMember;
 import com.yonge.cooleshow.biz.dal.entity.ImGroupMemberAudit;
 import com.yonge.cooleshow.biz.dal.enums.AuditStatusEnum;
 import com.yonge.cooleshow.biz.dal.enums.ClientEnum;
@@ -86,7 +87,7 @@ public class ImGroupMemberAuditServiceImpl extends ServiceImpl<ImGroupMemberAudi
         baseMapper.insert(imGroupMemberAudit);
         if(imGroup.getAutoPassFlag() && Optional.ofNullable(autoJoin).orElse(false)){
             //处理本地群成员
-            List<GroupMember> groupMembers = imGroupMemberService.initGroupMember(imGroup.getId(),
+            List<ImGroupMember> groupMembers = imGroupMemberService.initGroupMember(imGroup.getId(),
                     imGroupMemberAudit.getUserId(), false,
                     imGroupMemberAudit.getRoleType());
             //同步群成员数量
@@ -121,7 +122,7 @@ public class ImGroupMemberAuditServiceImpl extends ServiceImpl<ImGroupMemberAudi
         if(auditStatus == AuditStatusEnum.OPEN){
             List<ImGroupMemberAudit> imGroupMemberAudit = baseMapper.findByIds(auditIds);
             Set<Long> userIds = imGroupMemberAudit.stream().map(ImGroupMemberAudit::getUserId).collect(Collectors.toSet());
-            List<GroupMember> groupMembers = imGroupMemberService.initGroupMembers(groupId,userIds, ImGroupMemberRoleType.STUDENT);
+            List<ImGroupMember> groupMembers = imGroupMemberService.initGroupMembers(groupId,userIds, ImGroupMemberRoleType.STUDENT);
             //同步群成员数量
             imGroupService.getDao().updateMemberNum(imGroup.getId());
             //加入融云群

+ 36 - 32
cooleshow-user/user-biz/src/main/java/com/yonge/cooleshow/biz/dal/service/impl/ImGroupMemberServiceImpl.java

@@ -1,25 +1,28 @@
 package com.yonge.cooleshow.biz.dal.service.impl;
 
+import com.baomidou.mybatisplus.core.toolkit.IdWorker;
 import com.baomidou.mybatisplus.core.toolkit.StringUtils;
 import com.baomidou.mybatisplus.core.toolkit.Wrappers;
 import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
 import com.google.common.collect.Lists;
-import com.yonge.cooleshow.biz.dal.config.RongCloudConfig;
+import com.microsvc.toolkit.middleware.im.ImPluginContext;
+import com.microsvc.toolkit.middleware.im.message.GroupMemberWrapper;
 import com.yonge.cooleshow.biz.dal.dao.ImGroupDao;
 import com.yonge.cooleshow.biz.dal.dao.ImGroupMemberDao;
 import com.yonge.cooleshow.biz.dal.dao.TeacherDao;
 import com.yonge.cooleshow.biz.dal.dto.BasicUserInfo;
+import com.yonge.cooleshow.biz.dal.entity.ImGroup;
 import com.yonge.cooleshow.biz.dal.entity.ImGroupMember;
 import com.yonge.cooleshow.biz.dal.enums.ClientEnum;
 import com.yonge.cooleshow.biz.dal.enums.ImGroupMemberRoleType;
 import com.yonge.cooleshow.biz.dal.service.ImGroupMemberService;
+import com.yonge.cooleshow.biz.dal.service.ImGroupService;
 import com.yonge.toolset.base.exception.BizException;
-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.slf4j.Logger;
 import org.slf4j.LoggerFactory;
+import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.stereotype.Service;
 import org.springframework.transaction.annotation.Transactional;
 
@@ -45,6 +48,12 @@ public class ImGroupMemberServiceImpl extends ServiceImpl<ImGroupMemberDao, ImGr
     @Resource
     private ImGroupDao imGroupDao;
 
+    @Autowired
+    private ImPluginContext imPluginContext;
+
+    @Autowired
+    private ImGroupService imGroupService;
+
     @Override
     public ImGroupMemberDao getDao() {
         return this.baseMapper;
@@ -61,7 +70,7 @@ public class ImGroupMemberServiceImpl extends ServiceImpl<ImGroupMemberDao, ImGr
 
     @Override
     @Transactional(rollbackFor = Exception.class)
-    public List<GroupMember> initGroupMember(String imGroupId, Long userId, Boolean isAdmin, ImGroupMemberRoleType roleType){
+    public List<ImGroupMember> initGroupMember(String imGroupId, Long userId, Boolean isAdmin, ImGroupMemberRoleType roleType){
         //记录群成员
         BasicUserInfo basicUserInfo = teacherDao.getBasicUserInfo(userId);
         ImGroupMember imGroupMember = new ImGroupMember(imGroupId,userId,basicUserInfo.getUsername(),basicUserInfo.getAvatar(), isAdmin, roleType);
@@ -70,20 +79,15 @@ public class ImGroupMemberServiceImpl extends ServiceImpl<ImGroupMemberDao, ImGr
         imGroupMember.setUpdateTime(date);
         this.baseMapper.insert(imGroupMember);
         //加入融云群
-        List<GroupMember> groupMemberList = new ArrayList<>();
-
-        String imUserId = String.valueOf(userId);
-        if (ImGroupMemberRoleType.STUDENT == roleType) {
-            imUserId = MessageFormat.format("{0}:{1}", imUserId, ClientEnum.STUDENT.name());
-        }
+        List<ImGroupMember> groupMemberList = new ArrayList<>();
 
-        groupMemberList.add(new GroupMember(imUserId,imGroupId,null));
+        groupMemberList.add(imGroupMember);
         return groupMemberList;
     }
 
     @Override
     @Transactional(rollbackFor = Exception.class)
-    public List<GroupMember> initGroupMembers(String imGroupId, Set<Long> userIds, ImGroupMemberRoleType roleType){
+    public List<ImGroupMember> initGroupMembers(String imGroupId, Set<Long> userIds, ImGroupMemberRoleType roleType){
         //记录群成员
         List<ImGroupMember> imGroupMembers = baseMapper.initImGroupMember(imGroupId,userIds,roleType.getCode());
         if(CollectionUtils.isNotEmpty(imGroupMembers)){
@@ -97,35 +101,35 @@ public class ImGroupMemberServiceImpl extends ServiceImpl<ImGroupMemberDao, ImGr
             }
             baseMapper.insertBatch(imGroupMembers);
 
-            //加入融云群
-            Function<Long,GroupMember> func = (userId) -> {
-
-                String imUserId = String.valueOf(userId);
-                if (ImGroupMemberRoleType.STUDENT == roleType) {
-                    imUserId = MessageFormat.format("{0}:{1}", imUserId, ClientEnum.STUDENT.name());
-                }
-
-                return  new GroupMember(imUserId,imGroupId,null);
-            };
-            return userIds.stream().map(func).collect(Collectors.toList());
+            return imGroupMembers;
         }
         return new ArrayList<>();
     }
 
     @Override
     @Transactional(rollbackFor = Exception.class)
-    public void join(List<GroupMember> groupMemberList,String imGroupId) throws Exception {
-        GroupMember[] groupMembers = groupMemberList.toArray(new GroupMember[groupMemberList.size()]);
-        GroupModel groupModel = new GroupModel(imGroupId, 0);
-        groupModel.setMembers(groupMembers);
-        groupModel.setName(imGroupDao.selectById(imGroupId).getName());
-        Result result = RongCloudConfig.rongCloud.group.join(groupModel);
-        if(!result.code.equals(200)){
-            log.error("加入群组失败:{}",result.errorMessage);
-            throw new BizException("加入群组失败:请联系管理员");
+    public void join(List<ImGroupMember> groupMemberList,String imGroupId) throws Exception {
+
+        if (CollectionUtils.isEmpty(groupMemberList)) {
+            // 群成员为空,直接忽略
+            return;
+        }
+
+        // 判断群ID是否有效
+        ImGroup imGroup = imGroupDao.selectById(imGroupId);
+        if (Objects.isNull(imGroup)) {
+            throw new BizException("群组不存在");
         }
+        List<GroupMemberWrapper.ImGroupMember> imGroupMembers = imGroupService.getImGroupMembers(groupMemberList);
+        // 添加群成员到当前群组
+        imPluginContext.getPluginService().groupJoin(imGroup.getId(), imGroup.getName(), imGroupMembers);
+
+        // 自动激活用户
+        imGroupService.asyncRegisterUser(imGroupMembers);
     }
 
+
+
     @Override
     @Transactional(rollbackFor = Exception.class)
     public void delByGroupId(String groupId) {

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

@@ -1,13 +1,14 @@
 package com.yonge.cooleshow.biz.dal.service.impl;
 
+import com.baomidou.mybatisplus.core.toolkit.IdWorker;
 import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
 import com.google.common.collect.Lists;
 import com.microsvc.toolkit.middleware.im.ImPluginContext;
+import com.microsvc.toolkit.middleware.im.message.GroupMemberWrapper;
 import com.microsvc.toolkit.middleware.im.properties.ImConfigProperties;
 import com.yonge.cooleshow.auth.api.client.SysUserFeignService;
 import com.yonge.cooleshow.auth.api.entity.SysUser;
 import com.yonge.cooleshow.auth.config.AppGlobalServiceConfig;
-import com.yonge.cooleshow.biz.dal.config.RongCloudConfig;
 import com.yonge.cooleshow.biz.dal.dao.CourseScheduleStudentPaymentDao;
 import com.yonge.cooleshow.biz.dal.dao.ImGroupDao;
 import com.yonge.cooleshow.biz.dal.dao.ImGroupMemberAuditDao;
@@ -22,10 +23,6 @@ import com.yonge.cooleshow.biz.dal.enums.ImGroupMemberRoleType;
 import com.yonge.cooleshow.biz.dal.enums.ImGroupType;
 import com.yonge.cooleshow.biz.dal.service.*;
 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.service.CourseGroupService;
 import com.yonge.cooleshow.biz.dal.service.ImGroupMemberService;
 import com.yonge.cooleshow.biz.dal.service.ImGroupService;
@@ -36,7 +33,6 @@ 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 io.rong.models.Result;
 import io.rong.models.group.GroupMember;
 import io.rong.models.group.GroupModel;
 import org.apache.commons.collections.CollectionUtils;
@@ -106,6 +102,9 @@ public class ImGroupServiceImpl extends ServiceImpl<ImGroupDao, ImGroup> impleme
     @Autowired
     private ImConfigProperties imConfig;
 
+    @Autowired
+    private SysConfigService sysConfigService;
+
     @Override
     public ImGroupDao getDao() {
         return this.baseMapper;
@@ -121,7 +120,7 @@ public class ImGroupServiceImpl extends ServiceImpl<ImGroupDao, ImGroup> impleme
      * @return IM聊天Token
      */
     @Override
-    public ImGroupWrapper.ImUserInfo register(String userId, 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();
@@ -129,7 +128,7 @@ public class ImGroupServiceImpl extends ServiceImpl<ImGroupDao, ImGroup> impleme
         try {
 
             // 聊天Token
-            String imUserId = getImUserId(userId);
+            String imUserId = getImUserId(userId,clientType.getCode());
 
             // 生成签名
             userInfo.imUserId(imUserId)
@@ -149,10 +148,10 @@ public class ImGroupServiceImpl extends ServiceImpl<ImGroupDao, ImGroup> impleme
      * @return String
      */
     @Override
-    public String getImUserId(String userId) {
+    public String getImUserId(String userId,String clientType) {
         String imUserId = userId;
         if (StringUtils.isNotBlank(imConfig.getAppPrefix()) && !userId.startsWith(imConfig.getAppPrefix())) {
-            imUserId = MessageFormat.format("{0}:{1}", imConfig.getAppPrefix(), userId);
+            imUserId = MessageFormat.format("{0}:{1}:{2}", imConfig.getAppPrefix(), userId,clientType);
         }
         return imUserId;
     }
@@ -185,7 +184,7 @@ public class ImGroupServiceImpl extends ServiceImpl<ImGroupDao, ImGroup> impleme
         imGroup.setId(imGroupId);
         this.baseMapper.insert(imGroup);
         //处理本地群成员列表
-        List<GroupMember> 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());
         //加入融云群
@@ -225,7 +224,7 @@ public class ImGroupServiceImpl extends ServiceImpl<ImGroupDao, ImGroup> impleme
         imUserFriendService.saveUserFriend(teacherId, studentIds);
         //处理本地群成员列表
         // 添加老师
-        List<GroupMember> 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));
         //创建融云群
@@ -235,21 +234,101 @@ public class ImGroupServiceImpl extends ServiceImpl<ImGroupDao, ImGroup> impleme
         return imGroupId;
     }
 
+
     //创建融云群
     private void rtcCreate(Long userId,String imGroupId,String imGroupName) throws Exception {
-        //创建融云群
-        GroupMember[] groupMembers = new GroupMember[]{new GroupMember(userId.toString(),imGroupId,null)};
-        GroupModel groupModel = new GroupModel(imGroupId,0);
-        groupModel.setMembers(groupMembers);
-        groupModel.setName(imGroupName);
-        Result result = RongCloudConfig.rongCloud.group.create(groupModel);
-        if(!result.code.equals(200)){
-            log.error("创建群聊失败:{}",result.errorMessage);
-            throw new BizException("创建群聊失败,请联系管理员");
+        rtcCreate(userId,imGroupId,imGroupName,ClientEnum.TEACHER);
+    }
+
+    //创建融云群
+    private void rtcCreate(Long userId,String imGroupId,String imGroupName,ClientEnum clientType) throws Exception {
+        //创建群
+        SysUser user = sysUserService.findUserById(userId);
+
+        // 群组默认头象
+//        String groupDefaultAvatar = sysConfigService.findConfigValue(SysConfigConstant.GROUP_DEFAULT_AVATAR);
+        List<GroupMemberWrapper.ImGroupMember> groupMembers = Lists.newArrayList();
+        //记录群成员
+        GroupMemberWrapper.ImGroupMember groupMember = GroupMemberWrapper.ImGroupMember
+                .builder()
+                .id(IdWorker.getId())
+                .groupId(imGroupId)
+                .userId(userId)
+                .clientType(clientType.getCode())
+                .avatar(null)
+                .nickname(user.getUsername())
+                .isAdmin(true)
+                .imUserId(getImUserId(userId.toString(),clientType.getCode()))
+                .roleType(clientType.getCode())
+                .build();
+
+
+        // 自动激活学生IM帐号
+        registerUser(groupMembers);
+
+        // 创建IM群组
+        imPluginContext.getPluginService().groupCreate(imGroupId, imGroupName,
+                getImUserId(userId.toString(),clientType.getCode()));
+
+        // 添加群成员到当前群组
+        imPluginContext.getPluginService().groupJoin(imGroupId, imGroupName,
+                groupMembers);
+    }
+
+
+    /**
+     * 批量导入用户
+     * @param groupMembers List<ImGroupMemberWrapper.ImGroupMember>
+     */
+    private void registerUser(List<GroupMemberWrapper.ImGroupMember> groupMembers) {
+        for (GroupMemberWrapper.ImGroupMember member : groupMembers) {
+            // 激活用户帐号为空
+            if (StringUtils.isBlank(member.getNickname())) {
+                continue;
+            }
+
+            try {
+                String imUserId = member.getImUserId();
+                if (StringUtils.isBlank(imUserId)) {
+                    imUserId = getImUserId(String.valueOf(member.getUserId()),
+                            member.getClientType());
+                }
+
+                imPluginContext.getPluginService().register(getImUserId(imUserId,member.getClientType()), member.getNickname(), member.getAvatar());
+            } catch (Exception e) {
+                log.error("registerUser member imToken");
+            }
         }
     }
 
     @Override
+    public List<GroupMemberWrapper.ImGroupMember> getImGroupMembers(List<ImGroupMember> groupMemberList) {
+        return groupMemberList.stream().map(item -> {
+            return GroupMemberWrapper.ImGroupMember.builder()
+                    .id(item.getId())
+                    .groupId(item.getGroupId())
+                    .userId(item.getUserId())
+                    .clientType(item.getRoleType().getCode())
+                    .avatar(item.getAvatar())
+                    .nickname(item.getNickname())
+                    .isAdmin(item.getIsAdmin())
+                    .imUserId(item.getImUserId())
+                    .roleType(item.getRoleType().getCode())
+                    .build();
+        }).collect(Collectors.toList());
+    }
+
+
+    /**
+     * 自动注册用户
+     * @param groupMembers List<ImGroupMemberWrapper.ImGroupMember>
+     */
+    @Override
+    public void asyncRegisterUser(List<GroupMemberWrapper.ImGroupMember> groupMembers) {
+        com.microsvc.toolkit.common.tools.ThreadPool.getExecutor().submit(() -> registerUser(groupMembers));
+    }
+
+    @Override
     @Transactional(rollbackFor = Exception.class)
     public void dismiss(String groupId) throws Exception {
         Long createBy = Optional.ofNullable(this.baseMapper.selectById(groupId)).
@@ -261,20 +340,21 @@ public class ImGroupServiceImpl extends ServiceImpl<ImGroupDao, ImGroup> impleme
         //删除入群申请
         imGroupMemberAuditDao.delByGroupId(groupId);
         //获取所有群成员
-        List<GroupMember> groupMembers = imGroupMemberService.getDao().queryGroupMember(groupId);
+        List<ImGroupMember> groupMembers = imGroupMemberService.getDao().queryGroupMember(groupId);
         //销毁成功,删除群
         this.baseMapper.deleteById(groupId);
         //删除群成员
         imGroupMemberService.delByGroupId(groupId);
         //解散融云群
-        GroupModel groupModel = new GroupModel(groupId,0);
-        GroupMember[] groupMembersArr = groupMembers.toArray(new GroupMember[groupMembers.size()]);
-        groupModel.setMembers(groupMembersArr);
-        Result result = RongCloudConfig.rongCloud.group.dismiss(groupModel);
-        if(!result.code.equals(200)){
-            log.error("解散群聊失败:{}",result.errorMessage);
-            throw new BizException("解散群聊失败,请联系管理员");
-        }
+
+        // 获取群成员
+        List<GroupMemberWrapper.ImGroupMember> imGroupMembers = groupMembers.stream()
+                .map(x -> GroupMemberWrapper.ImGroupMember.builder().userId(x.getUserId())
+                        .groupId(x.getGroupId()).clientType(x.getRoleType().getCode()).build())
+                .collect(Collectors.toList());
+
+        // 解散群
+        imPluginContext.getPluginService().groupDismiss(groupId, imGroupMembers);
     }
 
     @Override
@@ -321,14 +401,13 @@ public class ImGroupServiceImpl extends ServiceImpl<ImGroupDao, ImGroup> impleme
         //修改群成员数
         baseMapper.updateMemberNum(groupId);
 
-        GroupModel groupModel = new GroupModel(groupId,0);
-        GroupMember[] groupMembers = new GroupMember[]{new GroupMember(imUserId,groupId,null)};
-        groupModel.setMembers(groupMembers);
-        Result result = RongCloudConfig.rongCloud.group.quit(groupModel);
-        if(!result.code.equals(200)){
-            log.error("退出群聊失败:{}",result.errorMessage);
-            throw new BizException("退出群聊失败,请联系管理员");
-        }
+
+        // 群主退出
+        List<ImGroupMember> groupMembers = Lists.newArrayList();
+        groupMembers.add(groupMember);
+
+
+        imPluginContext.getPluginService().groupQuit(groupId, getImGroupMembers(groupMembers));
     }
 
     @Override
@@ -377,7 +456,7 @@ public class ImGroupServiceImpl extends ServiceImpl<ImGroupDao, ImGroup> impleme
             String imGroupId = UUID.randomUUID() + imGroup.getType().getCode();
             imGroup.setId(imGroupId);
             this.baseMapper.insert(imGroup);
-            List<GroupMember> 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));
             }
@@ -429,7 +508,7 @@ public class ImGroupServiceImpl extends ServiceImpl<ImGroupDao, ImGroup> impleme
                         }
 
                         // 自动加入该群组
-                        imGroupMemberService.join(Lists.newArrayList(new GroupMember(imIdentity, groupId, null)), groupId);
+                        imGroupMemberService.join(Lists.newArrayList(groupMember), groupId);
 
                         Integer numbers = imGroupMemberService.lambdaQuery()
                                 .eq(ImGroupMember::getGroupId, groupId)
@@ -438,11 +517,7 @@ public class ImGroupServiceImpl extends ServiceImpl<ImGroupDao, ImGroup> impleme
                                 .count();
                         // 拥有老师身份,且非群主时,需要主动退出群聊
                         if (count > 0 && numbers <= 0) {
-
-                            GroupModel groupModel = new GroupModel(groupId,0);
-                            GroupMember[] groupMembers = new GroupMember[]{new GroupMember(String.valueOf(userId), groupId,null)};
-                            groupModel.setMembers(groupMembers);
-                            RongCloudConfig.rongCloud.group.quit(groupModel);
+                            quit(groupId, userId, ClientEnum.TEACHER);
                         }
 
                         // 缓存重新入群标识, 默认有效期为120天

+ 70 - 38
cooleshow-user/user-biz/src/main/java/com/yonge/cooleshow/biz/dal/service/impl/ImUserFriendServiceImpl.java

@@ -6,10 +6,14 @@ import com.baomidou.mybatisplus.core.toolkit.Wrappers;
 import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
 import com.google.common.collect.Lists;
 import com.google.common.collect.Sets;
+import com.microsvc.toolkit.middleware.im.ImPluginContext;
+import com.microsvc.toolkit.middleware.im.impl.TencentCloudImPlugin;
+import com.microsvc.toolkit.middleware.im.message.ETencentMessage;
+import com.microsvc.toolkit.middleware.im.message.MessageWrapper;
+import com.microsvc.toolkit.middleware.im.message.TencentRequest;
 import com.yonge.cooleshow.auth.api.client.SysUserFeignService;
 import com.yonge.cooleshow.auth.api.entity.SysUser;
 import com.yonge.cooleshow.auth.config.CustomerServiceConfig;
-import com.yonge.cooleshow.biz.dal.config.RongCloudConfig;
 import com.yonge.cooleshow.biz.dal.dao.ImUserFriendDao;
 import com.yonge.cooleshow.biz.dal.dao.TeacherDao;
 import com.yonge.cooleshow.biz.dal.dto.BasicUserInfo;
@@ -17,6 +21,7 @@ import com.yonge.cooleshow.biz.dal.entity.ImUserFriend;
 import com.yonge.cooleshow.biz.dal.enums.ClientEnum;
 import com.yonge.cooleshow.biz.dal.enums.MK;
 import com.yonge.cooleshow.biz.dal.mapper.SysUserMapper;
+import com.yonge.cooleshow.biz.dal.service.ImGroupService;
 import com.yonge.cooleshow.biz.dal.service.ImUserFriendService;
 import com.yonge.cooleshow.biz.dal.wrapper.im.CustomerService;
 import com.yonge.cooleshow.biz.dal.wrapper.im.ImUserWrapper;
@@ -46,6 +51,7 @@ import java.util.Optional;
 import java.util.Set;
 import java.util.stream.Collectors;
 
+
 /**
  * 用户通讯录表(ImUserFriend)表服务实现类
  *
@@ -67,6 +73,11 @@ public class ImUserFriendServiceImpl extends ServiceImpl<ImUserFriendDao, ImUser
     @Autowired
     private ImUserFriendService imUserFriendService;
 
+    @Autowired
+    private ImGroupService imGroupService;
+
+    @Autowired
+    private ImPluginContext imPluginContext;
     @Override
     public ImUserFriendDao getDao() {
         return this.baseMapper;
@@ -224,21 +235,26 @@ public class ImUserFriendServiceImpl extends ServiceImpl<ImUserFriendDao, ImUser
                     new PushExt.APNs("", ""),
                     new PushExt.OPPO(""));
 
-            String imUserId = String.valueOf(userId);
-            if (ClientEnum.STUDENT == clientType) {
-                imUserId = MessageFormat.format("{0}:{1}", imUserId, ClientEnum.STUDENT.name());
-            }
-            // 发送用户IM通知消息
-            PrivateMessage privateMessage = new PrivateMessage()
-                    .setSenderId(String.valueOf(friendIds.get(0)))
-                    .setTargetId(new String[]{imUserId})
-                    .setObjectName(txtMessage.getType())
-                    .setContent(txtMessage)
-                    .setPushExt(pushExt)
-                    .setIsIncludeSender(1);
-
-            ResponseResult privateResult = RongCloudConfig.rongCloud.message.msgPrivate.send(privateMessage);
-            log.info("registerUserBindCustomerService userId={}, ret={}", userId, privateResult.getCode());
+            MessageWrapper.PrivateMessage build = MessageWrapper.PrivateMessage.builder()
+                    .senderId(imGroupService.getImUserId(friendIds.get(0).toString(),ClientEnum.TEACHER.getCode()))
+                    .targetIds(Lists.newArrayList(imGroupService.getImUserId(userId.toString(),clientType.getCode())))
+                    .objectName(txtMessage.getType())
+                    .rongCloueMessage(txtMessage)
+                    .pushExt(JSON.toJSONString(pushExt))
+                    .includeSender(0)
+                    .build();
+
+
+            // 腾讯云消息
+            TencentRequest.MessageBody tencentMessages = TencentRequest.MessageBody.builder()
+                    .msgType(ETencentMessage.TIMTextElem.name())
+                    .msgContent(customerMessage)
+                    .build();
+            build.setTencentMessage(tencentMessages);
+
+
+            Boolean ret = imPluginContext.getPluginService().sendPrivateMessage(build);
+            log.info("batchSendPrivateMessage GROUP senderId={},data= {} ret={}", userId,build, ret);
         } catch (Exception e) {
             log.error("registerUserBindCustomerService userId={}", userId, e);
         }
@@ -269,11 +285,9 @@ public class ImUserFriendServiceImpl extends ServiceImpl<ImUserFriendDao, ImUser
             receiveUserIds = sysUserMapper.selectMessageReceives(info).stream()
                     .map(x -> String.valueOf(x.getUserId()))
                     .collect(Collectors.toList());
-            if (ClientEnum.STUDENT == info.getClientType()) {
-                receiveUserIds = receiveUserIds.stream()
-                        .map(x -> MessageFormat.format("{0}:STUDENT", x))
-                        .collect(Collectors.toList());
-            }
+            receiveUserIds = receiveUserIds.stream()
+                    .map(x -> imGroupService.getImUserId(x, ClientEnum.STUDENT.getCode()))
+                    .collect(Collectors.toList());
         } else {
 
             LambdaQueryWrapper<com.yonge.cooleshow.biz.dal.entity.SysUser> wrapper = Wrappers.<com.yonge.cooleshow.biz.dal.entity.SysUser>lambdaQuery()
@@ -298,7 +312,11 @@ public class ImUserFriendServiceImpl extends ServiceImpl<ImUserFriendDao, ImUser
         // 发送文本消息
         TxtMessage txtMessage = new TxtMessage(info.getTxtMessage(), "");
 
-        List<BaseMessage> messages = Lists.newArrayList(imgMessage, txtMessage);
+        List<BaseMessage> baseMessages = Lists.newArrayList(imgMessage, txtMessage);
+
+        List<TencentRequest.MessageBody> tencentMessages = Lists.newArrayList();
+        tencentMessages.add(CustomerServiceBatchSendingServiceImpl.getTimTextElem(info.getTxtMessage()));
+        tencentMessages.add(CustomerServiceBatchSendingServiceImpl.getTimImageElem(info.getImgMessage()));
 
         // 拓展消息
         PushExt pushExt = PushExt.build(info.getTitle(), 1,
@@ -306,26 +324,40 @@ public class ImUserFriendServiceImpl extends ServiceImpl<ImUserFriendDao, ImUser
                 new PushExt.APNs("", ""),
                 new PushExt.OPPO(""));
 
-        String senderId = String.valueOf(senderUser.getId());
-        PrivateMessage privateMessage;
-        ResponseResult privateResult;
+        String senderId = imGroupService.getImUserId(senderUser.getId().toString(), ClientEnum.TEACHER.getCode());
         for (List<String> item : Lists.partition(receiveUserIds, 100)) {
 
             try {
 
-                for (BaseMessage message : messages) {
-
-                    // 发送用户IM通知消息
-                    privateMessage = new PrivateMessage()
-                            .setSenderId(senderId)
-                            .setTargetId(item.toArray(new String[0]))
-                            .setObjectName(message.getType())
-                            .setContent(message)
-                            .setPushExt(pushExt)
-                            .setIsIncludeSender(0);
-
-                    privateResult = RongCloudConfig.rongCloud.message.msgPrivate.send(privateMessage);
-                    log.info("sendCustomerServiceNotifyMessage senderId={}, ret={}", senderId, privateResult.getCode());
+                // 发送用户IM通知消息
+                MessageWrapper.PrivateMessage build = MessageWrapper.PrivateMessage.builder()
+                        .senderId(senderId)
+                        .targetIds(item)
+//                        .objectName(message.getType())
+//                        .rongCloueMessage(message)
+                        .pushExt(JSON.toJSONString(pushExt))
+                        .includeSender(0)
+//                        .tencentMessage()
+                        .build();
+
+                if (TencentCloudImPlugin.PLUGIN_NAME.equals(imPluginContext.defaultService())) {
+                    // 腾讯云消息
+                    for (TencentRequest.MessageBody message : tencentMessages) {
+                        if (message == null) {
+                            continue;
+                        }
+                        Boolean ret = imPluginContext.getPluginService().sendPrivateMessage(build.objectName(message.getMsgType()).tencentMessage(message));
+                        log.info("batchSendPrivateMessage GROUP tencentCloud senderId={}, ret={}", senderId, ret);
+                    }
+                } else {
+                    // 融云消息
+                    for (BaseMessage message : baseMessages) {
+                        if (message == null){
+                            continue;
+                        }
+                        Boolean ret = imPluginContext.getPluginService().sendPrivateMessage(build.objectName(message.getType()).rongCloueMessage(message));
+                        log.info("batchSendPrivateMessage GROUP rongCloud senderId={}, ret={}", senderId, ret);
+                    }
                 }
 
             } catch (Exception e) {

+ 2 - 6
cooleshow-user/user-biz/src/main/java/com/yonge/cooleshow/biz/dal/service/impl/StudentStarServiceImpl.java

@@ -3,10 +3,7 @@ package com.yonge.cooleshow.biz.dal.service.impl;
 import com.baomidou.mybatisplus.core.toolkit.Wrappers;
 import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
 import com.google.common.collect.Maps;
-import com.yonge.cooleshow.biz.dal.entity.ImGroup;
-import com.yonge.cooleshow.biz.dal.entity.StudentTotal;
-import com.yonge.cooleshow.biz.dal.entity.SysUser;
-import com.yonge.cooleshow.biz.dal.entity.TeacherTotal;
+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.MessageTypeEnum;
@@ -24,7 +21,6 @@ import lombok.extern.slf4j.Slf4j;
 import org.redisson.api.RedissonClient;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.stereotype.Service;
-import com.yonge.cooleshow.biz.dal.entity.StudentStar;
 import com.yonge.cooleshow.biz.dal.dao.StudentStarDao;
 import com.yonge.cooleshow.biz.dal.service.StudentStarService;
 
@@ -103,7 +99,7 @@ public class StudentStarServiceImpl extends ServiceImpl<StudentStarDao, StudentS
                 if (Objects.nonNull(imGroup)) {
 
                     //处理本地群成员
-                    List<GroupMember> groupMembers = imGroupMemberService.initGroupMember(imGroup.getId(),
+                    List<ImGroupMember> groupMembers = imGroupMemberService.initGroupMember(imGroup.getId(),
                             studentId, false, ImGroupMemberRoleType.STUDENT);
                     //同步群成员数量
                     imGroupService.getDao().updateMemberNum(imGroup.getId());

+ 1 - 5
cooleshow-user/user-biz/src/main/resources/config/mybatis/ImGroupMemberMapper.xml

@@ -50,11 +50,7 @@
         </where>
         LIMIT 1
     </select>
-    <resultMap id="GroupMember" type="io.rong.models.group.GroupMember">
-        <result property="id" column="user_id_"/>
-        <result property="groupId" column="group_id_"/>
-    </resultMap>
-    <select id="queryGroupMember" resultMap="GroupMember">
+    <select id="queryGroupMember" resultType="com.yonge.cooleshow.biz.dal.entity.ImGroupMember">
         SELECT user_id_,group_id_ FROM im_group_member WHERE group_id_ = #{groupId}
     </select>
     <resultMap id="ImGroupMember" type="com.yonge.cooleshow.biz.dal.entity.ImGroupMember">