Prechádzať zdrojové kódy

产品运营管理/相机场景管理

lyhzzz 3 rokov pred
rodič
commit
6edaa6d6b6
24 zmenil súbory, kde vykonal 962 pridanie a 18 odobranie
  1. 47 4
      4dkankan-center-manage/src/main/java/com/fdkankan/manage/controller/SceneController.java
  2. 21 0
      4dkankan-center-manage/src/main/java/com/fdkankan/manage/controller/SceneDownloadLogController.java
  3. 21 0
      4dkankan-center-manage/src/main/java/com/fdkankan/manage/controller/SceneProEditController.java
  4. 74 0
      4dkankan-center-manage/src/main/java/com/fdkankan/manage/entity/SceneDownloadLog.java
  5. 281 0
      4dkankan-center-manage/src/main/java/com/fdkankan/manage/entity/SceneProEdit.java
  6. 1 1
      4dkankan-center-manage/src/main/java/com/fdkankan/manage/generate/AutoGenerate.java
  7. 20 0
      4dkankan-center-manage/src/main/java/com/fdkankan/manage/httpClient/FdKKClient.java
  8. 19 0
      4dkankan-center-manage/src/main/java/com/fdkankan/manage/httpClient/FdkkAddressSource.java
  9. 18 0
      4dkankan-center-manage/src/main/java/com/fdkankan/manage/mapper/ISceneDownloadLogMapper.java
  10. 18 0
      4dkankan-center-manage/src/main/java/com/fdkankan/manage/mapper/ISceneProEditMapper.java
  11. 13 0
      4dkankan-center-manage/src/main/java/com/fdkankan/manage/service/IDownService.java
  12. 17 0
      4dkankan-center-manage/src/main/java/com/fdkankan/manage/service/ISceneDownloadLogService.java
  13. 17 0
      4dkankan-center-manage/src/main/java/com/fdkankan/manage/service/ISceneProEditService.java
  14. 4 0
      4dkankan-center-manage/src/main/java/com/fdkankan/manage/service/ISceneProService.java
  15. 2 0
      4dkankan-center-manage/src/main/java/com/fdkankan/manage/service/ISceneService.java
  16. 125 0
      4dkankan-center-manage/src/main/java/com/fdkankan/manage/service/impl/DownService.java
  17. 39 0
      4dkankan-center-manage/src/main/java/com/fdkankan/manage/service/impl/SceneDownloadLogServiceImpl.java
  18. 33 0
      4dkankan-center-manage/src/main/java/com/fdkankan/manage/service/impl/SceneProEditServiceImpl.java
  19. 151 13
      4dkankan-center-manage/src/main/java/com/fdkankan/manage/service/impl/SceneProServiceImpl.java
  20. 12 0
      4dkankan-center-manage/src/main/java/com/fdkankan/manage/service/impl/SceneServiceImpl.java
  21. 9 0
      4dkankan-center-manage/src/main/java/com/fdkankan/manage/vo/response/DownVo.java
  22. 10 0
      4dkankan-center-manage/src/main/java/com/fdkankan/manage/vo/response/DownloadProcessVo.java
  23. 5 0
      4dkankan-center-manage/src/main/resources/mapper/manage/SceneDownloadLogMapper.xml
  24. 5 0
      4dkankan-center-manage/src/main/resources/mapper/manage/SceneProEditMapper.xml

+ 47 - 4
4dkankan-center-manage/src/main/java/com/fdkankan/manage/controller/SceneController.java

@@ -1,17 +1,20 @@
 package com.fdkankan.manage.controller;
 package com.fdkankan.manage.controller;
 
 
 
 
+import com.alibaba.fastjson.JSONObject;
 import com.fdkankan.common.constant.ErrorCode;
 import com.fdkankan.common.constant.ErrorCode;
 import com.fdkankan.common.exception.BusinessException;
 import com.fdkankan.common.exception.BusinessException;
 import com.fdkankan.common.response.ResultData;
 import com.fdkankan.common.response.ResultData;
+import com.fdkankan.manage.httpClient.FdKKClient;
+import com.fdkankan.manage.service.IDownService;
 import com.fdkankan.manage.service.ISceneProService;
 import com.fdkankan.manage.service.ISceneProService;
 import com.fdkankan.manage.vo.request.SceneParam;
 import com.fdkankan.manage.vo.request.SceneParam;
 import org.apache.commons.lang3.StringUtils;
 import org.apache.commons.lang3.StringUtils;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.beans.factory.annotation.Autowired;
-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;
+import org.springframework.web.bind.annotation.*;
+
+import javax.annotation.Resource;
+import java.util.HashMap;
 
 
 @RestController
 @RestController
 @RequestMapping("/service/manage/scene")
 @RequestMapping("/service/manage/scene")
