lyhzzz преди 3 години
родител
ревизия
9d8ddd9dc6
променени са 25 файла, в които са добавени 866 реда и са изтрити 9 реда
  1. 45 0
      src/main/java/com/fdkankan/ucenter/controller/FolderController.java
  2. 9 5
      src/main/java/com/fdkankan/ucenter/controller/SceneController.java
  3. 48 0
      src/main/java/com/fdkankan/ucenter/entity/FolderScene.java
  4. 1 1
      src/main/java/com/fdkankan/ucenter/generate/AutoGenerate.java
  5. 25 0
      src/main/java/com/fdkankan/ucenter/mapper/IFolderSceneMapper.java
  6. 5 0
      src/main/java/com/fdkankan/ucenter/mapper/ISceneProMapper.java
  7. 2 0
      src/main/java/com/fdkankan/ucenter/service/ICameraDetailService.java
  8. 25 0
      src/main/java/com/fdkankan/ucenter/service/IFolderSceneService.java
  9. 17 0
      src/main/java/com/fdkankan/ucenter/service/IFolderService.java
  10. 3 0
      src/main/java/com/fdkankan/ucenter/service/IScenePlusService.java
  11. 6 0
      src/main/java/com/fdkankan/ucenter/service/ISceneProService.java
  12. 1 2
      src/main/java/com/fdkankan/ucenter/service/impl/AppService.java
  13. 17 0
      src/main/java/com/fdkankan/ucenter/service/impl/CameraDetailServiceImpl.java
  14. 75 0
      src/main/java/com/fdkankan/ucenter/service/impl/FolderSceneServiceImpl.java
  15. 182 1
      src/main/java/com/fdkankan/ucenter/service/impl/FolderServiceImpl.java
  16. 11 0
      src/main/java/com/fdkankan/ucenter/service/impl/ScenePlusServiceImpl.java
  17. 80 0
      src/main/java/com/fdkankan/ucenter/service/impl/SceneProServiceImpl.java
  18. 66 0
      src/main/java/com/fdkankan/ucenter/util/FolderTree.java
  19. 100 0
      src/main/java/com/fdkankan/ucenter/util/FolderTreeUtil.java
  20. 4 0
      src/main/java/com/fdkankan/ucenter/vo/request/FolderParam.java
  21. 15 0
      src/main/java/com/fdkankan/ucenter/vo/request/SceneParam.java
  22. 14 0
      src/main/java/com/fdkankan/ucenter/vo/response/FolderVo.java
  23. 31 0
      src/main/java/com/fdkankan/ucenter/vo/response/SceneVo.java
  24. 19 0
      src/main/resources/mapper/ucenter/FolderSceneMapper.xml
  25. 65 0
      src/main/resources/mapper/ucenter/SceneProMapper.xml

+ 45 - 0
src/main/java/com/fdkankan/ucenter/controller/FolderController.java

@@ -1,13 +1,19 @@
 package com.fdkankan.ucenter.controller;
 
 
+import com.fdkankan.common.exception.BusinessException;
 import com.fdkankan.common.util.JwtUtil;
 import com.fdkankan.ucenter.common.Result;
+import com.fdkankan.ucenter.constant.LoginConstant;
+import com.fdkankan.ucenter.entity.Folder;
 import com.fdkankan.ucenter.service.IFolderService;
 import com.fdkankan.ucenter.vo.request.FolderParam;
+import org.apache.ibatis.annotations.Param;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.web.bind.annotation.*;
 
+import java.util.List;
+
 /**
  * <p>
  * 文件夹表 前端控制器
@@ -37,6 +43,45 @@ public class FolderController {
         return Result.success();
     }
 
+    /**
+     * 修改文件夹
+     */
+    @PostMapping("/update")
+    public Result update(@RequestBody FolderParam param,@RequestHeader String token){
+        String username = JwtUtil.getUsername(token);
+        folderService.updateByParam(param,username);
+        return Result.success();
+    }
+
+    /**
+     * 删除文件夹
+     */
+    @PostMapping("/delete")
+    public Result delete(@RequestBody FolderParam param,@RequestHeader String token){
+        String username = JwtUtil.getUsername(token);
+        folderService.delete(param.getId(),username);
+        return Result.success();
+    }
+
+    /**
+     * 获取该用户所有文件夹树结构
+     * type   文件夹类型,0我的场景,1协作场景
+     */
+    @PostMapping("/findListTree")
+    public Result findListTree(@RequestBody FolderParam param,@RequestHeader String token){
+        String username = JwtUtil.getUsername(token);
+        return Result.success(folderService.findListTree(param.getType(),username));
+    }
+
+    /**
+     * 移动文件夹或场景
+     */
+    @PostMapping("/move")
+    public Result move(@RequestBody FolderParam param,@RequestHeader String token){
+        String username = JwtUtil.getUsername(token);
+        folderService.move(param,username);
+        return Result.success();
+    }
 
 }
 

+ 9 - 5
src/main/java/com/fdkankan/ucenter/controller/SceneController.java

@@ -1,15 +1,13 @@
 package com.fdkankan.ucenter.controller;
 
 
