ScenePlusServiceImpl.java 27 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610
  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.date.DateField;
  5. import cn.hutool.core.date.DateUtil;
  6. import cn.hutool.core.io.FileUtil;
  7. import cn.hutool.core.thread.ThreadUtil;
  8. import cn.hutool.core.util.StrUtil;
  9. import cn.hutool.extra.qrcode.QrCodeUtil;
  10. import cn.hutool.extra.qrcode.QrConfig;
  11. import com.alibaba.fastjson.JSON;
  12. import com.alibaba.fastjson.JSONArray;
  13. import com.alibaba.fastjson.JSONObject;
  14. import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
  15. import com.baomidou.mybatisplus.core.conditions.update.LambdaUpdateWrapper;
  16. import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
  17. import com.fdkankan.common.constant.*;
  18. import com.fdkankan.common.exception.BusinessException;
  19. import com.fdkankan.common.util.FileUtils;
  20. import com.fdkankan.model.constants.ConstantFilePath;
  21. import com.fdkankan.model.constants.UploadFilePath;
  22. import com.fdkankan.model.utils.FloorPlanUserUtil;
  23. import com.fdkankan.scene.bean.SceneBean;
  24. import com.fdkankan.scene.constant.UserEditDataType;
  25. import com.fdkankan.scene.entity.SceneEditInfoExt;
  26. import com.fdkankan.scene.entity.ScenePro;
  27. import com.fdkankan.scene.service.ISceneEditInfoExtService;
  28. import com.fdkankan.scene.service.ISceneProService;
  29. import com.fdkankan.web.response.ResultData;
  30. import com.fdkankan.redis.constant.RedisKey;
  31. import com.fdkankan.redis.constant.RedisLockKey;
  32. import com.fdkankan.redis.util.RedisLockUtil;
  33. import com.fdkankan.redis.util.RedisUtil;
  34. import com.fdkankan.scene.bean.LaserSceneBean;
  35. import com.fdkankan.scene.bean.SceneJsonBean;
  36. import com.fdkankan.scene.config.FdkkLaserConfig;
  37. import com.fdkankan.scene.entity.*;
  38. import com.fdkankan.scene.mapper.IScenePlusMapper;
  39. import com.fdkankan.scene.oss.OssUtil;
  40. import com.fdkankan.scene.service.*;
  41. import com.fdkankan.scene.vo.SceneCheckKeyParamVO;
  42. import com.fdkankan.scene.vo.SceneDataDownloadVO;
  43. import com.fdkankan.scene.vo.SceneEditControlsVO;
  44. import com.fdkankan.web.response.ResultData;
  45. import java.io.File;
  46. import java.nio.file.FileSystemException;
  47. import java.util.*;
  48. import lombok.extern.slf4j.Slf4j;
  49. import org.apache.commons.lang3.StringUtils;
  50. import org.springframework.beans.factory.annotation.Autowired;
  51. import org.springframework.beans.factory.annotation.Value;
  52. import org.springframework.stereotype.Service;
  53. import org.springframework.web.multipart.MultipartFile;
  54. import java.io.File;
  55. import java.nio.charset.StandardCharsets;
  56. import java.util.List;
  57. import java.util.Objects;
  58. import java.util.UUID;
  59. import java.util.stream.Collectors;
  60. import java.util.stream.Stream;
  61. /**
  62. * <p>
  63. * 场景主表 服务实现类
  64. * </p>
  65. *
  66. * @author
  67. * @since 2022-03-16
  68. */
  69. @Slf4j
  70. @Service
  71. public class ScenePlusServiceImpl extends ServiceImpl<IScenePlusMapper, ScenePlus> implements IScenePlusService {
  72. @Value("${main.url}")
  73. private String mainUrl;
  74. @Value("${scene.pro.new.url}")
  75. private String sceneProNewUrl;
  76. @Autowired
  77. private IScenePlusExtService scenePlusExtService;
  78. @Autowired
  79. private IScenePlusService scenePlusService;
  80. @Autowired
  81. private ISceneEditInfoService sceneEditInfoService;
  82. @Autowired
  83. private ISceneDataDownloadService sceneDataDownloadService;
  84. @Autowired
  85. private RedisUtil redisUtil;
  86. @Autowired
  87. private RedisLockUtil redisLockUtil;
  88. @Autowired
  89. private ISceneEditInfoExtService sceneEditInfoExtService;
  90. @Autowired
  91. private ISceneEditControlsService sceneEditControlsService;
  92. @Autowired
  93. private OssUtil ossUtil;
  94. @Autowired
  95. FdkkLaserConfig fdkkLaserConfig;
  96. @Autowired
  97. private ISceneProService sceneProService;
  98. @Autowired
  99. private ISceneDelLogService sceneDelLogService;
  100. @Autowired
  101. private ICommonService commonService;
  102. @Override
  103. public ScenePlus getScenePlusByNum(String num) {
  104. return this.getOne(new LambdaQueryWrapper<ScenePlus>().eq(ScenePlus::getNum, num));
  105. }
  106. @Override
  107. public ResultData checkKey(SceneCheckKeyParamVO param) throws Exception {
  108. ScenePlus scenePlus = scenePlusService.getOne(new LambdaQueryWrapper<ScenePlus>()
  109. .eq(ScenePlus::getNum, param.getNum())
  110. .eq(ScenePlus::getPayStatus, PayStatus.PAY.code()));
  111. if (Objects.isNull(scenePlus)) {
  112. throw new BusinessException(ErrorCode.FAILURE_CODE_5005);
  113. }
  114. SceneEditInfo sceneEditInfo = sceneEditInfoService.getByScenePlusId(scenePlus.getId());
  115. if (Objects.isNull(sceneEditInfo)) {
  116. throw new BusinessException(ErrorCode.FAILURE_CODE_5005);
  117. }
  118. if(!param.getPassword().equals(sceneEditInfo.getScenePassword())){
  119. throw new BusinessException(ErrorCode.FAILURE_CODE_5021);
  120. }
  121. return ResultData.ok();
  122. }
  123. @Override
  124. public ResultData updateScenePlusUserIdByCameraId(List<Long> cameraIdList, Long userId) {
  125. LambdaUpdateWrapper<ScenePlus> updateWrapper = new LambdaUpdateWrapper<ScenePlus>()
  126. .set(ScenePlus::getUserId, userId).in(ScenePlus::getCameraId, cameraIdList);
  127. this.update(updateWrapper);
  128. return ResultData.ok();
  129. }
  130. @Override
  131. public ResultData moveScene(List<String> numList, Long cameraId, Long userId) {
  132. LambdaUpdateWrapper<ScenePlus> updateWrapper =
  133. new LambdaUpdateWrapper<ScenePlus>()
  134. .set(ScenePlus::getUserId, userId)
  135. .set(ScenePlus::getCameraId, cameraId)
  136. .in(ScenePlus::getNum, numList);
  137. this.update(updateWrapper);
  138. return ResultData.ok();
  139. }
  140. @Override
  141. public ResultData downLoadZSData(String num) throws Exception {
  142. if(StrUtil.isEmpty(num)){
  143. throw new BusinessException(ErrorCode.FAILURE_CODE_3001);
  144. }
  145. String version = "v4";
  146. ScenePlus scenePlus = this.getScenePlusByNum(num);
  147. ScenePro scenePro = null;
  148. if(Objects.isNull(scenePlus)){
  149. scenePro = sceneProService.getByNum(num);
  150. version = "v3";
  151. if(Objects.isNull(scenePro)){
  152. throw new BusinessException(ErrorCode.FAILURE_CODE_5005);
  153. }
  154. }
  155. SceneDataDownload sceneDataDownload = sceneDataDownloadService.findBySceneNum(num);
  156. if(sceneDataDownload == null){
  157. throw new BusinessException(ErrorCode.FAILURE_CODE_5025);
  158. }
  159. SceneDataDownloadVO sceneDataDownloadVO = BeanUtil.copyProperties(sceneDataDownload, SceneDataDownloadVO.class);
  160. sceneDataDownloadVO.setVersion(version);
  161. return ResultData.ok(sceneDataDownloadVO);
  162. }
  163. @Override
  164. public ScenePlus checkSceneAvail(String num) {
  165. ScenePlus scenePlus = this.getScenePlusByNum(num);
  166. if(Objects.isNull(scenePlus)){
  167. throw new BusinessException(ErrorCode.FAILURE_CODE_5005);
  168. }
  169. if(!SceneStatus.SUCCESS.code().equals(scenePlus.getSceneStatus())
  170. && !SceneStatus.NO_DISPLAY.code().equals(scenePlus.getSceneStatus())){
  171. throw new BusinessException(ErrorCode.FAILURE_CODE_5033);
  172. }
  173. if(!PayStatus.PAY.code().equals(scenePlus.getPayStatus())){
  174. throw new BusinessException(ErrorCode.FAILURE_CODE_5034);
  175. }
  176. return scenePlus;
  177. }
  178. @Override
  179. public ResultData updateViewCount(String sceneNum) {
  180. String key = RedisKey.SCENE_VISIT_CNT;
  181. if(!redisUtil.hHasKey(key, sceneNum)){
  182. String lockKey = String.format(RedisLockKey.LOCK_SCENE_VISIT_CNT, sceneNum);
  183. String lockVal = cn.hutool.core.lang.UUID.randomUUID().toString();
  184. boolean lock = redisLockUtil.lock(lockKey, lockVal, RedisKey.EXPIRE_TIME_10_MINUTE);
  185. if(!lock){
  186. return ResultData.ok();
  187. }
  188. try {
  189. String cnt = redisUtil.hget(key, sceneNum);
  190. if(StrUtil.isEmpty(cnt)){
  191. //标记是否找到了场景,如果找到就不往下找
  192. Integer viewCount = null;
  193. ScenePlus scenePlus = scenePlusService.getScenePlusByNum(sceneNum);
  194. ScenePlusExt scenePlusExt = scenePlusExtService.getScenePlusExtByPlusId(scenePlus.getId());
  195. viewCount = scenePlusExt.getViewCount();
  196. redisUtil.hset(key, sceneNum, Objects.isNull(viewCount) ? "0" : String.valueOf(viewCount));
  197. }
  198. }finally {
  199. redisLockUtil.unlockLua(lockKey, lockVal);
  200. }
  201. }
  202. redisUtil.hincr(key, sceneNum, 1);
  203. return ResultData.ok();
  204. }
  205. @Override
  206. public ResultData uploadShareLogo(String num, MultipartFile file) throws Exception {
  207. ScenePlus scenePlus = this.getScenePlusByNum(num);
  208. if (Objects.isNull(scenePlus)) {
  209. return ResultData.error(ErrorCode.FAILURE_CODE_5005);
  210. }
  211. ScenePlusExt scenePlusExt = scenePlusExtService.getScenePlusExtByPlusId(scenePlus.getId());
  212. SceneEditInfoExt sceneEditInfoExt = sceneEditInfoExtService.getByScenePlusId(scenePlus.getId());
  213. String bucket = scenePlusExt.getYunFileBucket();
  214. String fileName = file.getOriginalFilename();
  215. String extName = fileName.substring(fileName.lastIndexOf("."));
  216. File newFile = File.createTempFile(UUID.randomUUID().toString() ,extName);
  217. file.transferTo(newFile);
  218. String logoPath = newFile.getPath();
  219. String outPathZh = ConstantFilePath.BASE_PATH + File.separator + "sceneQRcode/"+num+".png";
  220. String outPathEn = ConstantFilePath.BASE_PATH + File.separator + "sceneQRcode/"+num+"_en.png";
  221. String webSize = mainUrl + "/" + sceneProNewUrl + num;
  222. QrCodeUtil.generate(webSize, QrConfig.create().setImg(logoPath).setWidth(1024).setHeight(1024), FileUtil.file(outPathZh));
  223. QrCodeUtil.generate(webSize + "&lang=en", QrConfig.create().setImg(logoPath).setWidth(1024).setHeight(1024), FileUtil.file(outPathEn));
  224. //上传logo图片
  225. String ossLogoPath = String.format(UploadFilePath.DOWNLOADS_QRCODE, num) + "shareLogo" + extName;
  226. ossUtil.uploadFile(bucket, ossLogoPath, logoPath, false);
  227. //上传二维码
  228. ossUtil.uploadFile(bucket, String.format(UploadFilePath.DOWNLOADS_QRCODE, num) + num + ".png", outPathZh, false);
  229. ossUtil.uploadFile(bucket,String.format(UploadFilePath.DOWNLOADS_QRCODE, num) + num + "_en.png", outPathEn, false);
  230. sceneEditInfoExt.setShareLogoImg(ossLogoPath);
  231. sceneEditInfoExtService.updateById(sceneEditInfoExt);
  232. FileUtil.del(newFile);
  233. FileUtil.del(new File(outPathEn));
  234. FileUtil.del(new File(outPathZh));
  235. return ResultData.ok();
  236. }
  237. /**
  238. * <p>
  239. * 初始化场景数据
  240. * </p>
  241. * @author dengsixing
  242. * @date 2022/8/22
  243. * @param num 场景码
  244. * @param title 场景标题
  245. * @param des 场景描述
  246. * @param sceneSource 场景来源:相机拍摄10以内表示,1表示八目,2双目,3转台,4 激光 其他来源10以上,11:一键换装,12:123看房,13文通虚拟场景
  247. * @param dataSource 场景计算数据目录
  248. * @param sceneScheme 方案:1-双目,2-转台,3-六目,4-八目,10-获取4k图,11-获取2k,12-获取1k
  249. * @param sceneResolution 分辨率(2k,4k)
  250. * @param sceneFrom 场景来源,lite:双目lite相机,pro:八目相机,minion:双面转台相机,laser:激光相机,virtual:虚拟场景,sketch:图片建模场景
  251. * @return com.fdkankan.web.response.ResultData
  252. **/
  253. @Override
  254. public ResultData initScene(String bucket, String num, String title, String des, Integer sceneSource,
  255. String dataSource, Integer sceneScheme, String sceneResolution, String sceneFrom, String mdoelKind, Date algorithmTime,
  256. String orientation) {
  257. ScenePlus scenePlus = this.getScenePlusByNum(num);
  258. JSONObject fdageData = getFdageData(dataSource + File.separator + "capture" +File.separator+"data.fdage");
  259. Integer videoVersion = fdageData.getInteger("videoVersion");
  260. int cameraType = 10;//默认看看相机
  261. if(sceneSource == 4 || sceneSource == 5){
  262. cameraType = 14;
  263. }
  264. //生成场景主表
  265. if(Objects.isNull(scenePlus)){
  266. scenePlus = new ScenePlus();
  267. }
  268. scenePlus.setNum(num);
  269. scenePlus.setSceneStatus(SceneStatus.SUCCESS.code());
  270. scenePlus.setSceneSource(sceneSource);
  271. scenePlus.setPayStatus(PayStatus.PAY.code());
  272. scenePlus.setSceneType(SceneType.OTHER.code());
  273. scenePlus.setTitle(title);
  274. scenePlus.setDescription("<p>" + fdageData.getString("info") + "</p>");
  275. this.saveOrUpdate(scenePlus);
  276. //生成场景拓展表
  277. ScenePlusExt scenePlusExt = scenePlusExtService.getScenePlusExtByPlusId(scenePlus.getId());
  278. if(Objects.isNull(scenePlusExt)){
  279. scenePlusExt = new ScenePlusExt();
  280. }
  281. scenePlusExt.setPlusId(scenePlus.getId());
  282. scenePlusExt.setDataSource(dataSource);
  283. scenePlusExt.setSceneScheme(sceneScheme);
  284. scenePlusExt.setSceneResolution(sceneResolution);
  285. scenePlusExt.setSceneFrom(sceneFrom);
  286. scenePlusExt.setModelKind(mdoelKind);
  287. scenePlusExt.setSceneKind(SceneKind.FACE.code());
  288. scenePlusExt.setYunFileBucket(bucket);
  289. scenePlusExt.setAlgorithmTime(Calendar.getInstance().getTime());
  290. scenePlusExt.setVideos(this.getVideosJson(dataSource, videoVersion, num, cameraType).toJSONString());
  291. scenePlusExt.setAlgorithmTime(algorithmTime);
  292. scenePlusExt.setOrientation(orientation);
  293. scenePlusExtService.saveOrUpdate(scenePlusExt);
  294. if(StrUtil.isEmpty(orientation)){
  295. scenePlusExtService.update(new LambdaUpdateWrapper<ScenePlusExt>().eq(ScenePlusExt::getId, scenePlusExt.getId()).setSql("orientation = null"));
  296. }
  297. //生成编辑主表
  298. String pwd = fdageData.getString("pwd");
  299. SceneEditInfo sceneEditInfo = sceneEditInfoService.getByScenePlusId(scenePlus.getId());
  300. if(Objects.isNull(sceneEditInfo)){
  301. sceneEditInfo = new SceneEditInfo();
  302. }else{
  303. sceneEditInfo.setVersion(sceneEditInfo.getVersion() + 1);
  304. }
  305. sceneEditInfo.setScenePlusId(scenePlus.getId());
  306. sceneEditInfo.setTitle(title);
  307. sceneEditInfo.setDescription("<p>" + fdageData.getString("info") + "</p>");
  308. if(StrUtil.isEmpty(sceneEditInfo.getScenePassword())){
  309. sceneEditInfo.setScenePassword(fdageData.getString("pwd"));
  310. }
  311. sceneEditInfoService.saveOrUpdate(sceneEditInfo);
  312. sceneEditInfo = sceneEditInfoService.getByScenePlusId(scenePlus.getId());
  313. //生成编辑拓展表
  314. SceneEditInfoExt sceneEditInfoExt = sceneEditInfoExtService.getByEditInfoId(sceneEditInfo.getId());
  315. if(Objects.isNull(sceneEditInfoExt)){
  316. sceneEditInfoExt = new SceneEditInfoExt();
  317. }
  318. sceneEditInfoExt.setScenePlusId(scenePlus.getId());
  319. sceneEditInfoExt.setEditInfoId(sceneEditInfo.getId());
  320. sceneEditInfoExt.setLinks(this.checkIsExistLinks(num) ? CommonStatus.YES.code().intValue() : CommonStatus.NO.code().intValue());
  321. sceneEditInfoExtService.saveOrUpdate(sceneEditInfoExt);
  322. sceneEditInfoExt = sceneEditInfoExtService.getByEditInfoId(sceneEditInfo.getId());
  323. //生成编辑显示控制表
  324. SceneEditControls sceneEditControls = sceneEditControlsService.getBySceneEditId(sceneEditInfo.getId());
  325. if(Objects.isNull(sceneEditControls)){
  326. sceneEditControls = new SceneEditControls();
  327. }
  328. sceneEditControls.setEditInfoId(sceneEditInfo.getId());
  329. sceneEditControls.setShowMap(0);
  330. if(StrUtil.isNotEmpty(pwd)){
  331. sceneEditControls.setShowLock(CommonStatus.YES.code().intValue());
  332. }
  333. sceneEditControlsService.saveOrUpdate(sceneEditControls);
  334. sceneEditControls = sceneEditControlsService.getBySceneEditId(sceneEditInfo.getId());
  335. //清除用户编辑业务数据
  336. Set<String> bizs = new HashSet<>();
  337. bizs.add(UserEditDataType.BOX_MODEL.message());
  338. bizs.add(UserEditDataType.FLOORPLAN.message());
  339. commonService.initUserEditData(num, bizs, null);
  340. sceneEditInfo = sceneEditInfoService.getByScenePlusId(scenePlus.getId());
  341. sceneEditInfoExt = sceneEditInfoExtService.getByEditInfoId(sceneEditInfo.getId());
  342. //生成sceneJson
  343. String sceneJsonPath = String.format(UploadFilePath.DATA_VIEW_PATH+"scene.json", num);
  344. String oldSceneJson = ossUtil.getFileContent(bucket, sceneJsonPath);
  345. SceneJsonBean sceneJson = new SceneJsonBean();
  346. BeanUtil.copyProperties(sceneEditInfoExt, sceneJson);
  347. BeanUtil.copyProperties(sceneEditInfo, sceneJson);
  348. SceneEditControlsVO sceneEditControlsVO = BeanUtil.copyProperties(sceneEditControls, SceneEditControlsVO.class);
  349. sceneJson.setControls(sceneEditControlsVO);
  350. sceneJson.setNum(num);
  351. sceneJson.setCreateTime(scenePlus.getCreateTime());
  352. sceneJson.setSceneResolution(scenePlusExt.getSceneResolution());
  353. sceneJson.setSceneFrom(scenePlusExt.getSceneFrom());
  354. sceneJson.setSceneKind(scenePlusExt.getSceneKind());
  355. if(StrUtil.isNotEmpty(scenePlusExt.getVideos())){
  356. sceneJson.setVideos(scenePlusExt.getVideos());
  357. }
  358. sceneJson.setModelKind(scenePlusExt.getModelKind());
  359. if(StrUtil.isNotEmpty(oldSceneJson)){
  360. List<JSONObject> mosaicList = JSON.parseObject(oldSceneJson, SceneJsonBean.class).getMosaicList();
  361. sceneJson.setMosaicList(mosaicList);
  362. }
  363. //本地写sceneJson文件
  364. ossUtil.uploadFileBytes(bucket, sceneJsonPath, JSON.toJSONString(sceneJson).getBytes(StandardCharsets.UTF_8));
  365. //生成floorplan.json
  366. String floorPlanCardFilePath = dataSource + File.separator + "results/floorplan_cad.json";
  367. if (new File(floorPlanCardFilePath).exists()) {
  368. JSONObject json = FloorPlanUserUtil.createFloorPlanUserJson(floorPlanCardFilePath);
  369. if(!Objects.isNull(json)){
  370. String hourseTypeJsonPath = String.format(UploadFilePath.DATA_VIEW_PATH, num) + "floorplan.json";
  371. ossUtil.uploadFileBytes(bucket, hourseTypeJsonPath, json.toJSONString().getBytes(StandardCharsets.UTF_8));
  372. }
  373. }
  374. redisUtil.del(String.format(RedisKey.SCENE_JSON, num));
  375. return ResultData.ok();
  376. }
  377. private boolean checkIsExistLinks(String num){
  378. //查询缓存是否有场景关联数据
  379. String key = String.format(RedisKey.SCENE_LINKPAN_DATA, num);
  380. Map<String, String> allTagsMap = redisUtil.hmget(key);
  381. boolean hashTags = false;
  382. for (Map.Entry<String, String> tagMap : allTagsMap.entrySet()) {
  383. if(StrUtil.isEmpty(tagMap.getValue())){
  384. continue;
  385. }
  386. hashTags = true;
  387. break;
  388. }
  389. return hashTags;
  390. }
  391. private JSONObject getFdageData(String dataFdagePath) {
  392. log.info("dataFdagePath 文件路径 :{}", dataFdagePath);
  393. String data = FileUtils.readFile(dataFdagePath);
  394. //获取data.fdage的内容
  395. JSONObject dataJson = new JSONObject();
  396. if(data!=null){
  397. dataJson = JSONObject.parseObject(data);
  398. }
  399. return dataJson;
  400. }
  401. private JSONObject getVideosJson(String path, Integer videoVersion, String projectNum, int cameraType){
  402. //读取videos_hdr_param.json, 保存点位视频的value
  403. Map<String, Object> videoMap = new HashMap<>();
  404. String videosHdr = FileUtils.readFile(path + File.separator + "results/videos/videos_hdr_param.json");
  405. JSONArray videoArray = null;
  406. if(StringUtils.isNotEmpty(videosHdr)){
  407. videoArray = JSONObject.parseObject(videosHdr).getJSONArray("hdr_param");
  408. }
  409. if(videoArray != null){
  410. for(int i = 0, len = videoArray.size(); i < len; i++) {
  411. videoMap.put(videoArray.getJSONObject(i).getString("name"), videoArray.getJSONObject(i).getString("value"));
  412. if(videoArray.getJSONObject(i).containsKey("fov")){
  413. videoMap.put(videoArray.getJSONObject(i).getString("name") + "_fov", videoArray.getJSONObject(i).getString("fov"));
  414. }
  415. }
  416. }
  417. //获取upload中的video视频名称
  418. String uploadData = FileUtils.readFile(path + File.separator + "results" +File.separator+"upload.json");
  419. JSONObject uploadJson = null;
  420. JSONArray array = null;
  421. if(uploadData!=null) {
  422. uploadJson = JSONObject.parseObject(uploadData);
  423. array = uploadJson.getJSONArray("upload");
  424. }
  425. JSONObject fileJson = null;
  426. String fileName = "";
  427. //计算ts文件的大小,并拼接成json格式
  428. JSONArray jsonArray = new JSONArray();
  429. JSONObject videoJson = null;
  430. JSONObject videosJson = new JSONObject();
  431. long videoSize = 0L;
  432. for(int i = 0, len = array.size(); i < len; i++) {
  433. fileJson = array.getJSONObject(i);
  434. fileName = fileJson.getString("file");
  435. if(fileJson.getIntValue("clazz") == 11 && fileName.contains(".mp4") && !fileName.contains("-ios.mp4")){
  436. videoJson = new JSONObject();
  437. videoJson.put("id", fileName.substring(
  438. 0, fileName.lastIndexOf(".")).replace("videos/", ""));
  439. //如果ts文件存在,就计算ts大小
  440. if(new File(path + File.separator + "results" +File.separator+ fileName.replace(".mp4", ".ts")).exists()){
  441. videoSize = new File(path + File.separator + "results" +File.separator+ fileName.replace(".mp4", ".ts")).length();
  442. videoJson.put("tsSize", videoSize);
  443. }
  444. if(videoMap.containsKey(videoJson.get("id"))){
  445. videoJson.put("value", videoMap.get(videoJson.get("id")));
  446. }
  447. if(videoMap.containsKey(videoJson.get("id") + "_fov")){
  448. videoJson.put("blend_fov", videoMap.get(videoJson.get("id") + "_fov"));
  449. }else {
  450. videoJson.put("blend_fov", 7);
  451. }
  452. jsonArray.add(videoJson);
  453. }
  454. }
  455. videosJson.put("data", jsonArray);
  456. videosJson.put("version", 3);
  457. videosJson.put("upPath", String.format(UploadFilePath.DATA_VIEW_PATH, projectNum) + "Up.txt");
  458. return videosJson;
  459. }
  460. @Override
  461. public ResultData editScene(LaserSceneBean param) {
  462. ScenePlus scenePlus = this.getScenePlusByNum(param.getNum());
  463. if(Objects.isNull(scenePlus))
  464. throw new BusinessException(ErrorCode.FAILURE_CODE_5005);
  465. SceneEditInfo sceneEditInfo = sceneEditInfoService.getByScenePlusId(scenePlus.getId());
  466. sceneEditInfo.setTitle(param.getTitle());
  467. if(StrUtil.isEmpty(sceneEditInfo.getEntry())){
  468. sceneEditInfo.setEntry("{}");
  469. }
  470. sceneEditInfoService.updateById(sceneEditInfo);
  471. if (StrUtil.isNotBlank(param.getThumb())){
  472. ScenePlusExt scenePlusExt = scenePlusExtService.getScenePlusExtByPlusId(scenePlus.getId());
  473. String bucket = scenePlusExt.getYunFileBucket();
  474. scenePlusExt.setThumb(param.getThumb());
  475. scenePlusExtService.updateById(scenePlusExt);
  476. File sourceFile=FileUtil.file(FdkkLaserConfig.getProfile(bucket)+param.getThumb());
  477. log.info("sourceFile,-{}",sourceFile.getAbsoluteFile());
  478. File targetFile=FileUtil.file(FdkkLaserConfig.getProfile(bucket)+String.format(UploadFilePath.USER_EDIT_PATH, param.getNum())+ File.separator+"thumb-1k.jpg");
  479. log.info("targetFile,-{}",targetFile.getAbsoluteFile());
  480. FileUtils.copyFile(sourceFile,targetFile);
  481. }
  482. return ResultData.ok();
  483. }
  484. @Override
  485. public List<SceneBean> listCleanOrigScene(int cleanOrigMonth) {
  486. Date time = Calendar.getInstance().getTime();
  487. time = DateUtil.beginOfDay(DateUtil.offset(time, DateField.MONTH, -cleanOrigMonth));
  488. return this.baseMapper.selectCleanOrigScene(time);
  489. }
  490. @Override
  491. public List<ScenePlus> getListByNums(List<String> numList) {
  492. LambdaQueryWrapper<ScenePlus> wrapper = new LambdaQueryWrapper<>();
  493. wrapper.in(ScenePlus::getNum,numList);
  494. return this.list(wrapper);
  495. }
  496. @Override
  497. public void deleteByList(List<ScenePlus> plusList, List<String> reserve, boolean reserveSource) throws FileSystemException {
  498. if(CollUtil.isEmpty(plusList)){
  499. return;
  500. }
  501. List<Long> plusIds = plusList.parallelStream().map(ScenePlus::getId).collect(Collectors.toList());
  502. HashMap<Long, ScenePlusExt> plusMap = scenePlusExtService.getByPlusIds(plusIds);
  503. scenePlusService.removeByIds(plusIds);
  504. scenePlusExtService.removeByPlusIds(plusIds);
  505. ThreadUtil.execAsync(() -> {
  506. //删除编辑和展示文件
  507. for (ScenePlus plus : plusList) {
  508. try {
  509. ScenePlusExt scenePlusExt = plusMap.get(plus.getId());
  510. String bucket = scenePlusExt.getYunFileBucket();
  511. ossUtil.deleteObject(bucket, String.format(UploadFilePath.EDIT_PATH, plus.getNum()));
  512. if(CollUtil.isEmpty(reserve)){
  513. ossUtil.deleteObject(bucket, String.format(UploadFilePath.VIEW_PATH, plus.getNum()));
  514. }else{
  515. ossUtil.deleteObject(bucket, String.format(UploadFilePath.USER_VIEW_PATH, plus.getNum()));
  516. List<String> viewFiles = ossUtil.listFiles(bucket, String.format(UploadFilePath.VIEW_PATH, plus.getNum()));
  517. viewFiles.stream().forEach(key -> {
  518. if(!reserve.stream().anyMatch(path -> key.contains(path))){
  519. try {
  520. ossUtil.deleteObject(bucket, key);
  521. } catch (FileSystemException e) {
  522. log.info("删除失败,key:{}", key);
  523. }
  524. }
  525. });
  526. }
  527. } catch (FileSystemException e) {
  528. log.error("删除场景展示数据失败, num:{}", plus.getNum(), e);
  529. }
  530. }
  531. //删除原始资源文件
  532. if(!reserveSource){
  533. for (Long key : plusMap.keySet()) {
  534. ScenePlusExt ext = plusMap.get(key);
  535. if(StrUtil.isNotEmpty(ext.getDataSource()) && ext.getDataSource().length() > 5){
  536. FileUtil.del(ext.getDataSource());
  537. }
  538. }
  539. }
  540. });
  541. }
  542. }