@@ -19,6 +22,10 @@ public class SceneController {
 
 
     @Autowired
     @Autowired
     ISceneProService sceneProService;
     ISceneProService sceneProService;
+    @Autowired
+    IDownService downService;
+    @Resource
+    FdKKClient fdKKClient;
 
 
     @PostMapping("/list")
     @PostMapping("/list")
     public ResultData list(@RequestBody SceneParam param){
     public ResultData list(@RequestBody SceneParam param){
@@ -42,5 +49,41 @@ public class SceneController {
         sceneProService.copy(param.getNum());
         sceneProService.copy(param.getNum());
         return ResultData.ok();
         return ResultData.ok();
     }
     }
+    @PostMapping("/delete")
+    public ResultData delete(@RequestBody SceneParam param){
+        if(StringUtils.isEmpty(param.getNum())){
+            throw new BusinessException(ErrorCode.MISSING_REQUIRED_PARAMETERS);
+        }
+        sceneProService.deleteByNum(param.getNum());
+        return ResultData.ok();
+    }
+
+    @GetMapping("/checkDownLoad")
+    public ResultData checkDownLoad(@RequestParam(required = false) String num){
+        return ResultData.ok(downService.checkDownLoad(num));
+    }
+
+    @GetMapping("/downScene")
+    public ResultData downScene(@RequestParam(required = false) String num){
+        return ResultData.ok(downService.down(num));
+    }
+
+    @GetMapping("/downloadProcess")
+    public ResultData downloadProcess(@RequestParam(required = false) String num){
+        return ResultData.ok(downService.downloadProcess(num));
+    }
+
+
+    @GetMapping("/rebuildScene")
+    public ResultData rebuild(@RequestParam(required = false) String num){
+        HashMap<String,Object> paramMap = new HashMap<>();
+        paramMap.put("num",num);
+        JSONObject jsonObject = fdKKClient.rebuildScene(paramMap);
+        Integer code = jsonObject.getInteger("code");
+        if(code != 0){
+            return ResultData.error(code,jsonObject.getString("msg"));
+        }
+        return ResultData.ok();
+    }
 }
 }
 
 

+ 21 - 0
4dkankan-center-manage/src/main/java/com/fdkankan/manage/controller/SceneDownloadLogController.java

@@ -0,0 +1,21 @@
+package com.fdkankan.manage.controller;
+
+
+import org.springframework.web.bind.annotation.RequestMapping;
+
+import org.springframework.web.bind.annotation.RestController;
+
+/**
+ * <p>
+ *  前端控制器
+ * </p>
+ *
+ * @author 
+ * @since 2022-06-23
+ */
+@RestController
+@RequestMapping("/manage/sceneDownloadLog")
+public class SceneDownloadLogController {
+
+}
+

+ 21 - 0
4dkankan-center-manage/src/main/java/com/fdkankan/manage/controller/SceneProEditController.java

@@ -0,0 +1,21 @@
+package com.fdkankan.manage.controller;
+
+
+import org.springframework.web.bind.annotation.RequestMapping;
+
+import org.springframework.web.bind.annotation.RestController;
+
+/**
+ * <p>
+ * pro场景编辑数据表 前端控制器
+ * </p>
+ *
+ * @author 
+ * @since 2022-06-23
+ */
+@RestController
+@RequestMapping("/manage/sceneProEdit")
+public class SceneProEditController {
+
+}
+

+ 74 - 0
4dkankan-center-manage/src/main/java/com/fdkankan/manage/entity/SceneDownloadLog.java

@@ -0,0 +1,74 @@
+package com.fdkankan.manage.entity;
+
+import com.baomidou.mybatisplus.annotation.*;
+import lombok.Getter;
+import lombok.Setter;
+
+import java.io.Serializable;
+
+/**
+ * <p>
+ * 
+ * </p>
+ *
+ * @author 
+ * @since 2022-06-23
+ */
+@Getter
+@Setter
+@TableName("t_scene_download_log")
+public class SceneDownloadLog implements Serializable {
+
+    private static final long serialVersionUID = 1L;
+
+    @TableId(value = "id", type = IdType.AUTO)
+    private Long id;
+
+    /**
+     * 用户id
+     */
+    @TableField("user_id")
+    private Long userId;
+
+    /**
+     * 场景码
+     */
+    @TableField("scene_num")
+    private String sceneNum;
+
+    /**
+     * 场景版本
+     */
+    @TableField("scene_version")
+    private Integer sceneVersion;
+
+    /**
+     * 场景打包之后的连接
+     */
+    @TableField("download_url")
+    private String downloadUrl;
+
+    /**
+     * 0下载中,1下载成功,2下载失败
+     */
+    @TableField("status")
+    private Integer status;
+
+    /**
+     * 下载版本v3,v4
+     */
+    @TableField("sys_version")
+    private String sysVersion;
+
+    @TableField("rec_status")
+    @TableLogic(value = "A",delval = "I")
+    private String recStatus;
+
+    @TableField("create_time")
+    private String createTime;
+
+    @TableField("update_time")
+    private String updateTime;
+
+
+}

+ 281 - 0
4dkankan-center-manage/src/main/java/com/fdkankan/manage/entity/SceneProEdit.java

