Browse Source

生成obj接口迁移

dengsixing 1 month ago
parent
commit
68db471d4d

+ 20 - 3
src/main/java/com/fdkankan/contro/controller/SceneFileController.java

@@ -6,14 +6,17 @@ import com.alibaba.fastjson.JSONObject;
 import com.fdkankan.common.constant.ErrorCode;
 import com.fdkankan.common.constant.ErrorCode;
 import com.fdkankan.common.constant.SceneSource;
 import com.fdkankan.common.constant.SceneSource;
 import com.fdkankan.common.exception.BusinessException;
 import com.fdkankan.common.exception.BusinessException;
+import com.fdkankan.contro.common.Result;
 import com.fdkankan.contro.annotation.SignVerification;
 import com.fdkankan.contro.annotation.SignVerification;
 import com.fdkankan.contro.entity.ScenePlus;
 import com.fdkankan.contro.entity.ScenePlus;
 import com.fdkankan.contro.service.IAppCameraFailLogService;
 import com.fdkankan.contro.service.IAppCameraFailLogService;
 import com.fdkankan.contro.service.ISceneFileBuildService;
 import com.fdkankan.contro.service.ISceneFileBuildService;
+import com.fdkankan.contro.service.ISceneProService;
 import com.fdkankan.contro.service.IScenePlusService;
 import com.fdkankan.contro.service.IScenePlusService;
 import com.fdkankan.contro.service.ISceneUploadCountService;
 import com.fdkankan.contro.service.ISceneUploadCountService;
 import com.fdkankan.contro.vo.ReportFailLogVO;
 import com.fdkankan.contro.vo.ReportFailLogVO;
 import com.fdkankan.contro.vo.ResponseSceneFile;
 import com.fdkankan.contro.vo.ResponseSceneFile;
+import com.fdkankan.contro.vo.SceneParam;
 import com.fdkankan.contro.vo.SceneUploadCountParamVO;
 import com.fdkankan.contro.vo.SceneUploadCountParamVO;
 import com.fdkankan.fyun.face.FYunFileServiceInterface;
 import com.fdkankan.fyun.face.FYunFileServiceInterface;
 import com.fdkankan.web.response.ResultData;
 import com.fdkankan.web.response.ResultData;
@@ -37,17 +40,16 @@ public class SceneFileController{
 
 
     @Autowired
     @Autowired
     private ISceneFileBuildService sceneFileBuildService;
     private ISceneFileBuildService sceneFileBuildService;
-
     @Resource
     @Resource
     private FYunFileServiceInterface fYunFileService;
     private FYunFileServiceInterface fYunFileService;
-
     @Autowired
     @Autowired
     private ISceneUploadCountService sceneUploadCountService;
     private ISceneUploadCountService sceneUploadCountService;
-
     @Autowired
     @Autowired
     private IAppCameraFailLogService appCameraFailLogService;
     private IAppCameraFailLogService appCameraFailLogService;
     @Autowired
     @Autowired
     private IScenePlusService scenePlusService;
     private IScenePlusService scenePlusService;
+    @Autowired
+    ISceneProService sceneProService;
 
 
 
 
     /**
     /**
@@ -185,4 +187,19 @@ public class SceneFileController{
         return sceneFileBuildService.uploadLiguang(num, snCode, ossPath);
         return sceneFileBuildService.uploadLiguang(num, snCode, ossPath);
     }
     }
 
 
+    /**
+     *
+     * 激光场景生成obj文件
+     */
+    @SignVerification
+    @PostMapping(value = "/generateObjFile")
+    public Result generateObjFile(@RequestBody SceneParam requestScene) throws Exception{
+        String num = requestScene.getSceneNum();
+        if (StringUtils.isEmpty(num)) {
+            throw new BusinessException(ErrorCode.FAILURE_CODE_3001);
+        }
+        sceneProService.generateObjFile(num);
+        return Result.success();
+    }
+
 }
 }

+ 20 - 0
src/main/java/com/fdkankan/contro/httpclient/LaserAddressSource.java

