Sfoglia il codice sorgente

定时任务迁移

dsx 2 anni fa
parent
commit
884bfe5068
53 ha cambiato i file con 1399 aggiunte e 20 eliminazioni
  1. 0 0
      LOG_PATH_IS_UNDEFINED/job-executor/logs/log_debug.log
  2. 0 0
      LOG_PATH_IS_UNDEFINED/job-executor/logs/log_error.log
  3. 10 0
      LOG_PATH_IS_UNDEFINED/job-executor/logs/log_info.log
  4. 3 0
      LOG_PATH_IS_UNDEFINED/job-executor/logs/log_warn.log
  5. 1 3
      src/main/java/com/fdkankan/job/JobApplication.java
  6. 24 0
      src/main/java/com/fdkankan/job/dto/BaseSceneParamVO.java
  7. 32 0
      src/main/java/com/fdkankan/job/dto/SceneAsynOperLogParamVO.java
  8. 11 0
      src/main/java/com/fdkankan/job/dto/SceneBean.java
  9. 102 0
      src/main/java/com/fdkankan/job/entity/SceneAsynOperLog.java
  10. 69 0
      src/main/java/com/fdkankan/job/entity/SceneCleanOrig.java
  11. 69 0
      src/main/java/com/fdkankan/job/entity/SceneColdStorage.java
  12. 72 0
      src/main/java/com/fdkankan/job/entity/SceneColdStorageLog.java
  13. 58 0
      src/main/java/com/fdkankan/job/job/CleanDownloadPanoramaHandler.java
  14. 71 0
      src/main/java/com/fdkankan/job/job/CleanOss4DeleteSceneHandler.java
  15. 1 1
      src/main/java/com/fdkankan/job/job/SceneCallCountHandler.java
  16. 113 0
      src/main/java/com/fdkankan/job/job/SceneColdStorageHandler.java
  17. 18 0
      src/main/java/com/fdkankan/job/mapper/ISceneAsynOperLogMapper.java
  18. 18 0
      src/main/java/com/fdkankan/job/mapper/ISceneCleanOrigMapper.java
  19. 18 0
      src/main/java/com/fdkankan/job/mapper/ISceneColdStorageLogMapper.java
  20. 18 0
      src/main/java/com/fdkankan/job/mapper/ISceneColdStorageMapper.java
  21. 8 0
      src/main/java/com/fdkankan/job/mapper/IScenePlusMapper.java
  22. 8 0
      src/main/java/com/fdkankan/job/mapper/ISceneProMapper.java
  23. 1 1
      src/main/java/com/fdkankan/job/job/BeanClassJobHandler.java
  24. 1 1
      src/main/java/com/fdkankan/job/job/ClueJobHandler.java
  25. 0 0
      src/main/java/com/fdkankan/job/repair/CountSizeOssHandler.java
  26. 1 1
      src/main/java/com/fdkankan/job/job/CreateScalingHandler.java
  27. 1 1
      src/main/java/com/fdkankan/job/job/FloorPanUserHandler.java
  28. 1 1
      src/main/java/com/fdkankan/job/job/FloorpanHandler.java
  29. 1 1
      src/main/java/com/fdkankan/job/job/FloorpanLCHandler.java
  30. 1 1
      src/main/java/com/fdkankan/job/job/HouseTypeHandler.java
  31. 1 1
      src/main/java/com/fdkankan/job/job/MethodJobHandler.java
  32. 1 1
      src/main/java/com/fdkankan/job/job/ModelKindHandler.java
  33. 1 1
      src/main/java/com/fdkankan/job/job/RepairBucketHandler.java
  34. 1 1
      src/main/java/com/fdkankan/job/job/RepairDataHandler.java
  35. 1 1
      src/main/java/com/fdkankan/job/job/RepairVideosHandler.java
  36. 1 1
      src/main/java/com/fdkankan/job/job/SceneVersionHandler.java
  37. 1 1
      src/main/java/com/fdkankan/job/job/UploadResultDataHandler.java
  38. 1 1
      src/main/java/com/fdkankan/job/job/V4toV3ByOneHandler.java
  39. 1 1
      src/main/java/com/fdkankan/job/job/V4toV3Handler.java
  40. 22 0
      src/main/java/com/fdkankan/job/service/ISceneAsynOperLogService.java
  41. 32 0
      src/main/java/com/fdkankan/job/service/ISceneCleanOrigService.java
  42. 16 0
      src/main/java/com/fdkankan/job/service/ISceneColdStorageLogService.java
  43. 18 0
      src/main/java/com/fdkankan/job/service/ISceneColdStorageService.java
  44. 7 0
      src/main/java/com/fdkankan/job/service/IScenePlusService.java
  45. 7 0
      src/main/java/com/fdkankan/job/service/ISceneProService.java
  46. 115 0
      src/main/java/com/fdkankan/job/service/impl/SceneAsynOperLogServiceImpl.java
  47. 289 0
      src/main/java/com/fdkankan/job/service/impl/SceneCleanOrigServiceImpl.java
  48. 33 0
      src/main/java/com/fdkankan/job/service/impl/SceneColdStorageLogServiceImpl.java
  49. 39 0
      src/main/java/com/fdkankan/job/service/impl/SceneColdStorageServiceImpl.java
  50. 22 0
      src/main/java/com/fdkankan/job/service/impl/ScenePlusServiceImpl.java
  51. 21 0
      src/main/java/com/fdkankan/job/service/impl/SceneProServiceImpl.java
  52. 20 0
      src/main/resources/mapper/job/ScenePlusMapper.xml
  53. 18 0
      src/main/resources/mapper/job/SceneProMapper.xml

+ 0 - 0
LOG_PATH_IS_UNDEFINED/job-executor/logs/log_debug.log


+ 0 - 0
LOG_PATH_IS_UNDEFINED/job-executor/logs/log_error.log


File diff suppressed because it is too large
+ 10 - 0
LOG_PATH_IS_UNDEFINED/job-executor/logs/log_info.log


+ 3 - 0
LOG_PATH_IS_UNDEFINED/job-executor/logs/log_warn.log

@@ -0,0 +1,3 @@
+2023-07-06 17:49:03.716 [main] WARN  c.a.cloud.nacos.client.NacosPropertySourceBuilder - Ignore the empty nacos configuration and get it based on dataId[common-logback-config.yaml] & group[DEFAULT_GROUP]
+2023-07-06 17:49:03.747 [main] WARN  c.a.cloud.nacos.client.NacosPropertySourceBuilder - Ignore the empty nacos configuration and get it based on dataId[4dkankan-center-job-executor] & group[DEFAULT_GROUP]
+2023-07-06 17:49:03.778 [main] WARN  c.a.cloud.nacos.client.NacosPropertySourceBuilder - Ignore the empty nacos configuration and get it based on dataId[4dkankan-center-job-executor-test-eur.yaml] & group[DEFAULT_GROUP]

+ 1 - 3
src/main/java/com/fdkankan/job/JobApplication.java

@@ -1,11 +1,9 @@
 package com.fdkankan.job;
 
-import com.dtflys.forest.springboot.annotation.ForestScan;
-import com.fdkankan.job.job.BeanClassJobHandler;
+import com.fdkankan.job.repair.BeanClassJobHandler;
 import com.xxl.job.core.executor.impl.XxlJobSpringExecutor;
 import javax.annotation.Resource;
 import org.mybatis.spring.annotation.MapperScan;
