瀏覽代碼

场景复制,下载

lyhzzz 3 年之前
父節點
當前提交
35abee789c
共有 69 個文件被更改,包括 2554 次插入95 次删除
  1. 2 0
      src/main/java/com/fdkankan/ucenter/common/RedisKeyUtil.java
  2. 97 0
      src/main/java/com/fdkankan/ucenter/constant/CameraConstant.java
  3. 53 0
      src/main/java/com/fdkankan/ucenter/controller/SceneController.java
  4. 49 5
      src/main/java/com/fdkankan/ucenter/controller/SceneCooperationController.java
  5. 21 0
      src/main/java/com/fdkankan/ucenter/controller/SceneDownloadLogController.java
  6. 21 0
      src/main/java/com/fdkankan/ucenter/controller/SceneEditControlsController.java
  7. 21 0
      src/main/java/com/fdkankan/ucenter/controller/SceneEditInfoController.java
  8. 21 0
      src/main/java/com/fdkankan/ucenter/controller/SceneEditInfoExtController.java
  9. 24 0
      src/main/java/com/fdkankan/ucenter/controller/TestController.java
  10. 60 0
      src/main/java/com/fdkankan/ucenter/entity/Scene3dNum.java
  11. 51 0
      src/main/java/com/fdkankan/ucenter/entity/SceneCopyLog.java
  12. 78 0
      src/main/java/com/fdkankan/ucenter/entity/SceneDownloadLog.java
  13. 112 0
      src/main/java/com/fdkankan/ucenter/entity/SceneEditControls.java
  14. 178 0
      src/main/java/com/fdkankan/ucenter/entity/SceneEditInfo.java
  15. 94 0
      src/main/java/com/fdkankan/ucenter/entity/SceneEditInfoExt.java
  16. 285 0
      src/main/java/com/fdkankan/ucenter/entity/SceneProEdit.java
  17. 1 1
      src/main/java/com/fdkankan/ucenter/generate/AutoGenerate.java
  18. 18 0
      src/main/java/com/fdkankan/ucenter/mapper/IScene3dNumMapper.java
  19. 18 0
      src/main/java/com/fdkankan/ucenter/mapper/ISceneCopyLogMapper.java
  20. 18 0
      src/main/java/com/fdkankan/ucenter/mapper/ISceneDownloadLogMapper.java
  21. 18 0
      src/main/java/com/fdkankan/ucenter/mapper/ISceneEditControlsMapper.java
  22. 18 0
      src/main/java/com/fdkankan/ucenter/mapper/ISceneEditInfoExtMapper.java
  23. 18 0
      src/main/java/com/fdkankan/ucenter/mapper/ISceneEditInfoMapper.java
  24. 18 0
      src/main/java/com/fdkankan/ucenter/mapper/ISceneProEditMapper.java
  25. 2 0
      src/main/java/com/fdkankan/ucenter/mapper/ISceneResourceMapper.java
  26. 14 0
      src/main/java/com/fdkankan/ucenter/service/IDownService.java
  27. 17 0
      src/main/java/com/fdkankan/ucenter/service/IScene3dNumService.java
  28. 10 0
      src/main/java/com/fdkankan/ucenter/service/ISceneCooperationService.java
  29. 17 0
      src/main/java/com/fdkankan/ucenter/service/ISceneCopyLogService.java
  30. 17 0
      src/main/java/com/fdkankan/ucenter/service/ISceneDownloadLogService.java
  31. 17 0
      src/main/java/com/fdkankan/ucenter/service/ISceneEditControlsService.java
  32. 17 0
      src/main/java/com/fdkankan/ucenter/service/ISceneEditInfoExtService.java
  33. 17 0
      src/main/java/com/fdkankan/ucenter/service/ISceneEditInfoService.java
  34. 6 0
      src/main/java/com/fdkankan/ucenter/service/IScenePlusService.java
  35. 17 0
      src/main/java/com/fdkankan/ucenter/service/ISceneProEditService.java
  36. 13 2
      src/main/java/com/fdkankan/ucenter/service/ISceneProService.java
  37. 1 0
      src/main/java/com/fdkankan/ucenter/service/ISceneResourceCooperationService.java
  38. 2 0
      src/main/java/com/fdkankan/ucenter/service/ISceneResourceService.java
  39. 2 0
      src/main/java/com/fdkankan/ucenter/service/ISceneService.java
  40. 168 0
      src/main/java/com/fdkankan/ucenter/service/impl/DownService.java
  41. 9 10
      src/main/java/com/fdkankan/ucenter/service/impl/FolderServiceImpl.java
  42. 3 4
      src/main/java/com/fdkankan/ucenter/service/impl/LoginService.java
  43. 137 0
      src/main/java/com/fdkankan/ucenter/service/impl/Scene3dNumServiceImpl.java
  44. 91 12
      src/main/java/com/fdkankan/ucenter/service/impl/SceneCooperationServiceImpl.java
  45. 28 0
      src/main/java/com/fdkankan/ucenter/service/impl/SceneCopyLogServiceImpl.java
  46. 39 0
      src/main/java/com/fdkankan/ucenter/service/impl/SceneDownloadLogServiceImpl.java
  47. 28 0
      src/main/java/com/fdkankan/ucenter/service/impl/SceneEditControlsServiceImpl.java
  48. 24 0
      src/main/java/com/fdkankan/ucenter/service/impl/SceneEditInfoExtServiceImpl.java
  49. 26 0
      src/main/java/com/fdkankan/ucenter/service/impl/SceneEditInfoServiceImpl.java
  50. 104 2
      src/main/java/com/fdkankan/ucenter/service/impl/ScenePlusServiceImpl.java
  51. 33 0
      src/main/java/com/fdkankan/ucenter/service/impl/SceneProEditServiceImpl.java
  52. 256 22
      src/main/java/com/fdkankan/ucenter/service/impl/SceneProServiceImpl.java
  53. 5 0
      src/main/java/com/fdkankan/ucenter/service/impl/SceneResourceServiceImpl.java
  54. 8 0
      src/main/java/com/fdkankan/ucenter/service/impl/SceneServiceImpl.java
  55. 1 1
      src/main/java/com/fdkankan/ucenter/util/DateUserUtil.java
  56. 3 0
      src/main/java/com/fdkankan/ucenter/vo/request/SceneCooperationParam.java
  57. 8 0
      src/main/java/com/fdkankan/ucenter/vo/request/SceneParam.java
  58. 9 0
      src/main/java/com/fdkankan/ucenter/vo/response/DownVo.java
  59. 10 0
      src/main/java/com/fdkankan/ucenter/vo/response/DownloadProcessVo.java
  60. 6 0
      src/main/java/com/fdkankan/ucenter/vo/response/SceneVo.java
  61. 5 0
      src/main/resources/mapper/ucenter/Scene3dNumMapper.xml
  62. 5 0
      src/main/resources/mapper/ucenter/SceneCopyLogMapper.xml
  63. 5 0
      src/main/resources/mapper/ucenter/SceneDownloadLogMapper.xml
  64. 5 0
      src/main/resources/mapper/ucenter/SceneEditControlsMapper.xml
  65. 5 0
      src/main/resources/mapper/ucenter/SceneEditInfoExtMapper.xml
  66. 5 0
      src/main/resources/mapper/ucenter/SceneEditInfoMapper.xml
  67. 5 0
      src/main/resources/mapper/ucenter/SceneProEditMapper.xml
  68. 56 36
      src/main/resources/mapper/ucenter/SceneProMapper.xml
  69. 4 0
      src/main/resources/mapper/ucenter/SceneResourceMapper.xml

+ 2 - 0
src/main/java/com/fdkankan/ucenter/common/RedisKeyUtil.java

@@ -6,4 +6,6 @@ public class RedisKeyUtil {
     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";
 }

+ 97 - 0
src/main/java/com/fdkankan/ucenter/constant/CameraConstant.java

@@ -0,0 +1,97 @@
+package com.fdkankan.ucenter.constant;
+
+// 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 = "绑定相机类型有误,请先切换相机类型后再绑定";
+}

+ 53 - 0
src/main/java/com/fdkankan/ucenter/controller/SceneController.java

@@ -1,8 +1,11 @@
 package com.fdkankan.ucenter.controller;
 
 
+import com.alibaba.fastjson.JSONObject;
+import com.fdkankan.common.response.PageInfo;
 import com.fdkankan.common.util.JwtUtil;
 import com.fdkankan.ucenter.common.Result;
+import com.fdkankan.ucenter.service.IDownService;
 import com.fdkankan.ucenter.service.ISceneProService;
 import com.fdkankan.ucenter.service.IUserService;
 import com.fdkankan.ucenter.vo.request.SceneParam;