@@ -0,0 +1,20 @@
+package com.fdkankan.contro.httpclient;
+
+import com.dtflys.forest.callback.AddressSource;
+import com.dtflys.forest.http.ForestAddress;
+import com.dtflys.forest.http.ForestRequest;
+import org.springframework.beans.factory.annotation.Value;
+import org.springframework.stereotype.Component;
+
+@Component
+public class LaserAddressSource implements AddressSource {
+
+    @Value("${4dkk.laserService.basePath}")
+    private String basePath;
+
+
+    @Override
+    public ForestAddress getAddress(ForestRequest forestRequest) {
+        return new ForestAddress("","",null,basePath);
+    }
+}

+ 17 - 0
src/main/java/com/fdkankan/contro/httpclient/LaserClient.java

@@ -0,0 +1,17 @@
+package com.fdkankan.contro.httpclient;
+
+import com.dtflys.forest.annotation.Address;
+import com.dtflys.forest.annotation.Get;
+import com.fdkankan.contro.common.Result;
+
+/**
+ * 获取,调用激光服务
+ */
+@Address(source = LaserAddressSource.class)
+public interface LaserClient {
+
+
+    @Get("/laser/init/${0}")
+    Result getSceneByNum(String num);
+
+}

+ 2 - 0
src/main/java/com/fdkankan/contro/httpclient/MyClient.java

@@ -13,4 +13,6 @@ public interface MyClient {
     @Get(url = "${url}")
     @Get(url = "${url}")
     Result get(@Var("url") String url, @Header Map<String, String> headerMap);
     Result get(@Var("url") String url, @Header Map<String, String> headerMap);
 
 
+
+
 }
 }

+ 27 - 0
src/main/java/com/fdkankan/contro/mapper/ISceneUpgradeMapper.java

@@ -0,0 +1,27 @@
+package com.fdkankan.contro.mapper;
+
+import org.apache.ibatis.annotations.Mapper;
+import org.apache.ibatis.annotations.Param;
+
+/**
+ * <p>
+ * 文件夹表 Mapper 接口
+ * </p>
+ *
+ * @author dengsixing
+ * @since 2021-12-24
+ */
+@Mapper
+public interface ISceneUpgradeMapper {
+
+    public void transferScenePlus(String num);
+
+    public void transferScenePlusExt(@Param("num") String num, @Param("scenePlusId") Long scenePlusId, @Param("sceneKind") String sceneKind);
+
+    public void deleteScenePlus(String num);
+
+    public void deleteScenePlusExt(Long scenePlusId);
+
+
+
+}

+ 1 - 1
src/main/java/com/fdkankan/contro/service/ISceneProService.java

@@ -18,5 +18,5 @@ public interface ISceneProService extends IService<ScenePro> {
     Long sumUsedSpaceByCameraId(Long cameraId, String spaceTypeStr);
     Long sumUsedSpaceByCameraId(Long cameraId, String spaceTypeStr);
 
 
 
 
-
+    void generateObjFile(String num);
 }
 }

+ 149 - 4
src/main/java/com/fdkankan/contro/service/impl/SceneProServiceImpl.java

@@ -1,18 +1,33 @@
 package com.fdkankan.contro.service.impl;
 package com.fdkankan.contro.service.impl;
 
 
 import cn.hutool.core.collection.CollUtil;
 import cn.hutool.core.collection.CollUtil;
+import com.alibaba.fastjson.JSONObject;
 import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
 import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
+import com.baomidou.mybatisplus.core.conditions.update.LambdaUpdateWrapper;
 import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
 import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
-import com.fdkankan.common.constant.CommonStatus;
-import com.fdkankan.common.constant.PayStatus;
-import com.fdkankan.common.constant.SceneStatus;
-import com.fdkankan.common.constant.SpaceType;
+import com.fdkankan.common.constant.*;
+import com.fdkankan.common.exception.BusinessException;
+import com.fdkankan.contro.common.Result;
+import com.fdkankan.contro.entity.ScenePlus;
+import com.fdkankan.contro.entity.ScenePlusExt;
 import com.fdkankan.contro.entity.ScenePro;
 import com.fdkankan.contro.entity.ScenePro;
+import com.fdkankan.contro.httpclient.LaserClient;
 import com.fdkankan.contro.mapper.ISceneProMapper;
 import com.fdkankan.contro.mapper.ISceneProMapper;
+import com.fdkankan.contro.mapper.ISceneUpgradeMapper;
+import com.fdkankan.contro.service.IScenePlusExtService;
+import com.fdkankan.contro.service.IScenePlusService;
 import com.fdkankan.contro.service.ISceneProService;
 import com.fdkankan.contro.service.ISceneProService;