+import com.fdkankan.common.util.JwtUtil;
 import com.fdkankan.ucenter.common.Result;
 import com.fdkankan.ucenter.service.ISceneProService;
 import com.fdkankan.ucenter.service.IUserService;
+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.RequestHeader;
-import org.springframework.web.bind.annotation.RequestMapping;
-
-import org.springframework.web.bind.annotation.RestController;
+import org.springframework.web.bind.annotation.*;
 
 /**
  * <p>
@@ -32,5 +30,11 @@ public class SceneController {
     public Result findSceneNumber(@RequestHeader String token){
         return Result.success(sceneProService.findSceneNumber(token));
     }
+
+    @PostMapping("/newList")
+    public Result newList(@RequestBody SceneParam param,@RequestHeader String token){
+        String username = JwtUtil.getUsername(token);
+        return Result.success(sceneProService.newList(param,username));
+    }
 }
 

+ 48 - 0
src/main/java/com/fdkankan/ucenter/entity/FolderScene.java

@@ -0,0 +1,48 @@
+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-08
+ */
+@Getter
+@Setter
+@TableName("t_folder_scene")
+public class FolderScene implements Serializable {
+
+    private static final long serialVersionUID = 1L;
+
+    @TableId(value = "id", type = IdType.AUTO)
+    private Long id;
+
+    @TableField("folder_id")
+    private Long folderId;
+
+    @TableField("scene_id")
+    private Long sceneId;
+
+    @TableField("rec_status")
+    @TableLogic(value = "A",delval = "I")
+    private String recStatus;
+
+    @TableField("create_time")
+    private String createTime;
+
+    @TableField("update_time")
+    private String updateTime;
+
+
+}

+ 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"
+                "t_folder_scene"
         }));
 
 //        generate(path,"goods", getTables(new String[]{

+ 25 - 0
src/main/java/com/fdkankan/ucenter/mapper/IFolderSceneMapper.java

@@ -0,0 +1,25 @@
+package com.fdkankan.ucenter.mapper;
+
+import com.fdkankan.ucenter.entity.FolderScene;
+import com.baomidou.mybatisplus.core.mapper.BaseMapper;
+import com.fdkankan.ucenter.vo.response.GroupByCount;
+import org.apache.ibatis.annotations.Mapper;
+import org.apache.ibatis.annotations.Param;
+
+import java.util.List;
+
+/**
+ * <p>
+ * 文件夹和场景关联表 Mapper 接口
+ * </p>
+ *
+ * @author 
+ * @since 2022-07-08
+ */
+@Mapper
+public interface IFolderSceneMapper extends BaseMapper<FolderScene> {
+
+    FolderScene getByType(@Param("sceneId")Long sceneId, @Param("type")Integer type);
+
+    List<GroupByCount> getGroupByFolderIds(@Param("folderIds") List<Long> folderIds);
+}

+ 5 - 0
src/main/java/com/fdkankan/ucenter/mapper/ISceneProMapper.java

@@ -1,8 +1,11 @@
 package com.fdkankan.ucenter.mapper;
 
+import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
 import com.fdkankan.ucenter.entity.ScenePro;
 import com.baomidou.mybatisplus.core.mapper.BaseMapper;
+import com.fdkankan.ucenter.vo.request.SceneParam;
 import com.fdkankan.ucenter.vo.response.GroupByCount;
+import com.fdkankan.ucenter.vo.response.SceneVo;
 import org.apache.ibatis.annotations.Mapper;
 import org.apache.ibatis.annotations.Param;
 
@@ -21,4 +24,6 @@ public interface ISceneProMapper extends BaseMapper<ScenePro> {
 
     List<GroupByCount> findSceneProNumByCameraIds(@Param("cameraIds") List<Long> cameraIdList);
     List<GroupByCount> findScenePlusNumByCameraIds(@Param("cameraIds") List<Long> cameraIdList);
+
+    Page<SceneVo> pageListAndFolder(Page<SceneVo>page,SceneParam param);
 }

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

@@ -29,4 +29,6 @@ public interface ICameraDetailService extends IService<CameraDetail> {
     HashMap<Long, CameraDetail> getByCameraIds(List<Long> cameraIds);
 
     void updateCooperationByIds(List<Long> cameraIds, Long id);
+
+    void addUsedSpace(HashMap<Long, Long> cameraMap);
 }

+ 25 - 0
src/main/java/com/fdkankan/ucenter/service/IFolderSceneService.java

@@ -0,0 +1,25 @@
+package com.fdkankan.ucenter.service;
+
+import com.fdkankan.ucenter.entity.Folder;
+import com.fdkankan.ucenter.entity.FolderScene;
+import com.baomidou.mybatisplus.extension.service.IService;
+
+import java.util.HashMap;
+import java.util.List;
+
+/**
+ * <p>
+ * 文件夹和场景关联表 服务类
+ * </p>
+ *
+ * @author 
+ * @since 2022-07-08
+ */
+public interface IFolderSceneService extends IService<FolderScene> {
+
+    void deleteByFolderIds(List<Long> delIds);
+
+    FolderScene getByType(Long sceneId, Integer type);
+
+    HashMap<Long, Long> getGroupByFolderIds(List<Folder> folderIds);
+}

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

