瀏覽代碼

Merge branch 'test' into feature-local-jg

# Conflicts:
#	src/main/java/com/fdkankan/scene/controller/TestController.java
#	src/main/java/com/fdkankan/scene/generate/AutoGenerate.java
#	src/main/java/com/fdkankan/scene/schedule/ScheduleJob.java
#	src/main/java/com/fdkankan/scene/service/ICameraService.java
#	src/main/java/com/fdkankan/scene/service/IScenePlusService.java
#	src/main/java/com/fdkankan/scene/service/impl/CameraServiceImpl.java
#	src/main/java/com/fdkankan/scene/service/impl/SceneCleanOrigServiceImpl.java
#	src/main/java/com/fdkankan/scene/service/impl/ScenePlusServiceImpl.java
dsx 2 年之前
父節點
當前提交
234e497ede
共有 30 個文件被更改,包括 833 次插入91 次删除
  1. 10 0
      src/main/java/com/fdkankan/scene/bean/SceneJsonBean.java
  2. 51 0
      src/main/java/com/fdkankan/scene/config/ScheduledConfig.java
  3. 0 45
      src/main/java/com/fdkankan/scene/config/Test.java
  4. 21 0
      src/main/java/com/fdkankan/scene/controller/SceneColdStorageLogController.java
  5. 40 39
      src/main/java/com/fdkankan/scene/controller/SceneEditController.java
  6. 6 0
      src/main/java/com/fdkankan/scene/entity/SceneCleanOrig.java
  7. 75 0
      src/main/java/com/fdkankan/scene/entity/SceneColdStorageLog.java
  8. 24 0
      src/main/java/com/fdkankan/scene/entity/SceneEditControls.java
  9. 12 0
      src/main/java/com/fdkankan/scene/entity/SceneEditInfoExt.java
  10. 18 0
      src/main/java/com/fdkankan/scene/mapper/ISceneColdStorageLogMapper.java
  11. 7 0
      src/main/java/com/fdkankan/scene/mapper/IScenePlusMapper.java
  12. 9 0
      src/main/java/com/fdkankan/scene/mapper/ISceneProMapper.java
  13. 12 0
      src/main/java/com/fdkankan/scene/service/ISceneCleanOrigService.java
  14. 16 0
      src/main/java/com/fdkankan/scene/service/ISceneColdStorageLogService.java
  15. 14 0
      src/main/java/com/fdkankan/scene/service/ISceneEditInfoExtService.java
  16. 8 0
      src/main/java/com/fdkankan/scene/service/ISceneProService.java
  17. 33 0
      src/main/java/com/fdkankan/scene/service/impl/SceneColdStorageLogServiceImpl.java
  18. 249 1
      src/main/java/com/fdkankan/scene/service/impl/SceneEditInfoExtServiceImpl.java
  19. 36 3
      src/main/java/com/fdkankan/scene/service/impl/SceneEditInfoServiceImpl.java
  20. 20 0
      src/main/java/com/fdkankan/scene/service/impl/SceneProServiceImpl.java
  21. 2 3
      src/main/java/com/fdkankan/scene/service/impl/SceneServiceImpl.java
  22. 25 0
      src/main/java/com/fdkankan/scene/vo/BaseJsonArrayParamVO.java
  23. 23 0
      src/main/java/com/fdkankan/scene/vo/DeleteSidListParamVO.java
  24. 20 0
      src/main/java/com/fdkankan/scene/vo/SceneEditControlsParamVO.java
  25. 19 0
      src/main/java/com/fdkankan/scene/vo/SceneEditControlsVO.java
  26. 6 0
      src/main/java/com/fdkankan/scene/vo/SceneEditInfoParamVO.java
  27. 10 0
      src/main/java/com/fdkankan/scene/vo/SceneInfoVO.java
  28. 5 0
      src/main/resources/mapper/scene/SceneColdStorageLogMapper.xml
  29. 32 0
      src/main/resources/mapper/scene/ScenePlusMapper.xml
  30. 30 0
      src/main/resources/mapper/scene/SceneProMapper.xml

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

@@ -208,5 +208,15 @@ public class SceneJsonBean {
      */
     private Integer surveillances;
 
+    /**
+     * 分享信息
+     */
+    private JSONObject sns;
+
+    /**
+     * 是否有指示牌(0-否,1-是)
+     */
+    private Integer billboards;
+
 
 }

+ 51 - 0
src/main/java/com/fdkankan/scene/config/ScheduledConfig.java

@@ -0,0 +1,51 @@
+package com.fdkankan.scene.config;
+
+import org.springframework.boot.autoconfigure.batch.BatchProperties;
+import org.springframework.context.annotation.Bean;
+import org.springframework.context.annotation.Configuration;
+import org.springframework.scheduling.TaskScheduler;
+import org.springframework.scheduling.annotation.Scheduled;
+import org.springframework.scheduling.annotation.SchedulingConfigurer;
+import org.springframework.scheduling.concurrent.ThreadPoolTaskScheduler;
+import org.springframework.scheduling.config.ScheduledTaskRegistrar;
+import org.springframework.util.CollectionUtils;
+
+import java.lang.reflect.Method;
+import java.util.Arrays;
+import java.util.concurrent.Executors;
+
+@Configuration
+public class ScheduledConfig implements SchedulingConfigurer {
+
+    /**
+     * 此配置实现:
+     * 1、同一个定时任务等待上一次执行完毕后再执行
+     * 2、不同定时任务同时执行
+     * @param taskRegistrar
+     */
+    @Override
+    public void configureTasks(ScheduledTaskRegistrar taskRegistrar) {
+        Method[] methods = BatchProperties.Job.class.getMethods();
+        int defaultPoolSize = 3;
+        int corePoolSize = 0;
+
+        if (!CollectionUtils.isEmpty(Arrays.asList(methods))) {
+
+            for (Method method : methods) {
+
+                Scheduled annotation = method.getAnnotation(Scheduled.class);
+
+                if (annotation != null) {
+
+                    corePoolSize++;
+                }
+            }
+            if (defaultPoolSize > corePoolSize) {
+
+                corePoolSize = defaultPoolSize;
+            }
+
+            taskRegistrar.setScheduler(Executors.newScheduledThreadPool(corePoolSize));
+        }
+    }
+}

+ 0 - 45
src/main/java/com/fdkankan/scene/config/Test.java

