SceneUpgradeToV4Service.java 28 KB

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