Explorar el Código

腾讯网络教室

zouxuan hace 2 años
padre
commit
aab7b7aac4
Se han modificado 30 ficheros con 1133 adiciones y 332 borrados
  1. 5 6
      cooleshow-api/src/main/java/com/yonge/cooleshow/api/feign/AdminFeignService.java
  2. 16 0
      cooleshow-api/src/main/java/com/yonge/cooleshow/api/feign/dto/ImUserInfo.java
  3. 6 6
      cooleshow-api/src/main/java/com/yonge/cooleshow/api/feign/fallback/AdminFeignServiceFallback.java
  4. 9 6
      cooleshow-auth/auth-server/src/main/java/com/yonge/cooleshow/auth/web/controller/TokenController.java
  5. 94 0
      cooleshow-user/user-admin/src/main/java/com/yonge/cooleshow/admin/controller/ImGroupController.java
  6. 22 0
      cooleshow-user/user-admin/src/main/java/com/yonge/cooleshow/admin/controller/open/ImController.java
  7. 24 24
      cooleshow-user/user-biz/src/main/java/com/yonge/cooleshow/biz/dal/config/RongCloudConfig.java
  8. 9 0
      cooleshow-user/user-biz/src/main/java/com/yonge/cooleshow/biz/dal/dao/ImGroupDao.java
  9. 1 1
      cooleshow-user/user-biz/src/main/java/com/yonge/cooleshow/biz/dal/dao/ImGroupMemberDao.java
  10. 91 0
      cooleshow-user/user-biz/src/main/java/com/yonge/cooleshow/biz/dal/entity/ImHistoryMessage.java
  11. 8 8
      cooleshow-user/user-biz/src/main/java/com/yonge/cooleshow/biz/dal/service/ImGroupMemberService.java
  12. 48 2
      cooleshow-user/user-biz/src/main/java/com/yonge/cooleshow/biz/dal/service/ImGroupService.java
  13. 2 2
      cooleshow-user/user-biz/src/main/java/com/yonge/cooleshow/biz/dal/service/impl/CourseGroupServiceImpl.java
  14. 5 5
      cooleshow-user/user-biz/src/main/java/com/yonge/cooleshow/biz/dal/service/impl/CourseHomeworkServiceImpl.java
  15. 5 9
      cooleshow-user/user-biz/src/main/java/com/yonge/cooleshow/biz/dal/service/impl/CourseScheduleServiceImpl.java
  16. 109 48
      cooleshow-user/user-biz/src/main/java/com/yonge/cooleshow/biz/dal/service/impl/CustomerServiceBatchSendingServiceImpl.java
  17. 3 2
      cooleshow-user/user-biz/src/main/java/com/yonge/cooleshow/biz/dal/service/impl/ImGroupMemberAuditServiceImpl.java
  18. 39 35
      cooleshow-user/user-biz/src/main/java/com/yonge/cooleshow/biz/dal/service/impl/ImGroupMemberServiceImpl.java
  19. 459 70
      cooleshow-user/user-biz/src/main/java/com/yonge/cooleshow/biz/dal/service/impl/ImGroupServiceImpl.java
  20. 7 10
      cooleshow-user/user-biz/src/main/java/com/yonge/cooleshow/biz/dal/service/impl/ImNetworkRoomMemberServiceImpl.java
  21. 14 18
      cooleshow-user/user-biz/src/main/java/com/yonge/cooleshow/biz/dal/service/impl/ImNetworkRoomServiceImpl.java
  22. 70 38
      cooleshow-user/user-biz/src/main/java/com/yonge/cooleshow/biz/dal/service/impl/ImUserFriendServiceImpl.java
  23. 5 1
      cooleshow-user/user-biz/src/main/java/com/yonge/cooleshow/biz/dal/service/impl/StudentServiceImpl.java
  24. 2 6
      cooleshow-user/user-biz/src/main/java/com/yonge/cooleshow/biz/dal/service/impl/StudentStarServiceImpl.java
  25. 38 0
      cooleshow-user/user-biz/src/main/resources/config/mybatis/ImGroupMapper.xml
  26. 1 5
      cooleshow-user/user-biz/src/main/resources/config/mybatis/ImGroupMemberMapper.xml
  27. 7 1
      cooleshow-user/user-classroom/src/main/java/com/yonge/cooleshow/classroom/controller/ImNetworkRoomController.java
  28. 6 2
      cooleshow-user/user-student/src/main/java/com/yonge/cooleshow/student/controller/CourseHomeworkController.java
  29. 15 21
      cooleshow-user/user-student/src/main/java/com/yonge/cooleshow/student/controller/TeacherController.java
  30. 13 6
      cooleshow-user/user-teacher/src/main/java/com/yonge/cooleshow/teacher/controller/CourseHomeworkController.java

+ 5 - 6
cooleshow-api/src/main/java/com/yonge/cooleshow/api/feign/AdminFeignService.java

@@ -1,11 +1,6 @@
 package com.yonge.cooleshow.api.feign;
 
-import com.yonge.cooleshow.api.feign.dto.CouponInfoApi;
-import com.yonge.cooleshow.api.feign.dto.EmployeeApi;
-import com.yonge.cooleshow.api.feign.dto.StudentApi;
-import com.yonge.cooleshow.api.feign.dto.StudentWrapper;
-import com.yonge.cooleshow.api.feign.dto.TeacherApi;
-import com.yonge.cooleshow.api.feign.dto.UserFriendInfoVO;
+import com.yonge.cooleshow.api.feign.dto.*;
 import com.yonge.cooleshow.api.feign.fallback.AdminFeignServiceFallback;
 import com.yonge.cooleshow.common.constant.AppConstant;
 import com.yonge.cooleshow.common.entity.ContractDto;
@@ -154,4 +149,8 @@ public interface AdminFeignService {
 
     @PostMapping("/open/adminClient/unionStudent")
     HttpResponseResult<StudentWrapper.UnionStudentResp> unionStudent(@RequestBody StudentWrapper.UnionStudent info);
+
+
+    @PostMapping(value = "/open/im/register")
+    ImUserInfo register(String userId, String clientType, String username, String avatar);
 }

+ 16 - 0
cooleshow-api/src/main/java/com/yonge/cooleshow/api/feign/dto/ImUserInfo.java

@@ -0,0 +1,16 @@
+package com.yonge.cooleshow.api.feign.dto;
+
+import lombok.Data;
+
+@Data
+public class ImUserInfo {
+
+    private String imUserId;
+
+    private String imToken;
+
+    public ImUserInfo imUserId(String imUserId) {
+        this.imUserId = imUserId;
+        return this;
+    }
+}

+ 6 - 6
cooleshow-api/src/main/java/com/yonge/cooleshow/api/feign/fallback/AdminFeignServiceFallback.java

@@ -1,12 +1,7 @@
 package com.yonge.cooleshow.api.feign.fallback;
 
 import com.yonge.cooleshow.api.feign.AdminFeignService;
-import com.yonge.cooleshow.api.feign.dto.CouponInfoApi;
-import com.yonge.cooleshow.api.feign.dto.EmployeeApi;
-import com.yonge.cooleshow.api.feign.dto.StudentApi;
-import com.yonge.cooleshow.api.feign.dto.StudentWrapper;
-import com.yonge.cooleshow.api.feign.dto.TeacherApi;
-import com.yonge.cooleshow.api.feign.dto.UserFriendInfoVO;
+import com.yonge.cooleshow.api.feign.dto.*;
 import com.yonge.cooleshow.common.entity.ContractDto;
 import com.yonge.cooleshow.common.entity.HttpResponseResult;
 import com.yonge.cooleshow.common.entity.MallOrderItemDto;
@@ -138,4 +133,9 @@ public class AdminFeignServiceFallback implements AdminFeignService {
     public HttpResponseResult<StudentWrapper.UnionStudentResp> unionStudent(StudentWrapper.UnionStudent info) {
         return null;
     }
+
+    @Override
+    public ImUserInfo register(String userId, String clientType, String username, String avatar) {
+        return null;
+    }
 }

+ 9 - 6
cooleshow-auth/auth-server/src/main/java/com/yonge/cooleshow/auth/web/controller/TokenController.java

