diff --git a/src/main/java/com/ai/da/common/enums/GenerateTypeEnum.java b/src/main/java/com/ai/da/common/enums/GenerateTypeEnum.java new file mode 100644 index 00000000..2ccdeafc --- /dev/null +++ b/src/main/java/com/ai/da/common/enums/GenerateTypeEnum.java @@ -0,0 +1,30 @@ +package com.ai.da.common.enums; + +import lombok.Getter; + +@Getter +public enum GenerateTypeEnum { + + /** + * 通过文本生成 + */ + TEXT(1,"text"), + + /** + * 通过图片生成 + */ + IMAGE(2,"image"), + + /** + * 通过文本和图片生成 + */ + TEXT_IMAGE(2,"text-image"); + + private Integer code; + private String value; + + GenerateTypeEnum(int code,String value) { + this.code = code; + this.value = value; + } +} diff --git a/src/main/java/com/ai/da/common/enums/ModelNameEnum.java b/src/main/java/com/ai/da/common/enums/ModelNameEnum.java new file mode 100644 index 00000000..e8c2e122 --- /dev/null +++ b/src/main/java/com/ai/da/common/enums/ModelNameEnum.java @@ -0,0 +1,22 @@ +package com.ai.da.common.enums; + +import lombok.Getter; + +@Getter +public enum ModelNameEnum { + + /** + * 使用模型0 + */ + MODEL_0("0","model_0"); + + + private String code; + private String modelName; + + + ModelNameEnum(String code,String modelName) { + this.code = code; + this.modelName = modelName; + } +} diff --git a/src/main/java/com/ai/da/controller/GenerateController.java b/src/main/java/com/ai/da/controller/GenerateController.java index e3c67b02..c4ed674c 100644 --- a/src/main/java/com/ai/da/controller/GenerateController.java +++ b/src/main/java/com/ai/da/controller/GenerateController.java @@ -1,9 +1,11 @@ package com.ai.da.controller; import com.ai.da.common.response.Response; +import com.ai.da.model.dto.GenerateLikeDTO; import com.ai.da.model.dto.GenerateThroughImageTextDTO; import com.ai.da.model.vo.GenerateCaptionVO; import com.ai.da.model.vo.GenerateCollectionVO; +import com.ai.da.model.vo.GenerateLikeVO; import com.ai.da.service.GenerateService; import io.swagger.annotations.Api; import io.swagger.annotations.ApiOperation; @@ -38,10 +40,10 @@ public class GenerateController { return Response.success(generateService.generateThroughImageText(generateThroughImageTextDTO)); } - - - - - + @ApiOperation("喜欢生成的图片") + @PostMapping("/like") + public Response like(@Valid @RequestBody GenerateLikeDTO generateLikeDTO){ + return Response.success(generateService.generateLike(generateLikeDTO)); + } } diff --git a/src/main/java/com/ai/da/controller/PythonController.java b/src/main/java/com/ai/da/controller/PythonController.java index 6791dace..957a00ef 100644 --- a/src/main/java/com/ai/da/controller/PythonController.java +++ b/src/main/java/com/ai/da/controller/PythonController.java @@ -52,6 +52,16 @@ public class PythonController { return Response.success(pythonService.upload(file, operateType)); } + @ApiOperation(value = "python服务保存多张图片到java服务") + @PostMapping("/saveMultiGeneratePicture") + public Response> uploadMultiple(@RequestParam("files") MultipartFile[] files, + @ApiParam("操作类型 generatePrint ->生成印花 " + + "designCollection ->设计collection generateAdvancedDesign ->生成高级design"+ + "generateSketch -> 生成草图") + @RequestParam(value = "operateType") String operateType) { + return Response.success(pythonService.upload(files, operateType)); + } + @ApiOperation(value = "通过文件类型获取系统文件") @GetMapping("/getSysFileByLevel2Type") public Response> getSysFileByLevel2Type(/*@RequestParam(value = "level2Type",required = false) String level2Type*/) { diff --git a/src/main/java/com/ai/da/mapper/entity/Generate.java b/src/main/java/com/ai/da/mapper/entity/Generate.java index 603e621f..fc1f4e33 100644 --- a/src/main/java/com/ai/da/mapper/entity/Generate.java +++ b/src/main/java/com/ai/da/mapper/entity/Generate.java @@ -27,6 +27,11 @@ public class Generate { */ private Long accountId; + /** + * Sketchboard Printboard + */ + private String level1Type; + /** * 关联collection element id */ diff --git a/src/main/java/com/ai/da/mapper/entity/GenerateDetail.java b/src/main/java/com/ai/da/mapper/entity/GenerateDetail.java index 535856ca..224ef2bf 100644 --- a/src/main/java/com/ai/da/mapper/entity/GenerateDetail.java +++ b/src/main/java/com/ai/da/mapper/entity/GenerateDetail.java @@ -32,6 +32,11 @@ public class GenerateDetail { */ private String url; + /** + * 是否喜欢 0:dislike 1:like + */ + private Byte isLike; + /** * 创建时间 */ diff --git a/src/main/java/com/ai/da/model/dto/GenerateLikeDTO.java b/src/main/java/com/ai/da/model/dto/GenerateLikeDTO.java new file mode 100644 index 00000000..a1accf04 --- /dev/null +++ b/src/main/java/com/ai/da/model/dto/GenerateLikeDTO.java @@ -0,0 +1,28 @@ +package com.ai.da.model.dto; + +import io.swagger.annotations.ApiModel; +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; + +import javax.validation.constraints.NotBlank; +import javax.validation.constraints.NotNull; + +@Data +@ApiModel("Generate like入参") +public class GenerateLikeDTO { + + @NotNull(message = "generateDetail id cannot be empty!") + @ApiModelProperty("generateDetailId") + private Long generateDetailId; + + @NotBlank(message = "level1Type cannot be empty!") + @ApiModelProperty("一级类型 Sketchboard Printboard") + private String level1Type; + + @ApiModelProperty("当一级类型为Sketchboard时,二级类型 Outwear Dress Blouse Skirt Trousers") + private String level2Type; + + @NotBlank(message = "timeZone cannot be empty!") + @ApiModelProperty("本地时区,比如 'Asia/Tokyo' 东京时间 , 'Asia/Shanghai' 北京时间 由js本地获取") + private String timeZone; +} diff --git a/src/main/java/com/ai/da/model/vo/GenerateLikeVO.java b/src/main/java/com/ai/da/model/vo/GenerateLikeVO.java new file mode 100644 index 00000000..bdc2ffa4 --- /dev/null +++ b/src/main/java/com/ai/da/model/vo/GenerateLikeVO.java @@ -0,0 +1,20 @@ +package com.ai.da.model.vo; + +import io.swagger.annotations.ApiModel; +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; + +@Data +@ApiModel("generate like 响应") +public class GenerateLikeVO { + + @ApiModelProperty("like的图片加入library的id") + private Long libraryId; + + public GenerateLikeVO(Long libraryId) { + this.libraryId = libraryId; + } + + public GenerateLikeVO() { + } +} diff --git a/src/main/java/com/ai/da/python/PythonService.java b/src/main/java/com/ai/da/python/PythonService.java index 5fa22e20..689892f8 100644 --- a/src/main/java/com/ai/da/python/PythonService.java +++ b/src/main/java/com/ai/da/python/PythonService.java @@ -145,6 +145,28 @@ public class PythonService { return null; } + @Transactional + public List upload(MultipartFile[] files, String operateType) { + List paths = new ArrayList<>(); + //用户信息 + PythonToJavaApiOperationTypeEnum operationType = PythonToJavaApiOperationTypeEnum.uploadOf(operateType); + Assert.notNull(operationType, "unknown operateType " + operateType + "!"); + String path = calculateFileUrl(operationType); + for (MultipartFile file : files) { + File generateFile = FileUtil.upload2(file, path); + Assert.notNull(generateFile,"An error occurred while processing the file, please try again later"); + + String linuxDomain = fileProperties.getLinuxDomain(); + if (!StringUtils.isEmpty(linuxDomain)) { + //linux 系统 + String oldPath = fileProperties.getSys().getPath(); + paths.add(generateFile.getAbsolutePath().replace(oldPath, linuxDomain)); + } + } + return paths; + } + + private String calculateFileUrl(PythonToJavaApiOperationTypeEnum operationType) { String rootPath = fileProperties.getSys().getPath(); String day = DateUtil.dateToStr(new Date(), DateUtil.YYYYMM); diff --git a/src/main/java/com/ai/da/service/GenerateService.java b/src/main/java/com/ai/da/service/GenerateService.java index d7bc029a..454f5df8 100644 --- a/src/main/java/com/ai/da/service/GenerateService.java +++ b/src/main/java/com/ai/da/service/GenerateService.java @@ -1,12 +1,16 @@ package com.ai.da.service; +import com.ai.da.model.dto.GenerateLikeDTO; import com.ai.da.model.dto.GenerateThroughImageTextDTO; import com.ai.da.model.vo.GenerateCaptionVO; import com.ai.da.model.vo.GenerateCollectionVO; +import com.ai.da.model.vo.GenerateLikeVO; public interface GenerateService { GenerateCaptionVO generateCaption(Long sketchElementId); GenerateCollectionVO generateThroughImageText(GenerateThroughImageTextDTO generateThroughImageTextDTO); + + GenerateLikeVO generateLike(GenerateLikeDTO generateLikeDTO); } diff --git a/src/main/java/com/ai/da/service/impl/GenerateServiceImpl.java b/src/main/java/com/ai/da/service/impl/GenerateServiceImpl.java index 50947a08..971b42e3 100644 --- a/src/main/java/com/ai/da/service/impl/GenerateServiceImpl.java +++ b/src/main/java/com/ai/da/service/impl/GenerateServiceImpl.java @@ -2,30 +2,28 @@ package com.ai.da.service.impl; import cn.hutool.core.lang.Assert; import com.ai.da.common.context.UserContext; +import com.ai.da.common.enums.CollectionLevel1TypeEnum; +import com.ai.da.common.enums.GenerateTypeEnum; +import com.ai.da.common.enums.ModelNameEnum; import com.ai.da.common.utils.DateUtil; +import com.ai.da.common.utils.MD5Utils; import com.ai.da.mapper.CollectionElementMapper; import com.ai.da.mapper.GenerateDetailMapper; import com.ai.da.mapper.GenerateMapper; -import com.ai.da.mapper.entity.CollectionElement; -import com.ai.da.mapper.entity.Generate; -import com.ai.da.mapper.entity.GenerateDetail; +import com.ai.da.mapper.entity.*; +import com.ai.da.model.dto.GenerateLikeDTO; import com.ai.da.model.dto.GenerateThroughImageTextDTO; -import com.ai.da.model.vo.AuthPrincipalVo; -import com.ai.da.model.vo.GenerateCaptionVO; -import com.ai.da.model.vo.GenerateCollectionItemVO; -import com.ai.da.model.vo.GenerateCollectionVO; +import com.ai.da.model.vo.*; import com.ai.da.python.PythonService; import com.ai.da.service.GenerateService; +import com.ai.da.service.LibraryService; import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; import io.netty.util.internal.StringUtil; import org.springframework.stereotype.Service; import javax.annotation.Resource; -import java.util.ArrayList; -import java.util.Arrays; -import java.util.List; -import java.util.Objects; +import java.util.*; @Service public class GenerateServiceImpl extends ServiceImpl implements GenerateService { @@ -36,6 +34,9 @@ public class GenerateServiceImpl extends ServiceImpl im @Resource private GenerateDetailMapper generateDetailMapper; + @Resource + private LibraryService libraryService; + @Resource private PythonService pythonService; @@ -67,15 +68,15 @@ public class GenerateServiceImpl extends ServiceImpl im Generate generate = new Generate(); generate.setAccountId(accountId); generate.setGenerateType(generateType); - generate.setModelName(StringUtil.isNullOrEmpty(modelName) ? "0" : modelName); + generate.setModelName(StringUtil.isNullOrEmpty(modelName) ? ModelNameEnum.MODEL_0.getCode() : modelName); generate.setCreateDate(DateUtil.getByTimeZone(generateThroughImageTextDTO.getTimeZone())); - int mode = 2; + int mode = GenerateTypeEnum.TEXT_IMAGE.getCode(); switch(generateType){ case "text": Assert.notNull(text,"Please input the caption"); generate.setText(text); - mode = 1; + mode = GenerateTypeEnum.TEXT.getCode(); break; case "image": Assert.notNull(elementId,"Please choose a image"); @@ -86,19 +87,17 @@ public class GenerateServiceImpl extends ServiceImpl im "Please input the caption and choose a image"); generate.setText(text); generate.setCollectionElementId(elementId); - break; + default: } // 3、将请求信息落库 - // 3.1 sketch在t_collection_element表中的信息是否需要更新 如 level2Type + // 3.1 sketch或print在t_collection_element表中的信息是否需要更新 如 level2Type CollectionElement collectionElement = null; if(!Objects.isNull(elementId)){ collectionElement = collectionElementMapper.selectById(elementId); if (StringUtil.isNullOrEmpty(collectionElement.getLevel2Type()) || !(collectionElement.getLevel2Type()).equals(generateThroughImageTextDTO.getLevel2Type()) ){ collectionElement.setLevel2Type(generateThroughImageTextDTO.getLevel2Type()); - QueryWrapper queryWrapper = new QueryWrapper<>(); - queryWrapper.eq("id", elementId); - collectionElementMapper.update(collectionElement,queryWrapper); + collectionElementMapper.updateById(collectionElement); } } @@ -134,4 +133,51 @@ public class GenerateServiceImpl extends ServiceImpl im // 6、将模型返回的图片地址返回给前端 return generateCollectionVO; } + + @Override + public GenerateLikeVO generateLike(GenerateLikeDTO generateLikeDTO) { + // 1、判断参数是否正确 + // 1.1 必须参数是否非空 + if(CollectionLevel1TypeEnum.SKETCH_BOARD.getRealName().equals(generateLikeDTO.getLevel1Type()) ){ + Assert.isTrue(!StringUtil.isNullOrEmpty(generateLikeDTO.getLevel2Type()),"level2Type cannot be empty"); + } + // 1.2 判断参数是否真实有效 + Long generateDetailId = generateLikeDTO.getGenerateDetailId(); + GenerateDetail generateDetail = generateDetailMapper.selectById(generateDetailId); + Assert.notNull(generateDetail,"generateItem does not exist"); + Generate generate = getById(generateDetail.getGenerateId()); + Assert.isTrue(generateLikeDTO.getLevel1Type().equals(generate.getLevel1Type()),"level1Type does not match"); + + // 2、将like的图片信息存入library + AuthPrincipalVo userInfo = UserContext.getUserHolder(); + Long accountId = userInfo.getId(); + Library library = setLibrary(accountId, generateLikeDTO, generateDetail.getUrl()); + libraryService.save(library); + + // 3、更新generateDetail表的isLike列 + updateLikeStatus(generateLikeDTO.getGenerateDetailId(),(byte)1); + + return new GenerateLikeVO(library.getId()); + } + + public Library setLibrary(Long accountId,GenerateLikeDTO generateLikeDTO,String imageUrl){ + Library library = new Library(); + library.setAccountId(accountId); + library.setLevel1Type(generateLikeDTO.getLevel1Type()); + library.setLevel2Type(StringUtil.isNullOrEmpty(generateLikeDTO.getLevel2Type()) ? null : generateLikeDTO.getLevel2Type()); + library.setName(DateUtil.dateToStr(new Date(),DateUtil.YYYY_MM_DD)); + library.setUrl(imageUrl); + library.setMd5(MD5Utils.encryptFile(imageUrl,Boolean.FALSE)); + library.setCreateDate(DateUtil.getByTimeZone(generateLikeDTO.getTimeZone())); + return library; + } + + public void updateLikeStatus(Long generateDetailId,Byte hasLike){ + QueryWrapper queryWrapper = new QueryWrapper<>(); + queryWrapper.eq("id", generateDetailId); + + GenerateDetail generateDetail = new GenerateDetail(); + generateDetail.setIsLike(hasLike); + generateDetailMapper.update(generateDetail,queryWrapper); + } }