@@ -25,6 +28,8 @@ public class SceneController {
     ISceneProService sceneProService;
     @Autowired
     IUserService userService;
+    @Autowired
+    IDownService downService;
 
     @PostMapping("/findSceneNumber")
     public Result findSceneNumber(@RequestHeader String token){
@@ -36,5 +41,53 @@ public class SceneController {
         String username = JwtUtil.getUsername(token);
         return Result.success(sceneProService.newList(param,username));
     }
+    @PostMapping("/getOnlySceneList")
+    public Result getOnlySceneList(@RequestBody SceneParam param,@RequestHeader String token){
+        String username = JwtUtil.getUsername(token);
+        param.setHasFolder(0);
+        JSONObject jsonObject = sceneProService.newList(param, username);
+        return Result.success(jsonObject.getJSONObject("pageInfo"));
+    }
+    @PostMapping("/copyScene")
+    public Result copyScene(@RequestBody SceneParam param,@RequestHeader String token) throws Exception {
+        String username = JwtUtil.getUsername(token);
+        sceneProService.copyScene(param.getSceneNum(),username);
+        return Result.success();
+    }
+    @PostMapping("/delete")
+    public Result delete(@RequestBody SceneParam param,@RequestHeader String token) throws Exception {
+        String username = JwtUtil.getUsername(token);
+        sceneProService.delete(param.getSceneNum(),username);
+        return Result.success();
+    }
+
+    /**
+     * 校验该场景有无下载资格
+     */
+    @PostMapping("/checkDownload")
+    public Result checkDownload(@RequestBody SceneParam param) throws Exception {
+        return Result.success( downService.checkDownLoad(param.getSceneNum()) );
+    }
+    /**
+     * 校验该场景有无下载资格
+     * @param param
+     * @return
+     */
+    @PostMapping("/downloadScene")
+    public Result downloadScene(@RequestBody SceneParam param,@RequestHeader String token) throws Exception{
+        String username = JwtUtil.getUsername(token);
+        return Result.success(downService.down(param.getSceneNum(),username));
+    }
+
+    /**
+     * 获取下载进度
+     * @param param
+     * @return
+     */
+    @PostMapping("/downloadProcess")
+    public Result downloadProcess(@RequestBody SceneParam param) throws Exception{
+        return Result.success(downService.downloadProcess(param.getSceneNum()));
+    }
+
 }
 

+ 49 - 5
src/main/java/com/fdkankan/ucenter/controller/SceneCooperationController.java

@@ -1,13 +1,14 @@
 package com.fdkankan.ucenter.controller;
 
+import com.dtflys.forest.annotation.Post;
+import com.fdkankan.common.util.JwtUtil;
 import com.fdkankan.ucenter.common.Result;
+import com.fdkankan.ucenter.entity.SceneCooperation;
 import com.fdkankan.ucenter.service.ISceneCooperationService;
 import com.fdkankan.ucenter.vo.request.SceneCooperationParam;
+import com.fdkankan.ucenter.vo.request.SceneParam;
 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.*;
 
 @RestController
 @RequestMapping("/api/user/scene/cooperation")
@@ -18,7 +19,50 @@ public class SceneCooperationController {
 
     @PostMapping("/sceneResourceList")
     public Result sceneResourceList(@RequestBody SceneCooperationParam param){
-        sceneCooperationService.sceneResourceList(param);
+        return Result.success( sceneCooperationService.sceneResourceList(param));
+    }
+
+    @PostMapping("/cooperationSceneListNew")
+    public Result cooperationSceneListNew(@RequestBody SceneParam param,@RequestHeader  String token){
+        String username = JwtUtil.getUsername(token);
+        return Result.success(sceneCooperationService.cooperationSceneListNew(param,username));
+    }
+
+    @PostMapping("/onlyCooperationSceneList")
+    public Result onlyCooperationSceneList(@RequestBody SceneParam param,@RequestHeader  String token){
+        String username = JwtUtil.getUsername(token);
+        return Result.success(sceneCooperationService.cooperationSceneListNew(param,username));
+    }
+
+    /**
+     * 添加协作场景
+     * userName         用户账号
+     * sceneNum         场景码
+     * resourceIds      场景资源id集合,逗号隔开
+     */
+    @PostMapping("/save")
+    public Result save(@RequestBody SceneCooperationParam param,@RequestHeader String token){
+        String username = JwtUtil.getUsername(token);
+        sceneCooperationService.saveCooperation(param,username);
+        return Result.success();
+    }
+    /**
+     * 取消协作场景
+     * sceneNum         场景码
+     */
+    @PostMapping("/delete")
+    public Result delete(@RequestBody SceneCooperationParam param,@RequestHeader String token){
+        String username = JwtUtil.getUsername(token);
+        sceneCooperationService.deleteCooperation(param,username);
         return Result.success();
     }
+
+    /**
+     * 场景归属者根据场景码获取场景资源集合
+     * sceneNum         场景编码
+     */
+    @PostMapping(value = "/findSceneResource")
+    public Result findSceneResource(@RequestBody SceneCooperationParam param) throws Exception{
+        return Result.success(sceneCooperationService.getResourceByNum(param.getSceneNum()));
+    }
 }

+ 21 - 0
src/main/java/com/fdkankan/ucenter/controller/SceneDownloadLogController.java

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

+ 21 - 0
src/main/java/com/fdkankan/ucenter/controller/SceneEditControlsController.java

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

+ 21 - 0
src/main/java/com/fdkankan/ucenter/controller/SceneEditInfoController.java

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

+ 21 - 0
src/main/java/com/fdkankan/ucenter/controller/SceneEditInfoExtController.java

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

+ 24 - 0
src/main/java/com/fdkankan/ucenter/controller/TestController.java

@@ -0,0 +1,24 @@
+package com.fdkankan.ucenter.controller;
+
+import com.fdkankan.redis.util.RedisUtil;
+import com.fdkankan.ucenter.common.RedisKeyUtil;
+import com.fdkankan.ucenter.common.Result;
+import com.fdkankan.ucenter.service.IScene3dNumService;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.web.bind.annotation.RequestMapping;
+import org.springframework.web.bind.annotation.RestController;
+
+import java.util.ArrayList;
+import java.util.List;
+
+@RestController
+public class TestController {
+
+    @Autowired
+    private RedisUtil redisUtil;
+
+    @RequestMapping("/test")
+    public Result test() throws InterruptedException {
+        return Result.success( );
+    }
+}

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

@@ -0,0 +1,60 @@
+package com.fdkankan.ucenter.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-07-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(value = "A",delval = "I")
+    private String recStatus;
+
+    /**
+     * 更新时间
+     */
+    @TableField("update_time")
+    private Date updateTime;
+
+    /**
+     * 创建时间
+     */
+    @TableField("create_time")
+    private Date createTime;
+
+
+}

+ 51 - 0
src/main/java/com/fdkankan/ucenter/entity/SceneCopyLog.java

@@ -0,0 +1,51 @@
+package com.fdkankan.ucenter.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-07-12
+ */
+@Getter
+@Setter
+@TableName("t_scene_copy_log")
+public class SceneCopyLog implements Serializable {
+
+    private static final long serialVersionUID = 1L;
+
+    @TableId(value = "id", type = IdType.AUTO)
+    private Long id;
+
+    @TableField("old_num")
+    private String oldNum;
+
+    @TableField("new_num")
+    private String newNum;
+
+    @TableField("copy_user_id")
+    private Long copyUserId;
+
+    @TableField("rec_status")
+    @TableLogic(value = "A",delval = "I")
+    private String recStatus;
+
+    @TableField("create_time")
+    private String createTime;
+
+    @TableField("update_time")
+    private String updateTime;
+
+
+}

+ 78 - 0
src/main/java/com/fdkankan/ucenter/entity/SceneDownloadLog.java

@@ -0,0 +1,78 @@
+package com.fdkankan.ucenter.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-07-13
+ */
+@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 Date createTime;
+
+    @TableField("update_time")
+    private Date updateTime;
+
+
+}

+ 112 - 0
src/main/java/com/fdkankan/ucenter/entity/SceneEditControls.java

@@ -0,0 +1,112 @@
+package com.fdkankan.ucenter.entity;
+
+import com.baomidou.mybatisplus.annotation.IdType;
+import com.baomidou.mybatisplus.annotation.TableField;
+import com.baomidou.mybatisplus.annotation.TableId;
+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-07-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("tb_status")
+    private Integer tbStatus;
+
+
+}

+ 178 - 0
src/main/java/com/fdkankan/ucenter/entity/SceneEditInfo.java

@@ -0,0 +1,178 @@
+package com.fdkankan.ucenter.entity;
+
+import com.baomidou.mybatisplus.annotation.IdType;
+import com.baomidou.mybatisplus.annotation.TableField;
+import com.baomidou.mybatisplus.annotation.TableId;
+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-07-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("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("tb_status")
+    private Integer tbStatus;
+
+
+}

+ 94 - 0
src/main/java/com/fdkankan/ucenter/entity/SceneEditInfoExt.java

@@ -0,0 +1,94 @@
+package com.fdkankan.ucenter.entity;
+
+import com.baomidou.mybatisplus.annotation.IdType;
+import com.baomidou.mybatisplus.annotation.TableField;
+import com.baomidou.mybatisplus.annotation.TableId;
+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-07-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;
+
+    /**
+     * 是否有场景关联(0-否,1-是)
+     */
+    @TableField("links")
+    private Integer links;
+
+    /**
+     * 创建时间
+     */
+    @TableField("create_time")
+    private Date createTime;
+
+    /**
+     * 修改时间
+     */
+    @TableField("update_time")
+    private Date updateTime;
+
+    /**
+     * 0-有效,1-删除, 2-禁用
+     */
+    @TableField("tb_status")
+    private Integer tbStatus;
+
+
+}

