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