package com.fdkankan.tk.service.impl; import java.util.Date; import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; import com.baomidou.mybatisplus.core.conditions.update.LambdaUpdateWrapper; import com.fdkankan.redis.util.RedisUtil; import com.fdkankan.tk.common.ResultCode; import com.fdkankan.tk.common.util.RoomUtil; import com.fdkankan.tk.entity.Room; import com.fdkankan.tk.entity.RoomUser; import com.fdkankan.tk.exception.BusinessException; import com.fdkankan.tk.httpClient.FdKKService; import com.fdkankan.tk.mapper.IRoomUserMapper; import com.fdkankan.tk.response.RoomAddUserParam; import com.fdkankan.tk.service.IRoomLiveService; import com.fdkankan.tk.service.IRoomUserService; import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; import com.fdkankan.tk.service.IRoomVisitLogService; import org.apache.commons.lang3.StringUtils; import org.springframework.beans.BeanUtils; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Service; import java.util.ArrayList; import java.util.HashMap; import java.util.List; import java.util.Set; import java.util.stream.Collectors; /** *

* 服务实现类 *

* * @author * @since 2023-02-28 */ @Service public class RoomUserServiceImpl extends ServiceImpl implements IRoomUserService { @Autowired FdKKService fdKKService; @Autowired IRoomLiveService roomLiveService; @Autowired IRoomVisitLogService roomVisitLogService; @Autowired RedisUtil redisUtil; @Override public void updateByUserObjList(List userObjList, Room room) { if(userObjList == null || userObjList.size() <=0){ this.delByRoomId(room.getRoomId()); return; } HashMap roomUserHashMap = this.getMapByRoomId(room.getRoomId()); if(roomUserHashMap.size() >0){ //删除数据库中多余的userName Set dbUserName = roomUserHashMap.keySet(); Set userNameSet = userObjList.stream().map(RoomUser::getUserName).collect(Collectors.toSet()); if(userNameSet.size() <=0){ this.delByRoomId(room.getRoomId()); return; } List delUserName = new ArrayList<>(); for (String userName : dbUserName) { if(!userNameSet.contains(userName)){ delUserName.add(userName); } } this.delByUserNameList(delUserName,room.getRoomId()); } List roomUserList = new ArrayList<>(); for (RoomUser roomUser : userObjList) { if(room.getUseStartTime().getTime() < roomUser.getUseStartTime().getTime() || room.getUseEndTime().getTime() < roomUser.getUseEndTime().getTime()){ throw new BusinessException(ResultCode.ROOM_TIME_ERROR); } roomUser.setRoomId(room.getRoomId()); RoomUser dbRoomUser = roomUserHashMap.get(roomUser.getUserName()); if(dbRoomUser != null){ roomUser.setRoomUserId(dbRoomUser.getRoomUserId()); roomUser.setUseStartTime(room.getUseStartTime()); roomUser.setUseEndTime(room.getUseEndTime()); } roomUserList.add(roomUser); } this.saveOrUpdateBatch(roomUserList); } @Override public void delByRoomId(String roomId) { LambdaQueryWrapper wrapper = new LambdaQueryWrapper<>(); wrapper.eq(RoomUser::getRoomId,roomId); this.remove(wrapper); } @Override public List getByRoomId(String roomId) { LambdaQueryWrapper wrapper = new LambdaQueryWrapper<>(); wrapper.eq(RoomUser::getRoomId,roomId); return this.list(wrapper); } @Override public HashMap getMapByRoomId(String roomId) { HashMap map = new HashMap<>(); List list = this.getByRoomId(roomId); list.forEach(entity -> map.put(entity.getUserName(),entity)); return map; } @Override public void delByUserNameList(List delUserName,String roomId) { LambdaQueryWrapper wrapper = new LambdaQueryWrapper<>(); wrapper.eq(RoomUser::getRoomId,roomId); wrapper.in(RoomUser::getUserName,delUserName); this.remove(wrapper); } @Override public void stopRoom(RoomUser roomUser) { LambdaUpdateWrapper wrapper = new LambdaUpdateWrapper<>(); wrapper.eq(RoomUser::getRoomUserId,roomUser.getRoomUserId()); wrapper.set(RoomUser::getRoomStatus,2); this.update(wrapper); String liveId = redisUtil.get(RoomUtil.redisKey+"live:"+RoomUtil.getLiveRoomId(roomUser.getRoomId(),roomUser.getRoomUserId().toString())); if(StringUtils.isNotBlank(liveId)){ roomLiveService.stopByLiveId(liveId); roomVisitLogService.stopRoom(Integer.parseInt(liveId)); redisUtil.del(RoomUtil.redisKey+"live:"+RoomUtil.getLiveRoomId(roomUser.getRoomId(),roomUser.getRoomUserId().toString())); } } @Override public List getRunningRoom() { LambdaQueryWrapper wrapper = new LambdaQueryWrapper<>(); wrapper.eq(RoomUser::getRoomStatus,1); return list(wrapper); } }