Browse Source

Merge branch 'feature-v4.12.0-dsx' into release

dengsixing 1 year ago
parent
commit
ba04c86c8e
39 changed files with 1244 additions and 310 deletions
  1. 6 0
      pom.xml
  2. 8 0
      src/main/java/com/fdkankan/scene/bean/SceneJsonBean.java
  3. 30 2
      src/main/java/com/fdkankan/scene/controller/SceneAsynOperLogController.java
  4. 14 0
      src/main/java/com/fdkankan/scene/controller/SceneController.java
  5. 53 0
      src/main/java/com/fdkankan/scene/controller/SceneDynamicPanelController.java
  6. 38 23
      src/main/java/com/fdkankan/scene/controller/SceneEditController.java
  7. 53 0
      src/main/java/com/fdkankan/scene/controller/SceneEditDrawController.java
  8. 66 0
      src/main/java/com/fdkankan/scene/entity/SceneDynamicPanel.java
  9. 15 2
      src/main/java/com/fdkankan/scene/entity/SceneEditControls.java
  10. 8 2
      src/main/java/com/fdkankan/scene/entity/SceneEditInfoExt.java
  11. 4 1
      src/main/java/com/fdkankan/scene/entity/SceneResource.java
  12. 1 1
      src/main/java/com/fdkankan/scene/generate/AutoGenerate.java
  13. 18 0
      src/main/java/com/fdkankan/scene/mapper/ISceneDynamicPanelMapper.java
  14. 13 2
      src/main/java/com/fdkankan/scene/schedule/ScheduleJob.java
  15. 9 0
      src/main/java/com/fdkankan/scene/service/ICommonService.java
  16. 8 2
      src/main/java/com/fdkankan/scene/service/ISceneAsynOperLogService.java
  17. 20 0
      src/main/java/com/fdkankan/scene/service/ISceneDrawService.java
  18. 25 0
      src/main/java/com/fdkankan/scene/service/ISceneDynamicPanelService.java
  19. 5 1
      src/main/java/com/fdkankan/scene/service/ISceneEditInfoService.java
  20. 2 2
      src/main/java/com/fdkankan/scene/service/ISceneProService.java
  21. 2 0
      src/main/java/com/fdkankan/scene/service/ISceneResourceService.java
  22. 2 2
      src/main/java/com/fdkankan/scene/service/ISurveillanceService.java
  23. 47 0
      src/main/java/com/fdkankan/scene/service/impl/CommonServiceImpl.java
  24. 1 0
      src/main/java/com/fdkankan/scene/service/impl/CutModelServiceImpl.java
  25. 44 12
      src/main/java/com/fdkankan/scene/service/impl/SceneAsynOperLogServiceImpl.java
  26. 244 0
      src/main/java/com/fdkankan/scene/service/impl/SceneDrawServiceImpl.java
  27. 101 0
      src/main/java/com/fdkankan/scene/service/impl/SceneDynamicPanelServiceImpl.java
  28. 111 129
      src/main/java/com/fdkankan/scene/service/impl/SceneEditInfoServiceImpl.java
  29. 4 9
      src/main/java/com/fdkankan/scene/service/impl/SceneEditServiceImpl.java
  30. 163 106
      src/main/java/com/fdkankan/scene/service/impl/SceneProServiceImpl.java
  31. 15 8
      src/main/java/com/fdkankan/scene/service/impl/SceneResourceServiceImpl.java
  32. 14 5
      src/main/java/com/fdkankan/scene/service/impl/SurveillanceServiceImpl.java
  33. 29 0
      src/main/java/com/fdkankan/scene/vo/SceneDynamicPanelParamVO.java
  34. 27 0
      src/main/java/com/fdkankan/scene/vo/SceneDynamicPanelVO.java
  35. 10 0
      src/main/java/com/fdkankan/scene/vo/SceneEditControlsParamVO.java
  36. 11 0
      src/main/java/com/fdkankan/scene/vo/SceneEditControlsVO.java
  37. 8 0
      src/main/java/com/fdkankan/scene/vo/SceneInfoVO.java
  38. 10 1
      src/main/resources/bootstrap-dev.yml
  39. 5 0
      src/main/resources/mapper/scene/SceneDynamicPanelMapper.xml

+ 6 - 0
pom.xml

@@ -158,6 +158,12 @@
             <version>1.0.5</version>
         </dependency>
 
+        <dependency>
+            <groupId>com.fdkankan</groupId>
+            <artifactId>4dkankan-utils-dxf</artifactId>
+            <version>3.0.0-SNAPSHOT</version>
+        </dependency>
+
     </dependencies>
 
     <dependencyManagement>

+ 8 - 0
src/main/java/com/fdkankan/scene/bean/SceneJsonBean.java

@@ -228,5 +228,13 @@ public class SceneJsonBean {
      */
     private JSONObject started;
 
+    /**
+     * 空间绘制
+     */
+    private Integer sceneDraw;
+
+    //动态面板
+    private int dynamicPanel;
+
 
 }

+ 30 - 2
src/main/java/com/fdkankan/scene/controller/SceneAsynOperLogController.java

@@ -1,6 +1,14 @@
 package com.fdkankan.scene.controller;
 
 
+import com.fdkankan.scene.annotation.CheckPermit;
+import com.fdkankan.scene.service.ISceneAsynOperLogService;
+import com.fdkankan.scene.vo.SceneAsynOperLogParamVO;
+import com.fdkankan.web.response.ResultData;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.validation.annotation.Validated;
+import org.springframework.web.bind.annotation.PostMapping;
+import org.springframework.web.bind.annotation.RequestBody;
 import org.springframework.web.bind.annotation.RequestMapping;
 
 import org.springframework.web.bind.annotation.RestController;
@@ -10,12 +18,32 @@ import org.springframework.web.bind.annotation.RestController;
  *  前端控制器
  * </p>
  *
- * @author 
+ * @author
  * @since 2022-12-07
  */
 @RestController
-@RequestMapping("/scene/sceneAsynOperLog")
+@RequestMapping("/service/scene/edit")
 public class SceneAsynOperLogController {
 
+    @Autowired
+    private ISceneAsynOperLogService sceneAsynOperLogService;
+
+
+    /**
+     * <p>
+     查询异步操作
+     * </p>
+     * @author dengsixing
+     * @date 2022/10/19
+     * @param param
+     * @return com.fdkankan.common.response.ResultData
+     **/
+    @CheckPermit
+    @PostMapping("/getAsynOperLog")
+    public ResultData getAsynOperLog(@RequestBody @Validated SceneAsynOperLogParamVO param){
+        return sceneAsynOperLogService.getAsynOperLog(param);
+    }
+
+
 }
 

+ 14 - 0
src/main/java/com/fdkankan/scene/controller/SceneController.java

@@ -3,6 +3,7 @@ package com.fdkankan.scene.controller;
 
 import com.fdkankan.common.constant.SceneInfoReqType;
 import com.fdkankan.scene.annotation.CheckPermit;
+import com.fdkankan.scene.service.ISceneDynamicPanelService;
 import com.fdkankan.scene.service.ISceneService;
 import com.fdkankan.web.response.ResultData;
 import com.fdkankan.scene.service.ISceneEditInfoService;
@@ -35,6 +36,8 @@ public class SceneController extends BaseController {
     private IScenePlusService scenePlusService;
     @Autowired
     private ISceneService sceneService;
+    @Autowired
+    private ISceneDynamicPanelService sceneDynamicPanelService;
 
     /**
      * <p>
@@ -101,5 +104,16 @@ public class SceneController extends BaseController {
         return sceneService.getBodySegmentStatus(uuid);
     }
 
+    /**
+     * 查询是否有动态面板数据
+     * @param num
+     * @return
+     */
+    @GetMapping("/checkDynamicPanel")
+    public ResultData checkDynamicPanel(@RequestParam("num") String num){
+       return ResultData.ok(sceneDynamicPanelService.checkDynamicPanel(num));
+    }
+
+
 }
 

+ 53 - 0
src/main/java/com/fdkankan/scene/controller/SceneDynamicPanelController.java

@@ -0,0 +1,53 @@
+package com.fdkankan.scene.controller;
+
+
+import com.fdkankan.scene.annotation.CheckPermit;
+import com.fdkankan.scene.service.ISceneDynamicPanelService;
+import com.fdkankan.scene.vo.BaseJsonDataParamVO;
+import com.fdkankan.web.response.ResultData;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.web.bind.annotation.*;
+
+import javax.validation.Valid;
+
+/**
+ * <p>
+ * 场景动态面板 前端控制器
+ * </p>
+ *
+ * @author
+ * @since 2024-05-21
+ */
+@RestController
+@RequestMapping("/service/scene/edit/dynamicPanel")
+public class SceneDynamicPanelController {
+
+    @Autowired
+    private ISceneDynamicPanelService sceneDynamicPanelService;
+
+    /**
+     * 获取动态面板列表
+     * @param num
+     * @return
+     */
+    @CheckPermit
+    @GetMapping("/list")
+    public ResultData list(@RequestParam("num") String num){
+        return ResultData.ok(sceneDynamicPanelService.list(num));
+    }
+
+    /**
+     * 修改动态面板
+     * @param param
+     * @return
+     */
+    @CheckPermit
+    @PostMapping("/update")
+    public ResultData update(@RequestBody @Valid BaseJsonDataParamVO param){
+        sceneDynamicPanelService.update(param);
+        return ResultData.ok();
+    }
+
+
+}
+

+ 38 - 23
src/main/java/com/fdkankan/scene/controller/SceneEditController.java

