Eric 1 рік тому
батько
коміт
ceb10b8c65
100 змінених файлів з 4154 додано та 2284 видалено
  1. 1 0
      .gitignore
  2. 12 6
      cooleshow-api/src/main/java/com/yonge/cooleshow/api/feign/AdminFeignService.java
  3. 16 0
      cooleshow-api/src/main/java/com/yonge/cooleshow/api/feign/dto/ImUserInfo.java
  4. 14 6
      cooleshow-api/src/main/java/com/yonge/cooleshow/api/feign/fallback/AdminFeignServiceFallback.java
  5. 35 34
      cooleshow-auth/auth-server/src/main/java/com/yonge/cooleshow/auth/core/handler/BaseAuthenticationSuccessEventHandler.java
  6. 1 7
      cooleshow-auth/auth-server/src/main/java/com/yonge/cooleshow/auth/service/impl/SysUserServiceImpl.java
  7. 9 6
      cooleshow-auth/auth-server/src/main/java/com/yonge/cooleshow/auth/web/controller/TokenController.java
  8. 11 0
      cooleshow-common/src/main/java/com/yonge/cooleshow/common/constant/SysConfigConstant.java
  9. 59 0
      cooleshow-common/src/main/java/com/yonge/cooleshow/common/entity/BaseResponse.java
  10. 88 0
      cooleshow-common/src/main/java/com/yonge/cooleshow/common/enums/EGroupDefinedDataType.java
  11. 61 0
      cooleshow-common/src/main/java/com/yonge/cooleshow/common/enums/ErrorEnum.java
  12. 32 0
      cooleshow-common/src/main/java/com/yonge/cooleshow/common/enums/live/ELiveViewMode.java
  13. 40 0
      cooleshow-common/src/main/java/com/yonge/cooleshow/common/enums/live/EUseScene.java
  14. 23 0
      cooleshow-task/src/main/java/com/yonge/cooleshow/task/jobs/DestroyLiveRoomTask.java
  15. 48 3
      cooleshow-user/user-admin/src/main/java/com/yonge/cooleshow/admin/controller/ImGroupController.java
  16. 331 0
      cooleshow-user/user-admin/src/main/java/com/yonge/cooleshow/admin/controller/open/ImController.java
  17. 0 96
      cooleshow-user/user-admin/src/main/java/com/yonge/cooleshow/admin/controller/open/ImUserFriendController.java
  18. 17 0
      cooleshow-user/user-admin/src/main/java/com/yonge/cooleshow/admin/task/TaskController.java
  19. 22 0
      cooleshow-user/user-biz/pom.xml
  20. 24 24
      cooleshow-user/user-biz/src/main/java/com/yonge/cooleshow/biz/dal/config/RongCloudConfig.java
  21. 4 0
      cooleshow-user/user-biz/src/main/java/com/yonge/cooleshow/biz/dal/constant/LiveRoomConstant.java
  22. 2 11
      cooleshow-user/user-biz/src/main/java/com/yonge/cooleshow/biz/dal/dao/CourseScheduleStudentPaymentDao.java
  23. 11 0
      cooleshow-user/user-biz/src/main/java/com/yonge/cooleshow/biz/dal/dao/ImGroupDao.java
  24. 2 1
      cooleshow-user/user-biz/src/main/java/com/yonge/cooleshow/biz/dal/dao/ImGroupMemberDao.java
  25. 2 0
      cooleshow-user/user-biz/src/main/java/com/yonge/cooleshow/biz/dal/dao/ImGroupNoticeDao.java
  26. 2 11
      cooleshow-user/user-biz/src/main/java/com/yonge/cooleshow/biz/dal/dao/ImNetworkRoomMemberDao.java
  27. 2 1
      cooleshow-user/user-biz/src/main/java/com/yonge/cooleshow/biz/dal/dao/LiveBroadcastRoomMemberDao.java
  28. 2 40
      cooleshow-user/user-biz/src/main/java/com/yonge/cooleshow/biz/dal/dto/BasicUserInfo.java
  29. 14 0
      cooleshow-user/user-biz/src/main/java/com/yonge/cooleshow/biz/dal/dto/BasicUserInfoDto.java
  30. 4 34
      cooleshow-user/user-biz/src/main/java/com/yonge/cooleshow/biz/dal/dto/CourseScheduleStudentMusicSheetResult.java
  31. 30 0
      cooleshow-user/user-biz/src/main/java/com/yonge/cooleshow/biz/dal/dto/ETencentGroupType.java
  32. 31 0
      cooleshow-user/user-biz/src/main/java/com/yonge/cooleshow/biz/dal/dto/ETencentImCallbackCommand.java
  33. 57 0
      cooleshow-user/user-biz/src/main/java/com/yonge/cooleshow/biz/dal/dto/ETencentTRTCCallbackCommand.java
  34. 6 17
      cooleshow-user/user-biz/src/main/java/com/yonge/cooleshow/biz/dal/dto/ImNetworkBaseDto.java
  35. 13 87
      cooleshow-user/user-biz/src/main/java/com/yonge/cooleshow/biz/dal/dto/ImNetworkCustomMessage.java
  36. 8 80
      cooleshow-user/user-biz/src/main/java/com/yonge/cooleshow/biz/dal/dto/ImNetworkDeviceControlDto.java
  37. 4 40
      cooleshow-user/user-biz/src/main/java/com/yonge/cooleshow/biz/dal/dto/ImNetworkDisplayDataDto.java
  38. 15 23
      cooleshow-user/user-biz/src/main/java/com/yonge/cooleshow/biz/dal/dto/ImNetworkMetronomeMessage.java
  39. 17 6
      cooleshow-user/user-biz/src/main/java/com/yonge/cooleshow/biz/dal/dto/ImNetworkMusicSheetDownloadMessage.java
  40. 7 95
      cooleshow-user/user-biz/src/main/java/com/yonge/cooleshow/biz/dal/dto/ImNetworkMusicSheetDownloadMessageContent.java
  41. 4 32
      cooleshow-user/user-biz/src/main/java/com/yonge/cooleshow/biz/dal/dto/ImNetworkMusicSheetDto.java
  42. 60 0
      cooleshow-user/user-biz/src/main/java/com/yonge/cooleshow/biz/dal/dto/ImNetworkRoomMemberResult.java
  43. 2 40
      cooleshow-user/user-biz/src/main/java/com/yonge/cooleshow/biz/dal/dto/ImNetworkRoomMusicSheetDownloadData.java
  44. 19 39
      cooleshow-user/user-biz/src/main/java/com/yonge/cooleshow/biz/dal/dto/ImNetworkRoomResult.java
  45. 44 0
      cooleshow-user/user-biz/src/main/java/com/yonge/cooleshow/biz/dal/dto/LiveRoomStatus.java
  46. 56 0
      cooleshow-user/user-biz/src/main/java/com/yonge/cooleshow/biz/dal/dto/MusicSheetAccompanimentResult.java
  47. 34 0
      cooleshow-user/user-biz/src/main/java/com/yonge/cooleshow/biz/dal/dto/RoomStatusNotify.java
  48. 522 0
      cooleshow-user/user-biz/src/main/java/com/yonge/cooleshow/biz/dal/dto/TencentData.java
  49. 45 0
      cooleshow-user/user-biz/src/main/java/com/yonge/cooleshow/biz/dal/dto/TencentImCallbackResult.java
  50. 3 191
      cooleshow-user/user-biz/src/main/java/com/yonge/cooleshow/biz/dal/entity/CourseGroup.java
  51. 18 216
      cooleshow-user/user-biz/src/main/java/com/yonge/cooleshow/biz/dal/entity/CourseSchedule.java
  52. 6 94
      cooleshow-user/user-biz/src/main/java/com/yonge/cooleshow/biz/dal/entity/CourseScheduleStudentMusicSheet.java
  53. 2 112
      cooleshow-user/user-biz/src/main/java/com/yonge/cooleshow/biz/dal/entity/CourseScheduleStudentPayment.java
  54. 5 0
      cooleshow-user/user-biz/src/main/java/com/yonge/cooleshow/biz/dal/entity/ImHistoryMessage.java
  55. 77 0
      cooleshow-user/user-biz/src/main/java/com/yonge/cooleshow/biz/dal/entity/ImLiveBroadcastRoomMember.java
  56. 8 102
      cooleshow-user/user-biz/src/main/java/com/yonge/cooleshow/biz/dal/entity/ImNetworkHereWhite.java
  57. 2 60
      cooleshow-user/user-biz/src/main/java/com/yonge/cooleshow/biz/dal/entity/ImNetworkRoom.java
  58. 6 123
      cooleshow-user/user-biz/src/main/java/com/yonge/cooleshow/biz/dal/entity/ImNetworkRoomMember.java
  59. 48 0
      cooleshow-user/user-biz/src/main/java/com/yonge/cooleshow/biz/dal/entity/ImNetworkRoomMemberStatus.java
  60. 38 4
      cooleshow-user/user-biz/src/main/java/com/yonge/cooleshow/biz/dal/entity/ImRoomMessage.java
  61. 3 39
      cooleshow-user/user-biz/src/main/java/com/yonge/cooleshow/biz/dal/entity/ImUserStateSync.java
  62. 53 0
      cooleshow-user/user-biz/src/main/java/com/yonge/cooleshow/biz/dal/entity/LiveBroadcastRoomData.java
  63. 58 142
      cooleshow-user/user-biz/src/main/java/com/yonge/cooleshow/biz/dal/entity/LiveRoom.java
  64. 7 23
      cooleshow-user/user-biz/src/main/java/com/yonge/cooleshow/biz/dal/entity/LiveRoomVideo.java
  65. 10 92
      cooleshow-user/user-biz/src/main/java/com/yonge/cooleshow/biz/dal/entity/MusicSheetAccompaniment.java
  66. 7 164
      cooleshow-user/user-biz/src/main/java/com/yonge/cooleshow/biz/dal/entity/RoomInfoCache.java
  67. 4 4
      cooleshow-user/user-biz/src/main/java/com/yonge/cooleshow/biz/dal/enums/ImNetworkDisplayEnum.java
  68. 36 0
      cooleshow-user/user-biz/src/main/java/com/yonge/cooleshow/biz/dal/enums/RoleEnum.java
  69. 15 0
      cooleshow-user/user-biz/src/main/java/com/yonge/cooleshow/biz/dal/enums/UserRoleEnum.java
  70. 30 0
      cooleshow-user/user-biz/src/main/java/com/yonge/cooleshow/biz/dal/enums/im/ETencentGroupType.java
  71. 31 0
      cooleshow-user/user-biz/src/main/java/com/yonge/cooleshow/biz/dal/enums/im/ETencentImCallbackCommand.java
  72. 43 0
      cooleshow-user/user-biz/src/main/java/com/yonge/cooleshow/biz/dal/enums/live/EAnchorStatus.java
  73. 40 0
      cooleshow-user/user-biz/src/main/java/com/yonge/cooleshow/biz/dal/enums/live/EOnOffStatus.java
  74. 78 0
      cooleshow-user/user-biz/src/main/java/com/yonge/cooleshow/biz/dal/mapper/ImLiveBroadcastRoomMemberMapper.java
  75. 27 0
      cooleshow-user/user-biz/src/main/java/com/yonge/cooleshow/biz/dal/mapper/ImNetworkRoomMemberStatusMapper.java
  76. 27 0
      cooleshow-user/user-biz/src/main/java/com/yonge/cooleshow/biz/dal/mapper/LiveBroadcastRoomDataMapper.java
  77. 57 0
      cooleshow-user/user-biz/src/main/java/com/yonge/cooleshow/biz/dal/redisson/RedissonMessageService.java
  78. 8 0
      cooleshow-user/user-biz/src/main/java/com/yonge/cooleshow/biz/dal/service/CourseScheduleService.java
  79. 0 13
      cooleshow-user/user-biz/src/main/java/com/yonge/cooleshow/biz/dal/service/CourseScheduleStudentPaymentService.java
  80. 9 8
      cooleshow-user/user-biz/src/main/java/com/yonge/cooleshow/biz/dal/service/ImGroupMemberService.java
  81. 95 2
      cooleshow-user/user-biz/src/main/java/com/yonge/cooleshow/biz/dal/service/ImGroupService.java
  82. 51 0
      cooleshow-user/user-biz/src/main/java/com/yonge/cooleshow/biz/dal/service/ImLiveBroadcastRoomMemberService.java
  83. 3 4
      cooleshow-user/user-biz/src/main/java/com/yonge/cooleshow/biz/dal/service/ImNetworkRoomMemberService.java
  84. 22 0
      cooleshow-user/user-biz/src/main/java/com/yonge/cooleshow/biz/dal/service/ImNetworkRoomMemberStatusService.java
  85. 6 4
      cooleshow-user/user-biz/src/main/java/com/yonge/cooleshow/biz/dal/service/ImNetworkRoomService.java
  86. 42 0
      cooleshow-user/user-biz/src/main/java/com/yonge/cooleshow/biz/dal/service/ImService.java
  87. 43 0
      cooleshow-user/user-biz/src/main/java/com/yonge/cooleshow/biz/dal/service/LiveBroadcastRoomDataService.java
  88. 101 14
      cooleshow-user/user-biz/src/main/java/com/yonge/cooleshow/biz/dal/service/LiveRoomService.java
  89. 37 0
      cooleshow-user/user-biz/src/main/java/com/yonge/cooleshow/biz/dal/service/RoomService.java
  90. 0 1
      cooleshow-user/user-biz/src/main/java/com/yonge/cooleshow/biz/dal/service/UploadFileService.java
  91. 172 0
      cooleshow-user/user-biz/src/main/java/com/yonge/cooleshow/biz/dal/service/im/ImGroupCoreService.java
  92. 722 0
      cooleshow-user/user-biz/src/main/java/com/yonge/cooleshow/biz/dal/service/im/impl/ImGroupCoreServiceImpl.java
  93. 11 0
      cooleshow-user/user-biz/src/main/java/com/yonge/cooleshow/biz/dal/service/impl/CourseCoursewareServiceImpl.java
  94. 3 3
      cooleshow-user/user-biz/src/main/java/com/yonge/cooleshow/biz/dal/service/impl/CourseGroupServiceImpl.java
  95. 5 5
      cooleshow-user/user-biz/src/main/java/com/yonge/cooleshow/biz/dal/service/impl/CourseHomeworkServiceImpl.java
  96. 52 14
      cooleshow-user/user-biz/src/main/java/com/yonge/cooleshow/biz/dal/service/impl/CourseScheduleServiceImpl.java
  97. 0 17
      cooleshow-user/user-biz/src/main/java/com/yonge/cooleshow/biz/dal/service/impl/CourseScheduleStudentPaymentServiceImpl.java
  98. 109 48
      cooleshow-user/user-biz/src/main/java/com/yonge/cooleshow/biz/dal/service/impl/CustomerServiceBatchSendingServiceImpl.java
  99. 4 3
      cooleshow-user/user-biz/src/main/java/com/yonge/cooleshow/biz/dal/service/impl/ImGroupMemberAuditServiceImpl.java
  100. 57 43
      cooleshow-user/user-biz/src/main/java/com/yonge/cooleshow/biz/dal/service/impl/ImGroupMemberServiceImpl.java

+ 1 - 0
.gitignore

@@ -60,3 +60,4 @@ target
 **/AuditLogInterceptor.java
 /toolset/audit-log/src/main/java/com/yonge/toolset/log/interceptor/AuditLogInterceptor.java
 /log/
+cooleshow-cms/src/main/resources/bootstrap-local.yaml

+ 12 - 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;
@@ -158,6 +153,17 @@ public interface AdminFeignService {
     void rongyunImport();
 
 
+    /**
+     * 销毁直播间
+     */
+    @GetMapping("/task/destroyLiveRoom")
+    HttpResponseResult<Object> destroyLiveRoom();
+
+
     @PostMapping("/open/adminClient/unionStudent")
     HttpResponseResult<StudentWrapper.UnionStudentResp> unionStudent(@RequestBody StudentWrapper.UnionStudent info);
+
+
+    @PostMapping(value = "/open/im/register")
+    ImUserInfo register(@RequestParam("userId") String userId, @RequestParam("clientType") String clientType, @RequestParam("username") String username, @RequestParam("avatar") 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;
+    }
+}

+ 14 - 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;
@@ -134,6 +129,14 @@ public class AdminFeignServiceFallback implements AdminFeignService {
     }
 
     /**
+     * 销毁直播间
+     */
+    @Override
+    public HttpResponseResult<Object> destroyLiveRoom() {
+        return null;
+    }
+
+    /**
      * 融云消息同步
      */
     @Override
@@ -146,4 +149,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;
+    }
 }

+ 35 - 34
cooleshow-auth/auth-server/src/main/java/com/yonge/cooleshow/auth/core/handler/BaseAuthenticationSuccessEventHandler.java

@@ -1,20 +1,16 @@
 package com.yonge.cooleshow.auth.core.handler;
 
-import java.io.IOException;
-import java.util.Base64;
-import java.util.Date;
-import java.util.HashMap;
-import java.util.Map;
-
-import javax.servlet.http.HttpServletRequest;
-import javax.servlet.http.HttpServletResponse;
-
-import com.yonge.cooleshow.auth.config.RongCloudConfig;
-import com.yonge.cooleshow.common.entity.ImResult;
-import com.yonge.cooleshow.common.entity.ImUserModel;
-import com.yonge.toolset.base.exception.BizException;
-import io.rong.models.response.TokenResult;
-import io.rong.models.user.UserModel;
+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.entity.SysUser;
+import com.yonge.cooleshow.auth.api.entity.SysUserLogin;
+import com.yonge.cooleshow.auth.api.entity.SysUserLoginLog;
+import com.yonge.cooleshow.auth.service.SysUserLoginLogService;
+import com.yonge.cooleshow.auth.service.SysUserLoginService;
+import com.yonge.cooleshow.auth.service.SysUserService;
+import com.yonge.cooleshow.common.entity.HttpResponseResult;
+import com.yonge.cooleshow.common.security.SecurityConstants;
 import org.apache.commons.collections.MapUtils;
 import org.apache.commons.lang3.StringUtils;
 import org.slf4j.Logger;
@@ -36,15 +32,13 @@ import org.springframework.security.oauth2.provider.token.AuthorizationServerTok
 import org.springframework.security.web.authentication.SavedRequestAwareAuthenticationSuccessHandler;
 import org.springframework.stereotype.Component;
 
-import com.fasterxml.jackson.databind.ObjectMapper;
-import com.yonge.cooleshow.auth.api.entity.SysUser;
-import com.yonge.cooleshow.auth.api.entity.SysUserLogin;
-import com.yonge.cooleshow.auth.api.entity.SysUserLoginLog;
-import com.yonge.cooleshow.auth.service.SysUserLoginLogService;
-import com.yonge.cooleshow.auth.service.SysUserLoginService;
-import com.yonge.cooleshow.auth.service.SysUserService;
-import com.yonge.cooleshow.common.entity.HttpResponseResult;
-import com.yonge.cooleshow.common.security.SecurityConstants;
+import javax.servlet.http.HttpServletRequest;
+import javax.servlet.http.HttpServletResponse;
+import java.io.IOException;
+import java.util.Base64;
+import java.util.Date;
+import java.util.HashMap;
+import java.util.Map;
 
 @Component
 public class BaseAuthenticationSuccessEventHandler extends SavedRequestAwareAuthenticationSuccessHandler {
@@ -59,6 +53,8 @@ public class BaseAuthenticationSuccessEventHandler extends SavedRequestAwareAuth
 	private ObjectMapper objectMapper;
 	@Autowired
 	private ClientDetailsService clientDetailsService;
+	@Autowired
+	private AdminFeignService adminFeignService;
 
 	@Autowired
 	private AuthorizationServerTokenServices defaultAuthorizationServerTokenServices;
@@ -83,22 +79,27 @@ public class BaseAuthenticationSuccessEventHandler extends SavedRequestAwareAuth
 		}else {
 			sysUser = sysUserService.queryLockByPhone(username.split(":")[1]);
 		}
-		if(StringUtils.isEmpty(sysUser.getImToken())){
+		/*if(StringUtils.isEmpty(sysUser.getImToken())){
 			String name = sysUser.getUsername();
 			if(StringUtils.isEmpty(name)){
 				name = sysUser.getRealName();
 			}
-			try {
-				TokenResult result = RongCloudConfig.rongCloud.user.register(new UserModel(sysUser.getId().toString(), name, sysUser.getAvatar()));
+
+		}*/
+		// 强制更新im_token
+		try {
+				/*TokenResult result = RongCloudConfig.rongCloud.user.register(new UserModel(sysUser.getId().toString(), name, sysUser.getAvatar()));
 				if(!result.code.equals(200)){
 					logger.error("获取用户token失败:{}",result.errorMessage);
-				}
-				sysUser.setImToken(result.getToken());
-				sysUser.setUpdateTime(new Date());
-				sysUserService.update(sysUser);
-			} catch (Exception e) {
-				e.printStackTrace();
-			}
+				}*/
+
+			ImUserInfo register = adminFeignService.register(sysUser.getId().toString(), clientId.toUpperCase(), sysUser.getUsername(), sysUser.getAvatar());
+
+			sysUser.setImToken(register.getImToken());
+			sysUser.setUpdateTime(new Date());
+			sysUserService.update(sysUser);
+		} catch (Exception e) {
+			logger.error("获取用户im_token失败:{}",e.getMessage());
 		}
 		Date date = new Date();
 		//修改添加登录信息

+ 1 - 7
cooleshow-auth/auth-server/src/main/java/com/yonge/cooleshow/auth/service/impl/SysUserServiceImpl.java

@@ -296,13 +296,7 @@ public class SysUserServiceImpl extends BaseServiceImpl<Long, SysUser> implement
         //更新imUserFriend表用户头像
         sysUserDao.updateImUserFriend(userId, setDetail.getUsername(), setDetail.getAvatar());
         try {
-
-            String imUserId = String.valueOf(userId);
-            if (EClientType.STUDENT.match(clientType)) {
-                imUserId = MessageFormat.format("{0}:{1}", imUserId, EClientType.STUDENT.name());
-            }
-
-            RongCloudConfig.rongCloud.user.update(new UserModel(imUserId, setDetail.getUsername(), setDetail.getAvatar()));
+            adminFeignService.register(userId.toString(),clientType, setDetail.getUsername(), setDetail.getAvatar());
         } catch (Exception e) {
             throw new BizException("更新用户信息失败");
         }

+ 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("获取用户信息失败");
     }

+ 11 - 0
cooleshow-common/src/main/java/com/yonge/cooleshow/common/constant/SysConfigConstant.java

@@ -358,4 +358,15 @@ public interface SysConfigConstant {
      * 个人风采虚拟人数增长最大值
      */
     String STYLE_VIDEO_VIRTUAL_NUMBER = "style_video_virtual_number";
+
+    /**
+     * 课程群头像 icon_course_group_default
+     */
+    String ICON_COURSE_GROUP_DEFAULT = "icon_course_group_default";
+
+    /**
+     * 粉丝群头像 icon_fans_group_default
+     */
+    String ICON_FANS_GROUP_DEFAULT = "icon_fans_group_default";
+
 }

+ 59 - 0
cooleshow-common/src/main/java/com/yonge/cooleshow/common/entity/BaseResponse.java

@@ -0,0 +1,59 @@
+package com.yonge.cooleshow.common.entity;
+
+import com.yonge.cooleshow.common.enums.ErrorEnum;
+import lombok.Data;
+import lombok.Getter;
+import lombok.Setter;
+
+import static com.yonge.cooleshow.common.enums.ErrorEnum.ERR_SUCCESS;
+
+@Data
+public class BaseResponse<T> {
+    private @Getter int errCode;
+    private @Setter @Getter String errMsg;
+    private @Setter @Getter String errDetail;
+    private @Getter BaseResponseResult data;
+
+
+    public void setData(T data) {
+        this.data = new BaseResponseResult<T>(data);
+    }
+
+    public static <T> BaseResponse<T> success(T data) {
+        BaseResponse<T> response = success();
+        response.setData(data);
+        return response;
+    }
+
+    public static <T> BaseResponse<T> success() {
+        BaseResponse<T> response = new BaseResponse();
+        response.setErr(ERR_SUCCESS);
+        return response;
+    }
+
+    public static <T> BaseResponse<T> failed(ErrorEnum err,T data) {
+        BaseResponse<T> response = failed(err);
+        response.setData(data);
+        return response;
+    }
+
+    public static <T> BaseResponse<T> failed(ErrorEnum err) {
+        BaseResponse<T> response = new BaseResponse();
+        response.setErr(err);
+        return response;
+    }
+
+    public void setErr(ErrorEnum error) {
+        this.errCode = error.getErrCode();
+        this.errMsg = error.getErrMsg();
+        this.errDetail = error.getErrMsg();
+    }
+
+    class BaseResponseResult<R> {
+        private @Setter @Getter R result;
+
+        BaseResponseResult(R result) {
+            this.result = result;
+        }
+    }
+}

+ 88 - 0
cooleshow-common/src/main/java/com/yonge/cooleshow/common/enums/EGroupDefinedDataType.java

@@ -0,0 +1,88 @@
+package com.yonge.cooleshow.common.enums;
+
+/**
+ * Description
+ *
+ * @author liujunchi
+ * @date 2023-03-20
+ */
+public enum EGroupDefinedDataType {
+
+    /**
+     * 主讲人状态
+     */
+    ANCHOR_STATUS("主讲人状态"), // "ONLINE":"OFFLINE"
+
+    /**
+     * 全局禁言
+     */
+    GLOBAL_BAN("全局禁言"), // 开启禁言"ON" 关闭禁言 "OFF"
+
+    /**
+     * 点赞数
+     */
+    LIKES("点赞数"), // 点赞数
+
+    /**
+     * 在线人数
+     */
+    MEMBER_ONLINE("在线人数"), // 在线人数
+
+
+    /**
+     * 累计观看人数
+     */
+    MEMBER_TOTAL("累计观看人数"), // 累计观看人数
+
+    /**
+     * 当前房间推流状态
+     */
+    LIVE_STATUS("当前房间推流状态"), //开播 "ON" 暂停直播 "OFF"
+
+    /**
+     * 主播摄像头状态
+     */
+    ANCHOR_CAMERA("主播摄像头状态"), // 开启摄像头 "ON" 关闭摄像头 "OFF"
+
+    /**
+     * 主播全员闭麦状态
+     */
+    ANCHOR_MIC("主播全员闭麦状态"), // 开启 "ON" 关闭 "OFF"
+
+    /**
+     * 禁止连麦
+     */
+    BAN_LINK_MIC("禁止连麦"), // 开启 "ON" 关闭 "OFF"
+
+
+
+    /**
+     * 修改字段
+     */
+    UPDATE_INFO("修改信息"), //
+    ;
+    private String code;
+
+    private String msg;
+
+    EGroupDefinedDataType(String msg) {
+        this.msg = msg;
+        this.code = this.name();
+    }
+
+    public String getCode() {
+        return code;
+    }
+
+    public void setCode(String code) {
+        this.code = code;
+    }
+
+    public String getMsg() {
+        return msg;
+    }
+
+    public void setMsg(String msg) {
+        this.msg = msg;
+    }
+}

+ 61 - 0
cooleshow-common/src/main/java/com/yonge/cooleshow/common/enums/ErrorEnum.java

@@ -0,0 +1,61 @@
+package com.yonge.cooleshow.common.enums;
+
+import lombok.Getter;
+
+/**
+ * Created by weiqinxiao on 2019/2/25.
+ */
+public enum ErrorEnum {
+    ERR_SUCCESS(0x0000, "OK"),
+    ERR_OTHER(0x00FF, "Error"),
+    ERR_BIZ_EX(500, "业务异常"),
+
+    ERR_REQUEST_PARA_ERR(1, "Missing or invalid parameter"),
+    ERR_INVALID_AUTH(2, "Invalid or expired authorization"),
+    ERR_ACCESS_DENIED(3, "Access denied"),
+    ERR_BAD_REQUEST(4, "Bad request"),
+
+    //IM error
+    ERR_IM_TOKEN_ERROR(10, "IM token error"),
+    ERR_CREATE_ROOM_ERROR(11, "Create room error"),
+    ERR_JOIN_ROOM_ERROR(12, "Join room error"),
+    JOIN_ROOM_ERROR(35, "加入房间失败,请前往线下教室"),
+    ROOM_NOT_START(36, "网络教室暂未开启,请稍后重试"),
+    CLOUD_BALANCE_NOT_FEE(37, "云教室受限不可进入,请联系教务老师。"),
+    ERR_MESSAGE_ERROR(13, "IM Message send error"),
+
+
+    //room error
+    ERR_ROOM_NOT_EXIST(20, "Room not exist"),
+    ERR_USER_NOT_EXIST_IN_ROOM(21, "User not exist in room"),
+    ERR_EXIT_ROOM_ERROR(22, "Exit room error"),
+    ERR_TEACHER_NOT_EXIST_IN_ROOM(23, "Teacher not exist in room"),
+    ERR_ASSISTANT_NOT_EXIST_IN_ROOM(24, "Assistant not exist in room"),
+    ERR_CREATE_WHITE_BOARD(25, "Create whiteboard error"),
+    ERR_WHITE_BOARD_NOT_EXIST(26, "Whiteboard not exist"),
+    ERR_DELETE_WHITE_BOARD(27, "Delete whiteboard error"),
+    ERR_USER_EXIST_IN_ROOM(28, "User exist in room"),
+    ERR_CHANGE_SELF_ROLE(29, "Can not change self role"),
+    ERR_APPLY_TICKET_INVALID(30, "Apply ticket invalid"),
+    ERR_OVER_MAX_COUNT(31, "云教室人数已超上线"),
+    ERR_TEACHER_EXIST_IN_ROOM(32, "Teacher exist in room"),
+    ERR_DOWNGRADE_ROLE(33, "Can't downgrade role"),
+    ERR_CHANGE_ROLE(34, "Only change student to teacher");
+
+    private @Getter int errCode;
+    private @Getter String errMsg;
+    private ErrorEnum(int errCode, String errMsg) {
+        this.errCode = errCode;
+        this.errMsg = errMsg;
+    }
+
+    public static ErrorEnum getEnumByValue(long errCode) {
+        for(ErrorEnum item : ErrorEnum.values()) {
+            if(item.getErrCode() == errCode) {
+                return item;
+            }
+        }
+
+        throw new IllegalArgumentException();
+    }
+}

+ 32 - 0
cooleshow-common/src/main/java/com/yonge/cooleshow/common/enums/live/ELiveViewMode.java

@@ -0,0 +1,32 @@
+package com.yonge.cooleshow.common.enums.live;
+
+import com.baomidou.mybatisplus.annotation.EnumValue;
+import com.yonge.toolset.base.enums.BaseEnum;
+import lombok.Getter;
+
+/**
+ * 直播观看模式
+ */
+@Getter
+public enum ELiveViewMode implements BaseEnum<String, ELiveViewMode> {
+
+    LOGIN("登陆"),
+    VISITOR("游客"),
+    ;
+
+    private final String describe;
+
+    @EnumValue
+    private final String code;
+
+    ELiveViewMode(String describe) {
+        this.describe = describe;
+
+        this.code = this.name();
+    }
+
+    @Override
+    public String getCode() {
+        return code;
+    }
+}

+ 40 - 0
cooleshow-common/src/main/java/com/yonge/cooleshow/common/enums/live/EUseScene.java

@@ -0,0 +1,40 @@
+package com.yonge.cooleshow.common.enums.live;
+
+import com.baomidou.mybatisplus.annotation.EnumValue;
+import com.yonge.toolset.base.enums.BaseEnum;
+
+public enum EUseScene implements BaseEnum<String, EUseScene> {
+
+    /**
+     * 正常
+     */
+    NORMAL( "正常"),
+
+    /**
+     * 音乐
+     */
+    MUSIC( "音乐"),
+
+    ;
+
+    @EnumValue
+    private String code;
+
+    private String msg;
+
+    EUseScene(String msg) {
+        this.code = this.name();
+        this.msg = msg;
+    }
+
+
+    /**
+     * 获取枚举类的code值
+     *
+     * @return
+     */
+    @Override
+    public String getCode() {
+        return this.code;
+    }
+}

+ 23 - 0
cooleshow-task/src/main/java/com/yonge/cooleshow/task/jobs/DestroyLiveRoomTask.java

@@ -0,0 +1,23 @@
+package com.yonge.cooleshow.task.jobs;
+
+import com.yonge.cooleshow.api.feign.AdminFeignService;
+import com.yonge.cooleshow.api.feign.TeacherFeignService;
+import com.yonge.cooleshow.task.core.BaseTask;
+import com.yonge.cooleshow.task.core.TaskException;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.stereotype.Service;
+
+/**
+ * @Author: liweifan
+ * @Data: 2022/4/25 10:30
+ */
+@Service
+public class DestroyLiveRoomTask extends BaseTask {
+    @Autowired
+    private AdminFeignService adminFeignService;
+
+    @Override
+    public void execute() throws TaskException {
+        adminFeignService.destroyLiveRoom();
+    }
+}