+ 285 - 0
src/main/java/com/fdkankan/ucenter/entity/SceneProEdit.java

@@ -0,0 +1,285 @@
+package com.fdkankan.ucenter.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>
+ * pro场景编辑数据表
+ * </p>
+ *
+ * @author 
+ * @since 2022-07-12
+ */
+@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 Date 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 Date 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
src/main/java/com/fdkankan/ucenter/generate/AutoGenerate.java

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

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

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

+ 18 - 0
src/main/java/com/fdkankan/ucenter/mapper/ISceneCopyLogMapper.java

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

+ 18 - 0
src/main/java/com/fdkankan/ucenter/mapper/ISceneDownloadLogMapper.java

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

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

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

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

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

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

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

+ 18 - 0
src/main/java/com/fdkankan/ucenter/mapper/ISceneProEditMapper.java

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

+ 2 - 0
src/main/java/com/fdkankan/ucenter/mapper/ISceneResourceMapper.java

@@ -19,4 +19,6 @@ import java.util.List;
 public interface ISceneResourceMapper extends BaseMapper<SceneResource> {
 
     List<SceneResource> sceneResourceByCameraId(@Param("cameraId") Long cameraId);
+
+    List<SceneResource> getByCooperationId(@Param("cooId") Long cooId);
 }

+ 14 - 0
src/main/java/com/fdkankan/ucenter/service/IDownService.java

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

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

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

+ 10 - 0
src/main/java/com/fdkankan/ucenter/service/ISceneCooperationService.java

@@ -5,7 +5,9 @@ import com.fdkankan.ucenter.entity.SceneCooperation;
 import com.baomidou.mybatisplus.extension.service.IService;
 import com.fdkankan.ucenter.entity.ScenePlus;
 import com.fdkankan.ucenter.entity.ScenePro;
+import com.fdkankan.ucenter.entity.SceneResource;
 import com.fdkankan.ucenter.vo.request.SceneCooperationParam;
+import com.fdkankan.ucenter.vo.request.SceneParam;
 
 import java.util.List;
 
@@ -26,4 +28,12 @@ public interface ISceneCooperationService extends IService<SceneCooperation> {
     void saveBatchByList(List<ScenePro> sceneProList, List<ScenePlus> scenePlusList, Long userId ,List<Long>resourceIds);
 
     JSONObject sceneResourceList(SceneCooperationParam param);
+
+    JSONObject cooperationSceneListNew(SceneParam param, String username);
+
+    void saveCooperation(SceneCooperationParam param, String username);
+
+    void deleteCooperation(SceneCooperationParam param, String username);
+
+    List<SceneResource> getResourceByNum(String sceneNum);
 }

+ 17 - 0
src/main/java/com/fdkankan/ucenter/service/ISceneCopyLogService.java

@@ -0,0 +1,17 @@
+package com.fdkankan.ucenter.service;
+
+import com.fdkankan.ucenter.entity.SceneCopyLog;
+import com.baomidou.mybatisplus.extension.service.IService;
+
+/**
+ * <p>
+ *  服务类
+ * </p>
+ *
+ * @author 
+ * @since 2022-07-12
+ */
+public interface ISceneCopyLogService extends IService<SceneCopyLog> {
+
+    void saveByNum(String oldNum, String newNum, Long userId);
+}

+ 17 - 0
src/main/java/com/fdkankan/ucenter/service/ISceneDownloadLogService.java

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

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

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

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

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

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

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

+ 6 - 0
src/main/java/com/fdkankan/ucenter/service/IScenePlusService.java

@@ -1,8 +1,10 @@
 package com.fdkankan.ucenter.service;
 
+import com.fdkankan.ucenter.entity.CameraDetail;
 import com.fdkankan.ucenter.entity.ScenePlus;
 import com.baomidou.mybatisplus.extension.service.IService;
 
+import java.io.IOException;
 import java.util.HashMap;
 import java.util.List;
 
@@ -27,4 +29,8 @@ public interface IScenePlusService extends IService<ScenePlus> {
     List<ScenePlus> getListByNums(List<String> numList);
 
     HashMap<Long, ScenePlus> getMapByIds(List<Long> sceneIds);
+
+    ScenePlus getByNum(String sceneNum);
+
+    void copyV4Scene(ScenePlus scenePlus,String newNum, CameraDetail cameraDetail) throws IOException, Exception;
 }

+ 17 - 0
src/main/java/com/fdkankan/ucenter/service/ISceneProEditService.java

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

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

@@ -1,6 +1,6 @@
 package com.fdkankan.ucenter.service;
 
-import com.fdkankan.common.response.PageInfo;
+import com.alibaba.fastjson.JSONObject;
 import com.fdkankan.ucenter.entity.CameraDetail;
 import com.fdkankan.ucenter.entity.ScenePro;
 import com.baomidou.mybatisplus.extension.service.IService;
@@ -8,6 +8,7 @@ import com.fdkankan.ucenter.vo.request.SceneParam;
 import com.fdkankan.ucenter.vo.response.GroupByCount;
 import com.fdkankan.ucenter.vo.response.SceneNumVo;
 
+import java.io.IOException;
 import java.util.HashMap;
 import java.util.List;
 
@@ -39,5 +40,15 @@ public interface ISceneProService extends IService<ScenePro> {
 
     void deleteByIds(List<Long> sceneIds);
 
-    PageInfo newList(SceneParam param, String username);
+    JSONObject newList(SceneParam param, String username);
+
+    void copyScene(String sceneNum,String userName) throws Exception;
+
+    ScenePro getByNum(String sceneNum);
+
+    void copyV3Scene(ScenePro scenePro,String newNum,CameraDetail cameraDetail);
+
+    void updateSceneJson(String type,String videos,String newNum,String sceneName,String webSite,String thumb,Long id) throws Exception;
+
+    void delete(String sceneNum, String username);
 }

+ 1 - 0
src/main/java/com/fdkankan/ucenter/service/ISceneResourceCooperationService.java

@@ -16,4 +16,5 @@ import java.util.List;
 public interface ISceneResourceCooperationService extends IService<SceneResourceCooperation> {
 
     void deleteBatchByCooperationIds(List<Long> ids);
+
 }

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

@@ -18,4 +18,6 @@ public interface ISceneResourceService extends IService<SceneResource> {
     List<SceneResource> sceneResourceByCameraId(Long cameraId);
 
     List<SceneResource> getByVersion(List<String> versionList);
+
+    List<SceneResource> getByCooperationId(Long cooId);
 }

+ 2 - 0
src/main/java/com/fdkankan/ucenter/service/ISceneService.java

@@ -19,4 +19,6 @@ public interface ISceneService extends IService<Scene> {
 
 
     void bindOrUnCamera(List<Long> cameraIds, Long id);
+
+    List<Scene> getListByNums(List<String> numList);
 }

+ 168 - 0
src/main/java/com/fdkankan/ucenter/service/impl/DownService.java