@@ -3,6 +3,8 @@ package com.yonge.cooleshow.auth.web.controller;
 import com.alibaba.fastjson.JSON;
 import com.alibaba.fastjson.JSONObject;
 import com.fasterxml.jackson.databind.ObjectMapper;
+import com.yonge.cooleshow.api.feign.AdminFeignService;
+import com.yonge.cooleshow.api.feign.dto.ImUserInfo;
 import com.yonge.cooleshow.auth.api.dto.QRLoginDto;
 import com.yonge.cooleshow.auth.api.entity.SysUser;
 import com.yonge.cooleshow.auth.api.vo.SysUserVo;
@@ -41,6 +43,7 @@ import org.springframework.web.bind.annotation.RequestParam;
 import org.springframework.web.bind.annotation.RestController;
 import org.springframework.web.client.RestTemplate;
 
+import javax.annotation.Resource;
 import javax.servlet.http.HttpServletRequest;
 import java.io.IOException;
 import java.text.MessageFormat;
@@ -74,6 +77,8 @@ public class TokenController extends BaseController {
 
     @Autowired
     private RedissonClient redissonClient;
+    @Resource
+    private AdminFeignService adminFeignService;
 
     @PostMapping(value = "/smsLogin", consumes = MediaType.APPLICATION_JSON_VALUE)
     @ApiOperation(value = "短信验证码的方式登录")
@@ -109,15 +114,13 @@ public class TokenController extends BaseController {
 
         AuthUser authUser = SecurityUtils.getUser();
         if (authUser != null) {
-            SysUser sysUser = userService.queryUserInfoWithIMToken(authUser.getUserId(), EClientType.valueOf(clientType));
+            SysUser sysUser = userService.queryUserInfo(authUser.getUserId());
 
-            String imUserId = String.valueOf(sysUser.getId());
-            if (EClientType.STUDENT.match(clientType)) {
-                imUserId = MessageFormat.format("{0}:{1}",imUserId, clientType);
-            }
+            ImUserInfo register = adminFeignService.register(sysUser.getId().toString(), clientType, sysUser.getUsername(), sysUser.getAvatar());
 
+            sysUser.setImToken(register.getImToken());
             // 封装返回参数
-            return succeed(JSON.parseObject(JSON.toJSONString(sysUser), SysUserVo.class).imUserId(imUserId));
+            return succeed(JSON.parseObject(JSON.toJSONString(sysUser), SysUserVo.class).imUserId(register.getImUserId()));
         }
         return failed("获取用户信息失败");
     }

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

@@ -1,17 +1,26 @@
 package com.yonge.cooleshow.admin.controller;
 
 
+import com.alibaba.fastjson.JSONObject;
+import com.tencentyun.TLSSigAPIv2;
 import com.yonge.cooleshow.biz.dal.dto.ImGroupSearchDto;
 import com.yonge.cooleshow.biz.dal.entity.ImGroup;
+import com.yonge.cooleshow.biz.dal.entity.ImHistoryMessage;
 import com.yonge.cooleshow.biz.dal.enums.ClientEnum;
 import com.yonge.cooleshow.biz.dal.service.ImGroupService;
 import com.yonge.cooleshow.biz.dal.service.SysUserService;
 import com.yonge.cooleshow.common.controller.BaseController;
 import com.yonge.cooleshow.common.entity.HttpResponseResult;
+import com.yonge.cooleshow.common.redis.service.RedisCache;
+import com.yonge.toolset.utils.date.DateUtil;
+import com.yonge.toolset.utils.http.HttpUtil;
 import com.yonge.toolset.utils.validator.ValidationKit;
 import io.swagger.annotations.Api;
 import io.swagger.annotations.ApiOperation;
 import io.swagger.annotations.ApiParam;
+import org.apache.commons.io.FileUtils;
+import org.apache.commons.lang3.StringUtils;
+import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.http.HttpStatus;
 import org.springframework.security.access.prepost.PreAuthorize;
 import org.springframework.validation.BindingResult;
@@ -19,6 +28,13 @@ import org.springframework.web.bind.annotation.*;
 
 import javax.annotation.Resource;
 import javax.validation.Valid;
+import java.io.File;
+import java.net.HttpURLConnection;
+import java.net.MalformedURLException;
+import java.net.URL;
+import java.text.SimpleDateFormat;
+import java.util.Calendar;
+import java.util.Date;
 import java.util.List;
 
 /**
@@ -39,6 +55,11 @@ public class ImGroupController extends BaseController {
     @Resource
     private SysUserService sysUserService;
 
+
+
+    @Autowired
+    private RedisCache redisCache;
+
     @ApiOperation("获取群详情")
     @PostMapping(value = "/getDetail/{groupId}")
     @PreAuthorize("@pcs.hasPermissions('imGroup/detail')")
@@ -65,5 +86,78 @@ public class ImGroupController extends BaseController {
         imGroupService.quit(groupId,sysUserService.getUserId(), ClientEnum.STUDENT);
         return succeed();
     }
+
+
+
+    @GetMapping(value = "/syncImHistoryMessageTask")
+    // 融云同步即时通讯聊天记录
+    public void syncImHistoryMessageTask(String date) throws Exception {
+        if(date == null){
+            date = DateUtil.format(DateUtil.addHours(new Date(),-2), DateUtil.YEAR_MONTH_DAY_HOUR);
+        }
+        // 获取输入日期
+        SimpleDateFormat format = new SimpleDateFormat("yyyyMMddHH");
+        Date currentDate = format.parse(date);
+
+        // 创建Calendar对象 设置为输入时间
+        Calendar calendar = Calendar.getInstance();
+        calendar.setTime(currentDate);
+
+        // 将日期减少一个月
+        calendar.add(Calendar.MONTH, -1);
+
+        // 获取减少一个月后的日期
+        Date lastMonthDate = calendar.getTime();
+
+        calendar.setTime(currentDate);
+
+        //按照小时递减
+        while (currentDate.after(lastMonthDate))
+        {
+            String d = DateUtil.format(DateUtil.addHours(currentDate,0), DateUtil.YEAR_MONTH_DAY_HOUR);
+            Object o = imGroupService.historyGet(d);
+            JSONObject jsonObject = JSONObject.parseObject(JSONObject.toJSONString(o));
+            if(jsonObject.get("code").equals(200)){
+                Boolean success = redisCache.getRedisTemplate().opsForValue().setIfAbsent("syncImHistoryMessage" + d,d);
+                if(!success){
+                    return;
+                }
+                String url = jsonObject.getString("url");
+                if(StringUtils.isEmpty(url)){
+                    return;
+                }
+                File file = new File(FileUtils.getTempDirectoryPath() + url.substring(url.lastIndexOf("/")));
+                URL url1 = new URL(url);
+                FileUtils.copyURLToFile(url1,file);
+                imGroupService.saveImHistoryMessage(new File(file.getAbsolutePath()));
+            }
+            calendar.add(Calendar.HOUR,-1);
+            currentDate = calendar.getTime();
+        }
+
+    }
+
+
+    @ApiOperation("IM导入消息")
+    @PostMapping(value = "/ImportIM")
+    public void ImportIM() throws Exception {
+
+        //获取融云消息
+        List<ImHistoryMessage> info = imGroupService.getRongYunInfo();
+
+        imGroupService.importInfo(info);
+
+
+    }
+
+    @GetMapping(value = "/groupTransfer")
+    @ApiOperation("群导入")
+    public void groupTransfer() {
+        imGroupService.groupTransfer();
+    }
+
+
+
+
 }
 

+ 22 - 0
cooleshow-user/user-admin/src/main/java/com/yonge/cooleshow/admin/controller/open/ImController.java

@@ -8,17 +8,21 @@ import com.microsvc.toolkit.middleware.live.impl.TencentCloudLivePlugin;
 import com.yonge.cooleshow.admin.io.request.course.CourseRelationVo;
 import com.yonge.cooleshow.admin.io.request.im.IMNotifyMessageVO;
 import com.yonge.cooleshow.admin.io.request.im.UserFriendInfoVO;
+import com.yonge.cooleshow.api.feign.dto.ImUserInfo;
 import com.yonge.cooleshow.biz.dal.dto.TencentData;
 import com.yonge.cooleshow.biz.dal.dto.TencentImCallbackResult;
 import com.yonge.cooleshow.biz.dal.entity.ImUserStateSync;
 import com.yonge.cooleshow.biz.dal.enums.ClientEnum;
 import com.yonge.cooleshow.biz.dal.enums.im.ETencentImCallbackCommand;
 import com.yonge.cooleshow.biz.dal.service.CourseRelationMusicAlbumService;
+import com.yonge.cooleshow.biz.dal.service.ImGroupService;
 import com.yonge.cooleshow.biz.dal.service.ImUserFriendService;
 import com.yonge.cooleshow.biz.dal.service.LiveRoomService;
 import com.yonge.cooleshow.biz.dal.wrapper.im.CustomerService;
+import com.yonge.cooleshow.biz.dal.wrapper.im.ImGroupWrapper;
 import com.yonge.cooleshow.common.controller.BaseController;
 import com.yonge.cooleshow.common.entity.HttpResponseResult;
+import com.yonge.toolset.base.exception.BizException;
 import io.swagger.annotations.Api;
 import io.swagger.annotations.ApiOperation;
 import lombok.extern.slf4j.Slf4j;
@@ -62,6 +66,9 @@ public class ImController extends BaseController {
     @Autowired
     private LiveRoomService liveRoomService;
 
+    @Autowired
+    private ImGroupService imGroupService;
+
     @ApiOperation("新用户添加客服")
     @PostMapping(value = "/im/customerService")
     public HttpResponseResult<Boolean> customerService(@RequestBody UserFriendInfoVO info) {
@@ -241,5 +248,20 @@ public class ImController extends BaseController {
         return TencentData.StreamEventCallbackResult.builder().code(0).build();
     }
 
+    @ApiOperation("注册im用户")
+    @PostMapping(value = "/im/register")
+    public ImUserInfo register(String userId, ClientEnum clientType, String username, String avatar) {
+
+        log.info("注册im用户");
+
+        try {
+            ImGroupWrapper.ImUserInfo register = imGroupService.register(userId, clientType, username, avatar);
+            return JSON.parseObject(JSON.toJSONString(register), ImUserInfo.class);
+        } catch (Exception e) {
+            log.error("注册im用户失败", e);
+            throw new BizException(e.getMessage());
+        }
+    }
+
 }
 

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

+ 9 - 0
cooleshow-user/user-biz/src/main/java/com/yonge/cooleshow/biz/dal/dao/ImGroupDao.java

@@ -4,9 +4,11 @@ import com.baomidou.mybatisplus.core.mapper.BaseMapper;
 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.ImHistoryMessage;
 import org.apache.ibatis.annotations.Param;
 
 import java.util.List;
+import java.util.Set;
 
 /**
  * 即时通讯群组(ImGroup)表数据库访问层
@@ -23,5 +25,12 @@ public interface ImGroupDao extends BaseMapper<ImGroup> {
 
     //更新群成员数量
     void updateMemberNum(@Param("groupId") String groupId);
+
+    //批量插入历史数据
+    void batchInsert(@Param("list") List<ImHistoryMessage> historyMessages);
+
+    //获取融云数据
+    List<ImHistoryMessage> selectAll();
+
 }
 

+ 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: 获取群成员列表

+ 91 - 0
cooleshow-user/user-biz/src/main/java/com/yonge/cooleshow/biz/dal/entity/ImHistoryMessage.java

@@ -0,0 +1,91 @@
+package com.yonge.cooleshow.biz.dal.entity;
+
+import com.baomidou.mybatisplus.annotation.TableField;
+import com.baomidou.mybatisplus.annotation.TableId;
+import com.baomidou.mybatisplus.annotation.TableName;
+import lombok.Data;
+
+import io.swagger.annotations.ApiModel;
+import io.swagger.annotations.ApiModelProperty;
+
+import java.io.Serializable;
+
+/**
+ * @Author:haonan
+ * @Date:2023/8/7 15:17
+ * @Filename:ImHistoryMessage
+ */
+@Data
+@ApiModel(" ImHistoryMessage-历史消息记录")
+@TableName("im_history_message")
+public class ImHistoryMessage implements Serializable {
+
+    @ApiModelProperty("可通过 msgUID 确定消息唯一")
+    @TableId(value = "msgUID_")
+    private String msgUID;
+
+    @ApiModelProperty("发送者 ID")
+    @TableField(value = "fromUserId_")
+    private String fromUserId;
+
+    @ApiModelProperty("接收者 ID,在消息路由中为 toUserId,当发送聊天室广播消息、全量用户落地通知时此字段为空")
+    @TableField(value = "targetId_")
+    private String targetId;
+
+    @ApiModelProperty("会话类型。1(单聊会话)、2(讨论组会话)、3(群组会话)、4(聊天室会话)、5(客服会话)、6(系统通知)、7(应用公众服务)、8(公众服务)、10(超级群会话)。targetType 在 SDK 中为 ConversationType。")
+    @TableField(value = "targetType_")
+    private Integer targetType;
+
+    @ApiModelProperty("根据不同的 targetType,可能是讨论组 Id、群组 ID、超级群 ID 或聊天室 ID ,如 targetType 为 1 时可忽略 GroupId")
+    @TableField(value = "GroupId_")
+    private String groupId;
+
+    @ApiModelProperty("	超级群频道 ID。")
+    @TableField(value = "busChannel_")
+    private String busChannel;
+
+    @ApiModelProperty("消息类型,例如文本消息 RC:TxtMsg、图片消息 RC:ImgMsg")
+    @TableField(value = "classname_")
+    private String classname;
+
+    @ApiModelProperty("消息内容")
+    @TableField(value = "content_")
+    private String content;
+
+    @ApiModelProperty("消息扩展")
+    @TableField(value = "extraContent_")
+    private String extraContent;
+
+    @ApiModelProperty("消息时间")
+    @TableField(value = "dateTime_")
+    private String dateTime;
+
+    @ApiModelProperty("消息来源,包括:iOS、Android、Websocket、MiniProgram(小程序)、PC、Server。")
+    @TableField(value = "source_")
+    private String source;
+
+    @ApiModelProperty("是否被丢弃,true 为是,false 为否,只针对聊天室会话类型存在。")
+    @TableField(value = "isDiscard_")
+    private String isDiscard;
+
+    @ApiModelProperty("是否含有屏蔽敏感词,true 为含有、false 为不含有。只针对聊天室会话类型存在。")
+    @TableField(value = "isSensitiveWord_")
+    private String isSensitiveWord;
+
+    @ApiModelProperty("是否为被禁言后发送的消息,只针对聊天室会话类型存在。")
+    @TableField(value = "isForbidden_")
+    private String isForbidden;
+
+    @ApiModelProperty("	消息是否不分发,true 为不分发、false 为分发。只针对聊天室会话类型存在。")
+    @TableField(value = "isNotForward_")
+    private String isNotForward;
+
+    @ApiModelProperty("targetType 为 3 时此参数有效,显示为群组中指定接收消息的用户 ID 数组,该条消息为群组定向消息。非定向消息时内容为空,如指定的用户不在群组中内容也为空。")
+    @TableField(value = "groupUserIds_")
+    private String groupUserIds;
+
+    @ApiModelProperty("App Key")
+    @TableField(value = "appId_")
+    private String appId;
+
+}

+ 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: 删除群成员

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

@@ -1,13 +1,19 @@
 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.entity.ImHistoryMessage;
 import com.yonge.cooleshow.biz.dal.enums.ClientEnum;
+import com.yonge.cooleshow.biz.dal.enums.RoleEnum;
 import com.yonge.cooleshow.biz.dal.wrapper.im.ImGroupWrapper;
+import io.rong.models.Result;
 
+import java.io.File;
 import java.util.List;
 
 /**
@@ -29,14 +35,20 @@ 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);
+
+
+    String getImUserId(Long userId, RoleEnum userRole);
+
+
+    String getImUserId(Long userId, ClientEnum clientEnum);
 
     /**
      * 解析IM用户规则
@@ -62,6 +74,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
@@ -111,5 +127,35 @@ public interface ImGroupService extends IService<ImGroup> {
      * @return ImGroup
      */
     ImGroup findGroupInfoById(String groupId, Long userId);
+
+    /**
+     * 同步即时通讯聊天记录
+     * @param date
+     * @return
+     */
+    Result historyGet (String date)throws Exception;
+
+    /**
+     * 保存历史消息
+     * @param file
+     */
+    void saveImHistoryMessage(File file);
+
+    /**
+     * 读取融云数据库信息
+     */
+    List<ImHistoryMessage> getRongYunInfo();
+
+    /**
+     * 导入IM腾讯云
+     * @param info
+     * @throws Exception
+     */
+    void importInfo(List<ImHistoryMessage> info) throws Exception;
+
+    /**
+     * 群迁移,融云->腾讯
+     */
+    void groupTransfer();
 }
 

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

