SceneEditInfoServiceImpl.java 43 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586878889909192939495969798991001011021031041051061071081091101111121131141151161171181191201211221231241251261271281291301311321331341351361371381391401411421431441451461471481491501511521531541551561571581591601611621631641651661671681691701711721731741751761771781791801811821831841851861871881891901911921931941951961971981992002012022032042052062072082092102112122132142152162172182192202212222232242252262272282292302312322332342352362372382392402412422432442452462472482492502512522532542552562572582592602612622632642652662672682692702712722732742752762772782792802812822832842852862872882892902912922932942952962972982993003013023033043053063073083093103113123133143153163173183193203213223233243253263273283293303313323333343353363373383393403413423433443453463473483493503513523533543553563573583593603613623633643653663673683693703713723733743753763773783793803813823833843853863873883893903913923933943953963973983994004014024034044054064074084094104114124134144154164174184194204214224234244254264274284294304314324334344354364374384394404414424434444454464474484494504514524534544554564574584594604614624634644654664674684694704714724734744754764774784794804814824834844854864874884894904914924934944954964974984995005015025035045055065075085095105115125135145155165175185195205215225235245255265275285295305315325335345355365375385395405415425435445455465475485495505515525535545555565575585595605615625635645655665675685695705715725735745755765775785795805815825835845855865875885895905915925935945955965975985996006016026036046056066076086096106116126136146156166176186196206216226236246256266276286296306316326336346356366376386396406416426436446456466476486496506516526536546556566576586596606616626636646656666676686696706716726736746756766776786796806816826836846856866876886896906916926936946956966976986997007017027037047057067077087097107117127137147157167177187197207217227237247257267277287297307317327337347357367377387397407417427437447457467477487497507517527537547557567577587597607617627637647657667677687697707717727737747757767777787797807817827837847857867877887897907917927937947957967977987998008018028038048058068078088098108118128138148158168178188198208218228238248258268278288298308318328338348358368378388398408418428438448458468478488498508518528538548558568578588598608618628638648658668678688698708718728738748758768778788798808818828838848858868878888898908918928938948958968978988999009019029039049059069079089099109119129139149159169179189199209219229239249259269279289299309319329339349359369379389399409419429439449459469479489499509519529539549559569579589599609619629639649659669679689699709719729739749759769779789799809819829839849859869879889899909919929939949959969979989991000100110021003100410051006100710081009101010111012101310141015101610171018101910201021102210231024102510261027
  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.util.StrUtil;
  5. import cn.hutool.json.JSONUtil;
  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.baomidou.mybatisplus.core.conditions.update.LambdaUpdateWrapper;
  11. import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
  12. import com.fdkankan.common.constant.*;
  13. import com.fdkankan.common.exception.BusinessException;
  14. import com.fdkankan.common.response.ResultData;
  15. import com.fdkankan.common.util.CreateObjUtil;
  16. import com.fdkankan.common.util.FileMd5Util;
  17. import com.fdkankan.common.util.FileUtil;
  18. import com.fdkankan.common.util.FileUtils;
  19. import com.fdkankan.fyun.constant.StorageType;
  20. import com.fdkankan.fyun.oss.UploadToOssUtil;
  21. import com.fdkankan.redis.constant.RedisKey;
  22. import com.fdkankan.redis.constant.RedisLockKey;
  23. import com.fdkankan.redis.util.RedisLockUtil;
  24. import com.fdkankan.redis.util.RedisUtil;
  25. import com.fdkankan.scene.bean.SceneJsonBean;
  26. import com.fdkankan.scene.entity.SceneDataDownload;
  27. import com.fdkankan.scene.entity.SceneEditControls;
  28. import com.fdkankan.scene.entity.SceneEditInfo;
  29. import com.fdkankan.scene.entity.ScenePro;
  30. import com.fdkankan.scene.entity.SceneProExt;
  31. import com.fdkankan.scene.factory.FloorLogoHandlerFactory;
  32. import com.fdkankan.scene.factory.MusicHandlerFactory;
  33. import com.fdkankan.scene.factory.ScreenshotHandlerFactory;
  34. import com.fdkankan.scene.mapper.ISceneEditInfoMapper;
  35. import com.fdkankan.scene.service.ISceneDataDownloadService;
  36. import com.fdkankan.scene.service.ISceneEditControlsService;
  37. import com.fdkankan.scene.service.ISceneEditInfoService;
  38. import com.fdkankan.scene.service.ISceneProExtService;
  39. import com.fdkankan.scene.service.ISceneProService;
  40. import com.fdkankan.scene.vo.*;
  41. import com.google.common.collect.Lists;
  42. import com.google.errorprone.annotations.Var;
  43. import java.io.File;
  44. import java.util.HashMap;
  45. import java.util.List;
  46. import java.util.Map;
  47. import java.util.Map.Entry;
  48. import java.util.UUID;
  49. import java.util.stream.Collectors;
  50. import lombok.extern.slf4j.Slf4j;
  51. import org.springframework.beans.factory.annotation.Autowired;
  52. import org.springframework.beans.factory.annotation.Value;
  53. import org.springframework.stereotype.Service;
  54. import java.io.IOException;
  55. import java.util.Calendar;
  56. import java.util.Objects;
  57. import org.springframework.web.multipart.MultipartFile;
  58. /**
  59. * <p>
  60. * 服务实现类
  61. * </p>
  62. *
  63. * @author
  64. * @since 2022-01-18
  65. */
  66. @Slf4j
  67. @Service
  68. public class SceneEditInfoServiceImpl extends ServiceImpl<ISceneEditInfoMapper, SceneEditInfo> implements ISceneEditInfoService {
  69. @Value("${oss.prefix.ali}")
  70. private String prefixAli;
  71. @Value("${oss.prefix.url}")
  72. private String ossUrlPrefix;
  73. @Value("${upload.type}")
  74. private String type;
  75. @Value("${oss.bucket:4dkankan}")
  76. private String bucket;
  77. @Value("${main.url}")
  78. private String mainUrl;
  79. @Autowired
  80. private ISceneEditControlsService sceneEditControlsService;
  81. @Autowired
  82. private ISceneProService sceneProService;
  83. @Autowired
  84. private UploadToOssUtil uploadToOssUtil;
  85. @Autowired
  86. RedisUtil redisUtil;
  87. @Autowired
  88. private ISceneProExtService sceneProExtService;
  89. @Autowired
  90. private RedisLockUtil redisLockUtil;
  91. @Autowired
  92. ISceneDataDownloadService sceneDataDownloadService;
  93. @Override
  94. public SceneEditInfoVO saveScene(SceneEditInfoParamVO param) {
  95. ScenePro scenePro = sceneProService.findBySceneNum(param.getNum());
  96. if(Objects.isNull(scenePro)){
  97. throw new BusinessException(ErrorCode.FAILURE_CODE_5005);
  98. }
  99. SceneEditInfo sceneEditInfoDb = this.getBySceneProId(scenePro.getId());
  100. SceneEditControls sceneEditControlsDb = null;
  101. if(Objects.nonNull(sceneEditInfoDb)){
  102. sceneEditControlsDb = sceneEditControlsService.getBySceneEditId(sceneEditInfoDb.getId());
  103. }
  104. SceneEditInfo sceneEditInfo = BeanUtil.copyProperties(param, SceneEditInfo.class);
  105. sceneEditInfo.setSceneProId(scenePro.getId());
  106. sceneEditInfo.setCreateTime(Calendar.getInstance().getTime());
  107. if(Objects.isNull(sceneEditInfoDb)){
  108. this.save(sceneEditInfo);
  109. }else{
  110. sceneEditInfo.setId(sceneEditInfoDb.getId());
  111. sceneEditInfo.setUpdateTime(Calendar.getInstance().getTime());
  112. this.updateById(sceneEditInfo);
  113. }
  114. if(Objects.nonNull(param.getControls())){
  115. SceneEditControls sceneEditControls = BeanUtil.copyProperties(param.getControls(), SceneEditControls.class);
  116. sceneEditControls.setEditInfoId(sceneEditInfo.getId());
  117. if(Objects.isNull(sceneEditControlsDb)){
  118. sceneEditControlsService.save(sceneEditControls);
  119. }else{
  120. sceneEditControls.setId(sceneEditControlsDb.getId());
  121. sceneEditControlsService.updateById(sceneEditControls);
  122. }
  123. }
  124. SceneEditInfoVO result = BeanUtil.copyProperties(param, SceneEditInfoVO.class);
  125. result.setCreateTime(sceneEditInfo.getCreateTime());
  126. return result;
  127. }
  128. @Override
  129. public SceneEditInfo getBySceneProId(long sceneProId) {
  130. return this.getOne(new LambdaQueryWrapper<SceneEditInfo>()
  131. .eq(SceneEditInfo::getTbStatus, TbStatus.VALID.code())
  132. .eq(SceneEditInfo::getSceneProId, sceneProId));
  133. }
  134. @Override
  135. public ResultData publicScene(SceneEditInfoParamVO param) throws Exception{
  136. String sceneNum = param.getNum();
  137. if(StrUtil.isEmpty(sceneNum)){
  138. throw new BusinessException(ErrorCode.PARAM_REQUIRED);
  139. }
  140. //根据场景码查询数据库
  141. ScenePro scenePro = sceneProService.findBySceneNum(sceneNum);
  142. SceneProExt sceneProExt = sceneProExtService.findBySceneProId(scenePro.getId());
  143. SceneEditInfo sceneEditInfo = this.getBySceneProId(scenePro.getId());
  144. SceneEditControls sceneEditControls = null;
  145. if(sceneEditInfo == null){
  146. sceneEditInfo = new SceneEditInfo();
  147. sceneEditInfo.setSceneProId(scenePro.getId());
  148. }else{
  149. sceneEditControls = sceneEditControlsService.getBySceneEditId(sceneEditInfo.getId());
  150. }
  151. // if(sceneEditControls == null){
  152. // sceneEditControls = new SceneEditControls();
  153. // }
  154. //生成sceneJson
  155. SceneJsonBean sceneJson = BeanUtil.copyProperties(sceneEditInfo, SceneJsonBean.class);
  156. SceneEditControlsVO sceneEditControlsVO = BeanUtil.copyProperties(sceneEditControls, SceneEditControlsVO.class);
  157. sceneJson.setControls(sceneEditControlsVO);
  158. sceneJson.setNum(sceneNum);
  159. if(StrUtil.isNotEmpty(sceneEditInfo.getFloorPlanPath())){
  160. sceneJson.setFloorPlanPaths(sceneEditInfo.getFloorPlanPath().split(","));
  161. }
  162. sceneJson.setCreateTime(scenePro.getCreateTime());
  163. //处理热点数据,生成hot.json
  164. this.publicHotData(sceneNum, sceneJson, sceneEditInfo);
  165. //处理球幕视频
  166. this.buildVideo(sceneEditInfo, sceneProExt.getDataSource(), sceneNum);
  167. //上传sceneJson文件
  168. String sceneJsonPath = String.format(UploadFilePath.DATA_VIEW_PATH+"scene.json", sceneNum);
  169. uploadToOssUtil.upload(JSON.toJSONBytes(sceneJson), sceneJsonPath);
  170. //sceneJson放入缓存
  171. String key = String.format(RedisKey.SCENE_JSON, sceneNum);
  172. redisUtil.set(key, JSON.toJSONString(sceneJson));
  173. //删除发布数据中的user目录
  174. String publicUserPath = String.format(UploadFilePath.USER_VIEW_PATH, sceneNum);
  175. uploadToOssUtil.deleteFile(publicUserPath);
  176. // String editUserPath = String.format(UploadFilePath.USER_EDIT_PATH, sceneNum);
  177. //复制编辑目录到发布目录
  178. String editPath = String.format(UploadFilePath.EDIT_PATH, param.getNum());
  179. String viewPath = String.format(UploadFilePath.VIEW_PATH, param.getNum());
  180. uploadToOssUtil.copyFiles(editPath,viewPath);
  181. //入库
  182. if(sceneEditInfo.getId() == null){
  183. this.save(sceneEditInfo);
  184. }else{
  185. this.updateById(sceneEditInfo);
  186. }
  187. // sceneEditControls.setEditInfoId(sceneEditInfo.getId());
  188. // if(sceneEditControls.getId() == null){
  189. // sceneEditControlsService.save(sceneEditControls);
  190. // }else{
  191. // sceneEditControlsService.updateById(sceneEditControls);
  192. // }
  193. return ResultData.ok();
  194. }
  195. private void buildVideo(SceneEditInfo sceneEditInfo, String path, String num) throws Exception{
  196. if(CommonStatus.NO.equals(sceneEditInfo.getBuildVideoStatus())){
  197. return;
  198. }
  199. if(path != null && !"".equals(path) && path.startsWith("http")){
  200. path = ConstantFilePath.BUILD_MODEL_PATH + File.separator + path.split("/")[path.split("/").length - 2];
  201. }
  202. String target = path + "_images";
  203. log.info("球幕视频路径:{}", target + File.separator + "extras/video");
  204. File video = new File(target + File.separator + "extras/video");
  205. //如果文件夹或者文件不存在,跳出
  206. if(!video.exists() || video.listFiles() == null || video.listFiles().length == 0){
  207. return;
  208. }
  209. String userEditPath = String.format(UploadFilePath.USER_EDIT_PATH, num);
  210. for(String videoName : video.list()){
  211. log.info("球幕视频名称:{}", videoName);
  212. uploadToOssUtil.upload(target + File.separator + "extras/video/" + videoName,userEditPath + videoName);
  213. CreateObjUtil.mp4ToFlv(target + File.separator + "extras/video/" + videoName,
  214. target + File.separator + "extras/video/" + videoName.replace("mp4", "flv"));
  215. uploadToOssUtil.upload(target + File.separator + "extras/video/" + videoName.replace("mp4", "flv"),userEditPath + videoName.replace("mp4", "flv"));
  216. //覆盖原始视频资源
  217. FileUtils.copyFile(target + File.separator + "extras/video/" + videoName,
  218. path + File.separator + "caches/videos/" + videoName, true);
  219. }
  220. FileUtils.deleteDirectory(target + File.separator + "extras/video/");
  221. //重置状态
  222. sceneEditInfo.setBuildVideoStatus(CommonStatus.NO.code());
  223. }
  224. private void publicHotData(String sceneNum, SceneJsonBean sceneJson, SceneEditInfo sceneEditInfo) throws IOException {
  225. String hotDataKey = String.format(RedisKey.SCENE_HOT_DATA, sceneNum);
  226. Map<String, String> hotMap = redisUtil.hmget(hotDataKey);
  227. List<String> hotList = Lists.newArrayList();
  228. hotMap.entrySet().stream().forEach(entry->{
  229. if(StrUtil.isNotEmpty(entry.getValue())){
  230. hotList.add(entry.getValue());
  231. }
  232. });
  233. if(CollUtil.isNotEmpty(hotList)){
  234. JSONArray jsonhots = new JSONArray();
  235. hotList.stream().forEach(hot->{
  236. jsonhots.add(JSONObject.parseObject(hot));
  237. });
  238. String hotJsonPath = String.format(UploadFilePath.USER_EDIT_PATH, sceneNum) + "hot.json";
  239. uploadToOssUtil.upload(jsonhots.toString().getBytes(), hotJsonPath);
  240. //修改tags状态为是,标识有热点数据
  241. ScenePro scenePro = sceneProService.findBySceneNum(sceneNum);
  242. this.saveTagsToSceneEditInfo(sceneNum, scenePro.getId(), sceneEditInfo);
  243. }
  244. }
  245. @Override
  246. public SceneInfoVO getSceneInfo(@Var SceneInfoParamVO param) {
  247. SceneInfoReqType sceneInfoReqType = SceneInfoReqType.get(param.getReqType());
  248. switch (sceneInfoReqType){
  249. //如果是编辑页面请求,查数据库
  250. case EDIT:
  251. return this.getSceneInfo4Edit(param.getNum());
  252. //如果是查看页面请求,查redis
  253. case VIEW:
  254. return this.getSceneInfo4View(param.getNum());
  255. }
  256. return null;
  257. }
  258. /**
  259. * <p>
  260. 编辑页面获取场景详情信息
  261. * </p>
  262. * @author dengsixing
  263. * @date 2022/1/21
  264. * @param num
  265. * @return com.fdkankan.scene.vo.SceneInfoVO
  266. **/
  267. private SceneInfoVO getSceneInfo4Edit(String num){
  268. ScenePro scenePro = sceneProService.findBySceneNum(num);
  269. if(Objects.isNull(scenePro)){
  270. throw new BusinessException(ErrorCode.FAILURE_CODE_5005);
  271. }
  272. SceneEditInfo sceneEditInfo = this.getBySceneProId(scenePro.getId());
  273. SceneEditControls sceneEditControls = sceneEditControlsService.getBySceneEditId(sceneEditInfo.getId());
  274. SceneInfoVO sceneInfoVO = BeanUtil.copyProperties(sceneEditInfo, SceneInfoVO.class);
  275. sceneInfoVO.setControls(BeanUtil.copyProperties(sceneEditControls, SceneEditControlsVO.class));
  276. sceneInfoVO.setNum(num);
  277. //生成sceneJson
  278. if(StrUtil.isNotEmpty(sceneEditInfo.getFloorPlanPath())){
  279. sceneInfoVO.setFloorPlanPaths(sceneEditInfo.getFloorPlanPath().split(","));
  280. }
  281. sceneInfoVO.setCreateTime(scenePro.getCreateTime());
  282. return sceneInfoVO;
  283. }
  284. /**
  285. * <p>
  286. 查看页面获取场景详情信息
  287. * </p>
  288. * @author dengsixing
  289. * @date 2022/1/21
  290. * @param num
  291. * @return com.fdkankan.scene.vo.SceneInfoVO
  292. **/
  293. private SceneInfoVO getSceneInfo4View(String num){
  294. String sceneJson = redisUtil.get(String.format(RedisKey.SCENE_JSON, num));
  295. SceneInfoVO sceneInfoVO = null;
  296. //先查询redis
  297. if(StrUtil.isNotEmpty(sceneJson)){
  298. sceneInfoVO = JSON.parseObject(sceneJson, SceneInfoVO.class);
  299. return sceneInfoVO;
  300. }
  301. //如果redis没找到,从scene.json中获取
  302. String objectName = String.format(ConstantFilePath.SCENE_VIEW_DATA_DATA_SCENEJSON, num);
  303. String objectContent = uploadToOssUtil.getObjectContent(bucket, objectName);
  304. if(StrUtil.isEmpty(objectContent))
  305. return null;
  306. sceneInfoVO = JSON.parseObject(objectContent, SceneInfoVO.class);
  307. return sceneInfoVO;
  308. }
  309. @Override
  310. // @Transactional
  311. public ResultData saveUpload(SaveUploadParamVO param) throws Exception {
  312. FileBizType fileBizType = FileBizType.get(param.getBizType());
  313. String num = param.getNum();
  314. String fileInfo = param.getFileInfo();
  315. if(Objects.isNull(fileBizType)){
  316. throw new BusinessException(ErrorCode.FAILURE_CODE_7003);
  317. }
  318. switch (fileBizType){
  319. case MUSIC:
  320. return new MusicHandlerFactory().getHandler().save(num, fileInfo);
  321. case FLOOR_LOGO:
  322. return new FloorLogoHandlerFactory().getHandler().save(num, fileInfo);
  323. // case FLOOR_PLAN:
  324. // return new FloorPlanHandlerFactory().getHandler().save(num, fileInfo);
  325. case SCREENSHOT:
  326. return new ScreenshotHandlerFactory().getHandler().save(num, fileInfo);
  327. }
  328. return ResultData.ok();
  329. }
  330. @Override
  331. public ResultData saveCad(BaseDataParamVO param) throws Exception {
  332. String num = param.getNum();
  333. ScenePro scenePro = sceneProService.findBySceneNum(num);
  334. if(Objects.isNull(scenePro))
  335. throw new BusinessException(ErrorCode.FAILURE_CODE_5005);
  336. String editDataPath = String.format(UploadFilePath.DATA_EDIT_PATH, num);
  337. String editUserPath = String.format(UploadFilePath.USER_EDIT_PATH, num);
  338. String localDataPath = String.format(ConstantFilePath.DATABUFFER_FORMAT, num);
  339. String floorCadUrl = ossUrlPrefix + editDataPath + "floorplan_cad.json?t=" + System.currentTimeMillis();
  340. String floorUserUrl = ossUrlPrefix + editUserPath + "floorplan_user.json?t=" + System.currentTimeMillis();
  341. JSONObject fileInfoJson = JSON.parseObject(param.getData());
  342. String filePathStr = null;
  343. String floors = fileInfoJson.getString("floors");
  344. String cadInfo = fileInfoJson.getString("cadInfo");
  345. String floorJsonData = fileInfoJson.getString("floorJsonData");
  346. String filePaths = fileInfoJson.getString("filePaths");
  347. // Byte reSet = fileInfoJson.getByte("reset");
  348. //户型图文件路径
  349. if(StrUtil.isNotEmpty(filePaths)){
  350. cn.hutool.json.JSONArray filePathsArrs = JSONUtil.parseArray(filePaths);
  351. List<String> filePathsList = filePathsArrs.toList(String.class);
  352. StringBuilder filePathBuilder = new StringBuilder();
  353. filePathsList.parallelStream().forEach(path -> {
  354. filePathBuilder.append(",").append(path);
  355. });
  356. filePathStr = filePathBuilder.substring(1);
  357. }
  358. //处理户型图数据
  359. if(StrUtil.isNotEmpty(floors)) {
  360. //如果入参是空,则加载服务器的
  361. if(StrUtil.isEmpty(floorJsonData)){
  362. if (!StorageType.LOCAL.code().equals(this.type)) {// TODO: 2022/2/15 这里有可能有问题,可能还需要考虑本地部署的情况
  363. FileUtils.downLoadFromUrl(floorUserUrl, "floorplan_user.json", localDataPath);
  364. }
  365. floorJsonData = FileUtils.readFile(localDataPath + "floorplan_user.json");
  366. }
  367. //如果floors不为空,需要根据对应楼层id修改楼层名称
  368. if (StrUtil.isNotEmpty(floorJsonData)) {
  369. JSONObject floorUserJson = this.updateFloorName(floors, floorJsonData);
  370. floorJsonData = floorUserJson.toJSONString();
  371. }
  372. }
  373. //上传floorplan_user.json文件
  374. FileUtils.writeFile(localDataPath + "floorplan_user.json", floorJsonData);
  375. uploadToOssUtil.upload(localDataPath + "floorplan_user.json", editUserPath + "floorplan_user.json");
  376. //如果floors不为空,需要根据对应楼层id修改楼层名称
  377. if(StrUtil.isNotEmpty(floors)) {
  378. if (!StorageType.LOCAL.code().equals(this.type)) {// TODO: 2022/2/15 这里有可能有问题,可能还需要考虑本地部署的情况
  379. FileUtils.downLoadFromUrl(floorCadUrl, "floorplan_cad.json", localDataPath);
  380. }
  381. String floorCadStr = FileUtils.readFile(localDataPath + "floorplan_cad.json");
  382. if (StrUtil.isNotEmpty(floorCadStr)) {
  383. JSONObject floorCadJson = this.updateFloorName(floors, floorCadStr);
  384. FileUtils.writeFile(localDataPath + "floorplan_cad.json", floorCadJson.toString());
  385. uploadToOssUtil.upload(localDataPath + "floorplan_cad.json",editDataPath + "floorplan_cad.json");
  386. }
  387. }
  388. //写入数据库
  389. Byte floorPlanUser = null;
  390. if(StrUtil.isNotEmpty(floorJsonData)){
  391. floorPlanUser = CommonStatus.YES.code();
  392. }
  393. // if(CommonStatus.YES.code().equals(reSet)){
  394. // floorPlanUser = CommonStatus.NO.code();
  395. // }
  396. SceneEditInfo sceneEditInfoDb = this.getBySceneProId(scenePro.getId());
  397. if(Objects.nonNull(sceneEditInfoDb)){
  398. LambdaUpdateWrapper<SceneEditInfo> updateWrapper = new LambdaUpdateWrapper<SceneEditInfo>()
  399. .setSql("version=version+" + 1)
  400. .eq(SceneEditInfo::getId, sceneEditInfoDb.getId());
  401. if(StrUtil.isNotEmpty(filePathStr)){
  402. updateWrapper.set(SceneEditInfo::getFloorPlanPath, filePathStr);
  403. }
  404. if(StrUtil.isNotEmpty(cadInfo)){
  405. updateWrapper.set(SceneEditInfo::getCadInfo, cadInfo);
  406. }
  407. if(floorPlanUser != null){
  408. updateWrapper.set(SceneEditInfo::getFloorPlanUser, floorPlanUser);
  409. }
  410. this.update(updateWrapper);
  411. }else{
  412. sceneEditInfoDb = new SceneEditInfo();
  413. sceneEditInfoDb.setSceneProId(scenePro.getId());
  414. sceneEditInfoDb.setFloorPlanPath(filePathStr);
  415. sceneEditInfoDb.setCadInfo(cadInfo);
  416. sceneEditInfoDb.setFloorPlanUser(floorPlanUser);
  417. this.save(sceneEditInfoDb);
  418. }
  419. return ResultData.ok();
  420. }
  421. @Override
  422. public ResultData resetCad(String num){
  423. ScenePro scenePro = sceneProService.findBySceneNum(num);
  424. if(Objects.isNull(scenePro))
  425. throw new BusinessException(ErrorCode.FAILURE_CODE_5005);
  426. SceneEditInfo sceneEditInfoDb = this.getBySceneProId(scenePro.getId());
  427. if(Objects.nonNull(sceneEditInfoDb)){
  428. LambdaUpdateWrapper<SceneEditInfo> updateWrapper = new LambdaUpdateWrapper<SceneEditInfo>()
  429. .setSql("version=version+" + 1)
  430. .set(SceneEditInfo::getFloorPlanUser, CommonStatus.NO.code())
  431. .eq(SceneEditInfo::getId, sceneEditInfoDb.getId());
  432. this.update(updateWrapper);
  433. }else{
  434. sceneEditInfoDb = new SceneEditInfo();
  435. sceneEditInfoDb.setSceneProId(scenePro.getId());
  436. sceneEditInfoDb.setFloorPlanUser(CommonStatus.NO.code());
  437. this.save(sceneEditInfoDb);
  438. }
  439. return ResultData.ok();
  440. }
  441. private JSONObject updateFloorName(String sourceFloors, String targeFloors){
  442. JSONArray sourceFloorsJson = JSON.parseArray(sourceFloors);
  443. JSONObject targeFloorsJson = JSONObject.parseObject(targeFloors);
  444. JSONArray array = targeFloorsJson.getJSONArray("floors");
  445. for (int i = 0; i < array.size(); ++i) {
  446. JSONObject targetFloor = array.getJSONObject(i);
  447. int targetId = targetFloor.getIntValue("id");
  448. for (int j = 0; j < sourceFloorsJson.size(); ++j) {
  449. JSONObject floor = sourceFloorsJson.getJSONObject(j);
  450. int id = floor.getIntValue("id");
  451. String name = floor.getString("name");
  452. if (targetId != id)
  453. continue;
  454. targetFloor.put("name", name);
  455. }
  456. }
  457. return targeFloorsJson;
  458. }
  459. @Override
  460. public void upgradeVersionById(Long id) {
  461. this.update(new LambdaUpdateWrapper<SceneEditInfo>()
  462. .setSql("version=version+" + 1)
  463. .eq(SceneEditInfo::getId, id));
  464. }
  465. @Override
  466. public List<String> uploadPanorama(String num, MultipartFile file) throws Exception {
  467. //压缩包保存到本地
  468. String path = String.format(ConstantFilePath.SCENE_CACHE_IMAGES, num);
  469. // String path = "F:\\mnt\\4Dkankan\\scene\\t-ieXdyGl6Md\\caches\\images\\";
  470. String targetFilePath = path + File.separator + file.getOriginalFilename();
  471. File targetFile = new File(targetFilePath);
  472. if(!targetFile.getParentFile().exists()){
  473. targetFile.getParentFile().mkdirs();
  474. }
  475. file.transferTo(targetFile);
  476. //解压zip包
  477. FileUtil.unZip(targetFilePath, path);
  478. //删除压缩包
  479. FileUtil.delFile(targetFilePath);
  480. //获取解压后的文件列表
  481. List<String> uploadFileList = FileUtil.getFileList(path);
  482. if(CollUtil.isEmpty(uploadFileList)){
  483. return null;
  484. }
  485. //列出caches/images中的文件列表
  486. String imgCachePath = String.format(UploadFilePath.IMG_CACHES_PATH, num);
  487. List<String> keyList = uploadToOssUtil.listKeys(imgCachePath);
  488. //比对图片列表,不存在的要返回名称集合
  489. List<String> notExistFileList = uploadFileList.stream().filter(filePath -> {
  490. filePath = filePath.substring(filePath.lastIndexOf(File.separator) + 1);
  491. for (String key : keyList) {
  492. key = key.substring(key.lastIndexOf("/") + 1);
  493. if (filePath.equals(key)) {
  494. return false;
  495. }
  496. }
  497. return true;
  498. }).map(filePath -> {
  499. return filePath.substring(filePath.lastIndexOf(File.separator) + 1);
  500. }).collect(Collectors.toList());
  501. //删除云caches/images
  502. uploadToOssUtil.deleteFile(imgCachePath);
  503. //上传
  504. Map<String, String> map = new HashMap<>();
  505. uploadFileList.stream().forEach(filePath->{
  506. map.put(filePath, filePath.replace(path, imgCachePath));
  507. });
  508. uploadToOssUtil.uploadMulFiles(map);
  509. return notExistFileList;
  510. }
  511. @Override
  512. public ResultData downloadPanorama(FileParamVO param) throws Exception {
  513. String num = param.getNum();
  514. String fileName = param.getFileName();
  515. String cachePath = String.format(ConstantFilePath.SCENE_CACHE, num);
  516. String imgCachePath = String.format(UploadFilePath.IMG_CACHES_PATH, num);
  517. String localImagesPath = String.format(ConstantFilePath.SCENE_CACHE_IMAGES, num);
  518. String cacheFormat = "downloads/scene/%s/caches/";
  519. String cacheImageFormat = "downloads/scene/%s/caches/images/";
  520. //删除本地文件
  521. FileUtils.deleteDirectory(localImagesPath);
  522. //如果入参文件名不为空,则是单个文件下载,不需要打包
  523. if(StrUtil.isNotEmpty(fileName)){
  524. //先下载到本地
  525. if (!StorageType.LOCAL.code().equals(this.type)) {// TODO: 2022/2/15 这里有可能有问题,可能还需要考虑本地部署的情况
  526. String filePath = imgCachePath + fileName;
  527. String imageUrl = ossUrlPrefix + filePath + "?t=" + System.currentTimeMillis();
  528. FileUtils.downLoadFromUrl(imageUrl, fileName, localImagesPath);
  529. }
  530. //上传
  531. uploadToOssUtil.upload(localImagesPath + fileName, String.format(cacheImageFormat, num) + fileName);
  532. String url = ossUrlPrefix + String.format(cacheImageFormat, num) + fileName + "?t=" + Calendar.getInstance().getTimeInMillis();
  533. Map<String, Object> map = new HashMap<>();
  534. map.put("fileUrl", url + "?t=" + System.currentTimeMillis());
  535. map.put("fileName", fileName);
  536. return ResultData.ok(map);
  537. }
  538. //先下载到本地
  539. List<String> keyList = uploadToOssUtil.listKeys(imgCachePath);
  540. if (!StorageType.LOCAL.code().equals(this.type)) {// TODO: 2022/2/15 这里有可能有问题,可能还需要考虑本地部署的情况
  541. keyList.stream().forEach(key->{
  542. String file = key.substring(key.lastIndexOf("/") + 1);
  543. String imageUrl = ossUrlPrefix + imgCachePath + file + "?t=" + System.currentTimeMillis();
  544. FileUtils.downLoadFromUrl(imageUrl, file, localImagesPath);
  545. });
  546. }
  547. //打包
  548. String zipName = num + "_images.zip";
  549. String zipPath = cachePath + zipName;
  550. FileUtils.zipFile(zipPath, localImagesPath);
  551. //上传压缩包
  552. uploadToOssUtil.upload(zipPath, String.format(cacheFormat, num) + zipName);
  553. String url = ossUrlPrefix + String.format(cacheFormat, num) + zipName + "?t=" + Calendar.getInstance().getTimeInMillis();
  554. Map<String, Object> map = new HashMap<>();
  555. map.put("fileUrl", url + "?t=" + System.currentTimeMillis());
  556. map.put("fileName", zipName);
  557. return ResultData.ok(map);
  558. }
  559. @Override
  560. public void saveTagsToSceneEditInfo(String num, Long sceneProId, SceneEditInfo sceneEditInfo){
  561. //查询缓存是否包含热点数据
  562. String key = String.format(RedisKey.SCENE_HOT_DATA, num);
  563. Map<String, String> allTagsMap = redisUtil.hmget(key);
  564. boolean hashTags = false;
  565. for (Entry<String, String> tagMap : allTagsMap.entrySet()) {
  566. if(StrUtil.isEmpty(tagMap.getValue())){
  567. continue;
  568. }
  569. hashTags = true;
  570. break;
  571. }
  572. //更改热点状态
  573. sceneEditInfo.setTags(hashTags ? CommonStatus.YES.code() : CommonStatus.NO.code());
  574. //version 是空的代表 sceneEditInfo记录集不存在
  575. if(sceneEditInfo.getVersion() != null){
  576. sceneEditInfo.setVersion(sceneEditInfo.getVersion() + 1);
  577. }
  578. }
  579. @Override
  580. public ResultData saveVideoBox(FileNameAndDataParamVO param) throws Exception {
  581. JSONObject boxVideo = JSONObject.parseObject(param.getData());
  582. String sid = boxVideo.getString("sid");
  583. if(StrUtil.isEmpty(sid)){
  584. throw new BusinessException(ErrorCode.PARAM_REQUIRED);
  585. }
  586. ScenePro scenePro = sceneProService.findBySceneNum(param.getNum());
  587. if(Objects.isNull(scenePro))
  588. throw new BusinessException(ErrorCode.FAILURE_CODE_5005);
  589. SceneEditInfo sceneEditInfo = this.getBySceneProId(scenePro.getId());
  590. //转换视频格式
  591. this.transferToFlv(param.getNum(), param.getFileName());
  592. //生成boxVideos数据
  593. String boxVideos = this.createBoxVideos(sid, boxVideo, sceneEditInfo, OperationType.ADDORUPDATE.code());
  594. //更新数据库
  595. this.updateBoxVideos(sceneEditInfo, scenePro.getId(), boxVideos);
  596. return ResultData.ok();
  597. }
  598. @Override
  599. public ResultData deleteVideoBox(DeleteVidoeBoxParamVO param) throws Exception {
  600. ScenePro scenePro = sceneProService.findBySceneNum(param.getNum());
  601. if(Objects.isNull(scenePro))
  602. throw new BusinessException(ErrorCode.FAILURE_CODE_5005);
  603. SceneEditInfo sceneEditInfo = this.getBySceneProId(scenePro.getId());
  604. //根据sid移除json
  605. String boxVideos = this.createBoxVideos(param.getSid(), null, sceneEditInfo, OperationType.DELETE.code());
  606. //写数据库
  607. this.updateBoxVideos(sceneEditInfo,scenePro.getId(),boxVideos);
  608. return ResultData.ok();
  609. }
  610. @Override
  611. public DownloadVO downloadBallScreenVideo(BallScreenVideoParamVO param) {
  612. String videoPath = String.format(UploadFilePath.USER_EDIT_PATH, param.getNum()) + param.getFileName();
  613. String url = ossUrlPrefix + videoPath + "?t=" + System.currentTimeMillis();
  614. return DownloadVO.builder()
  615. .fileName(param.getFileName())
  616. .url(url)
  617. .build();
  618. }
  619. @Override
  620. public ResultData uploadBallScreenVideo(String num, String fileName, MultipartFile file)
  621. throws IOException {
  622. if(!fileName.endsWith(".mp4")){
  623. throw new BusinessException(ErrorCode.FAILURE_CODE_7007.code(), ErrorCode.FAILURE_CODE_7007.formatMessage("mp4"));
  624. }
  625. ScenePro scenePro = sceneProService.findBySceneNum(num);
  626. if(scenePro == null){
  627. throw new BusinessException(ErrorCode.FAILURE_CODE_5005);
  628. }
  629. SceneProExt sceneProExt = sceneProExtService.findBySceneProId(scenePro.getId());
  630. String path = sceneProExt.getDataSource();
  631. if(path != null && !"".equals(path) && path.startsWith("http")){
  632. path = ConstantFilePath.BUILD_MODEL_PATH + File.separator + path.split("/")[path.split("/").length - 2];
  633. }
  634. String target = path + "_images";
  635. String filePath = target + File.separator + "extras/video" + File.separator + fileName;
  636. File targetFile = new File(filePath);
  637. if(!targetFile.getParentFile().exists()){
  638. targetFile.getParentFile().mkdirs();
  639. }
  640. //保存视频到本地
  641. file.transferTo(targetFile);
  642. SceneEditInfo sceneEditInfo = this.getBySceneProId(scenePro.getId());
  643. if(sceneEditInfo == null){
  644. sceneEditInfo = new SceneEditInfo();
  645. sceneEditInfo.setSceneProId(scenePro.getId());
  646. sceneEditInfo.setBuildVideoStatus(CommonStatus.YES.code());
  647. this.save(sceneEditInfo);
  648. }else{
  649. sceneEditInfo.setBuildVideoStatus(CommonStatus.YES.code());
  650. this.updateById(sceneEditInfo);
  651. }
  652. return ResultData.ok();
  653. }
  654. @Override
  655. public ResultData sceneSync(String num, String type, String floorPlanJson, String ajkJson, String cameraJson,
  656. MultipartFile[] files) throws Exception {
  657. String lockKey = String.format(RedisLockKey.LOCK_SCENE_SYNC, num);
  658. Boolean lock = redisLockUtil.lock(lockKey, RedisKey.EXPIRE_TIME_2_HOUR);
  659. if(!lock){
  660. throw new BusinessException(ErrorCode.FAILURE_CODE_5036);
  661. }
  662. try {
  663. ScenePro scenePro = sceneProService.findBySceneNum(num);
  664. if(scenePro == null){
  665. throw new BusinessException(ErrorCode.FAILURE_CODE_5005);
  666. }
  667. SceneProExt sceneProExt = sceneProExtService.findBySceneProId(scenePro.getId());
  668. //更新scene.json文件
  669. String strsceneInfos = FileUtils.readFile(ConstantFilePath.SCENE_PATH + "data" + File.separator + "data" + num + File.separator + "scene.json");
  670. if(strsceneInfos == null)
  671. new File(ConstantFilePath.SCENE_PATH + "data" + File.separator + "data" + num + File.separator + "scene.json").createNewFile();
  672. String path = sceneProExt.getDataSource();// /mnt/data/0662c5389/831989883441512448/4898cab04f8c_202104141602356060/
  673. if(path != null && !"".equals(path) && path.startsWith("http")){
  674. path = ConstantFilePath.BUILD_MODEL_PATH + File.separator + path.split("/")[path.split("/").length - 2];
  675. }
  676. String target = path + "_ajk"; // /mnt/data/0662c5389/831989883441512448/4898cab04f8c_202104141602356060_ajk
  677. File editPath = new File(target);
  678. if(!editPath.exists()){
  679. editPath.mkdirs();
  680. }
  681. //创建文件夹软连接并且复制data.json和project.json
  682. if(new File(target + File.separator + "capture").exists()){
  683. new File(target + File.separator + "capture").delete();
  684. }
  685. if(new File(target + File.separator + "caches").exists()){
  686. //删除link
  687. new File(target + File.separator + "caches" + File.separator + "images").delete();
  688. //删除所有文件
  689. FileUtils.delAllFile(target + File.separator + "caches");
  690. }
  691. if(new File(target + File.separator + "results").exists()){
  692. FileUtils.delAllFile(target + File.separator + "results");
  693. }
  694. //创建文件夹,并link文件夹
  695. new File(target + File.separator + "caches").mkdirs();
  696. CreateObjUtil.createSoftConnection(path + File.separator + "capture", target + File.separator + "capture");
  697. if(new File(path + File.separator + "caches" + File.separator + "images").exists()){
  698. CreateObjUtil.createSoftConnection(path + File.separator + "caches" + File.separator + "images", target + File.separator + "caches" + File.separator + "images");
  699. }
  700. FileUtils.copyFile(path + File.separator + "data.json", target + File.separator+"data.json", true);
  701. FileUtils.copyFile(path + File.separator + "project.json", target + File.separator+"project.json", true);
  702. //data.json增加extras为执行重建算法
  703. String project = FileUtils.readFile(target + File.separator+"project.json");
  704. if(project != null){
  705. JSONObject projectJson = JSONObject.parseObject(project);
  706. projectJson.put("parent", projectJson.get("uuid"));
  707. projectJson.put("uuid", UUID.randomUUID().toString());
  708. projectJson.put("time", System.currentTimeMillis());
  709. FileUtils.writeFile(path + File.separator + "project.json", projectJson.toString());
  710. }
  711. String data = FileUtils.readFile(target + File.separator+"data.json");
  712. if(data != null){
  713. JSONObject floorplanJson = new JSONObject();
  714. floorplanJson.put("has_floor_ajk_json", true);
  715. floorplanJson.put("has_vision_txt", true);
  716. floorplanJson.put("has_floorplan_json", true);
  717. JSONObject dataJson = JSONObject.parseObject(data);
  718. dataJson.put("extras", floorplanJson);
  719. //V5表示不需要生成high,low文件
  720. dataJson.put("skybox_type", "SKYBOX_V8");
  721. dataJson.put("split_type", "SPLIT_V10");
  722. FileUtils.writeFile(target + File.separator+"data.json", new String(dataJson.toString().getBytes(), "UTF-8"));
  723. }
  724. //文件上传的位置可以自定义
  725. log.info("画墙重建模型开始");
  726. File targetFile = new File(target + File.separator + "extras" + File.separator + "floor_ajk.json");
  727. if(!targetFile.getParentFile().exists()){
  728. targetFile.getParentFile().mkdirs();
  729. }
  730. if(targetFile.exists()){
  731. FileUtils.deleteFile(target + File.separator + "extras" + File.separator + "floor_ajk.json");
  732. }
  733. // 保存
  734. FileUtils.writeFile(target + File.separator + "extras" + File.separator + "floorplan.json", new String(floorPlanJson.getBytes(), "UTF-8"));
  735. FileUtils.writeFile(target + File.separator + "extras" + File.separator + "floor_ajk.json", new String(ajkJson.getBytes(), "UTF-8"));
  736. FileUtils.writeFile(ConstantFilePath.SCENE_PATH+"data"+File.separator+"data"+num + File.separator + "floor_ajk.json", new String(ajkJson.getBytes(), "UTF-8"));
  737. FileUtils.writeFile(target + File.separator + "extras" + File.separator + "vision.txt", new String(cameraJson.getBytes(), "UTF-8"));
  738. FileUtils.writeFile(ConstantFilePath.SCENE_PATH+"data"+File.separator+"data"+num + File.separator + "camera.json", new String(cameraJson.getBytes(), "UTF-8"));
  739. for(int i = 0; i < files.length; i ++){
  740. File cadImg = new File(target + File.separator + "extras" + File.separator + "Floorplans/" + files[i].getOriginalFilename());
  741. if(!cadImg.getParentFile().exists()){
  742. cadImg.getParentFile().mkdirs();
  743. }
  744. if(cadImg.exists())
  745. {
  746. cadImg.delete();
  747. }
  748. files[i].transferTo(cadImg);
  749. }
  750. //下载封面图
  751. FileUtils.downLoadFromUrl(scenePro.getThumb() + "?t=" + System.currentTimeMillis(),
  752. "Cover.png", target + File.separator + "extras" + File.separator + "CoverImage");
  753. //转换成jpg
  754. FileUtils.pngToJpg(target + File.separator + "extras" + File.separator + "CoverImage/Cover.png",
  755. target + File.separator + "extras" + File.separator + "CoverImage/Cover.jpg");
  756. //安居客算法运行
  757. log.info("安居客算法:开始建模——"+num);
  758. CreateObjUtil.build3dModel(target , "1");
  759. if(!new File(target + File.separator + "results" + File.separator + "upload.json").exists()){
  760. return ResultData.error(ErrorCode.FAILURE_CODE_5042);
  761. }
  762. String zipPath = target + File.separator + "results/" + num + ".zip";
  763. new File(zipPath).delete();
  764. // FileUtils.zipFile(zipPath, target + File.separator + "results/ajk/");
  765. String command = "bash /opt/ossutil/gzip.sh " + zipPath.replace(".zip", "") + " " + target + File.separator + "results/ajk/";
  766. log.info("压缩文件:" + command);
  767. CreateObjUtil.callshell(command);
  768. if(!new File(zipPath).exists()){
  769. return ResultData.error(ErrorCode.FAILURE_CODE_5043);
  770. }
  771. String fileMD5 = FileMd5Util.getFileMD5(new File(zipPath));
  772. uploadToOssUtil.upload(zipPath, "data_download/" + num + ".zip");
  773. SceneDataDownload sceneDataDownload = sceneDataDownloadService.findBySceneNum(num);
  774. if(sceneDataDownload == null){
  775. sceneDataDownload = new SceneDataDownload();
  776. sceneDataDownload.setNum(num);
  777. sceneDataDownload.setDownloadPath(prefixAli + "data_download/" + num + ".zip");
  778. sceneDataDownload.setFileMd5(fileMD5);
  779. sceneDataDownloadService.save(sceneDataDownload);
  780. return ResultData.ok();
  781. }
  782. sceneDataDownload.setFileMd5(fileMD5);
  783. sceneDataDownload.setUpdateTime(Calendar.getInstance().getTime());
  784. sceneDataDownloadService.updateById(sceneDataDownload);
  785. }catch (Exception e){
  786. log.error("画墙重建模型失败...", e);
  787. throw new BusinessException(ErrorCode.FAILURE_CODE_5039);
  788. }finally {
  789. redisLockUtil.unlockLua(lockKey);
  790. }
  791. return ResultData.ok();
  792. }
  793. private void updateBoxVideos(SceneEditInfo sceneEditInfo, Long sceneProId, String boxVideos){
  794. if(StrUtil.isEmpty(boxVideos)){
  795. return;
  796. }
  797. if(Objects.isNull(sceneEditInfo)){
  798. sceneEditInfo = new SceneEditInfo();
  799. sceneEditInfo.setSceneProId(sceneProId);
  800. sceneEditInfo.setBoxVideos(boxVideos);
  801. this.save(sceneEditInfo);
  802. }else{
  803. this.update(new LambdaUpdateWrapper<SceneEditInfo>()
  804. .setSql("version = version + 1")
  805. .set(SceneEditInfo::getBoxVideos, boxVideos)
  806. .eq(SceneEditInfo::getId, sceneEditInfo.getId()));
  807. }
  808. }
  809. private String createBoxVideos(String sid, JSONObject boxVideo, SceneEditInfo sceneEditInfo, int type){
  810. String boxVideos = null;
  811. if(sceneEditInfo != null){
  812. boxVideos = sceneEditInfo.getBoxVideos();
  813. }
  814. JSONArray boxVideosJson = null;
  815. if (StrUtil.isNotEmpty(boxVideos)) {
  816. boxVideosJson = JSONArray.parseArray(boxVideos);
  817. }else {
  818. boxVideosJson = new JSONArray();
  819. }
  820. //删除
  821. if(type == OperationType.DELETE.code()){
  822. if(boxVideosJson.size() == 0)
  823. return null;
  824. for(int i=0;i<boxVideosJson.size();++i){
  825. JSONObject ele = boxVideosJson.getJSONObject(i);
  826. if(ele.getString("sid").equals(sid)){
  827. boxVideosJson.remove(i);
  828. }
  829. }
  830. return boxVideosJson.toJSONString();
  831. }
  832. //更新
  833. boolean exist = false;
  834. for(int i=0;i<boxVideosJson.size();++i){
  835. JSONObject ele = boxVideosJson.getJSONObject(i);
  836. if(ele.getString("sid").equals(sid)){
  837. boxVideosJson.set(i, boxVideo);
  838. exist = true;
  839. }
  840. }
  841. //新增
  842. if(!exist){
  843. boxVideosJson.add(boxVideo);
  844. }
  845. return boxVideosJson.toJSONString();
  846. }
  847. private void transferToFlv(String num, String fileName) throws Exception {
  848. String userEditPath = String.format(UploadFilePath.USER_EDIT_PATH, num);
  849. String localImagesPath = String.format(ConstantFilePath.IMAGESBUFFER_FORMAT, num);
  850. String localFilePath = localImagesPath + fileName;
  851. File targetFile = new File(localImagesPath);
  852. if (!targetFile.exists()){
  853. targetFile.mkdirs();
  854. }
  855. targetFile = new File(localFilePath);
  856. if (targetFile.exists()){
  857. FileUtils.deleteFile(localFilePath);
  858. }
  859. //从用户编辑目录中下载视频到本地
  860. if (!StorageType.LOCAL.code().equals(this.type)) {
  861. String filePath = userEditPath + fileName;
  862. String imageUrl = ossUrlPrefix + filePath + "?t=" + System.currentTimeMillis();
  863. FileUtils.downLoadFromUrl(imageUrl, fileName, localImagesPath);
  864. }
  865. //视频格式转换
  866. CreateObjUtil.mp4ToFlv(localFilePath, localFilePath.replace("mp4", "flv"));
  867. //上传
  868. String flvFileName = fileName.replace("mp4", "flv");
  869. uploadToOssUtil.upload(localFilePath, userEditPath + fileName);
  870. uploadToOssUtil.upload(localFilePath.replace("mp4", "flv"), userEditPath+flvFileName);
  871. }
  872. }