TASK: 1、更换pose,重新生成templateId

2、brandDNA 开启分析attributes功能
This commit is contained in:
2025-07-09 17:01:53 +08:00
parent 9f548d299b
commit c7c69417ef
5 changed files with 180 additions and 158 deletions

View File

@@ -11,12 +11,18 @@ import java.util.stream.Collectors;
@Getter @Getter
public enum PoseEnum { public enum PoseEnum {
POSE_1(1, "aida-sys-image/pose/pose-1.mp4", "aida-sys-image/pose/pose-1.gif", "aida-sys-image/pose/pose-1-first_frame.jpeg", "AACT.8090e67b.-E3pujumEfCbDTI_rjSH-A.LwIlGT3j"), // POSE_1(1, "aida-sys-image/pose/pose-1.mp4", "aida-sys-image/pose/pose-1.gif", "aida-sys-image/pose/pose-1-first_frame.jpeg", "AACT.8090e67b.-E3pujumEfCbDTI_rjSH-A.LwIlGT3j"),
POSE_2(2, "aida-sys-image/pose/pose-2.mp4", "aida-sys-image/pose/pose-2.gif", "aida-sys-image/pose/pose-2-first_frame.jpeg", "AACT.8090e67b.TwJLxEv3EfCbDTI_rjSH-A.IOQZCYhf"), POSE_1(1, "aida-sys-image/pose/pose-1-1.mp4", "aida-sys-image/pose/pose-1-1.gif", "aida-sys-image/pose/pose-1-first_frame.jpeg", "AACT.8090e67b.qNMWJlyKEfCuORaRJeW4dg.x3wUteVO"),
POSE_3(3, "aida-sys-image/pose/pose-3.mp4", "aida-sys-image/pose/pose-3.gif", "aida-sys-image/pose/pose-3-first_frame.jpeg", "AACT.8090e67b.gd3OCkv4EfCxyZo8eQGF2Q.qMm-a1XI"), // POSE_2(2, "aida-sys-image/pose/pose-2.mp4", "aida-sys-image/pose/pose-2.gif", "aida-sys-image/pose/pose-2-first_frame.jpeg", "AACT.8090e67b.TwJLxEv3EfCbDTI_rjSH-A.IOQZCYhf"),
POSE_4(4, "aida-sys-image/pose/pose-4.mp4", "aida-sys-image/pose/pose-4.gif", "aida-sys-image/pose/pose-4-first_frame.jpeg", "AACT.8090e67b.AUDnuEwDEfCEHBaRJeW4dg.rlx36xEY"), POSE_2(2, "aida-sys-image/pose/pose-2-1.mp4", "aida-sys-image/pose/pose-2-1.gif", "aida-sys-image/pose/pose-2-first_frame.jpeg", "AACT.8090e67b.QpaGOlyLEfCuuJo8eQGF2Q.62EiJj-6"),
POSE_5(5, "aida-sys-image/pose/pose-5.mp4", "aida-sys-image/pose/pose-5.gif", "aida-sys-image/pose/pose-5-first_frame.jpeg", "AACT.8090e67b.G8BvkEwEEfCxyZo8eQGF2Q.fo4ryrgR"), // POSE_3(3, "aida-sys-image/pose/pose-3.mp4", "aida-sys-image/pose/pose-3.gif", "aida-sys-image/pose/pose-3-first_frame.jpeg", "AACT.8090e67b.gd3OCkv4EfCxyZo8eQGF2Q.qMm-a1XI"),
POSE_6(6, "aida-sys-image/pose/pose-6.mp4", "aida-sys-image/pose/pose-6.gif", "aida-sys-image/pose/pose-6-first_frame.jpeg", "AACT.8090e67b.yBIPnEwEEfCxyZo8eQGF2Q.boSFwTG9"); POSE_3(3, "aida-sys-image/pose/pose-3-1.mp4", "aida-sys-image/pose/pose-3-1.gif", "aida-sys-image/pose/pose-3-first_frame.jpeg", "AACT.8090e67b.2q5qjFyLEfCImjI_rjSH-A.5cFMwOvi"),
// POSE_4(4, "aida-sys-image/pose/pose-4.mp4", "aida-sys-image/pose/pose-4.gif", "aida-sys-image/pose/pose-4-first_frame.jpeg", "AACT.8090e67b.AUDnuEwDEfCEHBaRJeW4dg.rlx36xEY"),
POSE_4(4, "aida-sys-image/pose/pose-4-1.mp4", "aida-sys-image/pose/pose-4-1.gif", "aida-sys-image/pose/pose-4-first_frame.jpeg", "AACT.8090e67b.KoYMplyPEfCuORaRJeW4dg.MuuBTG78"),
// POSE_5(5, "aida-sys-image/pose/pose-5.mp4", "aida-sys-image/pose/pose-5.gif", "aida-sys-image/pose/pose-5-first_frame.jpeg", "AACT.8090e67b.G8BvkEwEEfCxyZo8eQGF2Q.fo4ryrgR"),
POSE_5(5, "aida-sys-image/pose/pose-5-1.mp4", "aida-sys-image/pose/pose-5-1.gif", "aida-sys-image/pose/pose-5-first_frame.jpeg", "AACT.8090e67b.x54FNFyPEfCuuJo8eQGF2Q.P1egmEZ_"),
// POSE_6(6, "aida-sys-image/pose/pose-6.mp4", "aida-sys-image/pose/pose-6.gif", "aida-sys-image/pose/pose-6-first_frame.jpeg", "AACT.8090e67b.yBIPnEwEEfCxyZo8eQGF2Q.boSFwTG9");
POSE_6(6, "aida-sys-image/pose/pose-6-1.mp4", "aida-sys-image/pose/pose-6-1.gif", "aida-sys-image/pose/pose-6-first_frame.jpeg", "AACT.8090e67b.QSCvBlyQEfCImjI_rjSH-A.G9-Z5ffW");
private final Integer id; private final Integer id;

View File

@@ -30,7 +30,9 @@ public class QueryLibraryPageDTO extends PageQueryBaseVo {
@ApiModelProperty("交集还是并集1交集2并集") @ApiModelProperty("交集还是并集1交集2并集")
private Integer intersection; private Integer intersection;
@ApiModelProperty("年龄段")
private String ageGroup; private String ageGroup;
@ApiModelProperty("brandId")
private Long brandId; private Long brandId;
} }

View File

@@ -4011,7 +4011,7 @@ public class PythonService {
//关闭FastJson的引用检测 防止出现$ref 现象 //关闭FastJson的引用检测 防止出现$ref 现象
Map<String, Object> map = new HashMap<>(); Map<String, Object> map = new HashMap<>();
map.put("image_url", url); map.put("image_url", url);
map.put("is_brand_dna", Boolean.FALSE); map.put("is_brand_dna", Boolean.TRUE);
log.info("bright请求python 参数:####{}", map); log.info("bright请求python 参数:####{}", map);
String param = JSON.toJSONString(map, SerializerFeature.WriteNullStringAsEmpty); String param = JSON.toJSONString(map, SerializerFeature.WriteNullStringAsEmpty);
log.info(param); log.info(param);

View File

@@ -196,12 +196,12 @@ public class GenerateServiceImpl extends ServiceImpl<GenerateMapper, Generate> i
String jsonString = ""; String jsonString = "";
HashMap<String, String> params = new HashMap<>(); HashMap<String, String> params = new HashMap<>();
String version = null; String version = null;
if (!StringUtil.isNullOrEmpty(generateThroughImageTextDTO.getModelName()) && generateThroughImageTextDTO.getModelName().equals("high")){ if (!StringUtil.isNullOrEmpty(generateThroughImageTextDTO.getModelName()) && generateThroughImageTextDTO.getModelName().equals("high")) {
version = "high"; version = "high";
params.put("version","high"); params.put("version", "high");
}else if (!StringUtil.isNullOrEmpty(generateThroughImageTextDTO.getModelName()) && generateThroughImageTextDTO.getModelName().equals("fast")){ } else if (!StringUtil.isNullOrEmpty(generateThroughImageTextDTO.getModelName()) && generateThroughImageTextDTO.getModelName().equals("fast")) {
version = "fast"; version = "fast";
params.put("version","fast"); params.put("version", "fast");
} }
// 3.1 确定不同类型的印花分别调哪个接口 // 3.1 确定不同类型的印花分别调哪个接口
if (generateThroughImageTextDTO.getLevel1Type().equals(PRINT_BOARD.getRealName())) { if (generateThroughImageTextDTO.getLevel1Type().equals(PRINT_BOARD.getRealName())) {
@@ -362,7 +362,7 @@ public class GenerateServiceImpl extends ServiceImpl<GenerateMapper, Generate> i
String prefix = ""; String prefix = "";
if (userInput.startsWith("Painting Style") if (userInput.startsWith("Painting Style")
|| userInput.startsWith("Illustration Style") || userInput.startsWith("Illustration Style")
|| userInput.startsWith("Real Style") ){ || userInput.startsWith("Real Style")) {
prefix = userInput.substring(0, userInput.indexOf(",")) + ", "; prefix = userInput.substring(0, userInput.indexOf(",")) + ", ";
userInput = userInput.substring(userInput.indexOf(",") + 1); userInput = userInput.substring(userInput.indexOf(",") + 1);
} }
@@ -389,7 +389,7 @@ public class GenerateServiceImpl extends ServiceImpl<GenerateMapper, Generate> i
case "Sketchboard": case "Sketchboard":
// text = "clear lines, simple outlines monochrome white vector image of " + translated + ", no background, sketch flat, front view display, best quality, ultra-high resolution 8k"; // text = "clear lines, simple outlines monochrome white vector image of " + translated + ", no background, sketch flat, front view display, best quality, ultra-high resolution 8k";
text = "a single item of sketch of " + translated + ", 4k, white background"; text = "a single item of sketch of " + translated + ", 4k, white background";
if (!StringUtil.isNullOrEmpty(ageGroup) && ageGroup.equals("Child")){ if (!StringUtil.isNullOrEmpty(ageGroup) && ageGroup.equals("Child")) {
text = text + ", Children's clothing"; text = text + ", Children's clothing";
} }
// generate.setText(text); // generate.setText(text);
@@ -533,7 +533,7 @@ public class GenerateServiceImpl extends ServiceImpl<GenerateMapper, Generate> i
} }
CreditsEventsEnum creditsEventsEnum = CreditsEventsEnum.OTHER; CreditsEventsEnum creditsEventsEnum = CreditsEventsEnum.OTHER;
if (!StringUtil.isNullOrEmpty(generateThroughImageTextDTO.getModelName()) && generateThroughImageTextDTO.getModelName().equals("wx")){ if (!StringUtil.isNullOrEmpty(generateThroughImageTextDTO.getModelName()) && generateThroughImageTextDTO.getModelName().equals("wx")) {
String taskId = createAsyncTask(generateThroughImageTextDTO); String taskId = createAsyncTask(generateThroughImageTextDTO);
// String taskId = "e53c86ea-53be-424b-8ac7-3c01c141f4f7"; // String taskId = "e53c86ea-53be-424b-8ac7-3c01c141f4f7";
creditsEventsEnum = CreditsEventsEnum.WX_TEXT2IMG; creditsEventsEnum = CreditsEventsEnum.WX_TEXT2IMG;
@@ -569,7 +569,7 @@ public class GenerateServiceImpl extends ServiceImpl<GenerateMapper, Generate> i
// 模型迁移SD1.? -> flux,从而产生了不同模型的选择, // 模型迁移SD1.? -> flux,从而产生了不同模型的选择,
// high -> 生成图片质量高,但生成速度慢,每次生成只返回一张图片 // high -> 生成图片质量高,但生成速度慢,每次生成只返回一张图片
// fast -> 生成图片质量低,但生成速度快,每次生成返回四张图片 // fast -> 生成图片质量低,但生成速度快,每次生成返回四张图片
if (!StringUtil.isNullOrEmpty(generateThroughImageTextDTO.getModelName()) && generateThroughImageTextDTO.getModelName().equals("high")){ if (!StringUtil.isNullOrEmpty(generateThroughImageTextDTO.getModelName()) && generateThroughImageTextDTO.getModelName().equals("high")) {
creditsEventsEnum = CreditsEventsEnum.LOCAL_TEXT2IMG_HIGH; creditsEventsEnum = CreditsEventsEnum.LOCAL_TEXT2IMG_HIGH;
times = 1; times = 1;
} }
@@ -629,13 +629,13 @@ public class GenerateServiceImpl extends ServiceImpl<GenerateMapper, Generate> i
} }
} else if (generateThroughImageTextDTO.getLevel1Type().equals(MOOD_BOARD.getRealName())) { } else if (generateThroughImageTextDTO.getLevel1Type().equals(MOOD_BOARD.getRealName())) {
creditsEventsEnum = CreditsEventsEnum.MOOD_BOARD; creditsEventsEnum = CreditsEventsEnum.MOOD_BOARD;
if (!StringUtil.isNullOrEmpty(generateThroughImageTextDTO.getModelName()) && generateThroughImageTextDTO.getModelName().equals("high")){ if (!StringUtil.isNullOrEmpty(generateThroughImageTextDTO.getModelName()) && generateThroughImageTextDTO.getModelName().equals("high")) {
creditsEventsEnum = CreditsEventsEnum.LOCAL_TEXT2IMG_HIGH; creditsEventsEnum = CreditsEventsEnum.LOCAL_TEXT2IMG_HIGH;
times = 1; times = 1;
} }
} else if (generateThroughImageTextDTO.getLevel1Type().equals(SKETCH_BOARD.getRealName())) { } else if (generateThroughImageTextDTO.getLevel1Type().equals(SKETCH_BOARD.getRealName())) {
creditsEventsEnum = CreditsEventsEnum.SKETCH_BOARD; creditsEventsEnum = CreditsEventsEnum.SKETCH_BOARD;
if (!StringUtil.isNullOrEmpty(generateThroughImageTextDTO.getModelName()) && generateThroughImageTextDTO.getModelName().equals("high")){ if (!StringUtil.isNullOrEmpty(generateThroughImageTextDTO.getModelName()) && generateThroughImageTextDTO.getModelName().equals("high")) {
creditsEventsEnum = CreditsEventsEnum.LOCAL_TEXT2IMG_HIGH; creditsEventsEnum = CreditsEventsEnum.LOCAL_TEXT2IMG_HIGH;
times = 1; times = 1;
} }
@@ -651,7 +651,7 @@ public class GenerateServiceImpl extends ServiceImpl<GenerateMapper, Generate> i
String uuid = UUID.randomUUID().toString(); String uuid = UUID.randomUUID().toString();
// 除了 Moodboard || Printboard->Pattern(可以区分三种风格) || Sketchboard(Generate Sketch)这三个地方需要区分high || fast之外其他地方保持原样 // 除了 Moodboard || Printboard->Pattern(可以区分三种风格) || Sketchboard(Generate Sketch)这三个地方需要区分high || fast之外其他地方保持原样
if (generateThroughImageTextDTO.getLevel1Type().equals("Printboard") && !generateThroughImageTextDTO.getLevel2Type().equals("Pattern")){ if (generateThroughImageTextDTO.getLevel1Type().equals("Printboard") && !generateThroughImageTextDTO.getLevel2Type().equals("Pattern")) {
generateThroughImageTextDTO.setModelName(null); generateThroughImageTextDTO.setModelName(null);
} }
@@ -707,12 +707,12 @@ public class GenerateServiceImpl extends ServiceImpl<GenerateMapper, Generate> i
flag = false; flag = false;
} }
// 暂定万象每次生成1个 // 暂定万象每次生成1个
if (type.equals("wx")){ if (type.equals("wx")) {
return Collections.singletonList(getAsyncTaskResult(taskId)); return Collections.singletonList(getAsyncTaskResult(taskId));
} else if (type.equals("freepik")){ } else if (type.equals("freepik")) {
results.add(generateResultVO); results.add(generateResultVO);
continue; continue;
} else if (type.equals("flux")){ } else if (type.equals("flux")) {
results.add(getFluxResultAndSave(taskId)); results.add(getFluxResultAndSave(taskId));
continue; continue;
} }
@@ -789,8 +789,8 @@ public class GenerateServiceImpl extends ServiceImpl<GenerateMapper, Generate> i
String path; String path;
if (type.equals("Logo")) { if (type.equals("Logo")) {
path = CommonConstant.GENERATE_LOGO_SINGLE_CANCEL; path = CommonConstant.GENERATE_LOGO_SINGLE_CANCEL;
} else if(type.equals("PoseTransformation")){ } else if (type.equals("PoseTransformation")) {
path =CommonConstant.POSE_TRANSFORMATION_CANCEL; path = CommonConstant.POSE_TRANSFORMATION_CANCEL;
} else { } else {
path = CommonConstant.GENERATE_CANCEL; path = CommonConstant.GENERATE_CANCEL;
} }
@@ -894,7 +894,7 @@ public class GenerateServiceImpl extends ServiceImpl<GenerateMapper, Generate> i
// 检查积分是否够本次扣除 // 检查积分是否够本次扣除
CreditsEventsEnum event = CreditsEventsEnum.IMAGE_TO_SKETCH; CreditsEventsEnum event = CreditsEventsEnum.IMAGE_TO_SKETCH;
Boolean b = creditsService.checkCredits(accountId, event, 1); Boolean b = creditsService.checkCredits(accountId, event, 1);
if (!b){ if (!b) {
throw new BusinessException("remaining.credits.insufficient", ResultEnum.PROMPT.getCode()); throw new BusinessException("remaining.credits.insufficient", ResultEnum.PROMPT.getCode());
} }
@@ -916,12 +916,12 @@ public class GenerateServiceImpl extends ServiceImpl<GenerateMapper, Generate> i
} }
private String requestSketchExtract(ImageToSketchDTO imageToSketchDTO, String collagePictureUrl, private String requestSketchExtract(ImageToSketchDTO imageToSketchDTO, String collagePictureUrl,
Long accountId, String styleCode){ Long accountId, String styleCode) {
String imagePath; String imagePath;
if (StringUtil.isNullOrEmpty(collagePictureUrl)){ if (StringUtil.isNullOrEmpty(collagePictureUrl)) {
CollectionElement collectionElement = collectionElementService.getById(imageToSketchDTO.getElementId()); CollectionElement collectionElement = collectionElementService.getById(imageToSketchDTO.getElementId());
imagePath = collectionElement.getUrl(); imagePath = collectionElement.getUrl();
}else { } else {
imagePath = collagePictureUrl; imagePath = collagePictureUrl;
} }
@@ -930,7 +930,7 @@ public class GenerateServiceImpl extends ServiceImpl<GenerateMapper, Generate> i
String objectName = accountId + "/imageToSketch/" + imageName; String objectName = accountId + "/imageToSketch/" + imageName;
String styleImage; String styleImage;
if (!Objects.isNull(imageToSketchDTO.getStyleImageId())){ if (!Objects.isNull(imageToSketchDTO.getStyleImageId())) {
CollectionElement styleElement = collectionElementService.getById(imageToSketchDTO.getElementId()); CollectionElement styleElement = collectionElementService.getById(imageToSketchDTO.getElementId());
styleImage = styleElement.getUrl(); styleImage = styleElement.getUrl();
} else { } else {
@@ -942,8 +942,8 @@ public class GenerateServiceImpl extends ServiceImpl<GenerateMapper, Generate> i
} }
private Generate saveExtractSketchRequest(ImageToSketchDTO imageToSketchDTO, String collagePictureUrl, private Generate saveExtractSketchRequest(ImageToSketchDTO imageToSketchDTO, String collagePictureUrl,
Long projectId, Long accountId, String styleCode, Long projectId, Long accountId, String styleCode,
String modelName, String taskId){ String modelName, String taskId) {
// 存DB // 存DB
Generate generate = new Generate(); Generate generate = new Generate();
generate.setAccountId(accountId); generate.setAccountId(accountId);
@@ -963,12 +963,12 @@ public class GenerateServiceImpl extends ServiceImpl<GenerateMapper, Generate> i
return generate; return generate;
} }
public GenerateResultVO saveExtractSketchResult(Generate generate, String sketchPath, String gender){ public GenerateResultVO saveExtractSketchResult(Generate generate, String sketchPath, String gender) {
// 将生成结果存入DB // 将生成结果存入DB
GenerateDetail generateDetail = new GenerateDetail(); GenerateDetail generateDetail = new GenerateDetail();
generateDetail.setGenerateId(generate.getId()); generateDetail.setGenerateId(generate.getId());
generateDetail.setUrl(sketchPath); generateDetail.setUrl(sketchPath);
generateDetail.setIsLike((byte)0); generateDetail.setIsLike((byte) 0);
generateDetail.setMd5(MD5Utils.encryptFile(minioUtil.getPreSignedUrl(sketchPath, 24 * 60), Boolean.FALSE)); generateDetail.setMd5(MD5Utils.encryptFile(minioUtil.getPreSignedUrl(sketchPath, 24 * 60), Boolean.FALSE));
generateDetail.setCreateDate(LocalDateTime.now()); generateDetail.setCreateDate(LocalDateTime.now());
generateDetailMapper.insert(generateDetail); generateDetailMapper.insert(generateDetail);
@@ -979,7 +979,7 @@ public class GenerateServiceImpl extends ServiceImpl<GenerateMapper, Generate> i
minioUtil.getPreSignedUrl(sketchPath, CommonConstant.MINIO_IMAGE_EXPIRE_TIME), "Success", clothCategory); minioUtil.getPreSignedUrl(sketchPath, CommonConstant.MINIO_IMAGE_EXPIRE_TIME), "Success", clothCategory);
} }
public void doCreditsSubtract(Long accountId, CreditsEventsEnum event){ public void doCreditsSubtract(Long accountId, CreditsEventsEnum event) {
BigDecimal existingCredits = accountService.getById(accountId).getCredits(); BigDecimal existingCredits = accountService.getById(accountId).getCredits();
BigDecimal subtract = existingCredits.subtract(new BigDecimal(event.getValue())); BigDecimal subtract = existingCredits.subtract(new BigDecimal(event.getValue()));
accountService.updateCreditsAndEndTime(accountId, subtract.toString(), null); accountService.updateCreditsAndEndTime(accountId, subtract.toString(), null);
@@ -1005,13 +1005,13 @@ public class GenerateServiceImpl extends ServiceImpl<GenerateMapper, Generate> i
// 生成唯一任务ID // 生成唯一任务ID
String taskId; String taskId;
if (!StringUtil.isNullOrEmpty(imageToSketchDTO.getModelName()) if (!StringUtil.isNullOrEmpty(imageToSketchDTO.getModelName())
&& imageToSketchDTO.getModelName().equals("flux")){ && imageToSketchDTO.getModelName().equals("flux")) {
String imagePath; String imagePath;
// todo 拼贴图的线稿提取是否能用flux // todo 拼贴图的线稿提取是否能用flux
if (StringUtil.isNullOrEmpty(collagePictureUrl)){ if (StringUtil.isNullOrEmpty(collagePictureUrl)) {
CollectionElement collectionElement = collectionElementService.getById(imageToSketchDTO.getElementId()); CollectionElement collectionElement = collectionElementService.getById(imageToSketchDTO.getElementId());
imagePath = collectionElement.getUrl(); imagePath = collectionElement.getUrl();
}else { } else {
imagePath = collagePictureUrl; imagePath = collagePictureUrl;
} }
taskId = flux(event, null, imagePath, false); taskId = flux(event, null, imagePath, false);
@@ -1096,9 +1096,9 @@ public class GenerateServiceImpl extends ServiceImpl<GenerateMapper, Generate> i
String path; String path;
GenerateDetail originalDetail = generateDetailMapper.selectById(generateModifyDTO.getOriginalId()); GenerateDetail originalDetail = generateDetailMapper.selectById(generateModifyDTO.getOriginalId());
Long generateDetailId = originalDetail.getId(); Long generateDetailId = originalDetail.getId();
if (generateModifyDTO.getIsOverride()){ if (generateModifyDTO.getIsOverride()) {
path = originalDetail.getUrl().replaceFirst("^[^/]+/", "").replaceFirst("\\.[^.]+$", ""); path = originalDetail.getUrl().replaceFirst("^[^/]+/", "").replaceFirst("\\.[^.]+$", "");
}else { } else {
path = accountId + "/sketchboard/" + gender.toLowerCase() + "/" + category + "/" + UUID.randomUUID(); path = accountId + "/sketchboard/" + gender.toLowerCase() + "/" + category + "/" + UUID.randomUUID();
} }
@@ -1107,17 +1107,17 @@ public class GenerateServiceImpl extends ServiceImpl<GenerateMapper, Generate> i
log.info("修改后的图片 {}", minioPath); log.info("修改后的图片 {}", minioPath);
// 存入db 保存到t_generate_detail // 存入db 保存到t_generate_detail
if (!generateModifyDTO.getIsOverride()){ if (!generateModifyDTO.getIsOverride()) {
GenerateDetail generateDetail = new GenerateDetail(); GenerateDetail generateDetail = new GenerateDetail();
generateDetail.setGenerateId(originalDetail.getGenerateId()); generateDetail.setGenerateId(originalDetail.getGenerateId());
generateDetail.setUrl(minioPath); generateDetail.setUrl(minioPath);
generateDetail.setIsLike((byte)0); generateDetail.setIsLike((byte) 0);
generateDetail.setMd5(MD5Utils.encryptFile(minioUtil.getPreSignedUrl(minioPath, CommonConstant.MINIO_IMAGE_EXPIRE_TIME, true), Boolean.FALSE)); generateDetail.setMd5(MD5Utils.encryptFile(minioUtil.getPreSignedUrl(minioPath, CommonConstant.MINIO_IMAGE_EXPIRE_TIME, true), Boolean.FALSE));
generateDetail.setCreateDate(LocalDateTime.now()); generateDetail.setCreateDate(LocalDateTime.now());
generateDetailMapper.insert(generateDetail); generateDetailMapper.insert(generateDetail);
generateDetailId = generateDetail.getId(); generateDetailId = generateDetail.getId();
}else { } else {
GenerateDetail generateDetail = new GenerateDetail(); GenerateDetail generateDetail = new GenerateDetail();
generateDetail.setUrl(minioPath); generateDetail.setUrl(minioPath);
generateDetail.setId(generateDetailId); generateDetail.setId(generateDetailId);
@@ -1130,7 +1130,7 @@ public class GenerateServiceImpl extends ServiceImpl<GenerateMapper, Generate> i
@Resource @Resource
private UserLikeGroupService userLikeGroupService; private UserLikeGroupService userLikeGroupService;
public ToProductImageResultVO poseTransform(PoseTransformDTO poseTransformDTO){ public ToProductImageResultVO poseTransform(PoseTransformDTO poseTransformDTO) {
Long accountId = UserContext.getUserHolder().getId(); Long accountId = UserContext.getUserHolder().getId();
Long projectId = poseTransformDTO.getProjectId(); Long projectId = poseTransformDTO.getProjectId();
String productImage = poseTransformDTO.getProductImage(); String productImage = poseTransformDTO.getProductImage();
@@ -1148,11 +1148,11 @@ public class GenerateServiceImpl extends ServiceImpl<GenerateMapper, Generate> i
String taskId; String taskId;
Boolean flag = false; Boolean flag = false;
PoseTransformation poseTransformation = new PoseTransformation(); PoseTransformation poseTransformation = new PoseTransformation();
if (!StringUtil.isNullOrEmpty(poseTransformDTO.getModelName()) && poseTransformDTO.getModelName().equals("wx")){ if (!StringUtil.isNullOrEmpty(poseTransformDTO.getModelName()) && poseTransformDTO.getModelName().equals("wx")) {
taskId = animateAnyone(poseTransformDTO, accountId); taskId = animateAnyone(poseTransformDTO, accountId);
if (!StringUtil.isNullOrEmpty(taskId)) flag = true; if (!StringUtil.isNullOrEmpty(taskId)) flag = true;
poseTransformation.setModelName("wx"); poseTransformation.setModelName("wx");
}else { } else {
String uuid = UUID.randomUUID().toString(); String uuid = UUID.randomUUID().toString();
taskId = uuid + "-" + accountId; taskId = uuid + "-" + accountId;
flag = pythonService.poseTransformation(productImage, poseId, taskId); flag = pythonService.poseTransformation(productImage, poseId, taskId);
@@ -1163,22 +1163,22 @@ public class GenerateServiceImpl extends ServiceImpl<GenerateMapper, Generate> i
poseTransformation.setUniqueId(taskId); poseTransformation.setUniqueId(taskId);
poseTransformation.setProductImage(productImage); poseTransformation.setProductImage(productImage);
poseTransformation.setPoseId(poseId); poseTransformation.setPoseId(poseId);
poseTransformation.setIsLiked((byte)1); poseTransformation.setIsLiked((byte) 1);
poseTransformation.setCreateTime(LocalDateTime.now()); poseTransformation.setCreateTime(LocalDateTime.now());
poseTransformationMapper.insert(poseTransformation); poseTransformationMapper.insert(poseTransformation);
// 当需要默认like // 当需要默认like
ToProductImageResultVO toProductImageResultVO = new ToProductImageResultVO(); ToProductImageResultVO toProductImageResultVO = new ToProductImageResultVO();
if (Objects.nonNull(poseTransformDTO.getIsDefaultLike()) && poseTransformDTO.getIsDefaultLike()){ if (Objects.nonNull(poseTransformDTO.getIsDefaultLike()) && poseTransformDTO.getIsDefaultLike()) {
// 满足条件下添加到like // 满足条件下添加到like
Integer sort = addPoseTransferLike(poseTransformDTO, poseTransformation.getId()); Integer sort = addPoseTransferLike(poseTransformDTO, poseTransformation.getId());
Integer reSort = userLikeGroupService.rearrangeChildSort(poseTransformation.getId(), CollectionType.POSE_TRANSFORM.getValue(), Integer reSort = userLikeGroupService.rearrangeChildSort(poseTransformation.getId(), CollectionType.POSE_TRANSFORM.getValue(),
poseTransformDTO.getParentId(), poseTransformDTO.getUserLikeSortId()); poseTransformDTO.getParentId(), poseTransformDTO.getUserLikeSortId());
toProductImageResultVO.setSort(Objects.isNull(reSort) ? sort : reSort); toProductImageResultVO.setSort(Objects.isNull(reSort) ? sort : reSort);
}else if (Objects.nonNull(poseTransformDTO.getIsDefaultLike()) && Objects.nonNull(poseTransformDTO.getParentId())){ } else if (Objects.nonNull(poseTransformDTO.getIsDefaultLike()) && Objects.nonNull(poseTransformDTO.getParentId())) {
toProductImageResultVO.setParentId(poseTransformDTO.getParentId()); toProductImageResultVO.setParentId(poseTransformDTO.getParentId());
} }
if (flag){ if (flag) {
// 6、添加预扣除积分到redis // 6、添加预扣除积分到redis
creditsService.addRecordToCreditsDeduction(accountId, taskId, creditsEventsEnum); creditsService.addRecordToCreditsDeduction(accountId, taskId, creditsEventsEnum);
// 6.1 添加积分扣除记录到db // 6.1 添加积分扣除记录到db
@@ -1191,9 +1191,9 @@ public class GenerateServiceImpl extends ServiceImpl<GenerateMapper, Generate> i
throw new BusinessException("pose transformation error", ResultEnum.ERROR.getCode()); throw new BusinessException("pose transformation error", ResultEnum.ERROR.getCode());
} }
private Integer addPoseTransferLike(PoseTransformDTO poseTransformDTO, Long poseTransformationId){ private Integer addPoseTransferLike(PoseTransformDTO poseTransformDTO, Long poseTransformationId) {
if (Objects.nonNull(poseTransformDTO.getParentId()) if (Objects.nonNull(poseTransformDTO.getParentId())
&& !poseTransformDTO.getParentId().equals(0L)){ && !poseTransformDTO.getParentId().equals(0L)) {
CollectionSort collectionSort = disOrLikePose(poseTransformationId, "like", CollectionSort collectionSort = disOrLikePose(poseTransformationId, "like",
poseTransformDTO.getProjectId(), poseTransformDTO.getParentId()); poseTransformDTO.getProjectId(), poseTransformDTO.getParentId());
return collectionSort.getSort(); return collectionSort.getSort();
@@ -1208,16 +1208,16 @@ public class GenerateServiceImpl extends ServiceImpl<GenerateMapper, Generate> i
@Resource @Resource
private DesignService designService; private DesignService designService;
public void processPoseTransformResult(String taskId, String gifUrl, String videoUrl, String imageUrl){ public void processPoseTransformResult(String taskId, String gifUrl, String videoUrl, String imageUrl) {
// 1、存储模型返回的数据 // 1、存储模型返回的数据
PoseTransformation poseTransformation; PoseTransformation poseTransformation;
QueryWrapper<PoseTransformation> qw = new QueryWrapper<>(); QueryWrapper<PoseTransformation> qw = new QueryWrapper<>();
qw.eq("unique_id", taskId); qw.eq("unique_id", taskId);
List<PoseTransformation> poseTransformations = poseTransformationMapper.selectList(qw); List<PoseTransformation> poseTransformations = poseTransformationMapper.selectList(qw);
if (poseTransformations != null && poseTransformations.size() > 1){ if (poseTransformations != null && poseTransformations.size() > 1) {
log.warn("通过taskId {} 查询到的PoseTransformation的结果不止一条", taskId); log.warn("通过taskId {} 查询到的PoseTransformation的结果不止一条", taskId);
}else if (poseTransformations == null || poseTransformations.isEmpty()){ } else if (poseTransformations == null || poseTransformations.isEmpty()) {
return ; return;
} }
poseTransformation = poseTransformations.get(0); poseTransformation = poseTransformations.get(0);
poseTransformation.setGifUrl(gifUrl); poseTransformation.setGifUrl(gifUrl);
@@ -1240,18 +1240,17 @@ public class GenerateServiceImpl extends ServiceImpl<GenerateMapper, Generate> i
if (flag) creditsService.updateChangedCredits(accountId, taskId); if (flag) creditsService.updateChangedCredits(accountId, taskId);
} }
public List<PoseTransformationVO> getPoseTransformationResult(List<String> taskIdList){ public List<PoseTransformationVO> getPoseTransformationResult(List<String> taskIdList) {
ArrayList<PoseTransformationVO> poseTransformationVOS = new ArrayList<>(); ArrayList<PoseTransformationVO> poseTransformationVOS = new ArrayList<>();
for (String taskId : taskIdList){ for (String taskId : taskIdList) {
String type = resolveModelType(taskId, CreditsEventsEnum.POSE_TRANSFORMATION.getValue()); String type = resolveModelType(taskId, CreditsEventsEnum.POSE_TRANSFORMATION.getValue());
PoseTransformation poseTransformation = poseTransformationMapper.selectOne(new QueryWrapper<PoseTransformation>().eq("unique_id", taskId));
String key = generateResultKey + ":" + taskId; String key = generateResultKey + ":" + taskId;
String resultJson = redisUtil.getFromString(key); String resultJson = redisUtil.getFromString(key);
PoseTransformationVO poseTransformationVO; PoseTransformationVO poseTransformationVO;
if (!StringUtil.isNullOrEmpty(resultJson)){ if (!StringUtil.isNullOrEmpty(resultJson)) {
poseTransformationVO = new Gson().fromJson(redisUtil.getFromString(key), PoseTransformationVO.class); poseTransformationVO = new Gson().fromJson(redisUtil.getFromString(key), PoseTransformationVO.class);
if (poseTransformationVO.getStatus().equals("Success") && !type.equals("wx")){ if (poseTransformationVO.getStatus().equals("Success") && !type.equals("wx")) {
// 处理各种URL // 处理各种URL
processUrl(poseTransformationVO.getGifUrl(), url -> processUrl(poseTransformationVO.getGifUrl(), url ->
poseTransformationVO.setGifUrl(minioUtil.getPreSignedUrl(url, CommonConstant.MINIO_IMAGE_EXPIRE_TIME))); poseTransformationVO.setGifUrl(minioUtil.getPreSignedUrl(url, CommonConstant.MINIO_IMAGE_EXPIRE_TIME)));
@@ -1261,32 +1260,36 @@ public class GenerateServiceImpl extends ServiceImpl<GenerateMapper, Generate> i
poseTransformationVO.setFirstFrameUrl(minioUtil.getPreSignedUrl(url, CommonConstant.MINIO_IMAGE_EXPIRE_TIME))); poseTransformationVO.setFirstFrameUrl(minioUtil.getPreSignedUrl(url, CommonConstant.MINIO_IMAGE_EXPIRE_TIME)));
} }
poseTransformationVO.setResultType(CollectionType.POSE_TRANSFORM.getValue()); poseTransformationVO.setResultType(CollectionType.POSE_TRANSFORM.getValue());
} else if(type.equals("wx")){ } else if (type.equals("wx")) {
poseTransformationVO = getAnimateResult(taskId); poseTransformationVO = getAnimateResult(taskId);
} else { } else {
poseTransformationVO = new PoseTransformationVO(taskId, "Executing"); poseTransformationVO = new PoseTransformationVO(taskId, "Executing");
} }
ToProductImageResult productResultByPath = getProductResultByPath(poseTransformation.getProductImage());
if (Objects.nonNull(productResultByPath)){ PoseTransformation poseTransformation = poseTransformationMapper.selectOne(new QueryWrapper<PoseTransformation>().eq("unique_id", taskId));
Long parentId = userLikeGroupService.getParentIdByElementIdAndElementType(productResultByPath.getId(), CollectionType.TO_PRODUCT_IMAGE.getValue()); if (Objects.nonNull(poseTransformation)) {
poseTransformationVO.setParentId(parentId); ToProductImageResult productResultByPath = getProductResultByPath(poseTransformation.getProductImage());
if (Objects.nonNull(productResultByPath)) {
Long parentId = userLikeGroupService.getParentIdByElementIdAndElementType(productResultByPath.getId(), CollectionType.TO_PRODUCT_IMAGE.getValue());
poseTransformationVO.setParentId(parentId);
}
} }
poseTransformationVOS.add(poseTransformationVO); poseTransformationVOS.add(poseTransformationVO);
} }
return poseTransformationVOS; return poseTransformationVOS;
} }
private ToProductImageResult getProductResultByPath(String minioPath){ private ToProductImageResult getProductResultByPath(String minioPath) {
QueryWrapper<ToProductImageResult> qw = new QueryWrapper<>(); QueryWrapper<ToProductImageResult> qw = new QueryWrapper<>();
qw.lambda().eq(ToProductImageResult::getUrl, minioPath); qw.lambda().eq(ToProductImageResult::getUrl, minioPath);
return toProductImageResultMapper.selectOne(qw); return toProductImageResultMapper.selectOne(qw);
} }
public List<PoseTransformationVO> getPoseTransformationResultList(Long projectId, boolean like){ public List<PoseTransformationVO> getPoseTransformationResultList(Long projectId, boolean like) {
List<PoseTransformation> poseTransformations = poseTransformationMapper.selectList(new QueryWrapper<PoseTransformation>().eq("project_id", projectId).eq("is_liked", like ? 1 : 0)); List<PoseTransformation> poseTransformations = poseTransformationMapper.selectList(new QueryWrapper<PoseTransformation>().eq("project_id", projectId).eq("is_liked", like ? 1 : 0));
List<PoseTransformationVO> vos = new ArrayList<>(); List<PoseTransformationVO> vos = new ArrayList<>();
// if (poseTransformations != null && poseTransformations.size() > 1){ // if (poseTransformations != null && poseTransformations.size() > 1){
if (!CollectionUtils.isEmpty(poseTransformations)){ if (!CollectionUtils.isEmpty(poseTransformations)) {
for (PoseTransformation item : poseTransformations) { for (PoseTransformation item : poseTransformations) {
String taskId = item.getUniqueId(); String taskId = item.getUniqueId();
String key = generateResultKey + ":" + taskId; String key = generateResultKey + ":" + taskId;
@@ -1322,7 +1325,7 @@ public class GenerateServiceImpl extends ServiceImpl<GenerateMapper, Generate> i
// 处理Redis中没有缓存的情况 // 处理Redis中没有缓存的情况
poseTransformationVO = CopyUtil.copyObject(item, PoseTransformationVO.class); poseTransformationVO = CopyUtil.copyObject(item, PoseTransformationVO.class);
// todo 面对没有生成成功的情况 如何处理? // todo 面对没有生成成功的情况 如何处理?
if (StringUtil.isNullOrEmpty(item.getVideoUrl())){ if (StringUtil.isNullOrEmpty(item.getVideoUrl())) {
continue; continue;
} }
poseTransformationVO.setTaskId(taskId); poseTransformationVO.setTaskId(taskId);
@@ -1351,17 +1354,17 @@ public class GenerateServiceImpl extends ServiceImpl<GenerateMapper, Generate> i
} }
} }
public CollectionSort disOrLikePose(Long transformedId, String likeOrDislike, Long projectId, Long collectionSortParentId){ public CollectionSort disOrLikePose(Long transformedId, String likeOrDislike, Long projectId, Long collectionSortParentId) {
PoseTransformation poseTransformation = poseTransformationMapper.selectById(transformedId); PoseTransformation poseTransformation = poseTransformationMapper.selectById(transformedId);
CollectionSort collectionSort = null; CollectionSort collectionSort = null;
if (Objects.nonNull(poseTransformation)){ if (Objects.nonNull(poseTransformation)) {
if (likeOrDislike.equals("like")){ if (likeOrDislike.equals("like")) {
poseTransformation.setIsLiked((byte)1); poseTransformation.setIsLiked((byte) 1);
if (null != collectionSortParentId) { if (null != collectionSortParentId) {
collectionSort = designService.addCollectionSort(poseTransformation.getId(), CollectionType.POSE_TRANSFORM.getValue(), projectId, collectionSortParentId); collectionSort = designService.addCollectionSort(poseTransformation.getId(), CollectionType.POSE_TRANSFORM.getValue(), projectId, collectionSortParentId);
} }
}else if (likeOrDislike.equals("dislike")){ } else if (likeOrDislike.equals("dislike")) {
poseTransformation.setIsLiked((byte)0); poseTransformation.setIsLiked((byte) 0);
if (null != collectionSortParentId) { if (null != collectionSortParentId) {
designService.deleteCollectionSort(poseTransformation.getId(), CollectionType.POSE_TRANSFORM.getValue(), projectId, collectionSortParentId); designService.deleteCollectionSort(poseTransformation.getId(), CollectionType.POSE_TRANSFORM.getValue(), projectId, collectionSortParentId);
} }
@@ -1379,8 +1382,9 @@ public class GenerateServiceImpl extends ServiceImpl<GenerateMapper, Generate> i
private SysFileService sysFileService; private SysFileService sysFileService;
@Resource @Resource
private LibraryModelPointService libraryModelPointService; private LibraryModelPointService libraryModelPointService;
public String modifyModelProportion(ModifyModelProportionDTO proportionDTO){
public String modifyModelProportion(ModifyModelProportionDTO proportionDTO) {
log.info("modifyModelProportion params: {}", proportionDTO); log.info("modifyModelProportion params: {}", proportionDTO);
String name; String name;
String gender; String gender;
@@ -1388,12 +1392,12 @@ public class GenerateServiceImpl extends ServiceImpl<GenerateMapper, Generate> i
Long accountId = UserContext.getUserHolder().getId(); Long accountId = UserContext.getUserHolder().getId();
String uuid = UUID.randomUUID().toString(); String uuid = UUID.randomUUID().toString();
// 所有修改的图片都另存为,不覆盖原图 // 所有修改的图片都另存为,不覆盖原图
if (proportionDTO.getType().equals("Library")){ if (proportionDTO.getType().equals("Library")) {
model = libraryService.getById(proportionDTO.getId()); model = libraryService.getById(proportionDTO.getId());
String url = model.getUrl(); String url = model.getUrl();
name = url.substring(url.indexOf("/") + 1, url.lastIndexOf("/")) + "/" + uuid; name = url.substring(url.indexOf("/") + 1, url.lastIndexOf("/")) + "/" + uuid;
// gender = model.getLevel2Type(); // gender = model.getLevel2Type();
}else { } else {
SysFileVO sysModel = sysFileService.getById(proportionDTO.getId()); SysFileVO sysModel = sysFileService.getById(proportionDTO.getId());
gender = sysModel.getLevel2Type(); gender = sysModel.getLevel2Type();
name = accountId + "/models/" + gender.toLowerCase() + "/" + uuid; name = accountId + "/models/" + gender.toLowerCase() + "/" + uuid;
@@ -1434,10 +1438,11 @@ public class GenerateServiceImpl extends ServiceImpl<GenerateMapper, Generate> i
* String collagePicture(Base64) * String collagePicture(Base64)
* List<DTO(id, type)> elements * List<DTO(id, type)> elements
* File file * File file
*
* @return * @return
*/ */
@Transactional(rollbackFor = Exception.class) @Transactional(rollbackFor = Exception.class)
public GenerateResultVO sketchReconstructionGenerate(SketchReconstructionDTO sketchReconstructionDTO){ public GenerateResultVO sketchReconstructionGenerate(SketchReconstructionDTO sketchReconstructionDTO) {
// log.info("sketchReconstructionGenerate params: {}", sketchReconstructionDTO); // log.info("sketchReconstructionGenerate params: {}", sketchReconstructionDTO);
Long accountId = UserContext.getUserHolder().getId(); Long accountId = UserContext.getUserHolder().getId();
@@ -1462,7 +1467,7 @@ public class GenerateServiceImpl extends ServiceImpl<GenerateMapper, Generate> i
String targetPath = url.substring(pathStartIndex + 1, queryStartIndex); String targetPath = url.substring(pathStartIndex + 1, queryStartIndex);
try { try {
if (Objects.isNull(sketchReconstruction)){ if (Objects.isNull(sketchReconstruction)) {
sketchReconstruction = new SketchReconstruction(); sketchReconstruction = new SketchReconstruction();
sketchReconstruction.setProjectId(projectId); sketchReconstruction.setProjectId(projectId);
sketchReconstruction.setCollageImgSketchUrl(targetPath); sketchReconstruction.setCollageImgSketchUrl(targetPath);
@@ -1470,7 +1475,7 @@ public class GenerateServiceImpl extends ServiceImpl<GenerateMapper, Generate> i
sketchReconstruction.setGender(sketchReconstructionDTO.getGender()); sketchReconstruction.setGender(sketchReconstructionDTO.getGender());
sketchReconstruction.setCreateTime(LocalDateTime.now()); sketchReconstruction.setCreateTime(LocalDateTime.now());
sketchReconstructionMapper.insert(sketchReconstruction); sketchReconstructionMapper.insert(sketchReconstruction);
}else { } else {
sketchReconstruction.setCollageImgSketchUrl(targetPath); sketchReconstruction.setCollageImgSketchUrl(targetPath);
sketchReconstruction.setGenerateDetailId(generateResultVO.getId()); sketchReconstruction.setGenerateDetailId(generateResultVO.getId());
sketchReconstructionMapper.updateById(sketchReconstruction); sketchReconstructionMapper.updateById(sketchReconstruction);
@@ -1488,19 +1493,19 @@ public class GenerateServiceImpl extends ServiceImpl<GenerateMapper, Generate> i
return generateResultVO; return generateResultVO;
} }
public SketchReconstructionVO getSketchReconstruction(Long projectId){ public SketchReconstructionVO getSketchReconstruction(Long projectId) {
QueryWrapper<SketchReconstruction> qw = new QueryWrapper<>(); QueryWrapper<SketchReconstruction> qw = new QueryWrapper<>();
qw.eq("project_id", projectId); qw.eq("project_id", projectId);
SketchReconstruction sketchReconstruction = sketchReconstructionMapper.selectOne(qw); SketchReconstruction sketchReconstruction = sketchReconstructionMapper.selectOne(qw);
if (Objects.isNull(sketchReconstruction)){ if (Objects.isNull(sketchReconstruction)) {
return null; return null;
} }
SketchReconstructionVO vo = new SketchReconstructionVO(); SketchReconstructionVO vo = new SketchReconstructionVO();
if (Objects.nonNull(sketchReconstruction.getGenerateDetailId())){ if (Objects.nonNull(sketchReconstruction.getGenerateDetailId())) {
GenerateDetail generateDetail = generateDetailMapper.selectById(sketchReconstruction.getGenerateDetailId()); GenerateDetail generateDetail = generateDetailMapper.selectById(sketchReconstruction.getGenerateDetailId());
vo.setCollageSketchUrl(minioUtil.getPreSignedUrl(generateDetail.getUrl(), CommonConstant.MINIO_IMAGE_EXPIRE_TIME)); vo.setCollageSketchUrl(minioUtil.getPreSignedUrl(generateDetail.getUrl(), CommonConstant.MINIO_IMAGE_EXPIRE_TIME));
vo.setLiked(generateDetail.getIsLike().equals((byte)1)); vo.setLiked(generateDetail.getIsLike().equals((byte) 1));
String clothCategory = pythonService.getClothCategory(generateDetail.getUrl(), sketchReconstruction.getGender()); String clothCategory = pythonService.getClothCategory(generateDetail.getUrl(), sketchReconstruction.getGender());
String messageFromResource = BusinessException.getMessageFromResource(clothCategory.toUpperCase()); String messageFromResource = BusinessException.getMessageFromResource(clothCategory.toUpperCase());
vo.setCategory(clothCategory); vo.setCategory(clothCategory);
@@ -1509,7 +1514,7 @@ public class GenerateServiceImpl extends ServiceImpl<GenerateMapper, Generate> i
return vo; return vo;
} }
public List<Map<String, String>> getAllPose(){ public List<Map<String, String>> getAllPose() {
List<Map<String, String>> propertyList = PoseEnum.getPropertyList(); List<Map<String, String>> propertyList = PoseEnum.getPropertyList();
propertyList.forEach(item -> { propertyList.forEach(item -> {
item.put("gif", minioUtil.getPreSignedUrl(item.get("gif"), CommonConstant.MINIO_IMAGE_EXPIRE_TIME)); item.put("gif", minioUtil.getPreSignedUrl(item.get("gif"), CommonConstant.MINIO_IMAGE_EXPIRE_TIME));
@@ -1526,10 +1531,10 @@ public class GenerateServiceImpl extends ServiceImpl<GenerateMapper, Generate> i
QueryWrapper<PoseTransformation> qw = new QueryWrapper<>(); QueryWrapper<PoseTransformation> qw = new QueryWrapper<>();
qw.eq("unique_id", taskId); qw.eq("unique_id", taskId);
List<PoseTransformation> poseTransformations = poseTransformationMapper.selectList(qw); List<PoseTransformation> poseTransformations = poseTransformationMapper.selectList(qw);
if (poseTransformations != null && poseTransformations.size() > 1){ if (poseTransformations != null && poseTransformations.size() > 1) {
log.warn("通过taskId {} 查询到的PoseTransformation的结果不止一条", taskId); log.warn("通过taskId {} 查询到的PoseTransformation的结果不止一条", taskId);
}else if (poseTransformations == null || poseTransformations.isEmpty()){ } else if (poseTransformations == null || poseTransformations.isEmpty()) {
return ; return;
} }
poseTransformation = poseTransformations.get(0); poseTransformation = poseTransformations.get(0);
poseTransformation.setGifUrl(gifUrl); poseTransformation.setGifUrl(gifUrl);
@@ -1580,6 +1585,7 @@ public class GenerateServiceImpl extends ServiceImpl<GenerateMapper, Generate> i
/** /**
* 创建异步任务 * 创建异步任务
*
* @return taskId * @return taskId
*/ */
public String createAsyncTask(GenerateThroughImageTextDTO generateThroughImageTextDTO) { public String createAsyncTask(GenerateThroughImageTextDTO generateThroughImageTextDTO) {
@@ -1590,7 +1596,7 @@ public class GenerateServiceImpl extends ServiceImpl<GenerateMapper, Generate> i
String gender = generateThroughImageTextDTO.getGender(); String gender = generateThroughImageTextDTO.getGender();
// 添加预设prompt,使生成结果更加具有指向性区分不同的board // 添加预设prompt,使生成结果更加具有指向性区分不同的board
switch(level1Type){ switch (level1Type) {
case "Moodboard": case "Moodboard":
break; break;
case "Printboard": case "Printboard":
@@ -1620,7 +1626,7 @@ public class GenerateServiceImpl extends ServiceImpl<GenerateMapper, Generate> i
ImageSynthesisResult result = null; ImageSynthesisResult result = null;
try { try {
result = imageSynthesis.asyncCall(param); result = imageSynthesis.asyncCall(param);
} catch (Exception e){ } catch (Exception e) {
throw new RuntimeException(e.getMessage()); throw new RuntimeException(e.getMessage());
} }
String taskId = result.getOutput().getTaskId(); String taskId = result.getOutput().getTaskId();
@@ -1633,8 +1639,9 @@ public class GenerateServiceImpl extends ServiceImpl<GenerateMapper, Generate> i
/** /**
* 获取异步任务结果 * 获取异步任务结果
*
* @param taskId 任务id * @param taskId 任务id
* */ */
public GenerateResultVO getAsyncTaskResult(String taskId) { public GenerateResultVO getAsyncTaskResult(String taskId) {
ImageSynthesis imageSynthesis = new ImageSynthesis(); ImageSynthesis imageSynthesis = new ImageSynthesis();
ImageSynthesisResult result = null; ImageSynthesisResult result = null;
@@ -1645,12 +1652,12 @@ public class GenerateServiceImpl extends ServiceImpl<GenerateMapper, Generate> i
//PENDING任务排队中; RUNNING任务处理中; SUCCEEDED任务执行成功; FAILED任务执行失败; CANCELED任务取消成功; UNKNOWN任务不存在或状态未知 //PENDING任务排队中; RUNNING任务处理中; SUCCEEDED任务执行成功; FAILED任务执行失败; CANCELED任务取消成功; UNKNOWN任务不存在或状态未知
String taskStatus = result.getOutput().getTaskStatus(); String taskStatus = result.getOutput().getTaskStatus();
if (taskStatus.equals("SUCCEEDED")){ if (taskStatus.equals("SUCCEEDED")) {
List<Generate> generates = selectListByUniqueId(taskId); List<Generate> generates = selectListByUniqueId(taskId);
String url = result.getOutput().getResults().get(0).get("url"); String url = result.getOutput().getResults().get(0).get("url");
String path = null; String path = null;
if (!generates.isEmpty()){ if (!generates.isEmpty()) {
Generate generate = generates.get(0); Generate generate = generates.get(0);
Long accountId = generate.getAccountId(); Long accountId = generate.getAccountId();
@@ -1665,7 +1672,7 @@ public class GenerateServiceImpl extends ServiceImpl<GenerateMapper, Generate> i
GenerateDetail generateDetail = new GenerateDetail(); GenerateDetail generateDetail = new GenerateDetail();
generateDetail.setGenerateId(generate.getId()); generateDetail.setGenerateId(generate.getId());
generateDetail.setUrl(path); generateDetail.setUrl(path);
generateDetail.setMd5(MD5Utils.encryptFile(minioUtil.getPreSignedUrl(path, 24 * 60),false)); generateDetail.setMd5(MD5Utils.encryptFile(minioUtil.getPreSignedUrl(path, 24 * 60), false));
generateDetail.setCreateDate(LocalDateTime.now()); generateDetail.setCreateDate(LocalDateTime.now());
generateDetailMapper.insert(generateDetail); generateDetailMapper.insert(generateDetail);
// 4、扣积分 // 4、扣积分
@@ -1673,30 +1680,30 @@ public class GenerateServiceImpl extends ServiceImpl<GenerateMapper, Generate> i
if (flag) creditsService.updateChangedCredits(String.valueOf(generate.getAccountId()), taskId); if (flag) creditsService.updateChangedCredits(String.valueOf(generate.getAccountId()), taskId);
GenerateResultVO generateResultVO = new GenerateResultVO(taskId, generateDetail.getId(), minioUtil.getPreSignedUrl(path, 24 * 60), "Success"); GenerateResultVO generateResultVO = new GenerateResultVO(taskId, generateDetail.getId(), minioUtil.getPreSignedUrl(path, 24 * 60), "Success");
if (generate.getLevel1Type().equals(SKETCH_BOARD.getRealName())){ if (generate.getLevel1Type().equals(SKETCH_BOARD.getRealName())) {
String gender = extractGender(generate.getGenerateType()); String gender = extractGender(generate.getGenerateType());
if (!StringUtil.isNullOrEmpty(gender)){ if (!StringUtil.isNullOrEmpty(gender)) {
String clothCategory = pythonService.getClothCategory(path, gender); String clothCategory = pythonService.getClothCategory(path, gender);
generateResultVO.setCategory(clothCategory); generateResultVO.setCategory(clothCategory);
}else { } else {
log.warn("未提取到性别"); log.warn("未提取到性别");
} }
} }
return generateResultVO; return generateResultVO;
}else { } else {
throw new BusinessException("Unknown generate task"); throw new BusinessException("Unknown generate task");
} }
} else if(taskStatus.equals("PENDING") || taskStatus.equals("RUNNING")){ } else if (taskStatus.equals("PENDING") || taskStatus.equals("RUNNING")) {
log.info("万象 异步接口返回生成状态为:{}", taskStatus); log.info("万象 异步接口返回生成状态为:{}", taskStatus);
return new GenerateResultVO(taskId, null, null, "Executing"); return new GenerateResultVO(taskId, null, null, "Executing");
} else { } else {
log.warn("万象 异步接口返回生成状态为:{}", taskStatus); log.warn("万象 异步接口返回生成状态为:{}", taskStatus);
return new GenerateResultVO(taskId, null, null, "Fail"); return new GenerateResultVO(taskId, null, null, "Fail");
} }
} catch (ApiException | NoApiKeyException e){ } catch (ApiException | NoApiKeyException e) {
throw new RuntimeException(e.getMessage()); throw new RuntimeException(e.getMessage());
} catch (Exception e){ } catch (Exception e) {
log.error("从aliyun下载图片失败, {}", e.getMessage()); log.error("从aliyun下载图片失败, {}", e.getMessage());
throw new BusinessException("Generation result retrieval failed"); throw new BusinessException("Generation result retrieval failed");
} }
@@ -1706,7 +1713,8 @@ public class GenerateServiceImpl extends ServiceImpl<GenerateMapper, Generate> i
private static final String TEMPLATE_ID_GEN = "https://dashscope.aliyuncs.com/api/v1/services/aigc/image2video/aa-template-generation/"; private static final String TEMPLATE_ID_GEN = "https://dashscope.aliyuncs.com/api/v1/services/aigc/image2video/aa-template-generation/";
private static final String GET_ASYNC_RESULT = "https://dashscope.aliyuncs.com/api/v1/tasks/"; private static final String GET_ASYNC_RESULT = "https://dashscope.aliyuncs.com/api/v1/tasks/";
private static final String ANIMATE = "https://dashscope.aliyuncs.com/api/v1/services/aigc/image2video/video-synthesis/"; private static final String ANIMATE = "https://dashscope.aliyuncs.com/api/v1/services/aigc/image2video/video-synthesis/";
public String animateAnyone(PoseTransformDTO poseTransformDTO, Long accountId){
public String animateAnyone(PoseTransformDTO poseTransformDTO, Long accountId) {
String inputImage = poseTransformDTO.getProductImage(); String inputImage = poseTransformDTO.getProductImage();
String inputImageUrl = minioUtil.getPreSignedUrl(inputImage, CommonConstant.MINIO_IMAGE_EXPIRE_TIME); String inputImageUrl = minioUtil.getPreSignedUrl(inputImage, CommonConstant.MINIO_IMAGE_EXPIRE_TIME);
// 1、输入图片检测 // 1、输入图片检测
@@ -1714,7 +1722,7 @@ public class GenerateServiceImpl extends ServiceImpl<GenerateMapper, Generate> i
// 2、动作模板生成 // 2、动作模板生成
String videoTemplateId = PoseEnum.getById(poseTransformDTO.getPoseId()).getTemplateId(); String videoTemplateId = PoseEnum.getById(poseTransformDTO.getPoseId()).getTemplateId();
if (StringUtil.isNullOrEmpty(videoTemplateId)){ if (StringUtil.isNullOrEmpty(videoTemplateId)) {
throw new BusinessException("unknown pose"); throw new BusinessException("unknown pose");
} }
// 3、生成动图 // 3、生成动图
@@ -1738,7 +1746,7 @@ public class GenerateServiceImpl extends ServiceImpl<GenerateMapper, Generate> i
JSONObject jsonResponse = JSONUtil.parseObj(resp); JSONObject jsonResponse = JSONUtil.parseObj(resp);
JSONObject output = jsonResponse.getJSONObject("output"); JSONObject output = jsonResponse.getJSONObject("output");
String status = output.getStr("task_status"); String status = output.getStr("task_status");
if (status.equals(STATUS_FAILED) || status.equals(STATUS_UNKNOWN)){ if (status.equals(STATUS_FAILED) || status.equals(STATUS_UNKNOWN)) {
return null; return null;
} }
String taskId = output.getStr("task_id"); String taskId = output.getStr("task_id");
@@ -1750,7 +1758,7 @@ public class GenerateServiceImpl extends ServiceImpl<GenerateMapper, Generate> i
return taskId; return taskId;
} }
public void checkImage(String inputImageUrl){ public void checkImage(String inputImageUrl) {
JSONObject requestBody = new JSONObject(); JSONObject requestBody = new JSONObject();
requestBody.set("model", "animate-anyone-detect-gen2"); requestBody.set("model", "animate-anyone-detect-gen2");
@@ -1769,7 +1777,7 @@ public class GenerateServiceImpl extends ServiceImpl<GenerateMapper, Generate> i
JSONObject output = jsonResponse.getJSONObject("output"); JSONObject output = jsonResponse.getJSONObject("output");
Boolean checkPass = output.getBool("check_pass"); Boolean checkPass = output.getBool("check_pass");
if (!checkPass){ if (!checkPass) {
String reason = output.getStr("reason"); String reason = output.getStr("reason");
log.info("原因: {}", reason); log.info("原因: {}", reason);
throw new BusinessException("输入的图片不满足要求"); throw new BusinessException("输入的图片不满足要求");
@@ -1780,11 +1788,11 @@ public class GenerateServiceImpl extends ServiceImpl<GenerateMapper, Generate> i
private static final int MAX_RETRIES = 30; // 最大重试次数 private static final int MAX_RETRIES = 30; // 最大重试次数
private static final int POLL_INTERVAL = 20000; // 轮询间隔(毫秒) private static final int POLL_INTERVAL = 20000; // 轮询间隔(毫秒)
public String getVideoTemplateId(String videoPath){ public String getVideoTemplateId(String videoPath) {
boolean contains = PoseEnum.getVideoList().contains(videoPath); boolean contains = PoseEnum.getVideoList().contains(videoPath);
String templateId; String templateId;
if (!contains){ if (!contains) {
String videoUrl = minioUtil.getPreSignedUrl(videoPath, CommonConstant.MINIO_IMAGE_EXPIRE_TIME); String videoUrl = minioUtil.getPreSignedUrl(videoPath, CommonConstant.MINIO_IMAGE_EXPIRE_TIME);
JSONObject requestBody = new JSONObject(); JSONObject requestBody = new JSONObject();
requestBody.set("model", "animate-anyone-template-gen2"); requestBody.set("model", "animate-anyone-template-gen2");
@@ -1796,7 +1804,7 @@ public class GenerateServiceImpl extends ServiceImpl<GenerateMapper, Generate> i
log.info("获取pose的模板id 请求数据:{}", requestBody); log.info("获取pose的模板id 请求数据:{}", requestBody);
String resp = sendRequestUtil.sendAliYunPostAsync(TEMPLATE_ID_GEN, requestBody.toString()); String resp = sendRequestUtil.sendAliYunPostAsync(TEMPLATE_ID_GEN, requestBody.toString());
if (StringUtil.isNullOrEmpty(resp)){ if (StringUtil.isNullOrEmpty(resp)) {
throw new BusinessException("请求获取video template id失败"); throw new BusinessException("请求获取video template id失败");
} }
JSONObject jsonResponse = JSONUtil.parseObj(resp); JSONObject jsonResponse = JSONUtil.parseObj(resp);
@@ -1806,7 +1814,7 @@ public class GenerateServiceImpl extends ServiceImpl<GenerateMapper, Generate> i
// 暂时用while循环轮询 // 暂时用while循环轮询
templateId = pollTemplateIdResult(taskId); templateId = pollTemplateIdResult(taskId);
if (StringUtil.isNullOrEmpty(templateId)){ if (StringUtil.isNullOrEmpty(templateId)) {
throw new BusinessException("获取动作模板失败"); throw new BusinessException("获取动作模板失败");
} }
// templateId = "AACT.8090e67b.-E3pujumEfCbDTI_rjSH-A.LwIlGT3j"; // templateId = "AACT.8090e67b.-E3pujumEfCbDTI_rjSH-A.LwIlGT3j";
@@ -1895,7 +1903,7 @@ public class GenerateServiceImpl extends ServiceImpl<GenerateMapper, Generate> i
if (output != null) { if (output != null) {
log.info("任务输出: {}", output.toStringPretty()); log.info("任务输出: {}", output.toStringPretty());
return output.getStr("template_id"); return output.getStr("template_id");
}else { } else {
return null; return null;
} }
} }
@@ -1908,7 +1916,7 @@ public class GenerateServiceImpl extends ServiceImpl<GenerateMapper, Generate> i
} }
public PoseTransformationVO getAnimateResult(String taskId){ public PoseTransformationVO getAnimateResult(String taskId) {
String fullUrl = GET_ASYNC_RESULT + taskId; String fullUrl = GET_ASYNC_RESULT + taskId;
String respBody = sendRequestUtil.sendAliYunGet(fullUrl); String respBody = sendRequestUtil.sendAliYunGet(fullUrl);
log.info("获取wx pose transform 的结果: {}", respBody); log.info("获取wx pose transform 的结果: {}", respBody);
@@ -1923,24 +1931,28 @@ public class GenerateServiceImpl extends ServiceImpl<GenerateMapper, Generate> i
case STATUS_SUCCESS: case STATUS_SUCCESS:
poseTransformationVO.setStatus("Success"); poseTransformationVO.setStatus("Success");
List<PoseTransformation> poseTransformations = poseTransformationMapper.selectList(new QueryWrapper<PoseTransformation>().eq("unique_id", taskId).orderByDesc("id")); List<PoseTransformation> poseTransformations = poseTransformationMapper.selectList(new QueryWrapper<PoseTransformation>().eq("unique_id", taskId).orderByDesc("id"));
if (!poseTransformations.isEmpty()){ if (!poseTransformations.isEmpty()) {
PoseTransformation poseTransformation = poseTransformations.get(0); PoseTransformation poseTransformation = poseTransformations.get(0);
// 生成视频的gif和第一帧图片 // 生成视频的gif和第一帧图片
processVideo(videoUrl, poseTransformation); processVideo(videoUrl, poseTransformation);
poseTransformationVO.setId(poseTransformation.getId()); poseTransformationVO.setId(poseTransformation.getId());
if (!StringUtil.isNullOrEmpty(poseTransformation.getGifUrl())){ if (!StringUtil.isNullOrEmpty(poseTransformation.getGifUrl())) {
poseTransformationVO.setGifUrl(minioUtil.getPreSignedUrl(poseTransformation.getGifUrl(), CommonConstant.MINIO_IMAGE_EXPIRE_TIME)); poseTransformationVO.setGifUrl(minioUtil.getPreSignedUrl(poseTransformation.getGifUrl(), CommonConstant.MINIO_IMAGE_EXPIRE_TIME));
} }
if (!StringUtil.isNullOrEmpty(poseTransformation.getVideoUrl())){ if (!StringUtil.isNullOrEmpty(poseTransformation.getVideoUrl())) {
poseTransformationVO.setVideoUrl(minioUtil.getPreSignedUrl(poseTransformation.getVideoUrl(), CommonConstant.MINIO_IMAGE_EXPIRE_TIME)); poseTransformationVO.setVideoUrl(minioUtil.getPreSignedUrl(poseTransformation.getVideoUrl(), CommonConstant.MINIO_IMAGE_EXPIRE_TIME));
} }
if (!StringUtil.isNullOrEmpty(poseTransformation.getFirstFrameUrl())){ if (!StringUtil.isNullOrEmpty(poseTransformation.getFirstFrameUrl())) {
poseTransformationVO.setFirstFrameUrl(minioUtil.getPreSignedUrl(poseTransformation.getFirstFrameUrl(), CommonConstant.MINIO_IMAGE_EXPIRE_TIME)); poseTransformationVO.setFirstFrameUrl(minioUtil.getPreSignedUrl(poseTransformation.getFirstFrameUrl(), CommonConstant.MINIO_IMAGE_EXPIRE_TIME));
} }
// 执行积分扣除 // 执行积分扣除
Long accountId = poseTransformation.getAccountId(); Long accountId = poseTransformation.getAccountId();
Boolean flag = creditsService.taskCreditsDeduction(accountId, taskId); Boolean flag = creditsService.taskCreditsDeduction(accountId, taskId);
if (flag) creditsService.updateChangedCredits(String.valueOf(accountId), taskId); if (flag) creditsService.updateChangedCredits(String.valueOf(accountId), taskId);
// 保存数据到redis
String key = generateResultKey + ":" + taskId;
redisUtil.addToString(key, new Gson().toJson(poseTransformationVO), CommonConstant.GENERATE_RESULT_EXPIRE_TIME);
} }
break; break;
case STATUS_FAILED: case STATUS_FAILED:
@@ -1958,9 +1970,6 @@ public class GenerateServiceImpl extends ServiceImpl<GenerateMapper, Generate> i
poseTransformationVO.setStatus("Fail"); poseTransformationVO.setStatus("Fail");
} }
poseTransformationVO.setTaskId(taskId); poseTransformationVO.setTaskId(taskId);
// 保存数据到redis
String key = generateResultKey + ":" + taskId;
redisUtil.addToString(key, new Gson().toJson(poseTransformationVO), CommonConstant.GENERATE_RESULT_EXPIRE_TIME);
return poseTransformationVO; return poseTransformationVO;
} }
@@ -2079,11 +2088,11 @@ public class GenerateServiceImpl extends ServiceImpl<GenerateMapper, Generate> i
requestBody.set("imagination", style); requestBody.set("imagination", style);
String resp = sendRequestUtil.sendFreepikPost(requestBody.toString()); String resp = sendRequestUtil.sendFreepikPost(requestBody.toString());
if (!StringUtil.isNullOrEmpty(resp)){ if (!StringUtil.isNullOrEmpty(resp)) {
JSONObject jsonResp = JSONUtil.parseObj(resp); JSONObject jsonResp = JSONUtil.parseObj(resp);
JSONObject data = JSONUtil.parseObj(jsonResp.get("data")); JSONObject data = JSONUtil.parseObj(jsonResp.get("data"));
String status = data.getStr("status"); String status = data.getStr("status");
if (status.equals("COMPLETED")){ if (status.equals("COMPLETED")) {
// List<String> generated = data.getBeanList("generated", String.class); // List<String> generated = data.getBeanList("generated", String.class);
log.info("freepik 调用结果:{}", jsonResp); log.info("freepik 调用结果:{}", jsonResp);
return jsonResp.getStr("data"); return jsonResp.getStr("data");
@@ -2122,7 +2131,7 @@ public class GenerateServiceImpl extends ServiceImpl<GenerateMapper, Generate> i
requestBody.set("img", imagePath); requestBody.set("img", imagePath);
// String description = sendRequestUtil.sendPost("http://localhost:8000/api/img2prompt", requestBody.toString()); // String description = sendRequestUtil.sendPost("http://localhost:8000/api/img2prompt", requestBody.toString());
String description = sendRequestUtil.sendPost("http://18.167.251.121:9994/api/img2prompt", requestBody.toString()); String description = sendRequestUtil.sendPost("http://18.167.251.121:9994/api/img2prompt", requestBody.toString());
if (StringUtil.isNullOrEmpty(description)){ if (StringUtil.isNullOrEmpty(description)) {
throw new BusinessException("从ollama获取图片描述失败"); throw new BusinessException("从ollama获取图片描述失败");
} }
/*Object msg = JSONUtil.parseObj(resp).get("message"); /*Object msg = JSONUtil.parseObj(resp).get("message");
@@ -2132,17 +2141,17 @@ public class GenerateServiceImpl extends ServiceImpl<GenerateMapper, Generate> i
return description; return description;
} }
private String resolveModelType(String taskId, String func){ private String resolveModelType(String taskId, String func) {
// 判断当前task来自哪个模型 // 判断当前task来自哪个模型
if (!StringUtil.isNullOrEmpty(func) if (!StringUtil.isNullOrEmpty(func)
&& func.equals(CreditsEventsEnum.POSE_TRANSFORMATION.getValue())){ && func.equals(CreditsEventsEnum.POSE_TRANSFORMATION.getValue())) {
List<PoseTransformation> poseTransformations = poseTransformationMapper.selectList( List<PoseTransformation> poseTransformations = poseTransformationMapper.selectList(
new QueryWrapper<PoseTransformation>().eq("unique_id", taskId)); new QueryWrapper<PoseTransformation>().eq("unique_id", taskId));
if (!poseTransformations.isEmpty() if (!poseTransformations.isEmpty()
&& !StringUtil.isNullOrEmpty(poseTransformations.get(0).getModelName()) && !StringUtil.isNullOrEmpty(poseTransformations.get(0).getModelName())
&& poseTransformations.get(0).getModelName().equals("wx")){ && poseTransformations.get(0).getModelName().equals("wx")) {
return "wx"; return "wx";
}else { } else {
return "local"; return "local";
} }
} }
@@ -2152,9 +2161,9 @@ public class GenerateServiceImpl extends ServiceImpl<GenerateMapper, Generate> i
!StringUtil.isNullOrEmpty(generate.getModelName()) && !StringUtil.isNullOrEmpty(generate.getModelName()) &&
(generate.getModelName().equals("wx") (generate.getModelName().equals("wx")
|| generate.getModelName().equals("freepik") || generate.getModelName().equals("freepik")
|| generate.getModelName().equals("flux") )){ || generate.getModelName().equals("flux"))) {
return generate.getModelName(); return generate.getModelName();
}else { } else {
return "local"; return "local";
} }
} }
@@ -2172,15 +2181,16 @@ public class GenerateServiceImpl extends ServiceImpl<GenerateMapper, Generate> i
/** /**
* 接入flux模型用于imageToSketch(sketch extract) || relighting || to product image * 接入flux模型用于imageToSketch(sketch extract) || relighting || to product image
* @param func 功能枚举名 *
* @param prompt 用户输入 * @param func 功能枚举名
* @param prompt 用户输入
* @param imagePath 图片minio路径 * @param imagePath 图片minio路径
* @return 返回taskId用于异步获取结果 * @return 返回taskId用于异步获取结果
*/ */
public String flux(CreditsEventsEnum func, String prompt, String imagePath, boolean childStyle){ public String flux(CreditsEventsEnum func, String prompt, String imagePath, boolean childStyle) {
String fluxRequestUrl = "https://api.bfl.ai/v1/flux-kontext-pro"; String fluxRequestUrl = "https://api.bfl.ai/v1/flux-kontext-pro";
if (StringUtil.isNullOrEmpty(prompt)){ if (StringUtil.isNullOrEmpty(prompt)) {
switch (func){ switch (func) {
case RELIGHT_FLUX: case RELIGHT_FLUX:
prompt = "a model standing on the beautiful beach, ultra high quality, 8k"; prompt = "a model standing on the beautiful beach, ultra high quality, 8k";
break; break;
@@ -2201,13 +2211,13 @@ public class GenerateServiceImpl extends ServiceImpl<GenerateMapper, Generate> i
requestBody.set("output_format", "png"); requestBody.set("output_format", "png");
log.info("flux 请求入参:{}", requestBody); log.info("flux 请求入参:{}", requestBody);
if (!StringUtil.isNullOrEmpty(imagePath)){ if (!StringUtil.isNullOrEmpty(imagePath)) {
try { try {
String imageAsBase64 = null; String imageAsBase64 = null;
if (func.equals(TO_PRODUCT_IMAGE_FLUX)){ if (func.equals(TO_PRODUCT_IMAGE_FLUX)) {
imageAsBase64 = addWhiteBackground(imagePath); imageAsBase64 = addWhiteBackground(imagePath);
} }
if (StringUtil.isNullOrEmpty(imageAsBase64)){ if (StringUtil.isNullOrEmpty(imageAsBase64)) {
imageAsBase64 = minioUtil.getImageAsBase64(imagePath); imageAsBase64 = minioUtil.getImageAsBase64(imagePath);
} }
requestBody.set("input_image", imageAsBase64); requestBody.set("input_image", imageAsBase64);
@@ -2222,7 +2232,7 @@ public class GenerateServiceImpl extends ServiceImpl<GenerateMapper, Generate> i
JSONObject respObj = JSONUtil.parseObj(resp); JSONObject respObj = JSONUtil.parseObj(resp);
log.info("flux 发起生成请求返回结果: {}", respObj); log.info("flux 发起生成请求返回结果: {}", respObj);
String taskId = respObj.getStr("id"); String taskId = respObj.getStr("id");
if (StringUtil.isNullOrEmpty(taskId)){ if (StringUtil.isNullOrEmpty(taskId)) {
return null; return null;
} }
@@ -2233,11 +2243,11 @@ public class GenerateServiceImpl extends ServiceImpl<GenerateMapper, Generate> i
return taskId; return taskId;
} }
public String getFluxResult(String taskId, String objectName){ public String getFluxResult(String taskId, String objectName) {
String pollingUrl = redisUtil.getFromString(RedisUtil.FLUX_POLLING_URL + taskId); String pollingUrl = redisUtil.getFromString(RedisUtil.FLUX_POLLING_URL + taskId);
String fluxResultRequestUrl; String fluxResultRequestUrl;
HashMap<String, Object> params = new HashMap<>(); HashMap<String, Object> params = new HashMap<>();
if (StringUtil.isNullOrEmpty(pollingUrl)){ if (StringUtil.isNullOrEmpty(pollingUrl)) {
fluxResultRequestUrl = "https://api.bfl.ai/v1/get_result"; fluxResultRequestUrl = "https://api.bfl.ai/v1/get_result";
params.put("id", taskId); params.put("id", taskId);
} else { } else {
@@ -2248,7 +2258,7 @@ public class GenerateServiceImpl extends ServiceImpl<GenerateMapper, Generate> i
log.info("获取flux生成的结果为{}", resp); log.info("获取flux生成的结果为{}", resp);
JSONObject respObj = JSONUtil.parseObj(resp); JSONObject respObj = JSONUtil.parseObj(resp);
String status = respObj.getStr("status"); String status = respObj.getStr("status");
switch (status){ switch (status) {
case "Task not found": case "Task not found":
return "Fail"; return "Fail";
case "Pending": case "Pending":
@@ -2271,17 +2281,17 @@ public class GenerateServiceImpl extends ServiceImpl<GenerateMapper, Generate> i
return null; return null;
} }
private GenerateResultVO getFluxResultAndSave(String taskId){ private GenerateResultVO getFluxResultAndSave(String taskId) {
Generate generate = selectByUniqueId(taskId); Generate generate = selectByUniqueId(taskId);
if (Objects.nonNull(generate)){ if (Objects.nonNull(generate)) {
GenerateDetail generateDetail = generateDetailMapper.selectOne(new QueryWrapper<GenerateDetail>().eq("generate_id", generate.getId())); GenerateDetail generateDetail = generateDetailMapper.selectOne(new QueryWrapper<GenerateDetail>().eq("generate_id", generate.getId()));
Long accountId = generate.getAccountId(); Long accountId = generate.getAccountId();
String objectName = accountId + "/imageToSketch/" + taskId + ".png"; String objectName = accountId + "/imageToSketch/" + taskId + ".png";
String fluxResult = getFluxResult(taskId, objectName); String fluxResult = getFluxResult(taskId, objectName);
if (Objects.isNull(generateDetail)){ if (Objects.isNull(generateDetail)) {
if (StringUtil.isNullOrEmpty(fluxResult)){ if (StringUtil.isNullOrEmpty(fluxResult)) {
return new GenerateResultVO(taskId, "Fail"); return new GenerateResultVO(taskId, "Fail");
}else if (fluxResult.equals("Fail") || fluxResult.equals("Pending")){ } else if (fluxResult.equals("Fail") || fluxResult.equals("Pending")) {
String status = fluxResult.equals("Fail") ? "Fail" : "Executing"; String status = fluxResult.equals("Fail") ? "Fail" : "Executing";
return new GenerateResultVO(taskId, status); return new GenerateResultVO(taskId, status);
} }
@@ -2293,7 +2303,7 @@ public class GenerateServiceImpl extends ServiceImpl<GenerateMapper, Generate> i
// 扣积分 // 扣积分
Boolean flag = creditsService.taskCreditsDeduction(accountId, taskId); Boolean flag = creditsService.taskCreditsDeduction(accountId, taskId);
if (flag) creditsService.updateChangedCredits(String.valueOf(accountId), taskId); if (flag) creditsService.updateChangedCredits(String.valueOf(accountId), taskId);
} else if (StringUtil.isNullOrEmpty(generateDetail.getUrl())){ } else if (StringUtil.isNullOrEmpty(generateDetail.getUrl())) {
// 一般来说这条线应该走不到 // 一般来说这条线应该走不到
generateDetail.setGenerateId(generate.getId()); generateDetail.setGenerateId(generate.getId());
generateDetail.setUrl(fluxResult); generateDetail.setUrl(fluxResult);
@@ -2306,19 +2316,19 @@ public class GenerateServiceImpl extends ServiceImpl<GenerateMapper, Generate> i
String clothCategory = pythonService.getClothCategory(url, extractGender(generate.getGenerateType())); String clothCategory = pythonService.getClothCategory(url, extractGender(generate.getGenerateType()));
return new GenerateResultVO(taskId, generateDetail.getId(), return new GenerateResultVO(taskId, generateDetail.getId(),
minioUtil.getPreSignedUrl(url, CommonConstant.MINIO_IMAGE_EXPIRE_TIME), "Success", clothCategory); minioUtil.getPreSignedUrl(url, CommonConstant.MINIO_IMAGE_EXPIRE_TIME), "Success", clothCategory);
}else { } else {
throw new BusinessException("unknown generate"); throw new BusinessException("unknown generate");
} }
} }
private String addWhiteBackground(String minioPath){ private String addWhiteBackground(String minioPath) {
// 1、先通过后缀判断输入图片类型有没有透明通道 // 1、先通过后缀判断输入图片类型有没有透明通道
String extension = minioPath.substring(minioPath.lastIndexOf(".") + 1); String extension = minioPath.substring(minioPath.lastIndexOf(".") + 1);
// 2、如果有为其添加白色背景 // 2、如果有为其添加白色背景
if (extension.equals("png")){ if (extension.equals("png")) {
return minioUtil.changeToWhiteBackground(minioPath); return minioUtil.changeToWhiteBackground(minioPath);
}else { } else {
log.info("图片 {} 没有透明通道, 不用添加白底", minioPath); log.info("图片 {} 没有透明通道, 不用添加白底", minioPath);
return null; return null;
} }

View File

@@ -17,6 +17,8 @@ import com.ai.da.service.ProductImageService;
import com.alibaba.fastjson.JSONArray; import com.alibaba.fastjson.JSONArray;
import com.alibaba.fastjson.JSONObject; import com.alibaba.fastjson.JSONObject;
import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
import io.netty.util.internal.StringUtil;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Autowired; import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Value; import org.springframework.beans.factory.annotation.Value;
import org.springframework.scheduling.annotation.Async; import org.springframework.scheduling.annotation.Async;
@@ -29,6 +31,7 @@ import java.util.Set;
import java.util.UUID; import java.util.UUID;
import java.util.stream.Collectors; import java.util.stream.Collectors;
@Slf4j
@Service @Service
public class ProductImageServiceImpl implements ProductImageService { public class ProductImageServiceImpl implements ProductImageService {
@@ -87,17 +90,18 @@ public class ProductImageServiceImpl implements ProductImageService {
category = obj.getString("category_male"); category = obj.getString("category_male");
}*/ }*/
String imgUrl = obj.getString("img_url"); String imgUrl = obj.getString("img_url");
// JSONObject attribute = obj.getJSONObject("attribute"); JSONObject attribute = obj.getJSONObject("attribute");
// AttributeRecognitionJSON attrJSON = attribute.toJavaObject(AttributeRecognitionJSON.class); AttributeRecognitionJSON attrJSON = attribute.toJavaObject(AttributeRecognitionJSON.class);
// ProductImageAttribute attr = toAttrDict(attrJSON); ProductImageAttribute attr = toAttrDict(attrJSON);
ProductImageAttribute attr = new ProductImageAttribute(); // ProductImageAttribute attr = new ProductImageAttribute();
attr.setGender(gender); attr.setGender(gender);
attr.setCategory(category); attr.setCategory(category);
attr.setImgUrl(imgUrl); attr.setImgUrl(imgUrl);
attr.setLibraryId(libraryId); attr.setLibraryId(libraryId);
String imageName = UUID.randomUUID().toString(); String imageName = UUID.randomUUID().toString();
String objectName = userHolder.getId() + "/imageToSketch/" + imageName; String objectName = userHolder.getId() + "/imageToSketch/" + imageName;
String sketchPath = pythonService.imageToSketch(imgUrl, userBucket, objectName, "2", ""); String productImagePath = StringUtil.isNullOrEmpty(imgUrl) ? url : imgUrl;
String sketchPath = pythonService.imageToSketch(productImagePath, userBucket, objectName, "2", "");
attr.setImgUrl(sketchPath); attr.setImgUrl(sketchPath);
productImageAttributeMapper.insert(attr); productImageAttributeMapper.insert(attr);
} }
@@ -110,7 +114,7 @@ public class ProductImageServiceImpl implements ProductImageService {
} }
} catch (Exception e) { } catch (Exception e) {
System.out.println(e.getMessage()); log.error(e.getMessage());
// log.error("初始化失败", e); // log.error("初始化失败", e);
redisUtil.setTaskProgressDTO(progressKey, new ProgressDTO(0, 0, true)); redisUtil.setTaskProgressDTO(progressKey, new ProgressDTO(0, 0, true));
} }