You've already forked FrameTour-BE
refactor(task): 重构任务创建逻辑
- 将 forceCreateTaskByFaceIdAndTempalteId 和 createTaskByFaceIdAndTempalteId 方法合并为一个内部方法 createTaskByFaceIdAndTempalteIdInternal - 通过 forceCreate 参数控制是否强制创建任务 -优化了模板生成判断和状态设置的逻辑 - 移除了重复代码,提高了代码可读性和维护性
This commit is contained in:
@@ -214,150 +214,7 @@ public class TaskTaskServiceImpl implements TaskService {
|
||||
|
||||
@Override
|
||||
public void forceCreateTaskByFaceIdAndTempalteId(Long faceId, Long templateId) {
|
||||
FaceEntity face = faceRepository.getFace(faceId);
|
||||
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);
|
||||
}
|
||||
createTaskByFaceIdAndTempalteIdInternal(faceId, templateId, 0, true);
|
||||
}
|
||||
|
||||
@Override
|
||||
@@ -405,6 +262,10 @@ public class TaskTaskServiceImpl implements TaskService {
|
||||
|
||||
@Override
|
||||
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);
|
||||
if (face == null) {
|
||||
log.info("faceId:{} is not exist", faceId);
|
||||
@@ -414,47 +275,19 @@ public class TaskTaskServiceImpl implements TaskService {
|
||||
if (faceSampleList.isEmpty()) {
|
||||
log.info("faceId:{} sample list not exist", faceId);
|
||||
}
|
||||
if (templateBiz.determineTemplateCanGenerate(templateId, faceId, false)) {
|
||||
// 临时写死,当自动生成视频,切片也算合成中,并更新状态
|
||||
taskStatusBiz.setFaceCutStatus(face.getId(), 0);
|
||||
} else {
|
||||
taskStatusBiz.setFaceCutStatus(face.getId(), 2);
|
||||
|
||||
// 只有在非强制创建时才进行模板生成判断和状态设置
|
||||
if (!forceCreate) {
|
||||
if (templateBiz.determineTemplateCanGenerate(templateId, faceId, false)) {
|
||||
// 临时写死,当自动生成视频,切片也算合成中,并更新状态
|
||||
taskStatusBiz.setFaceCutStatus(face.getId(), 0);
|
||||
} else {
|
||||
taskStatusBiz.setFaceCutStatus(face.getId(), 2);
|
||||
}
|
||||
}
|
||||
|
||||
List<Long> faceSampleIds = faceSampleList.stream().map(FaceSampleEntity::getId).collect(Collectors.toList());
|
||||
// ScenicConfigEntity scenicConfig = scenicRepository.getScenicConfig(face.getScenicId());
|
||||
// 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;
|
||||
// }
|
||||
// }
|
||||
List<SourceEntity> sourceList = sourceMapper.listVideoByScenicFaceRelation(face.getScenicId(), faceId);
|
||||
VideoPieceGetter.Task task = new VideoPieceGetter.Task();
|
||||
task.faceId = faceId;
|
||||
task.faceSampleIds = faceSampleIds;
|
||||
@@ -462,18 +295,20 @@ public class TaskTaskServiceImpl implements TaskService {
|
||||
task.memberId = face.getMemberId();
|
||||
task.callback = () -> {
|
||||
log.info("task callback: {}", task);
|
||||
boolean canGenerate = templateBiz.determineTemplateCanGenerate(templateId, faceId);
|
||||
if (!canGenerate) {
|
||||
log.info("task callback: 不能生成,templateId: {}", templateId);
|
||||
return;
|
||||
|
||||
// 只有在非强制创建时才进行模板生成判断
|
||||
if (!forceCreate) {
|
||||
boolean canGenerate = templateBiz.determineTemplateCanGenerate(templateId, faceId);
|
||||
if (!canGenerate) {
|
||||
log.info("task callback: 不能生成,templateId: {}", templateId);
|
||||
return;
|
||||
}
|
||||
}
|
||||
|
||||
List<SourceEntity> videoSourceList = sourceMapper.listVideoByScenicFaceRelation(face.getScenicId(), faceId);
|
||||
if (videoSourceList == null || videoSourceList.isEmpty()) {
|
||||
log.info("task callback: 没有视频源,templateId: {}", templateId);
|
||||
return;
|
||||
}
|
||||
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) {
|
||||
@@ -482,7 +317,6 @@ public class TaskTaskServiceImpl implements TaskService {
|
||||
}
|
||||
return Integer.valueOf(1).equals(device.getStatus());
|
||||
})
|
||||
.filter(item -> item.getDeviceId() != null) // 添加对 deviceId 为 null 的检查
|
||||
.collect(Collectors.groupingBy(item -> item.getDeviceId().toString()));
|
||||
if (sourcesMap.isEmpty()) {
|
||||
// 主动禁止没有视频源视频生成
|
||||
@@ -495,8 +329,6 @@ public class TaskTaskServiceImpl implements TaskService {
|
||||
// 每个value只保留第一个
|
||||
value.removeIf(item -> !value.getFirst().equals(item));
|
||||
});
|
||||
} else {
|
||||
log.info("task callback: 模板占位符有重复,templateId: {}", templateId);
|
||||
}
|
||||
|
||||
// 处理以P开头的templatePlaceHolder,添加type=2的source
|
||||
@@ -516,7 +348,7 @@ public class TaskTaskServiceImpl implements TaskService {
|
||||
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) -> {
|
||||
@@ -588,11 +420,14 @@ public class TaskTaskServiceImpl implements TaskService {
|
||||
}
|
||||
}
|
||||
videoMapper.addRelation(memberVideoEntity);
|
||||
// 任务生成了,需要更新切割任务状态
|
||||
taskStatusBiz.setFaceCutStatus(faceId, 2);
|
||||
|
||||
// 只有在非强制创建时才更新切割任务状态
|
||||
if (!forceCreate) {
|
||||
// 任务生成了,需要更新切割任务状态
|
||||
taskStatusBiz.setFaceCutStatus(faceId, 2);
|
||||
}
|
||||
};
|
||||
if (faceSampleIds.isEmpty()) {
|
||||
// 没有人脸样本
|
||||
if (!sourceList.isEmpty()) {
|
||||
task.callback.onInvoke();
|
||||
} else {
|
||||
VideoPieceGetter.addTask(task);
|
||||
|
Reference in New Issue
Block a user