-import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.boot.SpringApplication;
 import org.springframework.boot.autoconfigure.SpringBootApplication;
 import org.springframework.cloud.client.discovery.EnableDiscoveryClient;

+ 24 - 0
src/main/java/com/fdkankan/job/dto/BaseSceneParamVO.java

@@ -0,0 +1,24 @@
+package com.fdkankan.job.dto;
+
+import lombok.Data;
+
+import javax.validation.constraints.NotBlank;
+
+/**
+ * <p>
+ * TODO
+ * </p>
+ *
+ * @author dengsixing
+ * @since 2022/2/22
+ **/
+@Data
+public class BaseSceneParamVO {
+
+    /**
+     * 场景码
+     */
+    @NotBlank(message = "场景码不能为空")
+    private String num;
+
+}

+ 32 - 0
src/main/java/com/fdkankan/job/dto/SceneAsynOperLogParamVO.java

@@ -0,0 +1,32 @@
+package com.fdkankan.job.dto;
+
+import lombok.Data;
+
+/**
+ * <p>
+ * TODO
+ * </p>
+ *
+ * @author dengsixing
+ * @since 2022/12/7
+ **/
+@Data
+public class SceneAsynOperLogParamVO extends BaseSceneParamVO{
+
+    /**
+    * 操作类型(upload-上传,download-下载)
+    */
+    private String operType;
+
+    /**
+     * 模块名称
+     */
+    private String module;
+
+    /**
+     * 功能
+     */
+    private String func;
+
+
+}

+ 11 - 0
src/main/java/com/fdkankan/job/dto/SceneBean.java

@@ -0,0 +1,11 @@
+package com.fdkankan.job.dto;
+
+import lombok.Data;
+
+@Data
+public class SceneBean {
+
+    private String num;
+
+    private String dataSource;
+}

+ 102 - 0
src/main/java/com/fdkankan/job/entity/SceneAsynOperLog.java

@@ -0,0 +1,102 @@
+package com.fdkankan.job.entity;
+
+import com.baomidou.mybatisplus.annotation.*;
+import lombok.Getter;
+import lombok.Setter;
+
+import java.io.Serializable;
+import java.util.Date;
+
+/**
+ * <p>
+ * 
+ * </p>
+ *
+ * @author 
+ * @since 2022-12-07
+ */
+@Getter
+@Setter
+@TableName("t_scene_asyn_oper_log")
+public class SceneAsynOperLog implements Serializable {
+
+    private static final long serialVersionUID = 1L;
+
+    @TableId(value = "id", type = IdType.AUTO)
+    private Long id;
+
+    /**
+     * 场景码
+     */
+    @TableField("num")
+    private String num;
+
+    /**
+     * 操作类型(upload-上传,download-下载)
+     */
+    @TableField("oper_type")
+    private String operType;
+
+    /**
+     * 模块名称
+     */
+    @TableField("module")
+    private String module;
+
+    /**
+     * 功能
+     */
+    @TableField("func")
+    private String func;
+
+    /**
+     * 版本号
+     */
+    @TableField("version")
+    private Integer version;
+
+    /**
+     * 状态(0-处理中,1-处理完成,2-处理失败)
+     */
+    @TableField("state")
+    private Integer state;
+
+    /**
+     * 下载链接
+     */
+    @TableField("url")
+    private String url;
+
+    /**
+     * 是否需要弹窗(0-否,1-是)
+     */
+    @TableField("pop")
+    private Integer pop;
+
+    /**
+     * 扩展信息
+     */
+    @TableField("ext_data")
+    private String extData;
+
+    /**
+     * 创建时间
+     */
+    @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;
+
+
+}

+ 69 - 0
src/main/java/com/fdkankan/job/entity/SceneCleanOrig.java

@@ -0,0 +1,69 @@
+package com.fdkankan.job.entity;
+
+import com.baomidou.mybatisplus.annotation.*;
+import lombok.Getter;
+import lombok.Setter;
+
+import java.io.Serializable;
+import java.util.Date;
+
+/**
+ * <p>
+ * 删除oss原始资源记录
+ * </p>
+ *
+ * @author 
+ * @since 2023-03-29
+ */
+@Getter
+@Setter
+@TableName("t_scene_clean_orig")
+public class SceneCleanOrig implements Serializable {
+
+    private static final long serialVersionUID = 1L;
+
+    @TableId(value = "id", type = IdType.AUTO)
+    private Long id;
+
+    @TableField("num")
+    private String num;
+
+    /**
+     * type
+     */
+    @TableField("type")
+    private Integer type;
+
+    /**
+     * 0-处理中,1-成功,-1失败
+     */
+    @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;
+
+
+}

+ 69 - 0
src/main/java/com/fdkankan/job/entity/SceneColdStorage.java

@@ -0,0 +1,69 @@
+package com.fdkankan.job.entity;
+
+import com.baomidou.mybatisplus.annotation.*;
+import lombok.Getter;
+import lombok.Setter;
+
+import java.io.Serializable;
+import java.util.Date;
+
+/**
+ * <p>
+ * 场景封存状态表
+ * </p>
+ *
+ * @author 
+ * @since 2023-07-25
+ */
+@Getter
+@Setter
+@TableName("t_scene_cold_storage")
+public class SceneColdStorage implements Serializable {
+
+    private static final long serialVersionUID = 1L;
+
+    @TableId(value = "id", type = IdType.AUTO)
+    private Long id;
+
+    /**
+     * 场景码
+     */
+    @TableField("num")
+    private String num;
+
+    /**
+     * 1-封存,2-未封存
+     */
+    @TableField("state")
+    private Integer state;
+
+    /**
+     * 创建时间
+     */
+    @TableField("create_time")
+    private Date createTime;
+
+    /**
+     * 修改时间
+     */
+    @TableField("update_time")
+    private Date updateTime;
+
+    @TableField("rec_status")
+    @TableLogic(value = "A", delval = "I")
+    private String recStatus;
+
+    /**
+     * 冷存储bucket
+     */
+    @TableField("cold_bucket")
+    private String coldBucket;
+
+    /**
+     * 正常使用bucket
+     */
+    @TableField("bucket")
+    private String bucket;
+
+
+}

+ 72 - 0
src/main/java/com/fdkankan/job/entity/SceneColdStorageLog.java

@@ -0,0 +1,72 @@
+package com.fdkankan.job.entity;
+
+import com.baomidou.mybatisplus.annotation.*;
+import lombok.Getter;
+import lombok.Setter;
+
+import java.io.Serializable;
+import java.util.Date;
+
+/**
+ * <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;
+
+
+}

+ 58 - 0
src/main/java/com/fdkankan/job/job/CleanDownloadPanoramaHandler.java

@@ -0,0 +1,58 @@
+package com.fdkankan.job.job;
+
+import cn.hutool.core.img.ImgUtil;
+import com.fdkankan.job.service.ISceneAsynOperLogService;
+import com.fdkankan.job.service.ISceneCleanOrigService;
+import com.fdkankan.job.service.IScenePlusService;
+import com.fdkankan.job.service.ISceneProService;
+import com.fdkankan.redis.constant.RedisLockKey;
+import com.fdkankan.redis.util.RedisLockUtil;
+import com.xxl.job.core.context.XxlJobHelper;
+import com.xxl.job.core.handler.annotation.XxlJob;
+import lombok.extern.slf4j.Slf4j;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.beans.factory.annotation.Value;
+import org.springframework.cloud.context.config.annotation.RefreshScope;
+import org.springframework.stereotype.Component;
+
+import java.io.File;
+import java.sql.SQLException;
+
+/**
+ * <p>
+ * 场景冻结定时任务
+ * </p>
+ *
+ * @author dengsixing
+ * @since 2022/12/16
+ **/
+@RefreshScope
+@Component
+@Slf4j
+public class CleanDownloadPanoramaHandler {
+
+    @Value("${env}")
+    private String env;
+
+    @Autowired
+    private IScenePlusService scenePlusService;
+    @Autowired
+    private ISceneProService sceneProService;
+    @Autowired
+    private RedisLockUtil redisLockUtil;
+    @Autowired
+    private ISceneCleanOrigService sceneCleanOrigService;
+    @Autowired
+    private ISceneAsynOperLogService sceneAsynOperLogService;
+
+    @XxlJob("cleanDownloadPanorama")
+    public void coldStorageHomeV3() throws Exception {
+        XxlJobHelper.log("cleanDownloadPanorama start.....");
+
+        log.info("定时清除全景图压缩包开始");
+        sceneAsynOperLogService.cleanDownloadPanorama();
+        log.info("定时清除全景图压缩包完毕");
+
+        XxlJobHelper.log("cleanDownloadPanorama end.....");
+    }
+}

