refactor(task): 重构任务创建逻辑

- 将 forceCreateTaskByFaceIdAndTempalteId 和 createTaskByFaceIdAndTempalteId 方法合并为一个内部方法 createTaskByFaceIdAndTempalteIdInternal
- 通过 forceCreate 参数控制是否强制创建任务
-优化了模板生成判断和状态设置的逻辑
- 移除了重复代码,提高了代码可读性和维护性
This commit is contained in:
2025-08-15 17:34:09 +08:00
parent 9f6a75cd50
commit 29f142f53f

View File

@@ -214,150 +214,7 @@ public class TaskTaskServiceImpl implements TaskService {
@Override @Override
public void forceCreateTaskByFaceIdAndTempalteId(Long faceId, Long templateId) { public void forceCreateTaskByFaceIdAndTempalteId(Long faceId, Long templateId) {
FaceEntity face = faceRepository.getFace(faceId); createTaskByFaceIdAndTempalteIdInternal(faceId, templateId, 0, true);
if (face == null) {
log.info("faceId:{} is not exist", faceId);
return;
}
List<FaceSampleEntity> faceSampleList = faceRepository.getFaceSampleList(faceId);
if (faceSampleList.isEmpty()) {
log.info("faceId:{} sample list not exist", faceId);
}
List<Long> faceSampleIds = faceSampleList.stream().map(FaceSampleEntity::getId).collect(Collectors.toList());
List<SourceEntity> sourceList = sourceMapper.listVideoByScenicFaceRelation(face.getScenicId(), faceId);
VideoPieceGetter.Task task = new VideoPieceGetter.Task();
task.faceId = faceId;
task.faceSampleIds = faceSampleIds;
task.templateId = templateId;
task.memberId = face.getMemberId();
task.callback = () -> {
log.info("task callback");
List<SourceEntity> videoSourceList = sourceMapper.listVideoByScenicFaceRelation(face.getScenicId(), faceId);
Map<String, List<SourceEntity>> sourcesMap = videoSourceList.stream()
.peek(item -> item.setUrl(item.getVideoUrl()))
.filter(item -> item.getDeviceId() != null) // 添加对 deviceId 为 null 的检查
.filter(item -> {
DeviceEntity device = deviceRepository.getDevice(item.getDeviceId());
if (device == null) {
return false;
}
return Integer.valueOf(1).equals(device.getStatus());
})
.collect(Collectors.groupingBy(item -> item.getDeviceId().toString()));
if (sourcesMap.isEmpty()) {
// 主动禁止没有视频源视频生成
log.info("task callback: 没有视频源");
return;
}
List<String> templatePlaceholder = templateRepository.getTemplatePlaceholder(templateId);
if (templatePlaceholder.stream().distinct().count() == templatePlaceholder.size()) {
sourcesMap.forEach((key, value) -> {
// 每个value只保留第一个
value.removeIf(item -> !value.getFirst().equals(item));
});
} else {
log.info("task callback: 模板占位符有重复,templateId: {}", templateId);
}
// 处理以P开头的templatePlaceHolder,添加type=2的source
boolean hasPPlaceholder = templatePlaceholder.stream().anyMatch(placeholder -> placeholder.startsWith("P"));
if (hasPPlaceholder) {
List<SourceEntity> imageSourceList = sourceMapper.listImageSourcesByFaceId(faceId);
if (!imageSourceList.isEmpty()) {
// 将图片source按设备ID分组并添加到sourcesMap中
Map<String, List<SourceEntity>> imageSourceMap = imageSourceList.stream()
.peek(item -> item.setUrl(item.getUrl())) // 图片使用url字段
.filter(item -> item.getDeviceId() != null)
.filter(item -> {
DeviceEntity device = deviceRepository.getDevice(item.getDeviceId());
if (device == null) {
return false;
}
return Integer.valueOf(1).equals(device.getStatus());
})
.collect(Collectors.groupingBy(item -> Strings.concat("P", item.getDeviceId().toString())));
// 合并到现有的sourcesMap中
imageSourceMap.forEach((key, value) -> {
sourcesMap.merge(key, value, (existing, replacement) -> {
existing.addAll(replacement);
return existing;
});
});
}
}
TaskReqQuery taskReqQuery = new TaskReqQuery();
taskReqQuery.setFaceId(faceId);
taskReqQuery.setTemplateId(templateId);
taskReqQuery.setTaskParams(JacksonUtil.toJSONString(sourcesMap));
List<TaskRespVO> list = taskMapper.list(taskReqQuery);
MemberVideoEntity memberVideoEntity = new MemberVideoEntity();
memberVideoEntity.setMemberId(face.getMemberId());
memberVideoEntity.setScenicId(face.getScenicId());
memberVideoEntity.setFaceId(faceId);
memberVideoEntity.setTemplateId(templateId);
memberVideoEntity.setIsBuy(0);
if (list.isEmpty()) {
log.info("创建任务! faceId:{},templateId:{},taskParams:{}", faceId, templateId, sourcesMap);
ScenicConfigEntity scenicConfig = scenicRepository.getScenicConfig(face.getScenicId());
TaskEntity taskEntity = null;
if (Integer.valueOf(0).equals(scenicConfig.getTemplateNewVideoType())) {
log.info("景区{}启用:templateNewVideoType:全新视频原位替换", face.getScenicId());
taskReqQuery.setTemplateId(templateId);
List<TaskEntity> templateTaskList = taskMapper.listEntity(taskReqQuery);
if (!templateTaskList.isEmpty()) {
taskEntity = templateTaskList.getFirst();
log.info("已有旧生成的视频:{}", taskEntity);
MemberVideoEntity taskVideoRelation = videoMapper.queryRelationByMemberTask(face.getMemberId(), taskEntity.getId());
if (taskVideoRelation != null) {
log.info("已有旧关联记录的视频:{}", taskVideoRelation);
memberVideoEntity.setIsBuy(taskVideoRelation.getIsBuy());
memberVideoEntity.setOrderId(taskVideoRelation.getOrderId());
}
taskMapper.deleteById(taskEntity.getId());
}
}
if (taskEntity == null) {
taskEntity = new TaskEntity();
taskEntity.setId(SnowFlakeUtil.getLongId());
taskEntity.setScenicId(face.getScenicId());
taskEntity.setFaceId(faceId);
taskEntity.setTemplateId(templateId);
taskEntity.setAutomatic(0);
}
taskEntity.setWorkerId(null);
taskEntity.setStatus(0);
taskEntity.setTaskParams(JacksonUtil.toJSONString(sourcesMap));
taskMapper.add(taskEntity);
memberVideoEntity.setTaskId(taskEntity.getId());
} else {
log.info("重复task! faceId:{},templateId:{},taskParams:{}", faceId, templateId, sourcesMap);
memberVideoEntity.setTaskId(list.getFirst().getId());
VideoEntity video = videoMapper.findByTaskId(list.getFirst().getId());
if (video != null) {
IsBuyRespVO isBuy = orderBiz.isBuy(face.getMemberId(), list.getFirst().getScenicId(), 0, video.getId());
if (isBuy.isBuy()) {
memberVideoEntity.setIsBuy(1);
memberVideoEntity.setOrderId(isBuy.getOrderId());
}
if (isBuy.isFree()) {
memberVideoEntity.setIsBuy(1);
}
memberVideoEntity.setVideoId(video.getId());
}
}
videoMapper.addRelation(memberVideoEntity);
};
if (faceSampleIds.isEmpty()) {
// 没有人脸样本
if (!sourceList.isEmpty()) {
// 但是有原片
task.callback.onInvoke();
}
} else {
VideoPieceGetter.addTask(task);
}
} }
@Override @Override
@@ -405,6 +262,10 @@ public class TaskTaskServiceImpl implements TaskService {
@Override @Override
public void createTaskByFaceIdAndTempalteId(Long faceId, Long templateId, int automatic) { public void createTaskByFaceIdAndTempalteId(Long faceId, Long templateId, int automatic) {
createTaskByFaceIdAndTempalteIdInternal(faceId, templateId, automatic, false);
}
private void createTaskByFaceIdAndTempalteIdInternal(Long faceId, Long templateId, int automatic, boolean forceCreate) {
FaceEntity face = faceRepository.getFace(faceId); FaceEntity face = faceRepository.getFace(faceId);
if (face == null) { if (face == null) {
log.info("faceId:{} is not exist", faceId); log.info("faceId:{} is not exist", faceId);
@@ -414,47 +275,19 @@ public class TaskTaskServiceImpl implements TaskService {
if (faceSampleList.isEmpty()) { if (faceSampleList.isEmpty()) {
log.info("faceId:{} sample list not exist", faceId); log.info("faceId:{} sample list not exist", faceId);
} }
// 只有在非强制创建时才进行模板生成判断和状态设置
if (!forceCreate) {
if (templateBiz.determineTemplateCanGenerate(templateId, faceId, false)) { if (templateBiz.determineTemplateCanGenerate(templateId, faceId, false)) {
// 临时写死,当自动生成视频,切片也算合成中,并更新状态 // 临时写死,当自动生成视频,切片也算合成中,并更新状态
taskStatusBiz.setFaceCutStatus(face.getId(), 0); taskStatusBiz.setFaceCutStatus(face.getId(), 0);
} else { } else {
taskStatusBiz.setFaceCutStatus(face.getId(), 2); taskStatusBiz.setFaceCutStatus(face.getId(), 2);
} }
}
List<Long> faceSampleIds = faceSampleList.stream().map(FaceSampleEntity::getId).collect(Collectors.toList()); List<Long> faceSampleIds = faceSampleList.stream().map(FaceSampleEntity::getId).collect(Collectors.toList());
// ScenicConfigEntity scenicConfig = scenicRepository.getScenicConfig(face.getScenicId()); List<SourceEntity> sourceList = sourceMapper.listVideoByScenicFaceRelation(face.getScenicId(), faceId);
// if (automatic > 0) {
// TaskReqQuery taskReqQuery = new TaskReqQuery();
// taskReqQuery.setFaceId(faceId);
// taskReqQuery.setTemplateId(templateId);
// List<TaskRespVO> list = taskMapper.list(taskReqQuery);
// if (!list.isEmpty()) {
// list.parallelStream().forEach(task -> {
// MemberVideoEntity memberVideo = videoMapper.queryRelationByMemberTask(faceRespVO.getMemberId(), task.getId());
// if (memberVideo == null) {
// memberVideo = new MemberVideoEntity();
// memberVideo.setMemberId(faceRespVO.getMemberId());
// memberVideo.setScenicId(task.getScenicId());
// memberVideo.setFaceId(faceId);
// memberVideo.setTemplateId(task.getTemplateId());
// if (Integer.valueOf(1).equals(scenicConfig.getAllFree())) {
// memberVideo.setIsBuy(1);
// } else {
// memberVideo.setIsBuy(0);
// }
// memberVideo.setTaskId(task.getId());
// VideoEntity video = videoMapper.findByTaskId(task.getId());
// if (video != null) {
// memberVideo.setVideoId(video.getId());
// }
// videoMapper.addRelation(memberVideo);
// new Thread(() -> {
// sendVideoGeneratedServiceNotification(list.getFirst().getId(), faceRespVO.getMemberId());
// }).start();
// }
// });
// return;
// }
// }
VideoPieceGetter.Task task = new VideoPieceGetter.Task(); VideoPieceGetter.Task task = new VideoPieceGetter.Task();
task.faceId = faceId; task.faceId = faceId;
task.faceSampleIds = faceSampleIds; task.faceSampleIds = faceSampleIds;
@@ -462,18 +295,20 @@ public class TaskTaskServiceImpl implements TaskService {
task.memberId = face.getMemberId(); task.memberId = face.getMemberId();
task.callback = () -> { task.callback = () -> {
log.info("task callback: {}", task); log.info("task callback: {}", task);
// 只有在非强制创建时才进行模板生成判断
if (!forceCreate) {
boolean canGenerate = templateBiz.determineTemplateCanGenerate(templateId, faceId); boolean canGenerate = templateBiz.determineTemplateCanGenerate(templateId, faceId);
if (!canGenerate) { if (!canGenerate) {
log.info("task callback: 不能生成,templateId: {}", templateId); log.info("task callback: 不能生成,templateId: {}", templateId);
return; return;
} }
List<SourceEntity> videoSourceList = sourceMapper.listVideoByScenicFaceRelation(face.getScenicId(), faceId);
if (videoSourceList == null || videoSourceList.isEmpty()) {
log.info("task callback: 没有视频源,templateId: {}", templateId);
return;
} }
List<SourceEntity> videoSourceList = sourceMapper.listVideoByScenicFaceRelation(face.getScenicId(), faceId);
Map<String, List<SourceEntity>> sourcesMap = videoSourceList.stream() Map<String, List<SourceEntity>> sourcesMap = videoSourceList.stream()
.peek(item -> item.setUrl(item.getVideoUrl())) .peek(item -> item.setUrl(item.getVideoUrl()))
.filter(item -> item.getDeviceId() != null) // 添加对 deviceId 为 null 的检查
.filter(item -> { .filter(item -> {
DeviceEntity device = deviceRepository.getDevice(item.getDeviceId()); DeviceEntity device = deviceRepository.getDevice(item.getDeviceId());
if (device == null) { if (device == null) {
@@ -482,7 +317,6 @@ public class TaskTaskServiceImpl implements TaskService {
} }
return Integer.valueOf(1).equals(device.getStatus()); return Integer.valueOf(1).equals(device.getStatus());
}) })
.filter(item -> item.getDeviceId() != null) // 添加对 deviceId 为 null 的检查
.collect(Collectors.groupingBy(item -> item.getDeviceId().toString())); .collect(Collectors.groupingBy(item -> item.getDeviceId().toString()));
if (sourcesMap.isEmpty()) { if (sourcesMap.isEmpty()) {
// 主动禁止没有视频源视频生成 // 主动禁止没有视频源视频生成
@@ -495,8 +329,6 @@ public class TaskTaskServiceImpl implements TaskService {
// 每个value只保留第一个 // 每个value只保留第一个
value.removeIf(item -> !value.getFirst().equals(item)); value.removeIf(item -> !value.getFirst().equals(item));
}); });
} else {
log.info("task callback: 模板占位符有重复,templateId: {}", templateId);
} }
// 处理以P开头的templatePlaceHolder,添加type=2的source // 处理以P开头的templatePlaceHolder,添加type=2的source
@@ -588,11 +420,14 @@ public class TaskTaskServiceImpl implements TaskService {
} }
} }
videoMapper.addRelation(memberVideoEntity); videoMapper.addRelation(memberVideoEntity);
// 只有在非强制创建时才更新切割任务状态
if (!forceCreate) {
// 任务生成了,需要更新切割任务状态 // 任务生成了,需要更新切割任务状态
taskStatusBiz.setFaceCutStatus(faceId, 2); taskStatusBiz.setFaceCutStatus(faceId, 2);
}
}; };
if (faceSampleIds.isEmpty()) { if (!sourceList.isEmpty()) {
// 没有人脸样本
task.callback.onInvoke(); task.callback.onInvoke();
} else { } else {
VideoPieceGetter.addTask(task); VideoPieceGetter.addTask(task);