刘俊驰 пре 1 година
родитељ
комит
bf23c77890
26 измењених фајлова са 522 додато и 35 уклоњено
  1. 15 4
      mec-application/src/main/java/com/ym/mec/student/controller/ImGroupController.java
  2. 15 4
      mec-application/src/main/java/com/ym/mec/teacher/controller/ImGroupController.java
  3. 10 0
      mec-application/src/main/java/com/ym/mec/teacher/controller/TeacherImLiveBroadcastRoomController.java
  4. 1 0
      mec-application/src/main/java/com/ym/mec/teacher/controller/TeacherImLiveBroadcastRoomMemberController.java
  5. 16 4
      mec-application/src/main/java/com/ym/mec/web/controller/ImGroupController.java
  6. 7 0
      mec-application/src/main/java/com/ym/mec/web/controller/ImLiveBroadcastRoomController.java
  7. 1 0
      mec-application/src/main/java/com/ym/mec/web/controller/ImLiveBroadcastRoomMemberController.java
  8. 32 0
      mec-application/src/main/java/com/ym/mec/web/controller/open/OpenLiveController.java
  9. 12 0
      mec-biz/src/main/java/com/mec/redisson/RedissonTopicListener.java
  10. 18 2
      mec-biz/src/main/java/com/ym/mec/biz/dal/dto/ImUserFriendDto.java
  11. 11 0
      mec-biz/src/main/java/com/ym/mec/biz/dal/vo/ImLiveBroadcastRoomMemberVo.java
  12. 18 0
      mec-biz/src/main/java/com/ym/mec/biz/dal/wrapper/LiveRoomWrapper.java
  13. 3 3
      mec-biz/src/main/java/com/ym/mec/biz/redisson/RedissonMessageService.java
  14. 8 4
      mec-biz/src/main/java/com/ym/mec/biz/service/ImLiveBroadcastRoomService.java
  15. 7 0
      mec-biz/src/main/java/com/ym/mec/biz/service/ImUserFriendService.java
  16. 46 3
      mec-biz/src/main/java/com/ym/mec/biz/service/impl/ImLiveBroadcastRoomMemberServiceImpl.java
  17. 62 8
      mec-biz/src/main/java/com/ym/mec/biz/service/impl/ImLiveBroadcastRoomServiceImpl.java
  18. 37 0
      mec-biz/src/main/java/com/ym/mec/biz/service/impl/ImUserFriendServiceImpl.java
  19. 3 0
      mec-biz/src/main/java/com/ym/mec/biz/service/impl/VipGroupServiceImpl.java
  20. 42 0
      mec-client-api/src/main/java/com/ym/mec/dto/LiveRoomStatus.java
  21. 64 0
      mec-client-api/src/main/java/com/ym/mec/dto/RoomMember.java
  22. 19 0
      mec-client-api/src/main/java/com/ym/mec/dto/RoomMemberNumDto.java
  23. 42 0
      mec-client-api/src/main/java/com/ym/mec/web/KLXFeignService.java
  24. 30 0
      mec-client-api/src/main/java/com/ym/mec/web/fallback/KLXFeignServiceFallback.java
  25. 1 1
      mec-eureka/src/main/resources/bootstrap-dev.properties
  26. 2 2
      pom.xml

+ 15 - 4
mec-application/src/main/java/com/ym/mec/student/controller/ImGroupController.java

