From 0a4d6ff13bec1f2a853fbf56de111ca38756ed5b Mon Sep 17 00:00:00 2001 From: shahaibo <1023316923@qq.com> Date: Mon, 21 Apr 2025 18:51:43 +0800 Subject: [PATCH] =?UTF-8?q?TASK:=E6=A8=A1=E5=9D=97=E5=8C=96=EF=BC=9B?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../da/common/RabbitMQ/GenerateConsumer.java | 109 +++++ .../common/RabbitMQ/RabbitMQProperties.java | 2 + .../ai/da/controller/DesignController.java | 14 +- .../primary/entity/ToProductImageResult.java | 2 + .../com/ai/da/model/dto/CloudTaskDTO.java | 2 + .../da/model/dto/DesignCloudResultQuery.java | 1 + .../java/com/ai/da/model/enums/BuildType.java | 32 ++ .../com/ai/da/model/vo/CloudTaskResultVO.java | 12 + .../java/com/ai/da/python/PythonService.java | 92 +++++ .../java/com/ai/da/service/DesignService.java | 2 +- .../ai/da/service/UserLikeGroupService.java | 2 + .../ai/da/service/impl/DesignServiceImpl.java | 372 +++++++++++++++--- .../da/service/impl/PortfolioServiceImpl.java | 4 +- .../impl/UserLikeGroupServiceImpl.java | 30 ++ src/main/resources/application-dev.properties | 4 +- 15 files changed, 630 insertions(+), 50 deletions(-) create mode 100644 src/main/java/com/ai/da/model/enums/BuildType.java create mode 100644 src/main/java/com/ai/da/model/vo/CloudTaskResultVO.java diff --git a/src/main/java/com/ai/da/common/RabbitMQ/GenerateConsumer.java b/src/main/java/com/ai/da/common/RabbitMQ/GenerateConsumer.java index bfb6e159..552d7540 100644 --- a/src/main/java/com/ai/da/common/RabbitMQ/GenerateConsumer.java +++ b/src/main/java/com/ai/da/common/RabbitMQ/GenerateConsumer.java @@ -18,6 +18,7 @@ import org.springframework.amqp.rabbit.annotation.RabbitListener; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.beans.factory.annotation.Value; import org.springframework.stereotype.Component; +import org.springframework.util.StringUtils; import javax.annotation.Resource; import java.io.IOException; @@ -318,6 +319,103 @@ public class GenerateConsumer { designService.processDesignBatch(generateResult); } + private void processToProductImageBatchResult(Message msg, Channel channel) { + log.info("============processToProductImageResult listening=========="); + long start = System.currentTimeMillis(); + + Map generateResult = JSONObject.parseObject(msg.getBody(), Map.class); + log.info("toProductImage response : {}", generateResult); + + try { + log.info("tasks_id : {} start ", generateResult.get("tasks_id")); + if (!StringUtils.isEmpty(generateResult.get("progress"))) { + String progress = generateResult.get("progress"); + String url = generateResult.get("result"); + String taskId = generateResult.get("tasks_id"); + userLikeGroupService.toProductBatch(taskId, url, progress); + } else { + // 修改redis中的数据状态为exception + String key = toProductImageResultKey + ":" + generateResult.get("tasks_id"); + redisUtil.addToString(key, new Gson().toJson(new GenerateResultVO(generateResult.get("tasks_id"), null, null, "Fail")), CommonConstant.GENERATE_RESULT_EXPIRE_TIME); + // 将异常信息存到exception中 + HashMap exceptionInfo = new HashMap<>(); + exceptionInfo.put(generateResult.get("tasks_id"), generateResult.get("data")); + // 存redis + redisUtil.addToMap(exceptionMapKey, exceptionInfo); + } + } catch (Exception e) { + log.error(e.getMessage()); + try { + channel.basicAck(msg.getMessageProperties().getDeliveryTag(), false); + // 将消息从redis排队队列中删除,需保证被消费的消息存储到db之后再从redis删除 + redisUtil.removeFromZSet(consumptionOrderKey, generateResult.get("tasks_id")); + } catch (IOException exception) { + log.error("手动确认,取消返回队列,不再重新消费"); + } + // 将入参和错误信息存入数据库 + String exceptionMessage = JSONObject.toJSONString(generateResult) + + " Exception message : " + e.getMessage(); + HashMap exceptionInfo = new HashMap<>(); + exceptionInfo.put(String.valueOf(generateResult.get("tasks_id")), exceptionMessage); + // 存redis + redisUtil.addToMap(exceptionMapKey, exceptionInfo); + } + + long end = System.currentTimeMillis(); + log.info("tasks_id : {}, end , message : {}, 执行时长: {} 毫秒", generateResult.get("tasks_id"), generateResult.get("message"), (end - start)); + log.info("============ProcessToProductImageResult End listening=========="); + } + + private void processRelightBatchResult(Message msg, Channel channel) { + log.info("============processRelightResult listening=========="); + long start = System.currentTimeMillis(); + + Map generateResult = JSONObject.parseObject(msg.getBody(), Map.class); + log.info("toProductImage response : {}", generateResult); + + try { + log.info("tasks_id : {} start ", generateResult.get("tasks_id")); + if (generateResult.get("status").equals("SUCCESS")) { + String url = generateResult.get("image_url"); + String taskId = generateResult.get("tasks_id"); + String category = generateResult.get("category"); + generateService.processRelightResult(taskId, url, category); + } else if (generateResult.get("status").equals("NO_FACE")) { + String taskId = generateResult.get("tasks_id"); + userLikeGroupService.relight(taskId); + } else { + // 修改redis中的数据状态为exception + String key = relightResultKey + ":" + generateResult.get("tasks_id"); + redisUtil.addToString(key, new Gson().toJson(new GenerateResultVO(generateResult.get("tasks_id"), null, null, "Fail")), CommonConstant.GENERATE_RESULT_EXPIRE_TIME); + // 将异常信息存到exception中 + HashMap exceptionInfo = new HashMap<>(); + exceptionInfo.put(generateResult.get("tasks_id"), generateResult.get("data")); + // 存redis + redisUtil.addToMap(exceptionMapKey, exceptionInfo); + } + } catch (Exception e) { + log.error(e.getMessage()); + try { + channel.basicAck(msg.getMessageProperties().getDeliveryTag(), false); + // 将消息从redis排队队列中删除,需保证被消费的消息存储到db之后再从redis删除 + redisUtil.removeFromZSet(consumptionOrderKey, generateResult.get("tasks_id")); + } catch (IOException exception) { + log.error("手动确认,取消返回队列,不再重新消费"); + } + // 将入参和错误信息存入数据库 + String exceptionMessage = JSONObject.toJSONString(generateResult) + + " Exception message : " + e.getMessage(); + HashMap exceptionInfo = new HashMap<>(); + exceptionInfo.put(String.valueOf(generateResult.get("tasks_id")), exceptionMessage); + // 存redis + redisUtil.addToMap(exceptionMapKey, exceptionInfo); + } + + long end = System.currentTimeMillis(); + log.info("tasks_id : {}, end , message : {}, 执行时长: {} 毫秒", generateResult.get("tasks_id"), generateResult.get("message"), (end - start)); + log.info("============ProcessRelightResult End listening=========="); + } + @RabbitListener(queues = "#{rabbitMQProperties.queues.generate}") @RabbitHandler public void generateConsumer1(Message msg, Channel channel) { @@ -400,4 +498,15 @@ public class GenerateConsumer { public void getDesignBatchResult(Message msg, Channel channel) { processDesignBatchResult(msg, channel); } + @RabbitListener(queues = "#{rabbitMQProperties.queues.toProductImageBatch}") + @RabbitHandler + public void getToProductImageBatchResult(Message msg, Channel channel) { + processToProductImageBatchResult(msg, channel); + } + + @RabbitListener(queues = "#{rabbitMQProperties.queues.relightBatch}") + @RabbitHandler + public void getRelightBatchResult(Message msg, Channel channel) { + processRelightBatchResult(msg, channel); + } } diff --git a/src/main/java/com/ai/da/common/RabbitMQ/RabbitMQProperties.java b/src/main/java/com/ai/da/common/RabbitMQ/RabbitMQProperties.java index 6c85da94..71a3cc5c 100644 --- a/src/main/java/com/ai/da/common/RabbitMQ/RabbitMQProperties.java +++ b/src/main/java/com/ai/da/common/RabbitMQ/RabbitMQProperties.java @@ -22,6 +22,8 @@ public class RabbitMQProperties { private String relightResult; private String poseTransform; private String designBatch; + private String relightBatch; + private String toProductImageBatch; } @Data diff --git a/src/main/java/com/ai/da/controller/DesignController.java b/src/main/java/com/ai/da/controller/DesignController.java index f3f54343..c423ee6a 100644 --- a/src/main/java/com/ai/da/controller/DesignController.java +++ b/src/main/java/com/ai/da/controller/DesignController.java @@ -7,6 +7,7 @@ import com.ai.da.mapper.primary.entity.CloudTask; import com.ai.da.model.dto.*; import com.ai.da.model.vo.*; import com.ai.da.service.DesignService; +import com.ai.da.service.UserLikeGroupService; import io.swagger.annotations.Api; import io.swagger.annotations.ApiOperation; import io.swagger.annotations.ApiParam; @@ -27,6 +28,8 @@ import java.util.List; public class DesignController { @Resource private DesignService designService; + @Resource + private UserLikeGroupService userLikeGroupService; @ApiOperation(value = "设计 Conllection") @PostMapping("/designCollection") @@ -109,7 +112,14 @@ public class DesignController { @ApiOperation(value = "获取design云生成结果") @PostMapping("/getDesignCloudResult") - public Response> getDesignCloudResult(@Valid @RequestBody DesignCloudResultQuery designCloudResultQuery) { - return Response.success(PageBaseResponse.success(designService.getDesignCloudResult(designCloudResultQuery))); + public Response getDesignCloudResult(@Valid @RequestBody DesignCloudResultQuery designCloudResultQuery) { + return Response.success(designService.getDesignCloudResult(designCloudResultQuery)); + } + + @ApiOperation(value = "获取生成结果") + @PostMapping("/toProductImageBatchResult") + public Response> getToProductImageResult(@Valid @RequestBody List taskIdList) { + List magicToolResultVOList = userLikeGroupService.getToProductImageResultList(taskIdList); + return Response.success(magicToolResultVOList); } } diff --git a/src/main/java/com/ai/da/mapper/primary/entity/ToProductImageResult.java b/src/main/java/com/ai/da/mapper/primary/entity/ToProductImageResult.java index 556e71ac..c6b601cd 100644 --- a/src/main/java/com/ai/da/mapper/primary/entity/ToProductImageResult.java +++ b/src/main/java/com/ai/da/mapper/primary/entity/ToProductImageResult.java @@ -51,4 +51,6 @@ public class ToProductImageResult implements Serializable { private String direction; private Long projectId; + + private String taskIdBatch; } diff --git a/src/main/java/com/ai/da/model/dto/CloudTaskDTO.java b/src/main/java/com/ai/da/model/dto/CloudTaskDTO.java index 8edb9d85..deba7f7b 100644 --- a/src/main/java/com/ai/da/model/dto/CloudTaskDTO.java +++ b/src/main/java/com/ai/da/model/dto/CloudTaskDTO.java @@ -5,5 +5,7 @@ import lombok.Data; @Data public class CloudTaskDTO extends CloudTask { + private ToProductImageDTO toProductImage; + } diff --git a/src/main/java/com/ai/da/model/dto/DesignCloudResultQuery.java b/src/main/java/com/ai/da/model/dto/DesignCloudResultQuery.java index 51e8d6a5..ba656774 100644 --- a/src/main/java/com/ai/da/model/dto/DesignCloudResultQuery.java +++ b/src/main/java/com/ai/da/model/dto/DesignCloudResultQuery.java @@ -6,4 +6,5 @@ import lombok.Data; @Data public class DesignCloudResultQuery extends PageQueryBaseVo { private String taskId; + private String buildType; } diff --git a/src/main/java/com/ai/da/model/enums/BuildType.java b/src/main/java/com/ai/da/model/enums/BuildType.java new file mode 100644 index 00000000..7188b164 --- /dev/null +++ b/src/main/java/com/ai/da/model/enums/BuildType.java @@ -0,0 +1,32 @@ +package com.ai.da.model.enums; + +import com.fasterxml.jackson.annotation.JsonValue; + +public enum BuildType implements IEnumDisplay { + DESIGN("design"), + TO_PRODUCT_IMAGE("toProductImage"), + + RELIGHT("relight") + ; + + private String value; + + BuildType(String value) { + this.value = value; + } + + @Override + @JsonValue + public String getValue() { + return this.value; + } + + public static BuildType getBuildType(String value) { + for (BuildType type : values()) { + if (type.value.equalsIgnoreCase(value)) { + return type; + } + } + throw new IllegalArgumentException("No matching constant for [" + value + "]"); + } +} diff --git a/src/main/java/com/ai/da/model/vo/CloudTaskResultVO.java b/src/main/java/com/ai/da/model/vo/CloudTaskResultVO.java new file mode 100644 index 00000000..559a5633 --- /dev/null +++ b/src/main/java/com/ai/da/model/vo/CloudTaskResultVO.java @@ -0,0 +1,12 @@ +package com.ai.da.model.vo; + +import com.ai.da.common.response.PageBaseResponse; +import lombok.Data; + +import java.util.List; + +@Data +public class CloudTaskResultVO { + private PageBaseResponse design; + private List toProductImage; +} diff --git a/src/main/java/com/ai/da/python/PythonService.java b/src/main/java/com/ai/da/python/PythonService.java index fc64629d..8e1d08c8 100644 --- a/src/main/java/com/ai/da/python/PythonService.java +++ b/src/main/java/com/ai/da/python/PythonService.java @@ -4250,4 +4250,96 @@ public class PythonService { response.close(); } } + + public Boolean toProductImageBatch(String url, String taskId, String prompt, BigDecimal imageStrength, String productType) { + // todo 限流校验 +// AccessLimitUtils.validate("design",5); + OkHttpClient client = new OkHttpClient().newBuilder() + .connectTimeout(30, TimeUnit.SECONDS) + .pingInterval(5, TimeUnit.SECONDS)//websocket轮训间隔(单位:秒) + .readTimeout(60, TimeUnit.SECONDS)//读取超时(单位:秒) + .writeTimeout(60, TimeUnit.SECONDS)//写入超时(单位:秒) + .build(); + MediaType mediaType = MediaType.parse("application/json"); + //关闭FastJson的引用检测 防止出现$ref 现象 + Map map = new HashMap<>(); + map.put("tasks_id", taskId); + map.put("image_url", url); + map.put("prompt", prompt); + map.put("image_strength", imageStrength); + map.put("product_type", productType); + map.put("batch_size", 1); + log.info("toProductImage请求python 参数:####{}", map); + String param = JSON.toJSONString(map, SerializerFeature.WriteNullStringAsEmpty); + System.out.println(param); + RequestBody body = RequestBody.create(mediaType, param); + Request request = new Request.Builder() +// .url(accessPythonIp + ":" + accessPythonPort + "/api/generate_product_image") +// .url(accessPythonIp + ":9996/api/generate_product_image") + .url(accessPythonIp + ":" + accessPythonPort + "/api/batch_generate_product_image") + .method("POST", body) + .addHeader("Authorization", "Basic YWlkbGFiOjEyMw==") + .addHeader("Content-Type", "application/json") + .build(); + Response response; + String responseBody; + try { + response = client.newCall(request).execute(); + } catch (IOException ioException) { + log.error("PythonService##toProductImage异常###{}", ExceptionUtil.getThrowableList(ioException)); + throw new BusinessException("toProductImage.interface.exception"); + } + if (response.isSuccessful()) { + return Boolean.TRUE; + } + log.error("PythonService##toProductImage异常response###{}", response); + //生成失败 + throw new BusinessException("toProductImage.interface.exception"); + } + + public Boolean relightBatch(String url, String taskId, String prompt, String direction, String relightType) { + // todo 限流校验 +// AccessLimitUtils.validate("design",5); + OkHttpClient client = new OkHttpClient().newBuilder() + .connectTimeout(30, TimeUnit.SECONDS) + .pingInterval(5, TimeUnit.SECONDS)//websocket轮训间隔(单位:秒) + .readTimeout(60, TimeUnit.SECONDS)//读取超时(单位:秒) + .writeTimeout(60, TimeUnit.SECONDS)//写入超时(单位:秒) + .build(); + MediaType mediaType = MediaType.parse("application/json"); + //关闭FastJson的引用检测 防止出现$ref 现象 + Map map = new HashMap<>(); + map.put("tasks_id", taskId); + map.put("image_url", url); + map.put("prompt", prompt); + map.put("direction", direction); + map.put("product_type", relightType); + map.put("batch_size", 1); + log.info("relightImage请求python 参数:####{}", map); + String param = JSON.toJSONString(map, SerializerFeature.WriteNullStringAsEmpty); + log.info(param); + RequestBody body = RequestBody.create(mediaType, param); + Request request = new Request.Builder() +// .url(accessPythonIp + ":" + accessPythonPort + "/api/generate_product_image") +// .url(accessPythonIp + ":9996/api/generate_product_image") + .url(accessPythonIp + ":" + accessPythonPort + "/api/batch_generate_relight_image") + .method("POST", body) + .addHeader("Authorization", "Basic YWlkbGFiOjEyMw==") + .addHeader("Content-Type", "application/json") + .build(); + Response response; + String responseBody; + try { + response = client.newCall(request).execute(); + } catch (IOException ioException) { + log.error("PythonService##relightImage异常###{}", ExceptionUtil.getThrowableList(ioException)); + throw new BusinessException("relightImage.interface.exception"); + } + if (response.isSuccessful()) { + return Boolean.TRUE; + } + log.error("PythonService##relightImage异常response###{}", response); + //生成失败 + throw new BusinessException("relightImage.interface.exception"); + } } diff --git a/src/main/java/com/ai/da/service/DesignService.java b/src/main/java/com/ai/da/service/DesignService.java index e4f50473..feb27ee0 100644 --- a/src/main/java/com/ai/da/service/DesignService.java +++ b/src/main/java/com/ai/da/service/DesignService.java @@ -116,5 +116,5 @@ public interface DesignService extends IService { IPage cloudPage(CloudPageDTO cloudPageDTO); - IPage getDesignCloudResult(DesignCloudResultQuery designCloudResultQuery); + CloudTaskResultVO getDesignCloudResult(DesignCloudResultQuery designCloudResultQuery); } diff --git a/src/main/java/com/ai/da/service/UserLikeGroupService.java b/src/main/java/com/ai/da/service/UserLikeGroupService.java index 16c2e09a..27ee0396 100644 --- a/src/main/java/com/ai/da/service/UserLikeGroupService.java +++ b/src/main/java/com/ai/da/service/UserLikeGroupService.java @@ -109,4 +109,6 @@ public interface UserLikeGroupService extends IService { Boolean delete(Long projectId); Boolean brandDNADelete(BrandDNADTO brandDNADTO); + + void toProductBatch(String taskId, String url, String progress); } diff --git a/src/main/java/com/ai/da/service/impl/DesignServiceImpl.java b/src/main/java/com/ai/da/service/impl/DesignServiceImpl.java index fe681785..4401400a 100644 --- a/src/main/java/com/ai/da/service/impl/DesignServiceImpl.java +++ b/src/main/java/com/ai/da/service/impl/DesignServiceImpl.java @@ -7,11 +7,14 @@ import com.ai.da.common.config.exception.BusinessException; import com.ai.da.common.constant.CommonConstant; import com.ai.da.common.context.UserContext; import com.ai.da.common.enums.*; +import com.ai.da.common.response.PageBaseResponse; +import com.ai.da.common.response.ResultEnum; import com.ai.da.common.utils.*; import com.ai.da.mapper.primary.*; import com.ai.da.mapper.primary.entity.*; import com.ai.da.mapper.primary.entity.Collection; import com.ai.da.model.dto.*; +import com.ai.da.model.enums.BuildType; import com.ai.da.model.vo.*; import com.ai.da.python.PythonService; import com.ai.da.python.vo.*; @@ -27,6 +30,7 @@ import com.baomidou.mybatisplus.extension.plugins.pagination.Page; import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; import com.google.common.base.Function; import com.google.common.collect.Lists; +import com.google.gson.Gson; import io.netty.util.internal.StringUtil; import lombok.extern.slf4j.Slf4j; import okhttp3.*; @@ -97,6 +101,12 @@ public class DesignServiceImpl extends ServiceImpl impleme @Resource private TDesignPythonOutfitMapper designPythonOutfitMapper; + @Resource + private DesignItemDetailMapper designItemDetailMapper; + @Resource + private ToProductImageResultMapper toProductImageResultMapper; + @Resource + private ToProductElementMapper toProductElementMapper; @Resource private MoodboardPositionMapper moodboardPositionMapper; @@ -128,6 +138,10 @@ public class DesignServiceImpl extends ServiceImpl impleme private CloudTaskMapper cloudTaskMapper; @Resource private CloudTaskService cloudTaskService; + @Resource + private CreditsService creditsService; + @Resource + private ToProductImageRecordMapper toProductImageRecordMapper; private final ConcurrentHashMap> designContext = new ConcurrentHashMap<>(); @@ -1780,32 +1794,274 @@ public class DesignServiceImpl extends ServiceImpl impleme @Override public String designCloud(CloudTaskDTO cloudTaskDTO) { + if (cloudTaskDTO.getBuildType().equals(BuildType.DESIGN.getValue())) { + Long projectId = cloudTaskDTO.getProjectId(); + Project project = projectService.getById(projectId); + project.setParentId(projectId); + project.setId(null); + project.setName(project.getName() + "_cloud"); + LocalDateTime now = LocalDateTime.now(); + project.setCreateTime(now); + project.setUpdateTime(now); + projectService.getBaseMapper().insert(project); + Long workspaceId = workspaceService.getByProjectId(projectId); + Workspace workspace = workspaceService.getById(workspaceId); + workspace.setProjectId(project.getId()); + workspace.setId(null); + workspaceService.getBaseMapper().insert(workspace); - Long projectId = cloudTaskDTO.getProjectId(); - Project project = projectService.getById(projectId); - project.setParentId(projectId); - project.setId(null); - project.setName(project.getName() + "_cloud"); - LocalDateTime now = LocalDateTime.now(); - project.setCreateTime(now); - project.setUpdateTime(now); - projectService.getBaseMapper().insert(project); - Long workspaceId = workspaceService.getByProjectId(projectId); - Workspace workspace = workspaceService.getById(workspaceId); - workspace.setProjectId(project.getId()); - workspace.setId(null); - workspaceService.getBaseMapper().insert(workspace); + DesignCollectionDTO designDTO = transDesignParam(projectId, project.getId()); + designDTO.setDesignNum(cloudTaskDTO.getNums()); + AuthPrincipalVo userInfo = UserContext.getUserHolder(); - DesignCollectionDTO designDTO = transDesignParam(projectId, project.getId()); - designDTO.setDesignNum(cloudTaskDTO.getNums()); - AuthPrincipalVo userInfo = UserContext.getUserHolder(); + //校验collection element + ValidateElementVO elementVO = collectionElementService.validateElement(designDTO); - //校验collection element - ValidateElementVO elementVO = collectionElementService.validateElement(designDTO); + //design + String taskId = designBatch(designDTO, userInfo, null, elementVO, cloudTaskDTO, project.getId()); + return taskId; + }else if (cloudTaskDTO.getBuildType().equals(BuildType.TO_PRODUCT_IMAGE.getValue())) { + ToProductImageDTO toProductImageDTO = cloudTaskDTO.getToProductImage(); + // 判断用户当前积分是否够本次生成消耗 +// Boolean preDeduction = creditsService.creditsPreDeduction(CreditsEventsEnum.TO_PRODUCT_IMAGE, toProductImageDTO.getToProductImageVOList().size()); +// if (!preDeduction) { +// throw new BusinessException("Your remaining credits are insufficient for this generation. Please recharge.", ResultEnum.WARNING.getCode()); +// } + AuthPrincipalVo userHolder = UserContext.getUserHolder(); - //design - String taskId = designBatch(designDTO, userInfo, null, elementVO, cloudTaskDTO, project.getId()); - return taskId; + String batchTaskId = UUID.randomUUID() + "-" + userHolder.getId(); + + Long projectId = cloudTaskDTO.getProjectId(); + UserLikeGroup userLikeGroup = userLikeGroupService.getByProjectId(projectId); + Long userLikeGroupId = null; + ToProductImageRecord toProductImageRecord = new ToProductImageRecord(); + toProductImageRecord.setProjectId(projectId); + if (Objects.nonNull(userLikeGroup)) { + userLikeGroupId = userLikeGroup.getId(); + toProductImageRecord.setUserLikeGroupId(userLikeGroupId); + } + + toProductImageRecord.setCreateTime(LocalDateTime.now()); + if (!StringUtils.isEmpty(toProductImageDTO.getPrompt())) { + toProductImageRecord.setPrompt(toProductImageDTO.getPrompt()); + } + toProductImageRecordMapper.insert(toProductImageRecord); + + List result = new ArrayList<>(); + + int i = 0; + // 翻译 + String prompt = toProductImageDTO.getPrompt(); + StringBuilder sb = new StringBuilder("The best quality, masterpiece, real image."); + if (!StringUtil.isNullOrEmpty(prompt)) { + prompt = pythonService.promptTranslate(prompt); + } + for (ToProductImageVO toProductImageVO : toProductImageDTO.getToProductImageVOList()) { + String taskId; + if (toProductImageVO.getElementType().equals("DesignOutfit")) { + taskId = UUID.randomUUID() + "-" + i + "-" + userHolder.getId(); + TDesignPythonOutfit tDesignPythonOutfit = designPythonOutfitMapper.selectById(toProductImageVO.getElementId()); + + Long designItemId = tDesignPythonOutfit.getDesignItemId(); + QueryWrapper designItemDetailQueryWrapper = new QueryWrapper<>(); + designItemDetailQueryWrapper.lambda().eq(DesignItemDetail::getDesignItemId, designItemId); + designItemDetailQueryWrapper.lambda().ne(DesignItemDetail::getType, "Body"); + List designItemDetails = designItemDetailMapper.selectList(designItemDetailQueryWrapper); + String collect = designItemDetails.stream().map(DesignItemDetail::getType).collect(Collectors.joining(",")); + + Long designId = tDesignPythonOutfit.getDesignId(); + Design design = designMapper.selectById(designId); + String productType = "overall"; + if (design.getSingleOverall().equals("single")) { + productType = "single"; + sb.append(collect); + }else { + if (collect.contains("Tops")) { + sb.append("a handsome man,"); + }else { + sb.append("a beautiful women,"); + } + sb.append("wearing ").append(collect); + } + if (StringUtils.isEmpty(prompt)) { + sb.append(",high quality clothing details,8K realistic,HDR"); + }else { + sb.append(",high quality clothing details,").append(prompt).append(",8K realistic,HDR"); + } + // 走模型 + pythonService.toProductImageBatch(tDesignPythonOutfit.getDesignUrl(), taskId, sb.toString(), toProductImageDTO.getImageStrength(), productType); + ToProductImageResult toProductImageResult = new ToProductImageResult(); + toProductImageResult.setElementId(tDesignPythonOutfit.getId()); + toProductImageResult.setElementType("DesignOutfit"); + toProductImageResult.setCreateTime(LocalDateTime.now()); + toProductImageResult.setToProductImageRecordId(toProductImageRecord.getId()); +// toProductImageResult.setUrl(productImageUrl); + toProductImageResult.setIsLike(0); + toProductImageResult.setTaskId(taskId); + toProductImageResult.setProjectId(projectId); + toProductImageResult.setTaskIdBatch(batchTaskId); + if (userLikeGroupId != null) { + toProductImageResult.setUserLikeGroupId(userLikeGroupId); + } + toProductImageResult.setImageStrength(toProductImageDTO.getImageStrength()); + toProductImageResultMapper.insert(toProductImageResult); +// toProductImageResult.setUrl(minioUtil.getPresignedUrl(toProductImageResult.getUrl(), 24 * 60)); + result.add(toProductImageResult); + }else { + if (StringUtils.isEmpty(prompt)) { + sb.append(",high quality clothing details,8K realistic,HDR"); + }else { + sb.append(",high quality clothing details,").append(prompt).append(",8K realistic,HDR"); + } + + taskId = UUID.randomUUID() + "-" + i + "-" + userHolder.getId(); + ToProductElement toProductElement = toProductElementMapper.selectById(toProductImageVO.getElementId()); + // 走模型 + pythonService.toProductImageBatch(toProductElement.getUrl(), taskId, sb.toString(), toProductImageDTO.getImageStrength(), "overall"); + ToProductImageResult toProductImageResult = new ToProductImageResult(); + toProductImageResult.setElementId(toProductElement.getId()); + toProductImageResult.setElementType("ProductElement"); + toProductImageResult.setCreateTime(LocalDateTime.now()); + toProductImageResult.setToProductImageRecordId(toProductImageRecord.getId()); +// toProductImageResult.setUrl(productImageUrl); + toProductImageResult.setIsLike(0); + toProductImageResult.setTaskId(taskId); + toProductImageResult.setProjectId(projectId); + toProductImageResult.setTaskIdBatch(batchTaskId); + if (userLikeGroupId != null) { + toProductImageResult.setUserLikeGroupId(userLikeGroupId); + } + toProductImageResult.setImageStrength(toProductImageDTO.getImageStrength()); + toProductImageResultMapper.insert(toProductImageResult); +// toProductImageResult.setUrl(minioUtil.getPresignedUrl(toProductImageResult.getUrl(), 24 * 60)); + result.add(toProductImageResult); + } + i ++; + sb = new StringBuilder("The best quality, masterpiece, real image."); + // 添加需要扣除的积分到预扣除区 + creditsService.addRecordToCreditsDeduction(userHolder.getId(), taskId, CreditsEventsEnum.TO_PRODUCT_IMAGE); + } + CloudTask cloudTask = CopyUtil.copyObject(cloudTaskDTO, CloudTask.class); + cloudTask.setProjectId(projectId); + cloudTask.setTaskId(batchTaskId); + LocalDateTime now = LocalDateTime.now(); + cloudTask.setCreateTime(now); + cloudTask.setUpdateTime(now); + cloudTaskMapper.insert(cloudTask); + return batchTaskId; + }else if (cloudTaskDTO.getBuildType().equals(BuildType.RELIGHT.getValue())) { + ToProductImageDTO toProductImageDTO = cloudTaskDTO.getToProductImage(); + // 判断用户当前积分是否够本次生成消耗 +// Boolean preDeduction = creditsService.creditsPreDeduction(CreditsEventsEnum.RELIGHT, toProductImageDTO.getToProductImageVOList().size()); +// if (!preDeduction) { +// throw new BusinessException("Your remaining credits are insufficient for this generation. Please recharge.", ResultEnum.WARNING.getCode()); +// } + + AuthPrincipalVo userHolder = UserContext.getUserHolder(); + String batchTaskId = UUID.randomUUID() + "-" + userHolder.getId(); + Long projectId = cloudTaskDTO.getProjectId(); + UserLikeGroup userLikeGroup = userLikeGroupService.getByProjectId(projectId); + Long userLikeGroupId = null; + + ToProductImageRecord toProductImageRecord = new ToProductImageRecord(); + toProductImageRecord.setProjectId(projectId); + if (Objects.nonNull(userLikeGroup)) { + userLikeGroupId = userLikeGroup.getId(); + toProductImageRecord.setUserLikeGroupId(userLikeGroupId); + } + + toProductImageRecord.setCreateTime(LocalDateTime.now()); + if (!StringUtils.isEmpty(toProductImageDTO.getPrompt())) { + toProductImageRecord.setPrompt(toProductImageDTO.getPrompt()); + } + toProductImageRecordMapper.insert(toProductImageRecord); + + List result = new ArrayList<>(); + + int i = 0; + // 翻译 + String prompt = toProductImageDTO.getPrompt(); + String s = ""; + if (!StringUtil.isNullOrEmpty(prompt)) { + s = pythonService.promptTranslate(prompt); + }else { + s = "Snow moutain, snowy day, natural light"; + } + for (ToProductImageVO toProductImageVO : toProductImageDTO.getToProductImageVOList()) { + String taskId = UUID.randomUUID() + "-" + i + "-" + userHolder.getId(); + i ++; + if (toProductImageVO.getElementType().equals("ToProductImage")) { + ToProductImageResult toProductImageResult1 = toProductImageResultMapper.selectById(toProductImageVO.getElementId()); + String relightType = "overall"; + if (toProductImageResult1.getElementType().equals("DesignOutfit")) { + TDesignPythonOutfit tDesignPythonOutfit = designPythonOutfitMapper.selectById(toProductImageResult1.getElementId()); + Long designId = tDesignPythonOutfit.getDesignId(); + Design design = designMapper.selectById(designId); + if (design.getSingleOverall().equals("single")) { + relightType = "single"; + } + } + + // 走模型 + pythonService.relightBatch(toProductImageResult1.getUrl(), taskId, s, toProductImageDTO.getDirection(), relightType); + ToProductImageResult toProductImageResult = new ToProductImageResult(); + toProductImageResult.setElementId(toProductImageResult1.getId()); + toProductImageResult.setElementType("ToProductImage"); + toProductImageResult.setCreateTime(LocalDateTime.now()); + toProductImageResult.setToProductImageRecordId(toProductImageRecord.getId()); +// toProductImageResult.setUrl(productImageUrl); + toProductImageResult.setIsLike(0); + toProductImageResult.setTaskId(taskId); + toProductImageResult.setProjectId(projectId); + toProductImageResult.setTaskIdBatch(batchTaskId); + if (null != userLikeGroupId) { + toProductImageResult.setUserLikeGroupId(userLikeGroupId); + } + if (toProductImageDTO.getBrightenValue() != null) { + toProductImageResult.setBrightenValue(toProductImageDTO.getBrightenValue()); + } + toProductImageResult.setDirection(toProductImageDTO.getDirection()); + toProductImageResultMapper.insert(toProductImageResult); +// toProductImageResult.setUrl(minioUtil.getPresignedUrl(toProductImageResult.getUrl(), 24 * 60)); + result.add(toProductImageResult); + }else { + ToProductElement toProductElement = toProductElementMapper.selectById(toProductImageVO.getElementId()); + // 走模型 + pythonService.relightBatch(toProductElement.getUrl(), taskId, s, toProductImageDTO.getDirection(), "overall"); + ToProductImageResult toProductImageResult = new ToProductImageResult(); + toProductImageResult.setElementId(toProductElement.getId()); + toProductImageResult.setElementType("ProductElement"); + toProductImageResult.setCreateTime(LocalDateTime.now()); + toProductImageResult.setToProductImageRecordId(toProductImageRecord.getId()); +// toProductImageResult.setUrl(productImageUrl); + toProductImageResult.setIsLike(0); + toProductImageResult.setTaskId(taskId); + toProductImageResult.setProjectId(projectId); + toProductImageResult.setTaskIdBatch(batchTaskId); + if (null != userLikeGroupId) { + toProductImageResult.setUserLikeGroupId(userLikeGroupId); + } + if (toProductImageDTO.getBrightenValue() != null) { + toProductImageResult.setBrightenValue(toProductImageDTO.getBrightenValue()); + } + toProductImageResult.setDirection(toProductImageDTO.getDirection()); + toProductImageResultMapper.insert(toProductImageResult); +// toProductImageResult.setUrl(minioUtil.getPresignedUrl(toProductImageResult.getUrl(), 24 * 60)); + result.add(toProductImageResult); + } + // 添加需要扣除的积分到预扣除区 +// creditsService.addRecordToCreditsDeduction(userHolder.getId(), taskId, CreditsEventsEnum.RELIGHT); + } + CloudTask cloudTask = CopyUtil.copyObject(cloudTaskDTO, CloudTask.class); + cloudTask.setProjectId(projectId); + cloudTask.setTaskId(batchTaskId); + LocalDateTime now = LocalDateTime.now(); + cloudTask.setCreateTime(now); + cloudTask.setUpdateTime(now); + cloudTaskMapper.insert(cloudTask); + return batchTaskId; + } + return null; } private DesignCollectionDTO transDesignParam(Long projectId, Long projectIdNew) { @@ -2228,30 +2484,58 @@ public class DesignServiceImpl extends ServiceImpl impleme } @Override - public IPage getDesignCloudResult(DesignCloudResultQuery query) { - CloudTask cloudTask = cloudTaskService.getByTaskId(query.getTaskId()); - if (Objects.nonNull(cloudTask)) { - Long collectionId = cloudTask.getCollectionId(); - if (null != collectionId) { - QueryWrapper qw = new QueryWrapper<>(); - qw.lambda().eq(TDesignPythonOutfit::getCollectionId, collectionId); - Page page = designPythonOutfitMapper.selectPage(new Page<>(query.getPage(), query.getSize()), qw); - IPage convert = page.convert((Function) outfit -> { - if (outfit != null) { - DesignCollectionItemVO vo = new DesignCollectionItemVO(); - vo.setDesignOutfitId(outfit.getId()); - vo.setDesignOutfitUrl(minioUtil.getPreSignedUrl(outfit.getDesignUrl(), 24 * 60)); - vo.setDesignItemId(outfit.getDesignItemId()); - return vo; - } - return null; - }); - return convert; - }else { - return new Page<>(); + public CloudTaskResultVO getDesignCloudResult(DesignCloudResultQuery query) { + CloudTaskResultVO result = new CloudTaskResultVO(); + if (query.getBuildType().equals(BuildType.DESIGN.getValue())) { + CloudTask cloudTask = cloudTaskService.getByTaskId(query.getTaskId()); + if (Objects.nonNull(cloudTask)) { + Long collectionId = cloudTask.getCollectionId(); + if (null != collectionId) { + QueryWrapper qw = new QueryWrapper<>(); + qw.lambda().eq(TDesignPythonOutfit::getCollectionId, collectionId); + Page page = designPythonOutfitMapper.selectPage(new Page<>(query.getPage(), query.getSize()), qw); + IPage convert = page.convert((Function) outfit -> { + if (outfit != null) { + DesignCollectionItemVO vo = new DesignCollectionItemVO(); + vo.setDesignOutfitId(outfit.getId()); + vo.setDesignOutfitUrl(minioUtil.getPreSignedUrl(outfit.getDesignUrl(), 24 * 60)); + vo.setDesignItemId(outfit.getDesignItemId()); + return vo; + } + return null; + }); + result.setDesign(PageBaseResponse.success(convert)); + return result; + }else { + result.setDesign(PageBaseResponse.success(new Page<>())); + return result; + } } + result.setDesign(PageBaseResponse.success(new Page<>())); + return result; + } else if (query.getBuildType().equals(BuildType.TO_PRODUCT_IMAGE.getValue())) { + List results = new ArrayList<>(); + QueryWrapper toProductImageResultQueryWrapper = new QueryWrapper<>(); + toProductImageResultQueryWrapper.lambda().eq(ToProductImageResult::getTaskIdBatch, query.getTaskId()); + List toProductImageResultList = toProductImageResultMapper.selectList(toProductImageResultQueryWrapper); + for (ToProductImageResult toProductImageResult : toProductImageResultList) { + MagicToolResultVO magicToolResultVO = new MagicToolResultVO(); + magicToolResultVO.setUrl(minioUtil.getPreSignedUrl(toProductImageResult.getUrl(), CommonConstant.MINIO_IMAGE_EXPIRE_TIME)); + magicToolResultVO.setResultType(toProductImageResult.getResultType()); + magicToolResultVO.setElementId(toProductImageResult.getElementId()); + magicToolResultVO.setElementType(toProductImageResult.getElementType()); + if (toProductImageResult.getElementType().equals("ProductElement")) { + ToProductElement toProductElement = toProductElementMapper.selectById(toProductImageResult.getElementId()); + magicToolResultVO.setSourceUrl(minioUtil.getPreSignedUrl(toProductElement.getUrl(), 24 * 60)); + }else { + TDesignPythonOutfit tDesignPythonOutfit = designPythonOutfitMapper.selectById(toProductImageResult.getElementId()); + magicToolResultVO.setSourceUrl(minioUtil.getPreSignedUrl(tDesignPythonOutfit.getDesignUrl(), 24 * 60)); + } + } + result.setToProductImage(results); + return result; } - return new Page<>(); + return result; } } \ No newline at end of file diff --git a/src/main/java/com/ai/da/service/impl/PortfolioServiceImpl.java b/src/main/java/com/ai/da/service/impl/PortfolioServiceImpl.java index b76e36a8..5c68e7d1 100644 --- a/src/main/java/com/ai/da/service/impl/PortfolioServiceImpl.java +++ b/src/main/java/com/ai/da/service/impl/PortfolioServiceImpl.java @@ -169,11 +169,11 @@ public class PortfolioServiceImpl extends ServiceImpl qw = new QueryWrapper<>(); + qw.lambda().eq(ToProductImageResult::getTaskId, taskId); + ToProductImageResult toProductImageResult = toProductImageResultMapper.selectOne(qw); + if (Objects.nonNull(toProductImageResult)) { + toProductImageResult.setUrl(url); + toProductImageResultMapper.updateById(toProductImageResult); + String taskIdBatch = toProductImageResult.getTaskIdBatch(); + QueryWrapper cloudTaskQueryWrapper = new QueryWrapper<>(); + cloudTaskQueryWrapper.lambda().eq(CloudTask::getTaskId, taskIdBatch); + CloudTask cloudTask = cloudTaskMapper.selectOne(cloudTaskQueryWrapper); + if (Objects.nonNull(cloudTask)) { + if (cloudTask.getCompletedNum() == null) { + cloudTask.setCompletedNum(1); + }else { + cloudTask.setCompletedNum(cloudTask.getCompletedNum() + 1); + } + if (progress.equals("OK")) { + cloudTask.setStatus(1); + cloudTask.setCompletedNum(cloudTask.getNums()); + } + cloudTaskMapper.updateById(cloudTask); + } + } + + } } diff --git a/src/main/resources/application-dev.properties b/src/main/resources/application-dev.properties index c386dcd6..2b3eef21 100644 --- a/src/main/resources/application-dev.properties +++ b/src/main/resources/application-dev.properties @@ -107,7 +107,9 @@ rabbitmq.queues.toProductImageResult=ToProductImage-dev rabbitmq.queues.relightResult=Relight-dev rabbitmq.queues.poseTransform=PoseTransform-dev rabbitmq.exchange.generate=generate-exchange -rabbitmq.queues.designBatch=DesignBatch +rabbitmq.queues.designBatch=BatchRelight-dev +rabbitmq.queues.relightBatch=BatchRelight-dev +rabbitmq.queues.toProductImageBatch=BatchToProductImage-dev orderList.link=https://develop.aida.com.hk/home/homePage?order=