+ 71 - 0
src/main/java/com/fdkankan/job/job/CleanOss4DeleteSceneHandler.java

@@ -0,0 +1,71 @@
+package com.fdkankan.job.job;
+
+import com.fdkankan.job.service.ISceneCleanOrigService;
+import com.fdkankan.redis.constant.RedisLockKey;
+import com.fdkankan.redis.util.RedisLockUtil;
+import com.xxl.job.core.context.XxlJobHelper;
+import com.xxl.job.core.handler.annotation.XxlJob;
+import lombok.extern.slf4j.Slf4j;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.cloud.context.config.annotation.RefreshScope;
+import org.springframework.stereotype.Component;
+
+/**
+ * <p>
+ * 已删除场景 清除oss文件
+ * </p>
+ *
+ * @author dengsixing
+ * @since 2022/12/16
+ **/
+@RefreshScope
+@Component
+@Slf4j
+public class CleanOss4DeleteSceneHandler {
+
+    @Autowired
+    private RedisLockUtil redisLockUtil;
+    @Autowired
+    private ISceneCleanOrigService sceneCleanOrigService;
+
+    @XxlJob("cleanOss4DeletedSceneV3")
+    public void cleanOss4DeletedSceneV3(){
+        XxlJobHelper.log("cleanOss4DeletedSceneV3 start.....");
+
+        log.info("删除已删除V3场景原始资源开始");
+        String lockKey = RedisLockKey.LOCK_CLEAN_SCENE_DELETED_ORIG_V3;
+        try {
+            boolean lock = redisLockUtil.lock(lockKey, 24*60*60);
+            if(!lock){
+                return;
+            }
+            sceneCleanOrigService.cleanOss4DeletedSceneV3();
+        }finally {
+            redisLockUtil.unlockLua(lockKey);
+        }
+        log.info("删除已删除V3场景原始资源结束");
+
+        XxlJobHelper.log("cleanOss4DeletedSceneV3 end.....");
+    }
+
+    @XxlJob("cleanOss4DeletedSceneV4")
+    public void cleanOss4DeletedSceneV4() throws Exception {
+        XxlJobHelper.log("cleanOss4DeletedSceneV4 start.....");
+
+        log.info("删除已删除V4场景原始资源开始");
+        String lockKey = RedisLockKey.LOCK_CLEAN_SCENE_DELETED_ORIG_V4;
+        try {
+            boolean lock = redisLockUtil.lock(lockKey, 24*60*60);
+            if(!lock){
+                return;
+            }
+            sceneCleanOrigService.cleanOss4DeletedSceneV4();
+        }finally {
+            redisLockUtil.unlockLua(lockKey);
+        }
+        log.info("删除已删除V4场景原始资源结束");
+
+        XxlJobHelper.log("cleanOss4DeletedSceneV4 end.....");
+    }
+
+}

+ 1 - 1
src/main/java/com/fdkankan/job/job/SceneCallCountHandler.java

@@ -32,7 +32,7 @@ import java.util.stream.Collectors;
 
 /**
  * <p>
- * 此类中的任务用于做数据修复用,不需要定时任务执行,只需在调度中心手动执行一次即可
+ * 场景计算统计
  * </p>
  *
  * @author dengsixing

+ 113 - 0
src/main/java/com/fdkankan/job/job/SceneColdStorageHandler.java

@@ -0,0 +1,113 @@
+package com.fdkankan.job.job;
+
+import cn.hutool.core.collection.CollUtil;
+import cn.hutool.core.img.ImgUtil;
+import cn.hutool.core.util.StrUtil;
+import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
+import com.fdkankan.common.constant.CommonOperStatus;
+import com.fdkankan.common.util.DateExtUtil;
+import com.fdkankan.dingtalk.DingTalkSendUtils;
+import com.fdkankan.job.entity.SceneBuildProcessLog;
+import com.fdkankan.job.entity.ScenePlus;
+import com.fdkankan.job.entity.ScenePro;
+import com.fdkankan.job.service.ISceneBuildProcessLogService;
+import com.fdkankan.job.service.ISceneCleanOrigService;
+import com.fdkankan.job.service.IScenePlusService;
+import com.fdkankan.job.service.ISceneProService;
+import com.fdkankan.model.constants.SceneBuildProcessType;
+import com.fdkankan.redis.constant.RedisLockKey;
+import com.fdkankan.redis.util.RedisLockUtil;
+import com.xxl.job.core.context.XxlJobHelper;
+import com.xxl.job.core.handler.annotation.XxlJob;
+import lombok.extern.slf4j.Slf4j;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.beans.factory.annotation.Value;
+import org.springframework.cloud.context.config.annotation.RefreshScope;
+import org.springframework.stereotype.Component;
+
+import java.io.File;
+import java.sql.SQLException;
+import java.util.ArrayList;
+import java.util.Calendar;
+import java.util.Date;
+import java.util.List;
+import java.util.concurrent.atomic.AtomicInteger;
+import java.util.stream.Collectors;
+
+/**
+ * <p>
+ * 场景冻结定时任务
+ * </p>
+ *
+ * @author dengsixing
+ * @since 2022/12/16
+ **/
+@RefreshScope
+@Component
+@Slf4j
+public class SceneColdStorageHandler {
+
+    @Value("${env}")
+    private String env;
+
+    @Autowired
+    private IScenePlusService scenePlusService;
+    @Autowired
+    private ISceneProService sceneProService;
+    @Autowired
+    private RedisLockUtil redisLockUtil;
+    @Autowired
+    private ISceneCleanOrigService sceneCleanOrigService;
+
+    @XxlJob("coldStorageHomeV3")
+    public void coldStorageHomeV3() throws Exception {
+        XxlJobHelper.log("coldStorageHomeV3 start.....");
+
+        log.info("冻结v3场景原始资源开始");
+        String lockKey = RedisLockKey.LOCK_CLEAN_SCENE_ORIG_V3;
+        try {
+            boolean lock = redisLockUtil.lock(lockKey, 24*60*60);
+            if(!lock){
+                return;
+            }
+            sceneCleanOrigService.coldStorageHomeV3();
+        }finally {
+            redisLockUtil.unlockLua(lockKey);
+        }
+        log.info("冻结v3场景原始资源结束");
+
+
+
+        XxlJobHelper.log("coldStorageHomeV3 end.....");
+    }
+
+    @XxlJob("coldStorageHomeV4")
+    public void coldStorageHomeV4() throws Exception {
+        XxlJobHelper.log("coldStorageHomeV4 start.....");
+
+        log.info("冻结v4场景原始资源开始");
+        String lockKey = RedisLockKey.LOCK_CLEAN_SCENE_ORIG_V4;
+        try {
+            boolean lock = redisLockUtil.lock(lockKey, 24*60*60);
+            if(!lock){
+                return;
+            }
+            sceneCleanOrigService.coldStorageHomeV4();
+        }finally {
+            redisLockUtil.unlockLua(lockKey);
+        }
+        log.info("冻结v4场景原始资源结束");
+
+
+
+        XxlJobHelper.log("coldStorageHomeV4 end.....");
+    }
+
+    public static void main(String[] args) throws SQLException {
+
+        ImgUtil.scale(new File("C:\\Users\\dsx\\Desktop\\test\\20230116173304.jpg"), new File("C:\\Users\\dsx\\Desktop\\test\\3.jpg"), (float) 0.3);
+
+    }
+
+
+}

