Browse Source

Merge branch 'zx_1020_redis' of http://git.dayaedu.com/yonge/mec into test

# Conflicts:
#	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
zouxuan 2 years ago
parent
commit
a4af7577de
24 changed files with 530 additions and 201 deletions
  1. 3 2
      audio-analysis/src/main/java/com/yonge/netty/dto/HardLevelEnum.java
  2. 4 0
      audio-analysis/src/main/java/com/yonge/netty/dto/UserChannelContext.java
  3. 1 1
      audio-analysis/src/main/resources/bootstrap-prod.properties
  4. 1 1
      cms/src/main/resources/bootstrap-prod.properties
  5. 20 1
      mec-application/src/main/java/com/ym/mec/student/controller/ActivityController.java
  6. 173 64
      mec-application/src/main/java/com/ym/mec/web/controller/ImHistoryMessageController.java
  7. 4 4
      mec-application/src/main/resources/bootstrap-prod.properties
  8. 108 60
      mec-application/src/main/resources/logback-spring.xml
  9. 1 1
      mec-auth/mec-auth-server/src/main/resources/bootstrap-prod.properties
  10. 0 1
      mec-biz/src/main/java/com/ym/mec/biz/dal/page/StudentCompetitionQueryInfo.java
  11. 2 5
      mec-biz/src/main/java/com/ym/mec/biz/service/ImGroupService.java
  12. 169 39
      mec-biz/src/main/java/com/ym/mec/biz/service/impl/ImGroupServiceImpl.java
  13. 4 1
      mec-biz/src/main/java/com/ym/mec/biz/service/impl/VipGroupServiceImpl.java
  14. 4 2
      mec-biz/src/main/resources/config/mybatis/CourseScheduleMapper.xml
  15. 3 0
      mec-common/audit-log/src/main/java/com/yonge/log/dal/model/HistoryMessage.java
  16. 5 4
      mec-common/audit-log/src/main/java/com/yonge/log/service/HistoryMessageService.java
  17. 21 8
      mec-common/audit-log/src/main/java/com/yonge/log/service/impl/HistoryMessageServiceImpl.java
  18. 1 1
      mec-eureka/src/main/resources/bootstrap-prod.properties
  19. 1 1
      mec-gateway/mec-gateway-web/src/main/resources/bootstrap-prod.properties
  20. 1 1
      mec-im/src/main/resources/bootstrap-prod.properties
  21. 1 1
      mec-mall/mall-admin/src/main/resources/bootstrap-prod.yml
  22. 1 1
      mec-mall/mall-portal/src/main/resources/bootstrap-prod.yml
  23. 1 1
      mec-task/src/main/resources/bootstrap-prod.properties
  24. 1 1
      mec-websocket/src/main/resources/bootstrap-prod.properties

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

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

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

@@ -1,6 +1,7 @@
 package com.ym.mec.student.controller;
 
 import com.alibaba.fastjson.JSONArray;
+import com.alibaba.fastjson.JSONObject;
 import com.ym.mec.auth.api.entity.SysUser;
 import com.ym.mec.biz.dal.dao.StudentDao;
 import com.ym.mec.biz.dal.dao.StudentPaymentOrderDao;
@@ -109,7 +110,7 @@ public class ActivityController extends BaseController {
         return succeed(resultMap);
     }
 