@@ -1,45 +0,0 @@
-package com.fdkankan.scene.config;
-
-/**
- * <p>
- *  这是一个测试类
- * </p>
- *
- * @author dengsixing
- * @date 2022/1/12
- **/
-public class Test {
-
-    /**
-     * 这是一个类属性
-     */
-    private static final String TEST = "test";
-
-
-    /**
-     * <p>
-     *   这是一个测试方法
-     * </p>
-     * @author dengsixing
-     * @date 2022/1/12
-     * @param id 主键id
-     * @param name  姓名
-     * @return java.lang.String
-     **/
-    public String test(long id, String name){
-        return id + "-" + name;
-    }
-
-    public static void main(String[] args) {
-
-        //方法体内的单行注释
-        String test =  Test.TEST;
-
-        /*
-          方法体内多行注释
-         */
-        String test1 = new Test().test(1, "zhangsan");
-        System.out.println(test1);
-
-    }
-}

+ 21 - 0
src/main/java/com/fdkankan/scene/controller/SceneColdStorageLogController.java

@@ -0,0 +1,21 @@
+package com.fdkankan.scene.controller;
+
+
+import org.springframework.web.bind.annotation.RequestMapping;
+
+import org.springframework.web.bind.annotation.RestController;
+
+/**
+ * <p>
+ * 场景冷归档日志表 前端控制器
+ * </p>
+ *
+ * @author 
+ * @since 2023-07-12
+ */
+@RestController
+@RequestMapping("/scene/sceneColdStorageLog")
+public class SceneColdStorageLogController {
+
+}
+

+ 40 - 39
src/main/java/com/fdkankan/scene/controller/SceneEditController.java

@@ -6,45 +6,8 @@ import com.fdkankan.common.exception.BusinessException;
 import com.fdkankan.model.utils.CreateHouseJsonUtil;
 import com.fdkankan.scene.annotation.CheckPermit;
 import com.fdkankan.scene.entity.SceneAsynOperLog;
-import com.fdkankan.scene.service.IBoxModelService;
-import com.fdkankan.scene.service.IDownloadTourVideoService;
-import com.fdkankan.scene.service.ISceneAsynOperLogService;
-import com.fdkankan.scene.service.ISceneEditInfoService;
-import com.fdkankan.scene.service.ISceneEditService;
-import com.fdkankan.scene.service.IScenePlusService;
-import com.fdkankan.scene.service.ISceneProService;
-import com.fdkankan.scene.service.ISceneUploadService;
-import com.fdkankan.scene.service.ISurveillanceService;
-import com.fdkankan.scene.vo.BallScreenVideoParamVO;
-import com.fdkankan.scene.vo.BaseDataParamVO;
-import com.fdkankan.scene.vo.BaseFileParamVO;
-import com.fdkankan.scene.vo.BaseJsonDataParamVO;
-import com.fdkankan.scene.vo.BaseSceneParamVO;
-import com.fdkankan.scene.vo.BaseSidParamVO;
-import com.fdkankan.scene.vo.DeleteFileParamVO;
-import com.fdkankan.scene.vo.DeleteHotIconParamVO;
-import com.fdkankan.scene.vo.DeleteHotParamVO;
-import com.fdkankan.scene.vo.DeleteLinkPanParamVO;
-import com.fdkankan.scene.vo.DeleteLinkSceneStylesParamVO;
-import com.fdkankan.scene.vo.DeleteMosaicParamVO;
-import com.fdkankan.scene.vo.DeleteSidParamVO;
-import com.fdkankan.scene.vo.DownloadVO;
-import com.fdkankan.scene.vo.FileNameAndDataParamVO;
-import com.fdkankan.scene.vo.FileParamVO;
-import com.fdkankan.scene.vo.LocalesParamVO;
-import com.fdkankan.scene.vo.RenameCadParamVO;
-import com.fdkankan.scene.vo.SaveFiltersParamVO;
-import com.fdkankan.scene.vo.SaveLinkPanParamVO;
-import com.fdkankan.scene.vo.SaveTagsParamVO;
-import com.fdkankan.scene.vo.SaveTagsVisibleParamVO;
-import com.fdkankan.scene.vo.SceneAsynOperLogParamVO;
-import com.fdkankan.scene.vo.SceneAuthVO;
-import com.fdkankan.scene.vo.SceneEditInfoParamVO;
-import com.fdkankan.scene.vo.SceneEditInfoVO;
-import com.fdkankan.scene.vo.SceneInfoParamVO;
-import com.fdkankan.scene.vo.SceneInfoVO;
-import com.fdkankan.scene.vo.SurveillanceParamVO;
-import com.fdkankan.scene.vo.UploadContentParamVO;
+import com.fdkankan.scene.service.*;
+import com.fdkankan.scene.vo.*;
 import com.fdkankan.web.controller.BaseController;
 import com.fdkankan.web.response.ResultData;
 import java.io.IOException;
@@ -90,6 +53,8 @@ public class SceneEditController extends BaseController {
     private IScenePlusService scenePlusService;
     @Autowired
     private ISceneAsynOperLogService sceneAsynOperLogService;
+    @Autowired
+    private ISceneEditInfoExtService sceneEditInfoExtService;
 
     /**
      * <p>
@@ -887,4 +852,40 @@ public class SceneEditController extends BaseController {
         return sceneEditService.getServiceUpTip();
     }
 
+    /**
+     * 保存或者修改指示牌
+     * @param param
+     * @return
+     * @throws Exception
+     */
+    @CheckPermit
+    @PostMapping("/billboards/save")
+    public ResultData saveBillboards(@RequestBody @Validated BaseJsonArrayParamVO param) throws Exception {
+        return sceneEditInfoExtService.saveBillboards(param);
+    }
+
+    /**
+     * 删除指示牌
+     * @param param
+     * @return
+     * @throws Exception
+     */
+    @CheckPermit
+    @PostMapping("/billboards/delete")
+    public ResultData deleteBillboards(@RequestBody @Validated DeleteSidListParamVO param) throws Exception {
+        return sceneEditInfoExtService.deleteBillboards(param);
+    }
+
+    /**
+     * 获取指示牌列表
+     * @param param
+     * @return
+     * @throws Exception
+     */
+    @CheckPermit
+    @PostMapping("/billboards/list")
+    public ResultData deleteBillboards(@RequestBody @Validated BaseSceneParamVO param) throws Exception {
+        return ResultData.ok(sceneEditInfoExtService.listBillboards(param));
+    }
+
 }

+ 6 - 0
src/main/java/com/fdkankan/scene/entity/SceneCleanOrig.java