@@ -0,0 +1,281 @@
+package com.fdkankan.manage.entity;
+
+import com.baomidou.mybatisplus.annotation.*;
+import lombok.Getter;
+import lombok.Setter;
+
+import java.io.Serializable;
+
+/**
+ * <p>
+ * pro场景编辑数据表
+ * </p>
+ *
+ * @author 
+ * @since 2022-06-23
+ */
+@Getter
+@Setter
+@TableName("t_scene_pro_edit")
+public class SceneProEdit implements Serializable {
+
+    private static final long serialVersionUID = 1L;
+
+    @TableId(value = "id", type = IdType.AUTO)
+    private Long id;
+
+    /**
+     * pro场景id
+     */
+    @TableField("pro_id")
+    private Long proId;
+
+    /**
+     * 创建时间
+     */
+    @TableField("create_time")
+    private String createTime;
+
+    /**
+     * 大场景的密钥
+     */
+    @TableField("scene_key")
+    private String sceneKey;
+
+    /**
+     * 展示页面密码,0不需要,1需要
+     */
+    @TableField("need_key")
+    private Integer needKey;
+
+    /**
+     * 版本
+     */
+    @TableField("version")
+    private Integer version;
+
+    /**
+     * 表示缩略图是否存在
+     */
+    @TableField("thumb_status")
+    private Integer thumbStatus;
+
+    /**
+     * 地面点位标志
+     */
+    @TableField("marker_logo")
+    private String markerLogo;
+
+    /**
+     * 0表示默认,1表示自己上传
+     */
+    @TableField("floor_logo")
+    private String floorLogo;
+
+    /**
+     * 标记大小
+     */
+    @TableField("floor_logo_size")
+    private Integer floorLogoSize;
+
+    /**
+     * 要上传的热点的id集合,用逗号隔开
+     */
+    @TableField("hots_ids")
+    private String hotsIds;
+
+    /**
+     * 表示初始点信息
+     */
+    @TableField("entry")
+    private String entry;
+
+    /**
+     * 背景音乐名称
+     */
+    @TableField("bg_music")
+    private String bgMusic;
+
+    /**
+     * 记录的状态,A: 生效,I: 禁用
+     */
+    @TableField("rec_status")
+    @TableLogic(value = "A",delval = "I")
+    private String recStatus;
+
+    /**
+     * 更新时间
+     */
+    @TableField("update_time")
+    private String updateTime;
+
+    /**
+     * 普通录屏文件地址
+     */
+    @TableField("screencap_voice_src")
+    private String screencapVoiceSrc;
+
+    /**
+     * 录音文件地址
+     */
+    @TableField("screencap_voice_sound")
+    private String screencapVoiceSound;
+
+    /**
+     * 同步录音地址
+     */
+    @TableField("screencap_voice_soundsync")
+    private String screencapVoiceSoundsync;
+
+    /**
+     * 选择的类型,sound为screencapVoiceSound,file为screencapVoiceSrc,soundsync为screencap_voice_soundsync
+     */
+    @TableField("screencap_voice_type")
+    private String screencapVoiceType;
+
+    /**
+     * 录屏文件地址
+     */
+    @TableField("play_data")
+    private String playData;
+
+    /**
+     * 重新建模的版本
+     */
+    @TableField("floor_edit_ver")
+    private Integer floorEditVer;
+
+    /**
+     * 正式发布重新建模的版本
+     */
+    @TableField("floor_publish_ver")
+    private Integer floorPublishVer;
+
+    /**
+     * 录屏图片存放文件
+     */
+    @TableField("screencap_thumb")
+    private String screencapThumb;
+
+    /**
+     * 分享的logo和生成二维码的logo
+     */
+    @TableField("share_logo")
+    private String shareLogo;
+
+    /**
+     * 小地图浏览
+     */
+    @TableField("map_visi")
+    private Integer mapVisi;
+
+    /**
+     * 自动导览
+     */
+    @TableField("tour_visi")
+    private Integer tourVisi;
+
+    /**
+     * vr模式
+     */
+    @TableField("vr_visi")
+    private Integer vrVisi;
+
+    /**
+     * 展示页面是否显示标尺
+     */
+    @TableField("ruler_visi")
+    private Integer rulerVisi;
+
+    /**
+     * 展示页面cad图在平面图是否显示
+     */
+    @TableField("cad_img_visi")
+    private Integer cadImgVisi;
+
+    /**
+     * cad平面图
+     */
+    @TableField("floor_plan_png")
+    private String floorPlanPng;
+
+    /**
+     * cad平面图参数
+     */
+    @TableField("cad_info")
+    private String cadInfo;
+
+    @TableField("pano_visi")
+    private Integer panoVisi;
+
+    @TableField("m2d_visi")
+    private Integer m2dVisi;
+
+    @TableField("m3d_visi")
+    private Integer m3dVisi;
+
+    @TableField("measure_visi")
+    private Integer measureVisi;
+
+    /**
+     * 肖安需求,场景于场景之间的关联
+     */
+    @TableField("link_scene")
+    private String linkScene;
+
+    @TableField("overlay")
+    private String overlay;
+
+    /**
+     * 是否显示底部logo,1显示,0不显示
+     */
+    @TableField("show_logo_bottom")
+    private Boolean showLogoBottom;
+
+    /**
+     * 全景图版本号
+     */
+    @TableField("images_version")
+    private Integer imagesVersion;
+
+    /**
+     * 上传的背景音乐
+     */
+    @TableField("bg_music_name")
+    private String bgMusicName;
+
+    @TableField("jump_scene")
+    private Boolean jumpScene;
+
+    /**
+     * 旋转角度
+     */
+    @TableField("floor_plan_angle")
+    private String floorPlanAngle;
+
+    /**
+     * 场景下载次数
+     */
+    @TableField("download_num")
+    private Integer downloadNum;
+
+    /**
+     * 绿幕抠图json数据
+     */
+    @TableField("videos_user")
+    private String videosUser;
+
+    /**
+     * 大场景序号(随心装场景码)
+     */
+    @TableField("vr_num")
+    private String vrNum;
+
+    /**
+     * 随心装封面图
+     */
+    @TableField("vr_thumb")
+    private String vrThumb;
+
+
+}

+ 1 - 1
4dkankan-center-manage/src/main/java/com/fdkankan/manage/generate/AutoGenerate.java

@@ -18,7 +18,7 @@ public class AutoGenerate {
         String path =System.getProperty("user.dir") + "\\4dkankan-center-manage";
         String path =System.getProperty("user.dir") + "\\4dkankan-center-manage";
 
 
         generate(path,"manage", getTables(new String[]{
         generate(path,"manage", getTables(new String[]{
-                "t_scene_copy_log"
+                "t_scene_download_log"
         }));
         }));
 
 
 //        generate(path,"goods", getTables(new String[]{
 //        generate(path,"goods", getTables(new String[]{

+ 20 - 0
4dkankan-center-manage/src/main/java/com/fdkankan/manage/httpClient/FdKKClient.java

@@ -0,0 +1,20 @@
+package com.fdkankan.manage.httpClient;
+
+import com.alibaba.fastjson.JSONObject;
+import com.dtflys.forest.annotation.Address;
+import com.dtflys.forest.annotation.Get;
+import com.dtflys.forest.annotation.Query;
+
+import java.util.HashMap;
+import java.util.Map;
+
+/**
+ * 获取,调用4dkk服务
+ */
+@Address(source = FdkkAddressSource.class)
+public interface FdKKClient {
+
+
+    @Get("/api/scene/rebuildScene")
+    JSONObject rebuildScene( @Query HashMap<String, Object> param);
+}

+ 19 - 0
4dkankan-center-manage/src/main/java/com/fdkankan/manage/httpClient/FdkkAddressSource.java

@@ -0,0 +1,19 @@
+package com.fdkankan.manage.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 FdkkAddressSource implements AddressSource {
+
+    @Value("${4dkk.fdService.host}")
+    private String basePath;
+
+    @Override
+    public ForestAddress getAddress(ForestRequest forestRequest) {
+        return new ForestAddress("","",80,basePath);
+    }
+}

+ 18 - 0
4dkankan-center-manage/src/main/java/com/fdkankan/manage/mapper/ISceneDownloadLogMapper.java

@@ -0,0 +1,18 @@
+package com.fdkankan.manage.mapper;
+
+import com.fdkankan.manage.entity.SceneDownloadLog;
+import com.baomidou.mybatisplus.core.mapper.BaseMapper;
+import org.apache.ibatis.annotations.Mapper;
+
+/**
+ * <p>
+ *  Mapper 接口
+ * </p>
+ *
+ * @author 
+ * @since 2022-06-23
+ */
+@Mapper
+public interface ISceneDownloadLogMapper extends BaseMapper<SceneDownloadLog> {
+
+}

+ 18 - 0
4dkankan-center-manage/src/main/java/com/fdkankan/manage/mapper/ISceneProEditMapper.java

@@ -0,0 +1,18 @@
+package com.fdkankan.manage.mapper;
+
+import com.fdkankan.manage.entity.SceneProEdit;
+import com.baomidou.mybatisplus.core.mapper.BaseMapper;
+import org.apache.ibatis.annotations.Mapper;
+
+/**
+ * <p>
+ * pro场景编辑数据表 Mapper 接口
+ * </p>
+ *
+ * @author 
+ * @since 2022-06-23
+ */
+@Mapper
+public interface ISceneProEditMapper extends BaseMapper<SceneProEdit> {
+
+}

+ 13 - 0
4dkankan-center-manage/src/main/java/com/fdkankan/manage/service/IDownService.java

@@ -0,0 +1,13 @@
+package com.fdkankan.manage.service;
+
+import com.fdkankan.manage.vo.response.DownVo;
+import com.fdkankan.manage.vo.response.DownloadProcessVo;
+
+public interface IDownService {
+
+    DownVo checkDownLoad(String sceneNum);
+
+    DownVo down(String sceneNum);
+
+    DownloadProcessVo downloadProcess(String num);
+}

+ 17 - 0
4dkankan-center-manage/src/main/java/com/fdkankan/manage/service/ISceneDownloadLogService.java

@@ -0,0 +1,17 @@
+package com.fdkankan.manage.service;
+
+import com.fdkankan.manage.entity.SceneDownloadLog;
+import com.baomidou.mybatisplus.extension.service.IService;
+
+/**
+ * <p>
+ *  服务类
+ * </p>
+ *
+ * @author 
+ * @since 2022-06-23
+ */
+public interface ISceneDownloadLogService extends IService<SceneDownloadLog> {
+
+    SceneDownloadLog getByStatusAndNum(String sceneNum, Integer status,Integer isUp);
+}

+ 17 - 0
4dkankan-center-manage/src/main/java/com/fdkankan/manage/service/ISceneProEditService.java

@@ -0,0 +1,17 @@
+package com.fdkankan.manage.service;
+
+import com.fdkankan.manage.entity.SceneProEdit;
+import com.baomidou.mybatisplus.extension.service.IService;
+
+/**
+ * <p>
+ * pro场景编辑数据表 服务类
+ * </p>
+ *
+ * @author 
+ * @since 2022-06-23
+ */
+public interface ISceneProEditService extends IService<SceneProEdit> {
+
+    SceneProEdit getByProId(Long proId);
+}

+ 4 - 0
4dkankan-center-manage/src/main/java/com/fdkankan/manage/service/ISceneProService.java

@@ -34,4 +34,8 @@ public interface ISceneProService extends IService<ScenePro> {
     void move(SceneParam param);
     void move(SceneParam param);
 
 
     void copy(String num);
     void copy(String num);
+
+    void deleteByNum(String num);
+
+    ScenePro getByNum(String sceneNum);
 }
 }

+ 2 - 0
4dkankan-center-manage/src/main/java/com/fdkankan/manage/service/ISceneService.java

@@ -25,4 +25,6 @@ public interface ISceneService extends IService<Scene> {
     HashMap<Long, Long> getCountGroupByCameraId(List<Long> cameraIds);
     HashMap<Long, Long> getCountGroupByCameraId(List<Long> cameraIds);
 
 
     PageInfo pageList(SceneParam param);
     PageInfo pageList(SceneParam param);
+
+    Scene getByNum(String num);
 }
 }

+ 125 - 0
4dkankan-center-manage/src/main/java/com/fdkankan/manage/service/impl/DownService.java