+ 48 - 3
cooleshow-user/user-admin/src/main/java/com/yonge/cooleshow/admin/controller/ImGroupController.java

@@ -4,18 +4,24 @@ package com.yonge.cooleshow.admin.controller;
 import com.alibaba.fastjson.JSONObject;
 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.toolset.utils.date.DateUtil;
+import com.yonge.cooleshow.common.redis.service.RedisCache;
+import com.yonge.toolset.utils.date.DateUtil;
 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.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;
@@ -29,6 +35,7 @@ import java.text.SimpleDateFormat;
 import java.util.Calendar;
 import java.util.Date;
 import java.util.List;
+import org.slf4j.Logger;
 
 /**
  * 即时通讯群组(ImGroup)表控制层
@@ -48,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')")
@@ -70,13 +82,14 @@ public class ImGroupController extends BaseController {
 
     @ApiOperation("退出群聊")
     @PostMapping(value = "/quit/{groupId}")
-    public HttpResponseResult quit(@ApiParam(value = "群编号", required = true) @PathVariable("groupId") String groupId) throws Exception {
-        imGroupService.quit(groupId,sysUserService.getUserId(), ClientEnum.STUDENT);
+    public HttpResponseResult quit(@ApiParam(value = "群编号", required = true) @PathVariable("groupId") String groupId,
+                                   @RequestParam(value = "quit",required = false, defaultValue = "true") boolean quit
+                                   ) throws Exception {
+        imGroupService.quit(groupId,sysUserService.getUserId(), ClientEnum.STUDENT, quit);
         return succeed();
     }
 
 
-
     @GetMapping(value = "/syncImHistoryMessageTask")
     // 融云同步即时通讯聊天记录
     public void syncImHistoryMessageTask(String date) throws Exception {
@@ -108,6 +121,38 @@ public class ImGroupController extends BaseController {
 
     }
 
+    @ApiOperation("IM导入消息")
+    @PostMapping(value = "/ImportIM")
+    public void ImportIM() throws Exception {
+        List<ImHistoryMessage> info;
+        //计算总数据量
+        double count = imGroupService.queryCount();
+        //计算调用次数
+        int num = (int) Math.ceil(count / 100);
+        for (int i = 1; i <=num ; i++) {
+            int page =i;
+            int size =100;
+            //获取融云消息
+            //List<ImGroup> list = imGroupService.lambdaQuery().last("limit "+(page-1)*size+","+size).list();
+            info = imGroupService.getRongYunInfo(page,size);
+            //IM导入
+            imGroupService.importInfo(info);
+        }
+    }
+
+    @GetMapping(value = "/groupTransfer")
+    @ApiOperation("群导入")
+    public void groupTransfer() {
+        imGroupService.groupTransfer();
+    }
+
+    @GetMapping(value = "/importUser")
+    @ApiOperation("导入用户")
+    public void importUser() {
+        imGroupService.importUser();
+    }
+
+
 
 }
 

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

@@ -0,0 +1,331 @@
+package com.yonge.cooleshow.admin.controller.open;
+
+import com.alibaba.fastjson.JSON;
+import com.google.common.collect.Lists;
+import com.microsvc.toolkit.middleware.im.properties.ImConfigProperties;
+import com.microsvc.toolkit.middleware.live.LivePluginContext;
+import com.microsvc.toolkit.middleware.live.LivePluginService;
+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.LiveRoomStatus;
+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;
+import org.apache.commons.collections.CollectionUtils;
+import org.apache.commons.lang3.StringUtils;
+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;
+import org.springframework.web.bind.annotation.RestController;
+
+import javax.annotation.Resource;
+import javax.servlet.http.HttpServletRequest;
+import java.util.Arrays;
+import java.util.List;
+import java.util.Objects;
+
+/**
+ * 用户通讯录表(ImUserFriend)表控制层
+ *
+ * @author zx
+ * @since 2022-03-22 10:45:59
+ */
+@Api(tags = "用户通讯录表")
+@RestController
+@RequestMapping("/open")
+@Slf4j
+public class ImController extends BaseController {
+
+    /**
+     * 服务对象
+     */
+    @Resource
+    private ImUserFriendService imUserFriendService;
+    @Autowired
+    private CourseRelationMusicAlbumService courseRelationMusicAlbumService;
+
+    @Autowired
+    private LivePluginContext livePluginContext;
+
+    @Autowired
+    private LiveRoomService liveRoomService;
+
+    @Autowired
+    private ImGroupService imGroupService;
+
+    @Autowired
+    private ImConfigProperties imConfig;
+
+
+    @ApiOperation("新用户添加客服")
+    @PostMapping(value = "/im/customerService")
+    public HttpResponseResult<Boolean> customerService(@RequestBody UserFriendInfoVO info) {
+
+        if (info.invalidRequestParam()) {
+            return failed("无效的请求参数");
+        }
+
+        // 新用户自动绑定系统客服
+        int ret = imUserFriendService.registerUserBindCustomerService(info.getUserId(),
+                info.getFriendIds(), ClientEnum.valueOf(info.getClientType()));
+
+        return succeed(ret > 0);
+    }
+
+    /**
+     * 发送系统客服消息
+     * @param info IMNotifyMessageVO
+     * @return HttpResponseResult<Boolean>
+     */
+    @PostMapping(value = "/im/message")
+    public HttpResponseResult<Boolean> sendSysCustomerServiceMessage(@RequestBody IMNotifyMessageVO info) {
+
+        if (info.invalidRequestParam()) {
+            return failed("无效的请求参数");
+        }
+
+        // 发送客服通知消息
+        imUserFriendService.sendCustomerServiceNotifyMessage(info.getSender(),
+                CustomerService.NotifyMessage.from(info.jsonString()));
+
+        return succeed();
+    }
+
+    /**
+     * 同步用户购买课程赠送数据
+     * @param query CourseRelationVo.CourseRelationQuery
+     * @return HttpResponseResult<Boolean>
+     */
+    @ApiOperation("已购买课程赠送同步")
+    @PostMapping(value = "/course/sync")
+    public HttpResponseResult<Boolean> syncUserPurchaseRelationMusicAlbum(@RequestBody CourseRelationVo.CourseRelationQuery query) {
+
+        if (Objects.isNull(query.getCourseGroupId()) || Objects.isNull(query.getCourseType())) {
+            return failed("无效的请求参数");
+        }
+
+        // 同步数据
+        courseRelationMusicAlbumService.asyncUpdateCourseRelationMusicAlbumInfo(query.getCourseGroupId(), query.getCourseType());
+
+        return succeed();
+    }
+
+
+    @ApiOperation("腾讯im 回调接口")
+    @PostMapping(value = "/tencentImCallback")
+    public TencentImCallbackResult tencentImCallback(@RequestBody Object obj, HttpServletRequest request) {
+        String body = JSON.toJSONString(obj);
+        log.info("tencentImCallback body:{}", body);
+
+        LivePluginService pluginService = livePluginContext.getPluginService(TencentCloudLivePlugin.PLUGIN_NAME);
+        String appKey = pluginService.getLiveRoomConfig().getAppKey();
+
+        log.info("tencentImCallback request param:{}", JSON.toJSONString(request.getParameterMap()));
+
+        List<String> sdkList = Arrays.asList(request.getParameterValues("SdkAppid"));
+        if (sdkList == null || sdkList.size() == 0) {
+            log.error("tencentImCallback sdkAppid is null");
+            return new TencentImCallbackResult();
+        }
+        if (!sdkList.contains(appKey)) {
+            log.error("tencentImCallback sdkAppid is not match");
+            return new TencentImCallbackResult();
+        }
+
+        String clientIP = request.getParameter("ClientIP");
+        String optPlatform = request.getParameter("OptPlatform");
+
+
+        if(request.getParameter("CallbackCommand").equals(ETencentImCallbackCommand.GROUP_CALLBACKONMEMBERSTATECHANGE.getCommand())) {
+            // 直播群成员在线状态回调
+            TencentData.CallbackOnMemberStateChange callbackOnMemberStateChange = TencentData.CallbackOnMemberStateChange.toObject(
+                    body);
+
+            log.debug("callbackOnMemberStateChange: {}", callbackOnMemberStateChange);
+            callbackOnMemberStateChange.setClientIP(clientIP);
+            callbackOnMemberStateChange.setOptPlatform(optPlatform);
+            for (TencentData.MemberListDTO memberListDTO : callbackOnMemberStateChange.getMemberList()) {
+                if (!imGroupService.checkImUserId(memberListDTO.getMemberAccount())) {
+                    return new TencentImCallbackResult();
+                }
+                memberListDTO.setMemberAccount(imGroupService.analysisImUserId(memberListDTO.getMemberAccount()));
+            }
+            // 直播间成员状态变更
+            liveRoomService.callbackOnMemberStateChange(callbackOnMemberStateChange);
+        } else if(request.getParameter("CallbackCommand").equals(ETencentImCallbackCommand.GROUP_CALLBACKAFTERMEMBEREXIT.getCommand())) {
+            // 群成员离开之后回调
+            TencentData.CallbackAfterMemberExit callbackAfterMemberExit = TencentData.CallbackAfterMemberExit.toObject(
+                    body);
+
+            log.debug("callbackAfterMemberExit: {}", callbackAfterMemberExit);
+            callbackAfterMemberExit.setClientIP(clientIP);
+            callbackAfterMemberExit.setOptPlatform(optPlatform);
+            for (TencentData.MemberListDTO memberListDTO : callbackAfterMemberExit.getExitMemberList()) {
+                if (!imGroupService.checkImUserId(memberListDTO.getMemberAccount())) {
+                    return new TencentImCallbackResult();
+                }
+                memberListDTO.setMemberAccount(imGroupService.analysisImUserId(memberListDTO.getMemberAccount()));
+            }
+            // 直播间成员状态变更
+            liveRoomService.callbackAfterMemberExit(callbackAfterMemberExit);
+        } else if(request.getParameter("CallbackCommand").equals(ETencentImCallbackCommand.GROUP_CALLBACKAFTERNEWMEMBERJOIN.getCommand())) {
+            // 新成员入群之后回调
+            TencentData.CallbackAfterNewMemberJoin callbackAfterNewMemberJoin = TencentData.CallbackAfterNewMemberJoin.toObject(
+                    body);
+
+            log.debug("CallbackAfterNewMemberJoin: {}", callbackAfterNewMemberJoin);
+            callbackAfterNewMemberJoin.setClientIP(clientIP);
+            callbackAfterNewMemberJoin.setOptPlatform(optPlatform);
+            for (TencentData.MemberListDTO memberListDTO : callbackAfterNewMemberJoin.getNewMemberList()) {
+                if (!imGroupService.checkImUserId(memberListDTO.getMemberAccount())) {
+                    return new TencentImCallbackResult();
+                }
+                memberListDTO.setMemberAccount(imGroupService.analysisImUserId(memberListDTO.getMemberAccount()));
+            }
+            // 直播间成员状态变更
+            liveRoomService.callbackAfterNewMemberJoin(callbackAfterNewMemberJoin);
+        }
+
+
+        return new TencentImCallbackResult();
+    }
+
+
+    @ApiOperation("腾讯云直播-推流 回调接口")
+    @PostMapping(value = "/tencentStreamEventCallback")
+    public TencentData.StreamEventCallbackResult tencentStreamEventCallback(@RequestBody Object obj) {
+        String body = JSON.toJSONString(obj);
+        log.info("tencentStreamEventCallback body:{}", body);
+
+        TencentData.CallbackStreamStateEvent event = TencentData.CallbackStreamStateEvent.from(body);
+
+        boolean b = checkStream(event.getStreamId());
+        if (!b) {
+            return TencentData.StreamEventCallbackResult.builder().code(0).build();
+        }
+
+        ImUserStateSync imUserState = new ImUserStateSync();
+        imUserState.setUserid(getSpeakerId(event.getStreamId()).toString());
+        // 断流事件通知
+        if (event.getEventType() == 0) {
+            imUserState.setStatus("3");
+
+            // 更新推流时长
+            if (StringUtils.isNotBlank(event.getPushDuration()) && event.getPushDuration().matches("\\d+")) {
+                // 更新直播推流时长
+                liveRoomService.updateLiveRoomPushStreamTime(event);
+            }
+
+            // 自动关闭录制
+            liveRoomService.closeLive(getRoomUid(event.getStreamId()), getSpeakerId(event.getStreamId()).longValue(),event.getSequence());
+            // 同步点赞数
+            liveRoomService.syncLikeCount(getRoomUid(event.getStreamId()));
+        }
+
+        // 推流事件通知
+        if (event.getEventType() == 1) {
+            // 房间uid
+            String roomUid = getRoomUid(event.getStreamId());
+
+            LiveRoomStatus roomStatus = new LiveRoomStatus();
+            // 房间ID
+            roomStatus.setRoomUid(roomUid);
+            // 主播状态
+            roomStatus.setSpeakerStatus(1);
+            // 推流状态
+            roomStatus.setPushStatus(1);
+            // 更新直播间状态
+            liveRoomService.updateRoomStatus(roomStatus);
+            // 自动开启录制
+            liveRoomService.startLive(roomUid, getSpeakerId(event.getStreamId()), event.getSequence());
+
+            imUserState.setStatus("0");
+        }
+        liveRoomService.opsRoom(Lists.newArrayList(imUserState));
+
+        return TencentData.StreamEventCallbackResult.builder().code(0).build();
+    }
+
+
+    private boolean checkStream(String streamId) {
+        return imGroupService.checkImUserId(streamId.split("_",2)[1]);
+    }
+
+
+    private Integer getSpeakerId(String streamId) {
+        return Integer.parseInt(imGroupService.analysisImUserId(streamId.split("_",2)[1]));
+    }
+
+    private String getRoomUid(String streamId) {
+        return streamId.split("_")[0];
+    }
+
+    @ApiOperation("腾讯云直播-录制 回调接口")
+    @PostMapping(value = "/tencentStreamRecordCallback")
+    public TencentData.StreamEventCallbackResult tencentStreamRecordCallback(@RequestBody Object obj) {
+        String body = JSON.toJSONString(obj);
+        log.info("tencentStreamRecordCallback body:{}", body);
+
+        TencentData.CallbackSteamRecordEvent event = TencentData.CallbackSteamRecordEvent.from(body);
+
+
+        boolean b = checkStream(event.getStreamId());
+        if (!b) {
+            return TencentData.StreamEventCallbackResult.builder().code(0).build();
+        }
+
+        // 直播录制事件通知
+        if (event.getStreamId().startsWith("LIVE")) {
+            log.info("taskId={}, url={}", event.getTaskId(), event.getVideoUrl());
+
+            // 生成直播录制信息
+            liveRoomService.createLiveRoomVideoRecord(event);
+        }
+
+        return TencentData.StreamEventCallbackResult.builder().code(0).build();
+    }
+
+    @ApiOperation("腾讯云直播-推流异常 回调接口")
+    @PostMapping(value = "/tencentStreamExceptionCallback")
+    public TencentData.StreamEventCallbackResult tencentStreamExceptionCallback(@RequestBody Object obj) {
+        String body = JSON.toJSONString(obj);
+        log.info("tencentStreamExceptionCallback body:{}", body);
+
+        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());
+        }
+    }
+
+}
+

+ 0 - 96
cooleshow-user/user-admin/src/main/java/com/yonge/cooleshow/admin/controller/open/ImUserFriendController.java

@@ -1,96 +0,0 @@
-package com.yonge.cooleshow.admin.controller.open;
-
-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.biz.dal.enums.ClientEnum;
-import com.yonge.cooleshow.biz.dal.service.CourseRelationMusicAlbumService;
-import com.yonge.cooleshow.biz.dal.service.ImUserFriendService;
-import com.yonge.cooleshow.biz.dal.wrapper.im.CustomerService;
-import com.yonge.cooleshow.common.controller.BaseController;
-import com.yonge.cooleshow.common.entity.HttpResponseResult;
-import io.swagger.annotations.Api;
-import io.swagger.annotations.ApiOperation;
-import org.springframework.beans.factory.annotation.Autowired;
-import org.springframework.beans.factory.annotation.Value;
-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.annotation.Resource;
-import java.util.Objects;
-
-/**
- * 用户通讯录表(ImUserFriend)表控制层
- *
- * @author zx
- * @since 2022-03-22 10:45:59
- */
-@Api(tags = "用户通讯录表")
-@RestController
-@RequestMapping("/open")
-public class ImUserFriendController extends BaseController {
-
-    /**
-     * 服务对象
-     */
-    @Resource
-    private ImUserFriendService imUserFriendService;
-    @Autowired
-    private CourseRelationMusicAlbumService courseRelationMusicAlbumService;
-
-    @ApiOperation("新用户添加客服")
-    @PostMapping(value = "/im/customerService")
-    public HttpResponseResult<Boolean> customerService(@RequestBody UserFriendInfoVO info) {
-
-        if (info.invalidRequestParam()) {
-            return failed("无效的请求参数");
-        }
-
-        // 新用户自动绑定系统客服
-        int ret = imUserFriendService.registerUserBindCustomerService(info.getUserId(),
-                info.getFriendIds(), ClientEnum.valueOf(info.getClientType()));
-
-        return succeed(ret > 0);
-    }
-
-    /**
-     * 发送系统客服消息
-     * @param info IMNotifyMessageVO
-     * @return HttpResponseResult<Boolean>
-     */
-    @PostMapping(value = "/im/message")
-    public HttpResponseResult<Boolean> sendSysCustomerServiceMessage(@RequestBody IMNotifyMessageVO info) {
-
-        if (info.invalidRequestParam()) {
-            return failed("无效的请求参数");
-        }
-
-        // 发送客服通知消息
-        imUserFriendService.sendCustomerServiceNotifyMessage(info.getSender(),
-                CustomerService.NotifyMessage.from(info.jsonString()));
-
-        return succeed();
-    }
-
-    /**
-     * 同步用户购买课程赠送数据
-     * @param query CourseRelationVo.CourseRelationQuery
-     * @return HttpResponseResult<Boolean>
-     */
-    @ApiOperation("已购买课程赠送同步")
-    @PostMapping(value = "/course/sync")
-    public HttpResponseResult<Boolean> syncUserPurchaseRelationMusicAlbum(@RequestBody CourseRelationVo.CourseRelationQuery query) {
-
-        if (Objects.isNull(query.getCourseGroupId()) || Objects.isNull(query.getCourseType())) {
-            return failed("无效的请求参数");
-        }
-
-        // 同步数据
-        courseRelationMusicAlbumService.asyncUpdateCourseRelationMusicAlbumInfo(query.getCourseGroupId(), query.getCourseType());
-
-        return succeed();
-    }
-}
-

+ 17 - 0
cooleshow-user/user-admin/src/main/java/com/yonge/cooleshow/admin/task/TaskController.java

@@ -2,6 +2,7 @@ package com.yonge.cooleshow.admin.task;
 
 import com.alibaba.fastjson.JSONObject;
 import com.yonge.cooleshow.biz.dal.service.*;
+import com.yonge.cooleshow.biz.dal.service.*;
 import com.yonge.cooleshow.common.constant.SysConfigConstant;
 import com.yonge.cooleshow.common.controller.BaseController;
 import com.yonge.cooleshow.common.entity.HttpResponseResult;
@@ -68,6 +69,9 @@ public class TaskController extends BaseController {
     @Autowired
     private ImGroupService imGroupService;
 
+    @Autowired
+    private LiveRoomService liveRoomService;
+
     /***
      * 轮询用户订单
      * @author liweifan
@@ -181,6 +185,19 @@ public class TaskController extends BaseController {
     }
 
 
+    /**
+     * 直播间销毁
+     */
+    @GetMapping("/destroyLiveRoom")
+    public HttpResponseResult<Object> destroyLiveRoom() {
+
+        // 群发消息定时
+        liveRoomService.destroyLiveRoom();
+
+        return HttpResponseResult.succeed();
+    }
+
+
 
     @GetMapping("/rongyunImport")
     public void rongyunImport() throws Exception {

+ 22 - 0
cooleshow-user/user-biz/pom.xml

@@ -110,6 +110,28 @@
             <artifactId>microsvc-middleware-oss</artifactId>
         </dependency>
 
+        <dependency>
+            <groupId>com.microsvc.toolkit.middleware</groupId>
+            <artifactId>microsvc-middleware-live</artifactId>
+        </dependency>
+
+
+        <dependency>
+            <groupId>com.microsvc.toolkit.middleware</groupId>
+            <artifactId>microsvc-middleware-im</artifactId>
+        </dependency>
+        <dependency>
+            <groupId>com.microsvc.toolkit.middleware</groupId>
+            <artifactId>microsvc-middleware-rtc</artifactId>
+            <version>1.0.0</version>
+        </dependency>
+
+
+        <!--修复依赖冲突-->
+        <dependency>
+            <groupId>org.jetbrains.kotlin</groupId>
+            <artifactId>kotlin-stdlib</artifactId>
+        </dependency>
     </dependencies>
 
     <build>

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

+ 4 - 0
cooleshow-user/user-biz/src/main/java/com/yonge/cooleshow/biz/dal/constant/LiveRoomConstant.java

@@ -37,5 +37,9 @@ public interface LiveRoomConstant {
 
     //正在临时直播间的房间列表
     String TEACHER_TEMP_LIVE_ROOM = String.join(":", COOLESHOW, "TEACHER_TEMP_LIVE_ROOM");
+    //主讲人信息
+    String LIVE_SPEAKER_INFO = String.join(":", "IM:LIVE_SPEAKER_INFO", ROOM_UID, USER_ID);
+    //计算人员观看时长锁
+    public static final String LIVE_LOOK_LOCK = String.join(":", "IM:LIVE_LOOK_LOCK", ROOM_UID);
 
 }

+ 2 - 11
cooleshow-user/user-biz/src/main/java/com/yonge/cooleshow/biz/dal/dao/CourseScheduleStudentPaymentDao.java

@@ -1,7 +1,7 @@
 package com.yonge.cooleshow.biz.dal.dao;
 
 import com.baomidou.mybatisplus.core.mapper.BaseMapper;
-import com.yonge.cooleshow.biz.dal.dto.BasicUserInfo;
+import com.yonge.cooleshow.biz.dal.dto.BasicUserInfoDto;
 import com.yonge.cooleshow.biz.dal.entity.CourseScheduleStudentPayment;
 import com.yonge.cooleshow.biz.dal.vo.CourseScheduleStudentPaymentVo;
 import com.yonge.cooleshow.biz.dal.vo.CourseScheduleStudentVo;
@@ -57,15 +57,6 @@ public interface CourseScheduleStudentPaymentDao extends BaseMapper<CourseSchedu
      */
     List<String> selectOrderNoByGroupId(Long courseGroupId);
 
-    //重置节拍器设置
-    void cleanPlayMidi(@Param("courseScheduleId") Long courseScheduleId);
-
-    //获取节拍器数据
-    String getMidiByCourseIdAndUserId(@Param("courseScheduleId") Long courseScheduleId, @Param("userId") Long userId);
-
-    //获取伴奏数据
-    String getMusicSheetByCourseIdAndUserId(@Param("courseScheduleId") Long courseScheduleId, @Param("userId") Long userId);
-
     //调整节拍器
     void adjustPlayMidi(@Param("courseScheduleId") long courseScheduleId, @Param("userId") String userId, @Param("content") String content);
 
@@ -95,6 +86,6 @@ public interface CourseScheduleStudentPaymentDao extends BaseMapper<CourseSchedu
     //查询报课学员
     List<CourseScheduleStudentVo> selectUser();
 
-    List<BasicUserInfo> queryNoJoinStu(@Param("scheduleId") Long scheduleId);
+    List<BasicUserInfoDto> queryNoJoinStu(@Param("scheduleId") String scheduleId, @Param("studentIds") List<String> studentIds);
 }
 

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

@@ -1,6 +1,7 @@
 package com.yonge.cooleshow.biz.dal.dao;
 
 import com.baomidou.mybatisplus.core.mapper.BaseMapper;
+import com.baomidou.mybatisplus.core.metadata.IPage;
 import com.yonge.cooleshow.biz.dal.dto.ImGroupResultDto;
 import com.yonge.cooleshow.biz.dal.dto.ImGroupSearchDto;
 import com.yonge.cooleshow.biz.dal.entity.ImGroup;
@@ -8,6 +9,7 @@ import com.yonge.cooleshow.biz.dal.entity.ImHistoryMessage;
 import org.apache.ibatis.annotations.Param;
 
 import java.util.List;
+import java.util.Set;
 
 /**
  * 即时通讯群组(ImGroup)表数据库访问层
@@ -27,5 +29,14 @@ public interface ImGroupDao extends BaseMapper<ImGroup> {
 
     //批量插入历史数据
     void batchInsert(@Param("list") List<ImHistoryMessage> historyMessages);
+
+    //获取融云数据
+    List<ImHistoryMessage> selectAll(@Param("result") int result, @Param("size") int size);
+
+    //查询总数据量
+    int queryCount();
+
+    //更新状态
+    void updateStatus(@Param("info") List<ImHistoryMessage> info);
 }
 

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

@@ -4,6 +4,7 @@ import com.baomidou.mybatisplus.core.mapper.BaseMapper;
 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.wrapper.im.ImGroupMemberWrapper;
 import io.rong.models.group.GroupMember;
 import org.apache.ibatis.annotations.Param;
 
@@ -32,7 +33,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: 获取群成员列表

+ 2 - 0
cooleshow-user/user-biz/src/main/java/com/yonge/cooleshow/biz/dal/dao/ImGroupNoticeDao.java

@@ -21,5 +21,7 @@ public interface ImGroupNoticeDao extends BaseMapper<ImGroupNotice> {
     int insertBatch(@Param("entities") List<ImGroupNotice> entities);
 
     IPage<ImGroupNoticeDto> queryPage(Page<ImGroupNoticeDto> pageInfo, @Param("params") Map<String, Object> params);
+
+    void updateTopFlag(@Param("groupId") String groupId);
 }
 

+ 2 - 11
cooleshow-user/user-biz/src/main/java/com/yonge/cooleshow/biz/dal/dao/ImNetworkRoomMemberDao.java

@@ -1,6 +1,7 @@
 package com.yonge.cooleshow.biz.dal.dao;
 
 import com.baomidou.mybatisplus.core.mapper.BaseMapper;
+import com.yonge.cooleshow.biz.dal.dto.ImNetworkRoomMemberResult;
 import com.yonge.cooleshow.biz.dal.entity.ImNetworkRoomMember;
 import org.apache.ibatis.annotations.Param;
 
@@ -14,18 +15,8 @@ import java.util.List;
  */
 public interface ImNetworkRoomMemberDao extends BaseMapper<ImNetworkRoomMember> {
 
-    int insertBatch(@Param("entities") List<ImNetworkRoomMember> entities);
-
     int insert(@Param("entity") ImNetworkRoomMember roomMember);
 
-    ImNetworkRoomMember findByRidAndUid(@Param("roomId") String roomId, @Param("userId") Long userId, @Param("userRole") Integer userRole);
-
-    List<ImNetworkRoomMember> queryByRoomId(@Param("roomId") String roomId);
-
-    void delByRidAndUid(@Param("roomId") String roomId, @Param("userId") Long userId, @Param("userRole") Integer userRole);
-
-    int countByRoomId(@Param("roomId") String roomId);
-
-    List<ImNetworkRoomMember> findByRoomAndRole(@Param("roomId") String roomId, @Param("role") int role);
+    List<ImNetworkRoomMemberResult> queryByRoomId(String roomId);
 }
 

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

@@ -4,6 +4,7 @@ import java.util.List;
 
 import com.baomidou.mybatisplus.core.mapper.BaseMapper;
 import com.baomidou.mybatisplus.core.metadata.IPage;
+import com.yonge.cooleshow.biz.dal.wrapper.liveroom.ImLiveBroadcastRoomMemberWrapper;
 import org.apache.ibatis.annotations.Param;
 import com.yonge.cooleshow.biz.dal.entity.LiveBroadcastRoomMember;
 import com.yonge.cooleshow.biz.dal.vo.LiveBroadcastRoomMemberVo;
@@ -26,5 +27,5 @@ public interface LiveBroadcastRoomMemberDao extends BaseMapper<LiveBroadcastRoom
      * @return: com.yonge.cooleshow.biz.dal.vo.LiveBroadcastRoomMemberVo
 	 */
 	List<LiveBroadcastRoomMemberVo> selectPage(@Param("page") IPage page, @Param("param") LiveBroadcastRoomMemberSearch liveBroadcastRoomMember);
-	
+
 }

+ 2 - 40
cooleshow-user/user-biz/src/main/java/com/yonge/cooleshow/biz/dal/dto/BasicUserInfo.java

@@ -1,12 +1,14 @@
 package com.yonge.cooleshow.biz.dal.dto;
 
 import io.swagger.annotations.ApiModelProperty;
+import lombok.Data;
 
 /**
 * @description: 用户基本信息
 * @author zx
 * @date 2022/3/22 13:51
 */