-    @ApiOperation("获取2022云教练活动列表")
+/*    @ApiOperation("获取2022云教练活动列表")
     @PostMapping(value = "/queryActivity")
     @AuditLogAnnotation(operateName = "获取2022云教练活动列表")
     public HttpResponseResult<List<VipGroupActivity>> queryActivity(){
@@ -117,6 +118,24 @@ public class ActivityController extends BaseController {
         List<Cloud2022ActivityDto> cloud2022ActivityDtos = JSONArray.parseArray(configValue, Cloud2022ActivityDto.class);
         String collect = cloud2022ActivityDtos.stream().map(e -> e.getActivityId()).collect(Collectors.joining(","));
         return succeed(vipGroupActivityService.getDao().queryByIds(collect));
+    }*/
+
+    @ApiOperation("获取2023乐理直播活动列表")
+    @PostMapping(value = "/queryTheoryLiveActivity")
+    @AuditLogAnnotation(operateName = "获取2023乐理直播活动列表")
+    public HttpResponseResult<List<VipGroupActivity>> queryTheoryLiveActivity(){
+        String configValue = sysConfigDao.findConfigValue("2023_double_eleven_active_config");
+        JSONObject jsonObject = JSONObject.parseObject(configValue);
+        String theoryLive = jsonObject.getString("theoryLive");
+        return succeed(vipGroupActivityService.getDao().queryByIds(theoryLive));
+    }
+    @ApiOperation("获取2023商品列表")
+    @PostMapping(value = "/queryGoodsActivity")
+    @AuditLogAnnotation(operateName = "获取2023商品列表")
+    public HttpResponseResult<JSONObject> queryGoodsActivity(){
+        String configValue = sysConfigDao.findConfigValue("2023_double_eleven_active_config");
+        JSONObject jsonObject = JSONObject.parseObject(configValue);
+        return succeed(jsonObject.getJSONObject("musical"));
     }
 
     @ApiOperation(value = "学员已购买的双十一活动信息")

+ 173 - 64
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,18 @@ 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.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 +35,194 @@ 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个线程的无界线程池
+            ExecutorService executorService = Executors.newFixedThreadPool(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());
+                    // 根据 groupId 分组
+                    Map<String, List<HistoryMessage>> map = footer.stream().collect(Collectors.groupingBy(HistoryMessage::getGroupId));
+
+                    List<Future<?>> list = new ArrayList<>();
+                    for (Map.Entry<String, List<HistoryMessage>> entry : map.entrySet()) {
+                        String k = entry.getKey();
+                        List<HistoryMessage> v = entry.getValue();
+
+                        list.add(executorService.submit(() -> {
+                            try {
+                                imGroupService.importInfo(v);
+                            } catch (Exception e) {
+
+                                log.error("群聊导入失败",e);
+                            }
+
+                        }));
+                    }
+                    for (Future<?> future : list) {
+                        try {
+                            future.get();
+                        } catch (Exception e){
+                            log.error("群聊导入失败",e);
+                        }
+                    }
+                } catch (Exception e) {
+                    log.error("IM导入失败",e);
+                }
+                log.info("已导入:" + (i + 1) * size);
+            }
+            executorService.shutdown();
+        });
+    }
+
 
