TASK:designSingle 添加多件衣服并允许添加相同类型的服装

This commit is contained in:
2023-12-13 10:45:52 +08:00
parent 4e3746cfba
commit 51548b52ba
12 changed files with 77 additions and 32 deletions

View File

@@ -84,6 +84,11 @@ public class DesignItemDetail implements Serializable {
*/ */
private String printJson; private String printJson;
/**
* item的优先级
*/
private Integer priority;
/** /**
* 创建时间 * 创建时间
*/ */

View File

@@ -86,6 +86,11 @@ public class TDesignPythonOutfitDetail implements Serializable {
*/ */
@ApiModelProperty(value = "用户ID") @ApiModelProperty(value = "用户ID")
private Long userId; private Long userId;
/**
* 图层优先级
*/
@ApiModelProperty(value = "图层优先级")
private Integer priority;
/** /**
* 创建时间 * 创建时间
*/ */

View File

@@ -14,6 +14,7 @@ public class DesignSingleIncludeLayersDTO {
@NotNull(message = "designItemId.cannot.be.empty") @NotNull(message = "designItemId.cannot.be.empty")
private Long designItemId; private Long designItemId;
@NotNull
private List<DesignSingleItemDTO> designSingleItemDTOList; private List<DesignSingleItemDTO> designSingleItemDTOList;
@NotNull(message = "isPreview.cannot.be.empty") @NotNull(message = "isPreview.cannot.be.empty")

View File

@@ -4,12 +4,13 @@ import io.swagger.annotations.ApiModelProperty;
import lombok.Data; import lombok.Data;
import javax.validation.constraints.NotBlank; import javax.validation.constraints.NotBlank;
import javax.validation.constraints.NotNull;
import java.util.List; import java.util.List;
@Data @Data
public class DesignSingleItemDTO { public class DesignSingleItemDTO {
@NotBlank(message = "id.cannot.be.empty") @NotNull(message = "id.cannot.be.empty")
@ApiModelProperty("切换图片对应的id") @ApiModelProperty("切换图片对应的id")
private Long id; private Long id;
@@ -33,4 +34,8 @@ public class DesignSingleItemDTO {
@ApiModelProperty("图层缩放比例") @ApiModelProperty("图层缩放比例")
private Float scale; private Float scale;
@NotNull(message = "priority.cannot.be.empty")
@ApiModelProperty("图层优先级")
private Integer priority;
} }

View File

@@ -57,7 +57,7 @@ public class DesignPythonOutfitVO {
@ApiModelProperty(value = "缩放比例") @ApiModelProperty(value = "缩放比例")
private Float scale = 1.0f; private Float scale = 1.0f;
/** /**
* 图层优先级 从1开始优先级数字越大越靠近上层 * 图层优先级 从10开始,优先级数字越大越靠近上层
*/ */
private Integer priority; private Integer priority;
} }

View File

@@ -1940,11 +1940,12 @@ public class PythonService {
designSingleItem.getPath(), designSingleItem.getPath(),
designSingleItem.getColor(), designSingleItem.getColor(),
resolveDesignSinglePrint(designSingleItem.getPrintObject(), designSingleItem.getPath()), resolveDesignSinglePrint(designSingleItem.getPrintObject(), designSingleItem.getPath()),
// todo businessId 待确认 // businessId designItemDetailId python端确认没有作用,但是数据库需要存,作用:未知)
designSingleItem.getId(), designSingleItem.getId(),
pythonTAllInfoService.getImageIdByPath(designSingleItem.getPath()), pythonTAllInfoService.getImageIdByPath(designSingleItem.getPath()),
designSingleItem.getOffset(), designSingleItem.getOffset(),
designSingleItem.getScale())); designSingleItem.getScale(),
designSingleItem.getPriority()));
}); });

View File

@@ -36,4 +36,6 @@ public class DesignPythonBasic {
private Map<String, List<Integer>> body_point_test = Maps.newHashMap(); private Map<String, List<Integer>> body_point_test = Maps.newHashMap();
private Boolean layer_order = Boolean.TRUE;
} }

View File

