diff --git a/src/main/java/com/ai/da/mapper/primary/WorkspaceMapper.java b/src/main/java/com/ai/da/mapper/primary/WorkspaceMapper.java index 214e97c0..426b1342 100644 --- a/src/main/java/com/ai/da/mapper/primary/WorkspaceMapper.java +++ b/src/main/java/com/ai/da/mapper/primary/WorkspaceMapper.java @@ -24,4 +24,5 @@ public interface WorkspaceMapper extends CommonMapper { */ List selectWorkspacePage(IPage page, WorkspaceVO workspace); + String getStyleByProjectId(Long projectId); } diff --git a/src/main/java/com/ai/da/mapper/secondary/AttributeRetrievalMapper.java b/src/main/java/com/ai/da/mapper/secondary/AttributeRetrievalMapper.java index 74fa789a..d7881a10 100644 --- a/src/main/java/com/ai/da/mapper/secondary/AttributeRetrievalMapper.java +++ b/src/main/java/com/ai/da/mapper/secondary/AttributeRetrievalMapper.java @@ -30,4 +30,8 @@ public interface AttributeRetrievalMapper { void updateStyleByFileName(String style, String fileName, String tableName); String getStyleByUrl(String replace,String tableName); + + Integer getCountByStyle(String tableName, String style); + + String getOneSystemSketchRadom(String tableName, String style, Integer randomNum); } diff --git a/src/main/java/com/ai/da/model/enums/FemalePosition.java b/src/main/java/com/ai/da/model/enums/FemalePosition.java index d8efc49e..052431ab 100644 --- a/src/main/java/com/ai/da/model/enums/FemalePosition.java +++ b/src/main/java/com/ai/da/model/enums/FemalePosition.java @@ -13,7 +13,8 @@ public enum FemalePosition implements IEnumDisplay { BLOUSE("Blouse"), DRESS("Dress"), TROUSERS("Trousers"), - SKIRT("Skirt"); + SKIRT("Skirt"), + OTHERS("Others"); private String value; diff --git a/src/main/java/com/ai/da/model/enums/MalePosition.java b/src/main/java/com/ai/da/model/enums/MalePosition.java index 184eb5f0..c8f375df 100644 --- a/src/main/java/com/ai/da/model/enums/MalePosition.java +++ b/src/main/java/com/ai/da/model/enums/MalePosition.java @@ -11,7 +11,8 @@ public enum MalePosition implements IEnumDisplay { TOPS("Tops"), BOTTOMS("Bottoms"), - OUTWEAR("Outwear"); + OUTWEAR("Outwear"), + OTHERS("Others"); private String value; 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 204105d1..519ffa36 100644 --- a/src/main/java/com/ai/da/model/enums/Position.java +++ b/src/main/java/com/ai/da/model/enums/Position.java @@ -19,7 +19,8 @@ public enum Position implements IEnumDisplay { SKIRT("Skirt"), SLOGAN("Slogan"), LOGO("Logo"), - PATTERN("Pattern"); + PATTERN("Pattern"), + OTHERS("Others"); private String value; diff --git a/src/main/java/com/ai/da/python/PythonService.java b/src/main/java/com/ai/da/python/PythonService.java index 83a31a0e..26f5b1c8 100644 --- a/src/main/java/com/ai/da/python/PythonService.java +++ b/src/main/java/com/ai/da/python/PythonService.java @@ -29,6 +29,7 @@ import com.google.common.collect.Maps; import io.netty.util.internal.StringUtil; import lombok.extern.slf4j.Slf4j; import okhttp3.*; +import org.apache.commons.lang3.RandomUtils; import org.springframework.beans.factory.annotation.Value; import org.springframework.stereotype.Service; import org.springframework.transaction.annotation.Transactional; @@ -666,33 +667,24 @@ public class PythonService { BigDecimal randomValue = generateRandomValue(); boolean useSystem = randomValue.compareTo(systemScale) <= 0; - if (useSystem) { - // 获取系统推荐sketch - String categoryParam = elementVO.getModelSex().toLowerCase() + "_" + styleCategory.toLowerCase(); - List recommentdUrlList = getSystemSketchByCategory(categoryParam, elementVO.getBrandId(), elementVO.getBrandScale()); - if (!CollectionUtils.isEmpty(recommentdUrlList)) { - String recommendSystemSketch = recommentdUrlList.get(0); - return coverSystemSketchUrlToDesignPythonItem(recommendSystemSketch, styleCategory, elementVO); - }else { - throw new BusinessException("failed.to.obtain.system.sketch.recommendation"); - } - }else { - if (CollectionUtil.isNotEmpty(collectionElements)) { - int collectionNoPinSize = collectionElements.size(); - int randomNum = RandomsUtil.randomSysFile(collectionNoPinSize); - return coverSketchToDesignPythonItem(collectionElements.get(randomNum).getId(), collectionElements.get(randomNum), elementVO); - }else { - String categoryParam = elementVO.getModelSex().toLowerCase() + "_" + styleCategory.toLowerCase(); - List recommentdUrlList = getSystemSketchByCategory(categoryParam, elementVO.getBrandId(), elementVO.getBrandScale()); - if (!CollectionUtils.isEmpty(recommentdUrlList)) { - String recommendSystemSketch = recommentdUrlList.get(0); - return coverSystemSketchUrlToDesignPythonItem(recommendSystemSketch, styleCategory, elementVO); - }else { - throw new BusinessException("failed.to.obtain.system.sketch.recommendation"); - } - } + // 用过存在用户上传,则优先使用用户上传 + if (!useSystem && CollectionUtil.isNotEmpty(collectionElements)) { + int collectionNoPinSize = collectionElements.size(); + int randomNum = RandomsUtil.randomSysFile(collectionNoPinSize); + return coverSketchToDesignPythonItem(collectionElements.get(randomNum).getId(), collectionElements.get(randomNum), elementVO); } + // 其他所有情况,都回退到使用系统推荐 + String categoryParam = elementVO.getModelSex().toLowerCase() + "_" + styleCategory.toLowerCase(); + List recommentdUrlList = getSystemSketchByCategory(categoryParam, elementVO.getBrandId(), elementVO.getBrandScale(),elementVO.getStyle()); + + if (CollectionUtils.isEmpty(recommentdUrlList)) { + throw new BusinessException("failed.to.obtain.system.sketch.recommendation"); + } + + String recommendSystemSketch = recommentdUrlList.get(0); + return coverSystemSketchUrlToDesignPythonItem(recommendSystemSketch, styleCategory, elementVO); + // int poolNum = 20; // if (CollectionUtil.isNotEmpty(collectionElements)) { // int collectionNoPinSize = collectionElements.size(); @@ -1039,7 +1031,7 @@ public class PythonService { // 获取随机pin sketch的category String category = element.getLevel2Type(); String categoryParam = validateElementVO.getModelSex().toLowerCase() + "_" + category.toLowerCase(); - List recommentdUrlList = getSystemSketchByCategory(categoryParam, validateElementVO.getBrandId(), validateElementVO.getBrandScale()); + List recommentdUrlList = getSystemSketchByCategory(categoryParam, validateElementVO.getBrandId(), validateElementVO.getBrandScale(), validateElementVO.getStyle()); if (!CollectionUtils.isEmpty(recommentdUrlList)) { String recommendSystemSketch = recommentdUrlList.get(0); return coverSystemSketchUrlToDesignPythonItem(recommendSystemSketch, category, validateElementVO); @@ -1062,7 +1054,7 @@ public class PythonService { String category = dressings.get(randomNum).getStyleCategory(); String categoryParam = validateElementVO.getModelSex().toLowerCase() + "_" + category.toLowerCase(); - List recommentdUrlList = getSystemSketchByCategory(categoryParam, validateElementVO.getBrandId(), validateElementVO.getBrandScale()); + List recommentdUrlList = getSystemSketchByCategory(categoryParam, validateElementVO.getBrandId(), validateElementVO.getBrandScale(), validateElementVO.getStyle()); if (!CollectionUtils.isEmpty(recommentdUrlList)) { String recommendSystemSketch = recommentdUrlList.get(0); return coverSystemSketchUrlToDesignPythonItem(recommendSystemSketch, category, validateElementVO); @@ -1098,7 +1090,7 @@ public class PythonService { String category = element.getLevel2Type(); String categoryParam = validateElementVO.getModelSex().toLowerCase() + "_" + category.toLowerCase(); - List recommentdUrlList = getSystemSketchByCategory(categoryParam, validateElementVO.getBrandId(), validateElementVO.getBrandScale()); + List recommentdUrlList = getSystemSketchByCategory(categoryParam, validateElementVO.getBrandId(), validateElementVO.getBrandScale(), validateElementVO.getStyle()); if (!CollectionUtils.isEmpty(recommentdUrlList)) { String recommendSystemSketch = recommentdUrlList.get(0); return coverSystemSketchUrlToDesignPythonItem(recommendSystemSketch, category, validateElementVO); @@ -1122,7 +1114,7 @@ public class PythonService { String category = dressings.get(randomNum).getStyleCategory(); String categoryParam = validateElementVO.getModelSex().toLowerCase() + "_" + category.toLowerCase(); - List recommentdUrlList = getSystemSketchByCategory(categoryParam, validateElementVO.getBrandId(), validateElementVO.getBrandScale()); + List recommentdUrlList = getSystemSketchByCategory(categoryParam, validateElementVO.getBrandId(), validateElementVO.getBrandScale(), validateElementVO.getStyle()); if (!CollectionUtils.isEmpty(recommentdUrlList)) { String recommendSystemSketch = recommentdUrlList.get(0); return coverSystemSketchUrlToDesignPythonItem(recommendSystemSketch, category, validateElementVO); @@ -3962,7 +3954,30 @@ public class PythonService { throw new BusinessException("design.interface.exception"); } - public List getSystemSketchByCategory(String category, Long brandId, Double brandScale) { + public List getSystemSketchByCategory(String category, Long brandId, Double brandScale,String style) { + //******3.1.2版本临时使用java推荐方案去解决style未使用的问题********** + try { + //使用新库attribute_retrieval_style,表命名修改为elementVO.getModelSex().toLowerCase() + "_" + styleCategory.toLowerCase()比如female_skirt,与传入的category保持一致 + Integer countByStyle = attributeRetrievalMapper.getCountByStyle(category, style); + //根据数量随机获取一个系统sketch + if (countByStyle > 0) { + //获取一个不大于countByStyle的随机整数 + Integer randomNum = RandomUtils.nextInt(0, countByStyle); + //返回格式为 dress/0902000649.jpg + String oneSystemSketchRadom = attributeRetrievalMapper.getOneSystemSketchRadom(category, style,randomNum); + String imgName = oneSystemSketchRadom.split("/")[1]; + //补齐正确格式aida-sys-image/images/male/tops/mens_test_5689.png + //裁切category前半部分 + String sex = category.split("_")[0]; + String realCategory = category.split("_")[1]; + String path = "aida-sys-image/images/" + sex + "/" +realCategory +"/" +imgName; + return Arrays.asList(path); + } + } catch (Exception e) { + log.info("推荐失败:{}",e.getMessage()); + throw new BusinessException("system.error"); + } + //**********************end*********************************** AuthPrincipalVo userHolder = UserContext.getUserHolder(); OkHttpClient client = new OkHttpClient().newBuilder() 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 92e3892b..dbe466bb 100644 --- a/src/main/java/com/ai/da/python/vo/DesignPythonItem.java +++ b/src/main/java/com/ai/da/python/vo/DesignPythonItem.java @@ -105,6 +105,9 @@ public class DesignPythonItem { public static List BOTTOMS = Arrays.asList( "Bottoms"); + public static List OTHERS = Arrays.asList( + "Others"); + public static List SYS_HAIRSTYLE_SHOES_BODY = Arrays.asList( SysFileLevel2TypeEnum.HAIRSTYLE.getRealName(), SysFileLevel2TypeEnum.SHOES.getRealName(), SysFileLevel2TypeEnum.EARRINGS.getRealName(), SysFileLevel2TypeEnum.BODY.getRealName()); diff --git a/src/main/java/com/ai/da/service/WorkspaceService.java b/src/main/java/com/ai/da/service/WorkspaceService.java index cbd2160d..1c967b38 100644 --- a/src/main/java/com/ai/da/service/WorkspaceService.java +++ b/src/main/java/com/ai/da/service/WorkspaceService.java @@ -68,4 +68,6 @@ public interface WorkspaceService extends IService { String getProjectSexById(Long projectId); + + String getStyleByProjectId(Long projectId); } diff --git a/src/main/java/com/ai/da/service/impl/CollectionElementServiceImpl.java b/src/main/java/com/ai/da/service/impl/CollectionElementServiceImpl.java index 741b5e2c..a6f9b0f0 100644 --- a/src/main/java/com/ai/da/service/impl/CollectionElementServiceImpl.java +++ b/src/main/java/com/ai/da/service/impl/CollectionElementServiceImpl.java @@ -82,7 +82,7 @@ public class CollectionElementServiceImpl extends ServiceImpl sketchBoardElements = new ArrayList<>(); // 提取类型为COLLECTION的sketchBoard ID列表 List sketchBoardIds = designDTO.getSketchBoards().stream() .filter(f -> f.getDesignType().equals(DesignTypeEnum.COLLECTION.getRealName())) @@ -652,12 +652,12 @@ public class CollectionElementServiceImpl extends ServiceImpl sketchBoardElements = collectionElementMapper.selectBatchIds(sketchBoardIds); + sketchBoardElements = collectionElementMapper.selectBatchIds(sketchBoardIds); + if (CollectionUtil.isEmpty(sketchBoardElements) || sketchBoardElements.size() != sketchBoardIds.size()) { throw new BusinessException("get.sketchBoards.data.is.mismatch"); } - // 设置验证通过的sketchBoard元素到结果对象 - elementVO.setSketchBoardElements(sketchBoardElements); + // 记录已使用的元素ID usedElementIds.addAll(sketchBoardIds); } @@ -675,7 +675,9 @@ public class CollectionElementServiceImpl extends ServiceImpl idToMap = designDTO.getSketchBoards() .stream() .collect(Collectors.toMap(CollectionSketchDTO::getSketchBoardId, v -> v)); - libraryCollectionElements.addAll(covertLibrarysToCollections(librarys, idToMap)); + List librarysToCollections = covertLibrarysToCollections(librarys, idToMap); + libraryCollectionElements.addAll(librarysToCollections); + sketchBoardElements.addAll(librarysToCollections); } } @@ -691,9 +693,13 @@ public class CollectionElementServiceImpl extends ServiceImpl idToMap = designDTO.getSketchBoards() .stream() .collect(Collectors.toMap(CollectionSketchDTO::getSketchBoardId, v -> v)); - generateCollectionElements.addAll(covertGeneratesToCollections(generateDetailList, idToMap)); + List generatesToCollections = covertGeneratesToCollections(generateDetailList, idToMap); + generateCollectionElements.addAll(generatesToCollections); + sketchBoardElements.addAll(generatesToCollections); } } + // 设置验证通过的sketchBoard元素到结果对象 + elementVO.setSketchBoardElements(sketchBoardElements); } } //校验marketingSketch @@ -796,7 +802,7 @@ public class CollectionElementServiceImpl extends ServiceImpl impleme response.setHighDesignUrl(designItem.getHighDesignUrl()); List filterDetail = designItemDetails.stream() .filter(f -> OUTWEAR_DRESS_BLOUSE.contains(f.getType()) || SKIRT_TROUSERS.contains(f.getType()) - || TOPS.contains(f.getType()) || BOTTOMS.contains(f.getType())) + || TOPS.contains(f.getType()) || BOTTOMS.contains(f.getType())|| OTHERS.contains(f.getType())) .collect(Collectors.toList()); response.setClothes(CopyUtil.copyList(filterDetail, DesignItemClothesDetailVO.class, (o, d) -> { d.setId(o.getId()); 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 5e7243ea..2ba37354 100644 --- a/src/main/java/com/ai/da/service/impl/GenerateServiceImpl.java +++ b/src/main/java/com/ai/da/service/impl/GenerateServiceImpl.java @@ -867,6 +867,9 @@ public class GenerateServiceImpl extends ServiceImpl i if (base64Data != null && !base64Data.isEmpty()) { String resultPath = userId + "/product_image" + "/" + uuid; String minioPath = minioUtil.base64UploadToPath("data:image/png;base64," + base64Data, userBucket, resultPath); + if (StringUtil.isNullOrEmpty(minioPath)){ + log.warn("Google API调用成功,但图片保存失败 for taskId: {}", taskId); + } // 生成成功,更新Redis状态和URL GenerateResultVO successResultVO = new GenerateResultVO(taskId, null, minioPath, "Success"); redisUtil.addToString(key, new Gson().toJson(successResultVO), CommonConstant.GENERATE_RESULT_EXPIRE_TIME); @@ -1495,9 +1498,6 @@ public class GenerateServiceImpl extends ServiceImpl i GenerateResultVO successResultVO = new GenerateResultVO(taskId, null, imageUrl, "Success"); redisUtil.addToString(key, new Gson().toJson(successResultVO), CommonConstant.GENERATE_RESULT_EXPIRE_TIME); - - // TODO: 处理积分扣除逻辑 - } catch (Exception e) { log.error("Doubao image generation failed for taskId: {}", taskId, e); LambdaQueryWrapper select = new LambdaQueryWrapper().eq(Account::getId, userId).select(Account::getLanguage); 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 2531c5e7..d311ea3b 100644 --- a/src/main/java/com/ai/da/service/impl/WorkspaceServiceImpl.java +++ b/src/main/java/com/ai/da/service/impl/WorkspaceServiceImpl.java @@ -898,6 +898,11 @@ public class WorkspaceServiceImpl extends ServiceImpl qw = new QueryWrapper<>(); diff --git a/src/main/resources/mapper/primary/WorkspaceMapper.xml b/src/main/resources/mapper/primary/WorkspaceMapper.xml index 592084e1..3da9d6f8 100644 --- a/src/main/resources/mapper/primary/WorkspaceMapper.xml +++ b/src/main/resources/mapper/primary/WorkspaceMapper.xml @@ -27,5 +27,10 @@ + diff --git a/src/main/resources/mapper/secondary/AttributeRetrievalMapper.xml b/src/main/resources/mapper/secondary/AttributeRetrievalMapper.xml index 3c2f0f49..0e118820 100644 --- a/src/main/resources/mapper/secondary/AttributeRetrievalMapper.xml +++ b/src/main/resources/mapper/secondary/AttributeRetrievalMapper.xml @@ -110,4 +110,21 @@ ${tableName} WHERE img_name = #{replace} + + + diff --git a/src/main/resources/messages_en.properties b/src/main/resources/messages_en.properties index 58e5091e..d93adb17 100644 --- a/src/main/resources/messages_en.properties +++ b/src/main/resources/messages_en.properties @@ -231,6 +231,7 @@ OVERALL=Overall TOPS=Tops BOTTOMS=Bottoms OUTWEAR=Outwear +OTHERS=Others BLOUSE=Blouse DRESS=Dress TROUSERS=Trousers diff --git a/src/main/resources/messages_fr.properties b/src/main/resources/messages_fr.properties index 5e6c99a4..d54a640e 100644 --- a/src/main/resources/messages_fr.properties +++ b/src/main/resources/messages_fr.properties @@ -171,6 +171,7 @@ OVERALL=Général TOPS=Hauts BOTTOMS=Bas OUTWEAR=Manteau +OTHERS=Autres BLOUSE=Chemisier DRESS=Robe TROUSERS=Pantalons diff --git a/src/main/resources/messages_it.properties b/src/main/resources/messages_it.properties index 1b9cacf0..bc894d71 100644 --- a/src/main/resources/messages_it.properties +++ b/src/main/resources/messages_it.properties @@ -171,6 +171,7 @@ OVERALL=Complessivo TOPS=Parte superiore BOTTOMS=Parte inferiore OUTWEAR=Capo esterno +OTHERS=Altri BLOUSE=Camicetta DRESS=Vestito TROUSERS=Pantaloni diff --git a/src/main/resources/messages_ja.properties b/src/main/resources/messages_ja.properties index 3214c7f4..cb8661d4 100644 --- a/src/main/resources/messages_ja.properties +++ b/src/main/resources/messages_ja.properties @@ -171,6 +171,7 @@ OVERALL=全体 TOPS=トップス BOTTOMS=ボトムス OUTWEAR=アウターウェア +OTHERS=その他 BLOUSE=ブラウス DRESS=ドレス TROUSERS=ズボン diff --git a/src/main/resources/messages_ko.properties b/src/main/resources/messages_ko.properties index ae0b2dda..baa02022 100644 --- a/src/main/resources/messages_ko.properties +++ b/src/main/resources/messages_ko.properties @@ -171,6 +171,7 @@ OVERALL=전체 TOPS=상의 BOTTOMS=하의 OUTWEAR=외투 +OTHERS=기타 BLOUSE=블라우스 DRESS=드레스 TROUSERS=바지 diff --git a/src/main/resources/messages_ru.properties b/src/main/resources/messages_ru.properties index 401d55af..987b5b71 100644 --- a/src/main/resources/messages_ru.properties +++ b/src/main/resources/messages_ru.properties @@ -171,6 +171,7 @@ OVERALL=Общий TOPS=Топы BOTTOMS=Штаны OUTWEAR=Верхняя одежда +OTHERS=ДРУГИЕ BLOUSE=Блуза DRESS=Платье TROUSERS=Брюки diff --git a/src/main/resources/messages_th.properties b/src/main/resources/messages_th.properties index 5b4a0ae1..1a9c1d04 100644 --- a/src/main/resources/messages_th.properties +++ b/src/main/resources/messages_th.properties @@ -171,6 +171,7 @@ OVERALL=โดยรวม TOPS=เสื้อ BOTTOMS=กางเกง OUTWEAR=เสื้อผ้านอก +OTHERS=อื่นๆ BLOUSE=เสื้อผ้าผู้หญิง DRESS=ชุดเดรส TROUSERS=กางเกงขายาว diff --git a/src/main/resources/messages_vi.properties b/src/main/resources/messages_vi.properties index eb874759..358ee9e6 100644 --- a/src/main/resources/messages_vi.properties +++ b/src/main/resources/messages_vi.properties @@ -171,6 +171,7 @@ OVERALL=Tổng thể TOPS=Áo đầu BOTTOMS=Quần OUTWEAR=Áo ngoại cỡ +OTHERS=KHÁC BLOUSE=Áo sơ mi nữ DRESS=Váy TROUSERS=Quần dài diff --git a/src/main/resources/messages_zh.properties b/src/main/resources/messages_zh.properties index b8bd94f2..33f21c3c 100644 --- a/src/main/resources/messages_zh.properties +++ b/src/main/resources/messages_zh.properties @@ -225,6 +225,7 @@ OVERALL=整体 TOPS=上装 BOTTOMS=下装 OUTWEAR=外套 +OTHERS=其他 BLOUSE=上衣 DRESS=连衣裙 TROUSERS=裤子