+ 18 - 0
src/main/java/com/fdkankan/job/mapper/ISceneAsynOperLogMapper.java

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

+ 18 - 0
src/main/java/com/fdkankan/job/mapper/ISceneCleanOrigMapper.java

@@ -0,0 +1,18 @@
+package com.fdkankan.job.mapper;
+
+import com.baomidou.mybatisplus.core.mapper.BaseMapper;
+import com.fdkankan.job.entity.SceneCleanOrig;
+import org.apache.ibatis.annotations.Mapper;
+
+/**
+ * <p>
+ * 删除oss原始资源记录 Mapper 接口
+ * </p>
+ *
+ * @author 
+ * @since 2023-03-29
+ */
+@Mapper
+public interface ISceneCleanOrigMapper extends BaseMapper<SceneCleanOrig> {
+
+}

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

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

+ 18 - 0
src/main/java/com/fdkankan/job/mapper/ISceneColdStorageMapper.java

@@ -0,0 +1,18 @@
+package com.fdkankan.job.mapper;
+
+import com.baomidou.mybatisplus.core.mapper.BaseMapper;
+import com.fdkankan.job.entity.SceneColdStorage;
+import org.apache.ibatis.annotations.Mapper;
+
+/**
+ * <p>
+ * 场景封存状态表 Mapper 接口
+ * </p>
+ *
+ * @author 
+ * @since 2023-07-25
+ */
+@Mapper
+public interface ISceneColdStorageMapper extends BaseMapper<SceneColdStorage> {
+
+}

+ 8 - 0
src/main/java/com/fdkankan/job/mapper/IScenePlusMapper.java

@@ -1,9 +1,13 @@
 package com.fdkankan.job.mapper;
 
+import com.fdkankan.job.dto.SceneBean;
 import com.fdkankan.job.entity.ScenePlus;
 import com.baomidou.mybatisplus.core.mapper.BaseMapper;
 import org.apache.ibatis.annotations.Mapper;
 
+import java.util.Date;
+import java.util.List;
+
 /**
  * <p>
  * 场景主表 Mapper 接口
@@ -15,4 +19,8 @@ import org.apache.ibatis.annotations.Mapper;
 @Mapper
 public interface IScenePlusMapper extends BaseMapper<ScenePlus> {
 
+    List<SceneBean> selectColdStorageScene(Date time);
+
+    List<SceneBean> selectCleanOrigSceneDeleted(Date time);
+
 }

+ 8 - 0
src/main/java/com/fdkankan/job/mapper/ISceneProMapper.java

@@ -1,9 +1,13 @@
 package com.fdkankan.job.mapper;
 
+import com.fdkankan.job.dto.SceneBean;
 import com.fdkankan.job.entity.ScenePro;
 import com.baomidou.mybatisplus.core.mapper.BaseMapper;
 import org.apache.ibatis.annotations.Mapper;
 
+import java.util.Date;
+import java.util.List;
+
 /**
  * <p>
  * pro场景表 Mapper 接口
@@ -15,4 +19,8 @@ import org.apache.ibatis.annotations.Mapper;
 @Mapper
 public interface ISceneProMapper extends BaseMapper<ScenePro> {
 
+    List<SceneBean> selectColdStorageScene(Date time);
+
+    List<SceneBean> listCleanOss4DeletedScene(Date time);
+
 }

+ 1 - 1
src/main/java/com/fdkankan/job/job/BeanClassJobHandler.java

@@ -1,4 +1,4 @@
-package com.fdkankan.job.job;
+package com.fdkankan.job.repair;
 
 import com.xxl.job.core.context.XxlJobHelper;
 import com.xxl.job.core.executor.XxlJobExecutor;

+ 1 - 1
src/main/java/com/fdkankan/job/job/ClueJobHandler.java

@@ -1,4 +1,4 @@
-package com.fdkankan.job.job;
+package com.fdkankan.job.repair;
 
 import com.fdkankan.common.util.DateExtUtil;
 import com.xxl.job.core.handler.IJobHandler;

src/main/java/com/fdkankan/job/job/CountSizeOssHandler.java → src/main/java/com/fdkankan/job/repair/CountSizeOssHandler.java


+ 1 - 1
src/main/java/com/fdkankan/job/job/CreateScalingHandler.java

@@ -1,4 +1,4 @@
-package com.fdkankan.job.job;
+package com.fdkankan.job.repair;
 
 import cn.hutool.core.util.StrUtil;
 import com.fdkankan.rubbersheeting.ScalingService;

+ 1 - 1
src/main/java/com/fdkankan/job/job/FloorPanUserHandler.java

@@ -1,4 +1,4 @@
-package com.fdkankan.job.job;
+package com.fdkankan.job.repair;
 
 import cn.hutool.core.collection.CollUtil;
 import cn.hutool.core.io.FileUtil;

+ 1 - 1
src/main/java/com/fdkankan/job/job/FloorpanHandler.java

@@ -1,4 +1,4 @@
-package com.fdkankan.job.job;
+package com.fdkankan.job.repair;
 
 import cn.hutool.core.collection.CollUtil;
 import cn.hutool.core.io.FileUtil;

+ 1 - 1
src/main/java/com/fdkankan/job/job/FloorpanLCHandler.java

@@ -1,4 +1,4 @@
-package com.fdkankan.job.job;
+package com.fdkankan.job.repair;
 
 import cn.hutool.core.collection.CollUtil;
 import cn.hutool.core.util.StrUtil;

+ 1 - 1
src/main/java/com/fdkankan/job/job/HouseTypeHandler.java

@@ -1,4 +1,4 @@
-package com.fdkankan.job.job;
+package com.fdkankan.job.repair;
 
 import cn.hutool.core.util.StrUtil;
 import com.fdkankan.job.service.IHouseTypeService;

+ 1 - 1
src/main/java/com/fdkankan/job/job/MethodJobHandler.java

@@ -1,4 +1,4 @@
-package com.fdkankan.job.job;
+package com.fdkankan.job.repair;
 
 import com.xxl.job.core.context.XxlJobHelper;
 import com.xxl.job.core.handler.annotation.XxlJob;

+ 1 - 1
src/main/java/com/fdkankan/job/job/ModelKindHandler.java

@@ -1,4 +1,4 @@
-package com.fdkankan.job.job;
+package com.fdkankan.job.repair;
 
 import com.alibaba.fastjson.JSON;
 import com.alibaba.fastjson.JSONObject;

+ 1 - 1
src/main/java/com/fdkankan/job/job/RepairBucketHandler.java

@@ -1,4 +1,4 @@
-package com.fdkankan.job.job;
+package com.fdkankan.job.repair;
 
 import cn.hutool.core.collection.CollUtil;
 import cn.hutool.core.io.FileUtil;

+ 1 - 1
src/main/java/com/fdkankan/job/job/RepairDataHandler.java

@@ -1,4 +1,4 @@
-package com.fdkankan.job.job;
+package com.fdkankan.job.repair;
 
 import cn.hutool.core.util.StrUtil;
 import com.fdkankan.job.service.IRepairUpXmlUrlService;

+ 1 - 1
src/main/java/com/fdkankan/job/job/RepairVideosHandler.java

@@ -1,4 +1,4 @@
-package com.fdkankan.job.job;
+package com.fdkankan.job.repair;
 
 import cn.hutool.core.collection.CollUtil;
 import cn.hutool.core.io.FileUtil;

+ 1 - 1
src/main/java/com/fdkankan/job/job/SceneVersionHandler.java

@@ -1,4 +1,4 @@
-package com.fdkankan.job.job;
+package com.fdkankan.job.repair;
 
 import cn.hutool.core.collection.CollUtil;
 import cn.hutool.core.util.StrUtil;

+ 1 - 1
src/main/java/com/fdkankan/job/job/UploadResultDataHandler.java

@@ -1,4 +1,4 @@
-package com.fdkankan.job.job;
+package com.fdkankan.job.repair;
 
 import cn.hutool.core.collection.CollUtil;
 import cn.hutool.core.io.FileUtil;

+ 1 - 1
src/main/java/com/fdkankan/job/job/V4toV3ByOneHandler.java

@@ -1,4 +1,4 @@
-package com.fdkankan.job.job;
+package com.fdkankan.job.repair;
 
 import cn.hutool.core.collection.CollUtil;
 import cn.hutool.core.io.FileUtil;

+ 1 - 1
src/main/java/com/fdkankan/job/job/V4toV3Handler.java

@@ -1,4 +1,4 @@
-package com.fdkankan.job.job;
+package com.fdkankan.job.repair;
 
 import cn.hutool.core.collection.CollUtil;
 import cn.hutool.core.io.FileUtil;

+ 22 - 0
src/main/java/com/fdkankan/job/service/ISceneAsynOperLogService.java

@@ -0,0 +1,22 @@
+package com.fdkankan.job.service;
+
+import com.baomidou.mybatisplus.extension.service.IService;
+import com.fdkankan.job.dto.SceneAsynOperLogParamVO;
+import com.fdkankan.job.entity.SceneAsynOperLog;
+import com.fdkankan.web.response.ResultData;
+
+/**
+ * <p>
+ *  服务类
+ * </p>
+ *
+ * @author 
+ * @since 2022-12-07
+ */
+public interface ISceneAsynOperLogService extends IService<SceneAsynOperLog> {
+
+    ResultData getAsynOperLog(SceneAsynOperLogParamVO param);
+
+    void cleanDownloadPanorama();
+
+}

