SceneDataDownloadServiceImpl.java 7.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162
  1. package com.fdkankan.openApi.service.system.impl;
  2. import cn.hutool.core.collection.CollectionUtil;
  3. import cn.hutool.core.io.FileUtil;
  4. import cn.hutool.core.util.ObjectUtil;
  5. import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
  6. import com.baomidou.mybatisplus.core.toolkit.Wrappers;
  7. import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
  8. import com.fdkankan.common.exception.BusinessException;
  9. import com.fdkankan.fyun.face.FYunFileServiceInterface;
  10. import com.fdkankan.openApi.bean.vo.SceneDataDownloadVO;
  11. import com.fdkankan.openApi.entity.system.SceneDataDownloadEntity;
  12. import com.fdkankan.openApi.mapper.system.SceneDataDownloadMapper;
  13. import com.fdkankan.openApi.service.laser.SceneService;
  14. import com.fdkankan.openApi.service.system.SceneDataDownloadService;
  15. import com.fdkankan.web.response.ResultData;
  16. import lombok.extern.slf4j.Slf4j;
  17. import org.springframework.beans.factory.annotation.Autowired;
  18. import org.springframework.beans.factory.annotation.Value;
  19. import org.springframework.stereotype.Service;
  20. import org.springframework.transaction.annotation.Transactional;
  21. import java.util.ArrayList;
  22. import java.util.List;
  23. import java.util.Map;
  24. import java.util.stream.Collectors;
  25. /**
  26. * Created by Xiewj on 2022年11月21日11:22:02
  27. */
  28. @Slf4j
  29. @Service
  30. public class SceneDataDownloadServiceImpl extends ServiceImpl<SceneDataDownloadMapper, SceneDataDownloadEntity> implements SceneDataDownloadService {
  31. @Value("${laserConfig.defaultFolder}")
  32. private String laserDefaultFolder;
  33. @Value("${laserConfig.ossUrl}")
  34. private String laserOSSurl;
  35. @Value("${openApiPath.temp}")
  36. private String tempPath;
  37. private String laserBucket="laser-data";
  38. @Autowired
  39. SceneService sceneService;
  40. @Autowired
  41. private FYunFileServiceInterface fYunFileService;
  42. @Override
  43. @Transactional(rollbackFor = Exception.class)
  44. public ResultData sceneDownloadDepthMapAndPly(String sceneCode, Long userId) {
  45. List<SceneDataDownloadEntity> sceneDataDownloadEntityList = findByOssDeleteIsNullBySceneCode(sceneCode);
  46. String xlsxUrl="sceneRawData/"+sceneCode+"/"+sceneCode+".xlsx";
  47. String e57Url=laserDefaultFolder + "/" + sceneCode + "/data/"+sceneCode+"_e57.zip";
  48. boolean e57Flag=false;
  49. if(fYunFileService.fileExist(laserBucket,e57Url)){
  50. e57Flag=true;
  51. }
  52. boolean e57DBFlag = sceneDataDownloadEntityList.stream().allMatch(a -> a.getFileName().contains("e57"));
  53. if (CollectionUtil.isNotEmpty(sceneDataDownloadEntityList) &&fYunFileService.fileExist(laserBucket,xlsxUrl)&&e57Flag&&e57DBFlag){
  54. log.info("场景存在库");
  55. List<SceneDataDownloadVO> sceneDataDownloadVOS = sceneDataDownloadEntityList.stream()
  56. .map(sceneData -> new SceneDataDownloadVO(sceneData.getFileName(),laserOSSurl+sceneData.getOssKey()))
  57. .collect(Collectors.toList());
  58. return ResultData.ok(sceneDataDownloadVOS);
  59. }else {
  60. List<String> copyFiles=new ArrayList<>();
  61. //先检查e57
  62. if(e57Flag){
  63. String e57CopyUrl="sceneRawData/"+sceneCode+"/"+ FileUtil.getName(e57Url);
  64. fYunFileService.copyFileInBucket(laserBucket,e57Url,e57CopyUrl);
  65. copyFiles.add(e57CopyUrl);
  66. e57Flag=true;
  67. }
  68. List<String> strings = fYunFileService.listRemoteFiles(laserBucket, laserDefaultFolder + "/" + sceneCode + "/data/" + sceneCode + "/depthmap/");
  69. boolean has_cloud=false;
  70. boolean has_png=false;
  71. ArrayList<Map<String, Object>> rows =new ArrayList<>();
  72. for (String file : strings) {
  73. String name = FileUtil.getName(file);
  74. if (name.contains("ply")&&e57Flag){
  75. continue;
  76. }
  77. if (FileUtil.extName(file).equalsIgnoreCase("png")&& has_png==false){
  78. has_png=true;
  79. }
  80. if (FileUtil.extName(file).equalsIgnoreCase("ply")&& has_cloud==false){
  81. has_cloud=true;
  82. }
  83. String copyUrl="sceneRawData/"+sceneCode+"/"+ FileUtil.getName(file);
  84. fYunFileService.copyFileInBucket(laserBucket,file,copyUrl);
  85. copyFiles.add(copyUrl);
  86. }
  87. if ((has_png && has_cloud )|| (has_png && e57Flag)){
  88. return saveAndDownLoad(sceneCode, copyFiles,userId);
  89. }else if (!has_png && !has_cloud ){
  90. throw new BusinessException(-1,"数据不全,请重算后再尝试下载");
  91. }else if (has_png && (!has_cloud||!e57Flag )){
  92. throw new BusinessException(-1,"点云数据不全,请重算后再尝试下载");
  93. }else if (!has_png && has_cloud){
  94. throw new BusinessException(-1,"深度图数据不全,请重算后再尝试下载");
  95. }
  96. }
  97. return ResultData.ok();
  98. }
  99. private ResultData saveAndDownLoad(String sceneCode, List<String> data,Long userId) {
  100. List<SceneDataDownloadEntity> dataDownloadEntities=new ArrayList<>();
  101. for (String file : data) {
  102. String name = FileUtil.getName(file);
  103. //上传OSS并且入库
  104. dataDownloadEntities.add(findAndSave(sceneCode, userId, file, name, 1));
  105. }
  106. List<SceneDataDownloadVO> sceneDataDownloadVOS = dataDownloadEntities.stream()
  107. .map(sceneData -> new SceneDataDownloadVO(sceneData.getFileName(),laserOSSurl+sceneData.getOssKey()))
  108. .collect(Collectors.toList());
  109. return ResultData.ok(sceneDataDownloadVOS);
  110. }
  111. private SceneDataDownloadEntity findAndSave(String sceneCode, Long userId, String xlsxUrl,String fileName,int type) {
  112. SceneDataDownloadEntity sceneDataDownload = findBySceneCodeAndFileNameAndOssDeleteIsNull( sceneCode,fileName);
  113. if (ObjectUtil.isNull(sceneDataDownload)){
  114. sceneDataDownload=new SceneDataDownloadEntity();
  115. sceneDataDownload.setOssKey(xlsxUrl);
  116. sceneDataDownload.setFileName(fileName);
  117. sceneDataDownload.setType(type);
  118. sceneDataDownload.setSceneCode(sceneCode);
  119. sceneDataDownload.setBucket(laserBucket);
  120. sceneDataDownload.setUserId(userId);
  121. save(sceneDataDownload);
  122. return sceneDataDownload;
  123. }
  124. return sceneDataDownload;
  125. }
  126. //
  127. @Override
  128. public List<SceneDataDownloadEntity> findByOssDeleteIsNull() {
  129. return list(Wrappers.<SceneDataDownloadEntity>lambdaQuery().isNull(SceneDataDownloadEntity::getOssDelete));
  130. }
  131. @Override
  132. public List<SceneDataDownloadEntity> findByOssDeleteIsNullBySceneCode(String sceneCode) {
  133. LambdaQueryWrapper<SceneDataDownloadEntity> wrapper = Wrappers.lambdaQuery();
  134. wrapper.isNull(SceneDataDownloadEntity::getOssDelete);
  135. wrapper.eq(SceneDataDownloadEntity::getSceneCode,sceneCode);
  136. return list(wrapper);
  137. }
  138. @Override
  139. public SceneDataDownloadEntity findBySceneCodeAndFileNameAndOssDeleteIsNull(String sceneCode, String fileName) {
  140. LambdaQueryWrapper<SceneDataDownloadEntity> wrapper = Wrappers.lambdaQuery();
  141. wrapper.isNull(SceneDataDownloadEntity::getOssDelete);
  142. wrapper.eq(SceneDataDownloadEntity::getSceneCode,sceneCode);
  143. wrapper.eq(SceneDataDownloadEntity::getFileName,fileName);
  144. return getOne(wrapper);
  145. }
  146. }