diff --git a/pom.xml b/pom.xml index 2847442d..82d7353b 100644 --- a/pom.xml +++ b/pom.xml @@ -138,6 +138,13 @@ tencentcloud-sdk-java-ses 3.1.572 + + + + io.minio + minio + 8.0.3 + diff --git a/src/main/java/com/ai/da/common/config/MinIoClientConfig.java b/src/main/java/com/ai/da/common/config/MinIoClientConfig.java new file mode 100644 index 00000000..b3370372 --- /dev/null +++ b/src/main/java/com/ai/da/common/config/MinIoClientConfig.java @@ -0,0 +1,33 @@ +package com.ai.da.common.config; + +import io.minio.MinioClient; +import lombok.Data; +import org.springframework.beans.factory.annotation.Value; +import org.springframework.context.annotation.Bean; +import org.springframework.stereotype.Component; + +@Data +@Component +public class MinIoClientConfig { + @Value("${minio.endpoint}") + private String endpoint; + @Value("${minio.accessKey}") + private String accessKey; + @Value("${minio.secretKey}") + private String secretKey; + + /** + * 注入minio 客户端 + * @return + */ + @Bean + public MinioClient minioClient(){ + + return MinioClient.builder() + .endpoint(endpoint) + .credentials(accessKey, secretKey) + .build(); + } + +} + diff --git a/src/main/java/com/ai/da/common/utils/MinioUtil.java b/src/main/java/com/ai/da/common/utils/MinioUtil.java new file mode 100644 index 00000000..eefe2434 --- /dev/null +++ b/src/main/java/com/ai/da/common/utils/MinioUtil.java @@ -0,0 +1,216 @@ +package com.ai.da.common.utils; + +import com.ai.da.mapper.entity.ObjectItem; +import io.minio.*; +import io.minio.messages.DeleteError; +import io.minio.messages.DeleteObject; +import io.minio.messages.Item; +import org.apache.tomcat.util.http.fileupload.IOUtils; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.beans.factory.annotation.Value; +import org.springframework.http.HttpHeaders; +import org.springframework.http.HttpStatus; +import org.springframework.http.MediaType; +import org.springframework.http.ResponseEntity; +import org.springframework.stereotype.Component; +import org.springframework.web.multipart.MultipartFile; + +import java.io.ByteArrayOutputStream; +import java.io.IOException; +import java.io.InputStream; +import java.io.UnsupportedEncodingException; +import java.net.URLEncoder; +import java.util.ArrayList; +import java.util.Arrays; +import java.util.List; +import java.util.stream.Collectors; + +/** + * @description: minio工具类 + * @version:3.0 + */ +@Component +public class MinioUtil { + @Autowired + private MinioClient minioClient; + + @Value("${minio.bucketName}") + private String bucketName; + /** + * description: 判断bucket是否存在,不存在则创建 + * + * @return: void + */ + public void existBucket(String name) { + try { + boolean exists = minioClient.bucketExists(BucketExistsArgs.builder().bucket(name).build()); + if (!exists) { + minioClient.makeBucket(MakeBucketArgs.builder().bucket(name).build()); + } + } catch (Exception e) { + e.printStackTrace(); + } + } + + /** + * 创建存储bucket + * @param bucketName 存储bucket名称 + * @return Boolean + */ + public Boolean makeBucket(String bucketName) { + try { + minioClient.makeBucket(MakeBucketArgs.builder() + .bucket(bucketName) + .build()); + } catch (Exception e) { + e.printStackTrace(); + return false; + } + return true; + } + + /** + * 删除存储bucket + * @param bucketName 存储bucket名称 + * @return Boolean + */ + public Boolean removeBucket(String bucketName) { + try { + minioClient.removeBucket(RemoveBucketArgs.builder() + .bucket(bucketName) + .build()); + } catch (Exception e) { + e.printStackTrace(); + return false; + } + return true; + } + /** + * description: 上传文件 + * + * @param multipartFile + * @return: java.lang.String + + */ + public List upload(MultipartFile[] multipartFile) { + List names = new ArrayList<>(multipartFile.length); + for (MultipartFile file : multipartFile) { + String fileName = file.getOriginalFilename(); + String[] split = fileName.split("\\."); + if (split.length > 1) { + fileName = split[0] + "_" + System.currentTimeMillis() + "." + split[1]; + } else { + fileName = fileName + System.currentTimeMillis(); + } + InputStream in = null; + try { + in = file.getInputStream(); + minioClient.putObject(PutObjectArgs.builder() + .bucket(bucketName) + .object(fileName) + .stream(in, in.available(), -1) + .contentType(file.getContentType()) + .build() + ); + } catch (Exception e) { + e.printStackTrace(); + } finally { + if (in != null) { + try { + in.close(); + } catch (IOException e) { + e.printStackTrace(); + } + } + } + names.add(fileName); + } + return names; + } + + /** + * description: 下载文件 + * + * @param fileName + * @return: org.springframework.http.ResponseEntity + */ + public ResponseEntity download(String fileName) { + ResponseEntity responseEntity = null; + InputStream in = null; + ByteArrayOutputStream out = null; + try { + in = minioClient.getObject(GetObjectArgs.builder().bucket(bucketName).object(fileName).build()); + out = new ByteArrayOutputStream(); + IOUtils.copy(in, out); + //封装返回值 + byte[] bytes = out.toByteArray(); + HttpHeaders headers = new HttpHeaders(); + try { + headers.add("Content-Disposition", "attachment;filename=" + URLEncoder.encode(fileName, "UTF-8")); + } catch (UnsupportedEncodingException e) { + e.printStackTrace(); + } + headers.setContentLength(bytes.length); + headers.setContentType(MediaType.APPLICATION_OCTET_STREAM); + headers.setAccessControlExposeHeaders(Arrays.asList("*")); + responseEntity = new ResponseEntity(bytes, headers, HttpStatus.OK); + } catch (Exception e) { + e.printStackTrace(); + } finally { + try { + if (in != null) { + try { + in.close(); + } catch (IOException e) { + e.printStackTrace(); + } + } + if (out != null) { + out.close(); + } + } catch (IOException e) { + e.printStackTrace(); + } + } + return responseEntity; + } + + /** + * 查看文件对象 + * @param bucketName 存储bucket名称 + * @return 存储bucket内文件对象信息 + */ + public List listObjects(String bucketName) { + Iterable> results = minioClient.listObjects( + ListObjectsArgs.builder().bucket(bucketName).build()); + List objectItems = new ArrayList<>(); + try { + for (Result result : results) { + Item item = result.get(); + ObjectItem objectItem = new ObjectItem(); + objectItem.setObjectName(item.objectName()); + objectItem.setSize(item.size()); + objectItems.add(objectItem); + } + } catch (Exception e) { + e.printStackTrace(); + return null; + } + return objectItems; + } + + /** + * 批量删除文件对象 + * @param bucketName 存储bucket名称 + * @param objects 对象名称集合 + */ + public Iterable> removeObjects(String bucketName, List objects) { + List dos = objects.stream().map(e -> new DeleteObject(e)).collect(Collectors.toList()); + Iterable> results = minioClient.removeObjects(RemoveObjectsArgs.builder().bucket(bucketName).objects(dos).build()); + return results; + } + + +} + + diff --git a/src/main/java/com/ai/da/controller/DesignController.java b/src/main/java/com/ai/da/controller/DesignController.java index 67353b64..ac1d25bd 100644 --- a/src/main/java/com/ai/da/controller/DesignController.java +++ b/src/main/java/com/ai/da/controller/DesignController.java @@ -27,7 +27,7 @@ public class DesignController { @ApiOperation(value = "设计 Conllection") @PostMapping("/designCollection") - public Response designCollection(@Valid @RequestBody DesignCollectionDTO designDTO) { + public Response designCollection(@Valid @RequestBody DesignCollectionDTO designDTO) { return Response.success(designService.designCollection(designDTO)); } diff --git a/src/main/java/com/ai/da/controller/WorkspaceController.java b/src/main/java/com/ai/da/controller/WorkspaceController.java index 006e0baf..5094fa8d 100644 --- a/src/main/java/com/ai/da/controller/WorkspaceController.java +++ b/src/main/java/com/ai/da/controller/WorkspaceController.java @@ -1,25 +1,12 @@ package com.ai.da.controller; -import com.ai.da.common.context.UserContext; -import com.ai.da.common.response.PageBaseResponse; import com.ai.da.common.response.Response; -import com.ai.da.common.utils.CopyUtil; -import com.ai.da.mapper.entity.Account; -import com.ai.da.mapper.entity.UserLikeGroup; +import com.ai.da.common.utils.MinioUtil; import com.ai.da.mapper.entity.Workspace; -import com.ai.da.model.dto.QueryHistoryPageDTO; import com.ai.da.model.dto.WorkspaceDTO; import com.ai.da.model.enums.BizJson; -import com.ai.da.model.vo.AuthPrincipalVo; -import com.ai.da.model.vo.UserLikeGroupVO; -import com.ai.da.model.vo.UserLikeVO; import com.ai.da.model.vo.WorkspaceVO; import com.ai.da.service.WorkspaceService; -import com.baomidou.mybatisplus.core.conditions.query.Query; -import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; -import com.baomidou.mybatisplus.core.metadata.IPage; -import com.baomidou.mybatisplus.extension.plugins.pagination.Page; -import com.google.common.base.Function; import io.swagger.annotations.Api; import io.swagger.annotations.ApiOperation; import io.swagger.annotations.ApiParam; @@ -27,19 +14,12 @@ import com.github.xiaoymin.knife4j.annotations.ApiOperationSupport; import lombok.AllArgsConstructor; import javax.annotation.Resource; -import javax.servlet.http.HttpServletRequest; import javax.validation.Valid; -import org.springframework.util.Assert; -import org.springframework.util.CollectionUtils; -import org.springframework.util.StringUtils; +import org.springframework.beans.factory.annotation.Value; import org.springframework.web.bind.annotation.*; - -import java.util.Date; +import org.springframework.web.multipart.MultipartFile; import java.util.List; -import java.util.Map; -import java.util.Objects; -import java.util.stream.Collectors; /** * 控制器 @@ -56,6 +36,23 @@ public class WorkspaceController { @Resource private WorkspaceService workspaceService; + @Resource + private MinioUtil minIoUtil; + + @Value("${minio.endpoint}") + private static String address; + + @Value("${minio.bucketName}") + private static String bucketName; + + @PostMapping("/upload") + public Object upload(MultipartFile file) { + + List upload = minIoUtil.upload(new MultipartFile[]{file}); + + return address+"/"+bucketName+"/"+upload.get(0); + } + /** * 详情 */ @@ -63,19 +60,19 @@ public class WorkspaceController { @ApiOperationSupport(order = 1) @ApiOperation(value = "详情", notes = "传入workspace") public Response detail(@ApiParam(value = "主键集合", required = true) @RequestParam Long id) { - Workspace detail = workspaceService.getById(id); + Workspace detail = workspaceService.getByIdNew(id); return Response.success(detail); } /** * 分页 */ - @GetMapping("/list") + @PostMapping("/list") @ApiOperationSupport(order = 2) @ApiOperation(value = "分页", notes = "传入workspace") - public Response> list(@Valid @RequestBody WorkspaceDTO query) { - IPage convert = workspaceService.getPage(query); - return Response.success(PageBaseResponse.success(convert)); + public Response list(@Valid @RequestBody WorkspaceDTO query) { + WorkspaceVO response = workspaceService.getPage(query); + return Response.success(response); } /** diff --git a/src/main/java/com/ai/da/mapper/PythonTAllInfoMapper.java b/src/main/java/com/ai/da/mapper/PythonTAllInfoMapper.java new file mode 100644 index 00000000..9b4bbd14 --- /dev/null +++ b/src/main/java/com/ai/da/mapper/PythonTAllInfoMapper.java @@ -0,0 +1,19 @@ +package com.ai.da.mapper; + +import com.ai.da.common.config.mybatis.plus.CommonMapper; +import com.ai.da.mapper.entity.PythonTAllInfo; +import org.apache.ibatis.annotations.Param; +import org.springframework.data.domain.Pageable; + +import java.util.List; + +/** + * (PythonTAllInfo)表数据库访问层 + * + * @author SHAHAIBO + * @since 2023-09-08 17:05:24 + */ +public interface PythonTAllInfoMapper extends CommonMapper { + +} + diff --git a/src/main/java/com/ai/da/mapper/entity/ObjectItem.java b/src/main/java/com/ai/da/mapper/entity/ObjectItem.java new file mode 100644 index 00000000..80d33e2d --- /dev/null +++ b/src/main/java/com/ai/da/mapper/entity/ObjectItem.java @@ -0,0 +1,10 @@ +package com.ai.da.mapper.entity; + +import lombok.Data; + +@Data +public class ObjectItem { + private String objectName; + private Long size; +} + diff --git a/src/main/java/com/ai/da/mapper/entity/PythonTAllInfo.java b/src/main/java/com/ai/da/mapper/entity/PythonTAllInfo.java new file mode 100644 index 00000000..ae16fdd8 --- /dev/null +++ b/src/main/java/com/ai/da/mapper/entity/PythonTAllInfo.java @@ -0,0 +1,86 @@ +package com.ai.da.mapper.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; + +/** + * (PythonTAllInfo)实体类 + * + * @author SHAHAIBO + * @since 2023-09-08 17:05:25 + */ +@Data +@EqualsAndHashCode(callSuper = false) +@Accessors(chain = true) +@TableName("python_t_all_info") +public class PythonTAllInfo implements Serializable { + private static final long serialVersionUID = 1L; + + @TableId(value = "id", type = IdType.AUTO) + private Long id; + + private String imagePath; + + private String imageCategory; + + private String necklineLeft; + + private String necklineRight; + + private String centerFront; + + private String shoulderLeft; + + private String shoulderRight; + + private String armpitLeft; + + private String armpitRight; + + private String waistlineLeft; + + private String waistlineRight; + + private String cuffLeftIn; + + private String cuffLeftOut; + + private String cuffRightIn; + + private String cuffRightOut; + + private String topHemLeft; + + private String topHemRight; + + private String waistbandLeft; + + private String waistbandRight; + + private String hemlineLeft; + + private String hemlineRight; + + private String crotch; + + private String bottomLeftIn; + + private String bottomLeftOut; + + private String bottomRightIn; + + private String bottomRightOut; + + private String md5; + + private String maskPath; + + private String segResultPath; +} + diff --git a/src/main/java/com/ai/da/mapper/entity/TDesignPythonOutfit.java b/src/main/java/com/ai/da/mapper/entity/TDesignPythonOutfit.java index a03655a4..9338d903 100644 --- a/src/main/java/com/ai/da/mapper/entity/TDesignPythonOutfit.java +++ b/src/main/java/com/ai/da/mapper/entity/TDesignPythonOutfit.java @@ -31,6 +31,11 @@ public class TDesignPythonOutfit implements Serializable { @TableId(value = "id", type = IdType.AUTO) private Long id; + private Long designItemId; + /** + * designItemId + */ + @ApiModelProperty(value = "designItemId") private Long designItemId; /** * 关联的design ID diff --git a/src/main/java/com/ai/da/mapper/entity/TDesignPythonOutfitDetail.java b/src/main/java/com/ai/da/mapper/entity/TDesignPythonOutfitDetail.java index d822292f..8c9bbc42 100644 --- a/src/main/java/com/ai/da/mapper/entity/TDesignPythonOutfitDetail.java +++ b/src/main/java/com/ai/da/mapper/entity/TDesignPythonOutfitDetail.java @@ -53,6 +53,11 @@ public class TDesignPythonOutfitDetail implements Serializable { @ApiModelProperty(value = "图层大小") private String imageSize; + /** + * imageSize + */ + @ApiModelProperty(value = "imageSize") + private String imageSize; /** * 对应的图片的绝对路径 */ diff --git a/src/main/java/com/ai/da/mapper/entity/Workspace.java b/src/main/java/com/ai/da/mapper/entity/Workspace.java index 27a75cda..6ba8b8e1 100644 --- a/src/main/java/com/ai/da/mapper/entity/Workspace.java +++ b/src/main/java/com/ai/da/mapper/entity/Workspace.java @@ -62,6 +62,11 @@ public class Workspace implements Serializable { */ @ApiModelProperty(value = "人体模型") private String mannequin; + /** + * 最后使用的工作空间标识 + */ + @ApiModelProperty(value = "最后使用的工作空间标识") + private Integer isLastIndex; /** * 创建时间 */ diff --git a/src/main/java/com/ai/da/model/dto/WorkspaceDTO.java b/src/main/java/com/ai/da/model/dto/WorkspaceDTO.java index ba44148d..1e5a15cf 100644 --- a/src/main/java/com/ai/da/model/dto/WorkspaceDTO.java +++ b/src/main/java/com/ai/da/model/dto/WorkspaceDTO.java @@ -9,7 +9,7 @@ import lombok.EqualsAndHashCode; /** * 数据传输对象实体类 * - * @author Arcana + * @author SHAHAIBO * @since 2023-08-01 */ @Data diff --git a/src/main/java/com/ai/da/model/enums/Position.java b/src/main/java/com/ai/da/model/enums/Position.java index f84bff17..c213912f 100644 --- a/src/main/java/com/ai/da/model/enums/Position.java +++ b/src/main/java/com/ai/da/model/enums/Position.java @@ -9,8 +9,8 @@ import com.fasterxml.jackson.annotation.JsonValue; */ public enum Position implements IEnumDisplay { - OVERALL("整体"), - SINGLE("部位") + OVERALL("overall"), + SINGLE("single") ; private String value; diff --git a/src/main/java/com/ai/da/model/enums/Sex.java b/src/main/java/com/ai/da/model/enums/Sex.java index 05ae46ed..7de6cf41 100644 --- a/src/main/java/com/ai/da/model/enums/Sex.java +++ b/src/main/java/com/ai/da/model/enums/Sex.java @@ -9,9 +9,9 @@ import com.fasterxml.jackson.annotation.JsonValue; */ public enum Sex implements IEnumDisplay { - MALE("男装"), - FEMALE("女装"), - CHILD("童装") + MALE("male"), + FEMALE("female"), + CHILD("child") ; private String value; diff --git a/src/main/java/com/ai/da/model/vo/DesignCollectionItemVO.java b/src/main/java/com/ai/da/model/vo/DesignCollectionItemVO.java index d5f3f8af..dc15cd14 100644 --- a/src/main/java/com/ai/da/model/vo/DesignCollectionItemVO.java +++ b/src/main/java/com/ai/da/model/vo/DesignCollectionItemVO.java @@ -16,6 +16,13 @@ public class DesignCollectionItemVO { @ApiModelProperty("design生成的图片地址 绝对路径") private String designItemUrl; + @ApiModelProperty("t_design_python_outfit id") + private Long designOutfitId; + + @ApiModelProperty("t_design_python_outfit id") + private String designOutfitUrl; + public DesignCollectionItemVO() { + } } diff --git a/src/main/java/com/ai/da/model/vo/TDesignPythonOutfitDetailVO.java b/src/main/java/com/ai/da/model/vo/TDesignPythonOutfitDetailVO.java index ffb2600a..9737218e 100644 --- a/src/main/java/com/ai/da/model/vo/TDesignPythonOutfitDetailVO.java +++ b/src/main/java/com/ai/da/model/vo/TDesignPythonOutfitDetailVO.java @@ -9,7 +9,7 @@ import io.swagger.annotations.ApiModel; /** * design item详情表视图实体类 * - * @author Arcana + * @author SHAHAIBO * @since 2023-09-04 */ @Data diff --git a/src/main/java/com/ai/da/model/vo/TDesignPythonOutfitVO.java b/src/main/java/com/ai/da/model/vo/TDesignPythonOutfitVO.java index 4d390af6..b391c9d6 100644 --- a/src/main/java/com/ai/da/model/vo/TDesignPythonOutfitVO.java +++ b/src/main/java/com/ai/da/model/vo/TDesignPythonOutfitVO.java @@ -10,7 +10,7 @@ import io.swagger.annotations.ApiModel; /** * design item表 存对应design的8张图片视图实体类 * - * @author Arcana + * @author SHAHAIBO * @since 2023-09-04 */ @Data diff --git a/src/main/java/com/ai/da/model/vo/WorkspaceVO.java b/src/main/java/com/ai/da/model/vo/WorkspaceVO.java index 910a1033..0aac9c37 100644 --- a/src/main/java/com/ai/da/model/vo/WorkspaceVO.java +++ b/src/main/java/com/ai/da/model/vo/WorkspaceVO.java @@ -1,6 +1,7 @@ package com.ai.da.model.vo; +import com.ai.da.common.response.PageBaseResponse; import com.ai.da.mapper.entity.Workspace; import lombok.Data; import lombok.EqualsAndHashCode; @@ -9,13 +10,18 @@ import io.swagger.annotations.ApiModel; /** * 视图实体类 * - * @author Arcana + * @author SHAHAIBO * @since 2023-08-01 */ @Data @EqualsAndHashCode(callSuper = true) @ApiModel(value = "WorkspaceVO对象", description = "WorkspaceVO对象") public class WorkspaceVO extends Workspace { + private static final long serialVersionUID = 1L; + private Long currentId; + + private PageBaseResponse page; + } diff --git a/src/main/java/com/ai/da/python/PythonService.java b/src/main/java/com/ai/da/python/PythonService.java index 2b083c7e..12fc6d15 100644 --- a/src/main/java/com/ai/da/python/PythonService.java +++ b/src/main/java/com/ai/da/python/PythonService.java @@ -794,7 +794,7 @@ public class PythonService { //所有的icon都是none designPythonItemBlouse.setIcon("none"); designPythonItemBlouse.setColor(getRandomColor(elementVO.getColorBoards())); - if (!elementVO.getDesignPythonItemPrint().getSinglePath().equals("none") + if (!elementVO.getDesignPythonItemPrint().getPath().equals("none") && elementVO.getDesignPrintPictureTypeLayoutList().contains(type)) { designPythonItemBlouse.setPrint(CopyUtil.copyObject(elementVO.getDesignPythonItemPrint(), DesignPythonItemPrint.class)); } else { @@ -997,20 +997,20 @@ public class PythonService { //print 不取library的 只取element的 DesignPythonItemPrint print = new DesignPythonItemPrint(); if (CollectionUtil.isEmpty(elementVO.getPrintBoardElements())) { - print.setSinglePath("none"); + print.setPath("none"); return print; } List printBoardElements = elementVO.getPrintBoardElements() .stream() .filter(f -> !elementVO.getHasUseMd5List().contains(f.getMd5())).collect(Collectors.toList()); if (CollectionUtil.isEmpty(printBoardElements)) { - print.setSinglePath("none"); + print.setPath("none"); return print; } switch (designPrintPictureType) { case NO: //print 已用完 - print.setSinglePath("none"); + print.setPath("none"); return print; case NO_PIN: printBoardElements = printBoardElements.stream().filter(f -> f.getHasPin() == 0).collect(Collectors.toList()); @@ -1022,14 +1022,14 @@ public class PythonService { } if (printBoardElements.size() == 1) { - print.setSinglePath(printBoardElements.get(0).getUrl()); + print.setPath(printBoardElements.get(0).getUrl()); elementVO.getHasUseMd5List().add(printBoardElements.get(0).getMd5()); return print; } long maxPrint = printBoardElements.size(); long minPrint = 0; Long randomIndex = RandomsUtil.randomSysFile(minPrint, maxPrint); - print.setSinglePath(printBoardElements.get(randomIndex.intValue()).getUrl()); + print.setPath(printBoardElements.get(randomIndex.intValue()).getUrl()); elementVO.getHasUseMd5List().add(printBoardElements.get(randomIndex.intValue()).getMd5()); return print; } @@ -1522,13 +1522,13 @@ public class PythonService { .build(); MediaType mediaType = MediaType.parse("application/json"); //关闭FastJson的引用检测 防止出现$ref 现象 - String param = JSON.toJSONString(designPythonObjects, SerializerFeature.DisableCircularReferenceDetect); +// String param = JSON.toJSONString(designPythonObjects, SerializerFeature.DisableCircularReferenceDetect); // String param = "{\"objects\":[{\"basic\":{\"body_point_test\":{\"shoulder_left\":[755,519],\"toe_right\":[850,1355],\"ear_point_left\":[802,439],\"shoulder_right\":[912,519],\"waistband_right\":[891,725],\"hand_point_right\":[915,886],\"waistband_left\":[777,725],\"hand_point_left\":[754,886],\"head_point_left\":[804,424],\"head_point_right\":[864,424],\"ear_point_right\":[865,438],\"toe_left\":[817,1355],\"foot_length\":[784,1336,825,1336],\"head_point_up\":[834,390]},\"scale_bag\":0.7,\"scale_earrings\":0.16,\"self_template\":false,\"single_overall\":\"overall\",\"switch_category\":\"\"},\"items\":[{\"color\":\"50 187 147\",\"icon\":\"none\",\"path\":\"https://www.aida.com.hk/download/202308/userFile/collection/Sketchboard/42/048419db-38c4-4aee-85a7-33f0666b18d2.jpg\",\"print\":{\"path\":\"https://www.aida.com.hk/download/202304/pythonFile/generatePrint/generatePrint-d7a67a96-83f9-429f-9028-3e1697501088.jpg\"},\"type\":\"Outwear\",\"image_id\":53547},{\"color\":\"137 50 50\",\"icon\":\"none\",\"path\":\"https://www.aida.com.hk/download/sys/images/skirt/0628001153.jpg\",\"print\":{\"path\":\"none\"},\"type\":\"Skirt\",\"image_id\":53548},{\"path\":\"https://www.aida.com.hk/download/sys/accessories/hairstyle/hairstyle_242.jpg\",\"type\":\"Hairstyle\",\"image_id\":411},{\"color\":\"31 76 171\",\"path\":\"https://www.aida.com.hk/download/sys/accessories/shoes/shoes_11.jpg\",\"type\":\"Shoes\",\"image_id\":167},{\"path\":\"https://www.aida.com.hk/download/sys/accessories/earring/earrings_12.png\",\"type\":\"Earring\",\"image_id\":93},{\"body_path\":\"model_1693218345.2714431.png\",\"type\":\"Body\",\"image_id\":0}]},{\"basic\":{\"body_point_test\":{\"shoulder_left\":[755,519],\"toe_right\":[850,1355],\"ear_point_left\":[802,439],\"shoulder_right\":[912,519],\"waistband_right\":[891,725],\"hand_point_right\":[915,886],\"waistband_left\":[777,725],\"hand_point_left\":[754,886],\"head_point_left\":[804,424],\"head_point_right\":[864,424],\"ear_point_right\":[865,438],\"toe_left\":[817,1355],\"foot_length\":[784,1336,825,1336],\"head_point_up\":[834,390]},\"scale_bag\":0.7,\"scale_earrings\":0.16,\"self_template\":false,\"single_overall\":\"overall\",\"switch_category\":\"\"},\"items\":[{\"color\":\"103 74 74\",\"icon\":\"none\",\"path\":\"https://www.aida.com.hk/download/sys/images/dress/0902005000.jpg\",\"print\":{\"path\":\"https://www.aida.com.hk/download/202304/userFile/library/Printboard/42/4ba535c2-a08b-4114-826b-a87885fd3623Fabric-03.png\"},\"type\":\"Dress\",\"image_id\":53549},{\"color\":\"204 182 182\",\"icon\":\"none\",\"path\":\"https://www.aida.com.hk/download/sys/images/skirt/0825000582.jpg\",\"print\":{\"path\":\"https://www.aida.com.hk/download/202304/userFile/library/Printboard/42/4ba535c2-a08b-4114-826b-a87885fd3623Fabric-03.png\"},\"type\":\"Skirt\",\"image_id\":53550},{\"path\":\"https://www.aida.com.hk/download/sys/accessories/hairstyle/hairstyle_p2529.jpg\",\"type\":\"Hairstyle\",\"image_id\":898},{\"color\":\"137 50 50\",\"path\":\"https://www.aida.com.hk/download/sys/accessories/shoes/shoes_15.png\",\"type\":\"Shoes\",\"image_id\":171},{\"path\":\"https://www.aida.com.hk/download/sys/accessories/earring/earrings_15.png\",\"type\":\"Earring\",\"image_id\":96},{\"body_path\":\"model_1693218345.2714431.png\",\"type\":\"Body\",\"image_id\":0}]},{\"basic\":{\"body_point_test\":{\"shoulder_left\":[755,519],\"toe_right\":[850,1355],\"ear_point_left\":[802,439],\"shoulder_right\":[912,519],\"waistband_right\":[891,725],\"hand_point_right\":[915,886],\"waistband_left\":[777,725],\"hand_point_left\":[754,886],\"head_point_left\":[804,424],\"head_point_right\":[864,424],\"ear_point_right\":[865,438],\"toe_left\":[817,1355],\"foot_length\":[784,1336,825,1336],\"head_point_up\":[834,390]},\"scale_bag\":0.7,\"scale_earrings\":0.16,\"self_template\":false,\"single_overall\":\"overall\",\"switch_category\":\"\"},\"items\":[{\"color\":\"49 127 162\",\"icon\":\"none\",\"path\":\"https://www.aida.com.hk/download/sys/images/outwear/0628001185.jpg\",\"print\":{\"path\":\"https://www.aida.com.hk/download/202308/pythonFile/generatePrint/generatePrint-487e93e6-1e21-46b8-b821-3188251dbdbc.jpg\"},\"type\":\"Outwear\",\"image_id\":53551},{\"color\":\"103 74 74\",\"icon\":\"none\",\"path\":\"https://www.aida.com.hk/download/sys/images/trousers/0628000635.jpg\",\"print\":{\"path\":\"https://www.aida.com.hk/download/202308/pythonFile/generatePrint/generatePrint-487e93e6-1e21-46b8-b821-3188251dbdbc.jpg\"},\"type\":\"Trousers\",\"image_id\":53552},{\"path\":\"https://www.aida.com.hk/download/sys/accessories/hairstyle/hairstyle_p2102.jpg\",\"type\":\"Hairstyle\",\"image_id\":471},{\"color\":\"137 50 50\",\"path\":\"https://www.aida.com.hk/download/sys/accessories/shoes/shoes_41.jpg\",\"type\":\"Shoes\",\"image_id\":344},{\"path\":\"https://www.aida.com.hk/download/sys/accessories/earring/earrings_5.png\",\"type\":\"Earring\",\"image_id\":87},{\"body_path\":\"model_1693218345.2714431.png\",\"type\":\"Body\",\"image_id\":0}]},{\"basic\":{\"body_point_test\":{\"shoulder_left\":[755,519],\"toe_right\":[850,1355],\"ear_point_left\":[802,439],\"shoulder_right\":[912,519],\"waistband_right\":[891,725],\"hand_point_right\":[915,886],\"waistband_left\":[777,725],\"hand_point_left\":[754,886],\"head_point_left\":[804,424],\"head_point_right\":[864,424],\"ear_point_right\":[865,438],\"toe_left\":[817,1355],\"foot_length\":[784,1336,825,1336],\"head_point_up\":[834,390]},\"scale_bag\":0.7,\"scale_earrings\":0.16,\"self_template\":false,\"single_overall\":\"overall\",\"switch_category\":\"\"},\"items\":[{\"color\":\"31 76 171\",\"icon\":\"none\",\"path\":\"https://www.aida.com.hk/download/sys/images/outwear/0902002198.jpg\",\"print\":{\"path\":\"none\"},\"type\":\"Outwear\",\"image_id\":53553},{\"color\":\"50 187 147\",\"icon\":\"none\",\"path\":\"https://www.aida.com.hk/download/sys/images/skirt/0916000791.jpg\",\"print\":{\"path\":\"none\"},\"type\":\"Skirt\",\"image_id\":53554},{\"path\":\"https://www.aida.com.hk/download/sys/accessories/hairstyle/hairstyle_p2518.jpg\",\"type\":\"Hairstyle\",\"image_id\":887},{\"color\":\"137 50 50\",\"path\":\"https://www.aida.com.hk/download/sys/accessories/shoes/shoes_15.png\",\"type\":\"Shoes\",\"image_id\":171},{\"path\":\"https://www.aida.com.hk/download/sys/accessories/earring/earrings_11.png\",\"type\":\"Earring\",\"image_id\":92},{\"body_path\":\"model_1693218345.2714431.png\",\"type\":\"Body\",\"image_id\":0}]},{\"basic\":{\"body_point_test\":{\"shoulder_left\":[755,519],\"toe_right\":[850,1355],\"ear_point_left\":[802,439],\"shoulder_right\":[912,519],\"waistband_right\":[891,725],\"hand_point_right\":[915,886],\"waistband_left\":[777,725],\"hand_point_left\":[754,886],\"head_point_left\":[804,424],\"head_point_right\":[864,424],\"ear_point_right\":[865,438],\"toe_left\":[817,1355],\"foot_length\":[784,1336,825,1336],\"head_point_up\":[834,390]},\"scale_bag\":0.7,\"scale_earrings\":0.16,\"self_template\":false,\"single_overall\":\"overall\",\"switch_category\":\"\"},\"items\":[{\"color\":\"204 182 182\",\"icon\":\"none\",\"path\":\"https://www.aida.com.hk/download/sys/images/outwear/0902000892.jpg\",\"print\":{\"path\":\"none\"},\"type\":\"Outwear\",\"image_id\":53555},{\"color\":\"204 182 182\",\"icon\":\"none\",\"path\":\"https://www.aida.com.hk/download/sys/images/trousers/0916000460.jpg\",\"print\":{\"path\":\"none\"},\"type\":\"Trousers\",\"image_id\":53556},{\"path\":\"https://www.aida.com.hk/download/sys/accessories/hairstyle/hairstyle_204.jpg\",\"type\":\"Hairstyle\",\"image_id\":294},{\"color\":\"49 127 162\",\"path\":\"https://www.aida.com.hk/download/sys/accessories/shoes/shoes_15.png\",\"type\":\"Shoes\",\"image_id\":171},{\"path\":\"https://www.aida.com.hk/download/sys/accessories/earring/earrings_5.png\",\"type\":\"Earring\",\"image_id\":87},{\"body_path\":\"model_1693218345.2714431.png\",\"type\":\"Body\",\"image_id\":0}]},{\"basic\":{\"body_point_test\":{\"shoulder_left\":[755,519],\"toe_right\":[850,1355],\"ear_point_left\":[802,439],\"shoulder_right\":[912,519],\"waistband_right\":[891,725],\"hand_point_right\":[915,886],\"waistband_left\":[777,725],\"hand_point_left\":[754,886],\"head_point_left\":[804,424],\"head_point_right\":[864,424],\"ear_point_right\":[865,438],\"toe_left\":[817,1355],\"foot_length\":[784,1336,825,1336],\"head_point_up\":[834,390]},\"scale_bag\":0.7,\"scale_earrings\":0.16,\"self_template\":false,\"single_overall\":\"overall\",\"switch_category\":\"\"},\"items\":[{\"color\":\"204 182 182\",\"icon\":\"none\",\"path\":\"https://www.aida.com.hk/download/sys/images/blouse/0902002193.jpg\",\"print\":{\"path\":\"none\"},\"type\":\"Blouse\",\"image_id\":53557},{\"color\":\"50 187 147\",\"icon\":\"none\",\"path\":\"https://www.aida.com.hk/download/sys/images/skirt/0902002112.jpg\",\"print\":{\"path\":\"none\"},\"type\":\"Skirt\",\"image_id\":53558},{\"path\":\"https://www.aida.com.hk/download/sys/accessories/hairstyle/hairstyle_p2186.jpg\",\"type\":\"Hairstyle\",\"image_id\":555},{\"color\":\"204 182 182\",\"path\":\"https://www.aida.com.hk/download/sys/accessories/shoes/shoes_11.jpg\",\"type\":\"Shoes\",\"image_id\":167},{\"path\":\"https://www.aida.com.hk/download/sys/accessories/earring/earrings_12.png\",\"type\":\"Earring\",\"image_id\":93},{\"body_path\":\"model_1693218345.2714431.png\",\"type\":\"Body\",\"image_id\":0}]},{\"basic\":{\"body_point_test\":{\"shoulder_left\":[755,519],\"toe_right\":[850,1355],\"ear_point_left\":[802,439],\"shoulder_right\":[912,519],\"waistband_right\":[891,725],\"hand_point_right\":[915,886],\"waistband_left\":[777,725],\"hand_point_left\":[754,886],\"head_point_left\":[804,424],\"head_point_right\":[864,424],\"ear_point_right\":[865,438],\"toe_left\":[817,1355],\"foot_length\":[784,1336,825,1336],\"head_point_up\":[834,390]},\"scale_bag\":0.7,\"scale_earrings\":0.16,\"self_template\":false,\"single_overall\":\"overall\",\"switch_category\":\"\"},\"items\":[{\"color\":\"204 182 182\",\"icon\":\"none\",\"path\":\"https://www.aida.com.hk/download/sys/images/blouse/0902002193.jpg\",\"print\":{\"path\":\"none\"},\"type\":\"Blouse\",\"image_id\":53557},{\"color\":\"137 50 50\",\"icon\":\"none\",\"path\":\"https://www.aida.com.hk/download/sys/images/skirt/0902002861.jpg\",\"print\":{\"path\":\"none\"},\"type\":\"Skirt\",\"image_id\":53560},{\"path\":\"https://www.aida.com.hk/download/sys/accessories/hairstyle/hairstyle_p2128.jpg\",\"type\":\"Hairstyle\",\"image_id\":497},{\"color\":\"49 127 162\",\"path\":\"https://www.aida.com.hk/download/sys/accessories/shoes/shoes_39.jpg\",\"type\":\"Shoes\",\"image_id\":192},{\"path\":\"https://www.aida.com.hk/download/sys/accessories/earring/earrings_4.png\",\"type\":\"Earring\",\"image_id\":86},{\"body_path\":\"model_1693218345.2714431.png\",\"type\":\"Body\",\"image_id\":0}]},{\"basic\":{\"body_point_test\":{\"shoulder_left\":[755,519],\"toe_right\":[850,1355],\"ear_point_left\":[802,439],\"shoulder_right\":[912,519],\"waistband_right\":[891,725],\"hand_point_right\":[915,886],\"waistband_left\":[777,725],\"hand_point_left\":[754,886],\"head_point_left\":[804,424],\"head_point_right\":[864,424],\"ear_point_right\":[865,438],\"toe_left\":[817,1355],\"foot_length\":[784,1336,825,1336],\"head_point_up\":[834,390]},\"scale_bag\":0.7,\"scale_earrings\":0.16,\"self_template\":false,\"single_overall\":\"overall\",\"switch_category\":\"\"},\"items\":[{\"color\":\"204 182 182\",\"icon\":\"none\",\"path\":\"https://www.aida.com.hk/download/sys/images/blouse/0902002193.jpg\",\"print\":{\"path\":\"none\"},\"type\":\"Blouse\",\"image_id\":53557},{\"color\":\"49 127 162\",\"icon\":\"none\",\"path\":\"https://www.aida.com.hk/download/sys/images/skirt/0902000567.jpg\",\"print\":{\"path\":\"none\"},\"type\":\"Skirt\",\"image_id\":53562},{\"path\":\"https://www.aida.com.hk/download/sys/accessories/hairstyle/hairstyle_p2357.jpg\",\"type\":\"Hairstyle\",\"image_id\":726},{\"color\":\"137 50 50\",\"path\":\"https://www.aida.com.hk/download/sys/accessories/shoes/shoes_6.jpg\",\"type\":\"Shoes\",\"image_id\":163},{\"path\":\"https://www.aida.com.hk/download/sys/accessories/earring/earrings_15.png\",\"type\":\"Earring\",\"image_id\":96},{\"body_path\":\"model_1693218345.2714431.png\",\"type\":\"Body\",\"image_id\":0}]}]}"; + String param = "{\"objects\":[{\"basic\":{\"body_point_test\":{\"shoulder_left\":[755,519],\"toe_right\":[850,1355],\"ear_point_left\":[802,439],\"shoulder_right\":[912,519],\"waistband_right\":[891,725],\"hand_point_right\":[915,886],\"waistband_left\":[777,725],\"hand_point_left\":[754,886],\"head_point_left\":[804,424],\"head_point_right\":[864,424],\"ear_point_right\":[865,438],\"toe_left\":[817,1355],\"foot_length\":[784,1336,825,1336],\"head_point_up\":[834,390]},\"scale_bag\":0.7,\"scale_earrings\":0.16,\"self_template\":false,\"single_overall\":\"overall\",\"switch_category\":\"\"},\"items\":[{\"color\":\"50 187 147\",\"icon\":\"none\",\"path\":\"https://www.aida.com.hk/download/202308/userFile/collection/Sketchboard/42/048419db-38c4-4aee-85a7-33f0666b18d2.jpg\",\"print\":{\"IfSingle\":false,\"level1Type\":\"Printboard\",\"location\":[],\"path\":\"https://www.aida.com.hk/download/202308/pythonFile/generatePrint/generatePrint-14459173-d338-4425-8fcb-8755ceb254bc.jpg\",\"scale\":0.1},\"type\":\"Outwear\",\"image_id\":53547},{\"color\":\"137 50 50\",\"icon\":\"none\",\"path\":\"https://www.aida.com.hk/download/sys/images/skirt/0628001153.jpg\",\"print\":{\"path\":\"none\",\"IfSingle\":false},\"type\":\"Skirt\",\"image_id\":53548},{\"path\":\"https://www.aida.com.hk/download/sys/accessories/hairstyle/hairstyle_242.jpg\",\"type\":\"Hairstyle\",\"image_id\":411},{\"color\":\"31 76 171\",\"path\":\"https://www.aida.com.hk/download/sys/accessories/shoes/shoes_11.jpg\",\"type\":\"Shoes\",\"image_id\":167},{\"path\":\"https://www.aida.com.hk/download/sys/accessories/earring/earrings_12.png\",\"type\":\"Earring\",\"image_id\":93},{\"body_path\":\"model_1693218345.2714431.png\",\"type\":\"Body\",\"image_id\":0}]},{\"basic\":{\"body_point_test\":{\"shoulder_left\":[755,519],\"toe_right\":[850,1355],\"ear_point_left\":[802,439],\"shoulder_right\":[912,519],\"waistband_right\":[891,725],\"hand_point_right\":[915,886],\"waistband_left\":[777,725],\"hand_point_left\":[754,886],\"head_point_left\":[804,424],\"head_point_right\":[864,424],\"ear_point_right\":[865,438],\"toe_left\":[817,1355],\"foot_length\":[784,1336,825,1336],\"head_point_up\":[834,390]},\"scale_bag\":0.7,\"scale_earrings\":0.16,\"self_template\":false,\"single_overall\":\"overall\",\"switch_category\":\"\"},\"items\":[{\"color\":\"103 74 74\",\"icon\":\"none\",\"path\":\"https://www.aida.com.hk/download/sys/images/dress/0902005000.jpg\",\"print\":{\"path\":\"https://www.aida.com.hk/download/202304/userFile/library/Printboard/42/4ba535c2-a08b-4114-826b-a87885fd3623Fabric-03.png\",\"IfSingle\":false},\"type\":\"Dress\",\"image_id\":53549},{\"color\":\"204 182 182\",\"icon\":\"none\",\"path\":\"https://www.aida.com.hk/download/sys/images/skirt/0825000582.jpg\",\"print\":{\"path\":\"https://www.aida.com.hk/download/202304/userFile/library/Printboard/42/4ba535c2-a08b-4114-826b-a87885fd3623Fabric-03.png\",\"IfSingle\":false},\"type\":\"Skirt\",\"image_id\":53550},{\"path\":\"https://www.aida.com.hk/download/sys/accessories/hairstyle/hairstyle_p2529.jpg\",\"type\":\"Hairstyle\",\"image_id\":898},{\"color\":\"137 50 50\",\"path\":\"https://www.aida.com.hk/download/sys/accessories/shoes/shoes_15.png\",\"type\":\"Shoes\",\"image_id\":171},{\"path\":\"https://www.aida.com.hk/download/sys/accessories/earring/earrings_15.png\",\"type\":\"Earring\",\"image_id\":96},{\"body_path\":\"model_1693218345.2714431.png\",\"type\":\"Body\",\"image_id\":0}]},{\"basic\":{\"body_point_test\":{\"shoulder_left\":[755,519],\"toe_right\":[850,1355],\"ear_point_left\":[802,439],\"shoulder_right\":[912,519],\"waistband_right\":[891,725],\"hand_point_right\":[915,886],\"waistband_left\":[777,725],\"hand_point_left\":[754,886],\"head_point_left\":[804,424],\"head_point_right\":[864,424],\"ear_point_right\":[865,438],\"toe_left\":[817,1355],\"foot_length\":[784,1336,825,1336],\"head_point_up\":[834,390]},\"scale_bag\":0.7,\"scale_earrings\":0.16,\"self_template\":false,\"single_overall\":\"overall\",\"switch_category\":\"\"},\"items\":[{\"color\":\"49 127 162\",\"icon\":\"none\",\"path\":\"https://www.aida.com.hk/download/sys/images/outwear/0628001185.jpg\",\"print\":{\"path\":\"https://www.aida.com.hk/download/202308/pythonFile/generatePrint/generatePrint-487e93e6-1e21-46b8-b821-3188251dbdbc.jpg\"},\"type\":\"Outwear\",\"image_id\":53551},{\"color\":\"103 74 74\",\"icon\":\"none\",\"path\":\"https://www.aida.com.hk/download/sys/images/trousers/0628000635.jpg\",\"print\":{\"path\":\"https://www.aida.com.hk/download/202308/pythonFile/generatePrint/generatePrint-487e93e6-1e21-46b8-b821-3188251dbdbc.jpg\"},\"type\":\"Trousers\",\"image_id\":53552},{\"path\":\"https://www.aida.com.hk/download/sys/accessories/hairstyle/hairstyle_p2102.jpg\",\"type\":\"Hairstyle\",\"image_id\":471},{\"color\":\"137 50 50\",\"path\":\"https://www.aida.com.hk/download/sys/accessories/shoes/shoes_41.jpg\",\"type\":\"Shoes\",\"image_id\":344},{\"path\":\"https://www.aida.com.hk/download/sys/accessories/earring/earrings_5.png\",\"type\":\"Earring\",\"image_id\":87},{\"body_path\":\"model_1693218345.2714431.png\",\"type\":\"Body\",\"image_id\":0}]},{\"basic\":{\"body_point_test\":{\"shoulder_left\":[755,519],\"toe_right\":[850,1355],\"ear_point_left\":[802,439],\"shoulder_right\":[912,519],\"waistband_right\":[891,725],\"hand_point_right\":[915,886],\"waistband_left\":[777,725],\"hand_point_left\":[754,886],\"head_point_left\":[804,424],\"head_point_right\":[864,424],\"ear_point_right\":[865,438],\"toe_left\":[817,1355],\"foot_length\":[784,1336,825,1336],\"head_point_up\":[834,390]},\"scale_bag\":0.7,\"scale_earrings\":0.16,\"self_template\":false,\"single_overall\":\"overall\",\"switch_category\":\"\"},\"items\":[{\"color\":\"31 76 171\",\"icon\":\"none\",\"path\":\"https://www.aida.com.hk/download/sys/images/outwear/0902002198.jpg\",\"print\":{\"path\":\"none\",\"IfSingle\":false},\"type\":\"Outwear\",\"image_id\":53553},{\"color\":\"50 187 147\",\"icon\":\"none\",\"path\":\"https://www.aida.com.hk/download/sys/images/skirt/0916000791.jpg\",\"print\":{\"path\":\"none\",\"IfSingle\":false},\"type\":\"Skirt\",\"image_id\":53554},{\"path\":\"https://www.aida.com.hk/download/sys/accessories/hairstyle/hairstyle_p2518.jpg\",\"type\":\"Hairstyle\",\"image_id\":887},{\"color\":\"137 50 50\",\"path\":\"https://www.aida.com.hk/download/sys/accessories/shoes/shoes_15.png\",\"type\":\"Shoes\",\"image_id\":171},{\"path\":\"https://www.aida.com.hk/download/sys/accessories/earring/earrings_11.png\",\"type\":\"Earring\",\"image_id\":92},{\"body_path\":\"model_1693218345.2714431.png\",\"type\":\"Body\",\"image_id\":0}]},{\"basic\":{\"body_point_test\":{\"shoulder_left\":[755,519],\"toe_right\":[850,1355],\"ear_point_left\":[802,439],\"shoulder_right\":[912,519],\"waistband_right\":[891,725],\"hand_point_right\":[915,886],\"waistband_left\":[777,725],\"hand_point_left\":[754,886],\"head_point_left\":[804,424],\"head_point_right\":[864,424],\"ear_point_right\":[865,438],\"toe_left\":[817,1355],\"foot_length\":[784,1336,825,1336],\"head_point_up\":[834,390]},\"scale_bag\":0.7,\"scale_earrings\":0.16,\"self_template\":false,\"single_overall\":\"overall\",\"switch_category\":\"\"},\"items\":[{\"color\":\"204 182 182\",\"icon\":\"none\",\"path\":\"https://www.aida.com.hk/download/sys/images/outwear/0902000892.jpg\",\"print\":{\"path\":\"none\",\"IfSingle\":false},\"type\":\"Outwear\",\"image_id\":53555},{\"color\":\"204 182 182\",\"icon\":\"none\",\"path\":\"https://www.aida.com.hk/download/sys/images/trousers/0916000460.jpg\",\"print\":{\"path\":\"none\",\"IfSingle\":false},\"type\":\"Trousers\",\"image_id\":53556},{\"path\":\"https://www.aida.com.hk/download/sys/accessories/hairstyle/hairstyle_204.jpg\",\"type\":\"Hairstyle\",\"image_id\":294},{\"color\":\"49 127 162\",\"path\":\"https://www.aida.com.hk/download/sys/accessories/shoes/shoes_15.png\",\"type\":\"Shoes\",\"image_id\":171},{\"path\":\"https://www.aida.com.hk/download/sys/accessories/earring/earrings_5.png\",\"type\":\"Earring\",\"image_id\":87},{\"body_path\":\"model_1693218345.2714431.png\",\"type\":\"Body\",\"image_id\":0}]},{\"basic\":{\"body_point_test\":{\"shoulder_left\":[755,519],\"toe_right\":[850,1355],\"ear_point_left\":[802,439],\"shoulder_right\":[912,519],\"waistband_right\":[891,725],\"hand_point_right\":[915,886],\"waistband_left\":[777,725],\"hand_point_left\":[754,886],\"head_point_left\":[804,424],\"head_point_right\":[864,424],\"ear_point_right\":[865,438],\"toe_left\":[817,1355],\"foot_length\":[784,1336,825,1336],\"head_point_up\":[834,390]},\"scale_bag\":0.7,\"scale_earrings\":0.16,\"self_template\":false,\"single_overall\":\"overall\",\"switch_category\":\"\"},\"items\":[{\"color\":\"204 182 182\",\"icon\":\"none\",\"path\":\"https://www.aida.com.hk/download/sys/images/blouse/0902002193.jpg\",\"print\":{\"path\":\"none\",\"IfSingle\":false},\"type\":\"Blouse\",\"image_id\":53557},{\"color\":\"50 187 147\",\"icon\":\"none\",\"path\":\"https://www.aida.com.hk/download/sys/images/skirt/0902002112.jpg\",\"print\":{\"path\":\"none\",\"IfSingle\":false},\"type\":\"Skirt\",\"image_id\":53558},{\"path\":\"https://www.aida.com.hk/download/sys/accessories/hairstyle/hairstyle_p2186.jpg\",\"type\":\"Hairstyle\",\"image_id\":555},{\"color\":\"204 182 182\",\"path\":\"https://www.aida.com.hk/download/sys/accessories/shoes/shoes_11.jpg\",\"type\":\"Shoes\",\"image_id\":167},{\"path\":\"https://www.aida.com.hk/download/sys/accessories/earring/earrings_12.png\",\"type\":\"Earring\",\"image_id\":93},{\"body_path\":\"model_1693218345.2714431.png\",\"type\":\"Body\",\"image_id\":0}]},{\"basic\":{\"body_point_test\":{\"shoulder_left\":[755,519],\"toe_right\":[850,1355],\"ear_point_left\":[802,439],\"shoulder_right\":[912,519],\"waistband_right\":[891,725],\"hand_point_right\":[915,886],\"waistband_left\":[777,725],\"hand_point_left\":[754,886],\"head_point_left\":[804,424],\"head_point_right\":[864,424],\"ear_point_right\":[865,438],\"toe_left\":[817,1355],\"foot_length\":[784,1336,825,1336],\"head_point_up\":[834,390]},\"scale_bag\":0.7,\"scale_earrings\":0.16,\"self_template\":false,\"single_overall\":\"overall\",\"switch_category\":\"\"},\"items\":[{\"color\":\"204 182 182\",\"icon\":\"none\",\"path\":\"https://www.aida.com.hk/download/sys/images/blouse/0902002193.jpg\",\"print\":{\"path\":\"none\",\"IfSingle\":false},\"type\":\"Blouse\",\"image_id\":53557},{\"color\":\"137 50 50\",\"icon\":\"none\",\"path\":\"https://www.aida.com.hk/download/sys/images/skirt/0902002861.jpg\",\"print\":{\"path\":\"none\",\"IfSingle\":false},\"type\":\"Skirt\",\"image_id\":53560},{\"path\":\"https://www.aida.com.hk/download/sys/accessories/hairstyle/hairstyle_p2128.jpg\",\"type\":\"Hairstyle\",\"image_id\":497},{\"color\":\"49 127 162\",\"path\":\"https://www.aida.com.hk/download/sys/accessories/shoes/shoes_39.jpg\",\"type\":\"Shoes\",\"image_id\":192},{\"path\":\"https://www.aida.com.hk/download/sys/accessories/earring/earrings_4.png\",\"type\":\"Earring\",\"image_id\":86},{\"body_path\":\"model_1693218345.2714431.png\",\"type\":\"Body\",\"image_id\":0}]},{\"basic\":{\"body_point_test\":{\"shoulder_left\":[755,519],\"toe_right\":[850,1355],\"ear_point_left\":[802,439],\"shoulder_right\":[912,519],\"waistband_right\":[891,725],\"hand_point_right\":[915,886],\"waistband_left\":[777,725],\"hand_point_left\":[754,886],\"head_point_left\":[804,424],\"head_point_right\":[864,424],\"ear_point_right\":[865,438],\"toe_left\":[817,1355],\"foot_length\":[784,1336,825,1336],\"head_point_up\":[834,390]},\"scale_bag\":0.7,\"scale_earrings\":0.16,\"self_template\":false,\"single_overall\":\"overall\",\"switch_category\":\"\"},\"items\":[{\"color\":\"204 182 182\",\"icon\":\"none\",\"path\":\"https://www.aida.com.hk/download/sys/images/blouse/0902002193.jpg\",\"print\":{\"path\":\"none\",\"IfSingle\":false},\"type\":\"Blouse\",\"image_id\":53557},{\"color\":\"49 127 162\",\"icon\":\"none\",\"path\":\"https://www.aida.com.hk/download/sys/images/skirt/0902000567.jpg\",\"print\":{\"path\":\"none\",\"IfSingle\":false},\"type\":\"Skirt\",\"image_id\":53562},{\"path\":\"https://www.aida.com.hk/download/sys/accessories/hairstyle/hairstyle_p2357.jpg\",\"type\":\"Hairstyle\",\"image_id\":726},{\"color\":\"137 50 50\",\"path\":\"https://www.aida.com.hk/download/sys/accessories/shoes/shoes_6.jpg\",\"type\":\"Shoes\",\"image_id\":163},{\"path\":\"https://www.aida.com.hk/download/sys/accessories/earring/earrings_15.png\",\"type\":\"Earring\",\"image_id\":96},{\"body_path\":\"model_1693218345.2714431.png\",\"type\":\"Body\",\"image_id\":0}]}]}"; log.info("design请求python 参数:####{}", param); RequestBody body = RequestBody.create(mediaType, param); Request request = new Request.Builder() .url("http://18.167.251.121:9991/api/design") -// .url("http://18.167.251.121:9991") // .url(accessPythonIp + ":10200/aifda/api/v1.0/generate") .method("POST", body) .addHeader("Authorization", "Basic YWlkbGFiOjEyMw==") diff --git a/src/main/java/com/ai/da/python/vo/DesignPythonItem.java b/src/main/java/com/ai/da/python/vo/DesignPythonItem.java index 90c60ba3..cad3e596 100644 --- a/src/main/java/com/ai/da/python/vo/DesignPythonItem.java +++ b/src/main/java/com/ai/da/python/vo/DesignPythonItem.java @@ -52,6 +52,10 @@ public class DesignPythonItem { * body 对应路径(后面去掉) */ private String body_mask_path; + /** + * python_t_all_info image_id + */ + private Long imageId; /** * url在t_sys_file中的id diff --git a/src/main/java/com/ai/da/service/DesignService.java b/src/main/java/com/ai/da/service/DesignService.java index 5c84650f..282548d0 100644 --- a/src/main/java/com/ai/da/service/DesignService.java +++ b/src/main/java/com/ai/da/service/DesignService.java @@ -22,7 +22,7 @@ public interface DesignService extends IService { * @param designDTO * @return */ - JSONObject designCollection(DesignCollectionDTO designDTO); + DesignCollectionVO designCollection(DesignCollectionDTO designDTO); /** * redesign diff --git a/src/main/java/com/ai/da/service/ITDesignPythonOutfitDetailService.java b/src/main/java/com/ai/da/service/ITDesignPythonOutfitDetailService.java index de5e9889..182aa990 100644 --- a/src/main/java/com/ai/da/service/ITDesignPythonOutfitDetailService.java +++ b/src/main/java/com/ai/da/service/ITDesignPythonOutfitDetailService.java @@ -12,7 +12,7 @@ import java.util.List; /** * design item详情表 服务类 * - * @author Arcana + * @author SHAHAIBO * @since 2023-09-04 */ public interface ITDesignPythonOutfitDetailService extends IService { diff --git a/src/main/java/com/ai/da/service/ITDesignPythonOutfitService.java b/src/main/java/com/ai/da/service/ITDesignPythonOutfitService.java index e012ee0e..a82a0d86 100644 --- a/src/main/java/com/ai/da/service/ITDesignPythonOutfitService.java +++ b/src/main/java/com/ai/da/service/ITDesignPythonOutfitService.java @@ -8,7 +8,7 @@ import com.baomidou.mybatisplus.core.metadata.IPage; /** * design item表 存对应design的8张图片 服务类 * - * @author Arcana + * @author SHAHAIBO * @since 2023-09-04 */ public interface ITDesignPythonOutfitService extends IService { diff --git a/src/main/java/com/ai/da/service/PythonTAllInfoService.java b/src/main/java/com/ai/da/service/PythonTAllInfoService.java new file mode 100644 index 00000000..9b329cfc --- /dev/null +++ b/src/main/java/com/ai/da/service/PythonTAllInfoService.java @@ -0,0 +1,18 @@ +package com.ai.da.service; + + + +import com.ai.da.mapper.entity.PythonTAllInfo; +import com.baomidou.mybatisplus.extension.service.IService; + +/** + * (PythonTAllInfo)表服务接口 + * + * @author SHAHAIBO + * @since 2023-09-08 17:03:47 + */ +public interface PythonTAllInfoService extends IService { + + + Long getImageIdByPath(String path); +} diff --git a/src/main/java/com/ai/da/service/WorkspaceService.java b/src/main/java/com/ai/da/service/WorkspaceService.java index 701d68f8..c7ad9729 100644 --- a/src/main/java/com/ai/da/service/WorkspaceService.java +++ b/src/main/java/com/ai/da/service/WorkspaceService.java @@ -14,7 +14,7 @@ import java.util.List; /** * 服务类 * - * @author Arcana + * @author SHAHAIBO * @since 2023-08-01 */ public interface WorkspaceService extends IService { @@ -30,7 +30,9 @@ public interface WorkspaceService extends IService { boolean saveOrUpdate(Workspace workspace); - IPage getPage(WorkspaceDTO query); + WorkspaceVO getPage(WorkspaceDTO query); List getEnumValues(String enumName); + + Workspace getByIdNew(Long id); } 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 65f2f5cb..4fff2496 100644 --- a/src/main/java/com/ai/da/service/impl/CollectionElementServiceImpl.java +++ b/src/main/java/com/ai/da/service/impl/CollectionElementServiceImpl.java @@ -337,33 +337,34 @@ public class CollectionElementServiceImpl extends ServiceImpl printBoardIds = designDTO.getMarketingSketchs().stream() - .filter(f ->f.getDesignType().equals(DesignTypeEnum.COLLECTION.getRealName())) - .map(DesignCollectionElementDTO::getId) - .collect(Collectors.toList()); - if(!CollectionUtils.isEmpty(printBoardIds)){ - List marketingSketchElements = collectionElementMapper.selectBatchIds(printBoardIds); - Assert.isTrue(CollectionUtil.isNotEmpty(marketingSketchElements) - && marketingSketchElements.size() == printBoardIds.size(), "get marketingSketch data is mismatch"); - elementVO.setMarketingSketchElements(marketingSketchElements); - usedElementIds.addAll(printBoardIds); - } - //library - List libraryIds = designDTO.getMarketingSketchs().stream() - .filter(f ->f.getDesignType().equals(DesignTypeEnum.LIBRARY.getRealName())) - .map(DesignCollectionElementDTO::getId) - .collect(Collectors.toList()); - if(!CollectionUtils.isEmpty(libraryIds)){ - List librarys = libraryService.getByIds(libraryIds); - //不校验了防止用户在library删除 对应不上 - if(CollectionUtil.isNotEmpty(librarys)){ - libraryCollectionElements.addAll(covertLibrarysToCollections(librarys,null)); - } - } - } + // 2023.12版本去掉了这个入参 +// if (CollectionUtil.isNotEmpty(designDTO.getMarketingSketchs())) { +// //校验designType +// validateDesignType(designDTO.getMarketingSketchs(),"marketingSketchs"); +// List printBoardIds = designDTO.getMarketingSketchs().stream() +// .filter(f ->f.getDesignType().equals(DesignTypeEnum.COLLECTION.getRealName())) +// .map(DesignCollectionElementDTO::getId) +// .collect(Collectors.toList()); +// if(!CollectionUtils.isEmpty(printBoardIds)){ +// List marketingSketchElements = collectionElementMapper.selectBatchIds(printBoardIds); +// Assert.isTrue(CollectionUtil.isNotEmpty(marketingSketchElements) +// && marketingSketchElements.size() == printBoardIds.size(), "get marketingSketch data is mismatch"); +// elementVO.setMarketingSketchElements(marketingSketchElements); +// usedElementIds.addAll(printBoardIds); +// } +// //library +// List libraryIds = designDTO.getMarketingSketchs().stream() +// .filter(f ->f.getDesignType().equals(DesignTypeEnum.LIBRARY.getRealName())) +// .map(DesignCollectionElementDTO::getId) +// .collect(Collectors.toList()); +// if(!CollectionUtils.isEmpty(libraryIds)){ +// List librarys = libraryService.getByIds(libraryIds); +// //不校验了防止用户在library删除 对应不上 +// if(CollectionUtil.isNotEmpty(librarys)){ +// libraryCollectionElements.addAll(covertLibrarysToCollections(librarys,null)); +// } +// } +// } //校验控制生成类型 SingleOverallEnum singleOverall = SingleOverallEnum.of(designDTO.getSingleOverall()); Assert.notNull(singleOverall, "unknown parameter singleOverall!"); diff --git a/src/main/java/com/ai/da/service/impl/DesignServiceImpl.java b/src/main/java/com/ai/da/service/impl/DesignServiceImpl.java index c0c6af60..ea52fcf0 100644 --- a/src/main/java/com/ai/da/service/impl/DesignServiceImpl.java +++ b/src/main/java/com/ai/da/service/impl/DesignServiceImpl.java @@ -16,7 +16,9 @@ import com.ai.da.mapper.entity.Collection; import com.ai.da.model.dto.*; import com.ai.da.model.vo.*; import com.ai.da.python.PythonService; +import com.ai.da.python.vo.DesignPythonItem; import com.ai.da.python.vo.DesignPythonItemPrint; +import com.ai.da.python.vo.DesignPythonObject; import com.ai.da.python.vo.DesignPythonObjects; import com.ai.da.service.*; import com.alibaba.fastjson.JSON; @@ -27,6 +29,7 @@ import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; import com.google.common.collect.Lists; 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.util.Assert; import org.springframework.util.CollectionUtils; @@ -36,6 +39,7 @@ import javax.annotation.Resource; import java.io.File; import java.math.BigDecimal; import java.util.*; +import java.util.concurrent.atomic.AtomicInteger; import java.util.stream.Collectors; import static com.ai.da.python.vo.DesignPythonItem.*; @@ -79,10 +83,16 @@ public class DesignServiceImpl extends ServiceImpl impleme private ITDesignPythonOutfitDetailService designPythonOutfitDetailService; @Resource private PanToneService panToneService; + @Resource + private PythonTAllInfoService pythonTAllInfoService; + @Value("${minio.endpoint}") + private String endpoint; + @Value("${minio.bucketName}") + private String bucketName; // @Transactional @Override - public JSONObject designCollection(DesignCollectionDTO designDTO) { + public DesignCollectionVO designCollection(DesignCollectionDTO designDTO) { AuthPrincipalVo userInfo = UserContext.getUserHolder(); //校验collection element ValidateElementVO elementVO =collectionElementService.validateElement(designDTO); @@ -180,12 +190,12 @@ public class DesignServiceImpl extends ServiceImpl impleme //计算library calculateLibraryAndSysFile(designDTO,elementVO,userInfo); //组装design入参 - DesignPythonObjects pythonObjects =pythonService.covertDesignParam(designDTO.getSystemScale(), + DesignPythonObjects pythonObjects = pythonService.covertDesignParam(designDTO.getSystemScale(), designDTO.getSingleOverall(),designDTO.getSwitchCategory(),elementVO); //缓存保存的文件 方便后面处理进度问题 setDesignProcess(userInfo.getId(),pythonObjects); //design - JSONObject responseJSONObject= pythonService.designNew(pythonObjects); + pythonService.design(pythonObjects); //生成library generateLibrary(elementVO,designDTO.getTimeZone()); //处理关联关系,修复element覆盖得情况 @@ -198,7 +208,7 @@ public class DesignServiceImpl extends ServiceImpl impleme return saveDesignItemAndDetail(pythonObjects,designId,collectionId,userInfo,designDTO.getTimeZone()); } - private JSONObject designOrRedesignOperateNew(DesignCollectionDTO designDTO,AuthPrincipalVo userInfo, + private DesignCollectionVO designOrRedesignOperateNew(DesignCollectionDTO designDTO,AuthPrincipalVo userInfo, Long collectionIdParam,ValidateElementVO elementVO){ if(CollectionUtil.isNotEmpty(designDTO.getSketchBoards())){ //编辑sketchBoard @@ -211,7 +221,7 @@ public class DesignServiceImpl extends ServiceImpl impleme //保存collection Long collectionId = (null == collectionIdParam) ? collectionService.saveCollection(userInfo.getId(),designDTO.getTimeZone(),designDTO.getMoodTemplateId()) : collectionIdParam; - List elementIds =getElementId(elementVO); + List elementIds = getElementId(elementVO); //批量关联element 到 collection collectionElementService.relationCollection(elementIds,collectionId); //library转化为collection(生成) @@ -227,8 +237,10 @@ public class DesignServiceImpl extends ServiceImpl impleme designDTO.getSingleOverall(),designDTO.getSwitchCategory(),elementVO); //缓存保存的文件 方便后面处理进度问题 setDesignProcess(userInfo.getId(),pythonObjects); + // pythonObjects增加image_id关联 + relationImageId(pythonObjects); //design - JSONObject responseJSONObject= pythonService.designNew(pythonObjects); + JSONObject responseJSONObject = pythonService.designNew(pythonObjects); //生成library generateLibrary(elementVO,designDTO.getTimeZone()); //处理关联关系,修复element覆盖得情况 @@ -240,6 +252,28 @@ public class DesignServiceImpl extends ServiceImpl impleme //保存designItem 和detail // return saveDesignItemAndDetail(pythonObjects,designId,collectionId,userInfo,designDTO.getTimeZone()); } + + private void relationImageId(DesignPythonObjects pythonObjects) { + if(Objects.isNull(pythonObjects)) { + return; + } + pythonObjects.getObjects().forEach( + o -> { + for (DesignPythonItem item : o.getItems()) { + String path = item.getPath(); + if (StringUtils.isEmpty(path)) { + String bodyPath = item.getBody_path(); + Long imageId = pythonTAllInfoService.getImageIdByPath(bodyPath); + item.setImageId(imageId); + }else { + Long imageId = pythonTAllInfoService.getImageIdByPath(path); + item.setImageId(imageId); + } + } + } + ); + } + private void handleCollectionElementRelation(Long collectionId ,Boolean isEdit,List elementIds ){ if (CollectionUtils.isEmpty(elementIds) || collectionId == null){ return; @@ -310,15 +344,16 @@ public class DesignServiceImpl extends ServiceImpl impleme return object.getBasic().getSave_name();}).collect(Collectors.toList()); LocalCacheUtils.setDesignProcessCache(userId,saveNames); } - private JSONObject savePythonDesignItemAndDetail(DesignPythonObjects pythonObjects + private DesignCollectionVO savePythonDesignItemAndDetail(DesignPythonObjects pythonObjects ,Long designId,Long collectionId,AuthPrincipalVo userInfo,String timeZone, JSONObject responseJSONObject){ DesignCollectionVO response = new DesignCollectionVO(); response.setDesignId(designId); response.setCollectionId(collectionId); List designCollectionItems = Lists.newArrayList(); response.setDesignCollectionItems(designCollectionItems); - - pythonObjects.getObjects().forEach(item ->{ + JSONObject data = responseJSONObject.getJSONObject("data"); + for (int i = 0; i < pythonObjects.getObjects().size(); i++) { + DesignPythonObject item = pythonObjects.getObjects().get(i); DesignItem designItem = new DesignItem(); designItem.setAccountId(userInfo.getId()); designItem.setCollectionId(collectionId); @@ -329,8 +364,63 @@ public class DesignServiceImpl extends ServiceImpl impleme designItem.setHasLike((byte)0); //生成designItem Long designItemId = designItemService.saveOne(designItem); + // python design返回入库及封装 + JSONObject outfit = data.getJSONObject(i + ""); + if (null == outfit) { + continue; + } + TDesignPythonOutfit designPythonOutfit = new TDesignPythonOutfit(); + designPythonOutfit.setDesignItemId(designItemId); + designPythonOutfit.setUserId(userInfo.getId()); + designPythonOutfit.setDesignId(designId); + designPythonOutfit.setCollectionId(collectionId); + designPythonOutfit.setDesignUrl(outfit.getString("synthesis_url")); + designPythonOutfitService.save(designPythonOutfit); + JSONArray layers = outfit.getJSONArray("layers"); + List list = new ArrayList<>(); + for (int i1 = 0; i1 < layers.size(); i1++) { + JSONObject jsonObject = layers.getJSONObject(i1); + TDesignPythonOutfitDetail designPythonOutfitDetail = new TDesignPythonOutfitDetail(); + designPythonOutfitDetail.setDesignId(designId); + designPythonOutfitDetail.setDesignPythonOutfitId(designPythonOutfit.getId()); + JSONArray position = jsonObject.getJSONArray("position"); + if (position != null && !CollectionUtils.isEmpty(position)) { + StringBuilder builder = null; + for (int i2 = 0; i2 < position.size(); i2++) { + if (i2 != position.size() - 1) { + builder.append(position.getInteger(i2)).append(","); + }else { + builder.append(position.getInteger(i2)); + } + } + designPythonOutfitDetail.setPosition(builder.toString()); + } + JSONArray imageSize = jsonObject.getJSONArray("image_size"); + if (imageSize != null && !CollectionUtils.isEmpty(position)) { + StringBuilder builder = null; + for (int i2 = 0; i2 < imageSize.size(); i2++) { + if (i2 != imageSize.size() - 1) { + builder.append(imageSize.getInteger(i2)).append(","); + }else { + builder.append(imageSize.getInteger(i2)); + } + } + designPythonOutfitDetail.setImageSize(builder.toString()); + } + designPythonOutfitDetail.setImageUrl(jsonObject.getString("image_url")); + designPythonOutfitDetail.setImageCategory(jsonObject.getString("image_category")); + designPythonOutfitDetail.setMaskUrl(jsonObject.getString("mask_url")); + designPythonOutfitDetail.setUserId(userInfo.getId()); + list.add(designPythonOutfitDetail); + } + designPythonOutfitDetailService.saveBatch(list); + DesignCollectionItemVO designCollectionItemVO = new DesignCollectionItemVO(); + designCollectionItemVO.setDesignItemId(designItemId); + designCollectionItemVO.setDesignItemUrl(designItem.getDesignUrl()); + designCollectionItemVO.setDesignOutfitId(designPythonOutfit.getId()); + designCollectionItemVO.setDesignOutfitUrl(endpoint + "/" + bucketName + "/" + designPythonOutfit.getDesignUrl()); //response - designCollectionItems.add(new DesignCollectionItemVO(designItemId,designItem.getDesignUrl())); + designCollectionItems.add(designCollectionItemVO); List designItemDetails = Lists.newArrayList(); item.getItems().forEach(detail ->{ @@ -354,33 +444,9 @@ public class DesignServiceImpl extends ServiceImpl impleme designItemDetails.add(designItemDetail); }); designItemDetailService.saveBatch(designItemDetails); - }); - JSONObject data = responseJSONObject.getJSONObject("data"); - for (int i = 0; i < 8; i++) { - JSONObject outfit = data.getJSONObject(i + ""); - TDesignPythonOutfit designPythonOutfit = new TDesignPythonOutfit(); - designPythonOutfit.setUserId(userInfo.getId()); - designPythonOutfit.setDesignId(designId); - designPythonOutfit.setCollectionId(collectionId); - designPythonOutfit.setDesignUrl(outfit.getString("synthesis_url")); - designPythonOutfitService.save(designPythonOutfit); - JSONArray layers = outfit.getJSONArray("layers"); - List list = new ArrayList<>(); - for (int i1 = 0; i1 < layers.size(); i1++) { - JSONObject jsonObject = layers.getJSONObject(i1); - TDesignPythonOutfitDetail designPythonOutfitDetail = new TDesignPythonOutfitDetail(); - designPythonOutfitDetail.setDesignId(designId); - designPythonOutfitDetail.setDesignPythonOutfitId(designPythonOutfit.getId()); - designPythonOutfitDetail.setPosition(jsonObject.getString("position")); - designPythonOutfitDetail.setImageUrl(jsonObject.getString("image_url")); - designPythonOutfitDetail.setImageCategory(jsonObject.getString("image_category")); - designPythonOutfitDetail.setMaskUrl(jsonObject.getString("mask_url")); - designPythonOutfitDetail.setUserId(userInfo.getId()); - list.add(designPythonOutfitDetail); - } - designPythonOutfitDetailService.saveBatch(list); } - return responseJSONObject; + + return response; } private DesignCollectionVO saveDesignItemAndDetail(DesignPythonObjects pythonObjects @@ -403,7 +469,7 @@ public class DesignServiceImpl extends ServiceImpl impleme //生成designItem Long designItemId = designItemService.saveOne(designItem); //response - designCollectionItems.add(new DesignCollectionItemVO(designItemId,designItem.getDesignUrl())); + designCollectionItems.add(new DesignCollectionItemVO(designItemId,designItem.getDesignUrl(), null, null)); List designItemDetails = Lists.newArrayList(); item.getItems().forEach(detail ->{ @@ -432,6 +498,7 @@ public class DesignServiceImpl extends ServiceImpl impleme } private List getElementId(ValidateElementVO elementVO){ List elementIds = Lists.newArrayList(); + // collection type if(CollectionUtil.isNotEmpty(elementVO.getSketchBoardElements())){ elementIds.addAll(elementVO.getSketchBoardElements().stream().map(CollectionElement::getId).collect(Collectors.toList())); } @@ -441,9 +508,9 @@ public class DesignServiceImpl extends ServiceImpl impleme if(CollectionUtil.isNotEmpty(elementVO.getPrintBoardElements())){ elementIds.addAll(elementVO.getPrintBoardElements().stream().map(CollectionElement::getId).collect(Collectors.toList())); } - if(CollectionUtil.isNotEmpty(elementVO.getMarketingSketchElements())){ - elementIds.addAll(elementVO.getMarketingSketchElements().stream().map(CollectionElement::getId).collect(Collectors.toList())); - } +// if(CollectionUtil.isNotEmpty(elementVO.getMarketingSketchElements())){ +// elementIds.addAll(elementVO.getMarketingSketchElements().stream().map(CollectionElement::getId).collect(Collectors.toList())); +// } return elementIds; } @@ -499,7 +566,7 @@ public class DesignServiceImpl extends ServiceImpl impleme private List coverDesignItemToVO( List designItems){ List response = Lists.newArrayList(); designItems.forEach(designItem -> { - response.add(new DesignCollectionItemVO(designItem.getId(),designItem.getDesignUrl())); + response.add(new DesignCollectionItemVO(designItem.getId(),designItem.getDesignUrl(), null, null)); }); return response; } diff --git a/src/main/java/com/ai/da/service/impl/PanToneServiceImpl.java b/src/main/java/com/ai/da/service/impl/PanToneServiceImpl.java index 41148a13..b3af8521 100644 --- a/src/main/java/com/ai/da/service/impl/PanToneServiceImpl.java +++ b/src/main/java/com/ai/da/service/impl/PanToneServiceImpl.java @@ -122,8 +122,8 @@ public class PanToneServiceImpl extends ServiceImpl impl @Override public List getRgbByHsvBatch(List hsvBatch) { - if(hsvBatch.size() >15){ - throw new BusinessException("hsv value cannot exceed the maximum of 15"); + if(hsvBatch.size() >8){ + throw new BusinessException("hsv value cannot exceed the maximum of 8"); } List colorValues = Lists.newArrayList(); Map valueToHsv = Maps.newHashMap(); diff --git a/src/main/java/com/ai/da/service/impl/PythonTAllInfoServiceImpl.java b/src/main/java/com/ai/da/service/impl/PythonTAllInfoServiceImpl.java new file mode 100644 index 00000000..1360689a --- /dev/null +++ b/src/main/java/com/ai/da/service/impl/PythonTAllInfoServiceImpl.java @@ -0,0 +1,51 @@ +package com.ai.da.service.impl; + + +import com.ai.da.common.config.exception.BusinessException; +import com.ai.da.mapper.PythonTAllInfoMapper; +import com.ai.da.mapper.entity.PythonTAllInfo; +import com.ai.da.service.PythonTAllInfoService; +import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; +import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; +import lombok.extern.slf4j.Slf4j; +import org.springframework.stereotype.Service; +import org.springframework.util.CollectionUtils; +import org.springframework.util.StringUtils; + +import javax.annotation.Resource; +import java.util.List; + +/** + * (PythonTAllInfo)表服务实现类 + * + * @author SHAHAIBO + * @since 2023-09-08 17:03:47 + */ +@Service +@Slf4j +public class PythonTAllInfoServiceImpl extends ServiceImpl implements PythonTAllInfoService { + @Resource + private PythonTAllInfoMapper pythonTAllInfoMapper; + + + @Override + public Long getImageIdByPath(String path) { + if (StringUtils.isEmpty(path)) { + throw new BusinessException("path不能为空"); + } + QueryWrapper qw = new QueryWrapper<>(); + qw.lambda().eq(PythonTAllInfo::getImagePath, path); + qw.lambda().last("limit 1"); + List pythonTAllInfos = pythonTAllInfoMapper.selectList(qw); + if (!CollectionUtils.isEmpty(pythonTAllInfos)) { + return pythonTAllInfos.get(0).getId(); + } + PythonTAllInfo pythonTAllInfo = new PythonTAllInfo(); + pythonTAllInfo.setImagePath(path); + int insert = pythonTAllInfoMapper.insert(pythonTAllInfo); + if (insert != 1) { + throw new BusinessException("插入失败"); + } + return pythonTAllInfo.getId(); + } +} diff --git a/src/main/java/com/ai/da/service/impl/TDesignPythonOutfitDetailServiceImpl.java b/src/main/java/com/ai/da/service/impl/TDesignPythonOutfitDetailServiceImpl.java index 40f14898..665d18f5 100644 --- a/src/main/java/com/ai/da/service/impl/TDesignPythonOutfitDetailServiceImpl.java +++ b/src/main/java/com/ai/da/service/impl/TDesignPythonOutfitDetailServiceImpl.java @@ -38,6 +38,15 @@ public class TDesignPythonOutfitDetailServiceImpl extends ServiceImpl getPage(WorkspaceDTO query) { + public WorkspaceVO getPage(WorkspaceDTO query) { + WorkspaceVO vo = new WorkspaceVO(); String userName = UserContext.getUserHolder().getUsername(); QueryWrapper qw = new QueryWrapper<>(); qw.lambda().eq(Workspace::getUserName, userName); IPage page = workspaceMapper.selectPage(new Page<>(query.getPage(), query.getSize()), qw); - return page; + if (page.getTotal() == 0L) { + // 给用户新建默认workspace + Workspace workspace = new Workspace(); + workspace.setWorkSpaceName(WORKSPACE_NAME); + workspace.setSex(Sex.MALE.getValue()); + workspace.setSystemDesignerPercentage(SYSTEM_DESIGNER_PERCENTAGE); + workspace.setPosition(Position.OVERALL.getValue()); + workspace.setUserName(userName); + workspace.setIsLastIndex(1); + int insert = workspaceMapper.insert(workspace); + if (insert <= 0) { + throw new BusinessException("save workspace failed"); + } + page = workspaceMapper.selectPage(new Page<>(query.getPage(), query.getSize()), qw); + vo.setPage(PageBaseResponse.success(page)); + vo.setId(workspace.getId()); + return vo; + } + vo.setPage(PageBaseResponse.success(page)); + QueryWrapper qwIsLastIndex = new QueryWrapper<>(); + qwIsLastIndex.lambda().eq(Workspace::getUserName, userName); + qwIsLastIndex.lambda().eq(Workspace::getIsLastIndex, 1); + qwIsLastIndex.last("limit 1"); + List workspaces = workspaceMapper.selectList(qwIsLastIndex); + if (CollectionUtils.isEmpty(workspaces)) { + throw new BusinessException("用户工作空间未查询到最后使用标识"); + } + vo.setId(workspaces.get(0).getId()); + return vo; } @Override @@ -74,6 +119,21 @@ public class WorkspaceServiceImpl extends ServiceImpl qwOld = new QueryWrapper<>(); + qwOld.lambda().eq(Workspace::getUserName, userName); + qwOld.lambda().eq(Workspace::getIsLastIndex, 1); + Workspace oldIsLastIndex = workspaceMapper.selectOne(qwOld); + oldIsLastIndex.setIsLastIndex(0); + workspaceMapper.updateById(oldIsLastIndex); + Workspace newIsLastIndex= workspaceMapper.selectById(id); + newIsLastIndex.setIsLastIndex(1); + workspaceMapper.updateById(newIsLastIndex); + return newIsLastIndex; + } + private List getEnumValues(Class clazz) { List kvs = new ArrayList(); IEnumDisplay[] items = (IEnumDisplay[]) clazz.getEnumConstants(); diff --git a/src/main/resources/application-test.properties b/src/main/resources/application-test.properties index 5fc36361..2e5fbafd 100644 --- a/src/main/resources/application-test.properties +++ b/src/main/resources/application-test.properties @@ -31,7 +31,8 @@ file.mac.path=~/file/ file.linux.path=/workspace/home/aida/file/ #linux服务器域名(预览和下载用) #file.linuxDomain=http://18.162.111.141:5568/download/ -file.linuxDomain=http://18.167.251.121:5568/download/ +#file.linuxDomain=http://18.167.251.121:5568/download/ +file.linuxDomain=https://www.aida.com.hk/download/ file.windows.path=D:\\upload\\ spring.servlet.multipart.max-file-size = 5MB diff --git a/src/main/resources/mapper/PythonTAllInfoMapper.xml b/src/main/resources/mapper/PythonTAllInfoMapper.xml new file mode 100644 index 00000000..b661a036 --- /dev/null +++ b/src/main/resources/mapper/PythonTAllInfoMapper.xml @@ -0,0 +1,39 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/src/main/resources/mapper/TDesignPythonOutfitDetailMapper.xml b/src/main/resources/mapper/TDesignPythonOutfitDetailMapper.xml index aaa38b35..b231cdcb 100644 --- a/src/main/resources/mapper/TDesignPythonOutfitDetailMapper.xml +++ b/src/main/resources/mapper/TDesignPythonOutfitDetailMapper.xml @@ -13,6 +13,7 @@ + diff --git a/src/main/resources/mapper/TDesignPythonOutfitMapper.xml b/src/main/resources/mapper/TDesignPythonOutfitMapper.xml index e886f817..b739bdfe 100644 --- a/src/main/resources/mapper/TDesignPythonOutfitMapper.xml +++ b/src/main/resources/mapper/TDesignPythonOutfitMapper.xml @@ -5,6 +5,7 @@ + diff --git a/src/test/java/com/ai/da/controller/PantoneTest.java b/src/test/java/com/ai/da/controller/PantoneTest.java deleted file mode 100644 index b5eaf566..00000000 --- a/src/test/java/com/ai/da/controller/PantoneTest.java +++ /dev/null @@ -1,65 +0,0 @@ -package com.ai.da.controller; - -import com.ai.da.AiDaApplication; -import com.ai.da.common.utils.PantoneUtils; -import com.ai.da.service.DesignService; -import com.ai.da.service.PanToneService; -import org.junit.Test; -import org.junit.runner.RunWith; -import org.springframework.boot.test.context.SpringBootTest; -import org.springframework.test.context.junit4.SpringRunner; - -import javax.annotation.Resource; -import java.util.Arrays; -import java.util.List; - -@RunWith(SpringRunner.class) -@SpringBootTest(classes = AiDaApplication.class) -public class PantoneTest { - - @Resource - private PanToneService panToneService; - @Resource - private DesignService designService; - - @Test - public void testGetPantoneByRgbBatch(){ - List colors = Arrays.asList("244 222 222","120 57 55","229 208 207","223 184 182","80 49 48"); -// System.out.println(panToneService.getPantoneByRgbBatch(colors)); - } - - @Test - public void testDesign(){ - System.out.println(designService.detail(34182L)); - } - - @Test - public void testRgbToHsv(){ - - -// 42 228 194 -// 226 194 194 -// 174 226 20 - int[] rgb1 = {174,226,20}; - System.out.println(Arrays.toString(rgb1)); - rgb1 = PantoneUtils.rgbToHsv(rgb1); - System.out.println(Arrays.toString(rgb1)); - System.out.println(rgb1[0] * 101 * 101 + rgb1[1] * 101 + rgb1[2]); - int[] rgb2 = {226,194,194}; - System.out.println(Arrays.toString(rgb2)); - System.out.println(Arrays.toString(PantoneUtils.rgbToHsv(rgb2))); - System.out.println(rgb2[0] * 101 * 101 + rgb2[1] * 101 + rgb2[2]); - int[] rgb3 = {42,228,194}; - System.out.println(Arrays.toString(rgb3)); - System.out.println(Arrays.toString(PantoneUtils.rgbToHsv(rgb3))); - System.out.println(rgb3[0] * 101 * 101 + rgb3[1] * 101 + rgb3[2]); - - int[] rgb4 = {246,227,180}; - System.out.println(Arrays.toString(rgb4)); - rgb4 = PantoneUtils.rgbToHsv(rgb4); - System.out.println(Arrays.toString(rgb4)); - System.out.println(rgb4[0] * 101 * 101 + rgb4[1] * 101 + rgb4[2]); - } - - -}