diff --git a/src/main/java/com/ai/da/AiDaApplication.java b/src/main/java/com/ai/da/AiDaApplication.java index 2454e1d8..87b3c27b 100644 --- a/src/main/java/com/ai/da/AiDaApplication.java +++ b/src/main/java/com/ai/da/AiDaApplication.java @@ -3,11 +3,13 @@ package com.ai.da; import lombok.extern.slf4j.Slf4j; import org.springframework.boot.SpringApplication; import org.springframework.boot.autoconfigure.SpringBootApplication; +import org.springframework.scheduling.annotation.EnableAsync; import org.springframework.scheduling.annotation.EnableScheduling; @Slf4j @SpringBootApplication @EnableScheduling +@EnableAsync public class AiDaApplication { public static void main(String[] args) { diff --git a/src/main/java/com/ai/da/common/utils/MinioUtil.java b/src/main/java/com/ai/da/common/utils/MinioUtil.java index 6e9dd42e..d67c9ab8 100644 --- a/src/main/java/com/ai/da/common/utils/MinioUtil.java +++ b/src/main/java/com/ai/da/common/utils/MinioUtil.java @@ -374,14 +374,31 @@ public class MinioUtil { */ public String getPreSignedUrl(String bucketName, String fileName, int expiry) { try { - return minioClient.getPresignedObjectUrl( - GetPresignedObjectUrlArgs.builder() - .bucket(bucketName) - .object(fileName) - .expiry(expiry, TimeUnit.MINUTES) - .method(Method.GET) - .build() - ); + + String lowerName = fileName.toLowerCase(); + boolean isImage = lowerName.endsWith(".jpg") || lowerName.endsWith(".jpeg") || lowerName.endsWith(".png"); + + GetPresignedObjectUrlArgs.Builder builder = GetPresignedObjectUrlArgs.builder() + .bucket(bucketName) + .object(fileName) + .expiry(expiry, TimeUnit.MINUTES) + .method(Method.GET); + + if (isImage) { + // 根据后缀名设置正确的 content-type + String contentType = "image/jpeg"; + if (lowerName.endsWith(".png")) { + contentType = "image/png"; + } + + Map queryParams = new HashMap<>(); + queryParams.put("response-content-type", contentType); + queryParams.put("response-content-disposition", "inline"); + + builder.extraQueryParams(queryParams); + } + + return minioClient.getPresignedObjectUrl(builder.build()); } catch (MinioException | InvalidKeyException | IOException | NoSuchAlgorithmException e) { e.printStackTrace(); throw new BusinessException(e.getMessage()); diff --git a/src/main/java/com/ai/da/common/utils/RedisUtil.java b/src/main/java/com/ai/da/common/utils/RedisUtil.java index fd6fb3e6..40f8ac09 100644 --- a/src/main/java/com/ai/da/common/utils/RedisUtil.java +++ b/src/main/java/com/ai/da/common/utils/RedisUtil.java @@ -1,10 +1,13 @@ package com.ai.da.common.utils; +import com.ai.da.model.dto.ProgressDTO; import com.ai.da.python.vo.DesignPythonObject; +import com.alibaba.fastjson.JSON; import com.fasterxml.jackson.core.JsonProcessingException; import com.fasterxml.jackson.core.type.TypeReference; import com.fasterxml.jackson.databind.ObjectMapper; import lombok.extern.slf4j.Slf4j; +import org.apache.commons.lang3.StringUtils; import org.springframework.data.redis.core.HashOperations; import org.springframework.data.redis.core.RedisTemplate; import org.springframework.data.redis.core.ZSetOperations; @@ -14,6 +17,7 @@ import org.springframework.util.CollectionUtils; import javax.annotation.Resource; import java.math.BigDecimal; import java.math.RoundingMode; +import java.time.Duration; import java.util.*; import java.util.concurrent.TimeUnit; import java.util.stream.Collectors; @@ -500,4 +504,24 @@ public class RedisUtil { redisTemplate.delete(keys); } } + + public void setTaskProgressDTO(String taskId, ProgressDTO dto) { + String key = "task:progress:" + taskId; + redisTemplate.opsForValue().set(key, JSON.toJSONString(dto), Duration.ofDays(1)); + } + + public ProgressDTO getTaskProgressDTO(String taskId) { + String key = "task:progress:" + taskId; + String json = redisTemplate.opsForValue().get(key); + if (StringUtils.isBlank(json)) { +// return new ProgressDTO(0, 0, false); + return null; + } + try { + return JSON.parseObject(json, ProgressDTO.class); + } catch (Exception e) { + log.warn("任务进度解析失败 key={}, json={}", key, json); + return new ProgressDTO(0, 0, false); + } + } } diff --git a/src/main/java/com/ai/da/controller/PortfolioController.java b/src/main/java/com/ai/da/controller/PortfolioController.java index 010c3701..99accd06 100644 --- a/src/main/java/com/ai/da/controller/PortfolioController.java +++ b/src/main/java/com/ai/da/controller/PortfolioController.java @@ -31,7 +31,7 @@ public class PortfolioController { @ApiOperation(value = "发布作品集") @PostMapping("/publish") - public Response preLogin(@RequestParam("file") MultipartFile canvas, @RequestParam("data") String data) { + public Response publish(@RequestParam("file") MultipartFile canvas, @RequestParam("data") String data) { return Response.success(portfolioService.publish(canvas, data)); } @@ -57,7 +57,7 @@ public class PortfolioController { @ApiOperation(value = "选择作品") @PostMapping("/choose") - public Response choose(@Valid @RequestBody PortfolioDTO portfolioDTO) { + public Response choose(@Valid @RequestBody PortfolioDTO portfolioDTO) { return Response.success(portfolioService.choose(portfolioDTO)); } diff --git a/src/main/java/com/ai/da/controller/ProjectController.java b/src/main/java/com/ai/da/controller/ProjectController.java index 23924622..c1cc22f4 100644 --- a/src/main/java/com/ai/da/controller/ProjectController.java +++ b/src/main/java/com/ai/da/controller/ProjectController.java @@ -121,8 +121,8 @@ public class ProjectController { @GetMapping("/downloadZip") @ApiOperationSupport(order = 11) @ApiOperation(value = "下载", notes = "传入project") - public void downloadZip(@RequestParam(value = "threeDSimpleId") Long threeDSimpleId, @RequestParam(value = "sizeType") String sizeType, @RequestParam(value = "size") String size, HttpServletResponse response) throws MinioException, IOException { - userLikeGroupService.downloadZip(threeDSimpleId, sizeType, size, response); + public Response downloadZip(@RequestParam(value = "threeDSimpleId") Long threeDSimpleId, @RequestParam(value = "sizeType") String sizeType, @RequestParam(value = "size") String size, HttpServletResponse response) throws MinioException, IOException { + return Response.success(userLikeGroupService.downloadZip(threeDSimpleId, sizeType, size, response)); } @PostMapping("/delete") diff --git a/src/main/java/com/ai/da/controller/SavedCollectionController.java b/src/main/java/com/ai/da/controller/SavedCollectionController.java index d507f849..dacc4741 100644 --- a/src/main/java/com/ai/da/controller/SavedCollectionController.java +++ b/src/main/java/com/ai/da/controller/SavedCollectionController.java @@ -259,12 +259,24 @@ public class SavedCollectionController { return Response.success(userLikeGroupService.productImageInitialize(productImageInitializeDTO)); } + @ApiOperation(value = "getInitializeProgress") + @PostMapping("/getInitializeProgress") + public Response getInitializeProgress(@Valid @RequestBody ProductImageInitializeDTO productImageInitializeDTO) { + return Response.success(userLikeGroupService.getInitializeProgress(productImageInitializeDTO)); + } + @ApiOperation(value = "brandDNASaveOrUpdate") @PostMapping("/brandDNASaveOrUpdate") public Response brandDNASaveOrUpdate(@Valid @RequestBody BrandDNADTO brandDNADTO) { return Response.success(userLikeGroupService.brandDNASaveOrUpdate(brandDNADTO)); } + @ApiOperation(value = "brandDNADelete") + @PostMapping("/brandDNADelete") + public Response brandDNADelete(@Valid @RequestBody BrandDNADTO brandDNADTO) { + return Response.success(userLikeGroupService.brandDNADelete(brandDNADTO)); + } + @ApiOperation(value = "brandDNAPage") @PostMapping("/brandDNAPage") public Response> brandDNAPage(@Valid @RequestBody BrandDNAQueryDTO brandDNAQueryDTO) { diff --git a/src/main/java/com/ai/da/mapper/primary/entity/ProductImageAttribute.java b/src/main/java/com/ai/da/mapper/primary/entity/ProductImageAttribute.java index 7ea73085..ce7edaaa 100644 --- a/src/main/java/com/ai/da/mapper/primary/entity/ProductImageAttribute.java +++ b/src/main/java/com/ai/da/mapper/primary/entity/ProductImageAttribute.java @@ -18,7 +18,7 @@ public class ProductImageAttribute implements Serializable { @TableId(value = "id", type = IdType.AUTO) private Long id; - private String imgName; +// private String imgName; private String length; private String sleeveLength; private String sleeveShape; diff --git a/src/main/java/com/ai/da/model/dto/ProductImageInitializeDTO.java b/src/main/java/com/ai/da/model/dto/ProductImageInitializeDTO.java index 880d579d..34efcdd4 100644 --- a/src/main/java/com/ai/da/model/dto/ProductImageInitializeDTO.java +++ b/src/main/java/com/ai/da/model/dto/ProductImageInitializeDTO.java @@ -9,4 +9,6 @@ public class ProductImageInitializeDTO { private List libraryIds; private Long brandId; + + private Boolean update; } diff --git a/src/main/java/com/ai/da/model/dto/ProgressDTO.java b/src/main/java/com/ai/da/model/dto/ProgressDTO.java new file mode 100644 index 00000000..c61731f9 --- /dev/null +++ b/src/main/java/com/ai/da/model/dto/ProgressDTO.java @@ -0,0 +1,15 @@ +package com.ai.da.model.dto; + +import lombok.AllArgsConstructor; +import lombok.Data; +import lombok.NoArgsConstructor; + +@Data +@AllArgsConstructor +@NoArgsConstructor +public class ProgressDTO { + private int total; + private int current; + private boolean error; +} + diff --git a/src/main/java/com/ai/da/model/vo/InitializeProgressVO.java b/src/main/java/com/ai/da/model/vo/InitializeProgressVO.java new file mode 100644 index 00000000..47a7c876 --- /dev/null +++ b/src/main/java/com/ai/da/model/vo/InitializeProgressVO.java @@ -0,0 +1,10 @@ +package com.ai.da.model.vo; + +import lombok.Data; + +@Data +public class InitializeProgressVO { + private Boolean analyzed; + + private double percent; +} diff --git a/src/main/java/com/ai/da/service/PortfolioService.java b/src/main/java/com/ai/da/service/PortfolioService.java index dd55077a..aef657cf 100644 --- a/src/main/java/com/ai/da/service/PortfolioService.java +++ b/src/main/java/com/ai/da/service/PortfolioService.java @@ -19,7 +19,7 @@ public interface PortfolioService extends IService { PortfolioVO detail(PortfolioDTO portfolioDTO); - UserLikeChooseVO choose(PortfolioDTO portfolioDTO); + ProjectChooseVO choose(PortfolioDTO portfolioDTO); Boolean designWorksRegister(DesignWorksRegisterDTO designWorksRegisterDTO); diff --git a/src/main/java/com/ai/da/service/ProductImageService.java b/src/main/java/com/ai/da/service/ProductImageService.java new file mode 100644 index 00000000..8727aa15 --- /dev/null +++ b/src/main/java/com/ai/da/service/ProductImageService.java @@ -0,0 +1,8 @@ +package com.ai.da.service; + +import com.ai.da.model.dto.ProgressDTO; + +public interface ProductImageService { + void asyncInitialize(Long brandId); +// double getInitializeProgress(Long brandId); +} diff --git a/src/main/java/com/ai/da/service/UserLikeGroupService.java b/src/main/java/com/ai/da/service/UserLikeGroupService.java index 9048d7ca..ec2529c5 100644 --- a/src/main/java/com/ai/da/service/UserLikeGroupService.java +++ b/src/main/java/com/ai/da/service/UserLikeGroupService.java @@ -76,6 +76,8 @@ public interface UserLikeGroupService extends IService { Boolean productImageInitialize(ProductImageInitializeDTO productImageInitializeDTO); + InitializeProgressVO getInitializeProgress(ProductImageInitializeDTO productImageInitializeDTO); + IPage getPage(ProjectQueryDTO projectQueryDTO); ModuleChooseVO getModuleContent(ProjectDTO projectDTO); @@ -102,7 +104,9 @@ public interface UserLikeGroupService extends IService { void getThreeDGlb(Long threeDSimpleId, HttpServletResponse response) throws MinioException, IOException; - void downloadZip(Long threeDSimpleId, String sizeType, String size, HttpServletResponse response) throws MinioException, IOException; + String downloadZip(Long threeDSimpleId, String sizeType, String size, HttpServletResponse response) throws MinioException, IOException; Boolean delete(Long projectId); + + Boolean brandDNADelete(BrandDNADTO brandDNADTO); } 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 dcf4287e..c219c74e 100644 --- a/src/main/java/com/ai/da/service/impl/PortfolioServiceImpl.java +++ b/src/main/java/com/ai/da/service/impl/PortfolioServiceImpl.java @@ -125,6 +125,9 @@ public class PortfolioServiceImpl extends ServiceImpl designQueryWrapper = new QueryWrapper<>(); designQueryWrapper.lambda().eq(Design::getCollectionId, collectionIdOld); @@ -173,6 +193,7 @@ public class PortfolioServiceImpl extends ServiceImpl userLikeGroupQueryWrapper = new QueryWrapper<>(); userLikeGroupQueryWrapper.lambda().eq(UserLikeGroup::getCollectionId, portfolio.getCollectionId()); UserLikeGroup userLikeGroup = userLikeGroupMapper.selectOne(userLikeGroupQueryWrapper); - Long portfolioUserLikeGroupId = userLikeGroup.getId(); if (Objects.isNull(userLikeGroup)) { throw new BusinessException(""); } + Long portfolioUserLikeGroupId = userLikeGroup.getId(); + + Project project = projectMapper.selectById(userLikeGroup.getProjectId()); + Long projectIdOld = project.getId(); + project.setCreateTime(LocalDateTime.now()); + project.setId(null); + project.setAccountId(authPrincipalVo.getId()); + project.setName(project.getName() + "_copy"); + projectMapper.insert(project); + UserLikeGroup userLikeGroupNew = CopyUtil.copyObject(userLikeGroup, UserLikeGroup.class); userLikeGroupNew.setId(null); userLikeGroupNew.setCreateDate(new Date()); + userLikeGroupNew.setProjectId(project.getId()); if (portfolio.getOriginal() == 1) { if (Objects.equals(portfolio.getAccountId(), authPrincipalVo.getId())) { userLikeGroupNew.setOriginal(1); @@ -692,6 +723,7 @@ public class PortfolioServiceImpl extends ServiceImpl collectionElementRelationListNew = new ArrayList<>(); for (CollectionElement element : collectionElementListOld) { + element.setProjectId(project.getId()); element.setCollectionId(collectionIdNew); element.setId(null); collectionElementMapper.insert(element); @@ -766,126 +798,136 @@ public class PortfolioServiceImpl extends ServiceImpl 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