Browse Source

Merge branch 'saas' of http://git.dayaedu.com/yonge/mec into zx_1026_1111

# Conflicts:
#	mec-biz/src/main/java/com/ym/mec/biz/service/impl/ImGroupServiceImpl.java
#	mec-biz/src/main/java/com/ym/mec/biz/service/impl/VipGroupServiceImpl.java
#	mec-education/src/main/resources/bootstrap-prod.properties
#	mec-monitor/src/main/resources/bootstrap-prod.properties
#	mec-student/src/main/resources/bootstrap-prod.properties
#	mec-teacher/src/main/resources/bootstrap-prod.properties
#	mec-web/src/main/java/com/ym/mec/web/controller/PhotoAlbumController.java
#	mec-web/src/main/java/com/ym/mec/web/controller/education/EduPhotoAlbumController.java
#	mec-web/src/main/resources/bootstrap-prod.properties
#	mec-zipkin/src/main/resources/bootstrap-prod.properties
zouxuan 1 year ago
parent
commit
ef835974bd
81 changed files with 1448 additions and 441 deletions
  1. 34 0
      audio-analysis/pom.xml
  2. 3 2
      audio-analysis/src/main/java/com/yonge/netty/dto/HardLevelEnum.java
  3. 4 0
      audio-analysis/src/main/java/com/yonge/netty/dto/UserChannelContext.java
  4. 1 1
      audio-analysis/src/main/resources/bootstrap-prod.properties
  5. 0 0
      audio-analysis/src/test/resoures/9550.json
  6. 1 0
      cms/src/main/resources/bootstrap-dev.properties
  7. 1 1
      cms/src/main/resources/bootstrap-prod.properties
  8. 36 0
      cms/src/main/resources/logback-dev.xml
  9. 46 3
      mec-application/src/main/java/com/ym/mec/student/controller/ImGroupController.java
  10. 1 1
      mec-application/src/main/java/com/ym/mec/student/controller/ImHistoryMessageController.java
  11. 36 7
      mec-application/src/main/java/com/ym/mec/teacher/controller/ImGroupController.java
  12. 1 1
      mec-application/src/main/java/com/ym/mec/teacher/controller/ImHistoryMessageController.java
  13. 40 5
      mec-application/src/main/java/com/ym/mec/web/controller/ImGroupController.java
  14. 149 65
      mec-application/src/main/java/com/ym/mec/web/controller/ImHistoryMessageController.java
  15. 19 0
      mec-application/src/main/java/com/ym/mec/web/controller/ImLiveBroadcastRoomController.java
  16. 1 1
      mec-application/src/main/java/com/ym/mec/web/controller/PhotoAlbumController.java
  17. 28 2
      mec-application/src/main/java/com/ym/mec/web/controller/TaskController.java
  18. 1 1
      mec-application/src/main/java/com/ym/mec/web/controller/education/EduPhotoAlbumController.java
  19. 1 1
      mec-application/src/main/java/com/ym/mec/web/controller/education/SysMusicCompareRecordController.java
  20. 3 3
      mec-application/src/main/resources/bootstrap-prod.properties
  21. 111 0
      mec-application/src/main/resources/logback-spring.xml
  22. 6 3
      mec-auth/mec-auth-server/src/main/java/com/ym/mec/auth/core/provider/AbstractAuthenticationProvider.java
  23. 1 1
      mec-auth/mec-auth-server/src/main/resources/bootstrap-prod.properties
  24. 4 0
      mec-biz/src/main/java/com/ym/mec/biz/dal/dao/CourseScheduleDao.java
  25. 3 3
      mec-biz/src/main/java/com/ym/mec/biz/dal/entity/ImGroup.java
  26. 0 12
      mec-biz/src/main/java/com/ym/mec/biz/dal/entity/ImGroupMember.java
  27. 1 1
      mec-biz/src/main/java/com/ym/mec/biz/dal/entity/ImGroupPlus.java
  28. 8 2
      mec-biz/src/main/java/com/ym/mec/biz/dal/enums/EFriendRoleType.java
  29. 4 0
      mec-biz/src/main/java/com/ym/mec/biz/service/CourseScheduleService.java
  30. 3 6
      mec-biz/src/main/java/com/ym/mec/biz/service/ImGroupService.java
  31. 6 0
      mec-biz/src/main/java/com/ym/mec/biz/service/SysUserService.java
  32. 4 1
      mec-biz/src/main/java/com/ym/mec/biz/service/im/impl/ImGroupCoreServiceImpl.java
  33. 99 5
      mec-biz/src/main/java/com/ym/mec/biz/service/impl/CourseScheduleServiceImpl.java
  34. 63 30
      mec-biz/src/main/java/com/ym/mec/biz/service/impl/EmployeeServiceImpl.java
  35. 8 1
      mec-biz/src/main/java/com/ym/mec/biz/service/impl/ImGroupMemberPlusServiceImpl.java
  36. 31 23
      mec-biz/src/main/java/com/ym/mec/biz/service/impl/ImGroupMemberServiceImpl.java
  37. 337 122
      mec-biz/src/main/java/com/ym/mec/biz/service/impl/ImGroupServiceImpl.java
  38. 13 3
      mec-biz/src/main/java/com/ym/mec/biz/service/impl/ImLiveBroadcastRoomServiceImpl.java
  39. 6 2
      mec-biz/src/main/java/com/ym/mec/biz/service/impl/ImUserFriendServiceImpl.java
  40. 1 1
      mec-biz/src/main/java/com/ym/mec/biz/service/impl/PhotoServiceImpl.java
  41. 1 1
      mec-biz/src/main/java/com/ym/mec/biz/service/impl/SchoolStaffServiceImpl.java
  42. 16 20
      mec-biz/src/main/java/com/ym/mec/biz/service/impl/StudentManageServiceImpl.java
  43. 13 3
      mec-biz/src/main/java/com/ym/mec/biz/service/impl/StudentRegistrationServiceImpl.java
  44. 7 2
      mec-biz/src/main/java/com/ym/mec/biz/service/impl/StudentServiceImpl.java
  45. 21 4
      mec-biz/src/main/java/com/ym/mec/biz/service/impl/SysMessageServiceImpl.java
  46. 38 2
      mec-biz/src/main/java/com/ym/mec/biz/service/impl/SysUserServiceImpl.java
  47. 71 10
      mec-biz/src/main/java/com/ym/mec/biz/service/impl/TeacherServiceImpl.java
  48. 1 1
      mec-biz/src/main/java/com/ym/mec/biz/service/impl/TenantInfoServiceImpl.java
  49. 1 1
      mec-biz/src/main/resources/config/mybatis/ClassGroupMapper.xml
  50. 14 0
      mec-biz/src/main/resources/config/mybatis/CourseScheduleMapper.xml
  51. 1 1
      mec-biz/src/main/resources/config/mybatis/CourseScheduleStatisticsMapper.xml
  52. 4 1
      mec-biz/src/main/resources/config/mybatis/EmployeeMapper.xml
  53. 7 9
      mec-biz/src/main/resources/config/mybatis/IndexBaseMonthDataMapper.xml
  54. 1 1
      mec-biz/src/main/resources/config/mybatis/StudentMapper.xml
  55. 1 1
      mec-biz/src/main/resources/config/mybatis/TeacherMapper.xml
  56. 6 6
      mec-biz/src/main/resources/config/mybatis/TenantInfoMapper.xml
  57. 3 0
      mec-common/audit-log/src/main/java/com/yonge/log/dal/model/HistoryMessage.java
  58. 5 4
      mec-common/audit-log/src/main/java/com/yonge/log/service/HistoryMessageService.java
  59. 21 8
      mec-common/audit-log/src/main/java/com/yonge/log/service/impl/HistoryMessageServiceImpl.java
  60. 7 7
      mec-common/audit-log/src/main/java/com/yonge/log/service/impl/HistoryMessageTenantServiceImpl.java
  61. 0 1
      mec-common/common-core/pom.xml
  62. 0 0
      mec-education/src/main/resources/bootstrap-prod.properties
  63. 1 1
      mec-eureka/src/main/resources/bootstrap-prod.properties
  64. 1 1
      mec-gateway/mec-gateway-web/src/main/resources/bootstrap-prod.properties
  65. 8 0
      mec-im/src/main/java/com/ym/controller/RoomController.java
  66. 39 24
      mec-im/src/main/java/com/ym/controller/UserController.java
  67. 37 16
      mec-im/src/main/java/com/ym/service/Impl/RoomServiceImpl.java
  68. 2 0
      mec-im/src/main/java/com/ym/service/RoomService.java
  69. 1 1
      mec-im/src/main/resources/bootstrap-prod.properties
  70. 1 1
      mec-mall/mall-admin/src/main/resources/bootstrap-prod.yml
  71. 1 1
      mec-mall/mall-portal/src/main/resources/bootstrap-prod.yml
  72. 0 0
      mec-monitor/src/main/resources/bootstrap-prod.properties
  73. 0 0
      mec-student/src/main/resources/bootstrap-prod.properties
  74. 1 1
      mec-task/src/main/resources/bootstrap-prod.properties
  75. 0 0
      mec-teacher/src/main/resources/bootstrap-prod.properties
  76. 0 0
      mec-web/src/main/java/com/ym/mec/web/controller/PhotoAlbumController.java
  77. 0 0
      mec-web/src/main/java/com/ym/mec/web/controller/education/EduPhotoAlbumController.java
  78. 0 0
      mec-web/src/main/resources/bootstrap-prod.properties
  79. 1 1
      mec-websocket/src/main/resources/bootstrap-prod.properties
  80. 0 0
      mec-zipkin/src/main/resources/bootstrap-prod.properties
  81. 1 1
      pom.xml

+ 34 - 0
audio-analysis/pom.xml

@@ -56,6 +56,40 @@
 		<dependency>
 			<groupId>com.ym</groupId>
 			<artifactId>mec-auth-api</artifactId>
+			<exclusions>
+				<!-- <exclusion>
+            		<groupId>org.redisson</groupId>
+            		<artifactId>redisson-spring-boot-starter</artifactId>
+				</exclusion> -->
+				<exclusion>
+					<artifactId>netty-common</artifactId>
+					<groupId>io.netty</groupId>
+				</exclusion>
+				<exclusion>
+					<artifactId>netty-transport</artifactId>
+					<groupId>io.netty</groupId>
+				</exclusion>
+				<exclusion>
+					<artifactId>netty-resolver</artifactId>
+					<groupId>io.netty</groupId>
+				</exclusion>
+				<exclusion>
+					<artifactId>netty-buffer</artifactId>
+					<groupId>io.netty</groupId>
+				</exclusion>
+				<exclusion>
+					<artifactId>netty-resolver-dns</artifactId>
+					<groupId>io.netty</groupId>
+				</exclusion>
+				<exclusion>
+					<artifactId>netty-handler</artifactId>
+					<groupId>io.netty</groupId>
+				</exclusion>
+				<exclusion>
+					<artifactId>netty-codec</artifactId>
+					<groupId>io.netty</groupId>
+				</exclusion>
+			</exclusions>
 		</dependency>
 
 		<dependency>

+ 3 - 2
audio-analysis/src/main/java/com/yonge/netty/dto/HardLevelEnum.java

