SceneUpgradeToV4Service.java 29 KB

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