+ 32 - 0
src/main/java/com/fdkankan/job/service/ISceneCleanOrigService.java

@@ -0,0 +1,32 @@
+package com.fdkankan.job.service;
+
+import com.baomidou.mybatisplus.extension.service.IService;
+import com.fdkankan.job.entity.SceneCleanOrig;
+
+/**
+ * <p>
+ * 删除oss原始资源记录 服务类
+ * </p>
+ *
+ * @author 
+ * @since 2023-03-29
+ */
+public interface ISceneCleanOrigService extends IService<SceneCleanOrig> {
+
+//    void cleanOrigV3();
+//
+//    void cleanOrigV4();
+
+    void cleanOss4DeletedSceneV3();
+
+    void cleanOss4DeletedSceneV4();
+
+//    void cleanOss4TestCameraV3();
+//
+//    void cleanOss4TestCameraV4();
+
+    void coldStorageHomeV3();
+
+    void coldStorageHomeV4();
+
+}

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

@@ -0,0 +1,16 @@
+package com.fdkankan.job.service;
+
+import com.baomidou.mybatisplus.extension.service.IService;
+import com.fdkankan.job.entity.SceneColdStorageLog;
+
+/**
+ * <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);
+}

+ 18 - 0
src/main/java/com/fdkankan/job/service/ISceneColdStorageService.java

@@ -0,0 +1,18 @@
+package com.fdkankan.job.service;
+
+import com.baomidou.mybatisplus.extension.service.IService;
+import com.fdkankan.job.entity.SceneColdStorage;
+
+/**
+ * <p>
+ * 场景封存状态表 服务类
+ * </p>
+ *
+ * @author 
+ * @since 2023-07-25
+ */
+public interface ISceneColdStorageService extends IService<SceneColdStorage> {
+
+    void save(String num, Integer state, String coldBucket, String standarBucket);
+
+}

+ 7 - 0
src/main/java/com/fdkankan/job/service/IScenePlusService.java

@@ -1,8 +1,11 @@
 package com.fdkankan.job.service;
 
+import com.fdkankan.job.dto.SceneBean;
 import com.fdkankan.job.entity.ScenePlus;
 import com.baomidou.mybatisplus.extension.service.IService;
 
+import java.util.List;
+
 /**
  * <p>
  * 场景主表 服务类
@@ -13,4 +16,8 @@ import com.baomidou.mybatisplus.extension.service.IService;
  */
 public interface IScenePlusService extends IService<ScenePlus> {
 
+    List<SceneBean> listColdStorageScene(int month);
+
+    List<SceneBean> listCleanOss4DeletedScene(int cleanOrigMonth);
+
 }

+ 7 - 0
src/main/java/com/fdkankan/job/service/ISceneProService.java

@@ -1,8 +1,11 @@
 package com.fdkankan.job.service;
 
+import com.fdkankan.job.dto.SceneBean;
 import com.fdkankan.job.entity.ScenePro;
 import com.baomidou.mybatisplus.extension.service.IService;
 
+import java.util.List;
+
 /**
  * <p>
  * pro场景表 服务类
@@ -13,4 +16,8 @@ import com.baomidou.mybatisplus.extension.service.IService;
  */
 public interface ISceneProService extends IService<ScenePro> {
 
+    List<SceneBean> listColdStorageScene(int month);
+
+    List<SceneBean> listCleanOss4DeletedScene(int month);
+
 }

+ 115 - 0
src/main/java/com/fdkankan/job/service/impl/SceneAsynOperLogServiceImpl.java

