From 5bbf1326bbd9f49c1e1fef15f90af15a9c5f868d Mon Sep 17 00:00:00 2001 From: xupei Date: Wed, 14 Jan 2026 14:26:47 +0800 Subject: [PATCH] =?UTF-8?q?TASK:design=20single=E9=83=A8=E5=88=86cv?= =?UTF-8?q?=E6=93=8D=E4=BD=9C=E5=89=8D=E7=BD=AE=EF=BC=8C=E6=96=B0=E5=A2=9E?= =?UTF-8?q?merge=20|=20default=E4=B8=A4=E7=A7=8DdesignType?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../dto/DesignSingleIncludeLayersDTO.java | 4 + .../ai/da/model/dto/DesignSingleItemDTO.java | 6 + .../com/ai/da/model/dto/PartialDesignDTO.java | 8 +- .../java/com/ai/da/python/PythonService.java | 13 +- .../ai/da/python/vo/DesignPythonBasic.java | 5 +- .../com/ai/da/python/vo/DesignPythonItem.java | 10 +- .../com/ai/da/service/DesignItemService.java | 2 +- .../service/impl/DesignItemServiceImpl.java | 130 +++++++++++++++--- .../ai/da/service/impl/DesignServiceImpl.java | 2 +- src/main/resources/messages_en.properties | 1 + src/main/resources/messages_zh.properties | 1 + 11 files changed, 150 insertions(+), 32 deletions(-) diff --git a/src/main/java/com/ai/da/model/dto/DesignSingleIncludeLayersDTO.java b/src/main/java/com/ai/da/model/dto/DesignSingleIncludeLayersDTO.java index c5d5d7d9..f25423ad 100644 --- a/src/main/java/com/ai/da/model/dto/DesignSingleIncludeLayersDTO.java +++ b/src/main/java/com/ai/da/model/dto/DesignSingleIncludeLayersDTO.java @@ -43,6 +43,10 @@ public class DesignSingleIncludeLayersDTO implements Serializable { @Schema(description = "项目id") private Long projectId; + @NotBlank(message = "designType cannot be empty") + @Schema(description = "default -> 新增sketch || merge") + private String designType; + @Override public String toString() { return "DesignSingleIncludeLayersDTO{" + diff --git a/src/main/java/com/ai/da/model/dto/DesignSingleItemDTO.java b/src/main/java/com/ai/da/model/dto/DesignSingleItemDTO.java index 28520b69..e6cfcbad 100644 --- a/src/main/java/com/ai/da/model/dto/DesignSingleItemDTO.java +++ b/src/main/java/com/ai/da/model/dto/DesignSingleItemDTO.java @@ -73,4 +73,10 @@ public class DesignSingleItemDTO implements Serializable { @Schema(description = "45") private double rotate; + @Schema(description = "带overall印花未分割图片") + private String undividedLayerBase64; + + @Schema(description = "带overall/single印花未分割图片") + private String undividedLayerWithSinglePrintBase64; + } diff --git a/src/main/java/com/ai/da/model/dto/PartialDesignDTO.java b/src/main/java/com/ai/da/model/dto/PartialDesignDTO.java index fdae97e4..363824bf 100644 --- a/src/main/java/com/ai/da/model/dto/PartialDesignDTO.java +++ b/src/main/java/com/ai/da/model/dto/PartialDesignDTO.java @@ -20,17 +20,17 @@ public class PartialDesignDTO implements Serializable { @Schema(description = "图片的base64格式") private String partialDesignBase64; - @Schema(description = "图层信息") - private List layers; +/* @Schema(description = "图层信息") + private List layers;*/ public PartialDesignDTO(String partialDesignMinioPath) { this.partialDesignMinioPath = partialDesignMinioPath; } - public PartialDesignDTO(String partialDesignMinioPath, List layers) { +/* public PartialDesignDTO(String partialDesignMinioPath, List layers) { this.partialDesignMinioPath = partialDesignMinioPath; this.layers = layers; - } + }*/ public PartialDesignDTO(String partialDesignMinioPath, String partialDesignPath) { this.partialDesignMinioPath = partialDesignMinioPath; diff --git a/src/main/java/com/ai/da/python/PythonService.java b/src/main/java/com/ai/da/python/PythonService.java index 6cc059eb..fee8f999 100644 --- a/src/main/java/com/ai/da/python/PythonService.java +++ b/src/main/java/com/ai/da/python/PythonService.java @@ -2789,7 +2789,7 @@ public class PythonService { DesignPythonObject pythonObject = new DesignPythonObject(); designPythonObjects.setProcess_id(designSingleDTO.getProcessId()); pythonObject.setItems(coverToDesignSinglePythonItem(designSingleDTO, designLibraryModelPoint, singleOverall)); - pythonObject.setBasic(coverToSingleBasic(singleOverall, switchCategory, designLibraryModelPoint, previewOrSubmit)); + pythonObject.setBasic(coverToSingleBasic(singleOverall, switchCategory, designLibraryModelPoint, designSingleDTO.getDesignType())); objects.add(pythonObject); return designPythonObjects; } @@ -2855,6 +2855,9 @@ public class PythonService { designSingleItem.getPartialDesign().getPartialDesignMinioPath()); resolveDesignElement(designSingleItem.getTrims(), printToPython); log.info("组装参数【服装:{}的maskUrl: {}】",designSingleItem.getType(), designSingleItem.getMaskUrl()); + + String mergeImagePath = !StringUtil.isNullOrEmpty(printToPython.getPartial()) + ? printToPython.getPartial() : designSingleItem.getPath(); response.add(new DesignPythonItem( designSingleItem.getType(), designSingleItem.getPath(), @@ -2871,7 +2874,8 @@ public class PythonService { gradientString, designSingleItem.getMaskUrl(), designSingleItem.getTranspose(), - designSingleItem.getRotate() + designSingleItem.getRotate(), + mergeImagePath )); }); @@ -3049,7 +3053,7 @@ public class PythonService { */ private DesignPythonBasic coverToSingleBasic(String singleOverall, String switchCategory, DesignLibraryModelPointVO designLibraryModelPoint, - String previewOrSubmit) { + String designType) { DesignPythonBasic basic = new DesignPythonBasic(); basic.setSingle_overall(singleOverall); basic.setSwitch_category(switchCategory); @@ -3061,7 +3065,8 @@ public class PythonService { basic.setScale_earrings(0.16); basic.setBody_point_test(getMap(designLibraryModelPoint)); basic.setLayer_order(Boolean.TRUE); - basic.setPreview_submit(previewOrSubmit); +// basic.setPreview_submit(previewOrSubmit); + basic.setDesign_type(designType); return basic; } diff --git a/src/main/java/com/ai/da/python/vo/DesignPythonBasic.java b/src/main/java/com/ai/da/python/vo/DesignPythonBasic.java index e0edad78..0e9b7130 100644 --- a/src/main/java/com/ai/da/python/vo/DesignPythonBasic.java +++ b/src/main/java/com/ai/da/python/vo/DesignPythonBasic.java @@ -16,7 +16,7 @@ public class DesignPythonBasic { private String single_overall; - private String preview_submit; +// private String preview_submit; private String switch_category; /** @@ -40,4 +40,7 @@ public class DesignPythonBasic { private Boolean layer_order = Boolean.FALSE; + // default | merge + private String design_type = "default"; + } 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 ef5850ab..0d3d7cf0 100644 --- a/src/main/java/com/ai/da/python/vo/DesignPythonItem.java +++ b/src/main/java/com/ai/da/python/vo/DesignPythonItem.java @@ -97,6 +97,12 @@ public class DesignPythonItem { */ private double rotate; + /** + * 前端处理了print之后的结果图,python对该图进行分割 + * designType为merge时,该字段必须有值,否则会导致python端没有数据返回 + */ + private String merge_image_path; + public static List OUTWEAR_DRESS_BLOUSE = Arrays.asList(CollectionLevel2TypeEnum.OUTWEAR.getRealName(), CollectionLevel2TypeEnum.DRESS.getRealName(), CollectionLevel2TypeEnum.BLOUSE.getRealName()); @@ -153,7 +159,8 @@ public class DesignPythonItem { public DesignPythonItem(String type, String path, String color, PrintToPython print, Long businessId, Long image_id, List offset, Float[] resize_scale, Integer priority, String gradient, - String gradientString, String seg_mask_url, int[] transpose, double rotate) { + String gradientString, String seg_mask_url, int[] transpose, double rotate, + String merge_image_path) { this.type = type; this.path = path; this.color = color; @@ -169,6 +176,7 @@ public class DesignPythonItem { this.seg_mask_url = seg_mask_url; this.transpose = transpose; this.rotate = rotate; + this.merge_image_path = merge_image_path; } public DesignPythonItem(String type, String path, String color, PrintToPython print, String icon, Long businessId, Long image_id) { diff --git a/src/main/java/com/ai/da/service/DesignItemService.java b/src/main/java/com/ai/da/service/DesignItemService.java index 2fa7cc1e..77488d87 100644 --- a/src/main/java/com/ai/da/service/DesignItemService.java +++ b/src/main/java/com/ai/da/service/DesignItemService.java @@ -53,7 +53,7 @@ public interface DesignItemService extends IService { DesignSingleVO designSingleIncludeLayers(DesignSingleIncludeLayersDTO designSingleIncludeLayersDTO); - Map> setPriorityAndUndividedLayer(JSONArray layers); + Map> setPriorityAndUndividedLayer(JSONArray layers, DesignSingleIncludeLayersDTO designSingleIncludeLayersDTO); Map setTypeAndUndividedLayer(JSONArray layers); diff --git a/src/main/java/com/ai/da/service/impl/DesignItemServiceImpl.java b/src/main/java/com/ai/da/service/impl/DesignItemServiceImpl.java index 8cd803a8..10f382dc 100644 --- a/src/main/java/com/ai/da/service/impl/DesignItemServiceImpl.java +++ b/src/main/java/com/ai/da/service/impl/DesignItemServiceImpl.java @@ -365,7 +365,7 @@ public class DesignItemServiceImpl extends ServiceImpl designSingleItemDTOList , Map> priorityAndUndividedLayer , boolean changeModelFlag - , Long modelId, String modelType, boolean isSingleCollectionFlag) { + , Long modelId, String modelType, boolean isSingleCollectionFlag, String designType) { DesignItem designItem = new DesignItem(); // String url = pythonObjects.getObjects().get(0).getBasic().getSave_name(); @@ -425,9 +425,12 @@ public class DesignItemServiceImpl extends ServiceImpl priorityMask = null; + // 如果是merge模式 则使用入参中的mask + if (designType.equals("merge")) { + priorityMask = designSingleItemDTOList.stream() + .collect(Collectors.toMap(DesignSingleItemDTO::getPriority, DesignSingleItemDTO::getMaskMinioUrl)); + } + List list = new ArrayList<>(); for (int i = 0; i < layers.size(); i++) { JSONObject jsonObject = layers.getJSONObject(i); @@ -502,7 +514,12 @@ public class DesignItemServiceImpl extends ServiceImpl " + JSONObject.toJSONString(clone)); @@ -802,7 +830,7 @@ public class DesignItemServiceImpl extends ServiceImpl> priorityAndUndividedLayer = setPriorityAndUndividedLayer(layers); + Map> priorityAndUndividedLayer = setPriorityAndUndividedLayer(layers, designSingleIncludeLayersDTO); if (!designSingleIncludeLayersDTO.getIsPreview()) { // 更新及保存图层信息 tDesignPythonOutfitDetails = saveDesignSingleItemDetailAndLayers(objects, design.getId(), designSingleIncludeLayersDTO.getDesignItemId() , userId, outfit, designSingleIncludeLayersDTO.getTimeZone() , designSingleIncludeLayersDTO.getDesignSingleItemDTOList() - , priorityAndUndividedLayer, changeModelFlag, modelId, modelType, isSingleCollectionFlag); + , priorityAndUndividedLayer, changeModelFlag, modelId, modelType, isSingleCollectionFlag, designSingleIncludeLayersDTO.getDesignType()); saveCollectionElement(designSingleIncludeLayersDTO); } else { @@ -921,12 +949,12 @@ public class DesignItemServiceImpl extends ServiceImpl { PartialDesignDTO partialDesignDTO = item.getPartialDesign(); if (!Objects.isNull(item.getPartialDesign()) @@ -948,21 +976,79 @@ public class DesignItemServiceImpl extends ServiceImpl designSingleItemDTOS) { + designSingleItemDTOS.forEach(item -> { + if (!StringUtil.isNullOrEmpty(item.getUndividedLayerBase64())) { + if (item.getUndividedLayerBase64().startsWith("data:image") && !item.getUndividedLayerBase64().startsWith("https://")) { + // 将原图地址作为修改后的图片地址,放在不同的桶 + String filename = "image/image_" + UUID.randomUUID(); + String path = minioUtil.base64UploadToPath(item.getUndividedLayerBase64(), clothingBucket, filename); + log.info("undividedLayer, 新的path为{}", path); + if (StringUtil.isNullOrEmpty(path)) { + log.error("undividedLayer图片base64上传失败"); + throw new BusinessException("file.upload.fail"); + } + item.setUndividedLayerBase64(path); + } else { + item.setUndividedLayerBase64(null); + } + } + + if (!StringUtil.isNullOrEmpty(item.getUndividedLayerWithSinglePrintBase64())) { + if (item.getUndividedLayerWithSinglePrintBase64().startsWith("data:image") && !item.getUndividedLayerWithSinglePrintBase64().startsWith("https://")) { + // 将原图地址作为修改后的图片地址,放在不同的桶 + String filename = "image/image_" + UUID.randomUUID(); + String path = minioUtil.base64UploadToPath(item.getUndividedLayerWithSinglePrintBase64(), clothingBucket, filename); + log.info("getUndividedLayerWithSinglePrint, 新的path为{}", path); + if (StringUtil.isNullOrEmpty(path)) { + log.error("getUndividedLayerWithSinglePrintBase64图片base64上传失败"); + throw new BusinessException("file.upload.fail"); + } + item.setUndividedLayerWithSinglePrintBase64(path); + } else { + item.setUndividedLayerWithSinglePrintBase64(null); + } + } + }); + } + @Override - public Map> setPriorityAndUndividedLayer(JSONArray layers) { - HashMap> priorityAndLayer = new HashMap<>(); - for (int i = 0; i < layers.size(); i++) { - JSONObject jsonObject = layers.getJSONObject(i); - String priority = jsonObject.getString("priority"); - String category = jsonObject.getString("image_category").split("_")[0]; - if (!category.equals("body") && !priorityAndLayer.containsKey(priority)) - priorityAndLayer.put(priority, Arrays.asList(jsonObject.getString("pattern_overall_image_url"), jsonObject.getString("pattern_print_image_url"))); + public Map> setPriorityAndUndividedLayer(JSONArray layers, DesignSingleIncludeLayersDTO designSingleIncludeLayersDTO) { + String designType = "default"; + if (Objects.nonNull(designSingleIncludeLayersDTO)) { + designType = designSingleIncludeLayersDTO.getDesignType(); } + HashMap> priorityAndLayer = new HashMap<>(); + if (designType.equals("default")) { + for (int i = 0; i < layers.size(); i++) { + JSONObject jsonObject = layers.getJSONObject(i); + String priority = jsonObject.getString("priority"); + String category = jsonObject.getString("image_category").split("_")[0]; + if (!category.equals("body") && !priorityAndLayer.containsKey(priority)) { + // pattern_overall_image_url | pattern_print_image_url 这俩字段来源有俩,merge模式下,来自前端,default模式下,来自python + priorityAndLayer.put(priority, Arrays.asList(jsonObject.getString("pattern_overall_image_url"), jsonObject.getString("pattern_print_image_url"))); + } + } + } else { + if (designSingleIncludeLayersDTO.getIsPreview()) { + // 如果是预览,则不处理、不存储前端传过来的数据 + return priorityAndLayer; + } + undividedLayerBase64ToImage(designSingleIncludeLayersDTO.getDesignSingleItemDTOList()); + for (DesignSingleItemDTO designSingleItemDTO : designSingleIncludeLayersDTO.getDesignSingleItemDTOList()) { + priorityAndLayer.put(designSingleItemDTO.getPriority().toString(), Arrays.asList(designSingleItemDTO.getUndividedLayerBase64(), designSingleItemDTO.getUndividedLayerWithSinglePrintBase64())); + } + } + return priorityAndLayer; } @@ -1119,8 +1205,12 @@ public class DesignItemServiceImpl extends ServiceImpl layers.getImageCategory().equals("body")).collect(Collectors.toList())); 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 bfcaa0e3..246cc306 100644 --- a/src/main/java/com/ai/da/service/impl/DesignServiceImpl.java +++ b/src/main/java/com/ai/da/service/impl/DesignServiceImpl.java @@ -715,7 +715,7 @@ public class DesignServiceImpl extends ServiceImpl impleme (existing, replacement) -> replacement)); Map typeAndUndividedLayer = designItemService.setTypeAndUndividedLayer(layers); log.info("all typeLayers Map:{}", typeAndUndividedLayer); - Map> priorityAndUndividedLayer = designItemService.setPriorityAndUndividedLayer(layers); + Map> priorityAndUndividedLayer = designItemService.setPriorityAndUndividedLayer(layers, null); for (DesignPythonItem detail : item.getItems()) { if (null == detail) { continue; diff --git a/src/main/resources/messages_en.properties b/src/main/resources/messages_en.properties index 3cb43202..3e045acd 100644 --- a/src/main/resources/messages_en.properties +++ b/src/main/resources/messages_en.properties @@ -214,6 +214,7 @@ the.subscription.end.date.can.be.extended.only.not.reduced=The subscription end total.sub-account.quota.cannot.be.lower.than.existing.sub-accounts=Total sub-account quota cannot be lower than existing sub-accounts. the.credit.limit.set.cannot.be.lower.than.the.amount.of.credits.already.used=The credit limit set cannot be lower than the amount of credits already used. administrator.user.is.already.bound.to.different.organization=This administrator user is already bound to a subscription plan of a different organization. +required.partialDesign='partialDesign' (base64 or path) is required when updating an individual outfit. # 可能会报异常 # Informative: diff --git a/src/main/resources/messages_zh.properties b/src/main/resources/messages_zh.properties index 164c1163..f60b9270 100644 --- a/src/main/resources/messages_zh.properties +++ b/src/main/resources/messages_zh.properties @@ -210,6 +210,7 @@ the.subscription.end.date.can.be.extended.only.not.reduced=订阅的到期时间 total.sub-account.quota.cannot.be.lower.than.existing.sub-accounts=设置的子账号总数量不能低于现存已添加的子账号数量 the.credit.limit.set.cannot.be.lower.than.the.amount.of.credits.already.used=设置的积分上限不能低于已使用的积分量 administrator.user.is.already.bound.to.different.organization=该管理员用户已与其他组织的订阅计划绑定 +required.partialDesign=修改单套搭配必须提供'partialDesign'(base64 或 path) # 可能会报异常 # Informative: