فهرست منبع

加入v4场景

lyhzzz 3 سال پیش
والد
کامیت
75c2e2852a
39فایلهای تغییر یافته به همراه1490 افزوده شده و 169 حذف شده
  1. 97 0
      src/main/java/com/fdkankan/manage/common/CameraConstant.java
  2. 15 0
      src/main/java/com/fdkankan/manage/common/RedisKeyUtil.java
  3. 21 0
      src/main/java/com/fdkankan/manage/controller/Scene3dNumController.java
  4. 1 1
      src/main/java/com/fdkankan/manage/controller/SceneController.java
  5. 21 0
      src/main/java/com/fdkankan/manage/controller/SceneEditControlsController.java
  6. 21 0
      src/main/java/com/fdkankan/manage/controller/SceneEditInfoController.java
  7. 21 0
      src/main/java/com/fdkankan/manage/controller/SceneEditInfoExtController.java
  8. 60 0
      src/main/java/com/fdkankan/manage/entity/Scene3dNum.java
  9. 1 1
      src/main/java/com/fdkankan/manage/entity/SceneCopyLog.java
  10. 114 0
      src/main/java/com/fdkankan/manage/entity/SceneEditControls.java
  11. 192 0
      src/main/java/com/fdkankan/manage/entity/SceneEditInfo.java
  12. 108 0
      src/main/java/com/fdkankan/manage/entity/SceneEditInfoExt.java
  13. 1 1
      src/main/java/com/fdkankan/manage/generate/AutoGenerate.java
  14. 18 0
      src/main/java/com/fdkankan/manage/mapper/IScene3dNumMapper.java
  15. 18 0
      src/main/java/com/fdkankan/manage/mapper/ISceneEditControlsMapper.java
  16. 18 0
      src/main/java/com/fdkankan/manage/mapper/ISceneEditInfoExtMapper.java
  17. 18 0
      src/main/java/com/fdkankan/manage/mapper/ISceneEditInfoMapper.java
  18. 17 0
      src/main/java/com/fdkankan/manage/service/IScene3dNumService.java
  19. 2 0
      src/main/java/com/fdkankan/manage/service/ISceneCopyLogService.java
  20. 17 0
      src/main/java/com/fdkankan/manage/service/ISceneEditControlsService.java
  21. 17 0
      src/main/java/com/fdkankan/manage/service/ISceneEditInfoExtService.java
  22. 17 0
      src/main/java/com/fdkankan/manage/service/ISceneEditInfoService.java
  23. 1 0
      src/main/java/com/fdkankan/manage/service/IScenePlusExtService.java
  24. 4 0
      src/main/java/com/fdkankan/manage/service/IScenePlusService.java
  25. 17 1
      src/main/java/com/fdkankan/manage/service/ISceneProService.java
  26. 49 28
      src/main/java/com/fdkankan/manage/service/impl/DownService.java
  27. 136 0
      src/main/java/com/fdkankan/manage/service/impl/Scene3dNumServiceImpl.java
  28. 9 0
      src/main/java/com/fdkankan/manage/service/impl/SceneCopyLogServiceImpl.java
  29. 26 0
      src/main/java/com/fdkankan/manage/service/impl/SceneEditControlsServiceImpl.java
  30. 25 0
      src/main/java/com/fdkankan/manage/service/impl/SceneEditInfoExtServiceImpl.java
  31. 25 0
      src/main/java/com/fdkankan/manage/service/impl/SceneEditInfoServiceImpl.java
  32. 13 1
      src/main/java/com/fdkankan/manage/service/impl/ScenePlusExtServiceImpl.java
  33. 99 2
      src/main/java/com/fdkankan/manage/service/impl/ScenePlusServiceImpl.java
  34. 249 132
      src/main/java/com/fdkankan/manage/service/impl/SceneProServiceImpl.java
  35. 5 0
      src/main/resources/mapper/manage/Scene3dNumMapper.xml
  36. 5 0
      src/main/resources/mapper/manage/SceneEditControlsMapper.xml
  37. 5 0
      src/main/resources/mapper/manage/SceneEditInfoExtMapper.xml
  38. 5 0
      src/main/resources/mapper/manage/SceneEditInfoMapper.xml
  39. 2 2
      src/main/resources/mapper/manage/SceneProMapper.xml

+ 97 - 0
src/main/java/com/fdkankan/manage/common/CameraConstant.java

@@ -0,0 +1,97 @@
+package com.fdkankan.manage.common;
+
+// 6001-7000 相机状态码
+public class CameraConstant {
+
+    public static final String IMPORT_ERROR_NUM = "第{n}行存在错误,";
+
+    public static final int FAILURE_CODE_6001 = 6001;
+    public static final String FAILURE_MSG_6001 = "sn码重复";
+
+    public static final int FAILURE_CODE_6002 = 6002;
+    public static final String FAILURE_MSG_6002 = "退充值超过了充值总额";
+
+    public static final int FAILURE_CODE_6003 = 6003;
+    public static final String FAILURE_MSG_6003 = "该相机未被绑定,请前往 我的相机 先绑定相机后再进行授权 ";
+
+    public static final int FAILURE_CODE_6004 = 6004;
+    public static final String FAILURE_MSG_6004 = "表示相机的点数超过了10万";
+
+    public static final int FAILURE_CODE_6005 = 6005;
+    public static final String FAILURE_MSG_6005 = "无权操作该相机";
+
+    public static final int FAILURE_CODE_6006 = 6006;
+    public static final String FAILURE_MSG_6006 = "不支持重复绑定";
+
+    public static final int FAILURE_CODE_6007 = 6007;
+    public static final String FAILURE_MSG_6007 = "八目相机不支持解除绑定";
+
+    public static final int FAILURE_CODE_6008 = 6008;
+    public static final String FAILURE_MSG_6008 = "相机容量不足";
+
+    public static final int FAILURE_CODE_6009 = 6009;
+    public static final String FAILURE_MSG_6009 = "data.fdage文件不存在";
+
+    public static final int FAILURE_CODE_6010 = 6010;
+    public static final String FAILURE_MSG_6010 = "该序列号已被绑定";
+
+    public static final int FAILURE_CODE_6011 = 6011;
+    public static final String FAILURE_MSG_6011 = "查询不到企业相机列表";
+
+    public static final int FAILURE_CODE_6012 = 6012;
+    public static final String FAILURE_MSG_6012 = "相机未绑定用户";
+
+    public static final int FAILURE_CODE_6013 = 6013;
+    public static final String FAILURE_MSG_6013 = "必须输入需迁相机所绑定用户的验证码";
+
+    public static final int FAILURE_CODE_6014 = 6014;
+    public static final String FAILURE_MSG_6014 = "必须输入目标相机所绑定用户的验证码";
+
+    public static final int FAILURE_CODE_6015 = 6015;
+    public static final String FAILURE_MSG_6015 = "该相机已添加协作者,请先取消协作后再添加";
+
+    public static final int FAILURE_CODE_6016 = 6016;
+    public static final String FAILURE_MSG_6016 = "部分相机已添加协作者,请先取消协作后再添加";
+
+    public static final int FAILURE_CODE_6017 = 6017;
+    public static final String FAILURE_MSG_6017 = "设备已出库,不可删除";
+
+    public static final int FAILURE_CODE_6018 = 6018;
+    public static final String FAILURE_MSG_6018 = "设备类型不存在";
+
+    public static final int FAILURE_CODE_6019 = 6019;
+    public static final String FAILURE_MSG_6019 = "sn码未填写";
+
+    public static final int FAILURE_CODE_6020 = 6020;
+    public static final String FAILURE_MSG_6020 = "sn码不存在";
+
+    public static final int FAILURE_CODE_6021 = 6021;
+    public static final String FAILURE_MSG_6021 = "出库类型未填写";
+
+    public static final int FAILURE_CODE_6022 = 6022;
+    public static final String FAILURE_MSG_6022 = "出库类型不存在";
+
+    public static final int FAILURE_CODE_6023 = 6023;
+    public static final String FAILURE_MSG_6023 = "经销商未填写";
+
+    public static final int FAILURE_CODE_6024 = 6024;
+    public static final String FAILURE_MSG_6024 = "经销商类型不存在";
+
+    public static final int FAILURE_CODE_6025 = 6025;
+    public static final String FAILURE_MSG_6025 = "sn码未出库";
+
+    public static final int FAILURE_CODE_6026 = 6026;
+    public static final String FAILURE_MSG_6026 = "客户名称未填写";
+
+    public static final int FAILURE_CODE_6027 = 6027;
+    public static final String FAILURE_MSG_6027 = "客户名称不存在";
+
+    public static final int FAILURE_CODE_6028 = 6028;
+    public static final String FAILURE_MSG_6028 = "相机类型不正确!";
+
+    public static final int FAILURE_CODE_6029 = 6029;
+    public static final String FAILURE_MSG_6029 = "相机不存在!";
+
+    public static final int FAILURE_CODE_6030 = 6030;
+    public static final String FAILURE_MSG_6030 = "绑定相机类型有误,请先切换相机类型后再绑定";
+}

+ 15 - 0
src/main/java/com/fdkankan/manage/common/RedisKeyUtil.java

@@ -0,0 +1,15 @@
+package com.fdkankan.manage.common;
+
+public class RedisKeyUtil {
+
+    public static final String PREFIX_MSG_NOT_CODE = "msg:not:code:";//短信重发验证
+    public static final String PREFIX_MSG_AUTH_CODE = "msg:auth:code:";
+
+    public static final String PREFIX_CACHE_CAMERA = "camera:";
+    public static final String SCENE_UNUSED_NUMS = "4dkankan:scene:nums";
+    public static final String SCENE_NUMS_LOADING = "4dkankan:scene:nums:loading";
+    public static final String SCENE_VIEW_COUNT = "4dkankan:scene:nums:view_count:";
+
+    public static final String QRCODE= "4dkankan:qr_code:";
+
+}

+ 21 - 0
src/main/java/com/fdkankan/manage/controller/Scene3dNumController.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-08-12
+ */
+@RestController
+@RequestMapping("/manage/scene3dNum")
+public class Scene3dNumController {
+
+}
+

+ 1 - 1
src/main/java/com/fdkankan/manage/controller/SceneController.java

@@ -55,7 +55,7 @@ public class SceneController {
      * num      场景码
      */
     @PostMapping("/copy")
-    public ResultData copy(@RequestBody SceneParam param){
+    public ResultData copy(@RequestBody SceneParam param) throws Exception {
         if(StringUtils.isEmpty(param.getNum())){
             throw new BusinessException(ErrorCode.MISSING_REQUIRED_PARAMETERS);
         }

+ 21 - 0
src/main/java/com/fdkankan/manage/controller/SceneEditControlsController.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-08-12
+ */
+@RestController
+@RequestMapping("/manage/sceneEditControls")
+public class SceneEditControlsController {
+
+}
+

+ 21 - 0
src/main/java/com/fdkankan/manage/controller/SceneEditInfoController.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-08-12
+ */
+@RestController
+@RequestMapping("/manage/sceneEditInfo")
+public class SceneEditInfoController {
+
+}
+

+ 21 - 0
src/main/java/com/fdkankan/manage/controller/SceneEditInfoExtController.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-08-12
+ */
+@RestController
+@RequestMapping("/manage/sceneEditInfoExt")
+public class SceneEditInfoExtController {
+
+}
+

+ 60 - 0
src/main/java/com/fdkankan/manage/entity/Scene3dNum.java

@@ -0,0 +1,60 @@
+package com.fdkankan.manage.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 2022-08-12
+ */
+@Getter
+@Setter
+@TableName("t_scene_3d_num")
+public class Scene3dNum implements Serializable {
+
+    private static final long serialVersionUID = 1L;
+
+    @TableId(value = "id", type = IdType.AUTO)
+    private Long id;
+
+    @TableField("used")
+    private Integer used;
+
+    @TableField("folder_name")
+    private String folderName;
+
+    @TableField("code")
+    private String code;
+
+    /**
+     * 记录的状态,A: 生效,I: 禁用
+     */
+    @TableField("rec_status")
+    @TableLogic
+    private String recStatus;
+
+    /**
+     * 更新时间
+     */
+    @TableField("update_time")
+    private Date updateTime;
+
+    /**
+     * 创建时间
+     */
+    @TableField("create_time")
+    private Date createTime;
+
+
+}

+ 1 - 1
src/main/java/com/fdkankan/manage/entity/SceneCopyLog.java

@@ -31,7 +31,7 @@ public class SceneCopyLog implements Serializable {
     private String newNum;
 
     @TableField("copy_user_id")
-    private Integer copyUserId;
+    private Long copyUserId;
 
     @TableField("rec_status")
     @TableLogic(value = "A",delval = "I")

+ 114 - 0
src/main/java/com/fdkankan/manage/entity/SceneEditControls.java

@@ -0,0 +1,114 @@
+package com.fdkankan.manage.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 2022-08-12
+ */
+@Getter
+@Setter
+@TableName("t_scene_edit_controls")
+public class SceneEditControls implements Serializable {
+
+    private static final long serialVersionUID = 1L;
+
+    /**
+     * 主键
+     */
+    @TableId(value = "id", type = IdType.AUTO)
+    private Long id;
+
+    /**
+     * t_scene_edit_info表id
+     */
+    @TableField("edit_info_id")
+    private Long editInfoId;
+
+    /**
+     * 是否展示小地图(0-不展示,1-展示)
+     */
+    @TableField("show_map")
+    private Integer showMap;
+
+    /**
+     * 是否需要密码(0-不需要,1-需要)
+     */
+    @TableField("show_lock")
+    private Integer showLock;
+
+    /**
+     * 是否展示标题(0-不需要,1-需要)
+     */
+    @TableField("show_title")
+    private Integer showTitle;
+
+    /**
+     * 是否展示漫游按钮(0-不需要,1-需要)
+     */
+    @TableField("show_panorama")
+    private Integer showPanorama;
+
+    /**
+     * 是否展示3D按钮(0-不需要,1-需要)
+     */
+    @TableField("show_dollhouse")
+    private Integer showDollhouse;
+
+    /**
+     * 是否展示2D按钮(0-不需要,1-需要)
+     */
+    @TableField("show_floorplan")
+    private Integer showFloorplan;
+
+    /**
+     * 是否展示VR(0-不需要,1-需要)
+     */
+    @TableField("show_VR")
+    private Integer showVr;
+
+    /**
+     * 是否展示自动导览(0-不需要,1-需要)
+     */
+    @TableField("show_tour")
+    private Integer showTour;
+
+    /**
+     * 是否展示测量线(0-不需要,1-需要)
+     */
+    @TableField("show_rule")
+    private Integer showRule;
+
+    /**
+     * 创建时间
+     */
+    @TableField("create_time")
+    private Date createTime;
+
+    /**
+     * 更新时间
+     */
+    @TableField("update_time")
+    private Date updateTime;
+
+    /**
+     * 0-有效,1-删除, 2-禁用
+     */
+    @TableField("rec_status")
+    @TableLogic
+    private String recStatus;
+
+
+}

+ 192 - 0
src/main/java/com/fdkankan/manage/entity/SceneEditInfo.java

@@ -0,0 +1,192 @@
+package com.fdkankan.manage.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 2022-08-12
+ */
+@Getter
+@Setter
+@TableName("t_scene_edit_info")
+public class SceneEditInfo implements Serializable {
+
+    private static final long serialVersionUID = 1L;
+
+    /**
+     * 主键
+     */
+    @TableId(value = "id", type = IdType.AUTO)
+    private Long id;
+
+    @TableField("scene_pro_id")
+    private Long sceneProId;
+
+    @TableField("scene_plus_id")
+    private Long scenePlusId;
+
+    /**
+     * 地面logo名称
+     */
+    @TableField("floor_logo")
+    private String floorLogo;
+
+    /**
+     * 地面logo大小
+     */
+    @TableField("floor_logo_size")
+    private Integer floorLogoSize;
+
+    /**
+     * 地面logo文件名称
+     */
+    @TableField("floor_logo_file")
+    private String floorLogoFile;
+
+    /**
+     * 背景音乐名称
+     */
+    @TableField("music")
+    private String music;
+
+    /**
+     * 背景音乐文件名称
+     */
+    @TableField("music_file")
+    private String musicFile;
+
+    /**
+     * 浏览密码
+     */
+    @TableField("scene_password")
+    private String scenePassword;
+
+    /**
+     * 场景标题
+     */
+    @TableField("title")
+    private String title;
+
+    /**
+     * 场景描述
+     */
+    @TableField("description")
+    private String description;
+
+    /**
+     * 用户是否上传户型图(0-否,1-是)
+     */
+    @TableField("floor_plan_user")
+    private Integer floorPlanUser;
+
+    /**
+     * 是否有热点数据(0-否,1-是)
+     */
+    @TableField("tags")
+    private Integer tags;
+
+    /**
+     * 版本
+     */
+    @TableField("version")
+    private Integer version;
+
+    /**
+     * 图片版本
+     */
+    @TableField("img_version")
+    private Integer imgVersion;
+
+    /**
+     * 场景关联版本
+     */
+    @TableField("link_version")
+    private Integer linkVersion;
+
+    /**
+     * 是否上传模型
+     */
+    @TableField("is_upload_obj")
+    private Integer isUploadObj;
+
+    /**
+     * 重新建模的版本
+     */
+    @TableField("floor_edit_ver")
+    private Integer floorEditVer;
+
+    /**
+     * 正式发布重新建模的版本
+     */
+    @TableField("floor_publish_ver")
+    private Integer floorPublishVer;
+
+    /**
+     * 空间视频数据
+     */
+    @TableField("box_videos")
+    private String boxVideos;
+
+    /**
+     * 空间贴图数据
+     */
+    @TableField("box_photos")
+    private String boxPhotos;
+
+    /**
+     * 是否需要处理球幕视频
+     */
+    @TableField("build_video_status")
+    private Integer buildVideoStatus;
+
+    /**
+     * 初始点信息
+     */
+    @TableField("entry")
+    private String entry;
+
+    /**
+     * 加载logo名
+     */
+    @TableField("loading_logo")
+    private String loadingLogo;
+
+    /**
+     * 加载logo文件名
+     */
+    @TableField("loading_logo_file")
+    private String loadingLogoFile;
+
+    /**
+     * 创建时间
+     */
+    @TableField("create_time")
+    private Date createTime;
+
+    /**
+     * 修改时间
+     */
+    @TableField("update_time")
+    private Date updateTime;
+
+    /**
+     * 0-有效,1-删除, 2-禁用
+     */
+    @TableField("rec_status")
+    @TableLogic
+    private String recStatus;
+
+
+}

+ 108 - 0
src/main/java/com/fdkankan/manage/entity/SceneEditInfoExt.java

@@ -0,0 +1,108 @@
+package com.fdkankan.manage.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 2022-08-12
+ */
+@Getter
+@Setter
+@TableName("t_scene_edit_info_ext")
+public class SceneEditInfoExt implements Serializable {
+
+    private static final long serialVersionUID = 1L;
+
+    @TableId(value = "id", type = IdType.AUTO)
+    private Long id;
+
+    @TableField("scene_pro_id")
+    private Long sceneProId;
+
+    @TableField("scene_plus_id")
+    private Long scenePlusId;
+
+    @TableField("edit_info_id")
+    private Long editInfoId;
+
+    /**
+     * 户型角度
+     */
+    @TableField("floor_plan_angle")
+    private Float floorPlanAngle;
+
+    /**
+     * 指南针角度
+     */
+    @TableField("floor_plan_compass")
+    private Float floorPlanCompass;
+
+    /**
+     * 大场景序号(随心装场景码)  原pro_edit表中的字段
+     */
+    @TableField("vr_num")
+    private String vrNum;
+
+    /**
+     * 是否有保存导览(0-否,1-是)
+     */
+    @TableField("tours")
+    private Integer tours;
+
+    /**
+     * 马赛克数据
+     */
+    @TableField("mosaics")
+    private String mosaics;
+
+    /**
+     * 是否有马赛克
+     */
+    @TableField("mosaic")
+    private Integer mosaic;
+
+    /**
+     * 水印文件名
+     */
+    @TableField("water_mark")
+    private String waterMark;
+
+    /**
+     * 是否有场景关联(0-否,1-是)
+     */
+    @TableField("links")
+    private Integer links;
+
+    /**
+     * 创建时间
+     */
+    @TableField("create_time")
+    private Date createTime;
+
+    /**
+     * 修改时间
+     */
+    @TableField("update_time")
+    private Date updateTime;
+
+    /**
+     * 0-有效,1-删除, 2-禁用
+     */
+    @TableField("rec_status")
+    @TableLogic
+    private String recStatus;
+
+
+}

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

@@ -18,7 +18,7 @@ public class AutoGenerate {
         String path =System.getProperty("user.dir");
 
         generate(path,"manage", getTables(new String[]{
-                "t_scene_plus","t_scene_plus_ext"
+                "t_scene_edit_controls","t_scene_edit_info","t_scene_edit_info_ext"
         }));
 
 //        generate(path,"goods", getTables(new String[]{

+ 18 - 0
src/main/java/com/fdkankan/manage/mapper/IScene3dNumMapper.java

@@ -0,0 +1,18 @@
+package com.fdkankan.manage.mapper;
+
+import com.fdkankan.manage.entity.Scene3dNum;
+import com.baomidou.mybatisplus.core.mapper.BaseMapper;
+import org.apache.ibatis.annotations.Mapper;
+
+/**
+ * <p>
+ * 场景编码表 Mapper 接口
+ * </p>
+ *
+ * @author 
+ * @since 2022-08-12
+ */
+@Mapper
+public interface IScene3dNumMapper extends BaseMapper<Scene3dNum> {
+
+}

+ 18 - 0
src/main/java/com/fdkankan/manage/mapper/ISceneEditControlsMapper.java

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

+ 18 - 0
src/main/java/com/fdkankan/manage/mapper/ISceneEditInfoExtMapper.java

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

+ 18 - 0
src/main/java/com/fdkankan/manage/mapper/ISceneEditInfoMapper.java

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

+ 17 - 0
src/main/java/com/fdkankan/manage/service/IScene3dNumService.java

@@ -0,0 +1,17 @@
+package com.fdkankan.manage.service;
+
+import com.fdkankan.manage.entity.Scene3dNum;
+import com.baomidou.mybatisplus.extension.service.IService;
+
+/**
+ * <p>
+ * 场景编码表 服务类
+ * </p>
+ *
+ * @author 
+ * @since 2022-08-12
+ */
+public interface IScene3dNumService extends IService<Scene3dNum> {
+
+    String generateSceneNum(Integer type);
+}

+ 2 - 0
src/main/java/com/fdkankan/manage/service/ISceneCopyLogService.java

@@ -14,4 +14,6 @@ import com.baomidou.mybatisplus.extension.service.IService;
 public interface ISceneCopyLogService extends IService<SceneCopyLog> {
 
     Long getCountBySceneNum(String num);
+
+    void saveByNum(String oldNum, String newNum, Long userId);
 }

+ 17 - 0
src/main/java/com/fdkankan/manage/service/ISceneEditControlsService.java

@@ -0,0 +1,17 @@
+package com.fdkankan.manage.service;
+
+import com.fdkankan.manage.entity.SceneEditControls;
+import com.baomidou.mybatisplus.extension.service.IService;
+
+/**
+ * <p>
+ *  服务类
+ * </p>
+ *
+ * @author 
+ * @since 2022-08-12
+ */
+public interface ISceneEditControlsService extends IService<SceneEditControls> {
+
+    SceneEditControls getBySceneEditId(Long sceneEditInfoId);
+}

+ 17 - 0
src/main/java/com/fdkankan/manage/service/ISceneEditInfoExtService.java

@@ -0,0 +1,17 @@
+package com.fdkankan.manage.service;
+
+import com.fdkankan.manage.entity.SceneEditInfoExt;
+import com.baomidou.mybatisplus.extension.service.IService;
+
+/**
+ * <p>
+ *  服务类
+ * </p>
+ *
+ * @author 
+ * @since 2022-08-12
+ */
+public interface ISceneEditInfoExtService extends IService<SceneEditInfoExt> {
+
+    SceneEditInfoExt getByEditInfoId(Long sceneEditInfoId);
+}

+ 17 - 0
src/main/java/com/fdkankan/manage/service/ISceneEditInfoService.java

@@ -0,0 +1,17 @@
+package com.fdkankan.manage.service;
+
+import com.fdkankan.manage.entity.SceneEditInfo;
+import com.baomidou.mybatisplus.extension.service.IService;
+
+/**
+ * <p>
+ *  服务类
+ * </p>
+ *
+ * @author 
+ * @since 2022-08-12
+ */
+public interface ISceneEditInfoService extends IService<SceneEditInfo> {
+
+    SceneEditInfo getByScenePlusId(Long plusId);
+}

+ 1 - 0
src/main/java/com/fdkankan/manage/service/IScenePlusExtService.java

@@ -13,4 +13,5 @@ import com.baomidou.mybatisplus.extension.service.IService;
  */
 public interface IScenePlusExtService extends IService<ScenePlusExt> {
 
+    ScenePlusExt getByPlusId(Long plusId);
 }

+ 4 - 0
src/main/java/com/fdkankan/manage/service/IScenePlusService.java

@@ -1,5 +1,6 @@
 package com.fdkankan.manage.service;
 
+import com.fdkankan.manage.entity.CameraDetail;
 import com.fdkankan.manage.entity.ScenePlus;
 import com.baomidou.mybatisplus.extension.service.IService;
 
@@ -13,4 +14,7 @@ import com.baomidou.mybatisplus.extension.service.IService;
  */
 public interface IScenePlusService extends IService<ScenePlus> {
 
+    ScenePlus getByNum(String sceneNum);
+
+    void copyV4Scene(ScenePlus scenePlus, String newNum, CameraDetail detailEntity) throws Exception;
 }

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

@@ -33,9 +33,25 @@ public interface ISceneProService extends IService<ScenePro> {
 
     void move(SceneParam param);
 
-    void copy(String num);
+    void copy(String num) throws Exception;
 
     void deleteByNum(String num);
 
     ScenePro getByNum(String sceneNum);
+
+    void copyV3Scene(ScenePro scenePro, String newNum, CameraDetail detailEntity) throws Exception;
+
+    String setDataSource(String preDataSource, Integer sceneSource) throws Exception;
+
+    ScenePro findByFileId(String concat);
+
+    void setQrCode(String buildType, String num) throws Exception;
+
+    void copyOssSource(String v3, String oldNum, String newNum) throws Exception;
+
+    void copyLocalSource(String oldNum, String newNum) throws Exception;
+
+    void updateSceneJson(String v3, String videos, String newNum, String sceneName, String webSite, String thumb, Long id) throws Exception;
+
+    void uploadNewSceneToOss(String newNum);
 }

+ 49 - 28
src/main/java/com/fdkankan/manage/service/impl/DownService.java

@@ -2,14 +2,10 @@ package com.fdkankan.manage.service.impl;
 
 import com.alibaba.fastjson.JSONObject;
 import com.fdkankan.common.constant.ErrorCode;
+import com.fdkankan.common.constant.SceneConstant;
 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.entity.*;
+import com.fdkankan.manage.service.*;
 import com.fdkankan.manage.vo.response.DownVo;
 import com.fdkankan.manage.vo.response.DownloadProcessVo;
 import com.fdkankan.redis.constant.RedisKey;
@@ -31,6 +27,10 @@ public class DownService implements IDownService {
     @Autowired
     ISceneDownloadLogService sceneDownloadLogService;
     @Autowired
+    IScenePlusService scenePlusService;
+    @Autowired
+    ISceneEditInfoService sceneEditInfoService;
+    @Autowired
     RedisUtil redisUtil;
 
 
@@ -40,22 +40,26 @@ public class DownService implements IDownService {
             throw new BusinessException(ErrorCode.MISSING_REQUIRED_PARAMETERS);
         }
         ScenePro scenePro = sceneProService.getByNum(sceneNum);
-        if(scenePro == null){
-            throw new BusinessException(-1,"场景不存在");
+        ScenePlus plus = scenePlusService.getByNum(sceneNum);
+        if(scenePro == null && plus == null){
+            throw new BusinessException(SceneConstant.FAILURE_CODE_5005, SceneConstant.FAILURE_MSG_5005);
         }
-        SceneProEdit proEdit = sceneProEditService.getByProId(scenePro.getId());
-        if(proEdit == null){
-            throw new BusinessException(-1,"编辑场景不存在");
+        SceneDownloadLog sceneDownloadLog;
+        int isUp = 0;
+        if(scenePro == null){
+            isUp = 1;
         }
-        SceneDownloadLog sceneDownloadLog = sceneDownloadLogService.getByStatusAndNum(sceneNum,0,scenePro.getIsUpgrade());
+        Integer sceneVersion = getSceneVersion(scenePro, plus);
+
+        sceneDownloadLog = sceneDownloadLogService.getByStatusAndNum(sceneNum,0,isUp);
         DownVo downVo = new DownVo();
         if(sceneDownloadLog != null){
             downVo.setDownloadStatus(1);
             return downVo;
         }
-        sceneDownloadLog = sceneDownloadLogService.getByStatusAndNum(sceneNum,1,scenePro.getIsUpgrade());
+        sceneDownloadLog = sceneDownloadLogService.getByStatusAndNum(sceneNum,1,isUp);
         //3下载过,并且没有修改过
-        if(sceneDownloadLog != null && sceneDownloadLog.getSceneVersion().intValue() == proEdit.getVersion()){
+        if(sceneDownloadLog != null && sceneDownloadLog.getSceneVersion().intValue() == sceneVersion){
             downVo.setDownloadStatus(3);
             downVo.setDownloadUrl(sceneDownloadLog.getDownloadUrl());
             return downVo;
@@ -63,7 +67,7 @@ public class DownService implements IDownService {
         //下载过,有更改
         if(sceneDownloadLog != null){
             String redisKey = RedisKey.PREFIX_DOWNLOAD_PROGRESS;
-            if(scenePro.getIsUpgrade() == 1){
+            if(isUp == 1){
                 redisKey = RedisKey.PREFIX_DOWNLOAD_PROGRESS_V4;
             }
             downVo.setDownloadStatus(2);
@@ -73,29 +77,45 @@ public class DownService implements IDownService {
         return downVo;
     }
 
+    private Integer getSceneVersion(ScenePro scenePro, ScenePlus scenePlus) {
+        Integer version = 0;
+        if(scenePro != null){
+            SceneProEdit proEdit = sceneProEditService.getByProId(scenePro.getId());
+            if(proEdit == null){
+                throw new BusinessException(SceneConstant.FAILURE_CODE_5005, SceneConstant.FAILURE_MSG_5005);
+            }
+            version = proEdit.getVersion();
+        }
+        if(scenePro == null && scenePlus !=null){
+            SceneEditInfo sceneEditInfo = sceneEditInfoService.getByScenePlusId(scenePlus.getId());
+            if(sceneEditInfo == null){
+                throw new BusinessException(SceneConstant.FAILURE_CODE_5005, SceneConstant.FAILURE_MSG_5005);
+            }
+            version = sceneEditInfo.getVersion();
+        }
+        return version;
+    }
+
     @Override
     public DownVo down(String sceneNum) {
-        if(StringUtils.isEmpty(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,"编辑场景不存在");
+        ScenePlus scenePlus = scenePlusService.getByNum(sceneNum);
+        if(scenePro == null && scenePlus == null){
+            throw new BusinessException(SceneConstant.FAILURE_CODE_5005, SceneConstant.FAILURE_MSG_5005);
         }
+        DownVo downVo = new DownVo();
         Map<String,String> params = new HashMap<>(2);
         params.put("type","local");
         params.put("sceneNum",sceneNum);
         String redisKey = RedisKey.DOWNLOAD_TASK;
-        if(scenePro.getIsUpgrade() == 1){
+        if(scenePro == null){
             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;
     }
@@ -106,11 +126,12 @@ public class DownService implements IDownService {
             throw new BusinessException(ErrorCode.MISSING_REQUIRED_PARAMETERS);
         }
         ScenePro scenePro = sceneProService.getByNum(sceneNum);
-        if(scenePro == null){
-            throw new BusinessException(-1,"场景不存在");
+        ScenePlus scenePlus = scenePlusService.getByNum(sceneNum);
+        if(scenePro == null && scenePlus == null){
+            throw new BusinessException(SceneConstant.FAILURE_CODE_5005, SceneConstant.FAILURE_MSG_5005);
         }
         String redisKey = RedisKey.PREFIX_DOWNLOAD_PROGRESS;
-        if(scenePro.getIsUpgrade() == 1){
+        if(scenePro == null){
             redisKey = RedisKey.PREFIX_DOWNLOAD_PROGRESS_V4;
         }
         // 获取下载进度

+ 136 - 0
src/main/java/com/fdkankan/manage/service/impl/Scene3dNumServiceImpl.java

@@ -0,0 +1,136 @@
+package com.fdkankan.manage.service.impl;
+
+import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
+import com.fdkankan.common.exception.BusinessException;
+import com.fdkankan.common.util.RandomUtil;
+import com.fdkankan.manage.common.CameraTypeEnum;
+import com.fdkankan.manage.common.RedisKeyUtil;
+import com.fdkankan.manage.entity.Scene3dNum;
+import com.fdkankan.manage.mapper.IScene3dNumMapper;
+import com.fdkankan.manage.service.IScene3dNumService;
+import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
+import com.fdkankan.redis.util.RedisUtil;
+import lombok.extern.slf4j.Slf4j;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.stereotype.Service;
+import org.springframework.util.ObjectUtils;
+import org.springframework.util.StringUtils;
+
+import java.util.*;
+import java.util.stream.Collectors;
+
+/**
+ * <p>
+ * 场景编码表 服务实现类
+ * </p>
+ *
+ * @author 
+ * @since 2022-08-12
+ */
+@Service
+@Slf4j
+public class Scene3dNumServiceImpl extends ServiceImpl<IScene3dNumMapper, Scene3dNum> implements IScene3dNumService {
+
+    @Autowired
+    RedisUtil redisUtil;
+
+    @Override
+    public String generateSceneNum(Integer cameraType) {
+        String sceneNum = redisUtil.lLeftPop(RedisKeyUtil.SCENE_UNUSED_NUMS);
+        if(!StringUtils.isEmpty(sceneNum)){
+            return addPrefix(sceneNum,cameraType);
+        }
+        long incr = redisUtil.incr(RedisKeyUtil.SCENE_NUMS_LOADING, 1);
+        if(incr == 1){
+            try {
+                log.info("开始从数据库加载场景码");
+                List<String> numList = this.getSceneNum();
+                redisUtil.lRightPushAll(RedisKeyUtil.SCENE_UNUSED_NUMS,numList);
+                log.info("场景码加载完成");
+            }catch ( Exception e){
+                e.printStackTrace();
+            }finally {
+                redisUtil.del(RedisKeyUtil.SCENE_NUMS_LOADING);
+            }
+        }else {
+            // 等待1秒加载缓存
+            try {
+                Thread.sleep(1000);
+            } catch (InterruptedException e) {
+                e.printStackTrace();
+            }
+        }
+        String num = redisUtil.lLeftPop(RedisKeyUtil.SCENE_UNUSED_NUMS);
+        if(ObjectUtils.isEmpty(num)){
+            log.error("场景码加载失败");
+            throw new BusinessException(-1,"场景码生成失败,请重试");
+        }
+        return addPrefix(num,cameraType);
+    }
+
+    private  static  String addPrefix( String num,Integer cameraType){
+        if(cameraType == null){
+            return num;
+        }
+        return CameraTypeEnum.getSceneNumPrefixByType(cameraType) + num;
+    }
+
+    private List<String> getSceneNum() {
+        LambdaQueryWrapper<Scene3dNum> wrapper = new LambdaQueryWrapper<>();
+        wrapper.eq(Scene3dNum::getUsed,0);
+        long count = this.count(wrapper);
+        List<Scene3dNum> numList ;
+        if(count < 10){
+            log.info("场景码数量不足生成场景码");
+            numList = this.createNum(10);
+        }else {
+            wrapper.last("limit 100");
+            numList = this.list(wrapper);
+            for (Scene3dNum scene3dNum : numList) {
+                scene3dNum.setUsed(1);
+            }
+            this.updateBatchById(numList);
+        }
+        return  numList.parallelStream().map(Scene3dNum::getCode).collect(Collectors.toList());
+    }
+
+    private List<Scene3dNum> createNum(Integer size) {
+        //uuid 作为生成批次
+        List<Scene3dNum> scene3dNums = new ArrayList<>();
+        String uuid = UUID.randomUUID().toString().replace("-", "");
+        HashSet<String> codeList = this.createCode(size);
+        while (codeList.size() < size){
+            codeList.addAll(this.createCode(size - codeList.size()));
+        }
+        for (String code : codeList) {
+            Scene3dNum scene3dNum = new Scene3dNum();
+            scene3dNum.setUsed(1);
+            scene3dNum.setCode(code);
+            scene3dNum.setFolderName(uuid);
+            scene3dNum.setCreateTime(new Date());
+            scene3dNum.setUpdateTime(new Date());
+            scene3dNums.add(scene3dNum);
+        }
+        this.saveBatch(scene3dNums);
+        return scene3dNums;
+    }
+
+    private HashSet<String> createCode(Integer size) {
+        HashSet<String> codeList = new HashSet<>();
+        while (codeList.size() < size){
+            String code = RandomUtil.generateShortUuid().substring(0,8);
+            codeList.add(code);
+        }
+        LambdaQueryWrapper<Scene3dNum> wrapper = new LambdaQueryWrapper<>();
+        wrapper.in(Scene3dNum::getCode,codeList);
+        List<Scene3dNum> list = this.list(wrapper);
+        if(list.size() <=0){
+            return codeList;
+        }
+        for (Scene3dNum scene3dNum : list) {
+            codeList.remove(scene3dNum.getCode());
+        }
+        return codeList;
+    }
+
+}

+ 9 - 0
src/main/java/com/fdkankan/manage/service/impl/SceneCopyLogServiceImpl.java

@@ -24,4 +24,13 @@ public class SceneCopyLogServiceImpl extends ServiceImpl<ISceneCopyLogMapper, Sc
         wrapper.eq(SceneCopyLog::getOldNum,num);
         return this.count(wrapper);
     }
+
+    @Override
+    public void saveByNum(String oldNum, String newNum, Long userId) {
+        SceneCopyLog sceneCopyLog = new SceneCopyLog();
+        sceneCopyLog.setOldNum(oldNum);
+        sceneCopyLog.setNewNum(newNum);
+        sceneCopyLog.setCopyUserId(userId);
+        this.save(sceneCopyLog);
+    }
 }

+ 26 - 0
src/main/java/com/fdkankan/manage/service/impl/SceneEditControlsServiceImpl.java

@@ -0,0 +1,26 @@
+package com.fdkankan.manage.service.impl;
+
+import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
+import com.fdkankan.manage.entity.SceneEditControls;
+import com.fdkankan.manage.mapper.ISceneEditControlsMapper;
+import com.fdkankan.manage.service.ISceneEditControlsService;
+import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
+import org.springframework.stereotype.Service;
+
+/**
+ * <p>
+ *  服务实现类
+ * </p>
+ *
+ * @author 
+ * @since 2022-08-12
+ */
+@Service
+public class SceneEditControlsServiceImpl extends ServiceImpl<ISceneEditControlsMapper, SceneEditControls> implements ISceneEditControlsService {
+
+    @Override
+    public SceneEditControls getBySceneEditId(Long sceneEditInfoId) {
+        return this.getOne(new LambdaQueryWrapper<SceneEditControls>()
+                .eq(SceneEditControls::getEditInfoId, sceneEditInfoId));
+    }
+}

+ 25 - 0
src/main/java/com/fdkankan/manage/service/impl/SceneEditInfoExtServiceImpl.java

@@ -0,0 +1,25 @@
+package com.fdkankan.manage.service.impl;
+
+import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
+import com.fdkankan.manage.entity.SceneEditInfoExt;
+import com.fdkankan.manage.mapper.ISceneEditInfoExtMapper;
+import com.fdkankan.manage.service.ISceneEditInfoExtService;
+import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
+import org.springframework.stereotype.Service;
+
+/**
+ * <p>
+ *  服务实现类
+ * </p>
+ *
+ * @author 
+ * @since 2022-08-12
+ */
+@Service
+public class SceneEditInfoExtServiceImpl extends ServiceImpl<ISceneEditInfoExtMapper, SceneEditInfoExt> implements ISceneEditInfoExtService {
+
+    @Override
+    public SceneEditInfoExt getByEditInfoId(Long sceneEditInfoId) {
+        return this.getOne(new LambdaQueryWrapper<SceneEditInfoExt>().eq(SceneEditInfoExt::getEditInfoId, sceneEditInfoId));
+    }
+}

+ 25 - 0
src/main/java/com/fdkankan/manage/service/impl/SceneEditInfoServiceImpl.java

@@ -0,0 +1,25 @@
+package com.fdkankan.manage.service.impl;
+
+import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
+import com.fdkankan.manage.entity.SceneEditInfo;
+import com.fdkankan.manage.mapper.ISceneEditInfoMapper;
+import com.fdkankan.manage.service.ISceneEditInfoService;
+import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
+import org.springframework.stereotype.Service;
+
+/**
+ * <p>
+ *  服务实现类
+ * </p>
+ *
+ * @author 
+ * @since 2022-08-12
+ */
+@Service
+public class SceneEditInfoServiceImpl extends ServiceImpl<ISceneEditInfoMapper, SceneEditInfo> implements ISceneEditInfoService {
+    @Override
+    public SceneEditInfo getByScenePlusId(Long plusId) {
+        return this.getOne(new LambdaQueryWrapper<SceneEditInfo>()
+                .eq(SceneEditInfo::getScenePlusId, plusId));
+    }
+}

+ 13 - 1
src/main/java/com/fdkankan/manage/service/impl/ScenePlusExtServiceImpl.java

@@ -1,11 +1,14 @@
 package com.fdkankan.manage.service.impl;
 
+import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
 import com.fdkankan.manage.entity.ScenePlusExt;
 import com.fdkankan.manage.mapper.IScenePlusExtMapper;
 import com.fdkankan.manage.service.IScenePlusExtService;
 import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
 import org.springframework.stereotype.Service;
 
+import java.util.List;
+
 /**
  * <p>
  *  服务实现类
@@ -16,5 +19,14 @@ import org.springframework.stereotype.Service;
  */
 @Service
 public class ScenePlusExtServiceImpl extends ServiceImpl<IScenePlusExtMapper, ScenePlusExt> implements IScenePlusExtService {
-
+    @Override
+    public ScenePlusExt getByPlusId(Long plusId) {
+        LambdaQueryWrapper<ScenePlusExt> wrapper = new LambdaQueryWrapper<>();
+        wrapper.eq(ScenePlusExt::getPlusId,plusId);
+        List<ScenePlusExt> list = this.list(wrapper);
+        if(list != null && list.size() >0){
+            return list.get(0);
+        }
+        return null;
+    }
 }

+ 99 - 2
src/main/java/com/fdkankan/manage/service/impl/ScenePlusServiceImpl.java

@@ -1,11 +1,16 @@
 package com.fdkankan.manage.service.impl;
 
-import com.fdkankan.manage.entity.ScenePlus;
+import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
+import com.fdkankan.fyun.oss.UploadToOssUtil;
+import com.fdkankan.manage.entity.*;
 import com.fdkankan.manage.mapper.IScenePlusMapper;
-import com.fdkankan.manage.service.IScenePlusService;
+import com.fdkankan.manage.service.*;
 import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
+import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.stereotype.Service;
 
+import java.util.List;
+
 /**
  * <p>
  * 场景主表 服务实现类
@@ -17,4 +22,96 @@ import org.springframework.stereotype.Service;
 @Service
 public class ScenePlusServiceImpl extends ServiceImpl<IScenePlusMapper, ScenePlus> implements IScenePlusService {
 
+    @Autowired
+    private IScenePlusExtService scenePlusExtService;
+    @Autowired
+    private ICameraDetailService cameraDetailService;
+    @Autowired
+    private ISceneCopyLogService sceneCopyLogService;
+    @Autowired
+    private ISceneEditInfoService sceneEditInfoService;
+    @Autowired
+    private ISceneEditInfoExtService sceneEditInfoExtService;
+    @Autowired
+    private ISceneEditControlsService sceneEditControlsService;
+    @Autowired
+    UploadToOssUtil uploadToOssUtil;
+    @Autowired
+    ISceneProService sceneProService;
+
+    @Override
+    public ScenePlus getByNum(String sceneNum) {
+        LambdaQueryWrapper<ScenePlus> wrapper = new LambdaQueryWrapper<>();
+        wrapper.eq(ScenePlus::getNum,sceneNum);
+        List<ScenePlus> list = this.list(wrapper);
+        if(list!=null && list.size() >0){
+            return list.get(0);
+        }
+        return null;
+    }
+
+    @Override
+    public void copyV4Scene(ScenePlus scenePlus,String newNum, CameraDetail cameraDetail) throws Exception {
+        String num = scenePlus.getNum();
+        Long plusId = scenePlus.getId();
+        scenePlus.setSceneStatus(0);
+        scenePlus.setNum(newNum);
+        scenePlus.setId(null);
+        scenePlus.setTitle(scenePlus.getTitle().concat("(copy)"));
+        this.save(scenePlus);
+
+        ScenePlusExt plusExt = scenePlusExtService.getByPlusId(plusId);
+        String videos ;
+        if(plusExt.getVideos().contains("scene_view_data")){
+            videos = plusExt.getVideos().replace(num,newNum);
+        }else {
+            videos = plusExt.getVideos().replaceAll("https://4dkk.4dage.com/data/data"+num, "https://4dkk.4dage.com/scene_view_data/"+newNum+"/data");
+        }
+
+        plusExt.setId(null);
+        plusExt.setPlusId(scenePlus.getId());
+        plusExt.setWebSite(plusExt.getWebSite().replace(num,newNum));
+        plusExt.setThumb(plusExt.getThumb().replace(num,newNum));
+        plusExt.setVideos(videos);
+        plusExt.setViewCount(0);
+
+        String newDataSource = sceneProService.setDataSource(plusExt.getDataSource(), scenePlus.getSceneSource());
+        plusExt.setDataSource(newDataSource);
+        scenePlusExtService.save(plusExt);
+
+        //保存复制日志
+        sceneCopyLogService.saveByNum(num,newNum,scenePlus.getUserId());
+        //复制完成更新相机容量
+        cameraDetail.setUsedSpace(cameraDetail.getUsedSpace() + plusExt.getSpace());
+        cameraDetailService.updateById(cameraDetail);
+
+
+        SceneEditInfo sceneEditInfo = sceneEditInfoService.getByScenePlusId(plusId);
+        Long sceneEditInfoId = sceneEditInfo.getId();
+
+        sceneEditInfo.setId(null);
+        sceneEditInfo.setScenePlusId(scenePlus.getId());
+        sceneEditInfo.setTitle(scenePlus.getTitle());
+        sceneEditInfoService.save(sceneEditInfo);
+
+        SceneEditInfoExt sceneEditInfoExt = sceneEditInfoExtService.getByEditInfoId(sceneEditInfoId);
+        sceneEditInfoExt.setId(null);
+        sceneEditInfoExt.setEditInfoId(sceneEditInfo.getId());
+        sceneEditInfoExt.setScenePlusId(scenePlus.getId());
+        sceneEditInfoExtService.save(sceneEditInfoExt);
+
+        SceneEditControls sceneEditControls = sceneEditControlsService.getBySceneEditId(sceneEditInfoId);
+        sceneEditControls.setId(null);
+        sceneEditControls.setEditInfoId(sceneEditInfo.getId());
+        sceneEditControlsService.save(sceneEditControls);
+
+        sceneProService.setQrCode("V3",newNum);
+        sceneProService.copyOssSource("v4",num,newNum);
+        sceneProService.copyLocalSource(num,newNum);
+        sceneProService.updateSceneJson("v4",plusExt.getVideos(),newNum,scenePlus.getTitle(),plusExt.getWebSite(),plusExt.getThumb(),scenePlus.getId());
+
+        scenePlus.setSceneStatus(-2);
+        this.updateById(scenePlus);
+
+    }
 }

+ 249 - 132
src/main/java/com/fdkankan/manage/service/impl/SceneProServiceImpl.java

@@ -7,11 +7,16 @@ import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
 import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
 import com.fdkankan.common.constant.ConstantFilePath;
 import com.fdkankan.common.constant.ErrorCode;
+import com.fdkankan.common.constant.SceneConstant;
+import com.fdkankan.common.constant.UploadFilePath;
 import com.fdkankan.common.exception.BusinessException;
 import com.fdkankan.common.response.PageInfo;
 import com.fdkankan.common.util.CreateObjUtil;
 import com.fdkankan.common.util.FileUtils;
+import com.fdkankan.common.util.MatrixToImageWriterUtil;
+import com.fdkankan.common.util.RandomUtil;
 import com.fdkankan.fyun.oss.UploadToOssUtil;
+import com.fdkankan.manage.common.CameraConstant;
 import com.fdkankan.manage.entity.*;
 import com.fdkankan.manage.mapper.ISceneProMapper;
 import com.fdkankan.manage.service.*;
@@ -23,11 +28,14 @@ import lombok.extern.slf4j.Slf4j;
 import org.apache.commons.lang3.StringUtils;
 import org.springframework.beans.BeanUtils;
 import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.beans.factory.annotation.Value;
 import org.springframework.stereotype.Service;
+import org.springframework.util.ObjectUtils;
 
 import java.io.File;
 import java.io.IOException;
 import java.util.*;
+import java.util.concurrent.CompletableFuture;
 
 /**
  * <p>
@@ -55,11 +63,29 @@ public class SceneProServiceImpl extends ServiceImpl<ISceneProMapper, ScenePro>
     ISceneProEditService sceneProEditService;
     @Autowired
     private UploadToOssUtil uploadToOssUtil;
+    @Autowired
+    IScenePlusService scenePlusService;
+    @Autowired
+    IScene3dNumService scene3dNumService;
+    @Autowired
+    ISceneCopyLogService sceneCopyLogService;
+    @Autowired
+    IScenePlusExtService scenePlusExtService;
+
+    @Value("${main.url}")
+    private String mainUrl;
+
+    @Value("${scene.pro.url}")
+    private String sceneProUrl;
+
+    @Value("${scene.pro.new.url}")
+    private String sceneProNewUrl;
 
     @Override
     public ScenePro getByNum(String num) {
         LambdaQueryWrapper<ScenePro> wrapper = new LambdaQueryWrapper<>();
         wrapper.eq(ScenePro::getNum,num);
+        wrapper.eq(ScenePro::getIsUpgrade,0);
         List<ScenePro> list = this.list(wrapper);
         if(list == null || list.size() <=0){
             return null;
@@ -88,6 +114,7 @@ public class SceneProServiceImpl extends ServiceImpl<ISceneProMapper, ScenePro>
         LambdaUpdateWrapper<ScenePro> wrapper = new LambdaUpdateWrapper<>();
         wrapper.set(ScenePro::getUserId,null)
                 .eq(ScenePro::getCameraId,cameraId);
+        wrapper.eq(ScenePro::getIsUpgrade,0);
         this.update(wrapper);
     }
 
@@ -95,6 +122,7 @@ public class SceneProServiceImpl extends ServiceImpl<ISceneProMapper, ScenePro>
     public List<ScenePro> getListByCameraId(Long cameraId) {
         LambdaQueryWrapper<ScenePro> wrapper = new LambdaQueryWrapper<>();
         wrapper.eq(ScenePro::getCameraId,cameraId);
+        wrapper.eq(ScenePro::getIsUpgrade,0);
         return this.list(wrapper);
     }
 
@@ -187,14 +215,22 @@ public class SceneProServiceImpl extends ServiceImpl<ISceneProMapper, ScenePro>
             throw new BusinessException(-1,"sn码不存在。");
         }
         ScenePro scenePro = this.getByNum(param.getNum());
-        if(scenePro == null){
-            throw new BusinessException(-1,"场景不存在");
+        ScenePlus scenePlus = scenePlusService.getByNum(param.getNum());
+        if((scenePro == null || scenePro.getCameraId() == null ) && (scenePlus== null || scenePlus.getCameraId() == null)){
+            throw new BusinessException(SceneConstant.FAILURE_CODE_5005, SceneConstant.FAILURE_MSG_5005);
         }
-        Long newUseSpace = scenePro.getSpace() + cameraDetail.getUsedSpace();
+
+        Long cameraId = scenePro == null ? scenePlus.getCameraId() : scenePro.getCameraId();
+        Long space = scenePro == null ? 0 :scenePro.getSpace();
+        if(scenePlus !=null){
+            ScenePlusExt scenePlusExt = scenePlusExtService.getByPlusId(scenePlus.getId());
+            space = scenePlusExt.getSpace();
+        }
+        Long newUseSpace = space + cameraDetail.getUsedSpace();
         if(newUseSpace  > cameraDetail.getTotalSpace()){
             throw new BusinessException(-1,"相机容量不足,不能迁移");
         }
-        Camera oldCamera = cameraService.getById(scenePro.getCameraId());
+        Camera oldCamera = cameraService.getById(cameraId);
         if(oldCamera == null){
             throw new BusinessException(-1,"旧相机不存在");
         }
@@ -205,7 +241,7 @@ public class SceneProServiceImpl extends ServiceImpl<ISceneProMapper, ScenePro>
         if(!oldCameraDetail.getType().equals(cameraDetail.getType())){
             throw new BusinessException(-1,"必须迁移至相同的类型的相机下面!");
         }
-        Long oldUseSpace = oldCameraDetail.getUsedSpace() - scenePro.getSpace() < 0 ? 0 : oldCameraDetail.getUsedSpace() - scenePro.getSpace();
+        Long oldUseSpace = oldCameraDetail.getUsedSpace() - space < 0 ? 0 : oldCameraDetail.getUsedSpace() - space;
         oldCameraDetail.setUsedSpace(oldUseSpace);
         Long subSpace =  oldCameraDetail.getTotalSpace() - oldUseSpace;
         if(subSpace >0){    //有剩余容量解封容量内场景
@@ -217,102 +253,138 @@ public class SceneProServiceImpl extends ServiceImpl<ISceneProMapper, ScenePro>
         cameraDetail.setUsedSpace(newUseSpace);
         cameraDetailService.updateById(cameraDetail);
 
-        scenePro.setCameraId(camera.getId());
-        scenePro.setUserId(cameraDetail.getUserId());
-        this.updateById(scenePro);
+        if(scenePro!=null){
+            scenePro.setCameraId(camera.getId());
+            scenePro.setUserId(cameraDetail.getUserId());
+            this.updateById(scenePro);
+        }
+        if(scenePlus!=null){
+            scenePlus.setCameraId(camera.getId());
+            scenePlus.setUserId(cameraDetail.getUserId());
+            scenePlusService.updateById(scenePlus);
+        }
 
     }
 
     @Override
-    public void copy(String sceneNum) {
-        ScenePro sourceScene = this.getByNum(sceneNum);
-        if(sourceScene == null){
-            throw new BusinessException(ErrorCode.MISSING_REQUIRED_PARAMETERS);
-        }
-        Long count = copyLogService.getCountBySceneNum(sceneNum);
-        String newNum = sourceScene.getNum() + "-cp-" + count + 1;   //复制场景在原场景上添加标识
-        ScenePro targetScene = new ScenePro();
-        BeanUtils.copyProperties(sourceScene,targetScene);
-        targetScene.setId(null);
-        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);
-                }
+    public void copy(String sceneNum) throws Exception {
+        ScenePro scenePro = this.getByNum(sceneNum);
+        ScenePlus scenePlus = scenePlusService.getByNum(sceneNum);
+        if((scenePro == null || scenePro.getCameraId() == null ) && (scenePlus== null || scenePlus.getCameraId() == null)){
+            throw new BusinessException(SceneConstant.FAILURE_CODE_5005, SceneConstant.FAILURE_MSG_5005);
+        }
+        Long cameraId = scenePro == null ? scenePlus.getCameraId() : scenePro.getCameraId();
 
-            }
+        CameraDetail detailEntity = cameraDetailService.getByCameraId(cameraId);
+        if(detailEntity == null){
+            throw new BusinessException(CameraConstant.FAILURE_CODE_6029, CameraConstant.FAILURE_MSG_6029);
+        }
+        String newNum = scene3dNumService.generateSceneNum(detailEntity.getType());
 
-        }.start();
+        if(scenePro !=null){        //v3场景复制
+            this.copyV3Scene(scenePro,newNum,detailEntity);
+        }
+        if(scenePlus != null){      //v4场景复制
+            scenePlusService.copyV4Scene(scenePlus,newNum,detailEntity);
+        }
+    }
+
+    @Override
+    public void deleteByNum(String num) {
+        ScenePro scenePro = this.getByNum(num);
+        if(scenePro!=null){
+            this.removeById(scenePro.getId());
+        }
+        Scene scene = sceneService.getByNum(num);
+        if(scene!=null){
+            sceneService.removeById(scene.getId());
+        }
+        ScenePlus scenePlus = scenePlusService.getByNum(num);
+        if(scenePlus!=null){
+            scenePlusService.removeById(scenePlus.getId());
+        }
     }
 
-    /**
-     * 从旧场景下载资源
-     * @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);
+    @Override
+    public void copyV3Scene(ScenePro oldScene,String newNum,CameraDetail cameraDetail) throws Exception {
+        SceneProEdit oldEditScene = sceneProEditService.getByProId(oldScene.getId());
+
+        String oldNum = oldScene.getNum();
+        //复制数据库数据
+        oldScene.setId(null);
+        oldScene.setStatus(0);
+        oldScene.setNum(newNum);
+        oldScene.setSceneName(oldScene.getSceneName().concat("(copy)"));
+        oldScene.setWebSite(oldScene.getWebSite().replace(oldScene.getNum(), newNum));
+        oldScene.setThumb(oldScene.getThumb().replace(oldScene.getNum(), newNum));
+        oldScene.setVideos(oldScene.getVideos().replace(oldNum,newNum));
+        oldScene.setViewCount(0);
+        String preDataSource = oldScene.getDataSource();
+        oldScene.setDataSource(this.setDataSource(preDataSource,oldScene.getSceneSource()));
+
+        this.save(oldScene);
+
+        sceneCopyLogService.saveByNum(oldNum,newNum,oldScene.getUserId());
+        //复制完成更新相机容量
+        cameraDetail.setUsedSpace(cameraDetail.getUsedSpace() + oldScene.getSpace());
+        cameraDetailService.updateById(cameraDetail);
+
+        oldEditScene.setId(null);
+        oldEditScene.setProId(oldScene.getId());
+        oldEditScene.setScreencapVoiceSrc(oldEditScene.getScreencapVoiceSrc() == null ? null : oldEditScene.getScreencapVoiceSrc().replace(oldNum, newNum));
+        oldEditScene.setScreencapVoiceSound(oldEditScene.getScreencapVoiceSound() == null ? null : oldEditScene.getScreencapVoiceSound().replace(oldNum, newNum));
+        oldEditScene.setScreencapVoiceSoundsync(oldEditScene.getScreencapVoiceSoundsync() == null ? null : oldEditScene.getScreencapVoiceSoundsync().replace(oldNum, newNum));
+        oldEditScene.setPlayData(oldEditScene.getPlayData() == null ? null : oldEditScene.getPlayData().replace(oldNum, newNum));
+        oldEditScene.setScreencapThumb(oldEditScene.getScreencapThumb() == null ? null : oldEditScene.getScreencapThumb().replace(oldNum, newNum));
+        oldEditScene.setFloorPlanPng(oldEditScene.getFloorPlanPng() == null ? null : oldEditScene.getFloorPlanPng().replace(oldNum, newNum));
+        sceneProEditService.save(oldEditScene);
+
+        this.setQrCode(oldScene.getBuildType(), oldScene.getNum());
+        CompletableFuture.runAsync(() -> {
+            try {
+                log.info("开始复制场景-{}", new Date());
+
+                //oss复制计算结果资源
+                this.copyOssSource("v3",oldNum,newNum);
+                this.copyLocalSource(oldNum,newNum);
+
+                this.updateSceneJson("v3",oldScene.getVideos(),newNum,oldScene.getSceneName(),oldScene.getWebSite(),oldScene.getThumb(),oldScene.getId());
+                //上传资源到oss
+                this.uploadNewSceneToOss(newNum);
+                oldScene.setStatus(-2);
+                this.updateById(oldScene);
+                log.info("复制场景结束-{}", new Date());
+            } catch (Exception e) {
+                log.error("复制场景异常", e);
+            }
+        });
     }
 
-    /**
-     * 上传新场景资源到oss
-     * @param newNum
-     */
-    private void uploadNewSceneToOss(String newNum) {
+    @Override
+    public void updateSceneJson(String type,String videos,String newNum,String sceneName,String webSite,String thumb,Long id) throws Exception {
+        //更新video
+        HashMap<String,Object> map = new HashMap<>();
+        map.put("videos",videos);
+        map.put("sceneName",sceneName);
+        map.put("webSite",webSite);
+        map.put("thumb",thumb);
+        map.put("num",newNum);
+        map.put("id",id);
+        String uploadPath ;
+        String localPath = ConstantFilePath.SCENE_PATH + "data/data" + newNum + File.separator + "scene.json";
+        if(type.equals("v3")){
+            uploadPath = localPath.replace(ConstantFilePath.SCENE_PATH, "");
+        }else {
+            uploadPath =localPath.replace(ConstantFilePath.SCENE_V4_PATH, "");
+        }
+        FileUtils.writeJsonFile(localPath, map);
+        if(type.equals("v4")){
+            uploadToOssUtil.upload(localPath,uploadPath);
+        }
+    }
+
+    @Override
+    public void uploadNewSceneToOss(String newNum) {
         Map<String, String> map = new HashMap();
         List<String> urlList = new ArrayList<>();
         FileUtils.readfilePath(ConstantFilePath.SCENE_PATH + "images/images" + newNum, urlList);
@@ -325,51 +397,96 @@ public class SceneProServiceImpl extends ServiceImpl<ISceneProMapper, ScenePro>
         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 String setDataSource(String preDataSource,Integer sceneSource) throws Exception {
+        String datasourceFix;
+        String newDataSource;
+        // 判断场景是否拷贝过
+        ScenePro entity;
+        do{
+            datasourceFix = RandomUtil.generateShortUuid();
+            entity = this.findByFileId(preDataSource.concat(datasourceFix));
+        }while(!ObjectUtils.isEmpty(entity));
+        newDataSource =  datasourceFix.concat(datasourceFix);
+
+        //oss复制源文件
+        String buildModelPath = ConstantFilePath.BUILD_MODEL_PATH;
+        if(sceneSource.equals(4)){
+            buildModelPath = ConstantFilePath.BUILD_MODEL_LASER_PATH;
+        }
+        CreateObjUtil.ossUtilCp(ConstantFilePath.OSS_PREFIX +newDataSource.replace(buildModelPath, "")+"/", newDataSource);
+
+        List<String> urlList = new ArrayList<>();
+        FileUtils.readfilePath(newDataSource, urlList);
+        Map<String,String> fileMap = new HashMap<>();
+        for(String url : urlList){
+            fileMap.put(url, ConstantFilePath.OSS_PREFIX + url.replace(buildModelPath, ""));
+        }
+        uploadToOssUtil.uploadMulFiles(fileMap);
+
+        FileUtils.delAllFile(newDataSource);
+
+        FileUtils.copyFolderAllFiles(preDataSource+"/",newDataSource+"/", true);
+        return datasourceFix.concat(datasourceFix);
     }
 
     @Override
-    public void deleteByNum(String num) {
-        ScenePro scenePro = this.getByNum(num);
-        if(scenePro!=null){
-            this.removeById(scenePro);
+    public ScenePro findByFileId(String fileId) {
+        LambdaQueryWrapper<ScenePro> wrapper = new LambdaQueryWrapper<>();
+        wrapper.like(ScenePro::getDataSource,fileId);
+        List<ScenePro> list = this.list(wrapper);
+        if(list !=null && list.size() >0){
+            return list.get(0);
         }
-        Scene scene = sceneService.getByNum(num);
-        if(scene!=null){
-            sceneService.removeById(scene);
+        return null;
+    }
+    @Override
+    public void setQrCode(String buildType,String num) throws Exception {
+        String basePath = mainUrl;
+        if("V2".equals(buildType)){
+            basePath += sceneProUrl;
+        }
+        if("V3".equals(buildType)){
+            basePath += sceneProNewUrl;
+        }
+        MatrixToImageWriterUtil.createQRCode(basePath + num, ConstantFilePath.BASE_PATH + File.separator + "sceneQRcode/"+num+".png", false,null);
+        MatrixToImageWriterUtil.createQRCode(basePath + num + "&lang=en", ConstantFilePath.BASE_PATH + File.separator + "sceneQRcode/"+num+"_en.png", false,null);
+
+    }
+
+    @Override
+    public void copyOssSource(String type ,String sceneNum, String newNum) throws Exception {
+        List<String > copyList = new ArrayList<>();
+        if(type.equals("v3")){
+            copyList.add("images/images" + sceneNum);
+            copyList.add("data/data" + sceneNum);
+            copyList.add("voice/voice" + sceneNum);
+            copyList.add("video/video"+ sceneNum);
+        }else if(type.equals("v4")){
+            String oldEditPath = String.format(UploadFilePath.EDIT_PATH, sceneNum);
+            String oldViewPath = String.format(UploadFilePath.VIEW_PATH, sceneNum);
+            copyList.add(oldEditPath);
+            copyList.add(oldViewPath);
+        }
+        for (String sourcePath : copyList) {
+            uploadToOssUtil.copyFiles(sourcePath,sourcePath.replaceAll(sceneNum,newNum));
+        }
+    }
+    @Override
+    public void copyLocalSource(String sceneNum, String newNum) throws Exception {
+        FileUtils.copyDirectiory(ConstantFilePath.SCENE_PATH +"images/images" + sceneNum,ConstantFilePath.SCENE_PATH +"images/images" + newNum);
+        FileUtils.copyDirectiory(ConstantFilePath.SCENE_PATH +"data/data" + sceneNum,ConstantFilePath.SCENE_PATH +"data/data" + newNum);
+        reloadFile(ConstantFilePath.SCENE_PATH + "data/data" + newNum + "/link-scene.json",sceneNum, newNum);
+        reloadFile(ConstantFilePath.SCENE_PATH + "data/data" + newNum + "/hot.json",sceneNum, newNum);
+        FileUtils.copyDirectiory(ConstantFilePath.SCENE_PATH +"voice/voice" + sceneNum,ConstantFilePath.SCENE_PATH +"voice/voice" + newNum);
+        FileUtils.copyDirectiory(ConstantFilePath.SCENE_PATH +"video/video" + sceneNum,ConstantFilePath.SCENE_PATH +"video/video" + newNum);
+    }
+    private void reloadFile(String filePath,String sceneNum, String newNum) throws Exception {
+        // 修改link-scene.json
+        String content = FileUtils.readFile(filePath);
+        if (!ObjectUtils.isEmpty(content)) {
+            content = content.replaceAll(sceneNum, newNum);
+            FileUtils.writeFile(filePath,content);
         }
     }
 }

+ 5 - 0
src/main/resources/mapper/manage/Scene3dNumMapper.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.IScene3dNumMapper">
+
+</mapper>

+ 5 - 0
src/main/resources/mapper/manage/SceneEditControlsMapper.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.ISceneEditControlsMapper">
+
+</mapper>

+ 5 - 0
src/main/resources/mapper/manage/SceneEditInfoExtMapper.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.ISceneEditInfoExtMapper">
+
+</mapper>

+ 5 - 0
src/main/resources/mapper/manage/SceneEditInfoMapper.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.ISceneEditInfoMapper">
+
+</mapper>

+ 2 - 2
src/main/resources/mapper/manage/SceneProMapper.xml

@@ -3,14 +3,14 @@
 <mapper namespace="com.fdkankan.manage.mapper.ISceneProMapper">
 
     <select id="getCountGroupByUserId" resultType="com.fdkankan.manage.vo.response.GroupByCount" >
-        SELECT user_id as id, count(id) as count FROM t_scene_pro  WHERE  rec_status = 'A' and  user_id in
+        SELECT user_id as id, count(id) as count FROM t_scene_pro  WHERE  rec_status = 'A' and is_upgrade = 0 and  user_id in
          <foreach item="userId" collection="userIdList" open="(" separator="," close=")">
             #{userId}
         </foreach>
         GROUP BY user_id
     </select>
     <select id="getCountGroupByCameraId" resultType="com.fdkankan.manage.vo.response.GroupByCount">
-        SELECT camera_id as id,count(id)  as count  FROM t_scene_pro WHERE rec_status = 'A' AND camera_id is not null
+        SELECT camera_id as id,count(id)  as count  FROM t_scene_pro WHERE rec_status = 'A' and is_upgrade = 0  AND camera_id is not null
         and camera_id in
         <foreach item="cameraId" collection="cameraIds" open="(" separator="," close=")">
             #{cameraId}