@@ -0,0 +1,115 @@
+package com.fdkankan.job.service.impl;
+
+import cn.hutool.core.collection.CollUtil;
+import cn.hutool.core.date.DateTime;
+import cn.hutool.core.date.DateUtil;
+import cn.hutool.core.util.StrUtil;
+import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
+import com.baomidou.mybatisplus.core.conditions.update.LambdaUpdateWrapper;
+import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
+import com.fdkankan.common.constant.*;
+import com.fdkankan.fyun.face.FYunFileServiceInterface;
+import com.fdkankan.job.dto.SceneAsynOperLogParamVO;
+import com.fdkankan.job.entity.SceneAsynOperLog;
+import com.fdkankan.job.mapper.ISceneAsynOperLogMapper;
+import com.fdkankan.job.service.ISceneAsynOperLogService;
+import com.fdkankan.web.response.ResultData;
+import lombok.extern.slf4j.Slf4j;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.stereotype.Service;
+
+import java.io.IOException;
+import java.util.Calendar;
+import java.util.List;
+import java.util.stream.Collectors;
+
+/**
+ * <p>
+ *  服务实现类
+ * </p>
+ *
+ * @author 
+ * @since 2022-12-07
+ */
+@Slf4j
+@Service
+public class SceneAsynOperLogServiceImpl extends ServiceImpl<ISceneAsynOperLogMapper, SceneAsynOperLog> implements ISceneAsynOperLogService {
+
+    @Autowired
+    private FYunFileServiceInterface fYunFileService;
+
+
+    @Override
+    public ResultData getAsynOperLog(SceneAsynOperLogParamVO param) {
+
+        LambdaQueryWrapper<SceneAsynOperLog> queryWrapper = new LambdaQueryWrapper<>();
+        queryWrapper.eq(SceneAsynOperLog::getNum, param.getNum());
+        if(StrUtil.isNotEmpty(param.getOperType())){
+            queryWrapper.eq(SceneAsynOperLog::getOperType, param.getOperType());
+        }
+        if(StrUtil.isNotEmpty(param.getModule())){
+            queryWrapper.eq(SceneAsynOperLog::getModule, param.getModule());
+        }
+        if(StrUtil.isNotEmpty(param.getFunc())){
+            queryWrapper.eq(SceneAsynOperLog::getFunc, param.getFunc());
+        }
+
+        //需要弹窗的异步操作列表
+        List<SceneAsynOperLog> list = this.list(queryWrapper);
+
+        //如果列表中有需要弹窗并且处理完毕的,需要把这些数据改为不需要弹窗了,因为前端请求到之后就会弹出提示,下次不需要弹窗了
+        if(CollUtil.isNotEmpty(list)){
+            List<Long> idList = list.stream().filter(log -> {
+                if(!log.getState().equals(CommonOperStatus.WAITING.code())){
+                    return true;
+                }
+                return false;
+            }).map(log->log.getId()).collect(Collectors.toList());
+            if(CollUtil.isNotEmpty(idList)){
+                this.update(new LambdaUpdateWrapper<SceneAsynOperLog>()
+                    .set(SceneAsynOperLog::getPop, CommonStatus.NO.code())
+                    .in(SceneAsynOperLog::getId, idList));
+            }
+        }
+
+        return ResultData.ok(list);
+    }
+
+    @Override
+    public void cleanDownloadPanorama() {
+
+        List<SceneAsynOperLog> downloadList = this.list(
+            new LambdaQueryWrapper<SceneAsynOperLog>()
+                .eq(SceneAsynOperLog::getOperType, SceneAsynOperType.DOWNLOAD.code())
+                .eq(SceneAsynOperLog::getModule, SceneAsynModuleType.UPLOAD_DOWNLOAD.code())
+                .eq(SceneAsynOperLog::getFunc, SceneAsynFuncType.PANORAMIC_IMAGE.code()));
+        if(CollUtil.isEmpty(downloadList)){
+            return;
+        }
+        DateTime preMonth = DateUtil.offsetMonth(Calendar.getInstance().getTime(), -1);
+        List<SceneAsynOperLog> deleteList = downloadList.parallelStream().filter(log -> {
+            if (log.getCreateTime().before(preMonth)) {
+                return Boolean.TRUE;
+            }
+            return false;
+        }).collect(Collectors.toList());
+        if(CollUtil.isEmpty(deleteList)){
+            return;
+        }
+
+        //删除数据库记录
+        List<Long> deleteIdList = deleteList.parallelStream().map(item -> item.getId()).collect(Collectors.toList());
+        this.removeByIds(deleteIdList);
+
+        deleteList.parallelStream().forEach(item -> {
+            if(StrUtil.isNotEmpty(item.getUrl())){
+                try {
+                    fYunFileService.deleteFile(item.getUrl());
+                } catch (IOException e) {
+                    log.warn("删除oss全景图下载压缩包失败,key:{}", item.getUrl());
+                }
+            }
+        });
+
+    }
+}

+ 289 - 0
src/main/java/com/fdkankan/job/service/impl/SceneCleanOrigServiceImpl.java