+import com.fdkankan.fyun.face.FYunFileServiceInterface;
+import com.fdkankan.rabbitmq.bean.BuildSceneCallMessage;
+import com.fdkankan.rabbitmq.util.RabbitMqProducer;
 import lombok.extern.slf4j.Slf4j;
 import lombok.extern.slf4j.Slf4j;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.beans.factory.annotation.Value;
+import org.springframework.http.HttpStatus;
 import org.springframework.stereotype.Service;
 import org.springframework.stereotype.Service;
+import org.springframework.util.ObjectUtils;
 
 
+import javax.annotation.Resource;
 import java.util.List;
 import java.util.List;
 import java.util.Objects;
 import java.util.Objects;
 
 
@@ -28,6 +43,21 @@ import java.util.Objects;
 @Service
 @Service
 public class SceneProServiceImpl extends ServiceImpl<ISceneProMapper, ScenePro> implements ISceneProService {
 public class SceneProServiceImpl extends ServiceImpl<ISceneProMapper, ScenePro> implements ISceneProService {
 
 
+    @Value("${queue.modeling.obj.modeling-pre}")
+    private String queueObjModelingPre;
+    @Autowired
+    private IScenePlusService scenePlusService;
+    @Resource
+    private FYunFileServiceInterface fYunFileService;
+    @Resource
+    private LaserClient laserClient;
+    @Autowired
+    private ISceneUpgradeMapper sceneUpgradeMapper;
+    @Resource
+    private RabbitMqProducer mqProducer;
+    @Autowired
+    private IScenePlusExtService scenePlusExtService;
+
     @Override
     @Override
     public ScenePro getByNum(String num) {
     public ScenePro getByNum(String num) {
         return this.getOne(new LambdaQueryWrapper<ScenePro>().eq(ScenePro::getNum, num));
         return this.getOne(new LambdaQueryWrapper<ScenePro>().eq(ScenePro::getNum, num));
@@ -58,4 +88,119 @@ public class SceneProServiceImpl extends ServiceImpl<ISceneProMapper, ScenePro>
         }
         }
         return 0L;
         return 0L;
     }
     }
