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 876dfd2c..36540104 100644 --- a/src/main/java/com/ai/da/common/RabbitMQ/GenerateConsumer.java +++ b/src/main/java/com/ai/da/common/RabbitMQ/GenerateConsumer.java @@ -44,6 +44,8 @@ public class GenerateConsumer { @Value("${redis.key.generateResult}") private String generateResultKey; + @Value("${redis.key.toProductImageResultKey}") + private String toProductImageResultKey; public void generate(Message msg, Channel channel, String consumerName) { log.info("============start listening=========="); @@ -154,6 +156,54 @@ public class GenerateConsumer { } + public void processToProductImageResult(Message msg, Channel channel) { + log.info("============processToProductImageResult listening=========="); + long start = System.currentTimeMillis(); + + Map generateResult = JSONObject.parseObject(msg.getBody(), Map.class); + log.info("toProductImage response : {}", generateResult); + + try { + log.info("tasks_id : {} start ", generateResult.get("tasks_id")); + if (generateResult.get("status").equals("SUCCESS")) { + String url = generateResult.get("image_url"); + String taskId = generateResult.get("tasks_id"); + String category = generateResult.get("category"); + generateService.processToProductImageResult(taskId, url, category); + } else { + // 修改redis中的数据状态为exception + String key = toProductImageResultKey + ":" + generateResult.get("tasks_id"); + redisUtil.addToString(key, new Gson().toJson(new GenerateResultVO(generateResult.get("tasks_id"), null, null, "Fail")), CommonConstant.GENERATE_RESULT_EXPIRE_TIME); + // 将异常信息存到exception中 + HashMap exceptionInfo = new HashMap<>(); + exceptionInfo.put(generateResult.get("tasks_id"), generateResult.get("data")); + // 存redis + redisUtil.addToMap(exceptionMapKey, exceptionInfo); + } + } catch (Exception e) { + log.error(e.getMessage()); + try { + channel.basicAck(msg.getMessageProperties().getDeliveryTag(), false); + // 将消息从redis排队队列中删除,需保证被消费的消息存储到db之后再从redis删除 + redisUtil.removeFromZSet(consumptionOrderKey, generateResult.get("tasks_id")); + } catch (IOException exception) { + log.error("手动确认,取消返回队列,不再重新消费"); + } + // 将入参和错误信息存入数据库 + String exceptionMessage = JSONObject.toJSONString(generateResult) + + " Exception message : " + e.getMessage(); + HashMap exceptionInfo = new HashMap<>(); + exceptionInfo.put(String.valueOf(generateResult.get("tasks_id")), exceptionMessage); + // 存redis + redisUtil.addToMap(exceptionMapKey, exceptionInfo); + } + + long end = System.currentTimeMillis(); + log.info("tasks_id : {}, end , message : {}, 执行时长: {} 毫秒", generateResult.get("tasks_id"), generateResult.get("message"), (end - start)); + log.info("============ProcessGenerateResult End listening=========="); + + } + // @RabbitListener(queues = MQConfig.GENERATE_QUEUE) // @RabbitHandler // public void generateConsumer1(Message msg, Channel channel) { @@ -213,4 +263,10 @@ public class GenerateConsumer { // public void getGenerateResult(Message msg, Channel channel) { // processGenerateResult(msg, channel); // } + + @RabbitListener(queues = MQConfig.TO_PRODUCT_IMAGE_RESULT_QUEUE) + @RabbitHandler + public void getToProductImageResult(Message msg, Channel channel) { + processToProductImageResult(msg, channel); + } } diff --git a/src/main/java/com/ai/da/common/RabbitMQ/MQConfig.java b/src/main/java/com/ai/da/common/RabbitMQ/MQConfig.java index 637fc94e..6d9e54ae 100644 --- a/src/main/java/com/ai/da/common/RabbitMQ/MQConfig.java +++ b/src/main/java/com/ai/da/common/RabbitMQ/MQConfig.java @@ -23,6 +23,7 @@ public class MQConfig { // public static final String GENERATE_RESULT_QUEUE = "GenerateImage-local"; public static final String GENERATE_RESULT_QUEUE = "GenerateImage-prod"; + public static final String TO_PRODUCT_IMAGE_RESULT_QUEUE = "ToProductImage-local"; public MQConfig() { } diff --git a/src/main/java/com/ai/da/common/config/MyTaskScheduler.java b/src/main/java/com/ai/da/common/config/MyTaskScheduler.java index bd8f2687..06294584 100644 --- a/src/main/java/com/ai/da/common/config/MyTaskScheduler.java +++ b/src/main/java/com/ai/da/common/config/MyTaskScheduler.java @@ -1,11 +1,11 @@ package com.ai.da.common.config; +import com.ai.da.common.utils.MinioUtil; import com.ai.da.common.utils.SendEmailUtil; -import com.ai.da.mapper.primary.AccountMapper; -import com.ai.da.mapper.primary.TrialOrderMapper; -import com.ai.da.mapper.primary.entity.Account; -import com.ai.da.mapper.primary.entity.TrialOrder; +import com.ai.da.mapper.primary.*; +import com.ai.da.mapper.primary.entity.*; import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; +import org.apache.commons.lang3.StringUtils; import org.apache.poi.ss.usermodel.Row; import org.apache.poi.ss.usermodel.Sheet; import org.apache.poi.ss.usermodel.Workbook; @@ -22,10 +22,16 @@ import java.nio.file.Paths; import java.time.LocalDate; import java.time.format.DateTimeFormatter; import java.util.List; +import java.util.stream.Collectors; @Component public class MyTaskScheduler { + @PostConstruct + public void test() { +// clearMinio(); + } + @Resource private AccountMapper accountMapper; @@ -71,7 +77,7 @@ public class MyTaskScheduler { // @Scheduled(cron = "0 0 8 * * ?") public void sendTrialOrderExcelToManagements() { // 获取前一天日期 - LocalDate yesterday = LocalDate.now().minusDays(1); + LocalDate yesterday = LocalDate.now().minusDays(3); // 查询前一天的试用订单 QueryWrapper qw = new QueryWrapper<>(); @@ -134,4 +140,69 @@ public class MyTaskScheduler { SendEmailUtil.sendNoExcelEmail("kimwong@code-create.com.hk", null); } } + + @Resource + private UserLikeGroupMapper userLikeGroupMapper; + @Resource + private UserLikeMapper userLikeMapper; + @Resource + private TDesignPythonOutfitMapper designPythonOutfitMapper; + @Resource + private TDesignPythonOutfitDetailMapper designPythonOutfitDetailMapper; + @Resource + private DesignItemMapper designItemMapper; + @Resource + private DesignItemDetailMapper designItemDetailMapper; + @Resource + private MinioUtil minioUtil; + public void clearMinio() { + // 获取当前所有history + QueryWrapper userLikeGroupQueryWrapper = new QueryWrapper<>(); + List userLikeGroupList = userLikeGroupMapper.selectList(userLikeGroupQueryWrapper); + List userLikeGroupIdList = userLikeGroupList.stream().map(UserLikeGroup::getId).collect(Collectors.toList()); + QueryWrapper userLikeQueryWrapper = new QueryWrapper<>(); + userLikeQueryWrapper.lambda().in(UserLike::getUserLikeGroupId, userLikeGroupIdList); + // 所有喜欢的图片 + List userLikes = userLikeMapper.selectList(userLikeQueryWrapper); + List designOutfitIdList = userLikes.stream().map(UserLike::getDesignOutfitId).collect(Collectors.toList()); + QueryWrapper designPythonOutfitQueryWrapper = new QueryWrapper<>(); + designPythonOutfitQueryWrapper.lambda().notIn(TDesignPythonOutfit::getId, designOutfitIdList); + List tDesignPythonOutfits = designPythonOutfitMapper.selectList(designPythonOutfitQueryWrapper); +// int i = 0; +// for (TDesignPythonOutfit tDesignPythonOutfit : tDesignPythonOutfits) { +// String designUrl = tDesignPythonOutfit.getDesignUrl(); +// if (StringUtils.isNotBlank(designUrl)) { +// minioUtil.deleteObject(designUrl); +// i ++; +// } +// QueryWrapper designPythonOutfitDetailQueryWrapper = new QueryWrapper<>(); +// designPythonOutfitDetailQueryWrapper.lambda().eq(TDesignPythonOutfitDetail::getDesignPythonOutfitId, tDesignPythonOutfit.getId()); +// List tDesignPythonOutfitDetails = designPythonOutfitDetailMapper.selectList(designPythonOutfitDetailQueryWrapper); +// for (TDesignPythonOutfitDetail tDesignPythonOutfitDetail : tDesignPythonOutfitDetails) { +// if (!tDesignPythonOutfitDetail.getImageCategory().equals("body")) { +// if (StringUtils.isNotBlank(tDesignPythonOutfitDetail.getImageUrl())) { +// minioUtil.deleteObject(tDesignPythonOutfitDetail.getImageUrl()); +// i ++; +// } +// if (StringUtils.isNotBlank(tDesignPythonOutfitDetail.getMaskUrl())) { +// minioUtil.deleteObject(tDesignPythonOutfitDetail.getMaskUrl()); +// i ++; +// } +// } +// } +// } + System.out.println("i"); +// List designItemIdList = userLikes.stream().map(UserLike::getDesignItemId).collect(Collectors.toList()); +// QueryWrapper designItemQueryWrapper = new QueryWrapper<>(); +// designItemQueryWrapper.lambda().in(DesignItem::getId,designItemIdList); +// List designItems = designItemMapper.selectList(designItemQueryWrapper); +// for (DesignItem designItem : designItems) { +// QueryWrapper designItemDetailQueryWrapper = new QueryWrapper<>(); +// designItemDetailQueryWrapper.lambda().eq(DesignItemDetail::getDesignItemId, designItem.getId()); +// List designItemDetails = designItemDetailMapper.selectList(designItemDetailQueryWrapper); +// for (DesignItemDetail designItemDetail : designItemDetails) { +// +// } +// } + } } diff --git a/src/main/java/com/ai/da/common/utils/SendEmailUtil.java b/src/main/java/com/ai/da/common/utils/SendEmailUtil.java index d72e41c6..f8f08e9f 100644 --- a/src/main/java/com/ai/da/common/utils/SendEmailUtil.java +++ b/src/main/java/com/ai/da/common/utils/SendEmailUtil.java @@ -136,7 +136,7 @@ public class SendEmailUtil { private final static Long TRIAL_ORDER_LIST_ID = 122273L; private final static Long NO_TRIAL_ORDER_LIST_ID = 122591L; - public static void sendCustomEmail(String receiverAddress, String senderAddress, TrialOrder trialOrder, int emailType, String country) { + public static void sendCustomEmail(String receiverAddress, String senderAddress, TrialOrder trialOrder, int emailType, String country, boolean link) { try { // 实例化一个认证对象 Credential cred = new Credential(SECRET_ID, SECRET_KEy); @@ -173,7 +173,7 @@ public class SendEmailUtil { }else { template.setTemplateID(NOTIFICATION_TEMPLATE_ID); } - template.setTemplateData(buildNotificationData(trialOrder)); + template.setTemplateData(buildNotificationData(trialOrder, link)); break; default: break; @@ -345,7 +345,7 @@ public class SendEmailUtil { } // 构建试用订单通过通知数据 - private static String buildNotificationData(TrialOrder trialOrder) { + private static String buildNotificationData(TrialOrder trialOrder, boolean link) { JSONObject jsonObject = new JSONObject(); // 设置试用订单通过通知相关数据 jsonObject.put("title", trialOrder.getTitle()); @@ -353,6 +353,11 @@ public class SendEmailUtil { jsonObject.put("givenName", trialOrder.getGivenName()); jsonObject.put("userName", trialOrder.getUserName()); jsonObject.put("email", trialOrder.getEmail()); + if (link) { + jsonObject.put("days", 14); + }else { + jsonObject.put("days", 5); + } return jsonObject.toJSONString(); } diff --git a/src/main/java/com/ai/da/controller/AccountController.java b/src/main/java/com/ai/da/controller/AccountController.java index ce1cd82f..58a58a29 100644 --- a/src/main/java/com/ai/da/controller/AccountController.java +++ b/src/main/java/com/ai/da/controller/AccountController.java @@ -153,4 +153,10 @@ public class AccountController { accountService.upgradeNotification(); return Response.success(true); } + + @ApiOperation(value = "广场用户注册") + @PostMapping("/designWorksRegister") + public Response designWorksRegister(@Valid @RequestBody AccountDesignWorksRegisterDTO accountDesignWorksRegisterDTO) { + return Response.success(accountService.designWorksRegister(accountDesignWorksRegisterDTO)); + } } diff --git a/src/main/java/com/ai/da/controller/PortfolioController.java b/src/main/java/com/ai/da/controller/PortfolioController.java index 32337e46..b8bd3193 100644 --- a/src/main/java/com/ai/da/controller/PortfolioController.java +++ b/src/main/java/com/ai/da/controller/PortfolioController.java @@ -2,6 +2,7 @@ package com.ai.da.controller; import com.ai.da.common.response.PageBaseResponse; import com.ai.da.common.response.Response; +import com.ai.da.model.dto.DesignWorksRegisterDTO; import com.ai.da.model.dto.PortfolioDTO; import com.ai.da.model.dto.QueryPortfolioPageDTO; import com.ai.da.model.vo.PortfolioVO; @@ -10,10 +11,8 @@ import com.ai.da.service.PortfolioService; import io.swagger.annotations.Api; import io.swagger.annotations.ApiOperation; import lombok.extern.slf4j.Slf4j; -import org.springframework.web.bind.annotation.PostMapping; -import org.springframework.web.bind.annotation.RequestBody; -import org.springframework.web.bind.annotation.RequestMapping; -import org.springframework.web.bind.annotation.RestController; +import org.springframework.web.bind.annotation.*; +import org.springframework.web.multipart.MultipartFile; import javax.annotation.Resource; import javax.validation.Valid; @@ -29,16 +28,18 @@ public class PortfolioController { @ApiOperation(value = "发布作品集") @PostMapping("/publish") - public Response preLogin(@Valid @RequestBody PortfolioDTO portfolioDTO) { - return Response.success(portfolioService.publish(portfolioDTO)); + public Response preLogin(@RequestParam("file") MultipartFile canvas, @RequestParam("data") String data) { + return Response.success(portfolioService.publish(canvas, data)); } + @CrossOrigin @ApiOperation(value = "作品集page") @PostMapping("/page") public Response> page(@Valid @RequestBody QueryPortfolioPageDTO query) { return Response.success(portfolioService.page(query)); } + @CrossOrigin @ApiOperation(value = "作品详情") @PostMapping("/detail") public Response detail(@Valid @RequestBody PortfolioDTO portfolioDTO) { @@ -56,4 +57,10 @@ public class PortfolioController { public Response update(@Valid @RequestBody PortfolioDTO portfolioDTO) { return Response.success(portfolioService.update(portfolioDTO)); } + + @ApiOperation(value = "广场用户注册") + @PostMapping("/designWorksRegister") + public Response designWorksRegister(@Valid @RequestBody DesignWorksRegisterDTO designWorksRegisterDTO) { + return Response.success(portfolioService.designWorksRegister(designWorksRegisterDTO)); + } } diff --git a/src/main/java/com/ai/da/controller/SavedCollectionController.java b/src/main/java/com/ai/da/controller/SavedCollectionController.java index f1672d97..5ce6303f 100644 --- a/src/main/java/com/ai/da/controller/SavedCollectionController.java +++ b/src/main/java/com/ai/da/controller/SavedCollectionController.java @@ -8,13 +8,11 @@ import com.ai.da.common.response.Response; import com.ai.da.common.utils.CopyUtil; import com.ai.da.common.utils.MinioUtil; import com.ai.da.mapper.primary.TDesignPythonOutfitMapper; -import com.ai.da.mapper.primary.entity.Account; -import com.ai.da.mapper.primary.entity.Library; -import com.ai.da.mapper.primary.entity.TDesignPythonOutfit; -import com.ai.da.mapper.primary.entity.UserLikeGroup; +import com.ai.da.mapper.primary.entity.*; import com.ai.da.model.dto.*; import com.ai.da.model.vo.*; import com.ai.da.service.*; +import com.alibaba.fastjson.JSONObject; import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; import com.baomidou.mybatisplus.core.metadata.IPage; import com.baomidou.mybatisplus.extension.plugins.pagination.Page; @@ -26,6 +24,7 @@ import lombok.extern.slf4j.Slf4j; import org.springframework.util.CollectionUtils; import org.springframework.util.StringUtils; import org.springframework.web.bind.annotation.*; +import org.springframework.web.multipart.MultipartFile; import javax.annotation.Resource; import javax.validation.Valid; @@ -159,4 +158,52 @@ public class SavedCollectionController { return Response.success(userLikeGroupService.choose(userGroupId)); } + @ApiOperation(value = "exportSave") + @PostMapping("/exportSave") + public Response exportSave(@RequestParam("file") MultipartFile file, @RequestParam("userLikeGroupId") Long userLikeGroupId) { + return Response.success(userLikeGroupService.exportSave(file, userLikeGroupId)); + } + + @ApiOperation(value = "exportSearch") + @PostMapping("/exportSearch") + public Response exportSearch(@Valid @RequestBody ExportSearchDTO exportSearchDTO) { + return Response.success(userLikeGroupService.exportSearch(exportSearchDTO.getUserLikeGroupId())); + } + + @ApiOperation(value = "toProduct") + @PostMapping("/toProduct") + public Response> toProduct(@Valid @RequestBody ToProductImageDTO toProductImageDTO) { + return Response.success(userLikeGroupService.toProduct(toProductImageDTO)); + } + + @ApiOperation(value = "toProductImageElementUpload") + @PostMapping("/toProductImageElementUpload") + public Response toProductImageElementUpload(@RequestParam("file") MultipartFile file, @RequestParam(value = "userlikeGroupId") Long userLikeGroupId) { + return Response.success(userLikeGroupService.toProductImageElementUpload(file, userLikeGroupId)); + } + + @ApiOperation(value = "productImageLike") + @PostMapping("/productImageLike") + public Response productImageLike(@Valid @RequestBody ProductImageLikeDTO productImageLikeDTO) { + return Response.success(userLikeGroupService.productImageLike(productImageLikeDTO)); + } + + @ApiOperation(value = "获取生成结果") + @PostMapping("/toProductImageResult") + public Response> getToProductImageResult(@Valid @RequestBody List taskIdList) { + List generateResult = userLikeGroupService.getToProductImageResultList(taskIdList); + return Response.success(generateResult); + } + + @ApiOperation(value = "画布用户上传元素") + @PostMapping("/canvasElementUpload") + public Response canvasElementUpload(@RequestParam("file") MultipartFile file) { + return Response.success(userLikeGroupService.canvasElementUpload(file)); + } + + @ApiOperation("productImageLikeList") + @PostMapping("/productImageLikeList") + public Response> productImageLikeList(@Valid @RequestBody ToProductImageDTO toProductImageDTO) { + return Response.success(userLikeGroupService.productImageLikeList(toProductImageDTO)); + } } diff --git a/src/main/java/com/ai/da/mapper/primary/CanvasMapper.java b/src/main/java/com/ai/da/mapper/primary/CanvasMapper.java new file mode 100644 index 00000000..0007c423 --- /dev/null +++ b/src/main/java/com/ai/da/mapper/primary/CanvasMapper.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.Canvas; + +public interface CanvasMapper extends CommonMapper { +} diff --git a/src/main/java/com/ai/da/mapper/primary/ExportFileMapper.java b/src/main/java/com/ai/da/mapper/primary/ExportFileMapper.java new file mode 100644 index 00000000..93f07046 --- /dev/null +++ b/src/main/java/com/ai/da/mapper/primary/ExportFileMapper.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.ExportFile; + +public interface ExportFileMapper extends CommonMapper { +} diff --git a/src/main/java/com/ai/da/mapper/primary/ToProductElementMapper.java b/src/main/java/com/ai/da/mapper/primary/ToProductElementMapper.java new file mode 100644 index 00000000..7bd236f5 --- /dev/null +++ b/src/main/java/com/ai/da/mapper/primary/ToProductElementMapper.java @@ -0,0 +1,8 @@ +package com.ai.da.mapper.primary; + +import com.ai.da.common.config.mybatis.plus.CommonMapper; +import com.ai.da.mapper.primary.entity.ToProductElement; + +public interface ToProductElementMapper extends CommonMapper { + +} diff --git a/src/main/java/com/ai/da/mapper/primary/ToProductImageRecordMapper.java b/src/main/java/com/ai/da/mapper/primary/ToProductImageRecordMapper.java new file mode 100644 index 00000000..2d97878c --- /dev/null +++ b/src/main/java/com/ai/da/mapper/primary/ToProductImageRecordMapper.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.ToProductImageRecord; + +public interface ToProductImageRecordMapper extends CommonMapper { +} diff --git a/src/main/java/com/ai/da/mapper/primary/ToProductImageResultMapper.java b/src/main/java/com/ai/da/mapper/primary/ToProductImageResultMapper.java new file mode 100644 index 00000000..74163ae4 --- /dev/null +++ b/src/main/java/com/ai/da/mapper/primary/ToProductImageResultMapper.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.ToProductImageResult; + +public interface ToProductImageResultMapper extends CommonMapper { +} diff --git a/src/main/java/com/ai/da/mapper/primary/entity/Canvas.java b/src/main/java/com/ai/da/mapper/primary/entity/Canvas.java new file mode 100644 index 00000000..d33d7e6f --- /dev/null +++ b/src/main/java/com/ai/da/mapper/primary/entity/Canvas.java @@ -0,0 +1,42 @@ +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 java.io.Serializable; +import java.math.BigDecimal; +import java.time.LocalDateTime; +import java.util.Date; + +/** + * Attendance + * + * @author easy-generator + * @since 2022-06-13 + */ +@Data +@EqualsAndHashCode(callSuper = false) +@Accessors(chain = true) +@TableName("canvas") +public class Canvas implements Serializable { + + private static final long serialVersionUID = 1L; + + @ApiModelProperty("ID") + @TableId(value = "id", type = IdType.AUTO) + private Long id; + + @ApiModelProperty("url") + private String url; + + @ApiModelProperty("accountId") + private Long accountId; + + @ApiModelProperty("createTime") + private LocalDateTime createTime; +} diff --git a/src/main/java/com/ai/da/mapper/primary/entity/CanvasElementUpload.java b/src/main/java/com/ai/da/mapper/primary/entity/CanvasElementUpload.java new file mode 100644 index 00000000..8311833a --- /dev/null +++ b/src/main/java/com/ai/da/mapper/primary/entity/CanvasElementUpload.java @@ -0,0 +1,9 @@ +package com.ai.da.mapper.primary.entity; + +import lombok.Data; + +@Data +public class CanvasElementUpload { + private String url; + private String minioUrl; +} diff --git a/src/main/java/com/ai/da/mapper/primary/entity/ExportFile.java b/src/main/java/com/ai/da/mapper/primary/entity/ExportFile.java new file mode 100644 index 00000000..c62706b2 --- /dev/null +++ b/src/main/java/com/ai/da/mapper/primary/entity/ExportFile.java @@ -0,0 +1,24 @@ +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 lombok.Data; +import lombok.EqualsAndHashCode; +import lombok.experimental.Accessors; + +import java.io.Serializable; + +@Data +@EqualsAndHashCode(callSuper = false) +@Accessors(chain = true) +@TableName("export_file") +public class ExportFile implements Serializable { + private static final long serialVersionUID = 1L; + + @TableId(value = "id", type = IdType.AUTO) + private Long id; + + private String url; + private Long userLikeGroupId; +} 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 3c1831ca..8f15354a 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 @@ -35,12 +35,18 @@ public class Portfolio implements Serializable { @ApiModelProperty(value = "作品类型") private String portfolioType; + @ApiModelProperty(value = "画布ID") + private Long canvasId; + @ApiModelProperty(value = "封面ID") private Long coverId; @ApiModelProperty(value = "作品状态1公开0隐藏") private Integer status; + @ApiModelProperty(value = "是否允许二次创作1允许0不允许") + private Integer openSource; + @ApiModelProperty(value = "作品集作者ID") private Long accountId; diff --git a/src/main/java/com/ai/da/mapper/primary/entity/ToProductElement.java b/src/main/java/com/ai/da/mapper/primary/entity/ToProductElement.java new file mode 100644 index 00000000..d725806f --- /dev/null +++ b/src/main/java/com/ai/da/mapper/primary/entity/ToProductElement.java @@ -0,0 +1,27 @@ +package com.ai.da.mapper.primary.entity; + +import com.baomidou.mybatisplus.annotation.IdType; +import com.baomidou.mybatisplus.annotation.TableId; +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; + +import java.io.Serializable; +import java.time.LocalDateTime; + +@Data +public class ToProductElement implements Serializable { + private static final long serialVersionUID = 1L; + + @ApiModelProperty(value = "ID") + @TableId(value = "id", type = IdType.AUTO) + private Long id; + + @ApiModelProperty(value = "userLikeGroupId") + private Long userLikeGroupId; + + @ApiModelProperty(value = "url") + private String url; + + @ApiModelProperty(value = "createTime") + private LocalDateTime createTime; +} diff --git a/src/main/java/com/ai/da/mapper/primary/entity/ToProductImageRecord.java b/src/main/java/com/ai/da/mapper/primary/entity/ToProductImageRecord.java new file mode 100644 index 00000000..252f5065 --- /dev/null +++ b/src/main/java/com/ai/da/mapper/primary/entity/ToProductImageRecord.java @@ -0,0 +1,27 @@ +package com.ai.da.mapper.primary.entity; + +import com.baomidou.mybatisplus.annotation.IdType; +import com.baomidou.mybatisplus.annotation.TableId; +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; + +import java.io.Serializable; +import java.time.LocalDateTime; + +@Data +public class ToProductImageRecord implements Serializable { + private static final long serialVersionUID = 1L; + + @ApiModelProperty(value = "ID") + @TableId(value = "id", type = IdType.AUTO) + private Long id; + + @ApiModelProperty(value = "userLikeGroupId") + private Long userLikeGroupId; + + @ApiModelProperty(value = "prompt") + private String prompt; + + @ApiModelProperty(value = "createTime") + private LocalDateTime createTime; +} 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 new file mode 100644 index 00000000..f81f255b --- /dev/null +++ b/src/main/java/com/ai/da/mapper/primary/entity/ToProductImageResult.java @@ -0,0 +1,42 @@ +package com.ai.da.mapper.primary.entity; + +import com.baomidou.mybatisplus.annotation.IdType; +import com.baomidou.mybatisplus.annotation.TableId; +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; + +import java.io.Serializable; +import java.time.LocalDateTime; + +@Data +public class ToProductImageResult implements Serializable { + private static final long serialVersionUID = 1L; + + @ApiModelProperty(value = "ID") + @TableId(value = "id", type = IdType.AUTO) + private Long id; + + @ApiModelProperty(value = "elementId") + private Long elementId; + + @ApiModelProperty(value = "elementType") + private String elementType; + + @ApiModelProperty(value = "url") + private String url; + + @ApiModelProperty(value = "isLike 1是0否") + private Integer isLike; + + @ApiModelProperty(value = "createTime") + private LocalDateTime createTime; + + @ApiModelProperty(value = "toProductImageRecordId") + private Long toProductImageRecordId; + + @ApiModelProperty(value = "taskId") + private String taskId; + + @ApiModelProperty(value = "userLikeGroupId") + private Long userLikeGroupId; +} diff --git a/src/main/java/com/ai/da/model/dto/AccountDesignWorksRegisterDTO.java b/src/main/java/com/ai/da/model/dto/AccountDesignWorksRegisterDTO.java new file mode 100644 index 00000000..ab99249e --- /dev/null +++ b/src/main/java/com/ai/da/model/dto/AccountDesignWorksRegisterDTO.java @@ -0,0 +1,8 @@ +package com.ai.da.model.dto; + +import com.ai.da.mapper.primary.entity.Account; +import lombok.Data; + +@Data +public class AccountDesignWorksRegisterDTO extends Account { +} diff --git a/src/main/java/com/ai/da/model/dto/DesignWorksRegisterDTO.java b/src/main/java/com/ai/da/model/dto/DesignWorksRegisterDTO.java new file mode 100644 index 00000000..775ec850 --- /dev/null +++ b/src/main/java/com/ai/da/model/dto/DesignWorksRegisterDTO.java @@ -0,0 +1,10 @@ +package com.ai.da.model.dto; + +import lombok.Data; + +@Data +public class DesignWorksRegisterDTO { + private String userName; + private String email; + private String password; +} diff --git a/src/main/java/com/ai/da/model/dto/ExportSaveDTO.java b/src/main/java/com/ai/da/model/dto/ExportSaveDTO.java new file mode 100644 index 00000000..25c2fe8f --- /dev/null +++ b/src/main/java/com/ai/da/model/dto/ExportSaveDTO.java @@ -0,0 +1,8 @@ +package com.ai.da.model.dto; + +import lombok.Data; + +@Data +public class ExportSaveDTO { + private String data; +} diff --git a/src/main/java/com/ai/da/model/dto/ExportSearchDTO.java b/src/main/java/com/ai/da/model/dto/ExportSearchDTO.java new file mode 100644 index 00000000..f7f5ccda --- /dev/null +++ b/src/main/java/com/ai/da/model/dto/ExportSearchDTO.java @@ -0,0 +1,8 @@ +package com.ai.da.model.dto; + +import lombok.Data; + +@Data +public class ExportSearchDTO { + private Long userLikeGroupId; +} diff --git a/src/main/java/com/ai/da/model/dto/PortfolioDTO.java b/src/main/java/com/ai/da/model/dto/PortfolioDTO.java index 90f39bb0..add1d0c9 100644 --- a/src/main/java/com/ai/da/model/dto/PortfolioDTO.java +++ b/src/main/java/com/ai/da/model/dto/PortfolioDTO.java @@ -2,9 +2,11 @@ package com.ai.da.model.dto; import com.ai.da.mapper.primary.entity.Portfolio; import lombok.Data; +import org.springframework.web.multipart.MultipartFile; + +import java.io.File; @Data public class PortfolioDTO extends Portfolio { private Long userLikeGroupId; - } diff --git a/src/main/java/com/ai/da/model/dto/ProductImageLikeDTO.java b/src/main/java/com/ai/da/model/dto/ProductImageLikeDTO.java new file mode 100644 index 00000000..4b4c8302 --- /dev/null +++ b/src/main/java/com/ai/da/model/dto/ProductImageLikeDTO.java @@ -0,0 +1,10 @@ +package com.ai.da.model.dto; + +import lombok.Data; + +import java.util.List; + +@Data +public class ProductImageLikeDTO { + private List toProductImageResultId; +} diff --git a/src/main/java/com/ai/da/model/dto/ToProductImageDTO.java b/src/main/java/com/ai/da/model/dto/ToProductImageDTO.java new file mode 100644 index 00000000..25af4ec5 --- /dev/null +++ b/src/main/java/com/ai/da/model/dto/ToProductImageDTO.java @@ -0,0 +1,13 @@ +package com.ai.da.model.dto; + +import com.ai.da.model.vo.ToProductImageVO; +import lombok.Data; + +import java.util.List; + +@Data +public class ToProductImageDTO { + private Long userLikeGroupId; + private List toProductImageVOList; + private String prompt; +} diff --git a/src/main/java/com/ai/da/model/enums/DesignElementsEnum.java b/src/main/java/com/ai/da/model/enums/DesignElementsEnum.java index ac58a75f..5b2547a5 100644 --- a/src/main/java/com/ai/da/model/enums/DesignElementsEnum.java +++ b/src/main/java/com/ai/da/model/enums/DesignElementsEnum.java @@ -2,7 +2,7 @@ package com.ai.da.model.enums; import com.fasterxml.jackson.annotation.JsonValue; -public enum DesignElementsEnum { +public enum DesignElementsEnum implements IEnumDisplay { EMBROIDERY("刺绣", "Embroidery"), BEADING("钉珠", "Beading"), PEARL("珍珠", "Pearl"), @@ -16,6 +16,12 @@ public enum DesignElementsEnum { private final String chinese; private final String english; + @Override + @JsonValue + public String getValue() { + return this.english; + } + // 构造函数 DesignElementsEnum(String chinese, String english) { this.chinese = chinese; diff --git a/src/main/java/com/ai/da/model/enums/PrintboardLevel2TypeEnum.java b/src/main/java/com/ai/da/model/enums/PrintboardLevel2TypeEnum.java index 3dded896..338a1f0b 100644 --- a/src/main/java/com/ai/da/model/enums/PrintboardLevel2TypeEnum.java +++ b/src/main/java/com/ai/da/model/enums/PrintboardLevel2TypeEnum.java @@ -1,6 +1,8 @@ package com.ai.da.model.enums; -public enum PrintboardLevel2TypeEnum { +import com.fasterxml.jackson.annotation.JsonValue; + +public enum PrintboardLevel2TypeEnum implements IEnumDisplay { SLOGAN("标语", "Slogan"), LOGO("标志", "Logo"), PATTERN("图案", "Pattern"); @@ -14,6 +16,12 @@ public enum PrintboardLevel2TypeEnum { this.english = english; } + @Override + @JsonValue + public String getValue() { + return this.english; + } + // 获取中文描述 public String getChinese() { return chinese; diff --git a/src/main/java/com/ai/da/model/vo/PortfolioVO.java b/src/main/java/com/ai/da/model/vo/PortfolioVO.java index b313cc9a..96ed1d94 100644 --- a/src/main/java/com/ai/da/model/vo/PortfolioVO.java +++ b/src/main/java/com/ai/da/model/vo/PortfolioVO.java @@ -9,7 +9,7 @@ import java.util.List; @Data public class PortfolioVO extends Portfolio { - private String designPythonOutfitUrl; + private String canvasUrl; private List collectionElementList; private List designPythonOutfitList; diff --git a/src/main/java/com/ai/da/model/vo/ToProductElementVO.java b/src/main/java/com/ai/da/model/vo/ToProductElementVO.java new file mode 100644 index 00000000..7afd79a8 --- /dev/null +++ b/src/main/java/com/ai/da/model/vo/ToProductElementVO.java @@ -0,0 +1,8 @@ +package com.ai.da.model.vo; + +import com.ai.da.mapper.primary.entity.ToProductElement; +import lombok.Data; + +@Data +public class ToProductElementVO extends ToProductElement { +} diff --git a/src/main/java/com/ai/da/model/vo/ToProductImageVO.java b/src/main/java/com/ai/da/model/vo/ToProductImageVO.java new file mode 100644 index 00000000..57b607be --- /dev/null +++ b/src/main/java/com/ai/da/model/vo/ToProductImageVO.java @@ -0,0 +1,9 @@ +package com.ai.da.model.vo; + +import com.ai.da.mapper.primary.entity.ToProductImageResult; +import lombok.Data; + +@Data +public class ToProductImageVO extends ToProductImageResult { + +} diff --git a/src/main/java/com/ai/da/model/vo/ToProductVO.java b/src/main/java/com/ai/da/model/vo/ToProductVO.java new file mode 100644 index 00000000..d44ec250 --- /dev/null +++ b/src/main/java/com/ai/da/model/vo/ToProductVO.java @@ -0,0 +1,8 @@ +package com.ai.da.model.vo; + +import com.ai.da.mapper.primary.entity.UserLike; +import lombok.Data; + +@Data +public class ToProductVO extends UserLike { +} diff --git a/src/main/java/com/ai/da/python/PythonService.java b/src/main/java/com/ai/da/python/PythonService.java index 9e9d82b0..dc38079f 100644 --- a/src/main/java/com/ai/da/python/PythonService.java +++ b/src/main/java/com/ai/da/python/PythonService.java @@ -8,10 +8,7 @@ import com.ai.da.common.enums.*; import com.ai.da.common.utils.*; import com.ai.da.mapper.primary.CollocationMapper; import com.ai.da.mapper.primary.DressingMapper; -import com.ai.da.mapper.primary.entity.CollectionElement; -import com.ai.da.mapper.primary.entity.Collocation; -import com.ai.da.mapper.primary.entity.DesignHistory; -import com.ai.da.mapper.primary.entity.Dressing; +import com.ai.da.mapper.primary.entity.*; import com.ai.da.mapper.secondary.AttributeRetrievalMapper; import com.ai.da.mapper.secondary.entity.AttributeRetrieval; import com.ai.da.mapper.secondary.entity.AttributeRecognitionJSON; @@ -165,7 +162,7 @@ public class PythonService { * @param operateType * @return */ - @Transactional + @Transactional(rollbackFor = Exception.class) public String upload(MultipartFile file, String operateType) { //用户信息 PythonToJavaApiOperationTypeEnum operationType = PythonToJavaApiOperationTypeEnum.uploadOf(operateType); @@ -3254,4 +3251,44 @@ public class PythonService { return text; } + public Boolean toProductImage(String url, String taskId, String prompt) { + // 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); + log.info("toProductImage请求python 参数:####{}", map); + String param = JSON.toJSONString(map, SerializerFeature.WriteNullStringAsEmpty); + 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") + .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"); + } } diff --git a/src/main/java/com/ai/da/service/AccountService.java b/src/main/java/com/ai/da/service/AccountService.java index 6d42900b..ac30940a 100644 --- a/src/main/java/com/ai/da/service/AccountService.java +++ b/src/main/java/com/ai/da/service/AccountService.java @@ -130,4 +130,6 @@ public interface AccountService extends IService { void moveLibraryDate(); void updateCredits(Long accountId, String value); + + Boolean designWorksRegister(AccountDesignWorksRegisterDTO accountDesignWorksRegisterDTO); } diff --git a/src/main/java/com/ai/da/service/GenerateService.java b/src/main/java/com/ai/da/service/GenerateService.java index a3f6ed7d..89fd6267 100644 --- a/src/main/java/com/ai/da/service/GenerateService.java +++ b/src/main/java/com/ai/da/service/GenerateService.java @@ -17,6 +17,8 @@ public interface GenerateService extends IService { void processGenerateResult(String taskId, String url, String category); + void processToProductImageResult(String taskId, String url, String category); + GenerateLikeVO generateLike(GenerateLikeDTO generateLikeDTO); Boolean generateDislike(Long generateDetailId, String timeZone); @@ -34,5 +36,4 @@ public interface GenerateService extends IService { Long getRankPosition(String uniqueId); void cancelGenerate(Long userId, List uniqueId, String timeZone); - } diff --git a/src/main/java/com/ai/da/service/PortfolioService.java b/src/main/java/com/ai/da/service/PortfolioService.java index 683f8c09..582406c2 100644 --- a/src/main/java/com/ai/da/service/PortfolioService.java +++ b/src/main/java/com/ai/da/service/PortfolioService.java @@ -2,14 +2,16 @@ package com.ai.da.service; import com.ai.da.common.response.PageBaseResponse; import com.ai.da.mapper.primary.entity.Portfolio; +import com.ai.da.model.dto.DesignWorksRegisterDTO; import com.ai.da.model.dto.PortfolioDTO; import com.ai.da.model.dto.QueryPortfolioPageDTO; import com.ai.da.model.vo.PortfolioVO; import com.ai.da.model.vo.UserLikeChooseVO; import com.baomidou.mybatisplus.extension.service.IService; +import org.springframework.web.multipart.MultipartFile; public interface PortfolioService extends IService { - Boolean publish(PortfolioDTO portfolioDTO); + Boolean publish(MultipartFile canvas, String data); PortfolioVO update(PortfolioDTO portfolioDTO); @@ -18,4 +20,6 @@ public interface PortfolioService extends IService { PortfolioVO detail(PortfolioDTO portfolioDTO); UserLikeChooseVO choose(PortfolioDTO portfolioDTO); + + Boolean designWorksRegister(DesignWorksRegisterDTO designWorksRegisterDTO); } diff --git a/src/main/java/com/ai/da/service/UserLikeGroupService.java b/src/main/java/com/ai/da/service/UserLikeGroupService.java index dd4d7c86..a8316142 100644 --- a/src/main/java/com/ai/da/service/UserLikeGroupService.java +++ b/src/main/java/com/ai/da/service/UserLikeGroupService.java @@ -1,9 +1,17 @@ package com.ai.da.service; +import com.ai.da.mapper.primary.entity.CanvasElementUpload; +import com.ai.da.mapper.primary.entity.ToProductImageResult; import com.ai.da.mapper.primary.entity.UserLikeGroup; -import com.ai.da.model.vo.HistoryUpdateVO; -import com.ai.da.model.vo.UserLikeChooseVO; +import com.ai.da.model.dto.ExportSaveDTO; +import com.ai.da.model.dto.ProductImageLikeDTO; +import com.ai.da.model.dto.ToProductImageDTO; +import com.ai.da.model.vo.*; +import com.alibaba.fastjson.JSONObject; import com.baomidou.mybatisplus.extension.service.IService; +import org.springframework.web.multipart.MultipartFile; + +import java.util.List; /** * 服务类 @@ -30,4 +38,20 @@ public interface UserLikeGroupService extends IService { void deleteTrialData(Long id); void updateDate(Long id,String timeZone); + + Boolean exportSave(MultipartFile file, Long userLikeGroupId); + + List toProduct(ToProductImageDTO toProductImageDTO); + + ToProductElementVO toProductImageElementUpload(MultipartFile file, Long userLikeGroupId); + + Boolean productImageLike(ProductImageLikeDTO productImageLikeDTO); + + List getToProductImageResultList(List taskIdList); + + JSONObject exportSearch(Long userLikeGroupId); + + CanvasElementUpload canvasElementUpload(MultipartFile file); + + List productImageLikeList(ToProductImageDTO toProductImageDTO); } diff --git a/src/main/java/com/ai/da/service/impl/AccountLoginLogServiceImpl.java b/src/main/java/com/ai/da/service/impl/AccountLoginLogServiceImpl.java index e5c24f73..fb09cc10 100644 --- a/src/main/java/com/ai/da/service/impl/AccountLoginLogServiceImpl.java +++ b/src/main/java/com/ai/da/service/impl/AccountLoginLogServiceImpl.java @@ -29,7 +29,7 @@ public class AccountLoginLogServiceImpl extends ServiceImpl impl @Override - @Transactional + @Transactional(rollbackFor = Exception.class) public AccountPreLoginVO preLogin(AccountPreLoginDTO accountDTO) { log.info("aida预先登入accountDTO###{}", JSON.toJSONString(accountDTO)); Account account = getOneByEmail(accountDTO.getEmail()); @@ -127,7 +127,7 @@ public class AccountServiceImpl extends ServiceImpl impl return new AccountPreLoginVO(account.getId()); } - @Transactional + @Transactional(rollbackFor = Exception.class) @Override public AccountLoginVO login(AccountLoginDTO accountLoginDTO, HttpServletRequest request) { // Assert.isTrue(StringUtils.isNotBlank(accountLoginDTO.getEmail()), "Please input a email !"); @@ -251,7 +251,7 @@ public class AccountServiceImpl extends ServiceImpl impl return Boolean.TRUE; } - @Transactional + @Transactional(rollbackFor = Exception.class) @Override public Boolean forgetPwd(AccountRegisterDTO accountDTO) { // Account emailAccount = getOneByEmail(accountDTO.getEmail()); @@ -469,6 +469,10 @@ public class AccountServiceImpl extends ServiceImpl impl public Boolean addTrialUser(AccountTrialDTO accountTrialDTO, HttpServletRequest request) { // 获取用户申请试用IP String ipAddress = RequestInfoUtil.getIpAddress(request); + boolean link = false; + if (StringUtils.isNotBlank(accountTrialDTO.getRef())) { + link = true; + } // 先检测试用订单 QueryWrapper trialOrderQueryWrapper = new QueryWrapper<>(); trialOrderQueryWrapper.eq("BINARY email", accountTrialDTO.getEmail()); @@ -516,7 +520,7 @@ public class AccountServiceImpl extends ServiceImpl impl account.setIsTrial(1); account.setIsBeginner(1); account.setValidStartTime(System.currentTimeMillis()); - if (StringUtils.isNotBlank(accountTrialDTO.getRef())) { + if (link) { account.setValidEndTime(Instant.now().plus(14, ChronoUnit.DAYS).toEpochMilli()); }else { account.setValidEndTime(Instant.now().plus(5, ChronoUnit.DAYS).toEpochMilli()); @@ -528,7 +532,7 @@ public class AccountServiceImpl extends ServiceImpl impl account.setUserEmail(trialOrder.getEmail()); account.setLanguage(Language.ENGLISH.name()); account.setValidStartTime(System.currentTimeMillis()); - if (StringUtils.isNotBlank(accountTrialDTO.getRef())) { + if (link) { account.setValidEndTime(Instant.now().plus(14, ChronoUnit.DAYS).toEpochMilli()); }else { account.setValidEndTime(Instant.now().plus(5, ChronoUnit.DAYS).toEpochMilli()); @@ -543,9 +547,9 @@ public class AccountServiceImpl extends ServiceImpl impl // SendEmailUtil.sendCustomEmail("calvinwong@aidlab.hk", null, trialOrder,2); // SendEmailUtil.sendCustomEmail("kaicpang.pang@connect.polyu.hk", null, trialOrder,2); if (trialOrder.getCountry().equals("China")) { - SendEmailUtil.sendCustomEmail(account.getUserEmail(), null, trialOrder, 3, trialOrder.getCountry()); + SendEmailUtil.sendCustomEmail(account.getUserEmail(), null, trialOrder, 3, trialOrder.getCountry(), link); }else { - SendEmailUtil.sendCustomEmail(account.getUserEmail(), null, trialOrder, 3, trialOrder.getCountry()); + SendEmailUtil.sendCustomEmail(account.getUserEmail(), null, trialOrder, 3, trialOrder.getCountry(), link); } } return Boolean.TRUE; @@ -595,9 +599,9 @@ public class AccountServiceImpl extends ServiceImpl impl // SendEmailUtil.sendCustomEmail("calvinwong@aidlab.hk", null, trialOrder,2, trialOrder.getCountry()); // SendEmailUtil.sendCustomEmail("kaicpang.pang@connect.polyu.hk", null, trialOrder,2, trialOrder.getCountry()); if (trialOrder.getCountry().equals("China")) { - SendEmailUtil.sendCustomEmail(account.getUserEmail(), null, trialOrder, 3, trialOrder.getCountry()); + SendEmailUtil.sendCustomEmail(account.getUserEmail(), null, trialOrder, 3, trialOrder.getCountry(), false); }else { - SendEmailUtil.sendCustomEmail(account.getUserEmail(), null, trialOrder, 3, trialOrder.getCountry()); + SendEmailUtil.sendCustomEmail(account.getUserEmail(), null, trialOrder, 3, trialOrder.getCountry(), false); } } return Boolean.TRUE; @@ -934,4 +938,17 @@ public class AccountServiceImpl extends ServiceImpl impl account.setCredits(new BigDecimal(value)); accountMapper.updateById(account); } + + @Override + public Boolean designWorksRegister(AccountDesignWorksRegisterDTO accountDesignWorksRegisterDTO) { + QueryWrapper qw = new QueryWrapper<>(); + qw.eq("BINARY user_email", accountDesignWorksRegisterDTO.getUserEmail()); + List accountList = accountMapper.selectList(qw); + if (CollectionUtil.isNotEmpty(accountList)) { + throw new BusinessException("The email has already been registered"); + } + Account account = CopyUtil.copyObject(accountDesignWorksRegisterDTO, Account.class); + accountMapper.insert(account); + return null; + } } diff --git a/src/main/java/com/ai/da/service/impl/ClassificationServiceImpl.java b/src/main/java/com/ai/da/service/impl/ClassificationServiceImpl.java index 940725c5..bd799fd7 100644 --- a/src/main/java/com/ai/da/service/impl/ClassificationServiceImpl.java +++ b/src/main/java/com/ai/da/service/impl/ClassificationServiceImpl.java @@ -109,17 +109,17 @@ public class ClassificationServiceImpl implements ClassificationService { if (CollectionUtil.isNotEmpty(classificationList)) { // 获取结果集 List classificationVOList = getClassificationVOList(classificationList); - if (classificationDTO.getType().equals("DesignElements")) { - for (ClassificationVO classificationVO : classificationVOList) { - String classificationName = classificationVO.getClassificationName(); - DesignElementsEnum designElementsEnum = DesignElementsEnum.fromName(classificationName); - if (userHolder.getLanguage().equals(Language.ENGLISH.name())) { - classificationVO.setClassificationName(designElementsEnum.getEnglish()); - }else { - classificationVO.setClassificationName(designElementsEnum.getChinese()); - } - } - } +// if (classificationDTO.getType().equals("DesignElements")) { +// for (ClassificationVO classificationVO : classificationVOList) { +// String classificationName = classificationVO.getClassificationName(); +// DesignElementsEnum designElementsEnum = DesignElementsEnum.fromName(classificationName); +// if (userHolder.getLanguage().equals(Language.ENGLISH.name())) { +// classificationVO.setClassificationName(designElementsEnum.getEnglish()); +// }else { +// classificationVO.setClassificationName(designElementsEnum.getChinese()); +// } +// } +// } return classificationVOList; } return new ArrayList<>(); diff --git a/src/main/java/com/ai/da/service/impl/CollectionElementServiceImpl.java b/src/main/java/com/ai/da/service/impl/CollectionElementServiceImpl.java index 3f873a9b..8bced01d 100644 --- a/src/main/java/com/ai/da/service/impl/CollectionElementServiceImpl.java +++ b/src/main/java/com/ai/da/service/impl/CollectionElementServiceImpl.java @@ -80,7 +80,7 @@ public class CollectionElementServiceImpl extends ServiceImpl elementIds, Long collectionId) { if (CollectionUtils.isEmpty(elementIds) || null == collectionId) { @@ -723,7 +723,7 @@ public class CollectionElementServiceImpl extends ServiceImpl saveColorBoard(List colorBoards, Long collectionId, String timeZone) { //用户信息 diff --git a/src/main/java/com/ai/da/service/impl/CollectionServiceImpl.java b/src/main/java/com/ai/da/service/impl/CollectionServiceImpl.java index 6cd25d76..1aad260c 100644 --- a/src/main/java/com/ai/da/service/impl/CollectionServiceImpl.java +++ b/src/main/java/com/ai/da/service/impl/CollectionServiceImpl.java @@ -45,7 +45,7 @@ public class CollectionServiceImpl extends ServiceImpl impleme designPythonOutfitDetail.setMaskUrl(jsonObject.getString("mask_url")); designPythonOutfitDetail.setUserId(userInfo.getId()); designPythonOutfitDetail.setPriority(Integer.parseInt(jsonObject.getString("priority"))); + designPythonOutfitDetail.setCreateDate(LocalDateTime.now()); list.add(designPythonOutfitDetail); } designPythonOutfitDetailService.saveBatch(list); @@ -776,7 +777,7 @@ public class DesignServiceImpl extends ServiceImpl impleme } @Override - @Transactional + @Transactional(rollbackFor = Exception.class) public DesignLikeVO like(DesignLikeDTO designLikeDTO) { Long userGroupId = designLikeDTO.getUserGroupId();; Long groupDetailId; 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 48f3655a..38bc80fc 100644 --- a/src/main/java/com/ai/da/service/impl/GenerateServiceImpl.java +++ b/src/main/java/com/ai/da/service/impl/GenerateServiceImpl.java @@ -6,10 +6,7 @@ import com.ai.da.common.context.UserContext; import com.ai.da.common.enums.GenerateModeEnum; import com.ai.da.common.enums.ModelNameEnum; import com.ai.da.common.utils.*; -import com.ai.da.mapper.primary.CollectionElementMapper; -import com.ai.da.mapper.primary.GenerateCancelMapper; -import com.ai.da.mapper.primary.GenerateDetailMapper; -import com.ai.da.mapper.primary.GenerateMapper; +import com.ai.da.mapper.primary.*; import com.ai.da.mapper.primary.entity.*; import com.ai.da.model.dto.GenerateLikeDTO; import com.ai.da.model.dto.GenerateThroughImageTextDTO; @@ -85,6 +82,9 @@ public class GenerateServiceImpl extends ServiceImpl i @Value("${redis.key.generateResult}") private String generateResultKey; + @Value("${redis.key.toProductImageResultKey}") + private String toProductImageResultKey; + @Override public GenerateCaptionVO generateCaption(Long sketchElementId) { CollectionElement collectionElement = collectionElementMapper.selectById(sketchElementId); @@ -229,6 +229,30 @@ public class GenerateServiceImpl extends ServiceImpl i redisUtil.addToString(key, new Gson().toJson(generateResultVO), CommonConstant.GENERATE_RESULT_EXPIRE_TIME); } + @Resource + private ToProductImageResultMapper toProductImageResultMapper; + + @Override + @Transactional(rollbackFor = Exception.class) + public void processToProductImageResult(String taskId, String url, String category) { + QueryWrapper qw = new QueryWrapper<>(); + qw.lambda().eq(ToProductImageResult::getTaskId, taskId); + List toProductImageResults = toProductImageResultMapper.selectList(qw); + if (CollectionUtils.isEmpty(toProductImageResults)) { + return; +// throw new BusinessException(""); + } + ToProductImageResult toProductImageResult = toProductImageResults.get(0); + toProductImageResult.setUrl(url); + toProductImageResultMapper.updateById(toProductImageResult); + + String key = toProductImageResultKey + ":" + taskId; + String imageName = url.substring(url.lastIndexOf("/") + 1); + String status = imageName.equals("white_image.jpg") ? "Invalid" : "Success"; + GenerateResultVO generateResultVO = new GenerateResultVO(taskId, toProductImageResult.getId(), url, status, category); + redisUtil.addToString(key, new Gson().toJson(generateResultVO), CommonConstant.GENERATE_RESULT_EXPIRE_TIME); + } + private void validateGeneraType(Generate generate, String text, Long elementId, String generateType) { switch (generateType) { case "text": 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 6ce40146..f5a6da79 100644 --- a/src/main/java/com/ai/da/service/impl/PortfolioServiceImpl.java +++ b/src/main/java/com/ai/da/service/impl/PortfolioServiceImpl.java @@ -7,12 +7,14 @@ import com.ai.da.common.utils.CopyUtil; import com.ai.da.common.utils.MinioUtil; import com.ai.da.mapper.primary.*; import com.ai.da.mapper.primary.entity.*; +import com.ai.da.model.dto.DesignWorksRegisterDTO; import com.ai.da.model.dto.PortfolioDTO; import com.ai.da.model.dto.QueryPortfolioPageDTO; import com.ai.da.model.enums.Position; import com.ai.da.model.enums.Sex; import com.ai.da.model.vo.*; import com.ai.da.service.*; +import com.alibaba.fastjson.JSONObject; import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; import com.baomidou.mybatisplus.core.metadata.IPage; import com.baomidou.mybatisplus.extension.plugins.pagination.Page; @@ -21,6 +23,7 @@ import com.google.common.base.Function; import org.springframework.stereotype.Service; import org.springframework.util.CollectionUtils; import org.springframework.util.StringUtils; +import org.springframework.web.multipart.MultipartFile; import javax.annotation.Resource; import java.math.BigDecimal; @@ -85,120 +88,159 @@ public class PortfolioServiceImpl extends ServiceImpl collectionElementListOld = collectionElementService.getByCollectionId(collectionIdOld); - collectionOld.setId(null); - collectionMapper.insert(collectionOld); - Long collectionIdNew = collectionOld.getId(); - userLikeGroupNew.setCollectionId(collectionIdNew); - userLikeGroupMapper.insert(userLikeGroupNew); -// List collectionElementRelationListNew = new ArrayList<>(); - for (CollectionElement element : collectionElementListOld) { - element.setCollectionId(collectionIdNew); - element.setId(null); - collectionElementMapper.insert(element); - TCollectionElementRelation collectionElementRelationNew = new TCollectionElementRelation(); - collectionElementRelationNew.setCollectionId(collectionIdNew); - collectionElementRelationNew.setElementId(element.getId()); - collectionElementRelationNew.setCreateDate(new Date()); - collectionElementRelationMapper.insert(collectionElementRelationNew); - } - Portfolio portfolio = new Portfolio(); - Long coverIdOld = portfolioDTO.getCoverId(); - portfolio.setPortfolioName(portfolioDTO.getPortfolioName()); - portfolio.setPortfolioType("History"); - portfolio.setCollectionId(collectionIdNew); - portfolio.setAccountId(authPrincipalVo.getId()); - portfolio.setCreateDate(LocalDateTime.now()); - portfolio.setUpdateDate(LocalDateTime.now()); - portfolio.setStatus(1); - portfolio.setIsDeleted(0); - portfolio.setUserLikeGroupSourceId(portfolioDTO.getUserLikeGroupId()); - portfolioMapper.insert(portfolio); + public Boolean publish(MultipartFile file, String data) { + PortfolioDTO portfolioDTO = JSONObject.parseObject(data, PortfolioDTO.class); + AuthPrincipalVo authPrincipalVo = UserContext.getUserHolder(); + if (file != null && file.getOriginalFilename() != null) { + String upload = minioUtil.upload("aida-canvas", String.valueOf(authPrincipalVo.getId()), file); + Canvas canvas = new Canvas(); + canvas.setUrl(upload); + canvas.setCreateTime(LocalDateTime.now()); + canvas.setAccountId(authPrincipalVo.getId()); + canvasMapper.insert(canvas); - List userLikeList = userLikeService.getUserLikeList(portfolioDTO.getUserLikeGroupId()); -// List designPythonOutfitIdList = userLikeList.stream().map(UserLike::getDesignOutfitId).collect(Collectors.toList()); -// -// QueryWrapper qw = new QueryWrapper<>(); -// qw.lambda().in(TDesignPythonOutfit::getId, designPythonOutfitIdList); -// List designPythonOutfits = designPythonOutfitMapper.selectList(qw); - Long coverIdNew = null; - Boolean flag = false; - for (UserLike userLike : userLikeList) { - Long designOutfitIdOld = userLike.getDesignOutfitId(); - TDesignPythonOutfit designPythonOutfit = designPythonOutfitMapper.selectById(designOutfitIdOld); - designPythonOutfit.setDesignId(-1L); - designPythonOutfit.setDesignItemId(-1L); - designPythonOutfit.setCollectionId(collectionIdNew); - if (designPythonOutfit.getId().equals(coverIdOld)) { - flag = true; + if (portfolioDTO.getOpenSource() == 1) { + UserLikeGroup userLikeGroup = userLikeGroupMapper.selectById(portfolioDTO.getUserLikeGroupId()); + UserLikeGroup userLikeGroupNew = userLikeGroup.setId(null); + userLikeGroupNew.setAccountId(-1L); + Long collectionIdOld = userLikeGroup.getCollectionId(); + Collection collectionOld = collectionMapper.selectById(collectionIdOld); + List collectionElementListOld = collectionElementService.getByCollectionId(collectionIdOld); + collectionOld.setId(null); + collectionMapper.insert(collectionOld); + Long collectionIdNew = collectionOld.getId(); + userLikeGroupNew.setCollectionId(collectionIdNew); + userLikeGroupMapper.insert(userLikeGroupNew); + for (CollectionElement element : collectionElementListOld) { + element.setCollectionId(collectionIdNew); + element.setId(null); + collectionElementMapper.insert(element); + TCollectionElementRelation collectionElementRelationNew = new TCollectionElementRelation(); + collectionElementRelationNew.setCollectionId(collectionIdNew); + collectionElementRelationNew.setElementId(element.getId()); + collectionElementRelationNew.setCreateDate(new Date()); + collectionElementRelationMapper.insert(collectionElementRelationNew); } - 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(-1L); - tDesignPythonOutfitDetail.setDesignPythonOutfitId(designOutfitIdNew); - designPythonOutfitDetailMapper.insert(tDesignPythonOutfitDetail); + Portfolio portfolio = new Portfolio(); + QueryWrapper portfolioQueryWrapper = new QueryWrapper<>(); + portfolioQueryWrapper.lambda().eq(Portfolio::getUserLikeGroupSourceId, portfolioDTO.getUserLikeGroupId()); + List portfolios = portfolioMapper.selectList(portfolioQueryWrapper); + if (!CollectionUtils.isEmpty(portfolios)) { + portfolio = portfolios.get(0); } - - if (flag) { - coverIdNew = designOutfitIdNew; - portfolio.setCoverId(coverIdNew); + portfolio.setPortfolioName(portfolioDTO.getPortfolioName()); + portfolio.setPortfolioType("History"); + portfolio.setCollectionId(collectionIdNew); + portfolio.setAccountId(authPrincipalVo.getId()); + portfolio.setCreateDate(LocalDateTime.now()); + portfolio.setUpdateDate(LocalDateTime.now()); + portfolio.setStatus(1); + portfolio.setOpenSource(1); + portfolio.setIsDeleted(0); + portfolio.setUserLikeGroupSourceId(portfolioDTO.getUserLikeGroupId()); + portfolio.setCanvasId(canvas.getId()); + if (!CollectionUtils.isEmpty(portfolios)) { portfolioMapper.updateById(portfolio); - flag = false; + }else { + portfolioMapper.insert(portfolio); } - 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.getDesignId(); + List userLikeList = userLikeService.getUserLikeList(portfolioDTO.getUserLikeGroupId()); +// Long coverIdNew = null; +// Boolean flag = false; + for (UserLike userLike : userLikeList) { + Long designOutfitIdOld = userLike.getDesignOutfitId(); + TDesignPythonOutfit designPythonOutfit = designPythonOutfitMapper.selectById(designOutfitIdOld); + designPythonOutfit.setDesignId(-1L); + designPythonOutfit.setDesignItemId(-1L); + designPythonOutfit.setCollectionId(collectionIdNew); +// if (designPythonOutfit.getId().equals(coverIdOld)) { +// flag = true; +// } + 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(-1L); + tDesignPythonOutfitDetail.setDesignPythonOutfitId(designOutfitIdNew); + designPythonOutfitDetailMapper.insert(tDesignPythonOutfitDetail); + } - designPythonOutfit.setDesignItemId(designItemIdNew); - designPythonOutfitMapper.updateById(designPythonOutfit); +// if (flag) { +// coverIdNew = designOutfitIdNew; +// portfolio.setCoverId(coverIdNew); +// portfolioMapper.updateById(portfolio); +// flag = false; +// } - 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, designItemOld); - List designItemDetailListOld = designItemDetailMapper.selectList(designItemDetailQueryWrapper); - for (DesignItemDetail designItemDetailOld : designItemDetailListOld) { - Long designItemDetailIdOld = designItemDetailOld.getId(); - 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); - DesignItemDetailPrint designItemDetailPrint = designItemDetailPrintMapper.selectOne(designItemDetailPrintQueryWrapper); - designItemDetailPrint.setDesignItemDetailId(designItemDetailIdNew); - designItemDetailPrintMapper.insert(designItemDetailPrint); + 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.getDesignId(); + + designPythonOutfit.setDesignItemId(designItemIdNew); + designPythonOutfitMapper.updateById(designPythonOutfit); + + 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, designItemOld); + List designItemDetailListOld = designItemDetailMapper.selectList(designItemDetailQueryWrapper); + for (DesignItemDetail designItemDetailOld : designItemDetailListOld) { + Long designItemDetailIdOld = designItemDetailOld.getId(); + 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); + DesignItemDetailPrint designItemDetailPrint = designItemDetailPrintMapper.selectOne(designItemDetailPrintQueryWrapper); + designItemDetailPrint.setDesignItemDetailId(designItemDetailIdNew); + designItemDetailPrintMapper.insert(designItemDetailPrint); + } + } + } else { + QueryWrapper portfolioQueryWrapper = new QueryWrapper<>(); + portfolioQueryWrapper.lambda().eq(Portfolio::getUserLikeGroupSourceId, portfolioDTO.getUserLikeGroupId()); + List portfolios = portfolioMapper.selectList(portfolioQueryWrapper); + Portfolio portfolio = new Portfolio(); + if (!CollectionUtils.isEmpty(portfolios)) { + portfolio = portfolios.get(0); + } + portfolio.setPortfolioName(portfolioDTO.getPortfolioName()); + portfolio.setPortfolioType("Canvas"); + portfolio.setAccountId(authPrincipalVo.getId()); + portfolio.setCreateDate(LocalDateTime.now()); + portfolio.setUpdateDate(LocalDateTime.now()); + portfolio.setStatus(1); + portfolio.setIsDeleted(0); + portfolio.setOpenSource(0); + portfolio.setUserLikeGroupSourceId(portfolioDTO.getUserLikeGroupId()); + portfolio.setCanvasId(canvas.getId()); + if (!CollectionUtils.isEmpty(portfolios)) { + portfolioMapper.updateById(portfolio); + }else { + portfolioMapper.insert(portfolio); } } - }else { - } @@ -329,8 +371,8 @@ public class PortfolioServiceImpl extends ServiceImpl convert = page.convert((Function) portfolio -> { if (portfolio != null) { PortfolioVO vo = CopyUtil.copyObject(portfolio, PortfolioVO.class); - TDesignPythonOutfit designPythonOutfit = designPythonOutfitMapper.selectById(vo.getCoverId()); - vo.setDesignPythonOutfitUrl(minioUtil.getPresignedUrl(designPythonOutfit.getDesignUrl(), 24 * 60)); + Canvas canvas = canvasMapper.selectById(vo.getCanvasId()); + vo.setCanvasUrl(minioUtil.getPresignedUrl(canvas.getUrl(), 24 * 60)); return vo; } return null; @@ -342,22 +384,26 @@ public class PortfolioServiceImpl extends ServiceImpl collectionElementList = collectionElementService.getByCollectionId(collectionId); - for (CollectionElement element : collectionElementList) { - if (StringUtils.isEmpty(element.getUrl())) { - continue; + if (vo.getOpenSource() == 1) { + Long collectionId = portfolio.getCollectionId(); + List collectionElementList = collectionElementService.getByCollectionId(collectionId); + 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); + 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); } - 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)); return vo; } @@ -471,4 +517,9 @@ public class PortfolioServiceImpl extends ServiceImpl impl @Resource private FileProperties fileProperties; - @Transactional + @Transactional(rollbackFor = Exception.class) @Override public void initDefaultSysFile() { //删除已有的sysFile数据 diff --git a/src/main/java/com/ai/da/service/impl/UserLikeGroupServiceImpl.java b/src/main/java/com/ai/da/service/impl/UserLikeGroupServiceImpl.java index 4f5ff929..a4d57bdd 100644 --- a/src/main/java/com/ai/da/service/impl/UserLikeGroupServiceImpl.java +++ b/src/main/java/com/ai/da/service/impl/UserLikeGroupServiceImpl.java @@ -2,29 +2,43 @@ 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; +import com.ai.da.common.utils.CopyUtil; import com.ai.da.common.utils.DateUtil; import com.ai.da.common.utils.MinioUtil; +import com.ai.da.common.utils.RedisUtil; import com.ai.da.mapper.primary.*; -import com.ai.da.mapper.primary.entity.TDesignPythonOutfit; -import com.ai.da.mapper.primary.entity.UserLike; -import com.ai.da.mapper.primary.entity.UserLikeGroup; +import com.ai.da.mapper.primary.entity.*; +import com.ai.da.model.dto.ExportSaveDTO; +import com.ai.da.model.dto.ProductImageLikeDTO; +import com.ai.da.model.dto.ToProductImageDTO; import com.ai.da.model.vo.*; +import com.ai.da.python.PythonService; import com.ai.da.service.AccountService; import com.ai.da.service.CollectionService; import com.ai.da.service.UserLikeGroupService; import com.ai.da.service.UserLikeService; +import com.alibaba.fastjson.JSONArray; +import com.alibaba.fastjson.JSONObject; import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; import com.baomidou.mybatisplus.core.conditions.update.UpdateWrapper; import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; +import com.google.gson.Gson; +import io.netty.util.internal.StringUtil; import lombok.extern.slf4j.Slf4j; +import org.springframework.beans.factory.annotation.Value; import org.springframework.stereotype.Service; import org.springframework.transaction.annotation.Transactional; +import org.springframework.util.StringUtils; +import org.springframework.web.multipart.MultipartFile; import javax.annotation.Resource; -import java.util.Date; -import java.util.List; -import java.util.Objects; -import java.util.TimeZone; +import java.io.BufferedReader; +import java.io.InputStream; +import java.io.InputStreamReader; +import java.time.LocalDateTime; +import java.util.*; import java.util.stream.Collectors; /** @@ -167,4 +181,216 @@ public class UserLikeGroupServiceImpl extends ServiceImpl qw = new QueryWrapper<>(); + qw.lambda().eq(ExportFile::getUserLikeGroupId, userLikeGroupId); + List exportFiles = exportFileMapper.selectList(qw); + if (CollectionUtil.isNotEmpty(exportFiles)) { + ExportFile exportFile = exportFiles.get(0); + exportFile.setUserLikeGroupId(userLikeGroupId); + exportFile.setUrl(upload); + exportFileMapper.updateById(exportFile); + }else { + ExportFile exportFile = new ExportFile(); + exportFile.setUserLikeGroupId(userLikeGroupId); + exportFile.setUrl(upload); + exportFileMapper.insert(exportFile); + } + return Boolean.TRUE; + } + + @Resource + private ToProductImageRecordMapper toProductImageRecordMapper; + @Resource + private ToProductImageResultMapper toProductImageResultMapper; + + @Resource + private PythonService pythonService; + @Override + @Transactional(rollbackFor = Exception.class) + public List toProduct(ToProductImageDTO toProductImageDTO) { + AuthPrincipalVo userHolder = UserContext.getUserHolder(); + Long userLikeGroupId = toProductImageDTO.getUserLikeGroupId(); + ToProductImageRecord toProductImageRecord = new ToProductImageRecord(); + 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; + for (ToProductImageVO toProductImageVO : toProductImageDTO.getToProductImageVOList()) { + if (toProductImageVO.getElementType().equals("DesignOutfit")) { + String taskId = UUID.randomUUID() + "-" + i + "-" + userHolder.getId(); + i ++; + TDesignPythonOutfit tDesignPythonOutfit = designPythonOutfitMapper.selectById(toProductImageVO.getElementId()); + // 走模型 + pythonService.toProductImage(tDesignPythonOutfit.getDesignUrl(), taskId, toProductImageDTO.getPrompt()); + 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.setUserLikeGroupId(userLikeGroupId); + toProductImageResultMapper.insert(toProductImageResult); +// toProductImageResult.setUrl(minioUtil.getPresignedUrl(toProductImageResult.getUrl(), 24 * 60)); + result.add(toProductImageResult); + }else { + String taskId = UUID.randomUUID() + "-" + i + "-" + userHolder.getId(); + ToProductElement toProductElement = toProductElementMapper.selectById(toProductImageVO.getElementId()); + // 走模型 + pythonService.toProductImage(toProductElement.getUrl(), taskId, toProductImageDTO.getPrompt()); + 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); + toProductImageResultMapper.insert(toProductImageResult); +// toProductImageResult.setUrl(minioUtil.getPresignedUrl(toProductImageResult.getUrl(), 24 * 60)); + result.add(toProductImageResult); + } + } + + return result; + } + + @Resource + private ToProductElementMapper toProductElementMapper; + + @Override + @Transactional(rollbackFor = Exception.class) + public ToProductElementVO toProductImageElementUpload(MultipartFile file, Long userLikeGroupId) { + if (null == file || StringUtils.isEmpty(file.getOriginalFilename())) { + throw new BusinessException("file.cannot.be.empty"); + } + if (userLikeGroupId == null) { + throw new BusinessException("userLikeGroupId.cannot.be.empty"); + } + AuthPrincipalVo userHolder = UserContext.getUserHolder(); + String bucketName = "aida-users"; + String minioUrl = minioUtil.upload(bucketName, userHolder.getId() + "/toProductImageElement", file); + ToProductElement toProductElement = new ToProductElement(); + toProductElement.setUrl(minioUrl); + toProductElement.setUserLikeGroupId(userLikeGroupId); + toProductElement.setCreateTime(LocalDateTime.now()); + toProductElementMapper.insert(toProductElement); + ToProductElementVO toProductElementVO = CopyUtil.copyObject(toProductElement, ToProductElementVO.class); + toProductElementVO.setUrl(minioUtil.getPresignedUrl(toProductElementVO.getUrl(), 24 * 60)); + return toProductElementVO; + } + + @Override + public Boolean productImageLike(ProductImageLikeDTO productImageLikeDTO) { + List toProductImageResultId = productImageLikeDTO.getToProductImageResultId(); + QueryWrapper qw = new QueryWrapper<>(); + qw.lambda().in(ToProductImageResult::getId, toProductImageResultId); + ToProductImageResult toProductImageResult = new ToProductImageResult(); + toProductImageResult.setIsLike(1); + toProductImageResultMapper.update(toProductImageResult, qw); + return Boolean.TRUE; + } + @Resource + private RedisUtil redisUtil; + @Value("${redis.key.toProductImageResultKey}") + private String toProductImageResultKey; + @Override + public List getToProductImageResultList(List taskIdList) { + List results = new ArrayList<>(); + Set collect = new HashSet<>(); + taskIdList.forEach(taskId -> { + String key = toProductImageResultKey + ":" + taskId; + GenerateResultVO generateResultVO = new Gson().fromJson(redisUtil.getFromString(key), GenerateResultVO.class); + if (!Objects.isNull(generateResultVO) && !StringUtil.isNullOrEmpty(generateResultVO.getUrl())) { + String url = generateResultVO.getUrl(); + if (url.substring(url.lastIndexOf("/") + 1).equals("white_image.jpg")) { + generateResultVO.setStatus("Invalid"); + } else { + generateResultVO.setUrl(minioUtil.getPresignedUrl(url, CommonConstant.MINIO_IMAGE_EXPIRE_TIME)); + } + } else if (Objects.isNull(generateResultVO)) { + generateResultVO = new GenerateResultVO(); + } + if (!StringUtil.isNullOrEmpty(generateResultVO.getStatus())) collect.add(generateResultVO.getStatus()); + results.add(generateResultVO); + }); + return results; + } + + @Override + public JSONObject exportSearch(Long userLikeGroupId) { + QueryWrapper qw = new QueryWrapper<>(); + qw.lambda().eq(ExportFile::getUserLikeGroupId, userLikeGroupId); + List exportFiles = exportFileMapper.selectList(qw); + if (CollectionUtil.isNotEmpty(exportFiles)) { + try { + InputStream download = minioUtil.download(exportFiles.get(0).getUrl()); + String convert = convert(download); + JSONObject jsonObject = JSONObject.parseObject(convert); + JSONArray objects = jsonObject.getJSONArray("objects"); + for (int i = 0; i < objects.size(); i++) { + JSONObject jsonObject1 = objects.getJSONObject(i); + String type = jsonObject1.getString("type"); + if (type.equals("image")) { + String minioUrl = jsonObject1.getString("minioUrl"); + jsonObject1.put("src", minioUtil.getPresignedUrl(minioUrl, 24 * 60)); + } + objects.set(i, jsonObject1); + } + jsonObject.put("objects", objects); + System.out.println(jsonObject); + return jsonObject; + }catch (Exception e){ + return null; + } + }else { + return null; + } + } + + @Override + public CanvasElementUpload canvasElementUpload(MultipartFile file) { + AuthPrincipalVo userHolder = UserContext.getUserHolder(); + CanvasElementUpload canvasElementUpload = new CanvasElementUpload(); + String url = minioUtil.upload("aida-users", userHolder.getId() + "/canvasElementUpload", file); + canvasElementUpload.setUrl(url); + canvasElementUpload.setMinioUrl(minioUtil.getPresignedUrl(url, 24 * 60)); + return canvasElementUpload; + } + + @Override + public List productImageLikeList(ToProductImageDTO toProductImageDTO) { + QueryWrapper qw = new QueryWrapper<>(); + qw.lambda().eq(ToProductImageResult::getIsLike, 1); + qw.lambda().eq(ToProductImageResult::getUserLikeGroupId, toProductImageDTO.getUserLikeGroupId()); + List toProductImageResults = toProductImageResultMapper.selectList(qw); + for (ToProductImageResult toProductImageResult : toProductImageResults) { + toProductImageResult.setUrl(minioUtil.getPresignedUrl(toProductImageResult.getUrl(), 24 * 60)); + } + return toProductImageResults; + } + + public static String convert(InputStream inputStream) { + try (BufferedReader reader = new BufferedReader(new InputStreamReader(inputStream))) { + return reader.lines().collect(Collectors.joining("\n")); + } catch (Exception e) { + e.printStackTrace(); + return null; + } + } } diff --git a/src/main/resources/application-dev.properties b/src/main/resources/application-dev.properties index e0b09cfb..b5ba8dc0 100644 --- a/src/main/resources/application-dev.properties +++ b/src/main/resources/application-dev.properties @@ -65,8 +65,8 @@ spring.rabbitmq.username=rabbit spring.rabbitmq.password=123456 spring.rabbitmq.virtual-host=/ -spring.redis.host=172.31.11.32 -#spring.redis.host=18.167.251.121 +#spring.redis.host=172.31.11.32 +spring.redis.host=18.167.251.121 spring.redis.port=6379 spring.redis.database=1 spring.redis.password=Aidlab @@ -84,4 +84,5 @@ redis.key.SRCancelSet=SRCancelSet redis.key.SRExceptionMap=SRExceptionMap redis.key.taskList=TaskList redis.key.credits.pre-deduction=Credits:PreDeduction -redis.key.generateResult=Generate:Result \ No newline at end of file +redis.key.generateResult=Generate:Result +redis.key.toProductImageResultKey=ToProductImage:Result \ No newline at end of file diff --git a/src/main/resources/application-prod.properties b/src/main/resources/application-prod.properties index 20d02502..767baa78 100644 --- a/src/main/resources/application-prod.properties +++ b/src/main/resources/application-prod.properties @@ -58,6 +58,7 @@ minio.bucketName.results=aida-results minio.bucketName.sysImage=aida-sys-image minio.bucketName.users=aida-users minio.bucketName.collectionElement=aida-collection-element +minio.bucketName.gradient=aida-gradient redirect_url=http://18.167.251.121:7788 spring.rabbitmq.host=18.167.251.121 diff --git a/src/main/resources/messages_en.properties b/src/main/resources/messages_en.properties index 39096842..1e4db453 100644 --- a/src/main/resources/messages_en.properties +++ b/src/main/resources/messages_en.properties @@ -182,4 +182,18 @@ DRESS=Dress TROUSERS=Trousers SKIRT=Skirt FEMALE=Women's wear -MALE=Men's wear \ No newline at end of file +MALE=Men's wear + +SLOGAN=Slogan +LOGO=Logo +PATTERN=Pattern + +EMBROIDERY=Embroidery +BEADING=Beading +PEARL=Pearl +RIVET=Rivet +BUTTON=Button +BELT=Belt +CORSAGE=Corsage +ZIPPER=Zipper +POCKET=Pocket \ No newline at end of file diff --git a/src/main/resources/messages_zh.properties b/src/main/resources/messages_zh.properties index 8fecb5f9..f6e40e34 100644 --- a/src/main/resources/messages_zh.properties +++ b/src/main/resources/messages_zh.properties @@ -178,4 +178,18 @@ DRESS=长裙 TROUSERS=裤子 SKIRT=短裙 FEMALE=女装 -MALE=男装 \ No newline at end of file +MALE=男装 + +SLOGAN=标语 +LOGO=标志 +PATTERN=图案 + +EMBROIDERY=刺绣 +BEADING=钉珠 +PEARL=珍珠 +RIVET=铆钉 +BUTTON=纽扣 +BELT=腰带 +CORSAGE=胸花 +ZIPPER=拉链 +POCKET=口袋 \ No newline at end of file