@@ -1,8 +1,14 @@
 package com.fdkankan.ucenter.service;
 
+import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
 import com.fdkankan.ucenter.entity.Folder;
 import com.baomidou.mybatisplus.extension.service.IService;
+import com.fdkankan.ucenter.util.FolderTree;
 import com.fdkankan.ucenter.vo.request.FolderParam;
+import com.fdkankan.ucenter.vo.request.SceneParam;
+import com.fdkankan.ucenter.vo.response.FolderVo;
+
+import java.util.List;
 
 /**
  * <p>
@@ -15,4 +21,15 @@ import com.fdkankan.ucenter.vo.request.FolderParam;
 public interface IFolderService extends IService<Folder> {
 
     void add(FolderParam param);
+
+    void updateByParam(FolderParam param, String username);
+
+    void delete(Long id, String username);
+
+    List<FolderTree> findListTree(Integer type, String username);
+
+    void move(FolderParam param, String username);
+
+    List<Folder> getAllFolderIds(List<Long> folderIds);
+
 }

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

@@ -3,6 +3,7 @@ package com.fdkankan.ucenter.service;
 import com.fdkankan.ucenter.entity.ScenePlus;
 import com.baomidou.mybatisplus.extension.service.IService;
 
+import java.util.HashMap;
 import java.util.List;
 
 /**
@@ -24,4 +25,6 @@ public interface IScenePlusService extends IService<ScenePlus> {
     List<ScenePlus> getListByCameraIds(List<Long> cameraIds);
 
     List<ScenePlus> getListByNums(List<String> numList);
+
+    HashMap<Long, ScenePlus> getMapByIds(List<Long> sceneIds);
 }

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

@@ -1,8 +1,10 @@
 package com.fdkankan.ucenter.service;
 
+import com.fdkankan.common.response.PageInfo;
 import com.fdkankan.ucenter.entity.CameraDetail;
 import com.fdkankan.ucenter.entity.ScenePro;
 import com.baomidou.mybatisplus.extension.service.IService;
+import com.fdkankan.ucenter.vo.request.SceneParam;
 import com.fdkankan.ucenter.vo.response.GroupByCount;
 import com.fdkankan.ucenter.vo.response.SceneNumVo;
 
@@ -34,4 +36,8 @@ public interface ISceneProService extends IService<ScenePro> {
     List<ScenePro> getListByNums(List<String> numList);
 
     Long getCountByUserId(Long id, List<Integer> resourceList);
+
+    void deleteByIds(List<Long> sceneIds);
+
+    PageInfo newList(SceneParam param, String username);
 }

+ 1 - 2
src/main/java/com/fdkankan/ucenter/service/impl/AppService.java

@@ -52,8 +52,7 @@ public class AppService {
         if (StringUtils.isEmpty(param.getPassword()) || StringUtils.isEmpty(param.getPhoneNum())){
             throw new BusinessException(LoginConstant.FAILURE_CODE_3001, LoginConstant.FAILURE_MSG_3001);
         }
-        String password = Base64Converter.decode(Base64Converter.subText(param.getPassword()));
-        String passwordCode = SecurityUtil.MD5(password);
+        String passwordCode = SecurityUtil.MD5(param.getPassword());
         User user = userService.getByUserName(param.getPhoneNum());
         if(user == null){
             throw new BusinessException(LoginConstant.FAILURE_CODE_3015, LoginConstant.FAILURE_MSG_3015);

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

@@ -17,6 +17,7 @@ import org.springframework.stereotype.Service;
 import java.util.ArrayList;
 import java.util.HashMap;
 import java.util.List;
+import java.util.Set;
 
 /**
  * <p>
@@ -129,4 +130,20 @@ public class CameraDetailServiceImpl extends ServiceImpl<ICameraDetailMapper, Ca
                 .set(CameraDetail::getCooperationUser,userId);
         this.update(wrapper);
     }
+
+    @Override
+    public void addUsedSpace(HashMap<Long, Long> cameraMap) {
+        Set<Long> cameraIds = cameraMap.keySet();
+        LambdaQueryWrapper<CameraDetail> wrapper = new LambdaQueryWrapper<>();
+        wrapper.in(CameraDetail::getCameraId,cameraIds);
+        List<CameraDetail> list = this.list(wrapper);
+        for (CameraDetail cameraDetail : list) {
+            long subSpace = cameraMap.get(cameraDetail.getCameraId()) == null ? 0L : cameraMap.get(cameraDetail.getCameraId());
+            long usedSpace = cameraDetail.getUsedSpace() - subSpace ;
+            cameraDetail.setUsedSpace(usedSpace < 0 ? 0L :usedSpace);
+            //解封封存场景
+            sceneProService.lockOrUnLockBySpace(cameraDetail,cameraDetail.getCameraId(),1);
+        }
+        this.updateBatchById(list);
+    }
 }

+ 75 - 0
src/main/java/com/fdkankan/ucenter/service/impl/FolderSceneServiceImpl.java

@@ -0,0 +1,75 @@
+package com.fdkankan.ucenter.service.impl;
+
+import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
+import com.fdkankan.ucenter.entity.Folder;
+import com.fdkankan.ucenter.entity.FolderScene;
+import com.fdkankan.ucenter.mapper.IFolderSceneMapper;
+import com.fdkankan.ucenter.service.IFolderSceneService;
+import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
+import com.fdkankan.ucenter.service.IFolderService;
+import com.fdkankan.ucenter.service.ISceneProService;
+import com.fdkankan.ucenter.service.ISceneService;
+import com.fdkankan.ucenter.vo.response.GroupByCount;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.stereotype.Service;
+
+import java.util.HashMap;
+import java.util.List;
+import java.util.stream.Collectors;
+
+/**
+ * <p>
+ * 文件夹和场景关联表 服务实现类
+ * </p>
+ *
+ * @author 
+ * @since 2022-07-08
+ */
+@Service
+public class FolderSceneServiceImpl extends ServiceImpl<IFolderSceneMapper, FolderScene> implements IFolderSceneService {
+
+    @Autowired
+    private ISceneProService sceneProService;
+    @Autowired
+    private IFolderService folderService;
+
+    @Override
+    public void deleteByFolderIds(List<Long> delIds) {
+        LambdaQueryWrapper<FolderScene> wrapper = new LambdaQueryWrapper<>();
+        wrapper.in(FolderScene::getFolderId,delIds);
+        List<FolderScene> list = this.list(wrapper);
+        List<Long> sceneIds = list.parallelStream().map(FolderScene::getSceneId).collect(Collectors.toList());
+        sceneProService.deleteByIds(sceneIds);
+        List<Long> ids = list.parallelStream().map(FolderScene::getId).collect(Collectors.toList());
+        this.removeByIds(ids);
+    }
+
+    @Override
+    public FolderScene getByType(Long sceneId, Integer type) {
+        return getBaseMapper().getByType(sceneId,type);
+    }
+
+    @Override
+    public HashMap<Long, Long> getGroupByFolderIds(List<Folder> folderIds) {
+        List<Long> ids = folderIds.parallelStream().map(Folder::getId).collect(Collectors.toList());
+        List<GroupByCount> list = getBaseMapper().getGroupByFolderIds(ids);
+        HashMap<Long ,Folder> folderMap = new HashMap<>();
+        for (Folder folder : folderIds) {
+            folderMap.put(folder.getId(),folder);
+        }
+        HashMap<Long, Long> map = new HashMap<>();
+        for (GroupByCount groupByCount : list) {
+            Folder folder = this.getParentFolder(folderMap,groupByCount.getId());
+            map.merge(folder.getId(), groupByCount.getCount(), Long::sum);
+        }
+        return map;
+    }
+
+    private Folder getParentFolder(HashMap<Long, Folder> folderMap, Long id) {
+        Folder folder = folderMap.get(id);
+        if(folder.getParentId()!=null){
+            return getParentFolder(folderMap,folder.getParentId());
+        }
+        return folder;
+    }
+}