+
+    @Override
+    public void generateObjFile(String num) {
+        ScenePro sceneProEntity = this.getByNum(num);
+
+        if(ObjectUtils.isEmpty(sceneProEntity) && sceneProEntity.getIsUpgrade() == 1){
+            generatePlusObjFile(num);
+            return;
+        }
+
+        if(sceneProEntity.getSceneSource() != 4 && sceneProEntity.getSceneSource() != 5){
+            throw new BusinessException(ErrorCode.FAILURE_CODE_3003, "只能操作激光场景");
+        }
+
+        // 拷贝文件
+        String path = sceneProEntity.getDataSource();
+        String ossPath = path.replace("/mnt/data","home")+"/data.fdage";
+        if(!fYunFileService.fileExist(ossPath)){
+            throw new BusinessException(ErrorCode.FAILURE_CODE_3037);
+        }
+
+        // 获取最新的场景名称
+        Result laserSceneByNum = laserClient.getSceneByNum(num);
+        if(laserSceneByNum.getCode() != HttpStatus.OK.value()){
+            throw new RuntimeException("获取激光转台场景失败!");
+        }
+        JSONObject sceneInfo = JSONObject.parseObject(JSONObject.toJSONString(laserSceneByNum.getData()));
+        LambdaUpdateWrapper<ScenePro> updateWrapper = new LambdaUpdateWrapper<>();
+        updateWrapper
+                .set(ScenePro::getStatus, 0)
+                .set(ScenePro::getIsObj, 1)
+                .set(ScenePro::getIsUpgrade, 2)   //   升级中
+                .set(ScenePro::getSceneName, sceneInfo.getString("title"))
+                .eq(ScenePro::getNum, sceneProEntity.getNum());
+        this.update(updateWrapper);
+
+        //同步到scenePlus、scenePlus
+        ScenePlus scenePlus = scenePlusService.getScenePlusByNum(num);
+        if(Objects.nonNull(scenePlus)){
+            sceneUpgradeMapper.deleteScenePlus(num);
+            sceneUpgradeMapper.deleteScenePlusExt(scenePlus.getId());
+        }
+        sceneUpgradeMapper.transferScenePlus(num);
+        scenePlus = scenePlusService.getScenePlusByNum(num);
+        String sceneKind = sceneProEntity.getSceneScheme() == 3 ? SceneKind.FACE.code():SceneKind.TILES.code();
+        sceneUpgradeMapper.transferScenePlusExt(num, scenePlus.getId(), sceneKind);
+
+        log.info("开始发送激光场景生成obj mq消息");
+
+        // 发送MQ
+        BuildSceneCallMessage mqMsg = new BuildSceneCallMessage();
+        mqMsg.setSceneNum(sceneProEntity.getNum());
+        mqMsg.setAlgorithm(sceneProEntity.getAlgorithm());
+        mqMsg.setBuildType(sceneProEntity.getBuildType());
+        mqMsg.setPath(sceneProEntity.getDataSource());
+        mqProducer.sendByWorkQueue(queueObjModelingPre,mqMsg);
+    }
+
+    public void generatePlusObjFile(String num) {
+        ScenePlus scenePlus = scenePlusService.getScenePlusByNum(num);
+
+        if(ObjectUtils.isEmpty(scenePlus)){
+            throw new BusinessException(SceneConstant.FAILURE_CODE_5005, SceneConstant.FAILURE_MSG_5005);
+        }
+
+        if(scenePlus.getSceneSource() != 4 && scenePlus.getSceneSource() !=5){
+            throw new BusinessException(ErrorCode.FAILURE_CODE_3003, "只能操作激光场景");
+        }
+
+        ScenePlusExt scenePlusExt = scenePlusExtService.getScenePlusExtByPlusId(scenePlus.getId());
+
+        String ossPath = scenePlusExt.getDataSource().replace("/mnt/data","home")+"/data.fdage";
+        if(!fYunFileService.fileExist(ossPath)){
+            throw new BusinessException(ErrorCode.FAILURE_CODE_3037);
+
+        }
+
+        // 获取最新的场景名称
+        Result laserSceneByNum = laserClient.getSceneByNum(num);
+        if(laserSceneByNum.getCode() != HttpStatus.OK.value()){
+            throw new RuntimeException("获取激光转台场景失败!");
+        }
+        JSONObject sceneInfo = JSONObject.parseObject(JSONObject.toJSONString(laserSceneByNum.getData()));
+        LambdaUpdateWrapper<ScenePlus> updateWrapper = new LambdaUpdateWrapper<>();
+        updateWrapper
+                .set(ScenePlus::getSceneStatus, 0)
+                .set(ScenePlus::getTitle, sceneInfo.getString("title"))
+                .eq(ScenePlus::getNum, num);
+        scenePlusService.update(updateWrapper);
+
+        LambdaUpdateWrapper<ScenePlusExt> plusExtUpdateWrapper = new LambdaUpdateWrapper<>();
+        plusExtUpdateWrapper
+                .set(ScenePlusExt::getIsObj, 1)
+                .eq(ScenePlusExt::getPlusId, scenePlus.getId());
+        scenePlusExtService.update(plusExtUpdateWrapper);
+
+        log.info("开始发送激光场景生成obj mq消息");
+
+        // 发送MQ
+        BuildSceneCallMessage mqMsg = new BuildSceneCallMessage();
+        mqMsg.setSceneNum(num);
+        mqMsg.setAlgorithm(scenePlusExt.getAlgorithm());
+        mqMsg.setBuildType(scenePlusExt.getBuildType());
+        mqMsg.setPath(scenePlusExt.getDataSource());
+        mqProducer.sendByWorkQueue(queueObjModelingPre,mqMsg);
+    }
+
+    public JSONObject getSceneByNum(String num) {
+        Result result = laserClient.getSceneByNum(num);
+        if(result.getCode() != HttpStatus.OK.value()){
+            log.error("获取激光转台场景失败!");
+            return null;
+        }
+        return JSONObject.parseObject(JSONObject.toJSONString(result.getData()));
+    }
 }
 }

+ 40 - 0
src/main/java/com/fdkankan/contro/vo/SceneParam.java