@@ -29,6 +29,12 @@ public class SceneCleanOrig implements Serializable {
     private String num;
 
     /**
+     * type
+     */
+    @TableField("type")
+    private Integer type;
+
+    /**
      * 0-处理中,1-成功,-1失败
      */
     @TableField("state")

+ 75 - 0
src/main/java/com/fdkankan/scene/entity/SceneColdStorageLog.java

@@ -0,0 +1,75 @@
+package com.fdkankan.scene.entity;
+
+import com.baomidou.mybatisplus.annotation.IdType;
+import com.baomidou.mybatisplus.annotation.TableField;
+import com.baomidou.mybatisplus.annotation.TableId;
+import com.baomidou.mybatisplus.annotation.TableLogic;
+import com.baomidou.mybatisplus.annotation.TableName;
+import java.io.Serializable;
+import java.util.Date;
+import lombok.Getter;
+import lombok.Setter;
+
+/**
+ * <p>
+ * 场景冷归档日志表
+ * </p>
+ *
+ * @author 
+ * @since 2023-07-12
+ */
+@Getter
+@Setter
+@TableName("t_scene_cold_storage_log")
+public class SceneColdStorageLog implements Serializable {
+
+    private static final long serialVersionUID = 1L;
+
+    @TableId(value = "id", type = IdType.AUTO)
+    private Long id;
+
+    /**
+     * 场景码
+     */
+    @TableField("num")
+    private String num;
+
+    /**
+     * 封存地址
+     */
+    @TableField("path")
+    private String path;
+
+    /**
+     * 操作类型(1-封存,2-解封存)
+     */
+    @TableField("type")
+    private Integer type;
+
+    @TableField("state")
+    private Integer state;
+
+    @TableField("reason")
+    private String reason;
+
+    /**
+     * 创建时间
+     */
+    @TableField("create_time")
+    private Date createTime;
+
+    /**
+     * 修改时间
+     */
+    @TableField("update_time")
+    private Date updateTime;
+
+    /**
+     * A-有效,I-无效
+     */
+    @TableField("rec_status")
+    @TableLogic(value = "A", delval = "I")
+    private String recStatus;
+
+
+}

+ 24 - 0
src/main/java/com/fdkankan/scene/entity/SceneEditControls.java

@@ -113,6 +113,30 @@ public class SceneEditControls implements Serializable {
     @TableField("show_capture")
     private Integer showCapture;
 
+    /**
+     * 是否显示多媒体标签标题(0-否,1-是)
+     */
+    @TableField("show_tag_title")
+    private Integer showTagTitle;
+
+    /**
+     * 是否显示指示牌标签标题(0-否,1-是)
+     */
+    @TableField("show_billboard_title")
+    private Integer showBillboardTitle;
+
+    /**
+     * 是否显示视频监控标签标题(0-否,1-是)
+     */
+    @TableField("show_camera_title")
+    private Integer showCameraTitle;
+
+    /**
+     * 是否显示场景关联标签标题(0-否,1-是)
+     */
+    @TableField("show_link_title")
+    private Integer showLinkTitle;
+
 
     /**
      * 创建时间

+ 12 - 0
src/main/java/com/fdkankan/scene/entity/SceneEditInfoExt.java

@@ -91,6 +91,18 @@ public class SceneEditInfoExt {
     private String shareLogoImg;
 
     /**
+     * 是否有指示牌(0-否,1-是)
+     */
+    @TableField("billboards")
+    private Integer billboards;
+
+    /**
+     * 分享配置信息
+     */
+    @TableField("sns_info")
+    private String snsInfo;
+
+    /**
      * 创建时间
      */
     @TableField("create_time")

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

@@ -0,0 +1,18 @@
+package com.fdkankan.scene.mapper;
+
+import com.fdkankan.scene.entity.SceneColdStorageLog;
+import com.baomidou.mybatisplus.core.mapper.BaseMapper;
+import org.apache.ibatis.annotations.Mapper;
+
+/**
+ * <p>
+ * 场景冷归档日志表 Mapper 接口
+ * </p>
+ *
+ * @author 
+ * @since 2023-07-12
+ */
+@Mapper
+public interface ISceneColdStorageLogMapper extends BaseMapper<SceneColdStorageLog> {
+
+}

+ 7 - 0
src/main/java/com/fdkankan/scene/mapper/IScenePlusMapper.java

@@ -7,6 +7,7 @@ import org.apache.ibatis.annotations.Mapper;
 
 import java.util.Date;
 import java.util.List;
+import java.util.Set;
 
 /**
  * <p>
@@ -21,4 +22,10 @@ public interface IScenePlusMapper extends BaseMapper<ScenePlus> {
 
     List<SceneBean> selectCleanOrigScene(Date time);
 
+    List<SceneBean> selectCleanOrigSceneDeleted(Date time);
+
+    List<SceneBean> listCleanOss4TestCamera(Set<Long> cameraIds, Date time);
+
+    List<SceneBean> selectColdStorageScene(Date time);
+
 }

+ 9 - 0
src/main/java/com/fdkankan/scene/mapper/ISceneProMapper.java

@@ -7,6 +7,7 @@ import org.apache.ibatis.annotations.Mapper;
 
 import java.util.Date;
 import java.util.List;
+import java.util.Set;
 
 /**
  * <p>
@@ -21,4 +22,12 @@ public interface ISceneProMapper extends BaseMapper<ScenePro> {
 
     List<SceneBean> selectCleanOrigScene(Date time);
 
+    List<SceneBean> listCleanOss4DeletedScene(Date time);
+
+    List<SceneBean> listCleanOss4TestCamera(Set<Long> cameraIds, Date time);
+
+    List<SceneBean> selectColdStorageScene(Date time);
+
+
+
 }

+ 12 - 0
src/main/java/com/fdkankan/scene/service/ISceneCleanOrigService.java

@@ -17,4 +17,16 @@ public interface ISceneCleanOrigService extends IService<SceneCleanOrig> {
 
     void cleanOrigV4();
 
+    void cleanOss4DeletedSceneV3();
+
+    void cleanOss4DeletedSceneV4();
+
+    void cleanOss4TestCameraV3();
+
+    void cleanOss4TestCameraV4();
+
+    void coldStorageHomeV3();
+
+    void coldStorageHomeV4();
+
 }

+ 16 - 0
src/main/java/com/fdkankan/scene/service/ISceneColdStorageLogService.java

@@ -0,0 +1,16 @@
+package com.fdkankan.scene.service;
+
+import com.fdkankan.scene.entity.SceneColdStorageLog;
+import com.baomidou.mybatisplus.extension.service.IService;
+
+/**
+ * <p>
+ * 场景冷归档日志表 服务类
+ * </p>
+ *
+ * @author 
+ * @since 2023-07-12
+ */
+public interface ISceneColdStorageLogService extends IService<SceneColdStorageLog> {
+    void saveLog(String num, String path, Integer type, Integer state, String reason);
+}

+ 14 - 0
src/main/java/com/fdkankan/scene/service/ISceneEditInfoExtService.java

@@ -1,7 +1,15 @@
 package com.fdkankan.scene.service;
 
+import com.alibaba.fastjson.JSONObject;
 import com.baomidou.mybatisplus.extension.service.IService;
 import com.fdkankan.scene.entity.SceneEditInfoExt;
+import com.fdkankan.scene.vo.BaseJsonArrayParamVO;
+import com.fdkankan.scene.vo.BaseJsonDataParamVO;
+import com.fdkankan.scene.vo.BaseSceneParamVO;
+import com.fdkankan.scene.vo.DeleteSidListParamVO;
+import com.fdkankan.web.response.ResultData;
+
+import java.util.List;
 
 /**
  * <p>
@@ -19,4 +27,10 @@ public interface ISceneEditInfoExtService extends IService<SceneEditInfoExt> {
 
     void updateToursByNum(String num, Integer tours);
 
+    ResultData saveBillboards(BaseJsonArrayParamVO param) throws Exception;
+
+    ResultData deleteBillboards(DeleteSidListParamVO param) throws Exception;
+
+    List<JSONObject> listBillboards(BaseSceneParamVO param) throws Exception;
+
 }

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

@@ -15,6 +15,8 @@ import com.fdkankan.scene.vo.SceneEditParamVO;
 import com.fdkankan.scene.vo.SceneParamVO;
 import com.fdkankan.scene.vo.SceneVO;
 import java.util.List;
+import java.util.Set;
+
 import org.springframework.web.bind.annotation.RequestBody;
 import org.springframework.web.multipart.MultipartFile;
 
@@ -52,4 +54,10 @@ public interface ISceneProService extends IService<ScenePro> {
 
     List<SceneBean> listCleanOrigScene(int cleanOrigMonth);
 
+    List<SceneBean> listCleanOss4DeletedScene(int month);
+
+    List<SceneBean> listCleanOss4TestCamera(Set<Long> cameraIds, int month);
+
+    List<SceneBean> listColdStorageScene(int month);
+
 }

+ 33 - 0
src/main/java/com/fdkankan/scene/service/impl/SceneColdStorageLogServiceImpl.java

@@ -0,0 +1,33 @@
+package com.fdkankan.scene.service.impl;
+
+import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
+import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
+import com.fdkankan.scene.entity.SceneColdStorageLog;
+import com.fdkankan.scene.mapper.ISceneColdStorageLogMapper;
+import com.fdkankan.scene.service.ISceneColdStorageLogService;
+import org.springframework.stereotype.Service;
+
+/**
+ * <p>
+ * 场景冷归档日志表 服务实现类
+ * </p>
+ *
+ * @author 
+ * @since 2023-07-12
+ */
+@Service
+public class SceneColdStorageLogServiceImpl extends ServiceImpl<ISceneColdStorageLogMapper, SceneColdStorageLog> implements ISceneColdStorageLogService {
+
+    public void saveLog(String num, String path, Integer type, Integer state, String reason){
+        //清除旧的日志
+        this.remove(new LambdaQueryWrapper<SceneColdStorageLog>().eq(SceneColdStorageLog::getNum, num));
+        SceneColdStorageLog sceneColdStorageLog = new SceneColdStorageLog();
+        sceneColdStorageLog.setNum(num);
+        sceneColdStorageLog.setPath(path);
+        sceneColdStorageLog.setType(type);
+        sceneColdStorageLog.setState(state);
+        sceneColdStorageLog.setReason(reason);
+        this.saveOrUpdate(sceneColdStorageLog);
+    }
+
+}

+ 249 - 1
src/main/java/com/fdkankan/scene/service/impl/SceneEditInfoExtServiceImpl.java

@@ -1,20 +1,45 @@
 package com.fdkankan.scene.service.impl;
 
+import cn.hutool.core.collection.CollUtil;
+import cn.hutool.core.io.FileUtil;
+import cn.hutool.core.util.StrUtil;
+import com.alibaba.fastjson.JSON;
+import com.alibaba.fastjson.JSONArray;
+import com.alibaba.fastjson.JSONObject;
 import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
 import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
+import com.fdkankan.common.constant.CommonStatus;
 import com.fdkankan.common.constant.ErrorCode;
 import com.fdkankan.common.exception.BusinessException;
+import com.fdkankan.common.util.FileUtils;
+import com.fdkankan.fyun.face.FYunFileServiceInterface;
+import com.fdkankan.model.constants.ConstantFilePath;
+import com.fdkankan.model.constants.UploadFilePath;
+import com.fdkankan.redis.constant.RedisKey;
+import com.fdkankan.redis.constant.RedisLockKey;
+import com.fdkankan.redis.util.RedisLockUtil;
+import com.fdkankan.redis.util.RedisUtil;
+import com.fdkankan.scene.bean.TagBean;
 import com.fdkankan.scene.entity.SceneEditInfo;
 import com.fdkankan.scene.entity.SceneEditInfoExt;
 import com.fdkankan.scene.entity.ScenePlus;
+import com.fdkankan.scene.entity.ScenePlusExt;
 import com.fdkankan.scene.mapper.ISceneEditInfoExtMapper;
 import com.fdkankan.scene.service.ISceneEditInfoExtService;
 import com.fdkankan.scene.service.ISceneEditInfoService;
+import com.fdkankan.scene.service.IScenePlusExtService;
 import com.fdkankan.scene.service.IScenePlusService;
-import java.util.Objects;
+import com.fdkankan.scene.vo.BaseJsonArrayParamVO;
+import com.fdkankan.scene.vo.BaseSceneParamVO;
+import com.fdkankan.scene.vo.DeleteSidListParamVO;
+import com.fdkankan.web.response.ResultData;
+import org.aspectj.apache.bcel.generic.RET;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.stereotype.Service;
 
+import java.util.*;
+import java.util.stream.Collectors;
+
 /**
  * <p>
  *  服务实现类
@@ -29,7 +54,15 @@ public class SceneEditInfoExtServiceImpl extends ServiceImpl<ISceneEditInfoExtMa
     @Autowired
     private IScenePlusService scenePlusService;
     @Autowired
+    private IScenePlusExtService scenePlusExtService;
+    @Autowired
     private ISceneEditInfoService sceneEditInfoService;
+    @Autowired
+    private RedisUtil redisUtil;
+    @Autowired
+    private RedisLockUtil redisLockUtil;
+    @Autowired
+    private FYunFileServiceInterface fYunFileService;
 
     @Override
     public SceneEditInfoExt getByScenePlusId(long scenePlusId) {
@@ -53,4 +86,219 @@ public class SceneEditInfoExtServiceImpl extends ServiceImpl<ISceneEditInfoExtMa
         sceneEditInfoExt.setTours(tours);
         this.updateById(sceneEditInfoExt);
     }
+
+    @Override
+    public ResultData saveBillboards(BaseJsonArrayParamVO param) throws Exception {
+        ScenePlus scenePlus = scenePlusService.getScenePlusByNum(param.getNum());
+
+        this.addOrUpdateBillboards(param.getNum(), param.getData());
+
+        //写入本地文件,作为备份
+        this.writeBillboardJson(param.getNum());
+
+        //保存数据库
+        SceneEditInfoExt sceneEditInfoExt = this.getByScenePlusId(scenePlus.getId());
+        this.updateBillboards(param.getNum(), sceneEditInfoExt);
+//        this.updateById(sceneEditInfoExt);
+
+        sceneEditInfoService.upgradeVersionById(sceneEditInfoExt.getEditInfoId());
+
+        return ResultData.ok();
+    }
+
+    @Override
+    public ResultData deleteBillboards(DeleteSidListParamVO param) throws Exception {
+        ScenePlus scenePlus = scenePlusService.getScenePlusByNum(param.getNum());
+        ScenePlusExt scenePlusExt = scenePlusExtService.getScenePlusExtByPlusId(scenePlus.getId());
+        String bucket = scenePlusExt.getYunFileBucket();
+
+        List<String> deleteSidList = param.getSidList();
+
+        this.syncBillboardsFromFileToRedis(param.getNum());
+
+        //处理删除状态数据
+        this.deleteBillboards(param.getNum(), deleteSidList, bucket);
+
+        //写入本地文件,作为备份
+        this.writeBillboardJson(param.getNum());
+
+        //保存数据库
+        SceneEditInfoExt sceneEditInfoExt = this.getByScenePlusId(scenePlus.getId());
+        this.updateBillboards(param.getNum(), sceneEditInfoExt);
+        sceneEditInfoService.upgradeVersionById(sceneEditInfoExt.getEditInfoId());
+
+        return ResultData.ok();
+    }
+
+    @Override
+    public List<JSONObject> listBillboards(BaseSceneParamVO param) throws Exception {
+
+        ScenePlus scenePlus = scenePlusService.getScenePlusByNum(param.getNum());
+        SceneEditInfoExt sceneEditInfoExt = this.getByScenePlusId(scenePlus.getId());
+        if(sceneEditInfoExt.getBillboards() == CommonStatus.NO.code().intValue()){
+            return null;
+        }
+
+        this.syncBillboardsFromFileToRedis(param.getNum());
+        String key = String.format(RedisKey.SCENE_BILLBOARDS, param.getNum());
+        List<String> list = redisUtil.hgetValues(key);
+        List<TagBean> sortList = list.stream().map(str -> {
+            JSONObject jsonObject = JSON.parseObject(str);
+            TagBean tagBean = new TagBean();
+            tagBean.setCreateTime(jsonObject.getLong("createTime"));
+            jsonObject.remove("createTime");
+            tagBean.setTag(jsonObject);
+            return tagBean;
+        }).collect(Collectors.toList());
+        sortList.sort(Comparator.comparingLong(TagBean::getCreateTime).reversed());
+        return sortList.stream().map(item -> item.getTag()).collect(Collectors.toList());
+    }
+
+    private void deleteBillboards(String num, List<String> deleteSidList, String bucket) throws Exception {
+        if(CollUtil.isEmpty(deleteSidList)){
+            return;
+        }
+
+        //从redis中加载热点数据
+        String key = String.format(RedisKey.SCENE_BILLBOARDS, num);
+        List<String> deletDataList = redisUtil.hMultiGet(key, deleteSidList);
+        if(CollUtil.isEmpty(deletDataList))
+            return;
+        //从redis中移除热点数据
+        redisUtil.hdel(key, deleteSidList.toArray());
+
+        String userDataPath = String.format(UploadFilePath.USER_EDIT_PATH, num);
+        //删除图片音频视频等资源文件
+        for (String data : deletDataList) {
+            if(StrUtil.isBlank(data)){
+                continue;
+            }
+            JSONObject jsonObject = JSON.parseObject(data);
+            String icon = jsonObject.getString("icon");
+            if(StrUtil.isEmpty(icon)){
+                continue;
+            }
+            fYunFileService.deleteFile(bucket, userDataPath.concat(icon));
+        }
+    }
+
+    private void addOrUpdateBillboards(String num, JSONArray data) throws Exception{
+        Map<String, String> addOrUpdateMap = new HashMap<>();
+        int i = 0;
+        for (Object item : data) {
+            JSONObject jsonObject = JSON.parseObject(JSON.toJSONString(item));
+            jsonObject.put("createTime", Calendar.getInstance().getTimeInMillis() + i++);
+            addOrUpdateMap.put(jsonObject.getString("sid"), JSON.toJSONString(jsonObject));
+        }
+
+        this.syncBillboardsFromFileToRedis(num);
+
+        //处理新增和修改数据
+        this.addOrUpdateBillboardsHandler(num, addOrUpdateMap);
+    }
+
+    /**
+     * <p>
+     保证指示牌数据安全性,当redis宕机导致热点数据丢失时,可以从文件中读取,恢复到redis
+     * </p>
+     * @author dengsixing
+     * @date 2022/3/3
+     **/
+    private void syncBillboardsFromFileToRedis(String num) throws Exception{
+
+        String key = String.format(RedisKey.SCENE_BILLBOARDS, num);
+        boolean exist = redisUtil.hasKey(key);
+        if(exist){
+            return;
+        }
+        String lockKey = String.format(RedisLockKey.LOCK_BILLBOARDS_SYNC, num);
+        String lockVal = cn.hutool.core.lang.UUID.randomUUID().toString();
+        boolean lock = redisLockUtil.lock(lockKey, lockVal, RedisKey.EXPIRE_TIME_1_MINUTE);
+        if(!lock){
+            throw new BusinessException(ErrorCode.SYSTEM_BUSY);
+        }
+        try{
+            exist = redisUtil.hasKey(key);
+            if(exist){
+                return;
+            }
+            String billboardsFilePath = String.format(ConstantFilePath.SCENE_USER_PATH_V4, num) + "billboards.json";
+            String billboardsData = FileUtils.readUtf8String(billboardsFilePath);
+            if(StrUtil.isEmpty(billboardsData)){
+                return;
+            }
+            JSONArray billboardArr = JSON.parseArray(billboardsData);
+            if(CollUtil.isEmpty(billboardArr)){
+                return;
+            }
+            Map<String, String> map = new HashMap<>();
+            for (Object o : billboardArr) {
+                JSONObject jo = (JSONObject)o;
+                map.put(jo.getString("sid"), jo.toJSONString());
+            }
+            redisUtil.hmset(key, map);
+        }finally {
+            redisLockUtil.unlockLua(lockKey, lockVal);
+        }
+    }
+
+    private void addOrUpdateBillboardsHandler(String num, Map<String, String> addOrUpdateMap){
+        if(CollUtil.isEmpty(addOrUpdateMap))
+            return;
+
+        //批量写入缓存
+        String key = String.format(RedisKey.SCENE_BILLBOARDS, num);
+        redisUtil.hmset(key, addOrUpdateMap);
+    }
+
+    /**
+     * <p>
+     热点数据保存
+
+     * </p>
+     * @author dengsixing
+     * @date 2022/3/3
+     **/
+    private void writeBillboardJson(String num) throws Exception{
+        String lockKey = String.format(RedisLockKey.LOCK_BILLBOARDS_SYNC, num);
+        String lockVal = cn.hutool.core.lang.UUID.randomUUID().toString();
+        boolean lock = redisLockUtil.lock(lockKey, lockVal, RedisKey.EXPIRE_TIME_1_MINUTE);
+        if(!lock){
+            return;
+        }
+        try{
+            String dataKey = String.format(RedisKey.SCENE_BILLBOARDS, num);
+            String hotJsonPath = String.format(ConstantFilePath.SCENE_USER_PATH_V4, num) + "billboards.json";
+            if(!redisUtil.hasKey(dataKey)){
+                FileUtil.del(hotJsonPath);
+                return;
+            }
+            Map<String, String> billboardMap = redisUtil.hmget(dataKey);
+            List<JSONObject>  billboardList = billboardMap.entrySet().stream().map(entry->JSON.parseObject(entry.getValue())).collect(Collectors.toList());
+            FileUtil.writeUtf8String(JSON.toJSONString(billboardList), hotJsonPath);
+        }finally {
+            redisLockUtil.unlockLua(lockKey, lockVal);
+        }
+    }
+
+    private void updateBillboards(String num, SceneEditInfoExt sceneEditInfoExt){
+        //查询缓存是否包含热点数据
+        String key = String.format(RedisKey.SCENE_BILLBOARDS, num);
+        Map<String, String> billboardsMap = redisUtil.hmget(key);
+        boolean hashBillboards= false;
+        for (Map.Entry<String, String> tagMap : billboardsMap.entrySet()) {
+            if(StrUtil.isEmpty(tagMap.getValue())){
+                continue;
+            }
+            hashBillboards = true;
+            break;
+        }
+
+        //更改热点状态
+        sceneEditInfoExt.setBillboards(hashBillboards ? CommonStatus.YES.code().intValue() : CommonStatus.NO.code().intValue());
+        this.updateById(sceneEditInfoExt);
+    }
+
+
+
 }

+ 36 - 3
src/main/java/com/fdkankan/scene/service/impl/SceneEditInfoServiceImpl.java

@@ -131,6 +131,11 @@ public class SceneEditInfoServiceImpl extends ServiceImpl<ISceneEditInfoMapper,
             sceneEditInfo.setVersion(sceneEditInfoDb.getVersion() + 1);
             this.updateById(sceneEditInfo);
         }