+ 182 - 1
src/main/java/com/fdkankan/ucenter/service/impl/FolderServiceImpl.java

@@ -1,17 +1,33 @@
 package com.fdkankan.ucenter.service.impl;
 
 import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
+import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
+import com.fdkankan.common.constant.SceneConstant;
+import com.fdkankan.common.exception.BusinessException;
+import com.fdkankan.ucenter.constant.LoginConstant;
 import com.fdkankan.ucenter.entity.Folder;
+import com.fdkankan.ucenter.entity.FolderScene;
 import com.fdkankan.ucenter.entity.User;
 import com.fdkankan.ucenter.mapper.IFolderMapper;
+import com.fdkankan.ucenter.service.IFolderSceneService;
 import com.fdkankan.ucenter.service.IFolderService;
 import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
 import com.fdkankan.ucenter.service.IUserService;
+import com.fdkankan.ucenter.util.DateUserUtil;
+import com.fdkankan.ucenter.util.FolderTree;
+import com.fdkankan.ucenter.util.FolderTreeUtil;
 import com.fdkankan.ucenter.vo.request.FolderParam;
+import com.fdkankan.ucenter.vo.request.SceneParam;
+import com.fdkankan.ucenter.vo.response.FolderVo;
+import org.apache.commons.lang3.StringUtils;
+import org.springframework.beans.BeanUtils;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.stereotype.Service;
 
+import java.util.ArrayList;
+import java.util.HashMap;
 import java.util.List;