@@ -183,8 +183,8 @@ public class CourseGroupServiceImpl extends ServiceImpl<CourseGroupDao, CourseGr
         if (CollectionUtils.isNotEmpty(result.getStudentList())) {
 
             for (LiveCourseInfoVo.CourseBuyStudentVo item : result.getStudentList()) {
-
-                item.setImUserId(MessageFormat.format("{0}:{1}", String.valueOf(item.getStudentId()), ClientEnum.STUDENT.name()));
+                item.setImUserId(imGroupService.getImUserId(String.valueOf(item.getStudentId()),
+                        ClientEnum.STUDENT.name()));
             }
         }
         //查询是否购买过该课程组

+ 5 - 5
cooleshow-user/user-biz/src/main/java/com/yonge/cooleshow/biz/dal/service/impl/CourseHomeworkServiceImpl.java

@@ -106,8 +106,8 @@ public class CourseHomeworkServiceImpl extends ServiceImpl<CourseHomeworkDao, Co
         }
 
         for (CourseHomeworkVo item : studentInfoList) {
-
-            item.setImUserId(MessageFormat.format("{0}:{1}", String.valueOf(item.getStudentId()), ClientEnum.STUDENT.name()));
+            item.setImUserId(imGroupService.getImUserId(String.valueOf(item.getStudentId()),
+                    ClientEnum.STUDENT.name()));
         }
 
         Map<Long, List<CourseHomeworkVo>> studentCollect = studentInfoList.stream()
