//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.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
//import com.fdkankan.common.constant.CommonSuccessStatus;
//import com.fdkankan.fyun.face.FYunFileServiceInterface;
//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 com.fdkankan.scene.bean.SceneBean;
//import com.fdkankan.scene.entity.Camera;
//import com.fdkankan.scene.entity.SceneCleanOrig;
//import com.fdkankan.scene.mapper.ISceneCleanOrigMapper;
//import com.fdkankan.scene.service.*;
//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;
//import java.util.Set;
//import java.util.stream.Collectors;
//
///**
// *
// * 删除oss原始资源记录 服务实现类
// *
// *
// * @author
// * @since 2023-03-29
// */
//@RefreshScope
//@Slf4j
//@Service
//public class SceneCleanOrigServiceImpl extends ServiceImpl 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 testSnCodeList;
// @Value("${scene.cleanTestCamera.month}")
// private Integer cleanTestCameraMonth;
// @Value("${fyun.bucket}")
// private String bucket;
// @Value("${fyun.coldBucket}")
// private String coldBucket;
// @Autowired
// private ICameraService cameraService;
// @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 sceneBeans = scenePlusService.listCleanOrigScene(cleanOrigMonth);
// this.cleanOrig(sceneBeans);
// }
//
// @Override
// public void cleanOrigV3() {
// //查询所有计算时间超过限定时间的场景,计算成功、未被删除
// List sceneBeans = sceneProService.listCleanOrigScene(cleanOrigMonth);
// this.cleanOrig(sceneBeans);
//
// }
//
// private void cleanOrig(List 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().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 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 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 sceneBeans = sceneProService.listCleanOss4DeletedScene(cleanDeletedMonth);
// this.cleanOrig4Delete(sceneBeans, false, 2);
// }
//
// @Override
// public void cleanOss4DeletedSceneV4() {
// //查询所有计算时间超过限定时间的场景,计算成功、未被删除、最后一次计算后未被删除过的
// List sceneBeans = scenePlusService.listCleanOss4DeletedScene(cleanDeletedMonth);
// this.cleanOrig4Delete(sceneBeans, true, 2);
// }
//
// /**
// * 删除已删除场景的原始资源及caches目录(v3场景不需要删除caches目录)
// * @param sceneBeans
// * @param deleteCaches 是否需要删除caches目录
// */
// private void cleanOrig4Delete(List 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 cameras = cameraService.listBySnCodes(testSnCodeList);
// if(CollUtil.isEmpty(cameras)){
// return;
// }
// Set cameraIds = cameras.stream().map(Camera::getId).collect(Collectors.toSet());
// List sceneBeans = sceneProService.listCleanOss4TestCamera(cameraIds, cleanTestCameraMonth);
// this.cleanOrig4Delete(sceneBeans, false, 3);
// }
//
// @Override
// public void cleanOss4TestCameraV4() {
// List cameras = cameraService.listBySnCodes(testSnCodeList);
// if(CollUtil.isEmpty(cameras)){
// return;
// }
// Set cameraIds = cameras.stream().map(Camera::getId).collect(Collectors.toSet());
// List sceneBeans = scenePlusService.listCleanOss4TestCamera(cameraIds, cleanTestCameraMonth);
// this.cleanOrig4Delete(sceneBeans, true, 3);
// }
//
// @Override
// public void coldStorageHomeV3() {
// //查询所有计算时间超过限定时间的场景,计算成功、未被删除
// List sceneBeans = sceneProService.listColdStorageScene(coldStorageMonth);
// this.coldStorage(sceneBeans);
// }
//
// @Override
// public void coldStorageHomeV4() {
// //查询所有计算时间超过限定时间的场景,计算成功、未被删除
// List sceneBeans = scenePlusService.listColdStorageScene(coldStorageMonth);
// this.coldStorage(sceneBeans);
// }
//
// private void coldStorage(List 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 origList = fYunFileService.listRemoteFiles(bucket, homePath);
// List coldList = fYunFileService.listRemoteFiles(coldBucket, homePath);
// if(origList.size() != coldList.size()){
// throw new RuntimeException("复制文件到冷归档bucket失败");
// }
//
// //删除标准bucket文件
// fYunFileService.deleteFolder(homePath);
// }
//}