SceneCommonService.java 19 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423
  1. package com.fdkankan.manage_jp.service.impl;
  2. import cn.hutool.cache.CacheUtil;
  3. import cn.hutool.core.io.FileUtil;
  4. import cn.hutool.core.util.StrUtil;
  5. import cn.hutool.extra.qrcode.QrCodeUtil;
  6. import cn.hutool.extra.qrcode.QrConfig;
  7. import com.alibaba.fastjson.JSON;
  8. import com.alibaba.fastjson.JSONObject;
  9. import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
  10. import com.fdkankan.common.constant.SceneVersionType;
  11. import com.fdkankan.common.util.FileUtils;
  12. import com.fdkankan.fyun.face.FYunFileServiceInterface;
  13. import com.fdkankan.image.MatrixToImageWriterUtil;
  14. import com.fdkankan.manage_jp.common.RedisKeyUtil;
  15. import com.fdkankan.manage_jp.common.ResultCode;
  16. import com.fdkankan.manage_jp.entity.*;
  17. import com.fdkankan.manage_jp.exception.BusinessException;
  18. import com.fdkankan.manage_jp.httpClient.service.LaserService;
  19. import com.fdkankan.manage_jp.service.*;
  20. import com.fdkankan.manage_jp.util.SceneResourcePath;
  21. import com.fdkankan.manage_jp.util.SnowflakeIdGenerator;
  22. import com.fdkankan.redis.util.RedisUtil;
  23. import lombok.extern.slf4j.Slf4j;
  24. import org.apache.commons.lang3.ObjectUtils;
  25. import org.apache.commons.lang3.StringUtils;
  26. import org.springframework.beans.factory.annotation.Autowired;
  27. import org.springframework.scheduling.annotation.Async;
  28. import org.springframework.stereotype.Service;
  29. import java.io.File;
  30. import java.util.Date;
  31. import java.util.List;
  32. import java.util.Objects;
  33. import java.util.UUID;
  34. @Service
  35. @Slf4j
  36. public class SceneCommonService {
  37. @Autowired
  38. FYunFileServiceInterface fYunFileServiceInterface;
  39. @Autowired
  40. IScene3dNumService scene3dNumService;
  41. @Autowired
  42. IScenePlusService scenePlusService;
  43. @Autowired
  44. IScenePlusExtService scenePlusExtService;
  45. @Autowired
  46. ISceneEditInfoService sceneEditInfoService;
  47. @Autowired
  48. ISceneEditInfoExtService sceneEditInfoExtService;
  49. @Autowired
  50. ISceneEditControlsService sceneEditControlsService;
  51. @Autowired
  52. ISurveillanceService surveillanceService;
  53. @Autowired
  54. LaserService laserService;
  55. @Autowired
  56. ISceneProService sceneProService;
  57. @Autowired
  58. ISceneProEditService sceneProEditService;
  59. @Autowired
  60. RedisUtil redisUtil;
  61. public String getNewNum(String oldNum ){
  62. String newNum = scene3dNumService.generateNum();
  63. if(oldNum.contains("-")){
  64. String pre = oldNum.split("-")[0];
  65. if(!"t".equals(pre) && !"jp".equals(pre)){
  66. return pre +"-"+ newNum;
  67. }
  68. }
  69. return newNum;
  70. }
  71. /**
  72. * 生成新的dataSouce
  73. */
  74. public String getNewDataSource(String oldDataSource){
  75. String newDataSource = null;
  76. if(StringUtils.isBlank(oldDataSource)){
  77. throw new BusinessException(ResultCode.SCENE_DATA_ERROR);
  78. }
  79. File oldDataSouceFile = new File(oldDataSource);
  80. if(!oldDataSouceFile.exists()){
  81. throw new BusinessException(ResultCode.SCENE_DATA_ERROR);
  82. }
  83. if(!oldDataSource.contains("/")){
  84. throw new BusinessException(ResultCode.SCENE_DATA_ERROR);
  85. }
  86. String time = com.fdkankan.common.util.DateUtil.date2String(new Date(), com.fdkankan.common.util.DateUtil.YYYYMMDDHHMMSSSSS_DATA_FORMAT);
  87. String[] split = oldDataSource.split("/");
  88. if(split.length == 6 ){
  89. String oldFileId = split[4];
  90. Long fileId = SnowflakeIdGenerator.snowflakeIdGenerator.nextId();
  91. newDataSource = oldDataSource.replace(oldFileId,fileId.toString());
  92. String snCodeTime = split[5];
  93. if(!snCodeTime.contains("_") || snCodeTime.split("_").length <= 1){
  94. throw new BusinessException(ResultCode.SCENE_DATA_ERROR);
  95. }
  96. newDataSource = newDataSource.replace(snCodeTime.split("_")[1],time);
  97. this.copyFdage(oldDataSource,newDataSource,time);
  98. }
  99. if(newDataSource == null){
  100. throw new BusinessException(ResultCode.SCENE_DATA_ERROR);
  101. }
  102. return newDataSource;
  103. }
  104. public void createNewQrCode(String sceneVersion,String logoPath ,String newNum, String webSite){
  105. String localLogoPath = null;
  106. try {
  107. if(StringUtils.isNotBlank(logoPath)){
  108. if(sceneVersion.equals(SceneVersionType.V3.code())){
  109. localLogoPath =SceneResourcePath.nasBasePath + logoPath;
  110. }else{
  111. localLogoPath = SceneResourcePath.qrCodeBasePath + newNum +"/logo/logo.png";
  112. fYunFileServiceInterface.downloadFile(logoPath,localLogoPath);
  113. }
  114. }
  115. String outPathZh = SceneResourcePath.qrCodeBasePath + newNum + ".png";
  116. String outPathEn = SceneResourcePath.qrCodeBasePath + newNum + "_en.png";
  117. QrConfig qrConfig = QrConfig.create();
  118. qrConfig.setWidth(1024);
  119. qrConfig.setHeight(1024);
  120. if(!ObjectUtils.isEmpty(localLogoPath)){
  121. qrConfig.setImg(localLogoPath);
  122. }
  123. QrCodeUtil.generate(webSite, qrConfig, FileUtil.file(outPathZh));
  124. QrCodeUtil.generate(webSite + "&lang=en", qrConfig, FileUtil.file(outPathEn));
  125. fYunFileServiceInterface.uploadFile(outPathZh, String.format(SceneResourcePath.DOWNLOADS_QRCODE, newNum) + newNum + ".png");
  126. fYunFileServiceInterface.uploadFile(outPathEn, String.format(SceneResourcePath.DOWNLOADS_QRCODE, newNum) + newNum + "_en.png");
  127. }catch (Exception e){
  128. log.info("copy-scene-error:{},newNum:{},error:{}",newNum,e);
  129. }
  130. }
  131. public void updateNasSceneJson(String targetPath, String oldNum, String newNum,String oldSceneName,String newSceneName,String sceneVersion) {
  132. String localPath = SceneResourcePath.nasBasePath + targetPath + "scene.json";
  133. File file = new File(localPath);
  134. if(!file.exists()){
  135. log.error("sceneCopy-error--localFileExist:localPath:{},oldNum:{},newNum:{}",localPath,oldNum,newNum);
  136. throw new BusinessException(ResultCode.SYSTEM_ERROR);
  137. }
  138. String fileContent = cn.hutool.core.io.FileUtil.readUtf8String(file);
  139. if(StringUtils.isNotBlank(fileContent)){
  140. String newJson = fileContent.replaceAll(oldNum,newNum);
  141. newJson = newJson.replaceAll(oldSceneName,newSceneName);
  142. try {
  143. com.fdkankan.manage_jp.util.FileUtil.writeFile(localPath,newJson);
  144. }catch (Exception e){
  145. log.error("writeFile-error:{}",e);
  146. throw new BusinessException(ResultCode.SYSTEM_ERROR);
  147. }
  148. }
  149. if("v3".equals(sceneVersion)){
  150. String sceneJsonPath = String.format(SceneResourcePath.dataPath+"/scene.json", newNum);
  151. fYunFileServiceInterface.uploadFile(localPath, sceneJsonPath);
  152. }
  153. if("v4".equals(sceneVersion)){
  154. String sceneJsonPath = String.format(SceneResourcePath.DATA_VIEW_PATH+"scene.json", newNum);
  155. fYunFileServiceInterface.uploadFile(localPath, sceneJsonPath);
  156. }
  157. }
  158. public void updateOssJson(String targetPath,String oldNum, String newNum,String fileName) {
  159. String ossStatusJsonPath = targetPath + fileName;
  160. if(!fYunFileServiceInterface.fileExist(ossStatusJsonPath)){
  161. log.error("sceneCopy-error--ossFileExist:targetPath:{},oldNum:{},newNum:{}",ossStatusJsonPath,oldNum,newNum);
  162. throw new BusinessException(ResultCode.SYSTEM_ERROR);
  163. }
  164. String localPath = SceneResourcePath.nasBasePath + ossStatusJsonPath;
  165. File file = new File(localPath);
  166. if(!file.getParentFile().exists()){
  167. file.getParentFile().mkdirs();
  168. }
  169. String fileContent = fYunFileServiceInterface.getFileContent(ossStatusJsonPath);
  170. if(StringUtils.isNotBlank(fileContent)){
  171. String newJson = fileContent.replaceAll(oldNum,newNum);
  172. try {
  173. com.fdkankan.manage_jp.util.FileUtil.writeFile(localPath,newJson);
  174. fYunFileServiceInterface.uploadFile(localPath,ossStatusJsonPath);
  175. }catch (Exception e){
  176. log.error("writeFile-error:{}",e);
  177. throw new BusinessException(ResultCode.SYSTEM_ERROR);
  178. }
  179. }
  180. }
  181. public void copyFdage(String oldDataSource,String newDataSource,String time){
  182. String ossOldPath = oldDataSource.replace("/mnt/data","home");
  183. String ossNewPath = newDataSource.replace("/mnt/data","home");
  184. fYunFileServiceInterface.copyFileInBucket(ossOldPath,ossNewPath);
  185. String fileName = "/data.fdage";
  186. String fileContent = fYunFileServiceInterface.getFileContent(ossNewPath + fileName);
  187. if(StringUtils.isNotBlank(fileContent)){
  188. JSONObject jsonObject = JSONObject.parseObject(fileContent);
  189. jsonObject.put("uuidtime",time);
  190. FileUtils.writeFile(newDataSource +fileName, jsonObject.toJSONString());
  191. fYunFileServiceInterface.uploadFile(newDataSource +fileName,ossNewPath +fileName);
  192. }
  193. }
  194. @Async
  195. public void v4Async(ScenePlusExt plusExt, String oldNum, String newNum, ScenePlus scenePlus, Long plusId, String oldSceneName){
  196. try {
  197. String oldDataSource = plusExt.getDataSource();
  198. String newDataSource = this.getNewDataSource(oldDataSource);
  199. log.info("sceneCopy-V4-oldNum:{},oldDataSource:{},newNum:{},newDataSource:{}",
  200. oldNum,oldDataSource,newNum,newDataSource);
  201. String newVideos = plusExt.getVideos();
  202. if(StrUtil.isNotEmpty(newVideos)){
  203. newVideos = plusExt.getVideos().replaceAll("/data/data" + oldNum, "/scene_view_data/" + newNum + "/data").replaceAll(oldNum, newNum);
  204. }
  205. plusExt.setId(null);
  206. plusExt.setPlusId(scenePlus.getId());
  207. plusExt.setDataSource(newDataSource);
  208. plusExt.setWebSite(plusExt.getWebSite().replace(oldNum, newNum));
  209. plusExt.setThumb(plusExt.getThumb().replace(oldNum, newNum));
  210. plusExt.setVideos(newVideos);
  211. plusExt.setViewCount(0);
  212. scenePlusExtService.save(plusExt);
  213. SceneEditInfo sceneEditInfo = sceneEditInfoService.getByScenePlusId(plusId);
  214. Long sceneEditInfoId = sceneEditInfo.getId();
  215. sceneEditInfo.setId(null);
  216. sceneEditInfo.setScenePlusId(scenePlus.getId());
  217. sceneEditInfo.setSceneProId(null);
  218. sceneEditInfo.setTitle(scenePlus.getTitle());
  219. sceneEditInfoService.save(sceneEditInfo);
  220. SceneEditInfoExt sceneEditInfoExt = sceneEditInfoExtService.getByEditInfoId(sceneEditInfoId);
  221. sceneEditInfoExt.setId(null);
  222. sceneEditInfoExt.setEditInfoId(sceneEditInfo.getId());
  223. sceneEditInfoExt.setScenePlusId(scenePlus.getId());
  224. sceneEditInfoExt.setSceneProId(null);
  225. sceneEditInfoExtService.save(sceneEditInfoExt);
  226. SceneEditControls sceneEditControls = sceneEditControlsService.getBySceneEditId(sceneEditInfoId);
  227. sceneEditControls.setId(null);
  228. sceneEditControls.setEditInfoId(sceneEditInfo.getId());
  229. sceneEditControlsService.save(sceneEditControls);
  230. List<Surveillance> list = surveillanceService.list(new LambdaQueryWrapper<Surveillance>().eq(Surveillance::getNum, oldNum));
  231. if (!Objects.isNull(list)) {
  232. list.stream().forEach(item -> {
  233. item.setNum(newNum);
  234. item.setId(null);
  235. surveillanceService.save(item);
  236. });
  237. }
  238. if(scenePlus.getSceneSource() == 4 || scenePlus.getSceneSource() == 5){ //深时复制
  239. laserService.copy(oldNum,newNum,newDataSource,true);
  240. }else {
  241. laserService.cloudPointBuild(oldNum,newNum);
  242. }
  243. //重新生成编辑页基础设置二维码
  244. this.createNewQrCode(SceneVersionType.V4.code(),sceneEditInfoExt.getShareLogoImg(),newNum,plusExt.getWebSite());
  245. //copyDataSource
  246. cn.hutool.core.io.FileUtil.copyContent(new File(oldDataSource),new File(newDataSource),true);
  247. this.copyOssAndNas(oldNum,newNum);
  248. //修改 oss status.json ,nas scene.json
  249. String targetData = String.format(SceneResourcePath.DATA_VIEW_PATH,newNum);
  250. this.updateOssJson(targetData,oldNum,newNum,"status.json");
  251. this.updateOssJson(targetData,oldNum,newNum,"scene.json");
  252. if(scenePlus.getSceneSource() == 4 || scenePlus.getSceneSource() == 5){ //深时复制
  253. laserService.copy(oldNum,newNum,newDataSource,false);
  254. }
  255. String redisKey = RedisKeyUtil.laserCopyLock + newNum;
  256. long startTime = new Date().getTime();
  257. long startTime2 = new Date().getTime();
  258. while (redisUtil.hasKey(redisKey) ){ //深时场景复制同步锁
  259. long waitTime = new Date().getTime();
  260. if(waitTime - startTime2 >1000){
  261. startTime2 = new Date().getTime();
  262. log.info("等待激光复制业务结束----:{}",(waitTime - startTime) /1000);
  263. }
  264. }
  265. scenePlus.setSceneStatus(-2);
  266. scenePlusService.updateById(scenePlus);
  267. }catch (Exception e){
  268. log.info("复制场景失败:oldNum:{},newNum:{},error:{}",oldNum,newNum,e);
  269. scenePlus.setSceneStatus(-1);
  270. scenePlusService.updateById(scenePlus);
  271. }
  272. }
  273. private void copyOssAndNas(String oldNum,String newNum){
  274. // 拷贝场景编辑资源
  275. String oldEditPath = String.format(SceneResourcePath.EDIT_PATH_v4, oldNum);
  276. String newEditPath = String.format(SceneResourcePath.EDIT_PATH_v4, newNum);
  277. fYunFileServiceInterface.copyFileInBucket(oldEditPath, newEditPath);
  278. // 拷贝场景展示资源
  279. String oldViewPath = String.format(SceneResourcePath.VIEW_PATH_v4, oldNum);
  280. String newViewPath = String.format(SceneResourcePath.VIEW_PATH_v4, newNum);
  281. fYunFileServiceInterface.copyFileInBucket(oldViewPath, newViewPath);
  282. //复制计算结果文件
  283. String oldResultPath = String.format(SceneResourcePath.SCENE_RESULT_DATA_PATH, oldNum);
  284. String newResultPath = String.format(SceneResourcePath.SCENE_RESULT_DATA_PATH, newNum);
  285. fYunFileServiceInterface.copyFileInBucket(oldResultPath, newResultPath);
  286. // 拷贝本地资源
  287. String oldPath = SceneResourcePath.nasBasePath + oldNum;
  288. String newPath = SceneResourcePath.nasBasePath + newNum;
  289. if(new File(oldPath).exists()){
  290. FileUtil.copyContent(new File(oldPath), new File(newPath),true);
  291. }
  292. String oldPath_v4 = SceneResourcePath.nasBasePath_v4 + oldNum;
  293. String newPath_v4 = SceneResourcePath.nasBasePath_v4 + newNum;
  294. if(new File(oldPath_v4).exists()){
  295. FileUtil.copyContent(new File(oldPath_v4), new File(newPath_v4),true);
  296. }
  297. }
  298. @Async
  299. public void v3Async(ScenePro scenePro,String oldNum,String newNum,Long sceneProId,String oldSceneName){
  300. try {
  301. String oldDataSource = scenePro.getDataSource();
  302. String newDataSource = this.getNewDataSource(oldDataSource);
  303. log.info("sceneCopy--oldNum:{},oldDataSource:{},newNum:{},newDataSource:{}",
  304. oldNum,oldDataSource,newNum,newDataSource);
  305. scenePro.setDataSource(newDataSource);
  306. sceneProService.updateById(scenePro);
  307. SceneProEdit oldEditScene = sceneProEditService.getByProId(sceneProId);
  308. oldEditScene.setId(null);
  309. oldEditScene.setProId(scenePro.getId());
  310. oldEditScene.setScreencapVoiceSrc(oldEditScene.getScreencapVoiceSrc() == null ? null : oldEditScene.getScreencapVoiceSrc().replace(oldNum, scenePro.getNum()));
  311. oldEditScene.setScreencapVoiceSound(oldEditScene.getScreencapVoiceSound() == null ? null : oldEditScene.getScreencapVoiceSound().replace(oldNum, scenePro.getNum()));
  312. oldEditScene.setScreencapVoiceSoundsync(oldEditScene.getScreencapVoiceSoundsync() == null ? null : oldEditScene.getScreencapVoiceSoundsync().replace(oldNum, scenePro.getNum()));
  313. oldEditScene.setPlayData(oldEditScene.getPlayData() == null ? null : oldEditScene.getPlayData().replace(oldNum, scenePro.getNum()));
  314. oldEditScene.setScreencapThumb(oldEditScene.getScreencapThumb() == null ? null : oldEditScene.getScreencapThumb().replace(oldNum, scenePro.getNum()));
  315. oldEditScene.setFloorPlanPng(oldEditScene.getFloorPlanPng() == null ? null : oldEditScene.getFloorPlanPng().replace(oldNum, scenePro.getNum()));
  316. sceneProEditService.save(oldEditScene);
  317. if(scenePro.getSceneSource() == 4 || scenePro.getSceneSource() == 5){ //深时复制
  318. laserService.copy(oldNum,newNum,newDataSource,false);
  319. }
  320. /*
  321. *cp oss nas
  322. * data/data{SceneNum}
  323. * images/images{SceneNum}
  324. * video/video{SceneNum}
  325. * voice/voice{SceneNum}
  326. */
  327. //重新生成编辑页基础设置二维码
  328. this.createNewQrCode(SceneVersionType.V3.code(),oldEditScene.getShareLogo(),newNum,scenePro.getWebSite());
  329. //copyDataSource
  330. cn.hutool.core.io.FileUtil.copyContent(new File(oldDataSource),new File(newDataSource),true);
  331. String sourceData = String.format(SceneResourcePath.dataPath, oldNum);
  332. String targetData = String.format(SceneResourcePath.dataPath, scenePro.getNum());
  333. this.copyOssAndNas(oldNum,scenePro.getNum(),sourceData,targetData);
  334. //修改 oss status.json ,nas scene.json
  335. this.updateOssJson(targetData,oldNum,newNum,"status.json");
  336. this.updateOssJson(targetData,oldNum,newNum,"scene.json");
  337. String sourceImages = String.format(SceneResourcePath.imagesPath, oldNum);
  338. String targetImages = String.format(SceneResourcePath.imagesPath, scenePro.getNum());
  339. this.copyOssAndNas(oldNum,scenePro.getNum(),sourceImages,targetImages);
  340. String sourceVideo = String.format(SceneResourcePath.videoPath, oldNum);
  341. String targetVideo = String.format(SceneResourcePath.videoPath, scenePro.getNum());
  342. this.copyOssAndNas(oldNum,scenePro.getNum(),sourceVideo,targetVideo);
  343. String sourceVoice = String.format(SceneResourcePath.voicePath, oldNum);
  344. String targetVoice = String.format(SceneResourcePath.voicePath, scenePro.getNum());
  345. this.copyOssAndNas(oldNum,scenePro.getNum(),sourceVoice,targetVoice);
  346. if(scenePro.getSceneSource() == 4 || scenePro.getSceneSource() == 5){ //深时复制
  347. laserService.copy(oldNum,newNum,newDataSource,true);
  348. }
  349. scenePro.setStatus(-2);
  350. sceneProService.updateById(scenePro);
  351. }catch (Exception e){
  352. log.info("复制场景失败:oldNum:{},newNum:{},error:{}",oldNum,newNum,e);
  353. scenePro.setStatus(-1);
  354. sceneProService.updateById(scenePro);
  355. }
  356. }
  357. private void copyOssAndNas(String oldNum ,String newNum ,String sourcePath,String targetPath){
  358. log.info("sceneCopy-ossSource-oldNum:{},newNum:{},sourcePath:{},targetPath:{}",oldNum,newNum,sourcePath,targetPath);
  359. fYunFileServiceInterface.copyFileInBucket(sourcePath,targetPath);
  360. File fileData = new File(SceneResourcePath.nasBasePath + sourcePath);
  361. if(fileData.exists()){
  362. cn.hutool.core.io.FileUtil.copyContent(fileData,new File(SceneResourcePath.nasBasePath + targetPath),true);
  363. }
  364. }
  365. }