+        SceneEditInfoExt sceneEditInfoExt = sceneEditInfoExtService.getByEditInfoId(sceneEditInfo.getId());
+        if(Objects.nonNull(param.getSns())){
+            sceneEditInfoExt.setSnsInfo(JSON.toJSONString(param.getSns()));
+        }
+        sceneEditInfoExtService.updateById(sceneEditInfoExt);
 
         if(Objects.nonNull(param.getControls())){
             SceneEditControls sceneEditControls = BeanUtil.copyProperties(param.getControls(), SceneEditControls.class);
@@ -225,8 +230,11 @@ public class SceneEditInfoServiceImpl extends ServiceImpl<ISceneEditInfoMapper,
         //发布马赛克列表
         sceneJson.setMosaicList(this.getMosaicList(num));
 
+        //发布分享配置
+        sceneJson.setSns(JSON.parseObject(sceneEditInfoExt.getSnsInfo()));
+
         //处理热点数据,生成hot.json
-        this.publicHotData(num, sceneEditInfo, bucket);
+        this.publicHotData(num, bucket);
 
         //发布场景关联相关数据
 //        this.publicLinkSceneData(num, bucket);
@@ -237,6 +245,9 @@ public class SceneEditInfoServiceImpl extends ServiceImpl<ISceneEditInfoMapper,
         //发布摄像头数据
         this.publicSurveillance(num, sceneEditInfoExt.getSurveillances(), bucket);
 
+        //发布指示牌数据
+        this.publicBillboardData(num, bucket);
+
         //本地写sceneJson文件
         String localSceneJsonPath = String.format(scenePlusExt.getDataSource()+ ConstantFileLocPath.SCENE_DATA_PATH_V4, num) + "scene.json";
         FileUtils.writeFile(localSceneJsonPath, JSON.toJSONString(sceneJson));
@@ -335,7 +346,7 @@ public class SceneEditInfoServiceImpl extends ServiceImpl<ISceneEditInfoMapper,
 
     }
 