@@ -196,8 +196,8 @@ public class SceneEditController extends BaseController {
      **/
     @CheckPermit
     @PostMapping(value = "/downloadModel")
-    public ResultData downloadTexData(@RequestParam("num") String num) throws Exception {
-        return sceneProService.downloadTexData(num);
+    public ResultData downloadModel(@RequestParam("num") String num) throws Exception {
+        return sceneProService.downloadModel(num);
     }
 
     /**
@@ -212,20 +212,20 @@ public class SceneEditController extends BaseController {
      **/
     @CheckPermit
     @PostMapping(value = "/uploadModel")
-    public ResultData uploadObjAndImg(@RequestParam("num") String num, @RequestParam("file") MultipartFile file) throws Exception {
-        return sceneProService.uploadObjAndImg(num, file);
+    public ResultData uploadModel(@RequestParam("num") String num, @RequestParam("file") MultipartFile file) throws Exception {
+        return sceneProService.uploadModel(num, file);
     }
 
     /**
      * <p>
      保存关联全景图
-     * </p>      
+     * </p>
      * @author dengsixing
-     * @date 2022/8/1 
+     * @date 2022/8/1
      * @param num
      * @param sid
      * @param fileName
-     * @param file 
+     * @param file
      * @return com.fdkankan.web.response.ResultData
      **/
     @CheckPermit
@@ -315,6 +315,36 @@ public class SceneEditController extends BaseController {
 
     /**
      * <p>
+     保存户型图
+     * </p>
+     * @author dengsixing
+     * @date 2022/1/20
+     * @param param
+     * @return com.fdkankan.web.response.ResultData
+     **/
+    @CheckPermit
+    @GetMapping(value = "/cad/dxf/download")
+    public ResultData saveCadDxf(@RequestParam String num) throws Exception{
+        return sceneEditInfoService.downloadDxf(num);
+    }
+
+    /**
+     * <p>
+     保存户型图
+     * </p>
+     * @author dengsixing
+     * @date 2022/1/20
+     * @param param
+     * @return com.fdkankan.web.response.ResultData
+     **/
+    @CheckPermit
+    @PostMapping(value = "/cad/dxf/upload")
+    public ResultData uploadDxf(@RequestParam MultipartFile file, @RequestParam String num) throws Exception{
+        return sceneEditInfoService.uploadDxf(file, num);
+    }
+
+    /**
+     * <p>
      重置户型图
      * </p>
      * @author dengsixing
@@ -748,7 +778,7 @@ public class SceneEditController extends BaseController {
      **/
     @CheckPermit
     @PostMapping("/surveillance/save")
-    ResultData saveSurveillance(@RequestBody @Validated SurveillanceParamVO param){
+    ResultData saveSurveillance(@RequestBody @Validated SurveillanceParamVO param) throws Exception {
         return surveillanceService.saveSurveillance(param);
     }
 
@@ -824,21 +854,6 @@ public class SceneEditController extends BaseController {
     }
 
     /**
-     * <p>
-     删除空间模型
-     * </p>
-     * @author dengsixing
-     * @date 2022/10/19
-     * @param param
-     * @return com.fdkankan.common.response.ResultData
-     **/
-    @CheckPermit
-    @PostMapping("/getAsynOperLog")
-    public ResultData getAsynOperLog(@RequestBody @Validated SceneAsynOperLogParamVO param){
-        return sceneAsynOperLogService.getAsynOperLog(param);
-    }
-
-    /**
      * 获取编辑器版本信息
      * @return
      */

+ 53 - 0
src/main/java/com/fdkankan/scene/controller/SceneEditDrawController.java

@@ -0,0 +1,53 @@
+package com.fdkankan.scene.controller;
+
+import com.fdkankan.common.constant.ErrorCode;
+import com.fdkankan.common.constant.SceneInfoReqType;
+import com.fdkankan.common.exception.BusinessException;
+import com.fdkankan.scene.annotation.CheckPermit;
+import com.fdkankan.scene.service.*;
+import com.fdkankan.scene.vo.*;
+import com.fdkankan.web.controller.BaseController;
+import com.fdkankan.web.response.ResultData;
+import lombok.extern.log4j.Log4j2;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.beans.factory.annotation.Value;
+import org.springframework.validation.annotation.Validated;
+import org.springframework.web.bind.annotation.*;
+import org.springframework.web.multipart.MultipartFile;
+
+import java.io.IOException;
+
+/**
+ * 场景编辑管理
+ */
+@Log4j2
+@RestController
+@RequestMapping("/service/scene/edit/sceneDraw")
+public class SceneEditDrawController extends BaseController {
+
+    @Autowired
+    private ISceneDrawService sceneDrawService;
+
+    @CheckPermit
+    @GetMapping(value = "/list")
+    public ResultData listSceneDraw(@RequestParam("num") String num) throws Exception {
+        return ResultData.ok(sceneDrawService.listSceneDraw(num));
+    }
+
+    @CheckPermit
+    @PostMapping(value = "/save")
+    public ResultData saveSceneDraw(@RequestBody @Validated BaseJsonArrayParamVO param) throws Exception {
+        sceneDrawService.saveSceneDraw(param);
+        return ResultData.ok();
+    }
+
+    @CheckPermit
+    @PostMapping(value = "/delete")
+    public ResultData deleteSceneDraw(@RequestBody @Validated DeleteSidListParamVO param) throws Exception {
+        sceneDrawService.deleteSceneDraw(param);
+        return ResultData.ok();
+    }
+
+
+
+}

+ 66 - 0
src/main/java/com/fdkankan/scene/entity/SceneDynamicPanel.java

@@ -0,0 +1,66 @@
+package com.fdkankan.scene.entity;
+
+import com.baomidou.mybatisplus.annotation.IdType;
+import com.baomidou.mybatisplus.annotation.TableField;
+import com.baomidou.mybatisplus.annotation.TableId;
+import com.baomidou.mybatisplus.annotation.TableLogic;
+import com.baomidou.mybatisplus.annotation.TableName;
+import java.io.Serializable;
+import java.util.Date;
+import lombok.Getter;
+import lombok.Setter;
+
+/**
+ * <p>
+ * 场景动态面板
+ * </p>
+ *
+ * @author
+ * @since 2024-05-21
+ */
+@Getter
+@Setter
+@TableName("t_scene_dynamic_panel")
+public class SceneDynamicPanel implements Serializable {
+
+    private static final long serialVersionUID = 1L;
+
+    /**
+     * 主键
+     */
+    @TableId(value = "id", type = IdType.AUTO)
+    private Long id;
+
+    /**
+     * 场景码
+     */
+    @TableField("num")
+    private String num;
+
+    /**
+     * sid
+     */
+    @TableField("sid")
+    private String sid;
+
+    /**
+     * 创建时间
+     */
+    @TableField("create_time")
+    private Date createTime;
+
+    /**
+     * 更新时间
+     */
+    @TableField("update_time")
+    private Date updateTime;
+
+    /**
+     * 删除状态(A-可用,I删除)
+     */
+    @TableField("rec_status")
+    @TableLogic(value = "A", delval = "I")
+    private String recStatus;
+
+
+}

+ 15 - 2
src/main/java/com/fdkankan/scene/entity/SceneEditControls.java

@@ -9,10 +9,10 @@ import java.util.Date;
 
 /**
  * <p>
- * 
+ *
  * </p>
  *
- * @author 
+ * @author
  * @since 2022-01-20
  */
 @Getter
@@ -137,6 +137,19 @@ public class SceneEditControls implements Serializable {
     @TableField("show_link_title")
     private Integer showLinkTitle;
 
+    /**
+     * 是否显示空间绘制标题
+     */
+    @TableField("show_draw_title")
+    private Integer showDrawTitle;
+
+    /**
+     * 是否显示全部模型
+     */
+    @TableField("show_all_model")
+    private Integer showAllModel;
+
+
 
     /**
      * 创建时间

+ 8 - 2
src/main/java/com/fdkankan/scene/entity/SceneEditInfoExt.java

@@ -11,10 +11,10 @@ import lombok.Setter;
 
 /**
  * <p>
- * 
+ *
  * </p>
  *
- * @author 
+ * @author
  * @since 2022-03-07
  */
 @Getter
@@ -103,6 +103,12 @@ public class SceneEditInfoExt {
     private Integer cutModel;
 
     /**
+     * 是否有指示牌(0-否,1-是)
+     */
+    @TableField("scene_draw")
+    private Integer sceneDraw;
+
+    /**
      * 分享配置信息
      */
     @TableField("sns_info")

+ 4 - 1
src/main/java/com/fdkankan/scene/entity/SceneResource.java

@@ -12,7 +12,7 @@ import java.util.Date;
  * 场景资源表
  * </p>
  *
- * @author 
+ * @author
  * @since 2022-01-20
  */
 @Getter
@@ -55,6 +55,9 @@ public class SceneResource implements Serializable {
     @TableField("description")
     private String description;
 
+    @TableField("version")
+    private String version;
+
     /**
      * 创建时间
      */

+ 1 - 1
src/main/java/com/fdkankan/scene/generate/AutoGenerate.java

@@ -18,7 +18,7 @@ public class AutoGenerate {
         String path =System.getProperty("user.dir");
 
         generate(path,"scene", getTables(new String[]{
-                "t_scene_cold_storage"
+                "t_scene_dynamic_panel"
         }));
 
 //        generate(path,"goods", getTables(new String[]{

+ 18 - 0
src/main/java/com/fdkankan/scene/mapper/ISceneDynamicPanelMapper.java

@@ -0,0 +1,18 @@
+package com.fdkankan.scene.mapper;
+
+import com.fdkankan.scene.entity.SceneDynamicPanel;
+import com.baomidou.mybatisplus.core.mapper.BaseMapper;
+import org.apache.ibatis.annotations.Mapper;
+
+/**
+ * <p>
+ * 场景动态面板 Mapper 接口
+ * </p>
+ *
+ * @author 
+ * @since 2024-05-21
+ */
+@Mapper
+public interface ISceneDynamicPanelMapper extends BaseMapper<SceneDynamicPanel> {
+
+}

+ 13 - 2
src/main/java/com/fdkankan/scene/schedule/ScheduleJob.java

@@ -1,5 +1,6 @@
 package com.fdkankan.scene.schedule;
 
+import com.fdkankan.common.constant.SceneAsynFuncType;
 import com.fdkankan.redis.constant.RedisLockKey;
 import com.fdkankan.redis.util.RedisLockUtil;
 import com.fdkankan.scene.service.ISceneAsynOperLogService;
@@ -29,15 +30,25 @@ public class ScheduleJob {
     private RedisLockUtil redisLockUtil;
 
     /**
-     * 每天凌晨一点执行
+     * 清除异步批量下载全景图OSS压缩包
      */
     @Scheduled(cron="0 0 1 * * ?")
     public void cleanDownloadPanorama() {
         log.info("定时清除全景图压缩包开始");
-        sceneAsynOperLogService.cleanDownloadPanorama();
+        sceneAsynOperLogService.cleanDownloadOssPage(SceneAsynFuncType.PANORAMIC_IMAGE.code(), 1);
         log.info("定时清除全景图压缩包完毕");
     }
 
+    /**
+     * 清除异步批量下载全景图OSS压缩包
+     */
+    @Scheduled(cron="0 0 1 * * ?")
+    public void cleanDownloadModel() {
+        log.info("定时清除模型压缩包开始");
+        sceneAsynOperLogService.cleanDownloadOssPage(SceneAsynFuncType.MODEL.code(), 1);
+        log.info("定时清除模型压缩包完毕");
+    }
+
 //    /**
 //     * 删除场景原始资源
 //     * 每天凌晨执行

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

@@ -0,0 +1,9 @@
+package com.fdkankan.scene.service;
+
+public interface ICommonService {
+
+    void transferToFlv(String num, String fileName, String bucket) throws Exception;
+
+
+
+}

+ 8 - 2
src/main/java/com/fdkankan/scene/service/ISceneAsynOperLogService.java

@@ -1,5 +1,7 @@
 package com.fdkankan.scene.service;
 
+import com.fdkankan.common.constant.SceneAsynFuncType;
+import com.fdkankan.common.constant.SceneAsynOperType;
 import com.fdkankan.scene.entity.SceneAsynOperLog;
 import com.baomidou.mybatisplus.extension.service.IService;
 import com.fdkankan.scene.vo.SceneAsynOperLogParamVO;
@@ -12,13 +14,17 @@ import org.springframework.web.bind.annotation.RequestBody;
  *  服务类
  * </p>
  *
- * @author 
+ * @author
  * @since 2022-12-07
  */
 public interface ISceneAsynOperLogService extends IService<SceneAsynOperLog> {
 
     ResultData getAsynOperLog(SceneAsynOperLogParamVO param);
 
-    void cleanDownloadPanorama();
+    void cleanDownloadOssPage(String asynFuncType, int preMonth);
+
+    void checkSceneAsynOper(String num, String operType, String module, String function);
+
+    void cleanLog(String num, String moduleType, String funcType, String... operTypes);
 
 }

+ 20 - 0
src/main/java/com/fdkankan/scene/service/ISceneDrawService.java

@@ -0,0 +1,20 @@
+package com.fdkankan.scene.service;
+
+import com.alibaba.fastjson.JSONObject;
+import com.fdkankan.scene.vo.BaseJsonArrayParamVO;
+import com.fdkankan.scene.vo.DeleteSidListParamVO;
+
+import java.io.IOException;
+import java.util.List;
+
+public interface ISceneDrawService {
+
+    void saveSceneDraw(BaseJsonArrayParamVO param) throws Exception;
+
+    List<JSONObject> listSceneDraw(String num) throws Exception;
+
+    void deleteSceneDraw(DeleteSidListParamVO param) throws Exception;
+
+    void publicSceneDraw(String sceneNum, String bucket) throws IOException;
+
+}

+ 25 - 0
src/main/java/com/fdkankan/scene/service/ISceneDynamicPanelService.java

@@ -0,0 +1,25 @@
+package com.fdkankan.scene.service;
+
+import com.fdkankan.scene.entity.SceneDynamicPanel;
+import com.baomidou.mybatisplus.extension.service.IService;
+import com.fdkankan.scene.vo.BaseJsonDataParamVO;
+import com.fdkankan.scene.vo.SceneDynamicPanelVO;
+
+import java.util.List;
+
+/**
+ * <p>
+ * 场景动态面板 服务类
+ * </p>
+ *
+ * @author
+ * @since 2024-05-21
+ */
+public interface ISceneDynamicPanelService extends IService<SceneDynamicPanel> {
+
+    List<SceneDynamicPanelVO> list(String num);
+
+    void update(BaseJsonDataParamVO param);
+
+    Byte checkDynamicPanel(String num);
+}

+ 5 - 1
src/main/java/com/fdkankan/scene/service/ISceneEditInfoService.java

@@ -33,7 +33,7 @@ import org.springframework.web.multipart.MultipartFile;
  *  服务类
  * </p>
  *
- * @author 
+ * @author
  * @since 2022-01-18
  */
 public interface ISceneEditInfoService extends IService<SceneEditInfo> {
@@ -52,6 +52,10 @@ public interface ISceneEditInfoService extends IService<SceneEditInfo> {
 
     ResultData saveCad(BaseDataParamVO param) throws Exception;
 
+    ResultData uploadDxf(MultipartFile file, String num) throws Exception;
+
+    ResultData downloadDxf(String num) throws Exception;
+
     ResultData resetCad(String num) throws IOException;
 
     ResultData renameCad(RenameCadParamVO param) throws IOException;

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

@@ -46,9 +46,9 @@ public interface ISceneProService extends IService<ScenePro> {
 
     void updateUserIdByCameraId(Long userId, Long cameraId);
 
-    ResultData uploadObjAndImg(String num, MultipartFile file) throws Exception;
+    ResultData uploadModel(String num, MultipartFile file) throws Exception;
 
-    ResultData downloadTexData(String num) throws Exception;
+    ResultData downloadModel(String num) throws Exception;
 
     ScenePro getByNum(String num);
 

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

@@ -17,4 +17,6 @@ public interface ISceneResourceService extends IService<SceneResource> {
 
     List<SceneResource> findByCooperationId(Long id);
 
+    long countByVersion(String version);
+
 }

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

@@ -15,12 +15,12 @@ import java.util.List;
  * 监控推拉流信息 服务类
  * </p>
  *
- * @author 
+ * @author
  * @since 2022-09-16
  */
 public interface ISurveillanceService extends IService<Surveillance> {
 
-    ResultData saveSurveillance(SurveillanceParamVO param);
+    ResultData saveSurveillance(SurveillanceParamVO param) throws Exception;
 
     ResultData deleteSurveillance(BaseSidParamVO param) throws IOException;
 

+ 47 - 0
src/main/java/com/fdkankan/scene/service/impl/CommonServiceImpl.java

@@ -0,0 +1,47 @@
+package com.fdkankan.scene.service.impl;
+
+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.scene.service.ICommonService;
+import org.springframework.stereotype.Service;
+
+import javax.annotation.Resource;
+import java.io.File;
+
+@Service
+public class CommonServiceImpl implements ICommonService {
+
+    @Resource
+    private FYunFileServiceInterface fYunFileService;
+
+    @Override
+    public void transferToFlv(String num, String fileName, String bucket) throws Exception {
+        String userEditPath = String.format(UploadFilePath.USER_EDIT_PATH, num);
+        String localImagesPath = String.format(ConstantFilePath.SCENE_USER_PATH_V4, num);
+        String localFilePath = localImagesPath + fileName;
+
+        File targetFile = new File(localImagesPath);
+        if (!targetFile.exists()){
+            targetFile.mkdirs();
+        }
+
+        targetFile = new File(localFilePath);
+        if (targetFile.exists()){
+            FileUtils.deleteFile(localFilePath);
+        }
+
+        //从用户编辑目录中下载视频到本地
+        String filePath = userEditPath + fileName;
+        fYunFileService.downloadFile(bucket, filePath, localImagesPath + fileName);
+
+        //视频格式转换
+        CreateObjUtil.mp4ToFlv(localFilePath, localFilePath.replace("mp4", "flv"));
+
+        //上传
+        String flvFileName = fileName.replace("mp4", "flv");
+        fYunFileService.uploadFile(bucket, localFilePath.replace("mp4", "flv"), userEditPath+flvFileName);
+    }
+}

+ 1 - 0
src/main/java/com/fdkankan/scene/service/impl/CutModelServiceImpl.java

@@ -147,6 +147,7 @@ public class CutModelServiceImpl implements ICutModelService {
         return ResultData.ok();
     }
 
+    @Override
     public void publicCutModel(String sceneNum, String bucket) throws IOException {
         String Key = String.format(RedisKey.SCENE_CUT_MODEL, sceneNum);
         String userEditPath = String.format(UploadFilePath.USER_EDIT_PATH, sceneNum) + "cutModel.json";

+ 44 - 12
src/main/java/com/fdkankan/scene/service/impl/SceneAsynOperLogServiceImpl.java

@@ -3,14 +3,12 @@ package com.fdkankan.scene.service.impl;
 import cn.hutool.core.collection.CollUtil;
 import cn.hutool.core.date.DateTime;
 import cn.hutool.core.date.DateUtil;
+import cn.hutool.core.util.ArrayUtil;
 import cn.hutool.core.util.StrUtil;
 import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
 import com.baomidou.mybatisplus.core.conditions.update.LambdaUpdateWrapper;
-import com.fdkankan.common.constant.CommonOperStatus;
-import com.fdkankan.common.constant.CommonStatus;
-import com.fdkankan.common.constant.SceneAsynFuncType;
-import com.fdkankan.common.constant.SceneAsynModuleType;
-import com.fdkankan.common.constant.SceneAsynOperType;
+import com.fdkankan.common.constant.*;
+import com.fdkankan.common.exception.BusinessException;
 import com.fdkankan.fyun.face.FYunFileServiceInterface;
 import com.fdkankan.scene.entity.SceneAsynOperLog;
 import com.fdkankan.scene.mapper.ISceneAsynOperLogMapper;
@@ -19,6 +17,7 @@ import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
 import com.fdkankan.scene.vo.SceneAsynOperLogParamVO;
 import com.fdkankan.web.response.ResultData;
 import java.io.IOException;
+import java.util.Arrays;
 import java.util.Calendar;
 import java.util.List;
 import java.util.stream.Collectors;
@@ -31,7 +30,7 @@ import org.springframework.stereotype.Service;
  *  服务实现类
  * </p>
  *
- * @author 
+ * @author
  * @since 2022-12-07
  */
 @Slf4j
@@ -79,20 +78,20 @@ public class SceneAsynOperLogServiceImpl extends ServiceImpl<ISceneAsynOperLogMa
     }
 
     @Override
-    public void cleanDownloadPanorama() {
+    public void cleanDownloadOssPage(String asynFuncType, int preMonth) {
 
         List<SceneAsynOperLog> downloadList = this.list(
             new LambdaQueryWrapper<SceneAsynOperLog>()
                 .eq(SceneAsynOperLog::getOperType, SceneAsynOperType.DOWNLOAD.code())
                 .eq(SceneAsynOperLog::getModule, SceneAsynModuleType.UPLOAD_DOWNLOAD.code())
-                .eq(SceneAsynOperLog::getFunc, SceneAsynFuncType.PANORAMIC_IMAGE.code()));
+                .eq(SceneAsynOperLog::getFunc, asynFuncType));
         if(CollUtil.isEmpty(downloadList)){
             return;
         }
-        DateTime preMonth = DateUtil.offsetMonth(Calendar.getInstance().getTime(), -1);
+        DateTime preDate = DateUtil.offsetMonth(Calendar.getInstance().getTime(), -preMonth);
         List<SceneAsynOperLog> deleteList = downloadList.parallelStream().filter(log -> {
-            if (log.getCreateTime().before(preMonth)) {
-                return Boolean.TRUE;
+            if (log.getCreateTime().before(preDate)) {
+                return true;
             }
             return false;
         }).collect(Collectors.toList());
@@ -109,10 +108,43 @@ public class SceneAsynOperLogServiceImpl extends ServiceImpl<ISceneAsynOperLogMa
                 try {
                     fYunFileService.deleteFile(item.getUrl());
                 } catch (IOException e) {
-                    log.warn("删除oss全景图下载压缩包失败,key:{}", item.getUrl());
+                    log.warn("删除oss下载压缩包失败,key:{}", item.getUrl());
                 }
             }
         });
 
     }
+
+    @Override
+    public void checkSceneAsynOper(String num, String operType, String module, String function) {
+        LambdaQueryWrapper<SceneAsynOperLog> queryWrapper =
+                new LambdaQueryWrapper<SceneAsynOperLog>()
+                        .eq(SceneAsynOperLog::getNum,num)
+                        .eq(SceneAsynOperLog::getState, CommonOperStatus.WAITING.code());
+        if(StrUtil.isNotEmpty(operType)){
+            queryWrapper.eq(SceneAsynOperLog::getOperType, operType);
+        }
+        if(StrUtil.isNotEmpty(module)){
+            queryWrapper.eq(SceneAsynOperLog::getModule, module);
+        }
+        if(StrUtil.isNotEmpty(function)){
+            queryWrapper.eq(SceneAsynOperLog::getFunc, function);
+        }
+        List<SceneAsynOperLog> waittingLogList = this.list(queryWrapper);
+        if(CollUtil.isNotEmpty(waittingLogList)){
+            throw new BusinessException(ErrorCode.FAILURE_CODE_5066);
+        }
+    }
+
+    @Override
+    public void cleanLog(String num, String moduleType, String funcType, String... operTypes) {
+        LambdaQueryWrapper<SceneAsynOperLog> wrapper = new LambdaQueryWrapper<SceneAsynOperLog>()
+                .eq(SceneAsynOperLog::getNum, num)
+                .eq(SceneAsynOperLog::getModule, moduleType)
+                .eq(SceneAsynOperLog::getFunc, funcType);
+        if(ArrayUtil.isNotEmpty(operTypes)){
+            wrapper.in(SceneAsynOperLog::getOperType, operTypes);
+        }
+        this.remove(wrapper);
+    }
 }

+ 244 - 0
src/main/java/com/fdkankan/scene/service/impl/SceneDrawServiceImpl.java

@@ -0,0 +1,244 @@
+package com.fdkankan.scene.service.impl;
+
+import cn.hutool.core.collection.CollUtil;
+import cn.hutool.core.io.FileUtil;
+import cn.hutool.core.util.StrUtil;
+import com.alibaba.fastjson.JSON;
+import com.alibaba.fastjson.JSONArray;
+import com.alibaba.fastjson.JSONObject;
+import com.baomidou.mybatisplus.core.conditions.update.LambdaUpdateWrapper;
+import com.fdkankan.common.constant.CommonStatus;
+import com.fdkankan.common.constant.ErrorCode;
+import com.fdkankan.common.constant.FileBizType;
+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.redis.constant.RedisKey;
+import com.fdkankan.redis.constant.RedisLockKey;
+import com.fdkankan.redis.util.RedisLockUtil;
+import com.fdkankan.redis.util.RedisUtil;
+import com.fdkankan.scene.bean.TagBean;
+import com.fdkankan.scene.entity.SceneEditInfoExt;
+import com.fdkankan.scene.entity.ScenePlus;
+import com.fdkankan.scene.entity.ScenePlusExt;
+import com.fdkankan.scene.service.*;
+import com.fdkankan.scene.vo.BaseJsonArrayParamVO;
+import com.fdkankan.scene.vo.DeleteFileParamVO;
+import com.fdkankan.scene.vo.DeleteSidListParamVO;
+import com.fdkankan.web.response.ResultData;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.stereotype.Service;
+
+import javax.annotation.Resource;
+import java.io.IOException;
+import java.util.*;
+import java.util.stream.Collectors;
+
+@Service
+public class SceneDrawServiceImpl implements ISceneDrawService {
+
+    private final String SCENE_DRAW_JSON_NAME = "sceneDraw.json";
+
+    @Autowired
+    private IScenePlusService scenePlusService;
+    @Autowired
+    private IScenePlusExtService scenePlusExtService;
+    @Autowired
+    private RedisUtil redisUtil;
+    @Autowired
+    private RedisLockUtil redisLockUtil;
+    @Autowired
+    private ISceneEditInfoExtService sceneEditInfoExtService;
+    @Autowired
+    private ISceneEditInfoService sceneEditInfoService;
+    @Resource
+    private FYunFileServiceInterface fYunFileService;
+
+    @Override
+    public void saveSceneDraw(BaseJsonArrayParamVO param) throws Exception {
+
+        ScenePlus scenePlus = scenePlusService.getScenePlusByNum(param.getNum());
+
+        this.addOrUpdate(param.getNum(), param.getData());
+
+        //保存数据库
+        SceneEditInfoExt sceneEditInfoExt = sceneEditInfoExtService.getByScenePlusId(scenePlus.getId());
+        this.updateDb(param.getNum(), scenePlus.getId());
+
+        sceneEditInfoService.upgradeVersionById(sceneEditInfoExt.getEditInfoId());
+    }
+
+    private void updateDb(String num, Long scenePlusId){
+        //查询缓存是否包含热点数据
+        String key = String.format(RedisKey.SCENE_DRAW, num);
+        Map<String, String> map = redisUtil.hmget(key);
+        boolean hasSceneDraw= false;
+        for (Map.Entry<String, String> tagMap : map.entrySet()) {
+            if(StrUtil.isEmpty(tagMap.getValue())){
+                continue;
+            }
+            hasSceneDraw = true;
+            break;
+        }
+
+        //更改热点状态
+        sceneEditInfoExtService.update(
+                new LambdaUpdateWrapper<SceneEditInfoExt>()
+                        .set(SceneEditInfoExt::getSceneDraw, hasSceneDraw ? CommonStatus.YES.code().intValue() : CommonStatus.NO.code().intValue())
+                        .eq(SceneEditInfoExt::getScenePlusId,scenePlusId));
+    }
+
+    private void addOrUpdate(String num, List<JSONObject> data) throws Exception{
+        Map<String, String> addOrUpdateMap = new HashMap<>();
+        int i = 0;
+        for (JSONObject jsonObject : data) {
+            jsonObject.put("createTime", Calendar.getInstance().getTimeInMillis() + i++);
+            addOrUpdateMap.put(jsonObject.getString("sid"), JSON.toJSONString(jsonObject));
+        }
+
+        this.syncFileToRedis(num);
+
+        //处理新增和修改数据
+        this.addOrUpdateHandler(num, addOrUpdateMap);
+    }
+
+    private void addOrUpdateHandler(String num, Map<String, String> addOrUpdateMap){
+        if(CollUtil.isEmpty(addOrUpdateMap))
+            return;
+
+        //批量写入缓存
+        String key = String.format(RedisKey.SCENE_DRAW, num);
+        redisUtil.hmset(key, addOrUpdateMap);
+
+        //写入本地文件,作为备份
+        this.writeFile(num);
+    }
+
+    private void writeFile(String num){
+        String lockKey = String.format(RedisLockKey.LOCK_SCENE_DRAW, num);
+        String lockVal = cn.hutool.core.lang.UUID.randomUUID().toString();
+        boolean lock = redisLockUtil.lock(lockKey, lockVal, RedisKey.EXPIRE_TIME_1_MINUTE);
+        if(!lock){
+            return;
+        }
+        try{
+            String dataKey = String.format(RedisKey.SCENE_DRAW, num);
+            String sceneDrawJsonPath = String.format(ConstantFilePath.SCENE_USER_PATH_V4, num) + SCENE_DRAW_JSON_NAME;
+            if(!redisUtil.hasKey(dataKey)){
+                FileUtil.del(sceneDrawJsonPath);
+                return;
+            }
+            Map<String, String> map = redisUtil.hmget(dataKey);
+            List<JSONObject>  list = map.entrySet().stream().map(entry->JSON.parseObject(entry.getValue())).collect(Collectors.toList());
+            FileUtil.writeUtf8String(JSON.toJSONString(list), sceneDrawJsonPath);
+        }finally {
+            redisLockUtil.unlockLua(lockKey, lockVal);
+        }
+    }
+
+    private void syncFileToRedis(String num) throws Exception{
+
+        String key = String.format(RedisKey.SCENE_DRAW, num);
+        boolean exist = redisUtil.hasKey(key);
+        if(exist){
+            return;
+        }
+        String lockKey = String.format(RedisLockKey.LOCK_SCENE_DRAW, num);
+        String lockVal = cn.hutool.core.lang.UUID.randomUUID().toString();
+        boolean lock = redisLockUtil.lock(lockKey, lockVal, RedisKey.EXPIRE_TIME_1_MINUTE);
+        if(!lock){
+            throw new BusinessException(ErrorCode.SYSTEM_BUSY);
+        }
+        try{
+            exist = redisUtil.hasKey(key);
+            if(exist){
+                return;
+            }
+            String sceneDrawFilePath = String.format(ConstantFilePath.SCENE_USER_PATH_V4, num) + SCENE_DRAW_JSON_NAME;
+            String sceneDrawData = FileUtils.readUtf8String(sceneDrawFilePath);
+            if(StrUtil.isEmpty(sceneDrawData)){
+                return;
+            }
+            JSONArray tagsArr = JSON.parseArray(sceneDrawData);
+            if(CollUtil.isEmpty(tagsArr)){
+                return;
+            }
+            Map<String, String> map = new HashMap<>();
+            for (Object o : tagsArr) {
+                JSONObject jo = (JSONObject)o;
+                map.put(jo.getString("sid"), jo.toJSONString());
+            }
+            redisUtil.hmset(key, map);
+        }finally {
+            redisLockUtil.unlockLua(lockKey, lockVal);
+        }
+    }
+
+    @Override
+    public List<JSONObject> listSceneDraw(String num) throws Exception {
+        List<JSONObject> tags = new ArrayList<>();
+        this.syncFileToRedis(num);
+
+        //获取裁剪模型数据
+        String key = String.format(RedisKey.SCENE_DRAW, num);
+        List<String> list = redisUtil.hgetValues(key);
+        if(CollUtil.isNotEmpty(list)){
+            List<TagBean> sortList = list.stream().map(str -> {
+                JSONObject jsonObject = JSON.parseObject(str);
+                TagBean tagBean = new TagBean();
+                tagBean.setCreateTime(jsonObject.getLong("createTime"));
+                jsonObject.remove("createTime");
+                tagBean.setTag(jsonObject);
+                return tagBean;
+            }).collect(Collectors.toList());
+            sortList.sort(Comparator.comparingLong(TagBean::getCreateTime).reversed());
+            tags = sortList.stream().map(item -> item.getTag()).collect(Collectors.toList());
+        }
+
+        return tags;
+    }
+
+    @Override
+    public void deleteSceneDraw(DeleteSidListParamVO param) throws Exception {
+        ScenePlus scenePlus = scenePlusService.getScenePlusByNum(param.getNum());
+        List<String> deleteSidList = param.getSidList();
+        this.syncFileToRedis(param.getNum());
+        //处理删除状态数据
+        this.deleteCache(param.getNum(), deleteSidList);
+        //写入本地文件,作为备份
+        this.writeFile(param.getNum());
+        //保存数据库
+        SceneEditInfoExt sceneEditInfoExt = sceneEditInfoExtService.getByScenePlusId(scenePlus.getId());
+        this.updateDb(param.getNum(), scenePlus.getId());
+        sceneEditInfoService.upgradeVersionById(sceneEditInfoExt.getEditInfoId());
+    }
+
+    private List<String> deleteCache(String num, List<String> deleteSidList) {
+        if(CollUtil.isEmpty(deleteSidList)){
+            return null;
+        }
+
+        //从redis中加载热点数据
+        String key = String.format(RedisKey.SCENE_DRAW, num);
+        List<String> deletDataList = redisUtil.hMultiGet(key, deleteSidList);
+        if(CollUtil.isNotEmpty(deletDataList)){
+            redisUtil.hdel(key, deleteSidList.toArray());
+        }
+        return deletDataList;
+    }
+
+    @Override
+    public void publicSceneDraw(String sceneNum, String bucket) throws IOException {
+        String Key = String.format(RedisKey.SCENE_DRAW, sceneNum);
+        String userEditPath = String.format(UploadFilePath.USER_EDIT_PATH, sceneNum) + SCENE_DRAW_JSON_NAME;
+        List<String> list = redisUtil.hgetValues(Key);
+        if(CollUtil.isEmpty(list)){
+            fYunFileService.deleteFile(bucket, userEditPath);
+            return;
+        }
+        List<JSONObject> collect = list.stream().map(str -> JSON.parseObject(str)).collect(Collectors.toList());
+        fYunFileService.uploadFile(bucket, JSON.toJSONString(collect).getBytes(), userEditPath);
+    }
+}

+ 101 - 0
src/main/java/com/fdkankan/scene/service/impl/SceneDynamicPanelServiceImpl.java

@@ -0,0 +1,101 @@
+package com.fdkankan.scene.service.impl;
+
+import cn.hutool.core.bean.BeanUtil;
+import cn.hutool.core.io.FileUtil;
+import cn.hutool.core.util.StrUtil;
+import com.alibaba.fastjson.JSON;
+import com.alibaba.fastjson.JSONArray;
+import com.alibaba.fastjson.JSONObject;
+import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
+import com.fdkankan.common.constant.CommonStatus;
+import com.fdkankan.common.constant.ErrorCode;
+import com.fdkankan.common.exception.BusinessException;
+import com.fdkankan.fyun.face.FYunFileServiceInterface;
+import com.fdkankan.model.constants.UploadFilePath;
+import com.fdkankan.scene.entity.SceneDynamicPanel;
+import com.fdkankan.scene.entity.SceneEditInfo;
+import com.fdkankan.scene.entity.ScenePlus;
+import com.fdkankan.scene.mapper.ISceneDynamicPanelMapper;
+import com.fdkankan.scene.service.ISceneDynamicPanelService;
+import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
+import com.fdkankan.scene.service.ISceneEditInfoService;
+import com.fdkankan.scene.service.IScenePlusService;
+import com.fdkankan.scene.vo.BaseJsonDataParamVO;
+import com.fdkankan.scene.vo.SceneDynamicPanelVO;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.stereotype.Service;
+
+import javax.annotation.Resource;
+import java.nio.charset.StandardCharsets;
+import java.util.*;
+import java.util.stream.Collectors;
+
+/**
+ * <p>
+ * 场景动态面板 服务实现类
+ * </p>
+ *
+ * @author
+ * @since 2024-05-21
+ */
+@Service
+public class SceneDynamicPanelServiceImpl extends ServiceImpl<ISceneDynamicPanelMapper, SceneDynamicPanel> implements ISceneDynamicPanelService {
+
+    @Resource
+    private FYunFileServiceInterface fileServiceInterface;
+    @Autowired
+    private ISceneEditInfoService sceneEditInfoService;
+    @Autowired
+    private IScenePlusService scenePlusService;
+
+    @Override
+    public List<SceneDynamicPanelVO> list(String num) {
+        List<SceneDynamicPanel> list = this.list(new LambdaQueryWrapper<SceneDynamicPanel>().eq(SceneDynamicPanel::getNum, num));
+        return BeanUtil.copyToList(list, SceneDynamicPanelVO.class);
+    }
+
+    @Override
+    public void update(BaseJsonDataParamVO param) {
+        JSONObject data = param.getData();
+        String sid = data.getString("sid");
+        if(StrUtil.isEmpty(sid)){
+            throw new BusinessException(ErrorCode.FAILURE_CODE_3001, "sid can not be null");
+        }
+
+        ScenePlus scenePlus = scenePlusService.getScenePlusByNum(param.getNum());
+        SceneDynamicPanel one = this.getOne(new LambdaQueryWrapper<SceneDynamicPanel>().eq(SceneDynamicPanel::getNum, param.getNum()).eq(SceneDynamicPanel::getSid, sid));
+        if(Objects.isNull(one)){
+            throw new BusinessException(ErrorCode.FAILURE_CODE_3001, "sid error");
+        }
+
+        //上传文件
+        String editPath = String.format(UploadFilePath.USER_EDIT_PATH, param.getNum()) + "dynamicPanel.json";
+        String viewPath = String.format(UploadFilePath.USER_VIEW_PATH, param.getNum()) + "dynamicPanel.json";
+
+        String fileContent = fileServiceInterface.getFileContent(editPath);
+        JSONArray jsonArray = JSON.parseArray(fileContent);
+        Map<String, JSONObject> map = new HashMap<>();
+        jsonArray.stream().forEach(v->{
+            JSONObject obj = (JSONObject) v;
+            map.put(obj.getString("sid"), obj);
+        });
+        JSONObject oldObj = map.get(sid);
+        if(Objects.nonNull(oldObj)){
+            data.put("text", oldObj.get("text"));
+        }
+        map.put(sid, data);
+        Collection<JSONObject> values = map.values();
+        fileServiceInterface.uploadFile(JSON.toJSONString(values).getBytes(StandardCharsets.UTF_8), editPath);
+        fileServiceInterface.uploadFile(JSON.toJSONString(values).getBytes(StandardCharsets.UTF_8), viewPath);
+
+        //更新版本号
+        SceneEditInfo sceneEditInfo = sceneEditInfoService.getByScenePlusId(scenePlus.getId());
+        sceneEditInfoService.upgradeVersionById(sceneEditInfo.getId());
+    }
+
+    @Override
+    public Byte checkDynamicPanel(String num) {
+        Long count = this.count(new LambdaQueryWrapper<SceneDynamicPanel>().eq(SceneDynamicPanel::getNum, num));
+        return count > 0 ? CommonStatus.YES.code() : CommonStatus.NO.code();
+    }
+}

+ 111 - 129
src/main/java/com/fdkankan/scene/service/impl/SceneEditInfoServiceImpl.java

@@ -1,13 +1,9 @@
 package com.fdkankan.scene.service.impl;
-import cn.hutool.core.util.CharsetUtil;
-import com.fdkankan.common.constant.*;
-import com.fdkankan.common.util.FileSizeUtil;
-import com.fdkankan.scene.service.*;
-import com.fdkankan.scene.vo.SaveFiltersParamVO;
 
 import cn.hutool.core.bean.BeanUtil;
 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;
@@ -17,10 +13,15 @@ import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
 import com.baomidou.mybatisplus.core.conditions.update.LambdaUpdateWrapper;
 import com.baomidou.mybatisplus.core.conditions.update.UpdateWrapper;
 import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
+import com.fdkankan.common.constant.*;
 import com.fdkankan.common.exception.BusinessException;
 import com.fdkankan.common.util.FileMd5Util;
+import com.fdkankan.common.util.FileSizeUtil;
 import com.fdkankan.common.util.FileUtils;
+import com.fdkankan.dxf.parse.utils.FdJsonToDxfUtil;
+import com.fdkankan.fyun.config.FYunFileConfig;
 import com.fdkankan.fyun.face.FYunFileServiceInterface;
+import com.fdkankan.fyun.util.OssFileUtil;
 import com.fdkankan.model.constants.ConstantFilePath;
 import com.fdkankan.model.constants.UploadFilePath;
 import com.fdkankan.model.utils.ComputerUtil;
@@ -31,69 +32,14 @@ import com.fdkankan.redis.constant.RedisKey;
 import com.fdkankan.redis.constant.RedisLockKey;
 import com.fdkankan.redis.util.RedisLockUtil;
 import com.fdkankan.redis.util.RedisUtil;
-import com.fdkankan.scene.bean.BoxPhotoBean;
-import com.fdkankan.scene.bean.PointBean;
-import com.fdkankan.scene.bean.SceneJsonBean;
-import com.fdkankan.scene.bean.SegmentBean;
-import com.fdkankan.scene.bean.StyleBean;
-import com.fdkankan.scene.bean.TagBean;
-import com.fdkankan.scene.bean.VertexBean;
-import com.fdkankan.scene.bean.WallBean;
-import com.fdkankan.scene.entity.CameraDetail;
-import com.fdkankan.scene.entity.Company;
-import com.fdkankan.scene.entity.SceneAsynOperLog;
-import com.fdkankan.scene.entity.SceneDataDownload;
-import com.fdkankan.scene.entity.SceneEditControls;
-import com.fdkankan.scene.entity.SceneEditInfo;
-import com.fdkankan.scene.entity.SceneEditInfoExt;
-import com.fdkankan.scene.entity.ScenePlus;
-import com.fdkankan.scene.entity.ScenePlusExt;
+import com.fdkankan.scene.bean.*;
+import com.fdkankan.scene.entity.*;
 import com.fdkankan.scene.mapper.ISceneEditInfoMapper;
-import com.fdkankan.scene.vo.BallScreenVideoParamVO;
-import com.fdkankan.scene.vo.BaseDataParamVO;
-import com.fdkankan.scene.vo.BaseFileParamVO;
-import com.fdkankan.scene.vo.BaseSceneParamVO;
-import com.fdkankan.scene.vo.DeleteFileParamVO;
-import com.fdkankan.scene.vo.DeleteLinkPanParamVO;
-import com.fdkankan.scene.vo.DeleteStylesParamVO;
-import com.fdkankan.scene.vo.DeleteMosaicParamVO;
-import com.fdkankan.scene.vo.DeleteSidParamVO;
-import com.fdkankan.scene.vo.DownloadVO;
-import com.fdkankan.scene.vo.FileNameAndDataParamVO;
-import com.fdkankan.scene.vo.FileParamVO;
-import com.fdkankan.scene.vo.RenameCadParamVO;
-import com.fdkankan.scene.vo.SaveLinkPanParamVO;
-import com.fdkankan.scene.vo.SceneCheckKeyParamVO;
-import com.fdkankan.scene.vo.SceneEditControlsVO;
-import com.fdkankan.scene.vo.SceneEditInfoParamVO;
-import com.fdkankan.scene.vo.SceneEditInfoVO;
-import com.fdkankan.scene.vo.SceneInfoParamVO;
-import com.fdkankan.scene.vo.SceneInfoVO;
-import com.fdkankan.scene.vo.SurveillanceVO;
-import com.fdkankan.scene.vo.UploadPanoramaVO;
+import com.fdkankan.scene.service.*;
+import com.fdkankan.scene.vo.*;
 import com.fdkankan.web.response.ResultData;
 import com.google.common.collect.Lists;
 import com.google.errorprone.annotations.Var;
-import java.io.File;
-import java.io.IOException;
-import java.nio.charset.StandardCharsets;
-import java.util.ArrayList;
-import java.util.Arrays;
-import java.util.Calendar;
-import java.util.Collection;
-import java.util.Comparator;
-import java.util.HashMap;
-import java.util.HashSet;
-import java.util.List;
-import java.util.Map;
-import java.util.Map.Entry;
-import java.util.Objects;
-import java.util.Set;
-import java.util.UUID;
-import java.util.concurrent.CompletableFuture;
-import java.util.concurrent.atomic.AtomicInteger;
-import java.util.stream.Collectors;
-import javax.annotation.Resource;
 import lombok.extern.slf4j.Slf4j;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.beans.factory.annotation.Value;
@@ -102,12 +48,22 @@ import org.springframework.stereotype.Service;
 import org.springframework.transaction.annotation.Transactional;
 import org.springframework.web.multipart.MultipartFile;
 
+import javax.annotation.Resource;
+import java.io.File;
+import java.io.IOException;
+import java.nio.charset.StandardCharsets;
+import java.util.*;
+import java.util.Map.Entry;
+import java.util.concurrent.CompletableFuture;
+import java.util.concurrent.atomic.AtomicInteger;
+import java.util.stream.Collectors;
+
 /**
  * <p>
  *  服务实现类
  * </p>
  *
- * @author 
+ * @author
  * @since 2022-01-18
  */
 @Slf4j
@@ -154,6 +110,14 @@ public class SceneEditInfoServiceImpl extends ServiceImpl<ISceneEditInfoMapper,
     private ISceneAsynOperLogService sceneAsynOperLogService;
     @Autowired
     private ICutModelService cutModelService;
+    @Autowired
+    private ICommonService commonService;
+    @Autowired
+    private FYunFileConfig fYunFileConfig;
+    @Autowired
+    private ISceneDrawService sceneDrawService;
+    @Autowired
+    private ISceneDynamicPanelService sceneDynamicPanelService;
 
     @Transactional
     @Override
@@ -307,6 +271,11 @@ public class SceneEditInfoServiceImpl extends ServiceImpl<ISceneEditInfoMapper,
         //发布模型裁剪
         cutModelService.publicCutModel(num, bucket);
 
+        //发布场景绘制
+        sceneDrawService.publicSceneDraw(num, bucket);
+
+        sceneJson.setDynamicPanel(sceneDynamicPanelService.checkDynamicPanel(num));
+
         //本地写sceneJson文件
         String localSceneJsonPath = String.format(ConstantFilePath.SCENE_DATA_PATH_V4, num) + "scene.json";
         FileUtils.writeFile(localSceneJsonPath, JSON.toJSONString(sceneJson));
@@ -529,6 +498,8 @@ public class SceneEditInfoServiceImpl extends ServiceImpl<ISceneEditInfoMapper,
 
         this.setExtData(sceneInfoVO, scenePlus.getCameraId());
 
+        sceneInfoVO.setDynamicPanel(sceneDynamicPanelService.checkDynamicPanel(num));
+
         return sceneInfoVO;
     }
 
@@ -639,6 +610,9 @@ public class SceneEditInfoServiceImpl extends ServiceImpl<ISceneEditInfoMapper,
         if(Objects.isNull(controls.getShowBillboardTitle())){
             controls.setShowBillboardTitle(CommonStatus.YES.code().intValue());
         }
+        if(Objects.isNull(controls.getShowDrawTitle())){
+            controls.setShowDrawTitle(CommonStatus.YES.code().intValue());
+        }
 
         return sceneInfoVO;
     }
@@ -717,6 +691,72 @@ public class SceneEditInfoServiceImpl extends ServiceImpl<ISceneEditInfoMapper,
     }
 
     @Override
+    public ResultData uploadDxf(MultipartFile file, String num) throws Exception {
+
+        ScenePlus scenePlus = scenePlusService.getScenePlusByNum(num);
+        ScenePlusExt scenePlusExt = scenePlusExtService.getScenePlusExtByPlusId(scenePlus.getId());
+
+        String extName =  FileUtil.extName(file.getOriginalFilename());
+        if(!"dxf".equals(extName)){
+            throw new BusinessException(ErrorCode.FAILURE_CODE_7007.code(), ErrorCode.FAILURE_CODE_7007.formatMessage("dxf"));
+        }
+        String dfxPath = String.format(ConstantFilePath.SCENE_USER_PATH_V4, num) + UUID.randomUUID() + "." + extName;
+        String floorplanUserPath = String.format(ConstantFilePath.SCENE_USER_PATH_V4, num) + UUID.randomUUID() + ".json";
+        file.transferTo(new File(dfxPath));
+        try {
+            String editUserPath = String.format(UploadFilePath.USER_EDIT_PATH, num);
+            FdJsonToDxfUtil.dxfToFdJson(dfxPath, floorplanUserPath);
+            fYunFileService.uploadFile(scenePlusExt.getYunFileBucket(), floorplanUserPath, editUserPath + "floorplan.json");
+            JSONObject houseTypeJson = CreateHouseJsonUtil
+                    .createHouseTypeJsonByUser(floorplanUserPath);
+            if(Objects.nonNull(houseTypeJson)) {
+                fYunFileService.uploadFile(scenePlusExt.getYunFileBucket(), houseTypeJson.toJSONString().getBytes(), editUserPath + "houseType.json");
+            }
+
+            SceneEditInfo sceneEditInfoDb = this.getByScenePlusId(scenePlus.getId());
+            this.update(new LambdaUpdateWrapper<SceneEditInfo>()
+                    .setSql("version=version+" + 1)
+                    .set(SceneEditInfo::getFloorPlanUser, 1)
+                    .eq(SceneEditInfo::getId, sceneEditInfoDb.getId()));
+
+            SceneEditInfoExt sceneEditInfoExt = sceneEditInfoExtService.getByEditInfoId(sceneEditInfoDb.getId());
+            sceneEditInfoExt.setFloorPlanAngle(0f);
+            sceneEditInfoExt.setFloorPlanCompass(0f);
+            sceneEditInfoExtService.saveOrUpdate(sceneEditInfoExt);
+        }catch (Exception e){
+            log.error("cad文件转换失败");
+            ResultData.error(ErrorCode.FAILURE_CODE_7013);
+        }finally {
+            FileUtil.del(dfxPath);
+            FileUtil.del(floorplanUserPath);
+        }
+
+        return ResultData.ok();
+    }
+
+    @Override
+    public ResultData downloadDxf(String num) throws Exception {
+
+        ScenePlus scenePlus = scenePlusService.getScenePlusByNum(num);
+        ScenePlusExt scenePlusExt = scenePlusExtService.getScenePlusExtByPlusId(scenePlus.getId());
+        SceneEditInfo sceneEditInfo = this.getByScenePlusId(scenePlus.getId());
+        if(Objects.isNull(sceneEditInfo.getFloorPlanUser()) || sceneEditInfo.getFloorPlanUser() == CommonStatus.NO.code()){
+            return ResultData.ok();
+        }
+
+        String localFloorplan = String.format(ConstantFilePath.SCENE_USER_PATH_V4, num) + UUID.randomUUID() + ".json";
+        fYunFileService.downloadFile(scenePlusExt.getYunFileBucket(),
+                String.format(UploadFilePath.USER_EDIT_PATH, num) + "floorplan.json", localFloorplan);
+        String localDxf = String.format(ConstantFilePath.SCENE_USER_PATH_V4, num) + UUID.randomUUID() + ".dxf";
+        FdJsonToDxfUtil.fdJsonToDxf(localFloorplan, localDxf);
+        String key = OssFileUtil.getUploadTempFileKey(null, "dxf");
+        fYunFileService.uploadFile(scenePlusExt.getYunFileBucket(), localDxf, key);
+        String url = fYunFileConfig.getHost() + key;
+
+        return ResultData.ok(url);
+    }
+
+    @Override
     public ResultData resetCad(String num) throws IOException {
 
         ScenePlus scenePlus = scenePlusService.getScenePlusByNum(num);
@@ -1007,15 +1047,10 @@ public class SceneEditInfoServiceImpl extends ServiceImpl<ISceneEditInfoMapper,
         }
 
         //查询是否存在等待中的异步操作记录,如果存在,抛出业务异常,终止操作
-        this.checkSceneAsynOper(num, null, SceneAsynModuleType.UPLOAD_DOWNLOAD.code() , SceneAsynFuncType.PANORAMIC_IMAGE.code());
+        sceneAsynOperLogService.checkSceneAsynOper(num, null, SceneAsynModuleType.UPLOAD_DOWNLOAD.code() , SceneAsynFuncType.PANORAMIC_IMAGE.code());
 
         //清除全景图异步操作记录,防止再次下载的时候请求到旧的压缩包
-        sceneAsynOperLogService.remove(
-            new LambdaQueryWrapper<SceneAsynOperLog>()
-            .eq(SceneAsynOperLog::getNum, num)
-            .eq(SceneAsynOperLog::getModule, SceneAsynModuleType.UPLOAD_DOWNLOAD.code())
-            .eq(SceneAsynOperLog::getFunc, SceneAsynFuncType.PANORAMIC_IMAGE.code())
-        );
+        sceneAsynOperLogService.cleanLog(num, SceneAsynModuleType.UPLOAD_DOWNLOAD.code(), SceneAsynFuncType.PANORAMIC_IMAGE.code());
 
 
         ScenePlusExt scenePlusExt = scenePlusExtService.getScenePlusExtByPlusId(scenePlus.getId());
@@ -1205,26 +1240,6 @@ public class SceneEditInfoServiceImpl extends ServiceImpl<ISceneEditInfoMapper,
         return ResultData.ok(uploadPanoramaVO);
     }
 
-    private void checkSceneAsynOper(String num, String operType, String module, String function){
-        LambdaQueryWrapper<SceneAsynOperLog> queryWrapper =
-            new LambdaQueryWrapper<SceneAsynOperLog>()
-                .eq(SceneAsynOperLog::getNum,num)
-                .eq(SceneAsynOperLog::getState, CommonOperStatus.WAITING.code());
-        if(StrUtil.isNotEmpty(operType)){
-            queryWrapper.eq(SceneAsynOperLog::getOperType, operType);
-        }
-        if(StrUtil.isNotEmpty(module)){
-            queryWrapper.eq(SceneAsynOperLog::getModule, module);
-        }
-        if(StrUtil.isNotEmpty(function)){
-            queryWrapper.eq(SceneAsynOperLog::getFunc, function);
-        }
-        List<SceneAsynOperLog> waittingLogList = sceneAsynOperLogService.list(queryWrapper);
-        if(CollUtil.isNotEmpty(waittingLogList)){
-            throw new BusinessException(ErrorCode.FAILURE_CODE_5066);
-        }
-    }
-
     public void uploadPanoramaHandler(String num, String bucket, String target, String imgViewPath, List<String> uploadFileList, String targetImagesPath) throws Exception {
         CreateObjUtil.build3dModel(target , "1");
 
@@ -1317,7 +1332,7 @@ public class SceneEditInfoServiceImpl extends ServiceImpl<ISceneEditInfoMapper,
         }
 
         //查询是否存在等待中的异步操作记录,如果存在,抛出业务异常,终止操作
-        this.checkSceneAsynOper(num,null, SceneAsynModuleType.UPLOAD_DOWNLOAD.code() , SceneAsynFuncType.PANORAMIC_IMAGE.code());
+        sceneAsynOperLogService.checkSceneAsynOper(num,null, SceneAsynModuleType.UPLOAD_DOWNLOAD.code() , SceneAsynFuncType.PANORAMIC_IMAGE.code());
 
         ScenePlusExt scenePlusExt = scenePlusExtService.getScenePlusExtByPlusId(scenePlus.getId());
         String bucket = scenePlusExt.getYunFileBucket();
@@ -1355,7 +1370,7 @@ public class SceneEditInfoServiceImpl extends ServiceImpl<ISceneEditInfoMapper,
             if(!panoramaImageList.contains(fileName)){
                 throw new BusinessException(ErrorCode.FAILURE_CODE_5063);
             }
-            String url = ossUrlPrefix + ossResultPath + fileName;
+            String url = ossResultPath + fileName;
             String downloadName = fileName;
             map.put("asyn", CommonStatus.NO.code());
             map.put("fileUrl", url + "?t=" + System.currentTimeMillis());
@@ -1363,12 +1378,7 @@ public class SceneEditInfoServiceImpl extends ServiceImpl<ISceneEditInfoMapper,
             return ResultData.ok(map);
         }else{
             //清除旧的下载记录
-            sceneAsynOperLogService.remove(
-                new LambdaQueryWrapper<SceneAsynOperLog>()
-                    .eq(SceneAsynOperLog::getNum, num)
-                    .eq(SceneAsynOperLog::getOperType, SceneAsynOperType.DOWNLOAD.code())
-                    .eq(SceneAsynOperLog::getModule, SceneAsynModuleType.UPLOAD_DOWNLOAD.code())
-                    .eq(SceneAsynOperLog::getFunc, SceneAsynFuncType.PANORAMIC_IMAGE.code()));
+            sceneAsynOperLogService.cleanLog(num, SceneAsynModuleType.UPLOAD_DOWNLOAD.code(), SceneAsynFuncType.PANORAMIC_IMAGE.code(), SceneAsynOperType.DOWNLOAD.code());
 
             //开始异步执行下载全景图压缩包操作
             CompletableFuture.runAsync(() -> {
@@ -1483,7 +1493,7 @@ public class SceneEditInfoServiceImpl extends ServiceImpl<ISceneEditInfoMapper,
         SceneEditInfo sceneEditInfo = this.getByScenePlusId(scenePlus.getId());
 
         //转换视频格式
-        this.transferToFlv(param.getNum(), param.getFileName(), bucket);
+        commonService.transferToFlv(param.getNum(), param.getFileName(), bucket);
 
         //生成boxVideos数据
         String boxVideos = this.createBoxVideos(param.getNum(), sid, boxVideo, sceneEditInfo, OperationType.ADDORUPDATE.code());
@@ -2703,34 +2713,6 @@ public class SceneEditInfoServiceImpl extends ServiceImpl<ISceneEditInfoMapper,
         return result;
     }
 
-    private void transferToFlv(String num, String fileName, String bucket) throws Exception {
-
-        String userEditPath = String.format(UploadFilePath.USER_EDIT_PATH, num);
-        String localImagesPath = String.format(ConstantFilePath.SCENE_USER_PATH_V4, num);
-        String localFilePath = localImagesPath + fileName;
-
-        File targetFile = new File(localImagesPath);
-        if (!targetFile.exists()){
-            targetFile.mkdirs();
-        }
-
-        targetFile = new File(localFilePath);
-        if (targetFile.exists()){
-            FileUtils.deleteFile(localFilePath);
-        }
-
-        //从用户编辑目录中下载视频到本地
-        String filePath = userEditPath + fileName;
-        fYunFileService.downloadFile(bucket, filePath, localImagesPath + fileName);
-
-        //视频格式转换
-        CreateObjUtil.mp4ToFlv(localFilePath, localFilePath.replace("mp4", "flv"));
-
-        //上传
-        String flvFileName = fileName.replace("mp4", "flv");
-        fYunFileService.uploadFile(bucket, localFilePath.replace("mp4", "flv"), userEditPath+flvFileName);
-    }
-
     @Override
     public ResultData deleteMosaics(DeleteMosaicParamVO param) throws Exception {
 

+ 4 - 9
src/main/java/com/fdkankan/scene/service/impl/SceneEditServiceImpl.java

@@ -225,19 +225,14 @@ public class SceneEditServiceImpl implements ISceneEditService {
         }
 
         //权限控制完后判断若是协作账号,获取协作权限
-        SceneCooperation sceneCooperation = sceneCooperationService.getByNum(num);
-        //若数据为空表示可操作全部资源
-        if(sceneCooperation == null || sceneCooperation.getUserId().longValue() != ssoUser.getId().longValue()){
+        if(scenePlus.getUserId().equals(ssoUser.getId())){
             return sceneAuthVO;
         }
-
-        if(scenePlus.getUserId()!= null && sceneCooperation.getUserId()!= null &&
-            scenePlus.getUserId().equals(sceneCooperation.getUserId())){
-            return sceneAuthVO;
+        SceneCooperation sceneCooperation = sceneCooperationService.getByNum(num);
+        if(Objects.nonNull(sceneCooperation)){
+            sceneAuthVO.setInclude(sceneResourceService.findByCooperationId(sceneCooperation.getId()));
         }
 
-        sceneAuthVO.setInclude(sceneResourceService.findByCooperationId(sceneCooperation.getId()));
-
         return sceneAuthVO;
     }
 

+ 163 - 106
src/main/java/com/fdkankan/scene/service/impl/SceneProServiceImpl.java

@@ -4,7 +4,6 @@ import cn.hutool.core.collection.CollUtil;
 import cn.hutool.core.date.DateField;
 import cn.hutool.core.date.DateUtil;
 import cn.hutool.core.io.FileUtil;
-import cn.hutool.core.util.RuntimeUtil;
 import cn.hutool.core.util.StrUtil;
 import cn.hutool.core.util.ZipUtil;
 import com.alibaba.fastjson.JSON;
@@ -14,63 +13,45 @@ 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.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.ConstantFileName;
 import com.fdkankan.model.constants.ConstantFilePath;
 import com.fdkankan.model.constants.UploadFilePath;
-import com.fdkankan.common.exception.BusinessException;
-import com.fdkankan.scene.bean.SceneBean;
-import com.fdkankan.web.response.ResultData;
 import com.fdkankan.model.utils.ComputerUtil;
 import com.fdkankan.model.utils.ConvertUtils;
 import com.fdkankan.model.utils.CreateObjUtil;
-import com.fdkankan.common.util.FileUtils;
-import com.fdkankan.common.util.OkHttpUtils;
-import com.fdkankan.fyun.constant.FYunTypeEnum;
-import com.fdkankan.fyun.face.FYunFileServiceInterface;
 import com.fdkankan.redis.constant.RedisKey;
 import com.fdkankan.redis.constant.RedisLockKey;
 import com.fdkankan.redis.util.RedisLockUtil;
 import com.fdkankan.redis.util.RedisUtil;
 import com.fdkankan.scene.bean.IconBean;
+import com.fdkankan.scene.bean.SceneBean;
 import com.fdkankan.scene.bean.TagBean;
-import com.fdkankan.scene.entity.SceneEditInfo;
-import com.fdkankan.scene.entity.ScenePlus;
-import com.fdkankan.scene.entity.ScenePlusExt;
-import com.fdkankan.scene.entity.ScenePro;
+import com.fdkankan.scene.entity.*;
 import com.fdkankan.scene.mapper.ISceneProMapper;
-import com.fdkankan.scene.service.ISceneDataDownloadService;
-import com.fdkankan.scene.service.ISceneEditControlsService;
-import com.fdkankan.scene.service.ISceneEditInfoService;
-import com.fdkankan.scene.service.IScenePlusExtService;
-import com.fdkankan.scene.service.IScenePlusService;
-import com.fdkankan.scene.service.ISceneProService;
-import com.fdkankan.scene.service.ISceneUploadService;
-import com.fdkankan.scene.vo.BaseDataParamVO;
-import com.fdkankan.scene.vo.DeleteFileParamVO;
-import com.fdkankan.scene.vo.DeleteHotIconParamVO;
-import com.fdkankan.scene.vo.DeleteHotParamVO;
-import com.fdkankan.scene.vo.FileNameAndDataParamVO;
-import com.fdkankan.scene.vo.HotParamVO;
-import com.fdkankan.scene.vo.SaveTagsParamVO;
-import com.fdkankan.scene.vo.SaveTagsVisibleParamVO;
+import com.fdkankan.scene.service.*;
+import com.fdkankan.scene.vo.*;
+import com.fdkankan.web.response.ResultData;
 import com.google.common.collect.Lists;
 import com.google.common.collect.Sets;
-import java.io.File;
-import java.io.IOException;
-import java.nio.charset.StandardCharsets;
-import java.util.*;
-import java.util.Map.Entry;
-import java.util.stream.Collectors;
 import lombok.extern.slf4j.Slf4j;
-import org.redisson.Redisson;
-import org.redisson.RedissonLock;
 import org.springframework.beans.factory.annotation.Autowired;
-import org.springframework.beans.factory.annotation.Qualifier;
 import org.springframework.beans.factory.annotation.Value;
 import org.springframework.stereotype.Service;
 import org.springframework.transaction.annotation.Transactional;
 import org.springframework.web.multipart.MultipartFile;
 
+import javax.annotation.Resource;
+import java.io.File;
+import java.io.IOException;
+import java.nio.charset.StandardCharsets;
+import java.util.*;
+import java.util.Map.Entry;
+import java.util.concurrent.CompletableFuture;
+import java.util.stream.Collectors;
+
 /**
  * <p>
  * pro场景表 服务实现类
@@ -100,7 +81,7 @@ public class SceneProServiceImpl extends ServiceImpl<ISceneProMapper, ScenePro>
     @Value("${ecs.checkFile.waitTime:5000}")
     private int waitTime;
 
-    @Autowired
+    @Resource
     private FYunFileServiceInterface fYunFileService;
     @Autowired
     private RedisLockUtil redisLockUtil;
@@ -120,6 +101,8 @@ public class SceneProServiceImpl extends ServiceImpl<ISceneProMapper, ScenePro>
     private IScenePlusExtService scenePlusExtService;
     @Autowired
     private ISceneUploadService sceneUploadService;
+    @Autowired
+    private ISceneAsynOperLogService sceneAsynOperLogService;
 
     @Transactional
     @Override
@@ -683,7 +666,7 @@ public class SceneProServiceImpl extends ServiceImpl<ISceneProMapper, ScenePro>
     }
 
     @Override
-    public ResultData uploadObjAndImg(String num, MultipartFile file) throws Exception{
+    public ResultData uploadModel(String num, MultipartFile file) throws Exception{
         if(StrUtil.isEmpty(num)){
             throw new BusinessException(ServerCode.PARAM_REQUIRED, "num");
         }
@@ -695,6 +678,13 @@ public class SceneProServiceImpl extends ServiceImpl<ISceneProMapper, ScenePro>
         if(scenePlus == null){
             throw new BusinessException(ErrorCode.FAILURE_CODE_5005);
         }
+
+        //查询是否存在等待中的异步操作记录,如果存在,抛出业务异常,终止操作
+        sceneAsynOperLogService.checkSceneAsynOper(num, null, SceneAsynModuleType.UPLOAD_DOWNLOAD.code() , SceneAsynFuncType.MODEL.code());
+
+        //清除全景图异步操作记录,防止再次下载的时候请求到旧的压缩包
+        sceneAsynOperLogService.cleanLog(num, SceneAsynModuleType.UPLOAD_DOWNLOAD.code(), SceneAsynFuncType.MODEL.code());
+
         ScenePlusExt scenePlusExt = scenePlusExtService.getScenePlusExtByPlusId(scenePlus.getId());
         String bucket = scenePlusExt.getYunFileBucket();
 
@@ -704,31 +694,10 @@ public class SceneProServiceImpl extends ServiceImpl<ISceneProMapper, ScenePro>
             this.buildModel4Dam(num, bucket, scenePlusExt.getDataSource(), scenePlusExt.getBuildType(), file);
         }
 
-        //更新版本信息
-        SceneEditInfo sceneEditInfo = sceneEditInfoService.getByScenePlusId(scenePlus.getId());
-        if(Objects.isNull(sceneEditInfo)){
-            sceneEditInfo = new SceneEditInfo();
-            sceneEditInfo.setScenePlusId(scenePlus.getId());
-            sceneEditInfo.setFloorPublishVer(1);
-            sceneEditInfo.setFloorEditVer(1);
-            sceneEditInfo.setIsUploadObj(CommonStatus.YES.code());
-            sceneEditInfoService.save(sceneEditInfo);
-        }else{
-            sceneEditInfoService.update(
-                new LambdaUpdateWrapper<SceneEditInfo>()
-                    .setSql("version = version + 1")
-                    .setSql("floor_edit_ver = floor_edit_ver + 1")
-                    .setSql("floor_publish_ver = floor_publish_ver + 1")
-                    .setSql("img_version = img_version + 1")
-                    .set(SceneEditInfo::getIsUploadObj, CommonStatus.YES.code())
-                    .eq(SceneEditInfo::getId, sceneEditInfo.getId()));
-
-            sceneEditInfoService.upgradeSceneJsonVersion(num, sceneEditInfo.getVersion() + 1, sceneEditInfo.getImgVersion() + 1, bucket);
-        }
-
         return ResultData.ok();
     }
 
+
     /**
      * 老算法(dam)上传模型逻辑
      * @param num
@@ -750,16 +719,46 @@ public class SceneProServiceImpl extends ServiceImpl<ISceneProMapper, ScenePro>
         //创建data.json
         this.writeDataJson(path);
 
-        //调用算法,不同的类型调用不同的算法
-        if("V2".equals(buildType)){
-            CreateObjUtil.objToTxt(path , "1");
-        }
-        if("V3".equals(buildType)){
-            CreateObjUtil.build3dModel(path , "1");
-        }
+        CompletableFuture.runAsync(() -> {
+            SceneAsynOperLog sceneAsynOperLog = new SceneAsynOperLog();
+            sceneAsynOperLog.setNum(num);
+            sceneAsynOperLog.setOperType(SceneAsynOperType.UPLOAD.code());
+            sceneAsynOperLog.setModule(SceneAsynModuleType.UPLOAD_DOWNLOAD.code());
+            sceneAsynOperLog.setFunc(SceneAsynFuncType.MODEL.code());
+            sceneAsynOperLogService.save(sceneAsynOperLog);
+            try {
+                //调用算法,不同的类型调用不同的算法
+                if("V2".equals(buildType)){
+                    CreateObjUtil.objToTxt(path , "1");
+                }
+                if("V3".equals(buildType)){
+                    CreateObjUtil.build3dModel(path , "1");
+                }
 
-        //算法计算完后,生成压缩文件,上传到oss
-        this.uploadFileofterRebuildPanoram(path, filePath, num, bucket);
+                //算法计算完后,生成压缩文件,上传到oss
+                uploadFileofterBuildDamModel(path, filePath, num, bucket);
+
+                //更新版本信息
+                ScenePlus scenePlus = scenePlusService.getScenePlusByNum(num);
+                SceneEditInfo sceneEditInfo = sceneEditInfoService.getByScenePlusId(scenePlus.getId());
+                sceneEditInfoService.update(
+                        new LambdaUpdateWrapper<SceneEditInfo>()
+                                .setSql("version = version + 1")
+                                .setSql("floor_edit_ver = floor_edit_ver + 1")
+                                .setSql("floor_publish_ver = floor_publish_ver + 1")
+                                .setSql("img_version = img_version + 1")
+                                .set(SceneEditInfo::getIsUploadObj, CommonStatus.YES.code())
+                                .eq(SceneEditInfo::getId, sceneEditInfo.getId()));
+
+                sceneEditInfoService.upgradeSceneJsonVersion(num, sceneEditInfo.getVersion() + 1, sceneEditInfo.getImgVersion() + 1, bucket);
+
+                sceneAsynOperLog.setState(CommonOperStatus.SUCCESS.code());
+            } catch (Exception e) {
+                log.error("上传dam模型,num:" + num, e);
+                sceneAsynOperLog.setState(CommonOperStatus.FAILD.code());
+            }
+            sceneAsynOperLogService.updateById(sceneAsynOperLog);
+        });
     }
 
     /**
@@ -831,36 +830,64 @@ public class SceneProServiceImpl extends ServiceImpl<ISceneProMapper, ScenePro>
             }
         });
 
+        SceneAsynOperLog sceneAsynOperLog = new SceneAsynOperLog();
+        sceneAsynOperLog.setNum(num);
+        sceneAsynOperLog.setOperType(SceneAsynOperType.UPLOAD.code());
+        sceneAsynOperLog.setModule(SceneAsynModuleType.UPLOAD_DOWNLOAD.code());
+        sceneAsynOperLog.setFunc(SceneAsynFuncType.MODEL.code());
+        sceneAsynOperLogService.save(sceneAsynOperLog);
+        CompletableFuture.runAsync(() -> {
+            try {
+                //调用算法
+                String command = "bash /home/ubuntu/bin/Obj2Tiles.sh " + path;
+                log.info("上传3dtiles模型开始, num:{}, targetPath:{}", num, path);
+                CreateObjUtil.callshell(command);
+                log.info("上传3dtiles模型结束, num:{}, targetPath:{}", num, path);
+
+                //检测计算结果
+                String tilesPath = path + "3dtiles";
+                String tilesetJsonPath = tilesPath + File.separator + "tileset.json";
+                boolean success = ComputerUtil.checkComputeCompleted(tilesetJsonPath, maxCheckTimes, waitTime);
+                if(!success){
+                    throw new BusinessException(ErrorCode.FAILURE_CODE_7013);
+                }
 
-        //调用算法
-        String command = "bash /home/ubuntu/bin/Obj2Tiles.sh " + path;
-        log.info("上传3dtiles模型开始, num:{}, targetPath:{}", num, path);
-//        RuntimeUtil.exec(command);
-        CreateObjUtil.callshell(command);
-        log.info("上传3dtiles模型结束, num:{}, targetPath:{}", num, path);
-
-        //检测计算结果
-        String tilesPath = path + "3dtiles";
-        String tilesetJsonPath = tilesPath + File.separator + "tileset.json";
-        boolean success = ComputerUtil.checkComputeCompleted(tilesetJsonPath, maxCheckTimes, waitTime);
-        if(!success){
-            throw new BusinessException(ErrorCode.FAILURE_CODE_7013);
-        }
-
-        //删除logs
-        FileUtil.del(tilesPath + File.separator + "logs");
-
-        //算法计算完后,生成压缩文件,上传到oss
-        //上传3dtiles
-        fYunFileService.deleteFolder(bucket, String.format(UploadFilePath.IMG_VIEW_PATH, num) + "3dtiles");
-        fYunFileService.uploadFileByCommand(bucket, tilesPath, String.format(UploadFilePath.IMG_VIEW_PATH, num) + "3dtiles");
-        //上传mesh
-        fYunFileService.deleteFolder(bucket, String.format(UploadFilePath.DATA_VIEW_PATH, num) + "mesh");
-        fYunFileService.uploadFileByCommand(bucket, meshPath, String.format(UploadFilePath.DATA_VIEW_PATH, num) + "mesh");
+                //删除logs
+                FileUtil.del(tilesPath + File.separator + "logs");
+
+                //算法计算完后,生成压缩文件,上传到oss
+                //上传3dtiles
+                fYunFileService.deleteFolder(bucket, String.format(UploadFilePath.IMG_VIEW_PATH, num) + "3dtiles");
+                fYunFileService.uploadFileByCommand(bucket, tilesPath, String.format(UploadFilePath.IMG_VIEW_PATH, num) + "3dtiles");
+                //上传mesh
+                fYunFileService.deleteFolder(bucket, String.format(UploadFilePath.DATA_VIEW_PATH, num) + "mesh");
+                fYunFileService.uploadFileByCommand(bucket, meshPath, String.format(UploadFilePath.DATA_VIEW_PATH, num) + "mesh");
+
+                //更新版本信息
+                ScenePlus scenePlus = scenePlusService.getScenePlusByNum(num);
+                SceneEditInfo sceneEditInfo = sceneEditInfoService.getByScenePlusId(scenePlus.getId());
+                sceneEditInfoService.update(
+                        new LambdaUpdateWrapper<SceneEditInfo>()
+                                .setSql("version = version + 1")
+                                .setSql("floor_edit_ver = floor_edit_ver + 1")
+                                .setSql("floor_publish_ver = floor_publish_ver + 1")
+                                .setSql("img_version = img_version + 1")
+                                .set(SceneEditInfo::getIsUploadObj, CommonStatus.YES.code())
+                                .eq(SceneEditInfo::getId, sceneEditInfo.getId()));
+
+                sceneEditInfoService.upgradeSceneJsonVersion(num, sceneEditInfo.getVersion() + 1, sceneEditInfo.getImgVersion() + 1, bucket);
+
+                sceneAsynOperLog.setState(CommonOperStatus.SUCCESS.code());
+            } catch (Exception e) {
+                log.error("上传全景图报错,num:" + num, e);
+                sceneAsynOperLog.setState(CommonOperStatus.FAILD.code());
+            }
+            sceneAsynOperLogService.updateById(sceneAsynOperLog);
+        });
 
     }
 
-    private void uploadFileofterRebuildPanoram(String path, String filePath, String sceneNum, String bucket) throws Exception {
+    private void uploadFileofterBuildDamModel(String path, String filePath, String sceneNum, String bucket) throws Exception {
         //因为共享目录有延迟,这里循环检测算法是否计算完毕3次,每次隔五秒
         String uploadJsonPath = path + File.separator + "results" +File.separator+"upload.json";
         boolean exist = ComputerUtil.checkComputeCompleted(uploadJsonPath, maxCheckTimes, waitTime);
@@ -1023,7 +1050,7 @@ public class SceneProServiceImpl extends ServiceImpl<ISceneProMapper, ScenePro>
         }
     }
 
-    public ResultData downloadTexData(String num) throws Exception {
+    public ResultData downloadModel(String num) throws Exception {
 
         if(StrUtil.isEmpty(num)){
             throw new BusinessException(ErrorCode.PARAM_REQUIRED);
@@ -1032,16 +1059,46 @@ public class SceneProServiceImpl extends ServiceImpl<ISceneProMapper, ScenePro>
         if(scenePlus == null){
             throw new BusinessException(ErrorCode.FAILURE_CODE_5005);
         }
+
+        //查询是否存在等待中的异步操作记录,如果存在,抛出业务异常,终止操作
+        sceneAsynOperLogService.checkSceneAsynOper(num,null, SceneAsynModuleType.UPLOAD_DOWNLOAD.code() , SceneAsynFuncType.MODEL.code());
+
+        //清除旧的下载记录
+        sceneAsynOperLogService.cleanLog(num, SceneAsynModuleType.UPLOAD_DOWNLOAD.code(), SceneAsynFuncType.MODEL.code(), SceneAsynOperType.DOWNLOAD.code());
+
         ScenePlusExt scenePlusExt = scenePlusExtService.getScenePlusExtByPlusId(scenePlus.getId());
         String bucket = scenePlusExt.getYunFileBucket();
 
         SceneEditInfo sceneEditInfo = sceneEditInfoService.getByScenePlusId(scenePlus.getId());
 
-        if(ModelKind.THREE_D_TILE.code().equals(scenePlusExt.getModelKind())){
-            return this.downloadModel43dtiles(num, bucket, scenePlusExt, sceneEditInfo);
-        }
+        //开始异步执行下载全景图压缩包操作
+        CompletableFuture.runAsync(() -> {
+            SceneAsynOperLog sceneAsynOperLog = new SceneAsynOperLog();
+            sceneAsynOperLog.setNum(num);
+            sceneAsynOperLog.setOperType(SceneAsynOperType.DOWNLOAD.code());
+            sceneAsynOperLog.setModule(SceneAsynModuleType.UPLOAD_DOWNLOAD.code());
+            sceneAsynOperLog.setFunc(SceneAsynFuncType.MODEL.code());
+            sceneAsynOperLog.setVersion(sceneEditInfo.getImgVersion());
+            sceneAsynOperLogService.save(sceneAsynOperLog);
+            try {
+
+                String url = null;
+                if(ModelKind.THREE_D_TILE.code().equals(scenePlusExt.getModelKind())){
+                    url = downloadModel43dtiles(num, bucket, scenePlusExt, sceneEditInfo);
+                }else{
+                    url = downloadModel4Dam(num, bucket);
+                }
 
-        return this.downloadModel4Dam(num, bucket);
+                sceneAsynOperLog.setState(CommonOperStatus.SUCCESS.code());
+                sceneAsynOperLog.setUrl(url);
+            }catch (Exception e){
+                sceneAsynOperLog.setState(CommonOperStatus.FAILD.code());
+                log.error("下载模型压缩包失败,num:" + num, e);
+            }
+            sceneAsynOperLogService.saveOrUpdate(sceneAsynOperLog);
+        });
+
+        return ResultData.ok();
     }
 
     @Override
@@ -1049,7 +1106,7 @@ public class SceneProServiceImpl extends ServiceImpl<ISceneProMapper, ScenePro>
         return this.getOne(new LambdaQueryWrapper<ScenePro>().eq(ScenePro::getNum, num));
     }
 
-    private ResultData downloadModel43dtiles(String num, String bucket, ScenePlusExt scenePlusExt, SceneEditInfo sceneEditInfo){
+    private String downloadModel43dtiles(String num, String bucket, ScenePlusExt scenePlusExt, SceneEditInfo sceneEditInfo){
 
         //下载mesh到本地
         String meshOssPath = String.format(UploadFilePath.DATA_VIEW_PATH, num) + "mesh/";
@@ -1065,8 +1122,8 @@ public class SceneProServiceImpl extends ServiceImpl<ISceneProMapper, ScenePro>
         //删除本地文件
         FileUtil.del(meshLocalPath);
         FileUtil.del(zipFilePath);
-        String url = ossUrlPrefix + "downloads/extras/" + zipName + "?t=" + Calendar.getInstance().getTimeInMillis();
-        return ResultData.ok(url);
+        String url = "downloads/extras/" + zipName + "?t=" + Calendar.getInstance().getTimeInMillis();
+        return url;
     }
 
     public static void main(String[] args) throws Exception {
@@ -1076,7 +1133,7 @@ public class SceneProServiceImpl extends ServiceImpl<ISceneProMapper, ScenePro>
     }
 
 
-    private ResultData downloadModel4Dam(String num, String bucket){
+    private String downloadModel4Dam(String num, String bucket){
         String localImagePath = String.format(ConstantFilePath.IMAGESBUFFER_FORMAT, num);
         if(!new File(localImagePath).exists()){
             new File(localImagePath).mkdirs();
@@ -1121,9 +1178,9 @@ public class SceneProServiceImpl extends ServiceImpl<ISceneProMapper, ScenePro>
         ZipUtil.zip(meshPath, zipPath);
         //上传压缩包
         fYunFileService.uploadFile(bucket, zipPath, "downloads/extras/" + zipName);
-        String url = ossUrlPrefix + "downloads/extras/" + zipName + "?t=" + Calendar.getInstance().getTimeInMillis();
+        String url = "downloads/extras/" + zipName + "?t=" + Calendar.getInstance().getTimeInMillis();
         FileUtil.del(zipPath);
-        return ResultData.ok(url);
+        return url;
     }
 
     @Override

+ 15 - 8
src/main/java/com/fdkankan/scene/service/impl/SceneResourceServiceImpl.java

@@ -3,6 +3,8 @@ package com.fdkankan.scene.service.impl;
 import cn.hutool.core.collection.CollUtil;
 import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
 import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
+import com.fdkankan.common.constant.ErrorCode;
+import com.fdkankan.common.exception.BusinessException;
 import com.fdkankan.scene.entity.SceneResource;
 import com.fdkankan.scene.entity.SceneResourceCooperation;
 import com.fdkankan.scene.mapper.ISceneResourceMapper;
@@ -18,7 +20,7 @@ import org.springframework.stereotype.Service;
  * 场景资源表 服务实现类
  * </p>
  *
- * @author 
+ * @author
  * @since 2022-07-18
  */
 @Service
@@ -30,21 +32,26 @@ public class SceneResourceServiceImpl extends ServiceImpl<ISceneResourceMapper,
     @Override
     public List<SceneResource> findByCooperationId(Long sceneCooperationId) {
 
+        long countV4Resource = this.countByVersion("v4");
+
         List<SceneResourceCooperation> sceneResourceCooperationList
             = sceneResourceCooperationService.list(
             new LambdaQueryWrapper<SceneResourceCooperation>()
                 .eq(SceneResourceCooperation::getSceneCooperationId, sceneCooperationId));
 
-        List<Long> sceneResourceIdList = null;
-        if(CollUtil.isNotEmpty(sceneResourceCooperationList)){
-            sceneResourceIdList = sceneResourceCooperationList.stream()
-                .map(sceneResourceCooperation -> sceneResourceCooperation.getSceneResourceId())
-                .collect(Collectors.toList());
-        }
-        if(CollUtil.isEmpty(sceneResourceIdList)){
+        if(countV4Resource == sceneResourceCooperationList.size()){//如果协作菜单数量与资源数量相同,则返回空,由前端判断当前用户拥有所有该场景编辑权限
             return null;
         }
 
+        List<Long> sceneResourceIdList = sceneResourceCooperationList.stream()
+                .map(sceneResourceCooperation -> sceneResourceCooperation.getSceneResourceId())
+                .collect(Collectors.toList());
+
         return this.listByIds(sceneResourceIdList);
     }
+
+    @Override
+    public long countByVersion(String version) {
+        return this.count(new LambdaQueryWrapper<SceneResource>().eq(SceneResource::getVersion, version));
+    }
 }

+ 14 - 5
src/main/java/com/fdkankan/scene/service/impl/SurveillanceServiceImpl.java

@@ -26,12 +26,14 @@ import java.util.stream.Collectors;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.stereotype.Service;
 
+import javax.annotation.Resource;
+
 /**
  * <p>
  * 监控推拉流信息 服务实现类
  * </p>
  *
- * @author 
+ * @author
  * @since 2022-09-16
  */
 @Service
@@ -43,13 +45,15 @@ public class SurveillanceServiceImpl extends ServiceImpl<ISurveillanceMapper, Su
     private ISceneEditInfoExtService sceneEditInfoExtService;
     @Autowired
     private ISceneEditInfoService sceneEditInfoService;
-    @Autowired
+    @Resource
     private FYunFileServiceInterface yunFileService;
     @Autowired
     private IScenePlusExtService scenePlusExtService;
+    @Autowired
+    private ICommonService commonService;
 
     @Override
-    public ResultData saveSurveillance(SurveillanceParamVO param) {
+    public ResultData saveSurveillance(SurveillanceParamVO param) throws Exception {
 
         if(param.getUrlType() == 1){
             if(StrUtil.isEmpty(param.getPlayUrl())){
@@ -65,6 +69,13 @@ public class SurveillanceServiceImpl extends ServiceImpl<ISurveillanceMapper, Su
         if(Objects.isNull(scenePlus)){
             throw new BusinessException(ErrorCode.FAILURE_CODE_5005);
         }
+        ScenePlusExt scenePlusExt = scenePlusExtService.getScenePlusExtByPlusId(scenePlus.getId());
+
+        //转换视频格式
+        if(param.getUrlType() == 2){
+            commonService.transferToFlv(param.getNum(), param.getFileName(), scenePlusExt.getYunFileBucket());
+        }
+
         SceneEditInfo sceneEditInfo = sceneEditInfoService.getByScenePlusId(scenePlus.getId());
         SceneEditInfoExt sceneEditInfoExt = sceneEditInfoExtService.getByScenePlusId(scenePlus.getId());
 
@@ -85,10 +96,8 @@ public class SurveillanceServiceImpl extends ServiceImpl<ISurveillanceMapper, Su
 
         sceneEditInfoExt.setSurveillances(CommonStatus.YES.code().intValue());
         sceneEditInfoExtService.updateById(sceneEditInfoExt);
-
         sceneEditInfoService.upgradeVersionById(sceneEditInfo.getId());
 
-
         return ResultData.ok();
     }
 

+ 29 - 0
src/main/java/com/fdkankan/scene/vo/SceneDynamicPanelParamVO.java

@@ -0,0 +1,29 @@
+package com.fdkankan.scene.vo;
+
+import com.alibaba.fastjson.JSONObject;
+import lombok.AllArgsConstructor;
+import lombok.Builder;
+import lombok.Data;
+import lombok.NoArgsConstructor;
+
+import java.io.Serializable;
+
+/**
+ * <p>
+ * 场景动态面板
+ * </p>
+ *
+ * @author
+ * @since 2024-05-21
+ */
+@Data
+@Builder
+@NoArgsConstructor
+@AllArgsConstructor
+public class SceneDynamicPanelParamVO extends BaseSceneParamVO {
+
+    private static final long serialVersionUID = 1L;
+
+    private JSONObject data;
+
+}

+ 27 - 0
src/main/java/com/fdkankan/scene/vo/SceneDynamicPanelVO.java

@@ -0,0 +1,27 @@
+package com.fdkankan.scene.vo;
+
+import com.baomidou.mybatisplus.annotation.*;
+import lombok.*;
+
+import java.io.Serializable;
+import java.util.Date;
+
+/**
+ * <p>
+ * 场景动态面板
+ * </p>
+ *
+ * @author
+ * @since 2024-05-21
+ */
+@Data
+@Builder
+@NoArgsConstructor
+@AllArgsConstructor
+public class SceneDynamicPanelVO implements Serializable {
+
+    private static final long serialVersionUID = 1L;
+
+    private String sid;
+
+}

+ 10 - 0
src/main/java/com/fdkankan/scene/vo/SceneEditControlsParamVO.java

@@ -117,6 +117,16 @@ public class SceneEditControlsParamVO implements Serializable {
      */
     private Integer showLinkTitle;
 
+    /**
+     * 空间绘制信息
+     */
+    private Integer showDrawTitle;
+
+    /**
+     * 是否显示全部模型
+     */
+    private Integer showAllModel;
+
 
 
 

+ 11 - 0
src/main/java/com/fdkankan/scene/vo/SceneEditControlsVO.java

@@ -107,4 +107,15 @@ public class SceneEditControlsVO implements Serializable {
      */
     private Integer showLinkTitle;
 
+    /**
+     * 空间绘制信息
+     */
+    private Integer showDrawTitle;
+
+    /**
+     * 是否显示全部模型
+     */
+    private Integer showAllModel;
+
+
 }

+ 8 - 0
src/main/java/com/fdkankan/scene/vo/SceneInfoVO.java

@@ -254,5 +254,13 @@ public class SceneInfoVO {
      */
     private JSONObject started;
 
+    /**
+     * 空间绘制
+     */
+    private Integer sceneDraw;
+
+    //动态面板
+    private int dynamicPanel;
+
 
 }

+ 10 - 1
src/main/resources/bootstrap-dev.yml

@@ -4,7 +4,7 @@ spring:
   cloud:
     nacos:
       server-addr: 120.24.144.164:8848
-      namespace: 4dkankan-v4-test
+      namespace: 4dkankan-v4-dev
       config:
         file-extension: yaml
         namespace: ${spring.cloud.nacos.namespace}
@@ -24,8 +24,17 @@ spring:
           - data-id: common-fyun-config.yaml
             group: DEFAULT_GROUP
             refresh: true
+
+          - data-id: common-rabbitmq-config.yaml
+            group: DEFAULT_GROUP
+            refresh: true
+
+          - data-id: forest-config.yaml
+            group: DEFAULT_GROUP
+            refresh: true
       discovery:
         namespace: ${spring.cloud.nacos.namespace}
+#        namespace: public
 
 
 

+ 5 - 0
src/main/resources/mapper/scene/SceneDynamicPanelMapper.xml

@@ -0,0 +1,5 @@
+<?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.scene.mapper.ISceneDynamicPanelMapper">
+
+</mapper>