@@ -0,0 +1,125 @@
+package com.fdkankan.manage.service.impl;
+
+import com.alibaba.csp.sentinel.util.StringUtil;
+import com.alibaba.fastjson.JSONObject;
+import com.fdkankan.common.constant.ErrorCode;
+import com.fdkankan.common.exception.BusinessException;
+import com.fdkankan.manage.entity.SceneDownloadLog;
+import com.fdkankan.manage.entity.ScenePro;
+import com.fdkankan.manage.entity.SceneProEdit;
+import com.fdkankan.manage.service.IDownService;
+import com.fdkankan.manage.service.ISceneDownloadLogService;
+import com.fdkankan.manage.service.ISceneProEditService;
+import com.fdkankan.manage.service.ISceneProService;
+import com.fdkankan.manage.vo.response.DownVo;
+import com.fdkankan.manage.vo.response.DownloadProcessVo;
+import com.fdkankan.redis.constant.RedisKey;
+import com.fdkankan.redis.util.RedisUtil;
+import org.apache.commons.lang3.StringUtils;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.stereotype.Service;
+
+import java.util.HashMap;
+import java.util.Map;
+
+@Service
+public class DownService implements IDownService {
+
+    @Autowired
+    ISceneProService sceneProService;
+    @Autowired
+    ISceneProEditService sceneProEditService;
+    @Autowired
+    ISceneDownloadLogService sceneDownloadLogService;
+    @Autowired
+    RedisUtil redisUtil;
+
+
+    @Override
+    public DownVo checkDownLoad(String sceneNum) {
+        if(StringUtils.isEmpty(sceneNum)){
+            throw new BusinessException(ErrorCode.MISSING_REQUIRED_PARAMETERS);
+        }
+        ScenePro scenePro = sceneProService.getByNum(sceneNum);
+        if(scenePro == null){
+            throw new BusinessException(-1,"场景不存在");
+        }
+        SceneProEdit proEdit = sceneProEditService.getByProId(scenePro.getId());
+        if(proEdit == null){
+            throw new BusinessException(-1,"编辑场景不存在");
+        }
+        SceneDownloadLog sceneDownloadLog = sceneDownloadLogService.getByStatusAndNum(sceneNum,0,scenePro.getIsUpgrade());
+        DownVo downVo = new DownVo();
+        if(sceneDownloadLog != null){
+            downVo.setDownloadStatus(1);
+            return downVo;
+        }
+        sceneDownloadLog = sceneDownloadLogService.getByStatusAndNum(sceneNum,1,scenePro.getIsUpgrade());
+        //3下载过,并且没有修改过
+        if(sceneDownloadLog != null && sceneDownloadLog.getSceneVersion().intValue() == proEdit.getVersion()){
+            downVo.setDownloadStatus(3);
+            downVo.setDownloadUrl(sceneDownloadLog.getDownloadUrl());
+            return downVo;
+        }
+        //下载过,有更改
+        if(sceneDownloadLog != null){
+            String redisKey = RedisKey.PREFIX_DOWNLOAD_PROGRESS;
+            if(scenePro.getIsUpgrade() == 1){
+                redisKey = RedisKey.PREFIX_DOWNLOAD_PROGRESS_V4;
+            }
+            downVo.setDownloadStatus(2);
+            redisUtil.del(String.format(redisKey,sceneNum));  // 清除旧的下载信息
+            return downVo;
+        }
+        return downVo;
+    }
+
+    @Override
+    public DownVo down(String sceneNum) {
+        if(StringUtils.isEmpty(sceneNum)){
+            throw new BusinessException(ErrorCode.MISSING_REQUIRED_PARAMETERS);
+        }
+        ScenePro scenePro = sceneProService.getByNum(sceneNum);
+        if(scenePro == null){
+            throw new BusinessException(-1,"场景不存在");
+        }
+        SceneProEdit proEdit = sceneProEditService.getByProId(scenePro.getId());
+        if(proEdit == null){
+            throw new BusinessException(-1,"编辑场景不存在");
+        }
+        Map<String,String> params = new HashMap<>(2);
+        params.put("type","local");
+        params.put("sceneNum",sceneNum);
+        String redisKey = RedisKey.DOWNLOAD_TASK;
+        if(scenePro.getIsUpgrade() == 1){
+            params.put("num",sceneNum);
+            redisKey = RedisKey.SCENE_DOWNLOADS_TASK_V4;
+        }
+        redisUtil.lRightPush(redisKey, JSONObject.toJSONString(params));
+        DownVo downVo = new DownVo();
+        downVo.setDownloadStatus(1);
+        return downVo;
+    }
+
+    @Override
+    public DownloadProcessVo downloadProcess(String sceneNum) {
+        if (StringUtil.isEmpty(sceneNum)) {
+            throw new BusinessException(ErrorCode.MISSING_REQUIRED_PARAMETERS);
+        }
+        ScenePro scenePro = sceneProService.getByNum(sceneNum);
+        if(scenePro == null){
+            throw new BusinessException(-1,"场景不存在");
+        }
+        String redisKey = RedisKey.PREFIX_DOWNLOAD_PROGRESS;
+        if(scenePro.getIsUpgrade() == 1){
+            redisKey = RedisKey.PREFIX_DOWNLOAD_PROGRESS_V4;
+        }
+        // 获取下载进度
+        String result = redisUtil.get(redisKey);
+        if(StringUtils.isEmpty(result)){
+            return new DownloadProcessVo();
+        }
+        return JSONObject.parseObject(result,DownloadProcessVo.class);
+    }
+
+}

+ 39 - 0
4dkankan-center-manage/src/main/java/com/fdkankan/manage/service/impl/SceneDownloadLogServiceImpl.java