@@ -69,6 +69,10 @@ public class DesignPythonItem {
* 图层缩放大小 * 图层缩放大小
*/ */
private Float resize_scale; private Float resize_scale;
/**
* 图层优先级
*/
private Integer priority;
public static List<String> OUTWEAR_DRESS_BLOUSE = Arrays.asList(CollectionLevel2TypeEnum.OUTWEAR.getRealName(), public static List<String> OUTWEAR_DRESS_BLOUSE = Arrays.asList(CollectionLevel2TypeEnum.OUTWEAR.getRealName(),
@@ -106,7 +110,7 @@ public class DesignPythonItem {
this.image_id = image_id; this.image_id = image_id;
} }
public DesignPythonItem(String type, String path, String color, DesignPythonItemPrint print, Long businessId, Long image_id, List<Long> offset, Float resize_scale) { public DesignPythonItem(String type, String path, String color, DesignPythonItemPrint print, Long businessId, Long image_id, List<Long> offset, Float resize_scale,Integer priority) {
this.type = type; this.type = type;
this.path = path; this.path = path;
this.color = color; this.color = color;
@@ -116,6 +120,7 @@ public class DesignPythonItem {
this.image_id = image_id; this.image_id = image_id;
this.offset = offset; this.offset = offset;
this.resize_scale = resize_scale; this.resize_scale = resize_scale;
this.priority = priority;
} }
public DesignPythonItem(String type, String path, String color, DesignPythonItemPrint print, String icon, Long businessId, Long image_id) { public DesignPythonItem(String type, String path, String color, DesignPythonItemPrint print, String icon, Long businessId, Long image_id) {

View File

@@ -322,11 +322,13 @@ public class DesignItemServiceImpl extends ServiceImpl<DesignItemMapper, DesignI
designItemDetail.setDesignId(designId); designItemDetail.setDesignId(designId);
designItemDetail.setDesignItemId(designItemId); designItemDetail.setDesignItemId(designItemId);
designItemDetail.setCollectionElementId(detail.getElementId()); designItemDetail.setCollectionElementId(detail.getElementId());
designItemDetail.setPriority(detail.getPriority());
designItemDetail.setCreateDate(DateUtil.getByTimeZone(timeZone)); designItemDetail.setCreateDate(DateUtil.getByTimeZone(timeZone));
if (SysFileLevel2TypeEnum.BODY.getRealName().equals(detail.getType())) { if (SysFileLevel2TypeEnum.BODY.getRealName().equals(detail.getType())) {
designItemDetail.setPath(detail.getBody_path()); designItemDetail.setPath(detail.getBody_path());
//BODY不关联businessId //BODY不关联businessId
designItemDetail.setBusinessId(0L); designItemDetail.setBusinessId(0L);
designItemDetail.setPriority(0);
} }
designItemDetail.setIconPath(detail.getIcon()); designItemDetail.setIconPath(detail.getIcon());
DesignPythonItemPrint printObject = detail.getPrint(); DesignPythonItemPrint printObject = detail.getPrint();
@@ -354,10 +356,13 @@ public class DesignItemServiceImpl extends ServiceImpl<DesignItemMapper, DesignI
// 7、将新生成的图层信息存入designPythonOutfitDetail表 // 7、将新生成的图层信息存入designPythonOutfitDetail表
JSONArray layers = outfit.getJSONArray("layers"); JSONArray layers = outfit.getJSONArray("layers");
// 需要将request中的offset也存入数据库通过type与image_category将sketch与layers关联
Map<String, List<Long>> typeOffset = designSingleItemDTOList.stream() // 需要将request中的offset也存入数据库通过priority与image_category将sketch与layers关联
.collect(Collectors.toMap(d -> d.getType().toLowerCase(), DesignSingleItemDTO::getOffset)); // Map<String, List<Long>> typeOffset = designSingleItemDTOList.stream()
List<TDesignPythonOutfitDetail> list = setTDesignPythonOutfitDetailList(layers, designId, designPythonOutfit.getId(), userInfo.getId(), typeOffset); // .collect(Collectors.toMap(d -> d.getType().toLowerCase(), DesignSingleItemDTO::getOffset));
Map<Integer, List<Long>> priorityOffset = designSingleItemDTOList.stream()
.collect(Collectors.toMap(DesignSingleItemDTO::getPriority, DesignSingleItemDTO::getOffset));
List<TDesignPythonOutfitDetail> list = setTDesignPythonOutfitDetailList(layers, designId, designPythonOutfit.getId(), userInfo.getId(), priorityOffset);
designPythonOutfitDetailService.saveBatch(list); designPythonOutfitDetailService.saveBatch(list);
@@ -366,7 +371,7 @@ public class DesignItemServiceImpl extends ServiceImpl<DesignItemMapper, DesignI
public List<TDesignPythonOutfitDetail> setTDesignPythonOutfitDetailList(JSONArray layers, Long designId, public List<TDesignPythonOutfitDetail> setTDesignPythonOutfitDetailList(JSONArray layers, Long designId,
Long designPythonOutfitId, Long userId, Long designPythonOutfitId, Long userId,
Map<String, List<Long>> typeOffset) { Map<Integer, List<Long>> priorityOffset) {
// 设置图层信息; // 设置图层信息;
List<TDesignPythonOutfitDetail> list = new ArrayList<>(); List<TDesignPythonOutfitDetail> list = new ArrayList<>();
for (int i = 0; i < layers.size(); i++) { for (int i = 0; i < layers.size(); i++) {
@@ -381,7 +386,8 @@ public class DesignItemServiceImpl extends ServiceImpl<DesignItemMapper, DesignI
designPythonOutfitDetail.setMaskUrl(jsonObject.getString("mask_url")); designPythonOutfitDetail.setMaskUrl(jsonObject.getString("mask_url"));
designPythonOutfitDetail.setScale(Objects.isNull(jsonObject.getString("resize_scale")) ? "1.0" : jsonObject.getString("resize_scale")); designPythonOutfitDetail.setScale(Objects.isNull(jsonObject.getString("resize_scale")) ? "1.0" : jsonObject.getString("resize_scale"));
designPythonOutfitDetail.setUserId(userId); designPythonOutfitDetail.setUserId(userId);
designPythonOutfitDetail.setOffset(String.valueOf(typeOffset.get(jsonObject.getString("image_category").split("_")[0]))); designPythonOutfitDetail.setOffset(String.valueOf(priorityOffset.get(Math.abs(Integer.parseInt(jsonObject.getString("priority"))))));
designPythonOutfitDetail.setPriority((Integer) jsonObject.get("priority"));
list.add(designPythonOutfitDetail); list.add(designPythonOutfitDetail);
} }
return list; return list;
@@ -458,23 +464,33 @@ public class DesignItemServiceImpl extends ServiceImpl<DesignItemMapper, DesignI
throw new BusinessException("python response data is null"); throw new BusinessException("python response data is null");
} }
JSONObject outfit = data.getJSONObject("0"); JSONObject outfit = data.getJSONObject("0");
// 通过type将offset关联到layers // 通过priority将offset关联到layers
Map<String, List<Long>> typeOffset = designSingleIncludeLayersDTO.getDesignSingleItemDTOList().stream() // Map<String, List<Long>> typeOffset = designSingleIncludeLayersDTO.getDesignSingleItemDTOList().stream()
.collect(Collectors.toMap(d -> d.getType().toLowerCase(), DesignSingleItemDTO::getOffset)); // .collect(Collectors.toMap(d -> d.getType().toLowerCase(), DesignSingleItemDTO::getOffset));
Map<Integer, List<Long>> priorityOffset = new HashMap<>();
try{
priorityOffset = designSingleIncludeLayersDTO.getDesignSingleItemDTOList().stream()
.collect(Collectors.toMap(DesignSingleItemDTO::getPriority, DesignSingleItemDTO::getOffset));
}catch (IllegalStateException e){
// priority重复
log.info("服装的priority重复");
throw new BusinessException("priority.cannot.be.repeated");
}
if (!designSingleIncludeLayersDTO.getIsPreview()) { if (!designSingleIncludeLayersDTO.getIsPreview()) {
// 更新及保存图层信息 // 更新及保存图层信息
tDesignPythonOutfitDetails = saveDesignSingleItemDetailAndLayers(objects, design.getId(), designSingleIncludeLayersDTO.getDesignItemId(), tDesignPythonOutfitDetails = saveDesignSingleItemDetailAndLayers(objects, design.getId(), designSingleIncludeLayersDTO.getDesignItemId(),
userInfo, outfit, designSingleIncludeLayersDTO.getTimeZone(), designSingleIncludeLayersDTO.getDesignSingleItemDTOList()); userInfo, outfit, designSingleIncludeLayersDTO.getTimeZone(), designSingleIncludeLayersDTO.getDesignSingleItemDTOList());
} else { } else {
JSONArray layers = outfit.getJSONArray("layers"); JSONArray layers = outfit.getJSONArray("layers");
tDesignPythonOutfitDetails = setTDesignPythonOutfitDetailList(layers, designItem.getDesignId(), null, userInfo.getId(), typeOffset); tDesignPythonOutfitDetails = setTDesignPythonOutfitDetailList(layers, designItem.getDesignId(), null, userInfo.getId(), priorityOffset);
} }
List<DesignPythonOutfitVO> detailsVO = new ArrayList<>(); List<DesignPythonOutfitVO> detailsVO = new ArrayList<>();
tDesignPythonOutfitDetails.forEach(detail -> { tDesignPythonOutfitDetails.forEach(detail -> {
String type = detail.getImageCategory().split("_")[0]; String type = detail.getImageCategory().split("_")[0];
detailsVO.add(designPythonOutfitDetailService.convertToDesignPythonOutfitVO(detail, typeOffset.get(type))); detailsVO.add(designPythonOutfitDetailService.convertToDesignPythonOutfitVO(detail, null));
}); });
TDesignPythonOutfit designPythonOutfit = designPythonOutfitService.getByDesignItemId(designSingleIncludeLayersDTO.getDesignItemId()); TDesignPythonOutfit designPythonOutfit = designPythonOutfitService.getByDesignItemId(designSingleIncludeLayersDTO.getDesignItemId());
@@ -576,7 +592,6 @@ public class DesignItemServiceImpl extends ServiceImpl<DesignItemMapper, DesignI
designSingleVO.setDesignItemUrl(designItemUrl); designSingleVO.setDesignItemUrl(designItemUrl);
// 当前全身图 // 当前全身图
designSingleVO.setCurrentFullBodyView(minioUtil.getPresignedUrl(currentFullBodyView, 24 * 60)); designSingleVO.setCurrentFullBodyView(minioUtil.getPresignedUrl(currentFullBodyView, 24 * 60));
;
designSingleVO.setClothes(clothes); designSingleVO.setClothes(clothes);
designSingleItemDTOList.forEach(singleItem -> { designSingleItemDTOList.forEach(singleItem -> {
@@ -589,7 +604,8 @@ public class DesignItemServiceImpl extends ServiceImpl<DesignItemMapper, DesignI
// designItemClothesDetailVO.setPrintObject(new DesignPythonItemPrint(singleItem.getPrintObject().getPath())); // designItemClothesDetailVO.setPrintObject(new DesignPythonItemPrint(singleItem.getPrintObject().getPath()));
designItemClothesDetailVO.setPrintObject(singleItem.getPrintObject()); designItemClothesDetailVO.setPrintObject(singleItem.getPrintObject());
designItemClothesDetailVO.setLayersObject(layersObject.stream().filter( designItemClothesDetailVO.setLayersObject(layersObject.stream().filter(
layers -> singleItem.getType().toLowerCase().equals(layers.getImageCategory().split("_")[0]) layers -> (singleItem.getType().toLowerCase().equals(layers.getImageCategory().split("_")[0])
&& singleItem.getPriority().equals(layers.getPriority()))
).collect(Collectors.toList())); ).collect(Collectors.toList()));
body.setLayersObject(layersObject.stream().filter(layers -> layers.getImageCategory().equals("body")).collect(Collectors.toList())); body.setLayersObject(layersObject.stream().filter(layers -> layers.getImageCategory().equals("body")).collect(Collectors.toList()));
@@ -604,7 +620,7 @@ public class DesignItemServiceImpl extends ServiceImpl<DesignItemMapper, DesignI
List<DesignSingleItemDTO> designSingleItemDTOList, List<DesignSingleItemDTO> designSingleItemDTOList,
String timeZone) { String timeZone) {
Map<String, Long> designItemDetailTypeIdMap = designItemDetails.stream().collect(Collectors.toMap(DesignItemDetail::getType, DesignItemDetail::getId)); Map<Integer, Long> designItemDetailTypeIdMap = designItemDetails.stream().collect(Collectors.toMap(DesignItemDetail::getPriority, DesignItemDetail::getId));
ArrayList<DesignItemDetailPrint> designItemDetailPrints = new ArrayList<>(); ArrayList<DesignItemDetailPrint> designItemDetailPrints = new ArrayList<>();
designSingleItemDTOList.forEach(designSingleItem -> { designSingleItemDTOList.forEach(designSingleItem -> {
@@ -617,13 +633,13 @@ public class DesignItemServiceImpl extends ServiceImpl<DesignItemMapper, DesignI
// 2、有印花添加到list // 2、有印花添加到list
printObject.getPrints().forEach(print -> { printObject.getPrints().forEach(print -> {
// 2.1 判断是否第一次添加印花,是:直接添加 // 2.1 判断是否第一次添加印花,是:直接添加
List<DesignItemDetailPrint> designItemDetailPrintList = designItemDetailPrintService.getByDesignItemDetailId(designItemDetailTypeIdMap.get(designSingleItem.getType())); List<DesignItemDetailPrint> designItemDetailPrintList = designItemDetailPrintService.getByDesignItemDetailId(designItemDetailTypeIdMap.get(designSingleItem.getPriority()));
if (!designItemDetailPrintList.isEmpty()) { if (!designItemDetailPrintList.isEmpty()) {
// 2.2 否:先删除原始印花,再添加新印花信息 // 2.2 否:先删除原始印花,再添加新印花信息
designItemDetailPrintService.deleteByDesignItemDetailId(designItemDetailTypeIdMap.get(designSingleItem.getType())); designItemDetailPrintService.deleteByDesignItemDetailId(designItemDetailTypeIdMap.get(designSingleItem.getPriority()));
} }
DesignItemDetailPrint designItemDetailPrint = new DesignItemDetailPrint(); DesignItemDetailPrint designItemDetailPrint = new DesignItemDetailPrint();
designItemDetailPrint.setDesignItemDetailId(designItemDetailTypeIdMap.get(designSingleItem.getType())); designItemDetailPrint.setDesignItemDetailId(designItemDetailTypeIdMap.get(designSingleItem.getPriority()));
designItemDetailPrint.setPath(print.getMinIOPath()); designItemDetailPrint.setPath(print.getMinIOPath());
designItemDetailPrint.setScale(print.getScale()); designItemDetailPrint.setScale(print.getScale());
designItemDetailPrint.setSingleOrOverall(printObject.getIfSingle() ? "single" : "overall"); designItemDetailPrint.setSingleOrOverall(printObject.getIfSingle() ? "single" : "overall");

View File

@@ -988,7 +988,9 @@ public class DesignServiceImpl extends ServiceImpl<DesignMapper, Design> impleme
.filter(f -> SYS_HAIRSTYLE_SHOES_BODY.contains(f.getType())) .filter(f -> SYS_HAIRSTYLE_SHOES_BODY.contains(f.getType()))
.collect(Collectors.toList()); .collect(Collectors.toList());
response.setOthers(CopyUtil.copyList(filterDetail2, DesignItemOthersDetailVO.class, (o, d) -> { response.setOthers(CopyUtil.copyList(filterDetail2, DesignItemOthersDetailVO.class, (o, d) -> {
d.setId(o.getBusinessId()); // todo 不确定businessId的作用暂时取消传递,查看影响
// d.setId(o.getBusinessId());
d.setId(0L);
d.setPath(minioUtil.getPresignedUrl(o.getPath(), 24 * 60)); d.setPath(minioUtil.getPresignedUrl(o.getPath(), 24 * 60));
d.setMinIOPath(o.getPath()); d.setMinIOPath(o.getPath());
d.setPrintObject(new DesignPythonItemPrint()); d.setPrintObject(new DesignPythonItemPrint());
@@ -1125,13 +1127,13 @@ public class DesignServiceImpl extends ServiceImpl<DesignMapper, Design> impleme
throw new BusinessException("layer.information.not.found"); throw new BusinessException("layer.information.not.found");
} }
details.forEach(detail -> { details.forEach(detail -> {
List<Long> offset = new ArrayList<>(); // List<Long> offset = new ArrayList<>();
if (StringUtil.isNullOrEmpty(detail.getOffset()) || detail.getOffset().equals("null")) { // if (StringUtil.isNullOrEmpty(detail.getOffset()) || detail.getOffset().equals("null")) {
offset = Arrays.asList(0L, 0L); // offset = Arrays.asList(0L, 0L);
} else { // } else {
offset = Arrays.stream(detail.getOffset().replaceAll("\\[|\\]", "").split(",")).map(s -> Long.parseLong(s.trim())).collect(Collectors.toList()); // offset = Arrays.stream(detail.getOffset().replaceAll("\\[|\\]", "").split(",")).map(s -> Long.parseLong(s.trim())).collect(Collectors.toList());
} // }
detailsVO.add(designPythonOutfitDetailService.convertToDesignPythonOutfitVO(detail, offset)); detailsVO.add(designPythonOutfitDetailService.convertToDesignPythonOutfitVO(detail, null));
}); });
// 2、将查询出的图层信息填充到designItemDetailVO中 // 2、将查询出的图层信息填充到designItemDetailVO中

View File

@@ -60,7 +60,9 @@ public class TDesignPythonOutfitDetailServiceImpl extends ServiceImpl<TDesignPyt
designPythonOutfitVO.setMaskUrl(StringUtil.isNullOrEmpty(detail.getMaskUrl()) ? null : minIoUtil.getPresignedUrl(detail.getMaskUrl(), 24 * 60)); designPythonOutfitVO.setMaskUrl(StringUtil.isNullOrEmpty(detail.getMaskUrl()) ? null : minIoUtil.getPresignedUrl(detail.getMaskUrl(), 24 * 60));
designPythonOutfitVO.setMaskMinioUrl(StringUtil.isNullOrEmpty(detail.getMaskUrl()) ? null : detail.getMaskUrl()); designPythonOutfitVO.setMaskMinioUrl(StringUtil.isNullOrEmpty(detail.getMaskUrl()) ? null : detail.getMaskUrl());
designPythonOutfitVO.setScale(Float.parseFloat(detail.getScale())); designPythonOutfitVO.setScale(Float.parseFloat(detail.getScale()));
designPythonOutfitVO.setOffset(CollectionUtil.isEmpty(offset) ? Arrays.asList(0L, 0L) : offset); designPythonOutfitVO.setOffset(StringUtil.isNullOrEmpty(detail.getOffset()) ? Arrays.asList(0L, 0L) : (List<Long>) JSON.parse(detail.getOffset()));
designPythonOutfitVO.setPriority(Math.abs(detail.getPriority()));
// designPythonOutfitVO.setOffset(CollectionUtil.isEmpty(offset) ? Arrays.asList(0L, 0L) : offset);
/*if (!StringUtil.isNullOrEmpty(detail.getImageSize())){ /*if (!StringUtil.isNullOrEmpty(detail.getImageSize())){
List<Long> size = Arrays.stream(detail.getImageSize().replaceAll("\\[|\\]", "").split(",")).map(s -> Long.parseLong(s.trim())).collect(Collectors.toList()); List<Long> size = Arrays.stream(detail.getImageSize().replaceAll("\\[|\\]", "").split(",")).map(s -> Long.parseLong(s.trim())).collect(Collectors.toList());

View File

@@ -128,7 +128,8 @@ layers.does.not.exists=layers does not exists.
unknown.generate.type=unknown generate type. unknown.generate.type=unknown generate type.
the.workspace.lastIndex.not.found=The workspace lastIndex not found. the.workspace.lastIndex.not.found=The workspace lastIndex not found.
gender.cannot.be.empty=gender cannot be empty. gender.cannot.be.empty=gender cannot be empty.
image.synthesis.failed=Image synthesis failed. image.synthesis.failed=image synthesis failed.
priority.cannot.be.repeated=priority cannot be repeated.
# 可能会报异常 # 可能会报异常
# Informative: # Informative: