package com.fdkankan.scene.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.model.constants.ConstantFilePath;
import com.fdkankan.model.utils.CreateObjUtil;
import com.fdkankan.redis.constant.RedisKey;
import com.fdkankan.redis.constant.RedisLockKey;
import com.fdkankan.redis.util.RedisLockUtil;
import com.fdkankan.scene.bean.SceneBean;
import com.fdkankan.scene.entity.SceneClean;
import com.fdkankan.scene.mapper.ISceneCleanMapper;
import com.fdkankan.scene.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;
/**
*
* 服务实现类
*
*
* @author
* @since 2022-10-09
*/
@RefreshScope
@Service
@Slf4j
public class SceneCleanServiceImpl extends ServiceImpl 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 sceneProEntityList = selectNeadCleanScene(0,sceneCleanSize, time);
//如果查出来的场景集合是空,证明已经没有场景资源需要删除,则需要把查询下表删除,等待下一次定时任务执行
if (CollectionUtils.isEmpty(sceneProEntityList)) {
return;
}
List numList = sceneProEntityList.parallelStream().map(SceneBean::getNum).collect(Collectors.toList());
List insertList = new ArrayList<>();
List updateList = this.list(new LambdaQueryWrapper().in(SceneClean::getNum, numList));
Set updateSet = updateList.stream().map(SceneClean::getNum).collect(Collectors.toSet());
sceneProEntityList.stream().forEach(scene -> {
if (StringUtils.isNotBlank(scene.getDataSource())) {
// 查询该资源的最新计算时间
List scenes = findAllByDateSource(scene.getDataSource());
if (scenes.get(0).getCreateTime().before(time)) {
try {
CreateObjUtil.deleteFile(scene.getDataSource().replace(ConstantFilePath.BUILD_MODEL_PATH, "/").replace(ConstantFilePath.BUILD_MODEL_LASER_PATH, "/"));
} 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().set(SceneClean::getState,
CommonStatus.YES.code()).in(SceneClean::getNum, updateSet));
}
redisLockUtil.unlock(RedisLockKey.LOCK_SCENE_CLEAN);
}
private List findAllByDateSource(String dataSource) {
return this.baseMapper.findAllByDateSource(dataSource);
}
@Override
public List selectNeadCleanScene(long index, int size, Date time) {
return this.baseMapper.selectNeadCleanScene(index, size, time);
}
}