123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598 |
- package com.fdkankan.tk.service.impl;
- import java.io.File;
- import java.io.IOException;
- import java.util.*;
- import java.util.stream.Collectors;
- import cn.hutool.core.date.DateUtil;
- import cn.hutool.core.io.FileUtil;
- import cn.hutool.jwt.JWTUtil;
- import com.auth0.jwt.JWT;
- import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
- import com.baomidou.mybatisplus.core.conditions.update.LambdaUpdateWrapper;
- import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
- import com.fdkankan.fyun.face.FYunFileServiceInterface;
- import com.fdkankan.redis.constant.RedisKey;
- import com.fdkankan.redis.util.RedisUtil;
- import com.fdkankan.tk.common.FilePath;
- import com.fdkankan.tk.common.PageInfo;
- import com.fdkankan.tk.common.ResultCode;
- import com.fdkankan.tk.common.WxSharCodePath;
- import com.fdkankan.tk.common.util.JwtUtil;
- import com.fdkankan.tk.common.util.RedisKeyUtil;
- import com.fdkankan.tk.common.util.RoomUtil;
- import com.fdkankan.tk.entity.Room;
- import com.fdkankan.tk.entity.RoomNum;
- import com.fdkankan.tk.entity.RoomUser;
- import com.fdkankan.tk.entity.WxUser;
- import com.fdkankan.tk.exception.BusinessException;
- import com.fdkankan.tk.httpClient.FdKKService;
- import com.fdkankan.tk.httpClient.client.FdKKClient;
- import com.fdkankan.tk.httpClient.request.FdkkLoginRequest;
- import com.fdkankan.tk.httpClient.response.FdkkResponse;
- import com.fdkankan.tk.httpClient.response.FdkkUserVo;
- import com.fdkankan.tk.mapper.IRoomMapper;
- import com.fdkankan.tk.mapper.IRoomUserMapper;
- import com.fdkankan.tk.request.RoomAddParam;
- import com.fdkankan.tk.request.RoomListParam;
- import com.fdkankan.tk.response.DataCount;
- import com.fdkankan.tk.response.RoomAddUserParam;
- import com.fdkankan.tk.response.RoomVo;
- import com.fdkankan.tk.response.SceneVo;
- import com.fdkankan.tk.service.*;
- import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
- import com.fdkankan.tk.util.Dateutils;
- import lombok.extern.slf4j.Slf4j;
- import org.apache.commons.lang3.StringUtils;
- import org.springframework.beans.BeanUtils;
- import org.springframework.beans.factory.annotation.Autowired;
- import org.springframework.beans.factory.annotation.Value;
- import org.springframework.stereotype.Service;
- /**
- * <p>
- * 服务实现类
- * </p>
- *
- * @author
- * @since 2022-09-19
- */
- @Service
- @Slf4j
- public class RoomServiceImpl extends ServiceImpl<IRoomMapper, Room> implements IRoomService {
- @Autowired
- IRoomNumService roomNumService;
- @Autowired
- ISceneService sceneService;
- @Autowired
- FYunFileServiceInterface uploadToOssUtil;
- @Autowired
- IWxService wxService;
- @Value("${fyun.host}")
- private String queryPath;
- @Autowired
- RedisUtil redisUtil;
- @Autowired
- IWxUserService wxUserService;
- @Autowired
- RoomUtil roomUtil;
- @Autowired
- FdKKService fdKKService;
- @Autowired
- IRoomUserService roomUserService;
- @Autowired
- IRoomVisitLogService roomVisitLogService;
- @Autowired
- IRoomDanmakuService roomDanmakuService;
- @Override
- public PageInfo pageList(RoomListParam param, String token,String wxToken) {
- //log.info("roomList--token:{},wxToken:{}",token,wxToken);
- if(StringUtils.isBlank(token) && StringUtils.isBlank(wxToken) ){
- Page<Room> page = new Page<>(param.getPageNum(),param.getPageSize());
- return PageInfo.PageInfo(page);
- }
- Page<Room> page = null;
- if(StringUtils.isNotBlank(wxToken) ) { //微信小程序调用,返回协作者房间
- String wxUserId = JwtUtil.getUserName(wxToken);
- WxUser wxUser = wxUserService.getById(wxUserId);
- if (wxUser == null || wxUser.getPhoneNumber() == null) {
- return PageInfo.PageInfo(new Page<>(param.getPageNum(), param.getPageSize()));
- }
- param.setUserName(wxUser.getPhoneNumber());
- page = this.getBaseMapper().pageWxList(new Page<>(param.getPageNum(), param.getPageSize()), param);
- }
- if (StringUtils.isNotBlank(token)) {
- String fdToken = String.format(RedisKey.TOKEN_V3, token);
- if (!redisUtil.hasKey(fdToken)) {
- throw new BusinessException(ResultCode.USER_NOT_LOGIN);
- }
- String userName = JwtUtil.getUserName(token);
- redisUtil.expire(fdToken, 6 * 60 * 60);
- param.setUserName(userName);
- page = this.getBaseMapper().pageList(new Page<>(param.getPageNum(), param.getPageSize()), param);
- }
- if(page == null){
- return PageInfo.PageInfo(new Page<>(param.getPageNum(),param.getPageSize()));
- }
- FdkkUserVo userInfo = null;
- if( StringUtils.isNotBlank(token)){
- userInfo = fdKKService.getUserInfo(token);
- }
- HashMap<String, DataCount> dataCountMap = roomVisitLogService.getGroupByRoomId();
- for (Room record : page.getRecords()) {
- DataCount dataCount = dataCountMap.get(record.getRoomId());
- if (dataCount != null) {
- record.setRoomViewCount(dataCount.getDataCount());
- }
- if (!record.getRoomUserName().equals(param.getUserName())) {
- RoomUser roomUser = roomUserService.getByUserName(record.getRoomId(),param.getUserName());
- if (roomUser != null) {
- record.setRoomId(record.getRoomId() + "_" + roomUser.getRoomUserId());
- record.setHostStatus(roomUser.getHostStatus());
- if (roomUser.getLastLookTime() != null) {
- record.setLastLookTime(Dateutils.getDate(roomUser.getLastLookTime()));
- } else {
- record.setLastLookTime(null);
- }
- if(userInfo != null){
- record.setRoomHostName(userInfo.getNickName());
- record.setRoomUserName(userInfo.getUserName());
- }
- record.setIsHomeOwner(false);
- }
- }
- record.setVisitPassword(null);
- }
- return PageInfo.PageInfo(page);
- }
- @Override
- public Room addOrUpdate(RoomAddParam param, String token) {
- if(param.getNumList() == null || param.getNumList().size() <=0){
- throw new BusinessException(ResultCode.PARAM_MISS);
- }
- if(StringUtils.isEmpty(param.getRoomTitle()) ){
- throw new BusinessException(ResultCode.PARAM_MISS);
- }
- Room room = new Room();
- BeanUtils.copyProperties(param,room);
- room.setRoomUserName(JwtUtil.getUserName(token));
- if(StringUtils.isEmpty(room.getRoomHostName())){
- room.setRoomHostName(room.getRoomUserName());
- }
- if(StringUtils.isNotBlank(room.getRoomId())){
- room.setUpdateTime(null);
- room.setHostStatus(null);
- Room byId = this.getById(room.getRoomId());
- if(!checkCanDel(byId)){
- throw new BusinessException(ResultCode.ROOM_ING);
- }
- }else {
- String roomId = roomUtil.genRoomId(1000);
- if(StringUtils.isNotBlank(room.getPlatform()) && room.getPlatform().equals("ucenter")){
- roomId = "temp_" + roomId;
- }
- room.setRoomId(roomId);
- }
- if(param.getNumList().size() >0){
- List<SceneVo> list = sceneService.getListByNumList(param.getNumList());
- if(list.size() >0){
- room.setRoomCoverUrl(list.get(0).getThumb());
- }
- }
- roomUserService.updateByUserObjList(param.getUserObjList(),room);
- this.saveOrUpdate(room);
- roomNumService.addBatch(room.getRoomId(),param.getNumList());
- param.setRoomId(room.getRoomId());
- return param;
- }
- @Override
- public Boolean checkCanDel(Room room){
- Boolean flag = false;
- List<RoomUser> roomUserList = roomUserService.getByRoomId(room.getRoomId());
- for (RoomUser roomUser : roomUserList) {
- if ( roomUser.getRoomStatus() == 1 && roomUser.getHostStatus() == 1){
- flag = true;
- }
- }
- if(room.getHostStatus() == 1 || flag){
- return false;
- }
- return true;
- }
- @Override
- public void deleteById(String roomId) {
- Room room = this.getById(roomId);
- if(room == null ){
- throw new BusinessException(ResultCode.ROOM_MISS);
- }
- if(!checkCanDel(room)){
- throw new BusinessException(ResultCode.DEL_ROOM_ING);
- }
- roomNumService.deleteByRoomId(roomId);
- roomUserService.delByRoomId(roomId);
- if(StringUtils.isNotBlank(room.getRoomShareUrl())){
- try {
- uploadToOssUtil.deleteFile(room.getRoomShareUrl());
- } catch (IOException e) {
- throw new RuntimeException(e);
- }
- }
- this.removeById(roomId);
- }
- @Override
- public RoomVo getRoomInfo(String roomId,String token,String wxToken,String sessionId) {
- log.info("getRoomInfo-request-roomId:{},token:{},wxToken:{}",roomId,token,wxToken);
- String roomUserId = null;
- if(!roomId.contains("temp_") &&roomId.contains("_")){
- String[] split = roomId.split("_");
- roomId = split[0];
- roomUserId = split[1];
- }
- Room room = this.getById(roomId);
- if(room == null){
- throw new BusinessException(ResultCode.ROOM_MISS);
- }
- if(StringUtils.isNotBlank(roomUserId)){
- RoomUser roomUser = roomUserService.getById(roomUserId);
- if(roomUser == null){
- throw new BusinessException(ResultCode.ROOM_MISS);
- }
- }
- List<String> numList = roomNumService.getListByRoomId(roomId);
- List<SceneVo> list = new ArrayList<>();
- if(numList.size() >0){
- list = sceneService.getListByNumList(numList);
- }
- RoomVo roomVo = new RoomVo();
- BeanUtils.copyProperties(room,roomVo);
- if(StringUtils.isNotBlank(roomUserId)){
- roomVo.setRoomId(roomId+"_"+roomUserId);
- roomVo.setRoomHostCode("");
- roomVo.setRoomShareCode("");
- }
- String userName = null;
- if(StringUtils.isBlank(token)){
- roomVo.setVisitPassword(null);
- roomVo.setRoomHostName("");
- roomVo.setHead("");
- }else {
- userName = JwtUtil.getUserName(token);
- }
- if(StringUtils.isNotBlank(roomUserId) && StringUtils.isNotBlank(token)){
- FdkkUserVo userInfo = fdKKService.getUserInfo(token);
- if(userInfo != null){
- roomVo.setRoomHostName(userInfo.getNickName());
- roomVo.setRoomUserName(userInfo.getUserName());
- roomVo.setHead(userInfo.getHead());
- }
- }
- //
- if(StringUtils.isNotBlank(wxToken)){
- String redisKey = String.format(RedisKeyUtil.roomPassword, room.getRoomId(), room.getVisitPassword(), wxToken);
- log.info("rediskey:{}",redisKey);
- if(redisUtil.hasKey(redisKey)){
- roomVo.setTakeLookLock(0);
- }
- WxUser wxUser = wxUserService.getById(JwtUtil.getUserName(wxToken));
- userName = wxUser.getPhoneNumber();
- }else {
- if(StringUtils.isNotBlank(sessionId)){
- String redisKey = String.format(RedisKeyUtil.roomPassword, room.getRoomId(), room.getVisitPassword(), sessionId);
- log.info("rediskey:{}",redisKey);
- if(redisUtil.hasKey(redisKey)){
- roomVo.setTakeLookLock(0);
- }
- }
- }
- if(roomUserId != null){
- RoomUser roomUser = roomUserService.getById(roomUserId);
- if(roomUser != null){
- roomVo.setRoomHostCode(roomUser.getRoomHostCode());
- roomVo.setRoomShareCode(roomUser.getRoomShareCode());
- roomVo.setHostStatus(roomUser.getHostStatus());
- if(userName!= null && userName.equals(roomUser.getUserName())){
- roomVo.setIsHost(1);
- }
- }
- }else if(userName != null && userName.equals(room.getRoomUserName())){
- roomVo.setIsHost(1);
- }
- roomVo.setSceneData(list);
- List<RoomUser> roomUserList = roomUserService.getByRoomId(roomId);
- roomVo.setUserObjList(roomUserList);
- log.info("getRoomInfo-response-roomId:{},token:{},wxToken:{},roomVo:{}",roomId,token,wxToken,roomVo);
- return roomVo;
- }
- @Override
- public String getWxQrCode(String roomId,String type) {
- String roomUserId = null;
- RoomUser roomUser = null;
- String roomIdDb = roomId;
- if(!roomId.contains("temp_") &&roomId.contains("_")){
- String[] split = roomId.split("_");
- roomIdDb = split[0];
- roomUserId = split[1];
- roomUser = roomUserService.getById(roomUserId);
- if(roomUser == null){
- throw new BusinessException(ResultCode.ROOM_MISS);
- }
- }
- Room room = this.getById(roomIdDb);
- if(room == null){
- throw new BusinessException(ResultCode.ROOM_MISS);
- }
- String roomShareCode = room.getRoomShareCode();
- String roomHostCode = room.getRoomHostCode();
- if(roomUser!= null){
- roomShareCode = roomUser.getRoomShareCode();
- roomHostCode = roomUser.getRoomHostCode();
- }
- if(type.equals("follower") && StringUtils.isNotBlank(roomShareCode)){ //普通用户二维码
- if(uploadToOssUtil.fileExist(roomShareCode) ){
- return roomShareCode +"?"+System.currentTimeMillis();
- }
- }
- if(type.equals("leader") && StringUtils.isNotBlank(roomHostCode)){ //主持人二维码
- if(uploadToOssUtil.fileExist(roomHostCode) ){
- return roomHostCode +"?"+System.currentTimeMillis();
- }
- }
- if(type.equals("leader")){ //检查房间场景可用性
- RoomVo roomVo = this.getRoomInfo(roomId,null,null,null);
- List<SceneVo> sceneData = roomVo.getSceneData();
- for (SceneVo sceneDatum : sceneData) {
- if(sceneDatum.getStatus() != 2){
- throw new BusinessException(ResultCode.SCENE_STATUS_ERROR);
- }
- }
- }
- String path = null;
- if(type.equals("leader")){
- path = String.format(WxSharCodePath.hostCodePath,roomId,type,room.getRoomUserName());
- }else {
- path = String.format(WxSharCodePath.shardCodePath,roomId,"customer");
- }
- String localPath = String.format(FilePath.LOCAL_QRCODE_PATH, type,roomId);
- String ossPath = String.format(FilePath.OSS_QRCODE_PATH,type, roomId);
- wxService.getWxQRCode(path,localPath,0);
- if(!new File(localPath).exists()){
- throw new BusinessException(ResultCode.QRCODE_MISS);
- }
- uploadToOssUtil.uploadFile(localPath,ossPath);
- if(!uploadToOssUtil.fileExist(ossPath)){
- FileUtil.del(localPath);
- throw new BusinessException(ResultCode.QRCODE_MISS);
- }
- if(roomUser != null){
- if(type.equals("leader")){
- roomUser.setRoomHostCode(queryPath + ossPath);
- }else {
- roomUser.setRoomShareCode(queryPath + ossPath);
- }
- roomUserService.updateById(roomUser);
- }else {
- if(type.equals("leader")){
- room.setRoomHostCode(queryPath + ossPath);
- }else {
- room.setRoomShareCode(queryPath + ossPath);
- }
- this.updateById(room);
- }
- FileUtil.del(localPath);
- return queryPath + ossPath +"?"+System.currentTimeMillis();
- }
- /**
- * 加入房间,开启带看,退出房间
- * type 0 加入房间,1退出房间
- * role follower leader
- */
- @Override
- public void inOrOutRoom(String roomId, String role, Integer type,String userId) {
- log.info("inOrOutRoom--roomId:{},role:{},type:{},userId:{}",roomId,role,type,userId);
- if(roomId == null || StringUtils.isBlank(role)
- || ( !role.equals("leader") && !role.equals("customer")) ){
- throw new BusinessException(ResultCode.PARAM_MISS);
- }
- String wxRoomId = roomId;
- Integer roomUserId = null;
- if(!roomId.contains("temp_") && roomId.contains("_")){
- String[] split = roomId.split("_");
- roomId =split[0];
- roomUserId = Integer.parseInt(split[1]);
- }
- Room room = this.getById(roomId);
- if(room == null){
- throw new BusinessException(ResultCode.ROOM_MISS);
- }
- String platform = room.getPlatform();
- if(room.getUseStartTime() != null && room.getUseStartTime().getTime() > new Date().getTime()){
- throw new BusinessException(ResultCode.ROOM_TIME_ERROR);
- }
- if(room.getUseEndTime() != null && room.getUseEndTime().getTime() <= new Date().getTime()){
- throw new BusinessException(ResultCode.ROOM_END_EX);
- }
- if(role.equals("customer")){
- if(platform.equals("4dkankan")){
- roomVisitLogService.addLog(roomId,roomUserId,userId,type,0);
- }
- this.updateById(room);
- return;
- }
- if(roomUserId != null){ //协作带看
- RoomUser roomuser = roomUserService.getById(roomUserId);
- roomuser.setLastLookTime(new Date());
- if(type == 0 ){ //加入房间,开启带看
- roomuser.setRoomStatus(1);
- roomuser.setHostStatus(1);
- }
- if(type == 1 ){ //加入房间,开启带看
- roomuser.setHostStatus(0);
- }
- roomUserService.updateById(roomuser);
- }else {
- room.setLastLookTime(DateUtil.formatDateTime(new Date()));
- if(type == 0) {
- room.setHostStatus(1);
- }
- if(type == 1 ){ //离开房间
- room.setHostStatus(0);
- }
- }
- if(type == 0 ){ //加入房间,开启带看
- room.setRoomStatus(1);
- if( platform.equals("4dkankan")){
- roomVisitLogService.addLog(roomId,roomUserId,userId,type,1);
- }
- }
- if(type == 1 ){ //离开房间
- if( platform.equals("4dkankan")){
- roomVisitLogService.addLog(roomId,roomUserId,userId,type,1);
- this.hostLeaveRoom(roomId,roomUserId);
- }
- }
- this.updateById(room);
- }
- @Override
- public Long getCountAndTbStatus() {
- return this.getBaseMapper().getCountAndTbStatus();
- }
- @Override
- public List<Room> getRunningRoom() {
- LambdaQueryWrapper<Room> wrapper = new LambdaQueryWrapper<>();
- wrapper.in(Room::getRoomStatus,0,1);
- wrapper.eq(Room::getPlatform,"4dkankan");
- return this.list(wrapper);
- }
- @Override
- public void stopRoom(String roomId) {
- LambdaUpdateWrapper<Room> wrapper = new LambdaUpdateWrapper<>();
- wrapper.eq(Room::getRoomId,roomId);
- wrapper.set(Room::getHostStatus,0);
- wrapper.set(Room::getRoomStatus,2);
- wrapper.set(Room :: getIsShow,0);
- this.update(wrapper);
- roomVisitLogService.stopRoom(roomId,null);
- roomDanmakuService.saveDanMaku(roomId,null);
- List<RoomUser> byRoomId = roomUserService.getByRoomId(roomId);
- for (RoomUser roomUser : byRoomId) {
- roomUserService.stopRoom(roomUser);
- }
- }
- @Override
- public void hostLeaveRoom(String roomId, Integer roomUserId) {
- roomVisitLogService.stopRoom(roomId,roomUserId);
- roomDanmakuService.saveDanMaku(roomId,roomUserId);
- }
- @Override
- public HashMap<String, Room> getByIds(Set<String> roomIds) {
- HashMap<String,Room> map = new HashMap<>();
- if(roomIds.size() >0){
- List<Room> rooms = this.listByIds(roomIds);
- rooms.forEach(entity -> map.put(entity.getRoomId(),entity));
- }
- return map;
- }
- @Override
- public List<Room> getLikeTitle(String roomTitle) {
- LambdaQueryWrapper<Room> wrapper = new LambdaQueryWrapper<>();
- wrapper.like(Room::getRoomTitle,roomTitle);
- return this.list(wrapper);
- }
- @Override
- public List<Room> getRoomByToken(String token) {
- String userName = null;
- if(StringUtils.isNotBlank(token)){
- userName = JwtUtil.getUserName(token);
- }
- LambdaQueryWrapper<Room> wrapper = new LambdaQueryWrapper<>();
- if(StringUtils.isNotBlank(userName)){
- wrapper.eq(Room::getRoomUserName,userName);
- }
- return this.list(wrapper);
- }
- @Override
- public void dissolveTheRoom(String roomId) {
- this.changRoomStatus(roomId,2);
- }
- @Override
- public void openTheRoom(String roomId) {
- this.changRoomStatus(roomId,1);
- }
- private void changRoomStatus(String roomId,Integer status ){
- Room room = this.getById(roomId);
- if(room == null){
- throw new BusinessException(ResultCode.ROOM_MISS);
- }
- if(!room.getPlatform().equals("fd") && !room.getPlatform().equals("ucenter") && !room.getPlatform().equals("4dkz")){
- throw new BusinessException(ResultCode.ROOM_DISSOLVE_ERROR);
- }
- LambdaUpdateWrapper<Room> wrapper = new LambdaUpdateWrapper<>();
- wrapper.eq(Room::getRoomId,room.getRoomId());
- wrapper.set(Room::getRoomStatus,status);
- this.update(wrapper);
- }
- @Override
- public Room getRoomIdByNum(String num) {
- List<RoomNum> roomNums = roomNumService.getByNum(num);
- List<String> roomIds = roomNums.stream().map(RoomNum::getRoomId).collect(Collectors.toList());
- return this.getUcenterPlatform(roomIds);
- }
- private Room getUcenterPlatform(List<String> roomIds) {
- if(roomIds.isEmpty()){
- return null;
- }
- LambdaQueryWrapper<Room> wrapper = new LambdaQueryWrapper<>();
- wrapper.in(Room::getRoomId,roomIds);
- wrapper.eq(Room::getPlatform,"ucenter");
- wrapper.gt(Room::getUseEndTime,new Date());
- List<Room> list = this.list(wrapper);
- if(list.isEmpty()){
- return null;
- }
- return list.get(0);
- }
- }
|