Przeglądaj źródła

Merge branch 'feature-去除人像' into release

dengsixing 5 miesięcy temu
rodzic
commit
c44b29397c

+ 7 - 1
src/main/java/com/fdkankan/scene/entity/ScenePlus.java

@@ -15,7 +15,7 @@ import lombok.Setter;
  * 场景主表
  * </p>
  *
- * @author 
+ * @author
  * @since 2022-03-16
  */
 @Getter
@@ -119,5 +119,11 @@ public class ScenePlus implements Serializable {
     @TableLogic(value = "A", delval = "I")
     private String recStatus;
 
+    /**
+     * 人像抹除状态
+     */
+    @TableField("remove_portrait")
+    private Integer removePortrait;
+
 
 }

+ 1 - 0
src/main/java/com/fdkankan/scene/entity/ScenePlusExt.java

@@ -178,4 +178,5 @@ public class ScenePlusExt implements Serializable {
      */
     @TableField("is_obj")
     private Integer isObj;
+
 }

+ 22 - 0
src/main/java/com/fdkankan/scene/listener/RabbitMqListener.java

@@ -4,6 +4,7 @@ import com.alibaba.fastjson.JSON;
 import com.alibaba.fastjson.JSONObject;
 import com.fdkankan.scene.entity.DownloadTourVideo;
 import com.fdkankan.scene.service.IDownloadTourVideoService;
+import com.fdkankan.scene.service.IRemovePortraitService;
 import com.fdkankan.scene.service.ISceneService;
 import com.rabbitmq.client.Channel;
 import java.nio.charset.StandardCharsets;