@@ -0,0 +1,39 @@
+package com.fdkankan.manage.service.impl;
+
+import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
+import com.fdkankan.manage.entity.SceneDownloadLog;
+import com.fdkankan.manage.mapper.ISceneDownloadLogMapper;
+import com.fdkankan.manage.service.ISceneDownloadLogService;
+import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
+import org.springframework.stereotype.Service;
+
+import java.util.List;
+
+/**
+ * <p>
+ *  服务实现类
+ * </p>
+ *
+ * @author 
+ * @since 2022-06-23
+ */
+@Service
+public class SceneDownloadLogServiceImpl extends ServiceImpl<ISceneDownloadLogMapper, SceneDownloadLog> implements ISceneDownloadLogService {
+
+    @Override
+    public SceneDownloadLog getByStatusAndNum(String sceneNum, Integer status,Integer isUp) {
+        LambdaQueryWrapper<SceneDownloadLog> wrapper = new LambdaQueryWrapper<>();
+        wrapper.eq(SceneDownloadLog::getSceneNum,sceneNum);
+        wrapper.eq(SceneDownloadLog::getStatus,status);
+        String sysVersion = "v3";
+        if(isUp == 1){
+            sysVersion = "v4";
+        }
+        wrapper.eq(SceneDownloadLog::getSysVersion,sysVersion);
+        List<SceneDownloadLog> list = this.list(wrapper);
+        if(list != null && list.size() >0){
+            return list.get(0);
+        }
+        return null;
+    }
+}

+ 33 - 0
4dkankan-center-manage/src/main/java/com/fdkankan/manage/service/impl/SceneProEditServiceImpl.java

@@ -0,0 +1,33 @@
+package com.fdkankan.manage.service.impl;
+
+import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
+import com.fdkankan.manage.entity.SceneProEdit;
+import com.fdkankan.manage.mapper.ISceneProEditMapper;
+import com.fdkankan.manage.service.ISceneProEditService;
+import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
+import org.springframework.stereotype.Service;
+
+import java.util.List;
+
+/**
+ * <p>
+ * pro场景编辑数据表 服务实现类
+ * </p>
+ *
+ * @author 
+ * @since 2022-06-23
+ */
+@Service
+public class SceneProEditServiceImpl extends ServiceImpl<ISceneProEditMapper, SceneProEdit> implements ISceneProEditService {
+
+    @Override
+    public SceneProEdit getByProId(Long proId) {
+        LambdaQueryWrapper<SceneProEdit> wrapper = new LambdaQueryWrapper<>();
+        wrapper.eq(SceneProEdit::getProId,proId);
+        List<SceneProEdit> list = this.list(wrapper);
+        if(list != null && list.size() >0){
+            return list.get(0);
+        }
+        return null;
+    }
+}

+ 151 - 13
4dkankan-center-manage/src/main/java/com/fdkankan/manage/service/impl/SceneProServiceImpl.java

@@ -9,26 +9,25 @@ import com.fdkankan.common.constant.ConstantFilePath;
 import com.fdkankan.common.constant.ErrorCode;
 import com.fdkankan.common.constant.ErrorCode;
 import com.fdkankan.common.exception.BusinessException;
 import com.fdkankan.common.exception.BusinessException;
 import com.fdkankan.common.response.PageInfo;
 import com.fdkankan.common.response.PageInfo;
+import com.fdkankan.common.util.CreateObjUtil;
 import com.fdkankan.common.util.FileUtils;
 import com.fdkankan.common.util.FileUtils;
 import com.fdkankan.fyun.oss.UploadToOssUtil;
 import com.fdkankan.fyun.oss.UploadToOssUtil;
-import com.fdkankan.manage.entity.Camera;
-import com.fdkankan.manage.entity.CameraDetail;
-import com.fdkankan.manage.entity.ScenePro;
+import com.fdkankan.manage.entity.*;
 import com.fdkankan.manage.mapper.ISceneProMapper;
 import com.fdkankan.manage.mapper.ISceneProMapper;
 import com.fdkankan.manage.service.*;
 import com.fdkankan.manage.service.*;
 import com.fdkankan.manage.util.SceneStatusUtil;
 import com.fdkankan.manage.util.SceneStatusUtil;
 import com.fdkankan.manage.vo.request.SceneParam;
 import com.fdkankan.manage.vo.request.SceneParam;
 import com.fdkankan.manage.vo.response.GroupByCount;
 import com.fdkankan.manage.vo.response.GroupByCount;
 import com.fdkankan.manage.vo.response.SceneVo;
 import com.fdkankan.manage.vo.response.SceneVo;
+import lombok.extern.slf4j.Slf4j;
+import org.apache.commons.lang3.StringUtils;
 import org.springframework.beans.BeanUtils;
 import org.springframework.beans.BeanUtils;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.stereotype.Service;
 import org.springframework.stereotype.Service;
 
 
 import java.io.File;
 import java.io.File;
-import java.util.ArrayList;
-import java.util.HashMap;
-import java.util.List;
-import java.util.Map;
+import java.io.IOException;
+import java.util.*;
 
 
 /**
 /**
  * <p>
  * <p>
@@ -39,6 +38,7 @@ import java.util.Map;
  * @since 2022-06-16
  * @since 2022-06-16
  */
  */
 @Service
 @Service
