package com.fdkankan.scene.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.fdkankan.common.constant.CommonStatus;
import com.fdkankan.common.constant.CommonSuccessStatus;
import com.fdkankan.common.constant.OperationType;
import com.fdkankan.fyun.face.FYunFileServiceInterface;
import com.fdkankan.model.constants.ConstantFilePath;
import com.fdkankan.scene.bean.SceneBean;
import com.fdkankan.scene.entity.SceneCleanOrig;
import com.fdkankan.scene.mapper.ISceneCleanOrigMapper;
import com.fdkankan.scene.mapper.IScenePlusExtMapper;
import com.fdkankan.scene.service.ISceneCleanOrigService;
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
import com.fdkankan.scene.service.IScenePlusExtService;
import com.fdkankan.scene.service.IScenePlusService;
import com.fdkankan.scene.service.ISceneProService;
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 sun.font.TextRecord;
import java.util.Date;
import java.util.List;
import java.util.Objects;
/**
*
* 删除oss原始资源记录 服务实现类
*
*
* @author
* @since 2023-03-29
*/
@RefreshScope
@Slf4j
@Service
public class SceneCleanOrigServiceImpl extends ServiceImpl implements ISceneCleanOrigService {
@Value("${scene.cleanOrig.month}")
private Integer cleanOrigMonth;
@Autowired
private ISceneProService sceneProService;
@Autowired
private IScenePlusService scenePlusService;
@Autowired
private IScenePlusExtService scenePlusExtService;
@Autowired
private FYunFileServiceInterface fYunFileService;
@Override
public void cleanOrigV4() {
//查询所有计算时间超过限定时间的场景,计算成功、未被删除、最后一次计算后未被删除过的
List sceneBeans = scenePlusService.listCleanOrigScene(cleanOrigMonth);
if(CollUtil.isEmpty(sceneBeans)){
return;
}
sceneBeans.parallelStream().forEach(scene->{
this.cleanOrigHandler(scene);
});
}
@Override
public void cleanOrigV3() {
//查询所有计算时间超过限定时间的场景,计算成功、未被删除
List sceneBeans = sceneProService.listCleanOrigScene(cleanOrigMonth);
if(CollUtil.isEmpty(sceneBeans)){
return;
}
sceneBeans.parallelStream().forEach(scene->{
this.cleanOrigHandler(scene);
});
}
private void cleanOrigHandler(SceneBean scene){
try {
int successStatus = CommonSuccessStatus.SUCCESS.code();
String reason = null;
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)){
successStatus = CommonSuccessStatus.FAIL.code();
reason = "dataSource与data.fdage文件不匹配";
}else{
fYunFileService.deleteFolder(homePath);
}
}
}
this.saveLog(scene.getNum(), successStatus, reason);
}catch (Exception e){
log.error("删除原始资源失败,num : " + scene.getNum(), e);
this.saveLog(scene.getNum(), CommonSuccessStatus.FAIL.code(), ExceptionUtil.stacktraceToString(e, 3000));
}
}
private void saveLog(String num, int status, String reason){
//清除旧的日志
this.remove(new LambdaQueryWrapper().eq(SceneCleanOrig::getNum, num));
SceneCleanOrig sceneCleanOrig = new SceneCleanOrig();
sceneCleanOrig.setNum(num);
sceneCleanOrig.setState(status);
sceneCleanOrig.setReason(reason);
this.saveOrUpdate(sceneCleanOrig);
}
}