@@ -0,0 +1,168 @@
+package com.fdkankan.ucenter.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.redis.constant.RedisKey;
+import com.fdkankan.redis.util.RedisUtil;
+import com.fdkankan.ucenter.constant.LoginConstant;
+import com.fdkankan.ucenter.entity.*;
+import com.fdkankan.ucenter.service.*;
+import com.fdkankan.ucenter.vo.response.DownVo;
+import com.fdkankan.ucenter.vo.response.DownloadProcessVo;
+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
+    IScenePlusService scenePlusService;
+    @Autowired
+    RedisUtil redisUtil;
+    @Autowired
+    ISceneEditInfoService sceneEditInfoService;
+    @Autowired
+    IUserService userService;
+
+
+    @Override
+    public DownVo checkDownLoad(String sceneNum) {
+        if(StringUtils.isEmpty(sceneNum)){
+            throw new BusinessException(LoginConstant.FAILURE_CODE_3001, LoginConstant.FAILURE_MSG_3001);
+        }
+        ScenePro scenePro = sceneProService.getByNum(sceneNum);
+        ScenePlus plus = scenePlusService.getByNum(sceneNum);
+        if(scenePro == null && plus == null){
+            throw new BusinessException(SceneConstant.FAILURE_CODE_5005, SceneConstant.FAILURE_MSG_5005);
+        }
+        SceneDownloadLog sceneDownloadLog;
+        int isUp = 0;
+        if(scenePro == null){
+            isUp = 1;
+        }
+        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,isUp);
+        //3下载过,并且没有修改过
+        if(sceneDownloadLog != null && sceneDownloadLog.getSceneVersion().intValue() == sceneVersion){
+            downVo.setDownloadStatus(3);
+            downVo.setDownloadUrl(sceneDownloadLog.getDownloadUrl());
+            return downVo;
+        }
+        //下载过,有更改
+        if(sceneDownloadLog != null){
+            String redisKey = RedisKey.PREFIX_DOWNLOAD_PROGRESS;
+            if(isUp == 1){
+                redisKey = RedisKey.PREFIX_DOWNLOAD_PROGRESS_V4;
+            }
+            downVo.setDownloadStatus(2);
+            redisUtil.del(String.format(redisKey,sceneNum));  // 清除旧的下载信息
+            return downVo;
+        }
+        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,String userName) {
+        if(StringUtils.isEmpty(sceneNum) || StringUtils.isEmpty(userName)){
+            throw new BusinessException(LoginConstant.FAILURE_CODE_3001, LoginConstant.FAILURE_MSG_3001);
+        }
+        ScenePro scenePro = sceneProService.getByNum(sceneNum);
+        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();
+        User user = userService.getByUserName(userName);
+        if(user == null || user.getDownloadNumTotal() - user.getDownloadNum() <= 0){
+            downVo.setDownloadStatus(-1);
+            return downVo;
+        }
+        Integer sceneVersion = getSceneVersion(scenePro, scenePlus);
+
+        Map<String,String> params = new HashMap<>(2);
+        params.put("type","local");
+        params.put("sceneNum",sceneNum);
+        String redisKey = RedisKey.DOWNLOAD_TASK;
+        String sysVersion = "v3";
+        if(scenePro == null){
+            params.put("num",sceneNum);
+            redisKey = RedisKey.SCENE_DOWNLOADS_TASK_V4;
+            sysVersion = "v4";
+        }
+        redisUtil.lRightPush(redisKey, JSONObject.toJSONString(params));
+        user.setDownloadNum(user.getDownloadNum() + 1);
+        userService.updateById(user);
+
+        SceneDownloadLog sceneDownloadLogEntity = new SceneDownloadLog();
+        sceneDownloadLogEntity.setUserId(user.getId());
+        sceneDownloadLogEntity.setSceneNum(sceneNum);
+        sceneDownloadLogEntity.setSceneVersion(sceneVersion);
+        sceneDownloadLogEntity.setStatus(0);
+        sceneDownloadLogEntity.setSysVersion(sysVersion);
+        sceneDownloadLogService.save(sceneDownloadLogEntity);
+
+        downVo.setDownloadStatus(1);
+        return downVo;
+    }
+
+    @Override
+    public DownloadProcessVo downloadProcess(String sceneNum) {
+        if (StringUtils.isEmpty(sceneNum)) {
+            throw new BusinessException(LoginConstant.FAILURE_CODE_3001, LoginConstant.FAILURE_MSG_3001);
+        }
+        ScenePro scenePro = sceneProService.getByNum(sceneNum);
+        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 == null){
+            redisKey = RedisKey.PREFIX_DOWNLOAD_PROGRESS_V4;
+        }
+        // 获取下载进度
+        String result = redisUtil.get(redisKey);
+        if(StringUtils.isEmpty(result)){
+            return new DownloadProcessVo();
+        }
+        return JSONObject.parseObject(result,DownloadProcessVo.class);
+    }
+
+}

+ 9 - 10
src/main/java/com/fdkankan/ucenter/service/impl/FolderServiceImpl.java

@@ -82,7 +82,8 @@ public class FolderServiceImpl extends ServiceImpl<IFolderMapper, Folder> implem
         Folder folder = checkFolder(id, user.getId());
 
         //删除子文件夹
-        List<Folder> list = getAllFolder(id);
+        List<Folder> list = new ArrayList<>();
+        getAllFolder(id,list);
         list.add(folder);
         List<Long> delIds = list.parallelStream().map(Folder::getId).collect(Collectors.toList());
         folderSceneService.deleteByFolderIds(delIds);