@@ -120,8 +120,7 @@ public class CourseHomeworkServiceImpl extends ServiceImpl<CourseHomeworkDao, Co
         }
 
         for (CourseHomeworkVo item : teacherInfoList) {
-
-            item.setImUserId(String.valueOf(item.getTeacherId()));
+            item.setImUserId(imGroupService.getImUserId(String.valueOf(item.getTeacherId()),ClientEnum.TEACHER.name()));
         }
 
         Map<Long, List<CourseHomeworkVo>> teacherCollect = teacherInfoList.stream()
@@ -194,7 +193,8 @@ public class CourseHomeworkServiceImpl extends ServiceImpl<CourseHomeworkDao, Co
         }
 
         // 设置用户IM聊天ID
-        courseHomeworkDetailVo.setImUserId(MessageFormat.format("{0}:{1}", String.valueOf(studentId), ClientEnum.STUDENT.name()));
+        courseHomeworkDetailVo.setImUserId(imGroupService.getImUserId(String.valueOf(studentId),
+                ClientEnum.STUDENT.name()));
 
         // 课程组的群聊
         ImGroup imGroup = imGroupService.getByCourseGroupId(courseHomeworkDetailVo.getCourseGroupId());

+ 5 - 9
cooleshow-user/user-biz/src/main/java/com/yonge/cooleshow/biz/dal/service/impl/CourseScheduleServiceImpl.java

@@ -712,8 +712,7 @@ public class CourseScheduleServiceImpl extends ServiceImpl<CourseScheduleDao, Co
             List<MyCourseVo> list = baseMapper.queryTeacherPracticeCourse(page, monthToDate(search));
 
             for (MyCourseVo item : list) {
-
-                item.setImUserId(MessageFormat.format("{0}:{1}", String.valueOf(item.getUserId()), ClientEnum.STUDENT.name()));
+                item.setImUserId(imGroupService.getImUserId(String.valueOf(item.getUserId()),ClientEnum.STUDENT.name()));
             }
 
             if (replied == 0) {//未评价
@@ -731,8 +730,7 @@ public class CourseScheduleServiceImpl extends ServiceImpl<CourseScheduleDao, Co
 
         List<MyCourseVo> records = baseMapper.queryTeacherPracticeCourse(page, monthToDate(search));
         for (MyCourseVo item : records) {
-
-            item.setImUserId(MessageFormat.format("{0}:{1}", String.valueOf(item.getUserId()), ClientEnum.STUDENT.name()));
+            item.setImUserId(imGroupService.getImUserId(String.valueOf(item.getUserId()),ClientEnum.STUDENT.name()));
         }
 
         return page.setRecords(records);
@@ -793,7 +791,7 @@ public class CourseScheduleServiceImpl extends ServiceImpl<CourseScheduleDao, Co
 
             for (MyCourseVo item : records) {
 
-                item.setImUserId(String.valueOf(item.getUserId()));
+                item.setImUserId(imGroupService.getImUserId(String.valueOf(item.getUserId()),ClientEnum.TEACHER.name()));
             }
         }
 
@@ -844,8 +842,7 @@ public class CourseScheduleServiceImpl extends ServiceImpl<CourseScheduleDao, Co
         if (CollectionUtils.isNotEmpty(studentList)) {
 
             for (CourseStudent item : studentList) {
-
-                item.setImUserId(MessageFormat.format("{0}:{1}", item.getUserId(), ClientEnum.STUDENT.name()));
+                item.setImUserId(imGroupService.getImUserId(String.valueOf(item.getUserId()),ClientEnum.STUDENT.name()));
             }
         }
 
@@ -901,8 +898,7 @@ public class CourseScheduleServiceImpl extends ServiceImpl<CourseScheduleDao, Co
         if (CollectionUtils.isNotEmpty(teacherList)) {
 
             for (CourseStudent item : teacherList) {
-
-                item.setImUserId(item.getUserId());
+                item.setImUserId(imGroupService.getImUserId(String.valueOf(item.getUserId()),ClientEnum.STUDENT.name()));
             }
         }
 

+ 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());
             //加入融云群

+ 39 - 35
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) {
@@ -198,9 +202,9 @@ public class ImGroupMemberServiceImpl extends ServiceImpl<ImGroupMemberDao, ImGr
                 item.setImUserId(String.valueOf(item.getUserId()));
 
                 if (ImGroupMemberRoleType.STUDENT == item.getRoleType()) {
-
-                    item.setImUserId(MessageFormat.format("{0}:{1}", String.valueOf(item.getUserId()),
-                            ClientEnum.STUDENT.getCode()));
+                    item.setImUserId(imGroupService.getImUserId(String.valueOf(item.getUserId()),ClientEnum.STUDENT.name()));
+                }else if(ImGroupMemberRoleType.TEACHER == item.getRoleType()){
+                    item.setImUserId(imGroupService.getImUserId(String.valueOf(item.getUserId()),ClientEnum.TEACHER.name()));
                 }
             }
         }

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

@@ -1,13 +1,17 @@
 package com.yonge.cooleshow.biz.dal.service.impl;
 
+import com.alibaba.fastjson.JSONObject;
+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.message.MessageWrapper;
+import com.microsvc.toolkit.middleware.im.message.TencentRequest;
 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;
@@ -16,29 +20,27 @@ import com.yonge.cooleshow.biz.dal.dto.ImGroupSearchDto;
 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.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.*;
+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.enums.RoleEnum;
 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 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.lang3.StringUtils;
 import org.redisson.api.RBucket;
@@ -46,20 +48,25 @@ import org.redisson.api.RedissonClient;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
 import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.beans.factory.annotation.Value;
 import org.springframework.stereotype.Service;
 import org.springframework.transaction.annotation.Transactional;
 
 import javax.annotation.Resource;