@@ -39,6 +40,8 @@ public class RabbitMqListener {
     private IDownloadTourVideoService downloadTourVideoService;
     @Autowired
     private ISceneService sceneService;
+    @Autowired
+    private IRemovePortraitService removePortraitService;
 
     /**
      * 开启了手动确认模式,如果没有手动确认,消费者不会重试,当服务重启时会再次消费,因为rabbitmq认为你还没有处理完你的业务
@@ -101,5 +104,24 @@ public class RabbitMqListener {
         log.info("结束消费消息,id:{}", messageId);
     }
 
+    @RabbitListener(
+            queuesToDeclare = @Queue("${queue.scene.remove-portrait:remove-portrait}")
+    )
+    public void removePortrait(Channel channel, Message message) throws Exception {
+        String messageId = message.getMessageProperties().getMessageId();
+        String msg = new String(message.getBody(), StandardCharsets.UTF_8);
+        JSONObject jsonObject = JSON.parseObject(msg);
+        String num = jsonObject.getString("num");
+        log.info("去除人像开始,id:{},queue:{},content:{}", messageId, "remove-portrait", msg);
+        try {
+            removePortraitService.removePortrait(jsonObject);
+        }catch (Exception e){
+            log.error("去除人像报错, num:{}", num, e);
+        }finally {
+            channel.basicAck(message.getMessageProperties().getDeliveryTag(), false);
+        }
+        log.info("去除人像结束,id:{},queue:{},content:{}", messageId, "remove-portrait", msg);
+    }
+
 
 }

+ 9 - 0
src/main/java/com/fdkankan/scene/service/IRemovePortraitService.java

@@ -0,0 +1,9 @@
+package com.fdkankan.scene.service;
+
+import com.alibaba.fastjson.JSONObject;
+
+public interface IRemovePortraitService {
+
+    void removePortrait(JSONObject param) throws Exception;
+
+}

+ 2 - 0
src/main/java/com/fdkankan/scene/service/ISceneEditInfoService.java

@@ -114,4 +114,6 @@ public interface ISceneEditInfoService extends IService<SceneEditInfo> {
 
     ResultData listFilter(BaseSceneParamVO param) throws Exception;
 
+    void uploadPanoramaHandler(String num, String bucket, String target, String imgViewPath, List<String> uploadFileList, String targetImagesPath, String bizType) throws Exception;
+
 }

+ 125 - 0
src/main/java/com/fdkankan/scene/service/impl/RemovePortraitServiceImpl.java

@@ -0,0 +1,125 @@
+package com.fdkankan.scene.service.impl;
+
+import cn.hutool.core.collection.CollUtil;
+import cn.hutool.core.io.FileUtil;
+import cn.hutool.core.util.CharsetUtil;
+import cn.hutool.core.util.StrUtil;
+import cn.hutool.core.util.ZipUtil;
+import com.alibaba.fastjson.JSON;
+import com.alibaba.fastjson.JSONObject;
+import com.fdkankan.common.constant.*;
+import com.fdkankan.common.exception.BusinessException;
+import com.fdkankan.common.util.FileUtils;
+import com.fdkankan.fyun.face.FYunFileServiceInterface;
+import com.fdkankan.model.constants.ConstantFilePath;
+import com.fdkankan.model.constants.UploadFilePath;
+import com.fdkankan.model.utils.CreateObjUtil;
+import com.fdkankan.model.utils.SceneUtil;
+import com.fdkankan.scene.entity.SceneAsynOperLog;
+import com.fdkankan.scene.entity.ScenePlus;
+import com.fdkankan.scene.entity.ScenePlusExt;
+import com.fdkankan.scene.service.*;
+import com.fdkankan.scene.vo.UploadPanoramaVO;
+import com.fdkankan.web.response.ResultData;
+import lombok.extern.slf4j.Slf4j;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.stereotype.Service;
+
+import javax.annotation.Resource;
+import java.io.File;
+import java.util.*;
+import java.util.concurrent.CompletableFuture;
+import java.util.stream.Collectors;
+
+@Slf4j
+@Service
+public class RemovePortraitServiceImpl implements IRemovePortraitService {
+
+    @Autowired
+    private IScenePlusService scenePlusService;
+    @Autowired
+    private IScenePlusExtService scenePlusExtService;
+    @Resource
+    private FYunFileServiceInterface fileServiceInterface;
+    @Autowired
+    private ISceneEditInfoService sceneEditInfoService;
+    @Resource
+    private FYunFileServiceInterface fYunFileService;
+    @Autowired
+    private ISceneAsynOperLogService sceneAsynOperLogService;
+
+    @Override
+    public void removePortrait(JSONObject param) throws Exception {
+        String num = param.getString("num");
+
+        ScenePlus scenePlus = scenePlusService.getScenePlusByNum(num);
+        if(scenePlus.getRemovePortrait() == CommonOperStatus.WAITING.code()){
+            return;
+        }
+        ScenePlusExt scenePlusExt = scenePlusExtService.getScenePlusExtByPlusId(scenePlus.getId());
+        String bucket = scenePlusExt.getYunFileBucket();
+        //原始计算根目录
+        String uuid = UUID.randomUUID().toString();
+        //全景图计算根目录
+        String target = String.format(ConstantFilePath.SCENE_USER_PATH_V4, num) + uuid;
+        //解压缩文件存放目录
+        String targetImagesPath = target + "/extras/images/";
+        //更新状态为进行中
+        scenePlus.setRemovePortrait(CommonOperStatus.WAITING.code());
+        scenePlusService.updateById(scenePlus);
+        try {
+            //下载文件
+            String cacheImagesPath = String.format(UploadFilePath.scene_result_data_path, num) + "caches/images/";
+            List<String> imagesList = fileServiceInterface.listRemoteFiles(cacheImagesPath);
+            if(CollUtil.isEmpty(imagesList)){
+                return;
+            }
+
+            imagesList.stream().forEach(key->{
+                if(key.endsWith(".jpg")){
+                    fileServiceInterface.downloadFile(key, targetImagesPath + FileUtil.getName(key));
+                }
+            });
+
+            String imgViewPath = String.format(UploadFilePath.IMG_VIEW_PATH, num);
+            fileServiceInterface.downloadFile(imgViewPath + "vision.txt", target + File.separator + "extras" + File.separator + "vision.txt");
+
+            //data.json增加extras为执行重建算法
+            JSONObject floorplanJson = new JSONObject();
+            floorplanJson.put("has_source_images", true);
+            floorplanJson.put("has_vision_txt", true);
+
+            JSONObject dataJson = new JSONObject();
+            dataJson.put("extras", floorplanJson);
+            dataJson.put("split_type", "SPLIT_V28");
+            //V5表示不需要生成high,low文件
+            String skyboxType = "SKYBOX_V6";
+            if(scenePlusExt.getSceneScheme() == 11){
+                skyboxType = "SKYBOX_V7";
+            }
+            //sceneScheme为3切成瓦片图
+            if(scenePlusExt.getSceneScheme() == 3){
+                if("4k".equals(scenePlusExt.getSceneResolution())){
+                    skyboxType = "SKYBOX_V14";
+                }else{
+                    skyboxType = "SKYBOX_V13";
+                }
+            }
+            dataJson.put("skybox_type", skyboxType);
+            FileUtil.writeUtf8String(dataJson.toJSONString(), target + File.separator+"data.json");
+
+            sceneEditInfoService.uploadPanoramaHandler(num,bucket,target,imgViewPath,new ArrayList<>(),targetImagesPath, "removePortrait");
+            scenePlus.setRemovePortrait(CommonOperStatus.SUCCESS.code());
+
+            //清除全景图异步操作记录,防止再次下载的时候请求到旧的压缩包
+            sceneAsynOperLogService.cleanLog(num, SceneAsynModuleType.UPLOAD_DOWNLOAD.code(), SceneAsynFuncType.PANORAMIC_IMAGE.code());
+
+        }catch (Exception e){
+            log.error("抹除人像失败,num:{}", num, e);
+            scenePlus.setRemovePortrait(CommonOperStatus.FAILD.code());
+        }finally {
+            FileUtil.del(target);
+            scenePlusService.updateById(scenePlus);
+        }
+    }
+}

+ 14 - 3
src/main/java/com/fdkankan/scene/service/impl/SceneEditInfoServiceImpl.java

@@ -1257,7 +1257,7 @@ public class SceneEditInfoServiceImpl extends ServiceImpl<ISceneEditInfoMapper,
                 }
                 sceneAsynOperLogService.save(sceneAsynOperLog);
                 try {
-                    this.uploadPanoramaHandler(num,bucket,target,imgViewPath, finalUploadFileList,targetImagesPath);
+                    this.uploadPanoramaHandler(num,bucket,target,imgViewPath, finalUploadFileList,targetImagesPath, null);
                     sceneAsynOperLog.setState(CommonOperStatus.SUCCESS.code());
                 } catch (Exception e) {
                     log.error("上传全景图报错,num:" + num, e);
@@ -1266,7 +1266,7 @@ public class SceneEditInfoServiceImpl extends ServiceImpl<ISceneEditInfoMapper,
                 sceneAsynOperLogService.updateById(sceneAsynOperLog);
             });
         }else{
-            this.uploadPanoramaHandler(num,bucket,target,imgViewPath,uploadFileList,targetImagesPath);
+            this.uploadPanoramaHandler(num,bucket,target,imgViewPath,uploadFileList,targetImagesPath, null);
             if(CollUtil.isNotEmpty(notExistFileList)){
                 uploadPanoramaVO.setSuccessCnt(uploadFileList.size());
                 uploadPanoramaVO.setFailList(notExistFileList);
@@ -1275,7 +1275,8 @@ public class SceneEditInfoServiceImpl extends ServiceImpl<ISceneEditInfoMapper,
         return ResultData.ok(uploadPanoramaVO);
     }
 
-    public void uploadPanoramaHandler(String num, String bucket, String target, String imgViewPath, List<String> uploadFileList, String targetImagesPath) throws Exception {
+    @Override
+    public void uploadPanoramaHandler(String num, String bucket, String target, String imgViewPath, List<String> uploadFileList, String targetImagesPath, String bizType) throws Exception {
         CreateObjUtil.build3dModel(target , "1");
 
         String uploadJsonPath= target + File.separator + "results" +File.separator+"upload.json";
@@ -1340,6 +1341,14 @@ public class SceneEditInfoServiceImpl extends ServiceImpl<ISceneEditInfoMapper,
         uploadFileList.stream().forEach(srcPath->{
             map.put(srcPath, srcPath.replace(targetImagesPath, ossCachesImagesPath));
         });
+        if(StrUtil.isNotEmpty(bizType) && bizType.equals("removePortrait")){
+            //上传16k图
+            String cacheImagePath = target + "/caches/images/";
+            List<String> cacheImageList = FileUtil.listFileNames(cacheImagePath);
+            cacheImageList.stream().forEach(v->{
+                fYunFileService.uploadFile(cacheImagePath + v, ossCachesImagesPath + v);
+            });
+        }
 
         if(map.size()>0) {
             fYunFileService.uploadMulFiles(bucket, map);
@@ -1351,6 +1360,8 @@ public class SceneEditInfoServiceImpl extends ServiceImpl<ISceneEditInfoMapper,
         this.upgradeVersionAndImgVersionById(sceneEditInfo.getId());
         //更新scenejson缓存和oss文件版本号
         this.upgradeSceneJsonVersion(num, sceneEditInfo.getVersion() + 1, sceneEditInfo.getImgVersion() + 1, bucket);
+
+        FileUtil.del(target);
     }