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 23fb9496..5499294f 100644 --- a/src/main/java/com/ai/da/common/RabbitMQ/GenerateConsumer.java +++ b/src/main/java/com/ai/da/common/RabbitMQ/GenerateConsumer.java @@ -5,8 +5,10 @@ import com.ai.da.common.utils.RedisUtil; import com.ai.da.model.dto.GenerateThroughImageTextDTO; import com.ai.da.model.vo.GenerateResultVO; import com.ai.da.model.vo.PoseTransformationVO; +import com.ai.da.service.DesignService; import com.ai.da.service.GenerateService; import com.ai.da.service.UserLikeGroupService; +import com.alibaba.fastjson.JSONArray; import com.alibaba.fastjson.JSONObject; import com.google.gson.Gson; import com.rabbitmq.client.Channel; @@ -17,6 +19,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; @@ -34,6 +37,9 @@ public class GenerateConsumer { @Resource private UserLikeGroupService userLikeGroupService; + @Resource + private DesignService designService; + @Autowired private RabbitMQProperties rabbitMQProperties; @@ -305,6 +311,170 @@ public class GenerateConsumer { } + private void processDesignBatchResult(Message msg, Channel channel) { + log.info("============processDesignBatchResult listening=========="); + long start = System.currentTimeMillis(); + + Map generateResult = JSONObject.parseObject(msg.getBody(), Map.class); + log.info("designBatch response : {}", generateResult); + designService.processDesignBatch(generateResult); + } + + private void processToProductImageBatchResult(Message msg, Channel channel) { + log.info("============processToProductImageResultBatch listening=========="); + long start = System.currentTimeMillis(); + + JSONObject generateResult = JSONObject.parseObject(msg.getBody(), JSONObject.class); + log.info("toProductImageBatch response : {}", generateResult); + + try { + log.info("tasks_id : {} start ", generateResult.get("task_id")); + if (!StringUtils.isEmpty(generateResult.getString("progress"))) { + String progress = generateResult.getString("progress"); + JSONArray result = generateResult.getJSONArray("result"); + String url = null; + if (!StringUtils.isEmpty(result)) { + url = result.getString(0); + } + String taskId = generateResult.getString("task_id"); + userLikeGroupService.toProductBatch(taskId, url, progress); + } else { + // 修改redis中的数据状态为exception + String key = toProductImageResultKey + ":" + generateResult.get("task_id"); + redisUtil.addToString(key, new Gson().toJson(new GenerateResultVO(generateResult.getString("task_id"), null, null, "Fail")), CommonConstant.GENERATE_RESULT_EXPIRE_TIME); + // 将异常信息存到exception中 + HashMap exceptionInfo = new HashMap<>(); + exceptionInfo.put(generateResult.getString("task_id"), generateResult.getString("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.getString("task_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("task_id")), exceptionMessage); + // 存redis + redisUtil.addToMap(exceptionMapKey, exceptionInfo); + } + + long end = System.currentTimeMillis(); + log.info("tasks_id : {}, end , message : {}, 执行时长: {} 毫秒", generateResult.get("task_id"), generateResult.get("message"), (end - start)); + log.info("============ProcessToProductImageBatchResult End listening=========="); + } + + private void processRelightBatchResult(Message msg, Channel channel) { + log.info("============processRelightResult listening=========="); + long start = System.currentTimeMillis(); + + JSONObject generateResult = JSONObject.parseObject(msg.getBody(), JSONObject.class); + log.info("relightBatch response : {}", generateResult); + + try { + log.info("task_id : {} start ", generateResult.get("task_id")); + if (!StringUtils.isEmpty(generateResult.getString("progress"))) { + String progress = generateResult.getString("progress"); + JSONArray result = generateResult.getJSONArray("result"); + String url = null; + if (!StringUtils.isEmpty(result)) { + url = result.getString(0); + String taskId = generateResult.getString("task_id"); + userLikeGroupService.relightBatch(taskId, url, progress); + } + } else { + // 修改redis中的数据状态为exception + String key = relightResultKey + ":" + generateResult.get("task_id"); + redisUtil.addToString(key, new Gson().toJson(new GenerateResultVO(generateResult.getString("task_id"), null, null, "Fail")), CommonConstant.GENERATE_RESULT_EXPIRE_TIME); + // 将异常信息存到exception中 + HashMap exceptionInfo = new HashMap<>(); + exceptionInfo.put(generateResult.getString("task_id"), generateResult.getString("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.getString("task_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("task_id")), exceptionMessage); + // 存redis + redisUtil.addToMap(exceptionMapKey, exceptionInfo); + } + + long end = System.currentTimeMillis(); + log.info("task_id : {}, end , message : {}, 执行时长: {} 毫秒", generateResult.get("task_id"), generateResult.get("message"), (end - start)); + log.info("============ProcessRelightBatchResult End listening=========="); + } + + private void processPoseTransformBatchResult(Message msg, Channel channel) { + log.info("============ProcessPoseTransformBatchResult listening=========="); + long start = System.currentTimeMillis(); + + JSONObject generateResult = JSONObject.parseObject(msg.getBody(), JSONObject.class); + log.info("PoseTransformationBatch response : {}", generateResult); + + try { + log.info("task_id : {} start ", generateResult.get("task_id")); + if (!StringUtils.isEmpty(generateResult.getString("progress"))) { + JSONArray result = generateResult.getJSONArray("result"); + if (!StringUtils.isEmpty(result)) { + JSONObject jsonObject = result.getJSONObject(0); + String gifUrl = jsonObject.getString("gif_url"); + String taskId = generateResult.getString("task_id"); + String videoUrl = jsonObject.getString("video_url"); + String imageUrl = jsonObject.getString("first_image_url"); + String progress = generateResult.getString("progress"); + generateService.processPoseTransformResultBatch(taskId, gifUrl, videoUrl, imageUrl, progress); + } + } else { + // 修改redis中的数据状态为exception + String key = generateResultKey + ":" + generateResult.getString("task_id"); + redisUtil.addToString(key, new Gson().toJson(new PoseTransformationVO(null, generateResult.getString("task_id"),null, null, null, (byte)0, "Fail")), CommonConstant.GENERATE_RESULT_EXPIRE_TIME); + // 将异常信息存到exception中 + HashMap exceptionInfo = new HashMap<>(); + exceptionInfo.put(generateResult.getString("task_id"), generateResult.getString("message")); + // 存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.getString("task_id")); + } catch (IOException exception) { + log.error("手动确认,取消返回队列,不再重新消费"); + } + // 将入参和错误信息存入数据库 + String exceptionMessage = JSONObject.toJSONString(generateResult) + + " Exception message : " + e.getMessage(); + HashMap exceptionInfo = new HashMap<>(); + exceptionInfo.put(generateResult.getString("task_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("============ProcessPoseTransformResult End listening=========="); + } + @RabbitListener(queues = "#{rabbitMQProperties.queues.generate}") @RabbitHandler public void generateConsumer1(Message msg, Channel channel) { @@ -382,4 +552,26 @@ public class GenerateConsumer { public void getPoseTransformationResult(Message msg, Channel channel) { processPoseTransformResult(msg, channel); } + @RabbitListener(queues = "#{rabbitMQProperties.queues.designBatch}") + @RabbitHandler + 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); + } + + @RabbitListener(queues = "#{rabbitMQProperties.queues.poseTransformBatch}") + @RabbitHandler + public void getPoseTransformBatchResult(Message msg, Channel channel) { + processPoseTransformBatchResult(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 55990193..5ce7e692 100644 --- a/src/main/java/com/ai/da/common/RabbitMQ/RabbitMQProperties.java +++ b/src/main/java/com/ai/da/common/RabbitMQ/RabbitMQProperties.java @@ -21,6 +21,10 @@ public class RabbitMQProperties { private String toProductImageResult; private String relightResult; private String poseTransform; + private String designBatch; + private String relightBatch; + private String toProductImageBatch; + private String poseTransformBatch; } @Data diff --git a/src/main/java/com/ai/da/controller/DesignController.java b/src/main/java/com/ai/da/controller/DesignController.java index 6046ed32..ad3d1032 100644 --- a/src/main/java/com/ai/da/controller/DesignController.java +++ b/src/main/java/com/ai/da/controller/DesignController.java @@ -1,12 +1,13 @@ package com.ai.da.controller; import com.ai.da.common.config.exception.BusinessException; +import com.ai.da.common.response.PageBaseResponse; import com.ai.da.common.response.Response; +import com.ai.da.mapper.primary.entity.CloudTask; import com.ai.da.model.dto.*; -import com.ai.da.model.vo.CollectionSketchVO; -import com.ai.da.model.vo.DesignCollectionVO; -import com.ai.da.model.vo.DesignLikeVO; +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") @@ -97,8 +100,19 @@ public class DesignController { @ApiOperation(value = "云生成") @PostMapping("/designCloud") - @CrossOrigin - public Response designCloud(@Valid @RequestBody DesignCollectionDTO designDTO) { - return Response.success(designService.designCloud(designDTO)); + public Response designCloud(@Valid @RequestBody CloudTaskDTO cloudTaskDTO) { + return Response.success(designService.designCloud(cloudTaskDTO)); + } + + @ApiOperation(value = "云生成page") + @PostMapping("/cloudPage") + public Response> cloudPage(@Valid @RequestBody CloudPageDTO cloudPageDTO) { + return Response.success(PageBaseResponse.success(designService.cloudPage(cloudPageDTO))); + } + + @ApiOperation(value = "获取design云生成结果") + @PostMapping("/getDesignCloudResult") + public Response getDesignCloudResult(@Valid @RequestBody DesignCloudResultQuery designCloudResultQuery) { + return Response.success(designService.getDesignCloudResult(designCloudResultQuery)); } } diff --git a/src/main/java/com/ai/da/mapper/primary/CloudTaskMapper.java b/src/main/java/com/ai/da/mapper/primary/CloudTaskMapper.java new file mode 100644 index 00000000..c8796b82 --- /dev/null +++ b/src/main/java/com/ai/da/mapper/primary/CloudTaskMapper.java @@ -0,0 +1,7 @@ +package com.ai.da.mapper.primary; + +import com.ai.da.common.config.mybatis.plus.CommonMapper; +import com.ai.da.mapper.primary.entity.CloudTask; + +public interface CloudTaskMapper extends CommonMapper { +} diff --git a/src/main/java/com/ai/da/mapper/primary/entity/CloudTask.java b/src/main/java/com/ai/da/mapper/primary/entity/CloudTask.java new file mode 100644 index 00000000..c366072e --- /dev/null +++ b/src/main/java/com/ai/da/mapper/primary/entity/CloudTask.java @@ -0,0 +1,47 @@ +package com.ai.da.mapper.primary.entity; + +import com.baomidou.mybatisplus.annotation.IdType; +import com.baomidou.mybatisplus.annotation.TableId; +import com.baomidou.mybatisplus.annotation.TableName; +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; +import lombok.EqualsAndHashCode; +import lombok.experimental.Accessors; +import org.apache.poi.hpsf.Decimal; + +import java.io.Serializable; +import java.time.LocalDateTime; + +@Data +@EqualsAndHashCode(callSuper = false) +@Accessors(chain = true) +@TableName("cloud_task") +public class CloudTask implements Serializable { + private static final long serialVersionUID = 1L; + + @ApiModelProperty(value = "ID") + @TableId(value = "id", type = IdType.AUTO) + private Long id; + + private Long projectId; + + private Long collectionId; + + private Long designId; + + private String buildType; + + private Integer nums; + + private Integer completedNum; + + private Integer costCredits; + + private Integer status; + + private String taskId; + + private LocalDateTime createTime; + + private LocalDateTime updateTime; +} \ No newline at end of file diff --git a/src/main/java/com/ai/da/mapper/primary/entity/CollectionElement.java b/src/main/java/com/ai/da/mapper/primary/entity/CollectionElement.java index 45bec9eb..64103278 100644 --- a/src/main/java/com/ai/da/mapper/primary/entity/CollectionElement.java +++ b/src/main/java/com/ai/da/mapper/primary/entity/CollectionElement.java @@ -88,4 +88,6 @@ public class CollectionElement implements Serializable { private Date updateDate; private Long projectId; + + private Integer isCompositeImage; } diff --git a/src/main/java/com/ai/da/mapper/primary/entity/Portfolio.java b/src/main/java/com/ai/da/mapper/primary/entity/Portfolio.java index 81c7937d..dddec328 100644 --- a/src/main/java/com/ai/da/mapper/primary/entity/Portfolio.java +++ b/src/main/java/com/ai/da/mapper/primary/entity/Portfolio.java @@ -55,6 +55,8 @@ public class Portfolio implements Serializable { private Long originalPortfolioId; + private String snapshot; + @ApiModelProperty(value = "作品集作者ID") private Long accountId; diff --git a/src/main/java/com/ai/da/mapper/primary/entity/PoseTransformation.java b/src/main/java/com/ai/da/mapper/primary/entity/PoseTransformation.java index 62a7dfb4..cf52a849 100644 --- a/src/main/java/com/ai/da/mapper/primary/entity/PoseTransformation.java +++ b/src/main/java/com/ai/da/mapper/primary/entity/PoseTransformation.java @@ -15,6 +15,8 @@ public class PoseTransformation extends BaseEntity { private String uniqueId; + private String taskIdBatch; + private String productImage; private int poseId; diff --git a/src/main/java/com/ai/da/mapper/primary/entity/Project.java b/src/main/java/com/ai/da/mapper/primary/entity/Project.java index 0876c60a..642c6a82 100644 --- a/src/main/java/com/ai/da/mapper/primary/entity/Project.java +++ b/src/main/java/com/ai/da/mapper/primary/entity/Project.java @@ -35,6 +35,8 @@ public class Project implements Serializable { private Long originalPortfolioId; + private Long parentId; + private LocalDateTime createTime; private LocalDateTime updateTime; diff --git a/src/main/java/com/ai/da/mapper/primary/entity/ThreeDModule.java b/src/main/java/com/ai/da/mapper/primary/entity/ThreeDModule.java index fb8b89d8..d1c9d967 100644 --- a/src/main/java/com/ai/da/mapper/primary/entity/ThreeDModule.java +++ b/src/main/java/com/ai/da/mapper/primary/entity/ThreeDModule.java @@ -8,6 +8,7 @@ import lombok.EqualsAndHashCode; import lombok.experimental.Accessors; import java.io.Serializable; +import java.math.BigDecimal; @Data @EqualsAndHashCode(callSuper = false) @@ -19,4 +20,7 @@ public class ThreeDModule implements Serializable { private Long id; private Long projectId; private Long threeDSimpleId; + private Long collectionElementId; + private BigDecimal x; + private BigDecimal y; } 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/CloudPageDTO.java b/src/main/java/com/ai/da/model/dto/CloudPageDTO.java new file mode 100644 index 00000000..c91a485a --- /dev/null +++ b/src/main/java/com/ai/da/model/dto/CloudPageDTO.java @@ -0,0 +1,9 @@ +package com.ai.da.model.dto; + +import com.ai.da.model.vo.PageQueryBaseVo; +import lombok.Data; + +@Data +public class CloudPageDTO extends PageQueryBaseVo { + private Long projectId; +} diff --git a/src/main/java/com/ai/da/model/dto/CloudTaskDTO.java b/src/main/java/com/ai/da/model/dto/CloudTaskDTO.java new file mode 100644 index 00000000..7f716d87 --- /dev/null +++ b/src/main/java/com/ai/da/model/dto/CloudTaskDTO.java @@ -0,0 +1,15 @@ +package com.ai.da.model.dto; + +import com.ai.da.mapper.primary.entity.CloudTask; +import lombok.Data; + +import java.util.List; + +@Data +public class CloudTaskDTO extends CloudTask { + private ToProductImageDTO toProductImage; + + private List poseTransform; + + +} diff --git a/src/main/java/com/ai/da/model/dto/DesignCloudResultQuery.java b/src/main/java/com/ai/da/model/dto/DesignCloudResultQuery.java new file mode 100644 index 00000000..ba656774 --- /dev/null +++ b/src/main/java/com/ai/da/model/dto/DesignCloudResultQuery.java @@ -0,0 +1,10 @@ +package com.ai.da.model.dto; + +import com.ai.da.model.vo.PageQueryBaseVo; +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/dto/DesignItemDetailSnapshot.java b/src/main/java/com/ai/da/model/dto/DesignItemDetailSnapshot.java new file mode 100644 index 00000000..849b00f8 --- /dev/null +++ b/src/main/java/com/ai/da/model/dto/DesignItemDetailSnapshot.java @@ -0,0 +1,12 @@ +package com.ai.da.model.dto; + +import com.ai.da.mapper.primary.entity.DesignItemDetail; +import com.ai.da.mapper.primary.entity.DesignItemDetailPrint; +import lombok.Data; + +import java.util.List; + +@Data +public class DesignItemDetailSnapshot extends DesignItemDetail { + private List designItemDetailPrintList; +} diff --git a/src/main/java/com/ai/da/model/dto/ModuleSaveDTO.java b/src/main/java/com/ai/da/model/dto/ModuleSaveDTO.java index 93bd1175..950647c8 100644 --- a/src/main/java/com/ai/da/model/dto/ModuleSaveDTO.java +++ b/src/main/java/com/ai/da/model/dto/ModuleSaveDTO.java @@ -27,7 +27,7 @@ public class ModuleSaveDTO { @ApiModelProperty("手稿板图片id 数组") private List sketchBoard; - private Long patternMaking3D; + private PatternMaking3DDTO patternMaking3D; // private MoodBoardModuleChooseVO moodBoard; // private List printBoard; diff --git a/src/main/java/com/ai/da/model/dto/PatternMaking3DDTO.java b/src/main/java/com/ai/da/model/dto/PatternMaking3DDTO.java new file mode 100644 index 00000000..83857bf8 --- /dev/null +++ b/src/main/java/com/ai/da/model/dto/PatternMaking3DDTO.java @@ -0,0 +1,13 @@ +package com.ai.da.model.dto; + +import lombok.Data; + +import java.math.BigDecimal; + +@Data +public class PatternMaking3DDTO { + private Long threeDSimpleId; + private Long collectionElementId; + private BigDecimal x; + private BigDecimal y; +} diff --git a/src/main/java/com/ai/da/model/dto/PoseTransformBatchDTO.java b/src/main/java/com/ai/da/model/dto/PoseTransformBatchDTO.java new file mode 100644 index 00000000..33020fe0 --- /dev/null +++ b/src/main/java/com/ai/da/model/dto/PoseTransformBatchDTO.java @@ -0,0 +1,10 @@ +package com.ai.da.model.dto; + +import lombok.Data; + +@Data +public class PoseTransformBatchDTO { + private String productImage; + + private Integer poseId; +} diff --git a/src/main/java/com/ai/da/model/dto/ProjectSnapshot.java b/src/main/java/com/ai/da/model/dto/ProjectSnapshot.java new file mode 100644 index 00000000..a37c4804 --- /dev/null +++ b/src/main/java/com/ai/da/model/dto/ProjectSnapshot.java @@ -0,0 +1,18 @@ +package com.ai.da.model.dto; + +import com.ai.da.mapper.primary.entity.*; +import lombok.Data; + +import java.io.Serializable; +import java.util.List; + +@Data +public class ProjectSnapshot implements Serializable { + private static final long serialVersionUID = 1L; + + private Project project; + private Workspace workspace; + private List collectionElementList; + private UserLikeGroup userLikeGroup; + private List userLikeList; +} diff --git a/src/main/java/com/ai/da/model/dto/UserLikeSnapshot.java b/src/main/java/com/ai/da/model/dto/UserLikeSnapshot.java new file mode 100644 index 00000000..237cfd2c --- /dev/null +++ b/src/main/java/com/ai/da/model/dto/UserLikeSnapshot.java @@ -0,0 +1,14 @@ +package com.ai.da.model.dto; + +import com.ai.da.mapper.primary.entity.*; +import lombok.Data; + +import java.util.List; + +@Data +public class UserLikeSnapshot extends UserLike { + private DesignItem designItem; + private TDesignPythonOutfit designPythonOutfit; + private List tDesignPythonOutfitDetailList; + private List designItemDetailList; +} 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..ed097b55 --- /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"), + POSE_TRANSFORM("poseTransfer") + ; + + 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..627d0878 --- /dev/null +++ b/src/main/java/com/ai/da/model/vo/CloudTaskResultVO.java @@ -0,0 +1,15 @@ +package com.ai.da.model.vo; + +import com.ai.da.common.response.PageBaseResponse; +import com.ai.da.mapper.primary.entity.TDesignPythonOutfit; +import lombok.Data; + +import java.util.List; + +@Data +public class CloudTaskResultVO { + private List design; + private List toProductImage; + private List relight; + private List poseTransfer; +} diff --git a/src/main/java/com/ai/da/model/vo/CloudTaskVO.java b/src/main/java/com/ai/da/model/vo/CloudTaskVO.java new file mode 100644 index 00000000..557aa94e --- /dev/null +++ b/src/main/java/com/ai/da/model/vo/CloudTaskVO.java @@ -0,0 +1,9 @@ +package com.ai.da.model.vo; + +import com.ai.da.mapper.primary.entity.CloudTask; +import lombok.Data; + +@Data +public class CloudTaskVO extends CloudTask { + private String process; +} diff --git a/src/main/java/com/ai/da/model/vo/DesignModuleChooseVO.java b/src/main/java/com/ai/da/model/vo/DesignModuleChooseVO.java index ddea9a60..be7b3d4a 100644 --- a/src/main/java/com/ai/da/model/vo/DesignModuleChooseVO.java +++ b/src/main/java/com/ai/da/model/vo/DesignModuleChooseVO.java @@ -5,6 +5,8 @@ import lombok.AllArgsConstructor; import lombok.Data; import lombok.NoArgsConstructor; +import java.util.List; + @Data @AllArgsConstructor @NoArgsConstructor @@ -13,5 +15,5 @@ public class DesignModuleChooseVO { private Long userGroupId; @ApiModelProperty("分组详细数组") - private java.util.List userLikeDetails; + private List userLikeDetails; } diff --git a/src/main/java/com/ai/da/model/vo/ModuleChooseVO.java b/src/main/java/com/ai/da/model/vo/ModuleChooseVO.java index dcb92b55..e5786ba8 100644 --- a/src/main/java/com/ai/da/model/vo/ModuleChooseVO.java +++ b/src/main/java/com/ai/da/model/vo/ModuleChooseVO.java @@ -34,5 +34,5 @@ public class ModuleChooseVO { // private moodBoardModuleChooseVO patternMaking3D; private SketchReconstructionVO deReconstruction; - private ThreeDVO patternMaking3D; + private ThreeDModuleVO patternMaking3D; } diff --git a/src/main/java/com/ai/da/model/vo/ThreeDModuleVO.java b/src/main/java/com/ai/da/model/vo/ThreeDModuleVO.java new file mode 100644 index 00000000..d8eeaca5 --- /dev/null +++ b/src/main/java/com/ai/da/model/vo/ThreeDModuleVO.java @@ -0,0 +1,9 @@ +package com.ai.da.model.vo; + +import com.ai.da.mapper.primary.entity.ThreeDModule; +import lombok.Data; + +@Data +public class ThreeDModuleVO extends ThreeDModule { + private String printMinioUrl; +} diff --git a/src/main/java/com/ai/da/model/vo/ThreeDVO.java b/src/main/java/com/ai/da/model/vo/ThreeDVO.java index 4b067fcf..2537b29e 100644 --- a/src/main/java/com/ai/da/model/vo/ThreeDVO.java +++ b/src/main/java/com/ai/da/model/vo/ThreeDVO.java @@ -3,7 +3,9 @@ package com.ai.da.model.vo; import com.ai.da.mapper.primary.entity.ThreeDLayout; import com.ai.da.mapper.primary.entity.ThreeDPatternLayout; import lombok.Data; +import org.apache.poi.hpsf.Decimal; +import java.math.BigDecimal; import java.util.List; @Data diff --git a/src/main/java/com/ai/da/python/PythonService.java b/src/main/java/com/ai/da/python/PythonService.java index fc64629d..643de0ba 100644 --- a/src/main/java/com/ai/da/python/PythonService.java +++ b/src/main/java/com/ai/da/python/PythonService.java @@ -4250,4 +4250,136 @@ 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"); + } + + public Boolean poseTransformationBatch(String productImage, Integer poseId, String taskId) { + 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"); + Map content = Maps.newHashMap(); + content.put("image_url", productImage); + content.put("tasks_id", taskId); + content.put("pose_id", String.valueOf(poseId)); + content.put("batch_size", 1); + RequestBody body = RequestBody.create(mediaType, JSON.toJSONString(content)); + + log.info("poseTransformation 请求地址: {}", accessPythonIp + ":" + accessPythonPort + "/api/batch_generate_pose_transform_image"); + Request request = new Request.Builder() + .url(accessPythonIp + ":" + accessPythonPort + "/api/batch_generate_pose_transform_image") + .method("POST", body) + .addHeader("Content-Type", "application/json") + .build(); + Response response = null; + try { + response = client.newCall(request).execute(); + } catch (IOException ioException) { + log.error("PythonService##poseTransferBatch异常###{}", ExceptionUtil.getThrowableList(ioException)); + throw new BusinessException("poseTransferBatch.interface.exception"); + } + + if (response.isSuccessful() && response.body() != null) { + String responseBody = response.body().toString(); + log.info("PythonService##poseTransferBatch返回内容###{}", responseBody); + + return Boolean.TRUE; + } + + log.error("PythonService##poseTransferBatch接口调用失败###{}", response); + throw new BusinessException("poseTransferBatch.interface.exception"); + } } diff --git a/src/main/java/com/ai/da/service/CloudTaskService.java b/src/main/java/com/ai/da/service/CloudTaskService.java new file mode 100644 index 00000000..07975d49 --- /dev/null +++ b/src/main/java/com/ai/da/service/CloudTaskService.java @@ -0,0 +1,8 @@ +package com.ai.da.service; + +import com.ai.da.mapper.primary.entity.CloudTask; +import com.baomidou.mybatisplus.extension.service.IService; + +public interface CloudTaskService extends IService { + CloudTask getByTaskId(String taskId); +} diff --git a/src/main/java/com/ai/da/service/CreditsService.java b/src/main/java/com/ai/da/service/CreditsService.java index a3030057..9f7cf8bf 100644 --- a/src/main/java/com/ai/da/service/CreditsService.java +++ b/src/main/java/com/ai/da/service/CreditsService.java @@ -27,6 +27,8 @@ public interface CreditsService extends IService { Boolean creditsPreDeduction(CreditsEventsEnum event, Integer num); + Boolean creditsPreDeduction(Integer credits); + void addRecordToCreditsDeduction(Long accountId, String taskId, CreditsEventsEnum creditsEventsEnum); Boolean taskCreditsDeduction(Long accountId, String taskId); diff --git a/src/main/java/com/ai/da/service/DesignService.java b/src/main/java/com/ai/da/service/DesignService.java index 3cfbfd48..feb27ee0 100644 --- a/src/main/java/com/ai/da/service/DesignService.java +++ b/src/main/java/com/ai/da/service/DesignService.java @@ -1,13 +1,12 @@ package com.ai.da.service; +import com.ai.da.common.response.PageBaseResponse; import com.ai.da.mapper.primary.entity.Design; import com.ai.da.model.dto.*; -import com.ai.da.model.vo.CollectionSketchVO; -import com.ai.da.model.vo.DesignCollectionVO; -import com.ai.da.model.vo.DesignItemDetailVO; -import com.ai.da.model.vo.DesignLikeVO; +import com.ai.da.model.vo.*; import com.ai.da.python.vo.DesignPythonObjects; import com.alibaba.fastjson.JSONObject; +import com.baomidou.mybatisplus.core.metadata.IPage; import com.baomidou.mybatisplus.extension.service.IService; import java.math.BigDecimal; @@ -109,9 +108,13 @@ public interface DesignService extends IService { DesignCollectionVO getDesignResult(String requestId, List objectSignList); - String designCloud(DesignCollectionDTO designDTO); + String designCloud(CloudTaskDTO cloudTaskDTO); void processDesignBatch(Map designBatchResult); Boolean sort(UserLikeSortDTO userLikeSortDTO); + + IPage cloudPage(CloudPageDTO cloudPageDTO); + + CloudTaskResultVO getDesignCloudResult(DesignCloudResultQuery designCloudResultQuery); } diff --git a/src/main/java/com/ai/da/service/GenerateService.java b/src/main/java/com/ai/da/service/GenerateService.java index 6df815ce..76459bf0 100644 --- a/src/main/java/com/ai/da/service/GenerateService.java +++ b/src/main/java/com/ai/da/service/GenerateService.java @@ -63,4 +63,6 @@ public interface GenerateService extends IService { SketchReconstructionVO getSketchReconstruction(Long projectId); List> getAllPose(); + + void processPoseTransformResultBatch(String taskId, String gifUrl, String videoUrl, String imageUrl, String progress); } diff --git a/src/main/java/com/ai/da/service/ProjectService.java b/src/main/java/com/ai/da/service/ProjectService.java new file mode 100644 index 00000000..fc369cc0 --- /dev/null +++ b/src/main/java/com/ai/da/service/ProjectService.java @@ -0,0 +1,28 @@ +package com.ai.da.service; + +import com.ai.da.mapper.primary.entity.Design; +import com.ai.da.mapper.primary.entity.Project; +import com.ai.da.model.dto.*; +import com.ai.da.model.vo.CollectionSketchVO; +import com.ai.da.model.vo.DesignCollectionVO; +import com.ai.da.model.vo.DesignItemDetailVO; +import com.ai.da.model.vo.DesignLikeVO; +import com.ai.da.python.vo.DesignPythonObjects; +import com.alibaba.fastjson.JSONObject; +import com.baomidou.mybatisplus.extension.service.IService; + +import java.math.BigDecimal; +import java.util.List; +import java.util.Map; +import java.util.Set; + +/** + * 服务类 + * + * @author yanglei + * @since 2022-09-11 + */ +public interface ProjectService extends IService { + + Set getChildProjectIdSet(Long projectId); +} diff --git a/src/main/java/com/ai/da/service/UserLikeGroupService.java b/src/main/java/com/ai/da/service/UserLikeGroupService.java index 16c2e09a..425ad6ae 100644 --- a/src/main/java/com/ai/da/service/UserLikeGroupService.java +++ b/src/main/java/com/ai/da/service/UserLikeGroupService.java @@ -109,4 +109,8 @@ public interface UserLikeGroupService extends IService { Boolean delete(Long projectId); Boolean brandDNADelete(BrandDNADTO brandDNADTO); + + void toProductBatch(String taskId, String url, String progress); + + void relightBatch(String taskId, String url, String progress); } diff --git a/src/main/java/com/ai/da/service/impl/AccountServiceImpl.java b/src/main/java/com/ai/da/service/impl/AccountServiceImpl.java index 7dcea80e..2a3f4293 100644 --- a/src/main/java/com/ai/da/service/impl/AccountServiceImpl.java +++ b/src/main/java/com/ai/da/service/impl/AccountServiceImpl.java @@ -1388,6 +1388,9 @@ public class AccountServiceImpl extends ServiceImpl impl config.setJdbcUrl("jdbc:mysql://code-create.com.hk:3306/db1nfvsgmjp3b8"); config.setUsername("uafqtz4gsvfrw"); config.setPassword("aida123456."); +// config.setJdbcUrl("jdbc:mysql://18.167.251.121:33008/aida"); +// config.setUsername("aida_con"); +// config.setPassword("123456"); // config.setJdbcUrl("jdbc:mysql://localhost:3306/code-create-local?serverTimezone=UTC"); // config.setUsername("root"); // config.setPassword("root"); diff --git a/src/main/java/com/ai/da/service/impl/CloudTaskServiceImpl.java b/src/main/java/com/ai/da/service/impl/CloudTaskServiceImpl.java new file mode 100644 index 00000000..efc3b86f --- /dev/null +++ b/src/main/java/com/ai/da/service/impl/CloudTaskServiceImpl.java @@ -0,0 +1,28 @@ +package com.ai.da.service.impl; + +import com.ai.da.mapper.primary.AccountMapper; +import com.ai.da.mapper.primary.CloudTaskMapper; +import com.ai.da.mapper.primary.entity.Account; +import com.ai.da.mapper.primary.entity.CloudTask; +import com.ai.da.service.ClassificationService; +import com.ai.da.service.CloudTaskService; +import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; +import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; +import lombok.extern.slf4j.Slf4j; +import org.springframework.stereotype.Service; + +import javax.annotation.Resource; + +@Slf4j +@Service +public class CloudTaskServiceImpl extends ServiceImpl implements CloudTaskService { + @Resource + private CloudTaskMapper cloudTaskMapper; + + @Override + public CloudTask getByTaskId(String taskId) { + QueryWrapper qw = new QueryWrapper<>(); + qw.lambda().eq(CloudTask::getTaskId, taskId); + return cloudTaskMapper.selectOne(qw); + } +} diff --git a/src/main/java/com/ai/da/service/impl/CreditsServiceImpl.java b/src/main/java/com/ai/da/service/impl/CreditsServiceImpl.java index 4bf27209..4b7c836c 100644 --- a/src/main/java/com/ai/da/service/impl/CreditsServiceImpl.java +++ b/src/main/java/com/ai/da/service/impl/CreditsServiceImpl.java @@ -227,6 +227,32 @@ public class CreditsServiceImpl extends ServiceImpl keys = redisUtil.getKeysFromString(creditsDeduction + ":" + accountId + ":*"); + List multiValue = redisUtil.getMultiValue(keys); + // 1.1 预扣除区 积分总和 + int sum = multiValue.stream().mapToInt(Integer::parseInt).sum(); + // 1.2 加上本次操作需要扣除的积分 + sum += credits; + + // 2、获取当前积分 + BigDecimal existingCredits = accountMapper.selectById(accountId).getCredits(); + BigDecimal subtract = existingCredits.subtract(new BigDecimal(sum)); + + // 3、判断剩余积分是否够本次操作 + if (subtract.compareTo(BigDecimal.ZERO) < 0) { + // 3.1 不够,直接返回余额不够,充值 + return Boolean.FALSE; + } + + return Boolean.TRUE; + } + @Override public void addRecordToCreditsDeduction(Long accountId, String taskId, CreditsEventsEnum creditsEventsEnum) { // 5、添加当前任务的预扣积分到redis 任务有效期一天,若待扣积分两天还没被移除,说明任务已经失败,待扣积分自动失效 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 2ec8202b..64c857f2 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.*; @@ -22,8 +25,12 @@ import com.alibaba.fastjson.JSONException; import com.alibaba.fastjson.JSONObject; import com.alibaba.fastjson.serializer.SerializerFeature; import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; +import com.baomidou.mybatisplus.core.metadata.IPage; +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.*; @@ -37,6 +44,7 @@ import javax.annotation.Resource; import java.io.File; import java.io.IOException; import java.math.BigDecimal; +import java.math.RoundingMode; import java.time.LocalDateTime; import java.util.*; import java.util.concurrent.ConcurrentHashMap; @@ -93,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; @@ -110,12 +124,26 @@ public class DesignServiceImpl extends ServiceImpl impleme @Resource private RedisUtil redisUtil; + @Resource + private PoseTransformationMapper poseTransformationMapper; @Resource private DesignBatchMapper designBatchMapper; @Resource private UserLikeSortMapper userLikeSortMapper; + @Resource + private ProjectService projectService; + @Resource + private WorkspaceService workspaceService; + @Resource + private CloudTaskMapper cloudTaskMapper; + @Resource + private CloudTaskService cloudTaskService; + @Resource + private CreditsService creditsService; + @Resource + private ToProductImageRecordMapper toProductImageRecordMapper; private final ConcurrentHashMap> designContext = new ConcurrentHashMap<>(); @@ -308,8 +336,6 @@ public class DesignServiceImpl extends ServiceImpl impleme Long collectionId; if (null == collectionIdParam) { collectionId = collectionService.saveCollection(userInfo.getId(), designDTO.getTimeZone(), designDTO.getMoodTemplateId(), designDTO.getMoodboardPosition()); -// String moodboardPosition = designDTO.getMoodboardPosition(); -// parseMoodboardPosition(moodboardPosition, collectionId); }else { collectionId = collectionIdParam; } @@ -1769,23 +1795,427 @@ public class DesignServiceImpl extends ServiceImpl impleme } @Override - public String designCloud(DesignCollectionDTO designDTO) { - AuthPrincipalVo userInfo = UserContext.getUserHolder(); - //校验collection element - ValidateElementVO elementVO = collectionElementService.validateElement(designDTO); - //design - return designBatch(designDTO, userInfo, null, elementVO); + 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); + + DesignCollectionDTO designDTO = transDesignParam(projectId); + designDTO.setDesignNum(cloudTaskDTO.getNums()); + AuthPrincipalVo userInfo = UserContext.getUserHolder(); + + //校验collection element + ValidateElementVO elementVO = collectionElementService.validateElement(designDTO); + + //design + String taskId = designBatch(designDTO, userInfo, null, elementVO, cloudTaskDTO, projectId); + return taskId; + }else if (cloudTaskDTO.getBuildType().equals(BuildType.TO_PRODUCT_IMAGE.getValue())) { + ToProductImageDTO toProductImageDTO = cloudTaskDTO.getToProductImage(); + // 判断用户当前积分是否够本次生成消耗 + Boolean preDeduction = creditsService.creditsPreDeduction(cloudTaskDTO.getCostCredits()); + 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(); + 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); + cloudTask.setStatus(0); + cloudTaskMapper.insert(cloudTask); + return batchTaskId; + }else if (cloudTaskDTO.getBuildType().equals(BuildType.RELIGHT.getValue())) { + ToProductImageDTO toProductImageDTO = cloudTaskDTO.getToProductImage(); + // 判断用户当前积分是否够本次生成消耗 + Boolean preDeduction = creditsService.creditsPreDeduction(cloudTaskDTO.getCostCredits()); + 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); + cloudTask.setStatus(0); + cloudTaskMapper.insert(cloudTask); + return batchTaskId; + } else if (cloudTaskDTO.getBuildType().equals(BuildType.POSE_TRANSFORM.getValue())) { + Long accountId = UserContext.getUserHolder().getId(); + Boolean preDeduction = creditsService.creditsPreDeduction(cloudTaskDTO.getCostCredits()); + if (!preDeduction) { + throw new BusinessException("Your remaining credits are insufficient for this generation. Please recharge.", ResultEnum.WARNING.getCode()); + } + List poseTransformList = cloudTaskDTO.getPoseTransform(); + if (CollectionUtil.isNotEmpty(poseTransformList)) { + String taskBatchId = UUID.randomUUID().toString() + "-" + accountId; + for (PoseTransformBatchDTO poseTransformBatchDTO : poseTransformList) { + // 1、判断用户当前积分是否够本次生成消耗 + CreditsEventsEnum creditsEventsEnum = CreditsEventsEnum.POSE_TRANSFORMATION; + + // 3、生成唯一id 使用uuid,由于uuid重复的几率很小,故取消对uuid重复性的校验 + String uuid = UUID.randomUUID().toString(); + String taskId = uuid + "-" + accountId; + + PoseTransformation poseTransformation = new PoseTransformation(); + poseTransformation.setProjectId(cloudTaskDTO.getProjectId()); + poseTransformation.setAccountId(accountId); + poseTransformation.setUniqueId(taskId); + poseTransformation.setProductImage(poseTransformBatchDTO.getProductImage()); + poseTransformation.setPoseId(poseTransformBatchDTO.getPoseId()); + poseTransformation.setCreateTime(LocalDateTime.now()); + poseTransformation.setTaskIdBatch(taskBatchId); + poseTransformationMapper.insert(poseTransformation); + + Boolean b = pythonService.poseTransformationBatch(poseTransformBatchDTO.getProductImage(), poseTransformBatchDTO.getPoseId(), taskId); + if (b){ + // 6、添加预扣除积分到redis + creditsService.addRecordToCreditsDeduction(accountId, uuid, creditsEventsEnum); + // 6.1 添加积分扣除记录到db + creditsService.preInsert(accountId, creditsEventsEnum.getName(), uuid, Boolean.TRUE, null); + }else { + throw new BusinessException("pose transformation error", ResultEnum.ERROR.getCode()); + } + } + CloudTask cloudTask = CopyUtil.copyObject(cloudTaskDTO, CloudTask.class); + cloudTask.setProjectId(cloudTask.getProjectId()); + cloudTask.setTaskId(taskBatchId); + LocalDateTime now = LocalDateTime.now(); + cloudTask.setCreateTime(now); + cloudTask.setUpdateTime(now); + cloudTask.setStatus(0); + cloudTaskMapper.insert(cloudTask); + return taskBatchId; + } + } + return null; } - private String designBatch(DesignCollectionDTO designDTO, AuthPrincipalVo userInfo, Long collectionIdParam, ValidateElementVO elementVO) { - if (CollectionUtil.isNotEmpty(designDTO.getSketchBoards())) { - //编辑sketchBoard - collectionElementService.editSketchBoardsElement(elementVO, designDTO.getSketchBoards()); + private DesignCollectionDTO transDesignParam(Long projectId) { + DesignCollectionDTO designCollectionDTO = new DesignCollectionDTO(); + List collectionElementList = collectionElementService.getByProjectId(projectId); + if (CollectionUtil.isNotEmpty(collectionElementList)) { + Map> groupedMap = collectionElementList.stream().collect(Collectors.groupingBy(CollectionElement::getLevel1Type)); + if (CollectionUtil.isNotEmpty(groupedMap.get("Moodboard"))) { + List moodBoards = new ArrayList<>(); + List moodboardList = groupedMap.get("Moodboard"); + for (CollectionElement collectionElement : moodboardList) { + if (collectionElement.getIsCompositeImage() != null && collectionElement.getIsCompositeImage() == 1) { + designCollectionDTO.setMoodTemplateId(String.valueOf(collectionElement.getId())); + designCollectionDTO.setMoodboardPosition(collectionService.getMoodboardPositionString(collectionElement.getId())); + }else { + DesignCollectionElementDTO dto = new DesignCollectionElementDTO(); + dto.setId(collectionElement.getId()); + dto.setDesignType(DesignTypeEnum.COLLECTION.getRealName()); + moodBoards.add(dto); + } + } + designCollectionDTO.setMoodBoards(moodBoards); + }else { + designCollectionDTO.setMoodBoards(new ArrayList<>()); + } + if (CollectionUtil.isNotEmpty(groupedMap.get("Printboard"))) { + List printBoards = new ArrayList<>(); + List printBoardList = groupedMap.get("Printboard"); + for (CollectionElement collectionElement : printBoardList) { + DesignCollectionPrintElementDTO dto = new DesignCollectionPrintElementDTO(); + dto.setId(collectionElement.getId()); + dto.setDesignType(DesignTypeEnum.COLLECTION.getRealName()); + printBoards.add(dto); + } + designCollectionDTO.setPrintBoards(printBoards); + }else { + designCollectionDTO.setPrintBoards(new ArrayList<>()); + } + if (CollectionUtil.isNotEmpty(groupedMap.get("Colorboard"))) { + List colorBoards = new ArrayList<>(); + List colorBoardList = groupedMap.get("Colorboard"); + for (CollectionElement collectionElement : colorBoardList) { + CollectionColorDTO dto = new CollectionColorDTO(); + String name = collectionElement.getName(); + if (name.contains("_")) { + String[] split = name.split("_"); + dto.setId(Integer.valueOf(split[0])); + dto.setName(split[1]); + dto.setTcx(split[2]); + } + dto.setRgbValue(collectionElement.getColorRgb()); + if (collectionElement.getGradientString() != null && !collectionElement.getGradientString().equals("null")) { + dto.setGradientString(collectionElement.getGradientString()); + } + colorBoards.add(dto); + } + designCollectionDTO.setColorBoards(colorBoards); + }else { + designCollectionDTO.setColorBoards(new ArrayList<>()); + } + if (CollectionUtil.isNotEmpty(groupedMap.get("Sketchboard"))) { + List sketchBoards = new ArrayList<>(); + List sketchBoardList = groupedMap.get("Sketchboard"); + for (CollectionElement collectionElement : sketchBoardList) { + CollectionSketchDTO dto = new CollectionSketchDTO(); + dto.setSketchBoardId(collectionElement.getId()); + dto.setDesignType(DesignTypeEnum.COLLECTION.getRealName()); + dto.setLevel2Type(collectionElement.getLevel2Type()); + dto.setIsPin(collectionElement.getHasPin()); + sketchBoards.add(dto); + } + designCollectionDTO.setSketchBoards(sketchBoards); + }else { + designCollectionDTO.setSketchBoards(new ArrayList<>()); + } + }else { + designCollectionDTO.setMoodBoards(new ArrayList<>()); + designCollectionDTO.setPrintBoards(new ArrayList<>()); + designCollectionDTO.setColorBoards(new ArrayList<>()); + designCollectionDTO.setSketchBoards(new ArrayList<>()); } - if (CollectionUtil.isNotEmpty(designDTO.getPrintBoards())) { - //编辑printBoard - collectionElementService.editPrintBoardsElement(elementVO, designDTO.getPrintBoards()); + Long workspaceId = workspaceService.getByProjectId(projectId); + Workspace workspace = workspaceService.getById(workspaceId); + designCollectionDTO.setSystemScale( + BigDecimal.valueOf(workspace.getSystemDesignerPercentage()) + .divide(BigDecimal.valueOf(100), 4, RoundingMode.HALF_UP) + ); + designCollectionDTO.setModelSex(workspace.getSex()); + if (workspace.getSex().equals("Female")) { + designCollectionDTO.setTemplateId(workspace.getMannequinFemaleId()); + designCollectionDTO.setModelType(workspace.getMannequinFemaleType()); } + if (workspace.getPosition().equals("Overall")) { + designCollectionDTO.setSingleOverall("overall"); + }else { + designCollectionDTO.setSingleOverall("single"); + designCollectionDTO.setSwitchCategory(workspace.getPosition()); + } + designCollectionDTO.setTimeZone("Etc/GMT-8"); + return designCollectionDTO; + } + + private String designBatch(DesignCollectionDTO designDTO, AuthPrincipalVo userInfo, Long collectionIdParam, ValidateElementVO elementVO, CloudTaskDTO cloudTaskDTO, Long projectId) { //保存collection Long collectionId; if (null == collectionIdParam) { @@ -1796,16 +2226,9 @@ public class DesignServiceImpl extends ServiceImpl impleme List elementIds = getElementId(elementVO); //批量关联element 到 collection collectionElementService.relationCollection(elementIds, collectionId); - //library转化为collection(生成) - saveCollectionElemntsByLibrarys(elementVO, collectionId); - //generate转化为collection(生成) - saveCollectionElemntsByGenerates(elementVO, collectionId); - //保存颜色版 - collectionElementService.saveColorBoard(designDTO.getColorBoards(), collectionId, designDTO.getTimeZone()); //保存design Long designId = saveOne(designDTO, collectionId, userInfo.getId()); - //计算library -// calculateLibraryAndSysFile(designDTO, elementVO, userInfo); + //组装design入参 long startTime = System.currentTimeMillis(); DesignPythonObjects pythonObjects = pythonService.covertDesignParam(designDTO.getSystemScale(), @@ -1826,17 +2249,6 @@ public class DesignServiceImpl extends ServiceImpl impleme AuthPrincipalVo userHolder = UserContext.getUserHolder(); String taskId = pythonService.designBatch(pythonObjects, userHolder.getId(), elementVO.getDesignNum(), requestId); - DesignBatch designBatch = new DesignBatch(); - - designBatch.setAccountId(userInfo.getId()); - designBatch.setDesignId(designId); - designBatch.setCollectionId(collectionId); - designBatch.setTaskId(taskId); - designBatch.setCreateTime(LocalDateTime.now()); - designBatch.setStatus(0); - designBatch.setTotalNum(elementVO.getDesignNum()); - designBatchMapper.insert(designBatch); - endTime = System.currentTimeMillis(); totalTimeInSeconds = (endTime - startTime) / 1000; log.info("design python端运行时间:" + totalTimeInSeconds + " 秒"); @@ -1844,9 +2256,9 @@ public class DesignServiceImpl extends ServiceImpl impleme startTime = System.currentTimeMillis(); generateLibrary(elementVO, designDTO.getTimeZone()); //处理关联关系,修复element覆盖得情况 - List relationElements = collectionElementService.getByOnlyCollectionId(collectionId); - List relationElementIds = relationElements.stream().map(CollectionElement::getId).collect(Collectors.toList()); - handleCollectionElementRelation(collectionId, null != collectionIdParam, relationElementIds); +// List relationElements = collectionElementService.getByOnlyCollectionId(collectionId); +// List relationElementIds = relationElements.stream().map(CollectionElement::getId).collect(Collectors.toList()); +// handleCollectionElementRelation(collectionId, null != collectionIdParam, relationElementIds); endTime = System.currentTimeMillis(); totalTimeInSeconds = (endTime - startTime) / 1000; log.info("处理关联关系运行时间:" + totalTimeInSeconds + " 秒"); @@ -1863,6 +2275,16 @@ public class DesignServiceImpl extends ServiceImpl impleme // 将上下文存入全局设计上下文中 designContext.put(taskId, context); + CloudTask cloudTask = CopyUtil.copyObject(cloudTaskDTO, CloudTask.class); + cloudTask.setProjectId(projectId); + cloudTask.setDesignId(designId); + cloudTask.setCollectionId(collectionId); + cloudTask.setTaskId(taskId); + LocalDateTime now = LocalDateTime.now(); + cloudTask.setCreateTime(now); + cloudTask.setUpdateTime(now); + cloudTask.setStatus(0); + cloudTaskMapper.insert(cloudTask); return taskId; } @@ -1875,28 +2297,29 @@ public class DesignServiceImpl extends ServiceImpl impleme } if (progress.equals("ok")) { String taskId = (String) designBatchResult.get("task_id"); - QueryWrapper qw = new QueryWrapper<>(); - qw.lambda().eq(DesignBatch::getTaskId, taskId); - List designBatches = designBatchMapper.selectList(qw); - if (CollectionUtil.isNotEmpty(designBatches)) { - DesignBatch designBatch = designBatches.get(0); - designBatch.setStatus(1); - designBatchMapper.updateById(designBatch); + QueryWrapper qw = new QueryWrapper<>(); + qw.lambda().eq(CloudTask::getTaskId, taskId); + List cloudTaskList = cloudTaskMapper.selectList(qw); + if (CollectionUtil.isNotEmpty(cloudTaskList)) { + CloudTask cloudTask = cloudTaskList.get(0); + cloudTask.setCompletedNum(cloudTask.getNums()); + cloudTask.setStatus(1); + cloudTaskMapper.updateById(cloudTask); } } }else { String taskId = (String) designBatchResult.get("task_id"); - QueryWrapper qw = new QueryWrapper<>(); - qw.lambda().eq(DesignBatch::getTaskId, taskId); - List designBatches = designBatchMapper.selectList(qw); - if (CollectionUtil.isNotEmpty(designBatches)) { - DesignBatch designBatch = designBatches.get(0); - if (designBatch.getCompletedNum() == null) { - designBatch.setCompletedNum(1); + QueryWrapper qw = new QueryWrapper<>(); + qw.lambda().eq(CloudTask::getTaskId, taskId); + List cloudTaskList = cloudTaskMapper.selectList(qw); + if (CollectionUtil.isNotEmpty(cloudTaskList)) { + CloudTask cloudTask = cloudTaskList.get(0); + if (cloudTask.getCompletedNum() == null) { + cloudTask.setCompletedNum(1); }else { - designBatch.setCompletedNum(designBatch.getCompletedNum() + 1); + cloudTask.setCompletedNum(cloudTask.getCompletedNum() + 1); } - designBatchMapper.updateById(designBatch); + cloudTaskMapper.updateById(cloudTask); } Integer i = (Integer) progress; @@ -1915,7 +2338,7 @@ public class DesignServiceImpl extends ServiceImpl impleme String timeZone = (String) context.get("timeZone"); String singleOverall = (String) context.get("singleOverall"); - DesignPythonObject item = pythonObjects.getObjects().get(i); + DesignPythonObject item = pythonObjects.getObjects().get(i-1); DesignItem designItem = new DesignItem(); designItem.setAccountId(userInfo.getId()); designItem.setCollectionId(collectionId); @@ -2029,12 +2452,6 @@ public class DesignServiceImpl extends ServiceImpl impleme } } } - -// for (int i = 0; i < pythonObjects.getObjects().size(); i++) { -// -// } -// response.setProcessId(pythonObjects.getProcess_id()); - return; } } @@ -2050,4 +2467,168 @@ public class DesignServiceImpl extends ServiceImpl impleme return Boolean.TRUE; } + @Override + public IPage cloudPage(CloudPageDTO cloudPageDTO) { + // 分页数据 + Set childProjectIdSet = projectService.getChildProjectIdSet(cloudPageDTO.getProjectId()); + childProjectIdSet.add(cloudPageDTO.getProjectId()); + QueryWrapper queryWrapper = new QueryWrapper<>(); + if (CollectionUtil.isNotEmpty(childProjectIdSet)) { + queryWrapper.lambda().in(CloudTask::getProjectId, childProjectIdSet); + }else { + return new Page<>(); + } + IPage page = cloudTaskMapper.selectPage( + new Page<>(cloudPageDTO.getPage(), cloudPageDTO.getSize()), queryWrapper); + if (CollectionUtils.isEmpty(page.getRecords())) { + return new Page<>(); + } + + IPage convert = page.convert((Function) cloudTask -> { + if (cloudTask != null) { + CloudTaskVO cloudTaskVO = CopyUtil.copyObject(cloudTask, CloudTaskVO.class); + if (cloudTaskVO.getCompletedNum() == null) { + cloudTaskVO.setProcess("0%"); + }else { + BigDecimal completed = BigDecimal.valueOf(cloudTaskVO.getCompletedNum()); + BigDecimal total = BigDecimal.valueOf(cloudTaskVO.getNums()); + + BigDecimal percent = completed + .divide(total, 4, RoundingMode.HALF_UP) // 先计算小数百分比,保留4位防止精度问题 + .multiply(BigDecimal.valueOf(100)) // 乘以100变成百分比 + .setScale(2, RoundingMode.HALF_UP); // 最终保留2位小数 + + cloudTaskVO.setProcess(percent.toPlainString() + "%"); + } + return cloudTaskVO; + } + return null; + }); + return convert; + } + + @Value("${redis.key.toProductImageResultKey}") + private String toProductImageResultKey; + @Value("${redis.key.relightResultKey}") + private String relightResultKey; + + @Override + 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); + List list = designPythonOutfitMapper.selectList(qw); + List voList = new ArrayList<>(); + for (TDesignPythonOutfit tDesignPythonOutfit : list) { + DesignCollectionItemVO vo = new DesignCollectionItemVO(); + vo.setDesignOutfitId(tDesignPythonOutfit.getId()); + vo.setDesignOutfitUrl(minioUtil.getPreSignedUrl(tDesignPythonOutfit.getDesignUrl(), 24 * 60)); + vo.setDesignItemId(tDesignPythonOutfit.getDesignItemId()); + voList.add(vo); + } + result.setDesign(voList); +// 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(new ArrayList<>()); + return result; + } + } + result.setDesign(new ArrayList<>()); + 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.setId(toProductImageResult.getId()); + magicToolResultVO.setTaskId(toProductImageResult.getTaskId()); + magicToolResultVO.setStatus("Success"); + 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)); + } + results.add(magicToolResultVO); + } + result.setToProductImage(results); + return result; + } else if (query.getBuildType().equals(BuildType.RELIGHT.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.setId(toProductImageResult.getId()); + magicToolResultVO.setTaskId(toProductImageResult.getTaskId()); + magicToolResultVO.setStatus("Success"); + 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 { + ToProductImageResult toProductImageResult1 = toProductImageResultMapper.selectById(toProductImageResult.getElementId()); + magicToolResultVO.setSourceUrl(minioUtil.getPreSignedUrl(toProductImageResult1.getUrl(), 24 * 60)); + } + results.add(magicToolResultVO); + } + result.setRelight(results); + return result; + } else if (query.getBuildType().equals(BuildType.POSE_TRANSFORM.getValue())) { + String taskId = query.getTaskId(); + QueryWrapper poseTransformationQueryWrapper = new QueryWrapper<>(); + poseTransformationQueryWrapper.lambda().eq(PoseTransformation::getTaskIdBatch, taskId); + List poseTransformationList = poseTransformationMapper.selectList(poseTransformationQueryWrapper); + List voList = new ArrayList<>(); + for (PoseTransformation poseTransformation : poseTransformationList) { + PoseTransformationVO poseTransformationVO = new PoseTransformationVO(); + poseTransformationVO.setId(poseTransformation.getId()); + poseTransformationVO.setIsLiked(poseTransformation.getIsLiked()); + poseTransformationVO.setStatus("Success"); + poseTransformationVO.setTaskId(poseTransformation.getUniqueId()); + poseTransformationVO.setProductImage(minioUtil.getPreSignedUrl(poseTransformation.getProductImage(), CommonConstant.MINIO_IMAGE_EXPIRE_TIME)); + if (null != poseTransformation.getGifUrl()){ + poseTransformationVO.setGifUrl(minioUtil.getPreSignedUrl(poseTransformation.getGifUrl(), CommonConstant.MINIO_IMAGE_EXPIRE_TIME)); + } + if (null != poseTransformation.getVideoUrl()){ + poseTransformationVO.setVideoUrl(minioUtil.getPreSignedUrl(poseTransformation.getVideoUrl(), CommonConstant.MINIO_IMAGE_EXPIRE_TIME)); + } + if (null != poseTransformation.getFirstFrameUrl()){ + poseTransformationVO.setFirstFrameUrl(minioUtil.getPreSignedUrl(poseTransformation.getFirstFrameUrl(), CommonConstant.MINIO_IMAGE_EXPIRE_TIME)); + } + voList.add(poseTransformationVO); + } + result.setPoseTransfer(voList); + return result; + } + return result; + } + } \ No newline at end of file diff --git a/src/main/java/com/ai/da/service/impl/GenerateServiceImpl.java b/src/main/java/com/ai/da/service/impl/GenerateServiceImpl.java index f9d22559..f0cb04e5 100644 --- a/src/main/java/com/ai/da/service/impl/GenerateServiceImpl.java +++ b/src/main/java/com/ai/da/service/impl/GenerateServiceImpl.java @@ -969,6 +969,8 @@ public class GenerateServiceImpl extends ServiceImpl i @Resource private PoseTransformationMapper poseTransformationMapper; + @Resource + private CloudTaskMapper cloudTaskMapper; public void processPoseTransformResult(String taskId, String gifUrl, String videoUrl, String imageUrl){ // 1、存储模型返回的数据 @@ -1202,4 +1204,54 @@ public class GenerateServiceImpl extends ServiceImpl i return Arrays.asList(resp); } + @Override + public void processPoseTransformResultBatch(String taskId, String gifUrl, String videoUrl, String imageUrl, String progress) { + // 1、存储模型返回的数据 + PoseTransformation poseTransformation; + QueryWrapper qw = new QueryWrapper<>(); + qw.eq("unique_id", taskId); + List poseTransformations = poseTransformationMapper.selectList(qw); + if (poseTransformations != null && poseTransformations.size() > 1){ + log.warn("通过taskId {} 查询到的PoseTransformation的结果不止一条", taskId); + }else if (poseTransformations == null || poseTransformations.isEmpty()){ + return ; + } + poseTransformation = poseTransformations.get(0); + poseTransformation.setGifUrl(gifUrl); + poseTransformation.setVideoUrl(videoUrl); + poseTransformation.setFirstFrameUrl(imageUrl); + poseTransformation.setUpdateTime(LocalDateTime.now()); + poseTransformationMapper.updateById(poseTransformation); + + String taskIdBatch = poseTransformation.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); + } + + String key = generateResultKey + ":" + taskId; + PoseTransformationVO poseTransformationVO = new PoseTransformationVO( + poseTransformation.getId(), taskId, gifUrl, videoUrl, imageUrl, (byte) 0, "Success"); + + // 2、更新redis + redisUtil.addToString(key, new Gson().toJson(poseTransformationVO), CommonConstant.GENERATE_RESULT_EXPIRE_TIME); + + // 3、执行积分扣除 + String accountId = taskId.substring(taskId.lastIndexOf("-") + 1); + String uuid = taskId.substring(0, taskId.lastIndexOf("-")); + Boolean flag = creditsService.taskCreditsDeduction(Long.parseLong(accountId), uuid); + if (flag) creditsService.updateChangedCredits(accountId, uuid); + } + } 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 95d295ac..b9676847 100644 --- a/src/main/java/com/ai/da/service/impl/PortfolioServiceImpl.java +++ b/src/main/java/com/ai/da/service/impl/PortfolioServiceImpl.java @@ -1,5 +1,6 @@ package com.ai.da.service.impl; +import cn.hutool.core.collection.CollectionUtil; import com.ai.da.common.config.exception.BusinessException; import com.ai.da.common.constant.CommonConstant; import com.ai.da.common.context.UserContext; @@ -25,6 +26,7 @@ import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; import com.google.common.base.Function; import io.netty.util.internal.StringUtil; import lombok.extern.slf4j.Slf4j; +import org.springframework.beans.BeanUtils; import org.springframework.stereotype.Service; import org.springframework.transaction.annotation.Transactional; import org.springframework.util.CollectionUtils; @@ -135,7 +137,9 @@ public class PortfolioServiceImpl extends ServiceImpl existSameNameQw = new QueryWrapper<>(); - existSameNameQw.lambda().ne(Portfolio::getId, portfolioDTO.getId()); + if (null != portfolioDTO.getId()) { + existSameNameQw.lambda().ne(Portfolio::getId, portfolioDTO.getId()); + } existSameNameQw.lambda().eq(Portfolio::getPortfolioName, portfolioDTO.getPortfolioName()); existSameNameQw.lambda().eq(Portfolio::getAccountId, authPrincipalVo.getId()); List portfoliosSameName = portfolioMapper.selectList(existSameNameQw); @@ -148,6 +152,7 @@ public class PortfolioServiceImpl extends ServiceImpl portfolioQueryWrapper = new QueryWrapper<>(); - portfolioQueryWrapper.lambda().eq(Portfolio::getProjectId, portfolioDTO.getProjectId()); - List portfolioList = portfolioMapper.selectList(portfolioQueryWrapper); - if (!CollectionUtils.isEmpty(portfolioList)) { - portfolio = portfolioList.get(0); + if (null != portfolioDTO.getId()) { + portfolio = portfolioMapper.selectById(portfolioDTO.getId()); } + // 关联的项目ID Long projectId = portfolioDTO.getProjectId(); + // 复制project表 Project project = projectMapper.selectById(projectId); - if (project.getOriginal() == 0) { + if (project.getOriginal() != null && project.getOriginal() == 0) { portfolio.setOriginal(0); portfolio.setOriginalAccountId(project.getOriginalAccountId()); - // TODO portfolio.setOriginalPortfolioId(project.getOriginalPortfolioId()); - } else { + }else { portfolio.setOriginal(1); } portfolio.setPortfolioName(portfolioDTO.getPortfolioName()); @@ -178,132 +182,79 @@ public class PortfolioServiceImpl extends ServiceImpl collectionElementListOld = collectionElementService.getByProjectId(projectId); - for (CollectionElement element : collectionElementListOld) { - element.setProjectId(projectIdCopy); - element.setId(null); - collectionElementMapper.insert(element); - } + projectSnapshot.setCollectionElementList(collectionElementListOld); UserLikeGroup userLikeGroup = userLikeService.getUserLikeGroupByProjectId(projectId); if (Objects.nonNull(userLikeGroup)) { - UserLikeGroup userLikeGroupNew = CopyUtil.copyObject(userLikeGroup, UserLikeGroup.class); - userLikeGroupNew.setId(null); - userLikeGroupNew.setAccountId(-1L); - userLikeGroupNew.setProjectId(projectIdCopy); - Long collectionIdOld = userLikeGroup.getCollectionId(); - QueryWrapper designQueryWrapper = new QueryWrapper<>(); - designQueryWrapper.lambda().eq(Design::getCollectionId, collectionIdOld); - Design designOld = designMapper.selectOne(designQueryWrapper); - Collection collectionOld = collectionMapper.selectById(collectionIdOld); + projectSnapshot.setUserLikeGroup(userLikeGroup); - collectionOld.setId(null); - collectionMapper.insert(collectionOld); - Long collectionIdNew = collectionOld.getId(); - - portfolio.setCollectionId(collectionIdNew); - - for (CollectionElement element : collectionElementListOld) { - element.setCollectionId(collectionIdNew); - collectionElementMapper.updateById(element); - TCollectionElementRelation collectionElementRelationNew = new TCollectionElementRelation(); - collectionElementRelationNew.setCollectionId(collectionIdNew); - collectionElementRelationNew.setElementId(element.getId()); - collectionElementRelationNew.setCreateDate(new Date()); - collectionElementRelationMapper.insert(collectionElementRelationNew); - } - - designOld.setCollectionId(collectionIdNew); - designOld.setId(null); - designMapper.insert(designOld); - userLikeGroupNew.setCollectionId(collectionIdNew); - userLikeGroupMapper.insert(userLikeGroupNew); List userLikeList = userLikeService.getUserLikeList(portfolioDTO.getUserLikeGroupId()); + List list = new ArrayList<>(); for (UserLike userLike : userLikeList) { + UserLikeSnapshot userLikeSnapshot = CopyUtil.copyObject(userLike, UserLikeSnapshot.class); + Long designOutfitIdOld = userLike.getDesignOutfitId(); TDesignPythonOutfit designPythonOutfit = designPythonOutfitMapper.selectById(designOutfitIdOld); - designPythonOutfit.setDesignId(-1L); - designPythonOutfit.setDesignItemId(-1L); - designPythonOutfit.setCollectionId(collectionIdNew); - designPythonOutfit.setId(null); + Long designItemIdOld = userLike.getDesignItemId(); DesignItem designItemOld = designItemMapper.selectById(designItemIdOld); - designItemOld.setId(null); - designItemOld.setAccountId(-1L); - designItemOld.setDesignId(-1L); - designItemOld.setCollectionId(collectionIdNew); - designItemMapper.insert(designItemOld); - Long designItemIdNew = designItemOld.getId(); - designPythonOutfit.setDesignItemId(designItemIdNew); - designPythonOutfitMapper.insert(designPythonOutfit); - Long designOutfitIdNew = designPythonOutfit.getId(); - userLike.setDesignOutfitId(designOutfitIdNew); + userLikeSnapshot.setDesignItem(designItemOld); + userLikeSnapshot.setDesignPythonOutfit(designPythonOutfit); + QueryWrapper qw = new QueryWrapper<>(); qw.lambda().eq(TDesignPythonOutfitDetail::getDesignPythonOutfitId, designOutfitIdOld); - List tDesignPythonOutfitDetails = designPythonOutfitDetailMapper.selectList(qw); - for (TDesignPythonOutfitDetail tDesignPythonOutfitDetail : tDesignPythonOutfitDetails) { - tDesignPythonOutfitDetail.setId(null); - tDesignPythonOutfitDetail.setDesignId(-1L); - tDesignPythonOutfitDetail.setDesignPythonOutfitId(designOutfitIdNew); - designPythonOutfitDetailMapper.insert(tDesignPythonOutfitDetail); - } + List tDesignPythonOutfitDetailList = designPythonOutfitDetailMapper.selectList(qw); + userLikeSnapshot.setTDesignPythonOutfitDetailList(tDesignPythonOutfitDetailList); + - userLike.setDesignItemId(designItemIdNew); - userLike.setId(null); - userLike.setDesignId(-1L); - userLike.setUserLikeGroupId(userLikeGroupNew.getId()); - userLikeMapper.insert(userLike); QueryWrapper designItemDetailQueryWrapper = new QueryWrapper<>(); designItemDetailQueryWrapper.lambda().eq(DesignItemDetail::getDesignItemId, designItemIdOld); List designItemDetailListOld = designItemDetailMapper.selectList(designItemDetailQueryWrapper); + List designItemDetailSnapshotList = new ArrayList<>(); for (DesignItemDetail designItemDetailOld : designItemDetailListOld) { + DesignItemDetailSnapshot designItemDetailSnapshot = CopyUtil.copyObject(designItemDetailOld, DesignItemDetailSnapshot.class); Long designItemDetailIdOld = designItemDetailOld.getId(); - designItemDetailOld.setId(null); - designItemDetailOld.setAccountId(-1L); - designItemDetailOld.setDesignId(-1L); - designItemDetailOld.setDesignItemId(designItemIdNew); - designItemDetailMapper.insert(designItemDetailOld); - Long designItemDetailIdNew = designItemDetailOld.getId(); + QueryWrapper designItemDetailPrintQueryWrapper = new QueryWrapper<>(); designItemDetailPrintQueryWrapper.lambda().eq(DesignItemDetailPrint::getDesignItemDetailId, designItemDetailIdOld); - List designItemDetailPrints = designItemDetailPrintMapper.selectList(designItemDetailPrintQueryWrapper); - for (DesignItemDetailPrint designItemDetailPrint : designItemDetailPrints) { - designItemDetailPrint.setId(null); - designItemDetailPrint.setDesignItemDetailId(designItemDetailIdNew); - designItemDetailPrintMapper.insert(designItemDetailPrint); - } + List designItemDetailPrintList = designItemDetailPrintMapper.selectList(designItemDetailPrintQueryWrapper); + designItemDetailSnapshot.setDesignItemDetailPrintList(designItemDetailPrintList); + designItemDetailSnapshotList.add(designItemDetailSnapshot); } + userLikeSnapshot.setDesignItemDetailList(designItemDetailSnapshotList); + list.add(userLikeSnapshot); } + projectSnapshot.setUserLikeList(list); } + String snapshotJson = JSONObject.toJSONString(projectSnapshot); + portfolio.setSnapshot(snapshotJson); } else { portfolio.setPortfolioType("Canvas"); portfolio.setOpenSource(0); } - if (!CollectionUtils.isEmpty(portfolioList)) { + if (null != portfolioDTO.getId()) { portfolioMapper.updateById(portfolio); } else { portfolioMapper.insert(portfolio); @@ -551,22 +502,25 @@ public class PortfolioServiceImpl extends ServiceImpl collectionElementList = collectionElementService.getByCollectionId(collectionId); - for (CollectionElement element : collectionElementList) { - if (StringUtils.isEmpty(element.getUrl())) { - continue; + if (!StringUtils.isEmpty(portfolio.getSnapshot())) { + ProjectSnapshot projectSnapshot = JSONObject.parseObject(portfolio.getSnapshot(), ProjectSnapshot.class); + List collectionElementList = projectSnapshot.getCollectionElementList(); + for (CollectionElement element : collectionElementList) { + if (StringUtils.isEmpty(element.getUrl())) { + continue; + } + element.setUrl(minioUtil.getPreSignedUrl(element.getUrl(), 24 * 60)); } - element.setUrl(minioUtil.getPreSignedUrl(element.getUrl(), 24 * 60)); + vo.setCollectionElementList(collectionElementList); + List userLikeList = projectSnapshot.getUserLikeList(); + List list = new ArrayList<>(); + for (UserLikeSnapshot userLikeSnapshot : userLikeList) { + TDesignPythonOutfit designPythonOutfit = userLikeSnapshot.getDesignPythonOutfit(); + designPythonOutfit.setDesignUrl(minioUtil.getPreSignedUrl(designPythonOutfit.getDesignUrl(), 24 * 60)); + list.add(designPythonOutfit); + } + vo.setDesignPythonOutfitList(list); } - vo.setCollectionElementList(collectionElementList); - QueryWrapper qw = new QueryWrapper<>(); - qw.lambda().eq(TDesignPythonOutfit::getCollectionId, portfolio.getCollectionId()); - List designPythonOutfitList = designPythonOutfitMapper.selectList(qw); - for (TDesignPythonOutfit tDesignPythonOutfit : designPythonOutfitList) { - tDesignPythonOutfit.setDesignUrl(minioUtil.getPreSignedUrl(tDesignPythonOutfit.getDesignUrl(), 24 * 60)); - } - vo.setDesignPythonOutfitList(designPythonOutfitList); } Canvas canvas = canvasMapper.selectById(vo.getCanvasId()); vo.setCanvasUrl(minioUtil.getPreSignedUrl(canvas.getUrl(), 24 * 60)); @@ -636,14 +590,15 @@ public class PortfolioServiceImpl extends ServiceImpl userLikeGroupQueryWrapper = new QueryWrapper<>(); -// userLikeGroupQueryWrapper.lambda().eq(UserLikeGroup::getCollectionId, portfolio.getCollectionId()); - UserLikeGroup userLikeGroup = userLikeService.getUserLikeGroupByProjectId(projectId); + Project project = projectSnapshot.getProject(); + + Long projectId = project.getId(); + + UserLikeGroup userLikeGroup = projectSnapshot.getUserLikeGroup(); - Project project = projectMapper.selectById(projectId); -// Long projectIdOld = project.getId(); project.setCreateTime(LocalDateTime.now()); project.setId(null); project.setAccountId(authPrincipalVo.getId()); @@ -667,7 +622,7 @@ public class PortfolioServiceImpl extends ServiceImpl collectionElementListOld = collectionElementService.getByProjectId(projectId); + List collectionElementListOld = projectSnapshot.getCollectionElementList(); for (CollectionElement element : collectionElementListOld) { element.setProjectId(projectIdNew); element.setId(null); @@ -677,7 +632,7 @@ public class PortfolioServiceImpl extends ServiceImpl collectionElementListOld = collectionElementService.getByCollectionId(collectionIdOld); - collectionOld.setId(null); - collectionMapper.insert(collectionOld); - Long collectionIdNew = collectionOld.getId(); - Long workspaceServiceByProjectId = workspaceService.getByProjectId(projectId); - Workspace workspace = workspaceMapper.selectById(workspaceServiceByProjectId); - Design design = new Design(); - design.setCollectionId(collectionIdNew); - design.setAccountId(authPrincipalVo.getId()); - if (workspace.getSex().equals(Sex.FEMALE.getValue())) { - design.setTemplateId(workspace.getMannequinFemaleId()); - design.setModelType(workspace.getMannequinFemaleType()); - } else { - design.setTemplateId(workspace.getMannequinMaleId()); - design.setModelType(workspace.getMannequinMaleType()); - } - design.setSystemScale(BigDecimal.valueOf(workspace.getSystemDesignerPercentage())); - if (workspace.getPosition().equals(Position.OVERALL.getValue())) { - design.setSingleOverall("overall"); - design.setSwitchCategory(""); - } else { - design.setSingleOverall("single"); - design.setSwitchCategory(workspace.getPosition()); - } - design.setCreateDate(new Date()); - designMapper.insert(design); - - userLikeGroupNew.setCollectionId(collectionIdNew); + userLikeGroupNew.setCollectionId(null); userLikeGroupNew.setUpdateDate(new Date()); userLikeGroupMapper.insert(userLikeGroupNew); -// List collectionElementRelationListNew = new ArrayList<>(); - for (CollectionElement element : collectionElementListOld) { - element.setCollectionId(collectionIdNew); - collectionElementMapper.updateById(element); - TCollectionElementRelation collectionElementRelationNew = new TCollectionElementRelation(); - collectionElementRelationNew.setCollectionId(collectionIdNew); - collectionElementRelationNew.setElementId(element.getId()); - collectionElementRelationNew.setCreateDate(new Date()); - collectionElementRelationMapper.insert(collectionElementRelationNew); - } + List userLikeList = projectSnapshot.getUserLikeList(); + if (CollectionUtil.isNotEmpty(userLikeList)) { + for (UserLikeSnapshot userLike : userLikeList) { + Long designOutfitIdOld = userLike.getDesignOutfitId(); + TDesignPythonOutfit designPythonOutfit = userLike.getDesignPythonOutfit(); + designPythonOutfit.setDesignId(null); + designPythonOutfit.setDesignItemId(-1L); + designPythonOutfit.setCollectionId(null); - List userLikeList = userLikeService.getUserLikeList(portfolioUserLikeGroupId); + designPythonOutfit.setId(null); + designPythonOutfitMapper.insert(designPythonOutfit); + Long designOutfitIdNew = designPythonOutfit.getId(); + userLike.setDesignOutfitId(designOutfitIdNew); - for (UserLike userLike : userLikeList) { - Long designOutfitIdOld = userLike.getDesignOutfitId(); - TDesignPythonOutfit designPythonOutfit = designPythonOutfitMapper.selectById(designOutfitIdOld); - designPythonOutfit.setDesignId(design.getId()); - designPythonOutfit.setDesignItemId(-1L); - designPythonOutfit.setCollectionId(collectionIdNew); + QueryWrapper qw = new QueryWrapper<>(); + qw.lambda().eq(TDesignPythonOutfitDetail::getDesignPythonOutfitId, designOutfitIdOld); + List tDesignPythonOutfitDetails = userLike.getTDesignPythonOutfitDetailList(); + if (CollectionUtil.isNotEmpty(tDesignPythonOutfitDetails)){ + for (TDesignPythonOutfitDetail tDesignPythonOutfitDetail : tDesignPythonOutfitDetails) { + tDesignPythonOutfitDetail.setId(null); + tDesignPythonOutfitDetail.setDesignId(null); + tDesignPythonOutfitDetail.setDesignPythonOutfitId(designOutfitIdNew); + designPythonOutfitDetailMapper.insert(tDesignPythonOutfitDetail); + } + } - designPythonOutfit.setId(null); - designPythonOutfitMapper.insert(designPythonOutfit); - Long designOutfitIdNew = designPythonOutfit.getId(); - userLike.setDesignOutfitId(designOutfitIdNew); - QueryWrapper qw = new QueryWrapper<>(); - qw.lambda().eq(TDesignPythonOutfitDetail::getDesignPythonOutfitId, designOutfitIdOld); - List tDesignPythonOutfitDetails = designPythonOutfitDetailMapper.selectList(qw); - for (TDesignPythonOutfitDetail tDesignPythonOutfitDetail : tDesignPythonOutfitDetails) { -// Long designPythonOutfitDetailIdOld = tDesignPythonOutfitDetail.getId(); - tDesignPythonOutfitDetail.setId(null); - tDesignPythonOutfitDetail.setDesignId(design.getId()); - tDesignPythonOutfitDetail.setDesignPythonOutfitId(designOutfitIdNew); - designPythonOutfitDetailMapper.insert(tDesignPythonOutfitDetail); - } + DesignItem designItemOld = userLike.getDesignItem(); + designItemOld.setId(null); + designItemOld.setAccountId(authPrincipalVo.getId()); + designItemOld.setDesignId(null); + designItemOld.setCollectionId(null); + designItemMapper.insert(designItemOld); + Long designItemIdNew = designItemOld.getId(); - Long designItemIdOld = userLike.getDesignItemId(); - DesignItem designItemOld = designItemMapper.selectById(designItemIdOld); - designItemOld.setId(null); - designItemOld.setAccountId(authPrincipalVo.getId()); - designItemOld.setDesignId(design.getId()); - designItemOld.setCollectionId(collectionIdNew); - designItemMapper.insert(designItemOld); - Long designItemIdNew = designItemOld.getId(); + designPythonOutfit.setDesignItemId(designItemIdNew); + designPythonOutfitMapper.updateById(designPythonOutfit); - designPythonOutfit.setDesignItemId(designItemIdNew); - designPythonOutfitMapper.updateById(designPythonOutfit); + userLike.setDesignItemId(designItemIdNew); + userLike.setId(null); + userLike.setDesignId(null); + userLike.setUserLikeGroupId(userLikeGroupNew.getId()); + userLikeMapper.insert(userLike); - userLike.setDesignItemId(designItemIdNew); - userLike.setId(null); - userLike.setDesignId(design.getId()); - userLike.setUserLikeGroupId(userLikeGroupNew.getId()); - userLikeMapper.insert(userLike); - QueryWrapper designItemDetailQueryWrapper = new QueryWrapper<>(); - designItemDetailQueryWrapper.lambda().eq(DesignItemDetail::getDesignItemId, designItemIdOld); - List designItemDetailListOld = designItemDetailMapper.selectList(designItemDetailQueryWrapper); - for (DesignItemDetail designItemDetailOld : designItemDetailListOld) { - Long designItemDetailIdOld = designItemDetailOld.getId(); - designItemDetailOld.setId(null); - designItemDetailOld.setAccountId(authPrincipalVo.getId()); - designItemDetailOld.setDesignId(design.getId()); - designItemDetailOld.setDesignItemId(designItemIdNew); - designItemDetailMapper.insert(designItemDetailOld); - Long designItemDetailIdNew = designItemDetailOld.getId(); - QueryWrapper designItemDetailPrintQueryWrapper = new QueryWrapper<>(); - designItemDetailPrintQueryWrapper.lambda().eq(DesignItemDetailPrint::getDesignItemDetailId, designItemDetailIdOld); - List designItemDetailPrintList = designItemDetailPrintMapper.selectList(designItemDetailPrintQueryWrapper); - for (DesignItemDetailPrint designItemDetailPrint : designItemDetailPrintList) { - designItemDetailPrint.setId(null); - designItemDetailPrint.setDesignItemDetailId(designItemDetailIdNew); - designItemDetailPrintMapper.insert(designItemDetailPrint); + List designItemDetailList = userLike.getDesignItemDetailList(); + if (CollectionUtil.isNotEmpty(designItemDetailList)) { + for (DesignItemDetailSnapshot designItemDetailOld : designItemDetailList) { + designItemDetailOld.setId(null); + designItemDetailOld.setAccountId(authPrincipalVo.getId()); + designItemDetailOld.setDesignId(null); + designItemDetailOld.setDesignItemId(designItemIdNew); + designItemDetailMapper.insert(designItemDetailOld); + Long designItemDetailIdNew = designItemDetailOld.getId(); + + List designItemDetailPrintList = designItemDetailOld.getDesignItemDetailPrintList(); + if (CollectionUtil.isNotEmpty(designItemDetailPrintList)) { + for (DesignItemDetailPrint designItemDetailPrint : designItemDetailPrintList) { + designItemDetailPrint.setId(null); + designItemDetailPrint.setDesignItemDetailId(designItemDetailIdNew); + designItemDetailPrintMapper.insert(designItemDetailPrint); + } + } + } } } } } - - -// Long collectionId = portfolio.getCollectionId(); -// QueryWrapper getWorkspaceQw = new QueryWrapper<>(); -// getWorkspaceQw.lambda().eq(Design::getCollectionId, collectionId); -// List designs = designMapper.selectList(getWorkspaceQw); -// if (!CollectionUtils.isEmpty(designs)) { -// Design design1 = designs.get(0); -// Long accountId = authPrincipalVo.getId(); -// QueryWrapper currentWorkspaceQw = new QueryWrapper<>(); -// currentWorkspaceQw.lambda().eq(Workspace::getAccountId, accountId); -// currentWorkspaceQw.lambda().eq(Workspace::getIsLastIndex, 1); -// List workspaces = workspaceMapper.selectList(currentWorkspaceQw); -// if (!CollectionUtils.isEmpty(workspaces)) { -// Workspace workspace1 = workspaces.get(0); -// workspace1.setIsLastIndex(0); -// workspaceMapper.updateById(workspace1); -// Workspace workspaceNew = new Workspace(); -// String workspaceName = "workspace of " + accountMapper.selectById(portfolio.getAccountId()).getUserName() + portfolio.getPortfolioName(); -// QueryWrapper existSameNameQw = new QueryWrapper<>(); -// existSameNameQw.lambda().eq(Workspace::getWorkSpaceName, workspaceName); -// existSameNameQw.lambda().eq(Workspace::getAccountId, authPrincipalVo.getId()); -// List existSameNameList = workspaceMapper.selectList(existSameNameQw); -// if (!CollectionUtils.isEmpty(existSameNameList)) { -// workspaceName = workspaceName + "_copy"; -// } -// workspaceNew.setWorkSpaceName(workspaceName); -// workspaceNew.setAccountId(accountId); -// workspaceNew.setIsDeleted(0); -// workspaceNew.setIsLastIndex(1); -// workspaceNew.setCreateTime(LocalDateTime.now()); -// workspaceNew.setSystemDesignerPercentage((design1.getSystemScale().multiply(BigDecimal.valueOf(100)).intValue())); -// if (design1.getSingleOverall().equals("overall")) { -// workspaceNew.setPosition("Overall"); -// } else { -// workspaceNew.setPosition(design1.getSwitchCategory()); -// } -// workspaceMapper.insert(workspaceNew); -// if (design1.getModelType().equals("System")) { -// SysFile sysFile = sysFileMapper.selectById(design1.getTemplateId()); -// if (sysFile.getLevel2Type().equals("Female")) { -// workspaceNew.setSex("Female"); -// workspaceNew.setMannequinFemaleId(design1.getTemplateId()); -// workspaceNew.setMannequinFemaleType("System"); -// QueryWrapper getAnotherOneQw = new QueryWrapper<>(); -// getAnotherOneQw.lambda().eq(SysFile::getLevel1Type, "Models"); -// getAnotherOneQw.lambda().eq(SysFile::getLevel2Type, "Male"); -// if (!StringUtils.isEmpty(sysFile.getLevel3Type())) { -// getAnotherOneQw.lambda().eq(SysFile::getLevel3Type, sysFile.getLevel3Type()); -// QueryWrapper