|  | @@ -17,11 +17,13 @@ import com.microsvc.toolkit.middleware.live.message.RTCRoom;
 | 
	
		
			
				|  |  |  import com.ym.mec.auth.api.client.SysUserFeignService;
 | 
	
		
			
				|  |  |  import com.ym.mec.auth.api.entity.SysUser;
 | 
	
		
			
				|  |  |  import com.ym.mec.biz.dal.dao.ImLiveBroadcastRoomDao;
 | 
	
		
			
				|  |  | +import com.ym.mec.biz.dal.dao.ImLiveBroadcastRoomMemberDao;
 | 
	
		
			
				|  |  |  import com.ym.mec.biz.dal.dao.LiveGoodsMapperDao;
 | 
	
		
			
				|  |  |  import com.ym.mec.biz.dal.dao.SysConfigDao;
 | 
	
		
			
				|  |  |  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.entity.ImLiveBroadcastRoom;
 | 
	
		
			
				|  |  |  import com.ym.mec.biz.dal.entity.ImLiveBroadcastRoomData;
 | 
	
		
			
				|  |  |  import com.ym.mec.biz.dal.entity.ImLiveBroadcastRoomMember;
 | 
	
	
		
			
				|  | @@ -63,6 +65,8 @@ import java.io.IOException;
 | 
	
		
			
				|  |  |  import java.io.OutputStream;
 | 
	
		
			
				|  |  |  import java.io.Serializable;
 | 
	
		
			
				|  |  |  import java.text.MessageFormat;
 | 
	
		
			
				|  |  | +import java.time.LocalDateTime;
 | 
	
		
			
				|  |  | +import java.time.ZoneId;
 | 
	
		
			
				|  |  |  import java.util.*;
 | 
	
		
			
				|  |  |  import java.util.concurrent.CompletableFuture;
 | 
	
		
			
				|  |  |  import java.util.concurrent.TimeUnit;
 | 
	
	
		
			
				|  | @@ -92,6 +96,8 @@ public class ImLiveBroadcastRoomServiceImpl extends ServiceImpl<ImLiveBroadcastR
 | 
	
		
			
				|  |  |      @Autowired
 | 
	
		
			
				|  |  |      private ImLiveBroadcastRoomMemberService liveBroadcastRoomMemberService;
 | 
	
		
			
				|  |  |      @Autowired
 | 
	
		
			
				|  |  | +    private ImLiveBroadcastRoomMemberDao liveBroadcastRoomMemberDao;
 | 
	
		
			
				|  |  | +    @Autowired
 | 
	
		
			
				|  |  |      private ImLiveBroadcastRoomDataService liveBroadcastRoomDataService;
 | 
	
		
			
				|  |  |      @Autowired
 | 
	
		
			
				|  |  |      private LiveGoodsMapperDao liveGoodsMapperDao;
 | 
	
	
		
			
				|  | @@ -1824,6 +1830,134 @@ public class ImLiveBroadcastRoomServiceImpl extends ServiceImpl<ImLiveBroadcastR
 | 
	
		
			
				|  |  |  
 | 
	
		
			
				|  |  |  
 | 
	
		
			
				|  |  |      /**
 | 
	
		
			
				|  |  | +     * 直播群成员在线状态回调处理
 | 
	
		
			
				|  |  | +     *
 | 
	
		
			
				|  |  | +     * @param callbackOnMemberStateChange
 | 
	
		
			
				|  |  | +     */
 | 
	
		
			
				|  |  | +    @Override
 | 
	
		
			
				|  |  | +    @Transactional
 | 
	
		
			
				|  |  | +    public void callbackOnMemberStateChange(TencentData.CallbackOnMemberStateChange callbackOnMemberStateChange) {
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +        if (callbackOnMemberStateChange == null) {
 | 
	
		
			
				|  |  | +            return;
 | 
	
		
			
				|  |  | +        }
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +        Integer onlineStatus = callbackOnMemberStateChange.getEventType().equals("Online")?1:0;
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +        // 用户id
 | 
	
		
			
				|  |  | +        if (CollectionUtils.isEmpty(callbackOnMemberStateChange.getMemberList())) {
 | 
	
		
			
				|  |  | +            return;
 | 
	
		
			
				|  |  | +        }
 | 
	
		
			
				|  |  | +        List<Long> userIds = callbackOnMemberStateChange.getMemberList()
 | 
	
		
			
				|  |  | +                                                        .stream()
 | 
	
		
			
				|  |  | +                                                        .map(o -> Long.parseLong(o.getMemberAccount()))
 | 
	
		
			
				|  |  | +                                                        .collect(Collectors.toList());
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +        List<ImLiveBroadcastRoomMember> imLiveBroadcastRoomMembers = liveBroadcastRoomMemberDao.queryMember(userIds,
 | 
	
		
			
				|  |  | +                                                                                                            callbackOnMemberStateChange.getGroupId());
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +        if (CollectionUtils.isEmpty(imLiveBroadcastRoomMembers)) {
 | 
	
		
			
				|  |  | +            return;
 | 
	
		
			
				|  |  | +        }
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +        // 根据用户id分组
 | 
	
		
			
				|  |  | +        Map<Integer, ImLiveBroadcastRoomMember> userMap = imLiveBroadcastRoomMembers.stream()
 | 
	
		
			
				|  |  | +                                                                                    .collect(Collectors.toMap(ImLiveBroadcastRoomMember::getUserId,o ->o, (k1, k2) -> k1));
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +        List<ImUserState> imUserStates = new ArrayList<>();
 | 
	
		
			
				|  |  | +        for (Long userId : userIds) {
 | 
	
		
			
				|  |  | +            Integer liveRoomStatus = userMap.getOrDefault(userId.intValue(), new ImLiveBroadcastRoomMember())
 | 
	
		
			
				|  |  | +                                           .getLiveRoomStatus();
 | 
	
		
			
				|  |  | +            ImUserState imUserState = new ImUserState();
 | 
	
		
			
				|  |  | +            imUserState.setUserid(userId.toString());
 | 
	
		
			
				|  |  | +            imUserState.setStatus(onlineStatus == 1 && liveRoomStatus == 1?"0":"1");
 | 
	
		
			
				|  |  | +            imUserState.setOs(callbackOnMemberStateChange.getOptPlatform());
 | 
	
		
			
				|  |  | +            imUserState.setTime(new Date().getTime());
 | 
	
		
			
				|  |  | +            imUserState.setClientIp(callbackOnMemberStateChange.getClientIP());
 | 
	
		
			
				|  |  | +            imUserStates.add(imUserState);
 | 
	
		
			
				|  |  | +        }
 | 
	
		
			
				|  |  | +        opsRoom(imUserStates);
 | 
	
		
			
				|  |  | +        liveBroadcastRoomMemberDao.updateOnlineStatus(userIds, callbackOnMemberStateChange.getGroupId(),onlineStatus);
 | 
	
		
			
				|  |  | +    }
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +    @Override
 | 
	
		
			
				|  |  | +    public void callbackAfterMemberExit(TencentData.CallbackAfterMemberExit callbackAfterMemberExit) {
 | 
	
		
			
				|  |  | +        if (callbackAfterMemberExit == null) {
 | 
	
		
			
				|  |  | +            return;
 | 
	
		
			
				|  |  | +        }
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +        Integer liveRoomStatus = 0;
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +        // 用户id
 | 
	
		
			
				|  |  | +        if (CollectionUtils.isEmpty(callbackAfterMemberExit.getExitMemberList())) {
 | 
	
		
			
				|  |  | +            return;
 | 
	
		
			
				|  |  | +        }
 | 
	
		
			
				|  |  | +        List<Long> userIds = callbackAfterMemberExit.getExitMemberList()
 | 
	
		
			
				|  |  | +                                                        .stream()
 | 
	
		
			
				|  |  | +                                                        .map(o -> Long.parseLong(o.getMemberAccount()))
 | 
	
		
			
				|  |  | +                                                        .collect(Collectors.toList());
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +        List<ImUserState> imUserStates = new ArrayList<>();
 | 
	
		
			
				|  |  | +        for (Long userId : userIds) {
 | 
	
		
			
				|  |  | +            ImUserState imUserState = new ImUserState();
 | 
	
		
			
				|  |  | +            imUserState.setUserid(userId.toString());
 | 
	
		
			
				|  |  | +            imUserState.setStatus("3");
 | 
	
		
			
				|  |  | +            imUserState.setOs(callbackAfterMemberExit.getOptPlatform());
 | 
	
		
			
				|  |  | +            imUserState.setTime(callbackAfterMemberExit.getEventTime().atZone(ZoneId.systemDefault()).toEpochSecond());
 | 
	
		
			
				|  |  | +            imUserState.setClientIp(callbackAfterMemberExit.getClientIP());
 | 
	
		
			
				|  |  | +            imUserStates.add(imUserState);
 | 
	
		
			
				|  |  | +        }
 | 
	
		
			
				|  |  | +        opsRoom(imUserStates);
 | 
	
		
			
				|  |  | +        liveBroadcastRoomMemberDao.updateLiveRoomStatus(userIds, callbackAfterMemberExit.getGroupId(),liveRoomStatus);
 | 
	
		
			
				|  |  | +    }
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +    @Override
 | 
	
		
			
				|  |  | +    public void callbackAfterNewMemberJoin(TencentData.CallbackAfterNewMemberJoin callbackAfterNewMemberJoin) {
 | 
	
		
			
				|  |  | +        if (callbackAfterNewMemberJoin == null) {
 | 
	
		
			
				|  |  | +            return;
 | 
	
		
			
				|  |  | +        }
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +        Integer liveRoomStatus = 1;
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +        // 用户id
 | 
	
		
			
				|  |  | +        if (CollectionUtils.isEmpty(callbackAfterNewMemberJoin.getNewMemberList())) {
 | 
	
		
			
				|  |  | +            return;
 | 
	
		
			
				|  |  | +        }
 | 
	
		
			
				|  |  | +        List<Long> userIds = callbackAfterNewMemberJoin.getNewMemberList()
 | 
	
		
			
				|  |  | +                                                    .stream()
 | 
	
		
			
				|  |  | +                                                    .map(o -> Long.parseLong(o.getMemberAccount()))
 | 
	
		
			
				|  |  | +                                                    .collect(Collectors.toList());
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +        List<ImLiveBroadcastRoomMember> imLiveBroadcastRoomMembers = liveBroadcastRoomMemberDao.queryMember(userIds,
 | 
	
		
			
				|  |  | +                                                                                    callbackAfterNewMemberJoin.getGroupId());
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +        if (CollectionUtils.isEmpty(imLiveBroadcastRoomMembers)) {
 | 
	
		
			
				|  |  | +            return;
 | 
	
		
			
				|  |  | +        }
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +        // 根据用户id分组
 | 
	
		
			
				|  |  | +        Map<Integer, ImLiveBroadcastRoomMember> userMap = imLiveBroadcastRoomMembers.stream()
 | 
	
		
			
				|  |  | +                .collect(Collectors.toMap(ImLiveBroadcastRoomMember::getUserId,o ->o, (k1, k2) -> k1));
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +        List<ImUserState> imUserStates = new ArrayList<>();
 | 
	
		
			
				|  |  | +        for (Long userId : userIds) {
 | 
	
		
			
				|  |  | +            ImUserState imUserState = new ImUserState();
 | 
	
		
			
				|  |  | +            imUserState.setUserid(userId.toString());
 | 
	
		
			
				|  |  | +            imUserState.setStatus(userMap.getOrDefault(userId.intValue(), new ImLiveBroadcastRoomMember()).getOnlineStatus() == 1 ? "0" : "1");
 | 
	
		
			
				|  |  | +            imUserState.setOs(callbackAfterNewMemberJoin.getOptPlatform());
 | 
	
		
			
				|  |  | +            imUserState.setTime(callbackAfterNewMemberJoin.getEventTime().atZone(ZoneId.systemDefault()).toEpochSecond());
 | 
	
		
			
				|  |  | +            imUserState.setClientIp(callbackAfterNewMemberJoin.getClientIP());
 | 
	
		
			
				|  |  | +            imUserStates.add(imUserState);
 | 
	
		
			
				|  |  | +        }
 | 
	
		
			
				|  |  | +        opsRoom(imUserStates);
 | 
	
		
			
				|  |  | +        liveBroadcastRoomMemberDao.updateLiveRoomStatus(userIds, callbackAfterNewMemberJoin.getGroupId(),liveRoomStatus);
 | 
	
		
			
				|  |  | +    }
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +    /**
 | 
	
		
			
				|  |  |       * 查询直播间所有用户信息
 | 
	
		
			
				|  |  |       *
 | 
	
		
			
				|  |  |       * @param roomUid 直播间uid
 |