-    private void publicHotData(String sceneNum, SceneEditInfo sceneEditInfo, String bucket) throws IOException {
+    private void publicHotData(String sceneNum, String bucket) throws IOException {
         String hotDataKey = String.format(RedisKey.SCENE_HOT_DATA, sceneNum);
         Map<String, String> hotMap = redisUtil.hmget(hotDataKey);
 
@@ -362,6 +373,18 @@ public class SceneEditInfoServiceImpl extends ServiceImpl<ISceneEditInfoMapper,
 
     }
 
+    private void publicBillboardData(String sceneNum, String bucket) throws IOException {
+        String Key = String.format(RedisKey.SCENE_BILLBOARDS, sceneNum);
+        String userEditPath = String.format(UploadFilePath.USER_EDIT_PATH, sceneNum) + "billboards.json";
+        List<String> list = redisUtil.hgetValues(Key);
+        if(CollUtil.isEmpty(list)){
+            fYunFileService.deleteFile(bucket, userEditPath);
+            return;
+        }
+        List<JSONObject> collect = list.stream().map(str -> JSON.parseObject(str)).collect(Collectors.toList());
+        fYunFileService.uploadFile(bucket, JSON.toJSONString(collect).getBytes(), userEditPath);
+    }
+
     @Override
     public SceneInfoVO getSceneInfo(@Var SceneInfoParamVO param) throws Exception{
         SceneInfoReqType sceneInfoReqType = SceneInfoReqType.get(param.getReqType());
@@ -422,12 +445,19 @@ public class SceneEditInfoServiceImpl extends ServiceImpl<ISceneEditInfoMapper,
             sceneInfoVO.setMosaicList(this.getMosaicList(num));
         }
         sceneInfoVO.setSpace(FileSizeUtil.convert(scenePlusExt.getSpace(), FileSizeUnitType.MB.code()));
+        sceneInfoVO.setSns(JSON.parseObject(sceneEditInfoExt.getSnsInfo()));
 
         this.SortBoxVideos(sceneInfoVO);
 
         return sceneInfoVO;
     }
 
