ScenePlusServiceImpl.java 16 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391
  1. package com.fdkankan.scene.service.impl;
  2. import cn.hutool.core.bean.BeanUtil;
  3. import cn.hutool.core.io.FileUtil;
  4. import cn.hutool.core.util.StrUtil;
  5. import com.alibaba.fastjson.JSON;
  6. import cn.hutool.extra.qrcode.QrCodeUtil;
  7. import cn.hutool.extra.qrcode.QrConfig;
  8. import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
  9. import com.baomidou.mybatisplus.core.conditions.update.LambdaUpdateWrapper;
  10. import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
  11. import com.fdkankan.common.constant.ErrorCode;
  12. import com.fdkankan.common.constant.PayStatus;
  13. import com.fdkankan.common.constant.SceneKind;
  14. import com.fdkankan.common.constant.SceneSource;
  15. import com.fdkankan.common.constant.SceneStatus;
  16. import com.fdkankan.common.constant.SceneType;
  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.scene.bean.LaserSceneBean;
  22. import com.fdkankan.scene.bean.SceneJsonBean;
  23. import com.fdkankan.scene.config.FdkkLaserConfig;
  24. import com.fdkankan.scene.entity.SceneEditControls;
  25. import com.fdkankan.scene.entity.SceneEditInfoExt;
  26. import com.fdkankan.scene.oss.OssUtil;
  27. import com.fdkankan.scene.service.ISceneEditControlsService;
  28. import com.fdkankan.scene.service.ISceneEditInfoExtService;
  29. import com.fdkankan.scene.vo.SceneEditControlsVO;
  30. import com.fdkankan.fyun.face.FYunFileServiceInterface;
  31. import com.fdkankan.model.constants.ConstantFilePath;
  32. import com.fdkankan.model.constants.UploadFilePath;
  33. import com.fdkankan.scene.entity.SceneEditInfoExt;
  34. import com.fdkankan.scene.entity.ScenePro;
  35. import com.fdkankan.scene.service.ISceneEditInfoExtService;
  36. import com.fdkankan.scene.service.ISceneProService;
  37. import com.fdkankan.web.response.ResultData;
  38. import com.fdkankan.redis.constant.RedisKey;
  39. import com.fdkankan.redis.constant.RedisLockKey;
  40. import com.fdkankan.redis.util.RedisLockUtil;
  41. import com.fdkankan.redis.util.RedisUtil;
  42. import com.fdkankan.scene.entity.SceneDataDownload;
  43. import com.fdkankan.scene.entity.SceneEditInfo;
  44. import com.fdkankan.scene.entity.ScenePlus;
  45. import com.fdkankan.scene.entity.ScenePlusExt;
  46. import com.fdkankan.scene.mapper.IScenePlusMapper;
  47. import com.fdkankan.scene.service.ISceneDataDownloadService;
  48. import com.fdkankan.scene.service.ISceneEditInfoService;
  49. import com.fdkankan.scene.service.IScenePlusExtService;
  50. import com.fdkankan.scene.service.IScenePlusService;
  51. import com.fdkankan.scene.vo.BaseSceneParamVO;
  52. import com.fdkankan.scene.vo.SceneCheckKeyParamVO;
  53. import com.fdkankan.scene.vo.SceneDataDownloadVO;
  54. import java.io.File;
  55. import java.nio.charset.StandardCharsets;
  56. import java.io.File;
  57. import java.util.List;
  58. import java.util.Objects;
  59. import java.util.UUID;
  60. import lombok.extern.slf4j.Slf4j;
  61. import org.springframework.beans.factory.annotation.Autowired;
  62. import org.springframework.beans.factory.annotation.Value;
  63. import org.springframework.stereotype.Service;
  64. import org.springframework.web.multipart.MultipartFile;
  65. /**
  66. * <p>
  67. * 场景主表 服务实现类
  68. * </p>
  69. *
  70. * @author
  71. * @since 2022-03-16
  72. */
  73. @Slf4j
  74. @Service
  75. public class ScenePlusServiceImpl extends ServiceImpl<IScenePlusMapper, ScenePlus> implements IScenePlusService {
  76. @Value("${main.url}")
  77. private String mainUrl;
  78. @Value("${scene.pro.new.url}")
  79. private String sceneProNewUrl;
  80. @Autowired
  81. private IScenePlusExtService scenePlusExtService;
  82. @Autowired
  83. private IScenePlusService scenePlusService;
  84. @Autowired
  85. private ISceneEditInfoService sceneEditInfoService;
  86. @Autowired
  87. private ISceneDataDownloadService sceneDataDownloadService;
  88. @Autowired
  89. private RedisUtil redisUtil;
  90. @Autowired
  91. private RedisLockUtil redisLockUtil;
  92. @Autowired
  93. private ISceneEditInfoExtService sceneEditInfoExtService;
  94. @Autowired
  95. private ISceneEditControlsService sceneEditControlsService;
  96. @Autowired
  97. private OssUtil ossUtil;
  98. @Autowired
  99. FdkkLaserConfig fdkkLaserConfig;
  100. @Autowired
  101. private ISceneProService sceneProService;
  102. @Autowired
  103. private FYunFileServiceInterface fYunFileService;
  104. @Autowired
  105. private ISceneEditInfoExtService sceneEditInfoExtService;
  106. @Override
  107. public ScenePlus getScenePlusByNum(String num) {
  108. return this.getOne(new LambdaQueryWrapper<ScenePlus>().eq(ScenePlus::getNum, num));
  109. }
  110. @Override
  111. public ResultData checkKey(SceneCheckKeyParamVO param) throws Exception {
  112. ScenePlus scenePlus = scenePlusService.getOne(new LambdaQueryWrapper<ScenePlus>()
  113. .eq(ScenePlus::getNum, param.getNum())
  114. .eq(ScenePlus::getPayStatus, PayStatus.PAY.code()));
  115. if (Objects.isNull(scenePlus)) {
  116. throw new BusinessException(ErrorCode.FAILURE_CODE_5005);
  117. }
  118. SceneEditInfo sceneEditInfo = sceneEditInfoService.getByScenePlusId(scenePlus.getId());
  119. if (Objects.isNull(sceneEditInfo)) {
  120. throw new BusinessException(ErrorCode.FAILURE_CODE_5005);
  121. }
  122. if(!param.getPassword().equals(sceneEditInfo.getScenePassword())){
  123. throw new BusinessException(ErrorCode.FAILURE_CODE_5021);
  124. }
  125. return ResultData.ok();
  126. }
  127. @Override
  128. public ResultData updateScenePlusUserIdByCameraId(List<Long> cameraIdList, Long userId) {
  129. LambdaUpdateWrapper<ScenePlus> updateWrapper = new LambdaUpdateWrapper<ScenePlus>()
  130. .set(ScenePlus::getUserId, userId).in(ScenePlus::getCameraId, cameraIdList);
  131. this.update(updateWrapper);
  132. return ResultData.ok();
  133. }
  134. @Override
  135. public ResultData moveScene(List<String> numList, Long cameraId, Long userId) {
  136. LambdaUpdateWrapper<ScenePlus> updateWrapper =
  137. new LambdaUpdateWrapper<ScenePlus>()
  138. .set(ScenePlus::getUserId, userId)
  139. .set(ScenePlus::getCameraId, cameraId)
  140. .in(ScenePlus::getNum, numList);
  141. this.update(updateWrapper);
  142. return ResultData.ok();
  143. }
  144. @Override
  145. public ResultData downLoadZSData(String num) throws Exception {
  146. if(StrUtil.isEmpty(num)){
  147. throw new BusinessException(ErrorCode.FAILURE_CODE_3001);
  148. }
  149. String version = "v4";
  150. ScenePlus scenePlus = this.getScenePlusByNum(num);
  151. ScenePro scenePro = null;
  152. if(Objects.isNull(scenePlus)){
  153. scenePro = sceneProService.getByNum(num);
  154. version = "v3";
  155. if(Objects.isNull(scenePro)){
  156. throw new BusinessException(ErrorCode.FAILURE_CODE_5005);
  157. }
  158. }
  159. SceneDataDownload sceneDataDownload = sceneDataDownloadService.findBySceneNum(num);
  160. if(sceneDataDownload == null){
  161. throw new BusinessException(ErrorCode.FAILURE_CODE_5025);
  162. }
  163. SceneDataDownloadVO sceneDataDownloadVO = BeanUtil.copyProperties(sceneDataDownload, SceneDataDownloadVO.class);
  164. sceneDataDownloadVO.setVersion(version);
  165. return ResultData.ok(sceneDataDownloadVO);
  166. }
  167. @Override
  168. public ScenePlus checkSceneAvail(String num) {
  169. ScenePlus scenePlus = this.getScenePlusByNum(num);
  170. if(Objects.isNull(scenePlus)){
  171. throw new BusinessException(ErrorCode.FAILURE_CODE_5005);
  172. }
  173. if(!SceneStatus.SUCCESS.code().equals(scenePlus.getSceneStatus())
  174. && !SceneStatus.NO_DISPLAY.code().equals(scenePlus.getSceneStatus())){
  175. throw new BusinessException(ErrorCode.FAILURE_CODE_5033);
  176. }
  177. if(!PayStatus.PAY.code().equals(scenePlus.getPayStatus())){
  178. throw new BusinessException(ErrorCode.FAILURE_CODE_5034);
  179. }
  180. return scenePlus;
  181. }
  182. @Override
  183. public ResultData updateViewCount(String sceneNum) {
  184. String key = RedisKey.SCENE_VISIT_CNT;
  185. if(!redisUtil.hHasKey(key, sceneNum)){
  186. String lockKey = String.format(RedisLockKey.LOCK_SCENE_VISIT_CNT, sceneNum);
  187. String lockVal = cn.hutool.core.lang.UUID.randomUUID().toString();
  188. boolean lock = redisLockUtil.lock(lockKey, lockVal, RedisKey.EXPIRE_TIME_10_MINUTE);
  189. if(!lock){
  190. return ResultData.ok();
  191. }
  192. try {
  193. String cnt = redisUtil.hget(key, sceneNum);
  194. if(StrUtil.isEmpty(cnt)){
  195. //标记是否找到了场景,如果找到就不往下找
  196. Integer viewCount = null;
  197. ScenePlus scenePlus = scenePlusService.getScenePlusByNum(sceneNum);
  198. ScenePlusExt scenePlusExt = scenePlusExtService.getScenePlusExtByPlusId(scenePlus.getId());
  199. viewCount = scenePlusExt.getViewCount();
  200. redisUtil.hset(key, sceneNum, Objects.isNull(viewCount) ? "0" : String.valueOf(viewCount));
  201. }
  202. }finally {
  203. redisLockUtil.unlockLua(lockKey, lockVal);
  204. }
  205. }
  206. redisUtil.hincr(key, sceneNum, 1);
  207. return ResultData.ok();
  208. }
  209. @Override
  210. public ResultData uploadShareLogo(String num, MultipartFile file) throws Exception {
  211. ScenePlus scenePlus = this.getScenePlusByNum(num);
  212. if (Objects.isNull(scenePlus)) {
  213. return ResultData.error(ErrorCode.FAILURE_CODE_5005);
  214. }
  215. ScenePlusExt scenePlusExt = scenePlusExtService.getScenePlusExtByPlusId(scenePlus.getId());
  216. SceneEditInfoExt sceneEditInfoExt = sceneEditInfoExtService.getByScenePlusId(scenePlus.getId());
  217. String fileName = file.getOriginalFilename();
  218. String extName = fileName.substring(fileName.lastIndexOf("."));
  219. File newFile = File.createTempFile(UUID.randomUUID().toString() ,extName);
  220. file.transferTo(newFile);
  221. String logoPath = newFile.getPath();
  222. String outPathZh = ConstantFilePath.BASE_PATH + File.separator + "sceneQRcode/"+num+".png";
  223. String outPathEn = ConstantFilePath.BASE_PATH + File.separator + "sceneQRcode/"+num+"_en.png";
  224. String webSize = mainUrl + "/" + sceneProNewUrl + num;
  225. QrCodeUtil.generate(webSize, QrConfig.create().setImg(logoPath).setWidth(512).setHeight(512), FileUtil.file(outPathZh));
  226. QrCodeUtil.generate(webSize + "&lang=en", QrConfig.create().setImg(logoPath).setWidth(512).setHeight(512), FileUtil.file(outPathEn));
  227. //上传logo图片
  228. String ossLogoPath = String.format(UploadFilePath.DOWNLOADS_QRCODE, num) + "shareLogo" + extName;
  229. fYunFileService.uploadFile(scenePlusExt.getYunFileBucket(), logoPath, ossLogoPath);
  230. //上传二维码
  231. fYunFileService.uploadFile(scenePlusExt.getYunFileBucket(), outPathZh, String.format(UploadFilePath.DOWNLOADS_QRCODE, num) + num + ".png");
  232. fYunFileService.uploadFile(scenePlusExt.getYunFileBucket(), outPathEn, String.format(UploadFilePath.DOWNLOADS_QRCODE, num) + num + "_en.png");
  233. sceneEditInfoExt.setShareLogoImg(ossLogoPath);
  234. sceneEditInfoExtService.updateById(sceneEditInfoExt);
  235. FileUtil.del(newFile);
  236. FileUtil.del(new File(outPathEn));
  237. FileUtil.del(new File(outPathZh));
  238. return ResultData.ok();
  239. }
  240. /**
  241. * <p>
  242. * 初始化场景数据
  243. * </p>
  244. * @author dengsixing
  245. * @date 2022/8/22
  246. * @param num 场景码
  247. * @param title 场景标题
  248. * @param des 场景描述
  249. * @param sceneSource 场景来源:相机拍摄10以内表示,1表示八目,2双目,3转台,4 激光 其他来源10以上,11:一键换装,12:123看房,13文通虚拟场景
  250. * @param dataSource 场景计算数据目录
  251. * @param sceneScheme 方案:1-双目,2-转台,3-六目,4-八目,10-获取4k图,11-获取2k,12-获取1k
  252. * @param sceneResolution 分辨率(2k,4k)
  253. * @param sceneFrom 场景来源,lite:双目lite相机,pro:八目相机,minion:双面转台相机,laser:激光相机,virtual:虚拟场景,sketch:图片建模场景
  254. * @return com.fdkankan.web.response.ResultData
  255. **/
  256. @Override
  257. public ResultData initScene(String num, String title, String des, Integer sceneSource,
  258. String dataSource, Integer sceneScheme, String sceneResolution, String sceneFrom) {
  259. ScenePlus scenePlusByNum = this.getScenePlusByNum(num);
  260. if(Objects.nonNull(scenePlusByNum))
  261. return ResultData.ok();
  262. //生成场景主表
  263. ScenePlus scenePlus = new ScenePlus();
  264. scenePlus.setNum(num);
  265. scenePlus.setSceneStatus(SceneStatus.SUCCESS.code());
  266. scenePlus.setSceneSource(sceneSource);
  267. scenePlus.setPayStatus(PayStatus.PAY.code());
  268. scenePlus.setSceneType(SceneType.OTHER.code());
  269. this.save(scenePlus);
  270. //生成场景拓展表
  271. ScenePlusExt scenePlusExt = new ScenePlusExt();
  272. scenePlusExt.setPlusId(scenePlus.getId());
  273. scenePlusExt.setDataSource(dataSource);
  274. scenePlusExt.setSceneScheme(sceneScheme);
  275. scenePlusExt.setSceneResolution(sceneResolution);
  276. scenePlusExt.setSceneFrom(sceneFrom);
  277. scenePlusExt.setSceneKind(SceneKind.FACE.code());
  278. scenePlusExtService.save(scenePlusExt);
  279. //生成编辑主表
  280. SceneEditInfo sceneEditInfo = new SceneEditInfo();
  281. sceneEditInfo.setScenePlusId(scenePlus.getId());
  282. sceneEditInfo.setTitle(title);
  283. sceneEditInfo.setDescription(des);
  284. sceneEditInfoService.save(sceneEditInfo);
  285. sceneEditInfo = sceneEditInfoService.getByScenePlusId(scenePlus.getId());
  286. //生成编辑拓展表
  287. SceneEditInfoExt sceneEditInfoExt = new SceneEditInfoExt();
  288. sceneEditInfoExt.setScenePlusId(scenePlus.getId());
  289. sceneEditInfoExt.setEditInfoId(sceneEditInfo.getId());
  290. sceneEditInfoExtService.save(sceneEditInfoExt);
  291. sceneEditInfoExt = sceneEditInfoExtService.getByEditInfoId(sceneEditInfo.getId());
  292. //生成编辑显示控制表
  293. SceneEditControls sceneEditControls = new SceneEditControls();
  294. sceneEditControls.setEditInfoId(sceneEditInfo.getId());
  295. sceneEditControlsService.save(sceneEditControls);
  296. sceneEditControls = sceneEditControlsService.getBySceneEditId(sceneEditInfo.getId());
  297. //生成sceneJson
  298. SceneJsonBean sceneJson = new SceneJsonBean();
  299. BeanUtil.copyProperties(sceneEditInfoExt, sceneJson);
  300. BeanUtil.copyProperties(sceneEditInfo, sceneJson);
  301. SceneEditControlsVO sceneEditControlsVO = BeanUtil.copyProperties(sceneEditControls, SceneEditControlsVO.class);
  302. sceneJson.setControls(sceneEditControlsVO);
  303. sceneJson.setNum(num);
  304. sceneJson.setCreateTime(scenePlus.getCreateTime());
  305. sceneJson.setSceneResolution(scenePlusExt.getSceneResolution());
  306. sceneJson.setSceneFrom(scenePlusExt.getSceneFrom());
  307. sceneJson.setSceneKind(scenePlusExt.getSceneKind());
  308. if(StrUtil.isNotEmpty(scenePlusExt.getVideos())){
  309. sceneJson.setVideos(scenePlusExt.getVideos());
  310. }
  311. //本地写sceneJson文件
  312. String sceneJsonPath = String.format(UploadFilePath.DATA_VIEW_PATH+"scene.json", num);
  313. ossUtil.uploadFileBytes(sceneJsonPath, JSON.toJSONString(sceneJson).getBytes(StandardCharsets.UTF_8));
  314. redisUtil.del(String.format(RedisKey.SCENE_JSON, num));
  315. return ResultData.ok();
  316. }
  317. @Override
  318. public ResultData editScene(LaserSceneBean param) {
  319. ScenePlus scenePlus = this.getScenePlusByNum(param.getNum());
  320. if(Objects.isNull(scenePlus))
  321. throw new BusinessException(ErrorCode.FAILURE_CODE_5005);
  322. SceneEditInfo sceneEditInfo = sceneEditInfoService.getByScenePlusId(scenePlus.getId());
  323. sceneEditInfo.setTitle(param.getTitle());
  324. if(StrUtil.isEmpty(sceneEditInfo.getEntry())){
  325. sceneEditInfo.setEntry("{}");
  326. }
  327. sceneEditInfoService.updateById(sceneEditInfo);
  328. if (StrUtil.isNotBlank(param.getThumb())){
  329. ScenePlusExt scenePlusExt = scenePlusExtService.getScenePlusExtByPlusId(scenePlus.getId());
  330. scenePlusExt.setThumb(param.getThumb());
  331. scenePlusExtService.updateById(scenePlusExt);
  332. File sourceFile=FileUtil.file(FdkkLaserConfig.getProfile()+param.getThumb());
  333. log.info("sourceFile,-{}",sourceFile.getAbsoluteFile());
  334. File targetFile=FileUtil.file(FdkkLaserConfig.getProfile()+String.format(UploadFilePath.USER_EDIT_PATH, param.getNum())+ File.separator+"thumb-1k.jpg");
  335. log.info("targetFile,-{}",targetFile.getAbsoluteFile());
  336. FileUtils.copyFile(sourceFile,targetFile);
  337. }
  338. return ResultData.ok();
  339. }
  340. }