ScenePlusServiceImpl.java 24 KB

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