+    public static void main(String[] args) {
+        String test = "";
+        JSONObject jsonObject = JSON.parseObject(test);
+        System.out.println(jsonObject);
+    }
+
     private void SortBoxVideos(SceneInfoVO sceneInfoVO){
         String boxVideos = sceneInfoVO.getBoxVideos();
         if(StrUtil.isEmpty(boxVideos)){
@@ -526,6 +556,9 @@ public class SceneEditInfoServiceImpl extends ServiceImpl<ISceneEditInfoMapper,
         if(Objects.isNull(controls.getShowCapture())){
             controls.setShowCapture(CommonStatus.YES.code().intValue());
         }
+        if(Objects.isNull(controls.getShowBillboardTitle())){
+            controls.setShowBillboardTitle(CommonStatus.YES.code().intValue());
+        }
 
         return sceneInfoVO;
     }
@@ -1772,7 +1805,7 @@ public class SceneEditInfoServiceImpl extends ServiceImpl<ISceneEditInfoMapper,
         return ResultData.ok();
     }
 
-    private void updateMosaicFlag(String num){
+    private void updateMosaicFlag(String num) throws InterruptedException {
         ScenePlus scenePlus = scenePlusService.getScenePlusByNum(num);
         SceneEditInfoExt sceneEditInfoExt = sceneEditInfoExtService.getByScenePlusId(scenePlus.getId());
 

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

@@ -1121,4 +1121,24 @@ public class SceneProServiceImpl extends ServiceImpl<ISceneProMapper, ScenePro>
         return this.baseMapper.selectCleanOrigScene(time);
     }
 
+    @Override
+    public List<SceneBean> listCleanOss4DeletedScene(int month) {
+        Date time = Calendar.getInstance().getTime();
+        time = DateUtil.beginOfDay(DateUtil.offset(time, DateField.MONTH, -month));
+        return this.baseMapper.listCleanOss4DeletedScene(time);
+    }
+
+    @Override
+    public List<SceneBean> listCleanOss4TestCamera(Set<Long> cameraIds, int month) {
+        Date time = Calendar.getInstance().getTime();
+        time = DateUtil.beginOfDay(DateUtil.offset(time, DateField.MONTH, -month));
+        return this.baseMapper.listCleanOss4TestCamera(cameraIds, time);
+    }
+
+    @Override
+    public List<SceneBean> listColdStorageScene(int cleanOrigMonth) {
+        Date time = Calendar.getInstance().getTime();
+        time = DateUtil.beginOfDay(DateUtil.offset(time, DateField.MONTH, -cleanOrigMonth));
+        return this.baseMapper.selectColdStorageScene(time);
+    }
 }