+    @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 {
 
-        // 删除旧数据
+        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(1,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("历史聊天记录查询")

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

@@ -1,12 +1,12 @@
-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
 spring.cloud.nacos.config.enabled=true
-logging.config=classpath:logback-dev.xml
+logging.config=classpath:logback-spring.xml

+ 108 - 60
mec-application/src/main/resources/logback-spring.xml

@@ -1,63 +1,111 @@
 <?xml version="1.0" encoding="UTF-8"?>
 <configuration scan="true" scanPeriod="10 seconds">
 
-	<property name="LOG_HOME" value="/mdata/logs/gateway-%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" />
-
-	<!--本地环境:打印控制台 -->
-	<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="prod">
-		<root level="WARN">
-			<appender-ref ref="stdout" />
-			<appender-ref ref="file" />
-		</root>
-	</springProfile>
-
-</configuration>
+    <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>

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

+ 0 - 1
mec-biz/src/main/java/com/ym/mec/biz/dal/page/StudentCompetitionQueryInfo.java

@@ -1,6 +1,5 @@
 package com.ym.mec.biz.dal.page;
 
-import com.sun.org.apache.xpath.internal.operations.Bool;
 import com.ym.mec.common.page.QueryInfo;
 import io.swagger.annotations.ApiModelProperty;
 

+ 2 - 5
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;
@@ -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腾讯云

+ 169 - 39
mec-biz/src/main/java/com/ym/mec/biz/service/impl/ImGroupServiceImpl.java

@@ -12,7 +12,6 @@ import com.microsvc.toolkit.middleware.im.message.GroupMemberWrapper;
 import com.microsvc.toolkit.middleware.im.message.MessageWrapper;
 import com.microsvc.toolkit.middleware.im.message.TencentRequest;
 import com.ym.mec.auth.api.entity.SysUser;
-import com.ym.mec.auth.api.enums.SysUserType;
 import com.ym.mec.biz.dal.dao.ClassGroupTeacherMapperDao;
 import com.ym.mec.biz.dal.dao.ImGroupDao;
 import com.ym.mec.biz.dal.dao.ImGroupMemberDao;
@@ -78,6 +77,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;
 
@@ -891,6 +891,9 @@ public class ImGroupServiceImpl extends BaseServiceImpl<String, ImGroup> impleme
      */
     @Override
     public void groupTransfer(String startTime, String endTime) {
+
+        // 100个线程的无界线程池
+        ExecutorService executorService = Executors.newFixedThreadPool(100);
         int page = 1;
         int size = 100;
         QueryInfo queryInfo = new QueryInfo();
@@ -924,30 +927,62 @@ public class ImGroupServiceImpl extends BaseServiceImpl<String, ImGroup> impleme
             } catch (ParseException e) {
                 throw new BizException("时间区间参数错误,格式为:yyyy-MM-dd");
             }
-            groupTransfer(rows);
+            List<Future<?>> list = new ArrayList<>();
+
+            rows.forEach(imGroup -> {
+
+                list.add(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);
+                    }
+                }));
+            });
+            for (Future<?> future : list) {
+                try {
+                    future.get();
+                } catch (Exception e){
+                    log.error("群销毁失败",e);
+                }
+            }
+
+            try {
+                Thread.sleep(1500);
+            } catch (InterruptedException e) {
+                log.error("线程休眠失败",e);
+            }
+
+
+            list.clear();
+            for (ImGroup row : rows) {
+                list.add(executorService.submit(() -> {
+                    groupTransfer(Lists.newArrayList(row));
+                }));
+            }
+
+            for (Future<?> future : list) {
+                try {
+                    future.get();
+                } catch (Exception e){
+                    log.error("群迁移失败",e);
+                }
+            }
             importImGroupCount += rows.size();
             log.info("------------------------------- import im group --------------------------------------------");
             log.info("import im group success count:{}/{}", importImGroupCount, total);
         }
         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();
@@ -967,29 +1002,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();
@@ -998,6 +1048,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 {
@@ -1011,14 +1064,14 @@ public class ImGroupServiceImpl extends BaseServiceImpl<String, ImGroup> impleme
                 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;
         }
@@ -1039,6 +1092,7 @@ public class ImGroupServiceImpl extends BaseServiceImpl<String, ImGroup> impleme
 //            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);
         }
     }
@@ -1064,12 +1118,21 @@ 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) {
@@ -1077,8 +1140,17 @@ public class ImGroupServiceImpl extends BaseServiceImpl<String, ImGroup> impleme
                 if (StringUtils.isEmpty(avatar)) {
                     avatar = studentAvatar.getParanValue();
                 }
-                register(next[0], next[1], avatar);
+                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++;
@@ -1090,15 +1162,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) {
                 String avatar = next[2];
                 if (StringUtils.isEmpty(avatar)) {
                     avatar = staffAvatar.getParanValue();
                 }
-                register(next[0], next[1], avatar);
+                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++;
@@ -1117,7 +1202,15 @@ public class ImGroupServiceImpl extends BaseServiceImpl<String, ImGroup> impleme
                 if (StringUtils.isEmpty(avatar)) {
                     avatar = empAvatar.getParanValue();
                 }
-                register(next[0], next[1], avatar);
+                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);
@@ -1136,7 +1229,15 @@ public class ImGroupServiceImpl extends BaseServiceImpl<String, ImGroup> impleme
                 if (StringUtils.isEmpty(avatar)) {
                     avatar = teacherAvatar.getParanValue();
                 }
-                register(next[0], next[1], avatar);
+                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);
@@ -1144,12 +1245,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;
     }
 
@@ -1211,8 +1321,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;
     }
@@ -1226,7 +1336,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) {
@@ -1262,8 +1372,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");
@@ -1271,7 +1394,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();
                     }
@@ -1316,7 +1445,8 @@ public class ImGroupServiceImpl extends BaseServiceImpl<String, ImGroup> impleme
                         imPluginContext.getPluginService().importPrivateMessage(privateImportMessage);
                         //为已导入数据更改标识
                         updateStatus(i,1);