@@ -0,0 +1,40 @@
+package com.fdkankan.contro.vo;
+
+import lombok.Data;
+
+import java.util.List;
+
+@Data
+public class SceneParam{
+    private String sceneSource;
+    private Long folderId;
+    private Integer folderType;
+    private Long userId;
+    private List<String> sourceList;
+    private List<String> numList;
+    private Integer hasFolder =1;   // 0 不包含文件夹,1包含
+
+    private String sceneName;       //场景名称
+    private String snCode;          //相机snCode
+    private List<String> snCodes;
+
+    private String userName;        //协作者名称
+
+    private String sceneNum;
+
+    private Integer type;
+
+    private Integer haveVoid;
+    private Integer status;
+
+    private Integer isObj;
+
+    private String startTime;
+    private String endTime;
+    private String num;
+
+    private String searchKey;
+    private Integer cameraId;
+    private Integer location;
+    private String platform;
+}

+ 118 - 0
src/main/resources/mapper/contro/SceneUpgradeMapper.xml

@@ -0,0 +1,118 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
+<mapper namespace="com.fdkankan.ucenter.mapper.ISceneUpgradeMapper">
+
+  <insert id="transferScenePlus" parameterType="java.lang.String">
+    INSERT INTO t_scene_plus (
+    `num`,
+    `user_id`,
+    `camera_id`,
+    `phone_id`,
+    `title`,
+    `description`,
+    `scene_status`,
+    `scene_source`,
+    `pay_status`,
+    `scene_type`,
+    `recommend`,
+    `create_time`,
+    `update_time`,
+    `rec_status`
+  )
+  SELECT
+    p.`num`,
+    p.`user_id`,
+    p.`camera_id`,
+    p.`phone_id`,
+    p.`scene_name`,
+    p.`scene_dec`,
+    p.`status`,
+    p.`scene_source`,
+    p.`pay_status`,
+    p.`scene_type`,
+    p.`recommend`,
+    p.`create_time`,
+    p.`update_time`,
+     p.rec_status
+  FROM
+    t_scene_pro p
+  WHERE p.num = #{num};
+  </insert>
+
+  <insert id="transferScenePlusExt">
+    INSERT INTO t_scene_plus_ext (
+    plus_id,
+    data_source,
+    web_site,
+    thumb,
+    scene_scheme,
+    SPACE,
+    ecs,
+    shoot_count,
+    view_count,
+    gps,
+    ALGORITHM,
+    firmware_version,
+    build_type,
+    create_time,
+    update_time,
+    rec_status,
+    scene_resolution,
+    scene_from,
+    scene_kind,
+    model_kind,
+    videos,
+    algorithm_time,
+    is_obj
+  )
+  SELECT
+    #{scenePlusId},
+    p.`data_source`,
+    p.`web_site`,
+    p.`thumb`,
+    p.`scene_scheme`,
+    p.`space`,
+    p.`ecs`,
+    p.`shoot_count`,
+    p.`view_count`,
+    p.`gps`,
+    p.`algorithm`,
+    p.`firmware_version`,
+    p.`build_type`,
+    p.`create_time`,
+    p.`update_time`,
+    p.rec_status ,
+    CASE
+      WHEN p.scene_source = 1 THEN '2k'
+      WHEN p.scene_source = 2 THEN '1k'
+      WHEN p.scene_source = 3 THEN '4k'
+      WHEN p.scene_source = 4 THEN '4k'
+      ELSE NULL
+     END AS scene_resolution,
+    CASE
+      WHEN p.scene_source = 1 THEN 'pro'
+      WHEN p.scene_source = 2 THEN 'lite'
+      WHEN p.scene_source = 3 THEN 'minion'
+      WHEN p.scene_source = 4 THEN 'laser'
+      ELSE NULL
+     END AS scene_from,
+    #{sceneKind} scene_kind,
+    'dam',
+    p.videos,
+    p.`create_time`,
+    p.is_obj
+  FROM
+    t_scene_pro p
+  WHERE p.num = #{num}
+  </insert>
+
+
+  <delete id="deleteScenePlus" parameterType="java.lang.String">
+    delete from t_scene_plus where num = #{num}
+  </delete>
+
+  <delete id="deleteScenePlusExt" parameterType="java.lang.Long">
+    delete from t_scene_plus_ext where plus_id = #{scenePlusId}
+  </delete>
+
+</mapper>