|
|
|
@ -75,6 +75,8 @@ public class AiGenerationServiceImpl implements AiGenerationService { |
|
|
|
private static final String OSS_IMAGE_DIR = "ai/image/"; |
|
|
|
private static final String OSS_VIDEO_DIR = "ai/video/"; |
|
|
|
private static final String OSS_THUMBNAIL_DIR = "ai/thumbnail/"; |
|
|
|
private static final String OSS_GENERATE_IMAGE_DIR = "ai/generate/image"; |
|
|
|
private static final String OSS_GENERATE_VIDEO_DIR = "ai/generate/video"; |
|
|
|
|
|
|
|
//AI单图生成服务地址
|
|
|
|
@Value("${ai.generate.single-image-server-url:http://127.0.0.1:8001/api/v1/photo-to-comic}") |
|
|
|
@ -255,6 +257,7 @@ public class AiGenerationServiceImpl implements AiGenerationService { |
|
|
|
MiniAiGenerationTask task = new MiniAiGenerationTask(); |
|
|
|
task.setUuid(taskUuid) |
|
|
|
.setMiniUserId(userId) |
|
|
|
.setVisibility(form.getVisibility()) |
|
|
|
.setType("img_single") // 单图
|
|
|
|
.setGenerateParams(JSONUtil.toJsonStr(form)) |
|
|
|
.setPointsConsumed(Math.abs(deductPoint)) |
|
|
|
@ -343,6 +346,7 @@ public class AiGenerationServiceImpl implements AiGenerationService { |
|
|
|
MiniAiGenerationTask task = new MiniAiGenerationTask(); |
|
|
|
task.setUuid(taskUuid) |
|
|
|
.setMiniUserId(userId) |
|
|
|
.setVisibility(form.getVisibility()) |
|
|
|
.setType("img_grid_4") // 四宫格漫画
|
|
|
|
.setGenerateParams(JSONUtil.toJsonStr(form)) |
|
|
|
.setPointsConsumed(Math.abs(deductPoint)) |
|
|
|
@ -427,6 +431,7 @@ public class AiGenerationServiceImpl implements AiGenerationService { |
|
|
|
// 创建生成任务
|
|
|
|
MiniAiGenerationTask task = new MiniAiGenerationTask(); |
|
|
|
task.setUuid(taskUuid) |
|
|
|
.setVisibility(form.getVisibility()) |
|
|
|
.setMiniUserId(userId) |
|
|
|
.setType("video") |
|
|
|
.setGenerateParams(JSONUtil.toJsonStr(form)) |
|
|
|
@ -440,7 +445,7 @@ public class AiGenerationServiceImpl implements AiGenerationService { |
|
|
|
|
|
|
|
// 组装第三方接口参数
|
|
|
|
Map<String, Object> aiRequest = new HashMap<>(); |
|
|
|
aiRequest.put("model", form.getModel() == null ? aiDefaultVideoModel : form.getModel());//TODO写到上面
|
|
|
|
aiRequest.put("model", form.getModel() == null ? aiDefaultVideoModel : form.getModel()); |
|
|
|
aiRequest.put("content", form.getContent()); |
|
|
|
aiRequest.put("resolution", form.getResolution()); |
|
|
|
aiRequest.put("duration", form.getDuration()); |
|
|
|
@ -524,12 +529,8 @@ public class AiGenerationServiceImpl implements AiGenerationService { |
|
|
|
// 如果生成成功,下载外部视频到OSS
|
|
|
|
if (status == 1 && vo.getContent() != null && vo.getContent().getVideoUrl() != null) { |
|
|
|
String externalVideoUrl = vo.getContent().getVideoUrl(); |
|
|
|
// 调用下载方法,存储到视频目录
|
|
|
|
String ossUrl = downloadExternalUrlToOss(externalVideoUrl, OSS_VIDEO_DIR); |
|
|
|
task.setResultResourceUrl(ossUrl); |
|
|
|
aiGenerationTaskMapper.updateById(task); |
|
|
|
String ossUrl = downloadExternalUrlToOss(externalVideoUrl, OSS_GENERATE_VIDEO_DIR); |
|
|
|
|
|
|
|
// 保存视频媒体记录
|
|
|
|
MiniAiTaskMedia media = new MiniAiTaskMedia(); |
|
|
|
String mediaUuid = UUID.randomUUID().toString().replace("-", ""); |
|
|
|
media.setUuid(mediaUuid) |
|
|
|
@ -598,44 +599,41 @@ public class AiGenerationServiceImpl implements AiGenerationService { |
|
|
|
task.setUpdateTimestamp(System.currentTimeMillis()); |
|
|
|
aiGenerationTaskMapper.updateById(task); |
|
|
|
|
|
|
|
// 如果生成成功,下载外部URL到OSS
|
|
|
|
// 如果生成成功,下载外部URL到OSS,存储所有结果图片
|
|
|
|
if (status == 1 && form.getResult() != null && !form.getResult().isEmpty()) { |
|
|
|
String externalImageUrl = form.getResult().get(0).getUrl(); |
|
|
|
// 调用下载方法,存储到图片目录
|
|
|
|
String ossUrl = downloadExternalUrlToOss(externalImageUrl); |
|
|
|
task.setResultResourceUrl(ossUrl); |
|
|
|
aiGenerationTaskMapper.updateById(task); |
|
|
|
|
|
|
|
// 保存生成的媒体记录
|
|
|
|
MiniAiTaskMedia media = new MiniAiTaskMedia(); |
|
|
|
String mediaUuid = UUID.randomUUID().toString().replace("-", ""); |
|
|
|
AiCallbackImage image = form.getResult().get(0); |
|
|
|
// 解析尺寸
|
|
|
|
Integer width = null; |
|
|
|
Integer height = null; |
|
|
|
if (image.getSize() != null && image.getSize().contains("x")) { |
|
|
|
String[] sizeArr = image.getSize().split("x"); |
|
|
|
try { |
|
|
|
width = Integer.parseInt(sizeArr[0]); |
|
|
|
height = Integer.parseInt(sizeArr[1]); |
|
|
|
} catch (Exception e) { |
|
|
|
log.warn("解析四宫格图片尺寸失败,size:{}", image.getSize(), e); |
|
|
|
long now = System.currentTimeMillis(); |
|
|
|
|
|
|
|
for (AiCallbackImage image : form.getResult()) { |
|
|
|
String ossUrl = downloadExternalUrlToOss(image.getUrl(), OSS_GENERATE_IMAGE_DIR); |
|
|
|
|
|
|
|
// 解析尺寸
|
|
|
|
Integer width = null; |
|
|
|
Integer height = null; |
|
|
|
if (image.getSize() != null && image.getSize().contains("x")) { |
|
|
|
String[] sizeArr = image.getSize().split("x"); |
|
|
|
try { |
|
|
|
width = Integer.parseInt(sizeArr[0]); |
|
|
|
height = Integer.parseInt(sizeArr[1]); |
|
|
|
} catch (Exception e) { |
|
|
|
log.warn("解析四宫格图片尺寸失败,size:{}", image.getSize(), e); |
|
|
|
} |
|
|
|
} |
|
|
|
} |
|
|
|
|
|
|
|
media.setUuid(mediaUuid) |
|
|
|
.setTaskId(task.getId()) |
|
|
|
.setMiniUserId(task.getMiniUserId()) |
|
|
|
.setFileSource("ai_generate") |
|
|
|
.setMediaType("image") |
|
|
|
.setSourceUrl(ossUrl) |
|
|
|
.setWidth(width) |
|
|
|
.setHeight(height) |
|
|
|
.setCreateBy(task.getCreateBy()) |
|
|
|
.setCreateTimestamp(System.currentTimeMillis()) |
|
|
|
.setCreateTime(new Date()); |
|
|
|
|
|
|
|
aiTaskMediaMapper.insert(media); |
|
|
|
MiniAiTaskMedia media = new MiniAiTaskMedia(); |
|
|
|
String mediaUuid = UUID.randomUUID().toString().replace("-", ""); |
|
|
|
media.setUuid(mediaUuid) |
|
|
|
.setTaskId(task.getId()) |
|
|
|
.setMiniUserId(task.getMiniUserId()) |
|
|
|
.setFileSource("ai_generate") |
|
|
|
.setMediaType("image") |
|
|
|
.setSourceUrl(ossUrl) |
|
|
|
.setWidth(width) |
|
|
|
.setHeight(height) |
|
|
|
.setCreateBy(task.getCreateBy()) |
|
|
|
.setCreateTimestamp(now) |
|
|
|
.setCreateTime(new Date(now)); |
|
|
|
aiTaskMediaMapper.insert(media); |
|
|
|
} |
|
|
|
|
|
|
|
// 更新用户上传的参考文件:关联当前任务ID并软删除
|
|
|
|
LambdaUpdateWrapper<MiniAiTaskMedia> updateMediaWrapper = new LambdaUpdateWrapper<>(); |
|
|
|
@ -662,6 +660,7 @@ public class AiGenerationServiceImpl implements AiGenerationService { |
|
|
|
} |
|
|
|
|
|
|
|
@Override |
|
|
|
@Transactional(rollbackFor = Exception.class) |
|
|
|
public boolean handleTaskCallback(AiSingleImageCallbackForm form) { |
|
|
|
log.info("处理单图生成任务回调,任务UUID:{}", form.getUuid()); |
|
|
|
try { |
|
|
|
@ -684,45 +683,45 @@ public class AiGenerationServiceImpl implements AiGenerationService { |
|
|
|
return false; |
|
|
|
} |
|
|
|
|
|
|
|
// 如果生成成功,下载外部URL到OSS
|
|
|
|
String ossUrl = null; |
|
|
|
// 如果生成成功,下载外部URL到OSS,存储所有结果图片
|
|
|
|
if (status == 1 && form.getResult() != null && !form.getResult().isEmpty()) { |
|
|
|
String externalResultUrl = form.getResult().get(0).getUrl(); |
|
|
|
ossUrl = downloadExternalUrlToOss(externalResultUrl); |
|
|
|
|
|
|
|
// 保存生成的媒体记录
|
|
|
|
MiniAiTaskMedia media = new MiniAiTaskMedia(); |
|
|
|
String mediaUuid = UUID.randomUUID().toString().replace("-", ""); |
|
|
|
AiCallbackImage image = form.getResult().get(0); |
|
|
|
// 解析尺寸
|
|
|
|
Integer width = null; |
|
|
|
Integer height = null; |
|
|
|
if (image.getSize() != null && image.getSize().contains("x")) { |
|
|
|
String[] sizeArr = image.getSize().split("x"); |
|
|
|
try { |
|
|
|
width = Integer.parseInt(sizeArr[0]); |
|
|
|
height = Integer.parseInt(sizeArr[1]); |
|
|
|
} catch (Exception e) { |
|
|
|
log.warn("解析单图图片尺寸失败,size:{}", image.getSize(), e); |
|
|
|
long now = System.currentTimeMillis(); |
|
|
|
|
|
|
|
for (AiCallbackImage image : form.getResult()) { |
|
|
|
String ossUrl = downloadExternalUrlToOss(image.getUrl(), OSS_GENERATE_IMAGE_DIR); |
|
|
|
|
|
|
|
// 解析尺寸
|
|
|
|
Integer width = null; |
|
|
|
Integer height = null; |
|
|
|
if (image.getSize() != null && image.getSize().contains("x")) { |
|
|
|
String[] sizeArr = image.getSize().split("x"); |
|
|
|
try { |
|
|
|
width = Integer.parseInt(sizeArr[0]); |
|
|
|
height = Integer.parseInt(sizeArr[1]); |
|
|
|
} catch (Exception e) { |
|
|
|
log.warn("解析单图图片尺寸失败,size:{}", image.getSize(), e); |
|
|
|
} |
|
|
|
} |
|
|
|
} |
|
|
|
|
|
|
|
media.setUuid(mediaUuid) |
|
|
|
.setMiniUserId(task.getMiniUserId()) |
|
|
|
.setTaskId(task.getId()) |
|
|
|
.setFileSource("ai_generated") |
|
|
|
.setMediaType("image") |
|
|
|
.setSourceUrl(ossUrl) |
|
|
|
.setWidth(width) |
|
|
|
.setHeight(height) |
|
|
|
.setCreateBy(task.getCreateBy()) |
|
|
|
.setCreateTime(new Date()) |
|
|
|
.setCreateTimestamp(System.currentTimeMillis()) |
|
|
|
.setUpdateTime(new Date()) |
|
|
|
.setUpdateTimestamp(System.currentTimeMillis()) |
|
|
|
.setDeleted(false); |
|
|
|
|
|
|
|
aiTaskMediaMapper.insert(media); |
|
|
|
MiniAiTaskMedia media = new MiniAiTaskMedia(); |
|
|
|
String mediaUuid = UUID.randomUUID().toString().replace("-", ""); |
|
|
|
media.setUuid(mediaUuid) |
|
|
|
.setMiniUserId(task.getMiniUserId()) |
|
|
|
.setTaskId(task.getId()) |
|
|
|
.setFileSource("ai_generated") |
|
|
|
.setMediaType("image") |
|
|
|
.setSourceUrl(ossUrl) |
|
|
|
.setWidth(width) |
|
|
|
.setHeight(height) |
|
|
|
.setCreateBy(task.getCreateBy()) |
|
|
|
.setCreateTime(new Date(now)) |
|
|
|
.setCreateTimestamp(now) |
|
|
|
.setUpdateTime(new Date(now)) |
|
|
|
.setUpdateTimestamp(now) |
|
|
|
.setDeleted(false); |
|
|
|
|
|
|
|
aiTaskMediaMapper.insert(media); |
|
|
|
} |
|
|
|
|
|
|
|
// 更新用户上传的参考文件:关联当前任务ID并软删除
|
|
|
|
LambdaUpdateWrapper<MiniAiTaskMedia> updateMediaWrapper = new LambdaUpdateWrapper<>(); |
|
|
|
@ -741,7 +740,7 @@ public class AiGenerationServiceImpl implements AiGenerationService { |
|
|
|
} |
|
|
|
|
|
|
|
// 更新任务状态
|
|
|
|
return updateTaskStatus(taskUuid, status, ossUrl); |
|
|
|
return updateTaskStatus(taskUuid, status, null); |
|
|
|
|
|
|
|
} catch (Exception e) { |
|
|
|
log.error("处理AI任务回调异常,UUID:{},异常信息:{}", form.getUuid(), e.getMessage(), e); |
|
|
|
@ -795,13 +794,6 @@ public class AiGenerationServiceImpl implements AiGenerationService { |
|
|
|
} |
|
|
|
} |
|
|
|
|
|
|
|
/** |
|
|
|
* 下载外部URL到OSS,返回OSS访问地址 |
|
|
|
*/ |
|
|
|
private String downloadExternalUrlToOss(String externalUrl) { |
|
|
|
return downloadExternalUrlToOss(externalUrl, "ai/generate/"); |
|
|
|
} |
|
|
|
|
|
|
|
/** |
|
|
|
* 下载外部URL到指定OSS目录,返回OSS访问地址 |
|
|
|
*/ |
|
|
|
|