@@ -9,7 +9,7 @@ public enum HardLevelEnum implements BaseEnum<String, HardLevelEnum> {
 	 * 完成度范围, 未演奏的范围
 	 */
 	//BEGINNER("入门级", 3, 5, 5, 5, 10, 10, 13, 15, 60, 10), 
-	BEGINNER("入门级", 5, 5, 3, 3, 6, 8, 13, 15, 95, 10), 
+	BEGINNER("入门级", 3, 5, 10, 10, 15, 15, 22, 22, 75, 25), 
 	/**
 	 * 进阶级, 振幅阈值, 频率阈值 <br>
 	 * 节奏有效范围(1分音符), 节奏有效范围(2分音符), 节奏有效范围(4分音符), 节奏有效范围(8分音符), 节奏有效范围(16分音符), 节奏有效范围(32分音符)<br>
@@ -22,7 +22,8 @@ public enum HardLevelEnum implements BaseEnum<String, HardLevelEnum> {
 	 * 节奏有效范围(1分音符), 节奏有效范围(2分音符), 节奏有效范围(4分音符), 节奏有效范围(8分音符), 节奏有效范围(16分音符), 节奏有效范围(32分音符)<br>
 	 * 完成度范围, 未演奏的范围
 	 */
-	PERFORMER("大师级", 3, 3, 3, 5, 10, 10, 13, 15, 95, 10);
+	//PERFORMER("大师级", 3, 3, 3, 5, 10, 10, 13, 15, 95, 10);
+	PERFORMER("大师级", 3, 3, 3, 3, 6, 8, 13, 15, 95, 10);
 
 	private String msg;
 

+ 4 - 0
audio-analysis/src/main/java/com/yonge/netty/dto/UserChannelContext.java

@@ -915,6 +915,10 @@ public class UserChannelContext {
 		
 		//int range = hardLevel.getAmplitudeThreshold();
 		int range = 5;
+		
+		if(StringUtils.equalsIgnoreCase(evaluationCriteria, EvaluationCriteriaEnum.DECIBELS.getCode())) {
+			range = 50;
+		}
 
 		for (int i = 1; i < chunkAmplitudeList.size(); i++) {
 			if (chunkAmplitudeList.get(i - 1) + range >= chunkAmplitudeList.get(i)) {

+ 1 - 1
audio-analysis/src/main/resources/bootstrap-prod.properties

@@ -3,7 +3,7 @@
 #\u670d\u52a1\u5668\u5730\u5740
 spring.cloud.nacos.config.server-addr=10.206.0.12:8848
 #\u9ed8\u8ba4\u4e3aPublic\u547d\u540d\u7a7a\u95f4,\u53ef\u4ee5\u7701\u7565\u4e0d\u5199
-spring.cloud.nacos.config.namespace=f40a7594-4bd0-4bc6-8397-9353c6d2e63a
+spring.cloud.nacos.config.namespace=b7aee20b-41e8-43d8-8e2d-45b6447f66ae
 #\u6307\u5b9a\u914d\u7f6e\u7fa4\u7ec4 --\u5982\u679c\u662fPublic\u547d\u540d\u7a7a\u95f4 \u5219\u53ef\u4ee5\u7701\u7565\u7fa4\u7ec4\u914d\u7f6e
 spring.cloud.nacos.config.group=DEFAULT_GROUP
 #\u6587\u4ef6\u540d -- \u5982\u679c\u6ca1\u6709\u914d\u7f6e\u5219\u9ed8\u8ba4\u4e3a ${spring.appliction.name}

File diff suppressed because it is too large
+ 0 - 0
audio-analysis/src/test/resoures/9550.json


+ 1 - 0
cms/src/main/resources/bootstrap-dev.properties

@@ -11,3 +11,4 @@ spring.cloud.nacos.config.file-extension=yaml
 spring.cloud.nacos.config.refresh.enabled=true
 #\u662f\u5426\u542f\u7528nacos\u914d\u7f6e\u4e2d\u5fc3
 spring.cloud.nacos.config.enabled=true
+logging.config=classpath:logback-dev.xml

+ 1 - 1
cms/src/main/resources/bootstrap-prod.properties

@@ -3,7 +3,7 @@
 #\u670d\u52a1\u5668\u5730\u5740
 spring.cloud.nacos.config.server-addr=10.206.0.12:8848
 #\u9ed8\u8ba4\u4e3aPublic\u547d\u540d\u7a7a\u95f4,\u53ef\u4ee5\u7701\u7565\u4e0d\u5199
-spring.cloud.nacos.config.namespace=f40a7594-4bd0-4bc6-8397-9353c6d2e63a
+spring.cloud.nacos.config.namespace=b7aee20b-41e8-43d8-8e2d-45b6447f66ae
 #\u6307\u5b9a\u914d\u7f6e\u7fa4\u7ec4 --\u5982\u679c\u662fPublic\u547d\u540d\u7a7a\u95f4 \u5219\u53ef\u4ee5\u7701\u7565\u7fa4\u7ec4\u914d\u7f6e
 spring.cloud.nacos.config.group=DEFAULT_GROUP
 #\u6587\u4ef6\u540d -- \u5982\u679c\u6ca1\u6709\u914d\u7f6e\u5219\u9ed8\u8ba4\u4e3a ${spring.appliction.name}

+ 36 - 0
cms/src/main/resources/logback-dev.xml

@@ -0,0 +1,36 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<configuration scan="true" scanPeriod="10 seconds">
+
+	<property name="LOG_HOME" value="/mdata/mec-dev/logs/cms-%d{yyyy-MM-dd_HH}-%i.log" />
+	<property name="CONSOLE_LOG_PATTERN"
+		value="[%X{username} %X{ip} %d{yyyy-MM-dd HH:mm:ss.SSS} [%thread] %-5level %logger{36}] : %msg%n" />
+
+	<appender name="stdout" class="ch.qos.logback.core.ConsoleAppender">
+		<encoder charset="UTF-8">
+			<pattern>${CONSOLE_LOG_PATTERN}</pattern>
+		</encoder>
+	</appender>
+
+	<appender name="file"
+		class="ch.qos.logback.core.rolling.RollingFileAppender">
+		<rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy">
+			<FileNamePattern>${LOG_HOME}</FileNamePattern>
+			<MaxHistory>90</MaxHistory>
+			<TimeBasedFileNamingAndTriggeringPolicy
+				class="ch.qos.logback.core.rolling.SizeAndTimeBasedFNATP">
+				<MaxFileSize>20MB</MaxFileSize>
+			</TimeBasedFileNamingAndTriggeringPolicy>
+		</rollingPolicy>
+
+		<encoder>
+			<pattern>${CONSOLE_LOG_PATTERN}</pattern>
+		</encoder>
+	</appender>
+
+	<logger name="com.ym.mec" level="INFO" />
+
+	<root level="INFO">
+		<appender-ref ref="stdout" />
+		<appender-ref ref="file" />
+	</root>
+</configuration>

+ 46 - 3
mec-application/src/main/java/com/ym/mec/student/controller/ImGroupController.java

@@ -4,9 +4,11 @@ import com.google.common.collect.Lists;
 import com.ym.mec.auth.api.entity.SysUser;
 import com.ym.mec.biz.dal.dto.ImUserFriendDto;
 import com.ym.mec.biz.dal.entity.ImGroup;
+import com.ym.mec.biz.dal.entity.ImGroupMemberPlus;
 import com.ym.mec.biz.dal.enums.im.ClientEnum;
 import com.ym.mec.biz.dal.page.ImGroupNoticeQueryInfo;
 import com.ym.mec.biz.service.*;
+import com.ym.mec.biz.service.im.ImGroupCoreService;
 import com.ym.mec.common.controller.BaseController;
 import com.ym.mec.common.entity.HttpResponseResult;
 import com.ym.mec.vo.ImUserWrapper;
@@ -17,6 +19,7 @@ import io.swagger.annotations.ApiOperation;
 import org.apache.commons.collections.CollectionUtils;
 import org.apache.commons.lang3.StringUtils;
 import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.http.HttpStatus;
 import org.springframework.web.bind.annotation.GetMapping;
 import org.springframework.web.bind.annotation.PathVariable;
 import org.springframework.web.bind.annotation.RequestMapping;
@@ -47,6 +50,12 @@ public class ImGroupController extends BaseController {
 	@Autowired
 	private SysUserService sysUserService;
 
+    @Autowired
+    private ImGroupCoreService imGroupCoreService;
+
+    @Autowired
+    private ImGroupMemberPlusService imGroupMemberPlusService;
+
 	@ApiOperation("查询群列表")
 	@GetMapping(value = "/queryGroupList")
 	public Object queryGroupList(String search,String groupType) {
@@ -59,9 +68,21 @@ public class ImGroupController extends BaseController {
 		if (imGroupId.contains("S") || imGroupId.contains("I")){
 			imGroupId = imGroupId.substring(1);
 		}
-		ImGroup imGroup = imGroupService.get(imGroupId);
+        ImGroup imGroup = imGroupService.get(imGroupId);
+
+        if (imGroup == null) {
+            return failed(HttpStatus.NO_CONTENT, "群组不存在");
+        }
+        ImGroupMemberPlus admin = imGroupMemberPlusService.lambdaQuery()
+            .eq(ImGroupMemberPlus::getImGroupId, imGroup.getId())
+            .eq(ImGroupMemberPlus::getUserId, sysUserService.getUser().getId())
+            .last("limit 1").one();
+        if (admin == null) {
+            // 该用户不在该群,无权限查看,处理用户退出群后,查看历史消息校验
+            return failed(HttpStatus.NO_CONTENT, "群组不存在");
+        }
 		// 设置默认头像
-		if (Objects.nonNull(imGroup.getGroupType()) && StringUtils.isBlank(imGroup.getImg())) {
+		if (Objects.nonNull(imGroup) && Objects.nonNull(imGroup.getGroupType()) && StringUtils.isBlank(imGroup.getImg())) {
 			imGroup.setImg(imGroup.getGroupType().getAvatar());
 		}
 		return succeed(imGroup);
@@ -76,6 +97,19 @@ public class ImGroupController extends BaseController {
 		if (imGroupId.contains("S") || imGroupId.contains("I")){
 			imGroupId = imGroupId.substring(1);
 		}
+        ImGroup imGroup = imGroupService.get(imGroupId);
+
+        if (imGroup == null) {
+            return failed(HttpStatus.NO_CONTENT, "群组不存在");
+        }
+        ImGroupMemberPlus admin = imGroupMemberPlusService.lambdaQuery()
+            .eq(ImGroupMemberPlus::getImGroupId, imGroup.getId())
+            .eq(ImGroupMemberPlus::getUserId, sysUserService.getUser().getId())
+            .last("limit 1").one();
+        if (admin == null) {
+            // 该用户不在该群,无权限查看,处理用户退出群后,查看历史消息校验
+            return failed(HttpStatus.NO_CONTENT, "群组不存在");
+        }
 		return succeed(imGroupService.get(imGroupId));
 	}
 
@@ -103,7 +137,9 @@ public class ImGroupController extends BaseController {
 			dto.setFriend(user);
 
 			List<String> userTypes = Lists.newArrayList(user.getUserType().split(","));
-			if (userTypes.size() > 1 || userTypes.contains(ClientEnum.TEACHER.getCode())) {
+			if (userTypes.size() > 1
+				|| userTypes.contains(ClientEnum.TEACHER.getCode())
+				|| userTypes.contains(ClientEnum.SYSTEM.getCode())) {
 				// 增加用户身份数量 > 1 或者包含老师身份,统一使用实名
 				dto.setFriendNickname(Optional.ofNullable(user.getRealName()).filter(StringUtils::isNotBlank).orElse(user.getUsername()));
 			} else if (user.getUserType().contains("STUDENT") || user.getUserType().contains("SCHOOL")) {
@@ -200,4 +236,11 @@ public class ImGroupController extends BaseController {
 	public Object addGroupMember(String imGroupId) {
 		return succeed(imGroupMemberService.join(imGroupId,sysUserService.getUserId(),"",false));
 	}
+
+
+    @ApiOperation("注册im")
+    @GetMapping(value = "/imRegister")
+    public Object imRegister(Integer userId) throws Exception {
+        return succeed(imGroupCoreService.register(userId.toString(),"","测试",null));
+    }
 }

+ 1 - 1
mec-application/src/main/java/com/ym/mec/student/controller/ImHistoryMessageController.java

@@ -36,7 +36,7 @@ public class ImHistoryMessageController extends BaseController {
     @PostMapping(value = "/historyMessage")
     public HttpResponseResult<PageInfo<HistoryMessageTencentWrapper.HistoryMessageTencent>> historyMessage(@RequestBody  HistoryMessageTencentWrapper.HistoryMessageTencentQuery query) throws Exception {
 
-        return succeedData(historyMessageTenantService.historyMessage(query));
+        return succeedData(imGroupService.historyMessage(query));
     }
 
 

+ 36 - 7
mec-application/src/main/java/com/ym/mec/teacher/controller/ImGroupController.java

@@ -4,12 +4,10 @@ import com.google.common.collect.Lists;
 import com.ym.mec.auth.api.entity.SysUser;
 import com.ym.mec.biz.dal.dto.ImUserFriendDto;
 import com.ym.mec.biz.dal.entity.ImGroup;
+import com.ym.mec.biz.dal.entity.ImGroupMemberPlus;
 import com.ym.mec.biz.dal.enums.im.ClientEnum;
 import com.ym.mec.biz.dal.page.ImGroupNoticeQueryInfo;
-import com.ym.mec.biz.service.ImGroupNoticeService;
-import com.ym.mec.biz.service.ImGroupService;
-import com.ym.mec.biz.service.ImUserFriendService;
-import com.ym.mec.biz.service.SysUserService;
+import com.ym.mec.biz.service.*;
 import com.ym.mec.common.controller.BaseController;
 import com.ym.mec.common.entity.HttpResponseResult;
 import com.ym.mec.vo.ImUserWrapper;
@@ -20,6 +18,7 @@ import io.swagger.annotations.ApiOperation;
 import org.apache.commons.collections.CollectionUtils;
 import org.apache.commons.lang3.StringUtils;
 import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.http.HttpStatus;
 import org.springframework.web.bind.annotation.GetMapping;
 import org.springframework.web.bind.annotation.PathVariable;
 import org.springframework.web.bind.annotation.RequestMapping;
@@ -47,6 +46,9 @@ public class ImGroupController extends BaseController {
 	@Autowired
 	private SysUserService userLoginService;
 
+    @Autowired
+    private ImGroupMemberPlusService imGroupMemberPlusService;
+
 	@ApiOperation("查询群列表")
 	@GetMapping(value = "/queryGroupList")
 	public Object queryGroupList(String search,String groupType) {
@@ -69,9 +71,21 @@ public class ImGroupController extends BaseController {
 		if (imGroupId.contains("S") || imGroupId.contains("I")){
 			imGroupId = imGroupId.substring(1);
 		}
-		ImGroup imGroup = imGroupService.get(imGroupId);
+        ImGroup imGroup = imGroupService.get(imGroupId);
+
+        if (imGroup == null) {
+            return failed(HttpStatus.NO_CONTENT, "群组不存在");
+        }
+        ImGroupMemberPlus admin = imGroupMemberPlusService.lambdaQuery()
+            .eq(ImGroupMemberPlus::getImGroupId, imGroup.getId())
+            .eq(ImGroupMemberPlus::getUserId, userLoginService.getUser().getId())
+            .last("limit 1").one();
+        if (admin == null) {
+            // 该用户不在该群,无权限查看,处理用户退出群后,查看历史消息校验
+            return failed(HttpStatus.NO_CONTENT, "群组不存在");
+        }
 		// 设置默认头像
-		if (Objects.nonNull(imGroup.getGroupType()) && StringUtils.isBlank(imGroup.getImg())) {
+		if (Objects.nonNull(imGroup) && Objects.nonNull(imGroup.getGroupType()) && StringUtils.isBlank(imGroup.getImg())) {
 			imGroup.setImg(imGroup.getGroupType().getAvatar());
 		}
 		return succeed(imGroup);
@@ -86,6 +100,19 @@ public class ImGroupController extends BaseController {
 		if (imGroupId.contains("S") || imGroupId.contains("I")){
 			imGroupId = imGroupId.substring(1);
 		}
+        ImGroup imGroup = imGroupService.get(imGroupId);
+
+        if (imGroup == null) {
+            return failed(HttpStatus.NO_CONTENT, "群组不存在");
+        }
+        ImGroupMemberPlus admin = imGroupMemberPlusService.lambdaQuery()
+            .eq(ImGroupMemberPlus::getImGroupId, imGroup.getId())
+            .eq(ImGroupMemberPlus::getUserId, userLoginService.getUser().getId())
+            .last("limit 1").one();
+        if (admin == null) {
+            // 该用户不在该群,无权限查看,处理用户退出群后,查看历史消息校验
+            return failed(HttpStatus.NO_CONTENT, "群组不存在");
+        }
 		return succeed(imGroupService.get(imGroupId));
 	}
 
@@ -124,7 +151,9 @@ public class ImGroupController extends BaseController {
 			dto.setFriend(user);
 
 			List<String> userTypes = Lists.newArrayList(user.getUserType().split(","));
-			if (userTypes.size() > 1 || userTypes.contains(ClientEnum.TEACHER.getCode())) {
+			if (userTypes.size() > 1
+				|| userTypes.contains(ClientEnum.TEACHER.getCode())
+				|| userTypes.contains(ClientEnum.SYSTEM.getCode())) {
 				// 增加用户身份数量 > 1 或者包含老师身份,统一使用实名
 				dto.setFriendNickname(Optional.ofNullable(user.getRealName()).filter(StringUtils::isNotBlank).orElse(user.getUsername()));
 			} else if (user.getUserType().contains("STUDENT") || user.getUserType().contains("SCHOOL")) {

+ 1 - 1
mec-application/src/main/java/com/ym/mec/teacher/controller/ImHistoryMessageController.java

@@ -40,7 +40,7 @@ public class ImHistoryMessageController extends BaseController {
     @PostMapping(value = "/historyMessage")
     public HttpResponseResult<PageInfo<HistoryMessageTencentWrapper.HistoryMessageTencent>> historyMessage(@RequestBody  HistoryMessageTencentWrapper.HistoryMessageTencentQuery query) throws Exception {
 
-        return succeedData(historyMessageTenantService.historyMessage(query));
+        return succeedData(imGroupService.historyMessage(query));
     }
 
 

+ 40 - 5
mec-application/src/main/java/com/ym/mec/web/controller/ImGroupController.java

@@ -7,6 +7,8 @@ import com.ym.mec.biz.dal.dto.ImGroupMemberDto;
 import com.ym.mec.biz.dal.dto.ImUserFriendDto;
 import com.ym.mec.biz.dal.dto.NameDto;
 import com.ym.mec.biz.dal.entity.ImGroup;
+import com.ym.mec.biz.dal.entity.ImGroupMember;
+import com.ym.mec.biz.dal.entity.ImGroupMemberPlus;
 import com.ym.mec.biz.dal.enums.im.ClientEnum;
 import com.ym.mec.biz.dal.page.ImGroupNoticeQueryInfo;
 import com.ym.mec.biz.dal.vo.ImGroupVo;
@@ -24,6 +26,7 @@ import io.swagger.annotations.ApiOperation;
 import org.apache.commons.collections.CollectionUtils;
 import org.apache.commons.lang3.StringUtils;
 import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.http.HttpStatus;
 import org.springframework.web.bind.annotation.*;
 
 import java.util.Arrays;
@@ -49,6 +52,9 @@ public class ImGroupController extends BaseController {
 	@Autowired
 	private ImGroupMemberService imGroupMemberService;
 
+    @Autowired
+    private ImGroupMemberPlusService imGroupMemberPlusService;
+
 	@Autowired
 	private ImGroupNoticeService imGroupNoticeService;
 
@@ -74,8 +80,20 @@ public class ImGroupController extends BaseController {
 			imGroupId = imGroupId.substring(1);
 		}
 		ImGroup imGroup = imGroupService.get(imGroupId);
+
+        if (imGroup == null) {
+            return failed(HttpStatus.NO_CONTENT, "群组不存在");
+        }
+        ImGroupMemberPlus admin = imGroupMemberPlusService.lambdaQuery()
+            .eq(ImGroupMemberPlus::getImGroupId, imGroup.getId())
+            .eq(ImGroupMemberPlus::getUserId, sysUserService.getUser().getId())
+            .last("limit 1").one();
+        if (admin == null) {
+            // 该用户不在该群,无权限查看,处理用户退出群后,查看历史消息校验
+            return failed(HttpStatus.NO_CONTENT, "群组不存在");
+        }
 		// 设置默认头像
-		if (Objects.nonNull(imGroup.getGroupType()) && StringUtils.isBlank(imGroup.getImg())) {
+		if (Objects.nonNull(imGroup) && Objects.nonNull(imGroup.getGroupType()) && StringUtils.isBlank(imGroup.getImg())) {
 			imGroup.setImg(imGroup.getGroupType().getAvatar());
 		}
 		return succeed(imGroup);
@@ -90,7 +108,20 @@ public class ImGroupController extends BaseController {
 		if (imGroupId.contains("S") || imGroupId.contains("I")){
 			imGroupId = imGroupId.substring(1);
 		}
-		return succeed(imGroupService.get(imGroupId));
+        ImGroup imGroup = imGroupService.get(imGroupId);
+
+        if (imGroup == null) {
+            return failed(HttpStatus.NO_CONTENT, "群组不存在");
+        }
+        ImGroupMemberPlus admin = imGroupMemberPlusService.lambdaQuery()
+            .eq(ImGroupMemberPlus::getImGroupId, imGroup.getId())
+            .eq(ImGroupMemberPlus::getUserId, sysUserService.getUser().getId())
+            .last("limit 1").one();
+        if (admin == null) {
+            // 该用户不在该群,无权限查看,处理用户退出群后,查看历史消息校验
+            return failed(HttpStatus.NO_CONTENT, "群组不存在");
+        }
+		return succeed(imGroup);
 	}
 
 	@ApiOperation("修改群信息")
@@ -138,7 +169,9 @@ public class ImGroupController extends BaseController {
 			//这里由原来的优先取老师的realName改成了优先取学员的username,
 			// 因为管理员在修改通讯录备注的时候,如果是多角色,优先改的是学员的username
 			List<String> userTypes = Lists.newArrayList(user.getUserType().split(","));
-			if (userTypes.size() > 1 || userTypes.contains(ClientEnum.TEACHER.getCode())) {
+			if (userTypes.size() > 1
+				|| userTypes.contains(ClientEnum.TEACHER.getCode())
+				|| userTypes.contains(ClientEnum.SYSTEM.getCode())) {
 				// 增加用户身份数量 > 1 或者包含老师身份,统一使用实名
 				dto.setFriendNickname(Optional.ofNullable(user.getRealName()).filter(StringUtils::isNotBlank).orElse(user.getUsername()));
 			} else if (user.getUserType().contains("STUDENT") || user.getUserType().contains("SCHOOL")) {
@@ -320,9 +353,11 @@ public class ImGroupController extends BaseController {
 
 	@GetMapping("/groupTransfer")
 	public Object groupTransfer(@RequestParam(required = false) String startTime,
-								@RequestParam(required = false) String endTime) {
+								@RequestParam(required = false) String endTime,
+								@RequestParam(required = false) Integer type
+                                ) {
 		ExecutorService executor = Executors.newSingleThreadExecutor();
-		executor.execute(() -> imGroupService.groupTransfer(startTime, endTime));
+		executor.execute(() -> imGroupService.groupTransfer(startTime, endTime,type));
 		return succeed();
 	}
 

+ 149 - 65
mec-application/src/main/java/com/ym/mec/web/controller/ImHistoryMessageController.java

@@ -1,5 +1,6 @@
 package com.ym.mec.web.controller;
 
+import com.google.common.collect.Lists;
 import com.yonge.log.wrapper.HistoryMessageTencentWrapper;
 import com.ym.mec.biz.service.ImGroupService;
 import com.ym.mec.biz.service.UploadFileService;
@@ -15,11 +16,19 @@ 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.*;
 
 import java.io.File;
+import java.util.ArrayList;
+import java.util.LinkedHashMap;
 import java.util.List;
+import java.util.Map;
+import java.util.concurrent.ExecutorService;
+import java.util.concurrent.Executors;
+import java.util.concurrent.Future;
+import java.util.stream.Collectors;
 
 @RequestMapping("${app-config.url.web:}/imHistoryMessage")
 @Api(tags = "系统操作日志")
@@ -27,93 +36,168 @@ import java.util.List;
 @RestController
 public class ImHistoryMessageController extends BaseController {
 
-	@Autowired
-	private HistoryMessageService historyMessageService;
-	@Autowired
-	private UploadFileService uploadFileService;
+    @Autowired
+    private HistoryMessageService historyMessageService;
+    @Autowired
+    private UploadFileService uploadFileService;
 
-	@Autowired
-	private ImGroupService imGroupService;
+    @Autowired
+    private ImGroupService imGroupService;
 
     @Autowired
     private HistoryMessageTenantService historyMessageTenantService;
 
-	@GetMapping("/save")
-	public Object saveImHistoryMessage(String fileDir) throws Exception {
-		File file = new File(fileDir);
-		UploadReturnBean uploadReturnBean = uploadFileService.uploadImHistoryMsgFile(file);
-		historyMessageService.saveImHistoryMessage(file);
-		return succeed();
-	}
+    @GetMapping("/save")
+    public Object saveImHistoryMessage(String fileDir) throws Exception {
+        File file = new File(fileDir);
+        UploadReturnBean uploadReturnBean = uploadFileService.uploadImHistoryMsgFile(file);
+        historyMessageService.saveImHistoryMessage(file);
+        return succeed();
+    }
+
+
+    @ApiOperation("IM导入消息")
+    @PostMapping(value = "/ImportIM")
+    public void ImportIM() {
+
+        ExecutorService executor = Executors.newSingleThreadExecutor();
+        executor.execute(() -> {
+
+            // 100个线程的无界线程池
+            com.yonge.mongodb.PageInfo<HistoryMessage> info;
+//        historyMessageService.updateAllStatus(0);
+            //计算总数据量
+            int count = imGroupService.queryInfoCount(3);
+            log.info("总数据量:"+count);
+            //计算调用次数
+            int num = (int) Math.ceil(count / 100);
+            for (int i = 0; i <= num; i++) {
+                int size = 100;
+                //获取融云消息
+                //List<ImGroup> list = imGroupService.lambdaQuery().last("limit "+(page-1)*size+","+size).list();
+                info = imGroupService.getRongYunInfo(1, size,3);
+                List<HistoryMessage> footer = info.getRows();
+                if (CollectionUtils.isEmpty(footer)) {
+                    break;
+                }
+                //IM导入
+                try {
+                    // 过滤 groupId为空的
+                    footer = footer.stream().filter(o -> StringUtils.isNotBlank(o.getGroupId())).collect(Collectors.toList());
+                    imGroupService.importInfo(footer);
+                } catch (Exception e) {
+                    log.error("IM导入失败",e);
+                }
+                log.info("已导入:" + (i + 1) * size);
+            }
+        });
+    }
+
 
+    @ApiOperation("IM导入消息")
+    @PostMapping(value = "/ImportIMPrivate")
+    public void ImportIMPrivate() {
 
-	@ApiOperation("IM导入消息")
-	@PostMapping(value = "/ImportIM")
-	public void ImportIM() throws Exception {
-		com.yonge.mongodb.PageInfo<HistoryMessage> info;
+        ExecutorService executor = Executors.newSingleThreadExecutor();
+        executor.execute(() -> {
+            com.yonge.mongodb.PageInfo<HistoryMessage> info;
 //        historyMessageService.updateAllStatus(0);
-		//计算总数据量
-		int count = imGroupService.queryInfoCount();
-		//计算调用次数
-		int num = (int) Math.ceil(count / 100);
-		for (int i = 0; i <=num ; i++) {
-			int size =100;
-			//获取融云消息
-			//List<ImGroup> list = imGroupService.lambdaQuery().last("limit "+(page-1)*size+","+size).list();
-			info = imGroupService.getRongYunInfo(1,size);
-			List<HistoryMessage> footer = info.getRows();
-            if (CollectionUtils.isEmpty(footer)) {
-                break;
+            //计算总数据量
+            int count = imGroupService.queryInfoCount(1);
+            log.info("总数据量:"+count);
+            //计算调用次数
+            int num = (int) Math.ceil(count / 100);
+            for (int i = 0; i <= num; i++) {
+                int size = 100;
+                //获取融云消息
+                //List<ImGroup> list = imGroupService.lambdaQuery().last("limit "+(page-1)*size+","+size).list();
+                info = imGroupService.getRongYunInfo(1, size,1);
+                List<HistoryMessage> footer = info.getRows();
+                if (CollectionUtils.isEmpty(footer)) {
+                    break;
+                }
+                //IM导入
+                try {
+                    imGroupService.importInfo(footer);
+                } catch (Exception e) {
+                    log.error("IM导入失败",e);
+                }
+                log.info("已导入:" + (i + 1) * size);
             }
-			//IM导入
-			imGroupService.importInfo(footer);
-		}
-	}
+        });
+    }
 
     @ApiOperation("融云im To 腾讯")
     @PostMapping(value = "/imToTencent")
     public void imToTencent() throws Exception {
 
-        // 删除旧数据
-        historyMessageTenantService.deleteOld();
+        ExecutorService executor = Executors.newSingleThreadExecutor();
+        executor.execute(() -> {
+            // 删除旧数据
+//        historyMessageTenantService.deleteOld();
+
 
-        com.yonge.mongodb.PageInfo<HistoryMessage> info;
+            // 100个线程的无界线程池
+            ExecutorService executorService = Executors.newFixedThreadPool(100);
+            com.yonge.mongodb.PageInfo<HistoryMessage> info;
 //        historyMessageService.updateAllStatus(0);
-        //计算总数据量
-        long count = historyMessageService.querySyncCount();
-        log.info("总数据量:"+count);
-        //计算调用次数
-        long num = (int) Math.ceil(count / 100);
-        for (long i = 0; i <=num ; i++) {
-            int size =100;
-            //获取融云消息
-            //List<ImGroup> list = imGroupService.lambdaQuery().last("limit "+(page-1)*size+","+size).list();
-            info = historyMessageService.getImToTencent(i,size);
-            List<HistoryMessage> footer = info.getRows();
-            if (CollectionUtils.isEmpty(footer)) {
-                break;
+            //计算总数据量
+            long count = historyMessageService.querySyncCount();
+            log.info("总数据量:"+count);
+            //计算调用次数
+            long num = (int) Math.ceil(count / 200);
+            for (long i = 0; i <=num ; i++) {
+                int size = 200;
+                //获取融云消息
+                //List<ImGroup> list = imGroupService.lambdaQuery().last("limit "+(page-1)*size+","+size).list();
+                info = historyMessageService.getImToTencent(1, size);
+                List<HistoryMessage> footer = info.getRows();
+                if (CollectionUtils.isEmpty(footer)) {
+                    break;
+                }
+                //IM转换
+                List<Future<?>> list = new ArrayList<>();
+                for (List<HistoryMessage> historyMessages : Lists.partition(footer, 10)) {
+                    list.add(executorService.submit(() -> {
+                        try {
+                            imGroupService.imToTencent(historyMessages);
+                        } catch (Exception e) {
+                            log.error("IM转换失败",e);
+                        }
+                    }));
+                }
+                for (Future<?> future : list) {
+                    try {
+                        future.get();
+                    } catch (Exception e){
+                        log.error("IM转换失败",e);
+                    }
+                }
+                log.info("已转换:" + (i + 1) * size);
             }
-            //IM转换
-            imGroupService.imToTencent(footer);
-            log.info("已转换:"+(i+1)*size);
-        }
+            executorService.shutdown();
+        });
     }
 
     @ApiOperation("初始化消息体")
     @PostMapping(value = "/initMsgBodyJson")
     public void initMsgBodyJson() throws Exception {
-        //计算总数据量
-        int count = historyMessageTenantService.initMsgBodyJsonCount();
-        log.info("总数据量:"+count);
-        //计算调用次数
-        int num = (int) Math.ceil(count / 100);
-        for (int i = 0; i <=num ; i++) {
-            int size =100;
-            //获取融云消息
-            //List<ImGroup> list = imGroupService.lambdaQuery().last("limit "+(page-1)*size+","+size).list();
-            historyMessageTenantService.initMsgBodyJson(1,size);
-            log.info("已转换:"+(i+1)*size);
-        }
+
+        ExecutorService executor = Executors.newSingleThreadExecutor();
+        executor.execute(() -> {
+            //计算总数据量
+            int count = historyMessageTenantService.initMsgBodyJsonCount();
+            log.info("总数据量:" + count);
+            //计算调用次数
+            int num = (int) Math.ceil(count / 100);
+            for (int i = 0; i <= num; i++) {
+                int size = 100;
+                //获取融云消息
+                //List<ImGroup> list = imGroupService.lambdaQuery().last("limit "+(page-1)*size+","+size).list();
+                historyMessageTenantService.initMsgBodyJson(1, size);
+                log.info("已转换:" + (i + 1) * size);
+            }
+        });
     }
 
     @ApiOperation("历史聊天记录查询")

+ 19 - 0
mec-application/src/main/java/com/ym/mec/web/controller/ImLiveBroadcastRoomController.java

@@ -1,5 +1,6 @@
 package com.ym.mec.web.controller;
 
+import com.microsvc.toolkit.middleware.live.LivePluginContext;
 import com.microsvc.toolkit.middleware.live.message.TencentWrapper;
 import com.ym.mec.biz.dal.dto.ImLiveBroadcastRoomDto;
 import com.ym.mec.biz.dal.dto.LiveRoomStatus;
@@ -19,6 +20,7 @@ import com.ym.mec.common.page.PageInfo;
 import com.ym.mec.common.page.WrapperUtil;
 import io.swagger.annotations.*;
 import lombok.extern.slf4j.Slf4j;
+import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.security.access.prepost.PreAuthorize;
 import org.springframework.web.bind.annotation.*;
 
@@ -46,6 +48,8 @@ public class ImLiveBroadcastRoomController extends BaseController {
     @Resource
     private ImLiveBroadcastRoomService imLiveBroadcastRoomService;
 
+    @Autowired
+    private LivePluginContext livePluginContext;
     @ApiImplicitParams({
             @ApiImplicitParam(name = "search", dataType = "String", value = "模糊查询关键字"),
             @ApiImplicitParam(name = "liveState", dataType = "Integer", value = "直播状态 0未开始 1开始 2结束"),
@@ -306,5 +310,20 @@ public class ImLiveBroadcastRoomController extends BaseController {
         return succeed(imLiveBroadcastRoomService.roomLiveStreamStatus(roomUid));
     }
 
+
+    @ApiOperation("直播间自定义")
+    @ApiImplicitParams({
+        @ApiImplicitParam(name = "roomUid", dataType = "String", value = "房间Uid", required = true),
+    })
+    @GetMapping(value = "/liveDefineData")
+    public HttpResponseResult<Object> liveDefineData(String roomUid) throws Exception {
+
+        // 直播间推流状态查询
+
+        List<TencentWrapper.ChatRoomGroupCounter> chatRoomGroupDefinedData = livePluginContext
+            .getPluginService().getChatRoomGroupDefinedData(roomUid);
+        return succeed(chatRoomGroupDefinedData);
+    }
+
 }
 

+ 1 - 1
mec-application/src/main/java/com/ym/mec/web/controller/PhotoAlbumController.java

@@ -29,7 +29,7 @@ public class PhotoAlbumController extends BaseController {
 	@PreAuthorize("@pcs.hasPermissions('photoAlbum/add')")
 	public Object add(PhotoAlbum photoAlbum) {
 		if(StringUtils.isEmpty(photoAlbum.getCoverUrl())){
-			photoAlbum.setCoverUrl("https://daya.ks3-cn-beijing.ksyun.com/202107/Sdmx7vx.png");
+			photoAlbum.setCoverUrl("https://oss.dayaedu.com/default-images/mec/Sdmx7vx.png");
 		}
 		return succeed(photoAlbumService.insert(photoAlbum));
 	}

+ 28 - 2
mec-application/src/main/java/com/ym/mec/web/controller/TaskController.java

@@ -18,6 +18,7 @@ import com.ym.mec.im.ImFeignService;
 import com.ym.mec.util.date.DateUtil;
 import com.yonge.log.service.HistoryMessageService;
 import io.swagger.annotations.ApiOperation;
+import lombok.extern.slf4j.Slf4j;
 import org.apache.commons.collections.CollectionUtils;
 import org.apache.commons.io.FileUtils;
 import org.apache.commons.lang3.StringUtils;
@@ -36,6 +37,7 @@ import java.util.concurrent.TimeUnit;
 
 @RequestMapping("${app-config.url.web:}/task")
 @RestController
+@Slf4j
 public class TaskController extends BaseController {
 
 	@Autowired
@@ -654,7 +656,21 @@ public class TaskController extends BaseController {
     @ApiOperation("每分钟-查询是否有直播间需要创建")
     @GetMapping(value = "/createLiveRoom")
     public void createLiveRoom(){
-        imLiveBroadcastRoomService.createLiveRoom();
+        try {
+            imLiveBroadcastRoomService.createLiveRoom();
+        } catch (Exception e) {
+            e.printStackTrace();
+            log.error("创建直播间失败",e);
+        }
+
+        // 网络教室
+        try {
+
+            courseScheduleService.rtcRoomCreate();
+        } catch (Exception e) {
+            e.printStackTrace();
+            log.error("创建网络教室失败",e);
+        }
     }
 
     @ApiOperation("每分钟-查询是否有直播间需要销毁")
@@ -691,7 +707,17 @@ public class TaskController extends BaseController {
 	@ApiOperation("每天凌晨2点钟-直播间销毁定时任务")
 	@GetMapping("/destroyLiveRoom")
 	public Object destroyLiveRoom() {
-		imLiveBroadcastRoomService.destroyLiveRoom();
+        try {
+            imLiveBroadcastRoomService.destroyLiveRoom();
+        } catch (Exception e) {
+            log.error("销毁直播间失败",e);
+        }
+
+        try {
+            courseScheduleService.destroyRtcRoom();
+        } catch (Exception e) {
+            log.error("销毁网络教室失败",e);
+        }
 		return succeed();
 	}
 

+ 1 - 1
mec-application/src/main/java/com/ym/mec/web/controller/education/EduPhotoAlbumController.java

@@ -27,7 +27,7 @@ public class EduPhotoAlbumController extends BaseController {
 	@PostMapping(value = "add")
 	public Object add(PhotoAlbum photoAlbum) {
 		if(StringUtils.isEmpty(photoAlbum.getCoverUrl())){
-			photoAlbum.setCoverUrl("https://daya.ks3-cn-beijing.ksyun.com/202107/Sdmx7vx.png");
+			photoAlbum.setCoverUrl("https://oss.dayaedu.com/default-images/mec/Sdmx7vx.png");
 		}
 		return succeed(photoAlbumService.insert(photoAlbum));
 	}

+ 1 - 1
mec-application/src/main/java/com/ym/mec/web/controller/education/SysMusicCompareRecordController.java

@@ -42,7 +42,7 @@ public class SysMusicCompareRecordController extends BaseController {
             return failed("请设置功能点");
         }
         record.setUserId(sysUser.getId());
-        record.setClientId("com/ym/app/web/controller/education");
+        record.setClientId("education");
         return succeed(sysMusicCompareRecordService.insert(record));
     }
 

+ 3 - 3
mec-application/src/main/resources/bootstrap-prod.properties

@@ -1,10 +1,10 @@
-spring.cloud.nacos.config.server-addr=10.206.0.13:8848,10.206.0.4:8848,10.206.0.8:8848
+spring.cloud.nacos.config.server-addr=10.206.0.12:8848
 #\u9ed8\u8ba4\u4e3aPublic\u547d\u540d\u7a7a\u95f4,\u53ef\u4ee5\u7701\u7565\u4e0d\u5199
-spring.cloud.nacos.config.namespace=f40a7594-4bd0-4bc6-8397-9353c6d2e63a
+spring.cloud.nacos.config.namespace=b7aee20b-41e8-43d8-8e2d-45b6447f66ae
 #\u6307\u5b9a\u914d\u7f6e\u7fa4\u7ec4 --\u5982\u679c\u662fPublic\u547d\u540d\u7a7a\u95f4 \u5219\u53ef\u4ee5\u7701\u7565\u7fa4\u7ec4\u914d\u7f6e
 spring.cloud.nacos.config.group=DEFAULT_GROUP
 #\u6587\u4ef6\u540d -- \u5982\u679c\u6ca1\u6709\u914d\u7f6e\u5219\u9ed8\u8ba4\u4e3a ${spring.appliction.name}
-spring.cloud.nacos.config.prefix=auth
+spring.cloud.nacos.config.prefix=app
 #\u6307\u5b9a\u6587\u4ef6\u540e\u7f00
 spring.cloud.nacos.config.file-extension=yaml
 #\u662f\u5426\u542f\u7528nacos\u914d\u7f6e\u4e2d\u5fc3

+ 111 - 0
mec-application/src/main/resources/logback-spring.xml

@@ -0,0 +1,111 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<configuration scan="true" scanPeriod="10 seconds">
+
+    <property name="LOG_HOME" value="/mdata/logs/app-%d{yyyy-MM-dd_HH}-%i.log"/>
+    <property name="CONSOLE_LOG_PATTERN"
+              value="[%X{username} %X{ip} %d{yyyy-MM-dd HH:mm:ss.SSS} [%thread] %-5level %logger{36}] : %msg%n"/>
+
+    <appender name="stdout" class="ch.qos.logback.core.ConsoleAppender">
+        <encoder charset="UTF-8">
+            <pattern>${CONSOLE_LOG_PATTERN}</pattern>
+        </encoder>
+    </appender>
+
+    <appender name="file"
+              class="ch.qos.logback.core.rolling.RollingFileAppender">
+        <rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy">
+            <FileNamePattern>${LOG_HOME}</FileNamePattern>
+            <MaxHistory>90</MaxHistory>
+            <TimeBasedFileNamingAndTriggeringPolicy
+                    class="ch.qos.logback.core.rolling.SizeAndTimeBasedFNATP">
+                <MaxFileSize>20MB</MaxFileSize>
+            </TimeBasedFileNamingAndTriggeringPolicy>
+        </rollingPolicy>
+
+        <encoder>
+            <pattern>${CONSOLE_LOG_PATTERN}</pattern>
+        </encoder>
+    </appender>
+
+    <appender name="messagefile"
+              class="ch.qos.logback.core.rolling.RollingFileAppender">
+        <rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy">
+            <FileNamePattern>/mdata/logs/app-message-%d{yyyy-MM-dd_HH}-%i.log</FileNamePattern>
+            <MaxHistory>90</MaxHistory>
+            <TimeBasedFileNamingAndTriggeringPolicy
+                    class="ch.qos.logback.core.rolling.SizeAndTimeBasedFNATP">
+                <MaxFileSize>20MB</MaxFileSize>
+            </TimeBasedFileNamingAndTriggeringPolicy>
+        </rollingPolicy>
+
+        <encoder>
+            <pattern>${CONSOLE_LOG_PATTERN}</pattern>
+        </encoder>
+    </appender>
+
+    <appender name="liveFile"
+              class="ch.qos.logback.core.rolling.RollingFileAppender">
+        <rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy">
+            <FileNamePattern>/mdata/logs/app-live-%d{yyyy-MM-dd_HH}-%i.log</FileNamePattern>
+            <MaxHistory>90</MaxHistory>
+            <TimeBasedFileNamingAndTriggeringPolicy
+                    class="ch.qos.logback.core.rolling.SizeAndTimeBasedFNATP">
+                <MaxFileSize>20MB</MaxFileSize>
+            </TimeBasedFileNamingAndTriggeringPolicy>
+        </rollingPolicy>
+
+        <encoder>
+            <pattern>${CONSOLE_LOG_PATTERN}</pattern>
+        </encoder>
+    </appender>
+
+    <logger name="com.ym.mec" level="INFO"/>
+
+    <logger name="com.ym.mec.thirdparty" level="INFO" additivity="false">
+        <appender-ref ref="messagefile"/>
+    </logger>
+
+    <!--开发环境:打印控制台 -->
+    <logger name="com.ym.mec.biz.service.impl.ImLiveBroadcastRoomServiceImpl" level="INFO" additivity="false">
+        <appender-ref ref="liveFile"/>
+    </logger>
+
+    <!--开发环境:打印控制台 -->
+    <springProfile name="local">
+        <root level="INFO">
+            <appender-ref ref="stdout"/>
+            <appender-ref ref="file"/>
+        </root>
+    </springProfile>
+
+    <!--开发环境:打印控制台 -->
+    <springProfile name="dev">
+        <root level="INFO">
+            <appender-ref ref="stdout"/>
+            <appender-ref ref="file"/>
+        </root>
+    </springProfile>
+
+    <springProfile name="test">
+        <root level="INFO">
+            <appender-ref ref="stdout"/>
+            <appender-ref ref="file"/>
+        </root>
+    </springProfile>
+
+    <springProfile name="dev_server">
+        <root level="INFO">
+            <appender-ref ref="stdout"/>
+            <appender-ref ref="file"/>
+        </root>
+    </springProfile>
+
+    <!--生产环境:输出到文件 -->
+    <springProfile name="prod">
+        <root level="INFO">
+            <appender-ref ref="stdout"/>
+            <appender-ref ref="file"/>
+        </root>
+    </springProfile>
+
+</configuration>

+ 6 - 3
mec-auth/mec-auth-server/src/main/java/com/ym/mec/auth/core/provider/AbstractAuthenticationProvider.java

@@ -156,11 +156,14 @@ public abstract class AbstractAuthenticationProvider implements AuthenticationPr
 
 		public void check(UserDetails user) {
 			if (!user.isAccountNonLocked()) {
-				throw new LockedException("User account is locked");
+				// User account is locked
+				throw new LockedException("当前账号已锁定");
 			} else if (!user.isEnabled()) {
-				throw new DisabledException("User account is disabled");
+				// User account is disabled
+				throw new DisabledException("当前账号已禁用");
 			} else if (!user.isAccountNonExpired()) {
-				throw new AccountExpiredException("User account is expired");
+				// User account is expired
+				throw new AccountExpiredException("当前账号已失效");
 			}
 		}
 	}

+ 1 - 1
mec-auth/mec-auth-server/src/main/resources/bootstrap-prod.properties

@@ -3,7 +3,7 @@
 #\u670d\u52a1\u5668\u5730\u5740
 spring.cloud.nacos.config.server-addr=10.206.0.12:8848
 #\u9ed8\u8ba4\u4e3aPublic\u547d\u540d\u7a7a\u95f4,\u53ef\u4ee5\u7701\u7565\u4e0d\u5199
-spring.cloud.nacos.config.namespace=f40a7594-4bd0-4bc6-8397-9353c6d2e63a
+spring.cloud.nacos.config.namespace=b7aee20b-41e8-43d8-8e2d-45b6447f66ae
 #\u6307\u5b9a\u914d\u7f6e\u7fa4\u7ec4 --\u5982\u679c\u662fPublic\u547d\u540d\u7a7a\u95f4 \u5219\u53ef\u4ee5\u7701\u7565\u7fa4\u7ec4\u914d\u7f6e
 spring.cloud.nacos.config.group=DEFAULT_GROUP
 #\u6587\u4ef6\u540d -- \u5982\u679c\u6ca1\u6709\u914d\u7f6e\u5219\u9ed8\u8ba4\u4e3a ${spring.appliction.name}

+ 4 - 0
mec-biz/src/main/java/com/ym/mec/biz/dal/dao/CourseScheduleDao.java

@@ -2090,4 +2090,8 @@ public interface CourseScheduleDao extends BaseDAO<Long, CourseSchedule> {
     CourseSchedule findByRoomUid(@Param("roomUid") String roomUid, @Param("type") GroupType type);
 
     List<ExportCourseIncomeDto> exportCourseIncome(@Param("month") String month);
+
+    List<CourseSchedule> getNotStartOnlineNoLive(@Param("beforeTime") Integer beforeTime, @Param("tenantInfoId") Integer tenantInfoId);
+
+    List<CourseSchedule> getEndTimeBetweenYesterdayAndNow();
 }

+ 3 - 3
mec-biz/src/main/java/com/ym/mec/biz/dal/entity/ImGroup.java

@@ -34,7 +34,7 @@ public class ImGroup extends BaseEntity {
 	/** 乐团群 MUSIC,班级群 CLASS,训练营 TRAINING 学校SCHOOL*/
 	private String type;
 
-	private String importFlag;
+	private Boolean importFlag;
 
 	public enum GroupTypeEnum implements BaseEnum<String,GroupTypeEnum> {
 		NORMAL("NORMAL", "普通班级", "https://oss.dayaedu.com/default-images/mec/NORMAL.png"),
@@ -196,11 +196,11 @@ public class ImGroup extends BaseEntity {
 		return this.updateTime;
 	}
 
-	public String getImportFlag() {
+	public Boolean getImportFlag() {
 		return importFlag;
 	}
 
-	public void setImportFlag(String importFlag) {
+	public void setImportFlag(Boolean importFlag) {
 		this.importFlag = importFlag;
 	}
 

+ 0 - 12
mec-biz/src/main/java/com/ym/mec/biz/dal/entity/ImGroupMember.java

@@ -47,8 +47,6 @@ public class ImGroupMember extends BaseEntity {
 	/**  */
 	private java.util.Date updateTime;
 
-	private Integer tenantId;
-
 
     public String getType() {
         return type;
@@ -163,16 +161,6 @@ public class ImGroupMember extends BaseEntity {
 	}
 
 	@Override
-	public Integer getTenantId() {
-		return tenantId;
-	}
-
-	@Override
-	public void setTenantId(Integer tenantId) {
-		this.tenantId = tenantId;
-	}
-
-	@Override
 	public String toString() {
 		return ToStringBuilder.reflectionToString(this);
 	}

+ 1 - 1
mec-biz/src/main/java/com/ym/mec/biz/dal/entity/ImGroupPlus.java

@@ -71,7 +71,7 @@ public class ImGroupPlus implements Serializable {
 
 
     @TableField(value = "import_flag_")
-    private String importFlag;
+    private Boolean importFlag;
 
     //群类型
     @TableField(value = "group_type_")

+ 8 - 2
mec-biz/src/main/java/com/ym/mec/biz/dal/enums/EFriendRoleType.java

@@ -14,6 +14,7 @@ public enum EFriendRoleType implements BaseEnum<Integer, EFriendRoleType> {
     MAINTENANCE_TECHNICIAN(6,"维护技师"),
     ORCHESTRA_TEACHER(7,"指导老师"),
     STUDENT(8,"学生"),
+    UNDEFINE(9,""),
 
 
     ;
@@ -35,8 +36,12 @@ public enum EFriendRoleType implements BaseEnum<Integer, EFriendRoleType> {
             case "SCHOOL_LEADER":
                 return SCHOOL_LEADER;
             case "TEACHER":
+            case "SCHOOL_TEACHER":
                 return SCHOOL_TEACHER;
+            case "STUDENT":
+                return STUDENT;
             case "乐团主管":
+            case "ORCHESTRA_MANAGER":
                 return ORCHESTRA_MANAGER;
             case "指导老师":
                 return ORCHESTRA_TEACHER;
@@ -52,7 +57,8 @@ public enum EFriendRoleType implements BaseEnum<Integer, EFriendRoleType> {
             case "维护技师":
                 return SCHOOL_TEACHER;
             default:
-                return STUDENT;
+//                return STUDENT;
+                return UNDEFINE;
         }
     }
 
@@ -74,7 +80,7 @@ public enum EFriendRoleType implements BaseEnum<Integer, EFriendRoleType> {
                 return SysUserType.STUDENT;
         }
 
-        return SysUserType.STUDENT;
+        return null;
     }
 
     public String getMsg() {

+ 4 - 0
mec-biz/src/main/java/com/ym/mec/biz/service/CourseScheduleService.java

@@ -857,4 +857,8 @@ public interface CourseScheduleService extends BaseService<Long, CourseSchedule>
 	void sendChatRoomMessage(List<CourseSchedule> courseSchedules);
 
     List<ExportCourseIncomeDto> exportCourseIncome(String month);
+
+    void rtcRoomCreate();
+
+    void destroyRtcRoom();
 }

+ 3 - 6
mec-biz/src/main/java/com/ym/mec/biz/service/ImGroupService.java

@@ -3,13 +3,10 @@ package com.ym.mec.biz.service;
 import com.alibaba.fastjson.JSONObject;
 import com.microsvc.toolkit.middleware.im.message.GroupMemberWrapper;
 import com.microsvc.toolkit.middleware.im.message.TencentRequest;
-import com.microsvc.toolkit.middleware.rtc.RTCRoomPluginService;
-import com.ym.mec.biz.dal.dto.im.BasicUserInfo;
 import com.ym.mec.biz.dal.dto.ImGroupDto;
 import com.ym.mec.biz.dal.dto.ImGroupMemberDto;
 import com.ym.mec.biz.dal.dto.NameDto;
 import com.ym.mec.biz.dal.entity.ImGroup;
-import com.ym.mec.biz.dal.entity.ImHistoryMessage;
 import com.ym.mec.biz.dal.enums.school.ESchoolStaffType;
 import com.ym.mec.biz.dal.wrapper.ImGroupWrapper;
 import com.ym.mec.common.service.BaseService;
@@ -184,7 +181,7 @@ public interface ImGroupService extends BaseService<String, ImGroup> {
 	/**
 	 * 群迁移
 	 */
-	void groupTransfer(String startTime,String endTime);
+	void groupTransfer(String startTime,String endTime,Integer type);
 
 	/**
 	 * 导入用户
@@ -195,12 +192,12 @@ public interface ImGroupService extends BaseService<String, ImGroup> {
 	 * 查询总数
 	 * @return
 	 */
-	int queryInfoCount();
+	int queryInfoCount(int targetType);
 
 	/**
 	 * 读取融云数据库信息
 	 */
-	com.yonge.mongodb.PageInfo getRongYunInfo(int page, int size);
+	com.yonge.mongodb.PageInfo getRongYunInfo(int page, int size, int targetType);
 
 	/**
 	 * 导入IM腾讯云

+ 6 - 0
mec-biz/src/main/java/com/ym/mec/biz/service/SysUserService.java

@@ -16,4 +16,10 @@ public interface SysUserService {
     String getImName(SysUser sysUser);
 
     String getImAvatar(SysUser sysUser);
+
+    /**
+     * 注册用户三方IM
+     * @param userId 用户id
+     */
+    void registerImUserInfo(Integer userId);
 }

+ 4 - 1
mec-biz/src/main/java/com/ym/mec/biz/service/im/impl/ImGroupCoreServiceImpl.java

@@ -154,6 +154,7 @@ public class ImGroupCoreServiceImpl implements ImGroupCoreService {
         List<ImGroupMemberWrapper.ImGroupMember> groupMembers = null;
         String imUserId = null;
         if (userInfo != null) {
+            userInfo.setGroupId(group.getId());
             imUserId = getImUserId(userInfo.getUserId().toString(), userInfo.getClientType());
             groupMembers = Lists.newArrayList(userInfo);
 
@@ -259,7 +260,8 @@ public class ImGroupCoreServiceImpl implements ImGroupCoreService {
         // 判定登录用户是否为群主
         ImGroupPlus imGroup = imGroupService.lambdaQuery().eq(ImGroupPlus::getId, groupId).last("LIMIT 1").one();
         if (Objects.isNull(imGroup)) {
-            throw new BizException("群组不存在");
+            //throw new BizException("群组不存在");
+            return;
         }
 
 
@@ -535,6 +537,7 @@ public class ImGroupCoreServiceImpl implements ImGroupCoreService {
                 .imUserId(getImUserId(userId.toString(),clientType))
                 .isAdmin(false)
                 .roleType(clientType)
+                .tenantId(imGroup.getTenantId())
                 .build();
         imGroupMembers.add(groupMember);
 

+ 99 - 5
mec-biz/src/main/java/com/ym/mec/biz/service/impl/CourseScheduleServiceImpl.java

@@ -8,6 +8,9 @@ import com.baomidou.mybatisplus.core.metadata.IPage;
 import com.microsvc.toolkit.middleware.live.LivePluginContext;
 import com.microsvc.toolkit.middleware.live.LivePluginService;
 import com.microsvc.toolkit.middleware.live.message.LiveRoomMessage;
+import com.microsvc.toolkit.middleware.rtc.RTCRoomPluginContext;
+import com.microsvc.toolkit.middleware.rtc.RTCRoomPluginService;
+import com.microsvc.toolkit.middleware.rtc.impl.TencentCloudRTCPlugin;
 import com.ym.mec.auth.api.entity.SysUser;
 import com.ym.mec.biz.dal.dao.*;
 import com.ym.mec.biz.dal.dto.*;
@@ -36,6 +39,7 @@ import com.ym.mec.common.page.QueryInfo;
 import com.ym.mec.common.page.WrapperUtil;
 import com.ym.mec.common.service.impl.BaseServiceImpl;
 import com.ym.mec.common.tenant.TenantContextHolder;
+import com.ym.mec.im.ImFeignService;
 import com.ym.mec.thirdparty.message.MessageSenderPluginContext.MessageSender;
 import com.ym.mec.util.collection.ListUtil;
 import com.ym.mec.util.collection.MapUtil;
@@ -47,7 +51,6 @@ import org.apache.commons.collections.CollectionUtils;
 import lombok.extern.slf4j.Slf4j;
 import org.apache.commons.collections.ListUtils;
 import org.apache.commons.collections.MapUtils;
-import org.apache.commons.lang3.SerializationUtils;
 import org.apache.commons.lang3.StringUtils;
 import org.jetbrains.annotations.Nullable;
 import org.joda.time.DateTime;
@@ -59,7 +62,6 @@ import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.context.annotation.Lazy;
 import org.springframework.http.HttpStatus;
 import org.springframework.stereotype.Service;
-import org.springframework.transaction.annotation.Propagation;
 import org.springframework.transaction.annotation.Transactional;
 import org.springframework.transaction.interceptor.TransactionAspectSupport;
 import java.lang.reflect.InvocationTargetException;
@@ -70,9 +72,6 @@ import java.time.*;
 import java.time.format.DateTimeFormatter;
 import java.time.temporal.TemporalAdjusters;
 import java.util.*;
-import java.util.concurrent.CompletableFuture;
-import java.util.concurrent.ExecutorService;
-import java.util.concurrent.Executors;
 import java.util.stream.Collectors;
 
 import static com.ym.mec.biz.dal.entity.CourseSchedule.CourseScheduleType.MUSIC_NETWORK;
@@ -207,11 +206,16 @@ public class CourseScheduleServiceImpl extends BaseServiceImpl<Long, CourseSched
     private ImLiveRoomVideoService imLiveRoomVideoService;
 
     @Autowired
+    private RTCRoomPluginContext rtcRoomPluginContext;
+    @Autowired
     private ImLiveRoomVideoDao imLiveRoomVideoDao;
 
     @Autowired
     private LiveGroupPlusMapper liveGroupPlusMapper;
 
+    @Autowired
+    private TenantInfoService tenantInfoService;
+
     private final Logger businessLogger = LoggerFactory
             .getLogger(this.getClass());
 
@@ -6206,6 +6210,96 @@ public class CourseScheduleServiceImpl extends BaseServiceImpl<Long, CourseSched
     }
 
     @Override
+    public void rtcRoomCreate() {
+
+        List<TenantInfo> list = tenantInfoService.list();
+        if (CollectionUtils.isEmpty(list)) {
+            return;
+        }
+
+        for (TenantInfo tenantInfo : list) {
+            //是否提前进入教室
+            String courseBeforeBufferTime = sysTenantConfigService.getTenantConfigValue(SysConfigService.COURSE_BEFORE_BUFFER_TIME, tenantInfo.getId());
+            if (StringUtils.isEmpty(courseBeforeBufferTime)) {
+                courseBeforeBufferTime = "5";
+            }
+            Integer beforeTime = Integer.parseInt(courseBeforeBufferTime) + 5;
+
+            List<CourseSchedule> scheduleList = courseScheduleDao.getNotStartOnlineNoLive(beforeTime, tenantInfo.getId());
+            if (CollectionUtils.isEmpty(scheduleList)) {
+                continue;
+            }
+            for (CourseSchedule courseSchedule : scheduleList) {
+                try {
+                    RTCRoomPluginService pluginService;
+                    if (StringUtils.isBlank(courseSchedule.getServiceProvider())) {
+                        pluginService = rtcRoomPluginContext.getPluginService();
+                    } else {
+                        pluginService = rtcRoomPluginContext.getPluginService(courseSchedule.getServiceProvider());
+                    }
+                    // 群组帐号注册
+                    Teacher teacher = teacherDao.get(courseSchedule.getTeacherId());
+                    if (Objects.nonNull(teacher)) {
+                        try {
+                            pluginService.register(courseSchedule.getTeacherId().toString(), teacher.getRealName(), teacher.getAvatar());
+                        } catch (Exception e) {
+                            log.error("直播房间群主注册失败: userId={}", courseSchedule.getTeacherId(), e);
+                        }
+                    }
+
+                    //记录用户实际选择的房间
+                    String roomId = courseSchedule.getId().toString();
+                    if (courseSchedule.getGroupType() == GroupType.COMM) {
+                        roomId = "I" + roomId;
+                    } else {
+                        roomId = "S" + roomId;
+                    }
+
+                    // 生成群组
+                    pluginService.chatRoomCreate(roomId, courseSchedule.getName(), courseSchedule.getTeacherId().toString());
+                    courseScheduleDao.updateLiveRemind(courseSchedule.getId(),1);
+                } catch (Exception e) {
+                    log.error("创建rtc房间失败", e);
+                }
+            }
+        }
+        
+
+    }
+
+    @Override
+    public void destroyRtcRoom() {
+
+        // 查询结束时间在昨天到现在的课程
+        List<CourseSchedule> scheduleList = courseScheduleDao.getEndTimeBetweenYesterdayAndNow();
+        if (CollectionUtils.isEmpty(scheduleList)) {
+            return;
+        }
+        for (CourseSchedule courseSchedule : scheduleList) {
+            try {
+                RTCRoomPluginService pluginService;
+                if (StringUtils.isBlank(courseSchedule.getServiceProvider())) {
+                    pluginService = rtcRoomPluginContext.getPluginService();
+                } else {
+                    pluginService = rtcRoomPluginContext.getPluginService(courseSchedule.getServiceProvider());
+                }
+                if (TencentCloudRTCPlugin.PLUGIN_NAME.equals(pluginService.pluginName())) {
+                    // 腾讯云群销毁
+                    String roomId = courseSchedule.getId().toString();
+                    if (courseSchedule.getGroupType() == GroupType.COMM) {
+                        roomId = "I" + roomId;
+                    } else {
+                        roomId = "S" + roomId;
+                    }
+                    pluginService.chatRoomDestroy(roomId);
+                }
+            } catch (Exception e) {
+                log.error("销毁rtc房间失败", e);
+            }
+        }
+    }
+
+    @Override
     public List<CourseScheduleStudentDto> queryDetailList(CourseDetailQueryInfo courseDetailQueryInfo) {
 
 

+ 63 - 30
mec-biz/src/main/java/com/ym/mec/biz/service/impl/EmployeeServiceImpl.java

@@ -24,6 +24,8 @@ import com.microsvc.toolkit.middleware.im.message.GroupMemberWrapper;
 import com.ym.mec.biz.dal.dto.SimpleUserDto;
 import com.ym.mec.biz.dal.enums.im.ClientEnum;
 import com.ym.mec.biz.dal.wrapper.ImGroupMemberWrapper;
+import com.ym.mec.biz.dal.wrapper.ImGroupWrapper;
+import com.ym.mec.biz.service.*;
 import com.ym.mec.biz.service.im.ImGroupCoreService;
 import com.ym.mec.common.page.QueryInfo;
 import lombok.extern.slf4j.Slf4j;
@@ -64,13 +66,6 @@ import com.ym.mec.biz.dal.enums.GroupType;
 import com.ym.mec.biz.dal.enums.ParamEnum;
 import com.ym.mec.biz.dal.page.EmployeeQueryInfo;
 import com.ym.mec.biz.dal.page.UserBasicQueryInfo;
-import com.ym.mec.biz.service.EmployeeService;
-import com.ym.mec.biz.service.ImGroupMemberService;
-import com.ym.mec.biz.service.ImUserFriendService;
-import com.ym.mec.biz.service.OaUserService;
-import com.ym.mec.biz.service.SysEmployeePositionService;
-import com.ym.mec.biz.service.SysUserTenantService;
-import com.ym.mec.biz.service.TenantInfoService;
 import com.ym.mec.common.dal.BaseDAO;
 import com.ym.mec.common.entity.ImGroupModel;
 import com.ym.mec.common.entity.ImResult;
@@ -128,6 +123,9 @@ public class EmployeeServiceImpl extends BaseServiceImpl<Integer, Employee> impl
     @Autowired
     private ImPluginContext imPluginContext;
 
+    @Autowired
+    private SysUserService sysUserService;
+
     @Override
     public BaseDAO<Integer, Employee> getDAO() {
         return employeeDao;
@@ -144,7 +142,7 @@ public class EmployeeServiceImpl extends BaseServiceImpl<Integer, Employee> impl
     @Transactional(rollbackFor = Exception.class)
     public void add(Employee employee) {
         RBucket<String> bucket = redissonClient.getBucket("add_employee_lock" + employee.getPhone());
-        if (!bucket.trySet(employee.getPhone(), 1l, TimeUnit.SECONDS)) {
+        if (!bucket.trySet(employee.getPhone(), 1L, TimeUnit.SECONDS)) {
             throw new BizException("请勿重复提交");
         }
         SysUser user = teacherDao.getUserWithPhone(employee.getPhone());
@@ -152,6 +150,7 @@ public class EmployeeServiceImpl extends BaseServiceImpl<Integer, Employee> impl
             throw new BizException("用户已存在学校账户");
         }
         Integer tenantId = employee.getTenantId();
+
         if (user != null && user.getId() != null) {
             checkTenantId(tenantId, user.getTenantId());
             Employee employee1 = employeeDao.get(user.getId());
@@ -178,6 +177,11 @@ public class EmployeeServiceImpl extends BaseServiceImpl<Integer, Employee> impl
                 }
                 employee.setUserType(user.getUserType() + ",SYSTEM");
                 teacherDao.updateUser(employee);
+
+                // 用户更新信息同步到三方
+                if (Objects.nonNull(employee.getId())) {
+                    registerImUserInfo(employee.getId());
+                }
                 return;
             } else {
                 throw new BizException("员工已存在");
@@ -203,7 +207,11 @@ public class EmployeeServiceImpl extends BaseServiceImpl<Integer, Employee> impl
         }
         //添加用户现金账户
         sysUserCashAccountDao.insert(new SysUserCashAccount(employee.getId(), tenantId, "CNY"));
-        ImResult imResult = imFeignService.register(new ImUserModel(employee.getId().toString(), employee.getUsername(), null));
+        // IM头像
+        String imAvatar = sysUserService.getImAvatar(teacherDao.getUser(employee.getId()));
+        // IM用户昵称
+        String imName = sysUserService.getImName(teacherDao.getUser(employee.getId()));
+        ImResult imResult = imFeignService.register(new ImUserModel(employee.getId().toString(), imName, imAvatar));
         employee.setImToken(imResult.getToken());
         teacherDao.updateUser(employee);
         if (user != null) {
@@ -217,6 +225,7 @@ public class EmployeeServiceImpl extends BaseServiceImpl<Integer, Employee> impl
         addUserTenant(employee.getTenantIds(), tenantId, userId);
         //添加到OA
         oaUserService.addOaUser(employee);
+
     }
 
     /**
@@ -286,7 +295,9 @@ public class EmployeeServiceImpl extends BaseServiceImpl<Integer, Employee> impl
         teacherDao.updateUser(employee);
         imGroupDao.updateNickname(employee.getUserId(), employee.getRealName());
         imGroupDao.updateUserFriendNickname(employee.getUserId(), employee.getRealName());
-        imFeignService.update(new ImUserModel(employee.getUserId().toString(), employee.getRealName(), sysUser.getAvatar()));
+        //imFeignService.update(new ImUserModel(employee.getUserId().toString(), employee.getRealName(), sysUser.getAvatar()));
+        // 用户更新信息同步到三方
+        sysUserService.registerImUserInfo(employee.getUserId());
 
         employee.setAvatar(sysUser.getAvatar());
         //更新机构信息
@@ -310,6 +321,11 @@ public class EmployeeServiceImpl extends BaseServiceImpl<Integer, Employee> impl
                 e.printStackTrace();
             }
         });
+
+        // 用户更新信息同步到三方
+        if (Objects.nonNull(employee.getId())) {
+            registerImUserInfo(employee.getId());
+        }
     }
 
     @Override
@@ -547,15 +563,20 @@ public class EmployeeServiceImpl extends BaseServiceImpl<Integer, Employee> impl
 
                         try {
                             // 获取用户头象
-                            List<Integer> collect1 = entry.getValue().stream()
-                                .map(x -> x.getUserId().intValue()).distinct().collect(Collectors.toList());
-
-                            Map<Integer, String> avatarMap = teacherDao.getUsersSimpleInfo(collect1).stream()
-                                .collect(Collectors.toMap(SimpleUserDto::getUserId, SimpleUserDto::getAvatar, (o, n) -> n));
+//                            List<Integer> collect1 = entry.getValue().stream()
+//                                .map(x -> x.getUserId().intValue()).distinct().collect(Collectors.toList());
+//
+//                            Map<Integer, String> avatarMap = teacherDao.getUsersSimpleInfo(collect1).stream()
+//                                .collect(Collectors.toMap(SimpleUserDto::getUserId, SimpleUserDto::getAvatar, (o, n) -> n));
 
                             // 设置用户默认头象
                             for (ImGroupMemberWrapper.ImGroupMember member : entry.getValue()) {
-                                member.setAvatar(avatarMap.getOrDefault(member.getUserId().intValue(), ""));
+//                                member.setAvatar(avatarMap.getOrDefault(member.getUserId().intValue(), ""));
+                                SysUser user = teacherDao.getUser(member.getUserId().intValue());
+
+                                // 用户头像
+                                member.setAvatar(sysUserService.getImAvatar(user));
+                                member.setNickname(sysUserService.getImName(user));
                             }
                             // 腾讯云用户加群
                             imGroupCoreService.groupMemberJoin(entry.getKey(), entry.getValue());
@@ -609,16 +630,16 @@ public class EmployeeServiceImpl extends BaseServiceImpl<Integer, Employee> impl
 
                         try {
                             // 获取用户头象
-                            List<Integer> collect1 = entry.getValue().stream()
-                                .map(x -> x.getUserId().intValue()).distinct().collect(Collectors.toList());
-
-                            Map<Integer, String> avatarMap = teacherDao.getUsersSimpleInfo(collect1).stream()
-                                .collect(Collectors.toMap(SimpleUserDto::getUserId, SimpleUserDto::getAvatar, (o, n) -> n));
-
-                            // 设置用户默认头象
-                            for (GroupMemberWrapper.ImGroupMember member : entry.getValue()) {
-                                member.setAvatar(avatarMap.getOrDefault(member.getUserId().intValue(), ""));
-                            }
+//                            List<Integer> collect1 = entry.getValue().stream()
+//                                .map(x -> x.getUserId().intValue()).distinct().collect(Collectors.toList());
+//
+//                            Map<Integer, String> avatarMap = teacherDao.getUsersSimpleInfo(collect1).stream()
+//                                .collect(Collectors.toMap(SimpleUserDto::getUserId, SimpleUserDto::getAvatar, (o, n) -> n));
+//
+//                            // 设置用户默认头象
+//                            for (GroupMemberWrapper.ImGroupMember member : entry.getValue()) {
+//                                member.setAvatar(avatarMap.getOrDefault(member.getUserId().intValue(), ""));
+//                            }
                             // 用户退群
                             imGroupCoreService.groupQuit(entry.getValue(), entry.getKey());
                         } catch (Exception e) {
@@ -727,22 +748,34 @@ public class EmployeeServiceImpl extends BaseServiceImpl<Integer, Employee> impl
         employeeDao.update(employee);
 
         // 用户更新信息同步到三方
-        SysUser userInfo = teacherDao.getUser(employee.getId());
+        registerImUserInfo(employee.getId());
+
+    }
+
+    /**
+     *  用户更新信息同步到三方
+     * @param userId 用户id
+     */
+    private void registerImUserInfo(Integer userId) {
+        SysUser userInfo = teacherDao.getUser(userId);
         if (Objects.nonNull(userInfo)) {
 
             try {
                 String username = userInfo.getUsername();
                 List<String> userTypes = Lists.newArrayList(userInfo.getUserType().split(","));
-                if (userTypes.size() > 1 || userTypes.contains(ClientEnum.TEACHER.getCode())) {
+                if (userTypes.size() > 1
+                    || userTypes.contains(ClientEnum.TEACHER.getCode())
+                    || userTypes.contains(ClientEnum.SYSTEM.getCode())) {
                     username = Optional.ofNullable(userInfo.getRealName()).filter(StringUtils::isNotBlank).orElse(username);
                 }
 
-                imGroupCoreService.register(String.valueOf(userInfo.getId()), "", username, userInfo.getAvatar());
+                ImGroupWrapper.ImUserInfo imUserInfo = imGroupCoreService.register(String.valueOf(userInfo.getId()), "",
+                    username, sysUserService.getImAvatar(userInfo));
+                log.info("用户更新信息同步到三方成功,userId={}, username={}, ret={}", userInfo.getId(), username, JSON.toJSONString(imUserInfo));
             } catch (Exception e) {
                 log.error("用户更新信息同步到三方失败,userId:{}", userInfo.getId(), e);
             }
         }
-
     }
 
     @Override

+ 8 - 1
mec-biz/src/main/java/com/ym/mec/biz/service/impl/ImGroupMemberPlusServiceImpl.java

@@ -3,13 +3,14 @@ package com.ym.mec.biz.service.impl;
 import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
 import com.ym.mec.biz.dal.entity.ImGroupMemberPlus;
 import com.ym.mec.biz.service.ImGroupMemberPlusService;
+import com.ym.mec.common.tenant.TenantContextHolder;
 import org.springframework.stereotype.Service;
 import lombok.extern.slf4j.Slf4j;
-import com.ym.mec.biz.dal.entity.ImGroupMember;
 import com.ym.mec.biz.dal.mapper.ImGroupMemberPlusMapper;
 import org.springframework.transaction.annotation.Transactional;
 
 import java.util.List;
+import java.util.Objects;
 
 /**
  * 群成员表
@@ -33,6 +34,12 @@ public class ImGroupMemberPlusServiceImpl extends ServiceImpl<ImGroupMemberPlusM
     @Transactional(rollbackFor = Exception.class)
     @Override
     public void insertBatch(List<ImGroupMemberPlus> imGroupMemberEntity) {
+        // 添加机构ID
+        for (ImGroupMemberPlus item : imGroupMemberEntity) {
+            if (Objects.isNull(item.getTenantId())) {
+                item.setTenantId(TenantContextHolder.getTenantId());
+            }
+        }
         baseMapper.insertBatch(imGroupMemberEntity);
     }
 

+ 31 - 23
mec-biz/src/main/java/com/ym/mec/biz/service/impl/ImGroupMemberServiceImpl.java

@@ -15,6 +15,7 @@ import com.ym.mec.biz.dal.page.GroupMemberQueryInfo;
 import com.ym.mec.biz.dal.wrapper.ImGroupMemberWrapper;
 import com.ym.mec.biz.service.ImGroupMemberService;
 import com.ym.mec.biz.service.ImGroupService;
+import com.ym.mec.biz.service.SysUserService;
 import com.ym.mec.biz.service.im.ImGroupCoreService;
 import com.ym.mec.common.dal.BaseDAO;
 import com.ym.mec.common.exception.BizException;
@@ -64,6 +65,9 @@ public class ImGroupMemberServiceImpl extends BaseServiceImpl<Long, ImGroupMembe
 	private ImGroupCoreService imGroupCoreService;
 	@Autowired
 	private ImPluginContext imPluginContext;
+
+    @Autowired
+    private SysUserService sysUserService;
 	@Override
 	public BaseDAO<Long, ImGroupMember> getDAO() {
 		return imGroupMemberDao;
@@ -147,12 +151,13 @@ public class ImGroupMemberServiceImpl extends BaseServiceImpl<Long, ImGroupMembe
 		imGroupMember.setRoleType(roleType);
 		imGroupMember.setUpdateTime(date);
 		imGroupMember.setUserId(userId);
-		SysUser user = teacherDao.getUser(userId);
-		if (StringUtils.isBlank(roleType)) {
-			imGroupMember.setNickname(user.getUsername()==null?user.getRealName():user.getUsername());
-		} else {
-			imGroupMember.setNickname(user.getRealName()==null?user.getUsername():user.getRealName());
-		}
+//		if (StringUtils.isBlank(roleType)) {
+//			imGroupMember.setNickname(user.getUsername()==null?user.getRealName():user.getUsername());
+//		} else {
+//			imGroupMember.setNickname(user.getRealName()==null?user.getUsername():user.getRealName());
+//		}
+        SysUser user = teacherDao.getUser(userId);
+        imGroupMember.setNickname(sysUserService.getImName(user));
 
 		imGroupMemberDao.insert(imGroupMember);
 
@@ -177,7 +182,7 @@ public class ImGroupMemberServiceImpl extends BaseServiceImpl<Long, ImGroupMembe
 						.nickname(imGroupMember.getNickname())
 						.userId(userId.longValue())
 						.imUserId(userId.toString())
-						.avatar(user.getAvatar())
+						.avatar(sysUserService.getImAvatar(user))
 						.updateTime(DateTime.now().toDate())
 						.createTime(DateTime.now().toDate())
 					.build());
@@ -215,12 +220,14 @@ public class ImGroupMemberServiceImpl extends BaseServiceImpl<Long, ImGroupMembe
 		imGroupMember.setRoleType(roleType);
 		imGroupMember.setUpdateTime(date);
 		imGroupMember.setUserId(user.getId());
-		if (StringUtils.isBlank(roleType)) {
-			imGroupMember.setNickname(user.getUsername()==null?user.getRealName():user.getUsername());
-		} else {
-			imGroupMember.setNickname(user.getRealName()==null?user.getUsername():user.getRealName());
-		}
+//		if (StringUtils.isBlank(roleType)) {
+//			imGroupMember.setNickname(user.getUsername()==null?user.getRealName():user.getUsername());
+//		} else {
+//			imGroupMember.setNickname(user.getRealName()==null?user.getUsername():user.getRealName());
+//		}
+
 
+        imGroupMember.setNickname(sysUserService.getImName(user));
 		imGroupMemberDao.insert(imGroupMember);
 
 		imGroup.setMemberNum(1);
@@ -245,7 +252,7 @@ public class ImGroupMemberServiceImpl extends BaseServiceImpl<Long, ImGroupMembe
 						.nickname(imGroupMember.getNickname())
 						.isAdmin(imGroupMember.getIsAdmin())
 						.roleType(imGroupMember.getRoleType())
-						.avatar(user.getAvatar())
+						.avatar(sysUserService.getImAvatar(user))
 					.build());
 				// 腾讯云IM用户加群
 				imGroupCoreService.groupMemberJoin(groupId, groupMembers);
@@ -341,16 +348,17 @@ public class ImGroupMemberServiceImpl extends BaseServiceImpl<Long, ImGroupMembe
 				try {
 					for (ImGroupMemberWrapper.ImGroupMember item : groupMembers) {
 						// 用户昵称
-						if (StringUtils.isBlank(item.getRoleType())) {
-							item.setNickname(usernameMap.get(item.getUserId().intValue()));
-						} else {
-							item.setNickname(realNameMap.get(item.getUserId().intValue()));
-						}
-						item.setImUserId(item.getUserId().toString());
-
-						BasicUserInfo userInfo = teacherDao.getBasicUserInfo(item.getUserId().intValue());
-						// 用户头像
-						item.setAvatar(userInfo.getAvatar());
+//						if (StringUtils.isBlank(item.getRoleType())) {
+//							item.setNickname(usernameMap.get(item.getUserId().intValue()));
+//						} else {
+//							item.setNickname(realNameMap.get(item.getUserId().intValue()));
+//						}
+//						item.setImUserId(item.getUserId().toString());
+                        SysUser user = teacherDao.getUser(item.getUserId().intValue());
+
+                        // 用户头像
+						item.setAvatar(sysUserService.getImAvatar(user));
+						item.setNickname(sysUserService.getImName(user));
 					}
 					// 腾讯云IM用户加群
 					imGroupCoreService.groupMemberJoin(groupId, groupMembers);

+ 337 - 122
mec-biz/src/main/java/com/ym/mec/biz/service/impl/ImGroupServiceImpl.java

@@ -6,6 +6,7 @@ import com.alibaba.fastjson.JSONObject;
 import com.baomidou.mybatisplus.core.metadata.IPage;
 import com.baomidou.mybatisplus.core.toolkit.IdWorker;
 import com.google.common.collect.Lists;
+import com.microsvc.toolkit.middleware.common.http.DateUtil;
 import com.microsvc.toolkit.middleware.common.http.ImageUtil;
 import com.microsvc.toolkit.middleware.im.ImPluginContext;
 import com.microsvc.toolkit.middleware.im.message.GroupMemberWrapper;
@@ -73,6 +74,7 @@ import java.time.LocalDateTime;
 import java.time.ZoneId;
 import java.time.format.DateTimeFormatter;
 import java.util.*;
+import java.util.concurrent.*;
 import java.util.function.Function;
 import java.util.stream.Collectors;
 
@@ -196,14 +198,14 @@ public class ImGroupServiceImpl extends BaseServiceImpl<String, ImGroup> impleme
         com.ym.mec.biz.dal.wrapper.ImGroupMemberWrapper.ImGroupMember groupMember = null;
         if (userId != null) {
             SysUser sysUser = teacherDao.getUser(userId);
-            SysUserType sysUserType = EFriendRoleType.getByName(roleType).toSysUserType();
-            groupMember = com.ym.mec.biz.dal.wrapper.ImGroupMemberWrapper.ImGroupMember
+            groupMember = ImGroupMemberWrapper.ImGroupMember
                     .builder()
                     .userId(userId.longValue())
-                    .clientType(sysUserType.name())
-                    .avatar(sysUser.getAvatar())
-                    .nickname(sysUserType == SysUserType.STUDENT?sysUser.getUsername():sysUser.getRealName())
+                    .clientType("")
+                    .avatar(sysUserService.getImAvatar(sysUser))
+                    .nickname(sysUserService.getImName(sysUser))
                     .roleType(roleType)
+                    .tenantId(Optional.ofNullable(imGroup.getTenantId()).orElse(TenantContextHolder.getTenantId()))
                     .isAdmin(true)
                     .build();
         }
@@ -254,17 +256,18 @@ public class ImGroupServiceImpl extends BaseServiceImpl<String, ImGroup> impleme
     }
 
     private void addImGroupMember(String groupId, List<ImGroupMember> groupMemberList) {
+        ImGroup imGroup = imGroupDao.get(groupId);
         List<com.ym.mec.biz.dal.wrapper.ImGroupMemberWrapper.ImGroupMember> imGroupMembers = Lists.newArrayList();
         for (ImGroupMember groupMember : groupMemberList) {
-            SysUserType sysUserType = EFriendRoleType.getByName(groupMember.getRoleType()).toSysUserType();
-            imGroupMembers.add(com.ym.mec.biz.dal.wrapper.ImGroupMemberWrapper.ImGroupMember.builder()
+            SysUser user = teacherDao.getUser(groupMember.getUserId());
+            imGroupMembers.add(ImGroupMemberWrapper.ImGroupMember.builder()
                     .groupId(groupMember.getImGroupId())
                     .userId(groupMember.getUserId().longValue())
-                    .clientType(sysUserType.name())
-//                    .avatar(groupMember.getAvatar())
-                    .nickname(groupMember.getNickname())
+                    .avatar(sysUserService.getImAvatar(user))
+                    .nickname(sysUserService.getImName(user))
                     .isAdmin(groupMember.getIsAdmin())
-                    .imUserId(getImUserId(groupMember.getUserId().toString(), sysUserType.name()))
+                    .tenantId(Optional.ofNullable(imGroup.getTenantId()).orElse(TenantContextHolder.getTenantId()))
+                    .imUserId(getImUserId(groupMember.getUserId().toString(), ""))
                     .roleType(groupMember.getRoleType())
                     .build());
         }
@@ -297,7 +300,8 @@ public class ImGroupServiceImpl extends BaseServiceImpl<String, ImGroup> impleme
 
     @Override
     public List<ImGroup> queryByUserId(Integer userId, String search,String groupType) {
-        List<ImGroup> imGroups = imGroupDao.queryByUserId(userId, search, groupType);
+        List<ImGroup> imGroups = imGroupDao.queryByUserId(userId, search, groupType).stream()
+            .filter(Objects::nonNull).collect(Collectors.toList());
         for (ImGroup item : imGroups) {
             if (Objects.nonNull(item.getGroupType()) && StringUtils.isBlank(item.getImg())) {
                 item.setImg(item.getGroupType().getAvatar());
@@ -332,7 +336,9 @@ public class ImGroupServiceImpl extends BaseServiceImpl<String, ImGroup> impleme
             if (Objects.nonNull(imGroupMemberDto.getUser()) && StringUtils.isNotBlank(imGroupMemberDto.getUser().getUserType())) {
 
                 List<String> userTypes = Lists.newArrayList(imGroupMemberDto.getUser().getUserType().split(","));
-                if (userTypes.size() > 1 || userTypes.contains(ClientEnum.TEACHER.getCode())) {
+                if (userTypes.size() > 1
+                    || userTypes.contains(ClientEnum.TEACHER.getCode())
+                    || userTypes.contains(ClientEnum.SYSTEM.getCode())) {
                     // 增加用户身份数量 > 1 或者包含老师身份,统一使用实名
                     imGroupMemberDto.setGroupNickname(Optional.ofNullable(imGroupMemberDto.getUser().getRealName()).filter(StringUtils::isNotBlank).orElse(imGroupMemberDto.getUser().getUsername()));
                 }
@@ -384,7 +390,7 @@ public class ImGroupServiceImpl extends BaseServiceImpl<String, ImGroup> impleme
 
         // IM用户信息更新
         try {
-            imGroupCoreService.register(userId.toString(),"",nickName,sysUser.getAvatar());
+            imGroupCoreService.register(userId.toString(),"",nickName,sysUserService.getImAvatar(sysUser));
         } catch (Exception e) {
             log.error("更新用户信息失败",e);
             throw new BizException("更新用户信息失败");
@@ -485,7 +491,8 @@ public class ImGroupServiceImpl extends BaseServiceImpl<String, ImGroup> impleme
         }
         List<String> imGroupIds = imGroupMembers.stream().map(ImGroupMember::getImGroupId).collect(Collectors.toList());
         // 群组没人,删除群组
-        List<ImGroup> imGroups = imGroupDao.queryByUserId(userId.intValue(),null, ImGroup.GroupTypeEnum.SCHOOL.getCode());
+        List<ImGroup> imGroups = imGroupDao.queryByUserId(userId.intValue(),null, ImGroup.GroupTypeEnum.SCHOOL.getCode()).stream()
+            .filter(Objects::nonNull).collect(Collectors.toList());
 
 
         imGroupMemberDao.deleteByUserId(userId);
@@ -524,7 +531,7 @@ public class ImGroupServiceImpl extends BaseServiceImpl<String, ImGroup> impleme
 
 
         // 注册主播用户信息到三方平台
-        imGroupCoreService.register(userId.toString(),"", name, avatar);
+        imGroupCoreService.register(userId.toString(),"", name, sysUserService.getImAvatar(teacherDao.getUser(userId)));
 
         boolean createFlag = false;
         // 群组不存在,先创建群组
@@ -538,20 +545,22 @@ public class ImGroupServiceImpl extends BaseServiceImpl<String, ImGroup> impleme
             imGroup.setIntroduce(imGroup.getName());
             imGroup.setMemo(imGroup.getName());
             imGroup.setMemberNum(0);
-            imGroup.setImg(sysConfigService.findByParamName(SysConfigService.SCHOOL_IM_GROUP_IMG).getParanValue());
+            //imGroup.setImg(sysConfigService.findByParamName(SysConfigService.SCHOOL_IM_GROUP_IMG).getParanValue());
             imGroup.setType(ImGroup.GroupTypeEnum.SCHOOL.getCode());
             imGroup.setGroupType(ImGroup.GroupTypeEnum.SCHOOL);
             imGroup.setCreateTime(new Date());
             imGroup.setUpdateTime(new Date());
             imGroup.setTenantId(cooperationOrgan.getTenantId());
 
-            createImGroup(imGroup,userId,"");
+            createImGroup(imGroup,userId,schoolStaffType.getDescribe());
 
             initSchoolGroup(imGroup.getSchoolId());
         } else {
+            SysUser user = teacherDao.getUser(userId);
             ImGroupMemberWrapper.ImGroupMember groupMember = ImGroupMemberWrapper.ImGroupMember.builder()
                     .userId(userId.longValue())
-                    .nickname(name)
+                    .nickname(sysUserService.getImName(user))
+                    .avatar(sysUserService.getImAvatar(user))
                     .build();
             imGroupCoreService.groupMemberJoin(imGroup.getId(), Lists.newArrayList(groupMember));
             // 更新群主流程
@@ -564,6 +573,7 @@ public class ImGroupServiceImpl extends BaseServiceImpl<String, ImGroup> impleme
             imGroupMember.setUserId(userId);
             imGroupMember.setIsAdmin(schoolStaffType.equals(ESchoolStaffType.ORCHESTRA_LEADER));
             imGroupMember.setRoleType(schoolStaffType.getDescribe());
+            imGroupMember.setNickname(name);
             imGroupMember.setType(EFriendRoleType.getByName(schoolStaffType.getDescribe()).name());
             imGroupMember.setTenantId(imGroup.getTenantId());
             imGroupMemberDao.insert(imGroupMember);
@@ -741,7 +751,24 @@ public class ImGroupServiceImpl extends BaseServiceImpl<String, ImGroup> impleme
                 continue;
             }
             try {
-                imGroupCoreService.groupJoin(userId,"",imGroup.getId());
+
+                SysUser user = teacherDao.getUser(userId.intValue());
+                ImGroupMemberWrapper.ImGroupMember groupMember = ImGroupMemberWrapper.ImGroupMember.builder()
+                    .userId(userId)
+                    .nickname(sysUserService.getImName(user))
+                    .avatar(sysUserService.getImAvatar(user))
+                    .build();
+                imGroupCoreService.groupMemberJoin(imGroup.getId(), Lists.newArrayList(groupMember));
+
+                ImGroupMember imGroupMember = new ImGroupMember();
+                imGroupMember.setImGroupId(imGroup.getId());
+                imGroupMember.setUserId(userId.intValue());
+                imGroupMember.setIsAdmin(false);
+                imGroupMember.setRoleType(roleType);
+                imGroupMember.setNickname(sysUserService.getImName(user));
+                imGroupMember.setType(EFriendRoleType.getByName(roleType).name());
+                imGroupMember.setTenantId(imGroup.getTenantId());
+                imGroupMemberDao.insert(imGroupMember);
 
                 updateImGroupUserNumber(imGroup.getId());
             } catch (Exception e) {
@@ -860,17 +887,28 @@ public class ImGroupServiceImpl extends BaseServiceImpl<String, ImGroup> impleme
      * 群迁移
      */
     @Override
-    public void groupTransfer(String startTime, String endTime) {
+    public void groupTransfer(String startTime, String endTime,Integer type) {
+
+        // 100个线程的无界线程池
+
+        // 100个线程的无界线程池
+        ThreadPoolExecutor executorService =  new ThreadPoolExecutor(100, 100,
+            0L, TimeUnit.MILLISECONDS,
+            new LinkedBlockingQueue<Runnable>());
         int page = 1;
         int size = 100;
         QueryInfo queryInfo = new QueryInfo();
         queryInfo.setPage(page);
         queryInfo.setRows(size);
-        queryInfo.setImportFlag(false);
+//        queryInfo.setImportFlag(false);
         PageInfo<ImGroup> imGroupPageInfo = this.queryPage(queryInfo);
         SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd");
+        int total = imGroupPageInfo.getTotal();
         int importImGroupCount = 0;
-        while (!imGroupPageInfo.getRows().isEmpty()) {
+        int num = (int) Math.ceil(total / 100);
+        for (int i = 0; i <=num ; i++) {
+            queryInfo.setPage(page);
+            imGroupPageInfo = this.queryPage(queryInfo);
             List<ImGroup> rows = imGroupPageInfo.getRows();
             try {
                 if (StringUtils.isNotEmpty(startTime)) {
@@ -890,34 +928,62 @@ public class ImGroupServiceImpl extends BaseServiceImpl<String, ImGroup> impleme
             } catch (ParseException e) {
                 throw new BizException("时间区间参数错误,格式为:yyyy-MM-dd");
             }
-            groupTransfer(rows);
+
+            if (type == 1) {
+                rows.forEach(imGroup -> {
+
+                    executorService.submit(() -> {
+                        log.info("群销毁开始:{}", imGroup.getId());
+                        // 先删除群组
+                        try {
+                            // 解散群
+                            imPluginContext.getPluginService().groupDismiss(imGroup.getId(), new ArrayList<>());
+                        } catch (Exception e) {
+                            log.error(String.format("群迁移删除群聊失败:%s", e.getMessage()), e);
+                        }
+                        try {
+                            Thread.sleep(1000);
+                        } catch (InterruptedException e) {
+                            log.error("线程等待异常", e);
+                        }
+                    });
+                });
+            } else {
+
+                for (ImGroup row : rows) {
+                    executorService.execute(() -> {
+                        groupTransfer(Lists.newArrayList(row));
+                        try {
+                            Thread.sleep(1000);
+                        } catch (InterruptedException e) {
+                            log.error("线程等待异常", e);
+                        }
+                    });
+                }
+
+            }
+            page ++;
             importImGroupCount += rows.size();
             log.info("------------------------------- import im group --------------------------------------------");
-            log.info("import im group success count:{}/{}", importImGroupCount, imGroupPageInfo.getTotal());
+            log.info("import im group success count:{}/{}", importImGroupCount, total);
+        }
 
-            page++;
-            queryInfo.setPage(page);
-            imGroupPageInfo = this.queryPage(queryInfo);
+        while (executorService.getQueue().size() > 0) {
+            try {
+                log.info("线程池中正在执行的任务数量:{},等待数量:{}", executorService.getActiveCount(),executorService.getQueue().size());
+                Thread.sleep(1000);
+            } catch (InterruptedException e) {
+                log.error("线程等待异常", e);
+            }
         }
         log.info("-------------------- import im group finished and success! -------------------------------");
+        executorService.shutdown();
     }
 
     private void groupTransfer(List<ImGroup> records) {
 
         for (ImGroup imGroup : records) {
 
-            log.info("群销毁开始:{}", imGroup.getId());
-            // 先删除群组
-            try {
-                // 解散群
-                imPluginContext.getPluginService().groupDismiss(imGroup.getId(), new ArrayList<>());
-            } catch (Exception e) {
-                log.error(String.format("群迁移删除群聊失败:%s", e.getMessage()), e);
-            }
-        }
-
-        for (ImGroup imGroup : records) {
-
             log.info("群迁移开始:{}", imGroup.getId());
 
             GroupMemberQueryInfo groupMemberQueryInfo = new GroupMemberQueryInfo();
@@ -937,29 +1003,44 @@ public class ImGroupServiceImpl extends BaseServiceImpl<String, ImGroup> impleme
                 }
                 importGroup.setType("Public");
                 importGroup.setGroupId(imGroup.getId());
-                importGroup.setName(imGroup.getName());
+                importGroup.setName(StringUtils.isBlank(imGroup.getName())?imGroup.getId():imGroup.getName());
                 importGroup.setIntroduction(imGroup.getIntroduce());
                 importGroup.setNotification(imGroup.getMemo());
                 importGroup.setFaceUrl(imGroup.getImg());
                 if (StringUtils.isEmpty(imGroup.getImg())) {
-                    importGroup.setFaceUrl(imGroup.getGroupType().getAvatar());
+                    importGroup.setFaceUrl(Optional.ofNullable(imGroup.getGroupType()).orElse(ImGroup.GroupTypeEnum.NORMAL).getAvatar());
                 }
                 importGroup.setApplyJoinOption("FreeAccess");
-                importGroup.setCreateTime(imGroup.getCreateTime().getTime() / 1000);
-                if (admin != null) {
-                    register(admin.getUserId().toString(), getClientType(admin.getRoleType()),"");
+                if (imGroup.getCreateTime() == null) {
+                    imGroup.setCreateTime(DateTime.now().plusYears(-1).toDate());
                 }
+                importGroup.setCreateTime(imGroup.getCreateTime().getTime() / 1000);
+//                if (admin != null) {
+//                    register(admin.getUserId().toString(), getClientType(admin.getRoleType()),"");
+//                }
                 imPluginContext.getPluginService().importGroup(importGroup);
 
                 List<ImGroupMember> groupMembers = pageInfo.getRows().stream()
                         .filter(next -> !next.getIsAdmin()).collect(Collectors.toList());
+
+
+                groupMembers = groupMembers
+                    .stream()
+                    .filter(next -> next.getUserId() != null && next.getUserId() > 0)
+                    .collect(Collectors.toList());
+
                 if (groupMembers.isEmpty()) {
                     imGroupDao.updateImportStatusSuccess(imGroup.getId());
                     continue;
                 }
-                for (ImGroupMember member : groupMembers) {
-                    register(member.getUserId().toString(), getClientType(member.getRoleType()),"");
-                }
+
+//                for (ImGroupMember member : groupMembers) {
+//                    try {
+//                        register(member.getUserId().toString(), getClientType(member.getRoleType()),"");
+//                    }catch (Exception e){
+//                        log.error("用户注册失败",e);
+//                    }
+//                }
                 MessageWrapper.ImportGroupMember importGroupMember = new MessageWrapper.ImportGroupMember();
                 importGroupMember.setGroupId(imGroup.getId());
                 Date date = new DateTime(imGroup.getCreateTime()).plusSeconds(3).toDate();
@@ -968,6 +1049,9 @@ public class ImGroupServiceImpl extends BaseServiceImpl<String, ImGroup> impleme
                             MessageWrapper.ImportGroupMemberData data = new MessageWrapper.ImportGroupMemberData();
                             data.setMemberAccount(getImUserId(next.getUserId().toString(),
                                     getClientType(next.getRoleType())));
+                            if (next.getCreateTime() == null){
+                                next.setCreateTime(DateTime.now().plusMonths(-6).toDate());
+                            }
                             if (next.getCreateTime().getTime() / 1000 <= importGroup.getCreateTime()) {
                                 data.setJoinTime(date.getTime() / 1000);
                             } else {
@@ -977,18 +1061,22 @@ public class ImGroupServiceImpl extends BaseServiceImpl<String, ImGroup> impleme
                             return data;
                         }).collect(Collectors.toList());
                 importGroupMember.setMemberList(members);
-                imPluginContext.getPluginService().importGroupMember(importGroupMember);
+                List<List<MessageWrapper.ImportGroupMemberData>> partition = Lists.partition(members, 88);
+                for (List<MessageWrapper.ImportGroupMemberData> importGroupMemberData : partition) {
+                    importGroupMember.setMemberList(importGroupMemberData);
+                    imPluginContext.getPluginService().importGroupMember(importGroupMember);
+                }
                 imGroupDao.updateImportStatusSuccess(imGroup.getId());
             } catch (Exception e) {
                 log.error(String.format("群迁移失败,失败群组:%s", JSON.toJSONString(imGroup)));
-                log.error(String.format("群迁移失败:%s", e.getMessage()));
+                log.error("群迁移失败:", e);
             }
             log.info("群迁移成功:{}", imGroup.getId());
         }
     }
 
     private void register(String userId, String clientType,String avatar) {
-        SysUser user = sysUserService.queryUserById(Integer.valueOf(userId));
+        SysUser user = teacherDao.getUser(Integer.valueOf(userId));
         if (user == null) {
             return;
         }
@@ -1000,12 +1088,16 @@ public class ImGroupServiceImpl extends BaseServiceImpl<String, ImGroup> impleme
 
             // 老师默认使用真实姓名
             List<String> userTypes = Lists.newArrayList(user.getUserType().split(","));
-            if (userTypes.size() > 1 || userTypes.contains(ClientEnum.TEACHER.getCode())) {
+            if (userTypes.size() > 1
+                || userTypes.contains(ClientEnum.TEACHER.getCode())
+                || userTypes.contains(ClientEnum.SYSTEM.getCode())) {
                 username = Optional.ofNullable(user.getRealName()).filter(StringUtils::isNotBlank).orElse(username);
             }
             // 自动激活学生IM帐号
+//            imGroupCoreService.register(userId,clientType, username, sysUserService.getImAvatar(user));
             imGroupCoreService.register(userId,clientType, username, avatar);
         } catch (Exception e) {
+            log.error("register user error,userId:{}", userId);
             log.error("register user error", e);
         }
     }
@@ -1031,17 +1123,39 @@ public class ImGroupServiceImpl extends BaseServiceImpl<String, ImGroup> impleme
     @Override
     public void importUser() {
         int page = 1;
-        int rows = 200;
+        int rows = 100;
 
         int count = 0;
 
+        // 100个线程的无界线程池
+        ThreadPoolExecutor executorService =  new ThreadPoolExecutor(100, 100,
+            0L, TimeUnit.MILLISECONDS,
+            new LinkedBlockingQueue<Runnable>());
+
         log.info("------------------------------- import user student ---------------------------");
+        // 学生花费时间计算
+        long start = System.currentTimeMillis();
         List<String[]> student = getStudent(page, rows);
+        long end = System.currentTimeMillis();
+        log.info("查询学生花费时间:{}毫秒", end - start);
         SysConfig studentAvatar = sysConfigService.findByParamName(SysConfigService.STUDENT_DEFAULT_AVATAR);
         while (!student.isEmpty()) {
             for (String[] next : student) {
-                register(next[0], next[1],studentAvatar.getParanValue());
+                String avatar = next[2];
+                if (StringUtils.isEmpty(avatar)) {
+                    avatar = studentAvatar.getParanValue();
+                }
+                String finalAvatar = avatar;
+                executorService.execute(() -> {
+                    register(next[0], next[1], finalAvatar);
+                    try {
+                        Thread.sleep(1000);
+                    } catch (InterruptedException e) {
+                        log.error("线程等待异常", e);
+                    }
+                });
             }
+
             count += student.size();
             log.info("import im student success count:{}", count);
             page++;
@@ -1053,11 +1167,28 @@ public class ImGroupServiceImpl extends BaseServiceImpl<String, ImGroup> impleme
         count = 0;
         page = 1;
         SysConfig staffAvatar = sysConfigService.findByParamName(SysConfigService.USER_DEFAULT_AVATAR);
+        start = System.currentTimeMillis();
         List<String[]> staff = getStaff(page, rows);
+        end = System.currentTimeMillis();
+        log.info("查询老师花费时间:{}毫秒", end - start);
         while (!staff.isEmpty()) {
+
             for (String[] next : staff) {
-                register(next[0], next[1],staffAvatar.getParanValue());
+                String avatar = next[2];
+                if (StringUtils.isEmpty(avatar)) {
+                    avatar = staffAvatar.getParanValue();
+                }
+                String finalAvatar = avatar;
+                executorService.execute(() -> {
+                    register(next[0], next[1], finalAvatar);
+                    try {
+                        Thread.sleep(1000);
+                    } catch (InterruptedException e) {
+                        log.error("线程等待异常", e);
+                    }
+                });
             }
+
             count += staff.size();
             log.info("import im staff success count:{}", count);
             page++;
@@ -1072,7 +1203,19 @@ public class ImGroupServiceImpl extends BaseServiceImpl<String, ImGroup> impleme
         List<String[]> emps = getEmp(page, rows);
         while (!emps.isEmpty()) {
             for (String[] next : emps) {
-                register(next[0], next[1],empAvatar.getParanValue());
+                String avatar = next[2];
+                if (StringUtils.isEmpty(avatar)) {
+                    avatar = empAvatar.getParanValue();
+                }
+                String finalAvatar = avatar;
+                executorService.execute(() -> {
+                    register(next[0], next[1], finalAvatar);
+                    try {
+                        Thread.sleep(1000);
+                    } catch (InterruptedException e) {
+                        log.error("线程等待异常", e);
+                    }
+                });
             }
             count += emps.size();
             log.info("import im emps success count:{}", count);
@@ -1087,7 +1230,19 @@ public class ImGroupServiceImpl extends BaseServiceImpl<String, ImGroup> impleme
         List<String[]> teachers = getTeachers(page, rows);
         while (!teachers.isEmpty()) {
             for (String[] next : teachers) {
-                register(next[0], next[1], teacherAvatar.getParanValue());
+                String avatar = next[2];
+                if (StringUtils.isEmpty(avatar)) {
+                    avatar = teacherAvatar.getParanValue();
+                }
+                String finalAvatar = avatar;
+                executorService.execute(() -> {
+                    register(next[0], next[1], finalAvatar);
+                    try {
+                        Thread.sleep(1000);
+                    } catch (InterruptedException e) {
+                        log.error("线程等待异常", e);
+                    }
+                });
             }
             count += teachers.size();
             log.info("import im teacher success count:{}", count);
@@ -1095,12 +1250,21 @@ public class ImGroupServiceImpl extends BaseServiceImpl<String, ImGroup> impleme
             teachers = getTeachers(page, rows);
         }
 
+        while (executorService.getQueue().size() > 0) {
+            try {
+                log.info("线程池中正在执行的任务数量:{},等待数量:{}", executorService.getActiveCount(),executorService.getQueue().size());
+                Thread.sleep(1000);
+            } catch (InterruptedException e) {
+                log.error("线程等待异常", e);
+            }
+        }
+        executorService.shutdown();
         log.info("------------------------------- import user success ---------------------------");
     }
 
     @Override
-    public int queryInfoCount() {
-        long count = historyMessageService.selectCount(0,new DateTime().plusMonths(-2).toDate());
+    public int queryInfoCount(int targetType) {
+        long count = historyMessageService.selectCount(0,new DateTime().plusMonths(-2).toDate(),targetType);
         return (int) count;
     }
 
@@ -1110,9 +1274,10 @@ public class ImGroupServiceImpl extends BaseServiceImpl<String, ImGroup> impleme
         queryInfo.setRows(rows);
         PageInfo<Employee> employeePageInfo = employeeService.queryBaseInfoByPage(queryInfo);
         return employeePageInfo.getRows().stream().map(next -> {
-            String[] strList = new String[2];
+            String[] strList = new String[3];
             strList[0] = next.getUserId().toString();
             strList[1] = "SYSTEM";
+            strList[2] = next.getAvatar();
             return strList;
         }).collect(Collectors.toList());
     }
@@ -1122,9 +1287,10 @@ public class ImGroupServiceImpl extends BaseServiceImpl<String, ImGroup> impleme
         IPage<SchoolStaffWrapper.SchoolStaff> iPage = schoolStaffService.selectBaseInfoByPage(staffPage,
                 new SchoolStaffWrapper.SchoolStaffQuery());
         return iPage.getRecords().stream().map(next -> {
-            String[] strList = new String[2];
+            String[] strList = new String[3];
             strList[0] = next.getUserId().toString();
             strList[1] = "SCHOOL";
+            strList[2] = next.getAvatar();
             return strList;
         }).collect(Collectors.toList());
     }
@@ -1135,9 +1301,10 @@ public class ImGroupServiceImpl extends BaseServiceImpl<String, ImGroup> impleme
         queryInfo.setRows(rows);
         PageInfo<Student> studentPageInfo = studentService.queryBaseInfoByPage(queryInfo);
         return studentPageInfo.getRows().stream().map(next -> {
-            String[] strList = new String[2];
+            String[] strList = new String[3];
             strList[0] = next.getUserId().toString();
             strList[1] = "STUDENT";
+            strList[2] = next.getAvatar();
             return strList;
         }).collect(Collectors.toList());
     }
@@ -1148,9 +1315,10 @@ public class ImGroupServiceImpl extends BaseServiceImpl<String, ImGroup> impleme
         queryInfo.setRows(rows);
         PageInfo<Teacher> teacherPageInfo = teacherService.queryBaseInfoByPage(queryInfo);
         return teacherPageInfo.getRows().stream().map(next -> {
-            String[] strList = new String[2];
+            String[] strList = new String[3];
             strList[0] = next.getId().toString();
             strList[1] = "TEACHER";
+            strList[2] = next.getAvatar();
             return strList;
         }).collect(Collectors.toList());
     }
@@ -1158,8 +1326,8 @@ public class ImGroupServiceImpl extends BaseServiceImpl<String, ImGroup> impleme
 
 
     @Override
-    public com.yonge.mongodb.PageInfo<HistoryMessage> getRongYunInfo( int page, int size) {
-        com.yonge.mongodb.PageInfo<HistoryMessage> pageInfo = historyMessageService.selectPage(page, size, 0,new DateTime().plusMonths(-2).toDate());
+    public com.yonge.mongodb.PageInfo<HistoryMessage> getRongYunInfo(int page, int size, int targetType) {
+        com.yonge.mongodb.PageInfo<HistoryMessage> pageInfo = historyMessageService.selectPage(page, size, 0,new DateTime().plusMonths(-2).toDate(),targetType);
         //List<HistoryMessage> imHistoryMessageslist = imGroupDao.selectAll(result,size);
         return pageInfo;
     }
@@ -1173,7 +1341,7 @@ public class ImGroupServiceImpl extends BaseServiceImpl<String, ImGroup> impleme
     public void importInfo(List<HistoryMessage> info) throws Exception {
 
         for (HistoryMessage i : info) {//判断消息类型
-            log.info("消息导入 HistoryMessage:{}", JSON.toJSONString(i));
+//            log.info("消息导入 HistoryMessage:{}", JSON.toJSONString(i));
             try {
                 Integer type = i.getTargetType();
                 if (type == 1) {
@@ -1209,8 +1377,21 @@ public class ImGroupServiceImpl extends BaseServiceImpl<String, ImGroup> impleme
                     //设置接收人
                     privateImportMessage.setToAccount(targetIdUserId);
                     //设置随机数
-                    privateImportMessage.setMsgRandom(new Random().nextInt());
+                    if (i.getMsgRandom() == null) {
+                        int nextInt = Math.abs(new Random().nextInt());
+                        privateImportMessage.setMsgRandom(nextInt);
+                        i.setMsgRandom(nextInt);
+                    } else {
+                        privateImportMessage.setMsgRandom(i.getMsgRandom());
+                    }
 
+                    if (i.getMsgSeq() == null) {
+                        int nextInt = Math.abs(new Random().nextInt());
+                        i.setMsgSeq(nextInt);
+                        privateImportMessage.setMsgSeq(nextInt);
+                    } else {
+                        privateImportMessage.setMsgSeq(i.getMsgSeq());
+                    }
                     //设置发送时间
                     String time = i.getDateTime();
                     SimpleDateFormat df = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
@@ -1218,7 +1399,13 @@ public class ImGroupServiceImpl extends BaseServiceImpl<String, ImGroup> impleme
                         Date date = df.parse(time);
                         long dateTime = date.getTime();
                         dateTime = dateTime / (1000);
-                        privateImportMessage.setMsgTimeStamp(dateTime);
+                        if (i.getMsgTimeStamp() == null) {
+                            privateImportMessage.setMsgTimeStamp(dateTime);
+                            i.setMsgTimeStamp(dateTime);
+                        } else {
+                            privateImportMessage.setMsgTimeStamp(i.getMsgTimeStamp());
+
+                        }
                     } catch (ParseException e) {
                         e.printStackTrace();
                     }
@@ -1258,14 +1445,16 @@ public class ImGroupServiceImpl extends BaseServiceImpl<String, ImGroup> impleme
                     privateImportMessage.setTencentMessageBody(list);
                     privateImportMessage.setCloudCustomData(jsonObject.getString("extra"));
 
-                    log.info("导入私聊消息:{}", JSON.toJSONString(privateImportMessage));
+//                    log.info("导入私聊消息:{}", JSON.toJSONString(privateImportMessage));
                     try {
                         imPluginContext.getPluginService().importPrivateMessage(privateImportMessage);
                         //为已导入数据更改标识
                         updateStatus(i,1);
+                        historyMessageService.updateMsg(i.getMsgUID(),i.getMsgSeq(),i.getMsgRandom(),i.getMsgTimeStamp());
+                        log.info("导入私聊消息成功");
                     } catch (Exception e) {
                         updateStatus(i,2);
-                        log.error("导入私聊IM消息失败 msg:{},entity:{}", list, i, e);
+                        log.error("导入私聊IM消息失败 msg:{},entity:{}", JSON.toJSONString(privateImportMessage), i, e);
                     }
                 } else if (type == 3) {
                     //群组会话
@@ -1291,7 +1480,7 @@ public class ImGroupServiceImpl extends BaseServiceImpl<String, ImGroup> impleme
 
                     data1.setFromAccount(imUserId);
                     //设置随机数
-                    data1.setRandom(new Random().nextInt());
+                    data1.setRandom(Math.abs(new Random().nextInt()));
                     //设置发送时间
 
                     String time = i.getDateTime();
@@ -1334,16 +1523,16 @@ public class ImGroupServiceImpl extends BaseServiceImpl<String, ImGroup> impleme
                     list.add(data1);
                     //导入消息列表
                     groupImportMessage.setMsgList(list);
-                    log.info("导入群聊消息:{}", JSON.toJSONString(groupImportMessage));
+//                    log.info("导入群聊消息:{}", JSON.toJSONString(groupImportMessage));
                     try {
                         imPluginContext.getPluginService().importGroupMessage(groupImportMessage);
                         //为已导入数据更改标识
                         updateStatus(i,1);
+                        log.info("导入消息成功");
                     } catch (Exception e) {
                         updateStatus(i,2);
-                        log.error("导入群组IM消息失败 msg:{},entity:{}", list, i, e);
+                        log.error("导入群组IM消息失败 msg:{},entity:{}", JSON.toJSONString(groupImportMessage), i, e);
                     }
-                    log.info("导入消息成功:{}", i);
                 }
             }catch (Exception e) {
                 log.error("导入消息失败:", e);
@@ -1358,53 +1547,67 @@ public class ImGroupServiceImpl extends BaseServiceImpl<String, ImGroup> impleme
     public void imToTencent(List<HistoryMessage> list) {
 
         for (HistoryMessage historyMessage : list) {
-            HistoryMessageTencent tencent = new HistoryMessageTencent();
-            tencent.setId(historyMessage.getMsgUID());
-            // 时间
-            String dateTime = historyMessage.getDateTime();
-            LocalDateTime ldt = LocalDateTime.parse(dateTime, DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss.SSS"));
-            // yyyyMMddHH
-            String date = ldt.format(DateTimeFormatter.ofPattern("yyyyMMddHH"));
-            tencent.setMsgTime(Long.parseLong(date));
-
-            List<TencentRequest.MessageBody> bodyList = new ArrayList<>();
-            JSONObject jsonObject = JSONObject.parseObject(historyMessage.getContent());
-            // 类型
-            if (historyMessage.getTargetType() == 1) {
-                tencent.setChatType("C2C");
-                tencent.setToAccount(historyMessage.getTargetId());
-                bodyList = getPrivateMessge(historyMessage,jsonObject);
-            } else if (historyMessage.getTargetType() == 3) {
-                tencent.setChatType("GROUP");
-                tencent.setGroupId(historyMessage.getGroupId());
-                bodyList = getGroupMessage(historyMessage,jsonObject);
-            } else {
-                continue;
-            }
-
-            if (CollectionUtils.isEmpty(bodyList)) {
-                continue;
-            }
-            bodyList = bodyList.stream().filter(Objects::nonNull).collect(Collectors.toList());
-            if (CollectionUtils.isEmpty(bodyList)) {
-                continue;
-            }
-            // 发送人
-            tencent.setFromAccount(historyMessage.getFromUserId());
-            //类型
-            tencent.setAppService("MEC");
-            tencent.setMsgFromPlatform(historyMessage.getSource());
-            tencent.setMsgTimestamp(ldt.toInstant(ZoneId.systemDefault().getRules().getOffset(ldt)).toEpochMilli()/1000);
+            try {
+                HistoryMessageTencent tencent = new HistoryMessageTencent();
+                tencent.setId(historyMessage.getMsgUID());
+                // 时间
+                String dateTime = historyMessage.getDateTime();
+                LocalDateTime ldt = LocalDateTime.parse(dateTime, DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss.SSS"));
+                // yyyyMMddHH
+                String date = ldt.format(DateTimeFormatter.ofPattern("yyyyMMddHH"));
+                tencent.setMsgTime(Long.parseLong(date));
+
+                List<TencentRequest.MessageBody> bodyList = new ArrayList<>();
+                JSONObject jsonObject = JSONObject.parseObject(historyMessage.getContent());
+                // 类型
+                if (historyMessage.getTargetType() == 1) {
+                    tencent.setChatType("C2C");
+                    tencent.setToAccount(historyMessage.getTargetId());
+                    bodyList = getPrivateMessge(historyMessage,jsonObject);
+                } else if (historyMessage.getTargetType() == 3) {
+                    tencent.setChatType("GROUP");
+                    tencent.setGroupId(historyMessage.getGroupId());
+                    bodyList = getGroupMessage(historyMessage,jsonObject);
+                } else {
+
+                    historyMessage.setSyncFlag(1);
+                    historyMessageService.updateSyncFlag(historyMessage.getMsgUID(),1);
+                    continue;
+                }
 
-            // 消息转换
-            tencent.setCloudCustomData(jsonObject.getString("extra"));
-            tencent.setMsgBody(JSON.toJSONString(bodyList));
-            tencent.setMsgBodyJson(JSON.parseObject(tencent.getMsgBody(), JSONArray.class));
+                if (CollectionUtils.isEmpty(bodyList)) {
 
-            historyMessageTencentService.insert(tencent);
+                    historyMessage.setSyncFlag(1);
+                    historyMessageService.updateSyncFlag(historyMessage.getMsgUID(),1);
+                    continue;
+                }
+                bodyList = bodyList.stream().filter(Objects::nonNull).collect(Collectors.toList());
+                if (CollectionUtils.isEmpty(bodyList)) {
+                    historyMessage.setSyncFlag(1);
+                    historyMessageService.updateSyncFlag(historyMessage.getMsgUID(),1);
+                    continue;
+                }
+                // 发送人
+                tencent.setFromAccount(historyMessage.getFromUserId());
+                //类型
+                tencent.setAppService("MEC");
+                tencent.setMsgFromPlatform(historyMessage.getSource());
+                tencent.setMsgTimestamp(ldt.toInstant(ZoneId.systemDefault().getRules().getOffset(ldt)).toEpochMilli()/1000);
+
+                // 消息转换
+                tencent.setCloudCustomData(jsonObject.getString("extra"));
+                tencent.setMsgBody(JSON.toJSONString(bodyList));
+                tencent.setMsgBodyJson(JSON.parseObject(tencent.getMsgBody(), JSONArray.class));
+
+                historyMessageTencentService.insert(tencent);
+
+                historyMessage.setSyncFlag(1);
+                historyMessageService.updateSyncFlag(historyMessage.getMsgUID(),1);
+            } catch (Exception e) {
+                historyMessage.setSyncFlag(2);
+                historyMessageService.updateSyncFlag(historyMessage.getMsgUID(),1);
+            }
 
-            historyMessage.setSyncFlag(1);
-            historyMessageService.updateSyncFlag(historyMessage.getMsgUID(),1);
         }
 
     }
@@ -1419,7 +1622,7 @@ public class ImGroupServiceImpl extends BaseServiceImpl<String, ImGroup> impleme
             String content = jsonObject.getString("content");
 
             // http开头的链接 扩展字段没有值 放在扩展字段里
-            if (content.startsWith("http")) {
+            if (StringUtils.isNotBlank(content) && content.startsWith("http")) {
                 String extra = jsonObject.getString("extra");
                 if (StringUtils.isEmpty(extra)) {
                     jsonObject.put("extra", content);
@@ -1497,7 +1700,7 @@ public class ImGroupServiceImpl extends BaseServiceImpl<String, ImGroup> impleme
             String content = jsonObject.getString("content");
 
             // http开头的链接 扩展字段没有值 放在扩展字段里
-            if (content.startsWith("http")) {
+            if (StringUtils.isNotBlank(content) && content.startsWith("http")) {
                 String extra = jsonObject.getString("extra");
                 if (StringUtils.isEmpty(extra)) {
                     jsonObject.put("extra", content);
@@ -1570,6 +1773,18 @@ public class ImGroupServiceImpl extends BaseServiceImpl<String, ImGroup> impleme
         if (CollectionUtils.isEmpty(rows)) {
             return pageInfo;
         }
+
+        for (HistoryMessageTencentWrapper.HistoryMessageTencent row : rows) {
+            // 时间戳 转换
+            Long msgTime = row.getMsgTimestamp();
+            if (msgTime != null) {
+                String dateTime = String.valueOf(msgTime);
+                if (dateTime.length() == 10) {
+                    dateTime = dateTime + "000";
+                }
+                row.setMsgTime(Long.parseLong(DateUtil.format(new Date(Long.parseLong(dateTime)), "yyyyMMddHH")));
+            }
+        }
         // 发送人信息
         List<Integer> fromAccountList = rows.stream()
             .map(HistoryMessageTencentWrapper.HistoryMessageTencent::getFromAccount)
@@ -1584,7 +1799,7 @@ public class ImGroupServiceImpl extends BaseServiceImpl<String, ImGroup> impleme
             SysUser sysUser = userMap.get(Integer.parseInt(item.getFromAccount()));
             if (sysUser != null) {
                 item.setFromAccountName(sysUserService.getImName(sysUser));
-                item.setFromAccountAvatar(sysUserService.getImName(sysUser));
+                item.setFromAccountAvatar(sysUserService.getImAvatar(sysUser));
             }
         });
         // 接收人
@@ -1601,7 +1816,7 @@ public class ImGroupServiceImpl extends BaseServiceImpl<String, ImGroup> impleme
             SysUser sysUser = toUserMap.get(Integer.parseInt(item.getToAccount()));
             if (sysUser != null) {
                 item.setToAccountName(sysUserService.getImName(sysUser));
-                item.setToAccountAvatar(sysUserService.getImName(sysUser));
+                item.setToAccountAvatar(sysUserService.getImAvatar(sysUser));
             }
         });
         // 群

+ 13 - 3
mec-biz/src/main/java/com/ym/mec/biz/service/impl/ImLiveBroadcastRoomServiceImpl.java

@@ -2263,6 +2263,7 @@ public class ImLiveBroadcastRoomServiceImpl extends ServiceImpl<ImLiveBroadcastR
                     throw new BizException("当前用户存在更早的待直播的房间");
                 }*/
 
+                ImLiveBroadcastRoomVo roomVo = getImLiveBroadcastRoomVo(room.getRoomUid());
                 //去融云创建房间
                 LivePluginService pluginService = livePluginContext.getPluginService(room.getServiceProvider());
 
@@ -2272,6 +2273,8 @@ public class ImLiveBroadcastRoomServiceImpl extends ServiceImpl<ImLiveBroadcastR
                 // 创建直播间IM群
                 pluginService.chatRoomCreate(room.getRoomUid(), room.getRoomTitle(),imGroupCoreService.getImUserId(sysUser.getId().toString(),room.getClientType().getCode()));
 
+                // 设置直播间房间属性默认值
+                setDefaultRoomDefinedInfo(roomVo);
                 createSpeakerInfo(room, sysUser);
                 Boolean whetherVideoFlag = getRoomConfig(room.getRoomConfig()).map(o -> o.getWhether_video() == 0).orElse(true);
 
@@ -2320,15 +2323,12 @@ public class ImLiveBroadcastRoomServiceImpl extends ServiceImpl<ImLiveBroadcastR
                                                                         .eq(ImLiveRoomBlack::getRoomUid, room.getRoomUid())
                                                                         .list();
 
-                ImLiveBroadcastRoomVo roomVo = getImLiveBroadcastRoomVo(room.getRoomUid());
                 if (CollectionUtils.isNotEmpty(blackList)) {
                     // 将黑名单人员踢出房间
                     for (ImLiveRoomBlack black : blackList) {
                         imLiveRoomBlackService.setBlack(black.getUserId(),roomVo);
                     }
                 }
-                // 设置直播间房间属性默认值
-                setDefaultRoomDefinedInfo(roomVo);
             } finally {
                 if (lock.getHoldCount() != 0 && lock.isHeldByCurrentThread()) {
                     lock.unlock();
@@ -2342,6 +2342,15 @@ public class ImLiveBroadcastRoomServiceImpl extends ServiceImpl<ImLiveBroadcastR
     }
 
     private void setDefaultRoomDefinedInfo(ImLiveBroadcastRoomVo roomVo) {
+        try {
+            List<TencentWrapper.ChatRoomGroupCounter> chatRoomGroupDefinedData = livePluginContext
+                .getPluginService(roomVo.getServiceProvider()).getChatRoomGroupDefinedData(roomVo.getRoomUid());
+            if (CollectionUtils.isNotEmpty(chatRoomGroupDefinedData)){
+                return;
+            }
+        } catch (Exception e) {
+            log.error("获取直播群配置失败", e);
+        }
         List<TencentRequest.ChatRoomGroupDefinedData> appDefinedData = new ArrayList<>();
         Arrays.stream(EGroupDefinedDataType.values()).forEach(key -> {
             switch (key) {
@@ -2398,6 +2407,7 @@ public class ImLiveBroadcastRoomServiceImpl extends ServiceImpl<ImLiveBroadcastR
                                                                                    .groupId(roomVo.getRoomUid())
                                                                                    .appDefinedData(appDefinedData)
                                                                                    .build());
+            log.info("设置直播群配置成功 roomUid:{}", roomVo.getRoomUid());
         } catch (Exception e) {
             log.error("设置直播群配置失败", e);
         }

+ 6 - 2
mec-biz/src/main/java/com/ym/mec/biz/service/impl/ImUserFriendServiceImpl.java

@@ -151,7 +151,9 @@ public class ImUserFriendServiceImpl extends BaseServiceImpl<Long, ImUserFriend>
                 String username = item.getFriend().getUsername();
 
                 List<String> userTypes = Lists.newArrayList(item.getFriend().getUserType().split(","));
-                if (userTypes.size() > 1 || userTypes.contains(ClientEnum.TEACHER.getCode())) {
+                if (userTypes.size() > 1
+                    || userTypes.contains(ClientEnum.TEACHER.getCode())
+                    || userTypes.contains(ClientEnum.SYSTEM.getCode())) {
                     username = Optional.ofNullable(item.getFriend().getRealName()).filter(StringUtils::isNotBlank).orElse(username);
                 }
                 // 用户好友默认用户名
@@ -170,7 +172,9 @@ public class ImUserFriendServiceImpl extends BaseServiceImpl<Long, ImUserFriend>
         if (Objects.nonNull(imUserFriendDto) && Objects.nonNull(imUserFriendDto.getFriend())) {
 
             List<String> userTypes = Lists.newArrayList(imUserFriendDto.getFriend().getUserType().split(","));
-            if (userTypes.size() > 1 || userTypes.contains(ClientEnum.TEACHER.getCode())) {
+            if (userTypes.size() > 1
+                || userTypes.contains(ClientEnum.TEACHER.getCode())
+                || userTypes.contains(ClientEnum.SYSTEM.getCode())) {
                 // 增加用户身份数量 > 1 或者包含老师身份,统一使用实名
                 imUserFriendDto.setFriendNickname(Optional.ofNullable(imUserFriendDto.getFriend().getRealName())
                     .filter(StringUtils::isNotBlank).orElse(imUserFriendDto.getFriend().getUsername()));

+ 1 - 1
mec-biz/src/main/java/com/ym/mec/biz/service/impl/PhotoServiceImpl.java

@@ -56,7 +56,7 @@ public class PhotoServiceImpl extends BaseServiceImpl<Integer, Photo>  implement
 				photoAlbum.setMusicGroupId(musicGroupId);
 				photoAlbum.setName("获奖证书");
 				photoAlbum.setClientShow(YesOrNoEnum.YES);
-				photoAlbum.setCoverUrl("https://daya.ks3-cn-beijing.ksyun.com/202107/Sdmx7vx.png");
+				photoAlbum.setCoverUrl("https://oss.dayaedu.com/default-images/mec/Sdmx7vx.png");
 				photoAlbum.setType("SHOW");
 				photoAlbumDao.insert(photoAlbum);
 			}

+ 1 - 1
mec-biz/src/main/java/com/ym/mec/biz/service/impl/SchoolStaffServiceImpl.java

@@ -260,7 +260,7 @@ public class SchoolStaffServiceImpl extends ServiceImpl<SchoolStaffMapper, Schoo
             TenantContextHolder.setTenantId(cooperation.getTenantId());
 
             // 创建学校im群
-            imGroupService.addSchoolStaffGroup(schoolStaff.getSchoolId(), user.getId(),user.getUsername(),user.getAvatar(),schoolStaff.getUserType());
+            imGroupService.addSchoolStaffGroup(schoolStaff.getSchoolId(), user.getId(),user.getUsername(),sysUserService.getImAvatar(user),schoolStaff.getUserType());
         } catch (Exception e) {
             log.error("加入群组失败 ",e);
             throw new BizException("加入群组失败");

+ 16 - 20
mec-biz/src/main/java/com/ym/mec/biz/service/impl/StudentManageServiceImpl.java

@@ -116,8 +116,9 @@ public class StudentManageServiceImpl implements StudentManageService {
 
     @Autowired
     private ImGroupDao imGroupDao;
+
     @Autowired
-    private ImGroupCoreService imGroupCoreService;
+    private SysUserService sysUserService;
 
     @Override
     public PageInfo<StudentManageListDto> findStudentsByOrganId(StudentManageQueryInfo queryInfo) {
@@ -753,21 +754,7 @@ public class StudentManageServiceImpl implements StudentManageService {
         }
 
         // 用户更新信息同步到三方
-        SysUser userInfo = teacherDao.getUser(sysUser.getId());
-        if (Objects.nonNull(userInfo)) {
-
-            try {
-                String username = userInfo.getUsername();
-                List<String> userTypes = Lists.newArrayList(userInfo.getUserType().split(","));
-                if (userTypes.size() > 1 || userTypes.contains(ClientEnum.TEACHER.getCode())) {
-                    username = Optional.ofNullable(userInfo.getRealName()).filter(StringUtils::isNotBlank).orElse(username);
-                }
-
-                imGroupCoreService.register(String.valueOf(userInfo.getId()), "", username, userInfo.getAvatar());
-            } catch (Exception e) {
-                log.error("用户更新信息同步到三方失败,userId:{}", userInfo.getId(), e);
-            }
-        }
+        sysUserService.registerImUserInfo(sysUser.getId());
     }
 
 
@@ -778,8 +765,12 @@ public class StudentManageServiceImpl implements StudentManageService {
         if (StringUtils.isNotBlank(sysUser.getUsername())) {
             imGroupDao.updateNickname(sysUser.getId(), sysUser.getUsername());
             imGroupDao.updateUserFriendNickname(sysUser.getId(), sysUser.getUsername());
-            imFeignService.update(new ImUserModel(sysUser.getId().toString(), sysUser.getUsername(), sysUser.getAvatar()));
+            // 事务问题,不能使用openfeign方式调用
+            //imFeignService.update(new ImUserModel(sysUser.getId().toString(), sysUser.getUsername(), sysUser.getAvatar()));
+
         }
+        // 用户更新信息同步到三方
+        sysUserService.registerImUserInfo(sysUser.getId());
     }
 
     @Override
@@ -847,8 +838,11 @@ public class StudentManageServiceImpl implements StudentManageService {
             teacherDao.addSysUser(student);
 //            HttpResponseResult<Integer> result = sysUserFeignService.addUser(student);
 //            student.setId(result.getData());
-
-            ImResult register = imFeignService.register(new ImUserModel(student.getId().toString(), student.getPhone(), null));
+            // IM头像
+            String imAvatar = sysUserService.getImAvatar(teacherDao.getUser(student.getId()));
+            // IM用户昵称
+            //String imName = sysUserService.getImName(teacherDao.getUser(student.getId()));
+            ImResult register = imFeignService.register(new ImUserModel(student.getId().toString(), student.getPhone(), imAvatar));
             student.setImToken(register.getToken());
             teacherDao.updateUser(student);
 
@@ -898,7 +892,9 @@ public class StudentManageServiceImpl implements StudentManageService {
             studentExtracurricularExercisesSituationService.deleteByStudent(student.getId(), monDayDate.toString());
         }
         webFeignService.updateNickName(userId, student.getUsername());
-        imFeignService.update(new ImUserModel(userId.toString(), student.getUsername(), sysUser1 == null ? null : sysUser1.getAvatar()));
+        //imFeignService.update(new ImUserModel(userId.toString(), student.getUsername(), sysUser1 == null ? null : sysUser1.getAvatar()));
+        // 用户更新信息同步到三方
+        sysUserService.registerImUserInfo(userId);
         return userId;
     }
 

+ 13 - 3
mec-biz/src/main/java/com/ym/mec/biz/service/impl/StudentRegistrationServiceImpl.java

@@ -253,6 +253,8 @@ public class StudentRegistrationServiceImpl extends BaseServiceImpl<Long, Studen
 
     @Autowired
     private ImUserFriendService imUserFriendService;
+    @Autowired
+    private SysUserService sysUserService;
 
     @Override
     public BaseDAO<Long, StudentRegistration> getDAO() {
@@ -608,7 +610,9 @@ public class StudentRegistrationServiceImpl extends BaseServiceImpl<Long, Studen
             imGroupDao.updateUserFriendNickname(userId, studentRegistration.getName());
         }
 
-        imFeignService.update(new ImUserModel(userId.toString(), studentRegistration.getName(), sysUser.getAvatar()));
+        //imFeignService.update(new ImUserModel(userId.toString(), studentRegistration.getName(), sysUser.getAvatar()));
+        // 用户更新信息同步到三方
+        sysUserService.registerImUserInfo(userId);
         // 增加报名学生数
         musicGroupSubjectPlanService.addApplyStudentNum(studentRegistration.getMusicGroupId(), studentRegistration.getSubjectId(), 1);
         // 报名成功后,发送短信
@@ -1099,7 +1103,11 @@ public class StudentRegistrationServiceImpl extends BaseServiceImpl<Long, Studen
             studentDao.insert(new Student(userId, studentRegistration.getSubjectId().toString()));
             //添加用户现金账户
             sysUserCashAccountDao.insert(new SysUserCashAccount(userId, "CNY"));
-            ImResult register = imFeignService.register(new ImUserModel(userId.toString(), sysUser.getUsername(), null));
+            // IM头像
+            String imAvatar = sysUserService.getImAvatar(teacherDao.getUser(userId));
+            // IM用户昵称
+            String imName = sysUserService.getImName(teacherDao.getUser(userId));
+            ImResult register = imFeignService.register(new ImUserModel(userId.toString(), imName, imAvatar));
             sysUser.setImToken(register.getToken());
             teacherDao.updateUser(sysUser);
         } else {
@@ -1180,7 +1188,9 @@ public class StudentRegistrationServiceImpl extends BaseServiceImpl<Long, Studen
         student.setCurrentClass(studentRegistration.getCurrentClass());
         studentDao.update(student);
         //studentRegistrationDao.updateCurrentClass(studentRegistration);
-        imFeignService.update(new ImUserModel(userId.toString(), sysUser.getUsername(), sysUser.getAvatar()));
+        //imFeignService.update(new ImUserModel(userId.toString(), sysUser.getUsername(), sysUser.getAvatar()));
+        // 用户更新信息同步到三方
+        sysUserService.registerImUserInfo(userId);
 
         //学生报名表
         sendSeoMessageSource.sendSeoMessage(musicGroup.getOrganId(), new SysUserRoleEnum[]{ORGAN_MANAGER},

+ 7 - 2
mec-biz/src/main/java/com/ym/mec/biz/service/impl/StudentServiceImpl.java

@@ -121,7 +121,8 @@ public class StudentServiceImpl extends BaseServiceImpl<Integer, Student> implem
 
     @Autowired
     private StudentService studentService;
-
+    @Autowired
+    private SysUserService sysUserService;
 
     @Override
     public BaseDAO<Integer, Student> getDAO() {
@@ -1175,7 +1176,11 @@ public class StudentServiceImpl extends BaseServiceImpl<Integer, Student> implem
             // 注册账户信息
             teacherDao.addSysUser(user);
             Integer userId = user.getId();
-            ImResult imResult = imFeignService.register(new ImUserModel(userId.toString(), user.getUsername(), user.getAvatar()));
+            // IM头像
+            String imAvatar = sysUserService.getImAvatar(teacherDao.getUser(userId));
+            // IM用户昵称
+            String imName = sysUserService.getImName(teacherDao.getUser(userId));
+            ImResult imResult = imFeignService.register(new ImUserModel(userId.toString(), imName, imAvatar));
             if(imResult != null && StringUtils.isNotEmpty(imResult.getToken())) {
                 user.setImToken(imResult.getToken());
                 teacherDao.updateUser(user);

+ 21 - 4
mec-biz/src/main/java/com/ym/mec/biz/service/impl/SysMessageServiceImpl.java

@@ -291,6 +291,7 @@ public class SysMessageServiceImpl extends BaseServiceImpl<Long, SysMessage> imp
 
 	@Override
 	public void batchSendImGroupImgMessage(ImSendGroupMessage messageDto) throws Exception {
+		LOGGER.info("batchSendImGroupImgMessage messageDto={}", messageDto);
 		URL url = new URL(messageDto.getFileUrl());
 		BufferedImage bufferedImage = Thumbnails.of(url).scale(0.1f).outputQuality(0.25f).asBufferedImage();
 		ByteArrayOutputStream outputStream = new ByteArrayOutputStream();
@@ -305,7 +306,7 @@ public class SysMessageServiceImpl extends BaseServiceImpl<Long, SysMessage> imp
 		messageDto.setObjectName("RC:ImgMsg");
         if (StringUtils.isNotBlank(messageDto.getTargetIds())) {
             ImMessageDto imMessageDto = this.getImGroupMessage(messageDto);
-            imMessageDto.setMessageContent(imageToBase64(bufferedImage, "png"));
+            //imMessageDto.setMessageContent(imageToBase64(bufferedImage, "png"));
             imMessageDto.setFileUrl(messageDto.getFileUrl());
             this.sendGroupMessage(imMessageDto);
         }
@@ -314,7 +315,7 @@ public class SysMessageServiceImpl extends BaseServiceImpl<Long, SysMessage> imp
             messageDto.setTargetIds(messageDto.getUserTargetIds());
             ImMessageDto imMessageDto = this.getImGroupMessage(messageDto);
             messageDto.setTargetIds(targetIds);
-            imMessageDto.setMessageContent(imageToBase64(bufferedImage, "png"));
+            //imMessageDto.setMessageContent(imageToBase64(bufferedImage, "png"));
             imMessageDto.setFileUrl(messageDto.getFileUrl());
             imMessageDto.setObjectName(messageDto.getObjectName());
             this.sendImMessage(imMessageDto);
@@ -322,15 +323,31 @@ public class SysMessageServiceImpl extends BaseServiceImpl<Long, SysMessage> imp
 	}
 
 	public void sendGroupMessage(ImMessageDto imMessageDto){
+		LOGGER.info("sendGroupMessage groupSend ret={}", JSON.toJSONString(imMessageDto));
 		//ExecutorService executor = Executors.newCachedThreadPool();
 		CompletableFuture.runAsync(()->{
-			imFeignService.groupSend(imMessageDto);
+			Object ret;
+			int maxRetry = 5;
+			do {
+				// 若发送失败,重试5次后放弃
+				ret = imFeignService.groupSend(imMessageDto);
+				LOGGER.info("sendGroupMessage groupSend retry={}, ret={}", maxRetry, JSON.toJSONString(ret));
+			} while (ret == null && maxRetry-- > 0);
 		});
 	}
 
 
     public void sendImMessage(ImMessageDto imMessageDto){
-        CompletableFuture.runAsync(()-> imFeignService.privateSend(imMessageDto));
+		LOGGER.info("sendImMessage privateSend ret={}", JSON.toJSONString(imMessageDto));
+        CompletableFuture.runAsync(()-> {
+			Object ret;
+			int maxRetry = 5;
+			do {
+				// 若发送失败,重试5次后放弃
+				ret = imFeignService.privateSend(imMessageDto);
+				LOGGER.info("sendGroupMessage groupSend retry={}, ret={}", maxRetry, JSON.toJSONString(ret));
+			} while (ret == null && maxRetry-- > 0);
+		});
     }
 
 	@Override

+ 38 - 2
mec-biz/src/main/java/com/ym/mec/biz/service/impl/SysUserServiceImpl.java

@@ -3,26 +3,34 @@ package com.ym.mec.biz.service.impl;
 import com.google.common.collect.Lists;
 import com.ym.mec.auth.api.client.SysUserFeignService;
 import com.ym.mec.auth.api.entity.SysUser;
+import com.ym.mec.biz.dal.dao.TeacherDao;
 import com.ym.mec.biz.dal.entity.SysConfig;
 import com.ym.mec.biz.dal.enums.ClientEnum;
 import com.ym.mec.biz.service.SysConfigService;
 import com.ym.mec.biz.service.SysUserService;
+import com.ym.mec.biz.service.im.ImGroupCoreService;
 import com.ym.mec.common.exception.BizException;
+import lombok.extern.slf4j.Slf4j;
 import org.apache.commons.lang3.StringUtils;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.stereotype.Service;
 
 import java.util.List;
+import java.util.Objects;
 import java.util.Optional;
 
+@Slf4j
 @Service
 public class SysUserServiceImpl implements SysUserService {
 
     @Autowired
     private SysUserFeignService sysUserFeignService;
-
+    @Autowired
+    private TeacherDao teacherDao;
     @Autowired
     private SysConfigService sysConfigService;
+    @Autowired
+    private ImGroupCoreService imGroupCoreService;
 
     @Override
     public Integer getUserId(){
@@ -69,7 +77,9 @@ public class SysUserServiceImpl implements SysUserService {
         }
         String username = sysUser.getUsername();
         List<String> userTypes = Lists.newArrayList(sysUser.getUserType().split(","));
-        if (userTypes.size() > 1 || userTypes.contains(ClientEnum.TEACHER.getCode())) {
+        if (userTypes.size() > 1
+            || userTypes.contains(ClientEnum.TEACHER.getCode())
+            || userTypes.contains(ClientEnum.SYSTEM.getCode())) {
             username = Optional.ofNullable(sysUser.getRealName()).filter(StringUtils::isNotBlank).orElse(username);
         }
         return username;
@@ -91,4 +101,30 @@ public class SysUserServiceImpl implements SysUserService {
             return Optional.ofNullable(sysConfigService.findByParamName(SysConfigService.TEACHER_DEFAULT_AVATAR)).orElse(new SysConfig()).getParanValue();
         }
     }
+
+    /**
+     * 注册用户三方IM
+     *
+     * @param userId 用户id
+     */
+    @Override
+    public void registerImUserInfo(Integer userId) {
+        SysUser userInfo = teacherDao.getUser(userId);
+        if (Objects.nonNull(userInfo)) {
+
+            try {
+                String username = userInfo.getUsername();
+                List<String> userTypes = Lists.newArrayList(userInfo.getUserType().split(","));
+                if (userTypes.size() > 1
+                    || userTypes.contains(ClientEnum.TEACHER.getCode())
+                    || userTypes.contains(ClientEnum.SYSTEM.getCode())) {
+                    username = Optional.ofNullable(userInfo.getRealName()).filter(StringUtils::isNotBlank).orElse(username);
+                }
+
+                imGroupCoreService.register(String.valueOf(userInfo.getId()), "", username, getImAvatar(userInfo));
+            } catch (Exception e) {
+                log.error("用户更新信息同步到三方失败,userId:{}", userInfo.getId(), e);
+            }
+        }
+    }
 }

+ 71 - 10
mec-biz/src/main/java/com/ym/mec/biz/service/impl/TeacherServiceImpl.java

@@ -4,12 +4,52 @@ import com.alibaba.fastjson.JSONObject;
 import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
 import com.ym.mec.auth.api.entity.SysUser;
 import com.ym.mec.auth.api.enums.YesOrNoEnum;
-import com.ym.mec.biz.dal.dao.*;
-import com.ym.mec.biz.dal.dto.*;
-import com.ym.mec.biz.dal.entity.*;
-import com.ym.mec.biz.dal.page.*;
+import com.ym.mec.biz.dal.dao.ClassGroupDao;
+import com.ym.mec.biz.dal.dao.DemoGroupDao;
+import com.ym.mec.biz.dal.dao.ImGroupDao;
+import com.ym.mec.biz.dal.dao.ImUserFriendDao;
+import com.ym.mec.biz.dal.dao.MusicGroupDao;
+import com.ym.mec.biz.dal.dao.OrganizationDao;
+import com.ym.mec.biz.dal.dao.SchoolDao;
+import com.ym.mec.biz.dal.dao.StudentDao;
+import com.ym.mec.biz.dal.dao.StudentExtracurricularExercisesSituationDao;
+import com.ym.mec.biz.dal.dao.StudentPaymentOrderDao;
+import com.ym.mec.biz.dal.dao.StudentRegistrationDao;
+import com.ym.mec.biz.dal.dao.StudentTeacherMapperDao;
+import com.ym.mec.biz.dal.dao.SubjectDao;
+import com.ym.mec.biz.dal.dao.SysUserCashAccountDao;
+import com.ym.mec.biz.dal.dao.TeacherDao;
+import com.ym.mec.biz.dal.dto.BaseMapDto;
+import com.ym.mec.biz.dal.dto.BasicUserDto;
+import com.ym.mec.biz.dal.dto.ImUserFriendDto;
+import com.ym.mec.biz.dal.dto.MusicGroupStudentApplyDto;
+import com.ym.mec.biz.dal.dto.MusicGroupTeacherAttendanceDto;
+import com.ym.mec.biz.dal.dto.MusicGroupTeachersDto;
+import com.ym.mec.biz.dal.dto.SysUserDto;
+import com.ym.mec.biz.dal.dto.TeacherBasicDto;
+import com.ym.mec.biz.dal.dto.TeacherCloseDto;
+import com.ym.mec.biz.dal.dto.TeacherDefaultSalaryDto;
+import com.ym.mec.biz.dal.dto.TeacherExercisesServiceDto;
+import com.ym.mec.biz.dal.dto.TeacherMusicStudentOverViewDto;
+import com.ym.mec.biz.dal.entity.CourseHomework;
+import com.ym.mec.biz.dal.entity.ImUserFriend;
+import com.ym.mec.biz.dal.entity.MusicGroup;
+import com.ym.mec.biz.dal.entity.Organization;
+import com.ym.mec.biz.dal.entity.School;
+import com.ym.mec.biz.dal.entity.StudentPaymentOrder;
+import com.ym.mec.biz.dal.entity.SysUserCashAccount;
+import com.ym.mec.biz.dal.entity.Teacher;
+import com.ym.mec.biz.dal.page.MusicGroupTeacherAttendanceQueryInfo;
+import com.ym.mec.biz.dal.page.MusicGroupTeachersQueryInfo;
+import com.ym.mec.biz.dal.page.TeacherCloseQueryInfo;
+import com.ym.mec.biz.dal.page.TeacherNameQueryInfo;
+import com.ym.mec.biz.dal.page.TeacherQueryInfo;
+import com.ym.mec.biz.dal.page.TeacherServeQueryInfo;
+import com.ym.mec.biz.dal.page.UserBasicQueryInfo;
+import com.ym.mec.biz.dal.page.queryMusicGroupStudentQueryInfo;
 import com.ym.mec.biz.service.ClassGroupService;
 import com.ym.mec.biz.service.OaUserService;
+import com.ym.mec.biz.service.SysUserService;
 import com.ym.mec.biz.service.TeacherService;
 import com.ym.mec.biz.service.TenantInfoService;
 import com.ym.mec.common.constant.CommonConstants;
@@ -29,6 +69,7 @@ import com.ym.mec.thirdparty.user.realname.provider.LinkfaceRealnameAuthenticati
 import com.ym.mec.util.collection.MapUtil;
 import com.ym.mec.util.date.DateUtil;
 import com.ym.mec.util.idcard.IdcardValidator;
+import lombok.extern.slf4j.Slf4j;
 import org.apache.commons.lang3.StringUtils;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.data.redis.core.RedisTemplate;
@@ -41,10 +82,20 @@ import java.math.BigDecimal;
 import java.time.DayOfWeek;
 import java.time.LocalDate;
 import java.time.LocalDateTime;
-import java.util.*;
+import java.util.ArrayList;
+import java.util.Arrays;
+import java.util.Collections;
+import java.util.Date;
+import java.util.HashMap;
+import java.util.HashSet;
+import java.util.List;
+import java.util.Map;
+import java.util.Objects;
+import java.util.Set;
 import java.util.function.Function;
 import java.util.stream.Collectors;
 
+@Slf4j
 @Service
 public class TeacherServiceImpl extends BaseServiceImpl<Integer, Teacher> implements TeacherService {
 
@@ -77,8 +128,6 @@ public class TeacherServiceImpl extends BaseServiceImpl<Integer, Teacher> implem
     @Autowired
     private StudentExtracurricularExercisesSituationDao studentExtracurricularExercisesSituationDao;
     @Autowired
-    private StudentDao studentDao;
-    @Autowired
     private ImUserFriendDao imUserFriendDao;
     @Autowired
     private RedisTemplate<String, String> redisTemplate;
@@ -88,6 +137,8 @@ public class TeacherServiceImpl extends BaseServiceImpl<Integer, Teacher> implem
     private TenantInfoService tenantInfoService;
     @Autowired
     private OaUserService oaUserService;
+    @Autowired
+    private SysUserService sysUserService;
 
     @Autowired
     private RealnameAuthenticationPluginContext realnameAuthenticationPluginContext;
@@ -138,7 +189,11 @@ public class TeacherServiceImpl extends BaseServiceImpl<Integer, Teacher> implem
         //添加用户电子签章账户
 //		contractService.register(teacher.getId(), user.getRealName(), user.getIdCardNo(), user.getPhone());
         teacherDao.insert(teacher);
-        ImResult imResult = imFeignService.register(new ImUserModel(teacher.getId().toString(), teacher.getUsername(), null));
+        // IM头像
+        String imAvatar = sysUserService.getImAvatar(teacherDao.getUser(teacher.getId()));
+        // IM用户昵称
+        String imName = sysUserService.getImName(teacherDao.getUser(teacher.getId()));
+        ImResult imResult = imFeignService.register(new ImUserModel(teacher.getId().toString(), imName, imAvatar));
         if (imResult != null) {
             teacher.setImToken(imResult.getToken());
             teacherDao.updateUser(teacher);
@@ -181,7 +236,10 @@ public class TeacherServiceImpl extends BaseServiceImpl<Integer, Teacher> implem
         teacherDao.updateUser(teacher);
         imGroupDao.updateNickname(teacher.getId(), teacher.getRealName());
         imGroupDao.updateUserFriendNickname(teacher.getId(), teacher.getRealName());
-        imFeignService.update(new ImUserModel(teacher.getId().toString(), teacher.getRealName(), teacher.getAvatar()));
+        //imFeignService.update(new ImUserModel(teacher.getId().toString(), teacher.getRealName(), teacher.getAvatar()));
+
+        // 用户更新信息同步到三方
+        sysUserService.registerImUserInfo(teacher.getId());
     }
 
     @Override
@@ -215,7 +273,10 @@ public class TeacherServiceImpl extends BaseServiceImpl<Integer, Teacher> implem
         teacherDao.updateUser(teacher);
         imGroupDao.updateNickname(teacher.getId(), teacher.getRealName());
         imGroupDao.updateUserFriendNickname(teacher.getId(), teacher.getRealName());
-        imFeignService.update(new ImUserModel(teacher.getId().toString(), teacher.getRealName(), teacher.getAvatar()));
+        //imFeignService.update(new ImUserModel(teacher.getId().toString(), teacher.getRealName(), teacher.getAvatar()));
+
+        // 用户更新信息同步到三方
+        sysUserService.registerImUserInfo(teacher.getId());
         //更新OA信息
         teacher.setAvatar(user.getAvatar());
         teacher.setUsername(user.getUsername());

+ 1 - 1
mec-biz/src/main/java/com/ym/mec/biz/service/impl/TenantInfoServiceImpl.java

@@ -675,7 +675,7 @@ public class TenantInfoServiceImpl extends ServiceImpl<TenantInfoDao, TenantInfo
         //购买服务的时长单位
         param.put("expiryUnit", TenantProductInfo.MONTH.equals(tenantInfo.getExpiryUnit()) ? "个月" : "年");
         //乙方公章
-        param.put("officialSealB", "https://daya.ks3-cn-beijing.ksyun.com/202202/Sx6rzWm.png");
+        param.put("officialSealB", "https://oss.dayaedu.com/default-images/mec/Sx6rzWm.png");
         //获取产品名称
         opsContractData(tenantInfo.getServeId(), platformServeService::queryProductNameById,
                 "未查询到产品信息!",

+ 1 - 1
mec-biz/src/main/resources/config/mybatis/ClassGroupMapper.xml

@@ -1509,7 +1509,7 @@
         <foreach collection="vipGroupIds" item="groupId" open="(" close=")" separator=",">
             #{groupId}
         </foreach>
-        AND cg.group_type_ = 'VIP'
+        AND cg.group_type_ in ('VIP','LIVE')
     </select>
     <select id="findClassGroupWithIds" resultMap="ClassGroup">
         SELECT * FROM class_group WHERE id_ IN

+ 14 - 0
mec-biz/src/main/resources/config/mybatis/CourseScheduleMapper.xml

@@ -4486,4 +4486,18 @@
           AND cs.tenant_id_ = 1
         group by cs.id_ order by cs.organ_id_;
     </select>
+
+    <select id="getNotStartOnlineNoLive" resultMap="CourseSchedule">
+        select * from course_schedule where status_ = 'NOT_START' and teach_mode_ = 'ONLINE' and type_ != 'LIVE'
+        and CONCAT(class_date_,' ',start_class_time_) &lt;= date_format(date_add(now(),interval #{beforeTime} minute),'%Y-%m-%d %H:%i:%s')
+
+        and live_remind_ = 0
+        and tenant_id_ = #{tenantInfoId}
+    </select>
+
+    <select id="getEndTimeBetweenYesterdayAndNow" resultMap="CourseSchedule">
+        select * from course_schedule where status_ = 'OVER' and teach_mode_ = 'ONLINE' and type_ != 'LIVE'
+        and CONCAT(class_date_,' ',end_class_time_) &gt;= date_format(date_add(now(),interval -1 day),'%Y-%m-%d')
+        and CONCAT(class_date_,' ',end_class_time_) &lt;= date_format(now(),'%Y-%m-%d %H:%i:%s')
+    </select>
 </mapper>

+ 1 - 1
mec-biz/src/main/resources/config/mybatis/CourseScheduleStatisticsMapper.xml

@@ -172,7 +172,7 @@
 			   COUNT(DISTINCT CASE WHEN sa.qualified_flag_ = 1 THEN sa.id_ ELSE NULL END) standard_num_,
 			   CASE WHEN sch.id_ IS NOT NULL THEN 1 ELSE 0 END homework_flag_,
 			   COUNT(DISTINCT CASE WHEN sch.status_ = 1 THEN sch.id_ ELSE NULL END) homework_commit_num_,cs.class_date_,cs.status_ course_status_
-		FROM course_schedule_statistics_wait cssw
+		FROM (select * from course_schedule_statistics_wait limit 500) cssw
 				 LEFT JOIN course_schedule_statistics css ON css.course_schedule_id_ = cssw.course_schedule_id_
 				 LEFT JOIN course_schedule cs ON cs.id_ = cssw.course_schedule_id_
 				 LEFT JOIN course_schedule_student_payment cssp ON cssp.course_schedule_id_ = cssw.course_schedule_id_

+ 4 - 1
mec-biz/src/main/resources/config/mybatis/EmployeeMapper.xml

@@ -30,6 +30,8 @@
         <result column="bank_card_" property="bankCard"/>
         <result column="open_bank_address_" property="openBankAddress"/>
 		<result column="tenant_id_" property="tenantId" />
+
+        <result column="avatar_" property="avatar"/>
     </resultMap>
 
     <resultMap type="com.ym.mec.auth.api.entity.SysUser" id="SysUser">
@@ -455,7 +457,8 @@
     </sql>
 
     <select id="queryBaseInfoByPage" resultMap="Employee" parameterType="map">
-        SELECT * FROM employee
+        SELECT t.*,su.avatar_ FROM employee t
+        LEFT JOIN sys_user su on t.user_id_ = su.id_
         <include refid="global.limit"/>
     </select>
 

+ 7 - 9
mec-biz/src/main/resources/config/mybatis/IndexBaseMonthDataMapper.xml

@@ -2004,15 +2004,13 @@
 			COUNT( DISTINCT user_id_ ) percent_
 		FROM
 		(
-		SELECT
-			su.organ_id_,smcr.tenant_id_,
-			smcr.user_id_
-		FROM
-			sys_music_compare_record smcr
-			LEFT JOIN sys_user su ON smcr.user_id_ = su.id_
-		WHERE su.del_flag_ = 0 and smcr.tenant_id_ = #{tenantId}
-		GROUP BY user_id_
-		HAVING MIN(DATE( smcr.create_time_ ))= #{dayStr}) t
+		SELECT su.organ_id_, smcr.tenant_id_, smcr.user_id_
+		FROM sys_music_compare_record smcr
+		INNER JOIN sys_user su ON smcr.user_id_ = su.id_
+		WHERE su.del_flag_ = 0 AND smcr.tenant_id_ = 3
+		AND smcr.create_time_ >= #{dayStr}
+		AND smcr.create_time_ &lt; DATE_ADD(#{dayStr}, INTERVAL 1 DAY)
+		GROUP BY smcr.user_id_) t
 		GROUP BY t.organ_id_
 	</select>
 	<resultMap id="CloudTeacherActiveTargetDto" type="com.ym.mec.biz.dal.dto.CloudTeacherActiveTargetDto">

+ 1 - 1
mec-biz/src/main/resources/config/mybatis/StudentMapper.xml

@@ -1447,7 +1447,7 @@
     </select>
 
     <select id="queryBaseInfoByPage" resultMap="Student" parameterType="map">
-        SELECT s.*,su.username_,su.phone_ FROM student s
+        SELECT s.*,su.username_,su.phone_,su.avatar_ FROM student s
         LEFT JOIN sys_user su ON  su.id_ = s.user_id_
         <include refid="global.limit"/>
     </select>

+ 1 - 1
mec-biz/src/main/resources/config/mybatis/TeacherMapper.xml

@@ -1578,7 +1578,7 @@
     <select id="queryBaseInfoByPage" resultMap="Teacher" parameterType="map">
         SELECT t.id_,su.real_name_,su.lock_flag_,t.subject_id_,su.phone_,t.organ_id_
         teacher_organ_id_,t.organ_id_,t.is_support_extra_practice_lesson_,t.dept_id_,t.dept_ids_,t.post_dept_ids_,
-        t.job_nature_,t.demission_date_,t.formal_staff_date_,t.is_probation_period_,t.memo_,su.del_flag_,t.is_settlement_salary_
+        t.job_nature_,t.demission_date_,t.formal_staff_date_,t.is_probation_period_,t.memo_,su.del_flag_,t.is_settlement_salary_,su.avatar_
         FROM teacher t
         LEFT JOIN sys_user su ON t.id_ = su.id_
         ORDER BY t.id_ DESC

File diff suppressed because it is too large
+ 6 - 6
mec-biz/src/main/resources/config/mybatis/TenantInfoMapper.xml


+ 3 - 0
mec-common/audit-log/src/main/java/com/yonge/log/dal/model/HistoryMessage.java

@@ -46,6 +46,9 @@ public class HistoryMessage implements Serializable {
     private String appId;
 
     private String busChannel;
+    private Integer msgSeq;
+    private Integer msgRandom;
+    private Long msgTimeStamp;
 
     public String getFromUserId() {
         return fromUserId;

+ 5 - 4
mec-common/audit-log/src/main/java/com/yonge/log/service/HistoryMessageService.java

@@ -5,9 +5,7 @@ import com.yonge.mongodb.PageInfo;
 import com.yonge.mongodb.service.BaseServiceWithMongo;
 
 import java.io.File;
-import java.time.LocalDateTime;
 import java.util.Date;
-import java.util.List;
 
 public interface HistoryMessageService extends BaseServiceWithMongo<String, HistoryMessage> {
 
@@ -18,9 +16,9 @@ public interface HistoryMessageService extends BaseServiceWithMongo<String, Hist
      */
     void saveImHistoryMessage(File file) throws Exception;
 
-    long selectCount(int status, Date date);
+    long selectCount(int status, Date date, int targetType);
 
-    PageInfo<HistoryMessage> selectPage(int page, int size, int status, Date date);
+    PageInfo<HistoryMessage> selectPage(int page, int size, int status, Date date, int targetType);
 
     void updateStatus(String id, Integer status);
 
@@ -31,4 +29,7 @@ public interface HistoryMessageService extends BaseServiceWithMongo<String, Hist
     PageInfo<HistoryMessage> getImToTencent(long page, int size);
 
     void updateSyncFlag(String id, int syncFlag);
+
+    void updateMsg(String msgUID, Integer msgSeq, Integer msgRandom, Long msgTimeStamp);
+
 }

+ 21 - 8
mec-common/audit-log/src/main/java/com/yonge/log/service/impl/HistoryMessageServiceImpl.java

@@ -1,22 +1,18 @@
 package com.yonge.log.service.impl;
 
 import com.alibaba.fastjson.JSONObject;
-import com.mongodb.operation.AggregateOperation;
 import com.yonge.log.dal.dao.HistoryMessageDao;
 import com.yonge.log.dal.model.HistoryMessage;
-import com.yonge.log.dal.model.HistoryMessageTencent;
 import com.yonge.log.service.HistoryMessageService;
 import com.yonge.mongodb.PageInfo;
 import com.yonge.mongodb.dao.BaseDaoWithMongo;
 import com.yonge.mongodb.service.impl.BaseServiceImplWithMongo;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.data.mongodb.core.MongoTemplate;
-import org.springframework.data.mongodb.core.aggregation.Aggregation;
 import org.springframework.data.mongodb.core.query.Criteria;
 import org.springframework.data.mongodb.core.query.Query;
 import org.springframework.data.mongodb.core.query.Update;
 import org.springframework.stereotype.Service;
-import org.springframework.transaction.annotation.Transactional;
 
 import java.io.BufferedReader;
 import java.io.File;
@@ -33,7 +29,6 @@ import java.util.Set;
 import java.time.LocalDateTime;
 import java.time.ZoneId;
 import java.time.format.DateTimeFormatter;
-import java.util.*;
 import java.util.stream.Collectors;
 import java.util.zip.ZipEntry;
 import java.util.zip.ZipFile;
@@ -64,7 +59,7 @@ public class HistoryMessageServiceImpl extends BaseServiceImplWithMongo<String,
     }
 
     @Override
-    public long selectCount(int status, Date date) {
+    public long selectCount(int status, Date date, int targetType) {
         Query query = new Query();
 
         // 查询status 为null or 0
@@ -77,12 +72,14 @@ public class HistoryMessageServiceImpl extends BaseServiceImplWithMongo<String,
 
 
         Criteria criteria = Criteria.where("dateTime").gt(dateFormat).orOperator(Criteria.where("status").is(0),Criteria.where("status").is(null));
+        criteria.and("targetType").is(targetType);
+        criteria.and("classname").in("RC:ImgMsg", "RC:GIFMsg", "RC:HQVCMsg", "RC:FileMsg", "RC:SightMsg", "RC:LBSMsg", "RC:ImgTextMsg","RC:TxtMsg");
         query.addCriteria(criteria);
         return mongoTemplate.count(query,HistoryMessage.class);
     }
 
     @Override
-    public PageInfo<HistoryMessage> selectPage(int page, int size, int status, Date date) {
+    public PageInfo<HistoryMessage> selectPage(int page, int size, int status, Date date, int targetType) {
         PageInfo<HistoryMessage> pageInfo = new PageInfo<HistoryMessage>(page, size);
 
         // date 转 LocalDateTime
@@ -90,12 +87,14 @@ public class HistoryMessageServiceImpl extends BaseServiceImplWithMongo<String,
 
         String dateFormat = ldt.format(DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss.SSS"));
         List<HistoryMessage> dataList = null;
-        long total = this.selectCount(status,date);
+        long total = this.selectCount(status,date, targetType);
         if (total > 0) {
             pageInfo.setTotal(total);
 
             Query query = new Query();
             Criteria criteria = Criteria.where("dateTime").gt(dateFormat).orOperator(Criteria.where("status").is(0),Criteria.where("status").is(null));
+            criteria.and("targetType").is(targetType);
+            criteria.and("classname").in("RC:ImgMsg", "RC:GIFMsg", "RC:HQVCMsg", "RC:FileMsg", "RC:SightMsg", "RC:LBSMsg", "RC:ImgTextMsg","RC:TxtMsg");
             query.addCriteria(criteria);
             query.skip(pageInfo.getOffset()).limit(pageInfo.getLimit());
             dataList = mongoTemplate.find(query, HistoryMessage.class);
@@ -172,6 +171,20 @@ public class HistoryMessageServiceImpl extends BaseServiceImplWithMongo<String,
         mongoTemplate.updateMulti(query, update, HistoryMessage.class);
     }
 
+    @Override
+    public void updateMsg(String msgUID, Integer msgSeq, Integer msgRandom, Long msgTimeStamp) {
+
+        Criteria criteria = Criteria.where("_id").is(msgUID);
+        Query query = new Query(criteria);
+
+        Update update = new Update();
+        update.set("msgSeq", msgSeq); // 设置新的 status 值
+        update.set("msgRandom", msgRandom); // 设置新的 status 值
+        update.set("msgTimeStamp", msgTimeStamp); // 设置新的 status 值
+
+        mongoTemplate.updateMulti(query, update, HistoryMessage.class);
+    }
+
 
 //	public static void main(String[] args) throws Exception {
 //		doNioReadFile1(new File("/Users/chenxiaoyu/Documents/77fe9ce6-7d91-4568-afe3-9e8ac351e87f.zip"));

+ 7 - 7
mec-common/audit-log/src/main/java/com/yonge/log/service/impl/HistoryMessageTenantServiceImpl.java

@@ -78,7 +78,7 @@ public class HistoryMessageTenantServiceImpl extends BaseServiceImplWithMongo<St
     @Override
     public int initMsgBodyJsonCount() {
         Query query = new Query();
-        Criteria criteria = Criteria.where("msg_body_json").is(null).orOperator(Criteria.where("json_flag").is(0),Criteria.where("syncFlag").is(null));
+        Criteria criteria = Criteria.where("msg_body_json").is(null).orOperator(Criteria.where("json_flag").is(0),Criteria.where("json_flag").is(null));
         query.addCriteria(criteria);
         return Long.valueOf(mongoTemplate.count(query,HistoryMessageTencent.class)).intValue();
     }
@@ -86,7 +86,7 @@ public class HistoryMessageTenantServiceImpl extends BaseServiceImplWithMongo<St
     @Override
     public void initMsgBodyJson(int page, int size) {
         Query query = new Query();
-        Criteria criteria = Criteria.where("msg_body_json").is(null).orOperator(Criteria.where("json_flag").is(0),Criteria.where("syncFlag").is(null));
+        Criteria criteria = Criteria.where("msg_body_json").is(null).orOperator(Criteria.where("json_flag").is(0),Criteria.where("json_flag").is(null));
         query.addCriteria(criteria);
         query.skip(page).limit(size);
         List<HistoryMessageTencent> historyMessageTencents = mongoTemplate.find(query, HistoryMessageTencent.class);
@@ -135,15 +135,15 @@ public class HistoryMessageTenantServiceImpl extends BaseServiceImplWithMongo<St
         Pattern pattern = Pattern.compile(".*", Pattern.CASE_INSENSITIVE);
         if (StringUtils.isNotBlank(param.getKeyword())) {
             pattern = Pattern.compile(".*" + param.getKeyword() + ".*", Pattern.CASE_INSENSITIVE);
+            criteria.and("msg_body_json").elemMatch(
+                Criteria.where("MsgContent.Text").regex(pattern)
+                    .and("MsgType").is("TIMTextElem")
+            );
         }
 
-        criteria.and("msg_body_json").elemMatch(
-            Criteria.where("MsgContent.Text").regex(pattern)
-                .and("MsgType").is("TIMTextElem")
-        );
 
         query.addCriteria(criteria);
-        query.with(Sort.by(Sort.Order.asc("msg_timestamp"))); // 以升序方式按字段排序
+        query.with(Sort.by(Sort.Order.desc("msg_timestamp"))); // 以升序方式按字段排序
 
         return query;
     }

+ 0 - 1
mec-common/common-core/pom.xml

@@ -14,7 +14,6 @@
 	<properties>
 		<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
 		<mybatis-plus.version>3.0.7.1</mybatis-plus.version>
-		<redisson.version>3.16.4</redisson.version>
 	</properties>
 
 	<dependencies>

+ 0 - 0
mec-education/src/main/resources/bootstrap-prod.properties


+ 1 - 1
mec-eureka/src/main/resources/bootstrap-prod.properties

@@ -3,7 +3,7 @@
 #\u670d\u52a1\u5668\u5730\u5740
 spring.cloud.nacos.config.server-addr=10.206.0.12:8848
 #\u9ed8\u8ba4\u4e3aPublic\u547d\u540d\u7a7a\u95f4,\u53ef\u4ee5\u7701\u7565\u4e0d\u5199
-spring.cloud.nacos.config.namespace=f40a7594-4bd0-4bc6-8397-9353c6d2e63a
+spring.cloud.nacos.config.namespace=b7aee20b-41e8-43d8-8e2d-45b6447f66ae
 #\u6307\u5b9a\u914d\u7f6e\u7fa4\u7ec4 --\u5982\u679c\u662fPublic\u547d\u540d\u7a7a\u95f4 \u5219\u53ef\u4ee5\u7701\u7565\u7fa4\u7ec4\u914d\u7f6e
 spring.cloud.nacos.config.group=DEFAULT_GROUP
 #\u6587\u4ef6\u540d -- \u5982\u679c\u6ca1\u6709\u914d\u7f6e\u5219\u9ed8\u8ba4\u4e3a ${spring.appliction.name}

+ 1 - 1
mec-gateway/mec-gateway-web/src/main/resources/bootstrap-prod.properties

@@ -3,7 +3,7 @@
 #\u670d\u52a1\u5668\u5730\u5740
 spring.cloud.nacos.config.server-addr=10.206.0.12:8848
 #\u9ed8\u8ba4\u4e3aPublic\u547d\u540d\u7a7a\u95f4,\u53ef\u4ee5\u7701\u7565\u4e0d\u5199
-spring.cloud.nacos.config.namespace=f40a7594-4bd0-4bc6-8397-9353c6d2e63a
+spring.cloud.nacos.config.namespace=b7aee20b-41e8-43d8-8e2d-45b6447f66ae
 #\u6307\u5b9a\u914d\u7f6e\u7fa4\u7ec4 --\u5982\u679c\u662fPublic\u547d\u540d\u7a7a\u95f4 \u5219\u53ef\u4ee5\u7701\u7565\u7fa4\u7ec4\u914d\u7f6e
 spring.cloud.nacos.config.group=DEFAULT_GROUP
 #\u6587\u4ef6\u540d -- \u5982\u679c\u6ca1\u6709\u914d\u7f6e\u5219\u9ed8\u8ba4\u4e3a ${spring.appliction.name}

+ 8 - 0
mec-im/src/main/java/com/ym/controller/RoomController.java

@@ -374,4 +374,12 @@ public class RoomController{
         Boolean result = roomService.memberOnlineStatus(statusList, nonce, timestamp, signature);
         return new BaseResponse<>(result);
     }
+
+
+    @RequestMapping(value = "createRtcRoom", method = RequestMethod.GET)
+    public Object createRtcRoom(@RequestParam Long courseScheduleId)
+            throws Exception {
+        roomService.createRtcGroup(courseScheduleId);
+        return new BaseResponse<>();
+    }
 }

+ 39 - 24
mec-im/src/main/java/com/ym/controller/UserController.java

@@ -92,24 +92,30 @@ public class UserController {
 
                 String username = userInfo.getUsername();
                 List<String> userTypes = Lists.newArrayList(userInfo.getUserType().split(","));
-                if (userTypes.size() > 1 || userTypes.contains(ClientEnum.TEACHER.getCode())) {
+                if (userTypes.size() > 1
+                    || userTypes.contains(ClientEnum.TEACHER.getCode())
+                    || userTypes.contains(ClientEnum.SYSTEM.getCode())) {
                     username = Optional.ofNullable(userInfo.getRealName()).filter(StringUtils::isNotBlank).orElse(username);
                 }
+                // 用户昵称
+                userModel.setName(username);
+                // 用户头像
+                userModel.setPortrait(sysUserService.getImAvatar(teacherDao.getUser(userInfo.getUserId().intValue())));
+            }
+            ImGroupWrapper.ImUserInfo register = imGroupCoreService.register(userModel.getId(), clientType, userModel.getName(),
+                userModel.getPortrait());
 
-                ImGroupWrapper.ImUserInfo register = imGroupCoreService.register(userModel.getId(), clientType, username, userInfo.getAvatar());
+            // 用户注册接入Token
+            tokenResult.setToken(register.getImToken());
+            // 用户注册接入Id
+            tokenResult.setUserId(register.getImUserId());
 
-                // 用户注册接入Token
-                tokenResult.setToken(register.getImToken());
-                // 用户注册接入Id
-                tokenResult.setUserId(register.getImUserId());
-
-                SysUser sysUser = new SysUser();
-                sysUser.setId(Integer.parseInt(userModel.getId()));
-                // 更新用户imToken值
-                sysUser.setImToken(register.getImToken());
-                sysUser.setUpdateTime(new Date());
-                sysUserService.updateSysUser(sysUser);
-            }
+            SysUser sysUser = new SysUser();
+            sysUser.setId(Integer.parseInt(userModel.getId()));
+            // 更新用户imToken值
+            sysUser.setImToken(register.getImToken());
+            sysUser.setUpdateTime(new Date());
+            sysUserService.updateSysUser(sysUser);
 
         } else {
             // 融云
@@ -129,14 +135,16 @@ public class UserController {
 
             String username = userInfo.getUsername();
             List<String> userTypes = Lists.newArrayList(userInfo.getUserType().split(","));
-            if (userTypes.size() > 1 || userTypes.contains(ClientEnum.TEACHER.getCode())) {
+            if (userTypes.size() > 1
+                || userTypes.contains(ClientEnum.TEACHER.getCode())
+                || userTypes.contains(ClientEnum.SYSTEM.getCode())) {
                 username = Optional.ofNullable(userInfo.getRealName()).filter(StringUtils::isNotBlank).orElse(username);
             }
 
             try {
 
                 ImGroupWrapper.ImUserInfo register = imGroupCoreService.register(userModel.getId(), userModel.getClientType(),
-                    username, Optional.ofNullable(userInfo.getAvatar()).orElse(""));
+                    username,  sysUserService.getImAvatar(teacherDao.getUser(userInfo.getUserId().intValue())));
 
                 // 用户注册接入Token
                 tokenResult.setImToken(register.getImToken());
@@ -163,20 +171,27 @@ public class UserController {
 
                 String username = userInfo.getUsername();
                 List<String> userTypes = Lists.newArrayList(userInfo.getUserType().split(","));
-                if (userTypes.size() > 1 || userTypes.contains(ClientEnum.TEACHER.getCode())) {
+                if (userTypes.size() > 1
+                    || userTypes.contains(ClientEnum.TEACHER.getCode())
+                    || userTypes.contains(ClientEnum.SYSTEM.getCode())) {
                     username = Optional.ofNullable(userInfo.getRealName()).filter(StringUtils::isNotBlank).orElse(username);
                 }
 
-                try {
+                // 用户昵称
+                userModel.setName(username);
+                // 用户头像
+                userModel.setPortrait(sysUserService.getImAvatar(teacherDao.getUser(userInfo.getUserId().intValue())));
 
-                    ImGroupWrapper.ImUserInfo register = imGroupCoreService.register(userModel.getId(), "",
-                        username, Optional.ofNullable(userModel.getPortrait()).orElse(userInfo.getAvatar()));
+            }
 
-                    log.info("update IM_USER register: {}", JSONObject.toJSONString(register));
-                } catch (Exception e) {
-                    log.error("更新注册IM用户信息", e);
-                }
+            try {
 
+                ImGroupWrapper.ImUserInfo register = imGroupCoreService.register(userModel.getId(), "",
+                    userModel.getName(), userModel.getPortrait());
+
+                log.info("update IM_USER userId={}, username={} register: {}", userModel.getId(), userModel.getName(), JSONObject.toJSONString(register));
+            } catch (Exception e) {
+                log.error("更新注册IM用户信息", e);
             }
 
         } else {

+ 37 - 16
mec-im/src/main/java/com/ym/service/Impl/RoomServiceImpl.java

@@ -60,7 +60,6 @@ import org.joda.time.format.DateTimeFormat;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.data.redis.core.RedisTemplate;
 import org.springframework.stereotype.Service;
-import org.springframework.transaction.annotation.Isolation;
 import org.springframework.transaction.annotation.Propagation;
 import org.springframework.transaction.annotation.Transactional;
 
@@ -683,21 +682,8 @@ public class RoomServiceImpl implements RoomService {
                 log.info("createImGroup: roomId = {}, userId = {}", roomId, actualTeacherId);
                 if (TencentCloudRTCPlugin.PLUGIN_NAME.equals(pluginService.pluginName())) {
 
-                    // 群组帐号注册
-                    Teacher teacher = teacherDao.get(courseSchedule.getTeacherId());
-                    if (Objects.nonNull(teacher)) {
-                        try {
-                            pluginService.register(courseSchedule.getTeacherId().toString(), teacher.getRealName(), teacher.getAvatar());
-                        } catch (Exception e) {
-                            log.error("直播房间群主注册失败: userId={}", courseSchedule.getTeacherId(), e);
-                        }
-                    }
 
-                    // 生成群组
-                    pluginService.chatRoomCreate(roomId, courseSchedule.getName(), courseSchedule.getTeacherId().toString());
-
-                    // 更新群自定义字段
-                    updateChatRoomGroupData(roomId, courseSchedule, pluginService);
+                    createRtcGroup(courseSchedule.getId());
 
                     // 群组老师信息
                     List<ImGroupMemberWrapper.ImGroupMember> groupMembers = Lists.newArrayList(ImGroupMemberWrapper.ImGroupMember
@@ -742,6 +728,41 @@ public class RoomServiceImpl implements RoomService {
         }
     }
 
+    @Override
+    public void createRtcGroup(Long courseScheduleId) throws Exception {
+
+        CourseSchedule courseSchedule = courseScheduleDao.get(courseScheduleId);
+        if (Objects.isNull(courseSchedule)) {
+            log.warn("createRtcGroup courseSchedule is null: courseScheduleId = {}", courseScheduleId);
+            return;
+        }
+
+        RTCRoomPluginService pluginService = rtcRoomPluginContext.getPluginService(courseSchedule.getServiceProvider());
+        // 群组帐号注册
+        Teacher teacher = teacherDao.get(courseSchedule.getTeacherId());
+        if (Objects.nonNull(teacher)) {
+            try {
+                pluginService.register(courseSchedule.getTeacherId().toString(), teacher.getRealName(), teacher.getAvatar());
+            } catch (Exception e) {
+                log.error("直播房间群主注册失败: userId={}", courseSchedule.getTeacherId(), e);
+            }
+        }
+
+        //记录用户实际选择的房间
+        String roomId = courseSchedule.getId().toString();
+        if (courseSchedule.getGroupType() == GroupType.COMM) {
+            roomId = "I" + roomId;
+        } else {
+            roomId = "S" + roomId;
+        }
+
+        // 生成群组
+        pluginService.chatRoomCreate(roomId, courseSchedule.getName(), courseSchedule.getTeacherId().toString());
+
+        // 更新群自定义字段
+        updateChatRoomGroupData(roomId, courseSchedule, pluginService);
+    }
+
     /**
      * 更新群自定义字段
      * @param roomId 群ID
@@ -783,7 +804,7 @@ public class RoomServiceImpl implements RoomService {
         RTCRoomPluginService pluginService = rtcRoomPluginContext.getPluginService(serviceProvider);
         if (TencentCloudRTCPlugin.PLUGIN_NAME.equals(pluginService.pluginName())) {
             // 腾讯云群销毁
-            pluginService.chatRoomDestroy(roomId);
+//            pluginService.chatRoomDestroy(roomId);
         } else {
             // 融云群销毁
             // 销毁群组

+ 2 - 0
mec-im/src/main/java/com/ym/service/RoomService.java

@@ -112,6 +112,8 @@ public interface RoomService {
      */
     void adjustMusicScore(MusicScoreData musicScoreData) throws Exception;
 
+    void createRtcGroup(Long courseScheduleId) throws Exception;
+
     /**
      * 移动端用户加入房间失败
      * @author zouxuan

+ 1 - 1
mec-im/src/main/resources/bootstrap-prod.properties

@@ -3,7 +3,7 @@
 #\u670d\u52a1\u5668\u5730\u5740
 spring.cloud.nacos.config.server-addr=10.206.0.12:8848
 #\u9ed8\u8ba4\u4e3aPublic\u547d\u540d\u7a7a\u95f4,\u53ef\u4ee5\u7701\u7565\u4e0d\u5199
-spring.cloud.nacos.config.namespace=f40a7594-4bd0-4bc6-8397-9353c6d2e63a
+spring.cloud.nacos.config.namespace=b7aee20b-41e8-43d8-8e2d-45b6447f66ae
 #\u6307\u5b9a\u914d\u7f6e\u7fa4\u7ec4 --\u5982\u679c\u662fPublic\u547d\u540d\u7a7a\u95f4 \u5219\u53ef\u4ee5\u7701\u7565\u7fa4\u7ec4\u914d\u7f6e
 spring.cloud.nacos.config.group=DEFAULT_GROUP
 #\u6587\u4ef6\u540d -- \u5982\u679c\u6ca1\u6709\u914d\u7f6e\u5219\u9ed8\u8ba4\u4e3a ${spring.appliction.name}

+ 1 - 1
mec-mall/mall-admin/src/main/resources/bootstrap-prod.yml

@@ -3,7 +3,7 @@ spring:
     nacos:
       config:
         server-addr: 10.206.0.12:8848
-        namespace: f40a7594-4bd0-4bc6-8397-9353c6d2e63a
+        namespace: b7aee20b-41e8-43d8-8e2d-45b6447f66ae
         group: DEFAULT_GROUP
         prefix: mall-admin
         file-extension: yaml

+ 1 - 1
mec-mall/mall-portal/src/main/resources/bootstrap-prod.yml

@@ -3,7 +3,7 @@ spring:
     nacos:
       config:
         server-addr: 10.206.0.12:8848
-        namespace: f40a7594-4bd0-4bc6-8397-9353c6d2e63a
+        namespace: b7aee20b-41e8-43d8-8e2d-45b6447f66ae
         group: DEFAULT_GROUP
         prefix: mall-portal
         file-extension: yaml

+ 0 - 0
mec-monitor/src/main/resources/bootstrap-prod.properties


+ 0 - 0
mec-student/src/main/resources/bootstrap-prod.properties


+ 1 - 1
mec-task/src/main/resources/bootstrap-prod.properties

@@ -3,7 +3,7 @@
 #\u670d\u52a1\u5668\u5730\u5740
 spring.cloud.nacos.config.server-addr=10.206.0.12:8848
 #\u9ed8\u8ba4\u4e3aPublic\u547d\u540d\u7a7a\u95f4,\u53ef\u4ee5\u7701\u7565\u4e0d\u5199
-spring.cloud.nacos.config.namespace=f40a7594-4bd0-4bc6-8397-9353c6d2e63a
+spring.cloud.nacos.config.namespace=b7aee20b-41e8-43d8-8e2d-45b6447f66ae
 #\u6307\u5b9a\u914d\u7f6e\u7fa4\u7ec4 --\u5982\u679c\u662fPublic\u547d\u540d\u7a7a\u95f4 \u5219\u53ef\u4ee5\u7701\u7565\u7fa4\u7ec4\u914d\u7f6e
 spring.cloud.nacos.config.group=DEFAULT_GROUP
 #\u6587\u4ef6\u540d -- \u5982\u679c\u6ca1\u6709\u914d\u7f6e\u5219\u9ed8\u8ba4\u4e3a ${spring.appliction.name}

+ 0 - 0
mec-teacher/src/main/resources/bootstrap-prod.properties


+ 0 - 0
mec-web/src/main/java/com/ym/mec/web/controller/PhotoAlbumController.java


+ 0 - 0
mec-web/src/main/java/com/ym/mec/web/controller/education/EduPhotoAlbumController.java


+ 0 - 0
mec-web/src/main/resources/bootstrap-prod.properties


+ 1 - 1
mec-websocket/src/main/resources/bootstrap-prod.properties

@@ -3,7 +3,7 @@
 #\u670d\u52a1\u5668\u5730\u5740
 spring.cloud.nacos.config.server-addr=10.206.0.12:8848
 #\u9ed8\u8ba4\u4e3aPublic\u547d\u540d\u7a7a\u95f4,\u53ef\u4ee5\u7701\u7565\u4e0d\u5199
-spring.cloud.nacos.config.namespace=f40a7594-4bd0-4bc6-8397-9353c6d2e63a
+spring.cloud.nacos.config.namespace=b7aee20b-41e8-43d8-8e2d-45b6447f66ae
 #\u6307\u5b9a\u914d\u7f6e\u7fa4\u7ec4 --\u5982\u679c\u662fPublic\u547d\u540d\u7a7a\u95f4 \u5219\u53ef\u4ee5\u7701\u7565\u7fa4\u7ec4\u914d\u7f6e
 spring.cloud.nacos.config.group=DEFAULT_GROUP
 #\u6587\u4ef6\u540d -- \u5982\u679c\u6ca1\u6709\u914d\u7f6e\u5219\u9ed8\u8ba4\u4e3a ${spring.appliction.name}

+ 0 - 0
mec-zipkin/src/main/resources/bootstrap-prod.properties


+ 1 - 1
pom.xml

@@ -20,7 +20,7 @@
 		<spring-cloud.version>Greenwich.RELEASE</spring-cloud.version>
 		<zipkin.version>2.12.2</zipkin.version>
 		<google.zxing.version>3.4.0</google.zxing.version>
-
+		<redisson.version>3.16.4</redisson.version>
 		<maven.test.skip>true</maven.test.skip>
 	</properties>
 

Some files were not shown because too many files changed in this diff