@@ -0,0 +1,289 @@
+package com.fdkankan.job.service.impl;
+
+import cn.hutool.core.collection.CollUtil;
+import cn.hutool.core.exceptions.ExceptionUtil;
+import cn.hutool.core.util.StrUtil;
+import com.alibaba.fastjson.JSON;
+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.CommonSuccessStatus;
+import com.fdkankan.fyun.face.FYunFileServiceInterface;
+import com.fdkankan.job.dto.SceneBean;
+import com.fdkankan.job.entity.SceneCleanOrig;
+import com.fdkankan.job.mapper.ISceneCleanOrigMapper;
+import com.fdkankan.job.service.*;
+import com.fdkankan.model.constants.ConstantFilePath;
+import com.fdkankan.model.constants.UploadFilePath;
+import com.fdkankan.model.utils.SceneUtil;
+import com.fdkankan.redis.constant.RedisKey;
+import com.fdkankan.redis.util.RedisUtil;
+import lombok.extern.slf4j.Slf4j;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.beans.factory.annotation.Value;
+import org.springframework.cloud.context.config.annotation.RefreshScope;
+import org.springframework.stereotype.Service;
+
+import java.util.List;
+import java.util.Map;
+
+/**
+ * <p>
+ * 删除oss原始资源记录 服务实现类
+ * </p>
+ *
+ * @author 
+ * @since 2023-03-29
+ */
+@RefreshScope
+@Slf4j
+@Service
+public class SceneCleanOrigServiceImpl extends ServiceImpl<ISceneCleanOrigMapper, SceneCleanOrig> implements ISceneCleanOrigService {
+
+    @Value("${scene.cleanOrig.month}")
+    private Integer cleanOrigMonth;
+    @Value("${scene.coldStorage.month}")
+    private Integer coldStorageMonth;
+    @Value("${scene.cleanDeleted.month}")
+    private Integer cleanDeletedMonth;
+    @Value("#{'${scene.cleanTestCamera.snCode:}'.split(',')}")
+    private List<String> testSnCodeList;
+    @Value("${scene.cleanTestCamera.month}")
+    private Integer cleanTestCameraMonth;
+    @Value("${fyun.bucket}")
+    private String bucket;
+    @Value("${fyun.coldBucket}")
+    private String coldBucket;
+    @Autowired
+    private ISceneColdStorageService sceneColdStorageService;
+
+
+    @Autowired
+    private ISceneProService sceneProService;
+    @Autowired
+    private IScenePlusService scenePlusService;
+    @Autowired
+    private IScenePlusExtService scenePlusExtService;
+    @Autowired
+    private FYunFileServiceInterface fYunFileService;
+    @Autowired
+    private RedisUtil redisUtil;
+    @Autowired
+    private ISceneColdStorageLogService sceneColdStorageLogService;
+
+//    @Override
+//    public void cleanOrigV4() {
+//        //查询所有计算时间超过限定时间的场景,计算成功、未被删除、最后一次计算后未被删除过的
+//        List<SceneBean> sceneBeans = scenePlusService.listCleanOrigScene(cleanOrigMonth);
+//        this.cleanOrig(sceneBeans);
+//    }
+//
+//    @Override
+//    public void cleanOrigV3() {
+//        //查询所有计算时间超过限定时间的场景,计算成功、未被删除
+//        List<SceneBean> sceneBeans = sceneProService.listCleanOrigScene(cleanOrigMonth);
+//        this.cleanOrig(sceneBeans);
+//
+//    }
+
+    private void cleanOrig(List<SceneBean> sceneBeans){
+        if(CollUtil.isEmpty(sceneBeans)){
+            return;
+        }
+        sceneBeans.parallelStream().forEach(scene->{
+            boolean lock = this.lock(scene.getDataSource());
+            try {
+                if(lock) {
+                    this.cleanOrigHandler(scene);
+                    this.saveLog(scene.getNum(), 1, CommonSuccessStatus.SUCCESS.code(), null);
+                }
+            }catch (Exception e){
+                log.error("删除原始资源失败,num : " + scene.getNum(), e);
+                this.saveLog(scene.getNum(), 1, CommonSuccessStatus.FAIL.code(), ExceptionUtil.stacktraceToString(e, 3000));
+            }finally {
+                this.releaseLock(scene.getDataSource());
+            }
+        });
+    }
+
+    private void cleanOrigHandler(SceneBean scene){
+        String dataSource = scene.getDataSource();
+        if(StrUtil.isNotEmpty(dataSource)){
+            String homePath = dataSource.replace(ConstantFilePath.BUILD_MODEL_PATH, ConstantFilePath.OSS_PREFIX);
+            //由于国内测试和生产用的bucket是同一个,这里需要做一个安全校验,保证不会删错
+            String fileContent = fYunFileService.getFileContent(homePath.concat("/").concat("data.fdage"));
+            if(StrUtil.isNotBlank(fileContent)){
+                JSONObject jsonObject = JSON.parseObject(fileContent);
+                String snCode = jsonObject.getJSONObject("cam").getString("uuid");
+                String uuidTime = jsonObject.getString("uuidtime");
+                if(StrUtil.isEmpty(snCode)
+                        || StrUtil.isEmpty(uuidTime)
+                        || !homePath.contains(snCode)
+                        || !homePath.contains(uuidTime)){
+                    throw new RuntimeException("dataSource与data.fdage文件不匹配");
+                }else{
+                    fYunFileService.deleteFolder(homePath);
+                }
+            }
+        }
+    }
+
+
+
+
+    private void saveLog(String num, int type, int status, String reason){
+        //清除旧的日志
+        this.remove(new LambdaQueryWrapper<SceneCleanOrig>().eq(SceneCleanOrig::getNum, num));
+        SceneCleanOrig sceneCleanOrig = new SceneCleanOrig();
+        sceneCleanOrig.setNum(num);
+        sceneCleanOrig.setType(type);
+        sceneCleanOrig.setState(status);
+        sceneCleanOrig.setReason(reason);
+        this.saveOrUpdate(sceneCleanOrig);
+    }
+
+    private boolean lock(String dataSource){
+        Map<String, String> property = SceneUtil.getPropertyFromDataSource(dataSource);
+        String homePath = property.get("homePath");
+        String uuid = property.get("uuid");
+
+        String uploadLock = redisUtil.get(String.format(RedisKey.SCENE_OSS_HOME_DIR_UPLOAD, uuid));
+        //场景正在上传,不删除
+        if(StrUtil.isNotEmpty(uploadLock)){
+            return false;
+        }
+        redisUtil.set(String.format(RedisKey.SCENE_OSS_HOME_DIR_DELETE, uuid), homePath, 8*60*60);
+        return true;
+    }
+
+    private void releaseLock(String dataSource){
+        Map<String, String> property = SceneUtil.getPropertyFromDataSource(dataSource);
+        String uuid = property.get("uuid");
+        redisUtil.del(String.format(RedisKey.SCENE_OSS_HOME_DIR_DELETE, uuid));
+    }
+
+
+    @Override
+    public void cleanOss4DeletedSceneV3() {
+        List<SceneBean> sceneBeans = sceneProService.listCleanOss4DeletedScene(cleanDeletedMonth);
+        this.cleanOrig4Delete(sceneBeans, false, 2);
+    }
+
+    @Override
+    public void cleanOss4DeletedSceneV4() {
+        //查询所有计算时间超过限定时间的场景,计算成功、未被删除、最后一次计算后未被删除过的
+        List<SceneBean> sceneBeans = scenePlusService.listCleanOss4DeletedScene(cleanDeletedMonth);
+        this.cleanOrig4Delete(sceneBeans, true, 2);
+    }
+
+    /**
+     * 删除已删除场景的原始资源及caches目录(v3场景不需要删除caches目录)
+     * @param sceneBeans
+     * @param deleteCaches 是否需要删除caches目录
+     */
+    private void cleanOrig4Delete(List<SceneBean> sceneBeans, boolean deleteCaches, Integer type){
+        if(CollUtil.isEmpty(sceneBeans)){
+            return;
+        }
+        sceneBeans.parallelStream().forEach(scene->{
+            try {
+                //删除caches文件
+                if(deleteCaches){
+                    this.deleteResultCaches(scene.getNum());
+                }
+                //删除原始资源
+                this.cleanOrigHandler(scene);
+
+                this.saveLog(scene.getNum(), type, CommonSuccessStatus.SUCCESS.code(), null);
+            }catch (Exception e){
+                log.error("删除已删除场景资源失败,num : " + scene.getNum(), e);
+                this.saveLog(scene.getNum(), type, CommonSuccessStatus.FAIL.code(), ExceptionUtil.stacktraceToString(e, 3000));
+            }
+        });
+    }
+
+    private void deleteResultCaches(String num){
+        String cachesPath = String.format(UploadFilePath.scene_result_data_path, num).concat("caches");
+        if(CollUtil.isEmpty(fYunFileService.listRemoteFiles(cachesPath))){
+            return;
+        }
+        fYunFileService.deleteFolder(cachesPath);
+    }
+
+//    @Override
+//    public void cleanOss4TestCameraV3() {
+//        List<Camera> cameras = cameraService.listBySnCodes(testSnCodeList);
+//        if(CollUtil.isEmpty(cameras)){
+//            return;
+//        }
+//        Set<Long> cameraIds = cameras.stream().map(Camera::getId).collect(Collectors.toSet());
+//        List<SceneBean> sceneBeans = sceneProService.listCleanOss4TestCamera(cameraIds, cleanTestCameraMonth);
+//        this.cleanOrig4Delete(sceneBeans, false, 3);
+//    }
+//
+//    @Override
+//    public void cleanOss4TestCameraV4() {
+//        List<Camera> cameras = cameraService.listBySnCodes(testSnCodeList);
+//        if(CollUtil.isEmpty(cameras)){
+//            return;
+//        }
+//        Set<Long> cameraIds = cameras.stream().map(Camera::getId).collect(Collectors.toSet());
+//        List<SceneBean> sceneBeans = scenePlusService.listCleanOss4TestCamera(cameraIds, cleanTestCameraMonth);
+//        this.cleanOrig4Delete(sceneBeans, true, 3);
+//    }
+
+    @Override
+    public void coldStorageHomeV3() {
+        //查询所有计算时间超过限定时间的场景,计算成功、未被删除
+        List<SceneBean> sceneBeans = sceneProService.listColdStorageScene(coldStorageMonth);
+        this.coldStorage(sceneBeans);
+    }
+
+    @Override
+    public void coldStorageHomeV4() {
+        //查询所有计算时间超过限定时间的场景,计算成功、未被删除
+        List<SceneBean> sceneBeans = scenePlusService.listColdStorageScene(coldStorageMonth);
+        this.coldStorage(sceneBeans);
+    }
+
+    private void coldStorage(List<SceneBean> sceneBeans){
+        if(CollUtil.isEmpty(sceneBeans)){
+            return;
+        }
+        sceneBeans.parallelStream().forEach(scene->{
+            boolean lock = this.lock(scene.getDataSource());
+            try {
+                if(lock) {
+                    this.coldStorageHandler(scene);
+                    sceneColdStorageLogService.saveLog(scene.getNum(), scene.getDataSource(), 1, 1, null);
+                    sceneColdStorageService.save(scene.getNum(), 1, coldBucket, bucket);
+                }
+            }catch (Exception e){
+                log.error("冷归档失败,num:{}" + scene.getNum(), e);
+                sceneColdStorageLogService.saveLog(scene.getNum(), scene.getDataSource(),1, CommonSuccessStatus.FAIL.code(), ExceptionUtil.stacktraceToString(e, 3000));
+            }finally {
+                this.releaseLock(scene.getDataSource());
+            }
+        });
+    }
+
+    private void coldStorageHandler(SceneBean scene){
+        String dataSource = scene.getDataSource();
+        if(StrUtil.isEmpty(dataSource) || dataSource.length() < 10) {
+            return;
+        }
+        String homePath = dataSource.replace(ConstantFilePath.BUILD_MODEL_PATH, ConstantFilePath.OSS_PREFIX);
+
+        //将文件复制到冷归档bucket
+        fYunFileService.copyFileBetweenBucket(bucket, homePath, coldBucket, homePath);
+
+        List<String> origList = fYunFileService.listRemoteFiles(bucket, homePath);
+        List<String> coldList = fYunFileService.listRemoteFiles(coldBucket, homePath);
+        if(origList.size() != coldList.size()){
+            throw new RuntimeException("复制文件到冷归档bucket失败");
+        }
+
+        //删除标准bucket文件
+        fYunFileService.deleteFolder(homePath);
+    }
+}

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

