diff --git a/pom.xml b/pom.xml
index 82d7353b..5eece106 100644
--- a/pom.xml
+++ b/pom.xml
@@ -145,6 +145,12 @@
minio
8.0.3
+
+
+ commons-fileupload
+ commons-fileupload
+ 1.4
+
diff --git a/src/main/java/com/ai/da/common/utils/FileUtil.java b/src/main/java/com/ai/da/common/utils/FileUtil.java
index cb67c4d6..0b67bea6 100644
--- a/src/main/java/com/ai/da/common/utils/FileUtil.java
+++ b/src/main/java/com/ai/da/common/utils/FileUtil.java
@@ -5,27 +5,19 @@ import cn.hutool.core.util.IdUtil;
import cn.hutool.core.util.StrUtil;
import com.ai.da.common.config.exception.BusinessException;
import com.ai.da.model.vo.FileVO;
-import org.apache.tomcat.util.http.fileupload.FileUtils;
-import org.apache.tomcat.util.http.fileupload.IOUtils;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
-import org.springframework.util.FileSystemUtils;
import org.springframework.web.multipart.MultipartFile;
+import org.springframework.web.multipart.commons.CommonsMultipartFile;
import javax.imageio.ImageIO;
-import javax.servlet.http.HttpServletRequest;
-import javax.servlet.http.HttpServletResponse;
import java.awt.image.BufferedImage;
import java.io.*;
import java.net.URL;
-import java.security.MessageDigest;
import java.text.DecimalFormat;
import java.text.SimpleDateFormat;
import java.util.*;
-//import org.apache.poi.util.IOUtils;
-//import org.apache.poi.xssf.streaming.SXSSFSheet;
-
public class FileUtil extends cn.hutool.core.io.FileUtil {
private static final Logger log = LoggerFactory.getLogger(com.ai.da.common.utils.FileUtil.class);
@@ -297,5 +289,20 @@ public class FileUtil extends cn.hutool.core.io.FileUtil {
return files;
}
+ // 判断文件是否存在
+ public static boolean isFileExists(String filePath) {
+ File file = new File(filePath);
+ return file.exists() && file.isFile();
+ }
+
+ // 根据路径获取文件
+ public static File getFile(String filePath) {
+ File file = new File(filePath);
+ if (file.exists() && file.isFile()) {
+ return file;
+ } else {
+ return null;
+ }
+ }
}
diff --git a/src/main/java/com/ai/da/common/utils/MinioUtil.java b/src/main/java/com/ai/da/common/utils/MinioUtil.java
index 17bc7b28..09a3fbaa 100644
--- a/src/main/java/com/ai/da/common/utils/MinioUtil.java
+++ b/src/main/java/com/ai/da/common/utils/MinioUtil.java
@@ -172,6 +172,31 @@ public class MinioUtil {
return fileName;
}
+// public String upload(String bucketName, String path, File file) {
+// InputStream in = null;
+// try {
+// in = new FileInputStream(file);
+// minioClient.putObject(PutObjectArgs.builder()
+// .bucket(bucketName)
+// .object(path)
+// .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();
+// }
+// }
+// }
+// return fileName;
+// }
+
/**
* description: 下载文件
*
diff --git a/src/main/java/com/ai/da/controller/LibraryController.java b/src/main/java/com/ai/da/controller/LibraryController.java
index 335bc9db..c8a456be 100644
--- a/src/main/java/com/ai/da/controller/LibraryController.java
+++ b/src/main/java/com/ai/da/controller/LibraryController.java
@@ -143,6 +143,7 @@ public class LibraryController {
String day = DateUtil.dateToStr(new Date(), DateUtil.YYYYMM);
return rootPath + day + File.separator + "tmp" + File.separator + userId + File.separator+ UUID.randomUUID().toString();
}
+
private String calculateTemplateUrl(File uploadFile){
String linuxDomain = fileProperties.getLinuxDomain();
if (!StringUtils.isEmpty(linuxDomain)) {
diff --git a/src/main/java/com/ai/da/controller/WorkspaceController.java b/src/main/java/com/ai/da/controller/WorkspaceController.java
index 1b7eed71..622dcd58 100644
--- a/src/main/java/com/ai/da/controller/WorkspaceController.java
+++ b/src/main/java/com/ai/da/controller/WorkspaceController.java
@@ -99,5 +99,13 @@ public class WorkspaceController {
return Response.success(modelsVO);
}
+
+ @PostMapping("system_file_copy")
+ @ApiOperationSupport(order = 7)
+ @ApiOperation(value = "文件复制", notes = "传入id")
+ public Response systemFileCopy() {
+ workspaceService.systemFileCopy();
+ return Response.success(true);
+ }
}
diff --git a/src/main/java/com/ai/da/mapper/entity/SysFile.java b/src/main/java/com/ai/da/mapper/entity/SysFile.java
index 5072ab10..c5363ad4 100644
--- a/src/main/java/com/ai/da/mapper/entity/SysFile.java
+++ b/src/main/java/com/ai/da/mapper/entity/SysFile.java
@@ -67,6 +67,8 @@ public class SysFile implements Serializable {
*/
private Date updateDate;
+ private Integer isCopy;
+
public SysFile() {
}
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 051121ab..28369909 100644
--- a/src/main/java/com/ai/da/model/enums/Position.java
+++ b/src/main/java/com/ai/da/model/enums/Position.java
@@ -10,7 +10,12 @@ import com.fasterxml.jackson.annotation.JsonValue;
public enum Position implements IEnumDisplay {
OVERALL("Overall"),
- SINGLE("Single")
+ OUTWEAR("Outwear"),
+ BLOUSE("Blouse"),
+ DRESS("Dress"),
+ TROUSERS("Trousers"),
+ SKIRT("Skirt")
+// 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 c962c604..6169402b 100644
--- a/src/main/java/com/ai/da/model/enums/Sex.java
+++ b/src/main/java/com/ai/da/model/enums/Sex.java
@@ -9,8 +9,10 @@ import com.fasterxml.jackson.annotation.JsonValue;
*/
public enum Sex implements IEnumDisplay {
- MALE("Male"),
FEMALE("Female"),
+
+ MALE("Male"),
+
CHILD("Child")
;
diff --git a/src/main/java/com/ai/da/model/vo/UserLikeVO.java b/src/main/java/com/ai/da/model/vo/UserLikeVO.java
index 3b87ee3a..b1d04eae 100644
--- a/src/main/java/com/ai/da/model/vo/UserLikeVO.java
+++ b/src/main/java/com/ai/da/model/vo/UserLikeVO.java
@@ -18,4 +18,7 @@ public class UserLikeVO {
private Long designItemId;
@ApiModelProperty("图片路径")
private String url;
+ @ApiModelProperty("图片路径")
+ private String designOutfitUrl;
+
}
diff --git a/src/main/java/com/ai/da/service/WorkspaceService.java b/src/main/java/com/ai/da/service/WorkspaceService.java
index 3ca2ff36..ad123563 100644
--- a/src/main/java/com/ai/da/service/WorkspaceService.java
+++ b/src/main/java/com/ai/da/service/WorkspaceService.java
@@ -38,4 +38,6 @@ public interface WorkspaceService extends IService {
Workspace getByIdNew(Long id);
List getMannequins();
+
+ void systemFileCopy();
}
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 74c4d3e4..d515408e 100644
--- a/src/main/java/com/ai/da/service/impl/DesignServiceImpl.java
+++ b/src/main/java/com/ai/da/service/impl/DesignServiceImpl.java
@@ -5,9 +5,11 @@ 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.CollectionLevel1TypeEnum;
+import com.ai.da.common.enums.SingleOverallEnum;
import com.ai.da.common.enums.SysFileLevel2TypeEnum;
import com.ai.da.common.utils.*;
import com.ai.da.mapper.DesignMapper;
+import com.ai.da.mapper.TDesignPythonOutfitMapper;
import com.ai.da.mapper.entity.*;
import com.ai.da.mapper.entity.Collection;
import com.ai.da.model.dto.*;
@@ -18,6 +20,7 @@ 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;
import com.alibaba.fastjson.JSONArray;
import com.alibaba.fastjson.JSONObject;
import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
@@ -25,12 +28,14 @@ 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;
import org.springframework.util.StringUtils;
import javax.annotation.Resource;
+import javax.validation.constraints.NotBlank;
import java.io.File;
import java.math.BigDecimal;
import java.util.*;
@@ -82,6 +87,14 @@ public class DesignServiceImpl extends ServiceImpl impleme
@Resource
private DesignItemDetailPrintService designItemDetailPrintService;
+ @Resource
+ private TDesignPythonOutfitMapper designPythonOutfitMapper;
+
+ @Value("${minio.endpoint}")
+ private String endpoint;
+ @Value("${minio.bucketName.results}")
+ private String bucketName;
+
// @Transactional
@Override
public DesignCollectionVO designCollection(DesignCollectionDTO designDTO) {
@@ -297,7 +310,7 @@ public class DesignServiceImpl extends ServiceImpl impleme
List reLationelementIds = reLationelements.stream().map(CollectionElement::getId).collect(Collectors.toList());
handleCollectionElementRelation(collectionId, (null == collectionIdParam) ? false : true, reLationelementIds);
//保存python返回信息
- return savePythonDesignItemAndDetail(pythonObjects, designId, collectionId, userInfo, designDTO.getTimeZone(), responseJSONObject);
+ return savePythonDesignItemAndDetail(pythonObjects, designId, collectionId, userInfo, designDTO.getTimeZone(), responseJSONObject, designDTO.getSingleOverall());
//保存designItem 和detail
// return saveDesignItemAndDetail(pythonObjects,designId,collectionId,userInfo,designDTO.getTimeZone());
}
@@ -401,7 +414,7 @@ public class DesignServiceImpl extends ServiceImpl impleme
private MinioUtil minIoUtil;
private DesignCollectionVO savePythonDesignItemAndDetail(DesignPythonObjects pythonObjects
- , Long designId, Long collectionId, AuthPrincipalVo userInfo, String timeZone, JSONObject responseJSONObject) {
+ , Long designId, Long collectionId, AuthPrincipalVo userInfo, String timeZone, JSONObject responseJSONObject, String singleOverall) {
DesignCollectionVO response = new DesignCollectionVO();
response.setDesignId(designId);
response.setCollectionId(collectionId);
@@ -433,11 +446,11 @@ public class DesignServiceImpl extends ServiceImpl impleme
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<>();
+ DesignCollectionItemVO designCollectionItemVO = new DesignCollectionItemVO();
for (int i1 = 0; i1 < layers.size(); i1++) {
JSONObject jsonObject = layers.getJSONObject(i1);
TDesignPythonOutfitDetail designPythonOutfitDetail = new TDesignPythonOutfitDetail();
@@ -470,13 +483,15 @@ public class DesignServiceImpl extends ServiceImpl impleme
// }
designPythonOutfitDetail.setImageSize(jsonObject.getString("image_size"));
designPythonOutfitDetail.setImageUrl(jsonObject.getString("image_url"));
+ if (singleOverall.equals(SingleOverallEnum.SINGLE.getRealName())) {
+ designCollectionItemVO.setDesignItemUrl(designItem.getDesignUrl());
+ }
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());
@@ -666,15 +681,28 @@ public class DesignServiceImpl extends ServiceImpl impleme
collectionElementService.relationCollection(newElementIds, userLikeGroup.getCollectionId());
//处理关联关系,修复element覆盖得情况
handleCollectionElementRelation(userLikeGroup.getCollectionId(), false, newElementIds);
+
+ QueryWrapper qw = new QueryWrapper<>();
+ qw.lambda().eq(TDesignPythonOutfit::getDesignItemId, designLikeDTO.getDesignItemId());
+ List tDesignPythonOutfits = designPythonOutfitMapper.selectList(qw);
+ if (CollectionUtils.isEmpty(tDesignPythonOutfits)) {
+ throw new BusinessException("DesignItemId not found elements for ax elements to like! ["+designLikeDTO.getDesignItemId());
+ }
UserLike userLike = resolveUserLike(designLikeDTO.getUserGroupId(), designItem.getDesignId(),
- designLikeDTO.getDesignItemId(), designItem.getDesignUrl(), designLikeDTO.getTimeZone());
+ designLikeDTO.getDesignItemId(), tDesignPythonOutfits.get(0).getDesignUrl(), designLikeDTO.getTimeZone());
userLikeService.save(userLike);
groupDetailId = userLike.getId();
} else {
//第一次like
userGroupId = userLikeGroupService.insertUserGroup(userInfo.getId(), designItem.getCollectionId(), designLikeDTO.getTimeZone());
+ QueryWrapper qw = new QueryWrapper<>();
+ qw.lambda().eq(TDesignPythonOutfit::getDesignItemId, designLikeDTO.getDesignItemId());
+ List tDesignPythonOutfits = designPythonOutfitMapper.selectList(qw);
+ if (CollectionUtils.isEmpty(tDesignPythonOutfits)) {
+ throw new BusinessException("DesignItemId not found elements for ax elements to like! ["+designLikeDTO.getDesignItemId());
+ }
UserLike userLike = resolveUserLike(userGroupId,
- designItem.getDesignId(), designLikeDTO.getDesignItemId(), designItem.getDesignUrl(), designLikeDTO.getTimeZone());
+ designItem.getDesignId(), designLikeDTO.getDesignItemId(), tDesignPythonOutfits.get(0).getDesignUrl(), designLikeDTO.getTimeZone());
userLikeService.save(userLike);
groupDetailId = userLike.getId();
}
diff --git a/src/main/java/com/ai/da/service/impl/UserLikeGroupServiceImpl.java b/src/main/java/com/ai/da/service/impl/UserLikeGroupServiceImpl.java
index a538e043..844c4e65 100644
--- a/src/main/java/com/ai/da/service/impl/UserLikeGroupServiceImpl.java
+++ b/src/main/java/com/ai/da/service/impl/UserLikeGroupServiceImpl.java
@@ -3,6 +3,7 @@ package com.ai.da.service.impl;
import com.ai.da.common.context.UserContext;
import com.ai.da.common.utils.CopyUtil;
import com.ai.da.common.utils.DateUtil;
+import com.ai.da.common.utils.MinioUtil;
import com.ai.da.mapper.UserLikeGroupMapper;
import com.ai.da.mapper.entity.Account;
import com.ai.da.mapper.entity.UserLikeGroup;
@@ -40,6 +41,9 @@ public class UserLikeGroupServiceImpl extends ServiceImpl userLikeVOS = userLikeService.getGroupDetail(userGroupId);
+ userLikeVOS.forEach(o -> {
+ if (o.getUrl().startsWith("aida-")) {
+ o.setDesignOutfitUrl(minioUtil.getPresignedUrl(o.getUrl(), 5));
+ }
+ });
UserLikeCollectionVO userLikeCollection = collectionService.chooseCollection(group.getCollectionId());
return new UserLikeChooseVO(userGroupId,userLikeVOS,userLikeCollection);
}
diff --git a/src/main/java/com/ai/da/service/impl/UserLikeServiceImpl.java b/src/main/java/com/ai/da/service/impl/UserLikeServiceImpl.java
index ab41d898..c0900522 100644
--- a/src/main/java/com/ai/da/service/impl/UserLikeServiceImpl.java
+++ b/src/main/java/com/ai/da/service/impl/UserLikeServiceImpl.java
@@ -41,12 +41,13 @@ public class UserLikeServiceImpl extends ServiceImpl i
if(CollectionUtils.isEmpty(userLikes)){
return Lists.newArrayList();
}
- List designItemIds = userLikes.stream().map(UserLike::getDesignItemId).collect(Collectors.toList());
- List designItems = designItemService.listByIds(designItemIds);
- Map idToUrlMap = designItems.stream().collect(Collectors.toMap(DesignItem::getId,DesignItem::getDesignUrl));
- return CopyUtil.copyList(userLikes,UserLikeVO.class,(o,d) ->{
- d.setUrl(idToUrlMap.get(o.getDesignItemId()));
- });
+ return CopyUtil.copyList(userLikes,UserLikeVO.class);
+// List designItemIds = userLikes.stream().map(UserLike::getDesignItemId).collect(Collectors.toList());
+// List designItems = designItemService.listByIds(designItemIds);
+// Map idToUrlMap = designItems.stream().collect(Collectors.toMap(DesignItem::getId,DesignItem::getDesignUrl));
+// return CopyUtil.copyList(userLikes,UserLikeVO.class,(o,d) ->{
+// d.setUrl(idToUrlMap.get(o.getDesignItemId()));
+// });
}
@Override
diff --git a/src/main/java/com/ai/da/service/impl/WorkspaceServiceImpl.java b/src/main/java/com/ai/da/service/impl/WorkspaceServiceImpl.java
index 47a121e2..bc71213d 100644
--- a/src/main/java/com/ai/da/service/impl/WorkspaceServiceImpl.java
+++ b/src/main/java/com/ai/da/service/impl/WorkspaceServiceImpl.java
@@ -6,6 +6,7 @@ import com.ai.da.common.enums.LibraryLevel1TypeEnum;
import com.ai.da.common.enums.SysFileLevel1TypeEnum;
import com.ai.da.common.enums.SysFileLevel2TypeEnum;
import com.ai.da.common.response.PageBaseResponse;
+import com.ai.da.common.utils.FileUtil;
import com.ai.da.common.utils.MinioUtil;
import com.ai.da.mapper.LibraryMapper;
import com.ai.da.mapper.SysFileMapper;
@@ -26,9 +27,19 @@ 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.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
+import org.apache.commons.fileupload.FileItem;
+import org.apache.commons.fileupload.FileItemFactory;
+import org.apache.commons.fileupload.disk.DiskFileItemFactory;
import org.springframework.stereotype.Service;
import org.springframework.util.CollectionUtils;
+import org.springframework.web.multipart.MultipartFile;
+import org.springframework.web.multipart.commons.CommonsMultipartFile;
+
import javax.annotation.Resource;
+import java.io.File;
+import java.io.FileInputStream;
+import java.io.IOException;
+import java.io.OutputStream;
import java.util.ArrayList;
import java.util.List;
@@ -216,6 +227,50 @@ public class WorkspaceServiceImpl extends ServiceImpl sysFileQueryWrapper = new QueryWrapper<>();
+ List sysFiles = sysFileMapper.selectList(sysFileQueryWrapper);
+ sysFiles.forEach(o -> {
+ String url = o.getUrl();
+ String[] downloads = url.split("/download/");
+ if (downloads.length == 2) {
+ String path = "/workspace/home/aida/file/" + downloads[1];
+ File file = FileUtil.getFile("");
+ if (file != null) {
+ String uploadMinioPath = o.getLevel1Type().toLowerCase() + "/" + o.getLevel2Type().toLowerCase() + "/" + file.getName();
+ String bucketName = "aida-sys-image";
+ FileItem a = getMultipartFile(file, "A");
+ MultipartFile multipartFile = new CommonsMultipartFile(a);
+ minioUtil.upload(bucketName, uploadMinioPath, multipartFile);
+ }
+ }
+ });
+ }
+
+ private FileItem getMultipartFile(File file, String fieldName){
+ // 使用 DiskFileItemFactory 创建一个 FileItemFactory
+ FileItemFactory factory = new DiskFileItemFactory(16, null);
+
+ // 使用 FileItemFactory 创建一个 FileItem 对象
+ FileItem item = factory.createItem(fieldName, "text/plain", true, file.getName());
+
+ byte[] buffer = new byte[8192];
+ int bytesRead;
+
+ try (FileInputStream fis = new FileInputStream(file);
+ OutputStream os = item.getOutputStream()) {
+ // 从文件中读取数据并写入 FileItem
+ while ((bytesRead = fis.read(buffer)) != -1) {
+ os.write(buffer, 0, bytesRead);
+ }
+ } catch (IOException e) {
+ e.printStackTrace();
+ }
+
+ return item;
+ }
+
private List getEnumValues(Class clazz) {
List kvs = new ArrayList();
IEnumDisplay[] items = (IEnumDisplay[]) clazz.getEnumConstants();