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
|
@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);
|
||||||
|
Reference in New Issue
Block a user