+@Slf4j
 public class SceneProServiceImpl extends ServiceImpl<ISceneProMapper, ScenePro> implements ISceneProService {
 public class SceneProServiceImpl extends ServiceImpl<ISceneProMapper, ScenePro> implements ISceneProService {
 
 
     @Autowired
     @Autowired
@@ -52,9 +52,12 @@ public class SceneProServiceImpl extends ServiceImpl<ISceneProMapper, ScenePro>
     @Autowired
     @Autowired
     IUserIncrementService userIncrementService;
     IUserIncrementService userIncrementService;
     @Autowired
     @Autowired
+    ISceneProEditService sceneProEditService;
+    @Autowired
     private UploadToOssUtil uploadToOssUtil;
     private UploadToOssUtil uploadToOssUtil;
 
 
-    private ScenePro getByNum(String num) {
+    @Override
+    public ScenePro getByNum(String num) {
         LambdaQueryWrapper<ScenePro> wrapper = new LambdaQueryWrapper<>();
         LambdaQueryWrapper<ScenePro> wrapper = new LambdaQueryWrapper<>();
         wrapper.eq(ScenePro::getNum,num);
         wrapper.eq(ScenePro::getNum,num);
         List<ScenePro> list = this.list(wrapper);
         List<ScenePro> list = this.list(wrapper);
@@ -221,17 +224,152 @@ public class SceneProServiceImpl extends ServiceImpl<ISceneProMapper, ScenePro>
     }
     }
 
 
     @Override
     @Override
-    public void copy(String num) {
-        ScenePro sourceScene = this.getByNum(num);
+    public void copy(String sceneNum) {
+        ScenePro sourceScene = this.getByNum(sceneNum);
         if(sourceScene == null){
         if(sourceScene == null){
             throw new BusinessException(ErrorCode.MISSING_REQUIRED_PARAMETERS);
             throw new BusinessException(ErrorCode.MISSING_REQUIRED_PARAMETERS);
         }
         }
-
-        Long count = copyLogService.getCountBySceneNum(num);
+        Long count = copyLogService.getCountBySceneNum(sceneNum);
+        String newNum = sourceScene.getNum() + "-cp-" + count + 1;   //复制场景在原场景上添加标识
         ScenePro targetScene = new ScenePro();
         ScenePro targetScene = new ScenePro();
         BeanUtils.copyProperties(sourceScene,targetScene);
         BeanUtils.copyProperties(sourceScene,targetScene);
         targetScene.setId(null);
         targetScene.setId(null);
-        targetScene.setNum(sourceScene.getNum() +"-cp-"+ count + 1); //复制场景在原场景上添加标识
+        targetScene.setNum(newNum);
+        targetScene.setWebSite(sourceScene.getWebSite().replace(sceneNum, newNum));
+        targetScene.setThumb(sourceScene.getThumb().replace(sceneNum, newNum));
+        //更新video
+        HashMap<String,Object> map = new HashMap<>();
+        JSONObject object = new JSONObject();
+        if(StringUtils.isNotEmpty(sourceScene.getVideos())){
+            object = JSONObject.parseObject(sourceScene.getVideos());
+            if(object.containsKey("upPath")){
+                String upPath = object.getString("upPath");
+
+                upPath = upPath.replace(sceneNum,newNum);
+                object.put("upPath",upPath);
+            }
+            targetScene.setVideos(object.toJSONString());
+            map.put("videos",targetScene.getVideos());
+        }
+        this.save(targetScene);
+        SceneProEdit oldEditScene = sceneProEditService.getByProId(sourceScene.getId());
+        if(oldEditScene != null){
+            oldEditScene.setId(null);
+            oldEditScene.setProId(sourceScene.getId());
+            oldEditScene.setScreencapVoiceSrc(oldEditScene.getScreencapVoiceSrc() == null ? null : oldEditScene.getScreencapVoiceSrc().replace(sceneNum, newNum));
+            oldEditScene.setScreencapVoiceSound(oldEditScene.getScreencapVoiceSound() == null ? null : oldEditScene.getScreencapVoiceSound().replace(sceneNum, newNum));
+            oldEditScene.setScreencapVoiceSoundsync(oldEditScene.getScreencapVoiceSoundsync() == null ? null : oldEditScene.getScreencapVoiceSoundsync().replace(sceneNum, newNum));
+            oldEditScene.setPlayData(oldEditScene.getPlayData() == null ? null : oldEditScene.getPlayData().replace(sceneNum, newNum));
+            oldEditScene.setScreencapThumb(oldEditScene.getScreencapThumb() == null ? null : oldEditScene.getScreencapThumb().replace(sceneNum, newNum));
+            oldEditScene.setFloorPlanPng(oldEditScene.getFloorPlanPng() == null ? null : oldEditScene.getFloorPlanPng().replace(sceneNum, newNum));
+            sceneProEditService.save(oldEditScene);
+        }
+        new Thread(){
+            //重写run方法
+            @Override
+            public void run() {
+                try{
+                    log.info("开始复制场景-{}", new Date());
+                    //oss复制资源
+                    downloadFromOldNumFromOss(sceneNum, newNum);
+                    // 复制本地secen.json
+                    copyOldSceneLocalToNew(sceneNum, newNum);
+
+                    FileUtils.writeJsonFile(ConstantFilePath.SCENE_PATH + "data/data" + newNum + File.separator + "scene.json", map);
+
+                    //上传资源到oss
+                    uploadNewSceneToOss(newNum);
+
+                    log.info("复制场景结束-{}", new Date());
+
+                }catch (Exception e){
+                    log.error("复制场景异常", e);
+                }
+
+            }
+
+        }.start();
+    }
+
+    /**
+     * 从旧场景下载资源
+     * @param sceneNum
+     * @param newNum
+     * @throws Exception
+     */
+    private void downloadFromOldNumFromOss(String sceneNum, String newNum) throws Exception {
+        CreateObjUtil.ossUtilCp("images/images" + sceneNum + "/",
+                ConstantFilePath.SCENE_PATH + "images/images" + newNum);
+        CreateObjUtil.ossUtilCp("data/data" + sceneNum + "/",
+                ConstantFilePath.SCENE_PATH + "data/data" + newNum);
+        CreateObjUtil.ossUtilCp("voice/voice" + sceneNum + "/",
+                ConstantFilePath.SCENE_PATH + "voice/voice" + newNum);
+        CreateObjUtil.ossUtilCp("video/video" + sceneNum + "/",
+                ConstantFilePath.SCENE_PATH + "video/video" + newNum);
+    }
+
+    /**
+     * 上传新场景资源到oss
+     * @param newNum
+     */
+    private void uploadNewSceneToOss(String newNum) {
+        Map<String, String> map = new HashMap();
+        List<String> urlList = new ArrayList<>();
+        FileUtils.readfilePath(ConstantFilePath.SCENE_PATH + "images/images" + newNum, urlList);
+        FileUtils.readfilePath(ConstantFilePath.SCENE_PATH + "data/data" + newNum, urlList);
+        FileUtils.readfilePath(ConstantFilePath.SCENE_PATH + "voice/voice" + newNum, urlList);
+        FileUtils.readfilePath(ConstantFilePath.SCENE_PATH + "video/video" + newNum, urlList);
+        for(String url : urlList){
+            map.put(url, url.replace(ConstantFilePath.SCENE_PATH, ""));
+        }
+        uploadToOssUtil.uploadMulFiles(map);
+    }
+
+    /**
+     * 从本地旧场景拷贝资源到新场景
+     * @param sceneNum
+     * @param newNum
+     */
+    private void copyOldSceneLocalToNew(String sceneNum, String newNum) throws IOException {
+        FileUtils.copyFolderAllFiles(ConstantFilePath.SCENE_PATH + "data/data" + sceneNum + "/",
+                ConstantFilePath.SCENE_PATH + "data/data" + newNum + "/", true);
+//        log.info("成功拷贝完data文件夹-{}", sceneNum);
+
+        // 复制本地视频
+        FileUtils.copyFolderAllFiles(ConstantFilePath.SCENE_PATH + "video/video" + sceneNum + "/",
+                ConstantFilePath.SCENE_PATH + "video/video" + newNum + "/", true);
+//        log.info("成功拷贝完video文件夹-{}", sceneNum);
 
 
+        // 复制本地二维码
+        boolean copySucc = FileUtils.copyFile(ConstantFilePath.SCENE_QR_CODE_PATH + sceneNum + ".png",
+                ConstantFilePath.SCENE_QR_CODE_PATH + newNum + ".png", true);
+//        log.info("成功拷贝完二维码文件-{}", sceneNum);
+//
+//        if (!copySucc) {
+//            log.info("拷贝png失败,场景码-{}", sceneNum);
+//        }
+
+        // 复制本地二维码
+        copySucc = FileUtils.copyFile(ConstantFilePath.SCENE_QR_CODE_PATH + sceneNum + "_en.png",
+                ConstantFilePath.SCENE_QR_CODE_PATH + newNum + "_en.png", true);
+//        log.info("成功拷贝完国际二维码文件-{}", sceneNum);
+
+//        log.info("旧的场景码-{}", ConstantFilePath.SCENE_QR_CODE_PATH + sceneNum + "_en.png");
+//        log.info("新的场景码-{}", ConstantFilePath.SCENE_QR_CODE_PATH + newNum + "_en.png");
+//        if (!copySucc) {
+//            log.info("拷贝png失败,场景码-{}", sceneNum);
+//        }
+    }
+
+    @Override
+    public void deleteByNum(String num) {
+        ScenePro scenePro = this.getByNum(num);
+        if(scenePro!=null){
+            this.removeById(scenePro);
+        }
+        Scene scene = sceneService.getByNum(num);
+        if(scene!=null){
+            sceneService.removeById(scene);
+        }
     }
     }
 }
 }

