UpdateFrameMetaTask.java 23 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471
  1. package com.fdkk.fdkkmeta.task;
  2. import cn.hutool.core.util.ArrayUtil;
  3. import com.alibaba.fastjson.JSON;
  4. import com.alibaba.fastjson.JSONArray;
  5. import com.alibaba.fastjson.JSONObject;
  6. import com.fdkk.fdkkmeta.config.MetaConfig;
  7. import com.fdkk.fdkkmeta.domain.entity.mysql.BreakpointsEntity;
  8. import com.fdkk.fdkkmeta.domain.entity.mysql.MoveFrameEntity;
  9. import com.fdkk.fdkkmeta.domain.entity.mysql.RotateFrameEntity;
  10. import com.fdkk.fdkkmeta.domain.entity.mysql.UserEntity;
  11. import com.fdkk.fdkkmeta.domain.po.*;
  12. import com.fdkk.fdkkmeta.grpc.*;
  13. import com.fdkk.fdkkmeta.grpcService.SceneGrpcService;
  14. import com.fdkk.fdkkmeta.redis.RedisCache;
  15. import com.fdkk.fdkkmeta.service.BreakpointsService;
  16. import com.fdkk.fdkkmeta.service.MoveFrameService;
  17. import com.fdkk.fdkkmeta.service.UserService;
  18. import com.fdkk.fdkkmeta.service.RotateFrameService;
  19. import com.fdkk.fdkkmeta.util.ProtoJsonUtils;
  20. import com.google.protobuf.util.JsonFormat;
  21. import lombok.extern.slf4j.Slf4j;
  22. import org.springframework.beans.factory.annotation.Autowired;
  23. import org.springframework.scheduling.annotation.Scheduled;
  24. import org.springframework.stereotype.Component;
  25. import java.io.IOException;
  26. import java.util.ArrayList;
  27. import java.util.Date;
  28. import java.util.List;
  29. /**
  30. * @author Xiewj
  31. * @date 2022/3/30
  32. */
  33. @Component
  34. @Slf4j
  35. public class UpdateFrameMetaTask {
  36. @Autowired
  37. MetaConfig metaConfig;
  38. @Autowired
  39. RedisCache redisCache;
  40. @Autowired
  41. UserService userService;
  42. @Autowired
  43. RotateFrameService rotateFrameService;
  44. @Autowired
  45. MoveFrameService moveFrameService;
  46. @Autowired
  47. SceneGrpcService sceneGrpcService;
  48. @Autowired
  49. BreakpointsService breakpointsService;
  50. @Scheduled(initialDelay=200, fixedDelay=1000/30)
  51. public void updateFrameMetadata(){
  52. List<UserEntity> userOnline = userService.findUserOnline(true);
  53. log.info("进入定时任务{}", ArrayUtil.isNotEmpty(userOnline)?userOnline.size():0);
  54. // JSONObject a=new JSONObject();
  55. // a.put("123123",123123);
  56. //使用并行流处理数据
  57. userOnline.parallelStream().forEach(
  58. userEntity -> {
  59. //UserEntity user = redisCache.getCacheObject("setCacheRequest:" + userEntity.getUserId());
  60. // redisCache.set("updateFrameMetadata:"+userEntity.getUserId(),a.toJSONString());
  61. List<ActionPO> list = redisCache.getCacheList("setCacheRequest:"+userEntity.getUserId());
  62. handle( userEntity,list);
  63. }
  64. );
  65. }
  66. private void handle(UserEntity user,List<ActionPO> list){
  67. try {
  68. if(list.size() == 0){
  69. //写入一个默认数据到redis里
  70. createDefaultFrameMetadata( user);
  71. return;
  72. }
  73. List<ActionPO> rotateJoystickList = new ArrayList<ActionPO>();
  74. JSONObject myState = redisCache.getCacheObject("UserState:"+user.getUserId());
  75. ActionPO _actionPO = list.get(0);
  76. int firstActionType = _actionPO.getAction_type();
  77. JSONArray path = _actionPO.getPath();
  78. if(firstActionType == 1014||firstActionType == 15){
  79. rotateJoystickList.add(_actionPO);
  80. }
  81. else if(firstActionType == 1){
  82. long startBreakPointId = path.getLongValue(0);
  83. long endBreakPointId = path.getLongValue(1);
  84. BreakpointsEntity startBreakpointsEntity = breakpointsService.findById(startBreakPointId);
  85. BreakpointsEntity endBreakpointsEntity = breakpointsService.findById(endBreakPointId);
  86. //过渡
  87. if(myState.getIntValue("isMoving") == 1){
  88. MoveFrameEntity moveFrameEntity = moveFrameService.findByAppIAndStartBreakPointIdAndEndBreakPointIdAndAngleAndFrameIndex(user.getAppId(), startBreakPointId, endBreakPointId,_actionPO.getCameraAngle().getYaw(),_actionPO.getFrameIndex()+1);
  89. //准备过渡下一段
  90. if(moveFrameEntity==null){
  91. RotateFrameEntity rotateFrameEntity = rotateFrameService.findByAppIdAndBreakPointIdAndFrameIndex(user.getAppId(),endBreakPointId,_actionPO.getCameraAngle().getYaw());
  92. path.remove(0);
  93. if(path.size()>1){
  94. startBreakPointId = endBreakPointId;
  95. endBreakPointId = path.getLongValue(1);
  96. _actionPO.setPath(path);
  97. _actionPO.setFrameIndex(0);
  98. _actionPO.setStartPostion(null);
  99. _actionPO.setEndPosition(null);
  100. int subFrameIndex = moveFrameService.getCountByAppIAndStartBreakPointIdAndEndBreakPointIdAndAngle( user.getAppId(),startBreakPointId,endBreakPointId, _actionPO.getCameraAngle().getYaw()%45);
  101. _actionPO.setSubFrameIndex(subFrameIndex);
  102. _actionPO.setPlayerPosition(endBreakpointsEntity.getPosition());
  103. startBreakpointsEntity = breakpointsService.findById(startBreakPointId);
  104. endBreakpointsEntity = breakpointsService.findById(endBreakPointId);
  105. int _angle = sceneGrpcService.calAngleForBreakPointId(startBreakpointsEntity,endBreakpointsEntity);
  106. AnglePO playerAngle = user.getPlayerAngle();
  107. playerAngle.setYaw(_angle);
  108. _actionPO.setPlayerAngle(playerAngle);
  109. //更新redis记录
  110. redisCache.setCacheListByIndex("setCacheRequest:"+user.getUserId(),0,_actionPO);
  111. myState.put("isMoving",0);
  112. redisCache.setCacheObject("UserState:"+user.getUserId(),myState);
  113. //moveFrameEntity = moveFrameService.findByAppIAndStartBreakPointIdAndEndBreakPointIdAndAngleAndFrameIndex(user.getAppId(), startBreakPointId, endBreakPointId,_actionPO.getCameraAngle().getYaw(),0);
  114. user.setFrameId(rotateFrameEntity.getId());
  115. user.setPlayerAngle(playerAngle);
  116. user.setBreakPointId(startBreakPointId);
  117. user.setPlayerPosition(startBreakpointsEntity.getPosition());
  118. userService.updateById(user);
  119. }
  120. //过渡全部结束
  121. else{
  122. //删除redis里的数据
  123. redisCache.lTrim("setCacheRequest:"+user.getUserId(),1,-1);
  124. //更新user表
  125. //moveFrameEntity = moveFrameService.findByAppIAndStartBreakPointIdAndEndBreakPointIdAndAngleAndFrameIndex(user.getAppId(), startBreakPointId, endBreakPointId,_actionPO.getCameraAngle().getYaw(),_actionPO.getFrameIndex());
  126. user.setPlayerPosition(endBreakpointsEntity.getPosition());
  127. user.setFrameId(rotateFrameEntity.getId());
  128. user.setPlayerAngle(_actionPO.getPlayerAngle());
  129. user.setBreakPointId(endBreakPointId);
  130. userService.updateById(user);
  131. myState.put("isMoving",0);
  132. redisCache.setCacheObject("UserState:"+user.getUserId(),myState);
  133. //执行下一条记录
  134. list.remove(0);
  135. }
  136. handle( user,list);
  137. return ;
  138. }
  139. //更新
  140. if(_actionPO.getStartPostion() == null){
  141. _actionPO.setStartPostion(startBreakpointsEntity.getPosition());
  142. _actionPO.setEndPosition(endBreakpointsEntity.getPosition());
  143. }
  144. _actionPO.setFrameIndex(_actionPO.getFrameIndex()+1);
  145. PointPO playerPosition = new PointPO();
  146. playerPosition.setX((_actionPO.getEndPosition().getX() - _actionPO.getStartPostion().getX())/_actionPO.getSubFrameIndex()*_actionPO.getFrameIndex());
  147. playerPosition.setY((_actionPO.getEndPosition().getY() - _actionPO.getStartPostion().getY())/_actionPO.getSubFrameIndex()*_actionPO.getFrameIndex());
  148. playerPosition.setZ((_actionPO.getEndPosition().getZ() - _actionPO.getStartPostion().getZ())/_actionPO.getSubFrameIndex()*_actionPO.getFrameIndex());
  149. createMoveFrameMetadata(user.getUserId(),_actionPO.getPlayerAngle(), playerPosition, moveFrameEntity,_actionPO.getTrace_id());
  150. //更新redis里的数据
  151. redisCache.setCacheListByIndex("setCacheRequest:"+user.getUserId(),0,_actionPO);
  152. }
  153. else if(myState.getIntValue("isMoving") == 0){
  154. if(list.size()>0){
  155. //中断,执行下一条记录
  156. list.remove(0);
  157. redisCache.lTrim("setCacheRequest:"+user.getUserId(),1,-1);
  158. handle( user,list);
  159. return ;
  160. }
  161. else{
  162. //过渡
  163. myState.put("isMoving",1);
  164. redisCache.setCacheObject("UserState:"+user.getUserId(),myState);
  165. MoveFrameEntity moveFrameEntity = moveFrameService.findByAppIAndStartBreakPointIdAndEndBreakPointIdAndAngleAndFrameIndex(user.getAppId(), startBreakPointId, endBreakPointId,_actionPO.getCameraAngle().getYaw(),_actionPO.getFrameIndex()+1);
  166. //更新
  167. int _angle = sceneGrpcService.calAngleForBreakPointId(startBreakpointsEntity,endBreakpointsEntity);
  168. AnglePO playerAngle = user.getPlayerAngle();
  169. playerAngle.setYaw(_angle);
  170. createMoveFrameMetadata( user.getUserId(),playerAngle,startBreakpointsEntity.getPosition(), moveFrameEntity,_actionPO.getTrace_id());
  171. _actionPO.setFrameIndex(_actionPO.getFrameIndex()+1);
  172. _actionPO.setStartPostion(startBreakpointsEntity.getPosition());
  173. _actionPO.setEndPosition(endBreakpointsEntity.getPosition());
  174. //更新redis里的数据
  175. redisCache.setCacheListByIndex("setCacheRequest:"+user.getUserId(),0,_actionPO);
  176. }
  177. }
  178. /****************************************************************************************/
  179. return;
  180. }
  181. long lastFrameId = _actionPO.getFrameId();
  182. for(int i=1;i<list.size();++i){
  183. ActionPO actionPO = list.get(i);
  184. // if(firstActionType != actionPO.getAction_type()){
  185. // break;
  186. // }
  187. //旋转
  188. if(actionPO.getAction_type() == 1014||actionPO.getAction_type() == 15){
  189. rotateJoystickList.add(actionPO);
  190. lastFrameId = actionPO.getFrameId();
  191. continue;
  192. }
  193. else{
  194. break;
  195. }
  196. }
  197. createRotateFrameMetadata( user, rotateJoystickList, firstActionType);
  198. //删除redis里的数据
  199. redisCache.lTrim("setCacheRequest:"+user.getUserId(),rotateJoystickList.size(),-1);
  200. //更新user表
  201. user.setFrameId(lastFrameId);
  202. userService.updateById(user);
  203. }catch (Exception e){
  204. e.printStackTrace();
  205. log.info("handleException{}",e.getMessage());
  206. }
  207. }
  208. private void createDefaultFrameMetadata(UserEntity user) throws IOException {
  209. String[] traceIds = new String[1];
  210. traceIds[0] = "";
  211. JSONArray actionResponses = new JSONArray();
  212. RotateFrameEntity rotateFrameEntity = rotateFrameService.findById(user.getFrameId());
  213. PointPO playerPosition = user.getPlayerPosition();
  214. Point playerPt = Point.newBuilder().setX(String.valueOf(playerPosition.getX())).setY(String.valueOf(playerPosition.getY())).setZ(String.valueOf(playerPosition.getZ())).build();
  215. AnglePO playerAngle = user.getPlayerAngle();
  216. AngleUe4 playerAg =AngleUe4.newBuilder().setPitch(playerAngle.getPitch()).setYaw(playerAngle.getYaw()).setRoll(playerAngle.getRoll()).build();
  217. Space player = sceneGrpcService.createSpace(playerPt,playerAg);
  218. PointPO cameraPoint = rotateFrameEntity.getCameraPosition();
  219. Point cameraPosition = sceneGrpcService.createPoint(String.valueOf(cameraPoint.getX()),String.valueOf(cameraPoint.getY()),String.valueOf(cameraPoint.getZ()));
  220. AnglePO cameraAnglePO = rotateFrameEntity.getCameraAngle();
  221. AngleUe4 cameraAngle = sceneGrpcService.createAngle(cameraAnglePO.getPitch(),cameraAnglePO.getYaw(),cameraAnglePO.getRoll());
  222. Space camera = sceneGrpcService.createSpace(cameraPosition,cameraAngle);
  223. MetaDataFrameReply.Builder builder = MetaDataFrameReply.newBuilder();
  224. for(int i=0;i<traceIds.length;++i){
  225. builder.addTraceIds(traceIds[i]);
  226. }
  227. State playerState = sceneGrpcService.createPlayerState2(player,camera,playerPt);
  228. RenderInfo renderInfo = sceneGrpcService.createRenderInfo();
  229. UserState userState = sceneGrpcService.createUserState( user.getUserId(), playerState, renderInfo, null);
  230. builder.addNewUserStates(userState);
  231. builder.setGetStateType(0);
  232. builder.setCode(200);
  233. builder.setMsg("ok");
  234. //newUserStates
  235. String mediaSrc = metaConfig.getVideoFramePath()+"/"+"0000000001"+"/"+rotateFrameEntity.getBreakPointId()+"/"+rotateFrameEntity.getDirectory()+"/"+rotateFrameEntity.getFileName()+"?m="+new Date().getTime();
  236. builder.setMediaSrc(mediaSrc);
  237. redisCache.lLeftPush("updateFrameMetadata:"+user.getUserId(), ProtoJsonUtils.toJson(builder));
  238. }
  239. private void createMoveFrameMetadata(String user_id,AnglePO playerAngle,PointPO playerPosition,MoveFrameEntity moveFrameEntity,String traceId) throws IOException {
  240. String[] traceIds = new String[1];
  241. traceIds[0] = traceId;
  242. JSONArray actionResponses = new JSONArray();
  243. //RotateFrameEntity rotateFrameEntity = rotateFrameService.findById(user.getFrameId());
  244. //PointPO playerPosition = user.getPlayerPosition();
  245. Point playerPt = Point.newBuilder().setX(String.valueOf(playerPosition.getX())).setY(String.valueOf(playerPosition.getY())).setZ(String.valueOf(playerPosition.getZ())).build();
  246. //AnglePO playerAngle = user.getPlayerAngle();
  247. AngleUe4 playerAg =AngleUe4.newBuilder().setPitch(playerAngle.getPitch()).setYaw(playerAngle.getYaw()).setRoll(playerAngle.getRoll()).build();
  248. Space player = sceneGrpcService.createSpace(playerPt,playerAg);
  249. PointPO cameraPoint = moveFrameEntity.getCameraPosition();
  250. Point cameraPosition = sceneGrpcService.createPoint(String.valueOf(cameraPoint.getX()),String.valueOf(cameraPoint.getY()),String.valueOf(cameraPoint.getZ()));
  251. AnglePO cameraAnglePO = moveFrameEntity.getCameraAngle();
  252. AngleUe4 cameraAngle = sceneGrpcService.createAngle(cameraAnglePO.getPitch(),cameraAnglePO.getYaw(),cameraAnglePO.getRoll());
  253. Space camera = sceneGrpcService.createSpace(cameraPosition,cameraAngle);
  254. MetaDataFrameReply.Builder builder = MetaDataFrameReply.newBuilder();
  255. for(int i=0;i<traceIds.length;++i){
  256. builder.addTraceIds(traceIds[i]);
  257. }
  258. State playerState = sceneGrpcService.createPlayerState2(player,camera,playerPt);
  259. RenderInfo renderInfo = sceneGrpcService.createRenderInfo();
  260. UserState userState = sceneGrpcService.createUserState( user_id, playerState, renderInfo, null);
  261. builder.addNewUserStates(userState);
  262. builder.setGetStateType(0);
  263. builder.setCode(200);
  264. builder.setMsg("ok");
  265. String mediaSrc = metaConfig.getVideoFramePath()+"/"+"0000000001"+"/"+moveFrameEntity.getStartBreakPointId()+"/"+moveFrameEntity.getDirectory()+"/"+moveFrameEntity.getFileName()+"?m="+new Date().getTime();
  266. builder.setMediaSrc(mediaSrc);
  267. redisCache.lLeftPush("updateFrameMetadata:"+user_id,ProtoJsonUtils.toJson(builder));
  268. }
  269. private void createRotateFrameMetadata(UserEntity user,List<ActionPO> rotateJoystickList,int firstActionType) throws IOException {
  270. JSONArray actionResponses = new JSONArray();
  271. String[] traceIds = new String[rotateJoystickList.size()];
  272. if(rotateJoystickList.size()>0){
  273. for(int j=0;j<rotateJoystickList.size();++j){
  274. ActionPO actionPO = rotateJoystickList.get(j);
  275. JSONObject actionResponse = sceneGrpcService.createActionResponse(actionPO.getAction_type(),actionPO.getTrace_id());
  276. actionResponses.add(actionResponse);
  277. traceIds[j] = actionPO.getTrace_id();
  278. }
  279. }
  280. ActionPO lastActionPO = rotateJoystickList.get(rotateJoystickList.size()-1);
  281. RotateFrameEntity rotateFrameEntity = rotateFrameService.findById(lastActionPO.getFrameId());
  282. PointPO playerPosition = user.getPlayerPosition();
  283. Point playerPt = Point.newBuilder().setX(String.valueOf(playerPosition.getX())).setY(String.valueOf(playerPosition.getY())).setZ(String.valueOf(playerPosition.getZ())).build();
  284. AnglePO playerAngle = user.getPlayerAngle();
  285. AngleUe4 playerAg = null;
  286. if(firstActionType == 15){
  287. playerAngle.setYaw(lastActionPO.getPlayerAngle().getYaw());
  288. }
  289. playerAg = AngleUe4.newBuilder().setPitch(playerAngle.getPitch()).setYaw(playerAngle.getYaw()).setRoll(playerAngle.getRoll()).build();
  290. Space player = sceneGrpcService.createSpace(playerPt,playerAg);
  291. PointPO cameraPoint = rotateFrameEntity.getCameraPosition();
  292. log.info("旋转时:计算的frameId:"+lastActionPO.getFrameId()+",相机的坐标:"+cameraPoint.toString());
  293. Point cameraPosition = sceneGrpcService.createPoint(String.valueOf(cameraPoint.getX()),String.valueOf(cameraPoint.getY()),String.valueOf(cameraPoint.getZ()));
  294. AnglePO cameraAnglePO = rotateFrameEntity.getCameraAngle();
  295. AngleUe4 cameraAngle = sceneGrpcService.createAngle(cameraAnglePO.getPitch(),cameraAnglePO.getYaw(),cameraAnglePO.getRoll());
  296. Space camera = sceneGrpcService.createSpace(cameraPosition,cameraAngle);
  297. MetaDataFrameReply.Builder builder = MetaDataFrameReply.newBuilder();
  298. for(int i=0;i<traceIds.length;++i){
  299. builder.addTraceIds(traceIds[i]);
  300. }
  301. State playerState = sceneGrpcService.createPlayerState2(player,camera,playerPt);
  302. RenderInfo renderInfo = sceneGrpcService.createRenderInfo();
  303. UserState userState = sceneGrpcService.createUserState( user.getUserId(), playerState, renderInfo, null);
  304. builder.addNewUserStates(userState);
  305. builder.setGetStateType(0);
  306. builder.setCode(200);
  307. builder.setMsg("ok");
  308. String mediaSrc = metaConfig.getVideoFramePath()+"/"+"0000000001"+"/"+rotateFrameEntity.getBreakPointId()+"/"+rotateFrameEntity.getDirectory()+"/"+rotateFrameEntity.getFileName()+"?m="+new Date().getTime();
  309. builder.setMediaSrc(mediaSrc);
  310. redisCache.lLeftPush("updateFrameMetadata:"+user.getUserId(),ProtoJsonUtils.toJson(builder));
  311. //更新user表
  312. user.setFrameId(lastActionPO.getFrameId());
  313. user.setPlayerAngle(playerAngle);
  314. }
  315. /*
  316. * {
  317. "traceIds": ["d0864cd0-378d-4d49-b7b0-3e8e1b9494c3", "d0864cd0-378d-4d49-b7b0-3e8e1b9494c3", "939087ff-4999-4551-92e4-26ecb67f8aa2"],
  318. "vehicle": null,
  319. "newUserStates": [{
  320. "userId": "dcff36ae4fc1d",
  321. "playerState": {
  322. "roomTypeId": "",
  323. "person": 0,
  324. "avatarId": "",
  325. "skinId": "",
  326. "roomId": ""
  327. "isHost": false,
  328. "isFollowHost": false,
  329. "skinDataVersion": "",
  330. "avatarComponents": "",
  331. "nickName": "",
  332. "movingMode": 0,
  333. "attitude": "",
  334. "areaName": "",
  335. "pathName": "",
  336. "pathId": "",
  337. "avatarSize": 1,
  338. "extra": "",
  339. "prioritySync": false,
  340. "player": {
  341. "position": {
  342. "x": -421.30057,
  343. "y": -1434.4198,
  344. "z": -34
  345. },
  346. "angle": {
  347. "pitch": 0,
  348. "yaw": 47,
  349. "roll": 0
  350. }
  351. },
  352. "camera": {
  353. "position": {
  354. "x": -436.2,
  355. "y": -1408.8,
  356. "z": 130.7
  357. },
  358. "angle": {
  359. "pitch": 0,
  360. "yaw": 315,
  361. "roll": 0
  362. }
  363. },
  364. "cameraCenter": {
  365. "x": -400,
  366. "y": -1450,
  367. "z": 10.610336
  368. }
  369. },
  370. "renderInfo": {
  371. "renderType": 0,
  372. "videoFrame": null,
  373. "cameraStateType": 3,
  374. "isMoving": 1,
  375. "needIfr": 0,
  376. "isVideo": 0,
  377. "stillFrame": 0,
  378. "isRotating": 0,
  379. "isFollowing": 0,
  380. "clientPanoTitlesBitmap": [],
  381. "clientPanoTreceId": "",
  382. "prefetchVideoId": "",
  383. "noMedia": false
  384. },
  385. "event": null,
  386. "relation": 1
  387. }],
  388. "actionResponses": [{
  389. "actionType": 15,
  390. "pointType": 100,
  391. "extra": "",
  392. "traceId": "d0864cd0-378d-4d49-b7b0-3e8e1b9494c3",
  393. "packetId": "d44bd2f5-f877-4dd7-868b-803c64f99082",
  394. "nps": [],
  395. "peopleNum": 0,
  396. "zoneId": "",
  397. "echoMsg": "",
  398. "reserveDetail": null,
  399. "userWithAvatarList": [],
  400. "newUserStates": [],
  401. "code": 0,
  402. "msg": ""
  403. }, {
  404. "actionType": 1,
  405. "pointType": 0,
  406. "extra": "",
  407. "traceId": "939087ff-4999-4551-92e4-26ecb67f8aa2",
  408. "packetId": "",
  409. "nps": [],
  410. "peopleNum": 0,
  411. "zoneId": "",
  412. "echoMsg": "",
  413. "reserveDetail": null,
  414. "userWithAvatarList": [],
  415. "newUserStates": [],
  416. "code": 0,
  417. "msg": ""
  418. }],
  419. "getStateType": 0,
  420. "code": 0,
  421. "msg": "OK"
  422. }
  423. * */
  424. }