+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.Collections;
-import java.util.Date;
-import java.util.List;
-import java.util.Objects;
-import java.util.Optional;
-import java.util.Set;
-import java.util.UUID;
-import java.util.stream.Collectors;
+import java.util.*;
 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;
 
 /**
  * 即时通讯群组(ImGroup)表服务实现类
@@ -106,6 +113,16 @@ public class ImGroupServiceImpl extends ServiceImpl<ImGroupDao, ImGroup> impleme
     @Autowired
     private ImConfigProperties imConfig;
 
+
+    @Value("${cn.rongcloud.im.appkey}")
+    private String appKey;
+    @Value("${cn.rongcloud.im.secret}")
+    private String appSecret;
+
+
+    @Autowired
+    private SysConfigService sysConfigService;
+
     @Override
     public ImGroupDao getDao() {
         return this.baseMapper;
@@ -121,7 +138,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 +146,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 +166,36 @@ 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;
+    }
+
+    @Override
+    public String getImUserId(Long userId, RoleEnum userRole) {
+        String imUserId = String.valueOf(userId);
+        String clientType = "STUDENT";
+        if(userRole.RoleTeacher == userRole){
+            clientType = "TEACHER";
+        }
+        if (StringUtils.isNotBlank(imConfig.getAppPrefix()) && !imUserId.startsWith(imConfig.getAppPrefix())) {
+            imUserId = MessageFormat.format("{0}:{1}:{2}", imConfig.getAppPrefix(), userId, clientType);
+        }
+        return imUserId;
+    }
+
+    @Override
+    public String getImUserId(Long userId, ClientEnum clientEnum) {
+        String imUserId = String.valueOf(userId);
+        String clientType = "STUDENT";
+        if(clientEnum.TEACHER == clientEnum){
+            clientType = "TEACHER";
+        }
+        if (StringUtils.isNotBlank(imConfig.getAppPrefix()) && !imUserId.startsWith(imConfig.getAppPrefix())) {
+            imUserId = MessageFormat.format("{0}:{1}:{2}", imConfig.getAppPrefix(), userId, clientType);
         }
         return imUserId;
     }
@@ -185,11 +228,12 @@ 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());
+        this.rtcCreate(imGroup.getCreateBy(), imGroupId, imGroup.getName());
         //加入融云群
-        imGroupMemberService.join(groupMembers,imGroupId);
+        imGroupMemberService.join(groupMembers, imGroupId);
     }
 
     @Override
@@ -225,9 +269,11 @@ 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));
+        groupMembers.addAll(imGroupMemberService.initGroupMembers(imGroupId, studentIds,
+                ImGroupMemberRoleType.STUDENT));
         //创建融云群
         this.rtcCreate(courseGroup.getTeacherId(), imGroupId, imGroup.getName());
         //加入融云群
@@ -235,46 +281,130 @@ 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("创建群聊失败,请联系管理员");
+    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 {
+        //创建群
+        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();
+        groupMembers.add(groupMember);
+
+        // 自动激活学生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)).
                 map(ImGroup::getCreateBy).
                 orElseThrow(() -> new BizException("操作失败:群组不存在"));
-        if(!sysUserService.getUserId().equals(createBy)){
+        if (!sysUserService.getUserId().equals(createBy)) {
             throw new BizException("操作失败:您没有操作权限");
         }
         //删除入群申请
         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
@@ -291,7 +421,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();
     }
@@ -315,20 +445,19 @@ 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("操作失败:用户不在此群组");
         }
         //修改群成员数
         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
@@ -342,10 +471,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;
             }
@@ -359,8 +488,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());
 
 
@@ -377,9 +506,11 @@ 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));
+                groupMembers.addAll(imGroupMemberService.initGroupMembers(imGroupId, studentIdList,
+                        ImGroupMemberRoleType.STUDENT));
             }
             //创建融云群
             this.rtcCreate(sysUser.getId(), imGroupId, imGroup.getName());
@@ -420,7 +551,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);
@@ -429,7 +561,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 +570,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天
@@ -457,5 +585,266 @@ public class ImGroupServiceImpl extends ServiceImpl<ImGroupDao, ImGroup> impleme
 
         return group;
     }
+
+    /**
+     * 同步即时通讯聊天记录
+     *
+     * @param date
+     * @return
+     */
+    @Override
+    public Result historyGet(String date) throws Exception {
+        return getHistory().get(date);
+
+    }
+
+    @Override
+    public void saveImHistoryMessage(File file) {
+        ZipInputStream zin = null;
+        try {
+            zin = new ZipInputStream(new FileInputStream(file), StandardCharsets.UTF_8);
+            ZipFile zf = new ZipFile(file);
+            ZipEntry ze;
+            Set<ImHistoryMessage> historyMessages = new HashSet<>();
+            while ((ze = zin.getNextEntry()) != null) {
+                BufferedReader br = new BufferedReader(new InputStreamReader(zf.getInputStream(ze)));
+                String line;
+                while ((line = br.readLine()) != null) {
+                    try {
+                        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) {
+                        e.printStackTrace();
+                    }
+                }
+                br.close();
+                break;
+            }
+            if (historyMessages.size() > 0) {
+                ImGroupDao dao = getDao();
+                dao.batchInsert(historyMessages.stream().sorted(Comparator.comparing(ImHistoryMessage::getDateTime)).collect(Collectors.toList()));
+            }
+        } catch (IOException e) {
+            e.printStackTrace();
+        } finally {
+            if (zin != null) {
+                try {
+                    zin.closeEntry();
+                } catch (IOException e) {
+                    e.printStackTrace();
+                }
+            }
+        }
+    }
+
+    @Override
+    public List<ImHistoryMessage> getRongYunInfo() {
+        List<ImHistoryMessage> list = getDao().selectAll();
+        return list;
+    }
+
+    /**
+     * IM导入消息
+     */
+    @Override
+    public void importInfo(List<ImHistoryMessage> info) throws Exception {
+        URL url = new URL("https://console.tim.qq.com/v4/im_open_login_svc/account_import");
+        info.stream().forEach(i -> {
+            //判断消息类型
+            Integer type = i.getTargetType();
+            if (type == 1) {
+                //单聊会话
+
+                MessageWrapper.PrivateImportMessage privateImportMessage = new MessageWrapper.PrivateImportMessage();
+                //2:表示历史消息导入,消息不计入未读计数,且消息不会推送到终端
+                privateImportMessage.setSyncFromOldSystem(2);
+                //设置发送人
+                privateImportMessage.setFromAccount(i.getFromUserId());
+                //设置接收人
+                privateImportMessage.setToAccount(i.getTargetId());
+                //设置随机数
+                privateImportMessage.setMsgRandom(new Random().nextInt());
+                //设置body
+
+                List<TencentRequest.MessageBody> list = new ArrayList<>();
+                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")) {
+                    //文本对象
+                    list.stream().forEach(item -> item.setMsgType("TIMTextElem"));
+                } else if (list.stream().map(TencentRequest.MessageBody::getMsgType).collect(Collectors.toList()).get(0).equals("RC:ImgMsg")) {
+                    //图文对象
+                    list.stream().forEach(item -> item.setMsgType("TIMImageElem"));
+                }
+                privateImportMessage.setTencentMessageBody(list);
+                try {
+                    imPluginContext.getPluginService().importPrivateMessage(privateImportMessage);
+                } catch (Exception e) {
+                    e.printStackTrace();
+                }
+
+
+            } else if (type == 3) {
+                //群组会话
+                MessageWrapper.GroupImportMessage groupImportMessage = new MessageWrapper.GroupImportMessage();
+                List<MessageWrapper.GroupImportMessageData> list = new ArrayList<>();
+                MessageWrapper.GroupImportMessageData data1 = new MessageWrapper.GroupImportMessageData();
+                List<TencentRequest.MessageBody> bodyList = new ArrayList<>();
+                //设置群组Id
+                groupImportMessage.setGroupId(i.getGroupId());
+                //设置发送人
+                data1.setFromAccount(i.getFromUserId());
+                //设置随机数
+                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.setMsgType("TIMTextElem"));
+                } else if (bodyList.stream().map(TencentRequest.MessageBody::getMsgType).collect(Collectors.toList()).get(0).equals("RC:ImgMsg")) {
+                    //暂未支持图文对象
+                    bodyList.stream().forEach(item -> item.setMsgType("TIMCustomElem"));
+                }
+
+                data1.setTencentMessageBody(bodyList);
+
+                list.add(data1);
+                //导入消息列表
+                groupImportMessage.setMsgList(list);
+                try {
+                    imPluginContext.getPluginService().importGroupMessage(groupImportMessage);
+                } catch (Exception e) {
+                    e.printStackTrace();
+                }
+
+
+            }
+        });
+
+
+    }
+
+
+    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(imGroup.getCreateTime().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);
+    }
 }
 