+ 12 - 0
4dkankan-center-manage/src/main/java/com/fdkankan/manage/service/impl/SceneServiceImpl.java

@@ -1,5 +1,6 @@
 package com.fdkankan.manage.service.impl;
 package com.fdkankan.manage.service.impl;
 
 
+import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
 import com.baomidou.mybatisplus.core.conditions.update.LambdaUpdateWrapper;
 import com.baomidou.mybatisplus.core.conditions.update.LambdaUpdateWrapper;
 import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
 import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
 import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
 import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
@@ -60,4 +61,15 @@ public class SceneServiceImpl extends ServiceImpl<ISceneMapper, Scene> implement
         }
         }
         return PageInfo.PageInfo(page);
         return PageInfo.PageInfo(page);
     }
     }
+
+    @Override
+    public Scene getByNum(String num) {
+        LambdaQueryWrapper<Scene> wrapper = new LambdaQueryWrapper<>();
+        wrapper.eq(Scene::getNum,num);
+        List<Scene> list = this.list(wrapper);
+        if(list!=null && list.size() >0){
+            return list.get(0);
+        }
+        return null;
+    }
 }
 }

+ 9 - 0
4dkankan-center-manage/src/main/java/com/fdkankan/manage/vo/response/DownVo.java

@@ -0,0 +1,9 @@
+package com.fdkankan.manage.vo.response;
+
+import lombok.Data;
+
+@Data
+public class DownVo {
+    private Integer downloadStatus = 0;     //0未下载过,1打包资源下载,2已下载过,3下载过,并且没有修改过,无需打包直接返回下载地址,-1没下载次数不足
+    private String downloadUrl;         //下载连击
+}

+ 10 - 0
4dkankan-center-manage/src/main/java/com/fdkankan/manage/vo/response/DownloadProcessVo.java

@@ -0,0 +1,10 @@
+package com.fdkankan.manage.vo.response;
+
+import lombok.Data;
+
+@Data
+public class DownloadProcessVo {
+    private Integer status = 1000;
+    private String url;
+    private Integer percent = 0;
+}

+ 5 - 0
4dkankan-center-manage/src/main/resources/mapper/manage/SceneDownloadLogMapper.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.manage.mapper.ISceneDownloadLogMapper">
+
+</mapper>

+ 5 - 0
4dkankan-center-manage/src/main/resources/mapper/manage/SceneProEditMapper.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.manage.mapper.ISceneProEditMapper">
+
+</mapper>