@@ -0,0 +1,33 @@
+package com.fdkankan.job.service.impl;
+
+import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
+import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
+import com.fdkankan.job.entity.SceneColdStorageLog;
+import com.fdkankan.job.mapper.ISceneColdStorageLogMapper;
+import com.fdkankan.job.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);
+    }
+
+}

+ 39 - 0
src/main/java/com/fdkankan/job/service/impl/SceneColdStorageServiceImpl.java

@@ -0,0 +1,39 @@
+package com.fdkankan.job.service.impl;
+
+import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
+import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
+import com.fdkankan.job.entity.SceneColdStorage;
+import com.fdkankan.job.mapper.ISceneColdStorageMapper;
+import com.fdkankan.job.service.ISceneColdStorageService;
+import com.fdkankan.scene.entity.SceneColdStorage;
+import com.fdkankan.scene.mapper.ISceneColdStorageMapper;
+import com.fdkankan.scene.service.ISceneColdStorageService;
+import org.springframework.stereotype.Service;
+
+import java.util.Objects;
+
+/**
+ * <p>
+ * 场景封存状态表 服务实现类
+ * </p>
+ *
+ * @author 
+ * @since 2023-07-25
+ */
+@Service
+public class SceneColdStorageServiceImpl extends ServiceImpl<ISceneColdStorageMapper, SceneColdStorage> implements ISceneColdStorageService {
+
+    @Override
+    public void save(String num, Integer state, String coldBucket, String standarBucket) {
+
+        SceneColdStorage sceneColdStorage = this.getOne(new LambdaQueryWrapper<SceneColdStorage>().eq(SceneColdStorage::getNum, num));
+        if(Objects.isNull(sceneColdStorage)){
+            sceneColdStorage = new SceneColdStorage();
+        }
+        sceneColdStorage.setNum(num);
+        sceneColdStorage.setState(state);
+        sceneColdStorage.setColdBucket(coldBucket);
+        sceneColdStorage.setBucket(standarBucket);
+        this.saveOrUpdate(sceneColdStorage);
+    }
+}

+ 22 - 0
src/main/java/com/fdkankan/job/service/impl/ScenePlusServiceImpl.java

@@ -1,11 +1,18 @@
 package com.fdkankan.job.service.impl;
 
+import cn.hutool.core.date.DateField;
+import cn.hutool.core.date.DateUtil;
+import com.fdkankan.job.dto.SceneBean;
 import com.fdkankan.job.entity.ScenePlus;
 import com.fdkankan.job.mapper.IScenePlusMapper;
 import com.fdkankan.job.service.IScenePlusService;
 import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
 import org.springframework.stereotype.Service;
 
+import java.util.Calendar;
+import java.util.Date;
+import java.util.List;
+
 /**
  * <p>
  * 场景主表 服务实现类
@@ -17,4 +24,19 @@ import org.springframework.stereotype.Service;
 @Service
 public class ScenePlusServiceImpl extends ServiceImpl<IScenePlusMapper, ScenePlus> implements IScenePlusService {
 
+    @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);
+    }
+
+    @Override
+    public List<SceneBean> listCleanOss4DeletedScene(int month) {
+        Date time = Calendar.getInstance().getTime();
+        time = DateUtil.beginOfDay(DateUtil.offset(time, DateField.MONTH, -month));
+        return this.baseMapper.selectCleanOrigSceneDeleted(time);
+    }
+
+
 }

+ 21 - 0
src/main/java/com/fdkankan/job/service/impl/SceneProServiceImpl.java

@@ -1,11 +1,18 @@
 package com.fdkankan.job.service.impl;
 
+import cn.hutool.core.date.DateField;
+import cn.hutool.core.date.DateUtil;
+import com.fdkankan.job.dto.SceneBean;
 import com.fdkankan.job.entity.ScenePro;
 import com.fdkankan.job.mapper.ISceneProMapper;
 import com.fdkankan.job.service.ISceneProService;
 import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
 import org.springframework.stereotype.Service;
 
+import java.util.Calendar;
+import java.util.Date;
+import java.util.List;
+
 /**
  * <p>
  * pro场景表 服务实现类
@@ -17,4 +24,18 @@ import org.springframework.stereotype.Service;
 @Service
 public class SceneProServiceImpl extends ServiceImpl<ISceneProMapper, ScenePro> implements ISceneProService {
 
+    @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);
+    }
+
+    @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);
+    }
+
 }

+ 20 - 0
src/main/resources/mapper/job/ScenePlusMapper.xml

@@ -2,4 +2,24 @@
 <!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
 <mapper namespace="com.fdkankan.job.mapper.IScenePlusMapper">
 
+    <select id="selectColdStorageScene" resultType="com.fdkankan.job.dto.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 c where c.rec_status = 'A' AND c.`state` = 1 and c.num = plus.num)
+        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>
+
+    <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>
+
+
 </mapper>

+ 18 - 0
src/main/resources/mapper/job/SceneProMapper.xml

@@ -2,4 +2,22 @@
 <!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
 <mapper namespace="com.fdkankan.job.mapper.ISceneProMapper">
 
+    <select id="selectColdStorageScene" resultType="com.fdkankan.job.dto.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 c where c.rec_status = 'A' AND c.`state` = 1 and c.num = plus.num)
+        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>
+
+    <select id="listCleanOss4DeletedScene" resultType="com.fdkankan.job.dto.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>
+
 </mapper>