feat(视频更新): 添加视频片段更新检查功能
All checks were successful
ZhenTu-BE/pipeline/head This commit looks good

- 新增TaskUpdateResult类存储任务更新检查结果
- 在VideoTaskRepository中实现checkTaskUpdate方法检查任务更新状态
- 重构GoodsServiceImpl中的视频更新检查逻辑,使用VideoTaskRepository的统一实现
- 在ContentPageVO中添加newSegmentCount字段显示新增片段数
This commit is contained in:
2025-09-18 15:05:25 +08:00
parent fde4deb370
commit 079c5dc540
5 changed files with 180 additions and 120 deletions

View File

@@ -1,23 +1,25 @@
package com.ycwl.basic.repository;
import cn.hutool.core.date.DateUtil;
import com.ycwl.basic.utils.JacksonUtil;
import com.ycwl.basic.biz.TemplateBiz;
import com.ycwl.basic.config.VideoUpdateConfig;
import com.ycwl.basic.mapper.TaskMapper;
import com.ycwl.basic.model.pc.source.entity.SourceEntity;
import com.ycwl.basic.model.pc.task.entity.TaskEntity;
import com.ycwl.basic.model.pc.task.resp.TaskRespVO;
import com.ycwl.basic.model.repository.TaskUpdateResult;
import com.ycwl.basic.utils.JacksonUtil;
import lombok.extern.slf4j.Slf4j;
import org.apache.commons.lang3.StringUtils;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.data.redis.core.RedisTemplate;
import org.springframework.stereotype.Component;
import java.util.ArrayList;
import java.util.Date;
import java.util.List;
import java.util.Map;
import java.util.Optional;
import java.util.*;
import java.util.concurrent.TimeUnit;
import java.util.concurrent.atomic.AtomicInteger;
@Slf4j
@Component
public class VideoTaskRepository {
@Autowired
@@ -28,6 +30,12 @@ public class VideoTaskRepository {
public static final String TASK_CACHE_KEY = "task:byId:%s";
@Autowired
private TemplateRepository templateRepository;
@Autowired
private SourceRepository sourceRepository;
@Autowired
private TemplateBiz templateBiz;
@Autowired
private VideoUpdateConfig videoUpdateConfig;
public TaskEntity getTaskById(Long taskId) {
if (redisTemplate.hasKey(String.format(TASK_CACHE_KEY, taskId))) {
@@ -122,4 +130,122 @@ public class VideoTaskRepository {
});
return deviceCount.get();
}
/**
* 检查任务是否可以更新
* @param taskId 任务ID
* @return 任务更新检查结果
*/
public TaskUpdateResult checkTaskUpdate(Long taskId) {
TaskUpdateResult result = new TaskUpdateResult();
TaskEntity task = getTaskById(taskId);
if (task == null) {
log.error("任务不存在: taskId={}", taskId);
result.setCanUpdate(false);
return result;
}
try {
Map<String, Object> originalTaskParams = JacksonUtil.parseObject(task.getTaskParams(), Map.class);
if (originalTaskParams == null) {
log.error("原始任务参数解析失败: taskId={}", taskId);
result.setCanUpdate(false);
return result;
}
int originalSegmentCount = calculateSegmentCount(originalTaskParams);
result.setOriginalSegmentCount(originalSegmentCount);
Map<String, List<SourceEntity>> currentTaskParams = sourceRepository.getTaskParams(task.getFaceId(), task.getTemplateId());
if (currentTaskParams.isEmpty()) {
log.info("当前没有可用的任务参数: faceId={}, templateId={}", task.getFaceId(), task.getTemplateId());
result.setCanUpdate(false);
result.setTotalSegmentCount(0);
result.setNewSegmentCount(0);
return result;
}
Map<String, List<SourceEntity>> filteredTaskParams = templateBiz.filterTaskParams(task.getTemplateId(), currentTaskParams);
int currentSegmentCount = calculateSegmentCount(filteredTaskParams);
result.setTotalSegmentCount(currentSegmentCount);
boolean hasNewSegments = videoUpdateConfig.isDetectChangesAsNew()
? hasNewSegments(originalTaskParams, filteredTaskParams)
: currentSegmentCount > originalSegmentCount;
int newSegmentCount = Math.max(0, currentSegmentCount - originalSegmentCount);
boolean canUpdate = hasNewSegments && newSegmentCount >= videoUpdateConfig.getMinNewSegmentCount();
result.setCanUpdate(canUpdate);
result.setNewSegmentCount(newSegmentCount);
log.info("任务更新检查完成: taskId={}, canUpdate={}, newSegmentCount={}, originalCount={}, currentCount={}",
taskId, result.isCanUpdate(), newSegmentCount, originalSegmentCount, currentSegmentCount);
} catch (Exception e) {
log.error("检查任务更新失败: taskId={}", taskId, e);
result.setCanUpdate(false);
}
return result;
}
/**
* 计算片段数量
*/
private int calculateSegmentCount(Map<String, ?> taskParams) {
if (taskParams == null || taskParams.isEmpty()) {
return 0;
}
return taskParams.entrySet().stream()
.filter(entry -> StringUtils.isNumeric(entry.getKey()))
.mapToInt(entry -> {
Object value = entry.getValue();
if (value instanceof List) {
return ((List<?>) value).size();
}
return 0;
})
.sum();
}
/**
* 检查是否有新片段
*/
private boolean hasNewSegments(Map<String, ?> originalParams, Map<String, List<SourceEntity>> currentParams) {
Set<String> originalFileSet = extractFileSet(originalParams);
Set<String> currentFileSet = extractFileSetFromEntities(currentParams);
return !currentFileSet.equals(originalFileSet);
}
private Set<String> extractFileSet(Map<String, ?> params) {
Set<String> fileSet = new HashSet<>();
params.entrySet().stream()
.filter(entry -> StringUtils.isNumeric(entry.getKey()))
.forEach(entry -> {
Object value = entry.getValue();
if (value instanceof List) {
((List<?>) value).forEach(item -> {
if (item instanceof Map) {
Map<?, ?> itemMap = (Map<?, ?>) item;
Object fileName = itemMap.get("fileName");
if (fileName != null) {
fileSet.add(fileName.toString());
}
}
});
}
});
return fileSet;
}
private Set<String> extractFileSetFromEntities(Map<String, List<SourceEntity>> params) {
Set<String> fileSet = new HashSet<>();
params.values().forEach(entities ->
entities.forEach(entity -> fileSet.add(entity.getVideoUrl()))
);
return fileSet;
}
}