+@Data
 public class BasicUserInfo {
     @ApiModelProperty(value = "用户编号", required = true)
     private Long userId;
@@ -22,44 +24,4 @@ public class BasicUserInfo {
 
     @ApiModelProperty("IM用户ID")
     private String imUserId;
-
-    public String getAvatar() {
-        return avatar;
-    }
-
-    public void setAvatar(String avatar) {
-        this.avatar = avatar;
-    }
-
-    public Long getUserId() {
-        return userId;
-    }
-
-    public void setUserId(Long userId) {
-        this.userId = userId;
-    }
-
-    public String getUsername() {
-        return username;
-    }
-
-    public void setUsername(String username) {
-        this.username = username;
-    }
-
-    public String getRealName() {
-        return realName;
-    }
-
-    public void setRealName(String realName) {
-        this.realName = realName;
-    }
-
-    public String getImUserId() {
-        return imUserId;
-    }
-
-    public void setImUserId(String imUserId) {
-        this.imUserId = imUserId;
-    }
 }

+ 14 - 0
cooleshow-user/user-biz/src/main/java/com/yonge/cooleshow/biz/dal/dto/BasicUserInfoDto.java

@@ -0,0 +1,14 @@
+package com.yonge.cooleshow.biz.dal.dto;
+
+import io.swagger.annotations.ApiModelProperty;
+import lombok.Data;
+
+@Data
+public class BasicUserInfoDto {
+    @ApiModelProperty(value = "用户编号", required = true)
+    private String userId;
+
+    private String userName;
+
+    private String headUrl;
+}

+ 4 - 34
cooleshow-user/user-biz/src/main/java/com/yonge/cooleshow/biz/dal/dto/CourseScheduleStudentMusicSheetResult.java

@@ -2,49 +2,19 @@ package com.yonge.cooleshow.biz.dal.dto;
 
 import com.yonge.cooleshow.biz.dal.entity.CourseScheduleStudentMusicSheet;
 import io.swagger.annotations.ApiModelProperty;
+import lombok.Data;
 
+@Data
 public class CourseScheduleStudentMusicSheetResult extends CourseScheduleStudentMusicSheet {
     @ApiModelProperty(value = "原音")
     private String mp3Url;
 
     @ApiModelProperty(value = "伴奏")
-    private String audioFileUrl;
+    private String url;
 
     @ApiModelProperty(value = "曲目名")
-    private String musicSheetName;
+    private String musicScoreName;
 
     @ApiModelProperty(value = "伴奏音量")
     private Integer soundVolume = 100;
-
-    public Integer getSoundVolume() {
-        return soundVolume;
-    }
-
-    public void setSoundVolume(Integer soundVolume) {
-        this.soundVolume = soundVolume;
-    }
-
-    public String getMp3Url() {
-        return mp3Url;
-    }
-
-    public void setMp3Url(String mp3Url) {
-        this.mp3Url = mp3Url;
-    }
-
-    public String getAudioFileUrl() {
-        return audioFileUrl;
-    }
-
-    public void setAudioFileUrl(String audioFileUrl) {
-        this.audioFileUrl = audioFileUrl;
-    }
-
-    public String getMusicSheetName() {
-        return musicSheetName;
-    }
-
-    public void setMusicSheetName(String musicSheetName) {
-        this.musicSheetName = musicSheetName;
-    }
 }

+ 30 - 0
cooleshow-user/user-biz/src/main/java/com/yonge/cooleshow/biz/dal/dto/ETencentGroupType.java

@@ -0,0 +1,30 @@
+package com.yonge.cooleshow.biz.dal.dto;
+
+/**
+ * Description
+ *
+ * @author liujunchi
+ * @date 2023-03-06
+ */
+public enum ETencentGroupType {
+
+    Public("陌生人社交群"),
+    Work("好友工作群"),
+    AVChatRoom("直播群"),
+    Meeting("临时会议群"),
+    Community("社群"),
+
+    ;
+
+    private String code;
+
+    private String msg;
+
+
+    ETencentGroupType(String msg) {
+        this.code = this.name();
+        this.msg = msg;
+    }
+
+
+}

+ 31 - 0
cooleshow-user/user-biz/src/main/java/com/yonge/cooleshow/biz/dal/dto/ETencentImCallbackCommand.java

@@ -0,0 +1,31 @@
+package com.yonge.cooleshow.biz.dal.dto;
+
+import lombok.Getter;
+
+/**
+ * Description
+ *
+ * @author liujunchi
+ * @date 2023-03-02
+ */
+@Getter
+public enum ETencentImCallbackCommand {
+
+    // STATE_STATECHANGE("State.StateChange", "用户状态变更"),
+    GROUP_CALLBACKAFTERMEMBEREXIT("Group.CallbackAfterMemberExit", "群成员离开之后回调"),
+    GROUP_CALLBACKAFTERNEWMEMBERJOIN("Group.CallbackAfterNewMemberJoin", "新成员入群之后回调"),
+    GROUP_CALLBACKONMEMBERSTATECHANGE("Group.CallbackOnMemberStateChange", "直播群成员在线状态回调"),
+    ;
+
+    private final String command;
+    private final String desc;
+
+    private final String code;
+
+    ETencentImCallbackCommand(String command, String desc) {
+        this.command = command;
+        this.desc = desc;
+
+        this.code = this.name();
+    }
+}

+ 57 - 0
cooleshow-user/user-biz/src/main/java/com/yonge/cooleshow/biz/dal/dto/ETencentTRTCCallbackCommand.java

@@ -0,0 +1,57 @@
+package com.yonge.cooleshow.biz.dal.dto;
+
+import lombok.Getter;
+
+/**
+ * Description
+ *
+ * @author liujunchi
+ * @date 2023-03-02
+ */
+@Getter
+public enum ETencentTRTCCallbackCommand {
+
+    // 房间事件
+    EVENT_TYPE_CREATE_ROOM("101", "创建房间"),
+    EVENT_TYPE_DISMISS_ROOM("102", "解散房间"),
+    EVENT_TYPE_ENTER_ROOM("103", "进入房间"),
+    EVENT_TYPE_EXIT_ROOM("104", "退出房间"),
+
+    // 媒体事件
+    EVENT_TYPE_START_VIDEO("201", "开始推送视频数据"),
+    EVENT_TYPE_STOP_VIDEO("202", "停止推送视频数据"),
+    EVENT_TYPE_START_AUDIO("203", "开始推送音频数据"),
+    EVENT_TYPE_STOP_AUDIO("204", "停止推送音频数据"),
+    EVENT_TYPE_START_ASSIT("205", "开始推送辅路数据"),
+    EVENT_TYPE_STOP_ASSIT("206", "停止推送辅路数据"),
+
+    EVENT_DEFAULT("-1", "默认无效事件"),
+    ;
+
+    private final String command;
+    private final String desc;
+
+    private final Integer code;
+
+    ETencentTRTCCallbackCommand(String command, String desc) {
+        this.command = command;
+        this.desc = desc;
+
+        // 枚举转换对象
+        this.code = Integer.parseInt(command);
+    }
+
+    /**
+     * 回调事件对象枚举
+     * @param eventType 事件类型
+     * @return ETencentTRTCCallbackCommand
+     */
+    public static ETencentTRTCCallbackCommand get(Integer eventType) {
+        for (ETencentTRTCCallbackCommand e : ETencentTRTCCallbackCommand.values()) {
+            if (e.getCode().equals(eventType)) {
+                return e;
+            }
+        }
+        return EVENT_DEFAULT;
+    }
+}

+ 6 - 17
cooleshow-user/user-biz/src/main/java/com/yonge/cooleshow/biz/dal/dto/ImNetworkBaseDto.java

@@ -2,28 +2,17 @@ package com.yonge.cooleshow.biz.dal.dto;
 
 import com.yonge.cooleshow.biz.dal.enums.ClientEnum;
 import io.swagger.annotations.ApiModelProperty;
+import lombok.Data;
 
+@Data
 public class ImNetworkBaseDto {
 
     @ApiModelProperty(value = "房间号(课程编号)",required = true)
-    private Long roomId;
+    private String roomId;
+
+    @ApiModelProperty(value = "设备号",required = true)
+    private String deviceNum;
 
     @ApiModelProperty("客户端类型 ")
     private ClientEnum clientType;
-
-    public Long getRoomId() {
-        return roomId;
-    }
-
-    public void setRoomId(Long roomId) {
-        this.roomId = roomId;
-    }
-
-    public ClientEnum getClientType() {
-        return clientType;
-    }
-
-    public void setClientType(ClientEnum clientType) {
-        this.clientType = clientType;
-    }
 }

+ 13 - 87
cooleshow-user/user-biz/src/main/java/com/yonge/cooleshow/biz/dal/dto/ImNetworkCustomMessage.java

@@ -1,100 +1,26 @@
 package com.yonge.cooleshow.biz.dal.dto;
 
 import com.yonge.cooleshow.biz.dal.enums.ClientEnum;
-import io.rong.messages.BaseMessage;
 import io.swagger.annotations.ApiModelProperty;
-import org.apache.commons.lang3.StringUtils;
+import lombok.Data;
 
-public class ImNetworkCustomMessage extends BaseMessage {
-    @ApiModelProperty(value = "节拍器开关",required = true)
-    private boolean enable;
-
-    @ApiModelProperty(value = "消息类型(移动端定义,具体的类型不太清楚)",required = true)
-    private int customType;
-
-    @ApiModelProperty(value = "速度",required = true)
-    private int rate;
-
-    @ApiModelProperty(value = "音量",required = true)
-    private int playVolume;
-
-    @ApiModelProperty(value = "学员编号列表,都还分割",required = true)
+@Data
+public class ImNetworkCustomMessage{
+    @ApiModelProperty(value = "学员编号列表,逗号分割",required = true)
     private String userId;
 
-    @ApiModelProperty(value = "房间号(课程编号)",required = true)
-    private Long roomId;
+    @ApiModelProperty(value = "当前用户")
+    private String currentUserId;
+
+    @ApiModelProperty(value = "房间号",required = true)
+    private String roomId;
 
     @ApiModelProperty("客户端类型")
     private ClientEnum clientType;
 
-    public Long getRoomId() {
-        return roomId;
-    }
-
-    public void setRoomId(Long roomId) {
-        this.roomId = roomId;
-    }
-
-    public int getPlayVolume() {
-        return playVolume;
-    }
-
-    public void setPlayVolume(int playVolume) {
-        this.playVolume = playVolume;
-    }
-
-    public Boolean getEnable() {
-        return enable;
-    }
-
-    public void setEnable(Boolean enable) {
-        this.enable = enable;
-    }
-
-    public int getCustomType() {
-        return customType;
-    }
-
-    public void setCustomType(int customType) {
-        this.customType = customType;
-    }
-
-    public int getRate() {
-        return rate;
-    }
-
-    public void setRate(int rate) {
-        this.rate = rate;
-    }
-
-    public String getUserId() {
-        return userId;
-    }
-
-    public void setUserId(String userId) {
-        this.userId = userId;
-    }
-
-    public ClientEnum getClientType() {
-        return clientType;
-    }
-
-    public void setClientType(ClientEnum clientType) {
-        this.clientType = clientType;
-    }
-
-    @Override
-    public String getType() {
-        return "DY:PlayMidiMessage";
-    }
+    @ApiModelProperty("服务提供方")
+    private String serviceProvider;
 
-    @Override
-    public String toString() {
-        return "{\"enable\":" + enable +
-                ", \"customType\":" + customType +
-                ", \"rate\":" + rate +
-                ", \"playVolume\":" + playVolume +
-                ", \"userId\":" + (StringUtils.isEmpty(userId)?"\"\"":"\"" + userId + "\"") +
-                '}';
-    }
+    @ApiModelProperty("消息内容JSON")
+    private String content;
 }

+ 8 - 80
cooleshow-user/user-biz/src/main/java/com/yonge/cooleshow/biz/dal/dto/ImNetworkDeviceControlDto.java

@@ -3,7 +3,9 @@ package com.yonge.cooleshow.biz.dal.dto;
 import com.yonge.cooleshow.biz.dal.enums.ClientEnum;
 import com.yonge.cooleshow.biz.dal.enums.ImNetworkDeviceTypeEnum;
 import io.swagger.annotations.ApiModelProperty;
+import lombok.Data;
 
+@Data
 public class ImNetworkDeviceControlDto {
 	@ApiModelProperty(value = "需要操作的类型",required = true)
 	private ImNetworkDeviceTypeEnum deviceType;
@@ -14,7 +16,7 @@ public class ImNetworkDeviceControlDto {
 	@ApiModelProperty(value = "房间号",required = true)
 	private String roomId;
 
-	@ApiModelProperty(value = "IM用户ID",required = true)
+	@ApiModelProperty(value = "用户ID",required = true)
 	private String userId;
 
 	@ApiModelProperty(value = "ticket",required = true)
@@ -27,7 +29,7 @@ public class ImNetworkDeviceControlDto {
 	private Integer musicSheetId;
 
 	@ApiModelProperty(value = "伴奏",required = true)
-	private Integer musicSheetAccompanimentId;
+	private Integer musicScoreAccompanimentId;
 
 	@ApiModelProperty(value = "伴奏音量",required = true)
 	private Integer soundVolume = 100;
@@ -35,83 +37,9 @@ public class ImNetworkDeviceControlDto {
 	@ApiModelProperty("客户端类型 ")
 	private ClientEnum clientType;
 
-	public ImNetworkDeviceTypeEnum getDeviceType() {
-		return deviceType;
-	}
+	@ApiModelProperty("服务提供方")
+	private String serviceProvider;
 
-	public void setDeviceType(ImNetworkDeviceTypeEnum deviceType) {
-		this.deviceType = deviceType;
-	}
-
-	public Boolean getEnable() {
-		return enable;
-	}
-
-	public void setEnable(Boolean enable) {
-		this.enable = enable;
-	}
-
-	public String getRoomId() {
-		return roomId;
-	}
-
-	public void setRoomId(String roomId) {
-		this.roomId = roomId;
-	}
-
-	public String getUserId() {
-		return userId;
-	}
-
-	public void setUserId(String userId) {
-		this.userId = userId;
-	}
-
-	public String getTicket() {
-		return ticket;
-	}
-
-	public void setTicket(String ticket) {
-		this.ticket = ticket;
-	}
-
-	public Integer getStatus() {
-		return status;
-	}
-
-	public void setStatus(Integer status) {
-		this.status = status;
-	}
-
-	public Integer getMusicSheetId() {
-		return musicSheetId;
-	}
-
-	public void setMusicSheetId(Integer musicSheetId) {
-		this.musicSheetId = musicSheetId;
-	}
-
-	public Integer getMusicSheetAccompanimentId() {
-		return musicSheetAccompanimentId;
-	}
-
-	public void setMusicSheetAccompanimentId(Integer musicSheetAccompanimentId) {
-		this.musicSheetAccompanimentId = musicSheetAccompanimentId;
-	}
-
-	public Integer getSoundVolume() {
-		return soundVolume;
-	}
-
-	public void setSoundVolume(Integer soundVolume) {
-		this.soundVolume = soundVolume;
-	}
-
-	public ClientEnum getClientType() {
-		return clientType;
-	}
-
-	public void setClientType(ClientEnum clientType) {
-		this.clientType = clientType;
-	}
+	@ApiModelProperty("是否允许用户自行解除静音")
+	private Boolean cancelMuteFlag;
 }

+ 4 - 40
cooleshow-user/user-biz/src/main/java/com/yonge/cooleshow/biz/dal/dto/ImNetworkDisplayDataDto.java

@@ -3,7 +3,9 @@ package com.yonge.cooleshow.biz.dal.dto;
 import com.yonge.cooleshow.biz.dal.enums.ClientEnum;
 import com.yonge.cooleshow.biz.dal.enums.ImNetworkDisplayEnum;
 import io.swagger.annotations.ApiModelProperty;
+import lombok.Data;
 
+@Data
 public class ImNetworkDisplayDataDto {
 
 	@ApiModelProperty(value = "房间号",required = true)
@@ -15,52 +17,14 @@ public class ImNetworkDisplayDataDto {
 	@ApiModelProperty(value = "即将展示的对应人的 userId",required = true)
     private String userId;
 
+	private String teacherId;
+
 	@ApiModelProperty(value = "display uri",required = true)
     private String uri;
 
 	@ApiModelProperty("客户端类型 ")
 	private ClientEnum clientType;
 
-	public String getRoomId() {
-		return roomId;
-	}
-
-	public void setRoomId(String roomId) {
-		this.roomId = roomId;
-	}
-
-	public ImNetworkDisplayEnum getType() {
-		return type;
-	}
-
-	public void setType(ImNetworkDisplayEnum type) {
-		this.type = type;
-	}
-
-	public String getUserId() {
-		return userId;
-	}
-
-	public void setUserId(String userId) {
-		this.userId = userId;
-	}
-
-	public String getUri() {
-		return uri;
-	}
-
-	public void setUri(String uri) {
-		this.uri = uri;
-	}
-
-	public ClientEnum getClientType() {
-		return clientType;
-	}
-
-	public void setClientType(ClientEnum clientType) {
-		this.clientType = clientType;
-	}
-
 	@Override
 	public String toString() {
 		return "ImNetworkDisplayDataDto{" +

+ 15 - 23
cooleshow-user/user-biz/src/main/java/com/yonge/cooleshow/biz/dal/dto/ImNetworkMetronomeMessage.java

@@ -1,38 +1,30 @@
 package com.yonge.cooleshow.biz.dal.dto;
 
 import com.yonge.cooleshow.biz.dal.entity.BaseMessage;
+import lombok.Data;
 import org.apache.commons.lang3.StringUtils;
 
 //节拍器消息
+@Data
 public class ImNetworkMetronomeMessage extends BaseMessage {
-    private ImNetworkCustomMessage content;
+    private Boolean enable;
+    private int customType;
+    private int rate;
+    private int playVolume;
+    private String userId;
 
-    private static final transient String TYPE = "DY:PlayMidiMessage";
-
-    public ImNetworkMetronomeMessage(ImNetworkCustomMessage content) {
-        this.content = content;
-    }
-
-    public ImNetworkCustomMessage getContent() {
-        return content;
-    }
-
-    public void setContent(ImNetworkCustomMessage content) {
-        this.content = content;
+    @Override
+    public String getObjectName() {
+        return "DY:PlayMidiMessage";
     }
 
     @Override
     public String toString() {
-        return "{\"enable\":" + content.getEnable() +
-                ", \"customType\":" + content.getCustomType() +
-                ", \"rate\":" + content.getRate() +
-                ", \"playVolume\":" + content.getPlayVolume() +
-                ", \"userId\":" + (StringUtils.isEmpty(content.getUserId())?"\"\"":"\"" + content.getUserId() + "\"") +
+        return "{\"enable\":" + enable +
+                ", \"customType\":" + customType +
+                ", \"rate\":" + rate +
+                ", \"playVolume\":" + playVolume +
+                ", \"userId\":" + (StringUtils.isEmpty(userId)?"\"\"":"\"" + userId + "\"") +
                 '}';
     }
-
-    @Override
-    public String getObjectName() {
-        return TYPE;
-    }
 }

+ 17 - 6
cooleshow-user/user-biz/src/main/java/com/yonge/cooleshow/biz/dal/dto/ImNetworkMusicSheetDownloadMessage.java

@@ -2,7 +2,9 @@ package com.yonge.cooleshow.biz.dal.dto;
 
 
 import com.yonge.cooleshow.biz.dal.entity.BaseMessage;
+import lombok.Data;
 
+@Data
 public class ImNetworkMusicSheetDownloadMessage extends BaseMessage {
     
     private ImNetworkMusicSheetDownloadMessageContent content;
@@ -13,12 +15,21 @@ public class ImNetworkMusicSheetDownloadMessage extends BaseMessage {
         this.content = content;
     }
 
-    public ImNetworkMusicSheetDownloadMessageContent getContent() {
-        return content;
-    }
-
-    public void setContent(ImNetworkMusicSheetDownloadMessageContent content) {
-        this.content = content;
+    @Override
+    public String toString() {
+        return "{\"id\":\"" + content.getId() +
+                "\", \"examSongId\":\"" + content.getExamSongId() +
+                "\", \"subjectId\":\"" + content.getSubjectId() +
+                "\", \"subjectName\":\"" + content.getSubjectName() +
+                "\", \"mp3Url\":\"" + content.getMp3Url() +
+                "\", \"speed\":\"" + content.getSpeed() +
+                "\", \"xmlUrl\":\"" + content.getXmlUrl() +
+                "\", \"examSongName\":\"" + content.getExamSongName() +
+                "\", \"categoriesName\":\"" + content.getCategoriesName() +
+                "\", \"categoriesId\":\"" + content.getCategoriesId() +
+                "\", \"type\":\"" + content.getType() +
+                "\", \"url\":\"" + content.getUrl() +
+                "\"}";
     }
 
     @Override

+ 7 - 95
cooleshow-user/user-biz/src/main/java/com/yonge/cooleshow/biz/dal/dto/ImNetworkMusicSheetDownloadMessageContent.java

@@ -2,8 +2,10 @@ package com.yonge.cooleshow.biz.dal.dto;
 
 
 import io.swagger.annotations.ApiModelProperty;
+import lombok.Data;
 import org.apache.commons.lang3.builder.ToStringBuilder;
 
+@Data
 public class ImNetworkMusicSheetDownloadMessageContent{
     //伴奏编号
     @ApiModelProperty(value = "伴奏编号")
@@ -11,7 +13,7 @@ public class ImNetworkMusicSheetDownloadMessageContent{
 
     //曲目编号
     @ApiModelProperty(value = "曲目编号")
-    private Integer musicSheetId;
+    private Integer examSongId;
 
     //声部
     @ApiModelProperty(value = "声部")
@@ -52,101 +54,11 @@ public class ImNetworkMusicSheetDownloadMessageContent{
     @ApiModelProperty(value = "url")
     private String url = "";
 
-    public Integer getId() {
-        return id;
-    }
-
-    public void setId(Integer id) {
-        this.id = id;
-    }
-
-    public Integer getMusicSheetId() {
-        return musicSheetId;
-    }
-
-    public void setMusicSheetId(Integer musicSheetId) {
-        this.musicSheetId = musicSheetId;
-    }
-
-    public Integer getSubjectId() {
-        return subjectId;
-    }
-
-    public void setSubjectId(Integer subjectId) {
-        this.subjectId = subjectId;
-    }
-
-    public String getSubjectName() {
-        return subjectName;
-    }
-
-    public void setSubjectName(String subjectName) {
-        this.subjectName = subjectName;
-    }
-
-    public String getMp3Url() {
-        return mp3Url;
-    }
-
-    public void setMp3Url(String mp3Url) {
-        this.mp3Url = mp3Url;
-    }
-
-    public Integer getSpeed() {
-        return speed;
-    }
-
-    public void setSpeed(Integer speed) {
-        this.speed = speed;
-    }
+    //服务提供商
+    private String serviceProvider;
 
-    public String getXmlUrl() {
-        return xmlUrl;
-    }
-
-    public void setXmlUrl(String xmlUrl) {
-        this.xmlUrl = xmlUrl;
-    }
-
-    public String getExamSongName() {
-        return examSongName;
-    }
-
-    public void setExamSongName(String examSongName) {
-        this.examSongName = examSongName;
-    }
-
-    public String getCategoriesName() {
-        return categoriesName;
-    }
-
-    public void setCategoriesName(String categoriesName) {
-        this.categoriesName = categoriesName;
-    }
-
-    public Integer getCategoriesId() {
-        return categoriesId;
-    }
-
-    public void setCategoriesId(Integer categoriesId) {
-        this.categoriesId = categoriesId;
-    }
-
-    public String getType() {
-        return type;
-    }
-
-    public void setType(String type) {
-        this.type = type;
-    }
-
-    public String getUrl() {
-        return url;
-    }
-
-    public void setUrl(String url) {
-        this.url = url;
-    }
+    //房间号
+    private String roomId;
 
     @Override
     public String toString() {

+ 4 - 32
cooleshow-user/user-biz/src/main/java/com/yonge/cooleshow/biz/dal/dto/ImNetworkMusicSheetDto.java

@@ -1,49 +1,21 @@
 package com.yonge.cooleshow.biz.dal.dto;
 
-import com.yonge.cooleshow.biz.dal.enums.ClientEnum;
 import io.swagger.annotations.ApiModelProperty;
+import lombok.Data;
 
+@Data
 public class ImNetworkMusicSheetDto extends ImNetworkBaseDto{
 
     @ApiModelProperty(value = "伴奏编号",required = true)
-    private Long accompanimentId;
+    private Long musicScoreAccompanimentId;
 
     @ApiModelProperty(value = "伴奏下载状态(1下载成功0下载中2下载失败)",required = true)
     private Integer status;
 
-    @ApiModelProperty("客户端类型 ")
-    private ClientEnum clientType;
-
-    public Long getAccompanimentId() {
-        return accompanimentId;
-    }
-
-    public void setAccompanimentId(Long accompanimentId) {
-        this.accompanimentId = accompanimentId;
-    }
-
-    public Integer getStatus() {
-        return status;
-    }
-
-    public void setStatus(Integer status) {
-        this.status = status;
-    }
-
-    @Override
-    public ClientEnum getClientType() {
-        return clientType;
-    }
-
-    @Override
-    public void setClientType(ClientEnum clientType) {
-        this.clientType = clientType;
-    }
-
     @Override
     public String toString() {
         return "ImNetworkMusicSheetDto{" +
-                "accompanimentId=" + accompanimentId +
+                "accompanimentId=" + musicScoreAccompanimentId +
                 "roomId=" + getRoomId() +
                 ", status=" + status +
                 '}';

+ 60 - 0
cooleshow-user/user-biz/src/main/java/com/yonge/cooleshow/biz/dal/dto/ImNetworkRoomMemberResult.java

@@ -0,0 +1,60 @@
+package com.yonge.cooleshow.biz.dal.dto;
+
+
+import com.baomidou.mybatisplus.annotation.IdType;
+import com.baomidou.mybatisplus.annotation.TableField;
+import com.baomidou.mybatisplus.annotation.TableId;
+import io.swagger.annotations.ApiModel;
+import io.swagger.annotations.ApiModelProperty;
+import lombok.Data;
+
+import java.io.Serializable;
+import java.util.Date;
+import java.util.List;
+
+/**
+ * 网络教室成员(ImNetworkRoomMember)表实体类
+ *
+ * @author zx
+ * @since 2022-03-30 16:36:37
+ */
+@Data
+@ApiModel(value = "im_network_room_member-网络教室成员")
+public class ImNetworkRoomMemberResult implements Serializable {
+    @ApiModelProperty(value = "主键;")
+    private Long id;
+
+    @ApiModelProperty(value = "房间号")
+    private String roomId;
+
+    @ApiModelProperty(value = "转换后的第三方用户编号")
+    private String userId;
+
+    @ApiModelProperty(value = "用户名")
+    private String userName;
+
+    @ApiModelProperty(value = "用户头像")
+    private String headUrl;
+
+    @ApiModelProperty(value = "进入时间;")
+    private Long joinTime;
+
+    @ApiModelProperty(value = "角色0学员1老师;")
+    private Integer role;
+
+    @ApiModelProperty(value = "是否开启摄像头;")
+    private boolean camera;
+
+    @ApiModelProperty(value = "是否开启麦克风")
+    private boolean microphone;
+
+    @ApiModelProperty(value = "是否开启音乐模式")
+    private boolean musicModeOn;
+
+    @ApiModelProperty(value = "是否举手")
+    private boolean handUpOn;
+
+    @ApiModelProperty(value = "当前用户伴奏信息")
+    private List<CourseScheduleStudentMusicSheetResult> scheduleStudentMusicScores;
+}
+

+ 2 - 40
cooleshow-user/user-biz/src/main/java/com/yonge/cooleshow/biz/dal/dto/ImNetworkRoomMusicSheetDownloadData.java

@@ -1,8 +1,10 @@
 package com.yonge.cooleshow.biz.dal.dto;
 
 import io.swagger.annotations.ApiModelProperty;
+import lombok.Data;
 
 //网络教室伴奏下载信息
+@Data
 public class ImNetworkRoomMusicSheetDownloadData {
     @ApiModelProperty(value = "伴奏下载状态(1下载成功0下载中2下载失败)")
     private Integer status;
@@ -18,44 +20,4 @@ public class ImNetworkRoomMusicSheetDownloadData {
 
     @ApiModelProperty(value = "是否开启伴奏")
     private Boolean enable = false;
-
-    public Boolean getEnable() {
-        return enable;
-    }
-
-    public void setEnable(Boolean enable) {
-        this.enable = enable;
-    }
-
-    public Integer getStatus() {
-        return status;
-    }
-
-    public void setStatus(Integer status) {
-        this.status = status;
-    }
-
-    public String getUrl() {
-        return url;
-    }
-
-    public void setUrl(String url) {
-        this.url = url;
-    }
-
-    public String getMusicSheetName() {
-        return musicSheetName;
-    }
-
-    public void setMusicSheetName(String musicSheetName) {
-        this.musicSheetName = musicSheetName;
-    }
-
-    public Long getMusicSheetId() {
-        return musicSheetId;
-    }
-
-    public void setMusicSheetId(Long musicSheetId) {
-        this.musicSheetId = musicSheetId;
-    }
 }

+ 19 - 39
cooleshow-user/user-biz/src/main/java/com/yonge/cooleshow/biz/dal/dto/ImNetworkRoomResult.java

@@ -1,65 +1,45 @@
 package com.yonge.cooleshow.biz.dal.dto;
 
+import com.microsvc.toolkit.middleware.rtc.message.RTCRoomConfig;
 import com.yonge.cooleshow.biz.dal.entity.ImNetworkRoom;
 import com.yonge.cooleshow.biz.dal.entity.ImNetworkRoomMember;
 import io.swagger.annotations.ApiModelProperty;
+import lombok.Data;
+import lombok.Getter;
+import lombok.Setter;
 
 import java.util.List;
 
+@Data
 public class ImNetworkRoomResult extends ImNetworkRoom {
 
     @ApiModelProperty(value = "陪练课结束后,XX分钟关闭房间")
     private String autoCloseNetworkRoomTime = "15";
 
+    @ApiModelProperty(value = "课程结束后是否关闭教室")
+    private Boolean autoCloseFlag = true;
+
     @ApiModelProperty(value = "当前课程剩余时长")
     private Integer surplusTime;
 
     @ApiModelProperty(value = "房间成员列表,包含当前用户;")
-    private List<ImNetworkRoomMember> roomMemberList;
+    private List<ImNetworkRoomMemberResult> members;
 
     @ApiModelProperty(value = "当前用户")
-    private ImNetworkRoomMember roomMember;
+    private ImNetworkRoomMemberResult userInfo;
 
     @ApiModelProperty(value = "节拍器参数")
-    private ImNetworkCustomMessage midiJson = new ImNetworkCustomMessage();
-
-    public ImNetworkCustomMessage getMidiJson() {
-        return midiJson;
-    }
-
-    public void setMidiJson(ImNetworkCustomMessage midiJson) {
-        this.midiJson = midiJson;
-    }
-
-    public Integer getSurplusTime() {
-        return surplusTime;
-    }
-
-    public void setSurplusTime(Integer surplusTime) {
-        this.surplusTime = surplusTime;
-    }
-
-    public String getAutoCloseNetworkRoomTime() {
-        return autoCloseNetworkRoomTime;
-    }
-
-    public void setAutoCloseNetworkRoomTime(String autoCloseNetworkRoomTime) {
-        this.autoCloseNetworkRoomTime = autoCloseNetworkRoomTime;
-    }
+    private ImNetworkMetronomeMessage playMidiJson = new ImNetworkMetronomeMessage();
 
-    public List<ImNetworkRoomMember> getRoomMemberList() {
-        return roomMemberList;
-    }
+    @ApiModelProperty("RTC接入参数")
+    private RTCRoomConfig rtcRoomConfig;
 
-    public void setRoomMemberList(List<ImNetworkRoomMember> roomMemberList) {
-        this.roomMemberList = roomMemberList;
-    }
+    @ApiModelProperty("直播间用户签名")
+    private String userSig;
 
-    public ImNetworkRoomMember getRoomMember() {
-        return roomMember;
-    }
+    @ApiModelProperty("群组id")
+    private String groupId;
 
-    public void setRoomMember(ImNetworkRoomMember roomMember) {
-        this.roomMember = roomMember;
-    }
+    @ApiModelProperty("当前课程所有学员人数")
+    private Integer studentNums;
 }

+ 44 - 0
cooleshow-user/user-biz/src/main/java/com/yonge/cooleshow/biz/dal/dto/LiveRoomStatus.java

@@ -0,0 +1,44 @@
+package com.yonge.cooleshow.biz.dal.dto;
+
+import io.swagger.annotations.ApiModel;
+import io.swagger.annotations.ApiModelProperty;
+import lombok.Data;
+
+import javax.validation.constraints.NotBlank;
+
+/**
+ * Description
+ *
+ * @author liujunchi
+ * @date 2023-03-09
+ */
+@Data
+@ApiModel(value = "更新直播间状态")
+public class LiveRoomStatus {
+
+    @ApiModelProperty(value = "房间uid",required = true)
+    @NotBlank(message = "房间号不能为空")
+    private String roomUid;
+
+    @ApiModelProperty(value = "主播状态: 0离开;1在播")
+    private Integer speakerStatus;
+
+    @ApiModelProperty(value = "推流状态: 0 暂停; 1在播")
+    private Integer pushStatus;
+
+    @ApiModelProperty(value = "禁言状态: 0 取消;1禁言")
+    private Integer banStatus;
+
+    @ApiModelProperty(value = "主播摄像头状态 1:开启 0:关闭")
+    private Integer cameraStatus;
+
+    @ApiModelProperty(value = "连麦状态 1:开启 0:关闭")
+    private Integer linkMic;
+
+    @ApiModelProperty(value = "直播时长")
+    private Integer liveTotalTime;
+
+    @ApiModelProperty(value = "全员闭麦状态 1:开启 0:关闭")
+    private Integer micStatus;
+
+}

+ 56 - 0
cooleshow-user/user-biz/src/main/java/com/yonge/cooleshow/biz/dal/dto/MusicSheetAccompanimentResult.java

@@ -0,0 +1,56 @@
+package com.yonge.cooleshow.biz.dal.dto;
+
+import com.baomidou.mybatisplus.annotation.IdType;
+import com.baomidou.mybatisplus.annotation.TableField;
+import com.baomidou.mybatisplus.annotation.TableId;
+import com.yonge.cooleshow.common.entity.BaseEntity;
+import io.swagger.annotations.ApiModel;
+import io.swagger.annotations.ApiModelProperty;
+import lombok.AllArgsConstructor;
+import lombok.Data;
+import lombok.NoArgsConstructor;
+import lombok.experimental.Accessors;
+import org.apache.commons.lang3.builder.ToStringBuilder;
+
+@Data
+@Accessors(chain = true)
+@AllArgsConstructor
+@NoArgsConstructor
+public class MusicSheetAccompanimentResult extends BaseEntity {
+
+    @ApiModelProperty(value = "主键id")
+    private Long id;  //主键ID
+
+    @ApiModelProperty(value = "曲谱ID")
+    private Long examSongId;  //曲谱ID
+
+    @ApiModelProperty(value = "声部")
+    private String subjectId;  //声部
+
+    @ApiModelProperty(value = "MP3原声音频文件URL")
+    private String mp3Url;  //MP3原声音频文件URL
+
+	@ApiModelProperty(value = "MP3节拍器伴奏")
+	private String metronomeMp3Url;  //MP3原声音频文件URL
+
+	@ApiModelProperty(value = "类型")
+	private String track;  //MP3原声音频文件URL
+
+    @ApiModelProperty(value = "排序号")
+    private Integer sortNumber;  //排序号
+
+    @ApiModelProperty(value = "速度")
+    private Integer speed;  //速度
+
+    @ApiModelProperty(value = "创建时间")
+    private java.util.Date createTime;  //创建时间
+
+    @ApiModelProperty(value = "创建人(老师或者是后台平台用户)")
+    private Long createBy;  //创建人(老师或者是后台平台用户)
+
+    @Override
+    public String toString() {
+        return ToStringBuilder.reflectionToString(this);
+    }
+
+}

+ 34 - 0
cooleshow-user/user-biz/src/main/java/com/yonge/cooleshow/biz/dal/dto/RoomStatusNotify.java

@@ -0,0 +1,34 @@
+package com.yonge.cooleshow.biz.dal.dto;
+
+
+import com.yonge.cooleshow.biz.dal.enums.ClientEnum;
+import io.swagger.annotations.ApiModelProperty;
+import lombok.Data;
+
+@Data
+public class RoomStatusNotify {
+	@ApiModelProperty("房间号")
+	private String roomId;
+
+	@ApiModelProperty("用户编号")
+	private String userId;
+
+	@ApiModelProperty("设备号")
+	private String deviceNum;
+
+	@ApiModelProperty("状态")
+	private boolean requestStatus;
+
+	@ApiModelProperty("客户端类型 ")
+	private ClientEnum clientType;
+
+
+	@Override
+	public String toString() {
+		return "RoomStatusNotify{" +
+				"roomId='" + roomId + '\'' +
+				", userId='" + userId + '\'' +
+				", requestStatus=" + requestStatus +
+				'}';
+	}
+}

+ 522 - 0
cooleshow-user/user-biz/src/main/java/com/yonge/cooleshow/biz/dal/dto/TencentData.java

@@ -0,0 +1,522 @@
+package com.yonge.cooleshow.biz.dal.dto;
+
+import com.alibaba.fastjson.JSON;
+import com.alibaba.fastjson.JSONArray;
+import com.alibaba.fastjson.JSONObject;
+import com.alibaba.fastjson.annotation.JSONField;
+import com.fasterxml.jackson.annotation.JsonProperty;
+import com.yonge.cooleshow.biz.dal.enums.im.ETencentGroupType;
+import com.yonge.cooleshow.biz.dal.enums.im.ETencentImCallbackCommand;
+import io.swagger.annotations.ApiModel;
+import io.swagger.annotations.ApiModelProperty;
+import lombok.AllArgsConstructor;
+import lombok.Builder;
+import lombok.Data;
+import lombok.NoArgsConstructor;
+
+import java.io.Serializable;
+import java.sql.Timestamp;
+import java.time.LocalDateTime;
+import java.util.*;
+
+/**
+ * Description
+ *
+ * @author liujunchi
+ * @date 2023-03-06
+ */
+@NoArgsConstructor
+@Data
+public class TencentData {
+
+    // 群成员离开之后回调对象
+    @NoArgsConstructor
+    @Data
+    public static class CallbackAfterMemberExit {
+
+
+        private String clientIP;
+
+        private String optPlatform;
+
+        // 回调命令
+        private ETencentImCallbackCommand callbackCommand;
+        // 群组 ID
+        private String groupId;
+        // 群组类型
+        private ETencentGroupType type;
+        // 成员离开方式:Kicked-被踢;Quit-主动退群
+        private String exitType;
+        // 操作者
+        private String operatorAccount;
+        // 离开群的成员列表
+        private List<MemberListDTO> exitMemberList;
+        //毫秒级别,事件触发时间戳
+        private LocalDateTime eventTime;
+
+        public static CallbackAfterMemberExit toObject(String jsonString) {
+
+            CallbackAfterMemberExit res = new CallbackAfterMemberExit();
+
+            JSONObject jsonObject = JSON.parseObject(jsonString);
+            res.setCallbackCommand(ETencentImCallbackCommand.valueOf(jsonObject.getString("CallbackCommand").replace(".","_").toUpperCase(
+                Locale.ROOT)));
+            res.setGroupId(jsonObject.getString("GroupId"));
+            res.setType(jsonObject.getObject("Type",ETencentGroupType.class));
+            res.setExitType(jsonObject.getString("ExitType"));
+            res.setOperatorAccount(jsonObject.getString("Operator_Account"));
+
+            JSONArray exitMemberList = jsonObject.getJSONArray("ExitMemberList");
+            if (!exitMemberList.isEmpty()) {
+                List<MemberListDTO> memberListDTOS = new ArrayList<>();
+                for (int i = 0; i < exitMemberList.size(); i++) {
+                    MemberListDTO memberListDTO = new MemberListDTO();
+                    JSONObject exitMemberListJSONObject = exitMemberList.getJSONObject(i);
+                    String member_account = exitMemberListJSONObject.getString("Member_Account");
+                    memberListDTO.setMemberAccount(member_account);
+                    memberListDTOS.add(memberListDTO);
+                }
+                res.setExitMemberList(memberListDTOS);
+            }
+
+
+
+            res.setEventTime(((Timestamp)jsonObject.getTimestamp("EventTime")).toLocalDateTime());
+
+            return res;
+        }
+    }
+
+    @NoArgsConstructor
+    @Data
+    public static class MemberListDTO {
+        private String memberAccount;
+    }
+
+    // 直播群成员在线状态回调
+    @NoArgsConstructor
+    @Data
+    public static class CallbackOnMemberStateChange {
+
+        // 客户端平台,对应不同的平台类型,可能的取值有:
+        // RESTAPI(使用 REST API 发送请求)、Web(使用 Web SDK 发送请求)、
+        // Android、iOS、Windows、Mac、iPad、Unknown(使用未知类型的设备发送请求)
+        private String clientIP;
+
+        private String optPlatform;
+        // 回调命令
+        private ETencentImCallbackCommand callbackCommand;
+        // 群组 ID
+        private String groupId;
+        // 事件类型:Offline - 掉线、Online - 重新上线
+        private String eventType;
+        // 离开群的成员列表
+        private List<MemberListDTO> memberList;
+
+        private Long eventTime;
+
+        public static CallbackOnMemberStateChange toObject(String jsonString) {
+
+            CallbackOnMemberStateChange res = new CallbackOnMemberStateChange();
+
+            JSONObject jsonObject = JSON.parseObject(jsonString);
+            res.setCallbackCommand(ETencentImCallbackCommand.valueOf(jsonObject.getString("CallbackCommand").replace(".","_").toUpperCase(
+                Locale.ROOT)));
+            res.setGroupId(jsonObject.getString("GroupId"));
+
+            JSONArray exitMemberList = jsonObject.getJSONArray("MemberList");
+            if (!exitMemberList.isEmpty()) {
+                List<MemberListDTO> memberListDTOS = new ArrayList<>();
+                for (int i = 0; i < exitMemberList.size(); i++) {
+                    MemberListDTO memberListDTO = new MemberListDTO();
+                    JSONObject exitMemberListJSONObject = exitMemberList.getJSONObject(i);
+                    String member_account = exitMemberListJSONObject.getString("Member_Account");
+                    memberListDTO.setMemberAccount(member_account);
+                    memberListDTOS.add(memberListDTO);
+                }
+                res.setMemberList(memberListDTOS);
+            }
+
+            res.setEventType(jsonObject.getString("EventType"));
+            res.setEventTime(Optional.ofNullable(jsonObject.getLong("EventTime")).orElse(new Date().getTime()));
+
+            return res;
+        }
+    }
+
+    @NoArgsConstructor
+    @Data
+    public static class CallbackAfterNewMemberJoin {
+
+        private String clientIP;
+
+        private String optPlatform;
+        // 回调命令
+        private ETencentImCallbackCommand callbackCommand;
+        // 群组 ID
+        private String groupId;
+        // 群组类型
+        private ETencentGroupType type;
+        // 入群方式:Apply(申请入群);Invited(邀请入群)
+        private String joinType;
+        // 操作者成员
+        private String operatorAccount;
+        // 新入群成员列表
+        private List<MemberListDTO> newMemberList;
+        //毫秒级别,事件触发时间戳
+        private LocalDateTime eventTime;
+
+        public static CallbackAfterNewMemberJoin toObject(String jsonString) {
+
+            CallbackAfterNewMemberJoin res = new CallbackAfterNewMemberJoin();
+
+            JSONObject jsonObject = JSON.parseObject(jsonString);
+            res.setCallbackCommand(ETencentImCallbackCommand.valueOf(jsonObject.getString("CallbackCommand").replace(".","_").toUpperCase(
+                Locale.ROOT)));
+            res.setGroupId(jsonObject.getString("GroupId"));
+            res.setType(jsonObject.getObject("Type",ETencentGroupType.class));
+            res.setJoinType(jsonObject.getString("JoinType"));
+            res.setOperatorAccount(jsonObject.getString("Operator_Account"));
+
+            JSONArray exitMemberList = jsonObject.getJSONArray("NewMemberList");
+            if (!exitMemberList.isEmpty()) {
+                List<MemberListDTO> memberListDTOS = new ArrayList<>();
+                for (int i = 0; i < exitMemberList.size(); i++) {
+                    MemberListDTO memberListDTO = new MemberListDTO();
+                    JSONObject exitMemberListJSONObject = exitMemberList.getJSONObject(i);
+                    String member_account = exitMemberListJSONObject.getString("Member_Account");
+                    memberListDTO.setMemberAccount(member_account);
+                    memberListDTOS.add(memberListDTO);
+                }
+                res.setNewMemberList(memberListDTOS);
+            }
+
+
+            res.setEventTime(((Timestamp)jsonObject.getTimestamp("EventTime")).toLocalDateTime());
+
+            return res;
+        }
+    }
+
+    @Data
+    @Builder
+    @NoArgsConstructor
+    @AllArgsConstructor
+    @ApiModel("推断流事件回调通知")
+    public static class CallbackStreamStateEvent implements Serializable {
+
+
+        @ApiModelProperty("推流域名")
+        @JSONField(name = "app")
+        private String app;
+
+        @ApiModelProperty("用户 APPID")
+        @JSONField(name = "appid")
+        private Integer appid;
+
+        @ApiModelProperty("推流路径")
+        @JSONField(name = "appname")
+        private String appname;
+
+        @ApiModelProperty("同直播流名称")
+        @JSONField(name = "channel_id")
+        private String channelId;
+
+        @ApiModelProperty("断流事件通知推流时长,单位毫秒")
+        @JSONField(name = "push_duration")
+        private String pushDuration;
+
+        @ApiModelProperty("推断流错误码")
+        @JSONField(name = "errcode")
+        private Integer errcode;
+
+        @ApiModelProperty("推断流错误描述")
+        @JSONField(name = "errmsg")
+        private String errmsg;
+
+        @ApiModelProperty("事件消息产生的 UNIX 时间戳")
+        @JSONField(name = "event_time")
+        private Integer eventTime;
+
+        @ApiModelProperty("事件类型: 推流:1;断流:0")
+        @JSONField(name = "event_type")
+        private Integer eventType;
+
+        @ApiModelProperty("判断是否为国内外推流。1-6为国内,7-200为国外")
+        @JSONField(name = "set_id")
+        private Integer setId;
+
+        @ApiModelProperty("直播接入点的 IP")
+        @JSONField(name = "node")
+        private String node;
+
+        @ApiModelProperty("消息序列号,标识一次推流活动,一次推流活动会产生相同序列号的推流和断流消息")
+        @JSONField(name = "sequence")
+        private String sequence;
+
+        @ApiModelProperty("直播流名称")
+        @JSONField(name = "stream_id")
+        private String streamId;
+
+        @ApiModelProperty("用户推流 URL 所带参数")
+        @JSONField(name = "stream_param")
+        private String streamParam;
+
+        @ApiModelProperty("用户推流 IP")
+        @JSONField(name = "user_ip")
+        private String userIp;
+
+        @ApiModelProperty("视频宽度,最开始推流回调的时候若视频头部信息缺失,可能为0")
+        @JSONField(name = "width")
+        private Integer width;
+
+        @ApiModelProperty("视频高度,最开始推流回调的时候若视频头部信息缺失,可能为0")
+        @JSONField(name = "height")
+        private Integer height;
+
+        @ApiModelProperty("事件通知安全签名 sign = MD5(key + t)")
+        @JSONField(name = "sign")
+        private String sign;
+
+        @ApiModelProperty("过期时间,事件通知签名过期 UNIX 时间戳")
+        @JSONField(name = "t")
+        private Integer t;
+
+        public static CallbackStreamStateEvent from(String jsonString) {
+            return JSON.parseObject(jsonString, CallbackStreamStateEvent.class);
+        }
+    }
+
+    @Data
+    @Builder
+    @NoArgsConstructor
+    @AllArgsConstructor
+    @ApiModel("流录制事件回调通知")
+    public static class CallbackSteamRecordEvent implements Serializable {
+
+        @ApiModelProperty("事件类型:直播录制: 100")
+        @JSONField(name = "event_type")
+        private Integer eventType;
+
+        @ApiModelProperty("用户 APPID")
+        @JSONField(name = "appid")
+        private Integer appid;
+
+        @ApiModelProperty("推流域名")
+        @JSONField(name = "app")
+        private String app;
+
+        @ApiModelProperty("json对象字符串,用户自定义数据")
+        @JSONField(name = "callback_ext")
+        private String callbackExt;
+
+        @ApiModelProperty("推流路径")
+        @JSONField(name = "appname")
+        private String appname;
+
+        @ApiModelProperty("直播流名称")
+        @JSONField(name = "stream_id")
+        private String streamId;
+
+        @ApiModelProperty("同直播流名称")
+        @JSONField(name = "channel_id")
+        private String channelId;
+
+        @ApiModelProperty("点播 file ID,在 云点播平台 可以唯一定位一个点播视频文件")
+        @JSONField(name = "file_id")
+        private String fileId;
+
+        @ApiModelProperty("点播文件ID")
+        @JSONField(name = "record_file_id")
+        private String recordFileId;
+
+        @ApiModelProperty("文件格式: FLV,HLS,MP4,AAC")
+        @JSONField(name = "file_format")
+        private String fileFormat;
+
+        @ApiModelProperty("录制任务 ID")
+        @JSONField(name = "task_id")
+        private String taskId;
+
+        @ApiModelProperty("录制任务开始写文件的时间;不能以该值作为录制内容的开始时间,录制内容的开始时间 = end_time – duration")
+        @JSONField(name = "start_time")
+        private Integer startTime;
+
+        @ApiModelProperty("录制任务结束写文件的时间")
+        @JSONField(name = "end_time")
+        private Integer endTime;
+
+        @ApiModelProperty("录制任务开始写文件的时间,微秒部分")
+        @JSONField(name = "start_time_usec")
+        private Integer startTimeUsec;
+
+        @ApiModelProperty("录制任务结束写文件的时间,微秒部分")
+        @JSONField(name = "end_time_usec")
+        private Integer endTimeUsec;
+
+        @ApiModelProperty("录制文件时长,单位秒")
+        @JSONField(name = "duration")
+        private Integer duration;
+
+        @ApiModelProperty("录制文件大小,单位字节")
+        @JSONField(name = "file_size")
+        private Integer fileSize;
+
+        @ApiModelProperty("用户推流 URL 所带参数(自定义)")
+        @JSONField(name = "stream_param")
+        private String streamParam;
+
+        @ApiModelProperty("录制文件下载 URL")
+        @JSONField(name = "video_url")
+        private String videoUrl;
+
+        @ApiModelProperty("录制开始拉流收到的首帧 pts ")
+        @JSONField(name = "media_start_time")
+        private Integer mediaStartTime;
+
+        @ApiModelProperty("录制从转码拉流录制对应的码率(单位 kbps)")
+        @JSONField(name = "record_bps")
+        private Integer recordBps;
+
+        @ApiModelProperty("事件通知安全签名 sign = MD5(key + t)")
+        @JSONField(name = "sign")
+        private String sign;
+
+        @ApiModelProperty("过期时间,事件通知签名过期 UNIX 时间戳")
+        @JSONField(name = "t")
+        private Integer t;
+
+
+        public static CallbackSteamRecordEvent from(String json) {
+            return JSON.parseObject(json, CallbackSteamRecordEvent.class);
+        }
+    }
+
+    @Data
+    @NoArgsConstructor
+    @AllArgsConstructor
+    @ApiModel("流异常事件回调通知")
+    public static class CallbackStreamExceptionEvent implements Serializable {
+
+        @ApiModelProperty("用户 APPID")
+        @JSONField(name = "appid")
+        private Integer appid;
+
+        @ApiModelProperty("推流事件回调时间(单位ms)")
+        @JSONField(name = "data_time")
+        private Long dataTime;
+
+        @ApiModelProperty("推流域名")
+        @JSONField(name = "domain")
+        private String domain;
+
+        @ApiModelProperty("事件类型:推流异常:321")
+        @JSONField(name = "event_type")
+        private Integer eventType;
+
+        @JSONField(name = "interface")
+        private String interfaceX;
+        @JSONField(name = "path")
+        private String path;
+
+        @ApiModelProperty("有异常事件时,上报间隔(单位ms)")
+        @JSONField(name = "report_interval")
+        private Integer reportInterval;
+
+        @JSONField(name = "sequence")
+        private String sequence;
+
+        @ApiModelProperty("直播流名称")
+        @JSONField(name = "stream_id")
+        private String streamId;
+
+        @ApiModelProperty("用户推流 URL 所带参数")
+        @JSONField(name = "stream_param")
+        private String streamParam;
+
+        @JSONField(name = "timeout")
+        private Integer timeout;
+
+        @ApiModelProperty("详细异常事件事件组")
+        @JSONField(name = "abnormal_event")
+        private String abnormalEvent;
+
+        public static CallbackStreamExceptionEvent from(String json) {
+            return JSON.parseObject(json, CallbackStreamExceptionEvent.class);
+        }
+    }
+
+    @Data
+    @Builder
+    @NoArgsConstructor
+    @AllArgsConstructor
+    @ApiModel("流事件回调结果")
+    public static class StreamEventCallbackResult implements Serializable {
+
+        @ApiModelProperty("事件响应状态")
+        private Integer code;
+    }
+
+
+    @Data
+    @NoArgsConstructor
+    @AllArgsConstructor
+    @ApiModel("腾讯云回调事件")
+    public static class TRTCEventInfo implements Serializable {
+
+        @JsonProperty("EventGroupId")
+        @ApiModelProperty("事件组")
+        private Integer eventGroupId;
+
+        @JsonProperty("EventType")
+        @ApiModelProperty("事件类型")
+        private Integer eventType;
+
+        @JsonProperty("CallbackTs")
+        @ApiModelProperty("事件时间")
+        private Long callbackTs;
+
+        @JsonProperty("EventInfo")
+        @ApiModelProperty("事件消息")
+        private EventInfo eventInfo;
+
+        public String jsonString() {
+            return JSON.toJSONString(this);
+        }
+    }
+
+    @Data
+    @NoArgsConstructor
+    @AllArgsConstructor
+    @ApiModel("事件消息")
+    public static class EventInfo implements Serializable {
+
+        @JsonProperty("RoomId")
+        @ApiModelProperty("房间号")
+        private String roomId;
+
+        @JsonProperty("EventTs")
+        @ApiModelProperty("事件发生时间")
+        private Long eventTs;
+
+        @JsonProperty("UserId")
+        @ApiModelProperty("事件发生用户")
+        private String userId;
+
+        @JsonProperty("Role")
+        @ApiModelProperty("用户角色")
+        private String role;
+
+        @JsonProperty("TerminalType")
+        @ApiModelProperty("终端类型")
+        private String terminalType;
+
+        @JsonProperty("UserType")
+        @ApiModelProperty("用户类型")
+        private String userType;
+
+        @JsonProperty("Reason")
+        @ApiModelProperty("原因")
+        private String reason;
+    }
+}

+ 45 - 0
cooleshow-user/user-biz/src/main/java/com/yonge/cooleshow/biz/dal/dto/TencentImCallbackResult.java

@@ -0,0 +1,45 @@
+package com.yonge.cooleshow.biz.dal.dto;
+
+import com.alibaba.fastjson.annotation.JSONField;
+
+/**
+ * Description
+ *
+ * @author liujunchi
+ * @date 2023-03-02
+ */
+public class TencentImCallbackResult {
+
+    @JSONField(name = "ActionStatus")
+    private String ActionStatus = "OK";
+
+    @JSONField(name = "ErrorInfo")
+    private String ErrorInfo;
+
+    @JSONField(name = "ErrorCode")
+    private int ErrorCode = 0;
+
+    public String getActionStatus() {
+        return ActionStatus;
+    }
+
+    public void setActionStatus(String actionStatus) {
+        ActionStatus = actionStatus;
+    }
+
+    public String getErrorInfo() {
+        return ErrorInfo;
+    }
+
+    public void setErrorInfo(String errorInfo) {
+        ErrorInfo = errorInfo;
+    }
+
+    public int getErrorCode() {
+        return ErrorCode;
+    }
+
+    public void setErrorCode(int errorCode) {
+        ErrorCode = errorCode;
+    }
+}

+ 3 - 191
cooleshow-user/user-biz/src/main/java/com/yonge/cooleshow/biz/dal/entity/CourseGroup.java

@@ -7,6 +7,7 @@ import com.baomidou.mybatisplus.annotation.TableId;
 import com.yonge.cooleshow.common.enums.YesOrNoEnum;
 import io.swagger.annotations.ApiModel;
 import io.swagger.annotations.ApiModelProperty;
+import lombok.Data;
 
 import java.io.Serializable;
 import java.math.BigDecimal;
@@ -18,6 +19,8 @@ import java.util.Date;
  * @author hgw
  * @since 2022-03-23 14:35:19
  */
+
+@Data
 @ApiModel(value = "course_group-课程组表")
 public class CourseGroup implements Serializable {
     @TableId(value = "id_", type = IdType.AUTO)
@@ -116,196 +119,5 @@ public class CourseGroup implements Serializable {
     @ApiModelProperty(value = "更新时间")
     private Date updatedTime;
 
-    public String getReason() {
-        return reason;
-    }
-
-    public void setReason(String reason) {
-        this.reason = reason;
-    }
-
-    public Long getId() {
-        return id;
-    }
-
-    public void setId(Long id) {
-        this.id = id;
-    }
-
-    public String getType() {
-        return type;
-    }
-
-    public void setType(String type) {
-        this.type = type;
-    }
-
-    public Long getTeacherId() {
-        return teacherId;
-    }
-
-    public void setTeacherId(Long teacherId) {
-        this.teacherId = teacherId;
-    }
-
-    public String getName() {
-        return name;
-    }
-
-    public void setName(String name) {
-        this.name = name;
-    }
-
-    public Long getSubjectId() {
-        return subjectId;
-    }
-
-    public void setSubjectId(Long subjectId) {
-        this.subjectId = subjectId;
-    }
-
-    public Integer getSingleCourseMinutes() {
-        return singleCourseMinutes;
-    }
-
-    public void setSingleCourseMinutes(Integer singleCourseMinutes) {
-        this.singleCourseMinutes = singleCourseMinutes;
-    }
-
-    public Integer getCourseNum() {
-        return courseNum;
-    }
-
-    public void setCourseNum(Integer courseNum) {
-        this.courseNum = courseNum;
-    }
-
-    public String getCourseIntroduce() {
-        return courseIntroduce;
-    }
-
-    public void setCourseIntroduce(String courseIntroduce) {
-        this.courseIntroduce = courseIntroduce;
-    }
-
-    public BigDecimal getCoursePrice() {
-        return coursePrice;
-    }
-
-    public void setCoursePrice(BigDecimal coursePrice) {
-        this.coursePrice = coursePrice;
-    }
-
-    public String getStatus() {
-        return status;
-    }
-
-    public void setStatus(String status) {
-        this.status = status;
-    }
-
-    public Date getSalesStartDate() {
-        return salesStartDate;
-    }
-
-    public void setSalesStartDate(Date salesStartDate) {
-        this.salesStartDate = salesStartDate;
-    }
-
-    public Date getSalesEndDate() {
-        return salesEndDate;
-    }
-
-    public void setSalesEndDate(Date salesEndDate) {
-        this.salesEndDate = salesEndDate;
-    }
-
-    public String getBackgroundPic() {
-        return backgroundPic;
-    }
-
-    public void setBackgroundPic(String backgroundPic) {
-        this.backgroundPic = backgroundPic;
-    }
-
-    public Integer getMixStudentNum() {
-        return mixStudentNum;
-    }
-
-    public void setMixStudentNum(Integer mixStudentNum) {
-        this.mixStudentNum = mixStudentNum;
-    }
-
-    public Integer getPreStudentNum() {
-        return preStudentNum;
-    }
-
-    public void setPreStudentNum(Integer preStudentNum) {
-        this.preStudentNum = preStudentNum;
-    }
-
-    public String getImGroupId() {
-        return imGroupId;
-    }
-
-    public void setImGroupId(String imGroupId) {
-        this.imGroupId = imGroupId;
-    }
-
-    public Date getCourseStartTime() {
-        return courseStartTime;
-    }
-
-    public void setCourseStartTime(Date courseStartTime) {
-        this.courseStartTime = courseStartTime;
-    }
-
-    public Long getCreatedBy() {
-        return createdBy;
-    }
-
-    public void setCreatedBy(Long createdBy) {
-        this.createdBy = createdBy;
-    }
-
-    public Date getCreatedTime() {
-        return createdTime;
-    }
-
-    public void setCreatedTime(Date createdTime) {
-        this.createdTime = createdTime;
-    }
-
-    public Long getUpdatedBy() {
-        return updatedBy;
-    }
-
-    public void setUpdatedBy(Long updatedBy) {
-        this.updatedBy = updatedBy;
-    }
-
-    public Date getUpdatedTime() {
-        return updatedTime;
-    }
-
-    public void setUpdatedTime(Date updatedTime) {
-        this.updatedTime = updatedTime;
-    }
-
-    public Integer getCompleteCourseNum() {
-        return completeCourseNum;
-    }
-
-    public void setCompleteCourseNum(Integer completeCourseNum) {
-        this.completeCourseNum = completeCourseNum;
-    }
-
-    public YesOrNoEnum getAuditVersion() {
-        return auditVersion;
-    }
-
-    public void setAuditVersion(YesOrNoEnum auditVersion) {
-        this.auditVersion = auditVersion;
-    }
 }
 

+ 18 - 216
cooleshow-user/user-biz/src/main/java/com/yonge/cooleshow/biz/dal/entity/CourseSchedule.java

@@ -5,6 +5,7 @@ import com.baomidou.mybatisplus.annotation.TableField;
 import com.baomidou.mybatisplus.annotation.TableId;
 import io.swagger.annotations.ApiModel;
 import io.swagger.annotations.ApiModelProperty;
+import lombok.Data;
 
 import java.io.Serializable;
 import java.util.Date;
@@ -15,6 +16,7 @@ import java.util.Date;
  * @author hgw
  * @since 2022-03-23 14:35:20
  */
+@Data
 @ApiModel(value = "course_schedule-老师课程表")
 public class CourseSchedule implements Serializable {
     @TableId(value = "id_", type = IdType.AUTO)
@@ -25,6 +27,10 @@ public class CourseSchedule implements Serializable {
     @ApiModelProperty(value = "课程组id_")
     private Long courseGroupId;
 
+    @TableField("room_uid_")
+    @ApiModelProperty(value = "房间编号 直播课直播房间号")
+    private String roomUid;
+
     @TableField("type_")
     @ApiModelProperty(value = "类型 practice陪练课 live直播课  CourseScheduleEnum")
     private String type;
@@ -85,225 +91,21 @@ public class CourseSchedule implements Serializable {
     @ApiModelProperty(value = "更新时间")
     private Date updatedTime;
 
-    public Integer getSingleCourseTime() {
-        return singleCourseTime;
-    }
-
-    public void setSingleCourseTime(Integer singleCourseTime) {
-        this.singleCourseTime = singleCourseTime;
-    }
-
-    public static CourseSchedule build() {
-        return new CourseSchedule();
-    }
-
-    public Long getId() {
-        return id;
-    }
-
-    public void setId(Long id) {
-        this.id = id;
-    }
-
-    public CourseSchedule id(Long id) {
-        this.id = id;
-        return this;
-    }
-
-    public String getType() {
-        return type;
-    }
-
-    public void setType(String type) {
-        this.type = type;
-    }
-
-    public CourseSchedule type(String type) {
-        this.type = type;
-        return this;
-    }
-
-    public Long getTeacherId() {
-        return teacherId;
-    }
-
-    public void setTeacherId(Long teacherId) {
-        this.teacherId = teacherId;
-    }
-
-    public CourseSchedule teacherId(Long teacherId) {
-        this.teacherId = teacherId;
-        return this;
-    }
-
-    public Date getClassDate() {
-        return classDate;
-    }
-
-    public void setClassDate(Date classDate) {
-        this.classDate = classDate;
-    }
-
-    public CourseSchedule classDate(Date classDate) {
-        this.classDate = classDate;
-        return this;
-    }
-
-    public String getStatus() {
-        return status;
-    }
-
-    public void setStatus(String status) {
-        this.status = status;
-    }
-
-    public CourseSchedule status(String status) {
-        this.status = status;
-        return this;
-    }
-
-    public Long getCourseGroupId() {
-        return courseGroupId;
-    }
-
-    public void setCourseGroupId(Long courseGroupId) {
-        this.courseGroupId = courseGroupId;
-    }
-
-    public CourseSchedule courseGroupId(Long courseGroupId) {
-        this.courseGroupId = courseGroupId;
-        return this;
-    }
-
-    public Integer getClassNum() {
-        return classNum;
-    }
-
-    public void setClassNum(Integer classNum) {
-        this.classNum = classNum;
-    }
-
-    public CourseSchedule classNum(Integer classNum) {
-        this.classNum = classNum;
-        return this;
-    }
-
-    public Date getStartTime() {
-        return startTime;
-    }
-
-    public void setStartTime(Date startTime) {
-        this.startTime = startTime;
-    }
-
-    public CourseSchedule startTime(Date startTime) {
-        this.startTime = startTime;
-        return this;
-    }
-
-    public Date getEndTime() {
-        return endTime;
-    }
-
-    public void setEndTime(Date endTime) {
-        this.endTime = endTime;
-    }
-
-    public CourseSchedule endTime(Date endTime) {
-        this.endTime = endTime;
-        return this;
-    }
-
-    public Integer getLock() {
-        return lock;
-    }
-
-    public void setLock(Integer lock) {
-        this.lock = lock;
-    }
-
-    public CourseSchedule lock(Integer lock) {
-        this.lock = lock;
-        return this;
-    }
-
-    public Date getLockTime() {
-        return lockTime;
-    }
-
-    public void setLockTime(Date lockTime) {
-        this.lockTime = lockTime;
-    }
-
-    public CourseSchedule lockTime(Date lockTime) {
-        this.lockTime = lockTime;
-        return this;
-    }
-
-    public Integer getExStudentNum() {
-        return exStudentNum;
-    }
-
-    public void setExStudentNum(Integer exStudentNum) {
-        this.exStudentNum = exStudentNum;
-    }
-
-    public CourseSchedule exStudentNum(Integer exStudentNum) {
-        this.exStudentNum = exStudentNum;
-        return this;
-    }
-
-    public Long getCreatedBy() {
-        return createdBy;
-    }
-
-    public void setCreatedBy(Long createdBy) {
-        this.createdBy = createdBy;
-    }
-
-    public CourseSchedule createdBy(Long createdBy) {
-        this.createdBy = createdBy;
-        return this;
-    }
-
-    public Date getCreatedTime() {
-        return createdTime;
-    }
-
-    public void setCreatedTime(Date createdTime) {
-        this.createdTime = createdTime;
-    }
-
-    public CourseSchedule createdTime(Date createdTime) {
-        this.createdTime = createdTime;
-        return this;
-    }
-
-    public Long getUpdatedBy() {
-        return updatedBy;
-    }
-
-    public void setUpdatedBy(Long updatedBy) {
-        this.updatedBy = updatedBy;
-    }
-
-    public CourseSchedule updatedBy(Long updatedBy) {
-        this.updatedBy = updatedBy;
-        return this;
-    }
+    @TableField("service_provider_")
+    @ApiModelProperty("服务提供方")
+    private String serviceProvider = "tencentCloud";
 
-    public Date getUpdatedTime() {
-        return updatedTime;
-    }
+    @TableField("room_id_")
+    @ApiModelProperty("房间号")
+    private String roomId;
 
-    public void setUpdatedTime(Date updatedTime) {
-        this.updatedTime = updatedTime;
-    }
+    @ApiModelProperty("全员静音")
+    @TableField("mute_all_")
+    private Boolean muteAll;
 
-    public CourseSchedule updatedTime(Date updatedTime) {
-        this.updatedTime = updatedTime;
-        return this;
-    }
+    @ApiModelProperty("是否允许用户自行解除静音")
+    @TableField("cancel_mute_flag_")
+    private Boolean cancelMuteFlag = true;
 
 }
 

+ 6 - 94
cooleshow-user/user-biz/src/main/java/com/yonge/cooleshow/biz/dal/entity/CourseScheduleStudentMusicSheet.java

@@ -1,15 +1,15 @@
 package com.yonge.cooleshow.biz.dal.entity;
 
 
-import java.util.Date;
-
 import com.baomidou.mybatisplus.annotation.IdType;
 import com.baomidou.mybatisplus.annotation.TableField;
+import com.baomidou.mybatisplus.annotation.TableId;
 import io.swagger.annotations.ApiModel;
 import io.swagger.annotations.ApiModelProperty;
-import com.baomidou.mybatisplus.annotation.TableId;
+import lombok.Data;
 
 import java.io.Serializable;
+import java.util.Date;
 
 /**
  * (CourseScheduleStudentMusicSheet)表实体类
@@ -17,6 +17,7 @@ import java.io.Serializable;
  * @author zx
  * @since 2022-04-02 15:56:01
  */
+@Data
 @ApiModel(value = "course_schedule_student_music_sheet-${tableInfo.comment}")
 public class CourseScheduleStudentMusicSheet implements Serializable {
     @TableId(value = "id_", type = IdType.AUTO)
@@ -37,7 +38,7 @@ public class CourseScheduleStudentMusicSheet implements Serializable {
 
     @TableField("music_sheet_accompaniment_id_")
     @ApiModelProperty(value = "伴奏编号")
-    private Long musicSheetAccompanimentId;
+    private Long musicScoreAccompanimentId;
 
     @TableField("play_status_")
     @ApiModelProperty(value = "原音播放状态(1是0否)")
@@ -49,7 +50,7 @@ public class CourseScheduleStudentMusicSheet implements Serializable {
 
     @TableField("user_type_")
     @ApiModelProperty(value = "0学生1老师")
-    private Integer userType = 0;
+    private Integer userType;
 
     @TableField("speed_")
     @ApiModelProperty(value = "播放速度")
@@ -63,94 +64,5 @@ public class CourseScheduleStudentMusicSheet implements Serializable {
     @ApiModelProperty(value = "${column.comment}")
     private Date updateTime;
 
-
-    public Long getId() {
-        return id;
-    }
-
-    public void setId(Long id) {
-        this.id = id;
-    }
-
-    public Long getCourseScheduleId() {
-        return courseScheduleId;
-    }
-
-    public void setCourseScheduleId(Long courseScheduleId) {
-        this.courseScheduleId = courseScheduleId;
-    }
-
-    public Long getUserId() {
-        return userId;
-    }
-
-    public void setUserId(Long userId) {
-        this.userId = userId;
-    }
-
-    public Integer getDownStatus() {
-        return downStatus;
-    }
-
-    public void setDownStatus(Integer downStatus) {
-        this.downStatus = downStatus;
-    }
-
-    public Long getMusicSheetAccompanimentId() {
-        return musicSheetAccompanimentId;
-    }
-
-    public void setMusicSheetAccompanimentId(Long musicSheetAccompanimentId) {
-        this.musicSheetAccompanimentId = musicSheetAccompanimentId;
-    }
-
-    public Integer getPlayStatus() {
-        return playStatus;
-    }
-
-    public void setPlayStatus(Integer playStatus) {
-        this.playStatus = playStatus;
-    }
-
-    public Integer getAccompanimentPlayStatus() {
-        return accompanimentPlayStatus;
-    }
-
-    public void setAccompanimentPlayStatus(Integer accompanimentPlayStatus) {
-        this.accompanimentPlayStatus = accompanimentPlayStatus;
-    }
-
-    public Integer getUserType() {
-        return userType;
-    }
-
-    public void setUserType(Integer userType) {
-        this.userType = userType;
-    }
-
-    public Integer getSpeed() {
-        return speed;
-    }
-
-    public void setSpeed(Integer speed) {
-        this.speed = speed;
-    }
-
-    public Date getCreateTime() {
-        return createTime;
-    }
-
-    public void setCreateTime(Date createTime) {
-        this.createTime = createTime;
-    }
-
-    public Date getUpdateTime() {
-        return updateTime;
-    }
-
-    public void setUpdateTime(Date updateTime) {
-        this.updateTime = updateTime;
-    }
-
 }
 

+ 2 - 112
cooleshow-user/user-biz/src/main/java/com/yonge/cooleshow/biz/dal/entity/CourseScheduleStudentPayment.java

@@ -6,6 +6,7 @@ import com.baomidou.mybatisplus.annotation.TableField;
 import com.baomidou.mybatisplus.annotation.TableId;
 import io.swagger.annotations.ApiModel;
 import io.swagger.annotations.ApiModelProperty;
+import lombok.Data;
 
 import java.io.Serializable;
 import java.math.BigDecimal;
@@ -17,6 +18,7 @@ import java.util.Date;
  * @author hgw
  * @since 2022-03-23 14:35:20
  */
+@Data
 @ApiModel(value = "course_schedule_student_payment-课程学生缴费表")
 public class CourseScheduleStudentPayment implements Serializable {
     @TableId(value = "id_", type = IdType.AUTO)
@@ -63,117 +65,5 @@ public class CourseScheduleStudentPayment implements Serializable {
     @ApiModelProperty(value = "类型 practice陪练课 live直播课")
     private String courseType;
 
-    @TableField("play_midi_")
-    @ApiModelProperty(value = "网络教室节拍器参数")
-    private String playMidi;
-
-    @TableField("music_sheet_download_json_")
-    @ApiModelProperty(value = "网络教室当前课程曲目下载信息")
-    private String musicSheetDownloadJson;
-
-    public String getMusicSheetDownloadJson() {
-        return musicSheetDownloadJson;
-    }
-
-    public void setMusicSheetDownloadJson(String musicSheetDownloadJson) {
-        this.musicSheetDownloadJson = musicSheetDownloadJson;
-    }
-
-    public String getPlayMidi() {
-        return playMidi;
-    }
-
-    public void setPlayMidi(String playMidi) {
-        this.playMidi = playMidi;
-    }
-
-    public Long getId() {
-        return id;
-    }
-
-    public void setId(Long id) {
-        this.id = id;
-    }
-
-    public Long getUserId() {
-        return userId;
-    }
-
-    public void setUserId(Long userId) {
-        this.userId = userId;
-    }
-
-    public Long getCourseGroupId() {
-        return courseGroupId;
-    }
-
-    public void setCourseGroupId(Long courseGroupId) {
-        this.courseGroupId = courseGroupId;
-    }
-
-    public Long getCourseId() {
-        return courseId;
-    }
-
-    public void setCourseId(Long courseId) {
-        this.courseId = courseId;
-    }
-
-    public String getOrderNo() {
-        return orderNo;
-    }
-
-    public void setOrderNo(String orderNo) {
-        this.orderNo = orderNo;
-    }
-
-    public BigDecimal getOriginalPrice() {
-        return originalPrice;
-    }
-
-    public void setOriginalPrice(BigDecimal originalPrice) {
-        this.originalPrice = originalPrice;
-    }
-
-    public BigDecimal getExpectPrice() {
-        return expectPrice;
-    }
-
-    public void setExpectPrice(BigDecimal expectPrice) {
-        this.expectPrice = expectPrice;
-    }
-
-    public BigDecimal getActualPrice() {
-        return actualPrice;
-    }
-
-    public void setActualPrice(BigDecimal actualPrice) {
-        this.actualPrice = actualPrice;
-    }
-
-    public Date getCreatedTime() {
-        return createdTime;
-    }
-
-    public void setCreatedTime(Date createdTime) {
-        this.createdTime = createdTime;
-    }
-
-    public Date getUpdatedTime() {
-        return updatedTime;
-    }
-
-    public void setUpdatedTime(Date updatedTime) {
-        this.updatedTime = updatedTime;
-    }
-
-    public String getCourseType() {
-        return courseType;
-    }
-
-    public void setCourseType(String courseType) {
-        this.courseType = courseType;
-    }
-
 }
 

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

@@ -87,4 +87,9 @@ public class ImHistoryMessage implements Serializable {
     @ApiModelProperty("App Key")
     @TableField(value = "appId_")
     private String appId;
+
+    @ApiModelProperty("导入状态,1 (已导入)  0(未导入)")
+    @TableField(value = "status_")
+    private Integer status;
+
 }

+ 77 - 0
cooleshow-user/user-biz/src/main/java/com/yonge/cooleshow/biz/dal/entity/ImLiveBroadcastRoomMember.java

@@ -0,0 +1,77 @@
+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 com.baomidou.mybatisplus.annotation.IdType;
+import lombok.Data;
+
+import io.swagger.annotations.ApiModel;
+import io.swagger.annotations.ApiModelProperty;
+
+import java.io.Serializable;
+import java.util.Date;
+
+
+/**
+ * 直播间人员关系表
+ * 2023-08-15 15:50:17
+ */
+@Data
+@ApiModel(" ImLiveBroadcastRoomMember-直播间人员关系表")
+@TableName("im_live_broadcast_room_member")
+public class ImLiveBroadcastRoomMember implements Serializable {
+
+    @ApiModelProperty("主键") 
+	    @TableId(value = "id_", type = IdType.AUTO)
+        private Long id;
+
+    @ApiModelProperty("房间编号") 
+	@TableField(value = "room_uid_")
+    private String roomUid;
+
+    @ApiModelProperty("进入房间的人员id/学生id") 
+	@TableField(value = "user_id_")
+    private Long userId;
+
+    @ApiModelProperty("进入房间时间") 
+	@TableField(value = "join_time_")
+    private Date joinTime;
+
+    @ApiModelProperty("累计观看时间/以分钟为单位") 
+	@TableField(value = "total_time_")
+    private Integer totalTime;
+
+    @ApiModelProperty("在线状态;0离线;1在线") 
+	@TableField(value = "online_status_")
+    private Integer onlineStatus;
+
+    @ApiModelProperty("禁言状态:0取消;1禁言") 
+	@TableField(value = "ban_status_")
+    private Integer banStatus;
+
+    @ApiModelProperty("直播状态: 0离开;1观看") 
+	@TableField(value = "live_room_status_")
+    private Integer liveRoomStatus;
+
+    @ApiModelProperty("连麦状态 0:未申请1:申请连麦中2:连麦中") 
+	@TableField(value = "whether_mic_status_")
+    private Integer whetherMicStatus;
+
+    @ApiModelProperty("是否能上麦:0否;1是") 
+	@TableField(value = "microphone_flag_")
+    private Boolean microphoneFlag;
+
+    @ApiModelProperty("游客凭据") 
+	@TableField(value = "fingerprint_")
+    private String fingerprint;
+
+    @ApiModelProperty("游客名称") 
+	@TableField(value = "visitor_name_")
+    private String visitorName;
+
+    @ApiModelProperty("创建时间") 
+	@TableField(value = "create_time_")
+    private Date createTime;
+
+}

+ 8 - 102
cooleshow-user/user-biz/src/main/java/com/yonge/cooleshow/biz/dal/entity/ImNetworkHereWhite.java

@@ -6,6 +6,9 @@ import com.baomidou.mybatisplus.annotation.TableField;
 import com.baomidou.mybatisplus.annotation.TableId;
 import io.swagger.annotations.ApiModel;
 import io.swagger.annotations.ApiModelProperty;
+import lombok.Data;
+import lombok.Getter;
+import lombok.Setter;
 
 import java.io.Serializable;
 import java.util.Date;
@@ -16,6 +19,7 @@ import java.util.Date;
  * @author zx
  * @since 2022-06-13 18:16:23
  */
+@Data
 @ApiModel(value = "im_network_here_white")
 public class ImNetworkHereWhite implements Serializable {
     @TableId(value = "id_", type = IdType.AUTO)
@@ -70,110 +74,12 @@ public class ImNetworkHereWhite implements Serializable {
     @ApiModelProperty(value = "${column.comment}")
     private Date createdAt;
 
+    @TableField("random_numeric22_")
+    private String randomNumeric22;
 
-    public Integer getId() {
-        return id;
-    }
+    @TableField("random_numeric20_")
+    private String randomNumeric20;
 
-    public void setId(Integer id) {
-        this.id = id;
-    }
-
-    public Long getCourseScheduleId() {
-        return courseScheduleId;
-    }
-
-    public void setCourseScheduleId(Long courseScheduleId) {
-        this.courseScheduleId = courseScheduleId;
-    }
-
-    public String getName() {
-        return name;
-    }
-
-    public void setName(String name) {
-        this.name = name;
-    }
-
-    public Integer getLimit() {
-        return limit;
-    }
-
-    public void setLimit(Integer limit) {
-        this.limit = limit;
-    }
-
-    public Integer getTeamId() {
-        return teamId;
-    }
-
-    public void setTeamId(Integer teamId) {
-        this.teamId = teamId;
-    }
-
-    public Integer getAdminId() {
-        return adminId;
-    }
-
-    public void setAdminId(Integer adminId) {
-        this.adminId = adminId;
-    }
-
-    public String getMode() {
-        return mode;
-    }
-
-    public void setMode(String mode) {
-        this.mode = mode;
-    }
-
-    public String getTemplate() {
-        return template;
-    }
-
-    public void setTemplate(String template) {
-        this.template = template;
-    }
-
-    public String getRegion() {
-        return region;
-    }
-
-    public void setRegion(String region) {
-        this.region = region;
-    }
-
-    public String getRoomToken() {
-        return roomToken;
-    }
-
-    public void setRoomToken(String roomToken) {
-        this.roomToken = roomToken;
-    }
-
-    public String getUuid() {
-        return uuid;
-    }
-
-    public void setUuid(String uuid) {
-        this.uuid = uuid;
-    }
-
-    public Date getUpdatedAt() {
-        return updatedAt;
-    }
-
-    public void setUpdatedAt(Date updatedAt) {
-        this.updatedAt = updatedAt;
-    }
-
-    public Date getCreatedAt() {
-        return createdAt;
-    }
-
-    public void setCreatedAt(Date createdAt) {
-        this.createdAt = createdAt;
-    }
 
 }
 

+ 2 - 60
cooleshow-user/user-biz/src/main/java/com/yonge/cooleshow/biz/dal/entity/ImNetworkRoom.java

@@ -8,6 +8,7 @@ import com.baomidou.mybatisplus.annotation.TableField;
 import io.swagger.annotations.ApiModel;
 import io.swagger.annotations.ApiModelProperty;
 import com.baomidou.mybatisplus.annotation.TableId;
+import lombok.Data;
 
 import java.io.Serializable;
 
@@ -17,6 +18,7 @@ import java.io.Serializable;
  * @author zx
  * @since 2022-03-30 16:36:36
  */
+@Data
 @ApiModel(value = "im_network_room-网络教室房间")
 public class ImNetworkRoom implements Serializable {
     @TableId(value = "id_", type = IdType.AUTO)
@@ -27,10 +29,6 @@ public class ImNetworkRoom implements Serializable {
     @ApiModelProperty(value = "房间编号;")
     private String roomId;
 
-    @TableField("course_schedule_id_")
-    @ApiModelProperty(value = "课程编号")
-    private Long courseScheduleId;
-
     @TableField("display_")
     @ApiModelProperty(value = "用于移动端房间渲染")
     //type 1老师0助教
@@ -48,61 +46,5 @@ public class ImNetworkRoom implements Serializable {
     @ApiModelProperty(value = "创建时间;")
     private Date createTime;
 
-    public Integer getSoundVolume() {
-        return soundVolume;
-    }
-
-    public void setSoundVolume(Integer soundVolume) {
-        this.soundVolume = soundVolume;
-    }
-
-    public String getDisplay() {
-        return display;
-    }
-
-    public void setDisplay(String display) {
-        this.display = display;
-    }
-
-    public Long getId() {
-        return id;
-    }
-
-    public void setId(Long id) {
-        this.id = id;
-    }
-
-    public String getRoomId() {
-        return roomId;
-    }
-
-    public void setRoomId(String roomId) {
-        this.roomId = roomId;
-    }
-
-    public Long getCourseScheduleId() {
-        return courseScheduleId;
-    }
-
-    public void setCourseScheduleId(Long courseScheduleId) {
-        this.courseScheduleId = courseScheduleId;
-    }
-
-    public Date getUpdateTime() {
-        return updateTime;
-    }
-
-    public void setUpdateTime(Date updateTime) {
-        this.updateTime = updateTime;
-    }
-
-    public Date getCreateTime() {
-        return createTime;
-    }
-
-    public void setCreateTime(Date createTime) {
-        this.createTime = createTime;
-    }
-
 }
 

+ 6 - 123
cooleshow-user/user-biz/src/main/java/com/yonge/cooleshow/biz/dal/entity/ImNetworkRoomMember.java

@@ -9,6 +9,7 @@ import com.yonge.cooleshow.biz.dal.dto.CourseScheduleStudentMusicSheetResult;
 import io.swagger.annotations.ApiModel;
 import io.swagger.annotations.ApiModelProperty;
 import com.baomidou.mybatisplus.annotation.TableId;
+import lombok.Data;
 
 import java.io.Serializable;
 import java.util.List;
@@ -19,27 +20,24 @@ import java.util.List;
  * @author zx
  * @since 2022-03-30 16:36:37
  */
+@Data
 @ApiModel(value = "im_network_room_member-网络教室成员")
 public class ImNetworkRoomMember implements Serializable {
     @TableId(value = "id_", type = IdType.AUTO)
     @ApiModelProperty(value = "主键;")
     private Long id;
 
-    @TableField("course_schedule_id_")
-    @ApiModelProperty(value = "课程编号")
-    private Long courseScheduleId;
-
     @TableField("room_id_")
     @ApiModelProperty(value = "房间号")
     private String roomId;
 
     @TableField("user_id_")
-    @ApiModelProperty(value = "用户编号")
-    private Long userId;
+    @ApiModelProperty(value = "转换后的第三方用户编号")
+    private String userId;
 
     @TableField("username_")
     @ApiModelProperty(value = "用户名")
-    private String username;
+    private String userName;
 
     @TableField("avatar_")
     @ApiModelProperty(value = "用户头像")
@@ -70,122 +68,7 @@ public class ImNetworkRoomMember implements Serializable {
     private boolean handFlag;
 
     @ApiModelProperty(value = "当前用户伴奏信息")
-    private List<CourseScheduleStudentMusicSheetResult> musicSheetResults;
-
     @TableField(exist = false)
-    @ApiModelProperty(value = "IM用户ID")
-    private String imUserId;
-
-    public List<CourseScheduleStudentMusicSheetResult> getMusicSheetResults() {
-        return musicSheetResults;
-    }
-
-    public void setMusicSheetResults(List<CourseScheduleStudentMusicSheetResult> musicSheetResults) {
-        this.musicSheetResults = musicSheetResults;
-    }
-
-    public String getUsername() {
-        return username;
-    }
-
-    public void setUsername(String username) {
-        this.username = username;
-    }
-
-    public String getAvatar() {
-        return avatar;
-    }
-
-    public void setAvatar(String avatar) {
-        this.avatar = avatar;
-    }
-
-    public Long getId() {
-        return id;
-    }
-
-    public void setId(Long id) {
-        this.id = id;
-    }
-
-    public Long getCourseScheduleId() {
-        return courseScheduleId;
-    }
-
-    public void setCourseScheduleId(Long courseScheduleId) {
-        this.courseScheduleId = courseScheduleId;
-    }
-
-    public String getRoomId() {
-        return roomId;
-    }
-
-    public void setRoomId(String roomId) {
-        this.roomId = roomId;
-    }
-
-    public Long getUserId() {
-        return userId;
-    }
-
-    public void setUserId(Long userId) {
-        this.userId = userId;
-    }
-
-    public Date getJoinTime() {
-        return joinTime;
-    }
-
-    public void setJoinTime(Date joinTime) {
-        this.joinTime = joinTime;
-    }
-
-    public Integer getRole() {
-        return role;
-    }
-
-    public void setRole(Integer role) {
-        this.role = role;
-    }
-
-    public boolean isCameraFlag() {
-        return cameraFlag;
-    }
-
-    public void setCameraFlag(boolean cameraFlag) {
-        this.cameraFlag = cameraFlag;
-    }
-
-    public boolean isMicFlag() {
-        return micFlag;
-    }
-
-    public void setMicFlag(boolean micFlag) {
-        this.micFlag = micFlag;
-    }
-
-    public boolean isMusicModeFlag() {
-        return musicModeFlag;
-    }
-
-    public void setMusicModeFlag(boolean musicModeFlag) {
-        this.musicModeFlag = musicModeFlag;
-    }
-
-    public boolean isHandFlag() {
-        return handFlag;
-    }
-
-    public void setHandFlag(boolean handFlag) {
-        this.handFlag = handFlag;
-    }
-
-    public String getImUserId() {
-        return imUserId;
-    }
-
-    public void setImUserId(String imUserId) {
-        this.imUserId = imUserId;
-    }
+    private List<CourseScheduleStudentMusicSheetResult> scheduleStudentMusicScores;
 }
 

+ 48 - 0
cooleshow-user/user-biz/src/main/java/com/yonge/cooleshow/biz/dal/entity/ImNetworkRoomMemberStatus.java

@@ -0,0 +1,48 @@
+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 com.baomidou.mybatisplus.annotation.IdType;
+import lombok.Data;
+
+import io.swagger.annotations.ApiModel;
+import io.swagger.annotations.ApiModelProperty;
+
+import java.io.Serializable;
+
+
+/**
+ * 网络教室成员状态表
+ * 2023-08-14 15:47:02
+ */
+@Data
+@ApiModel(" ImNetworkRoomMemberStatus-网络教室成员状态表")
+@TableName("im_network_room_member_status")
+public class ImNetworkRoomMemberStatus implements Serializable {
+
+    @ApiModelProperty("主键;") 
+	    @TableId(value = "id_")
+	    private Long id;
+
+    @ApiModelProperty("房间号") 
+	@TableField(value = "room_id_")
+    private String roomId;
+
+//    @TableField(value = "im_user_id_")
+//    @ApiModelProperty(value = "IM用户ID")
+//    private String imUserId;
+//
+//    @ApiModelProperty("角色0学员1老师;")
+//	@TableField(value = "role_")
+//    private Integer role;
+
+    @ApiModelProperty("网络教室节拍器参数") 
+	@TableField(value = "play_midi_")
+    private String playMidi;
+
+    @ApiModelProperty("网络教室当前课程曲目下载信息") 
+	@TableField(value = "music_sheet_download_json_")
+    private String musicSheetDownloadJson;
+
+}

+ 38 - 4
cooleshow-user/user-biz/src/main/java/com/yonge/cooleshow/biz/dal/entity/ImRoomMessage.java

@@ -6,13 +6,28 @@ package com.yonge.cooleshow.biz.dal.entity;
  */
 public class ImRoomMessage extends BaseMessage {
 
-    //objectName 类型-观看者退出房间
-    public static final String RC_CHATROOM_LEAVE = "RC:Chatroom:Leave";
-    //objectName 类型-观看者数量
-    public static final String MEMBER_COUNT = "RC:Chatroom:MemberCountUp";
     //objectName 类型-将所有人强制踢出房间
     public static final String FORCED_OFFLINE = "RC:ForcedOffline";
 
+    //objectName 类型-观看者退出房间
+    public static final String LOOKER_LOGIN_OUT = "RC:LookerLoginOut";
+
+    //objectName 类型-观看者数量-该消息只有主播端接
+    public static final String MEMBER_COUNT = "RC:Chatroom:MemberCountUp";
+
+    //objectName 类型-商品变更
+    public static final String LIVE_GOODS_CHANGE = "DY:LIVE_GOODS_CHANGE";
+
+    //objectName 类型-在黑名单中添加该用户
+    public static final String BLOCK_BLACK_USER = "RC:BLOCK_BLACK_USER";
+
+    //objectName 类型-在黑名单中解除该用户
+    public static final String UNBLOCK_BLACK_USER = "RC:UNBLOCK_BLACK_USER";
+
+    //objectName 类型-用户点赞数同步
+    public static final String LIKES_COUNT = "RC:Chatroom:LikeCount";
+
+    private String serviceProvider;
     /**
      * 消息类型
      */
@@ -33,6 +48,25 @@ public class ImRoomMessage extends BaseMessage {
      */
     private String toChatroomId;
 
+
+    private String clientType;
+
+    public String getClientType() {
+        return clientType;
+    }
+
+    public void setClientType(String clientType) {
+        this.clientType = clientType;
+    }
+
+    public String getServiceProvider() {
+        return serviceProvider;
+    }
+
+    public void setServiceProvider(String serviceProvider) {
+        this.serviceProvider = serviceProvider;
+    }
+
     @Override
     public String getObjectName() {
         return objectName;

+ 3 - 39
cooleshow-user/user-biz/src/main/java/com/yonge/cooleshow/biz/dal/entity/ImUserStateSync.java

@@ -1,6 +1,7 @@
 package com.yonge.cooleshow.biz.dal.entity;
 
 import io.swagger.annotations.ApiModelProperty;
+import lombok.Data;
 
 import java.io.Serializable;
 
@@ -10,6 +11,7 @@ import java.io.Serializable;
  * @author hgw
  * Created by 2022-02-18
  */
+@Data
 public class ImUserStateSync implements Serializable {
 
     @ApiModelProperty(value = "用户 Id")
@@ -27,43 +29,5 @@ public class ImUserStateSync implements Serializable {
     @ApiModelProperty(value = "用户当前的 IP 地址及端口")
     private String clientIp;
 
-    public String getUserid() {
-        return userid;
-    }
-
-    public void setUserid(String userid) {
-        this.userid = userid;
-    }
-
-    public String getStatus() {
-        return status;
-    }
-
-    public void setStatus(String status) {
-        this.status = status;
-    }
-
-    public String getOs() {
-        return os;
-    }
-
-    public void setOs(String os) {
-        this.os = os;
-    }
-
-    public Long getTime() {
-        return time;
-    }
-
-    public void setTime(Long time) {
-        this.time = time;
-    }
-
-    public String getClientIp() {
-        return clientIp;
-    }
-
-    public void setClientIp(String clientIp) {
-        this.clientIp = clientIp;
-    }
+    private String roomUid;
 }

+ 53 - 0
cooleshow-user/user-biz/src/main/java/com/yonge/cooleshow/biz/dal/entity/LiveBroadcastRoomData.java

@@ -0,0 +1,53 @@
+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 com.baomidou.mybatisplus.annotation.IdType;
+import lombok.Data;
+
+import io.swagger.annotations.ApiModel;
+import io.swagger.annotations.ApiModelProperty;
+
+import java.io.Serializable;
+import java.util.Date;
+
+
+/**
+ * 直播房间数据表
+ * 2023-08-15 15:50:17
+ */
+@Data
+@ApiModel(" LiveBroadcastRoomData-直播房间数据表")
+@TableName("live_broadcast_room_data")
+public class LiveBroadcastRoomData implements Serializable {
+
+    @ApiModelProperty("主键") 
+	    @TableId(value = "id_", type = IdType.AUTO)
+        private Integer id;
+
+    @ApiModelProperty("房间uid") 
+	@TableField(value = "room_uid_")
+    private String roomUid;
+
+    @ApiModelProperty("直播时长") 
+	@TableField(value = "live_time_")
+    private Integer liveTime;
+
+    @ApiModelProperty("累计点赞数") 
+	@TableField(value = "like_num_")
+    private Integer likeNum;
+
+    @ApiModelProperty("即时观看人员数") 
+	@TableField(value = "look_user_num_")
+    private Integer lookUserNum;
+
+    @ApiModelProperty("累计观看总人员数") 
+	@TableField(value = "total_user_num_")
+    private Integer totalUserNum;
+
+    @ApiModelProperty("更新时间") 
+	@TableField(value = "updated_time_")
+    private Date updatedTime;
+
+}

+ 58 - 142
cooleshow-user/user-biz/src/main/java/com/yonge/cooleshow/biz/dal/entity/LiveRoom.java

@@ -4,8 +4,11 @@ package com.yonge.cooleshow.biz.dal.entity;
 import com.baomidou.mybatisplus.annotation.IdType;
 import com.baomidou.mybatisplus.annotation.TableField;
 import com.baomidou.mybatisplus.annotation.TableId;
+import com.yonge.cooleshow.biz.dal.enums.ClientEnum;
+import com.yonge.cooleshow.common.enums.live.ELiveViewMode;
 import io.swagger.annotations.ApiModel;
 import io.swagger.annotations.ApiModelProperty;
+import lombok.Data;
 
 import java.io.Serializable;
 import java.util.Date;
@@ -16,24 +19,31 @@ import java.util.Date;
  * @author hgw
  * @since 2022-03-23 14:35:19
  */
+@Data
 @ApiModel(value = "live_room-直播房间与课程的关系表表")
 public class LiveRoom implements Serializable {
     @TableId(value = "id_", type = IdType.AUTO)
     @ApiModelProperty(value = "主键")
     private Long id;
 
-    @TableField("course_group_id_")
-    @ApiModelProperty(value = "课程组id")
-    private Long courseGroupId;
-
-    @TableField("course_id_")
-    @ApiModelProperty(value = "课程id")
-    private Long courseId;
+//    @TableField("course_group_id_")
+//    @ApiModelProperty(value = "课程组id")
+//    private Long courseGroupId;
+//
+//    @TableField("course_id_")
+//    @ApiModelProperty(value = "课程id")
+//    private Long courseId;
 
     @TableField("speaker_id_")
     @ApiModelProperty(value = "主讲人id/老师id")
     private Long speakerId;
 
+
+
+    @TableField("client_type_")
+    @ApiModelProperty("用户类型 TEACHER 老师 ")
+    private ClientEnum clientType;
+
     @TableField("room_uid_")
     @ApiModelProperty(value = "房间编号")
     private String roomUid;
@@ -42,6 +52,14 @@ public class LiveRoom implements Serializable {
     @ApiModelProperty(value = "房间标题/最多12个字")
     private String roomTitle;
 
+    @TableField("service_provider_")
+    @ApiModelProperty(value = "服务提供方")
+    private String serviceProvider= "tencentCloud";
+
+    @TableField("video_record_")
+    @ApiModelProperty(value = "录制记录")
+    private String videoRecord;
+
     @TableField("live_start_time_")
     @ApiModelProperty(value = "直播开始时间")
     private Date liveStartTime;
@@ -66,10 +84,43 @@ public class LiveRoom implements Serializable {
     @ApiModelProperty(value = "房间类型 live直播课  temp临时直播间")
     private String type;
 
+    @TableField("pre_template_")
+    @ApiModelProperty(value = "预热模版")
+    private String preTemplate;
+
+
+    @TableField("live_total_time_")
+    @ApiModelProperty(value = "直播时长")
+    private Integer liveTotalTime;
+
+    @TableField("os_")
+    @ApiModelProperty(value = "播出端-  pc网页端 移动端mobile")
+    private String os;
+
+    @TableField("speaker_status_")
+    @ApiModelProperty(value = "主播状态: 0离开;1在播")
+    private Integer speakerStatus;
+
+    @TableField("push_status_")
+    @ApiModelProperty(value = "推流状态: 0 暂停; 1在播")
+    private Integer pushStatus;
+
+    @TableField("ban_status_")
+    @ApiModelProperty(value = "禁言状态: 0 取消;1禁言")
+    private Integer banStatus;
+
+    @TableField("view_mode_")
+    @ApiModelProperty("直播观看模式")
+    private ELiveViewMode viewMode;
+
     @TableField("cover_pic_")
     @ApiModelProperty(value = "封面图片")
     private String coverPic;
 
+    @TableField("shop_car_url_")
+    @ApiModelProperty(value = "购物车地址")
+    private String shopCarUrl;
+
     @TableField("created_by_")
     @ApiModelProperty(value = "创建人")
     private Long createdBy;
@@ -86,140 +137,5 @@ public class LiveRoom implements Serializable {
     @ApiModelProperty(value = "更新时间")
     private Date updatedTime;
 
-    public Long getId() {
-        return id;
-    }
-
-    public void setId(Long id) {
-        this.id = id;
-    }
-
-    public Long getCourseGroupId() {
-        return courseGroupId;
-    }
-
-    public void setCourseGroupId(Long courseGroupId) {
-        this.courseGroupId = courseGroupId;
-    }
-
-    public Long getCourseId() {
-        return courseId;
-    }
-
-    public void setCourseId(Long courseId) {
-        this.courseId = courseId;
-    }
-
-    public Long getSpeakerId() {
-        return speakerId;
-    }
-
-    public void setSpeakerId(Long speakerId) {
-        this.speakerId = speakerId;
-    }
-
-    public String getRoomUid() {
-        return roomUid;
-    }
-
-    public void setRoomUid(String roomUid) {
-        this.roomUid = roomUid;
-    }
-
-    public String getRoomTitle() {
-        return roomTitle;
-    }
-
-    public void setRoomTitle(String roomTitle) {
-        this.roomTitle = roomTitle;
-    }
-
-    public Date getLiveStartTime() {
-        return liveStartTime;
-    }
-
-    public void setLiveStartTime(Date liveStartTime) {
-        this.liveStartTime = liveStartTime;
-    }
-
-    public Date getLiveEndTime() {
-        return liveEndTime;
-    }
-
-    public void setLiveEndTime(Date liveEndTime) {
-        this.liveEndTime = liveEndTime;
-    }
-
-    public String getLiveRemark() {
-        return liveRemark;
-    }
-
-    public void setLiveRemark(String liveRemark) {
-        this.liveRemark = liveRemark;
-    }
-
-    public Integer getLiveState() {
-        return liveState;
-    }
-
-    public void setLiveState(Integer liveState) {
-        this.liveState = liveState;
-    }
-
-    public Integer getRoomState() {
-        return roomState;
-    }
-
-    public void setRoomState(Integer roomState) {
-        this.roomState = roomState;
-    }
-
-    public String getType() {
-        return type;
-    }
-
-    public void setType(String type) {
-        this.type = type;
-    }
-
-    public Long getCreatedBy() {
-        return createdBy;
-    }
-
-    public void setCreatedBy(Long createdBy) {
-        this.createdBy = createdBy;
-    }
-
-    public Date getCreatedTime() {
-        return createdTime;
-    }
-
-    public void setCreatedTime(Date createdTime) {
-        this.createdTime = createdTime;
-    }
-
-    public Long getUpdatedBy() {
-        return updatedBy;
-    }
-
-    public void setUpdatedBy(Long updatedBy) {
-        this.updatedBy = updatedBy;
-    }
-
-    public Date getUpdatedTime() {
-        return updatedTime;
-    }
-
-    public void setUpdatedTime(Date updatedTime) {
-        this.updatedTime = updatedTime;
-    }
-
-    public String getCoverPic() {
-        return coverPic;
-    }
-
-    public void setCoverPic(String coverPic) {
-        this.coverPic = coverPic;
-    }
 }
 

+ 7 - 23
cooleshow-user/user-biz/src/main/java/com/yonge/cooleshow/biz/dal/entity/LiveRoomVideo.java

@@ -22,13 +22,13 @@ public class LiveRoomVideo implements Serializable {
     @ApiModelProperty(value = "主键")
     private Long id;
 
-    @TableField("course_group_id_")
-    @ApiModelProperty(value = "课程组id")
-    private Long courseGroupId;
-
-    @TableField("course_id_")
-    @ApiModelProperty(value = "课程id")
-    private Long courseId;
+//    @TableField("course_group_id_")
+//    @ApiModelProperty(value = "课程组id")
+//    private Long courseGroupId;
+//
+//    @TableField("course_id_")
+//    @ApiModelProperty(value = "课程id")
+//    private Long courseId;
 
     @TableField("room_uid_")
     @ApiModelProperty(value = "房间编号")
@@ -67,22 +67,6 @@ public class LiveRoomVideo implements Serializable {
         this.id = id;
     }
 
-    public Long getCourseGroupId() {
-        return courseGroupId;
-    }
-
-    public void setCourseGroupId(Long courseGroupId) {
-        this.courseGroupId = courseGroupId;
-    }
-
-    public Long getCourseId() {
-        return courseId;
-    }
-
-    public void setCourseId(Long courseId) {
-        this.courseId = courseId;
-    }
-
     public String getRoomUid() {
         return roomUid;
     }

+ 10 - 92
cooleshow-user/user-biz/src/main/java/com/yonge/cooleshow/biz/dal/entity/MusicSheetAccompaniment.java

@@ -1,13 +1,16 @@
 package com.yonge.cooleshow.biz.dal.entity;
 
-import com.yonge.cooleshow.common.entity.BaseEntity;
 import com.baomidou.mybatisplus.annotation.IdType;
 import com.baomidou.mybatisplus.annotation.TableField;
 import com.baomidou.mybatisplus.annotation.TableId;
+import com.yonge.cooleshow.common.entity.BaseEntity;
 import io.swagger.annotations.ApiModel;
 import io.swagger.annotations.ApiModelProperty;
+import lombok.AllArgsConstructor;
+import lombok.Data;
+import lombok.NoArgsConstructor;
+import lombok.experimental.Accessors;
 import org.apache.commons.lang3.builder.ToStringBuilder;
-import java.util.Date;
 
 /**
  * 曲谱伴奏表
@@ -15,6 +18,10 @@ import java.util.Date;
  * @date 2022-03-25 23:46:28
  * @version v1.0
  **/
+@Data
+@Accessors(chain = true)
+@AllArgsConstructor
+@NoArgsConstructor
 @ApiModel(value = "music_sheet_accompaniment-曲谱伴奏表")
 public class MusicSheetAccompaniment extends BaseEntity {
 
@@ -28,7 +35,7 @@ public class MusicSheetAccompaniment extends BaseEntity {
 
     @TableField("music_subject_")
     @ApiModelProperty(value = "声部")
-    private String musicSubject;  //声部
+    private String musicSubjectId;  //声部
 
     @TableField("audio_file_url_")
     @ApiModelProperty(value = "MP3原声音频文件URL")
@@ -58,95 +65,6 @@ public class MusicSheetAccompaniment extends BaseEntity {
     @ApiModelProperty(value = "创建人(老师或者是后台平台用户)")
     private Long createBy;  //创建人(老师或者是后台平台用户)
 
-
-	public MusicSheetAccompaniment setId(Long id) {
-	    this.id = id;
-	    return this;
-	}
-
-	public Integer getSpeed() {
-		return speed;
-	}
-
-	public void setSpeed(Integer speed) {
-		this.speed = speed;
-	}
-
-	public String getMetronomeUrl() {
-		return metronomeUrl;
-	}
-
-	public void setMetronomeUrl(String metronomeUrl) {
-		this.metronomeUrl = metronomeUrl;
-	}
-
-	public String getTrack() {
-		return track;
-	}
-
-	public void setTrack(String track) {
-		this.track = track;
-	}
-
-	public Long getId() {
-	    return this.id;
-	}
-
-	public MusicSheetAccompaniment setMusicSheetId(Long musicSheetId) {
-	    this.musicSheetId = musicSheetId;
-	    return this;
-	}
-
-	public Long getMusicSheetId() {
-	    return this.musicSheetId;
-	}
-
-	public MusicSheetAccompaniment setMusicSubject(String musicSubject) {
-	    this.musicSubject = musicSubject;
-	    return this;
-	}
-
-	public String getMusicSubject() {
-	    return this.musicSubject;
-	}
-
-	public MusicSheetAccompaniment setAudioFileUrl(String audioFileUrl) {
-	    this.audioFileUrl = audioFileUrl;
-	    return this;
-	}
-
-	public String getAudioFileUrl() {
-	    return this.audioFileUrl;
-	}
-
-	public MusicSheetAccompaniment setSortNumber(Integer sortNumber) {
-	    this.sortNumber = sortNumber;
-	    return this;
-	}
-
-	public Integer getSortNumber() {
-	    return this.sortNumber;
-	}
-
-	public MusicSheetAccompaniment setCreateTime(java.util.Date createTime) {
-	    this.createTime = createTime;
-	    return this;
-	}
-
-	public java.util.Date getCreateTime() {
-	    return this.createTime;
-	}
-
-	public MusicSheetAccompaniment setCreateBy(Long createBy) {
-	    this.createBy = createBy;
-	    return this;
-	}
-
-	public Long getCreateBy() {
-	    return this.createBy;
-	}
-
-
     @Override
     public String toString() {
         return ToStringBuilder.reflectionToString(this);

+ 7 - 164
cooleshow-user/user-biz/src/main/java/com/yonge/cooleshow/biz/dal/entity/RoomInfoCache.java

@@ -2,6 +2,7 @@ package com.yonge.cooleshow.biz.dal.entity;
 
 import com.fasterxml.jackson.annotation.JsonFormat;
 import io.swagger.annotations.ApiModelProperty;
+import lombok.Data;
 
 import java.io.Serializable;
 import java.util.Date;
@@ -10,13 +11,14 @@ import java.util.Date;
  * @author hgw
  * Created by 2022年3月24日
  */
+@Data
 public class RoomInfoCache implements Serializable {
 
-    @ApiModelProperty(value = "课程id")
-    private Long courseId;
-
-    @ApiModelProperty(value = "课程组id")
-    private Long courseGroupId;
+//    @ApiModelProperty(value = "课程id")
+//    private Long courseId;
+//
+//    @ApiModelProperty(value = "课程组id")
+//    private Long courseGroupId;
 
     @ApiModelProperty(value = "主讲人id")
     private Long speakerId;
@@ -75,163 +77,4 @@ public class RoomInfoCache implements Serializable {
     @ApiModelProperty(value = "是否允许连麦 0允许 1不允许")
     private Integer whether_mic = 0;
 
-    public Integer getWhether_mic() {
-        return whether_mic;
-    }
-
-    public void setWhether_mic(Integer whether_mic) {
-        this.whether_mic = whether_mic;
-    }
-
-    public Integer getExpiredCloseMinute() {
-        return expiredCloseMinute;
-    }
-
-    public void setExpiredCloseMinute(Integer expiredCloseMinute) {
-        this.expiredCloseMinute = expiredCloseMinute;
-    }
-
-    public Long getCourseId() {
-        return courseId;
-    }
-
-    public void setCourseId(Long courseId) {
-        this.courseId = courseId;
-    }
-
-    public Long getCourseGroupId() {
-        return courseGroupId;
-    }
-
-    public void setCourseGroupId(Long courseGroupId) {
-        this.courseGroupId = courseGroupId;
-    }
-
-    public Long getSpeakerId() {
-        return speakerId;
-    }
-
-    public void setSpeakerId(Long speakerId) {
-        this.speakerId = speakerId;
-    }
-
-    public String getSpeakerName() {
-        return speakerName;
-    }
-
-    public void setSpeakerName(String speakerName) {
-        this.speakerName = speakerName;
-    }
-
-    public Integer getSpeakerState() {
-        return speakerState;
-    }
-
-    public void setSpeakerState(Integer speakerState) {
-        this.speakerState = speakerState;
-    }
-
-    public String getRoomUid() {
-        return roomUid;
-    }
-
-    public void setRoomUid(String roomUid) {
-        this.roomUid = roomUid;
-    }
-
-    public Date getLiveStartTime() {
-        return liveStartTime;
-    }
-
-    public void setLiveStartTime(Date liveStartTime) {
-        this.liveStartTime = liveStartTime;
-    }
-
-    public Date getLiveEndTime() {
-        return liveEndTime;
-    }
-
-    public void setLiveEndTime(Date liveEndTime) {
-        this.liveEndTime = liveEndTime;
-    }
-
-    public Date getCreateRoomTime() {
-        return createRoomTime;
-    }
-
-    public void setCreateRoomTime(Date createRoomTime) {
-        this.createRoomTime = createRoomTime;
-    }
-
-    public Integer getExpiredMinute() {
-        return expiredMinute;
-    }
-
-    public void setExpiredMinute(Integer expiredMinute) {
-        this.expiredMinute = expiredMinute;
-    }
-
-    public Date getJoinRoomTime() {
-        return joinRoomTime;
-    }
-
-    public void setJoinRoomTime(Date joinRoomTime) {
-        this.joinRoomTime = joinRoomTime;
-    }
-
-    public Date getExitRoomTime() {
-        return exitRoomTime;
-    }
-
-    public void setExitRoomTime(Date exitRoomTime) {
-        this.exitRoomTime = exitRoomTime;
-    }
-
-    public String getRoomType() {
-        return roomType;
-    }
-
-    public void setRoomType(String roomType) {
-        this.roomType = roomType;
-    }
-
-    public Integer getLikeNum() {
-        return likeNum;
-    }
-
-    public void setLikeNum(Integer likeNum) {
-        this.likeNum = likeNum;
-    }
-
-    public Integer getLookNum() {
-        return lookNum;
-    }
-
-    public void setLookNum(Integer lookNum) {
-        this.lookNum = lookNum;
-    }
-
-    public String getSpeakerPic() {
-        return speakerPic;
-    }
-
-    public void setSpeakerPic(String speakerPic) {
-        this.speakerPic = speakerPic;
-    }
-
-    public String getRoomTitle() {
-        return roomTitle;
-    }
-
-    public void setRoomTitle(String roomTitle) {
-        this.roomTitle = roomTitle;
-    }
-
-    public String getLiveRemark() {
-        return liveRemark;
-    }
-
-    public void setLiveRemark(String liveRemark) {
-        this.liveRemark = liveRemark;
-    }
 }

+ 4 - 4
cooleshow-user/user-biz/src/main/java/com/yonge/cooleshow/biz/dal/enums/ImNetworkDisplayEnum.java

@@ -7,8 +7,11 @@ package com.yonge.cooleshow.biz.dal.enums;
 // 4 时,清空当前 room 的 display
 
 import com.yonge.toolset.base.enums.BaseEnum;
+import lombok.Getter;
 
+@Getter
 public enum ImNetworkDisplayEnum implements BaseEnum<String, ImNetworkDisplayEnum> {
+    ASSISTANT("助教"),
     TEACHER("老师"),
     WHITE_BOARD("白板"),
     SCREEN("屏幕"),
@@ -16,7 +19,7 @@ public enum ImNetworkDisplayEnum implements BaseEnum<String, ImNetworkDisplayEnu
     NONE("清空"),
     STUDENT("学员");
 
-    private String msg;
+    private final String msg;
 
     ImNetworkDisplayEnum(String msg) {
         this.msg = msg;
@@ -27,7 +30,4 @@ public enum ImNetworkDisplayEnum implements BaseEnum<String, ImNetworkDisplayEnu
         return this.name();
     }
 
-    public String getMsg() {
-        return msg;
-    }
 }

+ 36 - 0
cooleshow-user/user-biz/src/main/java/com/yonge/cooleshow/biz/dal/enums/RoleEnum.java

@@ -0,0 +1,36 @@
+package com.yonge.cooleshow.biz.dal.enums;
+
+import com.baomidou.mybatisplus.extension.exceptions.ApiException;
+import lombok.AccessLevel;
+import lombok.Getter;
+import lombok.Setter;
+
+/**
+ * Created by weiqinxiao on 2019/2/28.
+ */
+public enum RoleEnum {
+    RoleAssistant("RoleAssistant", 1),
+    RoleTeacher("RoleTeacher", 2),
+    RoleStudent("RoleStudent", 3),
+    RoleAudience("RoleAudience", 4);
+
+    private @Getter
+    @Setter(AccessLevel.PRIVATE) String msg;
+    private @Getter
+    @Setter(AccessLevel.PRIVATE) int value;
+
+    RoleEnum(String msg, int value) {
+        this.msg = msg;
+        this.value = value;
+    }
+
+    public static RoleEnum getEnumByValue(int v) {
+        for(RoleEnum item : RoleEnum.values()) {
+            if(item.getValue() == v) {
+                return item;
+            }
+        }
+
+        throw new ApiException(v + " not valid role");
+    }
+}

+ 15 - 0
cooleshow-user/user-biz/src/main/java/com/yonge/cooleshow/biz/dal/enums/UserRoleEnum.java

@@ -19,4 +19,19 @@ public enum UserRoleEnum implements BaseEnum<String, UserRoleEnum> {
     public String getMsg() {
         return msg;
     }
+
+    // clientEnum 转 UserRoleEnum
+    public static UserRoleEnum convert(ClientEnum clientEnum){
+        if(clientEnum == null){
+            return null;
+        }
+        if(ClientEnum.STUDENT.equals(clientEnum)){
+            return STUDENT;
+        }
+        if(ClientEnum.TEACHER.equals(clientEnum)){
+            return TEACHER;
+        }
+        return null;
+    }
+
 }

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

@@ -0,0 +1,30 @@
+package com.yonge.cooleshow.biz.dal.enums.im;
+
+/**
+ * Description
+ *
+ * @author liujunchi
+ * @date 2023-03-06
+ */
+public enum ETencentGroupType {
+
+    Public("陌生人社交群"),
+    Work("好友工作群"),
+    AVChatRoom("直播群"),
+    Meeting("临时会议群"),
+    Community("社群"),
+
+    ;
+
+    private String code;
+
+    private String msg;
+
+
+    ETencentGroupType(String msg) {
+        this.code = this.name();
+        this.msg = msg;
+    }
+
+
+}

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

@@ -0,0 +1,31 @@
+package com.yonge.cooleshow.biz.dal.enums.im;
+
+import lombok.Getter;
+
+/**
+ * Description
+ *
+ * @author liujunchi
+ * @date 2023-03-02
+ */
+@Getter
+public enum ETencentImCallbackCommand {
+
+    // STATE_STATECHANGE("State.StateChange", "用户状态变更"),
+    GROUP_CALLBACKAFTERMEMBEREXIT("Group.CallbackAfterMemberExit", "群成员离开之后回调"),
+    GROUP_CALLBACKAFTERNEWMEMBERJOIN("Group.CallbackAfterNewMemberJoin", "新成员入群之后回调"),
+    GROUP_CALLBACKONMEMBERSTATECHANGE("Group.CallbackOnMemberStateChange", "直播群成员在线状态回调"),
+    ;
+
+    private final String command;
+    private final String desc;
+
+    private final String code;
+
+    ETencentImCallbackCommand(String command, String desc) {
+        this.command = command;
+        this.desc = desc;
+
+        this.code = this.name();
+    }
+}

+ 43 - 0
cooleshow-user/user-biz/src/main/java/com/yonge/cooleshow/biz/dal/enums/live/EAnchorStatus.java

@@ -0,0 +1,43 @@
+package com.yonge.cooleshow.biz.dal.enums.live;
+
+/**
+ * Description
+ *
+ * @author liujunchi
+ * @date 2023-03-20
+ */
+public enum EAnchorStatus {
+
+    /**
+     * 主讲人状态
+     */
+    ONLINE("在线"),
+    OFFLINE("离线"),
+
+
+    ;
+    private String code;
+
+    private String msg;
+
+    EAnchorStatus(String msg) {
+        this.msg = msg;
+        this.code = this.name();
+    }
+
+    public String getCode() {
+        return code;
+    }
+
+    public void setCode(String code) {
+        this.code = code;
+    }
+
+    public String getMsg() {
+        return msg;
+    }
+
+    public void setMsg(String msg) {
+        this.msg = msg;
+    }
+}

+ 40 - 0
cooleshow-user/user-biz/src/main/java/com/yonge/cooleshow/biz/dal/enums/live/EOnOffStatus.java

@@ -0,0 +1,40 @@
+package com.yonge.cooleshow.biz.dal.enums.live;
+
+/**
+ * Description
+ *
+ * @author liujunchi
+ * @date 2023-03-20
+ */
+public enum EOnOffStatus {
+
+
+    ON("是"),
+    OFF("否"),
+
+    ;
+    private String code;
+
+    private String msg;
+
+    EOnOffStatus(String msg) {
+        this.msg = msg;
+        this.code = this.name();
+    }
+
+    public String getCode() {
+        return code;
+    }
+
+    public void setCode(String code) {
+        this.code = code;
+    }
+
+    public String getMsg() {
+        return msg;
+    }
+
+    public void setMsg(String msg) {
+        this.msg = msg;
+    }
+}

+ 78 - 0
cooleshow-user/user-biz/src/main/java/com/yonge/cooleshow/biz/dal/mapper/ImLiveBroadcastRoomMemberMapper.java

@@ -0,0 +1,78 @@
+package com.yonge.cooleshow.biz.dal.mapper;
+
+import java.util.Arrays;
+import java.util.List;
+import java.util.Map;
+
+import com.baomidou.mybatisplus.core.mapper.BaseMapper;
+import com.baomidou.mybatisplus.core.metadata.IPage;
+import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
+import org.apache.ibatis.annotations.Param;
+import org.springframework.stereotype.Repository;
+import com.yonge.cooleshow.biz.dal.entity.ImLiveBroadcastRoomMember;
+import com.yonge.cooleshow.biz.dal.wrapper.liveroom.ImLiveBroadcastRoomMemberWrapper;
+
+/**
+ * 直播间人员关系表
+ * 2023-08-15 15:50:17
+ */
+@Repository
+public interface ImLiveBroadcastRoomMemberMapper extends BaseMapper<ImLiveBroadcastRoomMember> {
+
+	/**
+	 * 分页查询
+	 * @param page IPage<ImLiveBroadcastRoomMemberWrapper.ImLiveBroadcastRoomMember>
+	 * @param param ImLiveBroadcastRoomMemberWrapper.ImLiveBroadcastRoomMemberQuery
+	 * @return List<ImLiveBroadcastRoomMemberWrapper.ImLiveBroadcastRoomMember>
+	 */
+	List<ImLiveBroadcastRoomMember> selectPage(@Param("page") IPage<ImLiveBroadcastRoomMember> page, @Param("param") ImLiveBroadcastRoomMemberWrapper.ImLiveBroadcastRoomMemberQuery param);
+
+    /**
+     * 查询房间人数
+     *
+     * @param roomUid 房间id
+     */
+    ImLiveBroadcastRoomMemberWrapper.RoomMemberNumDto queryMemberNum(@Param("roomUid") String roomUid);
+
+    /**
+     * 修改用户连麦状态
+     *
+     * @param roomUid          直播房间id
+     * @param userId           用户id
+     * @param whetherMicStatus 连麦状态
+     */
+    void userWhetherMic(@Param("roomUid") String roomUid, @Param("userId") Long userId, @Param(
+            "whetherMicStatus") Integer whetherMicStatus);
+
+    /**
+     * 学生声部
+     * @param studentIds 学生编号
+     * @return List<ImLiveBroadcastRoomMemberVo>
+     */
+    List<ImLiveBroadcastRoomMemberWrapper.ImLiveBroadcastRoomMember> selectStudentSubject(@Param("studentIds") List<Integer> studentIds);
+
+    IPage<ImLiveBroadcastRoomMemberWrapper.ImLiveBroadcastRoomMember> queryMemberPage(Page<ImLiveBroadcastRoomMemberWrapper.ImLiveBroadcastRoomMember> pageInfo, @Param("param") Map<String, Object> param);
+
+    int insertBatch(@Param("entities") List<ImLiveBroadcastRoomMember> entities);
+
+    /**
+     * 设置在线状态
+     *
+     * @param userIds      用户id
+     * @param groupId      房间编号
+     * @param onlineStatus 状态
+     */
+    void updateOnlineStatus(@Param("userIds") List<Long> userIds, @Param("groupId") String groupId, @Param(
+            "onlineStatus") Integer onlineStatus);
+    /**
+     * 设置直播状态
+     *
+     * @param userIds      用户id
+     * @param groupId      房间编号
+     * @param liveRoomStatus 状态
+     */
+    void updateLiveRoomStatus(@Param("userIds") List<Long> userIds, @Param("groupId") String groupId, @Param(
+            "liveRoomStatus") Integer liveRoomStatus);
+
+    List<ImLiveBroadcastRoomMember> queryMember(@Param("userIds") List<Long> userIds, @Param("groupId") String groupId);
+}

+ 27 - 0
cooleshow-user/user-biz/src/main/java/com/yonge/cooleshow/biz/dal/mapper/ImNetworkRoomMemberStatusMapper.java

@@ -0,0 +1,27 @@
+package com.yonge.cooleshow.biz.dal.mapper;
+
+import java.util.List;
+
+import com.baomidou.mybatisplus.core.mapper.BaseMapper;
+import com.baomidou.mybatisplus.core.metadata.IPage;
+import org.apache.ibatis.annotations.Param;
+import org.springframework.stereotype.Repository;
+import com.yonge.cooleshow.biz.dal.entity.ImNetworkRoomMemberStatus;
+import com.yonge.cooleshow.biz.dal.wrapper.ImNetworkRoomMemberStatusWrapper;
+
+/**
+ * 网络教室成员状态表
+ * 2023-08-14 15:47:02
+ */
+@Repository
+public interface ImNetworkRoomMemberStatusMapper extends BaseMapper<ImNetworkRoomMemberStatus> {
+
+	/**
+	 * 分页查询
+	 * @param page IPage<ImNetworkRoomMemberStatusWrapper.ImNetworkRoomMemberStatus>
+	 * @param param ImNetworkRoomMemberStatusWrapper.ImNetworkRoomMemberStatusQuery
+	 * @return List<ImNetworkRoomMemberStatusWrapper.ImNetworkRoomMemberStatus>
+	 */
+	List<ImNetworkRoomMemberStatus> selectPage(@Param("page") IPage<ImNetworkRoomMemberStatus> page, @Param("param") ImNetworkRoomMemberStatusWrapper.ImNetworkRoomMemberStatusQuery param);
+	
+}

+ 27 - 0
cooleshow-user/user-biz/src/main/java/com/yonge/cooleshow/biz/dal/mapper/LiveBroadcastRoomDataMapper.java

@@ -0,0 +1,27 @@
+package com.yonge.cooleshow.biz.dal.mapper;
+
+import java.util.List;
+
+import com.baomidou.mybatisplus.core.mapper.BaseMapper;
+import com.baomidou.mybatisplus.core.metadata.IPage;
+import org.apache.ibatis.annotations.Param;
+import org.springframework.stereotype.Repository;
+import com.yonge.cooleshow.biz.dal.entity.LiveBroadcastRoomData;
+import com.yonge.cooleshow.biz.dal.wrapper.liveroom.LiveBroadcastRoomDataWrapper;
+
+/**
+ * 直播房间数据表
+ * 2023-08-15 15:50:17
+ */
+@Repository
+public interface LiveBroadcastRoomDataMapper extends BaseMapper<LiveBroadcastRoomData> {
+
+	/**
+	 * 分页查询
+	 * @param page IPage<LiveBroadcastRoomDataWrapper.LiveBroadcastRoomData>
+	 * @param param LiveBroadcastRoomDataWrapper.LiveBroadcastRoomDataQuery
+	 * @return List<LiveBroadcastRoomDataWrapper.LiveBroadcastRoomData>
+	 */
+	List<LiveBroadcastRoomData> selectPage(@Param("page") IPage<LiveBroadcastRoomData> page, @Param("param") LiveBroadcastRoomDataWrapper.LiveBroadcastRoomDataQuery param);
+	
+}

+ 57 - 0
cooleshow-user/user-biz/src/main/java/com/yonge/cooleshow/biz/dal/redisson/RedissonMessageService.java

@@ -0,0 +1,57 @@
+package com.yonge.cooleshow.biz.dal.redisson;
+
+import lombok.extern.slf4j.Slf4j;
+import org.redisson.api.RTopic;
+import org.redisson.api.RedissonClient;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.stereotype.Service;
+
+/**
+ * Redisson消息发布订阅服务
+ */
+@Slf4j
+@Service
+public class RedissonMessageService {
+
+    // 订阅消息通知
+    public static final String TOPIC_MESSAGE = "topic:message";
+    // 直播在线人数
+    public static final String LIVE_ROOM_MEMBER = "delayQueue:liveRoomMember:";
+    public static final String LIVE_ROOM_MEMBER_LOCK = "LOCK:liveRoomMember:";
+
+    private final RedissonClient redissonClient;
+
+    @Autowired
+    public RedissonMessageService(RedissonClient redissonClient) {
+
+        this.redissonClient = redissonClient;
+    }
+
+    /**
+     * 订阅消息
+     * @param topic 消息主题
+     * @param listener MessageListener
+     */
+    public void subscribe(String topic, MessageListener listener) {
+        RTopic messageTopic = redissonClient.getTopic(topic);
+        messageTopic.addListener(String.class, (channel, msg) -> listener.onMessage(msg));
+    }
+
+    /**
+     * 发布消息
+     * @param topic 消息主题
+     * @param message 消息内容
+     */
+    public void publish(String topic, String message) {
+        RTopic messageTopic = redissonClient.getTopic(topic);
+        messageTopic.publish(message);
+    }
+
+    /**
+     * 消息监听
+     */
+    public interface MessageListener {
+        void onMessage(String message);
+    }
+
+}

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

@@ -12,6 +12,7 @@ import com.yonge.cooleshow.biz.dal.entity.CourseSchedule;
 import com.yonge.cooleshow.biz.dal.entity.TeacherSubjectPrice;
 import com.yonge.cooleshow.biz.dal.vo.*;
 import com.yonge.cooleshow.biz.dal.vo.res.OrderCreateRes;
+import com.yonge.cooleshow.biz.dal.wrapper.course.CourseScheduleWrapper;
 import com.yonge.cooleshow.common.entity.HttpResponseResult;
 import com.yonge.cooleshow.common.enums.YesOrNoEnum;
 import com.yonge.toolset.base.page.PageInfo;
@@ -257,5 +258,12 @@ public interface CourseScheduleService extends IService<CourseSchedule> {
     PageInfo<CourseScheduleRecordVo> selectCourseList(Map<String, Object> param);
 
     IPage<PianoClassVo> queryPianoClass(IPage<PianoClassVo> page, MyCourseSearch search);
+
+    /**
+     * 获取课程直播时间
+     *
+     * @param roomUid 直播间uid
+     */
+    CourseScheduleWrapper.LiveRoomTime getLiveCourseScheduleTime(String roomUid);
 }
 

+ 0 - 13
cooleshow-user/user-biz/src/main/java/com/yonge/cooleshow/biz/dal/service/CourseScheduleStudentPaymentService.java

@@ -47,19 +47,6 @@ public interface CourseScheduleStudentPaymentService extends IService<CourseSche
     List<String> getOrderNoByGroupId( Long courseGroupId);
 
     /**
-    * @description: 获取网络教室成员midi
-     * @param courseScheduleId
-     * @param userId
-    * @return com.yonge.cooleshow.biz.dal.dto.ImNetworkCustomMessage
-    * @author zx
-    * @date 2022/4/6 14:15
-    */
-    ImNetworkCustomMessage getMemberMidi(long courseScheduleId, Long userId);
-
-    //获取伴奏信息
-    ImNetworkRoomMusicSheetDownloadData getMemberExamSong(long courseScheduleId, Long userId);
-
-    /**
     * @description:
      * @param scheduleId    课程编号
      * @param userId    学员编号

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

@@ -4,6 +4,7 @@ import com.baomidou.mybatisplus.extension.service.IService;
 import com.yonge.cooleshow.biz.dal.dao.ImGroupMemberDao;
 import com.yonge.cooleshow.biz.dal.entity.ImGroupMember;
 import com.yonge.cooleshow.biz.dal.enums.ImGroupMemberRoleType;
+import com.yonge.cooleshow.biz.dal.wrapper.im.ImGroupMemberWrapper;
 import io.rong.models.group.GroupMember;
 
 import java.util.List;
@@ -30,16 +31,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 +51,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 +61,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: 删除群成员

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

@@ -1,12 +1,20 @@
 package com.yonge.cooleshow.biz.dal.service;
 
 import com.baomidou.mybatisplus.extension.service.IService;
+import com.microsvc.toolkit.middleware.im.message.GroupMemberWrapper;
+import com.microsvc.toolkit.middleware.rtc.RTCRoomPluginService;
 import com.yonge.cooleshow.biz.dal.dao.ImGroupDao;
+import com.yonge.cooleshow.biz.dal.dto.BasicUserInfo;
 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 io.rong.models.Result;
+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;
@@ -21,6 +29,48 @@ public interface ImGroupService extends IService<ImGroup> {
 
     ImGroupDao getDao();
 
+
+
+    /**
+     * IM 用户注册
+     * @param userId 用户ID
+     * @param username 用户名
+     * @param avatar 用户头象
+     * @return IM聊天Token
+     */
+    ImGroupWrapper.ImUserInfo register(String userId,ClientEnum clientType, String username, String avatar) throws Exception;
+
+    /**
+     * IM 用户注册
+     * @param userId 用户Id
+     * @return String
+     */
+    String getImUserId(String userId,String clientType);
+
+
+    String getImUserId(Long userId, RoleEnum userRole);
+
+
+    String getImUserId(Long userId, ClientEnum clientEnum);
+
+    /**
+     * 解析IM用户规则
+     * @param imUserId IM用户Id
+     * @return String
+     */
+    String analysisImUserId(String imUserId);
+
+
+    /**
+     * 检测imUserid
+     *
+     * @param imUserId IM用户Id
+     * @return String
+     */
+    boolean checkImUserId(String imUserId);
+
+    String analysisImUserClient(String imUserId);
+
     /**
     * @description: 用户主动创建群聊
      * @param imGroup
@@ -38,6 +88,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
@@ -78,7 +132,7 @@ public interface ImGroupService extends IService<ImGroup> {
     void setTeacherFansGroup() throws Exception;
 
     //退群
-    void quit(String groupId, Long userId, ClientEnum clientType) throws Exception;
+    void quit(String groupId, Long userId, ClientEnum clientType,Boolean quit) throws Exception;
 
     /**
      * 用户群组信息
@@ -88,6 +142,8 @@ public interface ImGroupService extends IService<ImGroup> {
      */
     ImGroup findGroupInfoById(String groupId, Long userId);
 
+    void getAndSaveImHistoryMessage(String date) throws Exception;
+
 
     /**
      * 同步即时通讯聊天记录
@@ -103,7 +159,44 @@ public interface ImGroupService extends IService<ImGroup> {
     void saveImHistoryMessage(File file);
 
 
-    void getAndSaveImHistoryMessage(String date) throws Exception;
+    /**
+     * 读取融云数据库信息
+     */
+    List<ImHistoryMessage> getRongYunInfo(int page,int size);
+
+    /**
+     * 导入IM腾讯云
+     * @param info
+     * @throws Exception
+     */
+    void importInfo(List<ImHistoryMessage> info) throws Exception;
+
+    /**
+     * 群迁移,融云->腾讯
+     */
+    void groupTransfer();
+
+    void joinImGroup(String roomId, BasicUserInfo userInfo, String serverProvider, List<Long> studentIds) throws Exception;
+
+    /**
+     * 用户导入
+     */
+    void importUser();
+
+    /**
+     * 计算未导入数据的总条数
+     * @return
+     */
+    int queryCount();
+
+    /**
+     * 更新已修改数据的状态
+     * @param info
+     */
+    void updateStatus(List<ImHistoryMessage> info);
+
+    RTCRoomPluginService getRTCRoomPluginService(String serviceProvider);
 
+    Boolean updateImGroup(ImGroup imGroup);
 }
 

+ 51 - 0
cooleshow-user/user-biz/src/main/java/com/yonge/cooleshow/biz/dal/service/ImLiveBroadcastRoomMemberService.java

@@ -0,0 +1,51 @@
+package com.yonge.cooleshow.biz.dal.service;
+
+import com.baomidou.mybatisplus.core.metadata.IPage;
+import com.baomidou.mybatisplus.extension.service.IService;
+import com.yonge.cooleshow.biz.dal.wrapper.liveroom.ImLiveBroadcastRoomMemberWrapper;
+import com.yonge.cooleshow.biz.dal.entity.ImLiveBroadcastRoomMember;
+import com.yonge.toolset.base.page.PageInfo;
+
+import java.util.Map;
+
+/**
+ * 直播间人员关系表
+ * 2023-08-15 15:50:17
+ */
+public interface ImLiveBroadcastRoomMemberService extends IService<ImLiveBroadcastRoomMember>  {
+
+	/**
+     * 查询详情
+     * @param id 详情ID
+     * @return ImLiveBroadcastRoomMember
+     */
+	ImLiveBroadcastRoomMember detail(Long id);
+
+    /**
+     * 分页查询
+     * @param page IPage<ImLiveBroadcastRoomMember>
+     * @param query ImLiveBroadcastRoomMemberWrapper.ImLiveBroadcastRoomMemberQuery
+     * @return IPage<ImLiveBroadcastRoomMember>
+     */
+    IPage<ImLiveBroadcastRoomMember> selectPage(IPage<ImLiveBroadcastRoomMember> page, ImLiveBroadcastRoomMemberWrapper.ImLiveBroadcastRoomMemberQuery query);
+	
+    /**
+     * 添加
+     * @param imLiveBroadcastRoomMember ImLiveBroadcastRoomMemberWrapper.ImLiveBroadcastRoomMember
+     * @return Boolean
+     */
+     Boolean add(ImLiveBroadcastRoomMemberWrapper.ImLiveBroadcastRoomMember imLiveBroadcastRoomMember);   
+
+    /**
+     * 更新
+     * @param imLiveBroadcastRoomMember ImLiveBroadcastRoomMemberWrapper.ImLiveBroadcastRoomMember
+     * @return Boolean
+     */
+     Boolean update(ImLiveBroadcastRoomMemberWrapper.ImLiveBroadcastRoomMember imLiveBroadcastRoomMember);
+
+
+    /**
+     * 查询房间观看人员详情
+     */
+    PageInfo<ImLiveBroadcastRoomMemberWrapper.ImLiveBroadcastRoomMember> queryRoomMember(Map<String, Object> param);
+}

+ 3 - 4
cooleshow-user/user-biz/src/main/java/com/yonge/cooleshow/biz/dal/service/ImNetworkRoomMemberService.java

@@ -1,13 +1,11 @@
 package com.yonge.cooleshow.biz.dal.service;
 
 import com.baomidou.mybatisplus.extension.service.IService;
-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.UserRoleEnum;
+import com.yonge.cooleshow.biz.dal.enums.RoleEnum;
 
-import java.util.Date;
 import java.util.List;
 
 /**
@@ -20,7 +18,8 @@ public interface ImNetworkRoomMemberService extends IService<ImNetworkRoomMember
 
     ImNetworkRoomMemberDao getDao();
 
-    ImNetworkRoomMember initRoomMember(String roomId, BasicUserInfo sysUser, UserRoleEnum userRole);
+    //初始化房间用户信息
+    ImNetworkRoomMember initRoomMember(String roomId, BasicUserInfo sysUser, RoleEnum userRole,Boolean microphone);
 
 }
 

+ 22 - 0
cooleshow-user/user-biz/src/main/java/com/yonge/cooleshow/biz/dal/service/ImNetworkRoomMemberStatusService.java

@@ -0,0 +1,22 @@
+package com.yonge.cooleshow.biz.dal.service;
+
+import com.baomidou.mybatisplus.extension.service.IService;
+import com.yonge.cooleshow.biz.dal.dto.ImNetworkMetronomeMessage;
+import com.yonge.cooleshow.biz.dal.dto.ImNetworkRoomMusicSheetDownloadData;
+import com.yonge.cooleshow.biz.dal.entity.ImNetworkRoomMember;
+import com.yonge.cooleshow.biz.dal.entity.ImNetworkRoomMemberStatus;
+
+/**
+ * 网络教室成员状态表
+ * 2023-08-14 15:47:02
+ */
+public interface ImNetworkRoomMemberStatusService extends IService<ImNetworkRoomMemberStatus>  {
+
+    void add(String roomId);
+
+    //获取网络教室成员midi
+    ImNetworkMetronomeMessage getMemberMidi(String roomId);
+
+    //获取伴奏信息
+    ImNetworkRoomMusicSheetDownloadData getMemberExamSong(String roomId);
+}

+ 6 - 4
cooleshow-user/user-biz/src/main/java/com/yonge/cooleshow/biz/dal/service/ImNetworkRoomService.java

@@ -5,8 +5,8 @@ import com.yonge.cooleshow.biz.dal.dao.ImNetworkRoomDao;
 import com.yonge.cooleshow.biz.dal.dto.*;
 import com.yonge.cooleshow.biz.dal.entity.ImNetworkRoom;
 import com.yonge.cooleshow.biz.dal.enums.ClientEnum;
-import com.yonge.cooleshow.biz.dal.enums.UserRoleEnum;
-import com.yonge.cooleshow.common.entity.HttpResponseResult;
+import com.yonge.cooleshow.biz.dal.enums.RoleEnum;
+import com.yonge.cooleshow.common.entity.BaseResponse;
 
 import java.util.List;
 
@@ -21,7 +21,9 @@ public interface ImNetworkRoomService extends IService<ImNetworkRoom> {
     ImNetworkRoomDao getDao();
 
     //加入网络教室
-    HttpResponseResult<ImNetworkRoomResult> joinRoom(Long courseScheduleId, ClientEnum clientType) throws Exception;
+    BaseResponse<ImNetworkRoomResult> joinRoom(String roomId, RoleEnum userRole);
+
+    BaseResponse<ImNetworkRoomResult> roomInfo(ImNetworkBaseDto imNetworkBaseDto);
 
     //加入网络教室成功
     void joinRoomSuccess(String roomId, String imUserId) throws Exception;
@@ -60,6 +62,6 @@ public interface ImNetworkRoomService extends IService<ImNetworkRoom> {
     void deviceStatusSync(ImNetworkDeviceControlDto deviceStatusSync) throws Exception;
 
     //查询不在教室的学员
-    List<BasicUserInfo> queryNoJoinStu(Long roomId);
+    List<BasicUserInfoDto> queryNoJoinStu(String roomId);
 }
 

+ 42 - 0
cooleshow-user/user-biz/src/main/java/com/yonge/cooleshow/biz/dal/service/ImService.java

@@ -0,0 +1,42 @@
+package com.yonge.cooleshow.biz.dal.service;
+
+import com.yonge.cooleshow.biz.dal.dto.BasicUserInfo;
+import com.yonge.cooleshow.biz.dal.dto.ImNetworkCustomMessage;
+import com.yonge.cooleshow.biz.dal.dto.ImNetworkDeviceControlDto;
+import com.yonge.cooleshow.biz.dal.dto.ImNetworkMusicSheetDownloadMessageContent;
+import com.yonge.cooleshow.biz.dal.entity.ImNetworkRoom;
+import com.yonge.cooleshow.biz.dal.entity.ImNetworkRoomMember;
+
+/**
+ * 网络教室成员(ImNetworkRoomMember)表服务接口
+ *
+ * @author zx
+ * @since 2022-03-30 16:36:38
+ */
+public interface ImService{
+
+    //发送人员变动消息
+    void publishMemberChangedMessage(ImNetworkRoomMember roomMember,String serviceProvider) throws Exception;
+
+    //发送display改动通知
+    void sendDisplay(ImNetworkRoomMember roomMember, ImNetworkRoom room,String serviceProvider) throws Exception;
+
+    //发送节拍器消息
+    void sendImPlayMidiMessage(ImNetworkCustomMessage customMessage) throws Exception;
+
+    //通知学员下载伴奏
+    void pushDownloadMusicSheetMsg(ImNetworkMusicSheetDownloadMessageContent content, BasicUserInfo userInfo) throws Exception;
+
+    void pushDeviceResourceMessage(ImNetworkDeviceControlDto deviceControl,BasicUserInfo teacher) throws Exception;
+
+    //用户同意设备控制
+    void pushApproveControlDevice(ImNetworkDeviceControlDto deviceControl, ImNetworkRoomMember roomMember
+            ,BasicUserInfo student,BasicUserInfo teacher) throws Exception;
+
+    void sendDeviceStatusSync(ImNetworkDeviceControlDto deviceStatusSync, ImNetworkRoomMember roomMember) throws Exception;
+
+    void sendRejectControlDevice(ImNetworkDeviceControlDto deviceControl, ImNetworkRoomMember roomMember, BasicUserInfo teacher) throws Exception;
+
+    void sendQuitRoomMsg(ImNetworkRoomMember roomMember,String serviceProvider) throws Exception;
+}
+

+ 43 - 0
cooleshow-user/user-biz/src/main/java/com/yonge/cooleshow/biz/dal/service/LiveBroadcastRoomDataService.java

@@ -0,0 +1,43 @@
+package com.yonge.cooleshow.biz.dal.service;
+
+import com.baomidou.mybatisplus.core.metadata.IPage;
+import com.baomidou.mybatisplus.extension.service.IService;
+import com.yonge.cooleshow.biz.dal.wrapper.liveroom.LiveBroadcastRoomDataWrapper;
+import com.yonge.cooleshow.biz.dal.entity.LiveBroadcastRoomData;
+
+/**
+ * 直播房间数据表
+ * 2023-08-15 15:50:17
+ */
+public interface LiveBroadcastRoomDataService extends IService<LiveBroadcastRoomData>  {
+
+	/**
+     * 查询详情
+     * @param id 详情ID
+     * @return LiveBroadcastRoomData
+     */
+	LiveBroadcastRoomData detail(Long id);
+
+    /**
+     * 分页查询
+     * @param page IPage<LiveBroadcastRoomData>
+     * @param query LiveBroadcastRoomDataWrapper.LiveBroadcastRoomDataQuery
+     * @return IPage<LiveBroadcastRoomData>
+     */
+    IPage<LiveBroadcastRoomData> selectPage(IPage<LiveBroadcastRoomData> page, LiveBroadcastRoomDataWrapper.LiveBroadcastRoomDataQuery query);
+	
+    /**
+     * 添加
+     * @param liveBroadcastRoomData LiveBroadcastRoomDataWrapper.LiveBroadcastRoomData
+     * @return Boolean
+     */
+     Boolean add(LiveBroadcastRoomDataWrapper.LiveBroadcastRoomData liveBroadcastRoomData);   
+
+    /**
+     * 更新
+     * @param liveBroadcastRoomData LiveBroadcastRoomDataWrapper.LiveBroadcastRoomData
+     * @return Boolean
+     */
+     Boolean update(LiveBroadcastRoomDataWrapper.LiveBroadcastRoomData liveBroadcastRoomData);
+     
+}

+ 101 - 14
cooleshow-user/user-biz/src/main/java/com/yonge/cooleshow/biz/dal/service/LiveRoomService.java

@@ -1,14 +1,16 @@
 package com.yonge.cooleshow.biz.dal.service;
 
+import java.util.Date;
 import java.util.List;
 import java.util.Map;
 
 import com.baomidou.mybatisplus.extension.service.IService;
+import com.microsvc.toolkit.middleware.live.message.TencentWrapper;
 import com.yonge.cooleshow.biz.dal.dao.LiveRoomDao;
-import com.yonge.cooleshow.biz.dal.entity.ImRoomMessage;
-import com.yonge.cooleshow.biz.dal.entity.ImUserStateSync;
-import com.yonge.cooleshow.biz.dal.entity.LiveRoom;
-import com.yonge.cooleshow.biz.dal.entity.RoomInfoCache;
+import com.yonge.cooleshow.biz.dal.dto.LiveRoomStatus;
+import com.yonge.cooleshow.biz.dal.dto.TencentData;
+import com.yonge.cooleshow.biz.dal.entity.*;
+import com.yonge.cooleshow.biz.dal.enums.RoomTypeEnum;
 import com.yonge.cooleshow.biz.dal.vo.TeacherLivingInfoVo;
 import com.yonge.cooleshow.biz.dal.wrapper.liveroom.LiveRoomWrapper;
 import com.yonge.toolset.base.page.PageInfo;
@@ -41,14 +43,14 @@ public interface LiveRoomService extends IService<LiveRoom> {
      */
     RoomInfoCache studentCheckRoomInfo(String roomUid);
 
+
     /**
      * 主讲人查询并校验房间信息
      *
      * @param roomUid 房间uid
-     * @param userId  主讲人id
      * @return
      */
-    RoomInfoCache speakerCheckRoomInfo(String roomUid);
+    LiveRoomWrapper.LiveRoomVo speakerCheckRoomInfo(String roomUid);
 
     /**
      * 定时任务创建直播间
@@ -67,6 +69,8 @@ public interface LiveRoomService extends IService<LiveRoom> {
      */
     void destroyLiveRoom(String roomUId);
 
+    void updateLiveCourseSchedule(String preCreateRoomMinute, Map<Long, String> titleMap, Map<Long, String> remarkMap, RoomTypeEnum en, Date now, CourseSchedule c);
+
     /**
      * 创建临时房间-直播间
      */
@@ -88,21 +92,15 @@ public interface LiveRoomService extends IService<LiveRoom> {
      */
     void syncLike(String roomUid, Integer likeNum);
 
-    /**
-     * 主讲人-进入房间
-     *
-     * @param roomUid 房间uid
-     * @param userId  主讲人id
-     */
-    RoomInfoCache speakerJoinRoom(String roomUid);
 
+    void setGroupMemberDefinedData(LiveRoomWrapper.LiveRoomVo  roomVo, Integer onlineUser, Integer totalUser);
     /**
      * 观看者-进入房间
      *
      * @param roomUid 房间uid
      * @param userId  观看者id
      */
-    RoomInfoCache joinRoom(String roomUid, Long userId);
+    void joinRoom(String roomUid, Long userId);
 
     /**
      * 发送消息
@@ -145,5 +143,94 @@ public interface LiveRoomService extends IService<LiveRoom> {
      * @return LiveRoomWrapper
      */
     LiveRoomWrapper findLiveRoomDetailInfoByRoomId(String liveRoomId, Long userId);
+
+    void createLiveRoomVideoRecord(TencentData.CallbackSteamRecordEvent event);
+
+
+    /**
+     * 直播群成员在线状态回调处理
+     *
+     */
+    void callbackOnMemberStateChange(TencentData.CallbackOnMemberStateChange callbackOnMemberStateChange);
+    /**
+     * 群成员离开之后回调
+     */
+    void callbackAfterMemberExit(TencentData.CallbackAfterMemberExit callbackAfterMemberExit);
+
+    /**
+     * 新成员入群之后回调
+     */
+    void callbackAfterNewMemberJoin(TencentData.CallbackAfterNewMemberJoin callbackAfterNewMemberJoin);
+
+    // 定时任务凌晨2点,关闭腾讯直播间, 融云直播间自动关闭,不做处理
+    void destroyLiveRoom();
+
+    boolean tryDestroyLiveRoom(LiveRoom liveRoom);
+
+
+    /**
+     * 更新主播直播间状态
+     *
+     * @param status 直播间状态
+     * @return
+     */
+    Boolean updateRoomStatus(LiveRoomStatus status);
+
+    /**
+     * 进入直播间检查数据
+     *
+     * @param roomUid 房间uid
+     * @param userId  用户id
+     * @param osType  默认学生端  0:pc端 1:学生端 2:老师端
+     */
+    LiveRoomWrapper.LiveRoomVo queryRoomAndCheck(String roomUid, Long userId, int osType);
+
+    /**
+     * 直播间推流状态查询
+     *
+     * @param roomUid 房间号
+     */
+    TencentWrapper.LiveStreamState roomLiveStreamStatus(String roomUid);
+
+
+    /**
+     * 查询直播间信息
+     *
+     * @param roomUid 直播间uid
+     */
+    LiveRoomWrapper.LiveRoomVo queryRoomInfo(String roomUid);
+
+    /**
+     * 同步直播间点赞数
+     *
+     * @param roomUid 直播间uid
+     * @return int
+     */
+    int syncLikeCount(String roomUid);
+
+
+    List<LiveRoomWrapper.BaseRoomUserVo> queryRoomLimitOnlineUserInfo(String roomUid);
+
+
+    /**
+     * 修改用户连麦状态
+     *
+     * @param roomUid 直播房间id
+     * @param userId 用户id
+     * @param whetherMicStatus 连麦状态
+     */
+    void userWhetherMic(String roomUid, Long userId, Integer whetherMicStatus);
+
+    long joinRoom(String roomUid, Long userId, Boolean microphoneFlag);
+
+    /**
+     * 更新直播推流时间
+     * @param event TencentData.CallbackStreamStateEvent
+     */
+    void updateLiveRoomPushStreamTime(TencentData.CallbackStreamStateEvent event);
+
+    void closeLive(String roomUid, Long speakerId, String sequence);
+
+    void startLive(String roomUid, Integer speakerId, String sequence);
 }
 

+ 37 - 0
cooleshow-user/user-biz/src/main/java/com/yonge/cooleshow/biz/dal/service/RoomService.java

@@ -0,0 +1,37 @@
+package com.yonge.cooleshow.biz.dal.service;
+
+import com.baomidou.mybatisplus.extension.service.IService;
+import com.microsvc.toolkit.middleware.rtc.message.RTCRoomConfig;
+import com.yonge.cooleshow.biz.dal.dao.ImNetworkRoomDao;
+import com.yonge.cooleshow.biz.dal.dto.BasicUserInfo;
+import com.yonge.cooleshow.biz.dal.dto.ImNetworkDisplayDataDto;
+import com.yonge.cooleshow.biz.dal.entity.ImNetworkRoom;
+import com.yonge.cooleshow.biz.dal.entity.ImNetworkRoomMember;
+import com.yonge.cooleshow.biz.dal.enums.RoleEnum;
+
+/**
+ * 网络教室房间(ImNetworkRoom)表服务接口
+ *
+ * @author zx
+ * @since 2022-03-30 16:36:36
+ */
+public interface RoomService extends IService<ImNetworkRoom> {
+
+    ImNetworkRoomDao getDao();
+
+    //初始化网络教室基本信息
+    ImNetworkRoom initRoom(String roomId, RoleEnum userRole, String imUserId) throws Exception;
+
+    //获取腾讯相关房间配置信息
+    RTCRoomConfig getRtcRoomConfig(String serviceProvider, ImNetworkRoomMember roomMember);
+
+    //用户成功推出房间
+    void quitRoomSuccess(RoleEnum roleEnum,String imUserId,String roomId, String serviceProvider) throws Exception;
+
+    //修改节拍器
+    void updateDisplay(ImNetworkRoomMember roomMember, ImNetworkRoom room, String serviceProvider) throws Exception;
+
+    //移动端用来渲染页面
+    void display(ImNetworkDisplayDataDto displayData,String serviceProvider) throws Exception;
+}
+

+ 0 - 1
cooleshow-user/user-biz/src/main/java/com/yonge/cooleshow/biz/dal/service/UploadFileService.java

@@ -62,7 +62,6 @@ public class UploadFileService {
             uploadReturn.setMessage("上传图片格式错误,目前只支持" + supportType);
             return uploadReturn;
         }
-
         String root = fileRoot;
         if (StringUtils.isBlank(root)) {
             uploadReturn.setMessage("上传临时目录没有配置");

+ 172 - 0
cooleshow-user/user-biz/src/main/java/com/yonge/cooleshow/biz/dal/service/im/ImGroupCoreService.java

@@ -0,0 +1,172 @@
+package com.yonge.cooleshow.biz.dal.service.im;
+
+import com.microsvc.toolkit.middleware.im.message.GroupMemberWrapper;
+import com.yonge.cooleshow.biz.dal.enums.ClientEnum;
+import com.yonge.cooleshow.biz.dal.enums.RoleEnum;
+import com.yonge.cooleshow.biz.dal.wrapper.im.ImGroupMemberAuditWrapper;
+import com.yonge.cooleshow.biz.dal.wrapper.im.ImGroupMemberWrapper;
+import com.yonge.cooleshow.biz.dal.wrapper.im.ImGroupWrapper;
+
+import java.util.List;
+
+/**
+ * IM群组服务
+ * Created by Eric.Shang on 2022/11/26.
+ */
+public interface ImGroupCoreService {
+
+    /**
+     * IM 用户注册
+     * @param userId 用户ID
+     * @param username 用户名
+     * @param avatar 用户头象
+     * @return IM聊天Token
+     */
+    ImGroupWrapper.ImUserInfo register(String userId,String clientType, String username, String avatar) throws Exception;
+
+    /**
+     * IM 用户注册
+     * @param userId 用户Id
+     * @return String
+     */
+    String getImUserId(String userId,String clientType);
+
+
+    String getImUserId(Long userId, RoleEnum userRole);
+
+
+    String getImUserId(Long userId, ClientEnum clientEnum);
+
+    /**
+     * 解析IM用户规则
+     * @param imUserId IM用户Id
+     * @return String
+     */
+    String analysisImUserId(String imUserId);
+
+
+    /**
+     * 检测imUserid
+     *
+     * @param imUserId IM用户Id
+     * @return String
+     */
+    boolean checkImUserId(String imUserId);
+
+    String analysisImUserClient(String imUserId);
+
+
+    /**
+     * 添加群组信息
+     *
+     * @param groupMember 用户信息
+     * @param imGroup     ImGroupWrapper.ImGroup
+     * @return Boolean
+     * @throws Exception Exception
+     */
+    String groupCreate(GroupMemberWrapper.ImGroupMember groupMember, ImGroupWrapper.ImGroup imGroup) throws Exception;
+
+    /**
+     * 添加群组信息
+     * @param imGroups ImGroupWrapper.ImGroup
+     * @throws Exception Exception
+     */
+    void groupCreate(List<ImGroupWrapper.ImGroup> imGroups) throws Exception;
+
+    /**
+     * 群组解散
+     * @param groupId 群组ID
+     * @throws Exception Exception
+     */
+    void groupDismiss( String groupId) throws Exception;
+
+    /**
+     * 用户主动退出群聊
+     * @param groupMember 用户信息
+     * @param groupId 群组ID
+     * @throws Exception Exception
+     */
+    void groupQuit(GroupMemberWrapper.ImGroupMember groupMember, String groupId,Boolean quit) throws Exception;
+
+    /**
+     * 用户主动退出群聊
+     * @param userId 用户信息
+     * @param clientType EClientType
+     * @param imGroupId 群组ID
+     * @throws Exception Exception
+     */
+    void groupQuit(Long userId, String clientType, String imGroupId,Boolean quit) throws Exception;
+
+    /**
+     * 入群申请消息
+     * @param groupMember JwtUserInfo<?>
+     * @param memberAudit ImGroupMemberAuditWrapper.ImGroupMemberAudit
+     */
+    void groupJoinApply(GroupMemberWrapper.ImGroupMember groupMember, ImGroupMemberAuditWrapper.ImGroupMemberAudit memberAudit) throws Exception;
+
+    /**
+     * 添加群组成员
+     * @param groupId 群组ID
+     * @param groupMembers List<ImGroupMemberWrapper.ImGroupMember>
+     * @throws Exception Exception
+     */
+    void saveImGroupMemberList(String groupId, List<ImGroupMemberWrapper.ImGroupMember> groupMembers) throws Exception;
+
+    /**
+     * 添加群组成员
+     * @param imGroupId 群组主键ID
+     * @param groupMembers List<ImGroupMemberWrapper.ImGroupMember>
+     * @throws Exception Exception
+     */
+    void saveImGroupMemberList(Long imGroupId, List<ImGroupMemberWrapper.ImGroupMember> groupMembers) throws Exception;
+
+    /**
+     * 群成员加入
+     * @param imGroupId 群主ID
+     * @param groupMembers 群成员
+     * @throws Exception Exception
+     */
+    void groupMemberJoin(String imGroupId, List<ImGroupMemberWrapper.ImGroupMember> groupMembers) throws Exception;
+
+    /**
+     * 入群申请审核
+     * @param groupMember JwtUserInfo<?>
+     * @param audit ImGroupMemberAuditWrapper.ApplyBatchAudit
+     */
+    void groupJoinAudit(GroupMemberWrapper.ImGroupMember groupMember, ImGroupMemberAuditWrapper.ApplyBatchAudit audit) throws Exception;
+
+    /**
+     * 添加进入群组
+     *
+     * @param userId 用户ID
+     * @param clientType 客户端类型
+     * @param imGroupId 群组ID
+     */
+    void groupJoin(Long userId, String clientType, Long imGroupId) throws Exception;
+
+    /**
+     * 转让群主
+     *
+     * @param groupId 群组ID
+     * @param newOwner 新群主
+     * @param oldOwner 旧群主
+     */
+    void changeGroupOwner(String groupId, String newOwner, String oldOwner) throws Exception;
+
+    /**
+     * 更新群信息
+     * @param groupId 群ID
+     * @param groupName 群名称
+     * @param faceUrl 群头像
+     * @throws Exception Exception
+     */
+    void modifyGroupInfo(String groupId, String groupName, String faceUrl) throws Exception;
+
+    /**
+     * 群成员加入三方IM状态
+     * @param groupMemberIds 群成员ID
+     * @param groupJoin 加群状态
+     */
+    void updateGroupMemberJoinStatus(List<Long> groupMemberIds, Boolean groupJoin);
+
+}

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

@@ -0,0 +1,722 @@
+package com.yonge.cooleshow.biz.dal.service.im.impl;
+
+import com.alibaba.fastjson.JSON;
+import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
+import com.baomidou.mybatisplus.core.toolkit.IdWorker;
+import com.baomidou.mybatisplus.core.toolkit.Wrappers;
+import com.google.common.collect.Lists;
+import com.microsvc.toolkit.common.tools.ThreadPool;
+import com.microsvc.toolkit.middleware.im.ImPluginContext;
+import com.microsvc.toolkit.middleware.im.message.GroupMemberWrapper;
+import com.microsvc.toolkit.middleware.im.properties.ImConfigProperties;
+import com.yonge.cooleshow.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;
+import com.yonge.cooleshow.biz.dal.enums.RoleEnum;
+import com.yonge.cooleshow.biz.dal.service.ImGroupMemberAuditService;
+import com.yonge.cooleshow.biz.dal.service.ImGroupMemberService;
+import com.yonge.cooleshow.biz.dal.service.ImGroupService;
+import com.yonge.cooleshow.biz.dal.service.im.ImGroupCoreService;
+import com.yonge.cooleshow.biz.dal.wrapper.im.ImGroupMemberAuditWrapper;
+import com.yonge.cooleshow.biz.dal.wrapper.im.ImGroupMemberWrapper;
+import com.yonge.cooleshow.biz.dal.wrapper.im.ImGroupWrapper;
+import com.yonge.toolset.base.exception.BizException;
+import lombok.extern.slf4j.Slf4j;
+import org.apache.commons.collections.CollectionUtils;
+import org.apache.commons.lang3.StringUtils;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.stereotype.Service;
+
+import java.text.MessageFormat;
+import java.util.*;
+import java.util.stream.Collectors;
+
+/**
+ * IM群组务
+ * Created by Eric.Shang on 2022/11/26.
+ */
+@Slf4j
+@Service
+public class ImGroupCoreServiceImpl implements ImGroupCoreService {
+
+    @Autowired
+    private ImPluginContext imPluginContext;
+    @Autowired
+    private ImGroupService imGroupService;
+    @Autowired
+    private ImConfigProperties imConfig;
+    @Autowired
+    private ImGroupMemberService imGroupMemberService;
+    @Autowired
+    private ImGroupMemberAuditService imGroupMemberAuditService;
+
+    /**
+     * IM 用户注册
+     *
+     * @param userId   用户ID
+     * @param username 用户名
+     * @param avatar   用户头象
+     * @return IM聊天Token
+     */
+    @Override
+    public ImGroupWrapper.ImUserInfo register(String userId,String clientType, String username, String avatar) throws Exception {
+
+        ImGroupWrapper.ImUserInfo userInfo = ImGroupWrapper.ImUserInfo.builder()
+                .imUserId("").imToken("").build();
+        // 生成IM聊天Token
+        try {
+
+            // 聊天Token
+            String imUserId = getImUserId(userId,clientType);
+
+            // 生成签名
+            userInfo.imUserId(imUserId)
+                    .setImToken(imPluginContext.getPluginService().register(imUserId, username, avatar));
+
+        } catch (Exception e) {
+            log.error("register ImToken EX, userId={}, username={}", userId, username, e);
+        }
+        return userInfo;
+    }
+
+    /**
+     * IM 用户注册
+     *
+     * @param userId 用户Id
+     * @return String
+     */
+    @Override
+    public String getImUserId(String userId, String clientType) {
+        String imUserId = userId;
+        if (StringUtils.isNotBlank(imConfig.getAppPrefix()) && !userId.startsWith(imConfig.getAppPrefix())) {
+            imUserId = MessageFormat.format("{0}_{1}_{2}", imConfig.getAppPrefix(), userId, clientType);
+        }
+        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;
+    }
+
+
+    /**
+     * 解析IM用户规则
+     *
+     * @param imUserId IM用户Id
+     * @return String
+     */
+    @Override
+    public String analysisImUserId(String imUserId) {
+        if (StringUtils.isNotBlank(imConfig.getAppPrefix()) && imUserId.startsWith(imConfig.getAppPrefix())) {
+            return imUserId.replace(imConfig.getAppPrefix() + "_", "").split("_")[0];
+        }
+        return imUserId;
+    }
+
+
+    /**
+     * 检测imUserid
+     *
+     * @param imUserId IM用户Id
+     * @return String
+     */
+    @Override
+    public boolean checkImUserId(String imUserId) {
+        return imUserId.startsWith(imConfig.getAppPrefix());
+    }
+
+    @Override
+    public String analysisImUserClient(String imUserId) {
+        if (StringUtils.isNotBlank(imConfig.getAppPrefix()) && imUserId.startsWith(imConfig.getAppPrefix())) {
+            imUserId =  imUserId.replace(imConfig.getAppPrefix() + "_", "");
+            String[] s = imUserId.split("_");
+            if (s.length > 1) {
+                return imUserId.replace(s[0] + "_", "");
+            }
+        }
+        return imUserId;
+    }
+
+    /**
+     * 添加群组信息
+     *
+     * @param userInfo 用户信息
+     * @param imGroup  ImGroupWrapper.ImGroup
+     * @return Boolean
+     */
+    @Override
+    public String groupCreate(GroupMemberWrapper.ImGroupMember userInfo, ImGroupWrapper.ImGroup imGroup) throws Exception {
+
+        long id = Optional.ofNullable(imGroup.getId()).orElse(IdWorker.getId());
+        // 生成群组ID
+        imGroup.id(id)
+                .type(Optional.ofNullable(imGroup.getType()).orElse("CLASS"))
+                .groupId(String.valueOf(id));
+
+        ImGroup group = JSON.parseObject(imGroup.jsonString(), ImGroup.class);
+        group.setId(imGroup.getGroupId());
+        // 保存群组信息
+        imGroupService.saveOrUpdate(group);
+
+
+        List<ImGroupMemberWrapper.ImGroupMember> groupMembers = Lists.newArrayList();
+        //记录群成员
+        ImGroupMemberWrapper.ImGroupMember groupMember = ImGroupMemberWrapper.ImGroupMember
+                .builder()
+                .id(IdWorker.getId())
+                .groupId(imGroup.getGroupId())
+                .userId(userInfo.getUserId())
+                .clientType(userInfo.getClientType())
+                .avatar(userInfo.getAvatar())
+                .nickname(userInfo.getNickname())
+                .isAdmin(true)
+                .roleType(userInfo.getRoleType())
+                .build();
+
+        groupMembers.add(groupMember.imUserId(getImUserId(groupMember.getUserId().toString(),userInfo.getClientType())));
+        imGroupMemberService.insertBatch(JSON.parseArray(JSON.toJSONString(groupMembers), ImGroupMember.class));
+
+        // 自动激活学生IM帐号
+        registerUser(groupMembers);
+
+        // 创建IM群组
+        imPluginContext.getPluginService().groupCreate(imGroup.getGroupId(), imGroup.getName(),imGroup.getImg(),
+                getImUserId( userInfo.getUserId().toString(), userInfo.getClientType()));
+
+        // 添加群成员到当前群组
+        imPluginContext.getPluginService().groupJoin(imGroup.getGroupId(), imGroup.getName(),
+                getImGroupMembers(groupMembers));
+
+        return imGroup.getGroupId();
+    }
+
+    /**
+     * 获取群组成员信息
+     *
+     * @param groupMembers 群组成员信息
+     * @return List<GroupMemberWrapper.ImGroupMember>
+     */
+    private List<GroupMemberWrapper.ImGroupMember> getImGroupMembers(List<ImGroupMemberWrapper.ImGroupMember> groupMembers) {
+        // 统一转换为群组成员信息
+        for (ImGroupMemberWrapper.ImGroupMember member : groupMembers) {
+            member.setImUserId(getImUserId(member.getUserId().toString(),member.getClientType()));
+        }
+        return JSON.parseArray(JSON.toJSONString(groupMembers), GroupMemberWrapper.ImGroupMember.class);
+    }
+
+    /**
+     * 自动注册用户
+     * @param groupMembers List<ImGroupMemberWrapper.ImGroupMember>
+     */
+    private void asyncRegisterUser(List<ImGroupMemberWrapper.ImGroupMember> groupMembers) {
+        ThreadPool.getExecutor().submit(() -> registerUser(groupMembers));
+    }
+
+    /**
+     * 批量导入用户
+     * @param groupMembers List<ImGroupMemberWrapper.ImGroupMember>
+     */
+    private void registerUser(List<ImGroupMemberWrapper.ImGroupMember> groupMembers) {
+        for (ImGroupMemberWrapper.ImGroupMember member : groupMembers) {
+            // 激活用户帐号为空
+            if (StringUtils.isBlank(member.getNickname())) {
+                continue;
+            }
+
+            try {
+                String imUserId = member.getUserId().toString();
+                if (StringUtils.isBlank(imUserId)) {
+                    imUserId = getImUserId(String.valueOf(member.getUserId()),
+                            member.getClientType());
+                }
+
+                imPluginContext.getPluginService().register(imUserId, member.getNickname(), member.getAvatar());
+            } catch (Exception e) {
+                log.error("registerUser member imToken");
+            }
+        }
+    }
+
+    /**
+     * 添加群组信息
+     *
+     * @param imGroups ImGroupWrapper.ImGroup
+     * @throws Exception Exception
+     */
+    @Override
+    public void groupCreate(List<ImGroupWrapper.ImGroup> imGroups) throws Exception {
+
+        if (CollectionUtils.isEmpty(imGroups)) {
+            return;
+        }
+
+        for (ImGroupWrapper.ImGroup item : imGroups) {
+
+            GroupMemberWrapper.ImGroupMember groupMember = GroupMemberWrapper.ImGroupMember.builder()
+                    .userId(item.getCreateBy())
+                    .roleType(ClientEnum.TEACHER.getCode())
+                    .clientType(ClientEnum.TEACHER.getCode())
+                    .build();
+            // 添加群组信息
+            groupCreate(groupMember, item);
+        }
+    }
+
+
+    /**
+     * 群组解散
+     *
+     * @param groupId  群组ID
+     */
+    @Override
+    public void groupDismiss(String groupId) throws Exception {
+
+        // 判定登录用户是否为群主
+        ImGroup imGroup = imGroupService.lambdaQuery().eq(ImGroup::getId, groupId).last("LIMIT 1").one();
+        if (Objects.isNull(imGroup)) {
+            throw new BizException("群组不存在");
+        }
+
+        // 删除入群申请
+        LambdaQueryWrapper<ImGroupMemberAudit> auditQueryWrapper = Wrappers.<ImGroupMemberAudit>lambdaQuery()
+                .eq(ImGroupMemberAudit::getGroupId, groupId);
+        imGroupMemberAuditService.remove(auditQueryWrapper);
+
+        // 获取群成员
+        List<ImGroupMemberWrapper.ImGroupMember> groupMembers = imGroupMemberService.lambdaQuery()
+                .select(ImGroupMember::getUserId, ImGroupMember::getGroupId, ImGroupMember::getRoleType)
+                .eq(ImGroupMember::getGroupId, groupId)
+                .list().stream()
+                .map(x -> ImGroupMemberWrapper.ImGroupMember.builder().userId(x.getUserId()).groupId(x.getGroupId()).clientType(x.getRoleType().getCode()).build())
+                .collect(Collectors.toList());
+
+        // 删除群组
+        imGroupService.remove(Wrappers.<ImGroup>lambdaQuery().eq(ImGroup::getId, groupId));
+
+        // 删除群组成员
+        imGroupMemberService.remove(Wrappers.<ImGroupMember>lambdaQuery().eq(ImGroupMember::getGroupId, groupId));
+
+        // 解散群
+        imPluginContext.getPluginService().groupDismiss(imGroup.getId(), getImGroupMembers(groupMembers));
+
+    }
+
+    /**
+     * 用户主动退出群聊
+     *
+     * @param imGroupMember 用户信息
+     * @param groupId  群组ID
+     * @throws Exception Exception
+     */
+    @Override
+    public void groupQuit(GroupMemberWrapper.ImGroupMember imGroupMember, String groupId,Boolean quit) throws Exception {
+
+        // 判定登录用户是否为群主
+        ImGroup imGroup = imGroupService.lambdaQuery().eq(ImGroup::getId, groupId).last("LIMIT 1").one();
+        if (Objects.isNull(imGroup)) {
+            throw new BizException("群组不存在");
+        }
+
+        // 统计当前群成员用户数
+        long count = imGroupMemberService.count(Wrappers.<ImGroupMember>lambdaQuery().eq(ImGroupMember::getGroupId, groupId));
+
+        // 删除当前用户群成员身份
+        boolean remove = imGroupMemberService.remove(Wrappers.<ImGroupMember>lambdaQuery()
+                .eq(ImGroupMember::getGroupId, groupId)
+                .eq(ImGroupMember::getUserId, imGroupMember.getUserId())
+                .eq(ImGroupMember::getRoleType, imGroupMember.getRoleType())
+        );
+        if (!remove) {
+            // 用户主动退出群聊失败
+            throw new BizException("用户主动退出群聊失败");
+        }
+
+        // 修改群组成员数
+        imGroupService.lambdaUpdate()
+                .eq(ImGroup::getId, imGroup.getId())
+                .set(ImGroup::getMemberNum, count - 1)
+                .update();
+
+        // 群主退出
+        List<ImGroupMemberWrapper.ImGroupMember> groupMembers = Lists.newArrayList();
+        groupMembers.add(ImGroupMemberWrapper.ImGroupMember.builder()
+                .userId(imGroupMember.getUserId())
+                .groupId(groupId)
+                .clientType(imGroupMember.getClientType())
+                .build());
+
+        if (Optional.ofNullable(quit).orElse(true)) {
+            imPluginContext.getPluginService().groupQuit(imGroup.getId(), getImGroupMembers(groupMembers));
+        }
+    }
+
+    /**
+     * 用户主动退出群聊
+     *
+     * @param userId     用户信息
+     * @param clientType EClientType
+     * @param imGroupId  群组ID
+     * @throws Exception Exception
+     */
+    @Override
+    public void groupQuit(Long userId, String clientType, String imGroupId ,Boolean quit) throws Exception {
+
+        ImGroup imGroup = imGroupService.getById(imGroupId);
+        if (Objects.isNull(imGroup)) {
+            throw new BizException("群组不存在");
+        }
+
+        GroupMemberWrapper.ImGroupMember groupMember = GroupMemberWrapper.ImGroupMember.builder()
+                .userId(userId)
+                .roleType(clientType)
+                .clientType(clientType)
+                .build();
+        // 退出群聊
+        groupQuit(groupMember, imGroup.getId(), quit);
+    }
+
+    /**
+     * 入群申请消息
+     *
+     * @param imGroupMember    JwtUserInfo<?>
+     * @param memberAudit ImGroupMemberAuditWrapper.ImGroupMemberAudit
+     */
+    @Override
+    public void groupJoinApply(GroupMemberWrapper.ImGroupMember imGroupMember, ImGroupMemberAuditWrapper.ImGroupMemberAudit memberAudit) throws Exception {
+
+        // 判断群ID是否有效
+        ImGroup imGroup = imGroupService.lambdaQuery().eq(ImGroup::getId, memberAudit.getGroupId()).last("LIMIT 1").one();
+        if (Objects.isNull(imGroup)) {
+            throw new BizException("群组不存在");
+        }
+
+        // 判断用户是否已入群
+        int exists = imGroupMemberService.lambdaQuery()
+                .eq(ImGroupMember::getGroupId, memberAudit.getGroupId())
+                .eq(ImGroupMember::getUserId, memberAudit.getUserId())
+                .eq(ImGroupMember::getRoleType, memberAudit.getRoleType())
+                .count();
+        if (exists > 0) {
+            throw new BizException("用户已入群");
+        }
+
+        // 是否有待审核消息
+        exists = imGroupMemberAuditService.lambdaQuery()
+                .eq(ImGroupMemberAudit::getGroupId, memberAudit.getGroupId())
+                .eq(ImGroupMemberAudit::getUserId, memberAudit.getUserId())
+                .eq(ImGroupMemberAudit::getRoleType, memberAudit.getRoleType())
+                .eq(ImGroupMemberAudit::getAuditStatus, AuditStatusEnum.AUDITING)
+                .count();
+        if (exists >0) {
+            throw new BizException("已有待审核消息");
+        }
+
+        // 保存入群申请消息
+        imGroupMemberAuditService.save(JSON.parseObject(JSON.toJSONString(memberAudit), ImGroupMemberAudit.class));
+
+
+        // 群是否自动通过审核
+        if (Optional.ofNullable(imGroup.getAutoPassFlag()).orElse(false)) {
+
+            // 自动加群
+            List<ImGroupMemberWrapper.ImGroupMember> groupMembers = Lists.newArrayList();
+            //记录群成员
+            ImGroupMemberWrapper.ImGroupMember groupMember = ImGroupMemberWrapper.ImGroupMember
+                    .builder()
+                    .groupId(imGroup.getId())
+                    .userId(memberAudit.getUserId())
+                    .clientType(memberAudit.getClientType())
+                    .avatar(imGroupMember.getAvatar())
+                    .nickname(imGroupMember.getNickname())
+                    .isAdmin(false)
+                    .roleType(memberAudit.getRoleType())
+                    .build();
+
+
+            groupMembers.add(groupMember.imUserId(getImUserId(groupMember.getUserId().toString(),groupMember.getClientType())));
+            saveImGroupMemberList(imGroup.getId(), groupMembers);
+
+        }
+    }
+
+    /**
+     * 添加群组成员
+     * @param imGroupId 群组ID
+     * @param groupMembers List<ImGroupMemberWrapper.ImGroupMember>
+     * @throws Exception Exception
+     */
+    @Override
+    public void saveImGroupMemberList(String imGroupId, List<ImGroupMemberWrapper.ImGroupMember> groupMembers) throws Exception {
+
+        if (CollectionUtils.isEmpty(groupMembers)) {
+            // 群成员为空,直接忽略
+            return;
+        }
+        // 查询群组主键Id
+        for (ImGroupMemberWrapper.ImGroupMember item : groupMembers) {
+            item.id(IdWorker.getId()).imUserId(getImUserId(item.getUserId().toString(), item.getClientType())).setGroupId(imGroupId);
+        }
+
+        imGroupMemberService.insertBatch(JSON.parseArray(JSON.toJSONString(groupMembers), ImGroupMember.class));
+        // 判断群ID是否有效
+        ImGroup imGroup = imGroupService.lambdaQuery().eq(ImGroup::getId, imGroupId).last("LIMIT 1").one();
+        if (Objects.isNull(imGroup)) {
+            throw new BizException("群组不存在");
+        }
+        // 更新群组成员数
+        updateGroupMemberNumber(imGroup.getId(), imGroup);
+
+        if (groupMembers.stream().anyMatch(ImGroupMemberWrapper.ImGroupMember::getGroupJoin)) {
+
+            // 过滤出需要添加到群组的成员
+            groupMembers = groupMembers.stream().filter(ImGroupMemberWrapper.ImGroupMember::getGroupJoin).collect(Collectors.toList());
+
+            // 添加群成员到当前群组
+            imPluginContext.getPluginService().groupJoin(imGroup.getId(), imGroup.getName(), getImGroupMembers(groupMembers));
+
+            // 自动激活用户
+            asyncRegisterUser(groupMembers);
+        }
+    }
+
+    /**
+     * 添加群组成员
+     *
+     * @param imGroupId    群组主键ID
+     * @param groupMembers List<ImGroupMemberWrapper.ImGroupMember>
+     * @throws Exception Exception
+     */
+    @Override
+    public void saveImGroupMemberList(Long imGroupId, List<ImGroupMemberWrapper.ImGroupMember> groupMembers) throws Exception {
+
+        // 群组信息
+        ImGroup imGroup = imGroupService.getById(imGroupId);
+        if (Objects.isNull(imGroup)) {
+            throw new BizException("群组不存在");
+        }
+
+        // 添加群组成员信息
+        saveImGroupMemberList(imGroup.getId(), groupMembers);
+    }
+
+    /**
+     * 群成员加入
+     *
+     * @param imGroupId    群主ID
+     * @param groupMembers 群成员
+     * @throws Exception Exception
+     */
+    @Override
+    public void groupMemberJoin(String imGroupId, List<ImGroupMemberWrapper.ImGroupMember> groupMembers) throws Exception {
+
+        // 群组信息
+        ImGroup imGroup = imGroupService.lambdaQuery().eq(ImGroup::getId, imGroupId).last("LIMIT 1").one();
+        if (Objects.isNull(imGroup)) {
+            throw new BizException("群组不存在");
+        }
+
+        // 添加群组成员信息
+        if (CollectionUtils.isEmpty(groupMembers)) {
+            // 群成员为空,直接忽略
+            return;
+        }
+
+        // 添加群成员到当前群组
+        imPluginContext.getPluginService().groupJoin(imGroup.getId(), imGroup.getName(), getImGroupMembers(groupMembers));
+
+        // 自动激活用户
+        asyncRegisterUser(groupMembers);
+
+    }
+
+    /**
+     * 更新群组成员数
+     * @param groupId 群组ID
+     * @param imGroup ImGroup
+     */
+    private void updateGroupMemberNumber(String groupId, ImGroup imGroup) {
+
+        // 统计当前群成员用户数
+        long count = imGroupMemberService.count(Wrappers.<ImGroupMember>lambdaQuery().eq(ImGroupMember::getGroupId, groupId));
+
+        // 修改群组成员数
+        imGroupService.lambdaUpdate()
+            .eq(ImGroup::getId, imGroup.getId())
+            .set(ImGroup::getMemberNum, count)
+            .update();
+    }
+
+    /**
+     * 入群申请审核
+     *
+     * @param imGroupMember JwtUserInfo<?>
+     * @param audit    ImGroupMemberAuditWrapper.ApplyBatchAudit
+     */
+    @Override
+    public void groupJoinAudit(GroupMemberWrapper.ImGroupMember imGroupMember, ImGroupMemberAuditWrapper.ApplyBatchAudit audit) throws Exception {
+
+        Collection<ImGroupMemberAudit> memberAudits = imGroupMemberAuditService.listByIds(audit.getBatchAuditIds());
+        // 判断申请审核状态是否匹配
+        boolean anyMatch = memberAudits.stream().anyMatch(x -> x.getAuditStatus() != AuditStatusEnum.AUDITING);
+
+        if (CollectionUtils.isEmpty(memberAudits) || anyMatch) {
+            throw new BizException("审核状态不匹配");
+        }
+
+        ImGroup imGroup = imGroupService.getById(audit.getGroupId());
+        if (Objects.isNull(imGroup)) {
+            throw new BizException("群组不存在");
+        }
+
+        // 非群主用户,不能进行审核
+        if (!imGroupMember.getUserId().equals(imGroup.getCreateBy())) {
+            throw new BizException("非群主用户,不能进行审核");
+        }
+
+        // 批量更新入群申请状态
+        imGroupMemberAuditService.lambdaUpdate()
+                .in(ImGroupMemberAudit::getId, audit.getBatchAuditIds())
+                .eq(ImGroupMemberAudit::getGroupId, audit.getGroupId())
+                .set(ImGroupMemberAudit::getAuditStatus, audit.getAuditStatus())
+                .update();
+
+        // 申请通过
+        if (AuditStatusEnum.OPEN.getCode().equals(audit.getAuditStatus())) {
+
+            // 添加群成员
+            List<ImGroupMemberWrapper.ImGroupMember> groupMembers = Lists.newArrayList();
+            for (ImGroupMemberAudit item : memberAudits) {
+
+                //记录群成员
+
+                ImGroupMemberWrapper.ImGroupMember groupMember = ImGroupMemberWrapper.ImGroupMember
+                        .builder()
+                        .groupId(imGroup.getId())
+                        .userId(item.getUserId())
+                        .clientType(item.getRoleType().getCode())
+                        .imUserId(getImUserId(item.getUserId().toString(),item.getRoleType().getCode()))
+                        .avatar("")
+                        .nickname("")
+                        .isAdmin(false)
+                        .roleType(item.getRoleType().getCode())
+                        .build();
+                groupMembers.add(groupMember);
+            }
+            imGroupMemberService.insertBatch(JSON.parseArray(JSON.toJSONString(groupMembers), ImGroupMember.class));
+
+            // 更新群组成员数
+            updateGroupMemberNumber(imGroup.getId(), imGroup);
+
+            // 添加群成员到当前群组
+            imPluginContext.getPluginService().groupJoin(imGroup.getId(), imGroup.getName(), getImGroupMembers(groupMembers));
+
+            // 自动激活用户
+            asyncRegisterUser(groupMembers);
+        }
+    }
+
+    /**
+     * 添加进入群组
+     *
+     * @param userId     用户ID
+     * @param clientType 客户端类型
+     * @param imGroupId  群组ID
+     */
+    @Override
+    public void groupJoin(Long userId, String clientType, Long imGroupId) throws Exception {
+
+        // 群组信息
+        ImGroup imGroup = imGroupService.getById(imGroupId);
+        if (Objects.isNull(imGroup)) {
+            throw new BizException("群组不存在");
+        }
+
+        List<ImGroupMemberWrapper.ImGroupMember> imGroupMembers = new ArrayList<>();
+        ImGroupMemberWrapper.ImGroupMember groupMember = ImGroupMemberWrapper.ImGroupMember
+                .builder()
+                .groupId(imGroup.getId())
+                .userId(userId)
+                .clientType(clientType)
+                .imUserId(getImUserId(userId.toString(),clientType))
+                .isAdmin(false)
+                .roleType(clientType)
+                .build();
+        imGroupMembers.add(groupMember);
+
+        saveImGroupMemberList(imGroupId, imGroupMembers);
+    }
+
+    /**
+     * 转让群主
+     *
+     * @param groupId  群组ID
+     * @param newOwner 新群主
+     * @param oldOwner 旧群主
+     */
+    @Override
+    public void changeGroupOwner(String groupId, String newOwner, String oldOwner) throws Exception {
+
+        // 转主群主
+        imPluginContext.getPluginService().changeGroupOwner(groupId, getImUserId(newOwner,ClientEnum.TEACHER.getCode()), getImUserId(oldOwner,ClientEnum.TEACHER.getCode()));
+    }
+
+    /**
+     * 更新群信息
+     *
+     * @param groupId   群ID
+     * @param groupName 群名称
+     * @param faceUrl   群头像
+     * @throws Exception Exception
+     */
+    @Override
+    public void modifyGroupInfo(String groupId, String groupName, String faceUrl) throws Exception {
+
+        // 更新群信息
+        imPluginContext.getPluginService().modifyGroupInfo(groupId, groupName, faceUrl);
+    }
+
+    /**
+     * 群成员加入三方IM状态
+     *
+     * @param groupMemberIds 群成员ID
+     * @param groupJoin      加群状态
+     */
+    @Override
+    public void updateGroupMemberJoinStatus(List<Long> groupMemberIds, Boolean groupJoin) {
+
+//        if (CollectionUtils.isEmpty(groupMemberIds)) {
+//            return;
+//        }
+//
+//        // 群成员加入三方IM状态
+//        imGroupMemberService.lambdaUpdate()
+//                .set(ImGroupMember::getGroupJoin, groupJoin)
+//                .in(ImGroupMember::getId, groupMemberIds)
+//                .update();
+    }
+
+}

+ 11 - 0
cooleshow-user/user-biz/src/main/java/com/yonge/cooleshow/biz/dal/service/impl/CourseCoursewareServiceImpl.java

@@ -7,6 +7,7 @@ import com.yonge.cooleshow.auth.api.client.SysUserFeignService;
 import com.yonge.cooleshow.biz.dal.dao.CourseCoursewareDao;
 import com.yonge.cooleshow.biz.dal.dao.MusicSheetAccompanimentDao;
 import com.yonge.cooleshow.biz.dal.dao.TeacherDao;
+import com.yonge.cooleshow.biz.dal.dto.MusicSheetAccompanimentResult;
 import com.yonge.cooleshow.biz.dal.dto.search.CourseCoursewareSearch;
 import com.yonge.cooleshow.biz.dal.entity.CourseCourseware;
 import com.yonge.cooleshow.biz.dal.entity.MusicSheetAccompaniment;
@@ -75,8 +76,18 @@ public class CourseCoursewareServiceImpl extends ServiceImpl<CourseCoursewareDao
             return courseCoursewareVoIPage;
         }
         Map<Long, String> userIdUsernameMap = sysUsers.stream().collect(Collectors.toMap(SysUser::getId, SysUser::getUsername));
+        //获取曲目关联的伴奏
+        List<Long> musicSheetIds = records.stream().map(e -> e.getMusicSheetId()).distinct().collect(Collectors.toList());
+        Map<Long, MusicSheetAccompaniment> accoompanimentMap = musicSheetAccompanimentDao.selectList(
+                        Wrappers.<MusicSheetAccompaniment>lambdaQuery()
+                                .in(MusicSheetAccompaniment::getMusicSheetId, musicSheetIds)).stream()
+                .collect(Collectors.groupingBy(MusicSheetAccompaniment::getMusicSheetId, Collectors.collectingAndThen(Collectors.toList(), e -> e.get(0))));
         for (CourseCoursewareVo record : records) {
             record.setUsername(userIdUsernameMap.get(record.getUserId()));
+            MusicSheetAccompaniment musicSheetAccompaniment = accoompanimentMap.get(record.getMusicSheetId());
+            if (musicSheetAccompaniment != null) {
+                record.setMusicSheetAccompanimentId(musicSheetAccompaniment.getId());
+            }
         }
 
         // 设置原音

+ 3 - 3
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()));
             }
         }
         //查询是否购买过该课程组
@@ -1205,7 +1205,7 @@ public class CourseGroupServiceImpl extends ServiceImpl<CourseGroupDao, CourseGr
                 this.updateById(courseGroup);
             } catch (Exception e) {
                 log.error("closeCourseGroup error >>> courseGroup: {} ", JSON.toJSONString(courseGroup));
-                log.error("closeCourseGroup error >>> ", e.getCause());
+                log.error("closeCourseGroup error >>> ", e);
             }
         });
     }

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

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

@@ -22,6 +22,8 @@ import com.yonge.cooleshow.biz.dal.dto.search.PracticeTeacherSearch;
 import com.yonge.cooleshow.biz.dal.entity.*;
 import com.yonge.cooleshow.biz.dal.enums.*;
 import com.yonge.cooleshow.biz.dal.service.*;
+import com.yonge.cooleshow.biz.dal.wrapper.course.CourseScheduleWrapper;
+import com.yonge.cooleshow.biz.dal.wrapper.liveroom.LiveRoomWrapper;
 import com.yonge.cooleshow.common.enums.PostStatusEnum;
 import com.yonge.cooleshow.common.enums.YesOrNoEnum;
 import com.yonge.toolset.payment.util.DistributedLock;
@@ -69,6 +71,7 @@ import java.util.stream.Collectors;
 import java.util.stream.Stream;
 
 import static com.yonge.cooleshow.biz.dal.support.WrapperUtil.inInterSection;
+import static com.yonge.cooleshow.common.constant.SysConfigConstant.DESTROY_EXPIRED_LIVE_ROOM_MINUTE;
 
 /**
  * 老师课程表(CourseSchedule)表服务实现类
@@ -129,6 +132,8 @@ public class CourseScheduleServiceImpl extends ServiceImpl<CourseScheduleDao, Co
     
     @Autowired
     private StudentService studentService;
+    @Autowired
+    private LiveRoomService liveRoomService;
 
     @Override
     public CourseScheduleDao getDao() {
@@ -712,8 +717,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 +735,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 +796,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 +847,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 +903,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()));
             }
         }
 
@@ -1062,7 +1063,7 @@ public class CourseScheduleServiceImpl extends ServiceImpl<CourseScheduleDao, Co
             schedule.setEndTime(date.getEndTime());
             schedule.setCourseGroupId(groupId);
             schedule.setType(CourseScheduleEnum.PRACTICE.getCode());
-            schedule.classNum(i + 1);
+            schedule.setClassNum(i + 1);
             schedule.setTeacherId(scheduleDto.getTeacherId());
             schedule.setLock(1);
             schedule.setStatus(CourseScheduleEnum.NOT_START.getCode());
@@ -1366,10 +1367,10 @@ public class CourseScheduleServiceImpl extends ServiceImpl<CourseScheduleDao, Co
             appAuditVersion = YesOrNoEnum.NO;
         }
         if (teacherId == null) {
-        	Student student = studentService.getById(studentId);
-        	Long subjectId = null;
+            Student student = studentService.getById(studentId);
+            Long subjectId = null;
             if (student != null && student.getSubjectId() != null) {
-            	subjectId = Long.parseLong(student.getSubjectId());
+                subjectId = Long.parseLong(student.getSubjectId());
             }
             
             homePage.setLiveList(baseMapper.selectLive(appAuditVersion, subjectId));
@@ -2056,7 +2057,7 @@ public class CourseScheduleServiceImpl extends ServiceImpl<CourseScheduleDao, Co
             CourseSchedule schedule = new CourseSchedule();
             schedule.setCourseGroupId(courseGroup.getId());
             schedule.setType(CourseScheduleEnum.PIANO_ROOM_CLASS.getCode());
-            schedule.classNum(i + 1);
+            schedule.setClassNum(i + 1);
             schedule.setTeacherId(teacherId);
             schedule.setClassDate(DateUtil.trunc(courseTimeEntity.getStartTime()));
             schedule.setStartTime(courseTimeEntity.getStartTime());
@@ -2469,4 +2470,41 @@ public class CourseScheduleServiceImpl extends ServiceImpl<CourseScheduleDao, Co
         monthToDate(search);
         return page.setRecords(baseMapper.queryPianoClass(page, search));
     }
+
+    @Override
+    public CourseScheduleWrapper.LiveRoomTime getLiveCourseScheduleTime(String roomUid) {
+        CourseSchedule one = this.lambdaQuery().eq(CourseSchedule::getRoomUid, roomUid).last("limit 1").one();
+
+        LiveRoomWrapper.LiveRoomVo liveRoomVo = liveRoomService.queryRoomInfo(roomUid);
+
+        if (liveRoomVo == null) {
+            throw new BizException("直播间不存在");
+        }
+
+        CourseScheduleWrapper.LiveRoomTime liveRoomTime = new CourseScheduleWrapper.LiveRoomTime();
+        liveRoomTime.setLiveRoomUid(liveRoomVo.getRoomUid());
+        liveRoomTime.setTimestamp(System.currentTimeMillis());
+        List<CourseScheduleWrapper.CourseTimeInfoBean> courseTimeInfoBeans = new ArrayList<>();
+
+        liveRoomTime.setCourseScheduleTimes(courseTimeInfoBeans);
+        CourseScheduleWrapper.CourseTimeInfoBean bean = new CourseScheduleWrapper.CourseTimeInfoBean();
+        bean.setStartTime(liveRoomVo.getLiveStartTime().getTime());
+        bean.setEndTime(liveRoomVo.getLiveEndTime().getTime());
+        courseTimeInfoBeans.add(bean);
+        if (liveRoomVo.getType().equals(RoomTypeEnum.LIVE.getCode())) {
+            //查询房间过期时间
+            String expiredMinuteStr = sysConfigService.findConfigValue(DESTROY_EXPIRED_LIVE_ROOM_MINUTE);
+            liveRoomTime.setAutoCloseNetworkRoomTime(expiredMinuteStr);
+
+            if (one != null) {
+                CourseGroup courseGroup = courseGroupService.getById(one.getCourseGroupId());
+                if (courseGroup != null) {
+                    liveRoomTime.setSubjectId(courseGroup.getSubjectId().toString());
+                }
+            }
+
+        }
+
+        return liveRoomTime;
+    }
 }

+ 0 - 17
cooleshow-user/user-biz/src/main/java/com/yonge/cooleshow/biz/dal/service/impl/CourseScheduleStudentPaymentServiceImpl.java

@@ -73,23 +73,6 @@ public class CourseScheduleStudentPaymentServiceImpl extends ServiceImpl<CourseS
 
     }
 
-    @Override
-    public ImNetworkCustomMessage getMemberMidi(long courseScheduleId, Long userId) {
-        String midi = baseMapper.getMidiByCourseIdAndUserId(courseScheduleId, userId);
-        if(StringUtils.isNotEmpty(midi)){
-            return JSONObject.parseObject(midi, ImNetworkCustomMessage.class);
-        }
-        return new ImNetworkCustomMessage();
-    }
-
-    @Override
-    public ImNetworkRoomMusicSheetDownloadData getMemberExamSong(long courseScheduleId, Long userId) {
-        String musicSheet = baseMapper.getMusicSheetByCourseIdAndUserId(courseScheduleId, userId);
-        if(StringUtils.isNotEmpty(musicSheet)){
-            return JSONObject.parseObject(musicSheet, ImNetworkRoomMusicSheetDownloadData.class);
-        }
-        return new ImNetworkRoomMusicSheetDownloadData();
-    }
 
     @Override
     @Transactional(rollbackFor = Exception.class)

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

+ 4 - 3
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;
@@ -80,13 +81,13 @@ public class ImGroupMemberAuditServiceImpl extends ServiceImpl<ImGroupMemberAudi
         }
         Date date = new Date();
         //是否自动通过审核
-        imGroupMemberAudit.setAuditStatus(imGroup.getAutoPassFlag()?AuditStatusEnum.OPEN:AuditStatusEnum.AUDITING);
+        imGroupMemberAudit.setAuditStatus(imGroup.getAutoPassFlag() && autoJoin?AuditStatusEnum.OPEN:AuditStatusEnum.AUDITING);
         imGroupMemberAudit.setUpdateTime(date);
         imGroupMemberAudit.setCreateTime(date);
         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());
             //加入融云群

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

@@ -1,25 +1,30 @@
 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.cooleshow.biz.dal.service.im.ImGroupCoreService;
+import com.yonge.cooleshow.biz.dal.wrapper.im.ImGroupMemberWrapper;
 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 +50,15 @@ public class ImGroupMemberServiceImpl extends ServiceImpl<ImGroupMemberDao, ImGr
     @Resource
     private ImGroupDao imGroupDao;
 
+    @Autowired
+    private ImPluginContext imPluginContext;
+
+    @Autowired
+    private ImGroupService imGroupService;
+
+    @Autowired
+    private ImGroupCoreService imGroupCoreService;
+
     @Override
     public ImGroupMemberDao getDao() {
         return this.baseMapper;
@@ -61,7 +75,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 +84,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 +106,45 @@ 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<com.yonge.cooleshow.biz.dal.wrapper.im.ImGroupMemberWrapper.ImGroupMember> groupMembers = Lists.newArrayList();
+        for (ImGroupMember groupMember : groupMemberList) {
+            groupMembers.add(com.yonge.cooleshow.biz.dal.wrapper.im.ImGroupMemberWrapper.ImGroupMember.builder()
+                    .groupId(groupMember.getGroupId())
+                    .userId(groupMember.getUserId())
+                    .clientType(groupMember.getRoleType().getCode())
+                    .avatar(groupMember.getAvatar())
+                    .nickname(groupMember.getNickname())
+                    .isAdmin(groupMember.getIsAdmin())
+                    .imUserId(imGroupCoreService.getImUserId(groupMember.getUserId().toString(), groupMember.getRoleType().getCode()))
+                    .roleType(groupMember.getRoleType().getCode())
+                    .build());
+        }
+        // 添加群成员到当前群组
+        imGroupCoreService.saveImGroupMemberList(imGroup.getId(), groupMembers);
+
     }
 
+
+
     @Override
     @Transactional(rollbackFor = Exception.class)
     public void delByGroupId(String groupId) {
@@ -136,14 +155,11 @@ public class ImGroupMemberServiceImpl extends ServiceImpl<ImGroupMemberDao, ImGr
     @Transactional(rollbackFor = Exception.class)
     public ImGroupMember getUserDetail(String imUserId, String groupId) {
 
-        String[] values = imUserId.split(":");
         // 用户ID
-        long userId = Long.parseLong(values[0]);
+        Long userId = Long.parseLong(imGroupService.analysisImUserId(imUserId));
 
-        ClientEnum clientType = ClientEnum.TEACHER;
-        if (values.length > 1 && ClientEnum.STUDENT.match(values[1])) {
-            clientType = ClientEnum.STUDENT;
-        }
+        // 客户端类型
+        ClientEnum clientType = ClientEnum.valueOf(imGroupService.analysisImUserClient(imUserId));
 
         // 群组信息
         ImGroupMember imGroupMember = baseMapper.findByUserIdAndGroupId(userId, groupId, clientType);
@@ -195,12 +211,10 @@ public class ImGroupMemberServiceImpl extends ServiceImpl<ImGroupMemberDao, ImGr
 
             for (ImGroupMember item : members) {
 
-                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()));
                 }
             }
         }

Деякі файли не було показано, через те що забагато файлів було змінено