ScenePlusServiceImpl.java 12 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278
  1. package com.fdkankan.ucenter.service.impl;
  2. import cn.hutool.core.bean.BeanUtil;
  3. import cn.hutool.core.util.StrUtil;
  4. import com.alibaba.fastjson.JSON;
  5. import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
  6. import com.baomidou.mybatisplus.core.conditions.update.LambdaUpdateWrapper;
  7. import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
  8. import com.fdkankan.common.util.FileUtils;
  9. import com.fdkankan.fyun.face.FYunFileServiceInterface;
  10. import com.fdkankan.image.MatrixToImageWriterUtil;
  11. import com.fdkankan.ucenter.common.constants.ConstantFilePath;
  12. import com.fdkankan.ucenter.common.constants.UploadFilePath;
  13. import com.fdkankan.redis.constant.RedisKey;
  14. import com.fdkankan.redis.util.RedisUtil;
  15. import com.fdkankan.ucenter.bean.SceneJsonBean;
  16. import com.fdkankan.ucenter.entity.*;
  17. import com.fdkankan.ucenter.mapper.IScenePlusMapper;
  18. import com.fdkankan.ucenter.service.*;
  19. import java.io.File;
  20. import java.util.Date;
  21. import java.util.HashMap;
  22. import java.util.List;
  23. import java.util.Objects;
  24. import java.util.concurrent.CompletableFuture;
  25. import com.fdkankan.ucenter.vo.SceneEditControlsVO;
  26. import lombok.extern.slf4j.Slf4j;
  27. import org.springframework.beans.factory.annotation.Autowired;
  28. import org.springframework.beans.factory.annotation.Value;
  29. import org.springframework.stereotype.Service;
  30. import javax.annotation.Resource;
  31. /**
  32. * <p>
  33. * 场景主表 服务实现类
  34. * </p>
  35. *
  36. * @author
  37. * @since 2022-07-04
  38. */
  39. @Service
  40. @Slf4j
  41. public class ScenePlusServiceImpl extends ServiceImpl<IScenePlusMapper, ScenePlus> implements IScenePlusService {
  42. @Autowired
  43. private IScenePlusExtService scenePlusExtService;
  44. @Autowired
  45. private ISceneEditInfoService sceneEditInfoService;
  46. @Autowired
  47. private ISceneEditInfoExtService sceneEditInfoExtService;
  48. @Autowired
  49. private ISceneEditControlsService sceneEditControlsService;
  50. @Autowired
  51. private ICameraDetailService cameraDetailService;
  52. @Autowired
  53. private ISurveillanceService surveillanceService;
  54. @Autowired
  55. private ISceneProService sceneProService;
  56. @Resource
  57. FYunFileServiceInterface fYunFileServiceInterface;
  58. @Autowired
  59. RedisUtil redisUtil;
  60. @Value("${main.url}")
  61. private String mainUrl;
  62. @Value("${scene.pro.new.url}")
  63. private String sceneProNewUrl;
  64. @Override
  65. public Long getCountByUserId(Long userId, List<?> sceneSourceList) {
  66. LambdaQueryWrapper<ScenePlus> wrapper = new LambdaQueryWrapper<>();
  67. wrapper.eq(ScenePlus::getUserId, userId);
  68. wrapper.in(ScenePlus::getSceneSource, sceneSourceList);
  69. return this.count(wrapper);
  70. }
  71. @Override
  72. public Long getCountByUserId(Long userId, Integer cameraType) {
  73. return this.getBaseMapper().getCountByUserId(userId,cameraType);
  74. }
  75. @Override
  76. public List<ScenePlus> getListByCameraId(Long cameraId) {
  77. LambdaQueryWrapper<ScenePlus> wrapper = new LambdaQueryWrapper<>();
  78. wrapper.eq(ScenePlus::getCameraId,cameraId);
  79. return this.list(wrapper);
  80. }
  81. @Override
  82. public void bindOrUnCamera(List<Long> cameraIds, Long userId) {
  83. if(cameraIds.size() >0){
  84. LambdaUpdateWrapper<ScenePlus> wrapper = new LambdaUpdateWrapper<>();
  85. wrapper.set(ScenePlus::getUserId,userId)
  86. .in(ScenePlus::getCameraId,cameraIds);
  87. this.update(wrapper);
  88. }
  89. }
  90. @Override
  91. public List<ScenePlus> getListByCameraIds(List<Long> cameraIds) {
  92. LambdaQueryWrapper<ScenePlus> wrapper = new LambdaQueryWrapper<>();
  93. wrapper.in(ScenePlus::getCameraId,cameraIds);
  94. return this.list(wrapper);
  95. }
  96. @Override
  97. public List<ScenePlus> getListByNums(List<String> numList) {
  98. LambdaQueryWrapper<ScenePlus> wrapper = new LambdaQueryWrapper<>();
  99. wrapper.in(ScenePlus::getNum,numList);
  100. return this.list(wrapper);
  101. }
  102. @Override
  103. public HashMap<Long, ScenePlus> getMapByIds(List<Long> sceneIds) {
  104. LambdaQueryWrapper<ScenePlus> wrapper = new LambdaQueryWrapper<>();
  105. wrapper.in(ScenePlus::getId,sceneIds);
  106. List<ScenePlus> list = this.list(wrapper);
  107. HashMap<Long,ScenePlus> map = new HashMap<>();
  108. list.forEach(entity -> map.put(entity.getId(),entity));
  109. return map;
  110. }
  111. @Override
  112. public ScenePlus getByNum(String sceneNum) {
  113. LambdaQueryWrapper<ScenePlus> wrapper = new LambdaQueryWrapper<>();
  114. wrapper.eq(ScenePlus::getNum,sceneNum);
  115. List<ScenePlus> list = this.list(wrapper);
  116. if(list!=null && list.size() >0){
  117. return list.get(0);
  118. }
  119. return null;
  120. }
  121. @Override
  122. public List<ScenePlus> getByIds(List<Long> plusIds) {
  123. LambdaQueryWrapper<ScenePlus> wrapper = new LambdaQueryWrapper<>();
  124. wrapper.in(ScenePlus::getId,plusIds);
  125. return this.list(wrapper);
  126. }
  127. @Override
  128. public Long copyV4Scene(ScenePlus scenePlus,String newNum ,CameraDetail cameraDetail,String time) throws Exception {
  129. String num = scenePlus.getNum();
  130. Long plusId = scenePlus.getId();
  131. ScenePlusExt plusExt = scenePlusExtService.getByPlusId(plusId);
  132. // 拷贝数据
  133. scenePlus.setNum(newNum);
  134. scenePlus.setId(null);
  135. scenePlus.setSceneStatus(0);
  136. this.save(scenePlus);
  137. cameraDetail.setUsedSpace(cameraDetail.getUsedSpace() + plusExt.getSpace());
  138. cameraDetailService.updateById(cameraDetail);
  139. CompletableFuture.runAsync(() -> {
  140. try {
  141. // 拷贝场景编辑资源
  142. String oldEditPath = String.format(UploadFilePath.EDIT_PATH, num);
  143. String newEditPath = String.format(UploadFilePath.EDIT_PATH, newNum);
  144. fYunFileServiceInterface.copyFileInBucket(oldEditPath, newEditPath);
  145. // 拷贝场景展示资源
  146. String oldViewPath = String.format(UploadFilePath.VIEW_PATH, num);
  147. String newViewPath = String.format(UploadFilePath.VIEW_PATH, newNum);
  148. fYunFileServiceInterface.copyFileInBucket(oldViewPath, newViewPath);
  149. // 拷贝本地资源
  150. String oldPath = String.format("/mnt/4Dkankan/scene/%s/caches/images", num);
  151. String newPath = String.format("/mnt/4Dkankan/scene/%s/caches/images", newNum);
  152. if(new File(oldPath).exists()){
  153. FileUtils.copyDirectiory(oldPath, newPath);
  154. }
  155. String scenePath = ConstantFilePath.SCENE_V4_PATH + num;
  156. File file = new File(scenePath);
  157. if(file.exists()){
  158. String newScenePath = ConstantFilePath.SCENE_V4_PATH + newNum;
  159. FileUtils.copyDirectiory(scenePath, newScenePath);
  160. }
  161. String newVideos = plusExt.getVideos().replaceAll("https://4dkk.4dage.com/data/data" + num, "https://4dkk.4dage.com/scene_view_data/" + newNum + "/data");
  162. String oldDataSource = plusExt.getDataSource();
  163. String newDataSource = sceneProService.setDataSource(plusExt.getDataSource(),time);
  164. String buildModelPath = ConstantFilePath.BUILD_MODEL_PATH;
  165. if(scenePlus.getSceneSource().equals(4)){
  166. buildModelPath = ConstantFilePath.BUILD_MODEL_LASER_PATH;
  167. }
  168. sceneProService.copyFdage(oldDataSource,newDataSource,buildModelPath,time);
  169. plusExt.setId(null);
  170. plusExt.setPlusId(scenePlus.getId());
  171. plusExt.setDataSource(newDataSource);
  172. plusExt.setWebSite(plusExt.getWebSite().replace(num, newNum));
  173. plusExt.setThumb(plusExt.getThumb().replace(num, newNum));
  174. plusExt.setVideos(newVideos);
  175. scenePlusExtService.save(plusExt);
  176. SceneEditInfo sceneEditInfo = sceneEditInfoService.getByScenePlusId(plusId);
  177. Long sceneEditInfoId = sceneEditInfo.getId();
  178. sceneEditInfo.setId(null);
  179. sceneEditInfo.setScenePlusId(scenePlus.getId());
  180. sceneEditInfo.setSceneProId(null);
  181. sceneEditInfo.setTitle(scenePlus.getTitle());
  182. sceneEditInfoService.save(sceneEditInfo);
  183. SceneEditInfoExt sceneEditInfoExt = sceneEditInfoExtService.getByEditInfoId(sceneEditInfoId);
  184. sceneEditInfoExt.setId(null);
  185. sceneEditInfoExt.setEditInfoId(sceneEditInfo.getId());
  186. sceneEditInfoExt.setScenePlusId(scenePlus.getId());
  187. sceneEditInfoExt.setSceneProId(null);
  188. sceneEditInfoExtService.save(sceneEditInfoExt);
  189. SceneEditControls sceneEditControls = sceneEditControlsService.getBySceneEditId(sceneEditInfoId);
  190. sceneEditControls.setId(null);
  191. sceneEditControls.setEditInfoId(sceneEditInfo.getId());
  192. sceneEditControlsService.save(sceneEditControls);
  193. List<Surveillance> list = surveillanceService.list(new LambdaQueryWrapper<Surveillance>().eq(Surveillance::getNum, num));
  194. if (!Objects.isNull(list)) {
  195. list.stream().forEach(item -> {
  196. item.setNum(newNum);
  197. item.setId(null);
  198. surveillanceService.save(item);
  199. });
  200. }
  201. // 生成scene.json
  202. SceneJsonBean sceneJson = new SceneJsonBean();
  203. BeanUtil.copyProperties(sceneEditInfoExt, sceneJson);
  204. BeanUtil.copyProperties(sceneEditInfo, sceneJson);
  205. SceneEditControlsVO sceneEditControlsVO = BeanUtil.copyProperties(sceneEditControls, SceneEditControlsVO.class);
  206. sceneJson.setControls(sceneEditControlsVO);
  207. sceneJson.setNum(newNum);
  208. sceneJson.setCreateTime(scenePlus.getCreateTime());
  209. sceneJson.setSceneResolution(plusExt.getSceneResolution());
  210. sceneJson.setSceneFrom(plusExt.getSceneFrom());
  211. sceneJson.setSceneKind(plusExt.getSceneKind());
  212. if(StrUtil.isNotEmpty(plusExt.getVideos())){
  213. sceneJson.setVideos(plusExt.getVideos());
  214. }
  215. sceneJson.setMosaicList(sceneEditInfoService.getMosaicList(num));
  216. log.info("开始生成本地json文件……");
  217. String sceneJsonLocalPath = ConstantFilePath.SCENE_PATH + "data" + File.separator + "data" + newNum + File.separator + "scene.json";
  218. FileUtils.writeFile(sceneJsonLocalPath, JSON.toJSONString(sceneJson));
  219. String sceneJsonPath = String.format(UploadFilePath.DATA_VIEW_PATH+"scene.json", newNum);
  220. fYunFileServiceInterface.uploadFile(JSON.toJSONBytes(sceneJson), sceneJsonPath);
  221. //删除scenejson缓存
  222. redisUtil.del(String.format(RedisKey.SCENE_JSON, num));
  223. // 生成二维码
  224. String outPathZh = ConstantFilePath.BASE_PATH + File.separator + "sceneQRcode/" + newNum + ".png";
  225. String outPathEn = ConstantFilePath.BASE_PATH + File.separator + "sceneQRcode/" + newNum + "_en.png";
  226. MatrixToImageWriterUtil.createQRCode(plusExt.getWebSite(), outPathZh, false,null);
  227. MatrixToImageWriterUtil.createQRCode(plusExt.getWebSite() + "&lang=en", outPathEn, false, null);
  228. fYunFileServiceInterface.uploadFile(outPathZh, String.format(UploadFilePath.DOWNLOADS_QRCODE, newNum) + newNum + ".png");
  229. fYunFileServiceInterface.uploadFile(outPathEn, String.format(UploadFilePath.DOWNLOADS_QRCODE, newNum) + newNum + "_en.png");
  230. scenePlus.setSceneStatus(-2);
  231. this.updateById(scenePlus);
  232. log.info("复制场景结束-{}", new Date());
  233. }catch (Exception e){
  234. this.removeById(scenePlus.getId());
  235. log.error("复制场景异常", e);
  236. }
  237. });
  238. return scenePlus.getId();
  239. }
  240. }