+import java.util.stream.Collectors;
 
 /**
  * <p>
@@ -26,14 +42,177 @@ public class FolderServiceImpl extends ServiceImpl<IFolderMapper, Folder> implem
 
     @Autowired
     IUserService userService;
+    @Autowired
+    IFolderSceneService folderSceneService;
 
     @Override
     public void add(FolderParam param) {
         User user = userService.getByUserName(param.getUserName());
         List<Folder> list = findByParentIdAndName(param.getParentId(), param.getName(), user.getId(), param.getType());
+        if(list != null && list.size() > 0){
+            throw new BusinessException(SceneConstant.FAILURE_CODE_5030, SceneConstant.FAILURE_MSG_5030);
+        }
+        Folder folderEntity = new Folder();
+        BeanUtils.copyProperties(param, folderEntity);
+        folderEntity.setUserId(user.getId());
+        this.save(folderEntity);
+    }
+
+    @Override
+    public void updateByParam(FolderParam param, String username) {
+        User user = userService.getByUserName(param.getUserName());
+        if(StringUtils.isEmpty(param.getName()) || param.getId() == null){
+            throw new BusinessException(LoginConstant.FAILURE_CODE_3001, LoginConstant.FAILURE_MSG_3001);
+        }
+        List<Folder> list = findByParentIdAndName(param.getParentId(), param.getName(), user.getId(), param.getType());
+        if(list != null && list.size() > 0){
+            throw new BusinessException(SceneConstant.FAILURE_CODE_5030, SceneConstant.FAILURE_MSG_5030);
+        }
+        Folder folder = checkFolder(param.getId(), user.getId());
+        folder.setName(param.getName());
+        this.updateById(folder);
+    }
+
+    @Override
+    public void delete(Long id, String username) {
+        if(id == null){
+            throw new BusinessException(LoginConstant.FAILURE_CODE_3001, LoginConstant.FAILURE_MSG_3001);
+        }
+        User user = userService.getByUserName(username);
+        Folder folder = checkFolder(id, user.getId());
+
+        //删除子文件夹
+        List<Folder> list = getAllFolder(id);
+        list.add(folder);
+        List<Long> delIds = list.parallelStream().map(Folder::getId).collect(Collectors.toList());
+        folderSceneService.deleteByFolderIds(delIds);
+        this.removeByIds(delIds);
+    }
+
+    @Override
+    public List<FolderTree> findListTree(Integer type, String username) {
+        if(type == null){
+            throw new BusinessException(LoginConstant.FAILURE_CODE_3001, LoginConstant.FAILURE_MSG_3001);
+        }
+        User user = userService.getByUserName(username);
+        if(user == null){
+            throw new BusinessException(LoginConstant.FAILURE_CODE_3004, LoginConstant.FAILURE_MSG_3004);
+        }
+        List<Folder> list = this.getByUserAndType(user.getId(),type);
+        return new FolderTreeUtil(list).buildTree();
+    }
+
+    @Override
+    public void move(FolderParam param, String username) {
+        User user = userService.getByUserName(username);
+        if(user == null){
+            throw new BusinessException(LoginConstant.FAILURE_CODE_3004, LoginConstant.FAILURE_MSG_3004);
+        }
+        if(StringUtils.isEmpty(param.getFolderIds()) && StringUtils.isEmpty(param.getSceneIds())){
+            throw new BusinessException(LoginConstant.FAILURE_CODE_3001, LoginConstant.FAILURE_MSG_3001);
+        }
+        if(param.getType() == null){
+            throw new BusinessException(LoginConstant.FAILURE_CODE_3001, LoginConstant.FAILURE_MSG_3001);
+        }
+        if(StringUtils.isNotEmpty(param.getFolderIds())){
+            String[] folderIds = param.getFolderIds().split(",");
+            Folder folderEntity = null;
+            for (String folderId : folderIds) {
+                folderEntity = this.getById(Long.valueOf(folderId));
+                folderEntity.setParentId(param.getParentId());
+                if(!folderEntity.getType().equals(param.getType())){
+                    throw new BusinessException(SceneConstant.FAILURE_CODE_5030, SceneConstant.FAILURE_MSG_5030);
+                }
+                List<Folder> byParentIdAndName = findByParentIdAndName(param.getParentId(), folderEntity.getName(), user.getId(),param.getType());
+                if(byParentIdAndName != null && byParentIdAndName.size() > 0){
+                    //表示迁移回当前目录,不做处理
+                    if(byParentIdAndName.get(0).getId() == Long.parseLong(folderId)){
+                        return;
+                    }
+                    throw new BusinessException(SceneConstant.FAILURE_CODE_5030, SceneConstant.FAILURE_MSG_5030);
+                }
+                this.updateById(folderEntity);
+            }
+        }
+        if(StringUtils.isNotEmpty(param.getSceneIds())){
+            String[] sceneIds = param.getSceneIds().split(",");
+
+            FolderScene folderSceneEntity = null;
+
+            for (String sceneId : sceneIds) {
+
+                folderSceneEntity = folderSceneService.getByType(Long.valueOf(sceneId), param.getType());
+                if(folderSceneEntity != null){
+                    folderSceneService.removeById(folderSceneEntity.getId());
+                }
+
+                if(param.getParentId() != null){
+                    Folder folderEntity = getById(param.getParentId());
+                    if(!folderEntity.getType().equals(param.getType())){
+                        throw new BusinessException(SceneConstant.FAILURE_CODE_5030, SceneConstant.FAILURE_MSG_5030);
+                    }
+                    folderSceneEntity = new FolderScene();
+                    folderSceneEntity.setSceneId(Long.valueOf(sceneId));
+                    folderSceneEntity.setFolderId(param.getParentId());
+                    folderSceneService.save(folderSceneEntity);
+                }
+            }
+        }
+
+    }
+
+    @Override
+    public List<Folder> getAllFolderIds(List<Long> folderIds) {
+        List<Folder> list = new ArrayList<>();
+        for (Long id : folderIds) {
+            Folder byId = this.getById(id);
+            List<Folder> allFolder = this.getAllFolder(id);
+            list.add(byId);
+            if(allFolder.size() >0){
+                list.addAll(allFolder);
+            }
+
+        }
+        return list;
     }
 
-    private List<Folder> findByParentIdAndName(Long parentId, String name, Long userId,Integer type){
+
+    private List<Folder> getByUserAndType(Long userId, Integer type) {
+        LambdaQueryWrapper<Folder> wrapper = new LambdaQueryWrapper<>();
+        wrapper.eq(Folder::getUserId,userId)
+                .eq(Folder::getType,type);
+        return this.list(wrapper);
+    }
+
+    private  List<Folder> getAllFolder(Long id ){
+        LambdaQueryWrapper<Folder> wrapper = new LambdaQueryWrapper<>();
+        wrapper.eq(Folder::getParentId,id);
+        List<Folder> list = this.list(wrapper);
+        if(list.size() <= 0){
+            return list;
+        }
+        for (Folder folder : list) {
+            List<Folder> folders = getAllFolder(folder.getId());
+            if(folders.size() >0){
+                list.addAll(folders);
+            }
+        }
+        return list;
+    }
+
+    private Folder checkFolder(Long id, Long userId){
+        Folder folderEntity = this.getById(id);
+        if(folderEntity == null){
+            throw new BusinessException(SceneConstant.FAILURE_CODE_5027, SceneConstant.FAILURE_MSG_5027);
+        }
+
+        if(folderEntity.getUserId().longValue() != userId){
+            throw new BusinessException(SceneConstant.FAILURE_CODE_5028, SceneConstant.FAILURE_MSG_5028);
+        }
+        return folderEntity;
+    }
+
+    private List<Folder> findByParentIdAndName(Long parentId, String name, Long userId, Integer type){
         LambdaQueryWrapper<Folder> wrapper = new LambdaQueryWrapper<>();
         wrapper.eq(Folder::getName,name)
                 .eq(Folder::getUserId,userId)
@@ -43,4 +222,6 @@ public class FolderServiceImpl extends ServiceImpl<IFolderMapper, Folder> implem
         }
         return this.list(wrapper);
     }
+
+
 }

+ 11 - 0
src/main/java/com/fdkankan/ucenter/service/impl/ScenePlusServiceImpl.java

@@ -8,6 +8,7 @@ import com.fdkankan.ucenter.service.IScenePlusService;
 import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
 import org.springframework.stereotype.Service;
 
+import java.util.HashMap;
 import java.util.List;
 
 /**
@@ -58,4 +59,14 @@ public class ScenePlusServiceImpl extends ServiceImpl<IScenePlusMapper, ScenePlu
         wrapper.in(ScenePlus::getNum,numList);
         return this.list(wrapper);
     }
+
+    @Override
+    public HashMap<Long, ScenePlus> getMapByIds(List<Long> sceneIds) {
+        LambdaQueryWrapper<ScenePlus> wrapper = new LambdaQueryWrapper<>();
+        wrapper.in(ScenePlus::getId,sceneIds);
+        List<ScenePlus> list = this.list(wrapper);
+        HashMap<Long,ScenePlus> map = new HashMap<>();
+        list.forEach(entity -> map.put(entity.getId(),entity));
+        return map;
+    }
 }

+ 80 - 0
src/main/java/com/fdkankan/ucenter/service/impl/SceneProServiceImpl.java

@@ -3,7 +3,9 @@ package com.fdkankan.ucenter.service.impl;
 import com.alibaba.fastjson.JSONObject;
 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.response.PageInfo;
 import com.fdkankan.common.util.FileUtils;
 import com.fdkankan.common.util.JwtUtil;
 import com.fdkankan.fyun.oss.UploadToOssUtil;
@@ -12,8 +14,11 @@ 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 org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.stereotype.Service;
 
@@ -48,6 +53,12 @@ public class SceneProServiceImpl extends ServiceImpl<ISceneProMapper, ScenePro>
     IUserIncrementService userIncrementService;
     @Autowired
     IScenePlusExtService scenePlusExtService;
+    @Autowired
+    ICameraDetailService cameraDetailService;
+    @Autowired
+    IFolderService folderService;
+    @Autowired
+    IFolderSceneService folderSceneService;
 
     @Override
     public HashMap<String, SceneNumVo> findSceneNumber(String token) {
@@ -240,4 +251,73 @@ public class SceneProServiceImpl extends ServiceImpl<ISceneProMapper, ScenePro>
         wrapper.in(ScenePro::getSceneSource,resourceList);
         return this.count(wrapper);
     }
+
+    @Override
+    public void deleteByIds(List<Long> sceneIds) {
+        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);
+        }
+
+        LambdaQueryWrapper<ScenePlusExt> plusWr = new LambdaQueryWrapper<>();
+        plusWr.in(ScenePlusExt::getPlusId,sceneIds);
+        List<ScenePlusExt> list2 = scenePlusExtService.list(plusWr);
+        HashMap<Long,ScenePlus> scenePlusHashMap = scenePlusService.getMapByIds(sceneIds);
+
+        for (ScenePlusExt scenePlusExt : list2) {
+            cameraMap.merge(scenePlusHashMap.get(scenePlusExt.getPlusId()).getCameraId(), scenePlusExt.getSpace(), Long::sum);
+        }
+        this.removeByIds(sceneIds);
+        scenePlusService.removeByIds(sceneIds);
+        //恢复相机使用容量
+        cameraDetailService.addUsedSpace(cameraMap);
+    }
+
+    @Override
+    public PageInfo 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());
+        if(folderList.size() >0){
+            List<Long> folderIds = folderList.parallelStream().map(SceneVo::getId).collect(Collectors.toList());
+            List<Folder> allFolderIds = folderService.getAllFolderIds(folderIds);
+            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.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);
+        return PageInfo.PageInfo(sceneVoPage);
+    }
+
+    public List<String> getSceneSource(String sceneSource){
+        List<String> sceneSourceList ;
+        switch (sceneSource){
+            case "1" : sceneSourceList = Arrays.asList("1","2","12","13","14"); break;  //四维看看
+            case "3" : sceneSourceList = Collections.singletonList("3"); break;//四维看见
+            default:
+                if(sceneSource.contains(",")){
+                    sceneSource = sceneSource + ",12,13,14";
+                    sceneSourceList = Arrays.asList(sceneSource.split(","));
+                    break;
+                }
+                sceneSourceList = Collections.singletonList(sceneSource);break;
+        }
+        return sceneSourceList;
+    }
 }

+ 66 - 0
src/main/java/com/fdkankan/ucenter/util/FolderTree.java

@@ -0,0 +1,66 @@
+package com.fdkankan.ucenter.util;
+
+import java.util.List;
+
+public class FolderTree {
+
+    private Long id;
+
+    private String name;
+
+    private Long parentId;
+
+    private List<FolderTree> children;
+
+    public List<FolderTree> getChildren() {
+        return children;
+    }
+
+    public void setChildren(List<FolderTree> children) {
+        this.children = children;
+    }
+
+    private int level;
+
+    private boolean checked = false;
+
+    public void setChecked(boolean checked) {
+        this.checked = checked;
+    }
+
+    public int getLevel() {
+        return level;
+    }
+
+    public boolean isChecked() {
+        return checked;
+    }
+
+    public void setLevel(int level) {
+        this.level = level;
+    }
+
+    public Long getId() {
+        return id;
+    }
+
+    public void setId(Long id) {
+        this.id = id;
+    }
+
+    public String getName() {
+        return name;
+    }
+
+    public void setName(String name) {
+        this.name = name;
+    }
+
+    public Long getParentId() {
+        return parentId;
+    }
+
+    public void setParentId(Long parentId) {
+        this.parentId = parentId;
+    }
+}

+ 100 - 0
src/main/java/com/fdkankan/ucenter/util/FolderTreeUtil.java

@@ -0,0 +1,100 @@
+package com.fdkankan.ucenter.util;
+
+
+import com.fdkankan.ucenter.entity.Folder;
+
+import java.util.ArrayList;
+import java.util.List;
+
+public class FolderTreeUtil {
+
+    private List<FolderTree> resultNodes = new ArrayList<FolderTree>();//树形结构排序之后list内容
+
+    private List<FolderTree> nodes = new ArrayList<FolderTree>();
+    //传入list参数
+
+    public FolderTreeUtil(List<Folder> nodesList) {//通过构造函数初始化
+        for (Folder n : nodesList) {
+            FolderTree treeGrid = new FolderTree();
+            treeGrid.setId(n.getId());
+            treeGrid.setName(n.getName());
+//            treeGrid.setIcon(n.getIcon());
+            if (n.getParentId() != null) {
+                treeGrid.setParentId(n.getParentId());
+            }
+            nodes.add(treeGrid);
+        }
+    }
+
+    public FolderTreeUtil() {
+    }
+
+    /**
+     * 构建树形结构list
+     *
+     * @return 返回树形结构List列表
+     */
+    public List<FolderTree> buildTree() {
+        for (FolderTree node : nodes) {
+            Long id = node.getParentId();
+            if (id == null) {//通过循环一级节点 就可以通过递归获取二级以下节点
+                resultNodes.add(node);//添加一级节点
+//                node.setLevel(1);
+                build(node, node.getLevel());//递归获取二级、三级、。。。节点
+            }
+        }
+        return resultNodes;
+    }
+
+    /**
+     * 递归循环子节点
+     *
+     * @param node 当前节点
+     */
+    private void build(FolderTree node, int level) {
+        List<FolderTree> children = getChildren(node);
+        if (!children.isEmpty()) {//如果存在子节点
+            node.setChildren(children);
+//        	level++;
+            for (FolderTree child : children) {//将子节点遍历加入返回值中
+//        		child.setLevel(level);
+                build(child, child.getLevel());
+            }
+        }
+    }
+
+    /**
+     * @param node
+     * @return 返回
+     */
+    private List<FolderTree> getChildren(FolderTree node) {
+        List<FolderTree> children = new ArrayList<FolderTree>();
+        Long id = node.getId();
+        for (FolderTree child : nodes) {
+            if (child.getParentId() != null && id.longValue() == child.getParentId().longValue()) {//如果id等于父id
+                children.add(child);//将该节点加入循环列表中
+            }
+        }
+        return children;
+    }
+
+    public List<FolderTree> buildTree(List<Folder> all, List<Folder> in) {
+        for (Folder n : all) {
+            FolderTree treeGrid = new FolderTree();
+            treeGrid.setId(n.getId());
+            treeGrid.setName(n.getName());
+            for (Folder nin : in) {
+                if (nin.getId().equals(n.getId())) {
+                    treeGrid.setChecked(true);
+                }
+            }
+            if (n.getParentId() != null) {
+                treeGrid.setParentId(n.getParentId());
+            }
+            nodes.add(treeGrid);
+        }
+        return buildTree();
+    }
+
+
+}