@@ -166,7 +167,8 @@ public class FolderServiceImpl extends ServiceImpl<IFolderMapper, Folder> implem
         List<Folder> list = new ArrayList<>();
         for (Long id : folderIds) {
             Folder byId = this.getById(id);
-            List<Folder> allFolder = this.getAllFolder(id);
+            List<Folder> allFolder = new ArrayList<>();
+             this.getAllFolder(id,allFolder);
             list.add(byId);
             if(allFolder.size() >0){
                 list.addAll(allFolder);
@@ -184,20 +186,17 @@ public class FolderServiceImpl extends ServiceImpl<IFolderMapper, Folder> implem
         return this.list(wrapper);
     }
 
-    private  List<Folder> getAllFolder(Long id ){
+    private  void  getAllFolder(Long id ,List<Folder> allFolder){
         LambdaQueryWrapper<Folder> wrapper = new LambdaQueryWrapper<>();
         wrapper.eq(Folder::getParentId,id);
         List<Folder> list = this.list(wrapper);
-        if(list.size() <= 0){
-            return list;
+        if(list == null || list.size() <= 0){
+            return ;
         }
         for (Folder folder : list) {
-            List<Folder> folders = getAllFolder(folder.getId());
-            if(folders.size() >0){
-                list.addAll(folders);
-            }
+             getAllFolder(folder.getId(),allFolder);
         }
-        return list;
+        allFolder.addAll(list);
     }
 
     private Folder checkFolder(Long id, Long userId){

+ 3 - 4
src/main/java/com/fdkankan/ucenter/service/impl/LoginService.java

@@ -94,10 +94,9 @@ public class LoginService {
         String redisKeyTime = RedisKeyUtil.PREFIX_MSG_NOT_CODE + phoneNum;      //重发验证
         String redisKeyMsg = RedisKeyUtil.PREFIX_MSG_AUTH_CODE + phoneNum;      //验证码code
 
-        String value = redisUtil.get(redisKeyTime);
-        if(value !=null){
-            long times = new Date().getTime() - Long.parseLong(value) ;
-            throw new BusinessException(LoginConstant.FAILURE_CODE_3033, String.valueOf(60-(times/1000)));
+        long value =  redisUtil.getExpire(redisKeyTime);
+        if(value != -2){
+            throw new BusinessException(LoginConstant.FAILURE_CODE_3033, String.valueOf(value));
         }
         String code = String.valueOf((int)((Math.random()*9+1)*100000));
         if ("86".equals(areaNum)){

+ 137 - 0
src/main/java/com/fdkankan/ucenter/service/impl/Scene3dNumServiceImpl.java

@@ -0,0 +1,137 @@
+package com.fdkankan.ucenter.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.redis.util.RedisUtil;
+import com.fdkankan.ucenter.common.CameraTypeEnum;
+import com.fdkankan.ucenter.common.RedisKeyUtil;
+import com.fdkankan.ucenter.entity.Scene3dNum;
+import com.fdkankan.ucenter.mapper.IScene3dNumMapper;
+import com.fdkankan.ucenter.service.IScene3dNumService;
+import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
+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-07-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;
+    }
+
+
+}

+ 91 - 12
src/main/java/com/fdkankan/ucenter/service/impl/SceneCooperationServiceImpl.java

@@ -10,6 +10,7 @@ import com.fdkankan.ucenter.mapper.ISceneCooperationMapper;
 import com.fdkankan.ucenter.service.*;
 import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
 import com.fdkankan.ucenter.vo.request.SceneCooperationParam;
+import com.fdkankan.ucenter.vo.request.SceneParam;
 import com.google.common.collect.Lists;
 import org.apache.commons.lang3.StringUtils;
 import org.springframework.beans.factory.annotation.Autowired;
@@ -18,6 +19,7 @@ import org.springframework.util.CollectionUtils;
 import org.springframework.util.ObjectUtils;
 
 import java.util.ArrayList;
+import java.util.Arrays;
 import java.util.List;
 import java.util.stream.Collectors;
 
@@ -46,6 +48,8 @@ public class SceneCooperationServiceImpl extends ServiceImpl<ISceneCooperationMa
     ICameraDetailService cameraDetailService;
     @Autowired
     ISceneResourceService sceneResourceService;
+    @Autowired
+    IUserService userService;
 
     @Override
     public Long getCooperationSceneNum(Long userId, List<Integer> sceneSourceList) {
@@ -56,18 +60,19 @@ public class SceneCooperationServiceImpl extends ServiceImpl<ISceneCooperationMa
 
     @Override
     public void deleteCooperationList(List<ScenePro> sceneProList,List<ScenePlus> scenePlusList) {
-        if(!CollectionUtils.isEmpty(sceneProList)){
-            List<String> numList = sceneProList.stream().map(ScenePro::getNum).collect(Collectors.toList());
-            List<String> numList2 = scenePlusList.stream().map(ScenePlus::getNum).collect(Collectors.toList());
-            numList.addAll(numList2);
-            LambdaQueryWrapper<SceneCooperation> wrapper = new LambdaQueryWrapper<>();
-            wrapper.in(SceneCooperation::getSceneNum,numList);
-            List<SceneCooperation> list = this.list(wrapper);
-            List<Long> ids = list.stream().map(SceneCooperation::getId).collect(Collectors.toList());
-            if(ids.size() >0){
-                sceneResourceCooperationService.removeByIds(ids);
-                sceneResourceCooperationService.deleteBatchByCooperationIds(ids);
-            }
+        if(CollectionUtils.isEmpty(sceneProList) && CollectionUtils.isEmpty(scenePlusList)){
+            return;
+        }
+        List<String> numList = sceneProList.stream().map(ScenePro::getNum).collect(Collectors.toList());
+        List<String> numList2 = scenePlusList.stream().map(ScenePlus::getNum).collect(Collectors.toList());
+        numList.addAll(numList2);
+        LambdaQueryWrapper<SceneCooperation> wrapper = new LambdaQueryWrapper<>();
+        wrapper.in(SceneCooperation::getSceneNum,numList);
+        List<SceneCooperation> list = this.list(wrapper);
+        List<Long> ids = list.stream().map(SceneCooperation::getId).collect(Collectors.toList());
+        if(ids.size() >0){
+            this.removeByIds(ids);
+            sceneResourceCooperationService.deleteBatchByCooperationIds(ids);
         }
     }
 
@@ -166,4 +171,78 @@ public class SceneCooperationServiceImpl extends ServiceImpl<ISceneCooperationMa
         return jsonObject;
 
     }
+
+    @Override
+    public JSONObject cooperationSceneListNew(SceneParam param, String username) {
+        User user = userService.getByUserName(username);
+        LambdaQueryWrapper<SceneCooperation> wrapper = new LambdaQueryWrapper<>();
+        wrapper.eq(SceneCooperation::getUserId,user.getId());
+        List<SceneCooperation> list = this.list(wrapper);
+        List<String> numList = list.parallelStream().map(SceneCooperation::getSceneNum).collect(Collectors.toList());
+        if(numList.size() <=0){
+            return new JSONObject();
+        }
+        param.setNumList(numList);
+        param.setHasFolder(0);
+        JSONObject jsonObject = sceneProService.newList(param, username);
+        return jsonObject.getJSONObject("pageInfo") ;
+    }
+
+    @Override
+    public void saveCooperation(SceneCooperationParam param, String username) {
+        if(StringUtils.isEmpty(param.getUserName()) || StringUtils.isEmpty(param.getSceneNum()) || StringUtils.isEmpty(param.getResourceIds())){
+            throw new BusinessException(LoginConstant.FAILURE_CODE_3001, LoginConstant.FAILURE_MSG_3001);
+        }
+        if(param.getUserName().equals( username)){
+            throw new BusinessException(LoginConstant.FAILURE_CODE_3024, LoginConstant.FAILURE_MSG_3024);
+        }
+        User user = userService.getByUserName(param.getUserName());
+        if(user == null){
+            throw new BusinessException(LoginConstant.FAILURE_CODE_3021, LoginConstant.FAILURE_MSG_3021);
+        }
+        String[] nums = param.getSceneNum().split(",");
+        List<String> numList =  Arrays.asList(nums);
+        List<ScenePro> proList = sceneProService.getListByNums(numList);
+        List<ScenePlus> plusList = scenePlusService.getListByNums(numList);
+        this.deleteCooperationList(proList,plusList);
+
+        List<Long> resourceIdList = new ArrayList<>();
+        if (StringUtils.isNotEmpty(param.getResourceIds())) {
+            for (String rId : param.getResourceIds().split(",")) {
+                resourceIdList.add(Long.valueOf(rId));
+            }
+        }
+        this.saveBatchByList(proList,plusList,user.getId(),resourceIdList);
+    }
+
+    @Override
+    public void deleteCooperation(SceneCooperationParam param, String username) {
+        if(StringUtils.isEmpty(param.getSceneNum())){
+            throw new BusinessException(LoginConstant.FAILURE_CODE_3001, LoginConstant.FAILURE_MSG_3001);
+        }
+        String[] nums = param.getSceneNum().split(",");
+        List<String> numList =  Arrays.asList(nums);
+        List<ScenePro> proList = sceneProService.getListByNums(numList);
+        List<ScenePlus> plusList = scenePlusService.getListByNums(numList);
+        this.deleteCooperationList(proList,plusList);
+    }
+
+    @Override
+    public List<SceneResource> getResourceByNum(String sceneNum) {
+        if(StringUtils.isEmpty(sceneNum)){
+            throw new BusinessException(LoginConstant.FAILURE_CODE_3001, LoginConstant.FAILURE_MSG_3001);
+        }
+        LambdaQueryWrapper<SceneCooperation> wrapper = new LambdaQueryWrapper<>();
+        wrapper.eq(SceneCooperation::getSceneNum,sceneNum);
+        List<SceneCooperation> list = this.list(wrapper);
+        if(list == null || list.size()<=0){
+            return new ArrayList<>();
+        }
+        return sceneResourceService.getByCooperationId(list.get(0).getId());
+    }
+
+    private SceneCooperation getByNum(String sceneNum) {
+
+        return null;
+    }
 }

+ 28 - 0
src/main/java/com/fdkankan/ucenter/service/impl/SceneCopyLogServiceImpl.java

@@ -0,0 +1,28 @@
+package com.fdkankan.ucenter.service.impl;
+
+import com.fdkankan.ucenter.entity.SceneCopyLog;
+import com.fdkankan.ucenter.mapper.ISceneCopyLogMapper;
+import com.fdkankan.ucenter.service.ISceneCopyLogService;
+import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
+import org.springframework.stereotype.Service;
+
+/**
+ * <p>
+ *  服务实现类
+ * </p>
+ *
+ * @author 
+ * @since 2022-07-12
+ */
+@Service
+public class SceneCopyLogServiceImpl extends ServiceImpl<ISceneCopyLogMapper, SceneCopyLog> implements ISceneCopyLogService {
+
+    @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);
+    }
+}

+ 39 - 0
src/main/java/com/fdkankan/ucenter/service/impl/SceneDownloadLogServiceImpl.java

@@ -0,0 +1,39 @@
+package com.fdkankan.ucenter.service.impl;
+
+import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
+import com.fdkankan.ucenter.entity.SceneDownloadLog;
+import com.fdkankan.ucenter.mapper.ISceneDownloadLogMapper;
+import com.fdkankan.ucenter.service.ISceneDownloadLogService;
+import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
+import org.springframework.stereotype.Service;
+
+import java.util.List;
+
+/**
+ * <p>
+ *  服务实现类
+ * </p>
+ *
+ * @author 
+ * @since 2022-07-13
+ */
+@Service
+public class SceneDownloadLogServiceImpl extends ServiceImpl<ISceneDownloadLogMapper, SceneDownloadLog> implements ISceneDownloadLogService {
+
+    @Override
+    public SceneDownloadLog getByStatusAndNum(String sceneNum, int status, Integer isUpgrade) {
+        LambdaQueryWrapper<SceneDownloadLog> wrapper = new LambdaQueryWrapper<>();
+        wrapper.eq(SceneDownloadLog::getSceneNum,sceneNum);
+        wrapper.eq(SceneDownloadLog::getStatus,status);
+        String sysVersion = "v3";
+        if(isUpgrade == 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;
+    }
+}

+ 28 - 0
src/main/java/com/fdkankan/ucenter/service/impl/SceneEditControlsServiceImpl.java

@@ -0,0 +1,28 @@
+package com.fdkankan.ucenter.service.impl;
+
+import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
+import com.fdkankan.common.constant.TbStatus;
+import com.fdkankan.ucenter.entity.SceneEditControls;
+import com.fdkankan.ucenter.mapper.ISceneEditControlsMapper;
+import com.fdkankan.ucenter.service.ISceneEditControlsService;
+import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
+import org.springframework.stereotype.Service;
+
+/**
+ * <p>
+ *  服务实现类
+ * </p>
+ *
+ * @author 
+ * @since 2022-07-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::getTbStatus, TbStatus.VALID.code())
+                .eq(SceneEditControls::getEditInfoId, sceneEditInfoId));
+    }
+}

+ 24 - 0
src/main/java/com/fdkankan/ucenter/service/impl/SceneEditInfoExtServiceImpl.java

@@ -0,0 +1,24 @@
+package com.fdkankan.ucenter.service.impl;
+
+import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
+import com.fdkankan.ucenter.entity.SceneEditInfoExt;
+import com.fdkankan.ucenter.mapper.ISceneEditInfoExtMapper;
+import com.fdkankan.ucenter.service.ISceneEditInfoExtService;
+import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
+import org.springframework.stereotype.Service;
+
+/**
+ * <p>
+ *  服务实现类
+ * </p>
+ *
+ * @author 
+ * @since 2022-07-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));
+    }
+}

+ 26 - 0
src/main/java/com/fdkankan/ucenter/service/impl/SceneEditInfoServiceImpl.java

@@ -0,0 +1,26 @@
+package com.fdkankan.ucenter.service.impl;
+
+import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
+import com.fdkankan.ucenter.entity.SceneEditInfo;
+import com.fdkankan.ucenter.mapper.ISceneEditInfoMapper;
+import com.fdkankan.ucenter.service.ISceneEditInfoService;
+import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
+import org.springframework.stereotype.Service;
+
+/**
+ * <p>
+ *  服务实现类
+ * </p>
+ *
+ * @author 
+ * @since 2022-07-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));
+    }
+}

+ 104 - 2
src/main/java/com/fdkankan/ucenter/service/impl/ScenePlusServiceImpl.java

@@ -2,12 +2,18 @@ package com.fdkankan.ucenter.service.impl;
 
 import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
 import com.baomidou.mybatisplus.core.conditions.update.LambdaUpdateWrapper;
-import com.fdkankan.ucenter.entity.ScenePlus;
+import com.fdkankan.common.constant.UploadFilePath;
+import com.fdkankan.common.util.FileUtils;
+import com.fdkankan.fyun.oss.UploadToOssUtil;
+import com.fdkankan.ucenter.entity.*;
 import com.fdkankan.ucenter.mapper.IScenePlusMapper;
-import com.fdkankan.ucenter.service.IScenePlusService;
+import com.fdkankan.ucenter.service.*;
 import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.beans.factory.annotation.Qualifier;
 import org.springframework.stereotype.Service;
 
+import java.io.IOException;
 import java.util.HashMap;
 import java.util.List;
 
@@ -22,6 +28,23 @@ import java.util.List;
 @Service
 public class ScenePlusServiceImpl extends ServiceImpl<IScenePlusMapper, ScenePlus> implements IScenePlusService {
 
+    @Autowired
+    private IScenePlusExtService scenePlusExtService;
+    @Autowired
+    private ISceneEditInfoService sceneEditInfoService;
+    @Autowired
+    private ISceneEditInfoExtService sceneEditInfoExtService;
+    @Autowired
+    private ISceneEditControlsService sceneEditControlsService;
+    @Autowired
+    private ICameraDetailService cameraDetailService;
+    @Autowired
+    private ISceneCopyLogService sceneCopyLogService;
+    @Autowired
+    UploadToOssUtil uploadToOssUtil;
+    @Autowired
+    ISceneProService sceneProService;
+
     @Override
     public Long getCountByUserId(Long userId, List<Integer> sceneSourceList) {
         LambdaQueryWrapper<ScenePlus> wrapper = new LambdaQueryWrapper<>();
@@ -69,4 +92,83 @@ public class ScenePlusServiceImpl extends ServiceImpl<IScenePlusMapper, ScenePlu
         list.forEach(entity -> map.put(entity.getId(),entity));
         return map;
     }
+
+    @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();
+        // 拷贝场景编辑资源
+        String oldEditPath = String.format(UploadFilePath.EDIT_PATH, num);
+
+        String newEditPath = String.format(UploadFilePath.EDIT_PATH, newNum);
+        uploadToOssUtil.copyFiles(oldEditPath,newEditPath);
+
+        // 拷贝场景展示资源
+        String oldViewPath = String.format(UploadFilePath.VIEW_PATH, num);
+        String newViewPath = String.format(UploadFilePath.VIEW_PATH, newNum);
+        uploadToOssUtil.copyFiles(oldViewPath,newViewPath);
+
+        // 拷贝本地资源
+        String oldPath = String.format("/mnt/4Dkankan/scene/%s/caches/images/", num);
+        String newPath = String.format("/mnt/4Dkankan/scene/%s/caches/images/", newNum);
+        FileUtils.copyDirectiory(oldPath,newPath);
+
+        Long plusId = scenePlus.getId();
+        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);
+        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.updateSceneJson("v4",plusExt.getVideos(),newNum,scenePlus.getTitle(),plusExt.getWebSite(),plusExt.getThumb(),scenePlus.getId());
+    }
 }

+ 33 - 0
src/main/java/com/fdkankan/ucenter/service/impl/SceneProEditServiceImpl.java

@@ -0,0 +1,33 @@
+package com.fdkankan.ucenter.service.impl;
+
+import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
+import com.fdkankan.ucenter.entity.SceneProEdit;
+import com.fdkankan.ucenter.mapper.ISceneProEditMapper;
+import com.fdkankan.ucenter.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-07-12
+ */
+@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;
+    }
+}

+ 256 - 22
src/main/java/com/fdkankan/ucenter/service/impl/SceneProServiceImpl.java

@@ -5,25 +5,35 @@ import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
 import com.baomidou.mybatisplus.core.conditions.update.LambdaUpdateWrapper;
 import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
 import com.fdkankan.common.constant.ConstantFilePath;
+import com.fdkankan.common.constant.SceneConstant;
+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.JwtUtil;
 import com.fdkankan.fyun.oss.UploadToOssUtil;
+import com.fdkankan.ucenter.constant.CameraConstant;
+import com.fdkankan.ucenter.constant.LoginConstant;
 import com.fdkankan.ucenter.entity.*;
 import com.fdkankan.ucenter.mapper.ISceneProMapper;
 import com.fdkankan.ucenter.service.*;
 import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
 import com.fdkankan.ucenter.util.DateUserUtil;
 import com.fdkankan.ucenter.vo.request.SceneParam;
-import com.fdkankan.ucenter.vo.response.FolderVo;
 import com.fdkankan.ucenter.vo.response.GroupByCount;
 import com.fdkankan.ucenter.vo.response.SceneNumVo;
 import com.fdkankan.ucenter.vo.response.SceneVo;
+import lombok.extern.slf4j.Slf4j;
+import org.apache.commons.lang3.StringUtils;
+import org.slf4j.Logger;
 import org.springframework.beans.factory.annotation.Autowired;
 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;
 import java.util.stream.Collectors;
 
 /**
@@ -35,6 +45,7 @@ import java.util.stream.Collectors;
  * @since 2022-07-04
  */
 @Service
+@Slf4j
 public class SceneProServiceImpl extends ServiceImpl<ISceneProMapper, ScenePro> implements ISceneProService {
 
     @Autowired
@@ -59,6 +70,12 @@ public class SceneProServiceImpl extends ServiceImpl<ISceneProMapper, ScenePro>
     IFolderService folderService;
     @Autowired
     IFolderSceneService folderSceneService;
+    @Autowired
+    ISceneCopyLogService sceneCopyLogService;
+    @Autowired
+    IScene3dNumService scene3dNumService;
+    @Autowired
+    ISceneProEditService sceneProEditService;
 
     @Override
     public HashMap<String, SceneNumVo> findSceneNumber(String token) {
@@ -257,52 +274,45 @@ public class SceneProServiceImpl extends ServiceImpl<ISceneProMapper, ScenePro>
         LambdaQueryWrapper<ScenePro> wrapper = new LambdaQueryWrapper<>();
         wrapper.in(ScenePro::getId,sceneIds)
                 .eq(ScenePro::getIsUpgrade,0);
-        List<ScenePro> list = this.list(wrapper);
-        HashMap<Long ,Long >cameraMap = new HashMap<>();
-        for (ScenePro scenePro : list) {
-            cameraMap.merge(scenePro.getCameraId(), scenePro.getSpace(), Long::sum);
-        }
+        List<ScenePro> proList = this.list(wrapper);
 
-        LambdaQueryWrapper<ScenePlusExt> plusWr = new LambdaQueryWrapper<>();
-        plusWr.in(ScenePlusExt::getPlusId,sceneIds);
-        List<ScenePlusExt> list2 = scenePlusExtService.list(plusWr);
-        HashMap<Long,ScenePlus> scenePlusHashMap = scenePlusService.getMapByIds(sceneIds);
+        LambdaQueryWrapper<ScenePlus> plusWr = new LambdaQueryWrapper<>();
+        plusWr.in(ScenePlus::getId,sceneIds);
+        List<ScenePlus> plusList = scenePlusService.list(plusWr);
 
-        for (ScenePlusExt scenePlusExt : list2) {
-            cameraMap.merge(scenePlusHashMap.get(scenePlusExt.getPlusId()).getCameraId(), scenePlusExt.getSpace(), Long::sum);
-        }
-        this.removeByIds(sceneIds);
-        scenePlusService.removeByIds(sceneIds);
-        //恢复相机使用容量
-        cameraDetailService.addUsedSpace(cameraMap);
+        this.deleteByList(proList,plusList);
     }
 
     @Override
-    public PageInfo newList(SceneParam param, String username) {
+    public JSONObject newList(SceneParam param, String username) {
         User user = userService.getByUserName(username);
         param.setSourceList(getSceneSource(param.getSceneSource()));
         param.setUserId(user.getId());
         Page<SceneVo> sceneVoPage = getBaseMapper().pageListAndFolder(new Page<>(param.getPageNum(),param.getPageSize()),param);
         List<SceneVo> folderList =   sceneVoPage.getRecords().parallelStream().filter(entity -> entity.getIsFolder() == 1).collect(Collectors.toList());
+        Integer folderNum = 0;
         if(folderList.size() >0){
             List<Long> folderIds = folderList.parallelStream().map(SceneVo::getId).collect(Collectors.toList());
             List<Folder> allFolderIds = folderService.getAllFolderIds(folderIds);
+            folderNum = allFolderIds.size();
             HashMap<Long,Long> map = folderSceneService.getGroupByFolderIds(allFolderIds);
             for (SceneVo vo : sceneVoPage.getRecords()) {
                 if(vo.getIsFolder() == 1){
                     Long sceneNum = map.get(vo.getId()) == null ? 0L : map.get(vo.getId());
                     vo.setSceneNum(sceneNum );
-                    vo.setCreateTimeStr(DateUserUtil.getDayTime(vo.getCreateTime()));
+                    vo.setCreateTimeStr(vo.getCreateTime());
                 }
-                vo.setCreateTime(vo.getCreateTime());
             }
             Collections.reverse(folderList);
             List<SceneVo> records = sceneVoPage.getRecords();
             List<SceneVo> sceneList = records.parallelStream().filter(entity -> entity.getIsFolder() == 0).collect(Collectors.toList());
             folderList.addAll(sceneList);
+            sceneVoPage.setRecords(folderList);
         }
-        sceneVoPage.setRecords(folderList);
-        return PageInfo.PageInfo(sceneVoPage);
+        JSONObject jsonObject = new JSONObject();
+        jsonObject.put("pageInfo",PageInfo.PageInfo(sceneVoPage));
+        jsonObject.put("sceneNum",sceneVoPage.getTotal() - folderNum);
+        return jsonObject;
     }
 
     public List<String> getSceneSource(String sceneSource){
@@ -320,4 +330,228 @@ public class SceneProServiceImpl extends ServiceImpl<ISceneProMapper, ScenePro>
         }
         return sceneSourceList;
     }
+
+    @Override
+    public void copyScene(String sceneNum,String userName) throws Exception {
+        if(StringUtils.isEmpty(sceneNum)){
+            throw new BusinessException(LoginConstant.FAILURE_CODE_3001, LoginConstant.FAILURE_MSG_3001);
+        }
+        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();
+        Long userId = scenePro == null ? scenePlus.getUserId() :scenePro.getUserId();
+        // 判断是否有绑定会员权益
+        Long count = userIncrementService.getValidCountByCameraId(cameraId);
+        if(count <= 0){
+            throw new BusinessException(LoginConstant.FAILURE_CODE_3030, LoginConstant.FAILURE_MSG_3030);
+        }
+        if(userId == null){
+            throw new BusinessException(SceneConstant.FAILURE_CODE_5013, SceneConstant.FAILURE_MSG_5013);
+        }
+        //只能复制自己的场景
+        User user = userService.getByUserName(userName);
+        if(user == null || !user.getId().equals(userId) ){
+            throw new BusinessException(SceneConstant.FAILURE_CODE_5013, SceneConstant.FAILURE_MSG_5013);
+        }
+        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());
+        if(scenePro !=null){        //v3场景复制
+            this.copyV3Scene(scenePro,newNum,detailEntity);
+        }
+        if(scenePlus != null){      //v4场景复制
+            scenePlusService.copyV4Scene(scenePlus,newNum,detailEntity);
+        }
+
+    }
+
+    @Override
+    public ScenePro getByNum(String sceneNum) {
+        LambdaQueryWrapper<ScenePro> wrapper = new LambdaQueryWrapper<>();
+        wrapper.eq(ScenePro::getNum,sceneNum);
+        wrapper.eq(ScenePro::getIsUpgrade,0);
+        List<ScenePro> list = this.list(wrapper);
+        if(list!= null && list.size() >0){
+            return list.get(0);
+        }
+        return null;
+    }
+
+    @Override
+    public void copyV3Scene(ScenePro oldScene,String newNum,CameraDetail cameraDetail) {
+        SceneProEdit oldEditScene = sceneProEditService.getByProId(oldScene.getId());
+
+        String oldNum = oldScene.getNum();
+        //复制数据库数据
+        oldScene.setId(null);
+        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));
+        //更新video
+        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);
+
+        CompletableFuture.runAsync(() -> {
+            try {
+                log.info("开始复制场景-{}", new Date());
+
+                //oss复制源文件
+                String buildModelPath = ConstantFilePath.BUILD_MODEL_PATH;
+                if(oldScene.getSceneSource().equals(4)){
+                    buildModelPath = ConstantFilePath.BUILD_MODEL_LASER_PATH;
+                }
+                CreateObjUtil.ossUtilCp(ConstantFilePath.OSS_PREFIX + oldScene.getDataSource().replace(buildModelPath, "")+"/", oldScene.getDataSource());
+
+                List<String> urlList = new ArrayList<>();
+                FileUtils.readfilePath(oldScene.getDataSource(), urlList);
+                Map<String,String> fileMap = new HashMap<>();
+                for(String url : urlList){
+                    fileMap.put(url, ConstantFilePath.OSS_PREFIX + url.replace(buildModelPath, ""));
+                }
+                uploadToOssUtil.uploadMulFiles(fileMap);
+
+                //oss复制计算结果资源
+                downloadFromoldNumFromOss(oldNum, newNum);
+
+                // 复制本地secen.json
+                copyOldSceneLocalToNew(oldNum, newNum);
+                updateSceneJson("v3",oldScene.getVideos(),newNum,oldScene.getSceneName(),oldScene.getWebSite(),oldScene.getThumb(),oldScene.getId());
+                //上传资源到oss
+                uploadNewSceneToOss(newNum);
+                log.info("复制场景结束-{}", new Date());
+            } catch (Exception e) {
+                log.error("复制场景异常", e);
+            }
+        });
+
+    }
+
+    /**
+     * 从旧场景下载资源
+     * @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);
+    }
+
+    /**
+     * 从本地旧场景拷贝资源到新场景
+     * @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);
+
+        // 复制本地视频
+        FileUtils.copyFolderAllFiles(ConstantFilePath.SCENE_PATH + "video/video" + sceneNum + "/",
+                ConstantFilePath.SCENE_PATH + "video/video" + newNum + "/", true);
+
+        // 复制本地二维码
+        FileUtils.copyFile(ConstantFilePath.SCENE_QR_CODE_PATH + sceneNum + ".png",
+                ConstantFilePath.SCENE_QR_CODE_PATH + newNum + ".png", true);
+
+        // 复制本地二维码
+        FileUtils.copyFile(ConstantFilePath.SCENE_QR_CODE_PATH + sceneNum + "_en.png",
+                ConstantFilePath.SCENE_QR_CODE_PATH + newNum + "_en.png", true);
+    }
+
+    /**
+     * 上传新场景资源到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);
+    }
+
+    @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 localPath ;
+        String uploadPath ;
+        if(type.equals("v3")){
+            localPath = ConstantFilePath.SCENE_PATH + "data/data" + newNum + File.separator + "scene.json";
+            uploadPath = localPath.replace(ConstantFilePath.SCENE_PATH, "");
+        }else {
+            localPath = ConstantFilePath.SCENE_V4_PATH +"scene_view_data/"+ newNum + File.separator + "data" +File.separator +"scene.json";
+            uploadPath =localPath.replace(ConstantFilePath.SCENE_V4_PATH, "");
+
+        }
+        FileUtils.writeJsonFile(localPath, map);
+        if(type.equals("v4")){
+            uploadToOssUtil.upload(localPath,uploadPath);
+        }
+    }
+
+    @Override
+    public void delete(String sceneNum, String username) {
+        if(StringUtils.isEmpty(sceneNum)){
+            throw  new BusinessException(LoginConstant.FAILURE_CODE_3001,LoginConstant.FAILURE_MSG_3001);
+        }
+        String[] nums = sceneNum.split(",");
+        List<String> numList = Arrays.asList(nums);
+        List<ScenePro> proList = this.getListByNums(numList);
+        List<ScenePlus> plusList = scenePlusService.getListByNums(numList);
+        this.deleteByList(proList,plusList);
+    }
+
+    private void deleteByList(List<ScenePro> proList,List<ScenePlus> plusList) {
+        HashMap<Long ,Long >cameraMap = new HashMap<>();
+        for (ScenePro scenePro : proList) {
+            cameraMap.merge(scenePro.getCameraId(), scenePro.getSpace(), Long::sum);
+        }
+        List<Long> proIds = proList.parallelStream().map(ScenePro::getId).collect(Collectors.toList());
+        List<Long> plusIds = plusList.parallelStream().map(ScenePlus::getId).collect(Collectors.toList());
+        HashMap<Long, ScenePlusExt> plusMap = scenePlusExtService.getByPlusIds(plusIds);
+
+        for (ScenePlus scenePlus : plusList) {
+            cameraMap.merge(scenePlus.getCameraId(), plusMap.get(scenePlus.getId()).getSpace(), Long::sum);
+        }
+        this.removeByIds(proIds);
+        scenePlusService.removeByIds(plusIds);
+        //恢复相机使用容量
+        cameraDetailService.addUsedSpace(cameraMap);
+    }
 }

+ 5 - 0
src/main/java/com/fdkankan/ucenter/service/impl/SceneResourceServiceImpl.java

@@ -31,4 +31,9 @@ public class SceneResourceServiceImpl extends ServiceImpl<ISceneResourceMapper,
         wrapper.in(SceneResource::getVersion,versionList);
         return this.list(wrapper);
     }
+
+    @Override
+    public List<SceneResource> getByCooperationId(Long cooId) {
+        return this.getBaseMapper().getByCooperationId(cooId);
+    }
 }

+ 8 - 0
src/main/java/com/fdkankan/ucenter/service/impl/SceneServiceImpl.java

@@ -3,6 +3,7 @@ package com.fdkankan.ucenter.service.impl;
 import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
 import com.baomidou.mybatisplus.core.conditions.update.LambdaUpdateWrapper;
 import com.fdkankan.ucenter.entity.Scene;
+import com.fdkankan.ucenter.entity.ScenePlus;
 import com.fdkankan.ucenter.mapper.ISceneMapper;
 import com.fdkankan.ucenter.service.ISceneService;
 import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
@@ -36,4 +37,11 @@ public class SceneServiceImpl extends ServiceImpl<ISceneMapper, Scene> implement
                 .in(Scene::getCameraId,cameraIds);
         this.update(wrapper);
     }
+
+    @Override
+    public List<Scene> getListByNums(List<String> numList) {
+        LambdaQueryWrapper<Scene> wrapper = new LambdaQueryWrapper<>();
+        wrapper.in(Scene::getNum,numList);
+        return this.list(wrapper);
+    }
 }

+ 1 - 1
src/main/java/com/fdkankan/ucenter/util/DateUserUtil.java

@@ -28,6 +28,6 @@ public class DateUserUtil {
         }catch (Exception e){
             e.printStackTrace();
         }
-       return "";
+       return time;
     }
 }

+ 3 - 0
src/main/java/com/fdkankan/ucenter/vo/request/SceneCooperationParam.java

@@ -11,4 +11,7 @@ public class SceneCooperationParam {
     private String sceneNum;
     private List<String> numList;
     private List<Long> cameraIdList;
+
+    private String userName;
+    private String resourceIds;
 }

+ 8 - 0
src/main/java/com/fdkankan/ucenter/vo/request/SceneParam.java

@@ -12,4 +12,12 @@ public class SceneParam extends RequestBase {
     private Integer folderType;
     private Long userId;
     private List<String> sourceList;
+    private List<String> numList;
+    private Integer hasFolder =1;   // 0 不包含文件夹,1包含
+
+    private String sceneName;       //场景名称
+    private String snCode;          //相机snCode
+    private String userName;        //协作者名称
+
+    private String sceneNum;
 }

+ 9 - 0
src/main/java/com/fdkankan/ucenter/vo/response/DownVo.java

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

+ 10 - 0
src/main/java/com/fdkankan/ucenter/vo/response/DownloadProcessVo.java

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

+ 6 - 0
src/main/java/com/fdkankan/ucenter/vo/response/SceneVo.java

@@ -1,5 +1,6 @@
 package com.fdkankan.ucenter.vo.response;
 
+import com.fdkankan.ucenter.util.DateUserUtil;
 import lombok.Data;
 
 @Data
@@ -21,6 +22,7 @@ public class SceneVo {
     private String webSite;
     private Integer isUpgrade;
     private String createTime;
+    private Integer viewCount;
 
     //文件夹相关
     private String createTimeStr;
@@ -28,4 +30,8 @@ public class SceneVo {
     private Long parentId;
     private Long sceneNum;
     private String type;
+
+    public String getCreateTime() {
+        return DateUserUtil.getDayTime(createTime);
+    }
 }

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

+ 5 - 0
src/main/resources/mapper/ucenter/SceneCopyLogMapper.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.ucenter.mapper.ISceneCopyLogMapper">
+
+</mapper>

+ 5 - 0
src/main/resources/mapper/ucenter/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.ucenter.mapper.ISceneDownloadLogMapper">
+
+</mapper>

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

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

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

+ 5 - 0
src/main/resources/mapper/ucenter/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.ucenter.mapper.ISceneProEditMapper">
+
+</mapper>

+ 56 - 36
src/main/resources/mapper/ucenter/SceneProMapper.xml

@@ -22,60 +22,61 @@
     </select>
 
     <select id="pageListAndFolder" resultType="com.fdkankan.ucenter.vo.response.SceneVo">
-        SELECT id,name,1 as isFolder,type,parent_id as parentId,create_time,null as num,null as scene_name,null as scene_dec,
-        null as status,null as pay_status,null as thumb,null as web_site,null as is_upgrade
-        FROM t_folder WHERE type = #{param.folderType}
-        <if test="param.folderId!=null">
-            AND parent_id = #{param.folderId}
-        </if>
-        <if test="param.folderId == null">
-            AND parent_id is null
-        </if>
-         and
-        <include refid="commonOldWhere"></include>
-        AND
-        <include refid="commonWhere"></include>
-        UNION SELECT * FROM (
-        SELECT id ,null as name ,0 as isFolder,null as type,null as parentId ,create_time,num,scene_name,scene_dec,
-        status,pay_status,thumb,web_site,0 as is_upgrade
-        FROM t_scene_pro WHERE
-        <include refid="commonOldWhere"></include>
-        AND
+        <include refid="HasFolder"></include>
+        SELECT * FROM (
+        SELECT p.id ,null as name ,0 as isFolder,null as type,null as parentId ,p.create_time,num,scene_name,scene_dec,
+        p.status,pay_status,thumb,web_site,0 as is_upgrade,sn_code,view_count,u.user_name as cooperationUserName
+        FROM t_scene_pro p 
+        <include refid="sceneJoinCamera"></include>
+        WHERE is_upgrade = 0 and  p.rec_status = 'A'
         <include refid="commonWhere"></include>
         AND
         <include refid="commonSceneWhere"></include>
-        <if test="param.folderId == null">
-            AND id not in(SELECT id FROM t_folder_scene )
-        </if>
-        <if test="param.folderId != null">
-            AND id in (SELECT id FROM t_folder_scene where folder_id =#{param.folderId} )
+        <if test="param.sceneName !=null and param.sceneName !=''">
+          and  p.scene_name like CONCAT('%',#{param.sceneName},'%')
         </if>
         UNION
         SELECT p.id as id ,null as name ,0 as isFolder,null as type,null as parentId,p.create_time ,num,title as scene_name,description as scene_dec,
-        scene_status,pay_status,thumb,web_site,1 as is_upgrade
+        scene_status as status,pay_status,thumb,web_site,1 as is_upgrade,sn_code,view_count,u.user_name as cooperationUserName
         FROM t_scene_plus p
-        LEFT JOIN t_scene_plus_ext e on p.id = e.plus_id WHERE
-        p.tb_status = 0 AND
+        LEFT JOIN t_scene_plus_ext e on p.id = e.plus_id
+        <include refid="sceneJoinCamera"></include>
+        WHERE p.tb_status = 0
         <include refid="commonWhere"></include>
         AND
         <include refid="commonSceneWhere"></include>
-        <if test="param.folderId == null">
-            AND p.id not in(SELECT id FROM t_folder_scene )
-        </if>
-        <if test="param.folderId != null">
-            AND p.id in (SELECT id FROM t_folder_scene where folder_id =#{param.folderId} )
+        <if test="param.sceneName !=null and param.sceneName !=''">
+          and  p.title like CONCAT('%',#{param.sceneName},'%')
         </if>
         ORDER BY create_time desc
         ) as scene_tb
     </select>
 
+    <sql id="HasFolder">
+        <if test="param.hasFolder == 1">
+            SELECT id,name,1 as isFolder,type,parent_id as parentId,create_time,null as num,null as scene_name,null as scene_dec,
+            null as status,null as pay_status,null as thumb,null as web_site,null as is_upgrade,null as sn_code,null as view_count,null as cooperationUserName
+            FROM t_folder WHERE rec_status = 'A' and type = #{param.folderType} and user_id =#{param.userId}
+            <if test="param.folderId!=null">
+                AND parent_id = #{param.folderId}
+            </if>
+            <if test="param.folderId == null">
+                AND parent_id is null
+            </if>
+            UNION
+        </if>
+    </sql>
 
-    <sql id="commonWhere">
-		 user_id =#{param.userId}
+    <sql id="sceneJoinCamera">
+        LEFT JOIN t_camera c on p.camera_id = c.id
+        LEFT JOIN t_scene_cooperation coo on p.num = coo.scene_num
+		LEFT JOIN t_user u on coo.user_id = u.id
     </sql>
 
-    <sql id="commonOldWhere">
-		 rec_status = 'A'
+    <sql id="commonWhere">
+        <if test="param.numList == null ">
+           and p.user_id =#{param.userId}
+        </if>
     </sql>
 
     <sql id="commonSceneWhere">
@@ -83,6 +84,25 @@
         <foreach item="sourceId" collection="param.sourceList" open="(" separator="," close=")">
             #{sourceId}
         </foreach>
+        <if test="param.folderId == null">
+            AND p.id not in(SELECT id FROM t_folder_scene )
+        </if>
+        <if test="param.folderId != null">
+            AND p.id in (SELECT id FROM t_folder_scene where folder_id =#{param.folderId} )
+        </if>
+        <if test="param.numList !=null and param.numList.size >0">
+            and num in
+            <foreach item="num" collection="param.numList" open="(" separator="," close=")">
+                #{num}
+            </foreach>
+        </if>
+        <if test="param.snCode !=null and param.snCode !=''">
+            and c.sn_code like CONCAT('%',#{param.snCode},'%')
+        </if>
+        <if test="param.userName !=null and param.userName !=''">
+            and u.user_name like CONCAT('%',#{param.userName},'%')
+        </if>
+        and coo.rec_status ='A'
     </sql>
 
 </mapper>

+ 4 - 0
src/main/resources/mapper/ucenter/SceneResourceMapper.xml

@@ -6,4 +6,8 @@
         SELECT a.* FROM `t_scene_resource` a LEFT JOIN `t_scene_resource_camera` b ON a.id = b.scene_resource_id
         WHERE b.rec_status = 'A' and b.camera_id = #{cameraId}
     </select>
+    <select id="getByCooperationId" resultType="com.fdkankan.ucenter.entity.SceneResource">
+        SELECT a.* FROM `t_scene_resource` a LEFT JOIN `t_scene_resource_cooperation` b ON a.id = b.scene_resource_id
+        WHERE b.rec_status = 'A' and b.scene_cooperation_id = #{cooId}
+    </select>
 </mapper>