Pārlūkot izejas kodu

添加资源删除逻辑

tianboguang 2 gadi atpakaļ
vecāks
revīzija
6f0883b284

+ 20 - 0
src/main/java/com/fdkankan/ucenter/bean/SceneBean.java

@@ -0,0 +1,20 @@
+package com.fdkankan.ucenter.bean;
+
+import lombok.Data;
+
+/**
+ * <p>
+ * TODO
+ * </p>
+ *
+ * @author dengsixing
+ * @since 2022/10/9
+ **/
+@Data
+public class SceneBean {
+
+    private String num;
+
+    private String dataSource;
+
+}

+ 63 - 0
src/main/java/com/fdkankan/ucenter/bean/SceneClean.java

@@ -0,0 +1,63 @@
+package com.fdkankan.ucenter.bean;
+
+import com.baomidou.mybatisplus.annotation.IdType;
+import com.baomidou.mybatisplus.annotation.TableField;
+import com.baomidou.mybatisplus.annotation.TableId;
+import com.baomidou.mybatisplus.annotation.TableLogic;
+import com.baomidou.mybatisplus.annotation.TableName;
+import java.io.Serializable;
+import java.util.Date;
+import lombok.Getter;
+import lombok.Setter;
+
+/**
+ * <p>
+ * 
+ * </p>
+ *
+ * @author 
+ * @since 2022-10-09
+ */
+@Getter
+@Setter
+@TableName("t_scene_clean")
+public class SceneClean implements Serializable {
+
+    private static final long serialVersionUID = 1L;
+
+    @TableId(value = "id", type = IdType.AUTO)
+    private Long id;
+
+    /**
+     * 场景码
+     */
+    @TableField("num")
+    private String num;
+
+    /**
+     * 是否已清除资源(0-否,1-是)
+     */
+    @TableField("state")
+    private Integer state;
+
+    /**
+     * 创建时间
+     */
+    @TableField("create_time")
+    private Date createTime;
+
+    /**
+     * 更新时间
+     */
+    @TableField("update_time")
+    private Date updateTime;
+
+    /**
+     * A-有效,I-无效
+     */
+    @TableLogic(value = "A", delval = "I")
+    @TableField("rec_status")
+    private String recStatus;
+
+
+}

+ 12 - 0
src/main/java/com/fdkankan/ucenter/controller/inner/InnerController.java

@@ -63,6 +63,18 @@ public class InnerController extends BaseController {
      * 查询场景资源路径
      */
     @CheckInnerApiPermit
+    @GetMapping("/getAllSceneDbInfo")
+    public Result getAllSceneDbInfo(String num){
+        if(ObjectUtils.isEmpty(num)){
+            return Result.failure("请输入场景码");
+        }
+        return innerService.querySceneNum(num);
+    }
+
+    /**
+     * 查询场景资源路径
+     */
+    @CheckInnerApiPermit
     @GetMapping("/downloadCapture")
     public Result downloadCapture(String num){
         if(ObjectUtils.isEmpty(num)){

+ 26 - 0
src/main/java/com/fdkankan/ucenter/mapper/ISceneCleanMapper.java

@@ -0,0 +1,26 @@
+package com.fdkankan.ucenter.mapper;
+
+import com.baomidou.mybatisplus.core.mapper.BaseMapper;
+import com.fdkankan.ucenter.bean.SceneBean;
+import com.fdkankan.ucenter.bean.SceneClean;
+import org.apache.ibatis.annotations.Mapper;
+import org.apache.ibatis.annotations.Param;
+
+import java.util.Date;
+import java.util.List;
+
+/**
+ * <p>
+ *  Mapper 接口
+ * </p>
+ *
+ * @author 
+ * @since 2022-10-09
+ */
+@Mapper
+public interface ISceneCleanMapper extends BaseMapper<SceneClean> {
+
+    List<SceneBean> selectNeadCleanScene(@Param("index") long index, @Param("size") int size, @Param("time") Date time);
+
+    List<SceneClean> findAllByDateSource(@Param("dataSource") String dataSource);
+}

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

@@ -0,0 +1,24 @@
+package com.fdkankan.ucenter.service;
+
+import com.baomidou.mybatisplus.extension.service.IService;
+import com.fdkankan.ucenter.bean.SceneBean;
+import com.fdkankan.ucenter.bean.SceneClean;
+
+import java.util.Date;
+import java.util.List;
+
+/**
+ * <p>
+ *  服务类
+ * </p>
+ *
+ * @author 
+ * @since 2022-10-09
+ */
+public interface ISceneCleanService extends IService<SceneClean> {
+
+    void sceneCleanResource();
+
+    List<SceneBean> selectNeadCleanScene(long index, int size, Date time);
+
+}

+ 1 - 3
src/main/java/com/fdkankan/ucenter/service/impl/InnerServiceImpl.java

@@ -19,6 +19,7 @@ import org.apache.commons.lang3.ObjectUtils;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.beans.factory.annotation.Value;
 import org.springframework.stereotype.Service;
+import org.springframework.web.client.RestTemplate;
 
 import java.io.File;
 import java.util.Objects;
@@ -35,9 +36,6 @@ import java.util.Objects;
 @Service
 public class InnerServiceImpl implements IInnerService {
 
-    @Value("${inner.customToken}")
-    private String customToken;
-
     @Autowired
     private ISceneProService sceneProService;
     @Autowired

+ 117 - 0
src/main/java/com/fdkankan/ucenter/service/impl/SceneCleanServiceImpl.java

@@ -0,0 +1,117 @@
+package com.fdkankan.ucenter.service.impl;
+
+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.CommonStatus;
+import com.fdkankan.common.util.DateUtil;
+import com.fdkankan.common.util.FileUtils;
+import com.fdkankan.redis.constant.RedisKey;
+import com.fdkankan.redis.constant.RedisLockKey;
+import com.fdkankan.redis.util.RedisLockUtil;
+import com.fdkankan.ucenter.bean.SceneBean;
+import com.fdkankan.ucenter.bean.SceneClean;
+import com.fdkankan.ucenter.mapper.ISceneCleanMapper;
+import com.fdkankan.ucenter.service.ISceneCleanService;
+import lombok.extern.slf4j.Slf4j;
+import org.apache.commons.lang3.StringUtils;
+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 org.springframework.transaction.annotation.Transactional;
+import org.springframework.util.CollectionUtils;
+
+import java.util.*;
+import java.util.stream.Collectors;
+
+/**
+ * <p>
+ *  服务实现类
+ * </p>
+ *
+ * @author 
+ * @since 2022-10-09
+ */
+@RefreshScope
+@Service
+@Slf4j
+public class SceneCleanServiceImpl extends ServiceImpl<ISceneCleanMapper, SceneClean> implements ISceneCleanService {
+
+    @Autowired
+    private RedisLockUtil redisLockUtil;
+
+    @Value("${scene.clean.size:10}")
+    private Integer sceneCleanSize;
+
+    @Transactional
+    @Override
+    public void sceneCleanResource(){
+        // 获取redis 锁
+        boolean lock = redisLockUtil.lock(RedisLockKey.LOCK_SCENE_CLEAN, RedisKey.EXPIRE_TIME_2_HOUR);
+        if(!lock){
+            log.warn("未获取到清除资源锁,退出任务!");
+            return;
+        }
+
+        Date time = DateUtil.delay(Calendar.getInstance().getTime(), -7, Calendar.MONTH);
+        time.setHours(0);
+        time.setMinutes(0);
+        time.setSeconds(0);
+
+        //查询需要清理资源的场景
+        List<SceneBean> sceneProEntityList = selectNeadCleanScene(0,sceneCleanSize, time);
+        //如果查出来的场景集合是空,证明已经没有场景资源需要删除,则需要把查询下表删除,等待下一次定时任务执行
+        if (CollectionUtils.isEmpty(sceneProEntityList)) {
+            return;
+        }
+        List<String> numList = sceneProEntityList.parallelStream().map(SceneBean::getNum).collect(Collectors.toList());
+        List<SceneClean> insertList = new ArrayList<>();
+        List<SceneClean> updateList = this.list(new LambdaQueryWrapper<SceneClean>().in(SceneClean::getNum, numList));
+        Set<String> updateSet = updateList.stream().map(SceneClean::getNum).collect(Collectors.toSet());
+        sceneProEntityList.stream().forEach(scene -> {
+            if (StringUtils.isNotBlank(scene.getDataSource())) {
+                // 查询该资源的最新计算时间
+                List<SceneClean> scenes = findAllByDateSource(scene.getDataSource());
+                if (scenes.get(0).getCreateTime().before(time)) {
+                    try {
+                        FileUtils.deleteDirectory(scene.getDataSource());
+                    } catch (Exception e) {
+                        e.printStackTrace();
+                        updateSet.remove(scene.getNum());
+                        return;
+                    }
+                }
+            }
+            if (!updateSet.contains(scene.getNum())) {
+                SceneClean sceneCleanEntity = new SceneClean();
+                sceneCleanEntity.setState(1);
+                sceneCleanEntity.setNum(scene.getNum());
+                sceneCleanEntity.setCreateTime(new Date());
+                sceneCleanEntity.setUpdateTime(new Date());
+                sceneCleanEntity.setRecStatus("A");
+                insertList.add(sceneCleanEntity);
+            }
+        });
+
+        //写库
+        if(!CollectionUtils.isEmpty(insertList)){
+            this.saveBatch(insertList);
+        }
+        if(!CollectionUtils.isEmpty(updateSet)){
+            this.update(new LambdaUpdateWrapper<SceneClean>().set(SceneClean::getState,
+                    CommonStatus.YES.code()).in(SceneClean::getNum, updateSet));
+        }
+
+        redisLockUtil.unlock(RedisLockKey.LOCK_SCENE_CLEAN);
+    }
+
+    private List<SceneClean> findAllByDateSource(String dataSource) {
+        return this.baseMapper.findAllByDateSource(dataSource);
+    }
+
+    @Override
+    public List<SceneBean> selectNeadCleanScene(long index, int size, Date time) {
+        return this.baseMapper.selectNeadCleanScene(index, size, time);
+    }
+}

+ 25 - 12
src/main/java/com/fdkankan/ucenter/task/TaskService.java

@@ -1,28 +1,23 @@
 package com.fdkankan.ucenter.task;
 
-import cn.hutool.core.collection.CollUtil;
 import com.fdkankan.common.util.DateUtil;
 import com.fdkankan.common.util.FileUtils;
 import com.fdkankan.redis.util.RedisUtil;
 import com.fdkankan.ucenter.common.RedisKeyUtil;
 import com.fdkankan.ucenter.common.StatisticsUtil;
 import com.fdkankan.ucenter.constant.QrCodeFilePath;
-import java.io.File;
-import java.util.Date;
-import java.util.Map;
-import java.util.Objects;
-
-import com.fdkankan.ucenter.service.IOrderService;
-import com.fdkankan.ucenter.service.ISceneProService;
-import com.fdkankan.ucenter.service.ISceneStatisticsService;
-import com.fdkankan.ucenter.service.IUserIncrementService;
-import lombok.extern.slf4j.Slf4j;
+import com.fdkankan.ucenter.service.*;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.scheduling.annotation.Scheduled;
 import org.springframework.stereotype.Component;
 
+import java.io.File;
+import java.util.Date;
+import java.util.Map;
+import java.util.Objects;
+
 @Component
 public class TaskService {
 
@@ -31,7 +26,10 @@ public class TaskService {
     @Autowired
     RedisUtil redisUtil;
     @Autowired
-    ISceneProService sceneProService;
+    private ISceneProService sceneProService;
+
+    @Autowired
+    private ISceneCleanService sceneCleanService;
 
     @Scheduled(cron = "0 */10 * * * ?")
     public void delLoginQrCode(){
@@ -142,5 +140,20 @@ public class TaskService {
         }
     }
 
+    /**
+     * 清理场景nas资源
+     * 执行时间:每天凌晨
+     * 删除条件:场景计算时间大于6个月且未删除过资源
+     */
+    @Scheduled(cron = "0 0 0/2 * * ?")
+    public void sceneCleanResource() {
+        log.info("每天凌晨12:00开始执行定时任务:清除场景计算目录");
+        try {
+            sceneCleanService.sceneCleanResource();
+        } catch (Exception e) {
+            log.error(e.getMessage());
+        }
+    }
+
 
 }

+ 41 - 0
src/main/resources/mapper/ucenter/SceneCleanMapper.xml

@@ -0,0 +1,41 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
+<mapper namespace="com.fdkankan.ucenter.mapper.ISceneCleanMapper">
+
+  <select id="selectNeadCleanScene" resultType="com.fdkankan.ucenter.bean.SceneBean">
+    select t.num, t.data_source from (
+      SELECT p.num, p.data_source
+      FROM t_scene_pro p
+      WHERE p.status != 0 and p.is_upgrade != 1 and p.create_time <![CDATA[ <= ]]> #{time}
+      and p.num NOT IN (
+          SELECT c.num FROM t_scene_clean c WHERE c.state = 1
+      )
+
+      union
+
+      SELECT p.num, e.data_source
+      FROM t_scene_plus p
+      left join t_scene_plus_ext e on p.id = e.plus_id
+      WHERE p.scene_status != 0 and e.algorithm_time <![CDATA[ <= ]]> #{time}
+      and p.num NOT IN (
+          SELECT c.num FROM t_scene_clean c WHERE c.state = 1
+      )
+    ) t
+    LIMIT #{index},#{size}
+  </select>
+
+  <select id="findAllByDateSource" resultType="com.fdkankan.ucenter.bean.SceneClean">
+    select t.create_time from (
+    SELECT p.create_time
+    FROM t_scene_pro p
+    WHERE p.data_source = #{dataSource}
+
+    union
+
+    SELECT p.algorithm_time
+    FROM t_scene_plus_ext p
+    WHERE p.data_source = #{dataSource}
+    ) t order by create_time desc
+  </select>
+
+</mapper>