SceneUpgradeToV4Service.java 31 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619
  1. package com.fdkankan.repair.service.impl;
  2. import cn.hutool.core.bean.BeanUtil;
  3. import cn.hutool.core.collection.CollUtil;
  4. import cn.hutool.core.exceptions.ExceptionUtil;
  5. import cn.hutool.core.util.StrUtil;
  6. import com.alibaba.fastjson.JSON;
  7. import com.alibaba.fastjson.JSONArray;
  8. import com.alibaba.fastjson.JSONObject;
  9. import com.amazonaws.services.elasticsearch.model.UpgradeStatus;
  10. import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
  11. import com.fdkankan.common.constant.CommonStatus;
  12. import com.fdkankan.common.constant.ConstantFilePath;
  13. import com.fdkankan.common.constant.UploadFilePath;
  14. import com.fdkankan.common.util.FileUtil;
  15. import com.fdkankan.common.util.FileUtils;
  16. import com.fdkankan.common.util.MatrixToImageWriterUtil;
  17. import com.fdkankan.common.util.SceneUtil;
  18. import com.fdkankan.fyun.oss.UploadToOssUtil;
  19. import com.fdkankan.redis.constant.RedisKey;
  20. import com.fdkankan.redis.constant.RedisLockKey;
  21. import com.fdkankan.redis.util.RedisLockUtil;
  22. import com.fdkankan.redis.util.RedisUtil;
  23. import com.fdkankan.repair.bean.RequestSceneProV4;
  24. import com.fdkankan.repair.bean.SceneEditControlsBean;
  25. import com.fdkankan.repair.bean.SceneJsonBean;
  26. import com.fdkankan.repair.bean.SceneUpgradeProgressBean;
  27. import com.fdkankan.repair.bean.UpgradeBean;
  28. import com.fdkankan.repair.callback.FdkkMiniReqErrorCallback;
  29. import com.fdkankan.repair.callback.FdkkMiniReqSuccessCallback;
  30. import com.fdkankan.repair.constant.ProgressStatus;
  31. import com.fdkankan.repair.entity.SceneEditControls;
  32. import com.fdkankan.repair.entity.SceneEditInfo;
  33. import com.fdkankan.repair.entity.SceneEditInfoExt;
  34. import com.fdkankan.repair.entity.ScenePlusExt;
  35. import com.fdkankan.repair.entity.ScenePro;
  36. import com.fdkankan.repair.entity.SceneProEdit;
  37. import com.fdkankan.repair.entity.SceneProEditExt;
  38. import com.fdkankan.repair.entity.SceneProExt;
  39. import com.fdkankan.repair.entity.SceneRepairLog;
  40. import com.fdkankan.repair.httpclient.FdkankanMiniClient;
  41. import com.fdkankan.repair.service.ISceneEditControlsService;
  42. import com.fdkankan.repair.service.ISceneEditInfoExtService;
  43. import com.fdkankan.repair.service.ISceneEditInfoService;
  44. import com.fdkankan.repair.service.IScenePlusExtService;
  45. import com.fdkankan.repair.service.ISceneProEditExtService;
  46. import com.fdkankan.repair.service.ISceneProEditService;
  47. import com.fdkankan.repair.service.ISceneProExtService;
  48. import com.fdkankan.repair.service.ISceneProService;
  49. import com.fdkankan.repair.service.ISceneRepairLogService;
  50. import com.fdkankan.repair.service.ISceneUpgradeToV4Service;
  51. import java.io.File;
  52. import java.io.IOException;
  53. import java.math.BigDecimal;
  54. import java.math.RoundingMode;
  55. import java.util.ArrayList;
  56. import java.util.Calendar;
  57. import java.util.HashMap;
  58. import java.util.HashSet;
  59. import java.util.List;
  60. import java.util.Map;
  61. import java.util.Map.Entry;
  62. import java.util.Objects;
  63. import java.util.Set;
  64. import java.util.concurrent.atomic.AtomicInteger;
  65. import java.util.stream.Collectors;
  66. import lombok.extern.slf4j.Slf4j;
  67. import org.springframework.beans.factory.annotation.Autowired;
  68. import org.springframework.beans.factory.annotation.Value;
  69. import org.springframework.cloud.context.config.annotation.RefreshScope;
  70. import org.springframework.stereotype.Service;
  71. /**
  72. * <p>
  73. * TODO
  74. * </p>
  75. *
  76. * @author dengsixing
  77. * @since 2022/4/21
  78. **/
  79. @RefreshScope
  80. @Slf4j
  81. @Service
  82. public class SceneUpgradeToV4Service implements ISceneUpgradeToV4Service {
  83. @Value("${main.url}")
  84. private String mainUrl;
  85. @Value("${scene.pro.new.url}")
  86. private String sceneProNewUrl;
  87. @Value("${oss.prefix.url}")
  88. private String ossUrlPrefix;
  89. @Value("${http.host.4dkankanMini}")
  90. private String fkankanMiniHost;
  91. @Value("${http.api-v4.upgradeToV4ResultSync}")
  92. private String URL_UPGRADE_TO_V4_RESULT_SYNC;
  93. @Autowired
  94. private RedisLockUtil redisLockUtil;
  95. @Autowired
  96. private ISceneProExtService sceneProExtService;
  97. @Autowired
  98. private ISceneEditInfoService sceneEditInfoService;
  99. @Autowired
  100. private ISceneEditInfoExtService sceneEditInfoExtService;
  101. @Autowired
  102. private ISceneProEditService sceneProEditService;
  103. @Autowired
  104. private ISceneProEditExtService sceneProEditExtService;
  105. @Autowired
  106. private ISceneEditControlsService sceneEditControlsService;
  107. @Autowired
  108. private ISceneRepairLogService sceneRepairLogService;
  109. @Value("${oss.bucket:4dkankan}")
  110. private String bucket;
  111. @Autowired
  112. private ISceneProService sceneProService;
  113. @Autowired
  114. private IScenePlusExtService scenePlusExtService;
  115. @Autowired
  116. private UploadToOssUtil uploadToOssUtil;
  117. @Autowired
  118. RedisUtil redisUtil;
  119. @Autowired
  120. FdkankanMiniClient fdkankanMiniClient;
  121. @Override
  122. public void upgrade(long sceneProId, boolean reUpgrade) throws Exception{
  123. ScenePro scenePro = sceneProService.getById(sceneProId);
  124. //线程开始,正在执行线程数+1
  125. String num = scenePro.getNum();
  126. String dataPath = String.format("data/data%s/", num);
  127. String imagePath = String.format("images/images%s/", num);
  128. String videoPath = String.format("video/video%s/", num);
  129. String voicePath = String.format("voice/voice%s/", num);
  130. String dataViewPath = String.format("scene_view_data/%s/data/", num);
  131. String imageViewPath = String.format("scene_view_data/%s/images/", num);
  132. String videoViewPath = String.format("scene_view_data/%s/video/", num);
  133. String voiceViewPath = String.format("scene_view_data/%s/voice/", num);
  134. long consumTime = 0;
  135. long startTime = Calendar.getInstance().getTimeInMillis();
  136. SceneRepairLog sceneRepairLog = null;
  137. try {
  138. sceneRepairLog = sceneRepairLogService.getOne(
  139. new LambdaQueryWrapper<SceneRepairLog>()
  140. .eq(SceneRepairLog::getNum, num).eq(SceneRepairLog::getState, 0)
  141. .orderByDesc(SceneRepairLog::getId)
  142. .last("limit 1"));
  143. this.upgradeLog(sceneRepairLog, num, 0, null, null);
  144. SceneProExt sceneProExt = sceneProExtService.getOne(
  145. new LambdaQueryWrapper<SceneProExt>()
  146. .eq(SceneProExt::getSceneProId, scenePro.getId()));
  147. SceneProEdit sceneProEdit = sceneProEditService.getOne(
  148. new LambdaQueryWrapper<SceneProEdit>()
  149. .eq(SceneProEdit::getProId, scenePro.getId()));
  150. SceneProEditExt sceneProEditExt = sceneProEditExtService
  151. .getOne(new LambdaQueryWrapper<SceneProEditExt>()
  152. .eq(SceneProEditExt::getProEditId, sceneProEdit.getId()));
  153. String path = sceneProExt.getDataSource();
  154. //生成热点json文件
  155. Integer tags = this.createHotJson(dataPath, num);
  156. boolean existLoadingLogo = false;
  157. //生成编辑表
  158. SceneEditInfo sceneEditInfo = sceneEditInfoService.getOne(
  159. new LambdaQueryWrapper<SceneEditInfo>()
  160. .eq(SceneEditInfo::getSceneProId, scenePro.getId()));
  161. SceneEditInfoExt sceneEditInfoExt = null;
  162. SceneEditControls sceneEditControls = null;
  163. if(sceneEditInfo == null){
  164. List<String> loadingLogoFile = uploadToOssUtil.listKeys(imagePath + "logo-main.png");
  165. if(CollUtil.isNotEmpty(loadingLogoFile)){
  166. existLoadingLogo = true;
  167. }
  168. sceneEditInfo = new SceneEditInfo();
  169. sceneEditInfo.setSceneProId(scenePro.getId());
  170. sceneEditInfo.setScenePlusId(scenePro.getId());
  171. sceneEditInfo.setFloorLogo(sceneProEdit.getFloorLogo());
  172. sceneEditInfo.setFloorLogoSize(sceneProEdit.getFloorLogoSize());
  173. sceneEditInfo.setFloorLogoFile("user".equals(sceneProEdit.getFloorLogo()) ? "floorLogo-user.png" : null); //floorLogoImg.png -> floorLogo-user.png
  174. String music = null;
  175. if(!"noMusic".equals(sceneProEdit.getBgMusic()) && !"0".equals(sceneProEdit.getBgMusic())){
  176. music = sceneProEdit.getBgMusic();
  177. }
  178. if(StrUtil.isNotEmpty(music)){
  179. if(music.equals("无")) music = "";
  180. if(music.equals("欢快")) music = "01";
  181. if(music.equals("空灵")) music = "02";
  182. if(music.equals("节奏")) music = "03";
  183. if(music.equals("怀旧")) music = "04";
  184. if(music.equals("想念")) music = "05";
  185. if(music.equals("复古")) music = "06";
  186. if(music.equals("琴弦")) music = "07";
  187. if(music.equals("愉快")) music = "08";
  188. }
  189. sceneEditInfo.setMusic(music);
  190. //如果bgmusicname 不为空 ,MusicFile = BgMusicName
  191. if(StrUtil.isNotEmpty(sceneProEditExt.getBgMusicName())){
  192. sceneEditInfo.setMusicFile(sceneProEditExt.getBgMusicName());
  193. }
  194. //bgmusic=user, music=musicfile
  195. if("user".equals(sceneProEdit.getBgMusic())){
  196. sceneEditInfo.setMusic(sceneEditInfo.getMusicFile());
  197. }
  198. sceneEditInfo.setScenePassword(sceneProEdit.getSceneKey());
  199. sceneEditInfo.setTitle(scenePro.getSceneName());
  200. sceneEditInfo.setDescription(scenePro.getSceneDec());
  201. sceneEditInfo.setFloorPlanUser(0);
  202. sceneEditInfo.setTags(tags);
  203. sceneEditInfo.setVersion(sceneProEdit.getVersion());
  204. sceneEditInfo.setIsUploadObj(Integer.parseInt(CommonStatus.NO.code().toString()));
  205. sceneEditInfo.setFloorEditVer(sceneProEdit.getFloorEditVer());
  206. sceneEditInfo.setFloorPublishVer(sceneProEdit.getFloorPublishVer());
  207. // sceneEditInfo.setBoxVideos(sceneProEditExt.getOverlay());
  208. sceneEditInfo.setEntry(sceneProEdit.getEntry());
  209. sceneEditInfo.setLoadingLogo(existLoadingLogo ? "user" : null);
  210. sceneEditInfo.setLoadingLogoFile(existLoadingLogo ? "loadingLogo-user.png" : null);
  211. sceneEditInfo.setCreateTime(sceneProEdit.getCreateTime());
  212. sceneEditInfo.setUpdateTime(sceneProEdit.getUpdateTime());
  213. sceneEditInfo.setTbStatus(sceneProEdit.getTbStatus());
  214. sceneEditInfoService.save(sceneEditInfo);
  215. sceneEditInfoExt = new SceneEditInfoExt();
  216. sceneEditInfoExt.setEditInfoId(sceneEditInfo.getId());
  217. sceneEditInfoExt.setSceneProId(scenePro.getId());
  218. sceneEditInfoExt.setScenePlusId(scenePro.getId());
  219. sceneEditInfoExt.setFloorPlanAngle(sceneProEditExt.getFloorPlanAngle() == null ? 0f : Float.parseFloat(sceneProEditExt.getFloorPlanAngle()));
  220. sceneEditInfoExt.setFloorPlanCompass(this.getFloorPlanCompass(num));
  221. sceneEditInfoExt.setVrNum(sceneProEditExt.getVrNum());
  222. sceneEditInfoExt.setCreateTime(sceneEditInfo.getCreateTime());
  223. sceneEditInfoExt.setUpdateTime(sceneEditInfo.getUpdateTime());
  224. sceneEditInfoExt.setTbStatus(sceneEditInfo.getTbStatus());
  225. sceneEditInfoExtService.save(sceneEditInfoExt);
  226. sceneEditControls = new SceneEditControls();
  227. sceneEditControls.setEditInfoId(sceneEditInfo.getId());
  228. sceneEditControls.setShowMap(sceneProEditExt.getMapVisi());
  229. sceneEditControls.setShowLock(sceneProEdit.getNeedKey());
  230. sceneEditControls.setShowTitle(Integer.valueOf(CommonStatus.YES.code()));
  231. sceneEditControls.setShowPanorama(sceneProEditExt.getPanoVisi());
  232. sceneEditControls.setShowDollhouse(sceneProEditExt.getM3dVisi());
  233. sceneEditControls.setShowFloorplan(sceneProEditExt.getM2dVisi());
  234. sceneEditControls.setShowVR(sceneProEditExt.getVrVisi());
  235. // sceneEditControls.setShowTour(sceneProEditExt.getTourVisi());
  236. sceneEditControls.setShowRule(sceneProEditExt.getRulerVisi());
  237. sceneEditControls.setCreateTime(sceneEditInfo.getCreateTime());
  238. sceneEditControls.setUpdateTime(sceneEditInfo.getUpdateTime());
  239. sceneEditControls.setTbStatus(sceneEditInfo.getTbStatus());
  240. sceneEditControlsService.save(sceneEditControls);
  241. }else{
  242. sceneEditInfoExt = sceneEditInfoExtService.getOne(
  243. new LambdaQueryWrapper<SceneEditInfoExt>()
  244. .eq(SceneEditInfoExt::getEditInfoId, sceneEditInfo.getId()));
  245. sceneEditControls = sceneEditControlsService.getOne(
  246. new LambdaQueryWrapper<SceneEditControls>()
  247. .eq(SceneEditControls::getEditInfoId, sceneEditInfo.getId()));
  248. sceneEditInfo.setTitle(scenePro.getSceneName());
  249. sceneEditInfo.setVersion(sceneEditInfo.getVersion() + 1);
  250. if(reUpgrade){//场景重算再掉的升级时,需要把imgVersion累加
  251. sceneEditInfo.setImgVersion(sceneEditInfo.getImgVersion() + 1);
  252. }
  253. sceneEditInfoService.updateById(sceneEditInfo);
  254. }
  255. //完成数据库操作更新进度条为10
  256. this.updateProgress(num, 10, ProgressStatus.DO_DB.code());
  257. //oss文件拷贝
  258. AtomicInteger count = new AtomicInteger(0);
  259. AtomicInteger completeCnt = new AtomicInteger(0);
  260. List<String> list = new ArrayList<>();
  261. List<String> dataKeys = uploadToOssUtil.listKeys(dataPath);
  262. List<String> imageKeys = uploadToOssUtil.listKeys(imagePath);
  263. List<String> videoKeys = uploadToOssUtil.listKeys(videoPath);
  264. List<String> voiceKeys = uploadToOssUtil.listKeys(voicePath);
  265. if(CollUtil.isNotEmpty(dataKeys)) count.addAndGet(dataKeys.size());
  266. if(CollUtil.isNotEmpty(imageKeys)) count.addAndGet(imageKeys.size());
  267. if(CollUtil.isNotEmpty(videoKeys)) count.addAndGet(videoKeys.size());
  268. if(CollUtil.isNotEmpty(voiceKeys)) count.addAndGet(voiceKeys.size());
  269. this.copyFileOss(num, completeCnt, count, dataKeys, dataPath, dataViewPath);
  270. this.copyFileOss(num, completeCnt, count, imageKeys, imagePath, imageViewPath);
  271. this.copyFileOss(num, completeCnt, count, videoKeys, videoPath, videoViewPath);
  272. this.copyFileOss(num, completeCnt, count, voiceKeys, voicePath, voiceViewPath);
  273. //将全景图缓存到缓存目录
  274. List<String> imagesList = cn.hutool.core.io.FileUtil.listFileNames(path + "/caches/images");
  275. String cachedImagesPath = String.format(ConstantFilePath.SCENE_CACHE_IMAGES, num);
  276. //先清除旧的全景图
  277. cn.hutool.core.io.FileUtil.del(cachedImagesPath);
  278. String visionPath = path + "/results/vision.txt";
  279. List<String> panoramaImageList = SceneUtil.getPanoramaImageList(visionPath);
  280. imagesList.stream().forEach(fileName -> {
  281. if(panoramaImageList.contains(fileName)){
  282. String srcPath = path + "/caches/images/" + fileName;
  283. String targetPath = cachedImagesPath + fileName;
  284. log.info("源文件:{}, 目标文件:{}", srcPath, targetPath);
  285. cn.hutool.core.io.FileUtil.copy(srcPath, targetPath, true);
  286. }
  287. });
  288. // if(CollUtil.isNotEmpty(imagesList)){
  289. // imagesList.stream().forEach(str -> {
  290. // String filePath = str.substring(str.lastIndexOf(File.separator) + 1);
  291. // if(panoramaImageList.contains(filePath)){
  292. // map.put(str, str.replace(path, sceneNumPAth));
  293. // }
  294. // });
  295. // }
  296. // 上传球幕视频
  297. // List<String> videosList = FileUtil.getFileList(path + "/caches/videos");
  298. // if(CollUtil.isNotEmpty(videosList)){
  299. // videosList.stream().forEach(str -> map.put(str, str.replace(path, sceneNumPAth)));
  300. // }
  301. // uploadToOssUtil.uploadMulFiles(map);
  302. //户型图上传
  303. String userEditPath = UploadFilePath.USER_EDIT_PATH + "floor-cad-%s.%s";
  304. String userViewPath = UploadFilePath.USER_VIEW_PATH + "floor-cad-%s.%s";
  305. String floorCadPath = path + "/results/floorplan_cad";
  306. List<String> floorCadList = FileUtil.getFileList(floorCadPath);
  307. if(CollUtil.isNotEmpty(floorCadList)){
  308. floorCadList.stream().forEach(str->{
  309. String substring = str.substring(str.lastIndexOf(File.separator) + 1);
  310. String[] arr = substring.split("floor");
  311. String[] arr2 = arr[1].split("\\.");
  312. uploadToOssUtil.upload(str, String.format(userEditPath, num, arr2[0], arr2[1]));
  313. uploadToOssUtil.upload(str, String.format(userViewPath, num, arr2[0], arr2[1]));
  314. });
  315. }
  316. //拷贝模型文件到用户编辑目录
  317. String editImagesPath = String.format(UploadFilePath.IMG_EDIT_PATH, num);
  318. String viewImagesPath = String.format(UploadFilePath.IMG_VIEW_PATH, num);
  319. String editDataPath = String.format(UploadFilePath.DATA_EDIT_PATH, num);
  320. String viewDataPath = String.format(UploadFilePath.DATA_VIEW_PATH, num);
  321. Map<String, String> map2 = new HashMap<>();
  322. map2.put(editImagesPath + "vision.modeldata", viewImagesPath + "vision.modeldata");
  323. map2.put(editImagesPath + "vision2.modeldata", viewImagesPath + "vision2.modeldata");
  324. map2.put(editDataPath + "floorplan_cad.json", viewDataPath + "floorplan_cad.json");
  325. for (Entry<String, String> entry : map2.entrySet()) {
  326. uploadToOssUtil.copyFiles(entry.getValue(), entry.getKey());
  327. }
  328. //完成数据库操作更新进度条为10
  329. this.updateProgress(num, 90, ProgressStatus.DO_OSS.code());
  330. //生成二维码
  331. String sceneUrl = mainUrl + "/" + sceneProNewUrl;
  332. String outPathZh = ConstantFilePath.BASE_PATH + File.separator + "sceneQRcode/" + num + ".png";
  333. String outPathEn = ConstantFilePath.BASE_PATH + File.separator + "sceneQRcode/" + num + "_en.png";
  334. MatrixToImageWriterUtil.createQRCode(sceneUrl + num, outPathZh, false,null);
  335. MatrixToImageWriterUtil.createQRCode(sceneUrl + num + "&lang=en", outPathEn, false, null);
  336. uploadToOssUtil.upload(outPathZh, String.format(UploadFilePath.DOWNLOADS_QRCODE, num) + num + ".png");
  337. uploadToOssUtil.upload(outPathEn, String.format(UploadFilePath.DOWNLOADS_QRCODE, num) + num + "_en.png");
  338. //根据编辑表 上传用户目录 包括编辑目录 查看目录
  339. String editUsersPath = String.format(UploadFilePath.USER_EDIT_PATH, num);
  340. String viewUsersPath = String.format(UploadFilePath.USER_VIEW_PATH, num);
  341. if("user".equals(sceneProEdit.getFloorLogo())){
  342. uploadToOssUtil.copyFiles(imagePath + "floorLogoImg.png", editUsersPath + "floorLogo-user.png");
  343. uploadToOssUtil.copyFiles(imagePath + "floorLogoImg.png", viewUsersPath + "floorLogo-user.png");
  344. }
  345. if("user".equals(sceneProEdit.getBgMusic())){
  346. uploadToOssUtil.copyFiles(imagePath + sceneProEditExt.getBgMusicName(), editUsersPath + "music-user.mp3");
  347. uploadToOssUtil.copyFiles(imagePath + sceneProEditExt.getBgMusicName(), viewUsersPath + "music-user.mp3");
  348. }
  349. if(existLoadingLogo){
  350. uploadToOssUtil.copyFiles(imagePath + "logo-main.png", editUsersPath + "loadingLogo-user.png");
  351. uploadToOssUtil.copyFiles(imagePath + "logo-main.png", viewUsersPath + "loadingLogo-user.png");
  352. }
  353. ScenePlusExt scenePlusExt = scenePlusExtService.getOne(
  354. new LambdaQueryWrapper<ScenePlusExt>()
  355. .eq(ScenePlusExt::getPlusId, scenePro.getId()));
  356. if(StrUtil.isNotEmpty(scenePro.getThumb())
  357. && scenePro.getThumb().contains(imagePath)
  358. && !reUpgrade){
  359. String thumbUrl = null;
  360. if(scenePro.getThumb().contains("thumbSmallImg.jpg")){
  361. uploadToOssUtil.copyFiles(imagePath + "thumbBigImg.jpg", editUsersPath + "thumb-1k.jpg");
  362. uploadToOssUtil.copyFiles(imagePath + "thumbBigImg.jpg", viewUsersPath + "thumb-1k.jpg");
  363. uploadToOssUtil.copyFiles(imagePath + "thumbBigImg.jpg", editUsersPath + "thumb-2k.jpg");
  364. uploadToOssUtil.copyFiles(imagePath + "thumbBigImg.jpg", viewUsersPath + "thumb-2k.jpg");
  365. uploadToOssUtil.copyFiles(imagePath + "thumbSmallImg.jpg", editUsersPath + "thumb-128.jpg");
  366. uploadToOssUtil.copyFiles(imagePath + "thumbSmallImg.jpg", viewUsersPath + "thumb-128.jpg");
  367. thumbUrl = this.ossUrlPrefix + String.format(UploadFilePath.USER_VIEW_PATH, num) + "thumb-128.jpg";
  368. }else{
  369. thumbUrl = scenePro.getThumb().replace(imagePath, viewImagesPath);
  370. }
  371. String webSite = sceneUrl + num;
  372. scenePro.setThumb(thumbUrl);
  373. scenePro.setWebSite(webSite);
  374. sceneProService.updateById(scenePro);
  375. scenePlusExt.setThumb(thumbUrl);
  376. scenePlusExt.setWebSite(webSite);
  377. scenePlusExtService.updateById(scenePlusExt);
  378. }
  379. if(StrUtil.isNotEmpty(sceneEditInfo.getBoxVideos())){
  380. JSONArray boxVideoArr = JSON.parseArray(sceneEditInfo.getBoxVideos());
  381. for(int i = 0; i < boxVideoArr.size(); i++){
  382. JSONObject boxVideo = boxVideoArr.getJSONObject(i);
  383. String sid = boxVideo.getString("sid");
  384. uploadToOssUtil.copyFiles(imagePath + "overlay" + sid + ".mp4", editUsersPath + sid + ".mp4");
  385. uploadToOssUtil.copyFiles(imagePath + "overlay" + sid + ".mp4", viewUsersPath + sid + ".mp4");
  386. uploadToOssUtil.copyFiles(imagePath + "overlay" + sid + ".flv", editUsersPath + sid + ".flv");
  387. uploadToOssUtil.copyFiles(imagePath + "overlay" + sid + ".flv", viewUsersPath + sid + ".flv");
  388. }
  389. }
  390. //本地mapping文件上传
  391. String mappingOssPath = String.format(UploadFilePath.DATA_EDIT_PATH, num) + "mapping";
  392. String mappingPath = "/mnt/4Dkankan/scene/data/data" + num + "/mapping";
  393. List<String> mappingList = FileUtils.list(new File(mappingPath));
  394. if(CollUtil.isNotEmpty(mappingList)){
  395. mappingList.parallelStream().forEach(mapping->{
  396. uploadToOssUtil.upload(mapping, mapping.replace(mappingPath, mappingOssPath));
  397. });
  398. }
  399. //生成scene.json
  400. // 生成新的scene.json,上传至scene_view_data/<num>/data
  401. SceneJsonBean sceneJson = new SceneJsonBean();
  402. BeanUtil.copyProperties(sceneEditInfoExt, sceneJson);
  403. BeanUtil.copyProperties(sceneEditInfo, sceneJson);
  404. SceneEditControlsBean sceneEditControlsBean = BeanUtil.copyProperties(sceneEditControls, SceneEditControlsBean.class);
  405. sceneJson.setControls(sceneEditControlsBean);
  406. sceneJson.setNum(num);
  407. sceneJson.setCreateTime(scenePro.getCreateTime());
  408. sceneJson.setSceneResolution(sceneProExt.getSceneResolution());
  409. sceneJson.setSceneFrom(sceneProExt.getSceneFrom());
  410. sceneJson.setSceneKind(scenePlusExt.getSceneKind());
  411. if(StrUtil.isNotEmpty(scenePro.getVideos())){
  412. sceneJson.setVideos(JSON.parseObject(scenePro.getVideos()));
  413. }
  414. sceneJson.setVersion(sceneEditInfo.getVersion());
  415. //上传sceneJson文件
  416. String sceneJsonPath = String.format(UploadFilePath.DATA_VIEW_PATH+"scene.json", num);
  417. uploadToOssUtil.upload(JSON.toJSONBytes(sceneJson), sceneJsonPath);
  418. redisUtil.del(String.format(RedisKey.SCENE_JSON, num));
  419. //迁移耗时
  420. consumTime = Calendar.getInstance().getTimeInMillis() - startTime;
  421. //记录日志
  422. this.upgradeLog(sceneRepairLog, num, 1, null, consumTime);
  423. // 调用v3接口回写数据
  424. String url = fkankanMiniHost + URL_UPGRADE_TO_V4_RESULT_SYNC;
  425. fdkankanMiniClient.upgradeToV4ResultSync(url,
  426. RequestSceneProV4.builder()
  427. .id(sceneProId)
  428. .webSite(scenePro.getWebSite())
  429. .thumb(scenePlusExt.getThumb())
  430. .build(),
  431. new FdkkMiniReqSuccessCallback(), new FdkkMiniReqErrorCallback()
  432. );
  433. this.updateProgress(num, 100, ProgressStatus.SUCCESS.code());
  434. }catch (Exception e){
  435. log.error(e.getMessage(), e);
  436. //完成数据库操作更新进度条为0,状态失败
  437. this.updateProgress(num, 0, ProgressStatus.FAIL.code());
  438. //记录日志
  439. consumTime = Calendar.getInstance().getTimeInMillis() - startTime;
  440. this.upgradeLog(sceneRepairLog, num, 2, ExceptionUtil.stacktraceToString(e, 3000), consumTime);
  441. sceneRepairLogService.updateById(sceneRepairLog);
  442. } finally {
  443. String lockKey = String.format(RedisLockKey.LOCK_SCENE_UPGRADE_V4, num);
  444. redisUtil.del(lockKey);
  445. }
  446. }
  447. private void copyFileOss(String num, AtomicInteger completeCnt, AtomicInteger count, List<String> keyList, String sourcePath, String targetPah){
  448. if(CollUtil.isEmpty(keyList))
  449. return;
  450. keyList.parallelStream().forEach(key->{
  451. try {
  452. String targetKey = null;
  453. if(key.contains(sourcePath)){
  454. targetKey = key.replace(sourcePath, targetPah);
  455. }
  456. uploadToOssUtil.copyObject(key, targetKey);
  457. this.updateProgress(num,
  458. 10 +
  459. (new BigDecimal(completeCnt.incrementAndGet())
  460. .divide(new BigDecimal(count.get()), 6, BigDecimal.ROUND_HALF_UP)
  461. .multiply(new BigDecimal(0.7))
  462. .multiply(new BigDecimal(100))
  463. .setScale(0, RoundingMode.UP)
  464. .intValue()),
  465. ProgressStatus.DO_OSS.code()
  466. );
  467. } catch (IOException e) {
  468. log.error("文件拷贝出错,key:{}", key);
  469. }
  470. });
  471. }
  472. private Integer createHotJson(String dataPath, String num) throws IOException {
  473. Integer tags = Integer.valueOf(CommonStatus.NO.code());
  474. // Set<String> icons = new HashSet<>();
  475. // String hotJson = uploadToOssUtil.getObjectContent("4dkankan", dataPath + "hot.json");
  476. // JSONArray newHotArr = new JSONArray();
  477. // if(StrUtil.isNotBlank(hotJson)){
  478. // JSONArray hotArr = JSON.parseArray(hotJson);
  479. // if(hotArr.size() > 0){
  480. // tags = Integer.valueOf(CommonStatus.YES.code());
  481. // for(int i=0; i < hotArr.size(); i++){
  482. // JSONObject oldHot = (JSONObject)hotArr.get(i);
  483. // String styleId = oldHot.getString("styleId");
  484. //
  485. // JSONObject newHot = new JSONObject();
  486. // newHot.put("createTime", Calendar.getInstance().getTimeInMillis() + i);
  487. // newHot.put("icon", styleId);
  488. //
  489. // newHot.put("position", oldHot.getJSONObject("position"));
  490. //
  491. // JSONObject media = new JSONObject();
  492. // newHot.put("media", media);
  493. // JSONObject fileName = oldHot.getJSONObject("fileName");
  494. // Set<Entry<String, Object>> entries = null;
  495. // if(fileName != null){
  496. // entries = fileName.entrySet();
  497. // }
  498. // if(CollUtil.isNotEmpty(entries)){
  499. // for (Entry<String, Object> entry : entries) {
  500. // JSONArray arr = new JSONArray();
  501. // media.put(entry.getKey(), arr);
  502. // JSONObject o = new JSONObject();
  503. // arr.add(o);
  504. // String fileSrc = ((String) entry.getValue());
  505. // o.put("src", oldHot.getString("sid") + fileSrc.substring(fileSrc.lastIndexOf(".")));
  506. // o.put("name", fileSrc);
  507. // }
  508. // }
  509. // newHot.put("type", oldHot.getString("mediaType"));
  510. // newHot.put("title", oldHot.getString("label"));
  511. // newHot.put("content", oldHot.getString("description"));
  512. // newHot.put("sid", oldHot.getString("sid"));
  513. //
  514. // if(StrUtil.isNotBlank(styleId)){
  515. // icons.add(styleId);
  516. // }
  517. //
  518. // }
  519. // }
  520. // String hotJsonEditPath = String.format(UploadFilePath.USER_EDIT_PATH, num) + "hot.json";
  521. // String hotJsonViewPath = String.format(UploadFilePath.USER_VIEW_PATH, num) + "hot.json";
  522. // uploadToOssUtil.upload(hotJson.getBytes(), hotJsonEditPath);
  523. // uploadToOssUtil.upload(hotJson.getBytes(), hotJsonViewPath);
  524. //
  525. // //写到本地文件
  526. // JSONObject localObject = new JSONObject();
  527. // localObject.put("tags", newHotArr);
  528. // localObject.put("icons", icons);
  529. // String hotJsonPath = String.format(ConstantFilePath.SCENE_USER_PATH_V4, num) + "hot.json";
  530. // FileUtils.writeFile(hotJsonPath, localObject.toJSONString());
  531. // }
  532. return tags;
  533. }
  534. private Float getFloorPlanCompass(String num){
  535. String objectContent =
  536. uploadToOssUtil.getObjectContent(bucket, "data/data" + num + "/houst_floor.json");
  537. if(StrUtil.isEmpty(objectContent)){
  538. return null;
  539. }
  540. JSONObject jsonObject = JSON.parseObject(objectContent);
  541. JSONArray floors = jsonObject.getJSONArray("floors");
  542. if(CollUtil.isEmpty(floors)){
  543. return null;
  544. }
  545. Object o = floors.get(0);
  546. JSONObject object = (JSONObject)o;
  547. return object.getFloat("dire");
  548. }
  549. /**
  550. * 更新进度条
  551. * @param num
  552. * @param progress
  553. * @param status
  554. */
  555. private void updateProgress(String num, int progress, int status){
  556. String key = String.format(RedisKey.scene_upgrade_progress_num, num);
  557. redisUtil.set(key,
  558. JSON.toJSONString(
  559. SceneUpgradeProgressBean.builder()
  560. .num(num).status(status)
  561. .progress(progress).build()));
  562. }
  563. private void upgradeLog(SceneRepairLog sceneRepairLog, String num, int status, String reason, Long consumTime){
  564. //写入升级日志
  565. if(Objects.isNull(sceneRepairLog)){
  566. sceneRepairLog = new SceneRepairLog();
  567. sceneRepairLog.setNum(num);
  568. }
  569. sceneRepairLog.setConsumTime(consumTime);
  570. sceneRepairLog.setState(status);
  571. sceneRepairLog.setReason(reason);
  572. sceneRepairLog.setCreateTime(Calendar.getInstance().getTime());
  573. sceneRepairLogService.saveOrUpdate(sceneRepairLog);
  574. }
  575. }