You've already forked FrameTour-BE
Merge branch 'latest'
This commit is contained in:
@@ -25,8 +25,6 @@ import java.io.File;
|
|||||||
)
|
)
|
||||||
public class UploadStage extends AbstractPipelineStage<PhotoProcessContext> {
|
public class UploadStage extends AbstractPipelineStage<PhotoProcessContext> {
|
||||||
|
|
||||||
private static final String DEFAULT_STORAGE = "assets-ext";
|
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public String getName() {
|
public String getName() {
|
||||||
return "UploadStage";
|
return "UploadStage";
|
||||||
@@ -39,17 +37,11 @@ public class UploadStage extends AbstractPipelineStage<PhotoProcessContext> {
|
|||||||
return StageResult.failed("没有可上传的文件");
|
return StageResult.failed("没有可上传的文件");
|
||||||
}
|
}
|
||||||
|
|
||||||
IStorageAdapter adapter = context.getStorageAdapter();
|
IStorageAdapter adapter;
|
||||||
boolean usingDefaultStorage = false;
|
try {
|
||||||
|
adapter = StorageFactory.use();
|
||||||
if (adapter == null) {
|
} catch (Exception e) {
|
||||||
log.debug("未配置存储适配器,使用默认存储: {}", DEFAULT_STORAGE);
|
return StageResult.failed("无法获取存储: " + e.getMessage(), e);
|
||||||
try {
|
|
||||||
adapter = StorageFactory.use(DEFAULT_STORAGE);
|
|
||||||
usingDefaultStorage = true;
|
|
||||||
} catch (Exception e) {
|
|
||||||
return StageResult.failed("无法获取默认存储: " + e.getMessage(), e);
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
try {
|
try {
|
||||||
@@ -57,32 +49,10 @@ public class UploadStage extends AbstractPipelineStage<PhotoProcessContext> {
|
|||||||
context.setResultUrl(uploadedUrl);
|
context.setResultUrl(uploadedUrl);
|
||||||
|
|
||||||
log.info("文件上传成功: {}", uploadedUrl);
|
log.info("文件上传成功: {}", uploadedUrl);
|
||||||
|
|
||||||
if (usingDefaultStorage) {
|
|
||||||
return StageResult.degraded("降级: 使用默认存储 " + DEFAULT_STORAGE);
|
|
||||||
}
|
|
||||||
|
|
||||||
return StageResult.success("已上传");
|
return StageResult.success("已上传");
|
||||||
|
|
||||||
} catch (Exception e) {
|
} catch (Exception e) {
|
||||||
log.error("文件上传失败", e);
|
log.error("文件上传失败", e);
|
||||||
|
|
||||||
if (!usingDefaultStorage) {
|
|
||||||
log.warn("尝试降级到默认存储");
|
|
||||||
try {
|
|
||||||
IStorageAdapter defaultAdapter = StorageFactory.use(DEFAULT_STORAGE);
|
|
||||||
String uploadedUrl = uploadFile(defaultAdapter, fileToUpload);
|
|
||||||
context.setResultUrl(uploadedUrl);
|
|
||||||
|
|
||||||
log.info("降级上传成功: {}", uploadedUrl);
|
|
||||||
return StageResult.degraded("降级: 使用默认存储 " + DEFAULT_STORAGE);
|
|
||||||
|
|
||||||
} catch (Exception fallbackEx) {
|
|
||||||
log.error("降级上传也失败", fallbackEx);
|
|
||||||
return StageResult.failed("上传失败(包括降级): " + fallbackEx.getMessage(), fallbackEx);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
return StageResult.failed("上传失败: " + e.getMessage(), e);
|
return StageResult.failed("上传失败: " + e.getMessage(), e);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -468,12 +468,14 @@ public class PuzzleGenerateServiceImpl implements IPuzzleGenerateService {
|
|||||||
// 上传到OSS
|
// 上传到OSS
|
||||||
try (FileInputStream fis = new FileInputStream(qrcode)) {
|
try (FileInputStream fis = new FileInputStream(qrcode)) {
|
||||||
String fileName = String.format("qrcode_%d.jpg", faceId);
|
String fileName = String.format("qrcode_%d.jpg", faceId);
|
||||||
boolean exists = StorageFactory.use().isExists("puzzle", "wechat_qrcode", fileName);
|
var storageAdapter = StorageFactory.use();
|
||||||
|
boolean exists = storageAdapter.isExists("puzzle", "wechat_qrcode", fileName);
|
||||||
if (exists) {
|
if (exists) {
|
||||||
log.debug("微信小程序二维码已存在, 不重复上传: faceId={}, url={}", faceId, StorageFactory.use().getUrl("puzzle", "wechat_qrcode", fileName));
|
String url = storageAdapter.getUrl("puzzle", "wechat_qrcode", fileName);
|
||||||
return StorageFactory.use().getUrl("puzzle", "wechat_qrcode", fileName);
|
log.debug("微信小程序二维码已存在, 不重复上传: faceId={}, url={}", faceId, url);
|
||||||
|
return url;
|
||||||
}
|
}
|
||||||
return StorageFactory.use().uploadFile(
|
return storageAdapter.uploadFile(
|
||||||
"image/jpeg",
|
"image/jpeg",
|
||||||
fis,
|
fis,
|
||||||
"puzzle",
|
"puzzle",
|
||||||
|
|||||||
@@ -19,7 +19,6 @@ import com.ycwl.basic.pricing.enums.VoucherDiscountType;
|
|||||||
import com.ycwl.basic.pricing.service.IVoucherService;
|
import com.ycwl.basic.pricing.service.IVoucherService;
|
||||||
import com.ycwl.basic.storage.StorageFactory;
|
import com.ycwl.basic.storage.StorageFactory;
|
||||||
import com.ycwl.basic.storage.adapters.IStorageAdapter;
|
import com.ycwl.basic.storage.adapters.IStorageAdapter;
|
||||||
import com.ycwl.basic.storage.exceptions.StorageUnsupportedException;
|
|
||||||
import lombok.extern.slf4j.Slf4j;
|
import lombok.extern.slf4j.Slf4j;
|
||||||
import org.springframework.beans.factory.annotation.Autowired;
|
import org.springframework.beans.factory.annotation.Autowired;
|
||||||
import org.springframework.data.redis.core.RedisTemplate;
|
import org.springframework.data.redis.core.RedisTemplate;
|
||||||
@@ -154,14 +153,7 @@ public class SourceRepository {
|
|||||||
.build();
|
.build();
|
||||||
context.enableStage("image_sr");
|
context.enableStage("image_sr");
|
||||||
context.enableStage("image_enhance");
|
context.enableStage("image_enhance");
|
||||||
ScenicConfigManager configManager = scenicRepository.getScenicConfigManager(source.getScenicId());
|
IStorageAdapter adapter = StorageFactory.use();
|
||||||
IStorageAdapter adapter;
|
|
||||||
try {
|
|
||||||
adapter = StorageFactory.get(configManager.getString("store_type"));
|
|
||||||
adapter.loadConfig(configManager.getObject("store_config_json", Map.class));
|
|
||||||
} catch (StorageUnsupportedException ignored) {
|
|
||||||
adapter = StorageFactory.use("assets-ext");
|
|
||||||
}
|
|
||||||
context.setStorageAdapter(adapter);
|
context.setStorageAdapter(adapter);
|
||||||
|
|
||||||
// 2. 设置结果URL回调 - 更新source记录
|
// 2. 设置结果URL回调 - 更新source记录
|
||||||
|
|||||||
@@ -145,7 +145,6 @@ public class AppStatisticsServiceImpl implements AppStatisticsService {
|
|||||||
|
|
||||||
@Override
|
@Override
|
||||||
public ApiResponse<AppStatisticsFunnelVO> userConversionFunnel(CommonQueryReq query) {
|
public ApiResponse<AppStatisticsFunnelVO> userConversionFunnel(CommonQueryReq query) {
|
||||||
String redisKey = "statistics:tmp_cache:"+query.getScenicId();
|
|
||||||
AppStatisticsFunnelVO vo = new AppStatisticsFunnelVO();
|
AppStatisticsFunnelVO vo = new AppStatisticsFunnelVO();
|
||||||
if(query.getEndTime()==null && query.getStartTime()==null){
|
if(query.getEndTime()==null && query.getStartTime()==null){
|
||||||
// 没有传时间,则代表用户没有自定义查询时间,使用standard来判断查询时间范围
|
// 没有传时间,则代表用户没有自定义查询时间,使用standard来判断查询时间范围
|
||||||
@@ -156,8 +155,12 @@ public class AppStatisticsServiceImpl implements AppStatisticsService {
|
|||||||
//获取当前周期的具体时间范围
|
//获取当前周期的具体时间范围
|
||||||
standardToNewSpecificTime(query);
|
standardToNewSpecificTime(query);
|
||||||
}
|
}
|
||||||
|
// 构建包含日期维度的 Redis 缓存 key
|
||||||
|
String redisKey = String.format("statistics:tmp_cache:%s:%s",
|
||||||
|
query.getScenicId(),
|
||||||
|
query.getStartTime() != null ? DateUtil.formatDate(query.getStartTime()) : "null");
|
||||||
if (!query.isRealtime()) {
|
if (!query.isRealtime()) {
|
||||||
if (!(DateUtil.isIn(query.getStartTime(), DateUtil.tomorrow(), DateUtil.yesterday()) && DateUtil.isIn(query.getEndTime(), DateUtil.tomorrow(), DateUtil.yesterday()))) {
|
if (!(DateUtil.isIn(query.getStartTime(), DateUtil.yesterday(), DateUtil.tomorrow()) && DateUtil.isIn(query.getEndTime(), DateUtil.yesterday(), DateUtil.tomorrow()))) {
|
||||||
// 查询缓存数据
|
// 查询缓存数据
|
||||||
List<AppStatisticsFunnelVO> list = statisticsMapper.listStatByScenic(query.getScenicId(), query.getStartTime(), query.getEndTime());
|
List<AppStatisticsFunnelVO> list = statisticsMapper.listStatByScenic(query.getScenicId(), query.getStartTime(), query.getEndTime());
|
||||||
AppStatisticsFunnelVO resp = new AppStatisticsFunnelVO();
|
AppStatisticsFunnelVO resp = new AppStatisticsFunnelVO();
|
||||||
@@ -189,7 +192,7 @@ public class AppStatisticsServiceImpl implements AppStatisticsService {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
if (!query.isRealtime()) {
|
if (!query.isRealtime()) {
|
||||||
if (DateUtil.isIn(query.getStartTime(), DateUtil.tomorrow(), DateUtil.yesterday()) && DateUtil.isIn(query.getEndTime(), DateUtil.tomorrow(), DateUtil.yesterday())) {
|
if (DateUtil.isIn(query.getStartTime(), DateUtil.yesterday(), DateUtil.tomorrow()) && DateUtil.isIn(query.getEndTime(), DateUtil.yesterday(), DateUtil.tomorrow())) {
|
||||||
// 缓存
|
// 缓存
|
||||||
if (redisTemplate.hasKey(redisKey)) {
|
if (redisTemplate.hasKey(redisKey)) {
|
||||||
String s = redisTemplate.opsForValue().get(redisKey);
|
String s = redisTemplate.opsForValue().get(redisKey);
|
||||||
@@ -203,7 +206,7 @@ public class AppStatisticsServiceImpl implements AppStatisticsService {
|
|||||||
try {
|
try {
|
||||||
// 缓存
|
// 缓存
|
||||||
if (!query.isRealtime()) {
|
if (!query.isRealtime()) {
|
||||||
if (DateUtil.isIn(query.getStartTime(), DateUtil.tomorrow(), DateUtil.yesterday()) && DateUtil.isIn(query.getEndTime(), DateUtil.tomorrow(), DateUtil.yesterday())) {
|
if (DateUtil.isIn(query.getStartTime(), DateUtil.yesterday(), DateUtil.tomorrow()) && DateUtil.isIn(query.getEndTime(), DateUtil.yesterday(), DateUtil.tomorrow())) {
|
||||||
// 缓存
|
// 缓存
|
||||||
if (redisTemplate.hasKey(redisKey)) {
|
if (redisTemplate.hasKey(redisKey)) {
|
||||||
String s = redisTemplate.opsForValue().get(redisKey);
|
String s = redisTemplate.opsForValue().get(redisKey);
|
||||||
@@ -270,13 +273,14 @@ public class AppStatisticsServiceImpl implements AppStatisticsService {
|
|||||||
vo.setPayOfOrderAmount(payOfOrderAmount.setScale(2, RoundingMode.HALF_UP));
|
vo.setPayOfOrderAmount(payOfOrderAmount.setScale(2, RoundingMode.HALF_UP));
|
||||||
vo.setRefundOfOrderNum(refundOfOrderNum);
|
vo.setRefundOfOrderNum(refundOfOrderNum);
|
||||||
vo.setRefundOfOrderAmount(refundOfOrderAmount.setScale(2, RoundingMode.HALF_UP));
|
vo.setRefundOfOrderAmount(refundOfOrderAmount.setScale(2, RoundingMode.HALF_UP));
|
||||||
// 仅在非 realtime 模式下写入缓存
|
|
||||||
// realtime=true 时由调用方(如定时任务)自行控制写入目标日期,不污染当天缓存
|
// 仅对当天数据启用 Redis 缓存(短期缓存,减少实时查询压力)
|
||||||
if (!query.isRealtime()) {
|
// 历史数据已在 scenic_stats 表中持久化,不需要 Redis 缓存
|
||||||
if (query.getScenicId() != null) {
|
if (!query.isRealtime() && query.getStartTime() != null) {
|
||||||
statisticsMapper.insertStat(query.getScenicId(), new Date(), vo);
|
// 判断查询日期是否为今天
|
||||||
|
if (DateUtil.isSameDay(query.getStartTime(), new Date())) {
|
||||||
|
redisTemplate.opsForValue().set(redisKey, JacksonUtil.toJSONString(vo), 60, TimeUnit.SECONDS);
|
||||||
}
|
}
|
||||||
redisTemplate.opsForValue().set(redisKey, JacksonUtil.toJSONString(vo), 60, TimeUnit.SECONDS);
|
|
||||||
}
|
}
|
||||||
return ApiResponse.success(vo);
|
return ApiResponse.success(vo);
|
||||||
} finally {
|
} finally {
|
||||||
|
|||||||
@@ -51,7 +51,6 @@ import com.ycwl.basic.model.repository.TaskUpdateResult;
|
|||||||
import com.ycwl.basic.storage.StorageFactory;
|
import com.ycwl.basic.storage.StorageFactory;
|
||||||
import com.ycwl.basic.storage.adapters.IStorageAdapter;
|
import com.ycwl.basic.storage.adapters.IStorageAdapter;
|
||||||
import com.ycwl.basic.storage.enums.StorageAcl;
|
import com.ycwl.basic.storage.enums.StorageAcl;
|
||||||
import com.ycwl.basic.storage.enums.StorageType;
|
|
||||||
import com.ycwl.basic.utils.ApiResponse;
|
import com.ycwl.basic.utils.ApiResponse;
|
||||||
import com.ycwl.basic.utils.WxMpUtil;
|
import com.ycwl.basic.utils.WxMpUtil;
|
||||||
import lombok.extern.slf4j.Slf4j;
|
import lombok.extern.slf4j.Slf4j;
|
||||||
@@ -573,13 +572,7 @@ public class GoodsServiceImpl implements GoodsService {
|
|||||||
if (configManager != null && configManager.getString("watermark_type") != null && !isBuy.isBuy()) {
|
if (configManager != null && configManager.getString("watermark_type") != null && !isBuy.isBuy()) {
|
||||||
ImageWatermarkOperatorEnum type = ImageWatermarkOperatorEnum.getByCode(configManager.getString("watermark_type"));
|
ImageWatermarkOperatorEnum type = ImageWatermarkOperatorEnum.getByCode(configManager.getString("watermark_type"));
|
||||||
if (type != null) {
|
if (type != null) {
|
||||||
IStorageAdapter adapter;
|
IStorageAdapter adapter = StorageFactory.use();
|
||||||
if (configManager.getEnum("store_type", StorageType.class) != null) {
|
|
||||||
adapter = StorageFactory.get(configManager.getEnum("store_type", StorageType.class));
|
|
||||||
adapter.loadConfig(JacksonUtil.parseObject(configManager.getString("store_config_json"), Map.class));
|
|
||||||
} else {
|
|
||||||
adapter = StorageFactory.use("assets-ext");
|
|
||||||
}
|
|
||||||
List<SourceWatermarkEntity> watermarkEntityList = sourceMapper.listSourceWatermark(list.stream().map(SourceRespVO::getId).collect(Collectors.toList()), face.getId(), type.getType());
|
List<SourceWatermarkEntity> watermarkEntityList = sourceMapper.listSourceWatermark(list.stream().map(SourceRespVO::getId).collect(Collectors.toList()), face.getId(), type.getType());
|
||||||
|
|
||||||
// 边缘端处理:需要二维码和头像 URL
|
// 边缘端处理:需要二维码和头像 URL
|
||||||
|
|||||||
@@ -13,7 +13,6 @@ import com.ycwl.basic.model.pc.source.resp.SourceRespVO;
|
|||||||
import com.ycwl.basic.repository.DeviceRepository;
|
import com.ycwl.basic.repository.DeviceRepository;
|
||||||
import com.ycwl.basic.repository.ScenicRepository;
|
import com.ycwl.basic.repository.ScenicRepository;
|
||||||
import com.ycwl.basic.repository.SourceRepository;
|
import com.ycwl.basic.repository.SourceRepository;
|
||||||
import com.ycwl.basic.service.pc.ScenicService;
|
|
||||||
import com.ycwl.basic.service.pc.SourceService;
|
import com.ycwl.basic.service.pc.SourceService;
|
||||||
import com.ycwl.basic.storage.adapters.IStorageAdapter;
|
import com.ycwl.basic.storage.adapters.IStorageAdapter;
|
||||||
import com.ycwl.basic.task.VideoPieceGetter;
|
import com.ycwl.basic.task.VideoPieceGetter;
|
||||||
@@ -47,8 +46,6 @@ public class SourceServiceImpl implements SourceService {
|
|||||||
@Autowired
|
@Autowired
|
||||||
private SourceRepository sourceRepository;
|
private SourceRepository sourceRepository;
|
||||||
@Autowired
|
@Autowired
|
||||||
private ScenicService scenicService;
|
|
||||||
@Autowired
|
|
||||||
private ScenicRepository scenicRepository;
|
private ScenicRepository scenicRepository;
|
||||||
@Autowired
|
@Autowired
|
||||||
private DeviceRepository deviceRepository;
|
private DeviceRepository deviceRepository;
|
||||||
@@ -184,7 +181,7 @@ public class SourceServiceImpl implements SourceService {
|
|||||||
throw new BaseException("该素材不存在");
|
throw new BaseException("该素材不存在");
|
||||||
}
|
}
|
||||||
try {
|
try {
|
||||||
IStorageAdapter adapter = scenicService.getScenicStorageAdapter(source.getScenicId());
|
IStorageAdapter adapter = StorageFactory.use();
|
||||||
String uploadedUrl = adapter.uploadFile("image/jpeg", file, PHOTO_PATH, id + "_q_.jpg");
|
String uploadedUrl = adapter.uploadFile("image/jpeg", file, PHOTO_PATH, id + "_q_.jpg");
|
||||||
|
|
||||||
SourceEntity sourceUpd = new SourceEntity();
|
SourceEntity sourceUpd = new SourceEntity();
|
||||||
|
|||||||
@@ -1103,25 +1103,7 @@ public class PrinterServiceImpl implements PrinterService {
|
|||||||
* 从context中的scenicConfigManager获取配置
|
* 从context中的scenicConfigManager获取配置
|
||||||
*/
|
*/
|
||||||
private void prepareStorageAdapter(PhotoProcessContext context) {
|
private void prepareStorageAdapter(PhotoProcessContext context) {
|
||||||
ScenicConfigManager scenicConfig = context.getScenicConfigManager();
|
context.setStorageAdapter(StorageFactory.use());
|
||||||
if (scenicConfig == null) {
|
|
||||||
log.warn("scenicConfigManager未设置,将使用默认存储");
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
|
|
||||||
try {
|
|
||||||
String storeType = scenicConfig.getString("store_type");
|
|
||||||
if (storeType != null) {
|
|
||||||
IStorageAdapter adapter = StorageFactory.get(storeType);
|
|
||||||
String storeConfigJson = scenicConfig.getString("store_config_json");
|
|
||||||
if (StringUtils.isNotBlank(storeConfigJson)) {
|
|
||||||
adapter.loadConfig(JacksonUtil.parseObject(storeConfigJson, Map.class));
|
|
||||||
}
|
|
||||||
context.setStorageAdapter(adapter);
|
|
||||||
}
|
|
||||||
} catch (Exception e) {
|
|
||||||
log.warn("准备存储适配器失败,将使用默认存储: {}", e.getMessage());
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
|
|||||||
@@ -601,14 +601,7 @@ public class TaskTaskServiceImpl implements TaskService {
|
|||||||
if (worker == null) {
|
if (worker == null) {
|
||||||
return null;
|
return null;
|
||||||
}
|
}
|
||||||
RenderWorkerConfigManager config = repository.getWorkerConfigManager(worker.getId());
|
IStorageAdapter adapter = scenicService.getScenicStorageAdapter(task.getScenicId());
|
||||||
IStorageAdapter adapter;
|
|
||||||
try {
|
|
||||||
adapter = StorageFactory.get(config.getString("store_type"));
|
|
||||||
adapter.loadConfig(config.getObject("store_config_json", Map.class));
|
|
||||||
} catch (Exception e) {
|
|
||||||
adapter = scenicService.getScenicStorageAdapter(task.getScenicId());
|
|
||||||
}
|
|
||||||
String hash = MD5.create().digestHex(task.getTaskParams() + task.getFaceId().toString());
|
String hash = MD5.create().digestHex(task.getTaskParams() + task.getFaceId().toString());
|
||||||
String filename = StorageUtil.joinPath(StorageConstant.VLOG_PATH, task.getTemplateId().toString() + "_" + hash + "_" + task.getScenicId() + ".mp4");
|
String filename = StorageUtil.joinPath(StorageConstant.VLOG_PATH, task.getTemplateId().toString() + "_" + hash + "_" + task.getScenicId() + ".mp4");
|
||||||
// 生成
|
// 生成
|
||||||
|
|||||||
@@ -34,7 +34,9 @@ import org.springframework.stereotype.Component;
|
|||||||
|
|
||||||
import java.util.ArrayList;
|
import java.util.ArrayList;
|
||||||
import java.util.Date;
|
import java.util.Date;
|
||||||
|
import java.util.HashMap;
|
||||||
import java.util.List;
|
import java.util.List;
|
||||||
|
import java.util.Map;
|
||||||
import java.util.Objects;
|
import java.util.Objects;
|
||||||
|
|
||||||
import static com.ycwl.basic.constant.FaceConstant.USER_FACE_DB_NAME;
|
import static com.ycwl.basic.constant.FaceConstant.USER_FACE_DB_NAME;
|
||||||
@@ -226,6 +228,16 @@ public class FaceCleaner {
|
|||||||
public void cleanSourceOss() {
|
public void cleanSourceOss() {
|
||||||
log.info("开始清理源视频素材文件");
|
log.info("开始清理源视频素材文件");
|
||||||
List<SourceRespVO> list = sourceMapper.list(new SourceReqQuery());
|
List<SourceRespVO> list = sourceMapper.list(new SourceReqQuery());
|
||||||
|
Map<Long, String> sourceImageUrlMap = new HashMap<>();
|
||||||
|
Map<Long, Long> sourceScenicIdMap = new HashMap<>();
|
||||||
|
list.forEach(item -> {
|
||||||
|
if (item.getId() != null && item.getScenicId() != null) {
|
||||||
|
sourceScenicIdMap.put(item.getId(), item.getScenicId());
|
||||||
|
}
|
||||||
|
if (item.getId() != null) {
|
||||||
|
sourceImageUrlMap.put(item.getId(), item.getUrl());
|
||||||
|
}
|
||||||
|
});
|
||||||
ArrayList<String> adapterIdentity = new ArrayList<>();
|
ArrayList<String> adapterIdentity = new ArrayList<>();
|
||||||
ScenicReqQuery query = new ScenicReqQuery();
|
ScenicReqQuery query = new ScenicReqQuery();
|
||||||
query.setPageSize(1000);
|
query.setPageSize(1000);
|
||||||
@@ -260,22 +272,45 @@ public class FaceCleaner {
|
|||||||
log.info("文件存在关系:{},未删除", fileObject);
|
log.info("文件存在关系:{},未删除", fileObject);
|
||||||
}
|
}
|
||||||
});
|
});
|
||||||
log.info("开始清理图片文件");
|
});
|
||||||
fileObjectList = adapter.listDir(StorageConstant.PHOTO_PATH);
|
|
||||||
fileObjectList.parallelStream().forEach(fileObject -> {
|
log.info("开始清理图片文件");
|
||||||
if (fileObject.getModifyTime() != null) {
|
IStorageAdapter imageAdapter = StorageFactory.use();
|
||||||
// 如果是一天以内修改的,则跳过
|
List<StorageFileObject> fileObjectList = imageAdapter.listDir(StorageConstant.PHOTO_PATH);
|
||||||
if (DateUtil.between(fileObject.getModifyTime(), new Date(), DateUnit.DAY) <= 1) {
|
fileObjectList.parallelStream().forEach(fileObject -> {
|
||||||
return;
|
if (fileObject.getModifyTime() != null) {
|
||||||
}
|
// 如果是一天以内修改的,则跳过
|
||||||
|
if (DateUtil.between(fileObject.getModifyTime(), new Date(), DateUnit.DAY) <= 1) {
|
||||||
|
return;
|
||||||
}
|
}
|
||||||
if (list.parallelStream().filter(videoRespVO -> Objects.nonNull(videoRespVO.getUrl())).noneMatch(videoRespVO -> videoRespVO.getUrl().contains(fileObject.getName()))){
|
}
|
||||||
log.info("删除文件:{}", fileObject);
|
|
||||||
adapter.deleteFile(fileObject.getFullPath());
|
String name = fileObject.getName();
|
||||||
} else {
|
if (name == null) {
|
||||||
log.info("文件存在关系:{},未删除", fileObject);
|
return;
|
||||||
}
|
}
|
||||||
});
|
int underscoreIndex = name.indexOf('_');
|
||||||
|
if (underscoreIndex <= 0) {
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
Long sourceId;
|
||||||
|
try {
|
||||||
|
sourceId = Long.parseLong(name.substring(0, underscoreIndex));
|
||||||
|
} catch (NumberFormatException e) {
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
Long scenicId = sourceScenicIdMap.get(sourceId);
|
||||||
|
if (scenicId == null || disableDeleteScenicIds.contains(scenicId.toString())) {
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
String imageUrl = sourceImageUrlMap.get(sourceId);
|
||||||
|
if (imageUrl != null && imageUrl.contains(name)) {
|
||||||
|
log.info("文件存在关系:{},未删除", fileObject);
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
log.info("删除文件:{}", fileObject);
|
||||||
|
imageAdapter.deleteFile(fileObject.getFullPath());
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
public void cleanVideoOss() {
|
public void cleanVideoOss() {
|
||||||
|
|||||||
@@ -60,7 +60,8 @@ public class ScenicStatsTask {
|
|||||||
});
|
});
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@Scheduled(cron = "0 0 2 * * *")
|
@Scheduled(cron = "0 0 3 * * *")
|
||||||
|
@Scheduled(cron = "0 1 0 * * *")
|
||||||
public void countScenicStats() {
|
public void countScenicStats() {
|
||||||
log.info("开始执行景区统计任务,统计前7天至昨天的数据");
|
log.info("开始执行景区统计任务,统计前7天至昨天的数据");
|
||||||
|
|
||||||
@@ -93,8 +94,8 @@ public class ScenicStatsTask {
|
|||||||
// 写入数据库(REPLACE INTO 会自动更新已存在的记录)
|
// 写入数据库(REPLACE INTO 会自动更新已存在的记录)
|
||||||
statisticsMapper.insertStat(scenicId, startTime, data);
|
statisticsMapper.insertStat(scenicId, startTime, data);
|
||||||
|
|
||||||
// 删除该景区的缓存,确保下次查询时获取最新数据
|
// 删除该景区该日期的缓存,确保下次查询时获取最新数据
|
||||||
invalidateStatisticsCache(scenicId);
|
invalidateStatisticsCache(scenicId, startTime);
|
||||||
} catch (Exception e) {
|
} catch (Exception e) {
|
||||||
log.error("统计景区 {} 在日期 {} 的数据时发生错误", scenic.getId(), DateUtil.formatDate(startTime), e);
|
log.error("统计景区 {} 在日期 {} 的数据时发生错误", scenic.getId(), DateUtil.formatDate(startTime), e);
|
||||||
}
|
}
|
||||||
@@ -109,9 +110,12 @@ public class ScenicStatsTask {
|
|||||||
/**
|
/**
|
||||||
* 删除景区统计缓存
|
* 删除景区统计缓存
|
||||||
* @param scenicId 景区ID
|
* @param scenicId 景区ID
|
||||||
|
* @param date 统计日期
|
||||||
*/
|
*/
|
||||||
private void invalidateStatisticsCache(Long scenicId) {
|
private void invalidateStatisticsCache(Long scenicId, Date date) {
|
||||||
String redisKey = "statistics:tmp_cache:" + scenicId;
|
String redisKey = String.format("statistics:tmp_cache:%s:%s",
|
||||||
|
scenicId,
|
||||||
|
DateUtil.formatDate(date));
|
||||||
redisTemplate.delete(redisKey);
|
redisTemplate.delete(redisKey);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
Reference in New Issue
Block a user