+ 4 - 0
src/main/java/com/fdkankan/ucenter/vo/request/FolderParam.java

@@ -4,8 +4,12 @@ import lombok.Data;
 
 @Data
 public class FolderParam {
+    private Long id;
     private String userName;
     private String name;
     private Integer type;
     private Long parentId;
+
+    private String folderIds;
+    private String sceneIds;
 }

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

@@ -0,0 +1,15 @@
+package com.fdkankan.ucenter.vo.request;
+
+import com.fdkankan.common.request.RequestBase;
+import lombok.Data;
+
+import java.util.List;
+
+@Data
+public class SceneParam extends RequestBase {
+    private String sceneSource;
+    private Long folderId;
+    private Integer folderType;
+    private Long userId;
+    private List<String> sourceList;
+}

+ 14 - 0
src/main/java/com/fdkankan/ucenter/vo/response/FolderVo.java

@@ -0,0 +1,14 @@
+package com.fdkankan.ucenter.vo.response;
+
+import lombok.Data;
+
+@Data
+public class FolderVo {
+    private Long id;
+    private String createTimeStr;
+    private String name;
+    private Long parentId;
+    private Long sceneNum;
+    private String type;
+    private Integer isFolder = 1;
+}

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

@@ -0,0 +1,31 @@
+package com.fdkankan.ucenter.vo.response;
+
+import lombok.Data;
+
+@Data
+public class SceneVo {
+
+    private Long id;
+    private Long cameraId;
+    private String childName;
+    private String cooperationUserId;
+    private String cooperationUserName;         //协作者
+    private Integer isFolder;                   //0 场景,1文件夹
+    private String num;
+    private String sceneName;
+    private String sceneDec;
+    private String snCode;
+    private Integer status;
+    private Integer payStatus;
+    private String thumb;
+    private String webSite;
+    private Integer isUpgrade;
+    private String createTime;
+
+    //文件夹相关
+    private String createTimeStr;
+    private String name;
+    private Long parentId;
+    private Long sceneNum;
+    private String type;
+}

