package com.fdkk.fdkkmeta.task; import cn.hutool.core.util.ArrayUtil; import com.alibaba.fastjson.JSON; import com.alibaba.fastjson.JSONArray; import com.alibaba.fastjson.JSONObject; import com.fdkk.fdkkmeta.config.MetaConfig; import com.fdkk.fdkkmeta.domain.entity.mysql.BreakpointsEntity; import com.fdkk.fdkkmeta.domain.entity.mysql.MoveFrameEntity; import com.fdkk.fdkkmeta.domain.entity.mysql.RotateFrameEntity; import com.fdkk.fdkkmeta.domain.entity.mysql.UserEntity; import com.fdkk.fdkkmeta.domain.po.*; import com.fdkk.fdkkmeta.grpc.*; import com.fdkk.fdkkmeta.grpcService.SceneGrpcService; import com.fdkk.fdkkmeta.redis.RedisCache; import com.fdkk.fdkkmeta.service.BreakpointsService; import com.fdkk.fdkkmeta.service.MoveFrameService; import com.fdkk.fdkkmeta.service.UserService; import com.fdkk.fdkkmeta.service.RotateFrameService; import com.fdkk.fdkkmeta.util.ProtoJsonUtils; import com.google.protobuf.util.JsonFormat; import lombok.extern.slf4j.Slf4j; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.scheduling.annotation.Scheduled; import org.springframework.stereotype.Component; import java.io.IOException; import java.util.ArrayList; import java.util.Date; import java.util.List; /** * @author Xiewj * @date 2022/3/30 */ @Component @Slf4j public class UpdateFrameMetaTask { @Autowired MetaConfig metaConfig; @Autowired RedisCache redisCache; @Autowired UserService userService; @Autowired RotateFrameService rotateFrameService; @Autowired MoveFrameService moveFrameService; @Autowired SceneGrpcService sceneGrpcService; @Autowired BreakpointsService breakpointsService; @Scheduled(initialDelay=200, fixedDelay=1000/30) public void updateFrameMetadata(){ List userOnline = userService.findUserOnline(true); log.info("进入定时任务{}", ArrayUtil.isNotEmpty(userOnline)?userOnline.size():0); // JSONObject a=new JSONObject(); // a.put("123123",123123); //使用并行流处理数据 userOnline.parallelStream().forEach( userEntity -> { //UserEntity user = redisCache.getCacheObject("setCacheRequest:" + userEntity.getUserId()); // redisCache.set("updateFrameMetadata:"+userEntity.getUserId(),a.toJSONString()); List list = redisCache.getCacheList("setCacheRequest:"+userEntity.getUserId()); handle( userEntity,list); } ); } private void handle(UserEntity user,List list){ try { if(list.size() == 0){ //写入一个默认数据到redis里 createDefaultFrameMetadata( user); return; } List rotateJoystickList = new ArrayList(); JSONObject myState = redisCache.getCacheObject("UserState:"+user.getUserId()); ActionPO _actionPO = list.get(0); int firstActionType = _actionPO.getAction_type(); JSONArray path = _actionPO.getPath(); if(firstActionType == 1014||firstActionType == 15){ rotateJoystickList.add(_actionPO); } else if(firstActionType == 1){ long startBreakPointId = path.getLongValue(0); long endBreakPointId = path.getLongValue(1); BreakpointsEntity startBreakpointsEntity = breakpointsService.findById(startBreakPointId); BreakpointsEntity endBreakpointsEntity = breakpointsService.findById(endBreakPointId); //过渡 if(myState.getIntValue("isMoving") == 1){ MoveFrameEntity moveFrameEntity = moveFrameService.findByAppIAndStartBreakPointIdAndEndBreakPointIdAndAngleAndFrameIndex(user.getAppId(), startBreakPointId, endBreakPointId,_actionPO.getCameraAngle().getYaw(),_actionPO.getFrameIndex()+1); //准备过渡下一段 if(moveFrameEntity==null){ RotateFrameEntity rotateFrameEntity = rotateFrameService.findByAppIdAndBreakPointIdAndFrameIndex(user.getAppId(),endBreakPointId,_actionPO.getCameraAngle().getYaw()); path.remove(0); if(path.size()>1){ startBreakPointId = endBreakPointId; endBreakPointId = path.getLongValue(1); _actionPO.setPath(path); _actionPO.setFrameIndex(0); _actionPO.setStartPostion(null); _actionPO.setEndPosition(null); int subFrameIndex = moveFrameService.getCountByAppIAndStartBreakPointIdAndEndBreakPointIdAndAngle( user.getAppId(),startBreakPointId,endBreakPointId, _actionPO.getCameraAngle().getYaw()%45); _actionPO.setSubFrameIndex(subFrameIndex); _actionPO.setPlayerPosition(endBreakpointsEntity.getPosition()); startBreakpointsEntity = breakpointsService.findById(startBreakPointId); endBreakpointsEntity = breakpointsService.findById(endBreakPointId); int _angle = sceneGrpcService.calAngleForBreakPointId(startBreakpointsEntity,endBreakpointsEntity); AnglePO playerAngle = user.getPlayerAngle(); playerAngle.setYaw(_angle); _actionPO.setPlayerAngle(playerAngle); //更新redis记录 redisCache.setCacheListByIndex("setCacheRequest:"+user.getUserId(),0,_actionPO); myState.put("isMoving",0); redisCache.setCacheObject("UserState:"+user.getUserId(),myState); //moveFrameEntity = moveFrameService.findByAppIAndStartBreakPointIdAndEndBreakPointIdAndAngleAndFrameIndex(user.getAppId(), startBreakPointId, endBreakPointId,_actionPO.getCameraAngle().getYaw(),0); user.setFrameId(rotateFrameEntity.getId()); user.setPlayerAngle(playerAngle); user.setBreakPointId(startBreakPointId); user.setPlayerPosition(startBreakpointsEntity.getPosition()); userService.updateById(user); } //过渡全部结束 else{ //删除redis里的数据 redisCache.lTrim("setCacheRequest:"+user.getUserId(),1,-1); //更新user表 //moveFrameEntity = moveFrameService.findByAppIAndStartBreakPointIdAndEndBreakPointIdAndAngleAndFrameIndex(user.getAppId(), startBreakPointId, endBreakPointId,_actionPO.getCameraAngle().getYaw(),_actionPO.getFrameIndex()); user.setPlayerPosition(endBreakpointsEntity.getPosition()); user.setFrameId(rotateFrameEntity.getId()); user.setPlayerAngle(_actionPO.getPlayerAngle()); user.setBreakPointId(endBreakPointId); userService.updateById(user); myState.put("isMoving",0); redisCache.setCacheObject("UserState:"+user.getUserId(),myState); //执行下一条记录 list.remove(0); } handle( user,list); return ; } //更新 if(_actionPO.getStartPostion() == null){ _actionPO.setStartPostion(startBreakpointsEntity.getPosition()); _actionPO.setEndPosition(endBreakpointsEntity.getPosition()); } _actionPO.setFrameIndex(_actionPO.getFrameIndex()+1); PointPO playerPosition = new PointPO(); playerPosition.setX((_actionPO.getEndPosition().getX() - _actionPO.getStartPostion().getX())/_actionPO.getSubFrameIndex()*_actionPO.getFrameIndex()); playerPosition.setY((_actionPO.getEndPosition().getY() - _actionPO.getStartPostion().getY())/_actionPO.getSubFrameIndex()*_actionPO.getFrameIndex()); playerPosition.setZ((_actionPO.getEndPosition().getZ() - _actionPO.getStartPostion().getZ())/_actionPO.getSubFrameIndex()*_actionPO.getFrameIndex()); createMoveFrameMetadata(user.getUserId(),_actionPO.getPlayerAngle(), playerPosition, moveFrameEntity,_actionPO.getTrace_id()); //更新redis里的数据 redisCache.setCacheListByIndex("setCacheRequest:"+user.getUserId(),0,_actionPO); } else if(myState.getIntValue("isMoving") == 0){ if(list.size()>0){ //中断,执行下一条记录 list.remove(0); redisCache.lTrim("setCacheRequest:"+user.getUserId(),1,-1); handle( user,list); return ; } else{ //过渡 myState.put("isMoving",1); redisCache.setCacheObject("UserState:"+user.getUserId(),myState); MoveFrameEntity moveFrameEntity = moveFrameService.findByAppIAndStartBreakPointIdAndEndBreakPointIdAndAngleAndFrameIndex(user.getAppId(), startBreakPointId, endBreakPointId,_actionPO.getCameraAngle().getYaw(),_actionPO.getFrameIndex()+1); //更新 int _angle = sceneGrpcService.calAngleForBreakPointId(startBreakpointsEntity,endBreakpointsEntity); AnglePO playerAngle = user.getPlayerAngle(); playerAngle.setYaw(_angle); createMoveFrameMetadata( user.getUserId(),playerAngle,startBreakpointsEntity.getPosition(), moveFrameEntity,_actionPO.getTrace_id()); _actionPO.setFrameIndex(_actionPO.getFrameIndex()+1); _actionPO.setStartPostion(startBreakpointsEntity.getPosition()); _actionPO.setEndPosition(endBreakpointsEntity.getPosition()); //更新redis里的数据 redisCache.setCacheListByIndex("setCacheRequest:"+user.getUserId(),0,_actionPO); } } /****************************************************************************************/ return; } long lastFrameId = _actionPO.getFrameId(); for(int i=1;i rotateJoystickList,int firstActionType) throws IOException { JSONArray actionResponses = new JSONArray(); String[] traceIds = new String[rotateJoystickList.size()]; if(rotateJoystickList.size()>0){ for(int j=0;j