-                        log.info("导入私聊消息成功:{}", i);
+                        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);
@@ -1393,7 +1523,7 @@ public class ImGroupServiceImpl extends BaseServiceImpl<String, ImGroup> impleme
                         imPluginContext.getPluginService().importGroupMessage(groupImportMessage);
                         //为已导入数据更改标识
                         updateStatus(i,1);
-                        log.info("导入消息成功:{}", i);
+                        log.info("导入消息成功");
                     } catch (Exception e) {
                         updateStatus(i,2);
                         log.error("导入群组IM消息失败 msg:{},entity:{}", list, i, e);
@@ -1559,7 +1689,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);

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

@@ -694,6 +694,9 @@ public class VipGroupServiceImpl extends BaseServiceImpl<Long, VipGroup> impleme
         classGroup.setTotalClassTimes(totalClassTimes);
         classGroup.setType(ClassGroupTypeEnum.valueOf(groupType));
         classGroup.setDelFlag(1);
+        if(StringUtils.equals(vipGroupApplyBaseInfoDto.getGroupType(),"LIVE")){
+            classGroup.setDelFlag(0);
+        }
         classGroup.setGroupType(GroupType.valueOf(groupType));
         classGroup.setMusicGroupId(vipGroupApplyBaseInfoDto.getId().toString());
         classGroup.setCreateTime(now);
@@ -2768,7 +2771,7 @@ public class VipGroupServiceImpl extends BaseServiceImpl<Long, VipGroup> impleme
                 studentPaymentOrder.setUpdateTime(date);
                 studentPaymentOrder.setOrganId(user.getOrganId());
                 studentPaymentOrder.setRoutingOrganId(user.getOrganId());
-
+                studentPaymentOrder.setPayTime(date);
                 this.orderCallback(studentPaymentOrder);
 
                 sysUserCashAccountService.updateBalance(userId, amount.negate(), PlatformCashAccountDetailTypeEnum.PAY_FEE, groupType.getDesc() + "购买");

+ 4 - 2
mec-biz/src/main/resources/config/mybatis/CourseScheduleMapper.xml

@@ -1844,7 +1844,9 @@
         LEFT JOIN vip_group vg ON vg.id_ = cgsm.music_group_id_ AND cgsm.group_type_ IN ('VIP', 'LIVE') AND vg.group_status_!=7
         LEFT JOIN practice_group pg ON pg.id_ = cgsm.music_group_id_ AND cgsm.group_type_ = 'PRACTICE'
         WHERE cgsm.user_id_ = #{userId} AND cgsm.status_ != 'QUIT'
-        AND (mg.status_ = 'PROGRESS' OR vg.group_status_ = 2 OR vg.group_status_ = 4 OR (pg.id_ IS NOT NULL AND
+        AND (mg.status_ = 'PROGRESS' OR vg.group_status_ = 2 OR vg.group_status_ = 4
+        OR (vg.group_type_ = 'LIVE' AND vg.group_status_ IN (1,2,4,5))
+        OR (pg.id_ IS NOT NULL AND
         pg.group_status_!='LOCK' AND pg.group_status_!='CANCEL'))
         ORDER BY cgsm.music_group_id_
         <include refid="global.limit"/>
@@ -1866,7 +1868,7 @@
         LEFT JOIN class_group cg ON cgsm.class_group_id_ = cg.id_
         WHERE spo.type_ != 'OTHER' AND spo.music_group_id_ IS NOT NULL
         AND spo.user_id_ = #{userId} AND spo.status_='SUCCESS' AND cgsm.status_ != 'QUIT'
-        AND IF(spo.group_type_ = 'VIP', (vg.group_status_ = 4 OR vg.group_status_ = 3 ),0)=0 AND cg.del_flag_ = 0
+        AND IF(spo.group_type_ = 'VIP', (vg.group_status_ = 4 OR vg.group_status_ = 3 ),0) = 0 AND cg.del_flag_ = 0
         <include refid="global.limit"/>
     </select>
 

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

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

+ 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

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

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