+ 19 - 0
src/main/resources/mapper/ucenter/FolderSceneMapper.xml

@@ -0,0 +1,19 @@
+<?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.IFolderSceneMapper">
+
+    <select id="getByType" resultType="com.fdkankan.ucenter.entity.FolderScene">
+        SELECT b.* from t_folder a left join t_folder_scene b on a.id = b.folder_id
+        where  b.rec_status ='A' and b.scene_id = #{sceneId} and a.type = #{type}
+        limit 1
+    </select>
+    <select id="getGroupByFolderIds" resultType="com.fdkankan.ucenter.vo.response.GroupByCount">
+        SELECT folder_id as id ,count(scene_id) as count  FROM t_folder_scene
+        where rec_status = 'A'
+        and folder_id in
+        <foreach item="folderId" collection="folderIds" open="(" separator="," close=")">
+            #{folderId}
+        </foreach>
+        GROUP BY folder_id
+    </select>
+</mapper>

+ 65 - 0
src/main/resources/mapper/ucenter/SceneProMapper.xml

@@ -20,4 +20,69 @@
         </foreach>
         GROUP BY camera_id
     </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="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>
+        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
+        FROM t_scene_plus p
+        LEFT JOIN t_scene_plus_ext e on p.id = e.plus_id WHERE
+        p.tb_status = 0 AND
+        <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>
+        ORDER BY create_time desc
+        ) as scene_tb
+    </select>
+
+
+    <sql id="commonWhere">
+		 user_id =#{param.userId}
+    </sql>
+
+    <sql id="commonOldWhere">
+		 rec_status = 'A'
+    </sql>
+
+    <sql id="commonSceneWhere">
+         scene_source in
+        <foreach item="sourceId" collection="param.sourceList" open="(" separator="," close=")">
+            #{sourceId}
+        </foreach>
+    </sql>
+
 </mapper>