package com.ai.da.controller; import cn.hutool.core.lang.Assert; import cn.hutool.system.UserInfo; import com.ai.da.common.config.FileProperties; import com.ai.da.common.config.exception.BusinessException; import com.ai.da.common.context.UserContext; import com.ai.da.common.enums.LibraryLevel1TypeEnum; import com.ai.da.common.response.PageBaseResponse; import com.ai.da.common.response.Response; import com.ai.da.common.utils.*; import com.ai.da.mapper.entity.Library; import com.ai.da.mapper.entity.LibraryModelPoint; import com.ai.da.model.dto.*; import com.ai.da.model.enums.ModelType; import com.ai.da.model.vo.*; import com.ai.da.service.LibraryModelPointService; import com.ai.da.service.LibraryService; import com.alibaba.fastjson.JSON; import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; import io.swagger.annotations.Api; import io.swagger.annotations.ApiOperation; import io.swagger.annotations.ApiParam; import lombok.extern.slf4j.Slf4j; import org.springframework.beans.factory.annotation.Value; import org.springframework.util.StringUtils; import org.springframework.web.bind.annotation.*; import org.springframework.web.multipart.MultipartFile; import javax.annotation.Resource; import javax.validation.Valid; import java.io.File; import java.util.Date; import java.util.List; import java.util.Objects; import java.util.UUID; @Api(tags = "library模块") @Slf4j @RestController @RequestMapping("/api/library") public class LibraryController { @Resource private LibraryService libraryService; @Resource private LibraryModelPointService libraryModelPointService; @Resource private FileProperties fileProperties; @Resource private MinioUtil minioUtil; @Value("${minio.bucketName.sysImage}") private String sysImage; @ApiOperation(value = "Library分页列表") @PostMapping("/queryLibraryPage") public Response> queryLibraryPage(@Valid @RequestBody QueryLibraryPageDTO query) { return Response.success(libraryService.queryLibraryPage(CopyUtil.copyObject(query, QueryLibraryPageServiceDTO.class))); } @ApiOperation(value = "Library分页列表(查询top和bottom)") @PostMapping("/queryLibraryTopAndBottomPage") public Response> queryLibraryTopAndBottomPage(@Valid @RequestBody QueryLibraryTopPageDTO query) { return Response.success(libraryService.queryLibraryPage(CopyUtil.copyObject(query, QueryLibraryPageServiceDTO.class))); } @ApiOperation(value = "Library文件上传") @PostMapping("/upload") public Response upload(@RequestParam("file") MultipartFile file, @ApiParam("一级类型 Moodboard Printboard Sketchboard MarketingSketch Models") @RequestParam(value = "level1Type") String level1Type, @ApiParam("二级类型 争对 Sketchboard; 有 Outwear Dress Blouse Skirt Trousers") @RequestParam(value = "level2Type", required = false) String level2Type, @ApiParam("本地时区,比如 'Asia/Tokyo' 东京时间 , 'Asia/Shanghai' 北京时间 由js本地获取") @RequestParam(value = "timeZone") String timeZone, @RequestParam(value = "modelType") String modelType, @RequestParam(value = "sex") String sex, @RequestParam(value = "checkMd5") Integer checkMd5) { Assert.isTrue(!StringUtils.isEmpty(file.getOriginalFilename()), "Please select a file!"); Integer high = null; Integer width = null; if (level1Type.equals(LibraryLevel1TypeEnum.MODELS.getRealName())) { if (StringUtils.isEmpty(modelType)) { throw new BusinessException("modelType can't be null"); } if (modelType.equals(ModelType.SYSTEM.getValue()) && StringUtils.isEmpty(sex)) { throw new BusinessException("sex can't be null"); } FileVO fileVO = FileUtil.getFileSize(file); high = fileVO.getHigh(); width = fileVO.getWidth(); } String md5 = MD5Utils.encryptFile(file); if (checkMd5 == null || checkMd5 == 1) { if (!libraryService.checkMd5(level1Type, level2Type, sex, md5)) { LibraryUpdateVo libraryUpdateVo = new LibraryUpdateVo(); libraryUpdateVo.setCheckMd5(Boolean.FALSE); return Response.success(libraryUpdateVo); } } return Response.success(libraryService.upload(new LibraryUploadDTO(file, level1Type, level2Type, timeZone, md5, high, width, modelType, sex))); } @ApiOperation(value = "保存或者编辑template打点") @PostMapping("/saveOrEditTemplatePoint") public Response saveOrEditTemplatePoint(@Valid @RequestBody LibraryModelPointDTO libraryModelPoint) { return Response.success(libraryModelPointService.saveOrEditTemplatePoint(libraryModelPoint)); } @ApiOperation(value = "批量Library修改用户文件名") @PostMapping("/batchUpdateLibraryName") public Response batchUpdateLibraryName(@Valid @RequestBody LibraryUpdateDTO libraryUpdateDTO) { libraryService.updateLibraryName(libraryUpdateDTO); return Response.success(Boolean.TRUE); } @ApiOperation(value = "批量删除library") @PostMapping("/batchDeleteLibrary") public Response batchDeleteLibrary(@Valid @RequestBody LibraryDeleteDTO deleteDTO) { List librarys = libraryService.getByIds(deleteDTO.getLibraryIds()); Assert.notEmpty(librarys, "librarys does not exist!"); libraryService.removeBatchByIds(deleteDTO.getLibraryIds()); for (Library library : librarys) { if (library.getUrl().startsWith(sysImage)) { continue; } minioUtil.deleteObject(library.getUrl()); } return Response.success(Boolean.TRUE); } @ApiOperation(value = "Models打点预览") @PostMapping("/modelsDot") public Response modelsDot(@ApiParam("file") @RequestPart(value = "file", required = false) MultipartFile file, @ApiParam("models对象") @RequestPart("models") ModelsDotDTO modelsDotDTO) { if (Objects.nonNull(file)) { Assert.isTrue(!StringUtils.isEmpty(file.getOriginalFilename()), "Please select a file!"); AuthPrincipalVo userInfo = UserContext.getUserHolder(); //需要宽高和地址参数design FileVO fileVO = FileUtil.getFileSize(file); modelsDotDTO.setHigh(fileVO.getHigh()); modelsDotDTO.setWidth(fileVO.getWidth()); //存储template临时地址 String path = calculateTempFileUrlNew(userInfo.getId()); String uploadPath = minioUtil.upload("aida-tmp", path, file); String minioPath = libraryService.processMannequins(uploadPath); modelsDotDTO.setTemplateUrl(minioPath); } else { Assert.notNull(modelsDotDTO.getLibraryId(), "libraryId cannot be empty!"); Assert.notNull(modelsDotDTO.getTemplateId(), "templateId cannot be empty!"); LibraryModelPoint modelPoint = libraryModelPointService.getById(modelsDotDTO.getTemplateId()); Assert.notNull(modelPoint, "template does not exist!"); Library library = libraryService.getById(modelsDotDTO.getLibraryId()); Assert.notNull(library, "library does not exist!"); modelsDotDTO.setHigh(library.getHigh()); modelsDotDTO.setWidth(library.getWidth()); modelsDotDTO.setTemplateUrl(library.getUrl()); } Response response = new Response(); log.info("Models打点预览入参####{}", JSON.toJSONString(modelsDotDTO)); String url = libraryModelPointService.modelsDot(modelsDotDTO); response.setData(minioUtil.getPresignedUrl(url, 24 * 60)); return response; } @ApiOperation(value = "更新sketchboard level2type") @PostMapping("/updateLibraryLevel2Type") public Response updateLibraryLevel2Type(@RequestBody LibraryLevel2TypeUpdateDTO libraryLevel2TypeUpdateDTO) { return Response.success(libraryService.updateLibraryLevel2Type(libraryLevel2TypeUpdateDTO)); } private String calculateTempFileUrl(Long userId) { String rootPath = fileProperties.getSys().getPath(); String day = DateUtil.dateToStr(new Date(), DateUtil.YYYYMM); return rootPath + day + File.separator + "tmp" + File.separator + userId + File.separator + UUID.randomUUID(); } private String calculateTempFileUrlNew(Long userId) { return userId.toString(); } private String calculateTemplateUrl(File uploadFile) { String linuxDomain = fileProperties.getLinuxDomain(); if (!StringUtils.isEmpty(linuxDomain)) { //linux 系统 String oldPath = fileProperties.getSys().getPath(); return uploadFile.getAbsolutePath().replace(oldPath, linuxDomain); } //本地用 // return "/home/pangkaicheng/python_code/Multi-layer-Virtual-Try-on/dataset_for_test/Img_model.png"; return "/workspace/python_code/Multi-layer-Virtual-Try-on/dataset_for_test/Img_model.png"; } }