+ 2 - 3
src/main/java/com/fdkankan/scene/service/impl/SceneServiceImpl.java

@@ -91,7 +91,7 @@ public class SceneServiceImpl implements ISceneService {
         file.transferTo(tempFile);
 
         //判断是否需要旋转
-        if(Objects.nonNull(rotate)){
+        if(Objects.nonNull(rotate) && rotate != 0){
             Image rotateImg = ImgUtil.rotate(ImageIO.read(tempFile), rotate);
             File tempRotateFile = File.createTempFile(uuid + "-rotate", extName);
             ImgUtil.write(rotateImg, tempRotateFile);
@@ -130,8 +130,7 @@ public class SceneServiceImpl implements ISceneService {
     }
 
     public static void main(String[] args) throws IOException {
-        Image rotateImg = ImgUtil.rotate(ImageIO.read(FileUtil.file("C:\\Users\\dsx\\Desktop\\IMG_6633.HEIC.JPG")), 90);
-        ImgUtil.write(rotateImg, FileUtil.file("C:\\Users\\dsx\\Desktop\\IMG_6633.HEIC_2.JPG"));
+        Image rotateImg = ImgUtil.rotate(ImageIO.read(new File("C:\\Users\\dsx\\Desktop\\IMG_0231.HEIC.JPG")), 0);
     }
 
     @Override

+ 25 - 0
src/main/java/com/fdkankan/scene/vo/BaseJsonArrayParamVO.java

@@ -0,0 +1,25 @@
+package com.fdkankan.scene.vo;
+
+import com.alibaba.fastjson.JSONArray;
+import com.alibaba.fastjson.JSONObject;
+import lombok.Data;
+
+import javax.validation.constraints.NotBlank;
+import javax.validation.constraints.NotEmpty;
+import javax.validation.constraints.NotNull;
+
+/**
+ * <p>
+ * 通用data类型参数类
+ * </p>
+ *
+ * @author dengsixing
+ * @since 2022/2/10
+ **/
+@Data
+public class BaseJsonArrayParamVO extends BaseSceneParamVO{
+
+    @NotEmpty(message = "数据不能为空")
+    private JSONArray data;
+
+}

+ 23 - 0
src/main/java/com/fdkankan/scene/vo/DeleteSidListParamVO.java

@@ -0,0 +1,23 @@
+package com.fdkankan.scene.vo;
+
+import lombok.Data;
+
+import javax.validation.constraints.NotBlank;
+import javax.validation.constraints.NotEmpty;
+import java.util.List;
+
+/**
+ * <p>
+ * TODO
+ * </p>
+ *
+ * @author dengsixing
+ * @since 2022/2/18
+ **/
+@Data
+public class DeleteSidListParamVO extends BaseSceneParamVO{
+
+    @NotEmpty(message = "sid不能为空")
+    private List<String> sidList;
+
+}

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

@@ -97,6 +97,26 @@ public class SceneEditControlsParamVO implements Serializable {
      */
     private Integer showCapture;
 
+    /**
+     * 多媒体标签标题
+     */
+    private Integer showTagTitle;
+
+    /**
+     * 指示牌标签标题
+     */
+    private Integer showBillboardTitle;
+
+    /**
+     * 视频监控标签标题
+     */
+    private Integer showCameraTitle;
+
+    /**
+     * 场景关联标签标题
+     */
+    private Integer showLinkTitle;
+
 
 
 

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

@@ -87,5 +87,24 @@ public class SceneEditControlsVO implements Serializable {
      */
     private Integer showCapture;
 
+    /**
+     * 多媒体标签标题
+     */
+    private Integer showTagTitle;
+
+    /**
+     * 指示牌标签标题
+     */
+    private Integer showBillboardTitle;
+
+    /**
+     * 视频监控标签标题
+     */
+    private Integer showCameraTitle;
+
+    /**
+     * 场景关联标签标题
+     */
+    private Integer showLinkTitle;
 
 }

+ 6 - 0
src/main/java/com/fdkankan/scene/vo/SceneEditInfoParamVO.java

@@ -1,5 +1,6 @@
 package com.fdkankan.scene.vo;
 
+import com.alibaba.fastjson.JSONObject;
 import lombok.AllArgsConstructor;
 import lombok.Builder;
 import lombok.Data;
@@ -73,6 +74,11 @@ public class SceneEditInfoParamVO extends BaseSceneParamVO{
 
     private SceneEditControlsParamVO controls;
 
+    /**
+     * 分享配置
+     */
+    private JSONObject sns;
+
 
 
 

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

@@ -234,5 +234,15 @@ public class SceneInfoVO {
      */
     private Integer space;
 
+    /**
+     * 分享信息
+     */
+    private JSONObject sns;
+
+    /**
+     * 是否有指示牌(0-否,1-是)
+     */
+    private Integer billboards;
+
 
 }

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

@@ -0,0 +1,5 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
+<mapper namespace="com.fdkankan.scene.mapper.ISceneColdStorageLogMapper">
+
+</mapper>

+ 32 - 0
src/main/resources/mapper/scene/ScenePlusMapper.xml

@@ -11,4 +11,36 @@
         and NOT EXISTS (select o.num from t_scene_clean_orig o where o.rec_status = 'A' and o.num = plus.num and ext.algorithm_time <![CDATA[ < ]]> o.create_time)
     </select>
 
+    <select id="selectCleanOrigSceneDeleted" resultType="com.fdkankan.scene.bean.SceneBean">
+        select plus.num, ext.data_source
+        from t_scene_plus plus
+        left join t_scene_plus_ext ext on plus.id = ext.plus_id
+        where plus.rec_status = 'I' and plus.update_time <![CDATA[ < ]]> #{time}
+        and ext.data_source is NOT null
+        and NOT EXISTS (select o.num from t_scene_clean_orig o where o.rec_status = 'A' and o.num = plus.num and o.type = 2)
+    </select>
+
+    <select id="listCleanOss4TestCamera" resultType="com.fdkankan.scene.bean.SceneBean">
+        select plus.num, ext.data_source
+        from t_scene_plus plus
+        left join t_scene_plus_ext ext on plus.id = ext.plus_id
+        where plus.scene_status in (1,-2) and plus.rec_status = 'A' and ext.algorithm_time <![CDATA[ < ]]> #{time}
+        and ext.data_source is NOT null
+        and plus.camera_id in
+        <foreach collection="cameraIds" item="cameraId" open="(" close=")" separator=",">
+            #{cameraId}
+        </foreach>
+        and NOT EXISTS (select o.num from t_scene_clean_orig o where o.rec_status = 'A' and o.num = plus.num and o.type = 3 and ext.algorithm_time <![CDATA[ < ]]> o.create_time)
+    </select>
+
+    <select id="selectColdStorageScene" resultType="com.fdkankan.scene.bean.SceneBean">
+        select plus.num, ext.data_source
+        from t_scene_plus plus
+        left join t_scene_plus_ext ext on plus.id = ext.plus_id
+        where plus.scene_status in (1,-2) and ext.algorithm_time <![CDATA[ < ]]> #{time}
+        and ext.data_source is NOT null
+        and NOT EXISTS (select c.num from t_scene_cold_storage_log c where c.rec_status = 'A' and c.num = plus.num and ext.algorithm_time <![CDATA[ < ]]> c.create_time)
+        and NOT EXISTS (select o.num from t_scene_clean_orig o where o.rec_status = 'A' and o.state != -1 and o.num = plus.num and ext.algorithm_time <![CDATA[ < ]]> o.create_time)
+    </select>
+
 </mapper>

+ 30 - 0
src/main/resources/mapper/scene/SceneProMapper.xml

@@ -10,4 +10,34 @@
         and NOT EXISTS (select o.num from t_scene_clean_orig o where o.rec_status = 'A' and o.num = pro.num and pro.create_time <![CDATA[ < ]]> o.create_time)
     </select>
 
+    <select id="listCleanOss4DeletedScene" resultType="com.fdkankan.scene.bean.SceneBean">
+        select pro.num, pro.data_source
+        from t_scene_pro pro
+        where pro.rec_status = 'I' and pro.update_time <![CDATA[ < ]]> #{time}
+        and pro.data_source is not null
+        and NOT EXISTS (select o.num from t_scene_clean_orig o where o.rec_status = 'A' and o.num = pro.num and o.type = 2)
+    </select>
+
+    <select id="listCleanOss4TestCamera" resultType="com.fdkankan.scene.bean.SceneBean">
+        select pro.num, pro.data_source
+        from t_scene_pro pro
+        where pro.status in (1,-2) and pro.rec_status = 'A' and pro.create_time <![CDATA[ < ]]> #{time}
+        and pro.data_source is not null
+        and pro.camera_id in
+        <foreach collection="cameraIds" item="cameraId" open="(" close=")" separator=",">
+            #{cameraId}
+        </foreach>
+        and NOT EXISTS (select o.num from t_scene_clean_orig o where o.rec_status = 'A' and o.num = pro.num and o.type = 3 and pro.create_time <![CDATA[ < ]]> o.create_time)
+    </select>
+
+    <select id="selectColdStorageScene" resultType="com.fdkankan.scene.bean.SceneBean">
+        select pro.num, pro.data_source
+        from t_scene_pro pro
+        where pro.status in (1,-2) and pro.create_time <![CDATA[ < ]]> #{time}
+        and pro.data_source is not null
+        and pro.is_upgrade = 0
+        and NOT EXISTS (select c.num from t_scene_cold_storage_log c where c.rec_status = 'A' and c.num = pro.num and pro.create_time <![CDATA[ < ]]> c.create_time)
+        and NOT EXISTS (select o.num from t_scene_clean_orig o where o.rec_status = 'A' and o.state != -1 and o.num = pro.num and pro.create_time <![CDATA[ < ]]> o.create_time)
+    </select>
+
 </mapper>