@@ -125,11 +125,22 @@ public class ImGroupController extends BaseController {
 
 	@ApiOperation("查询好友详情")
 	@GetMapping(value = "/queryFriendDetail")
-	public Object queryFriendDetail(Integer userId) {
-		ImUserFriendDto dto = imUserFriendService.queryFriendDetail(sysUserService.getUserId(), userId);
+	public Object queryFriendDetail(String userId) {
+
+		// 管乐迷、酷乐秀直播播允许多端学生观看,这里增加了对用户ID的解析
+		if (StringUtils.isNotEmpty(userId) && !userId.matches("^\\d+$")) {
+			// 用户IM编号非整数,属于酷乐秀用户
+			ImUserFriendDto userProfile = imUserFriendService.getImUserProfile(userId);
+			if (Objects.isNull(userProfile)) {
+				return failed("当前好友不存在");
+			}
+			return succeed(userProfile);
+		}
+
+		ImUserFriendDto dto = imUserFriendService.queryFriendDetail(sysUserService.getUserId(), Integer.parseInt(userId));
 		if (dto == null) {
 			dto = new ImUserFriendDto();
-			SysUser user = sysUserService.queryUserById(userId);
+			SysUser user = sysUserService.queryUserById(Integer.parseInt(userId));
 			dto.setFriend(user);
 
 			List<String> userTypes = Lists.newArrayList(user.getUserType().split(","));
@@ -143,7 +154,7 @@ public class ImGroupController extends BaseController {
 			} else {
 				dto.setFriendNickname(user.getRealName());
 			}
-			dto.setFriendId(userId);
+			dto.setFriendId(Integer.parseInt(userId));
 		}
 		return succeed(dto);
 	}

+ 15 - 4
mec-application/src/main/java/com/ym/mec/teacher/controller/ImGroupController.java

@@ -186,11 +186,22 @@ public class ImGroupController extends BaseController {
 
 	@ApiOperation("查询好友详情")
 	@GetMapping(value = "/queryFriendDetail")
-	public HttpResponseResult<ImUserFriendDto> queryFriendDetail(Integer userId) {
-		ImUserFriendDto dto = imUserFriendService.queryFriendDetail(sysUserService.getUserId(), userId);
+	public HttpResponseResult<ImUserFriendDto> queryFriendDetail(String userId) {
+
+		// 管乐迷、酷乐秀直播播允许多端学生观看,这里增加了对用户ID的解析
+		if (StringUtils.isNotEmpty(userId) && !userId.matches("^\\d+$")) {
+			// 用户IM编号非整数,属于酷乐秀用户
+			ImUserFriendDto userProfile = imUserFriendService.getImUserProfile(userId);
+			if (Objects.isNull(userProfile)) {
+				return failed("当前好友不存在");
+			}
+			return succeed(userProfile);
+		}
+
+		ImUserFriendDto dto = imUserFriendService.queryFriendDetail(sysUserService.getUserId(), Integer.parseInt(userId));
 		if (dto == null) {
 			dto = new ImUserFriendDto();
-			SysUser user = sysUserService.queryUserById(userId);
+			SysUser user = sysUserService.queryUserById(Integer.parseInt(userId));
 			dto.setFriend(user);
 
 			List<String> userTypes = Lists.newArrayList(user.getUserType().split(","));
@@ -204,7 +215,7 @@ public class ImGroupController extends BaseController {
 			} else {
 				dto.setFriendNickname(user.getRealName());
 			}
-			dto.setFriendId(userId);
+			dto.setFriendId(Integer.parseInt(userId));
 		}
 		return succeed(dto);
 	}

+ 10 - 0
mec-application/src/main/java/com/ym/mec/teacher/controller/TeacherImLiveBroadcastRoomController.java

@@ -5,6 +5,7 @@ import com.ym.mec.biz.dal.dto.LiveRoomStatus;
 import com.ym.mec.biz.dal.dto.RoomReservationUserSearch;
 import com.ym.mec.biz.dal.page.LiveRoomGoodsOrderQueryInfo;
 import com.ym.mec.biz.dal.vo.*;
+import com.ym.mec.biz.dal.wrapper.LiveRoomWrapper;
 import com.ym.mec.biz.service.ImLiveBroadcastRoomMemberService;
 import com.ym.mec.biz.service.ImLiveBroadcastRoomService;
 import com.ym.mec.common.controller.BaseController;
@@ -196,5 +197,14 @@ public class TeacherImLiveBroadcastRoomController extends BaseController {
         // 直播间推流状态查询
         return succeed(imLiveBroadcastRoomService.roomLiveStreamStatus(roomUid));
     }
+
+
+
+    @ApiOperation("查询房间人数")
+    @GetMapping("/queryRoomMemberCount")
+    public HttpResponseResult<LiveRoomWrapper.LiveRoomCount> queryRoomMemberCount(String roomUid) {
+        return succeed(imLiveBroadcastRoomService.queryRoomMemberCount(roomUid));
+    }
+
 }
 

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

@@ -50,6 +50,7 @@ public class TeacherImLiveBroadcastRoomMemberController extends BaseController {
             @ApiImplicitParam(name = "whetherMicStatus", dataType = "String", value = "连麦状态 0:未申请1:申请连麦中2:连麦中"),
             @ApiImplicitParam(name = "page", dataType = "Integer", value = "页数"),
             @ApiImplicitParam(name = "rows", dataType = "Integer", value = "每页数量"),
+        @ApiImplicitParam(name = "klxFlag", dataType = "Integer", value = "0:不查询酷乐秀数据,1:查询酷乐秀数据"),
     })
     @ApiOperation("分页查询直播间人员列表")
     @PostMapping("/queryRoomMember")

+ 16 - 4
mec-application/src/main/java/com/ym/mec/web/controller/ImGroupController.java

@@ -1,5 +1,6 @@
 package com.ym.mec.web.controller;
 
+import com.alibaba.fastjson.JSON;
 import com.google.common.collect.Lists;
 import com.ym.mec.auth.api.entity.SysUser;
 import com.ym.mec.biz.dal.dto.ImGroupDto;
@@ -162,12 +163,23 @@ public class ImGroupController extends BaseController {
 
 	@ApiOperation("查询好友详情")
 	@GetMapping(value = "/queryFriendDetail")
-	public HttpResponseResult<ImUserFriendDto> queryFriendDetail(Integer userId) {
+	public HttpResponseResult<ImUserFriendDto> queryFriendDetail(String userId) {
+
+		// 管乐迷、酷乐秀直播播允许多端学生观看,这里增加了对用户ID的解析
+		if (StringUtils.isNotEmpty(userId) && !userId.matches("^\\d+$")) {
+			// 用户IM编号非整数,属于酷乐秀用户
+			ImUserFriendDto userProfile = imUserFriendService.getImUserProfile(userId);
+			if (Objects.isNull(userProfile)) {
+				return failed("当前好友不存在");
+			}
+			return succeed(userProfile);
+		}
+
 		Integer currentUserId = sysUserService.getUserId();
-		ImUserFriendDto dto = imUserFriendService.queryFriendDetail(currentUserId, userId);
+		ImUserFriendDto dto = imUserFriendService.queryFriendDetail(currentUserId, Integer.parseInt(userId));
 		if (dto == null) {
 			dto = new ImUserFriendDto();
-			SysUser user = sysUserService.queryUserById(userId);
+			SysUser user = sysUserService.queryUserById(Integer.parseInt(userId));
 			dto.setFriend(user);
 			//这里由原来的优先取老师的realName改成了优先取学员的username,
 			// 因为管理员在修改通讯录备注的时候,如果是多角色,优先改的是学员的username
@@ -182,7 +194,7 @@ public class ImGroupController extends BaseController {
 			} else {
 				dto.setFriendNickname(user.getRealName());
 			}
-			dto.setFriendId(userId);
+			dto.setFriendId(Integer.parseInt(userId));
 		}
 		return succeed(dto);
 	}

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

@@ -11,6 +11,7 @@ import com.ym.mec.biz.dal.vo.BaseRoomUserVo;
 import com.ym.mec.biz.dal.vo.ImLiveBroadcastRoomVo;
 import com.ym.mec.biz.dal.vo.LiveRoomGoodsOrderVo;
 import com.ym.mec.biz.dal.vo.RoomReservationUserVo;
+import com.ym.mec.biz.dal.wrapper.LiveRoomWrapper;
 import com.ym.mec.biz.service.ImLiveBroadcastRoomService;
 import com.ym.mec.common.controller.BaseController;
 import com.ym.mec.common.entity.HttpResponseResult;
@@ -325,5 +326,11 @@ public class ImLiveBroadcastRoomController extends BaseController {
         return succeed(chatRoomGroupDefinedData);
     }
 
+
+    @ApiOperation("查询房间人数")
+    @GetMapping("/queryRoomMemberCount")
+    public HttpResponseResult<LiveRoomWrapper.LiveRoomCount> queryRoomMemberCount(String roomUid) {
+        return succeed(imLiveBroadcastRoomService.queryRoomMemberCount(roomUid));
+    }
 }
 

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

@@ -52,6 +52,7 @@ public class ImLiveBroadcastRoomMemberController extends BaseController {
             @ApiImplicitParam(name = "visitorQuery", dataType = "Integer", value = "游客查询 0:学员 1:游客"),
             @ApiImplicitParam(name = "page", dataType = "Integer", value = "页数"),
             @ApiImplicitParam(name = "rows", dataType = "Integer", value = "每页数量"),
+            @ApiImplicitParam(name = "klxFlag", dataType = "Integer", value = "0:不查询酷乐秀数据,1:查询酷乐秀数据"),
     })
     @ApiOperation("分页查询直播间人员列表")
     @PostMapping("/queryRoomMember")

+ 32 - 0
mec-application/src/main/java/com/ym/mec/web/controller/open/OpenLiveController.java

@@ -0,0 +1,32 @@
+package com.ym.mec.web.controller.open;
+
+import com.ym.mec.biz.dal.dto.RoomMemberNumDto;
+import com.ym.mec.biz.service.ImLiveBroadcastRoomMemberService;
+import com.ym.mec.biz.service.ImLiveBroadcastRoomService;
+import com.ym.mec.common.controller.BaseController;
+import com.ym.mec.common.entity.HttpResponseResult;
+import io.swagger.annotations.ApiImplicitParam;
+import io.swagger.annotations.ApiImplicitParams;
+import io.swagger.annotations.ApiOperation;
+import io.swagger.annotations.ApiParam;
+import lombok.extern.slf4j.Slf4j;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.web.bind.annotation.*;
+
+import java.util.List;
+import java.util.Map;
+
+@RestController
+@RequestMapping("${app-config.url.web:}/open/live")
+@Slf4j
+public class OpenLiveController extends BaseController {
+
+    @Autowired
+    private ImLiveBroadcastRoomService imLiveBroadcastRoomService;
+
+    @ApiOperation("查询房间人数")
+    @GetMapping("/queryRoomInfo")
+    public HttpResponseResult<RoomMemberNumDto> queryRoomInfo(@ApiParam(value = "房间uid", required = true) String roomUid) {
+        return succeed(imLiveBroadcastRoomService.getRoomMemberNumDto(roomUid));
+    }
+}

+ 12 - 0
mec-biz/src/main/java/com/mec/redisson/RedissonTopicListener.java

@@ -3,6 +3,9 @@ package com.mec.redisson;
 import com.ym.mec.biz.dal.vo.ImLiveBroadcastRoomVo;
 import com.ym.mec.biz.redisson.RedissonMessageService;
 import com.ym.mec.biz.service.ImLiveBroadcastRoomService;
+import com.ym.mec.common.entity.HttpResponseResult;
+import com.ym.mec.dto.RoomMemberNumDto;
+import com.ym.mec.web.KLXFeignService;
 import lombok.extern.slf4j.Slf4j;
 import org.redisson.api.RBucket;
 import org.redisson.api.RLock;
@@ -30,6 +33,9 @@ public class RedissonTopicListener implements ApplicationRunner, Ordered {
 
     @Autowired
     private ImLiveBroadcastRoomService imLiveBroadcastRoomService;
+
+    @Autowired
+    private KLXFeignService klxFeignService;
  
     @Override
     public void run(ApplicationArguments args) {
@@ -60,6 +66,12 @@ public class RedissonTopicListener implements ApplicationRunner, Ordered {
                             return;
                         }
                         try {
+                            HttpResponseResult<RoomMemberNumDto> queriedRoomInfo =
+                                klxFeignService.queryRoomInfo(message);
+                            if(queriedRoomInfo.getStatus()){
+                                imLiveBroadcastRoomVo.setLookNum(queriedRoomInfo.getData().getOnlineNum() + imLiveBroadcastRoomVo.getLookNum());
+                                imLiveBroadcastRoomVo.setTotalLookNum(queriedRoomInfo.getData().getTotalNum() + imLiveBroadcastRoomVo.getTotalLookNum());
+                            }
                             imLiveBroadcastRoomService.setGroupMemberDefinedData(imLiveBroadcastRoomVo,imLiveBroadcastRoomVo.getLookNum(),imLiveBroadcastRoomVo.getTotalLookNum());
                         } catch (Exception e) {
                             log.error("RedissonMessageService subscribe setGroupMemberDefinedData error", e);

+ 18 - 2
mec-biz/src/main/java/com/ym/mec/biz/dal/dto/ImUserFriendDto.java

@@ -3,6 +3,7 @@ package com.ym.mec.biz.dal.dto;
 import com.ym.mec.auth.api.entity.SysUser;
 import com.ym.mec.biz.dal.entity.ImUserFriend;
 import io.swagger.annotations.ApiModelProperty;
+import org.apache.commons.lang3.StringUtils;
 
 import java.util.Objects;
 import java.util.Optional;
@@ -42,13 +43,28 @@ public class ImUserFriendDto extends ImUserFriend {
 	}
 
 	public String getImFriendId() {
-		return String.valueOf(getFriendId());
+		if (StringUtils.isBlank(imFriendId) && Objects.nonNull(getFriend())) {
+			return String.valueOf(getFriendId());
+		}
+		return Optional.ofNullable(imFriendId).orElse("");
 	}
 
 	public String getFriendAvatar() {
-		if (Objects.nonNull(getFriend())) {
+		if (StringUtils.isBlank(friendAvatar) && Objects.nonNull(getFriend())) {
 			return getFriend().getAvatar();
 		}
 		return Optional.ofNullable(friendAvatar).orElse("");
 	}
+
+	public void setFriendType(String friendType) {
+		this.friendType = friendType;
+	}
+
+	public void setImFriendId(String imFriendId) {
+		this.imFriendId = imFriendId;
+	}
+
+	public void setFriendAvatar(String friendAvatar) {
+		this.friendAvatar = friendAvatar;
+	}
 }

+ 11 - 0
mec-biz/src/main/java/com/ym/mec/biz/dal/vo/ImLiveBroadcastRoomMemberVo.java

@@ -24,6 +24,9 @@ public class ImLiveBroadcastRoomMemberVo implements java.io.Serializable {
     @ApiModelProperty(value = "学生编号")
     private Integer studentId;
 
+
+    @ApiModelProperty(value = "学生编号")
+    private String imUserId;
     @ApiModelProperty(value = "学生姓名")
     private String studentName;
 
@@ -76,6 +79,14 @@ public class ImLiveBroadcastRoomMemberVo implements java.io.Serializable {
         return JSON.parseObject(JSON.toJSONString(memberVo), ImLiveBroadcastRoomSimpleMemberVo.class);
     }
 
+    public String getImUserId() {
+        return imUserId;
+    }
+
+    public void setImUserId(String imUserId) {
+        this.imUserId = imUserId;
+    }
+
     public ImLiveBroadcastRoomMemberVo roomTitle(String roomTitle) {
         this.roomTitle = roomTitle;
         return this;

+ 18 - 0
mec-biz/src/main/java/com/ym/mec/biz/dal/wrapper/LiveRoomWrapper.java

@@ -0,0 +1,18 @@
+package com.ym.mec.biz.dal.wrapper;
+
+import io.swagger.annotations.ApiModelProperty;
+import lombok.Data;
+
+public class LiveRoomWrapper {
+
+
+    @Data
+    public static class LiveRoomCount{
+
+
+        @ApiModelProperty(value = "当前观看人数")
+        private Integer lookNum;
+        @ApiModelProperty(value = "累计观看人数")
+        private Integer totalLookNum;
+    }
+}

+ 3 - 3
mec-biz/src/main/java/com/ym/mec/biz/redisson/RedissonMessageService.java

@@ -14,10 +14,10 @@ import org.springframework.stereotype.Service;
 public class RedissonMessageService {
 
     // 订阅消息通知
-    public static final String TOPIC_MESSAGE = "topic:message";
+    public static final String TOPIC_MESSAGE = "gym:topic:message";
     // 直播在线人数
-    public static final String LIVE_ROOM_MEMBER = "delayQueue:liveRoomMember:";
-    public static final String LIVE_ROOM_MEMBER_LOCK = "LOCK:liveRoomMember:";
+    public static final String LIVE_ROOM_MEMBER = "gym:delayQueue:liveRoomMember:";
+    public static final String LIVE_ROOM_MEMBER_LOCK = "gym:LOCK:liveRoomMember:";
 
     private final RedissonClient redissonClient;
 

+ 8 - 4
mec-biz/src/main/java/com/ym/mec/biz/service/ImLiveBroadcastRoomService.java

@@ -3,10 +3,7 @@ package com.ym.mec.biz.service;
 import com.baomidou.mybatisplus.extension.service.IService;
 import com.microsvc.toolkit.middleware.live.message.TencentWrapper;
 import com.ym.mec.auth.api.entity.SysUser;
-import com.ym.mec.biz.dal.dto.ImLiveBroadcastRoomDto;
-import com.ym.mec.biz.dal.dto.LiveRoomStatus;
-import com.ym.mec.biz.dal.dto.RoomReservationUserSearch;
-import com.ym.mec.biz.dal.dto.TencentData;
+import com.ym.mec.biz.dal.dto.*;
 import com.ym.mec.biz.dal.entity.ImLiveBroadcastRoom;
 import com.ym.mec.biz.dal.page.LiveRoomGoodsOrderQueryInfo;
 import com.ym.mec.biz.dal.vo.BaseRoomUserVo;
@@ -14,8 +11,10 @@ import com.ym.mec.biz.dal.vo.ImLiveBroadcastRoomVo;
 import com.ym.mec.biz.dal.vo.RoomReservationUserVo;
 import com.ym.mec.biz.dal.vo.LiveRoomGoodsOrderVo;
 import com.ym.mec.biz.dal.vo.RoomUserInfoVo;
+import com.ym.mec.biz.dal.wrapper.LiveRoomWrapper;
 import com.ym.mec.common.entity.ImUserState;
 import com.ym.mec.common.page.PageInfo;
+import org.jetbrains.annotations.NotNull;
 
 import javax.servlet.http.HttpServletResponse;
 import java.io.IOException;
@@ -135,6 +134,9 @@ public interface ImLiveBroadcastRoomService extends IService<ImLiveBroadcastRoom
 
     void createLiveRoomNoTransactional(ImLiveBroadcastRoom room);
 
+    @NotNull
+    RoomMemberNumDto getRoomMemberNumDto(String roomUid);
+
     Map<String, Object> test(String roomUid, String userFlag);
 
     /**
@@ -251,5 +253,7 @@ public interface ImLiveBroadcastRoomService extends IService<ImLiveBroadcastRoom
      * @return
      */
     ImLiveBroadcastRoom getByRoomUid(String liveRoomId);
+
+    LiveRoomWrapper.LiveRoomCount queryRoomMemberCount(String roomUid);
 }
 

+ 7 - 0
mec-biz/src/main/java/com/ym/mec/biz/service/ImUserFriendService.java

@@ -57,6 +57,13 @@ public interface ImUserFriendService extends BaseService<Long, ImUserFriend> {
 	ImUserFriendDto queryFriendDetail(Integer userId, Integer friendUserId);
 
 	/**
+	 * 获取用户详情
+	 * @param userId 用户ID
+	 * @return ImUserFriend
+	 */
+	ImUserFriendDto getImUserProfile(String userId);
+
+	/**
 	 * 用户通讯录新增
 	 * @param imUserFriends
 	 */

+ 46 - 3
mec-biz/src/main/java/com/ym/mec/biz/service/impl/ImLiveBroadcastRoomMemberServiceImpl.java

@@ -1,5 +1,6 @@
 package com.ym.mec.biz.service.impl;
 
+import com.alibaba.fastjson.JSON;
 import com.baomidou.mybatisplus.core.metadata.IPage;
 import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
 import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
@@ -15,10 +16,13 @@ import com.ym.mec.biz.dal.entity.Organization;
 import com.ym.mec.biz.dal.vo.ImLiveBroadcastRoomDetailVo;
 import com.ym.mec.biz.dal.vo.ImLiveBroadcastRoomMemberVo;
 import com.ym.mec.biz.service.*;
+import com.ym.mec.common.entity.HttpResponseResult;
 import com.ym.mec.common.exception.BizException;
 import com.ym.mec.common.page.PageInfo;
 import com.ym.mec.common.page.PageUtil;
 import com.ym.mec.common.page.WrapperUtil;
+import com.ym.mec.dto.RoomMember;
+import com.ym.mec.web.KLXFeignService;
 import lombok.extern.slf4j.Slf4j;
 import org.apache.commons.collections.CollectionUtils;
 import org.apache.commons.collections.MapUtils;
@@ -53,6 +57,9 @@ public class ImLiveBroadcastRoomMemberServiceImpl extends ServiceImpl<ImLiveBroa
     @Autowired
     private OrganizationDao organizationDao;
 
+    @Autowired
+    private KLXFeignService klxFeignService;
+
     @Override
     public ImLiveBroadcastRoomMemberDao getDao() {
         return this.baseMapper;
@@ -72,10 +79,28 @@ public class ImLiveBroadcastRoomMemberServiceImpl extends ServiceImpl<ImLiveBroa
     @Override
     public PageInfo<ImLiveBroadcastRoomMemberVo> queryRoomMember(Map<String, Object> param) {
         Page<ImLiveBroadcastRoomMemberVo> pageInfo = PageUtil.getPageInfo(param);
+        IPage<ImLiveBroadcastRoomMemberVo> page ;
+        Object klxFlag = param.get("klxFlag");
+        List<RoomMember> roomMembers= new ArrayList<>();
+        if (klxFlag != null && "1".equals(klxFlag.toString())) {
+            HttpResponseResult<List<RoomMember>> listHttpResponseResult = klxFeignService.queryRoomMember(param);
+            roomMembers = listHttpResponseResult.getData();
+        }
+        List<ImLiveBroadcastRoomMemberVo> records;
+        long pages = pageInfo.getPages();
+        long rows = pageInfo.getSize();
+        if (CollectionUtils.isNotEmpty(roomMembers)) {
+
+            //roomMembers 转 ImLiveBroadcastRoomMemberVo
+
+            pageInfo.setPages(1);
+            pageInfo.setSize(-1);
+            page = baseMapper.queryMemberPage(pageInfo, param);
+        } else {
+            page = baseMapper.queryMemberPage(pageInfo, param);
+        }
 
-        IPage<ImLiveBroadcastRoomMemberVo> page = baseMapper.queryMemberPage(pageInfo, param);
-
-        List<ImLiveBroadcastRoomMemberVo> records = page.getRecords();
+        records = page.getRecords();
 
         if (CollectionUtils.isNotEmpty(records)) {
 
@@ -154,9 +179,27 @@ public class ImLiveBroadcastRoomMemberServiceImpl extends ServiceImpl<ImLiveBroa
                             .setSpeakerName(speaker.getRealName());
                 }
 
+                item.setImUserId(item.getStudentId().toString());
             }
         }
 
+        if (CollectionUtils.isNotEmpty(roomMembers)) {
+
+            //roomMembers 转 ImLiveBroadcastRoomMemberVo
+            List<ImLiveBroadcastRoomMemberVo> imLiveBroadcastRoomMemberVos = JSON
+                .parseArray(JSON.toJSONString(roomMembers),ImLiveBroadcastRoomMemberVo.class);
+            records.addAll(imLiveBroadcastRoomMemberVos);
+            records.sort(Comparator.comparing(ImLiveBroadcastRoomMemberVo::getJoinTime));
+
+            page.setPages(pages);
+            page.setSize(rows);
+            page.setTotal(records.size());
+            List<ImLiveBroadcastRoomMemberVo> imLiveBroadcastRoomMemberVos1 = records.subList((int) (((pages-1)>=0?(pages-1):0) * rows), (int) (rows>records.size()?records.size():rows));
+            page.setRecords(imLiveBroadcastRoomMemberVos1);
+        } else {
+            page = baseMapper.queryMemberPage(pageInfo, param);
+        }
+
         return PageUtil.pageInfo(page);
     }
 

+ 62 - 8
mec-biz/src/main/java/com/ym/mec/biz/service/impl/ImLiveBroadcastRoomServiceImpl.java

@@ -33,6 +33,7 @@ import com.ym.mec.biz.dal.enums.*;
 import com.ym.mec.biz.dal.enums.live.ELiveViewMode;
 import com.ym.mec.biz.dal.page.LiveRoomGoodsOrderQueryInfo;
 import com.ym.mec.biz.dal.vo.*;
+import com.ym.mec.biz.dal.wrapper.LiveRoomWrapper;
 import com.ym.mec.biz.redisson.RedissonMessageService;
 import com.ym.mec.biz.service.*;
 import com.ym.mec.biz.service.im.ImGroupCoreService;
@@ -49,6 +50,7 @@ import com.ym.mec.util.collection.MapUtil;
 import com.ym.mec.util.date.DateUtil;
 import com.ym.mec.util.excel.POIUtil;
 import com.ym.mec.util.http.HttpUtil;
+import com.ym.mec.web.KLXFeignService;
 import org.apache.commons.collections.CollectionUtils;
 import org.apache.commons.collections.MapUtils;
 import org.apache.commons.lang3.RandomStringUtils;
@@ -137,6 +139,9 @@ public class ImLiveBroadcastRoomServiceImpl extends ServiceImpl<ImLiveBroadcastR
     @Autowired
     private ImGroupCoreService imGroupCoreService;
 
+    @Autowired
+    private KLXFeignService klxFeignService;
+
 
     //待替换的变量
     public static final String USER_ID = "${userId}";
@@ -1250,7 +1255,7 @@ public class ImLiveBroadcastRoomServiceImpl extends ServiceImpl<ImLiveBroadcastR
 
         //发送消息
         try {
-            livePluginContext.getPluginService(roomVo.getServiceProvider()).sendChatRoomMessage(message);
+//            livePluginContext.getPluginService(roomVo.getServiceProvider()).sendChatRoomMessage(message);
             log.info("sendOnlineUserCount>>>> message: {}", JSONObject.toJSONString(message));
         } catch (Exception e) {
             log.error("sendOnlineUserCount>>>> error {}", e.getMessage());
@@ -2532,12 +2537,7 @@ public class ImLiveBroadcastRoomServiceImpl extends ServiceImpl<ImLiveBroadcastR
 
         // 不在从缓存中获取观看人数,改为从数据库中获取
 
-        RoomMemberNumDto roomMemberNumDto = liveBroadcastRoomMemberDao.queryMemberNum(roomVo.getRoomUid());
-        if (roomMemberNumDto == null) {
-            roomMemberNumDto = new RoomMemberNumDto();
-            roomMemberNumDto.setTotalNum(0);
-            roomMemberNumDto.setOnlineNum(0);
-        }
+        RoomMemberNumDto roomMemberNumDto = getRoomMemberNumDto(roomVo.getRoomUid());
         roomVo.setTotalLookNum(roomMemberNumDto.getTotalNum() == null? 0 : roomMemberNumDto.getTotalNum());
         roomVo.setLookNum(roomMemberNumDto.getOnlineNum() == null? 0 : roomMemberNumDto.getOnlineNum());
 
@@ -2550,6 +2550,19 @@ public class ImLiveBroadcastRoomServiceImpl extends ServiceImpl<ImLiveBroadcastR
         }
     }
 
+    @NotNull
+    @Override
+    public RoomMemberNumDto getRoomMemberNumDto(String roomUid) {
+        RoomMemberNumDto roomMemberNumDto = liveBroadcastRoomMemberDao.queryMemberNum(roomUid);
+        if (roomMemberNumDto == null) {
+            roomMemberNumDto = new RoomMemberNumDto();
+            roomMemberNumDto.setTotalNum(0);
+            roomMemberNumDto.setOnlineNum(0);
+        }
+        return roomMemberNumDto;
+    }
+
+
     /**
      * 获取房间缓存中的用户数量/观看人数
      *
@@ -2767,6 +2780,14 @@ public class ImLiveBroadcastRoomServiceImpl extends ServiceImpl<ImLiveBroadcastR
         roomConfig.setWhether_mic(whetherMic);
         imLiveBroadcastRoom.setRoomConfig(JSONObject.toJSONString(roomConfig));
         this.updateById(imLiveBroadcastRoom);
+
+        // 设置酷乐秀状态
+        CompletableFuture.runAsync(()->{
+            com.ym.mec.dto.LiveRoomStatus status = new com.ym.mec.dto.LiveRoomStatus();
+            status.setRoomUid(roomUid);
+            status.setLinkMic(whetherMic == 1 ? 1 : 0);
+            klxFeignService.updateRoomStatus(JSON.parseObject(JSON.toJSONString(status)));
+        });
     }
 
     /**
@@ -2814,7 +2835,12 @@ public class ImLiveBroadcastRoomServiceImpl extends ServiceImpl<ImLiveBroadcastR
             return true;
         }
 
-        return this.updateById(imLiveBroadcastRoom);
+        this.updateById(imLiveBroadcastRoom);
+
+        CompletableFuture.runAsync(()->{
+            klxFeignService.updateRoomStatus(JSON.parseObject(JSON.toJSONString(liveRoom)));
+        });
+        return true;
     }
 
 
@@ -3153,6 +3179,34 @@ public class ImLiveBroadcastRoomServiceImpl extends ServiceImpl<ImLiveBroadcastR
         return list.get(0);
     }
 
+    @Override
+    public LiveRoomWrapper.LiveRoomCount queryRoomMemberCount(String roomUid) {
+        LiveRoomWrapper.LiveRoomCount liveRoomCount = new LiveRoomWrapper.LiveRoomCount();
+        liveRoomCount.setLookNum(0);
+        liveRoomCount.setTotalLookNum(0);
+        try {
+
+            List<TencentWrapper.ChatRoomGroupCounter> chatRoomGroupDefinedData = livePluginContext.getPluginService().getChatRoomGroupDefinedData(roomUid);
+            if (CollectionUtils.isNotEmpty(chatRoomGroupDefinedData)) {
+                chatRoomGroupDefinedData.forEach(data -> {
+                    switch (data.getKey()) {
+                        case "MEMBER_TOTAL":
+                            liveRoomCount.setTotalLookNum(Integer.parseInt(data.getValue()));
+                            break;
+                        case "MEMBER_ONLINE":
+                            liveRoomCount.setLookNum(Integer.parseInt(data.getValue()));
+                            break;
+                        default:
+                            break;
+                    }
+                });
+            }
+        } catch (Exception e) {
+            log.error("获取直播群配置失败", e);
+        }
+        return liveRoomCount;
+    }
+
 
     /**
      * 查询直播间所有用户信息

+ 37 - 0
mec-biz/src/main/java/com/ym/mec/biz/service/impl/ImUserFriendServiceImpl.java

@@ -5,6 +5,9 @@ import java.util.stream.Collectors;
 
 import com.google.common.collect.Lists;
 import com.google.common.collect.Sets;
+import com.microsvc.toolkit.middleware.im.ImPluginContext;
+import com.microsvc.toolkit.middleware.im.message.TencentWrapper;
+import com.ym.mec.auth.api.entity.SysUser;
 import com.ym.mec.biz.dal.dao.*;
 import com.ym.mec.biz.dal.entity.*;
 import com.ym.mec.biz.dal.enums.EFriendRoleType;
@@ -16,6 +19,7 @@ import com.ym.mec.biz.dal.wrapper.ImGroupWrapper;
 import com.ym.mec.biz.service.TeacherService;
 import com.ym.mec.biz.service.im.ImGroupCoreService;
 import com.ym.mec.util.collection.MapUtil;
+import lombok.extern.slf4j.Slf4j;
 import org.apache.commons.collections.CollectionUtils;
 import org.apache.commons.lang3.StringUtils;
 import org.springframework.beans.factory.annotation.Autowired;
@@ -31,6 +35,7 @@ import org.springframework.transaction.annotation.Transactional;
 
 import static com.ym.mec.biz.dal.enums.GroupType.*;
 
+@Slf4j
 @Service
 public class ImUserFriendServiceImpl extends BaseServiceImpl<Long, ImUserFriend> implements ImUserFriendService {
 
@@ -67,6 +72,8 @@ public class ImUserFriendServiceImpl extends BaseServiceImpl<Long, ImUserFriend>
 
     @Autowired
     private ImGroupCoreService imGroupCoreService;
+    @Autowired
+    private ImPluginContext imPluginContext;
 
     @Override
     public BaseDAO<Long, ImUserFriend> getDAO() {
@@ -170,6 +177,7 @@ public class ImUserFriendServiceImpl extends BaseServiceImpl<Long, ImUserFriend>
         ImUserFriendDto imUserFriendDto = imUserFriendDao.queryFriendDetail(userId, friendUserId);
 
         if (Objects.nonNull(imUserFriendDto) && Objects.nonNull(imUserFriendDto.getFriend())) {
+            imUserFriendDto.setImFriendId(imUserFriendDto.getFriendId().toString());
 
             List<String> userTypes = Lists.newArrayList(imUserFriendDto.getFriend().getUserType().split(","));
             if (userTypes.size() > 1
@@ -185,6 +193,35 @@ public class ImUserFriendServiceImpl extends BaseServiceImpl<Long, ImUserFriend>
         return imUserFriendDto;
     }
 
+    /**
+     * 获取用户详情
+     *
+     * @param userId 用户ID
+     * @return ImUserFriend
+     */
+    @Override
+    public ImUserFriendDto getImUserProfile(String userId) {
+        try {
+            TencentWrapper.UserProfile userProfile = imPluginContext.getPluginService().getUserProfile(userId);
+
+            SysUser user = new SysUser();
+            user.setAvatar(userProfile.getAvatar());
+            user.setUsername(userProfile.getUsername());
+            // 返回当前登录用户信息
+            ImUserFriendDto imUserFriend = new ImUserFriendDto();
+            imUserFriend.setFriendAvatar(userProfile.getAvatar());
+            imUserFriend.setFriendNickname(userProfile.getUsername());
+            imUserFriend.setImFriendId(userId);
+            imUserFriend.setFriendType(ClientEnum.STUDENT.getCode());
+            // 设置IM好友ID
+            imUserFriend.setFriend(user);
+            return imUserFriend;
+        } catch (Exception e) {
+            log.error("getImUserProfile userId={}", userId, e);
+        }
+        return null;
+    }
+
     @Override
     public void batchInsert(List<ImUserFriend> imUserFriends) {
         for (ImUserFriend imUserFriend : imUserFriends) {

+ 3 - 0
mec-biz/src/main/java/com/ym/mec/biz/service/impl/VipGroupServiceImpl.java

@@ -5240,6 +5240,9 @@ public class VipGroupServiceImpl extends BaseServiceImpl<Long, VipGroup> impleme
         DateTime time = DateTime.parse(liveStartTime, DateTimeFormat.forPattern(DateUtil.DEFAULT_PATTERN + " " + DateUtil.EXPANDED_TIME_FORMAT));
 
         String roomUid = "LIVE-" + roomId + "-" + courseSchedule.getActualTeacherId().toString()+"-" + time.toDate().getTime();
+        if (StringUtils.isNotBlank(courseSchedule.getLiveRoomId())) {
+            roomUid = courseSchedule.getLiveRoomId();
+        }
         ImLiveBroadcastRoom room = imLiveBroadcastRoomService.getByRoomUid(roomUid);
         if (Objects.nonNull(room)) {
             liveRoom.setId(room.getId());

+ 42 - 0
mec-client-api/src/main/java/com/ym/mec/dto/LiveRoomStatus.java

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

+ 64 - 0
mec-client-api/src/main/java/com/ym/mec/dto/RoomMember.java

@@ -0,0 +1,64 @@
+package com.ym.mec.dto;
+
+import com.alibaba.fastjson.JSON;
+import com.fasterxml.jackson.annotation.JsonFormat;
+import lombok.Data;
+
+import java.util.Date;
+
+@Data
+public class RoomMember {
+
+
+
+//    @ApiModelProperty(value = "房间编号")
+    private String roomUid;
+
+//    @ApiModelProperty(value = "房间标题")
+    private String roomTitle;
+
+//    @ApiModelProperty(value = "主讲人")
+    private String speakerName;
+
+//    @ApiModelProperty(value = "学生编号")
+    private Long studentId;
+
+
+//    @ApiModelProperty(value = "学生编号")
+    private String imUserId;
+
+//    @ApiModelProperty(value = "学生姓名")
+    private String studentName;
+
+//    @ApiModelProperty(value = "学生头像")
+    private String avatar;
+
+//    @ApiModelProperty(value = "手机号")
+    private String phone;
+
+//    @ApiModelProperty(value = "声部名称")
+    private String subName;
+
+//    @ApiModelProperty(value = "进入房间时间")
+    @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss")
+    private Date joinTime;
+
+//    @ApiModelProperty(value = "累计观看时长")
+    private Integer totalViewTime;
+
+//    @ApiModelProperty(value = "连麦状态 0:未申请1:申请连麦中2:连麦中")
+    private Integer whetherMicStatus;
+
+//    @ApiModelProperty(value = "是否黑名单")
+    private boolean blackFlag;
+
+//    @ApiModelProperty("游客凭据")
+    private String fingerprint;
+
+//    @ApiModelProperty(value = "是否能上麦:false否;true是")
+    private boolean microphoneFlag;
+    public String jsonString() {
+        return JSON.toJSONString(this);
+    }
+
+}

+ 19 - 0
mec-client-api/src/main/java/com/ym/mec/dto/RoomMemberNumDto.java

@@ -0,0 +1,19 @@
+package com.ym.mec.dto;
+
+import lombok.Data;
+
+/**
+ * Description
+ *
+ * @author liujunchi
+ * @date 2023-03-29
+ */
+@Data
+public class RoomMemberNumDto {
+
+    private String roomUid;
+
+    private Integer onlineNum;
+
+    private Integer totalNum;
+}

+ 42 - 0
mec-client-api/src/main/java/com/ym/mec/web/KLXFeignService.java

@@ -0,0 +1,42 @@
+package com.ym.mec.web;
+
+import com.alibaba.fastjson.JSON;
+import com.ym.mec.common.config.FeignConfiguration;
+import com.ym.mec.common.dto.SchoolDto;
+import com.ym.mec.common.entity.*;
+import com.ym.mec.dto.LiveRoomStatus;
+import com.ym.mec.dto.RoomMember;
+import com.ym.mec.dto.RoomMemberNumDto;
+import com.ym.mec.thirdparty.adapay.entity.BaseResult;
+import com.ym.mec.thirdparty.adapay.entity.HfMerchantConfig;
+import com.ym.mec.web.fallback.WebFeignServiceFallback;
+import org.springframework.cloud.openfeign.FeignClient;
+import org.springframework.web.bind.annotation.*;
+
+import javax.validation.Valid;
+import java.math.BigDecimal;
+import java.util.List;
+import java.util.Map;
+
+@FeignClient(name = "${app-config.open-feign.klx-server.name:klx-server}",
+		contextId = "KLXFeignService",
+		url = "${app-config.open-feign.klx-server.url:}",
+		configuration = FeignConfiguration.class, fallback = WebFeignServiceFallback.class)
+public interface KLXFeignService {
+
+
+    @GetMapping("/open/live/queryRoomInfo")
+    HttpResponseResult<RoomMemberNumDto> queryRoomInfo(@RequestParam("roomUid") String roomUid);
+
+
+    //("查询直播间人员列表")
+    @PostMapping("/open/live/queryRoomMember")
+    HttpResponseResult<List<RoomMember>> queryRoomMember(@RequestBody Map<String, Object> param) ;
+
+
+
+//    @ApiOperation("更新直播间状态")
+    @PostMapping("/open/live/updateRoomStatus")
+    public HttpResponseResult<Boolean> updateRoomStatus(@RequestBody JSON status );
+
+}

+ 30 - 0
mec-client-api/src/main/java/com/ym/mec/web/fallback/KLXFeignServiceFallback.java

@@ -0,0 +1,30 @@
+package com.ym.mec.web.fallback;
+
+import com.alibaba.fastjson.JSON;
+import com.ym.mec.common.entity.HttpResponseResult;
+import com.ym.mec.dto.LiveRoomStatus;
+import com.ym.mec.dto.RoomMember;
+import com.ym.mec.dto.RoomMemberNumDto;
+import com.ym.mec.web.KLXFeignService;
+import org.springframework.stereotype.Component;
+
+import java.util.List;
+import java.util.Map;
+
+@Component
+public class KLXFeignServiceFallback implements KLXFeignService {
+    @Override
+    public HttpResponseResult<RoomMemberNumDto> queryRoomInfo(String roomUid) {
+        return null;
+    }
+
+    @Override
+    public HttpResponseResult<List<RoomMember>> queryRoomMember(Map<String, Object> param) {
+        return null;
+    }
+
+    @Override
+    public HttpResponseResult<Boolean> updateRoomStatus(JSON status) {
+        return null;
+    }
+}

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

@@ -1,4 +1,4 @@
-spring.cloud.nacos.config.server-addr=43.137.4.92:8848
+spring.cloud.nacos.config.server-addr=10.206.0.17:8848
 #\u9ed8\u8ba4\u4e3aPublic\u547d\u540d\u7a7a\u95f4,\u53ef\u4ee5\u7701\u7565\u4e0d\u5199
 spring.cloud.nacos.config.namespace=470509f8-ea21-42cb-9c64-924c5ccc68ce
 #\u6307\u5b9a\u914d\u7f6e\u7fa4\u7ec4 --\u5982\u679c\u662fPublic\u547d\u540d\u7a7a\u95f4 \u5219\u53ef\u4ee5\u7701\u7565\u7fa4\u7ec4\u914d\u7f6e

+ 2 - 2
pom.xml

@@ -25,8 +25,8 @@
 		<docker.host>http://127.0.0.1:2375</docker.host>
 		<docker.registry.repository>127.0.0.1:5000</docker.registry.repository>
 		<docker.maven.plugin.version>1.2.2</docker.maven.plugin.version>
-		<com.microsvc.toolkit.version>1.0.4</com.microsvc.toolkit.version>
-		<cbs.version>1.0.4</cbs.version>
+		<com.microsvc.toolkit.version>1.0.7</com.microsvc.toolkit.version>
+        <cbs.version>1.0.4</cbs.version>
 	</properties>
 
 	<dependencyManagement>