+ 7 - 10
cooleshow-user/user-biz/src/main/java/com/yonge/cooleshow/biz/dal/service/impl/ImNetworkRoomMemberServiceImpl.java

@@ -1,22 +1,20 @@
 package com.yonge.cooleshow.biz.dal.service.impl;
 
 import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
-import com.yonge.cooleshow.auth.api.entity.SysUser;
 import com.yonge.cooleshow.biz.dal.dao.ImNetworkRoomMemberDao;
 import com.yonge.cooleshow.biz.dal.dto.BasicUserInfo;
 import com.yonge.cooleshow.biz.dal.entity.ImNetworkRoomMember;
 import com.yonge.cooleshow.biz.dal.enums.ClientEnum;
 import com.yonge.cooleshow.biz.dal.enums.RoleEnum;
 import com.yonge.cooleshow.biz.dal.enums.UserRoleEnum;
+import com.yonge.cooleshow.biz.dal.service.ImGroupService;
 import com.yonge.cooleshow.biz.dal.service.ImNetworkRoomMemberService;
-import org.springframework.stereotype.Service;
-
 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;
 
-import java.text.MessageFormat;
-import java.util.Date;
 import java.util.Objects;
 
 /**
@@ -30,6 +28,9 @@ public class ImNetworkRoomMemberServiceImpl extends ServiceImpl<ImNetworkRoomMem
 
     private final static Logger log = LoggerFactory.getLogger(ImNetworkRoomMemberServiceImpl.class);
 
+    @Autowired
+    private ImGroupService imGroupService;
+
     @Override
     public ImNetworkRoomMemberDao getDao() {
         return this.baseMapper;
@@ -56,11 +57,7 @@ public class ImNetworkRoomMemberServiceImpl extends ServiceImpl<ImNetworkRoomMem
 
         }
 
-        String imUserId = String.valueOf(sysUser.getUserId());
-        if (RoleEnum.RoleStudent == userRole) {
-            imUserId = MessageFormat.format("{0}:{1}", imUserId, ClientEnum.STUDENT.name());
-        }
-        roomMember.setImUserId(imUserId);
+        roomMember.setImUserId(imGroupService.getImUserId(sysUser.getUserId(),userRole));
 
         return roomMember;
     }

+ 14 - 18
cooleshow-user/user-biz/src/main/java/com/yonge/cooleshow/biz/dal/service/impl/ImNetworkRoomServiceImpl.java

@@ -82,6 +82,9 @@ public class ImNetworkRoomServiceImpl extends ServiceImpl<ImNetworkRoomDao, ImNe
     @Resource
     private RedisTemplate<String,Object> redisTemplate;
 
+    @Autowired
+    private ImGroupService imGroupService;
+
     private String QUIT_ROOM_SUCCESS = "quitRoomSuccess:";
 
     @Override
@@ -128,10 +131,10 @@ public class ImNetworkRoomServiceImpl extends ServiceImpl<ImNetworkRoomDao, ImNe
         for (ImNetworkRoomMember item : roomMemberList) {
             if (EStatus.ENABLE.match(item.getRole())) {
                 // 老师
-                item.setImUserId(String.valueOf(item.getUserId()));
+                item.setImUserId(imGroupService.getImUserId(String.valueOf(item.getUserId()),ClientEnum.TEACHER.name()));
             } else {
                 // 学生
-                item.setImUserId(MessageFormat.format("{0}:{1}", String.valueOf(item.getUserId()), ClientEnum.STUDENT.name()));
+                item.setImUserId(imGroupService.getImUserId(String.valueOf(item.getUserId()),ClientEnum.STUDENT.name()));
             }
         }
         joinRoomResult.setRoomMemberList(roomMemberList);
@@ -148,7 +151,7 @@ public class ImNetworkRoomServiceImpl extends ServiceImpl<ImNetworkRoomDao, ImNe
         joinRoomResult.setAutoCloseNetworkRoomTime(sysConfigDao.findConfigValue(SysConfigConstant.DESTROY_EXPIRED_PRACTICE_ROOM_MINUTE));
 
         // IM用户ID
-        String imUserId = this.getImUserId(userId,userRole);
+        String imUserId = imGroupService.getImUserId(sysUser.getUserId(),userRole);
         roomMember.setImUserId(imUserId);
         // 创建IM群聊
         this.joinImGroup(roomId, courseSchedule.getTeacherId().intValue(), courseSchedule);
@@ -384,6 +387,7 @@ public class ImNetworkRoomServiceImpl extends ServiceImpl<ImNetworkRoomDao, ImNe
         imNetworkRoomMemberService.getDao().deleteById(roomMember.getId());
     }
 
+
     private String getImUserId(Long userId,ClientEnum clientEnum){
         String imUserId = String.valueOf(userId);
         if (ClientEnum.STUDENT == clientEnum) {
@@ -410,8 +414,7 @@ public class ImNetworkRoomServiceImpl extends ServiceImpl<ImNetworkRoomDao, ImNe
         log.info("sendImPlayMidiMessage: roomId={}, userId={}", roomId, userId);
         ImNetworkMetronomeMessage displayMessage = new ImNetworkMetronomeMessage(customMessage);
 
-        String imUserId = this.getImUserId(userId,customMessage.getClientType());
-
+        String imUserId = imGroupService.getImUserId(userId,customMessage.getClientType());
         ImNetworkRoomMember roomMember = imNetworkRoomMemberService.lambdaQuery().eq(ImNetworkRoomMember::getUserId, userId)
                 .eq(ImNetworkRoomMember::getRoomId, roomId).last("LIMIT 1").one();
         // 获取RTC服务提供方
@@ -484,8 +487,7 @@ public class ImNetworkRoomServiceImpl extends ServiceImpl<ImNetworkRoomDao, ImNe
             courseScheduleStudentMusicSheetService.getDao().batchInsert(scheduleStudentMusicSheetResults);
         }
         // IM用户ID
-        String imUserId = this.getImUserId(user.getId(),musicSheetDto.getClientType());
-
+        String imUserId = imGroupService.getImUserId(user.getId(),musicSheetDto.getClientType());
         ImNetworkMusicSheetDownloadMessageContent content = JSON.parseObject(JSON.toJSONString(accompaniment), ImNetworkMusicSheetDownloadMessageContent.class);
         // 发送消息
         CourseSchedule courseSchedule = courseScheduleService.getById(courseScheduleId);
@@ -557,7 +559,7 @@ public class ImNetworkRoomServiceImpl extends ServiceImpl<ImNetworkRoomDao, ImNe
         ImNetworkRoom room = baseMapper.findByRoomId(displayData.getRoomId());
         room.setDisplay(display.toString());
 
-        String imUserId = this.getImUserId(userId,displayData.getClientType());
+        String imUserId = imGroupService.getImUserId(userId,displayData.getClientType());
 
         this.updateDisplay(imUserId,room);
     }
@@ -772,13 +774,11 @@ public class ImNetworkRoomServiceImpl extends ServiceImpl<ImNetworkRoomDao, ImNe
         log.info("approveControlDevice: roomId:{} ,deviceType:{} ,enable:{}", deviceControl.getRoomId(),deviceControl.getDeviceType(),deviceControl.getEnable());
         SysUser sysUser = sysUserService.getUser();
 
-        String imUserId = String.valueOf(sysUser.getId());
         UserRoleEnum userRole = UserRoleEnum.TEACHER;
         if (ClientEnum.STUDENT == deviceControl.getClientType()) {
-            imUserId = MessageFormat.format("{0}:{1}", imUserId, ClientEnum.STUDENT.name());
-
             userRole = UserRoleEnum.STUDENT;
         }
+        String imUserId = imGroupService.getImUserId(sysUser.getId(),deviceControl.getClientType());
 
         ImNetworkRoomMember roomMember = Optional.ofNullable(imNetworkRoomMemberService.getDao().findByRidAndUid(deviceControl.getRoomId(), sysUser.getId(),
                         userRole.ordinal())).
@@ -864,12 +864,10 @@ public class ImNetworkRoomServiceImpl extends ServiceImpl<ImNetworkRoomDao, ImNe
         Long userId = user.getId();
 
         UserRoleEnum userRole = UserRoleEnum.TEACHER;
-        String imUserId = String.valueOf(userId);
         if (ClientEnum.STUDENT == deviceStatusSync.getClientType()) {
-            imUserId = MessageFormat.format("{0}:{1}", imUserId, ClientEnum.STUDENT.name());
-
             userRole = UserRoleEnum.STUDENT;
         }
+        String imUserId = imGroupService.getImUserId(userId,deviceStatusSync.getClientType());
 
         ImNetworkDeviceTypeEnum deviceType = deviceStatusSync.getDeviceType();
         ImNetworkRoomMember roomMember = Optional.ofNullable(imNetworkRoomMemberService.getDao().
@@ -936,9 +934,7 @@ public class ImNetworkRoomServiceImpl extends ServiceImpl<ImNetworkRoomDao, ImNe
         List<BasicUserInfo> userInfos = courseScheduleStudentPaymentService.getDao().queryNoJoinStu(roomId);
 
         for (BasicUserInfo item : userInfos) {
-
-            item.setImUserId(MessageFormat.format("{0}:{1}", String.valueOf(item.getUserId()),
-                    ClientEnum.STUDENT.name()));
+            item.setImUserId(imGroupService.getImUserId(String.valueOf(item.getUserId()),ClientEnum.STUDENT.name()));
         }
 
         return userInfos;
@@ -1019,7 +1015,7 @@ public class ImNetworkRoomServiceImpl extends ServiceImpl<ImNetworkRoomDao, ImNe
         ImNetworkMusicSheetDownloadStatusMessage statusMessage = new ImNetworkMusicSheetDownloadStatusMessage(status,studentMusicSheetResults);
 
         // IM用户ID
-        String imUserId = this.getImUserId(userId,musicSheetDto.getClientType());
+        String imUserId = imGroupService.getImUserId(userId,musicSheetDto.getClientType());
 
         imHelper.publishMessage(imUserId, courseSchedule.getTeacherId().toString(), roomId.toString(), statusMessage);
     }

+ 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) {

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

@@ -17,6 +17,7 @@ import com.yonge.cooleshow.biz.dal.entity.Subject;
 import com.yonge.cooleshow.biz.dal.entity.UserBindingTeacher;
 import com.yonge.cooleshow.biz.dal.enums.ClientEnum;
 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.service.StudentService;
 import com.yonge.cooleshow.biz.dal.service.StudentTotalService;
@@ -70,6 +71,9 @@ public class StudentServiceImpl extends ServiceImpl<StudentDao, Student> impleme
     @Autowired
     private SubjectDao subjectDao;
 
+    @Autowired
+    private ImGroupService imGroupService;
+
     @Override
     public StudentVo detail(Long userId) {
         return baseMapper.detail(userId);
@@ -114,7 +118,7 @@ public class StudentServiceImpl extends ServiceImpl<StudentDao, Student> impleme
         studentHomeVo.setMusicSheetNum(null == total.getMusicSheetNum() ? 0 : total.getMusicSheetNum());
 
         // IM聊天用户ID
-        studentHomeVo.setImUserId(MessageFormat.format("{0}:{1}", String.valueOf(detail.getUserId()), ClientEnum.STUDENT.name()));
+        studentHomeVo.setImUserId(imGroupService.getImUserId(String.valueOf(detail.getUserId()), ClientEnum.STUDENT.name()));
 
         return studentHomeVo;
     }

+ 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());

+ 38 - 0
cooleshow-user/user-biz/src/main/resources/config/mybatis/ImGroupMapper.xml

@@ -18,6 +18,22 @@
     <sql id="Base_Column_List">
         id_, name_, introduce_, member_num_, memo_, img_, type_,create_by_, create_time_, update_time_
     </sql>
+    <insert id="batchInsert" parameterType="com.yonge.cooleshow.biz.dal.entity.ImHistoryMessage">
+        insert into im_history_message(msgUID_,fromUserId_,targetId_,targetType_,
+                                       GroupId_,busChannel_,classname_,content_,
+                                       extraContent_,dateTime_,source_,isDiscard_,
+                                       isSensitiveWord_,isForbidden_,isNotForward_,
+                                       groupUserIds_,appId_)
+        values
+               <foreach collection="list" separator="," item="item" open="(" close=")">
+                #{item.msgUID,jdbcType=VARCHAR},#{item.fromUserId,jdbcType=VARCHAR},#{item.targetId,jdbcType=VARCHAR},
+                   #{item.targetType},#{item.groupId,jdbcType=VARCHAR},#{item.busChannel,jdbcType=VARCHAR},
+                   #{item.classname,jdbcType=VARCHAR},#{item.content,jdbcType=VARCHAR},#{item.extraContent,jdbcType=VARCHAR},
+                   #{item.dateTime,jdbcType=VARCHAR},#{item.source,jdbcType=VARCHAR},#{item.isDiscard,jdbcType=VARCHAR},
+                   #{item.isSensitiveWord,jdbcType=VARCHAR},#{item.isForbidden,jdbcType=VARCHAR},#{item.isNotForward,jdbcType=VARCHAR},
+                   #{item.groupUserIds,jdbcType=VARCHAR},#{item.appId,jdbcType=VARCHAR}
+               </foreach>
+    </insert>
 
     <update id="updateById" parameterType="com.yonge.cooleshow.biz.dal.entity.ImGroup">
         update im_group
@@ -92,4 +108,26 @@
         </if>
         GROUP BY ig.id_
     </select>
+    <select id="selectAll" resultType="com.yonge.cooleshow.biz.dal.entity.ImHistoryMessage">
+        select msgUID_          AS msgUID,
+               fromUserId_      AS fromUserId,
+               targetId_        AS targetId,
+               targetType_      AS targetType,
+               GroupId_         AS groupId,
+               busChannel_      AS busChannel,
+               classname_       AS classname,
+               content_         AS content,
+               extraContent_    AS extraContent,
+               dateTime_        AS dateTime,
+               source_          AS source,
+               isDiscard_       AS isDiscard,
+               isSensitiveWord_ AS isSensitiveWord,
+               isForbidden_     AS isForbidden,
+               isNotForward_    AS isNotForward,
+               groupUserIds_    AS groupUserIds,
+               appId_           AS appId
+
+        from im_history_message
+
+    </select>
 </mapper>

+ 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">

+ 7 - 1
cooleshow-user/user-classroom/src/main/java/com/yonge/cooleshow/classroom/controller/ImNetworkRoomController.java

@@ -4,6 +4,7 @@ package com.yonge.cooleshow.classroom.controller;
 import com.alibaba.fastjson.JSONObject;
 import com.yonge.cooleshow.biz.dal.dto.*;
 import com.yonge.cooleshow.biz.dal.enums.ClientEnum;
+import com.yonge.cooleshow.biz.dal.service.ImGroupService;
 import com.yonge.cooleshow.biz.dal.service.ImNetworkRoomService;
 import com.yonge.cooleshow.biz.dal.service.SysUserService;
 import com.yonge.cooleshow.common.controller.BaseController;
@@ -13,6 +14,7 @@ import io.swagger.annotations.Api;
 import io.swagger.annotations.ApiOperation;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
+import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.web.bind.annotation.PostMapping;
 import org.springframework.web.bind.annotation.RequestBody;
 import org.springframework.web.bind.annotation.RequestMapping;
@@ -42,6 +44,8 @@ public class ImNetworkRoomController extends BaseController {
     private ImNetworkRoomService imNetworkRoomService;
     @Resource
     private SysUserService sysUserService;
+    @Autowired
+    private ImGroupService imGroupService;
 
     @ApiOperation("加入网络教室")
     @PostMapping(value = "/join")
@@ -112,7 +116,9 @@ public class ImNetworkRoomController extends BaseController {
         // IM用户ID
         String imUserId = String.valueOf(userId);
         if (ClientEnum.STUDENT == imNetworkBaseDto.getClientType()) {
-            imUserId = MessageFormat.format("{0}:{1}", imUserId, ClientEnum.STUDENT.name());
+            imUserId = imGroupService.getImUserId(imUserId, ClientEnum.STUDENT.name());
+        }else {
+            imUserId = imGroupService.getImUserId(imUserId, ClientEnum.TEACHER.name());
         }
 
         imNetworkRoomService.quitRoomSuccess(Optional.ofNullable(imNetworkBaseDto)

+ 6 - 2
cooleshow-user/user-student/src/main/java/com/yonge/cooleshow/student/controller/CourseHomeworkController.java

@@ -5,9 +5,11 @@ import com.yonge.cooleshow.auth.api.client.SysUserFeignService;
 import com.yonge.cooleshow.auth.api.entity.SysUser;
 import com.yonge.cooleshow.biz.dal.dto.CourseHomeworkSubmitDto;
 import com.yonge.cooleshow.biz.dal.dto.search.HomeworkSearch;
+import com.yonge.cooleshow.biz.dal.enums.ClientEnum;
 import com.yonge.cooleshow.biz.dal.enums.CourseScheduleEnum;
 import com.yonge.cooleshow.biz.dal.service.CourseHomeworkService;
 import com.yonge.cooleshow.biz.dal.service.CourseScheduleService;
+import com.yonge.cooleshow.biz.dal.service.ImGroupService;
 import com.yonge.cooleshow.common.enums.YesOrNoEnum;
 import com.yonge.toolset.mybatis.support.PageUtil;
 import com.yonge.cooleshow.biz.dal.vo.CourseHomeworkDetailVo;
@@ -46,6 +48,9 @@ public class CourseHomeworkController extends BaseController {
     @Autowired
     private CourseHomeworkService courseHomeworkService;
 
+    @Autowired
+    private ImGroupService imGroupService;
+
 
     @ApiOperation(value = "首页-我的课程-课程详情(陪练课)-课后作业信息详情",notes = "传入课程编号ID")
     @GetMapping(value = "/detail/{courseId}")
@@ -98,8 +103,7 @@ public class CourseHomeworkController extends BaseController {
         if (CollectionUtils.isNotEmpty(page.getRecords())) {
 
             for (CourseHomeworkVo item : page.getRecords()) {
-
-                item.setImUserId(String.valueOf(item.getTeacherId()));
+                item.setImUserId(imGroupService.getImUserId(String.valueOf(item.getTeacherId()),ClientEnum.TEACHER.name()));
             }
         }
 

+ 15 - 21
cooleshow-user/user-student/src/main/java/com/yonge/cooleshow/student/controller/TeacherController.java

@@ -1,22 +1,5 @@
 package com.yonge.cooleshow.student.controller;
 
-import io.swagger.annotations.Api;
-import io.swagger.annotations.ApiOperation;
-import io.swagger.annotations.ApiParam;
-
-import java.util.List;
-import java.util.stream.Collectors;
-
-import org.springframework.beans.factory.annotation.Autowired;
-import org.springframework.http.HttpStatus;
-import org.springframework.util.CollectionUtils;
-import org.springframework.web.bind.annotation.GetMapping;
-import org.springframework.web.bind.annotation.PostMapping;
-import org.springframework.web.bind.annotation.RequestBody;
-import org.springframework.web.bind.annotation.RequestMapping;
-import org.springframework.web.bind.annotation.RequestParam;
-import org.springframework.web.bind.annotation.RestController;
-
 import com.baomidou.mybatisplus.core.metadata.IPage;
 import com.yonge.cooleshow.auth.api.client.SysUserFeignService;
 import com.yonge.cooleshow.auth.api.entity.SysUser;
@@ -24,7 +7,6 @@ import com.yonge.cooleshow.biz.dal.dto.search.TeacherStyleSearch;
 import com.yonge.cooleshow.biz.dal.entity.TeacherStyleVideo;
 import com.yonge.cooleshow.biz.dal.enums.AuthStatusEnum;
 import com.yonge.cooleshow.biz.dal.service.AppVersionInfoService;
-import com.yonge.cooleshow.biz.dal.service.StudentService;
 import com.yonge.cooleshow.biz.dal.service.StudentStarService;
 import com.yonge.cooleshow.biz.dal.service.TeacherService;
 import com.yonge.cooleshow.biz.dal.service.TeacherStyleVideoService;
@@ -36,6 +18,21 @@ import com.yonge.cooleshow.common.entity.HttpResponseResult;
 import com.yonge.cooleshow.common.enums.YesOrNoEnum;
 import com.yonge.toolset.base.page.PageInfo;
 import com.yonge.toolset.mybatis.support.PageUtil;
+import io.swagger.annotations.Api;
+import io.swagger.annotations.ApiOperation;
+import io.swagger.annotations.ApiParam;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.http.HttpStatus;
+import org.springframework.util.CollectionUtils;
+import org.springframework.web.bind.annotation.GetMapping;
+import org.springframework.web.bind.annotation.PostMapping;
+import org.springframework.web.bind.annotation.RequestBody;
+import org.springframework.web.bind.annotation.RequestMapping;
+import org.springframework.web.bind.annotation.RequestParam;
+import org.springframework.web.bind.annotation.RestController;
+
+import java.util.List;
+import java.util.stream.Collectors;
 
 @RestController
 @RequestMapping("/teacher")
@@ -51,9 +48,6 @@ public class TeacherController extends BaseController {
     private StudentStarService studentStarService;
     @Autowired
     private AppVersionInfoService appVersionInfoService;
-    
-    @Autowired
-    private StudentService studentService;
 
     @ApiOperation(value = "老师风采-分页")
     @PostMapping("/stylePage")

+ 13 - 6
cooleshow-user/user-teacher/src/main/java/com/yonge/cooleshow/teacher/controller/CourseHomeworkController.java

@@ -11,24 +11,29 @@ import com.yonge.cooleshow.biz.dal.enums.ClientEnum;
 import com.yonge.cooleshow.biz.dal.enums.CourseScheduleEnum;
 import com.yonge.cooleshow.biz.dal.service.CourseHomeworkService;
 import com.yonge.cooleshow.biz.dal.service.CourseScheduleService;
-import com.yonge.cooleshow.common.enums.YesOrNoEnum;
-import com.yonge.toolset.mybatis.support.PageUtil;
+import com.yonge.cooleshow.biz.dal.service.ImGroupService;
 import com.yonge.cooleshow.biz.dal.vo.CountVo;
 import com.yonge.cooleshow.biz.dal.vo.CourseHomeworkDetailVo;
 import com.yonge.cooleshow.biz.dal.vo.CourseHomeworkVo;
 import com.yonge.cooleshow.biz.dal.vo.CourseScheduleHomeworkVo;
 import com.yonge.cooleshow.common.controller.BaseController;
 import com.yonge.cooleshow.common.entity.HttpResponseResult;
+import com.yonge.cooleshow.common.enums.YesOrNoEnum;
 import com.yonge.toolset.base.page.PageInfo;
+import com.yonge.toolset.mybatis.support.PageUtil;
 import io.swagger.annotations.Api;
 import io.swagger.annotations.ApiOperation;
 import io.swagger.annotations.ApiParam;
 import org.apache.commons.collections.CollectionUtils;
 import org.springframework.beans.factory.annotation.Autowired;
-import org.springframework.web.bind.annotation.*;
+import org.springframework.web.bind.annotation.GetMapping;
+import org.springframework.web.bind.annotation.PathVariable;
+import org.springframework.web.bind.annotation.PostMapping;
+import org.springframework.web.bind.annotation.RequestBody;
+import org.springframework.web.bind.annotation.RequestMapping;
+import org.springframework.web.bind.annotation.RestController;
 
 import javax.validation.Valid;
-import java.text.MessageFormat;
 import java.util.ArrayList;
 import java.util.List;
 
@@ -52,6 +57,9 @@ public class CourseHomeworkController extends BaseController {
     @Autowired
     private CourseHomeworkService courseHomeworkService;
 
+    @Autowired
+    private ImGroupService imGroupService;
+
     @ApiOperation(value = "未布置的课后作业数量")
     @GetMapping(value="/count")
     public HttpResponseResult<CountVo> countTeacherNoDecorateHomework() {
@@ -145,8 +153,7 @@ public class CourseHomeworkController extends BaseController {
         if (CollectionUtils.isNotEmpty(page.getRecords())) {
 
             for (CourseHomeworkVo item : page.getRecords()) {
-
-                item.setImUserId(MessageFormat.format("{0}:{1}", String.valueOf(item.getStudentId()), ClientEnum.STUDENT.name()));
+                item.setImUserId(imGroupService.getImUserId(String.valueOf(item.getStudentId()),ClientEnum.STUDENT.name()));
             }
         }