Files
aida_back/src/main/java/com/ai/da/python/PythonService.java

4506 lines
244 KiB
Java
Raw Normal View History

2023-01-06 15:17:37 +08:00
package com.ai.da.python;
import cn.hutool.core.collection.CollectionUtil;
import cn.hutool.core.exceptions.ExceptionUtil;
import com.ai.da.common.config.FileProperties;
import com.ai.da.common.config.exception.BusinessException;
2025-03-18 13:43:59 +08:00
import com.ai.da.common.context.UserContext;
2023-01-06 15:17:37 +08:00
import com.ai.da.common.enums.*;
import com.ai.da.common.utils.*;
2024-02-20 10:12:44 +08:00
import com.ai.da.mapper.primary.CollocationMapper;
import com.ai.da.mapper.primary.DressingMapper;
2024-06-12 09:47:55 +08:00
import com.ai.da.mapper.primary.entity.*;
2024-02-20 10:12:44 +08:00
import com.ai.da.mapper.secondary.AttributeRetrievalMapper;
import com.ai.da.mapper.secondary.entity.AttributeRetrieval;
import com.ai.da.mapper.secondary.entity.AttributeRecognitionJSON;
2023-01-06 15:17:37 +08:00
import com.ai.da.model.dto.*;
2023-12-14 10:21:30 +08:00
import com.ai.da.model.enums.MalePosition;
import com.ai.da.model.enums.Sex;
2023-01-06 15:17:37 +08:00
import com.ai.da.model.vo.*;
import com.ai.da.python.vo.*;
import com.ai.da.service.DesignHistoryService;
2023-09-18 11:33:13 +08:00
import com.ai.da.service.PythonTAllInfoService;
2023-01-06 15:17:37 +08:00
import com.ai.da.service.SysFileService;
2025-04-14 13:26:56 +08:00
import com.alibaba.fastjson.*;
2023-01-06 15:17:37 +08:00
import com.alibaba.fastjson.serializer.SerializerFeature;
2024-02-20 10:12:44 +08:00
import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
2023-01-06 15:17:37 +08:00
import com.google.common.collect.Lists;
import com.google.common.collect.Maps;
2024-05-13 16:23:37 +08:00
import io.netty.util.internal.StringUtil;
2023-01-06 15:17:37 +08:00
import lombok.extern.slf4j.Slf4j;
import okhttp3.*;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;
import org.springframework.util.Assert;
import org.springframework.util.CollectionUtils;
import org.springframework.util.StringUtils;
import org.springframework.web.multipart.MultipartFile;
import javax.annotation.Resource;
import java.io.File;
2024-12-19 10:51:38 +08:00
import java.io.FileWriter;
2023-01-06 15:17:37 +08:00
import java.io.IOException;
import java.math.BigDecimal;
2024-02-20 10:12:44 +08:00
import java.math.RoundingMode;
2023-12-11 14:24:28 +08:00
import java.net.HttpURLConnection;
2023-01-06 15:17:37 +08:00
import java.util.*;
2025-03-18 13:43:59 +08:00
import java.util.concurrent.ThreadLocalRandom;
2023-01-06 15:17:37 +08:00
import java.util.concurrent.TimeUnit;
import java.util.stream.Collectors;
@Slf4j
@Service
public class PythonService {
@Resource
private FileProperties fileProperties;
@Resource
private SysFileService sysFileService;
@Resource
private DesignHistoryService designHistoryService;
@Value("${access.python.ip:''}")
private String accessPythonIp;
2024-01-02 11:53:09 +08:00
@Value("${access.python.port:''}")
private String accessPythonPort;
2024-05-13 16:23:37 +08:00
@Value("${minio.bucketName.gradient}")
private String gradientBucketName;
2024-06-17 11:21:54 +08:00
@Value("${access.python.generate_sr_port}")
private String srServicePort;
2023-09-18 11:33:13 +08:00
@Resource
private PythonTAllInfoService pythonTAllInfoService;
2023-01-06 15:17:37 +08:00
2024-05-13 16:23:37 +08:00
@Resource
private MinioUtil minioUtil;
2024-09-29 18:32:06 +08:00
@Resource
private RedisUtil redisUtil;
2023-01-06 15:17:37 +08:00
/**
2024-01-02 11:53:09 +08:00
* 生成打印的图片 二合一 (废弃于2024/01/02)
2023-01-06 15:17:37 +08:00
*
* @param printPath
* @return
*/
public String generatePrint(List<String> printPath, Long userId) {
2023-01-06 15:17:37 +08:00
//限流校验
// AccessLimitUtils.validate("generatePrint", 2);
2023-01-06 15:17:37 +08:00
OkHttpClient client = new OkHttpClient().newBuilder()
.connectTimeout(30, TimeUnit.SECONDS)
.pingInterval(5, TimeUnit.SECONDS)//websocket轮训间隔(单位:秒)
.readTimeout(60, TimeUnit.SECONDS)//读取超时(单位:秒)
.writeTimeout(60, TimeUnit.SECONDS)//写入超时(单位:秒)
.build();
MediaType mediaType = MediaType.parse("application/json");
Map<String, String> content = Maps.newHashMap();
content.put("fusion_content_path", printPath.get(0));
content.put("fusion_style_path", printPath.get(1));
content.put("userid", String.valueOf(userId));
// content.put("fusion_output_path", getPythonOutputPath(
// printPath.get(0), PythonToJavaApiOperationTypeEnum.GENERATE_PRINT));
2023-01-06 15:17:37 +08:00
RequestBody body = RequestBody.create(mediaType, JSON.toJSONString(content));
Request request = new Request.Builder()
// .url(accessPythonIp + ":9999/aifda/api/v1.0/fusion_test")
2024-01-02 11:53:09 +08:00
.url(accessPythonIp + ":" + accessPythonPort + "/api/image_fusion")
2023-01-06 15:17:37 +08:00
.method("POST", body)
.addHeader("Authorization", "Basic YWlkbGFiOjEyMw==")
.addHeader("Content-Type", "application/json")
.build();
Response response;
String responseBody;
2023-01-06 15:17:37 +08:00
try {
log.info("moodboard与printboard图片合成 入参content###{}", JSON.toJSONString(content));
2023-01-06 15:17:37 +08:00
response = client.newCall(request).execute();
} catch (IOException ioException) {
log.error("PythonService## moodboard与printboard图片合成异常###{}", ExceptionUtil.getThrowableList(ioException));
throw new BusinessException("image.synthesis.failed");
2023-01-06 15:17:37 +08:00
}
//去除限流
// AccessLimitUtils.validateOut("generatePrint");
2023-01-06 15:17:37 +08:00
JSONObject jsonObject = JSON.parseObject(JSON.toJSONString(response));
if (jsonObject.getBoolean("successful")) {
try {
if (Objects.nonNull(response.body())) {
responseBody = response.body().string();
JSONObject responseObj = JSON.parseObject(responseBody);
2024-01-25 13:37:17 +08:00
log.info("moodboard与printboard图片合成 python返回###{}", responseObj);
return responseObj.get("data").toString();
}
} catch (IOException | JSONException e) {
log.error("Python moodboard与printboard图片合成异常 {}", e.getMessage());
throw new BusinessException("image.synthesis.failed");
}
log.error("moodboard与printboard图片合成异常###{}", jsonObject);
throw new BusinessException("image.synthesis.failed");
// return content.get("fusion_output_path");
2023-01-06 15:17:37 +08:00
}
log.info("moodboard与printboard图片合成异常###{}", jsonObject);
2023-01-06 15:17:37 +08:00
//生成失败
throw new BusinessException("image.synthesis.failed");
2023-01-06 15:17:37 +08:00
}
/**
* 生成python要保存的文件
*
* @param picturePath
* @return
*/
private String getPythonOutputPath(String picturePath, PythonToJavaApiOperationTypeEnum pythonOperationType) {
String linuxDomain = fileProperties.getLinuxDomain();
String day = DateUtil.dateToStr(new Date(), DateUtil.YYYYMM);
//获取图片后缀
String suffix = picturePath.substring(picturePath.lastIndexOf("."));
String generateFileName = pythonOperationType.getRealName()
+ "-" + UUID.randomUUID().toString() + suffix;
return linuxDomain + day + File.separator + "pythonFile" + File.separator
+ pythonOperationType.getRealName()
+ File.separator + generateFileName;
}
/**
* python生成的文件上传到java服务器统一维护
*
* @param file
* @param operateType
* @return
*/
2024-06-12 09:47:55 +08:00
@Transactional(rollbackFor = Exception.class)
2023-01-06 15:17:37 +08:00
public String upload(MultipartFile file, String operateType) {
//用户信息
PythonToJavaApiOperationTypeEnum operationType = PythonToJavaApiOperationTypeEnum.uploadOf(operateType);
Assert.notNull(operationType, "unknown operateType " + operateType + "!");
String path = calculateFileUrl(operationType);
File generateFile = FileUtil.upload2(file, path);
2023-01-06 15:17:37 +08:00
String linuxDomain = fileProperties.getLinuxDomain();
if (!StringUtils.isEmpty(linuxDomain)) {
//linux 系统
String oldPath = fileProperties.getSys().getPath();
return generateFile.getAbsolutePath().replace(oldPath, linuxDomain);
}
return null;
}
2023-11-02 15:35:07 +08:00
// @Transactional
// public List<String> upload(MultipartFile[] files, String operateType) {
// List<String> paths = new ArrayList<>();
// //用户信息
// PythonToJavaApiOperationTypeEnum operationType = PythonToJavaApiOperationTypeEnum.uploadOf(operateType);
// Assert.notNull(operationType, "unknown operateType " + operateType + "!");
// String path = calculateFileUrl(operationType);
// for (MultipartFile file : files) {
// File generateFile = FileUtil.upload2(file, path);
// Assert.notNull(generateFile, "An error occurred while processing the file!");
//
// String linuxDomain = fileProperties.getLinuxDomain();
// if (!StringUtils.isEmpty(linuxDomain)) {
// //linux 系统
// String oldPath = fileProperties.getSys().getPath();
// paths.add(generateFile.getAbsolutePath().replace(oldPath, linuxDomain));
// }
// }
// return paths;
// }
2023-01-06 15:17:37 +08:00
private String calculateFileUrl(PythonToJavaApiOperationTypeEnum operationType) {
String rootPath = fileProperties.getSys().getPath();
String day = DateUtil.dateToStr(new Date(), DateUtil.YYYYMM);
return rootPath + day + File.separator + "pythonFile" + File.separator
+ operationType.getRealName() + File.separator;
}
/**
* 组装和计算design参数
*
* @param systemScale
* @param singleOverall
* @param switchCategory
* @param elementVO
2023-10-05 16:17:01 +08:00
* @param processId
2023-01-06 15:17:37 +08:00
* @return
*/
public DesignPythonObjects covertDesignParam(BigDecimal systemScale, String singleOverall,
2025-03-17 11:30:09 +08:00
String switchCategory, ValidateElementVO elementVO, String processId, Long collectionId) {
2023-01-06 15:17:37 +08:00
DesignPythonObjects designPythonObjects = new DesignPythonObjects();
2024-02-21 15:16:51 +08:00
List<DesignPythonObject> objects = new ArrayList<>();
2023-01-06 15:17:37 +08:00
designPythonObjects.setObjects(objects);
2023-10-05 16:17:01 +08:00
designPythonObjects.setProcess_id(processId);
2024-02-21 15:16:51 +08:00
2023-01-06 15:17:37 +08:00
long pinPrintNum = calculateDesignPinPrintNum(elementVO.getPrintBoardElements());
2024-12-09 13:31:30 +08:00
long noPinPrintNum = calculateDesignNoPinPrintNum(elementVO.getPrintBoardElements(), elementVO.getDesignNum());
long noPrintNum = elementVO.getDesignNum() - pinPrintNum - noPinPrintNum;
2023-01-06 15:17:37 +08:00
elementVO.setNoPinPrintNum(noPinPrintNum);
2024-04-23 15:55:20 +08:00
int[] sketchNumbers = new int[3];
2025-03-17 11:30:09 +08:00
2024-12-09 13:31:30 +08:00
int designNum = elementVO.getDesignNum();
2025-03-17 11:30:09 +08:00
Set<DesignPythonObject> assembledObjects = new HashSet<>(); // 用于存储已组装的 DesignPythonObject
2024-12-19 10:51:38 +08:00
DesignPythonObject lastAssembledObject = null; // 上一次组装的对象
2024-12-09 13:31:30 +08:00
for (int i = 0; i < designNum; i++) {
2024-04-23 15:55:20 +08:00
CurrentDesignPictureTypeEnum designPictureType = calculateCurrentDesignPictureTypeNew(elementVO, sketchNumbers, systemScale);
2024-02-21 15:16:51 +08:00
if (designPictureType == null) break;
2025-03-17 11:30:09 +08:00
CurrentDesignPrintPictureTypeEnum designPrintPictureType = calculateCurrentDesignPintPictureType(pinPrintNum, noPinPrintNum, noPrintNum);
2024-02-21 15:16:51 +08:00
if (designPrintPictureType == null) break;
2024-04-23 15:55:20 +08:00
updateSketchNumbers(designPictureType, sketchNumbers);
switch (designPrintPictureType) {
case PIN:
pinPrintNum--;
break;
case NO_PIN:
noPinPrintNum--;
break;
case NO:
noPrintNum--;
break;
}
2024-02-20 10:12:44 +08:00
DesignPythonItemPrint designPythonItemPrint = getRandomPrint(elementVO, designPrintPictureType);
elementVO.setDesignPythonItemPrint(designPythonItemPrint);
2025-03-17 11:30:09 +08:00
elementVO.setDesignPrintPictureTypeLayoutList(calculateCurrentDesignPintPictureTypeLayout(elementVO.getModelSex()));
2025-02-04 10:58:35 +08:00
List<String> beforeAssemblyHasUseMd5List = new ArrayList<>(elementVO.getHasUseMd5List());
2024-12-09 13:31:30 +08:00
DesignPythonObject pythonObject = createDesignPythonObject(elementVO, designPictureType, systemScale, singleOverall, switchCategory, i);
2024-12-19 10:51:38 +08:00
// 如果当前对象与已组装的对象重复,则跳过当前组装
2025-01-06 10:46:51 +08:00
DesignPythonObject designPythonObjectCopy = getCopy(pythonObject);
2025-02-04 10:58:35 +08:00
boolean isDuplicate = assembledObjects.contains(designPythonObjectCopy);
if (isDuplicate) {
elementVO.setHasUseMd5List(beforeAssemblyHasUseMd5List);
i --;
2025-03-17 11:30:09 +08:00
switch (designPrintPictureType) {
case PIN:
pinPrintNum++;
break;
case NO_PIN:
noPinPrintNum++;
break;
case NO:
noPrintNum++;
break;
}
2024-12-19 10:51:38 +08:00
continue;
}
// 将当前对象添加到已组装的集合中,并记录
2025-01-06 10:46:51 +08:00
assembledObjects.add(designPythonObjectCopy);
2024-12-19 10:51:38 +08:00
2024-02-20 10:12:44 +08:00
objects.add(pythonObject);
2024-09-30 14:48:44 +08:00
redisUtil.addProcessId(processId, i + 1);
2024-02-20 10:12:44 +08:00
}
2023-01-06 15:17:37 +08:00
return designPythonObjects;
}
2025-01-06 10:46:51 +08:00
private DesignPythonObject getCopy(DesignPythonObject pythonObject) {
DesignPythonObject designPythonObjectCopy = CopyUtil.copyObject(pythonObject, DesignPythonObject.class);
designPythonObjectCopy.setObjectSign(null);
2025-03-17 11:30:09 +08:00
DesignPythonBasic basic = designPythonObjectCopy.getBasic();
basic.setSave_name(null);
designPythonObjectCopy.setBasic(basic);
2025-01-06 10:46:51 +08:00
List<DesignPythonItem> items = designPythonObjectCopy.getItems();
List<DesignPythonItem> itemsCopy = new ArrayList<>();
for (DesignPythonItem item : items) {
item.setElementId(null);
item.setIcon(null);
item.setBusinessId(null);
item.setImage_id(null);
item.setImageId(null);
itemsCopy.add(item);
}
designPythonObjectCopy.setItems(itemsCopy);
return designPythonObjectCopy;
}
2024-04-23 15:55:20 +08:00
private void updateSketchNumbers(CurrentDesignPictureTypeEnum designPictureType, int[] sketchNumbers) {
2024-02-21 15:16:51 +08:00
switch (designPictureType) {
case PIN:
sketchNumbers[0]++;
2024-02-21 15:16:51 +08:00
break;
case NO_PIN:
sketchNumbers[2]--;
2024-02-21 15:16:51 +08:00
break;
case SYS_FILE:
sketchNumbers[1]--;
2024-02-21 15:16:51 +08:00
break;
}
}
private void updatePrintNumbers(CurrentDesignPrintPictureTypeEnum designPrintPictureType, long pinPrintNum, long noPinPrintNum, long noPrintNum) {
switch (designPrintPictureType) {
case PIN:
pinPrintNum--;
break;
case NO_PIN:
noPinPrintNum--;
break;
case NO:
noPrintNum--;
break;
}
}
2024-12-09 13:31:30 +08:00
private DesignPythonObject createDesignPythonObject(ValidateElementVO elementVO, CurrentDesignPictureTypeEnum designPictureType, BigDecimal systemScale, String singleOverall, String switchCategory, int i) {
2024-02-21 15:16:51 +08:00
DesignPythonObject pythonObject = new DesignPythonObject();
pythonObject.setItems(coverToDesignPythonItemNew(elementVO, designPictureType, systemScale));
2025-05-28 11:12:26 +08:00
pythonObject.setBasic(coverToBasic(pythonObject.getItems().get(0), singleOverall, switchCategory, elementVO.getDesignLibraryModelPoint(), elementVO.getDesignLibraryModelPointVO()));
2025-01-06 10:46:51 +08:00
if (CollectionUtil.isNotEmpty(elementVO.getRequestIdList())) {
pythonObject.setObjectSign(elementVO.getRequestIdList().get(i));
}
2024-02-21 15:16:51 +08:00
return pythonObject;
}
2024-04-23 15:55:20 +08:00
private CurrentDesignPictureTypeEnum calculateCurrentDesignPictureTypeNew(ValidateElementVO elementVO, int[] sketchNumbers, BigDecimal systemScale) {
2024-02-20 10:12:44 +08:00
List<CollectionElement> pinData = getPinData(elementVO);
2024-12-09 13:31:30 +08:00
Integer designNum = elementVO.getDesignNum();
2024-02-20 10:12:44 +08:00
if (CollectionUtil.isNotEmpty(pinData)) {
return CurrentDesignPictureTypeEnum.PIN;
} else {
2024-04-23 15:55:20 +08:00
if (sketchNumbers[1] == 0 && sketchNumbers[2] == 0) {
2024-12-09 13:31:30 +08:00
sketchNumbers[1] = systemScale.multiply(BigDecimal.valueOf(designNum - sketchNumbers[0])).setScale(0, BigDecimal.ROUND_HALF_UP).intValue();
sketchNumbers[2] = designNum - sketchNumbers[0] - sketchNumbers[1];
2024-02-20 10:12:44 +08:00
}
2024-04-23 16:14:03 +08:00
if (sketchNumbers[2] > 0 && sketchNumbers[1] > 0) {
2024-04-23 16:18:25 +08:00
Long l = RandomsUtil.randomSysFile(0l, 2l);
2024-04-23 16:14:03 +08:00
if (l == 0l) {
return CurrentDesignPictureTypeEnum.NO_PIN;
} else {
2024-04-23 16:14:03 +08:00
return CurrentDesignPictureTypeEnum.SYS_FILE;
}
2024-02-20 10:12:44 +08:00
}
2024-04-23 15:55:20 +08:00
if (sketchNumbers[2] > 0) {
2024-02-20 10:12:44 +08:00
return CurrentDesignPictureTypeEnum.NO_PIN;
}
return CurrentDesignPictureTypeEnum.SYS_FILE;
}
}
private int calculateNoPinSketchNum(int pinSketchNum, int sysSketchNum) {
return 8 - pinSketchNum - sysSketchNum;
}
2024-01-24 10:23:58 +08:00
private int calculateSysSketchNum(BigDecimal sysRatio, int pinSketchNum) {
2024-02-20 10:12:44 +08:00
// Calculate sysRatio * (8 - pinSketchNum)
BigDecimal result = sysRatio.multiply(BigDecimal.valueOf(8 - pinSketchNum));
// Round the result to the nearest integer using half-up rounding
return result.setScale(0, RoundingMode.HALF_UP).intValue();
2024-01-24 10:23:58 +08:00
}
2024-02-21 13:53:46 +08:00
// private int calculatePinSketchNum(List<CollectionElement> sketchBoardElements, List<String> hasUseMd5List) {
// List<CollectionElement> pinData = getPinData(sketchBoardElements, hasUseMd5List);
// if (CollectionUtil.isEmpty(pinData)) {
// return 0;
// }
//// long topNum = sketchBoardElements.stream()
//// .filter(skecth -> skecth.getHasPin() == 1
//// && DesignPythonItem.OUTWEAR_DRESS_BLOUSE.contains(skecth.getLevel2Type())).count();
//// long bottomNum = sketchBoardElements.stream()
//// .filter(skecth -> skecth.getHasPin() == 1
//// && DesignPythonItem.SKIRT_TROUSERS.contains(skecth.getLevel2Type())).count();
//// int num = Arrays.asList(topNum, bottomNum).stream().max(Comparator.comparing(Long::valueOf)).get().intValue();
// int num = pinData.size();
// return Math.min(num, 8);
// }
2024-01-24 10:23:58 +08:00
2023-01-06 15:17:37 +08:00
//计算当前的图片类型
2024-02-20 10:12:44 +08:00
private CurrentDesignPictureTypeEnum calculateCurrentDesignPictureType(int pinSketchNum, int sysSketchNum, int noPinSketchNum) {
2023-01-06 15:17:37 +08:00
List<Integer> codes = Lists.newArrayList();
2024-02-20 10:12:44 +08:00
if (pinSketchNum > 0) {
2023-01-06 15:17:37 +08:00
//pin默认优先选择 不参与计算 后续有调整再说
// codes.add(pinPictureNum);
return CurrentDesignPictureTypeEnum.PIN;
}
2024-02-20 10:12:44 +08:00
if (sysSketchNum > 0) {
2023-01-06 15:17:37 +08:00
codes.add(CurrentDesignPictureTypeEnum.SYS_FILE.getCode());
}
2024-02-20 10:12:44 +08:00
if (noPinSketchNum > 0) {
2023-01-06 15:17:37 +08:00
codes.add(CurrentDesignPictureTypeEnum.NO_PIN.getCode());
}
List<CurrentDesignPictureTypeEnum> pictureTypeEnums = CurrentDesignPictureTypeEnum.ofList(codes);
if (CollectionUtils.isEmpty(pictureTypeEnums)) {
return null;
}
int max = pictureTypeEnums.size();
int min = 0;
Long randomIndex = RandomsUtil.randomSysFile((long) min, (long) max);
return pictureTypeEnums.get(randomIndex.intValue());
}
//计算系统图片张数
private static int calculateSysPictureNum(BigDecimal sysRatio, int pinPictureNum) {
if (pinPictureNum > 4) {
int poolSize = 8 - pinPictureNum;
if (poolSize == 0) {
return 0;
}
return BigDecimal.valueOf(poolSize).multiply(sysRatio)
.setScale(0, BigDecimal.ROUND_HALF_UP).intValue();
} else {
return BigDecimal.valueOf(4).multiply(sysRatio)
.setScale(0, BigDecimal.ROUND_HALF_UP).intValue();
}
}
//计算用户库图片张数
private static int calculateUserLibraryPictureNum(int sysPictureNum, int pinPictureNum) {
if (pinPictureNum > 4) {
return 8 - pinPictureNum - sysPictureNum;
} else {
return 4 - sysPictureNum;
}
}
//计算Pin图片张数
2024-02-21 13:53:46 +08:00
// private int calculatePinPictureNum(List<CollectionElement> sketchBoardElements, List<String> hasUseMd5List) {
// List<CollectionElement> pinData = getPinData(sketchBoardElements, hasUseMd5List);
// if (CollectionUtil.isEmpty(pinData)) {
// return 0;
// }
// long topNum = sketchBoardElements.stream()
// .filter(skecth -> skecth.getHasPin() == 1
// && DesignPythonItem.OUTWEAR_DRESS_BLOUSE.contains(skecth.getLevel2Type())).count();
// long bottomNum = sketchBoardElements.stream()
// .filter(skecth -> skecth.getHasPin() == 1
// && DesignPythonItem.SKIRT_TROUSERS.contains(skecth.getLevel2Type())).count();
// int num = Arrays.asList(topNum, bottomNum).stream().max(Comparator.comparing(Long::valueOf)).get().intValue();
// if (num > 8) {
// return 8;
// }
// return num;
// }
2023-01-06 15:17:37 +08:00
//计算当前的Print图片类型
2025-03-17 11:30:09 +08:00
private CurrentDesignPrintPictureTypeEnum calculateCurrentDesignPintPictureType(long pinPrintNum, long noPinPrintNum, long noPrintNum) {
2023-01-06 15:17:37 +08:00
List<Integer> codes = Lists.newArrayList();
if (pinPrintNum > 0) {
//pin默认优先选择 不参与计算 后续有调整再说
// codes.add(pinPictureNum);
return CurrentDesignPrintPictureTypeEnum.PIN;
}
if (noPinPrintNum > 0) {
codes.add(CurrentDesignPrintPictureTypeEnum.NO_PIN.getCode());
}
if (noPrintNum > 0) {
codes.add(CurrentDesignPrintPictureTypeEnum.NO.getCode());
}
List<CurrentDesignPrintPictureTypeEnum> pictureTypeEnums = CurrentDesignPrintPictureTypeEnum.ofList(codes);
if (CollectionUtils.isEmpty(pictureTypeEnums)) {
return null;
}
int max = pictureTypeEnums.size();
int min = 0;
Long randomIndex = RandomsUtil.randomSysFile((long) min, (long) max);
return pictureTypeEnums.get(randomIndex.intValue());
}
//计算当前的Print图片类型具体分布位置 0. 上衣 1.下衣 2.上衣和下衣都print
2025-03-17 11:30:09 +08:00
private List<String> calculateCurrentDesignPintPictureTypeLayout(String modelSex) {
if (modelSex.equals(Sex.FEMALE.getValue())) {
Long randomIndex = RandomsUtil.randomSysFile(0L, 3L);
if (randomIndex == 0) {
return DesignPythonItem.OUTWEAR_DRESS_BLOUSE;
}
if (randomIndex == 1) {
return DesignPythonItem.SKIRT_TROUSERS;
}
if (randomIndex == 2) {
List<String> all = new ArrayList<>(DesignPythonItem.OUTWEAR_DRESS_BLOUSE);
all.addAll(new ArrayList<>(DesignPythonItem.SKIRT_TROUSERS));
return all;
}
2024-01-25 13:37:17 +08:00
} else if (modelSex.equals(Sex.MALE.getValue())) {
Long randomIndex = RandomsUtil.randomSysFile(0L, 3L);
if (randomIndex == 0) {
return DesignPythonItem.TOPS;
}
if (randomIndex == 1) {
return DesignPythonItem.BOTTOMS;
}
if (randomIndex == 2) {
List<String> all = new ArrayList<>(DesignPythonItem.TOPS);
all.addAll(new ArrayList<>(DesignPythonItem.BOTTOMS));
return all;
}
2023-01-06 15:17:37 +08:00
}
return null;
}
//计算print 非Pin图片剩余张数
private long calculateDesignPinPrintNum(List<CollectionElement> printBoardElements) {
if (CollectionUtils.isEmpty(printBoardElements)) {
return 0;
}
return printBoardElements.stream().filter(f -> f.getHasPin() == 1).count();
}
//计算print 非Pin图片剩余张数
2024-12-09 13:31:30 +08:00
private long calculateDesignNoPinPrintNum(List<CollectionElement> printBoardElements, Integer designNum) {
2023-01-06 15:17:37 +08:00
if (CollectionUtils.isEmpty(printBoardElements)) {
return 0;
}
2023-11-20 16:41:35 +08:00
long noPinNum = printBoardElements.stream().filter(f -> f.getHasPin() == 0).count();
2023-11-21 15:35:58 +08:00
if (noPinNum == 0L) {
2023-01-06 15:17:37 +08:00
return 0;
2024-01-25 13:37:17 +08:00
} else {
2023-11-21 15:35:58 +08:00
long pinNum = printBoardElements.stream().filter(f -> f.getHasPin() == 1).count();
2024-12-09 13:31:30 +08:00
if (designNum - pinNum < designNum/2) {
return RandomsUtil.randomSysFile(0L, designNum - pinNum + 1);
2024-01-25 13:37:17 +08:00
} else {
2024-12-09 13:31:30 +08:00
return RandomsUtil.randomSysFile(0L, (long) (designNum/2 + 1));
2023-11-20 16:41:35 +08:00
}
2023-01-06 15:17:37 +08:00
}
}
2024-02-21 13:53:46 +08:00
// private List<DesignPythonItem> coverToDesignPythonItem(ValidateElementVO elementVO, CurrentDesignPictureTypeEnum designPictureType) {
// //Pin的数据
// List<CollectionElement> pinData = getPinData(elementVO.getSketchBoardElements(), elementVO.getHasUseMd5List());
// //计算填充PythonItemBlouse
// List<DesignPythonItem> items = Lists.newArrayList();
// if (elementVO.getModelSex().equals("Female")) {
// List<DesignPythonItem> blouseList = calculatePythonItemBlouse(pinData, elementVO, designPictureType);
// if (!CollectionUtils.isEmpty(blouseList)) {
// items.addAll(blouseList);
// }
// //计算填充PythonItemSkirt
// DesignPythonItem skirt = calculatePythonItemSkirt(pinData, elementVO, designPictureType);
// if (Objects.nonNull(skirt)) {
// items.add(skirt);
// }
// } else {
// // 男装逻辑
// DesignPythonItem top = calculatePythonItemTop(pinData, elementVO, designPictureType);
// if (Objects.nonNull(top)) {
// items.add(top);
// }
// DesignPythonItem bottom = calculatePythonItemBottom(pinData, elementVO, designPictureType);
// if (Objects.nonNull(bottom)) {
// items.add(bottom);
// }
// if (SingleOverallEnum.SINGLE.getRealName().equals(elementVO.getSingleOverall()) && elementVO.getSwitchCategory().equals("Outwear")) {
// DesignPythonItem outwear = calculatePythonItemOutwear(pinData, elementVO, designPictureType);
// if (Objects.nonNull(outwear)) {
// items.add(outwear);
// }
// }
// }
// //计算填充Hairstyle Earring Shoes Body
// items.addAll(calculatePythonItemHairstyleShoes(elementVO, elementVO.getDesignLibraryModelPoint()));
// return items;
// }
2023-01-06 15:17:37 +08:00
2024-02-20 10:12:44 +08:00
private List<DesignPythonItem> coverToDesignPythonItemNew(ValidateElementVO elementVO, CurrentDesignPictureTypeEnum designPictureType, BigDecimal systemScale) {
List<DesignPythonItem> itemList = new ArrayList<>();
DesignPythonItem designPythonItem = calculatePythonItem(elementVO, designPictureType);
if (Objects.nonNull(designPythonItem)) {
itemList.add(designPythonItem);
if (elementVO.getSingleOverall().equals(SingleOverallEnum.OVERALL.getRealName())) {
List<String> otherSketchCategoryList = getOtherSketchCategoryList(elementVO.getModelSex(), designPythonItem);
2024-02-21 15:16:51 +08:00
if (!otherSketchCategoryList.isEmpty()) {
2025-03-18 13:43:59 +08:00
// JSONObject attributeRecognition = getAttributeRecognition(designPythonItem.getPath(), designPythonItem.getType(), elementVO.getModelSex());
2024-02-20 10:12:44 +08:00
for (String styleCategory : otherSketchCategoryList) {
2025-03-18 13:43:59 +08:00
// DesignPythonItem otherSketch = processAttributeRecognition(attributeRecognition, elementVO, designPictureType, styleCategory, systemScale);
DesignPythonItem otherSketch = processAttributeRecognition(null, elementVO, designPictureType, styleCategory, systemScale);
2024-02-20 10:12:44 +08:00
itemList.add(otherSketch);
}
}
itemList.addAll(calculatePythonItemHairstyleShoes(elementVO, elementVO.getDesignLibraryModelPoint()));
}
}
return itemList;
}
private DesignPythonItem processAttributeRecognition(JSONObject attributeRecognition, ValidateElementVO elementVO, CurrentDesignPictureTypeEnum designPictureType, String styleCategory, BigDecimal systemScale) {
switch (designPictureType) {
2024-02-21 15:16:51 +08:00
case PIN:
return processPinAttributeRecognition(attributeRecognition, elementVO, styleCategory, systemScale);
2024-02-20 10:12:44 +08:00
case NO_PIN:
2024-02-21 15:16:51 +08:00
case SYS_FILE:
2025-03-17 11:30:09 +08:00
return processNoPinOrSysFileAttributeRecognition(attributeRecognition, elementVO, styleCategory, systemScale);
2024-02-20 10:12:44 +08:00
default:
throw new BusinessException("unknown designPictureType");
}
}
2024-02-21 15:16:51 +08:00
private DesignPythonItem processPinAttributeRecognition(JSONObject attributeRecognition, ValidateElementVO elementVO, String styleCategory, BigDecimal systemScale) {
List<CollectionElement> collectPin = getFilteredCollectionElements(elementVO.getSketchBoardElements(), 1, styleCategory);
if (CollectionUtil.isNotEmpty(collectPin)) {
int randomNum = RandomsUtil.randomSysFile(collectPin.size());
elementVO.getHasUseMd5List().add(collectPin.get(randomNum).getMd5());
return coverSketchToDesignPythonItem(collectPin.get(randomNum).getId(), collectPin.get(randomNum), elementVO);
} else {
List<CollectionElement> collectNoPin = getFilteredCollectionElements(elementVO.getSketchBoardElements(), 0, styleCategory);
2025-03-17 11:30:09 +08:00
return processNoPinOrSysFileAttributeRecognitionWithPool(collectNoPin, attributeRecognition, elementVO, styleCategory, systemScale);
2024-02-21 15:16:51 +08:00
}
}
2025-03-17 11:30:09 +08:00
private DesignPythonItem processNoPinOrSysFileAttributeRecognition(JSONObject attributeRecognition, ValidateElementVO elementVO, String styleCategory, BigDecimal systemScale) {
2024-02-21 15:16:51 +08:00
List<CollectionElement> collectNoPin = getFilteredCollectionElements(elementVO.getSketchBoardElements(), 0, styleCategory);
return processNoPinOrSysFileAttributeRecognitionWithPool(collectNoPin, attributeRecognition, elementVO, styleCategory, systemScale);
}
2025-03-18 13:43:59 +08:00
// 生成两位小数随机数(线程安全)
private BigDecimal generateRandomValue() {
// 使用ThreadLocalRandom提高并发性能
double random = ThreadLocalRandom.current().nextDouble(0.0, 1.0 + 1e-4);
return new BigDecimal(random)
.setScale(2, RoundingMode.HALF_UP)
.min(BigDecimal.ONE); // 确保不超过1.00
}
2025-03-17 11:30:09 +08:00
private DesignPythonItem processNoPinOrSysFileAttributeRecognitionWithPool(List<CollectionElement> collectionElements, JSONObject attributeRecognition, ValidateElementVO elementVO, String styleCategory, BigDecimal systemScale) {
2025-03-18 13:43:59 +08:00
BigDecimal randomValue = generateRandomValue();
boolean useSystem = randomValue.compareTo(systemScale) <= 0;
if (useSystem) {
// 获取系统推荐sketch
String categoryParam = elementVO.getModelSex().toLowerCase() + "_" + styleCategory.toLowerCase();
2025-06-10 10:55:56 +08:00
List<String> recommentdUrlList = getSystemSketchByCategory(categoryParam, elementVO.getBrandId(), elementVO.getBrandScale());
2025-03-18 13:43:59 +08:00
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();
2024-02-21 15:16:51 +08:00
int randomNum = RandomsUtil.randomSysFile(collectionNoPinSize);
2025-03-18 13:43:59 +08:00
return coverSketchToDesignPythonItem(collectionElements.get(randomNum).getId(), collectionElements.get(randomNum), elementVO);
}else {
String categoryParam = elementVO.getModelSex().toLowerCase() + "_" + styleCategory.toLowerCase();
2025-06-10 10:55:56 +08:00
List<String> recommentdUrlList = getSystemSketchByCategory(categoryParam, elementVO.getBrandId(), elementVO.getBrandScale());
2025-03-18 13:43:59 +08:00
if (!CollectionUtils.isEmpty(recommentdUrlList)) {
String recommendSystemSketch = recommentdUrlList.get(0);
return coverSystemSketchUrlToDesignPythonItem(recommendSystemSketch, styleCategory, elementVO);
}else {
throw new BusinessException("Failed to obtain system sketch recommendation.");
2025-03-16 13:09:50 +08:00
}
}
}
2025-03-18 13:43:59 +08:00
// int poolNum = 20;
// if (CollectionUtil.isNotEmpty(collectionElements)) {
// int collectionNoPinSize = collectionElements.size();
// if (systemScale.compareTo(BigDecimal.ZERO) == 0) {
// int randomNum = RandomsUtil.randomSysFile(collectionNoPinSize);
// return coverSketchToDesignPythonItem(null, collectionElements.get(randomNum), elementVO);
// } else if (systemScale.compareTo(BigDecimal.ONE) != 0) {
// BigDecimal collectNoPinSize = BigDecimal.valueOf(collectionNoPinSize);
// poolNum = collectNoPinSize.divide(systemScale, 0, RoundingMode.DOWN).intValue();
// List<CollectionElement> list = getSystemSketchPool(attributeRecognition, styleCategory, elementVO.getModelSex(), poolNum, elementVO.getStyle());
// collectionElements.addAll(list);
// int randomNum = RandomsUtil.randomSysFile(collectionElements.size());
// if (randomNum < collectionNoPinSize) {
// return coverSketchToDesignPythonItem(collectionElements.get(randomNum).getId(), collectionElements.get(randomNum), elementVO);
// } else {
// return coverSketchToDesignPythonItem(null, collectionElements.get(randomNum), elementVO);
// }
// }
// }
// List<CollectionElement> list = getSystemSketchPool(attributeRecognition, styleCategory, elementVO.getModelSex(), poolNum, elementVO.getStyle());
// int randomNum = RandomsUtil.randomSysFile(list.size());
// return coverSketchToDesignPythonItem(null, list.get(randomNum), elementVO);
2024-02-21 15:16:51 +08:00
}
private List<CollectionElement> getFilteredCollectionElements(List<CollectionElement> elements, int hasPin, String styleCategory) {
return CollectionUtil.isNotEmpty(elements) ? elements.stream().filter(o -> o.getHasPin() == hasPin && o.getLevel2Type().equals(styleCategory)).collect(Collectors.toList()) : null;
}
2024-02-20 10:12:44 +08:00
private DesignPythonItem processAttributeRecognitionBySameCategory(JSONObject attributeRecognition, ValidateElementVO elementVO, String styleCategory) {
2024-06-27 15:33:26 +08:00
List<CollectionElement> list = getSystemSketchPoolBySameCategory(attributeRecognition, styleCategory, elementVO.getModelSex(), elementVO.getStyle());
2024-02-20 10:12:44 +08:00
int randomNum = RandomsUtil.randomSysFile(list.size());
return coverSketchToDesignPythonItem(null, list.get(randomNum), elementVO);
}
@Resource
private AttributeRetrievalMapper attributeRetrievalMapper;
2024-06-27 15:33:26 +08:00
private List<CollectionElement> getSystemSketchPool(JSONObject attributeRecognition, String styleCategory, String modelSex, int poolNum, String style) {
2024-02-20 10:12:44 +08:00
/**
* female trousers->female_pants
* female blouse->female_top
* female skirt->female_skirt
* female outwear->female_outwear
* female dress->female_dress
*/
JSONObject data = attributeRecognition.getJSONObject("data");
JSONObject attrDict = ((JSONObject) data.getJSONArray("list").get(0)).getJSONObject("attr_dict");
AttributeRecognitionJSON attrDictJSON = attrDict.toJavaObject(AttributeRecognitionJSON.class);
AttributeRetrieval attributeRetrievalAttrDict = toAttrDict(attrDictJSON);
String tableName;
tableName = getTableName(modelSex, styleCategory);
2024-10-04 10:40:32 +08:00
List<AttributeRetrieval> attributeRetrievalList = attributeRetrievalMapper.getSystemSketchPool(attributeRetrievalAttrDict, tableName, poolNum, style);
2024-02-20 10:12:44 +08:00
if (CollectionUtil.isEmpty(attributeRetrievalList) || attributeRetrievalList.size() < poolNum) {
attributeRetrievalAttrDict.setDesign(null);
2024-10-04 10:40:32 +08:00
attributeRetrievalList = attributeRetrievalMapper.getSystemSketchPool(attributeRetrievalAttrDict, tableName, poolNum, style);
2024-02-20 10:12:44 +08:00
}
if (CollectionUtil.isEmpty(attributeRetrievalList) || attributeRetrievalList.size() < poolNum) {
attributeRetrievalAttrDict.setSilhouette(null);
2024-10-04 10:40:32 +08:00
attributeRetrievalList = attributeRetrievalMapper.getSystemSketchPool(attributeRetrievalAttrDict, tableName, poolNum, style);
2024-02-20 10:12:44 +08:00
}
2024-08-02 11:56:17 +08:00
if (CollectionUtil.isEmpty(attributeRetrievalList) || attributeRetrievalList.size() < poolNum) {
style = null;
2024-10-04 10:40:32 +08:00
attributeRetrievalList = attributeRetrievalMapper.getSystemSketchPool(attributeRetrievalAttrDict, tableName, poolNum, style);
2024-02-20 10:12:44 +08:00
}
return toColoectionElementList(attributeRetrievalList, styleCategory, modelSex);
}
2024-06-27 15:33:26 +08:00
private List<CollectionElement> getSystemSketchPoolBySameCategory(JSONObject attributeRecognition, String styleCategory, String modelSex, String style) {
2024-02-20 10:12:44 +08:00
/**
* female trousers->female_pants
* female blouse->female_top
* female skirt->female_skirt
* female outwear->female_outwear
* female dress->female_dress
*/
JSONObject data = attributeRecognition.getJSONObject("data");
JSONObject attrDict = ((JSONObject) data.getJSONArray("list").get(0)).getJSONObject("attr_dict");
AttributeRecognitionJSON attrDictJSON = attrDict.toJavaObject(AttributeRecognitionJSON.class);
AttributeRetrieval attributeRetrievalAttrDict = toAttrDict(attrDictJSON);
String tableName;
tableName = getTableName(modelSex, styleCategory);
2024-10-04 10:40:32 +08:00
2024-02-20 10:12:44 +08:00
// 存储非空字段的列表
List<String> nonNullFields = new ArrayList<>();
2024-02-23 11:38:09 +08:00
if (attributeRetrievalAttrDict.getType() != null) {
nonNullFields.add("type");
}
if (attributeRetrievalAttrDict.getOpeningType() != null) {
nonNullFields.add("openingType");
2024-05-23 16:38:40 +08:00
if (tableName.equals("male_outwear") || tableName.equals("male_top") || tableName.equals("male_bottom")) {
2024-02-23 11:38:09 +08:00
nonNullFields.remove("openingType");
attributeRetrievalAttrDict.setOpeningType(null);
}
}
if (attributeRetrievalAttrDict.getSubtype() != null) {
nonNullFields.add("subtype");
}
2024-02-20 10:12:44 +08:00
// 只有当非空字段数量大于等于2时才进行处理
if (nonNullFields.size() >= 2) {
// 随机数生成器
Random random = new Random();
// 随机选择一个字段保留
String fieldToKeep = nonNullFields.get(random.nextInt(nonNullFields.size()));
// 设置保留的字段为非null其他字段为null
for (String field : nonNullFields) {
if (!field.equals(fieldToKeep)) {
switch (field) {
case "type":
attributeRetrievalAttrDict.setType(null);
break;
case "openingType":
attributeRetrievalAttrDict.setOpeningType(null);
break;
case "subtype":
attributeRetrievalAttrDict.setSubtype(null);
break;
}
}
}
}
2024-10-04 10:40:32 +08:00
List<AttributeRetrieval> attributeRetrievalList = attributeRetrievalMapper.getSystemSketchPoolBySameCategory(attributeRetrievalAttrDict, tableName, style);
2024-02-20 10:12:44 +08:00
if (CollectionUtil.isEmpty(attributeRetrievalList)) {
System.out.println(attributeRetrievalAttrDict);
System.out.println(tableName);
2024-07-11 15:54:08 +08:00
if (!StringUtils.isEmpty(style)) {
attributeRetrievalAttrDict.setType(null);
attributeRetrievalAttrDict.setOpeningType(null);
attributeRetrievalAttrDict.setSubtype(null);
2024-10-04 10:40:32 +08:00
attributeRetrievalList = attributeRetrievalMapper.getSystemSketchPoolBySameCategory(attributeRetrievalAttrDict, tableName, style);
2024-08-02 11:53:50 +08:00
}
if (CollectionUtil.isEmpty(attributeRetrievalList)) {
style = null;
2024-10-04 10:40:32 +08:00
attributeRetrievalList = attributeRetrievalMapper.getSystemSketchPoolBySameCategory(attributeRetrievalAttrDict, tableName, style);
2024-08-02 11:53:50 +08:00
2024-07-11 15:54:08 +08:00
}
2024-02-20 10:12:44 +08:00
}
return toColoectionElementList(attributeRetrievalList, styleCategory, modelSex);
}
private List<CollectionElement> toColoectionElementList(List<AttributeRetrieval> attributeRetrievalList, String styleCategory, String modelSex) {
List<CollectionElement> systemPool = new ArrayList<>();
for (AttributeRetrieval attributeRetrieval : attributeRetrievalList) {
CollectionElement system = toCollectionElement(attributeRetrieval, styleCategory, modelSex);
systemPool.add(system);
}
return systemPool;
}
private CollectionElement toCollectionElement(AttributeRetrieval attributeRetrieval, String styleCategory, String modelSex) {
CollectionElement element = new CollectionElement();
element.setLevel2Type(styleCategory);
element.setUrl("aida-sys-image/images/" + modelSex.toLowerCase() + "/" + attributeRetrieval.getImgName());
if (element.getUrl().contains("top")) {
element.setUrl(element.getUrl().replace("top", "tops"));
}
if (element.getUrl().contains("bottom")) {
element.setUrl(element.getUrl().replace("bottom", "bottoms"));
}
if (element.getUrl().contains("outer")) {
element.setUrl(element.getUrl().replace("outer", "outwear"));
}
return element;
}
private AttributeRetrieval toAttrDict(AttributeRecognitionJSON attrDictJSON) {
AttributeRetrieval attributeRetrieval = new AttributeRetrieval();
// attributeRetrieval.setImgName(attrDictJSON.getImgName().get(0));
// attributeRetrieval.setLength(attrDictJSON.getLength().get(0));
// attributeRetrieval.setSleeveLength(attrDictJSON.getSleeveLength().get(0));
// attributeRetrieval.setSleeveShape(attrDictJSON.getSleeveShape().get(0));
// attributeRetrieval.setSleeveShoulder(attrDictJSON.getSleeveShoulder().get(0));
// attributeRetrieval.setNeckline(attrDictJSON.getNeckline().get(0));
// attributeRetrieval.setCollar(attrDictJSON.getCollar().get(0));
if (CollectionUtil.isNotEmpty(attrDictJSON.getDesign()) && attrDictJSON.getDesign().get(0) != null) {
attributeRetrieval.setDesign(attrDictJSON.getDesign().get(0));
}
if (CollectionUtil.isNotEmpty(attrDictJSON.getSilhouette()) && attrDictJSON.getSilhouette().get(0) != null) {
attributeRetrieval.setSilhouette(attrDictJSON.getSilhouette().get(0));
}
if (CollectionUtil.isNotEmpty(attrDictJSON.getType()) && attrDictJSON.getType().get(0) != null) {
attributeRetrieval.setType(attrDictJSON.getType().get(0));
}
if (CollectionUtil.isNotEmpty(attrDictJSON.getSubtype()) && attrDictJSON.getSubtype().get(0) != null) {
attributeRetrieval.setSubtype(attrDictJSON.getSubtype().get(0));
}
if (CollectionUtil.isNotEmpty(attrDictJSON.getOpeningType()) && attrDictJSON.getOpeningType().get(0) != null) {
attributeRetrieval.setOpeningType(attrDictJSON.getOpeningType().get(0));
}
return attributeRetrieval;
}
2024-12-09 13:31:30 +08:00
public JSONObject getAttributeRecognition(String sketchImgUrl, String styleCategory, String modelSex) {
2024-02-20 10:12:44 +08:00
OkHttpClient client = new OkHttpClient().newBuilder()
.connectTimeout(30, TimeUnit.SECONDS)
2024-02-21 15:16:51 +08:00
.readTimeout(60, TimeUnit.SECONDS)
.writeTimeout(60, TimeUnit.SECONDS)
2024-02-20 10:12:44 +08:00
.build();
MediaType mediaType = MediaType.parse("application/json");
2024-02-21 15:16:51 +08:00
2024-02-20 10:12:44 +08:00
JSONObject paramJSONObject = new JSONObject();
paramJSONObject.put("category", styleCategory);
paramJSONObject.put("colony", modelSex);
2024-12-09 13:31:30 +08:00
paramJSONObject.put("sketch_img_url", sketchImgUrl);
2024-02-20 10:12:44 +08:00
JSONArray paramArray = new JSONArray();
paramArray.add(paramJSONObject);
String param = JSON.toJSONString(paramArray, SerializerFeature.DisableCircularReferenceDetect);
2024-02-21 15:16:51 +08:00
2025-03-17 11:30:09 +08:00
log.info("PythonService##design 请求参数:####{}", param);
2024-02-20 10:12:44 +08:00
RequestBody body = RequestBody.create(mediaType, param);
Request request = new Request.Builder()
.url(accessPythonIp + ":" + accessPythonPort + "/api/attribute_recognition")
// .url(fastApiPythonAddress + "/api/attribute_recognition")
2024-02-20 10:12:44 +08:00
.method("POST", body)
.addHeader("Content-Type", "application/json")
.build();
2024-02-21 15:16:51 +08:00
try (Response response = client.newCall(request).execute()) {
if (response.isSuccessful()) {
String responseBody = Objects.requireNonNull(response.body()).string();
JSONObject responseObject = JSON.parseObject(responseBody);
2025-03-17 11:30:09 +08:00
log.info("PythonService##responseObject###{}", responseObject);
2024-02-21 15:16:51 +08:00
return responseObject;
} else {
log.error("PythonService##design 请求异常:{}", response);
throw new BusinessException("attributeRecognition.interface.exception");
2024-02-20 10:12:44 +08:00
}
2024-02-21 15:16:51 +08:00
} catch (IOException e) {
log.error("PythonService##design 请求异常:{}", e.getMessage());
throw new BusinessException("attributeRecognition.interface.exception");
2024-02-20 10:12:44 +08:00
}
}
public JSONObject getAttributeRecognitionBySameCategory(CollectionElement element, String modelSex) {
// todo 限流校验
// AccessLimitUtils.validate("design",5);
OkHttpClient client = new OkHttpClient().newBuilder()
.connectTimeout(30, TimeUnit.SECONDS)
.pingInterval(5, TimeUnit.SECONDS)//websocket轮训间隔(单位:秒)
.readTimeout(60, TimeUnit.SECONDS)//读取超时(单位:秒)
.writeTimeout(60, TimeUnit.SECONDS)//写入超时(单位:秒)
.build();
MediaType mediaType = MediaType.parse("application/json");
//关闭FastJson的引用检测 防止出现$ref 现象
JSONObject paramJSONObject = new JSONObject();
paramJSONObject.put("category", element.getLevel2Type());
paramJSONObject.put("colony", modelSex);
paramJSONObject.put("sketch_img_url", element.getUrl());
JSONArray paramArray = new JSONArray();
paramArray.add(paramJSONObject);
String param = JSON.toJSONString(paramArray, SerializerFeature.DisableCircularReferenceDetect);
log.info("design请求python 参数:####{}", param);
RequestBody body = RequestBody.create(mediaType, param);
Request request = new Request.Builder()
.url(accessPythonIp + ":" + accessPythonPort + "/api/attribute_recognition")
// .url(fastApiPythonAddress + "/api/attribute_recognition")
2024-02-20 10:12:44 +08:00
.method("POST", body)
// .addHeader("Authorization", "Basic YWlkbGFiOjEyMw==")
.addHeader("Content-Type", "application/json")
.build();
Response response;
String responseBody;
try {
response = client.newCall(request).execute();
} catch (IOException ioException) {
AccessLimitUtils.validateOut("design");
log.error("PythonService##design异常###{}", ExceptionUtil.getThrowableList(ioException));
throw new BusinessException("design.interface.exception");
}
//去除限流
// AccessLimitUtils.validateOut("design");
if (response.isSuccessful()) {
try {
if (Objects.nonNull(response.body())) {
responseBody = response.body().string();
JSONObject responseObject = JSON.parseObject(responseBody);
log.info("PythonService##responseObject###{}", responseObject);
return responseObject;
}
throw new BusinessException("design.interface.exception");
} catch (IOException | JSONException e) {
log.error("PythonService##design异常###{}", e.getMessage());
throw new BusinessException("design.interface.exception");
}
}
log.error("PythonService##design异常response###{}", response);
//生成失败
throw new BusinessException("design.interface.exception");
}
@Resource
private CollocationMapper collocationMapper;
@Resource
private DressingMapper dressingMapper;
2024-02-20 10:12:44 +08:00
private List<String> getOtherSketchCategoryList(String modelSex, DesignPythonItem designPythonItem) {
List<Collocation> collocationList = collocationMapper.getCollocationListBySketch(modelSex, designPythonItem.getType());
if (CollectionUtil.isNotEmpty(collocationList)) {
Random random = new Random();
int randomNumber = random.nextInt(collocationList.size());
List<String> otherSketchCategoryList = dressingMapper.getOtherSketchCategoryNameList(collocationList.get(randomNumber).getId(), designPythonItem.getType().toLowerCase());
return otherSketchCategoryList;
}
return null;
}
2024-02-21 15:16:51 +08:00
private DesignPythonItem calculatePythonItem(ValidateElementVO validateElementVO, CurrentDesignPictureTypeEnum currentDesignPictureType) {
switch (currentDesignPictureType) {
case PIN:
return calculatePinPythonItem(validateElementVO);
case NO_PIN:
return calculateNoPinPythonItem(validateElementVO);
case SYS_FILE:
return calculateSysFilePythonItem(validateElementVO);
default:
return null;
}
}
private DesignPythonItem calculatePinPythonItem(ValidateElementVO validateElementVO) {
List<CollectionElement> pinCollectionData = getPinData(validateElementVO);
if (CollectionUtil.isEmpty(pinCollectionData)) {
throw new BusinessException("pinData is null");
}
Random random = new Random();
int randomNumber = random.nextInt(pinCollectionData.size());
validateElementVO.getHasUseMd5List().add(pinCollectionData.get(randomNumber).getMd5());
return coverSketchToDesignPythonItem(pinCollectionData.get(randomNumber).getId(), pinCollectionData.get(randomNumber), validateElementVO);
}
private DesignPythonItem calculateNoPinPythonItem(ValidateElementVO validateElementVO) {
List<CollectionElement> noPinCollectionData = getNoPinData(validateElementVO);
if (CollectionUtil.isEmpty(noPinCollectionData)) {
List<CollectionElement> sketchBoardPins = getPinDataWhole(validateElementVO);
2024-02-23 11:09:25 +08:00
if (CollectionUtil.isNotEmpty(sketchBoardPins) && validateElementVO.getSingleOverall().equals(SingleOverallEnum.SINGLE.getRealName())) {
2024-02-21 15:16:51 +08:00
sketchBoardPins = sketchBoardPins.stream().filter(o -> o.getLevel2Type().equals(validateElementVO.getSwitchCategory())).collect(Collectors.toList());
2024-02-20 10:12:44 +08:00
}
2024-02-21 15:16:51 +08:00
if (CollectionUtil.isNotEmpty(sketchBoardPins)) {
Integer randomNum = RandomsUtil.randomSysFile(sketchBoardPins.size());
CollectionElement element = sketchBoardPins.get(randomNum);
2025-03-18 13:43:59 +08:00
// 获取随机pin sketch的category
String category = element.getLevel2Type();
String categoryParam = validateElementVO.getModelSex().toLowerCase() + "_" + category.toLowerCase();
2025-06-10 10:55:56 +08:00
List<String> recommentdUrlList = getSystemSketchByCategory(categoryParam, validateElementVO.getBrandId(), validateElementVO.getBrandScale());
2025-03-18 13:43:59 +08:00
if (!CollectionUtils.isEmpty(recommentdUrlList)) {
String recommendSystemSketch = recommentdUrlList.get(0);
return coverSystemSketchUrlToDesignPythonItem(recommendSystemSketch, category, validateElementVO);
}else {
throw new BusinessException("Failed to obtain system sketch recommendation.");
}
// JSONObject attributeRecognition = getAttributeRecognitionBySameCategory(element, validateElementVO.getModelSex());
// return processAttributeRecognitionBySameCategory(attributeRecognition, validateElementVO, element.getLevel2Type());
2024-02-21 15:16:51 +08:00
}
QueryWrapper<Dressing> qw = new QueryWrapper<>();
qw.lambda().eq(Dressing::getApparel, validateElementVO.getModelSex());
if (validateElementVO.getSingleOverall().equals(SingleOverallEnum.SINGLE.getRealName())) {
2024-03-28 10:33:13 +08:00
qw.lambda().eq(Dressing::getStyleCategory, validateElementVO.getSwitchCategory());
2024-02-21 15:16:51 +08:00
}
List<Dressing> dressings = dressingMapper.selectList(qw);
if (CollectionUtil.isEmpty(dressings)) {
throw new BusinessException("dressings is null");
}
Integer randomNum = RandomsUtil.randomSysFile(dressings.size());
String category = dressings.get(randomNum).getStyleCategory();
2025-03-18 13:43:59 +08:00
String categoryParam = validateElementVO.getModelSex().toLowerCase() + "_" + category.toLowerCase();
2025-06-10 10:55:56 +08:00
List<String> recommentdUrlList = getSystemSketchByCategory(categoryParam, validateElementVO.getBrandId(), validateElementVO.getBrandScale());
2025-03-18 13:43:59 +08:00
if (!CollectionUtils.isEmpty(recommentdUrlList)) {
String recommendSystemSketch = recommentdUrlList.get(0);
return coverSystemSketchUrlToDesignPythonItem(recommendSystemSketch, category, validateElementVO);
}else {
throw new BusinessException("Failed to obtain system sketch recommendation.");
}
// String tableName = getTableName(validateElementVO.getModelSex(), category);
// AttributeRetrieval attributeRetrieval = attributeRetrievalMapper.getSystemRandom(tableName, validateElementVO.getStyle());
// CollectionElement collectionElement = toCollectionElement(attributeRetrieval, category, validateElementVO.getModelSex());
// return coverSketchToDesignPythonItem(null, collectionElement, validateElementVO);
2024-02-21 15:16:51 +08:00
}
Random random = new Random();
int randomNumber = random.nextInt(noPinCollectionData.size());
return coverSketchToDesignPythonItem(noPinCollectionData.get(randomNumber).getId(), noPinCollectionData.get(randomNumber), validateElementVO);
}
2024-02-20 10:12:44 +08:00
2024-02-21 15:16:51 +08:00
private DesignPythonItem calculateSysFilePythonItem(ValidateElementVO validateElementVO) {
List<CollectionElement> sketchBoardCollectionElements = validateElementVO.getSketchBoardElements();
if (!CollectionUtils.isEmpty(sketchBoardCollectionElements)) {
if (validateElementVO.getModelSex().equals(Sex.MALE.getValue())) {
sketchBoardCollectionElements = sketchBoardCollectionElements.stream().filter(o -> MALE_CATEGORY.contains(o.getLevel2Type())).collect(Collectors.toList());
2024-02-20 10:12:44 +08:00
}
2024-02-21 15:16:51 +08:00
if (validateElementVO.getModelSex().equals(Sex.FEMALE.getValue())) {
sketchBoardCollectionElements = sketchBoardCollectionElements.stream().filter(o -> FEMALE_CATEGORY.contains(o.getLevel2Type())).collect(Collectors.toList());
}
2024-02-23 11:09:25 +08:00
if (CollectionUtil.isNotEmpty(sketchBoardCollectionElements) && validateElementVO.getSingleOverall().equals(SingleOverallEnum.SINGLE.getRealName())) {
2024-02-21 15:16:51 +08:00
sketchBoardCollectionElements = sketchBoardCollectionElements.stream().filter(o -> o.getLevel2Type().equals(validateElementVO.getSwitchCategory())).collect(Collectors.toList());
}
if (CollectionUtil.isNotEmpty(sketchBoardCollectionElements)) {
Integer randomNum = RandomsUtil.randomSysFile(sketchBoardCollectionElements.size());
CollectionElement element = sketchBoardCollectionElements.get(randomNum);
2025-03-18 13:43:59 +08:00
String category = element.getLevel2Type();
String categoryParam = validateElementVO.getModelSex().toLowerCase() + "_" + category.toLowerCase();
2025-06-10 10:55:56 +08:00
List<String> recommentdUrlList = getSystemSketchByCategory(categoryParam, validateElementVO.getBrandId(), validateElementVO.getBrandScale());
2025-03-18 13:43:59 +08:00
if (!CollectionUtils.isEmpty(recommentdUrlList)) {
String recommendSystemSketch = recommentdUrlList.get(0);
return coverSystemSketchUrlToDesignPythonItem(recommendSystemSketch, category, validateElementVO);
}else {
throw new BusinessException("Failed to obtain system sketch recommendation.");
}
// JSONObject attributeRecognition = getAttributeRecognitionBySameCategory(element, validateElementVO.getModelSex());
// return processAttributeRecognitionBySameCategory(attributeRecognition, validateElementVO, element.getLevel2Type());
2024-02-20 10:12:44 +08:00
}
}
2024-02-21 15:16:51 +08:00
QueryWrapper<Dressing> qw = new QueryWrapper<>();
qw.lambda().eq(Dressing::getApparel, validateElementVO.getModelSex());
if (validateElementVO.getSingleOverall().equals(SingleOverallEnum.SINGLE.getRealName())) {
2024-05-22 15:12:37 +08:00
qw.lambda().eq(Dressing::getStyleCategory, validateElementVO.getSwitchCategory());
2024-02-21 15:16:51 +08:00
}
List<Dressing> dressings = dressingMapper.selectList(qw);
if (CollectionUtil.isEmpty(dressings)) {
throw new BusinessException("dressings is null");
}
Integer randomNum = RandomsUtil.randomSysFile(dressings.size());
String category = dressings.get(randomNum).getStyleCategory();
2024-10-04 10:40:32 +08:00
2025-03-18 13:43:59 +08:00
String categoryParam = validateElementVO.getModelSex().toLowerCase() + "_" + category.toLowerCase();
2025-06-10 10:55:56 +08:00
List<String> recommentdUrlList = getSystemSketchByCategory(categoryParam, validateElementVO.getBrandId(), validateElementVO.getBrandScale());
2025-03-18 13:43:59 +08:00
if (!CollectionUtils.isEmpty(recommentdUrlList)) {
String recommendSystemSketch = recommentdUrlList.get(0);
return coverSystemSketchUrlToDesignPythonItem(recommendSystemSketch, category, validateElementVO);
}else {
throw new BusinessException("Failed to obtain system sketch recommendation.");
}
// String tableName = getTableName(validateElementVO.getModelSex(), category);
//
// AttributeRetrieval attributeRetrieval = attributeRetrievalMapper.getSystemRandom(tableName, validateElementVO.getStyle());
// CollectionElement collectionElement = toCollectionElement(attributeRetrieval, category, validateElementVO.getModelSex());
// return coverSketchToDesignPythonItem(null, collectionElement, validateElementVO);
2024-02-20 10:12:44 +08:00
}
private String getTableName(String modelSex, String category) {
switch (modelSex) {
case "Female": {
switch (category) {
case "Blouse": {
return "female_top";
}
case "Trousers": {
return "female_pants";
}
case "Skirt": {
return "female_skirt";
}
case "Outwear": {
return "female_outwear";
}
case "Dress": {
return "female_dress";
}
default: {
throw new BusinessException("unknown attributeRetrieval dressing");
}
}
}
case "Male": {
switch (category) {
case "Tops": {
return "male_top";
}
case "Bottoms": {
return "male_bottom";
}
case "Outwear": {
return "male_outwear";
}
default: {
throw new BusinessException("unknown male dressing");
}
}
}
default: {
throw new BusinessException("unknown modelSex");
}
}
}
2023-11-09 13:19:18 +08:00
private DesignPythonItem calculatePythonItemOutwear(List<CollectionElement> pinData, ValidateElementVO elementVO, CurrentDesignPictureTypeEnum designPictureType) {
DesignPythonItem outwear = null;
//剩余的的PinData
List<Long> existPinDataIds = elementVO.getExistPinDataIds();
List<CollectionElement> residuePinData = residuePinData(pinData, existPinDataIds, elementVO.getHasUseMd5List());
if (CollectionUtil.isNotEmpty(residuePinData)) {
//single模式
if (SingleOverallEnum.SINGLE.getRealName().equals(elementVO.getSingleOverall())) {
if (DesignPythonItem.OUTWEAR.contains(elementVO.getSwitchCategory())) {
//是否包含的Pin
Boolean isPin = residuePinData.stream().filter(residue ->
elementVO.getSwitchCategory().equals(residue.getLevel2Type())).findFirst().isPresent();
//如果包含Pin只传一个
if (isPin) {
//Pin的数据
pinData = getPinDataByLevel2Type(pinData, elementVO.getSwitchCategory());
//剩余的的PinData
List<CollectionElement> residueInnerPinDataByType = residuePinData(pinData, existPinDataIds, elementVO.getHasUseMd5List());
CollectionElement elementNew = CollectionUtils.isEmpty(residueInnerPinDataByType) ? null : residueInnerPinDataByType.get(0);
if (Objects.nonNull(elementNew)) {
outwear = coverToDesignPythonItem(elementNew.getId(), elementVO.getSwitchCategory(), elementNew.getUrl(), elementVO);
//去重用
existPinDataIds.add(elementNew.getId());
//添加已使用的md5
elementVO.getHasUseMd5List().add(elementNew.getMd5());
}
}
}
} else {
//是否包含skirt的Pin
Boolean isPin = residuePinData.stream().filter(residue ->
DesignPythonItem.OUTWEAR.contains(residue.getLevel2Type())).findFirst().isPresent();
//如果包含Pin只传一个
if (isPin) {
for (String type : DesignPythonItem.OUTWEAR) {
//剩余的的PinData
List<CollectionElement> residueInnerPinData = residuePinData(pinData, existPinDataIds, elementVO.getHasUseMd5List());
CollectionElement elementNew = residueInnerPinData.stream()
.filter(element -> element.getLevel2Type().equals(type)).findFirst().orElse(null);
if (Objects.nonNull(elementNew)) {
outwear = coverToDesignPythonItem(elementNew.getId(), type, elementNew.getUrl(), elementVO);
//去重用
existPinDataIds.add(elementNew.getId());
//添加已使用的md5
elementVO.getHasUseMd5List().add(elementNew.getMd5());
break;
}
}
}
}
}
if (Objects.nonNull(outwear)) {
return outwear;
}
switch (designPictureType) {
case PIN:
if (Objects.isNull(outwear)) {
//single模式
if (SingleOverallEnum.SINGLE.getRealName().equals(elementVO.getSingleOverall())) {
if (DesignPythonItem.OUTWEAR.contains(elementVO.getSwitchCategory())) {
//系统获取
SysFileVO sysFileVO = getRandomSysFileByLevel2Type(elementVO.getSwitchCategory(), elementVO.getSysFileIds(), elementVO.getModelSex());
outwear = coverToDesignPythonItem(null, sysFileVO.getLevel2Type(), sysFileVO.getUrl(), elementVO);
outwear.setBusinessId(sysFileVO.getId());
return outwear;
}
} else {
//系统获取
SysFileVO sysFileVO = getRandomSysFileMaleBottoms(elementVO.getSysFileVo(), elementVO.getSysFileIds(), elementVO.getModelSex());
outwear = coverToDesignPythonItem(null, sysFileVO.getLevel2Type(), sysFileVO.getUrl(), elementVO);
outwear.setBusinessId(sysFileVO.getId());
//添加已使用的md5
return outwear;
}
}
break;
2024-02-20 10:12:44 +08:00
// case USER_LIBRARY:
// //single模式
// if (SingleOverallEnum.SINGLE.getRealName().equals(elementVO.getSingleOverall())) {
// if (DesignPythonItem.OUTWEAR.contains(elementVO.getSwitchCategory())) {
// LibraryVo libraryVo = getRandomLibrary(elementVO.getLibraryVos(),
// Arrays.asList(elementVO.getSwitchCategory()), elementVO.getHasUseMd5List());
// if (StringUtils.isEmpty(libraryVo)) {
// //系统获取
// SysFileVO sysFileVO = getRandomSysFileByLevel2Type(elementVO.getSwitchCategory(), elementVO.getSysFileIds(), elementVO.getModelSex());
// outwear = coverToDesignPythonItem(null, sysFileVO.getLevel2Type(), sysFileVO.getUrl(), elementVO);
// outwear.setBusinessId(sysFileVO.getId());
// return outwear;
// }
// outwear = coverToDesignPythonItem(null, libraryVo.getLevel2Type(), libraryVo.getUrl(), elementVO);
// elementVO.getHasUseMd5List().add(libraryVo.getMd5());
// outwear.setBusinessId(libraryVo.getId());
// }
// } else {
// LibraryVo libraryVo = getRandomLibrary(elementVO.getLibraryVos(),
// DesignPythonItem.OUTWEAR, elementVO.getHasUseMd5List());
// if (StringUtils.isEmpty(libraryVo)) {
// //系统获取
// SysFileVO sysFileVO = getRandomSysFileMaleBottoms(elementVO.getSysFileVo(), elementVO.getSysFileIds(), elementVO.getModelSex());
// outwear = coverToDesignPythonItem(null, sysFileVO.getLevel2Type(), sysFileVO.getUrl(), elementVO);
// outwear.setBusinessId(sysFileVO.getId());
// //添加已使用的md5
// return outwear;
// }
// outwear = coverToDesignPythonItem(null, libraryVo.getLevel2Type(), libraryVo.getUrl(), elementVO);
// outwear.setBusinessId(libraryVo.getId());
// elementVO.getHasUseMd5List().add(libraryVo.getMd5());
// }
// break;
2023-11-09 13:19:18 +08:00
case SYS_FILE:
//single模式
if (SingleOverallEnum.SINGLE.getRealName().equals(elementVO.getSingleOverall())) {
if (DesignPythonItem.OUTWEAR.contains(elementVO.getSwitchCategory())) {
//系统获取
SysFileVO sysFileVO = getRandomSysFileByLevel2Type(elementVO.getSwitchCategory(), elementVO.getSysFileIds(), elementVO.getModelSex());
outwear = coverToDesignPythonItem(null, sysFileVO.getLevel2Type(), sysFileVO.getUrl(), elementVO);
outwear.setBusinessId(sysFileVO.getId());
return outwear;
}
} else {
//系统获取
SysFileVO sysFileVO = getRandomSysFileMaleBottoms(elementVO.getSysFileVo(), elementVO.getSysFileIds(), elementVO.getModelSex());
outwear = coverToDesignPythonItem(null, sysFileVO.getLevel2Type(), sysFileVO.getUrl(), elementVO);
outwear.setBusinessId(sysFileVO.getId());
//添加已使用的md5
return outwear;
}
break;
case NO_PIN:
//single模式
if (SingleOverallEnum.SINGLE.getRealName().equals(elementVO.getSingleOverall())) {
if (DesignPythonItem.OUTWEAR.contains(elementVO.getSwitchCategory())) {
//非Pin的数据
List<CollectionElement> noPinDataByType =
getNoPinData(elementVO.getSketchBoardElements(), Collections.singletonList(elementVO.getSwitchCategory()));
CollectionElement collectionElement = getRandomSketchLibrary(noPinDataByType, elementVO.getHasUseMd5List());
if (Objects.isNull(collectionElement)) {
//系统获取
SysFileVO sysFileVO = getRandomSysFileByLevel2Type(elementVO.getSwitchCategory(), elementVO.getSysFileIds(), elementVO.getModelSex());
outwear = coverToDesignPythonItem(null, sysFileVO.getLevel2Type(), sysFileVO.getUrl(), elementVO);
outwear.setBusinessId(sysFileVO.getId());
} else {
elementVO.getHasUseMd5List().add(collectionElement.getMd5());
outwear = coverToDesignPythonItem(collectionElement.getId(), collectionElement.getLevel2Type(), collectionElement.getUrl(), elementVO);
}
}
} else {
//非Pin的数据
List<CollectionElement> noPinData = getNoPinData(elementVO.getSketchBoardElements(), DesignPythonItem.OUTWEAR);
CollectionElement collectionElement = getRandomSketchLibrary(noPinData, elementVO.getHasUseMd5List());
if (Objects.isNull(collectionElement)) {
//系统获取
SysFileVO sysFileVO = getRandomSysFileMaleBottoms(elementVO.getSysFileVo(), elementVO.getSysFileIds(), elementVO.getModelSex());
outwear = coverToDesignPythonItem(null, sysFileVO.getLevel2Type(), sysFileVO.getUrl(), elementVO);
outwear.setBusinessId(sysFileVO.getId());
} else {
elementVO.getHasUseMd5List().add(collectionElement.getMd5());
outwear = coverToDesignPythonItem(collectionElement.getId(), collectionElement.getLevel2Type(), collectionElement.getUrl(), elementVO);
}
}
break;
default:
}
return outwear;
}
2023-10-10 17:33:39 +08:00
private DesignPythonItem calculatePythonItemBottom(List<CollectionElement> pinData, ValidateElementVO elementVO, CurrentDesignPictureTypeEnum designPictureType) {
DesignPythonItem bottom = null;
//剩余的的PinData
List<Long> existPinDataIds = elementVO.getExistPinDataIds();
List<CollectionElement> residuePinData = residuePinData(pinData, existPinDataIds, elementVO.getHasUseMd5List());
if (CollectionUtil.isNotEmpty(residuePinData)) {
//single模式
if (SingleOverallEnum.SINGLE.getRealName().equals(elementVO.getSingleOverall())) {
if (DesignPythonItem.BOTTOMS.contains(elementVO.getSwitchCategory())) {
//是否包含的Pin
Boolean isPin = residuePinData.stream().filter(residue ->
elementVO.getSwitchCategory().equals(residue.getLevel2Type())).findFirst().isPresent();
//如果包含Pin只传一个
if (isPin) {
//Pin的数据
pinData = getPinDataByLevel2Type(pinData, elementVO.getSwitchCategory());
//剩余的的PinData
List<CollectionElement> residueInnerPinDataByType = residuePinData(pinData, existPinDataIds, elementVO.getHasUseMd5List());
CollectionElement elementNew = CollectionUtils.isEmpty(residueInnerPinDataByType) ? null : residueInnerPinDataByType.get(0);
if (Objects.nonNull(elementNew)) {
bottom = coverToDesignPythonItem(elementNew.getId(), elementVO.getSwitchCategory(), elementNew.getUrl(), elementVO);
//去重用
existPinDataIds.add(elementNew.getId());
//添加已使用的md5
elementVO.getHasUseMd5List().add(elementNew.getMd5());
}
}
}
} else {
//是否包含skirt的Pin
Boolean isPin = residuePinData.stream().filter(residue ->
DesignPythonItem.BOTTOMS.contains(residue.getLevel2Type())).findFirst().isPresent();
//如果包含Pin只传一个
if (isPin) {
for (String type : DesignPythonItem.BOTTOMS) {
//剩余的的PinData
List<CollectionElement> residueInnerPinData = residuePinData(pinData, existPinDataIds, elementVO.getHasUseMd5List());
CollectionElement elementNew = residueInnerPinData.stream()
.filter(element -> element.getLevel2Type().equals(type)).findFirst().orElse(null);
if (Objects.nonNull(elementNew)) {
bottom = coverToDesignPythonItem(elementNew.getId(), type, elementNew.getUrl(), elementVO);
//去重用
existPinDataIds.add(elementNew.getId());
//添加已使用的md5
elementVO.getHasUseMd5List().add(elementNew.getMd5());
break;
}
}
}
}
}
if (Objects.nonNull(bottom)) {
return bottom;
}
switch (designPictureType) {
case PIN:
if (Objects.isNull(bottom)) {
//single模式
if (SingleOverallEnum.SINGLE.getRealName().equals(elementVO.getSingleOverall())) {
if (DesignPythonItem.BOTTOMS.contains(elementVO.getSwitchCategory())) {
//系统获取
SysFileVO sysFileVO = getRandomSysFileByLevel2Type(elementVO.getSwitchCategory(), elementVO.getSysFileIds(), elementVO.getModelSex());
bottom = coverToDesignPythonItem(null, sysFileVO.getLevel2Type(), sysFileVO.getUrl(), elementVO);
bottom.setBusinessId(sysFileVO.getId());
return bottom;
}
} else {
//系统获取
2023-10-20 14:47:18 +08:00
SysFileVO sysFileVO = getRandomSysFileMaleBottoms(elementVO.getSysFileVo(), elementVO.getSysFileIds(), elementVO.getModelSex());
2023-10-10 17:33:39 +08:00
bottom = coverToDesignPythonItem(null, sysFileVO.getLevel2Type(), sysFileVO.getUrl(), elementVO);
bottom.setBusinessId(sysFileVO.getId());
//添加已使用的md5
return bottom;
}
}
break;
2024-02-20 10:12:44 +08:00
// case USER_LIBRARY:
// //single模式
// if (SingleOverallEnum.SINGLE.getRealName().equals(elementVO.getSingleOverall())) {
// if (DesignPythonItem.BOTTOMS.contains(elementVO.getSwitchCategory())) {
// LibraryVo libraryVo = getRandomLibrary(elementVO.getLibraryVos(),
// Arrays.asList(elementVO.getSwitchCategory()), elementVO.getHasUseMd5List());
// if (StringUtils.isEmpty(libraryVo)) {
// //系统获取
// SysFileVO sysFileVO = getRandomSysFileByLevel2Type(elementVO.getSwitchCategory(), elementVO.getSysFileIds(), elementVO.getModelSex());
// bottom = coverToDesignPythonItem(null, sysFileVO.getLevel2Type(), sysFileVO.getUrl(), elementVO);
// bottom.setBusinessId(sysFileVO.getId());
// return bottom;
// }
// bottom = coverToDesignPythonItem(null, libraryVo.getLevel2Type(), libraryVo.getUrl(), elementVO);
// elementVO.getHasUseMd5List().add(libraryVo.getMd5());
// bottom.setBusinessId(libraryVo.getId());
// }
// } else {
// LibraryVo libraryVo = getRandomLibrary(elementVO.getLibraryVos(),
// DesignPythonItem.BOTTOMS, elementVO.getHasUseMd5List());
// if (StringUtils.isEmpty(libraryVo)) {
// //系统获取
// SysFileVO sysFileVO = getRandomSysFileMaleBottoms(elementVO.getSysFileVo(), elementVO.getSysFileIds(), elementVO.getModelSex());
// bottom = coverToDesignPythonItem(null, sysFileVO.getLevel2Type(), sysFileVO.getUrl(), elementVO);
// bottom.setBusinessId(sysFileVO.getId());
// //添加已使用的md5
// return bottom;
// }
// bottom = coverToDesignPythonItem(null, libraryVo.getLevel2Type(), libraryVo.getUrl(), elementVO);
// bottom.setBusinessId(libraryVo.getId());
// elementVO.getHasUseMd5List().add(libraryVo.getMd5());
// }
// break;
2023-10-10 17:33:39 +08:00
case SYS_FILE:
//single模式
if (SingleOverallEnum.SINGLE.getRealName().equals(elementVO.getSingleOverall())) {
if (DesignPythonItem.BOTTOMS.contains(elementVO.getSwitchCategory())) {
//系统获取
SysFileVO sysFileVO = getRandomSysFileByLevel2Type(elementVO.getSwitchCategory(), elementVO.getSysFileIds(), elementVO.getModelSex());
bottom = coverToDesignPythonItem(null, sysFileVO.getLevel2Type(), sysFileVO.getUrl(), elementVO);
bottom.setBusinessId(sysFileVO.getId());
return bottom;
}
} else {
//系统获取
2023-10-20 14:47:18 +08:00
SysFileVO sysFileVO = getRandomSysFileMaleBottoms(elementVO.getSysFileVo(), elementVO.getSysFileIds(), elementVO.getModelSex());
2023-10-10 17:33:39 +08:00
bottom = coverToDesignPythonItem(null, sysFileVO.getLevel2Type(), sysFileVO.getUrl(), elementVO);
bottom.setBusinessId(sysFileVO.getId());
//添加已使用的md5
return bottom;
}
break;
case NO_PIN:
//single模式
if (SingleOverallEnum.SINGLE.getRealName().equals(elementVO.getSingleOverall())) {
if (DesignPythonItem.BOTTOMS.contains(elementVO.getSwitchCategory())) {
//非Pin的数据
List<CollectionElement> noPinDataByType =
getNoPinData(elementVO.getSketchBoardElements(), Collections.singletonList(elementVO.getSwitchCategory()));
CollectionElement collectionElement = getRandomSketchLibrary(noPinDataByType, elementVO.getHasUseMd5List());
if (Objects.isNull(collectionElement)) {
//系统获取
SysFileVO sysFileVO = getRandomSysFileByLevel2Type(elementVO.getSwitchCategory(), elementVO.getSysFileIds(), elementVO.getModelSex());
bottom = coverToDesignPythonItem(null, sysFileVO.getLevel2Type(), sysFileVO.getUrl(), elementVO);
bottom.setBusinessId(sysFileVO.getId());
} else {
elementVO.getHasUseMd5List().add(collectionElement.getMd5());
bottom = coverToDesignPythonItem(collectionElement.getId(), collectionElement.getLevel2Type(), collectionElement.getUrl(), elementVO);
}
}
} else {
//非Pin的数据
List<CollectionElement> noPinData = getNoPinData(elementVO.getSketchBoardElements(), DesignPythonItem.BOTTOMS);
CollectionElement collectionElement = getRandomSketchLibrary(noPinData, elementVO.getHasUseMd5List());
if (Objects.isNull(collectionElement)) {
//系统获取
2023-10-20 14:47:18 +08:00
SysFileVO sysFileVO = getRandomSysFileMaleBottoms(elementVO.getSysFileVo(), elementVO.getSysFileIds(), elementVO.getModelSex());
2023-10-10 17:33:39 +08:00
bottom = coverToDesignPythonItem(null, sysFileVO.getLevel2Type(), sysFileVO.getUrl(), elementVO);
bottom.setBusinessId(sysFileVO.getId());
} else {
elementVO.getHasUseMd5List().add(collectionElement.getMd5());
bottom = coverToDesignPythonItem(collectionElement.getId(), collectionElement.getLevel2Type(), collectionElement.getUrl(), elementVO);
}
}
break;
default:
}
return bottom;
}
private DesignPythonItem calculatePythonItemTop(List<CollectionElement> pinData, ValidateElementVO elementVO, CurrentDesignPictureTypeEnum designPictureType) {
DesignPythonItem top = null;
//剩余的的PinData
List<Long> existPinDataIds = elementVO.getExistPinDataIds();
List<CollectionElement> residuePinData = residuePinData(pinData, existPinDataIds, elementVO.getHasUseMd5List());
if (CollectionUtil.isNotEmpty(residuePinData)) {
//single模式
if (SingleOverallEnum.SINGLE.getRealName().equals(elementVO.getSingleOverall())) {
if (DesignPythonItem.TOPS.contains(elementVO.getSwitchCategory())) {
//是否包含的Pin
Boolean isPin = residuePinData.stream().filter(residue ->
elementVO.getSwitchCategory().equals(residue.getLevel2Type())).findFirst().isPresent();
//如果包含Pin只传一个
if (isPin) {
//Pin的数据
pinData = getPinDataByLevel2Type(pinData, elementVO.getSwitchCategory());
//剩余的的PinData
List<CollectionElement> residueInnerPinDataByType = residuePinData(pinData, existPinDataIds, elementVO.getHasUseMd5List());
CollectionElement elementNew = CollectionUtils.isEmpty(residueInnerPinDataByType) ? null : residueInnerPinDataByType.get(0);
if (Objects.nonNull(elementNew)) {
top = coverToDesignPythonItem(elementNew.getId(), elementVO.getSwitchCategory(), elementNew.getUrl(), elementVO);
//去重用
existPinDataIds.add(elementNew.getId());
//添加已使用的md5
elementVO.getHasUseMd5List().add(elementNew.getMd5());
}
}
}
} else {
//是否包含skirt的Pin
Boolean isPin = residuePinData.stream().filter(residue ->
DesignPythonItem.TOPS.contains(residue.getLevel2Type())).findFirst().isPresent();
//如果包含Pin只传一个
if (isPin) {
for (String type : DesignPythonItem.TOPS) {
//剩余的的PinData
List<CollectionElement> residueInnerPinData = residuePinData(pinData, existPinDataIds, elementVO.getHasUseMd5List());
CollectionElement elementNew = residueInnerPinData.stream()
.filter(element -> element.getLevel2Type().equals(type)).findFirst().orElse(null);
if (Objects.nonNull(elementNew)) {
top = coverToDesignPythonItem(elementNew.getId(), type, elementNew.getUrl(), elementVO);
//去重用
existPinDataIds.add(elementNew.getId());
//添加已使用的md5
elementVO.getHasUseMd5List().add(elementNew.getMd5());
break;
}
}
}
}
}
if (Objects.nonNull(top)) {
return top;
}
switch (designPictureType) {
case PIN:
if (Objects.isNull(top)) {
//single模式
if (SingleOverallEnum.SINGLE.getRealName().equals(elementVO.getSingleOverall())) {
if (DesignPythonItem.TOPS.contains(elementVO.getSwitchCategory())) {
//系统获取
SysFileVO sysFileVO = getRandomSysFileByLevel2Type(elementVO.getSwitchCategory(), elementVO.getSysFileIds(), elementVO.getModelSex());
top = coverToDesignPythonItem(null, sysFileVO.getLevel2Type(), sysFileVO.getUrl(), elementVO);
top.setBusinessId(sysFileVO.getId());
return top;
}
} else {
//系统获取
2023-10-20 14:47:18 +08:00
SysFileVO sysFileVO = getRandomSysFileMaleTops(elementVO.getSysFileVo(), elementVO.getSysFileIds(), elementVO.getModelSex());
2023-10-10 17:33:39 +08:00
top = coverToDesignPythonItem(null, sysFileVO.getLevel2Type(), sysFileVO.getUrl(), elementVO);
top.setBusinessId(sysFileVO.getId());
//添加已使用的md5
return top;
}
}
break;
2024-02-20 10:12:44 +08:00
// case USER_LIBRARY:
// //single模式
// if (SingleOverallEnum.SINGLE.getRealName().equals(elementVO.getSingleOverall())) {
// if (DesignPythonItem.TOPS.contains(elementVO.getSwitchCategory())) {
// LibraryVo libraryVo = getRandomLibrary(elementVO.getLibraryVos(),
// Arrays.asList(elementVO.getSwitchCategory()), elementVO.getHasUseMd5List());
// if (StringUtils.isEmpty(libraryVo)) {
// //系统获取
// SysFileVO sysFileVO = getRandomSysFileByLevel2Type(elementVO.getSwitchCategory(), elementVO.getSysFileIds(), elementVO.getModelSex());
// top = coverToDesignPythonItem(null, sysFileVO.getLevel2Type(), sysFileVO.getUrl(), elementVO);
// top.setBusinessId(sysFileVO.getId());
// return top;
// }
// top = coverToDesignPythonItem(null, libraryVo.getLevel2Type(), libraryVo.getUrl(), elementVO);
// elementVO.getHasUseMd5List().add(libraryVo.getMd5());
// top.setBusinessId(libraryVo.getId());
// }
// } else {
// LibraryVo libraryVo = getRandomLibrary(elementVO.getLibraryVos(),
// DesignPythonItem.TOPS, elementVO.getHasUseMd5List());
// if (StringUtils.isEmpty(libraryVo)) {
// //系统获取
// SysFileVO sysFileVO = getRandomSysFileMaleTops(elementVO.getSysFileVo(), elementVO.getSysFileIds(), elementVO.getModelSex());
// top = coverToDesignPythonItem(null, sysFileVO.getLevel2Type(), sysFileVO.getUrl(), elementVO);
// top.setBusinessId(sysFileVO.getId());
// //添加已使用的md5
// return top;
// }
// top = coverToDesignPythonItem(null, libraryVo.getLevel2Type(), libraryVo.getUrl(), elementVO);
// top.setBusinessId(libraryVo.getId());
// elementVO.getHasUseMd5List().add(libraryVo.getMd5());
// }
// break;
2023-10-10 17:33:39 +08:00
case SYS_FILE:
//single模式
if (SingleOverallEnum.SINGLE.getRealName().equals(elementVO.getSingleOverall())) {
if (DesignPythonItem.TOPS.contains(elementVO.getSwitchCategory())) {
//系统获取
SysFileVO sysFileVO = getRandomSysFileByLevel2Type(elementVO.getSwitchCategory(), elementVO.getSysFileIds(), elementVO.getModelSex());
top = coverToDesignPythonItem(null, sysFileVO.getLevel2Type(), sysFileVO.getUrl(), elementVO);
top.setBusinessId(sysFileVO.getId());
return top;
}
} else {
//系统获取
2023-10-20 14:47:18 +08:00
SysFileVO sysFileVO = getRandomSysFileMaleTops(elementVO.getSysFileVo(), elementVO.getSysFileIds(), elementVO.getModelSex());
2023-10-10 17:33:39 +08:00
top = coverToDesignPythonItem(null, sysFileVO.getLevel2Type(), sysFileVO.getUrl(), elementVO);
top.setBusinessId(sysFileVO.getId());
//添加已使用的md5
return top;
}
break;
case NO_PIN:
//single模式
if (SingleOverallEnum.SINGLE.getRealName().equals(elementVO.getSingleOverall())) {
if (DesignPythonItem.TOPS.contains(elementVO.getSwitchCategory())) {
//非Pin的数据
List<CollectionElement> noPinDataByType =
getNoPinData(elementVO.getSketchBoardElements(), Collections.singletonList(elementVO.getSwitchCategory()));
CollectionElement collectionElement = getRandomSketchLibrary(noPinDataByType, elementVO.getHasUseMd5List());
if (Objects.isNull(collectionElement)) {
//系统获取
SysFileVO sysFileVO = getRandomSysFileByLevel2Type(elementVO.getSwitchCategory(), elementVO.getSysFileIds(), elementVO.getModelSex());
top = coverToDesignPythonItem(null, sysFileVO.getLevel2Type(), sysFileVO.getUrl(), elementVO);
top.setBusinessId(sysFileVO.getId());
} else {
elementVO.getHasUseMd5List().add(collectionElement.getMd5());
top = coverToDesignPythonItem(collectionElement.getId(), collectionElement.getLevel2Type(), collectionElement.getUrl(), elementVO);
}
}
} else {
//非Pin的数据
List<CollectionElement> noPinData = getNoPinData(elementVO.getSketchBoardElements(), DesignPythonItem.TOPS);
CollectionElement collectionElement = getRandomSketchLibrary(noPinData, elementVO.getHasUseMd5List());
if (Objects.isNull(collectionElement)) {
//系统获取
2023-10-20 14:47:18 +08:00
SysFileVO sysFileVO = getRandomSysFileMaleTops(elementVO.getSysFileVo(), elementVO.getSysFileIds(), elementVO.getModelSex());
2023-10-10 17:33:39 +08:00
top = coverToDesignPythonItem(null, sysFileVO.getLevel2Type(), sysFileVO.getUrl(), elementVO);
top.setBusinessId(sysFileVO.getId());
} else {
elementVO.getHasUseMd5List().add(collectionElement.getMd5());
top = coverToDesignPythonItem(collectionElement.getId(), collectionElement.getLevel2Type(), collectionElement.getUrl(), elementVO);
}
}
break;
default:
}
return top;
}
2023-01-06 15:17:37 +08:00
private List<DesignPythonItem> calculatePythonItemHairstyleShoes(ValidateElementVO elementVO, DesignLibraryModelPointVO designLibraryModelPoint) {
List<DesignPythonItem> items = Lists.newArrayList();
2023-09-20 12:05:08 +08:00
for (String type : DesignPythonItem.SYS_HAIRSTYLE_SHOES_BODY) {
if (!type.equals("Body")) {
continue;
}
if (SingleOverallEnum.SINGLE.getRealName().equals(elementVO.getSingleOverall()) || Objects.nonNull(designLibraryModelPoint)) {
2023-01-06 15:17:37 +08:00
//single和models模特时候不传耳环 首饰,鞋子等
2023-09-20 12:05:08 +08:00
if (!SysFileLevel2TypeEnum.BODY.getRealName().equals(type)) {
continue;
2023-01-06 15:17:37 +08:00
}
}
DesignPythonItem pythonItem = new DesignPythonItem();
items.add(pythonItem);
//类型
pythonItem.setType(type);
if (SysFileLevel2TypeEnum.BODY.getRealName().equals(type)) {
2025-05-28 11:12:26 +08:00
if (!CollectionUtils.isEmpty(elementVO.getMannequins())) {
DesignLibraryModelPointVO vo = getRandomDesignLibraryModelPoint(elementVO.getMannequins());
pythonItem.setBody_path(vo.getTemplateUrl());
elementVO.setDesignLibraryModelPointVO(vo);
2023-01-06 15:17:37 +08:00
} else {
2023-09-20 12:05:08 +08:00
// pythonItem.setBody_path("/workspace/python_code/Multi-layer-Virtual-Try-on/dataset_for_test/Img_model.png");
2025-06-10 10:55:56 +08:00
pythonItem.setBody_path("aida-sys-image/models/female/dd6b48ce-1bab-4861-bb87-a30b82377a8f.png");
2023-01-06 15:17:37 +08:00
}
2025-05-28 11:12:26 +08:00
// if (Objects.nonNull(designLibraryModelPoint)) {
// pythonItem.setBody_path(designLibraryModelPoint.getTemplateUrl());
// } else {
//// pythonItem.setBody_path("/workspace/python_code/Multi-layer-Virtual-Try-on/dataset_for_test/Img_model.png");
// pythonItem.setBody_path("aida-mannequins/model_1693218345.2714432.png");
// }
2023-01-06 15:17:37 +08:00
} else {
2023-10-10 15:02:06 +08:00
SysFileVO sysFileVO = getRandomSysFileByLevel2Type(type, Lists.newArrayList(), elementVO.getModelSex());
2023-01-06 15:17:37 +08:00
pythonItem.setPath(sysFileVO.getUrl());
pythonItem.setBusinessId(sysFileVO.getId());
if (SysFileLevel2TypeEnum.SHOES.getRealName().equals(type)) {
2025-03-17 11:30:09 +08:00
CollectionColorDTO randomColor = getRandomColor(elementVO.getColorBoards());
2025-04-02 17:13:58 +08:00
if (Objects.nonNull(randomColor)) {
pythonItem.setColor(randomColor.getRgbValue());
pythonItem.setGradient(randomColor.getGradientMinioUrl());
pythonItem.setGradientString(randomColor.getGradientString());
}
2023-01-06 15:17:37 +08:00
}
}
2023-09-20 12:05:08 +08:00
}
2023-01-06 15:17:37 +08:00
return items;
}
private DesignPythonItem calculatePythonItemSkirt(List<CollectionElement> pinData, ValidateElementVO elementVO, CurrentDesignPictureTypeEnum designPictureType) {
// skirt, trousers 只选择一个
DesignPythonItem skirt = null;
//剩余的的PinData
List<Long> existPinDataIds = elementVO.getExistPinDataIds();
List<CollectionElement> residuePinData = residuePinData(pinData, existPinDataIds, elementVO.getHasUseMd5List());
if (CollectionUtil.isNotEmpty(residuePinData)) {
//single模式
if (SingleOverallEnum.SINGLE.getRealName().equals(elementVO.getSingleOverall())) {
if (DesignPythonItem.SKIRT_TROUSERS.contains(elementVO.getSwitchCategory())) {
//是否包含的Pin
Boolean isPin = residuePinData.stream().filter(residue ->
elementVO.getSwitchCategory().equals(residue.getLevel2Type())).findFirst().isPresent();
//如果包含Pin只传一个
if (isPin) {
//Pin的数据
pinData = getPinDataByLevel2Type(pinData, elementVO.getSwitchCategory());
//剩余的的PinData
List<CollectionElement> residueInnerPinDataByType = residuePinData(pinData, existPinDataIds, elementVO.getHasUseMd5List());
CollectionElement elementNew = CollectionUtils.isEmpty(residueInnerPinDataByType) ? null : residueInnerPinDataByType.get(0);
if (Objects.nonNull(elementNew)) {
skirt = coverToDesignPythonItem(elementNew.getId(), elementVO.getSwitchCategory(), elementNew.getUrl(), elementVO);
//去重用
existPinDataIds.add(elementNew.getId());
//添加已使用的md5
elementVO.getHasUseMd5List().add(elementNew.getMd5());
}
}
}
} else {
//是否包含skirt的Pin
Boolean isPin = residuePinData.stream().filter(residue ->
DesignPythonItem.SKIRT_TROUSERS.contains(residue.getLevel2Type())).findFirst().isPresent();
//如果包含Pin只传一个
if (isPin) {
for (String type : DesignPythonItem.SKIRT_TROUSERS) {
//剩余的的PinData
List<CollectionElement> residueInnerPinData = residuePinData(pinData, existPinDataIds, elementVO.getHasUseMd5List());
CollectionElement elementNew = residueInnerPinData.stream()
.filter(element -> element.getLevel2Type().equals(type)).findFirst().orElse(null);
if (Objects.nonNull(elementNew)) {
skirt = coverToDesignPythonItem(elementNew.getId(), type, elementNew.getUrl(), elementVO);
//去重用
existPinDataIds.add(elementNew.getId());
//添加已使用的md5
elementVO.getHasUseMd5List().add(elementNew.getMd5());
break;
}
}
}
}
}
if (Objects.nonNull(skirt)) {
return skirt;
}
switch (designPictureType) {
case PIN:
if (Objects.isNull(skirt)) {
//single模式
if (SingleOverallEnum.SINGLE.getRealName().equals(elementVO.getSingleOverall())) {
if (DesignPythonItem.SKIRT_TROUSERS.contains(elementVO.getSwitchCategory())) {
//系统获取
2023-10-10 15:02:06 +08:00
SysFileVO sysFileVO = getRandomSysFileByLevel2Type(elementVO.getSwitchCategory(), elementVO.getSysFileIds(), elementVO.getModelSex());
2023-01-06 15:17:37 +08:00
skirt = coverToDesignPythonItem(null, sysFileVO.getLevel2Type(), sysFileVO.getUrl(), elementVO);
skirt.setBusinessId(sysFileVO.getId());
return skirt;
}
} else {
//系统获取
2023-10-20 14:47:18 +08:00
SysFileVO sysFileVO = getRandomSysFileSkirt(elementVO.getSysFileVo(), elementVO.getSysFileIds(), elementVO.getModelSex());
2023-01-06 15:17:37 +08:00
skirt = coverToDesignPythonItem(null, sysFileVO.getLevel2Type(), sysFileVO.getUrl(), elementVO);
skirt.setBusinessId(sysFileVO.getId());
//添加已使用的md5
return skirt;
}
}
break;
2024-02-20 10:12:44 +08:00
// case USER_LIBRARY:
// //single模式
// if (SingleOverallEnum.SINGLE.getRealName().equals(elementVO.getSingleOverall())) {
// if (DesignPythonItem.SKIRT_TROUSERS.contains(elementVO.getSwitchCategory())) {
// LibraryVo libraryVo = getRandomLibrary(elementVO.getLibraryVos(),
// Arrays.asList(elementVO.getSwitchCategory()), elementVO.getHasUseMd5List());
// if (StringUtils.isEmpty(libraryVo)) {
// //系统获取
// SysFileVO sysFileVO = getRandomSysFileByLevel2Type(elementVO.getSwitchCategory(), elementVO.getSysFileIds(), elementVO.getModelSex());
// skirt = coverToDesignPythonItem(null, sysFileVO.getLevel2Type(), sysFileVO.getUrl(), elementVO);
// skirt.setBusinessId(sysFileVO.getId());
// return skirt;
// }
// skirt = coverToDesignPythonItem(null, libraryVo.getLevel2Type(), libraryVo.getUrl(), elementVO);
// elementVO.getHasUseMd5List().add(libraryVo.getMd5());
// skirt.setBusinessId(libraryVo.getId());
// }
// } else {
// LibraryVo libraryVo = getRandomLibrary(elementVO.getLibraryVos(),
// DesignPythonItem.SKIRT_TROUSERS, elementVO.getHasUseMd5List());
// if (StringUtils.isEmpty(libraryVo)) {
// //系统获取
// SysFileVO sysFileVO = getRandomSysFileSkirt(elementVO.getSysFileVo(), elementVO.getSysFileIds(), elementVO.getModelSex());
// skirt = coverToDesignPythonItem(null, sysFileVO.getLevel2Type(), sysFileVO.getUrl(), elementVO);
// skirt.setBusinessId(sysFileVO.getId());
// //添加已使用的md5
// return skirt;
// }
// skirt = coverToDesignPythonItem(null, libraryVo.getLevel2Type(), libraryVo.getUrl(), elementVO);
// skirt.setBusinessId(libraryVo.getId());
// elementVO.getHasUseMd5List().add(libraryVo.getMd5());
// }
// break;
2023-01-06 15:17:37 +08:00
case SYS_FILE:
//single模式
if (SingleOverallEnum.SINGLE.getRealName().equals(elementVO.getSingleOverall())) {
if (DesignPythonItem.SKIRT_TROUSERS.contains(elementVO.getSwitchCategory())) {
//系统获取
2023-10-10 15:02:06 +08:00
SysFileVO sysFileVO = getRandomSysFileByLevel2Type(elementVO.getSwitchCategory(), elementVO.getSysFileIds(), elementVO.getModelSex());
2023-01-06 15:17:37 +08:00
skirt = coverToDesignPythonItem(null, sysFileVO.getLevel2Type(), sysFileVO.getUrl(), elementVO);
skirt.setBusinessId(sysFileVO.getId());
return skirt;
}
} else {
//系统获取
2023-10-20 14:47:18 +08:00
SysFileVO sysFileVO = getRandomSysFileSkirt(elementVO.getSysFileVo(), elementVO.getSysFileIds(), elementVO.getModelSex());
2023-01-06 15:17:37 +08:00
skirt = coverToDesignPythonItem(null, sysFileVO.getLevel2Type(), sysFileVO.getUrl(), elementVO);
skirt.setBusinessId(sysFileVO.getId());
//添加已使用的md5
return skirt;
}
break;
case NO_PIN:
//single模式
if (SingleOverallEnum.SINGLE.getRealName().equals(elementVO.getSingleOverall())) {
if (DesignPythonItem.SKIRT_TROUSERS.contains(elementVO.getSwitchCategory())) {
//非Pin的数据
List<CollectionElement> noPinDataByType =
getNoPinData(elementVO.getSketchBoardElements(), Collections.singletonList(elementVO.getSwitchCategory()));
CollectionElement collectionElement = getRandomSketchLibrary(noPinDataByType, elementVO.getHasUseMd5List());
if (Objects.isNull(collectionElement)) {
//系统获取
2023-10-10 15:02:06 +08:00
SysFileVO sysFileVO = getRandomSysFileByLevel2Type(elementVO.getSwitchCategory(), elementVO.getSysFileIds(), elementVO.getModelSex());
2023-01-06 15:17:37 +08:00
skirt = coverToDesignPythonItem(null, sysFileVO.getLevel2Type(), sysFileVO.getUrl(), elementVO);
skirt.setBusinessId(sysFileVO.getId());
} else {
elementVO.getHasUseMd5List().add(collectionElement.getMd5());
skirt = coverToDesignPythonItem(collectionElement.getId(), collectionElement.getLevel2Type(), collectionElement.getUrl(), elementVO);
}
}
} else {
//非Pin的数据
List<CollectionElement> noPinData = getNoPinData(elementVO.getSketchBoardElements(), DesignPythonItem.SKIRT_TROUSERS);
CollectionElement collectionElement = getRandomSketchLibrary(noPinData, elementVO.getHasUseMd5List());
if (Objects.isNull(collectionElement)) {
//系统获取
2023-10-20 14:47:18 +08:00
SysFileVO sysFileVO = getRandomSysFileSkirt(elementVO.getSysFileVo(), elementVO.getSysFileIds(), elementVO.getModelSex());
2023-01-06 15:17:37 +08:00
skirt = coverToDesignPythonItem(null, sysFileVO.getLevel2Type(), sysFileVO.getUrl(), elementVO);
skirt.setBusinessId(sysFileVO.getId());
} else {
elementVO.getHasUseMd5List().add(collectionElement.getMd5());
skirt = coverToDesignPythonItem(collectionElement.getId(), collectionElement.getLevel2Type(), collectionElement.getUrl(), elementVO);
}
}
break;
default:
}
return skirt;
}
private List<DesignPythonItem> calculatePythonItemBlouse(List<CollectionElement> pinData, ValidateElementVO elementVO, CurrentDesignPictureTypeEnum designPictureType) {
List<DesignPythonItem> items = Lists.newArrayList();
//剩余的的PinData
List<Long> existPinDataIds = elementVO.getExistPinDataIds();
List<CollectionElement> residuePinData = residuePinData(pinData, existPinDataIds, elementVO.getHasUseMd5List());
if (CollectionUtil.isNotEmpty(residuePinData)) {
//single模式
if (SingleOverallEnum.SINGLE.getRealName().equals(elementVO.getSingleOverall())) {
if (DesignPythonItem.OUTWEAR_DRESS_BLOUSE.contains(elementVO.getSwitchCategory())) {
//是否包含的Pin
Boolean isPin = residuePinData.stream().filter(residue ->
elementVO.getSwitchCategory().equals(residue.getLevel2Type())).findFirst().isPresent();
//如果包含Pin只传一个
if (isPin) {
//Pin的数据
pinData = getPinDataByLevel2Type(pinData, elementVO.getSwitchCategory());
//剩余的的PinData
List<CollectionElement> residueInnerPinDataByType = residuePinData(pinData, existPinDataIds, elementVO.getHasUseMd5List());
CollectionElement elementNew = CollectionUtils.isEmpty(residueInnerPinDataByType) ? null : residueInnerPinDataByType.get(0);
if (Objects.nonNull(elementNew)) {
items.add(coverToDesignPythonItem(elementNew.getId(), elementVO.getSwitchCategory(), elementNew.getUrl(), elementVO));
//去重用
existPinDataIds.add(elementNew.getId());
//添加MD5
elementVO.getHasUseMd5List().add(elementNew.getMd5());
}
}
}
} else {
//是否包含blouse的Pin
Boolean isPin = residuePinData.stream().filter(residue ->
DesignPythonItem.OUTWEAR_DRESS_BLOUSE.contains(residue.getLevel2Type())).findFirst().isPresent();
//如果包含Pin只传一个
if (isPin) {
List<CollectionElement> finalPinData = pinData;
2024-01-10 14:02:17 +08:00
for (String type : DesignPythonItem.OUTWEAR_DRESS_BLOUSE) {
// 剩余的的 PinData
2023-01-06 15:17:37 +08:00
List<CollectionElement> residueInnerPinData = residuePinData(finalPinData, existPinDataIds, elementVO.getHasUseMd5List());
CollectionElement elementNew = residueInnerPinData.stream()
.filter(element -> element.getLevel2Type().equals(type)).findFirst().orElse(null);
if (Objects.nonNull(elementNew)) {
items.add(coverToDesignPythonItem(elementNew.getId(), type, elementNew.getUrl(), elementVO));
2024-01-10 14:02:17 +08:00
// 去重用
2023-01-06 15:17:37 +08:00
existPinDataIds.add(elementNew.getId());
2024-01-10 14:02:17 +08:00
// 添加md5
2023-01-06 15:17:37 +08:00
elementVO.getHasUseMd5List().add(elementNew.getMd5());
2024-01-10 14:02:17 +08:00
// 提前结束循环
break;
2023-01-06 15:17:37 +08:00
}
2024-01-10 14:02:17 +08:00
}
2023-01-06 15:17:37 +08:00
}
}
}
if (CollectionUtil.isNotEmpty(items)) {
return items;
}
switch (designPictureType) {
case PIN:
if (CollectionUtil.isEmpty(items)) {
//single模式
if (SingleOverallEnum.SINGLE.getRealName().equals(elementVO.getSingleOverall())) {
if (DesignPythonItem.OUTWEAR_DRESS_BLOUSE.contains(elementVO.getSwitchCategory())) {
//系统获取
2023-10-10 15:02:06 +08:00
SysFileVO sysFileVO = getRandomSysFileByLevel2Type(elementVO.getSwitchCategory(), elementVO.getSysFileIds(), elementVO.getModelSex());
2023-01-06 15:17:37 +08:00
DesignPythonItem item = coverToDesignPythonItem(null, sysFileVO.getLevel2Type(), sysFileVO.getUrl(), elementVO);
item.setBusinessId(sysFileVO.getId());
items.add(item);
return items;
}
} else {
//系统获取
2023-10-20 14:47:18 +08:00
SysFileVO sysFileVO = getRandomSysFileOutwear(elementVO.getSysFileVo(), elementVO.getSysFileIds(), elementVO.getModelSex());
2023-01-06 15:17:37 +08:00
DesignPythonItem item = coverToDesignPythonItem(null, sysFileVO.getLevel2Type(), sysFileVO.getUrl(), elementVO);
item.setBusinessId(sysFileVO.getId());
items.add(item);
return items;
}
}
break;
2024-02-20 10:12:44 +08:00
// case USER_LIBRARY:
// //single模式
// if (SingleOverallEnum.SINGLE.getRealName().equals(elementVO.getSingleOverall())) {
// if (DesignPythonItem.OUTWEAR_DRESS_BLOUSE.contains(elementVO.getSwitchCategory())) {
// LibraryVo libraryVo = getRandomLibrary(elementVO.getLibraryVos(),
// Arrays.asList(elementVO.getSwitchCategory()), elementVO.getHasUseMd5List());
// if (StringUtils.isEmpty(libraryVo)) {
// //系统获取
// SysFileVO sysFileVO = getRandomSysFileByLevel2Type(elementVO.getSwitchCategory(), elementVO.getSysFileIds(), elementVO.getModelSex());
// DesignPythonItem item = coverToDesignPythonItem(null, sysFileVO.getLevel2Type(), sysFileVO.getUrl(), elementVO);
// item.setBusinessId(sysFileVO.getId());
// items.add(item);
// return items;
// }
// DesignPythonItem item = coverToDesignPythonItem(null, libraryVo.getLevel2Type(), libraryVo.getUrl(), elementVO);
// item.setBusinessId(libraryVo.getId());
// elementVO.getHasUseMd5List().add(libraryVo.getMd5());
// items.add(item);
// }
// } else {
// LibraryVo libraryVo = getRandomLibrary(elementVO.getLibraryVos(),
// DesignPythonItem.OUTWEAR_DRESS_BLOUSE, elementVO.getHasUseMd5List());
// if (StringUtils.isEmpty(libraryVo)) {
// //系统获取
// SysFileVO sysFileVO = getRandomSysFileOutwear(elementVO.getSysFileVo(), elementVO.getSysFileIds(), elementVO.getModelSex());
// DesignPythonItem item = coverToDesignPythonItem(null, sysFileVO.getLevel2Type(), sysFileVO.getUrl(), elementVO);
// item.setBusinessId(sysFileVO.getId());
// items.add(item);
// return items;
// }
// DesignPythonItem item = coverToDesignPythonItem(null, libraryVo.getLevel2Type(), libraryVo.getUrl(), elementVO);
// item.setBusinessId(libraryVo.getId());
// elementVO.getHasUseMd5List().add(libraryVo.getMd5());
// items.add(item);
// }
// break;
2023-01-06 15:17:37 +08:00
case SYS_FILE:
//single模式
if (SingleOverallEnum.SINGLE.getRealName().equals(elementVO.getSingleOverall())) {
if (DesignPythonItem.OUTWEAR_DRESS_BLOUSE.contains(elementVO.getSwitchCategory())) {
//系统获取
2023-10-10 15:02:06 +08:00
SysFileVO sysFileVO = getRandomSysFileByLevel2Type(elementVO.getSwitchCategory(), elementVO.getSysFileIds(), elementVO.getModelSex());
2023-01-06 15:17:37 +08:00
DesignPythonItem item = coverToDesignPythonItem(null, sysFileVO.getLevel2Type(), sysFileVO.getUrl(), elementVO);
item.setBusinessId(sysFileVO.getId());
items.add(item);
return items;
}
} else {
//系统获取
2023-10-20 14:47:18 +08:00
SysFileVO sysFileVO = getRandomSysFileOutwear(elementVO.getSysFileVo(), elementVO.getSysFileIds(), elementVO.getModelSex());
2023-01-06 15:17:37 +08:00
DesignPythonItem item = coverToDesignPythonItem(null, sysFileVO.getLevel2Type(), sysFileVO.getUrl(), elementVO);
item.setBusinessId(sysFileVO.getId());
items.add(item);
return items;
}
break;
case NO_PIN:
//single模式
if (SingleOverallEnum.SINGLE.getRealName().equals(elementVO.getSingleOverall())) {
if (DesignPythonItem.OUTWEAR_DRESS_BLOUSE.contains(elementVO.getSwitchCategory())) {
//非Pin的数据
List<CollectionElement> noPinDataByType = getNoPinData(
elementVO.getSketchBoardElements(), Collections.singletonList(elementVO.getSwitchCategory()));
CollectionElement collectionElement = getRandomSketchLibrary(noPinDataByType, elementVO.getHasUseMd5List());
if (Objects.isNull(collectionElement)) {
//系统获取
2023-10-10 15:02:06 +08:00
SysFileVO sysFileVO = getRandomSysFileByLevel2Type(elementVO.getSwitchCategory(), elementVO.getSysFileIds(), elementVO.getModelSex());
2023-01-06 15:17:37 +08:00
DesignPythonItem item = coverToDesignPythonItem(null, sysFileVO.getLevel2Type(), sysFileVO.getUrl(), elementVO);
item.setBusinessId(sysFileVO.getId());
items.add(item);
} else {
elementVO.getHasUseMd5List().add(collectionElement.getMd5());
items.add(coverToDesignPythonItem(collectionElement.getId(), collectionElement.getLevel2Type(), collectionElement.getUrl(), elementVO));
}
}
} else {
//非Pin的数据
List<CollectionElement> noPinData = getNoPinData(elementVO.getSketchBoardElements(), DesignPythonItem.OUTWEAR_DRESS_BLOUSE);
CollectionElement collectionElement = getRandomSketchLibrary(noPinData, elementVO.getHasUseMd5List());
if (Objects.isNull(collectionElement)) {
//系统获取
2023-10-20 14:47:18 +08:00
SysFileVO sysFileVO = getRandomSysFileOutwear(elementVO.getSysFileVo(), elementVO.getSysFileIds(), elementVO.getModelSex());
2023-01-06 15:17:37 +08:00
DesignPythonItem item = coverToDesignPythonItem(null, sysFileVO.getLevel2Type(), sysFileVO.getUrl(), elementVO);
item.setBusinessId(sysFileVO.getId());
items.add(item);
} else {
elementVO.getHasUseMd5List().add(collectionElement.getMd5());
items.add(coverToDesignPythonItem(collectionElement.getId(), collectionElement.getLevel2Type(), collectionElement.getUrl(), elementVO));
}
}
break;
default:
}
return items;
}
private DesignPythonItem coverToDesignPythonItem(Long elementId, String type, String path,
ValidateElementVO elementVO) {
DesignPythonItem designPythonItemBlouse = new DesignPythonItem();
if (Objects.nonNull(elementId)) {
designPythonItemBlouse.setElementId(elementId);
designPythonItemBlouse.setBusinessId(elementId);
}
designPythonItemBlouse.setType(type);
designPythonItemBlouse.setPath(path);
//所有的icon都是none
designPythonItemBlouse.setIcon("none");
2025-03-17 11:30:09 +08:00
CollectionColorDTO randomColor = getRandomColor(elementVO.getColorBoards());
2025-04-02 17:13:58 +08:00
if (Objects.nonNull(randomColor)) {
designPythonItemBlouse.setColor(randomColor.getRgbValue());
designPythonItemBlouse.setGradient(randomColor.getGradientMinioUrl());
designPythonItemBlouse.setGradientString(randomColor.getGradientString());
}
2023-01-06 15:17:37 +08:00
if (!elementVO.getDesignPythonItemPrint().getPath().equals("none")
&& elementVO.getDesignPrintPictureTypeLayoutList().contains(type)) {
2023-09-20 12:05:08 +08:00
DesignPythonItemPrint designPythonItemPrint = CopyUtil.copyObject(elementVO.getDesignPythonItemPrint(), DesignPythonItemPrint.class);
// designPythonItemPrint.setIfSingle(false);
2023-09-20 12:05:08 +08:00
designPythonItemPrint.setPrint_path_list(Collections.singletonList(designPythonItemPrint.getPath()));
designPythonItemBlouse.setPrint(new PrintToPython(designPythonItemPrint));
2023-01-06 15:17:37 +08:00
} else {
2023-09-20 12:05:08 +08:00
DesignPythonItemPrint designPythonItemPrint = new DesignPythonItemPrint();
// designPythonItemPrint.setIfSingle(false);
2023-09-20 12:05:08 +08:00
designPythonItemPrint.setPrint_path_list(new ArrayList<>());
designPythonItemBlouse.setPrint(new PrintToPython(designPythonItemPrint));
2023-01-06 15:17:37 +08:00
}
return designPythonItemBlouse;
}
2024-02-20 10:12:44 +08:00
private DesignPythonItem coverSketchToDesignPythonItem(Long elementId, CollectionElement collectionElement, ValidateElementVO elementVO) {
DesignPythonItem designPythonItemBlouse = new DesignPythonItem();
if (Objects.nonNull(elementId)) {
designPythonItemBlouse.setElementId(elementId);
designPythonItemBlouse.setBusinessId(elementId);
}
designPythonItemBlouse.setType(collectionElement.getLevel2Type());
designPythonItemBlouse.setPath(collectionElement.getUrl());
//所有的icon都是none
designPythonItemBlouse.setIcon("none");
2025-03-17 11:30:09 +08:00
CollectionColorDTO randomColor = getRandomColor(elementVO.getColorBoards());
2025-04-02 17:13:58 +08:00
if (Objects.nonNull(randomColor)) {
designPythonItemBlouse.setColor(randomColor.getRgbValue());
designPythonItemBlouse.setGradient(randomColor.getGradientMinioUrl());
designPythonItemBlouse.setGradientString(randomColor.getGradientString());
}
2024-02-20 10:12:44 +08:00
if (!elementVO.getDesignPythonItemPrint().getPath().equals("none")
&& elementVO.getDesignPrintPictureTypeLayoutList().contains(collectionElement.getLevel2Type())) {
DesignPythonItemPrint designPythonItemPrint = CopyUtil.copyObject(elementVO.getDesignPythonItemPrint(), DesignPythonItemPrint.class);
// designPythonItemPrint.setIfSingle(false);
2024-02-20 10:12:44 +08:00
designPythonItemPrint.setPrint_path_list(Collections.singletonList(designPythonItemPrint.getPath()));
designPythonItemBlouse.setPrint(new PrintToPython(designPythonItemPrint));
2024-02-20 10:12:44 +08:00
} else {
DesignPythonItemPrint designPythonItemPrint = new DesignPythonItemPrint();
// designPythonItemPrint.setIfSingle(false);
2024-02-20 10:12:44 +08:00
designPythonItemPrint.setPrint_path_list(new ArrayList<>());
designPythonItemBlouse.setPrint(new PrintToPython(designPythonItemPrint));
2024-02-20 10:12:44 +08:00
}
return designPythonItemBlouse;
}
2025-03-18 13:43:59 +08:00
private DesignPythonItem coverSystemSketchUrlToDesignPythonItem(String url, String category, ValidateElementVO elementVO) {
DesignPythonItem designPythonItemBlouse = new DesignPythonItem();
// if (Objects.nonNull(elementId)) {
// designPythonItemBlouse.setElementId(null);
// designPythonItemBlouse.setBusinessId(null);
// }
designPythonItemBlouse.setType(category);
designPythonItemBlouse.setPath(url);
//所有的icon都是none
designPythonItemBlouse.setIcon("none");
CollectionColorDTO randomColor = getRandomColor(elementVO.getColorBoards());
2025-04-02 17:13:58 +08:00
if (Objects.nonNull(randomColor)) {
designPythonItemBlouse.setColor(randomColor.getRgbValue());
designPythonItemBlouse.setGradient(randomColor.getGradientMinioUrl());
designPythonItemBlouse.setGradientString(randomColor.getGradientString());
}
2025-03-18 13:43:59 +08:00
if (!elementVO.getDesignPythonItemPrint().getPath().equals("none")
&& elementVO.getDesignPrintPictureTypeLayoutList().contains(category)) {
DesignPythonItemPrint designPythonItemPrint = CopyUtil.copyObject(elementVO.getDesignPythonItemPrint(), DesignPythonItemPrint.class);
// designPythonItemPrint.setIfSingle(false);
designPythonItemPrint.setPrint_path_list(Collections.singletonList(designPythonItemPrint.getPath()));
designPythonItemBlouse.setPrint(new PrintToPython(designPythonItemPrint));
} else {
DesignPythonItemPrint designPythonItemPrint = new DesignPythonItemPrint();
// designPythonItemPrint.setIfSingle(false);
designPythonItemPrint.setPrint_path_list(new ArrayList<>());
designPythonItemBlouse.setPrint(new PrintToPython(designPythonItemPrint));
}
return designPythonItemBlouse;
}
2023-01-06 15:17:37 +08:00
private List<CollectionElement> residuePinData(List<CollectionElement> pinData, List<Long> existPinDataIds, List<String> hasUseMd5List) {
if (CollectionUtils.isEmpty(pinData)) {
return null;
}
return pinData.stream().filter(v -> (!existPinDataIds.contains(v.getId()))
&& (!hasUseMd5List.contains(v.getMd5()))).collect(Collectors.toList());
}
private DesignPythonBasic coverToBasic(DesignPythonItem designPythonItem, String singleOverall,
2025-05-28 11:12:26 +08:00
String switchCategory, DesignLibraryModelPointVO designLibraryModelPoint, DesignLibraryModelPointVO designLibraryModelPointVO) {
2023-01-06 15:17:37 +08:00
DesignPythonBasic basic = new DesignPythonBasic();
basic.setSingle_overall(singleOverall);
basic.setSwitch_category(switchCategory);
2024-02-20 10:12:44 +08:00
// basic.setSave_name(getPythonOutputPath(
// StringUtils.isEmpty(designPythonItem.getPath()) ? designPythonItem.getBody_path() : designPythonItem.getPath(),
// PythonToJavaApiOperationTypeEnum.DESIGN_COLLECTION));
2023-01-06 15:17:37 +08:00
basic.setScale_bag(0.7);
basic.setSelf_template(Boolean.FALSE);
if (Objects.nonNull(designLibraryModelPoint)) {
basic.setSelf_template(Boolean.TRUE);
}
basic.setScale_earrings(0.16);
2025-05-28 11:12:26 +08:00
if (Objects.nonNull(designLibraryModelPointVO)) {
basic.setBody_point_test(getMap(designLibraryModelPointVO));
2025-05-28 09:37:27 +08:00
}else {
basic.setBody_point_test(getMap(designLibraryModelPoint));
}
2023-01-06 15:17:37 +08:00
return basic;
}
2025-05-28 09:37:27 +08:00
private DesignLibraryModelPointVO getRandomDesignLibraryModelPoint(List<DesignLibraryModelPointVO> mannequins) {
DesignLibraryModelPointVO vo = new DesignLibraryModelPointVO();
Random random = new Random();
int randomNumber = random.nextInt(mannequins.size());
return mannequins.get(randomNumber);
}
private Map<String, Object> getMap(DesignLibraryModelPointVO designLibraryModelPointOld) {
Map<String, Object> body_point = Maps.newHashMap();
2023-01-06 15:17:37 +08:00
if (Objects.nonNull(designLibraryModelPointOld)) {
DesignLibraryModelPointVO designLibraryModelPoint =
2023-10-20 14:47:18 +08:00
CopyUtil.copyObject(designLibraryModelPointOld, DesignLibraryModelPointVO.class);
2023-01-06 15:17:37 +08:00
//自己的template是6个点
body_point.put("shoulder_left", resolve(designLibraryModelPoint.getShoulderLeft()));
body_point.put("shoulder_right", resolve(designLibraryModelPoint.getShoulderRight()));
body_point.put("waistband_left", resolve(designLibraryModelPoint.getWaistbandLeft()));
body_point.put("waistband_right", resolve(designLibraryModelPoint.getWaistbandRight()));
body_point.put("hand_point_left", resolve(designLibraryModelPoint.getHandLeft()));
body_point.put("hand_point_right", resolve(designLibraryModelPoint.getHandRight()));
2025-05-28 09:37:27 +08:00
body_point.put("relation_id", designLibraryModelPoint.getRelationId());
body_point.put("relation_type", designLibraryModelPoint.getRelationType());
2023-01-06 15:17:37 +08:00
} else {
//默认是13个点
body_point.put("shoulder_left", Arrays.asList(755, 519));
body_point.put("shoulder_right", Arrays.asList(912, 519));
body_point.put("waistband_left", Arrays.asList(777, 725));
body_point.put("waistband_right", Arrays.asList(891, 725));
body_point.put("hand_point_left", Arrays.asList(754, 886));
body_point.put("hand_point_right", Arrays.asList(915, 886));
body_point.put("head_point_up", Arrays.asList(834, 390));
body_point.put("head_point_left", Arrays.asList(804, 424));
body_point.put("head_point_right", Arrays.asList(864, 424));
body_point.put("toe_left", Arrays.asList(817, 1355));
body_point.put("toe_right", Arrays.asList(850, 1355));
body_point.put("ear_point_left", Arrays.asList(802, 439));
body_point.put("ear_point_right", Arrays.asList(865, 438));
body_point.put("foot_length", Arrays.asList(784, 1336, 825, 1336));
}
return body_point;
}
private List<Integer> resolve(List<BigDecimal> list) {
List<Integer> integerList = Lists.newArrayList();
2023-10-20 14:47:18 +08:00
list.forEach(l -> {
2023-01-06 15:17:37 +08:00
integerList.add(new Integer(l.intValue()));
});
return integerList;
}
2024-02-20 10:12:44 +08:00
private List<CollectionElement> getPinData(ValidateElementVO elementVO) {
2024-02-21 13:53:46 +08:00
List<CollectionElement> pinData = getPinData(elementVO.getSketchBoardElements(), elementVO.getHasUseMd5List(), elementVO.getModelSex());
2024-02-20 10:12:44 +08:00
if (elementVO.getSingleOverall().equals(SingleOverallEnum.SINGLE.getRealName())) {
if (!CollectionUtils.isEmpty(pinData)) {
return pinData.stream().filter(o -> o.getLevel2Type().equals(elementVO.getSwitchCategory())).collect(Collectors.toList());
} else {
2024-02-20 10:12:44 +08:00
return pinData;
}
} else {
2024-02-20 10:12:44 +08:00
return pinData;
}
}
2024-02-21 13:53:46 +08:00
private List<CollectionElement> getPinDataWhole(ValidateElementVO elementVO) {
List<CollectionElement> pinData = getPinDataWhole(elementVO.getSketchBoardElements(), elementVO.getHasUseMd5List(), elementVO.getModelSex());
if (elementVO.getSingleOverall().equals(SingleOverallEnum.SINGLE.getRealName())) {
if (!CollectionUtils.isEmpty(pinData)) {
return pinData.stream().filter(o -> o.getLevel2Type().equals(elementVO.getSwitchCategory())).collect(Collectors.toList());
} else {
2024-02-21 13:53:46 +08:00
return pinData;
}
} else {
2024-02-21 13:53:46 +08:00
return pinData;
}
}
private List<CollectionElement> getPinDataWhole(List<CollectionElement> sketchBoardElements, List<String> hasUseMd5List, String modelSex) {
if (CollectionUtils.isEmpty(sketchBoardElements)) {
return null;
}
List<CollectionElement> sketchBoardPins = sketchBoardElements
.stream().filter(v -> v.getHasPin() == 1).collect(Collectors.toList());
if (modelSex.equals(Sex.MALE.getValue())) {
sketchBoardPins = sketchBoardPins.stream().filter(o -> MALE_CATEGORY.contains(o.getLevel2Type())).collect(Collectors.toList());
}
if (modelSex.equals(Sex.FEMALE.getValue())) {
sketchBoardPins = sketchBoardPins.stream().filter(o -> FEMALE_CATEGORY.contains(o.getLevel2Type())).collect(Collectors.toList());
}
if (CollectionUtils.isEmpty(sketchBoardPins)) {
return null;
}
return sketchBoardPins;
}
public final static List<String> FEMALE_CATEGORY = Arrays.asList("Dress", "Blouse", "Skirt", "Trousers", "Outwear");
public final static List<String> MALE_CATEGORY = Arrays.asList("Tops", "Bottoms", "Outwear");
2024-02-21 13:53:46 +08:00
private List<CollectionElement> getPinData(List<CollectionElement> sketchBoardElements, List<String> hasUseMd5List, String modelSex) {
2023-01-06 15:17:37 +08:00
if (CollectionUtils.isEmpty(sketchBoardElements)) {
return null;
}
List<CollectionElement> sketchBoardPins = sketchBoardElements
.stream().filter(v -> v.getHasPin() == 1 && (!hasUseMd5List.contains(v.getMd5()))).collect(Collectors.toList());
2024-02-21 13:53:46 +08:00
if (modelSex.equals(Sex.MALE.getValue())) {
sketchBoardPins = sketchBoardPins.stream().filter(o -> MALE_CATEGORY.contains(o.getLevel2Type())).collect(Collectors.toList());
}
if (modelSex.equals(Sex.FEMALE.getValue())) {
sketchBoardPins = sketchBoardPins.stream().filter(o -> FEMALE_CATEGORY.contains(o.getLevel2Type())).collect(Collectors.toList());
}
2023-01-06 15:17:37 +08:00
if (CollectionUtils.isEmpty(sketchBoardPins)) {
return null;
}
2024-02-20 10:12:44 +08:00
return sketchBoardPins;
}
private List<CollectionElement> getNoPinData(ValidateElementVO elementVO) {
if (elementVO.getSingleOverall().equals(SingleOverallEnum.SINGLE.getRealName())) {
2024-02-21 13:53:46 +08:00
List<CollectionElement> noPinData = getNoPinData(elementVO.getSketchBoardElements(), elementVO.getModelSex());
2024-02-20 10:12:44 +08:00
if (CollectionUtils.isEmpty(noPinData)) {
return null;
}
return noPinData.stream().filter(o -> o.getLevel2Type().equals(elementVO.getSwitchCategory())).collect(Collectors.toList());
} else {
2024-02-21 13:53:46 +08:00
return getNoPinData(elementVO.getSketchBoardElements(), elementVO.getModelSex());
2024-02-20 10:12:44 +08:00
}
}
2024-02-21 13:53:46 +08:00
private List<CollectionElement> getNoPinData(List<CollectionElement> sketchBoardElements, String modelSex) {
2024-02-20 10:12:44 +08:00
if (CollectionUtils.isEmpty(sketchBoardElements)) {
return null;
}
List<CollectionElement> sketchBoardPins = sketchBoardElements
.stream().filter(v -> v.getHasPin() == 0).collect(Collectors.toList());
2024-02-21 13:53:46 +08:00
if (modelSex.equals(Sex.MALE.getValue())) {
sketchBoardPins = sketchBoardPins.stream().filter(o -> MALE_CATEGORY.contains(o.getLevel2Type())).collect(Collectors.toList());
}
if (modelSex.equals(Sex.FEMALE.getValue())) {
sketchBoardPins = sketchBoardPins.stream().filter(o -> FEMALE_CATEGORY.contains(o.getLevel2Type())).collect(Collectors.toList());
}
2024-02-20 10:12:44 +08:00
if (CollectionUtils.isEmpty(sketchBoardPins)) {
return null;
}
return sketchBoardPins;
2023-01-06 15:17:37 +08:00
}
private List<CollectionElement> resolveElementFilterHistoryMd5(List<CollectionElement> elemet) {
//查询历史design数据
List<String> md5List = elemet.stream().map(CollectionElement::getMd5).collect(Collectors.toList());
List<DesignHistory> designHistories = designHistoryService.getByMD5List(md5List);
if (CollectionUtils.isEmpty(designHistories)) {
return elemet;
}
List<String> existMd5List = designHistories.stream().map(DesignHistory::getMd5).collect(Collectors.toList());
return elemet.stream().filter(f -> !existMd5List.contains(f.getMd5())).collect(Collectors.toList());
}
private List<CollectionElement> getPinDataByLevel2Type(List<CollectionElement> sketchBoardElements, String level2Type) {
if (CollectionUtils.isEmpty(sketchBoardElements)) {
return null;
}
List<CollectionElement> sketchBoardPins = sketchBoardElements
.stream().filter(v -> v.getHasPin() == 1 && v.getLevel2Type().equals(level2Type)).collect(Collectors.toList());
if (CollectionUtils.isEmpty(sketchBoardPins)) {
return null;
}
return CopyUtil.copyList(sketchBoardPins, CollectionElement.class);
}
private List<CollectionElement> getNoPinData(List<CollectionElement> sketchBoardElements, List<String> Level2TypeList) {
if (CollectionUtils.isEmpty(sketchBoardElements)) {
return null;
}
List<CollectionElement> sketchBoardPins = sketchBoardElements
.stream().filter(v -> v.getHasPin() == 0 && Level2TypeList.contains(v.getLevel2Type())).collect(Collectors.toList());
if (CollectionUtils.isEmpty(sketchBoardPins)) {
return null;
}
return CopyUtil.copyList(sketchBoardPins, CollectionElement.class);
}
2023-10-10 15:02:06 +08:00
private SysFileVO getRandomSysFileOutwear(List<SysFileVO> sysFileVo, List<Long> sysFileIds, String modelSex) {
2023-01-06 15:17:37 +08:00
Long randomIndex = RandomsUtil.randomSysFile(0L, 3L);
2023-10-20 14:47:18 +08:00
if (CollectionUtils.isEmpty(sysFileVo)) {
2023-10-10 15:02:06 +08:00
return getRandomSysFileByLevel2Type(DesignPythonItem.OUTWEAR_DRESS_BLOUSE.get(randomIndex.intValue()), sysFileIds, modelSex);
2023-10-20 14:47:18 +08:00
} else {
2023-01-06 15:17:37 +08:00
//attribute_retrieval 算法,满足blouse + outwear+dress>8,以及 skirt+trousers>8
2023-10-20 14:47:18 +08:00
return getRandomSysFileByAttributeRetrieval(DesignPythonItem.OUTWEAR_DRESS_BLOUSE, sysFileVo, sysFileIds);
2023-01-06 15:17:37 +08:00
}
}
2023-10-10 17:33:39 +08:00
private SysFileVO getRandomSysFileMaleTops(List<SysFileVO> sysFileVo, List<Long> sysFileIds, String modelSex) {
Long randomIndex = RandomsUtil.randomSysFile(0L, 1L);
2023-10-20 14:47:18 +08:00
if (CollectionUtils.isEmpty(sysFileVo)) {
2023-10-10 17:33:39 +08:00
return getRandomSysFileByLevel2Type(DesignPythonItem.TOPS.get(randomIndex.intValue()), sysFileIds, modelSex);
2023-10-20 14:47:18 +08:00
} else {
2023-10-10 17:33:39 +08:00
//attribute_retrieval 算法,满足blouse + outwear+dress>8,以及 skirt+trousers>8
2023-10-20 14:47:18 +08:00
return getRandomSysFileByAttributeRetrieval(DesignPythonItem.TOPS, sysFileVo, sysFileIds);
2023-10-10 17:33:39 +08:00
}
}
private SysFileVO getRandomSysFileMaleBottoms(List<SysFileVO> sysFileVo, List<Long> sysFileIds, String modelSex) {
Long randomIndex = RandomsUtil.randomSysFile(0L, 1L);
2023-10-20 14:47:18 +08:00
if (CollectionUtils.isEmpty(sysFileVo)) {
2023-10-10 17:33:39 +08:00
return getRandomSysFileByLevel2Type(DesignPythonItem.BOTTOMS.get(randomIndex.intValue()), sysFileIds, modelSex);
2023-10-20 14:47:18 +08:00
} else {
2023-10-10 17:33:39 +08:00
//attribute_retrieval 算法,满足blouse + outwear+dress>8,以及 skirt+trousers>8
2023-10-20 14:47:18 +08:00
return getRandomSysFileByAttributeRetrieval(DesignPythonItem.BOTTOMS, sysFileVo, sysFileIds);
2023-10-10 17:33:39 +08:00
}
}
2023-10-10 15:02:06 +08:00
private SysFileVO getRandomSysFileSkirt(List<SysFileVO> sysFileVo, List<Long> sysFileIds, String modelSex) {
2023-01-06 15:17:37 +08:00
Long randomIndex = RandomsUtil.randomSysFile(0L, 2L);
2023-10-20 14:47:18 +08:00
if (CollectionUtils.isEmpty(sysFileVo)) {
2023-10-10 15:02:06 +08:00
return getRandomSysFileByLevel2Type(DesignPythonItem.SKIRT_TROUSERS.get(randomIndex.intValue()), sysFileIds, modelSex);
2023-10-20 14:47:18 +08:00
} else {
2023-01-06 15:17:37 +08:00
//attribute_retrieval 算法,满足blouse + outwear+dress>8,以及 skirt+trousers>8
2023-10-20 14:47:18 +08:00
return getRandomSysFileByAttributeRetrieval(DesignPythonItem.SKIRT_TROUSERS, sysFileVo, sysFileIds);
2023-01-06 15:17:37 +08:00
}
}
2023-10-10 15:02:06 +08:00
private SysFileVO getRandomSysFileByLevel2Type(String level2Type, List<Long> sysFileIds, String modelSex) {
Long maxId = sysFileService.getMaxIdByLevel2Type(level2Type, modelSex);
Long minId = sysFileService.getMinIdByLevel2Type(level2Type, modelSex);
2023-01-06 15:17:37 +08:00
Long sysFileId = null;
do {
sysFileId = RandomsUtil.randomSysFile(minId, maxId + 1);
} while (sysFileIds.contains(sysFileId));
sysFileIds.add(sysFileId);
return sysFileService.getById(sysFileId);
}
2023-10-20 14:47:18 +08:00
private SysFileVO getRandomSysFileByAttributeRetrieval(List<String> level2TypeList, List<SysFileVO> sysFileVo, List<Long> sysFileIds) {
2023-01-06 15:17:37 +08:00
sysFileVo = sysFileVo.stream().filter(
2023-10-20 14:47:18 +08:00
f -> level2TypeList.contains(f.getLevel2Type()) && (!sysFileIds.contains(f.getId())))
2023-01-06 15:17:37 +08:00
.collect(Collectors.toList());
Long maxId = (long) sysFileVo.size();
Long minId = 0L;
Long key = null;
Long sysFileId = null;
do {
key = RandomsUtil.randomSysFile(minId, maxId);
sysFileId = sysFileVo.get(key.intValue()).getId();
} while (sysFileIds.contains(sysFileId));
sysFileIds.add(sysFileId);
return sysFileVo.get(key.intValue());
}
2024-05-10 17:17:28 +08:00
private CollectionColorDTO getRandomColor(List<CollectionColorDTO> colorBoards) {
2025-04-02 17:13:58 +08:00
if (CollectionUtils.isEmpty(colorBoards)) {
return null;
}
2023-01-06 15:17:37 +08:00
if (colorBoards.size() == 1) {
2024-05-10 17:17:28 +08:00
return colorBoards.get(0);
2023-01-06 15:17:37 +08:00
}
long maxColor = colorBoards.size();
long minColor = 0;
Long randomIndex = RandomsUtil.randomSysFile(minColor, maxColor);
2024-05-10 17:17:28 +08:00
return colorBoards.get(randomIndex.intValue());
2023-01-06 15:17:37 +08:00
}
private CollectionElement getRandomSketchLibrary(List<CollectionElement> sketchBoardElementOlds, List<String> hasUseMd5List) {
if (CollectionUtil.isEmpty(sketchBoardElementOlds)) {
return null;
}
List<CollectionElement> sketchBoardElements = sketchBoardElementOlds.stream().filter(f -> !hasUseMd5List.contains(f.getMd5())).collect(Collectors.toList());
if (CollectionUtils.isEmpty(sketchBoardElements)) {
return null;
}
if (sketchBoardElements.size() == 1) {
return sketchBoardElements.get(0);
}
long maxSketch = sketchBoardElements.size();
long minSketch = 0;
Long randomIndex = RandomsUtil.randomSysFile(minSketch, maxSketch);
return sketchBoardElements.get(randomIndex.intValue());
}
private DesignPythonItemPrint getRandomPrint(ValidateElementVO elementVO, CurrentDesignPrintPictureTypeEnum designPrintPictureType) {
//print 不取library的 只取element的
DesignPythonItemPrint print = new DesignPythonItemPrint();
if (CollectionUtil.isEmpty(elementVO.getPrintBoardElements())) {
print.setPath("none");
return print;
}
2023-11-21 14:09:47 +08:00
List<CollectionElement> printBoardElements;
if (designPrintPictureType.equals(CurrentDesignPrintPictureTypeEnum.PIN)) {
printBoardElements = elementVO.getPrintBoardElements()
.stream()
.filter(f -> !elementVO.getHasUseMd5List().contains(f.getMd5())).collect(Collectors.toList());
2024-01-25 13:37:17 +08:00
} else {
2023-11-21 14:09:47 +08:00
printBoardElements = elementVO.getPrintBoardElements();
}
2023-01-06 15:17:37 +08:00
if (CollectionUtil.isEmpty(printBoardElements)) {
print.setPath("none");
return print;
}
switch (designPrintPictureType) {
case NO:
//print 已用完
print.setPath("none");
return print;
case NO_PIN:
printBoardElements = printBoardElements.stream().filter(f -> f.getHasPin() == 0).collect(Collectors.toList());
break;
case PIN:
printBoardElements = printBoardElements.stream().filter(f -> f.getHasPin() == 1).collect(Collectors.toList());
break;
default:
}
if (printBoardElements.size() == 1) {
print.setPath(printBoardElements.get(0).getUrl());
elementVO.getHasUseMd5List().add(printBoardElements.get(0).getMd5());
return print;
}
long maxPrint = printBoardElements.size();
long minPrint = 0;
Long randomIndex = RandomsUtil.randomSysFile(minPrint, maxPrint);
print.setPath(printBoardElements.get(randomIndex.intValue()).getUrl());
elementVO.getHasUseMd5List().add(printBoardElements.get(randomIndex.intValue()).getMd5());
return print;
}
private LibraryVo getRandomLibrary(List<LibraryVo> libraryOldVos, List<String> containLevel2Type, List<String> hasUseMd5List) {
if (CollectionUtils.isEmpty(libraryOldVos)) {
return null;
}
List<LibraryVo> libraryVos = libraryOldVos.stream().filter(f -> (!hasUseMd5List.contains(f.getMd5())) &&
CollectionLevel1TypeEnum.SKETCH_BOARD.getRealName().equals(f.getLevel1Type())).collect(Collectors.toList());
if (CollectionUtils.isEmpty(libraryVos)) {
return null;
}
if (StringUtils.isEmpty(containLevel2Type)) {
if (libraryVos.size() == 1) {
return libraryVos.get(0);
}
long maxLibrary = libraryVos.size();
long minLibrary = 0;
Long randomIndex = RandomsUtil.randomSysFile(minLibrary, maxLibrary);
return libraryVos.get(randomIndex.intValue());
} else {
List<LibraryVo> filter = libraryVos.stream().filter(f -> containLevel2Type.contains(f.getLevel2Type())).collect(Collectors.toList());
if (CollectionUtils.isEmpty(filter)) {
return null;
}
if (filter.size() == 1) {
return filter.get(0);
}
long maxLibrary = filter.size();
long minLibrary = 0;
Long randomIndex = RandomsUtil.randomSysFile(minLibrary, maxLibrary);
return filter.get(randomIndex.intValue());
}
}
/**
* 生成design服装
*
* @param designPythonObjects
* @return
*/
public Boolean design(DesignPythonObjects designPythonObjects) {
//限流校验
2023-10-20 14:47:18 +08:00
AccessLimitUtils.validate("design", 5);
2023-01-06 15:17:37 +08:00
OkHttpClient client = new OkHttpClient().newBuilder()
.connectTimeout(30, TimeUnit.SECONDS)
.pingInterval(5, TimeUnit.SECONDS)//websocket轮训间隔(单位:秒)
.readTimeout(60, TimeUnit.SECONDS)//读取超时(单位:秒)
.writeTimeout(60, TimeUnit.SECONDS)//写入超时(单位:秒)
.build();
MediaType mediaType = MediaType.parse("application/json");
//关闭FastJson的引用检测 防止出现$ref 现象
String param = JSON.toJSONString(designPythonObjects, SerializerFeature.DisableCircularReferenceDetect);
log.info("design请求python 参数:####{}", param);
RequestBody body = RequestBody.create(mediaType, param);
Request request = new Request.Builder()
2024-06-17 13:21:58 +08:00
.url(accessPythonIp + ":" + accessPythonPort + "/api/design")
// .url(fastApiPythonAddress + "/api/design")
2023-09-06 14:28:20 +08:00
// .url(accessPythonIp + ":10200/aifda/api/v1.0/generate")
2023-01-06 15:17:37 +08:00
.method("POST", body)
.addHeader("Authorization", "Basic YWlkbGFiOjEyMw==")
.addHeader("Content-Type", "application/json")
.build();
Response response = null;
try {
response = client.newCall(request).execute();
log.info("PythonService##response###{}", response);
log.info("PythonService##responseBodyStr###{}", response.body().string());
log.info("PythonService##responseBodyJson###{}", JSON.toJSONString(response.body()));
} catch (IOException ioException) {
log.error("PythonService##design异常###{}", ExceptionUtil.getThrowableList(ioException));
}
//去除限流
AccessLimitUtils.validateOut("design");
if (Objects.isNull(response)) {
log.error("PythonService##design异常###{}", "response or body is empty!");
throw new BusinessException("system error!");
}
JSONObject jsonObject = JSON.parseObject(JSON.toJSONString(response));
log.info("PythonService##jsonObject###{}", jsonObject);
Boolean result = jsonObject.getBoolean("successful");
if (result) {
return Boolean.TRUE;
}
log.info("PythonService##design异常jsonObject###{}", jsonObject);
//生成失败
throw new BusinessException("generate design exception!");
}
/**
2024-01-02 11:53:09 +08:00
* 生成高级图片废弃
2023-01-06 15:17:37 +08:00
*
* @param designPath
* @return
*/
public String generateHighDesign(String designPath) {
//限流校验
2023-10-20 14:47:18 +08:00
AccessLimitUtils.validate("generateHighDesign", 2);
2023-01-06 15:17:37 +08:00
OkHttpClient client = new OkHttpClient().newBuilder()
.connectTimeout(30, TimeUnit.SECONDS)
.pingInterval(5, TimeUnit.SECONDS)//websocket轮训间隔(单位:秒)
.readTimeout(60, TimeUnit.SECONDS)//读取超时(单位:秒)
.writeTimeout(60, TimeUnit.SECONDS)//写入超时(单位:秒)
.build();
Map<String, String> content = Maps.newHashMap();
content.put("img_path", designPath);
content.put("img_path_out_put", getPythonOutputPath(
designPath, PythonToJavaApiOperationTypeEnum.GENERATE_ADVANCED_DESIGN));
MediaType mediaType = MediaType.parse("application/json");
RequestBody body = RequestBody.create(mediaType, JSON.toJSONString(content));
Request request = new Request.Builder()
.url(accessPythonIp + ":11111/aifda/api/v1.0/sketch_to_real")
.method("POST", body)
.addHeader("Authorization", "Basic YWlkbGFiOjEyMw==")
.addHeader("Content-Type", "application/json")
.build();
Response response = null;
try {
log.info("生成高级design请求入参content###{}", JSON.toJSONString(content));
response = client.newCall(request).execute();
} catch (IOException ioException) {
log.error("PythonService##generateHighDesign异常###{}", ExceptionUtil.getThrowableList(ioException));
}
//去除限流
AccessLimitUtils.validateOut("generateHighDesign");
if (Objects.isNull(response)) {
log.error("PythonService##generateHighDesign异常###{}", "response or body is empty!");
throw new BusinessException("system error!");
}
JSONObject jsonObject = JSON.parseObject(JSON.toJSONString(response));
Boolean result = jsonObject.getBoolean("successful");
if (result) {
return content.get("img_path_out_put");
}
log.info("生成高级design失败###{}", jsonObject);
//生成失败
throw new BusinessException("system error!");
}
2023-10-20 14:47:18 +08:00
2023-01-06 15:17:37 +08:00
/**
* 生成 attribute_retrieval
*
* @param sketchUrlList
2023-10-13 10:52:12 +08:00
* @param modelSex
2023-01-06 15:17:37 +08:00
* @return
*/
2023-10-20 14:47:18 +08:00
public DesignAttributeRetrievalDTO generateAttributeRetrieval(List<String> sketchUrlList, Long userId, String modelSex) {
2023-01-06 15:17:37 +08:00
//限流校验
2023-10-20 14:47:18 +08:00
AccessLimitUtils.validate("generateAttributeRetrieval", 4);
2023-01-06 15:17:37 +08:00
OkHttpClient client = new OkHttpClient().newBuilder()
.connectTimeout(30, TimeUnit.SECONDS)
.pingInterval(5, TimeUnit.SECONDS)//websocket轮训间隔(单位:秒)
.readTimeout(60, TimeUnit.SECONDS)//读取超时(单位:秒)
.writeTimeout(60, TimeUnit.SECONDS)//写入超时(单位:秒)
.build();
Map<String, Object> content = Maps.newHashMap();
content.put("sketch_upload_img_path", sketchUrlList);
content.put("userid", userId);
2023-10-13 10:52:12 +08:00
content.put("colony", modelSex);
2023-01-06 15:17:37 +08:00
MediaType mediaType = MediaType.parse("application/json");
2023-11-28 15:57:32 +08:00
System.out.println(JSON.toJSONString(content));
2023-01-06 15:17:37 +08:00
RequestBody body = RequestBody.create(mediaType, JSON.toJSONString(content));
Request request = new Request.Builder()
2024-06-17 13:21:58 +08:00
.url(accessPythonIp + ":" + accessPythonPort + "/api/attribute_retrieve")
// .url(fastApiPythonAddress + "/api/attribute_retrieve")
2023-10-10 14:19:10 +08:00
// .url(accessPythonIp+":9991/aifda/api/v1.0/attribute_retrieval")
2023-01-06 15:17:37 +08:00
.method("POST", body)
2023-10-11 16:24:26 +08:00
.addHeader("Authorization", "Basic YWlkbGFiOjEyMw==")
2023-01-06 15:17:37 +08:00
.addHeader("Content-Type", "application/json")
.build();
Response response;
String bodyStr;
2023-01-06 15:17:37 +08:00
try {
log.info("generateAttributeRetrieval请求入参content###{}", JSON.toJSONString(content));
response = client.newCall(request).execute();
} catch (IOException ioException) {
AccessLimitUtils.validateOut("generateAttributeRetrieval");
2023-01-06 15:17:37 +08:00
log.error("generateAttributeRetrieval异常###{}", ExceptionUtil.getThrowableList(ioException));
throw new BusinessException("attributeRetrieval.interface.exception");
2023-01-06 15:17:37 +08:00
}
//去除限流
AccessLimitUtils.validateOut("generateAttributeRetrieval");
if (response.isSuccessful()) {
try {
if (Objects.nonNull(response.body())) {
bodyStr = response.body().string();
return resolveDesignAttributeRetrievalDTO(bodyStr);
}
//生成失败
throw new BusinessException("attributeRetrieval.interface.exception");
} catch (JSONException | IOException e) {
log.error("generateAttributeRetrieval异常###{}", e.getMessage());
throw new BusinessException("attributeRetrieval.interface.exception");
}
2023-01-06 15:17:37 +08:00
}
log.error("generateAttributeRetrieval异常###{}", response);
2023-01-06 15:17:37 +08:00
//生成失败
throw new BusinessException("attributeRetrieval.interface.exception");
2023-01-06 15:17:37 +08:00
}
2023-10-20 14:47:18 +08:00
private static DesignAttributeRetrievalDTO resolveDesignAttributeRetrievalDTO(String bodyStr) {
2023-01-06 15:17:37 +08:00
DesignAttributeRetrievalDTO response = new DesignAttributeRetrievalDTO();
JSONObject jsonObject = JSON.parseObject(bodyStr);
2023-10-13 10:52:12 +08:00
JSONObject data = jsonObject.getJSONObject("data");
if (data != null) {
JSONObject jsonObjectSys = data.getJSONObject("sys_lib_dict");
if (null == jsonObjectSys || jsonObjectSys.isEmpty()) {
2023-10-13 10:52:12 +08:00
log.error("generateAttributeRetrieval异常###{}", "jsonObjectSys is empty!");
throw new BusinessException("attributeRetrieval.interface.exception");
2023-10-13 10:52:12 +08:00
}
2023-10-20 14:47:18 +08:00
setUrls(jsonObjectSys, response.getSysFileUrlS());
2023-10-13 10:52:12 +08:00
JSONObject jsonObjectLibrary = data.getJSONObject("user_lib_dict");
if (null == jsonObjectLibrary || jsonObjectLibrary.isEmpty()) {
2023-10-13 10:52:12 +08:00
log.error("generateAttributeRetrieval异常###{}", "jsonObjectLibrary is empty!");
throw new BusinessException("attributeRetrieval.interface.exception");
2023-10-13 10:52:12 +08:00
}
2023-10-20 14:47:18 +08:00
setUrls(jsonObjectLibrary, response.getLibraryUrls());
2023-10-13 10:52:12 +08:00
return response;
2023-01-06 15:17:37 +08:00
}
throw new BusinessException("attributeRetrieval.interface.exception");
2023-01-06 15:17:37 +08:00
}
2023-10-20 14:47:18 +08:00
private static void setUrls(JSONObject jsonObjectSys, List<String> urls) {
2023-01-06 15:17:37 +08:00
List<String> finalUrls = urls;
2023-10-20 14:47:18 +08:00
SysFileLevel2TypeEnum.ofPythonPath().forEach(path -> {
2023-01-06 15:17:37 +08:00
JSONArray array = jsonObjectSys.getJSONArray(path);
2023-10-20 14:47:18 +08:00
List<String> urlList = JSONObject.parseArray(JSON.toJSONString(array), String.class);
if (CollectionUtil.isNotEmpty(urlList)) {
2023-01-06 15:17:37 +08:00
finalUrls.addAll(urlList);
}
});
}
/**
* 组装和计算designSingle参数
*
* @param designSingleDTO
* @return
*/
public DesignPythonObjects covertDesignSingleParam(DesignSingleDTO designSingleDTO, String singleOverall,
String switchCategory, DesignLibraryModelPointVO designLibraryModelPoint) {
DesignPythonObjects designPythonObjects = new DesignPythonObjects();
List<DesignPythonObject> objects = Lists.newArrayList();
designPythonObjects.setObjects(objects);
DesignPythonObject pythonObject = new DesignPythonObject();
pythonObject.setItems(coverToDesignSinglePythonItem(designSingleDTO, designLibraryModelPoint));
pythonObject.setBasic(coverToSingleBasic(pythonObject.getItems().get(0),
singleOverall, switchCategory, designSingleDTO.getPriority(), designLibraryModelPoint));
objects.add(pythonObject);
return designPythonObjects;
}
2023-09-14 12:58:49 +08:00
/**
* 组装和计算设计包括图层的单品的参数不需要priority
2023-10-20 14:47:18 +08:00
*
2023-09-14 12:58:49 +08:00
* @param designSingleDTO
* @param singleOverall
* @param switchCategory
* @param designLibraryModelPoint
* @return
*/
public DesignPythonObjects covertDesignSingleParam(DesignSingleIncludeLayersDTO designSingleDTO, String singleOverall,
2024-10-08 15:48:53 +08:00
String switchCategory, DesignLibraryModelPointVO designLibraryModelPoint,
String previewOrSubmit) {
2023-09-14 12:58:49 +08:00
DesignPythonObjects designPythonObjects = new DesignPythonObjects();
List<DesignPythonObject> objects = Lists.newArrayList();
designPythonObjects.setObjects(objects);
DesignPythonObject pythonObject = new DesignPythonObject();
designPythonObjects.setProcess_id(designSingleDTO.getProcessId());
2023-09-14 12:58:49 +08:00
pythonObject.setItems(coverToDesignSinglePythonItem(designSingleDTO, designLibraryModelPoint));
2024-10-08 15:48:53 +08:00
pythonObject.setBasic(coverToSingleBasic(singleOverall, switchCategory, designLibraryModelPoint, previewOrSubmit));
2023-09-14 12:58:49 +08:00
objects.add(pythonObject);
return designPythonObjects;
}
2023-01-06 15:17:37 +08:00
private List<DesignPythonItem> coverToDesignSinglePythonItem(DesignSingleDTO designSingleDTO, DesignLibraryModelPointVO designLibraryModelPoint) {
List<DesignSingleItemDTO> designPythonItemDto = designSingleDTO.getClothes();
if (!CollectionUtils.isEmpty(designSingleDTO.getOthers())) {
designPythonItemDto.addAll(designSingleDTO.getOthers());
}
List<DesignPythonItem> response = CopyUtil.copyList(designPythonItemDto, DesignPythonItem.class, (o, d) -> {
d.setBusinessId(o.getId());
d.setIcon("none");
// d.setPrint(resolveDesignSinglePrint(o.getPrintObject(), o.getPath()));
2023-01-06 15:17:37 +08:00
});
DesignPythonItem body = new DesignPythonItem();
body.setType(SysFileLevel2TypeEnum.BODY.getRealName());
if (Objects.nonNull(designLibraryModelPoint)) {
body.setBody_path(designLibraryModelPoint.getTemplateUrl());
} else {
// body.setBody_path("/home/pangkaicheng/python_code/Multi-layer-Virtual-Try-on/dataset_for_test/Img_model.png");
body.setBody_path("/workspace/python_code/Multi-layer-Virtual-Try-on/dataset_for_test/Img_model.png");
}
response.add(body);
return response;
}
2023-09-14 12:58:49 +08:00
/**
* 设计包括图层的单品每次只针对一个单品
2023-10-20 14:47:18 +08:00
*
2023-09-14 12:58:49 +08:00
* @param designSingleIncludeLayersDTO
* @param designLibraryModelPoint
* @return
*/
private List<DesignPythonItem> coverToDesignSinglePythonItem(DesignSingleIncludeLayersDTO designSingleIncludeLayersDTO, DesignLibraryModelPointVO designLibraryModelPoint) {
List<DesignSingleItemDTO> designSingleItemList = designSingleIncludeLayersDTO.getDesignSingleItemDTOList();
List<DesignPythonItem> response = new ArrayList<>();
designSingleItemList.forEach(designSingleItem -> {
Long businessId;
if (!designSingleIncludeLayersDTO.getIsPreview() && designSingleItem.getChanged()) {
String s = String.valueOf(designSingleItem.getId());
businessId = Long.parseLong(s.substring(0, s.length() - 3));
} else {
businessId = designSingleItem.getId();
}
2024-05-13 16:23:37 +08:00
// 判断是否是渐变色
String minioPath = null;
String gradientString = null;
if (!Objects.isNull(designSingleItem.getGradient())) {
2024-05-13 16:23:37 +08:00
String colorImg = designSingleItem.getGradient().getColorImg();
if (StringUtil.isNullOrEmpty(colorImg)) {
2024-05-13 16:23:37 +08:00
throw new BusinessException("The base64 data of the image is empty");
}
minioPath = minioUtil.base64UploadToPath(colorImg, gradientBucketName, null);
2024-05-13 16:23:37 +08:00
designSingleItem.getGradient().setColorImg(null);
gradientString = JSONObject.toJSONString(designSingleItem.getGradient());
}
2025-02-25 14:02:29 +08:00
PrintToPython printToPython = resolveDesignSinglePrint(designSingleItem.getPrintObject().getPrints(),
2025-02-25 14:24:15 +08:00
designSingleItem.getPartialDesign().getPartialDesignMinioPath());
resolveDesignElement(designSingleItem.getTrims(), printToPython);
2025-02-25 18:03:52 +08:00
log.info("组装参数【服装:{}的maskUrl: {}】",designSingleItem.getType(), designSingleItem.getMaskUrl());
2023-09-14 12:58:49 +08:00
response.add(new DesignPythonItem(
designSingleItem.getType(),
designSingleItem.getPath(),
designSingleItem.getColor(),
printToPython,
// businessId designItemDetailId python端确认没有作用,但是数据库需要存,作用:未知)
// designSingleItem.getId(),
businessId,
pythonTAllInfoService.getImageIdByPath(designSingleItem.getPath()),
designSingleItem.getOffset(),
designSingleItem.getScale(),
2024-05-13 16:23:37 +08:00
designSingleItem.getPriority(),
minioPath,
gradientString,
2025-02-25 15:44:21 +08:00
designSingleItem.getMaskUrl()
2024-10-15 10:30:02 +08:00
));
2023-09-14 12:58:49 +08:00
});
String bodyPath;
if (Objects.nonNull(designLibraryModelPoint)) {
bodyPath = designLibraryModelPoint.getTemplateUrl();
} else {
// bodyPath = "/workspace/python_code/Multi-layer-Virtual-Try-on/dataset_for_test/Img_model.png";
2023-09-21 09:55:21 +08:00
bodyPath = "aida-mannequins/model_1693218345.2714432.png";
2023-09-14 12:58:49 +08:00
}
2023-10-20 14:47:18 +08:00
response.add(new DesignPythonItem(SysFileLevel2TypeEnum.BODY.getRealName(), bodyPath, pythonTAllInfoService.getImageIdByPath(bodyPath)));
2023-09-14 12:58:49 +08:00
return response;
}
2025-02-25 14:02:29 +08:00
private PrintToPython resolveDesignSinglePrint(List<DesignSinglePrint> printObject, String partialDesign) {
PrintToPython printToPython = new PrintToPython();
DesignPythonItemPrint printSingle = new DesignPythonItemPrint();
DesignPythonItemPrint printOverall = new DesignPythonItemPrint();
printToPython.setSingle(printSingle);
printToPython.setOverall(printOverall);
2025-02-25 14:02:29 +08:00
printToPython.setPartial(StringUtil.isNullOrEmpty(partialDesign) ? null : partialDesign);
if (Objects.isNull(printObject) || printObject.isEmpty()){
return printToPython;
2023-01-06 15:17:37 +08:00
}
2023-09-14 12:58:49 +08:00
// 没有印花时的参数设置
// if (printObject.getIfSingle().equals(Boolean.FALSE) && CollectionUtil.isEmpty(printObject.getPrints())) {
// return new DesignPythonItemPrint(new ArrayList<>(), false);
// }
// DesignPythonItemPrint print = CopyUtil.copyObject(printObject, DesignPythonItemPrint.class);
int size = printObject.size();
// 占位符填充数组
2025-02-10 11:18:04 +08:00
List<List<Float>> locationS = new ArrayList<>(Collections.nCopies(size, null));
List<List<Float>> scaleS = new ArrayList<>(Collections.nCopies(size, null));
List<Double> angleS = new ArrayList<>(Collections.nCopies(size, null));
ArrayList<String> pathsS = new ArrayList<>(Collections.nCopies(size, null));
2025-02-10 11:18:04 +08:00
List<List<Float>> locationO = new ArrayList<>(Collections.nCopies(size, null));
List<List<Float>> scaleO = new ArrayList<>(Collections.nCopies(size, null));
List<Double> angleO = new ArrayList<>(Collections.nCopies(size, null));
ArrayList<String> pathsO = new ArrayList<>(Collections.nCopies(size, null));
2023-09-14 12:58:49 +08:00
// 设置印花的位置、大小、旋转角度
// 优先级越大越靠近顶层在传输给python的数组中越靠前
// List<DesignSinglePrint> prints = printObject.getPrints();
printObject.forEach(p -> {
2023-10-20 14:47:18 +08:00
p.getLocation().set(0, p.getLocation().get(0));
p.getLocation().set(1, p.getLocation().get(1));
2023-10-06 09:45:07 +08:00
Integer priority = p.getPriority();
// todo 下标越界问题
if (p.getIfSingle()){
locationS.set(priority - 1, p.getLocation());
scaleS.set(priority - 1, p.getScale());
angleS.set( priority - 1, p.getAngle());
pathsS.set(priority - 1, p.getMinIOPath());
}else {
locationO.set(priority - 1, p.getLocation());
scaleO.set(priority - 1, p.getScale());
angleO.set(priority - 1, p.getAngle());
pathsO.set(priority - 1, p.getMinIOPath());
}
// log.info("本次print打点locations###{}###fileVO{}", p.getLocation(), JSON.toJSONString(fileVO));
2023-01-06 15:17:37 +08:00
});
locationS.removeAll(Collections.singleton(null));
scaleS.removeAll(Collections.singleton(null));
angleS.removeAll(Collections.singleton(null));
pathsS.removeAll(Collections.singleton(null));
printSingle.setLocation(locationS);
printSingle.setPrint_scale_list(scaleS);
printSingle.setPrint_angle_list(angleS);
printSingle.setPrint_path_list(pathsS);
locationO.removeAll(Collections.singleton(null));
scaleO.removeAll(Collections.singleton(null));
angleO.removeAll(Collections.singleton(null));
pathsO.removeAll(Collections.singleton(null));
printOverall.setLocation(locationO);
printOverall.setPrint_scale_list(scaleO);
printOverall.setPrint_angle_list(angleO);
printOverall.setPrint_path_list(pathsO);
return printToPython;
}
private void resolveDesignElement(DesignSinglePrintDTO trims, PrintToPython printToPython) {
// 没有design element 时的参数设置
DesignPythonItemElement element = new DesignPythonItemElement();
if (CollectionUtil.isEmpty(trims.getPrints())) {
printToPython.setElement(element);
return;
}
int size = trims.getPrints().size();
// 占位符填充数组
2025-02-10 11:18:04 +08:00
List<List<Float>> location = new ArrayList<>(Collections.nCopies(size, null));
List<List<Float>> scale = new ArrayList<>(Collections.nCopies(size, null));
List<Double> angle = new ArrayList<>(Collections.nCopies(size, null));
ArrayList<String> paths = new ArrayList<>(Collections.nCopies(size, null));
// 设置印花的位置、大小、旋转角度
// 优先级越大越靠近顶层在传输给python的数组中越靠前
List<DesignSinglePrint> prints = trims.getPrints();
prints.forEach(p -> {
p.getLocation().set(0, p.getLocation().get(0));
p.getLocation().set(1, p.getLocation().get(1));
2025-02-10 11:18:04 +08:00
p.getScale().set(0, p.getScale().get(0));
p.getScale().set(1, p.getScale().get(1));
Integer priority = p.getPriority();
location.set(priority - 1, p.getLocation());
scale.set(priority - 1, p.getScale());
angle.set(priority - 1, p.getAngle());
paths.set(priority - 1, p.getMinIOPath());
// log.info("本次print打点locations###{}###fileVO{}", p.getLocation(), JSON.toJSONString(fileVO));
});
element.setLocation(location);
element.setElement_scale_list(scale);
element.setElement_angle_list(angle);
element.setElement_path_list(paths);
printToPython.setElement(element);
}
2023-01-06 15:17:37 +08:00
private DesignPythonBasic coverToSingleBasic(DesignPythonItem designPythonItem, String singleOverall,
String switchCategory, List<String> priority,
DesignLibraryModelPointVO designLibraryModelPoint) {
DesignPythonBasic basic = new DesignPythonBasic();
basic.setSingle_overall(singleOverall);
basic.setSwitch_category(switchCategory);
basic.setSave_name(getPythonOutputPath(
StringUtils.isEmpty(designPythonItem.getPath()) ? designPythonItem.getBody_path() : designPythonItem.getPath(),
PythonToJavaApiOperationTypeEnum.DESIGN_COLLECTION));
basic.setPriority(priority);
basic.setSelf_template(Boolean.FALSE);
if (Objects.nonNull(designLibraryModelPoint)) {
basic.setSelf_template(Boolean.TRUE);
}
basic.setScale_bag(0.7);
basic.setScale_earrings(0.16);
basic.setBody_point_test(getMap(designLibraryModelPoint));
return basic;
}
2023-09-14 12:58:49 +08:00
/**
* 设计包括图层的单品不用指定save_name和priority
2023-10-20 14:47:18 +08:00
*
2023-09-14 12:58:49 +08:00
* @param singleOverall
* @param switchCategory
* @param designLibraryModelPoint
* @return
*/
private DesignPythonBasic coverToSingleBasic(String singleOverall, String switchCategory,
2024-10-08 15:48:53 +08:00
DesignLibraryModelPointVO designLibraryModelPoint,
String previewOrSubmit) {
2023-09-14 12:58:49 +08:00
DesignPythonBasic basic = new DesignPythonBasic();
basic.setSingle_overall(singleOverall);
basic.setSwitch_category(switchCategory);
basic.setSelf_template(Boolean.FALSE);
if (Objects.nonNull(designLibraryModelPoint)) {
basic.setSelf_template(Boolean.TRUE);
}
basic.setScale_bag(0.7);
basic.setScale_earrings(0.16);
basic.setBody_point_test(getMap(designLibraryModelPoint));
2023-12-13 11:56:13 +08:00
basic.setLayer_order(Boolean.TRUE);
2024-10-15 10:44:26 +08:00
basic.setPreview_submit(previewOrSubmit);
2023-09-14 12:58:49 +08:00
return basic;
}
2023-01-06 15:17:37 +08:00
/**
* 组装和计算designSingle参数
*
* @param modelsDotDTO
* @return
*/
public DesignPythonObjects covertModelsDotParam(ModelsDotDTO modelsDotDTO, String singleOverall, String switchCategory) {
DesignPythonObjects designPythonObjects = new DesignPythonObjects();
List<DesignPythonObject> objects = Lists.newArrayList();
designPythonObjects.setObjects(objects);
2023-10-16 11:10:23 +08:00
designPythonObjects.setProcess_id(UUID.randomUUID().toString());
2023-01-06 15:17:37 +08:00
DesignPythonObject pythonObject = new DesignPythonObject();
pythonObject.setItems(coverToModelsDotPythonItem(modelsDotDTO));
pythonObject.setBasic(coverToModelsDotBasic(pythonObject.getItems().get(0), modelsDotDTO));
objects.add(pythonObject);
return designPythonObjects;
}
private List<DesignPythonItem> coverToModelsDotPythonItem(ModelsDotDTO modelsDotDTO) {
List<DesignPythonItem> response = Lists.newArrayList();
2024-06-27 17:36:47 +08:00
if (modelsDotDTO.getSex().contains("Female")) {
DesignPythonItem dress = new DesignPythonItem();
dress.setType(SysFileLevel2TypeEnum.BLOUSE.getRealName());
dress.setColor("none");
dress.setIcon("none");
2023-12-14 10:21:30 +08:00
DesignPythonItemPrint designPythonItemPrint = new DesignPythonItemPrint();
// designPythonItemPrint.setIfSingle(false);
2023-12-14 10:21:30 +08:00
designPythonItemPrint.setPrint_path_list(new ArrayList<>());
dress.setPrint(new PrintToPython(designPythonItemPrint));
2024-06-27 17:36:47 +08:00
dress.setPath("aida-sys-image/images/female/blouse/0628001551.jpg");
2024-10-20 13:39:01 +08:00
dress.setColor("255 255 255");
2024-06-27 17:36:47 +08:00
response.add(dress);
2023-12-14 10:21:30 +08:00
DesignPythonItem skirt = new DesignPythonItem();
2024-06-27 17:36:47 +08:00
skirt.setType(SysFileLevel2TypeEnum.SKIRT.getRealName());
2023-12-14 10:21:30 +08:00
skirt.setColor("none");
skirt.setIcon("none");
2024-06-27 17:36:47 +08:00
DesignPythonItemPrint designPythonItemPrint1 = new DesignPythonItemPrint();
// designPythonItemPrint1.setIfSingle(false);
2024-06-27 17:36:47 +08:00
designPythonItemPrint1.setPrint_path_list(new ArrayList<>());
skirt.setPrint(new PrintToPython(designPythonItemPrint1));
2024-06-27 17:36:47 +08:00
skirt.setPath("aida-sys-image/images/female/skirt/0628000022.jpg");
2024-10-20 13:39:01 +08:00
skirt.setColor("255 255 255");
2024-06-27 17:36:47 +08:00
// skirt.setPath("aida-sys-image/images/female/dress/0628000000.jpg");
2023-12-14 10:21:30 +08:00
response.add(skirt);
2024-01-25 13:37:17 +08:00
} else {
2023-12-14 10:21:30 +08:00
DesignPythonItem top = new DesignPythonItem();
top.setType(MalePosition.TOPS.getValue());
top.setColor("none");
top.setIcon("none");
DesignPythonItemPrint designPythonItemPrint = new DesignPythonItemPrint();
// designPythonItemPrint.setIfSingle(false);
2023-12-14 10:21:30 +08:00
designPythonItemPrint.setPrint_path_list(new ArrayList<>());
top.setPrint(new PrintToPython(designPythonItemPrint));
2023-12-14 10:21:30 +08:00
top.setPath("aida-sys-image/images/male/tops/mens_test_10.png");
2024-10-20 13:39:01 +08:00
top.setColor("255 255 255");
2023-12-14 10:21:30 +08:00
response.add(top);
DesignPythonItem bottom = new DesignPythonItem();
bottom.setType(MalePosition.BOTTOMS.getValue());
bottom.setColor("none");
bottom.setIcon("none");
2023-12-14 10:46:03 +08:00
DesignPythonItemPrint designPythonItemPrint1 = new DesignPythonItemPrint();
// designPythonItemPrint1.setIfSingle(false);
2023-12-14 10:46:03 +08:00
designPythonItemPrint1.setPrint_path_list(new ArrayList<>());
bottom.setPrint(new PrintToPython(designPythonItemPrint1));
2024-06-27 17:36:47 +08:00
bottom.setPath("aida-sys-image/images/male/bottoms/mens_test_6252.png");
2024-10-20 13:39:01 +08:00
bottom.setColor("255 255 255");
2023-12-14 10:21:30 +08:00
response.add(bottom);
}
2023-01-06 15:17:37 +08:00
DesignPythonItem body = new DesignPythonItem();
body.setType(SysFileLevel2TypeEnum.BODY.getRealName());
body.setBody_path(modelsDotDTO.getTemplateUrl());
response.add(body);
return response;
}
private DesignPythonBasic coverToModelsDotBasic(DesignPythonItem designPythonItem, ModelsDotDTO modelsDotDTO) {
DesignPythonBasic basic = new DesignPythonBasic();
basic.setSingle_overall(SingleOverallEnum.OVERALL.getRealName());
basic.setSwitch_category("");
basic.setSave_name(getPythonOutputPath(
StringUtils.isEmpty(designPythonItem.getPath()) ? designPythonItem.getBody_path() : designPythonItem.getPath(),
PythonToJavaApiOperationTypeEnum.DESIGN_COLLECTION));
basic.setSelf_template(Boolean.TRUE);
basic.setScale_bag(0.7);
basic.setScale_earrings(0.16);
basic.setBody_point_test(getMap(calculateTemplatePoint(modelsDotDTO, modelsDotDTO.getHigh(), modelsDotDTO.getWidth())));
return basic;
}
public DesignLibraryModelPointVO calculateTemplatePoint(ModelsDotDTO modelsDotDTO, Integer high, Integer width) {
DesignLibraryModelPointVO libraryModelPoint = new DesignLibraryModelPointVO();
libraryModelPoint.setHandLeft(calculateTemplatePointOne(modelsDotDTO.getHandLeft(), high, width));
libraryModelPoint.setHandRight(calculateTemplatePointOne(modelsDotDTO.getHandRight(), high, width));
libraryModelPoint.setShoulderLeft(calculateTemplatePointOne(modelsDotDTO.getShoulderLeft(), high, width));
libraryModelPoint.setShoulderRight(calculateTemplatePointOne(modelsDotDTO.getShoulderRight(), high, width));
libraryModelPoint.setWaistbandLeft(calculateTemplatePointOne(modelsDotDTO.getWaistbandLeft(), high, width));
libraryModelPoint.setWaistbandRight(calculateTemplatePointOne(modelsDotDTO.getWaistbandRight(), high, width));
return libraryModelPoint;
}
private List<BigDecimal> calculateTemplatePointOne(List<BigDecimal> originRatioList, Integer high, Integer width) {
originRatioList.set(0, originRatioList.get(0).multiply(BigDecimal.valueOf(width)));
originRatioList.set(1, originRatioList.get(1).multiply(BigDecimal.valueOf(high)));
return originRatioList;
}
2023-08-17 11:59:19 +08:00
2023-09-06 14:28:20 +08:00
public JSONObject designNew(DesignPythonObjects designPythonObjects) {
2023-09-18 14:44:30 +08:00
// todo 限流校验
2023-10-27 17:02:04 +08:00
// AccessLimitUtils.validate("design",5);
2023-09-06 14:28:20 +08:00
OkHttpClient client = new OkHttpClient().newBuilder()
.connectTimeout(30, TimeUnit.SECONDS)
.pingInterval(5, TimeUnit.SECONDS)//websocket轮训间隔(单位:秒)
.readTimeout(60, TimeUnit.SECONDS)//读取超时(单位:秒)
.writeTimeout(60, TimeUnit.SECONDS)//写入超时(单位:秒)
.build();
MediaType mediaType = MediaType.parse("application/json");
//关闭FastJson的引用检测 防止出现$ref 现象
2023-09-18 11:33:13 +08:00
String param = JSON.toJSONString(designPythonObjects, SerializerFeature.DisableCircularReferenceDetect);
2023-09-06 14:28:20 +08:00
log.info("design请求python 参数:####{}", param);
RequestBody body = RequestBody.create(mediaType, param);
Request request = new Request.Builder()
2024-01-02 11:53:09 +08:00
.url(accessPythonIp + ":" + accessPythonPort + "/api/design")
// .url(fastApiPythonAddress + "/api/design")
2023-09-06 14:28:20 +08:00
// .url(accessPythonIp + ":10200/aifda/api/v1.0/generate")
.method("POST", body)
.addHeader("Authorization", "Basic YWlkbGFiOjEyMw==")
.addHeader("Content-Type", "application/json")
.build();
Response response;
String responseBody;
2023-09-06 14:28:20 +08:00
try {
response = client.newCall(request).execute();
} catch (IOException ioException) {
AccessLimitUtils.validateOut("design");
2023-09-06 14:28:20 +08:00
log.error("PythonService##design异常###{}", ExceptionUtil.getThrowableList(ioException));
throw new BusinessException("design.interface.exception");
2023-09-06 14:28:20 +08:00
}
//去除限流
2023-10-27 17:02:04 +08:00
// AccessLimitUtils.validateOut("design");
2023-09-06 14:28:20 +08:00
if (response.isSuccessful()) {
try {
if (Objects.nonNull(response.body())) {
responseBody = response.body().string();
JSONObject responseObject = JSON.parseObject(responseBody);
log.info("PythonService##responseObject###{}", responseObject);
return responseObject;
}
throw new BusinessException("design.interface.exception");
} catch (IOException | JSONException e) {
log.error("PythonService##design异常###{}", e.getMessage());
throw new BusinessException("design.interface.exception");
2023-09-06 14:28:20 +08:00
}
}
log.error("PythonService##design异常response###{}", response);
2023-09-06 14:28:20 +08:00
//生成失败
throw new BusinessException("design.interface.exception");
2023-09-06 14:28:20 +08:00
}
2024-12-09 13:31:30 +08:00
public JSONObject designStream(DesignPythonObjects designPythonObjects) {
// todo 限流校验
// AccessLimitUtils.validate("design",5);
OkHttpClient client = new OkHttpClient().newBuilder()
.connectTimeout(30, TimeUnit.SECONDS)
.pingInterval(5, TimeUnit.SECONDS)//websocket轮训间隔(单位:秒)
.readTimeout(60, TimeUnit.SECONDS)//读取超时(单位:秒)
.writeTimeout(60, TimeUnit.SECONDS)//写入超时(单位:秒)
.build();
MediaType mediaType = MediaType.parse("application/json");
//关闭FastJson的引用检测 防止出现$ref 现象
String param = JSON.toJSONString(designPythonObjects, SerializerFeature.DisableCircularReferenceDetect);
log.info("design请求python 参数:####{}", param);
RequestBody body = RequestBody.create(mediaType, param);
Request request = new Request.Builder()
.url(accessPythonIp + ":" + accessPythonPort + "/api/design_v2")
// .url(fastApiPythonAddress + "/api/design")
// .url(accessPythonIp + ":10200/aifda/api/v1.0/generate")
.method("POST", body)
.addHeader("Authorization", "Basic YWlkbGFiOjEyMw==")
.addHeader("Content-Type", "application/json")
.build();
Response response;
String responseBody;
try {
response = client.newCall(request).execute();
} catch (IOException ioException) {
AccessLimitUtils.validateOut("design");
log.error("PythonService##design异常###{}", ExceptionUtil.getThrowableList(ioException));
throw new BusinessException("design.interface.exception");
}
//去除限流
// AccessLimitUtils.validateOut("design");
if (response.isSuccessful()) {
try {
if (Objects.nonNull(response.body())) {
responseBody = response.body().string();
JSONObject responseObject = JSON.parseObject(responseBody);
log.info("PythonService##responseObject###{}", responseObject);
return responseObject;
}
throw new BusinessException("design.interface.exception");
} catch (IOException | JSONException e) {
log.error("PythonService##design异常###{}", e.getMessage());
throw new BusinessException("design.interface.exception");
}
}
log.error("PythonService##design异常response###{}", response);
//生成失败
throw new BusinessException("design.interface.exception");
}
2024-01-25 13:37:17 +08:00
/**
* 暂时未用
*/
2023-10-20 14:47:18 +08:00
public String generateSketchCaption(String url) {
2023-08-17 11:59:19 +08:00
//限流校验
2023-10-20 14:47:18 +08:00
AccessLimitUtils.validate("generateSketchCaption", 5);
2023-08-17 11:59:19 +08:00
OkHttpClient client = new OkHttpClient().newBuilder()
.connectTimeout(30, TimeUnit.SECONDS)
.pingInterval(5, TimeUnit.SECONDS)//websocket轮训间隔(单位:秒)
.readTimeout(60, TimeUnit.SECONDS)//读取超时(单位:秒)
.writeTimeout(60, TimeUnit.SECONDS)//写入超时(单位:秒)
.build();
MediaType mediaType = MediaType.parse("application/json");
RequestBody body = RequestBody.create(mediaType, url);
Request request = new Request.Builder()
2024-01-02 11:53:09 +08:00
.url(accessPythonIp + ":" + accessPythonPort + "/aida/interrogator")
2023-08-17 11:59:19 +08:00
.method("POST", body)
.addHeader("Authorization", "Basic YWlkbGFiOjEyMw==")
.addHeader("Content-Type", "application/json")
.build();
Response response = null;
String bodyStr = null;
try {
log.info("generateSketchCaption请求入参content###{}", url);
response = client.newCall(request).execute();
bodyStr = response.body().string();
} catch (IOException ioException) {
log.error("generateSketchCaption异常###{}", ExceptionUtil.getThrowableList(ioException));
}
//去除限流
AccessLimitUtils.validateOut("generateSketchCaption");
if (Objects.isNull(response)) {
log.error("generateSketchCaption异常###{}", "response or body is empty!");
throw new BusinessException("system error!");
}
JSONObject jsonObject = JSON.parseObject(JSON.toJSONString(response));
Boolean result = jsonObject.getBoolean("successful");
if (result) {
return bodyStr;
}
log.info("attribute_retrieval失败###{}", bodyStr);
//生成失败
throw new BusinessException("system error!");
}
2024-06-17 10:21:49 +08:00
public Boolean generateSketchOrPrint(String params, String port, String servicePath) {
2023-08-17 11:59:19 +08:00
//限流校验
// AccessLimitUtils.validate("generateSketchOrPrint", 5);
2023-08-17 11:59:19 +08:00
OkHttpClient client = new OkHttpClient().newBuilder()
.connectTimeout(30, TimeUnit.SECONDS)
.pingInterval(5, TimeUnit.SECONDS)//websocket轮训间隔(单位:秒)
.readTimeout(60, TimeUnit.SECONDS)//读取超时(单位:秒)
.writeTimeout(60, TimeUnit.SECONDS)//写入超时(单位:秒)
.build();
MediaType mediaType = MediaType.parse("application/json");
2024-06-03 17:13:48 +08:00
// RequestBody body = RequestBody.create(mediaType, JSON.toJSONString(generateToPythonDTO, SerializerFeature.WriteMapNullValue));
RequestBody body = RequestBody.create(mediaType, params);
2024-06-17 10:41:36 +08:00
log.info("generate 请求地址: {}", accessPythonIp + ":" + port + servicePath);
2023-08-17 11:59:19 +08:00
Request request = new Request.Builder()
2023-09-18 11:33:13 +08:00
// .url("http://18.167.251.121:9992")
// .url("http://127.0.0.1:5000/api/diffusion")
// .url(accessPythonIp + ":" + accessPythonPort + "/api/diffusion")
// .url(accessPythonIp + ":" + accessPythonPort + "/api/generate_image")
2024-06-17 10:21:49 +08:00
.url(accessPythonIp + ":" + port + servicePath)
2023-08-17 11:59:19 +08:00
.method("POST", body)
// .addHeader("Authorization", "Basic YWlkbGFiOjEyMw==")
2023-08-17 11:59:19 +08:00
.addHeader("Content-Type", "application/json")
.build();
Response response = null;
2024-01-25 13:37:17 +08:00
String bodyString;
2023-09-19 15:52:33 +08:00
try {
2024-06-03 17:13:48 +08:00
// log.info("generateSketchOrPrint请求入参content###{}", JSON.toJSONString(generateToPythonDTO, SerializerFeature.WriteMapNullValue));
log.info("generateSketchOrPrint请求入参content###{}", params);
2023-09-19 15:52:33 +08:00
response = client.newCall(request).execute();
} catch (IOException ioException) {
log.error("PythonService##generateSketchOrPrint异常###{}", ExceptionUtil.getThrowableList(ioException));
// throw new BusinessException("generate.interface.error");
throw new BusinessException(ioException.getMessage());
2023-09-19 15:52:33 +08:00
}
2023-08-17 11:59:19 +08:00
//去除限流
// AccessLimitUtils.validateOut("generateSketchOrPrint");
2023-11-21 16:47:43 +08:00
// 判断是否生成失败
if (Objects.isNull(response.body())) {
2023-09-19 15:52:33 +08:00
log.error("PythonService##generateSketchOrPrint异常###{}", "response or body is empty!");
// throw new BusinessException("generate.interface.error");
throw new BusinessException("PythonService##generateSketchOrPrint异常###: response or body is empty!");
2024-01-25 13:37:17 +08:00
} else if (response.code() != HttpURLConnection.HTTP_OK) {
2023-12-11 14:24:28 +08:00
log.error("PythonService##generateSketchOrPrint异常###{}", "Response error!Response code ## " + response.code() + " ##");
// throw new BusinessException("generate.interface.error");
throw new BusinessException("PythonService##generateSketchOrPrint异常### Response error!Response code ## " + response.code() + " ##");
2023-11-21 16:47:43 +08:00
} else {
try {
bodyString = response.body().string();
} catch (IOException e) {
log.error(e.getMessage());
// throw new BusinessException("generate.interface.error");
throw new BusinessException(e.getMessage());
2023-11-21 16:47:43 +08:00
}
2023-09-19 15:52:33 +08:00
}
2023-09-19 10:25:03 +08:00
JSONObject jsonObject = JSON.parseObject(bodyString);
2023-09-19 15:52:33 +08:00
Boolean result = JSON.parseObject(JSON.toJSONString(response)).getBoolean("successful");
2023-11-21 16:47:43 +08:00
2023-09-19 16:37:23 +08:00
if (result && jsonObject.get("code").equals(200)) {
2024-01-31 19:35:17 +08:00
log.info("Generate##responseObject###{}", jsonObject);
// return setGenerateImageList(jsonObject.getJSONObject("data"));
return Boolean.TRUE;
} else {
log.info("generateSketchOrPrintPrint失败###{}", jsonObject);
log.info("Generate Exception! Code : " + jsonObject.get("code"));
return Boolean.FALSE;
2023-08-17 11:59:19 +08:00
}
}
2023-08-31 12:59:23 +08:00
2023-10-20 14:47:18 +08:00
public Response sendPostToModel(String content, String portAndRoute, String functionName) {
2023-08-31 12:59:23 +08:00
OkHttpClient client = new OkHttpClient().newBuilder()
.connectTimeout(30, TimeUnit.SECONDS)
.pingInterval(5, TimeUnit.SECONDS)//websocket轮训间隔(单位:秒)
.readTimeout(60, TimeUnit.SECONDS)//读取超时(单位:秒)
.writeTimeout(60, TimeUnit.SECONDS)//写入超时(单位:秒)
.build();
MediaType mediaType = MediaType.parse("application/json");
RequestBody body = RequestBody.create(mediaType, content);
2023-08-31 12:59:23 +08:00
Request request = new Request.Builder()
2024-01-02 11:53:09 +08:00
.url(accessPythonIp + ":" + accessPythonPort + portAndRoute)
// .url(fastApiPythonAddress + portAndRoute)
2023-08-31 12:59:23 +08:00
.method("POST", body)
.addHeader("Authorization", "Basic YWlkbGFiOjEyMw==")
.addHeader("Content-Type", "application/json")
.build();
Response response = null;
// String bodyString = null;
2023-08-31 12:59:23 +08:00
try {
log.info(functionName + "请求入参content###{}", content);
2023-08-31 12:59:23 +08:00
response = client.newCall(request).execute();
// bodyString = response.body().string();
2023-08-31 12:59:23 +08:00
} catch (IOException ioException) {
2023-10-20 14:47:18 +08:00
log.error("PythonService##" + functionName + "异常###{}", ExceptionUtil.getThrowableList(ioException));
2023-08-31 12:59:23 +08:00
}
return response;
2023-08-31 12:59:23 +08:00
}
2023-09-14 12:58:49 +08:00
2023-10-20 14:47:18 +08:00
private List<String> setGenerateImageList(JSONObject jsonObject) {
List<String> imageUrlList = JSONObject.parseArray(jsonObject.get("list").toString(), String.class);
if (imageUrlList.isEmpty()) {
log.error("PythonService##generateSketchOrPrint异常###{}", "diffusion response list is null");
// 如果这里返回为空,是判断出错还是返回给前端空
2023-09-21 13:44:39 +08:00
throw new BusinessException("The data returned on the python side is empty");
2023-09-14 12:58:49 +08:00
}
2023-09-19 10:25:03 +08:00
return imageUrlList;
2023-09-14 12:58:49 +08:00
}
/** 废弃状态 */
2023-12-11 14:24:28 +08:00
public String composeLayers(List<OutfitDetailPythonItem> layersDetail) {
HashMap<String, List<OutfitDetailPythonItem>> layers = new HashMap<>();
HashMap<String, HashMap<String, List<OutfitDetailPythonItem>>> content = new HashMap<>();
layers.put("layers", layersDetail);
2023-10-20 14:47:18 +08:00
content.put("0", layers);
String jsonString = JSON.toJSONString(content, SerializerFeature.WriteNullStringAsEmpty);
// todo 添加限流
2024-01-02 11:53:09 +08:00
Response response = this.sendPostToModel(jsonString, "/api/preview_control", "composeLayers");
// todo 结束限流
String bodyString;
// 生成失败
if (Objects.isNull(response) || Objects.isNull(response.body())) {
log.error("PythonService##composeLayers异常###{}", "response or body is empty!");
2023-12-11 14:24:28 +08:00
throw new BusinessException("compose-layer.interface.exception");
2024-01-25 13:37:17 +08:00
} else if (response.code() != HttpURLConnection.HTTP_OK) {
2023-12-11 14:24:28 +08:00
log.error("PythonService##composeLayers异常###{}", "Response error!Response code ## " + response.code() + " ##");
throw new BusinessException("compose-layer.interface.exception");
2023-10-20 14:47:18 +08:00
} else {
2023-12-11 14:24:28 +08:00
try {
bodyString = response.body().string();
} catch (IOException e) {
throw new BusinessException("compose-layer.interface.exception");
}
}
JSONObject jsonObject = JSON.parseObject(bodyString);
Boolean result = JSON.parseObject(JSON.toJSONString(response)).getBoolean("successful");
if (result && jsonObject.get("msg").equals("OK!")) {
return getCompositeImage(jsonObject.getJSONObject("code"));
}
log.info("composeLayers 失败###{}", jsonObject);
//生成失败
2023-12-11 14:24:28 +08:00
throw new BusinessException("compose-layer.interface.exception");
}
2023-10-20 14:47:18 +08:00
private String getCompositeImage(JSONObject jsonObject) {
JSONObject item0 = jsonObject.getJSONObject("0");
return item0.getString("synthesis_url");
}
2023-12-11 14:24:28 +08:00
2024-01-25 13:37:17 +08:00
public String getClothCategory(String path, String gender) {
2023-12-11 14:24:28 +08:00
HashMap<String, String> content = new HashMap<>();
2024-01-25 13:37:17 +08:00
content.put("sketch_img_url", path);
content.put("colony", gender);
2023-12-11 14:24:28 +08:00
List<HashMap<String, String>> contents = Collections.singletonList(content);
String jsonString = JSON.toJSONString(contents, SerializerFeature.WriteNullStringAsEmpty);
// todo 添加限流
2024-01-02 11:53:09 +08:00
Response response = this.sendPostToModel(jsonString, "/api/category_recognition", "getClothCategory");
2023-12-11 14:24:28 +08:00
// todo 结束限流
String bodyString;
// 生成失败
if (Objects.isNull(response) || Objects.isNull(response.body())) {
log.error("PythonService##GetClothCategory###{}", "response or body is empty!");
throw new BusinessException("cloth-classification.interface.exception");
2024-01-25 13:37:17 +08:00
} else if (response.code() != HttpURLConnection.HTTP_OK) {
2023-12-11 14:24:28 +08:00
log.error("PythonService##GetClothCategory###{}", "Response error!Response code ## " + response.code() + " ##");
throw new BusinessException("cloth-classification.interface.exception");
} else {
try {
bodyString = response.body().string();
} catch (IOException e) {
throw new BusinessException("cloth-classification.interface.exception");
}
}
JSONObject jsonObject = JSON.parseObject(bodyString);
2024-01-25 13:37:17 +08:00
try {
2023-12-11 15:32:53 +08:00
Boolean result = JSON.parseObject(JSON.toJSONString(response)).getBoolean("successful");
if (result && jsonObject.get("msg").equals("OK!")) {
2024-06-25 15:29:19 +08:00
// JSONObject data = jsonObject.getJSONObject("data");
// JSONArray list = JSONArray.parseArray(data.get("list").toString());
JSONArray list = jsonObject.getJSONArray("data");
2023-12-11 15:32:53 +08:00
JSONObject map = (JSONObject) list.get(0);
return map.get("category").toString();
}
2024-01-25 13:37:17 +08:00
} catch (NullPointerException e) {
2023-12-11 15:32:53 +08:00
log.info("getClothCategory 失败###{}未返回category", jsonObject);
throw new BusinessException("cloth-classification.interface.exception");
2023-12-11 14:24:28 +08:00
}
2023-12-11 15:35:11 +08:00
log.info("getClothCategory 失败###{}", jsonObject);
2023-12-11 14:24:28 +08:00
//生成失败
throw new BusinessException("cloth-classification.interface.exception");
}
2024-06-24 17:02:25 +08:00
public Boolean cancelGenerateTask(String taskId, String path) {
OkHttpClient client = new OkHttpClient().newBuilder()
.connectTimeout(30, TimeUnit.SECONDS)
.pingInterval(5, TimeUnit.SECONDS)//websocket轮训间隔(单位:秒)
.readTimeout(60, TimeUnit.SECONDS)//读取超时(单位:秒)
.writeTimeout(60, TimeUnit.SECONDS)//写入超时(单位:秒)
.build();
2024-06-24 17:02:25 +08:00
String url = accessPythonIp + ":" + accessPythonPort + path + taskId;
// String url = fastApiPythonAddress + "/api/generate_cancel/" + taskId;
Request request = new Request.Builder()
2024-01-24 16:57:53 +08:00
.url(url)
// .addHeader("Authorization", "Basic YWlkbGFiOjEyMw==")
// .addHeader("Content-Type", "application/json")
.build();
Response response = null;
try {
2024-01-24 16:57:53 +08:00
log.info("cancelGenerateTask请求入参content###{}", taskId);
response = client.newCall(request).execute();
} catch (IOException ioException) {
2024-06-24 17:02:25 +08:00
log.error("PythonService##cancelGenerateTask异常###{}", response);
2024-01-25 13:37:17 +08:00
return null;
}
int responseCode = response.code();
response.close();
2024-01-24 16:57:53 +08:00
if (responseCode != HttpURLConnection.HTTP_OK) {
2024-06-24 17:02:25 +08:00
log.info("generate-python 取消请求失败. {}", response);
2024-01-24 16:57:53 +08:00
return Boolean.FALSE;
}
2024-01-25 13:37:17 +08:00
log.info("generate-python 取消请求成功");
2024-01-24 16:57:53 +08:00
return Boolean.TRUE;
}
public Boolean superResolution(SuperResolutionDTO superResolutionDTO) throws BusinessException {
OkHttpClient client = new OkHttpClient().newBuilder()
.connectTimeout(30, TimeUnit.SECONDS)
.pingInterval(5, TimeUnit.SECONDS)//websocket轮训间隔(单位:秒)
.readTimeout(60, TimeUnit.SECONDS)//读取超时(单位:秒)
.writeTimeout(60, TimeUnit.SECONDS)//写入超时(单位:秒)
.build();
MediaType mediaType = MediaType.parse("application/json");
HashMap<String, String> content = new HashMap<>();
content.put("sr_image_url", superResolutionDTO.getImages());
content.put("sr_xn", superResolutionDTO.getScale().toString());
content.put("sr_tasks_id", superResolutionDTO.getUniqueId());
String jsonString = JSON.toJSONString(content, SerializerFeature.WriteNullStringAsEmpty);
RequestBody body = RequestBody.create(mediaType, jsonString);
Request request = new Request.Builder()
2024-06-17 17:34:27 +08:00
.url(accessPythonIp + ":" + srServicePort + "/api/super_resolution")
.method("POST", body)
.addHeader("Content-Type", "application/json")
.build();
Response response = null;
try {
log.info("superResolution请求入参content###{}", jsonString);
response = client.newCall(request).execute();
} catch (IOException ioException) {
log.error("PythonService##superResolution异常###{}", ExceptionUtil.getThrowableList(ioException));
return null;
}
int responseCode = response.code();
response.close();
if (responseCode != HttpURLConnection.HTTP_OK) {
// 基本不会有除200以外的code
log.info("superResolution 请求超分操作失败。 Response code " + response.code());
throw new BusinessException("superResolution 请求超分操作失败。 Response code " + response.code());
}
log.info("superResolution 请求超分操作成功");
return Boolean.TRUE;
}
public String promptTranslate(String text) throws BusinessException {
OkHttpClient client = new OkHttpClient().newBuilder()
.connectTimeout(30, TimeUnit.SECONDS)
.pingInterval(5, TimeUnit.SECONDS)//websocket轮训间隔(单位:秒)
.readTimeout(60, TimeUnit.SECONDS)//读取超时(单位:秒)
.writeTimeout(60, TimeUnit.SECONDS)//写入超时(单位:秒)
.build();
MediaType mediaType = MediaType.parse("application/json");
HashMap<String, String> content = new HashMap<>();
content.put("text", text);
String jsonString = JSON.toJSONString(content, SerializerFeature.WriteNullStringAsEmpty);
RequestBody body = RequestBody.create(mediaType, jsonString);
2024-06-17 13:21:58 +08:00
String path = accessPythonIp + ":" + accessPythonPort + "/api/translateToEN";
log.info("translateToEN 请求地址: {}", path);
Request request = new Request.Builder()
2024-06-17 13:21:58 +08:00
.url(path)
// .url(fastApiPythonAddress + "/api/translateToEN")
.method("POST", body)
.addHeader("Content-Type", "application/json")
.build();
Response response = null;
try {
log.info("promptTranslation请求入参content###{}", jsonString);
response = client.newCall(request).execute();
} catch (IOException ioException) {
log.error("PythonService##promptTranslation异常###{}", ExceptionUtil.getThrowableList(ioException));
return text;
}
int responseCode = response.code();
String bodyString;
try {
bodyString = response.body().string();
if (responseCode != HttpURLConnection.HTTP_OK) {
// 基本不会有除200以外的code
log.info("promptTranslation 用户输入翻译失败。 Response code " + responseCode);
throw new BusinessException("promptTranslation 用户输入翻译失败。 Response code " + responseCode);
}
JSONObject jsonObject = JSON.parseObject(bodyString);
Boolean result = JSON.parseObject(JSON.toJSONString(response)).getBoolean("successful");
if (result && jsonObject.get("msg").equals("OK!")) {
String translated = jsonObject.get("data").toString();
log.info("翻译或处理后的文本 {}", translated);
return translated;
}
} catch (IOException e) {
log.error("promptTranslation 用户输入翻译失败; error message => " + e.getMessage());
2024-08-15 16:25:44 +08:00
response.close();
throw new RuntimeException(e);
} finally {
response.close();
}
log.info("promptTranslation 用户输入翻译失败,返回用户输入");
return text;
}
2024-07-05 16:52:56 +08:00
public Boolean toProductImage(String url, String taskId, String prompt, BigDecimal imageStrength, String productType) {
2024-06-12 09:47:55 +08:00
// todo 限流校验
// AccessLimitUtils.validate("design",5);
OkHttpClient client = new OkHttpClient().newBuilder()
.connectTimeout(30, TimeUnit.SECONDS)
.pingInterval(5, TimeUnit.SECONDS)//websocket轮训间隔(单位:秒)
.readTimeout(60, TimeUnit.SECONDS)//读取超时(单位:秒)
.writeTimeout(60, TimeUnit.SECONDS)//写入超时(单位:秒)
.build();
MediaType mediaType = MediaType.parse("application/json");
//关闭FastJson的引用检测 防止出现$ref 现象
2024-07-02 13:48:53 +08:00
Map<String, Object> map = new HashMap<>();
2024-06-12 09:47:55 +08:00
map.put("tasks_id", taskId);
map.put("image_url", url);
map.put("prompt", prompt);
2024-07-02 13:48:53 +08:00
map.put("image_strength", imageStrength);
2024-07-05 16:52:56 +08:00
map.put("product_type", productType);
2024-06-12 09:47:55 +08:00
log.info("toProductImage请求python 参数:####{}", map);
String param = JSON.toJSONString(map, SerializerFeature.WriteNullStringAsEmpty);
2024-07-02 13:48:53 +08:00
System.out.println(param);
2024-06-12 09:47:55 +08:00
RequestBody body = RequestBody.create(mediaType, param);
Request request = new Request.Builder()
// .url(accessPythonIp + ":" + accessPythonPort + "/api/generate_product_image")
2024-06-22 17:27:50 +08:00
// .url(accessPythonIp + ":9996/api/generate_product_image")
2024-07-08 09:31:42 +08:00
.url(accessPythonIp + ":" + accessPythonPort + "/api/generate_product_image")
2024-06-12 09:47:55 +08:00
.method("POST", body)
.addHeader("Authorization", "Basic YWlkbGFiOjEyMw==")
.addHeader("Content-Type", "application/json")
.build();
Response response;
String responseBody;
try {
response = client.newCall(request).execute();
} catch (IOException ioException) {
log.error("PythonService##toProductImage异常###{}", ExceptionUtil.getThrowableList(ioException));
throw new BusinessException("toProductImage.interface.exception");
}
if (response.isSuccessful()) {
return Boolean.TRUE;
}
log.error("PythonService##toProductImage异常response###{}", response);
//生成失败
throw new BusinessException("toProductImage.interface.exception");
}
2024-06-27 15:33:26 +08:00
2024-07-05 16:52:56 +08:00
public Boolean relight(String url, String taskId, String prompt, String direction, String relightType) {
2024-06-27 15:33:26 +08:00
// todo 限流校验
// AccessLimitUtils.validate("design",5);
OkHttpClient client = new OkHttpClient().newBuilder()
.connectTimeout(30, TimeUnit.SECONDS)
.pingInterval(5, TimeUnit.SECONDS)//websocket轮训间隔(单位:秒)
.readTimeout(60, TimeUnit.SECONDS)//读取超时(单位:秒)
.writeTimeout(60, TimeUnit.SECONDS)//写入超时(单位:秒)
.build();
MediaType mediaType = MediaType.parse("application/json");
//关闭FastJson的引用检测 防止出现$ref 现象
Map<String, String> map = new HashMap<>();
map.put("tasks_id", taskId);
map.put("image_url", url);
map.put("prompt", prompt);
2024-07-04 11:34:51 +08:00
map.put("direction", direction);
2024-07-05 16:52:56 +08:00
map.put("product_type", relightType);
2024-06-27 15:33:26 +08:00
log.info("relightImage请求python 参数:####{}", map);
String param = JSON.toJSONString(map, SerializerFeature.WriteNullStringAsEmpty);
2024-07-02 13:48:53 +08:00
log.info(param);
2024-06-27 15:33:26 +08:00
RequestBody body = RequestBody.create(mediaType, param);
Request request = new Request.Builder()
// .url(accessPythonIp + ":" + accessPythonPort + "/api/generate_product_image")
// .url(accessPythonIp + ":9996/api/generate_product_image")
2024-07-08 09:31:42 +08:00
.url(accessPythonIp + ":" + accessPythonPort + "/api/generate_relight_image")
2024-06-27 15:33:26 +08:00
.method("POST", body)
.addHeader("Authorization", "Basic YWlkbGFiOjEyMw==")
.addHeader("Content-Type", "application/json")
.build();
Response response;
String responseBody;
try {
response = client.newCall(request).execute();
} catch (IOException ioException) {
log.error("PythonService##relightImage异常###{}", ExceptionUtil.getThrowableList(ioException));
throw new BusinessException("relightImage.interface.exception");
}
if (response.isSuccessful()) {
return Boolean.TRUE;
}
log.error("PythonService##relightImage异常response###{}", response);
//生成失败
throw new BusinessException("relightImage.interface.exception");
}
2024-09-23 11:13:44 +08:00
public String imageToSketch(String imagePath, String bucket, String objectName, String styleCode, String styleImageUrl){
OkHttpClient client = new OkHttpClient().newBuilder()
.connectTimeout(30, TimeUnit.SECONDS)
.pingInterval(5, TimeUnit.SECONDS)//websocket轮训间隔(单位:秒)
.readTimeout(60, TimeUnit.SECONDS)//读取超时(单位:秒)
.writeTimeout(60, TimeUnit.SECONDS)//写入超时(单位:秒)
.build();
MediaType paramMap = MediaType.parse("application/json");
//关闭FastJson的引用检测 防止出现$ref 现象
Map<String, Object> map = new HashMap<>();
map.put("image_url", imagePath);
2024-09-23 11:13:44 +08:00
map.put("style_image_url", styleImageUrl);
map.put("default_style", styleCode);
map.put("sketch_bucket", bucket);
map.put("sketch_name", objectName);
String param = JSON.toJSONString(map, SerializerFeature.WriteNullStringAsEmpty);
2024-09-24 10:20:08 +08:00
log.info("ImageToSketch请求python 参数:####{}", param);
RequestBody body = RequestBody.create(paramMap, param);
Request request = new Request.Builder()
.url(accessPythonIp + ":" + accessPythonPort + "/api/image2sketch")
.method("POST", body)
.addHeader("Authorization", "Basic YWlkbGFiOjEyMw==")
.addHeader("Content-Type", "application/json")
.build();
Response response;
try {
response = client.newCall(request).execute();
} catch (IOException ioException) {
log.error("PythonService##ImageToSketch异常###{}", ExceptionUtil.getThrowableList(ioException));
throw new BusinessException("generate.interface.error");
}
int responseCode = response.code();
String bodyString;
try {
bodyString = response.body().string();
if (responseCode != HttpURLConnection.HTTP_OK) {
// 基本不会有除200以外的code
log.info("ImageToSketch 失败。 Response code {}", responseCode);
throw new BusinessException("ImageToSketch 失败。 Response code " + responseCode);
}
JSONObject jsonObject = JSON.parseObject(bodyString);
if (response.isSuccessful() && jsonObject.get("msg").equals("OK!")) {
String sketchResult = jsonObject.get("data").toString();
log.info("ImageToSketch 结果 {}", sketchResult);
return sketchResult;
}else {
log.info("ImageToSketch 失败。 Response code {}", responseCode);
throw new BusinessException("ImageToSketch 失败。 Response code " + responseCode);
}
} catch (IOException e) {
log.error("ImageToSketch 失败; error message => {}", e.getMessage());
response.close();
throw new BusinessException("generate.interface.error");
} finally {
response.close();
}
}
2024-09-27 14:42:30 +08:00
public void bright(String url, Double brightenValue) {
OkHttpClient client = new OkHttpClient().newBuilder()
.connectTimeout(30, TimeUnit.SECONDS)
.pingInterval(5, TimeUnit.SECONDS)//websocket轮训间隔(单位:秒)
.readTimeout(60, TimeUnit.SECONDS)//读取超时(单位:秒)
.writeTimeout(60, TimeUnit.SECONDS)//写入超时(单位:秒)
.build();
MediaType mediaType = MediaType.parse("application/json");
//关闭FastJson的引用检测 防止出现$ref 现象
Map<String, Object> map = new HashMap<>();
map.put("image_url", url);
map.put("brighten_value", brightenValue);
log.info("bright请求python 参数:####{}", map);
String param = JSON.toJSONString(map, SerializerFeature.WriteNullStringAsEmpty);
log.info(param);
RequestBody body = RequestBody.create(mediaType, param);
Request request = new Request.Builder()
// .url(accessPythonIp + ":" + accessPythonPort + "/api/generate_product_image")
// .url(accessPythonIp + ":9996/api/generate_product_image")
.url(accessPythonIp + ":" + accessPythonPort + "/api/brighten")
.method("POST", body)
.addHeader("Authorization", "Basic YWlkbGFiOjEyMw==")
.addHeader("Content-Type", "application/json")
.build();
Response response;
String responseBody;
try {
response = client.newCall(request).execute();
} catch (IOException ioException) {
log.error("PythonService##bright异常###{}", ExceptionUtil.getThrowableList(ioException));
throw new BusinessException("bright.interface.exception");
}
if (response.isSuccessful()) {
return;
}
log.error("PythonService##bright异常response###{}", response);
//生成失败
throw new BusinessException("bright.interface.exception");
}
2024-12-09 13:31:30 +08:00
public JSONObject attributeRecognition(List<String> pictureUrls,List<String> ids, List<String> category) {
//限流校验
AccessLimitUtils.validate("attributeRecognition", 20);
OkHttpClient client = new OkHttpClient().newBuilder()
.connectTimeout(30, TimeUnit.SECONDS)
.pingInterval(5, TimeUnit.SECONDS)//websocket轮训间隔(单位:秒)
.readTimeout(300, TimeUnit.SECONDS)//读取超时(单位:秒)
.writeTimeout(300, TimeUnit.SECONDS)//写入超时(单位:秒)
.build();
MediaType mediaType = MediaType.parse("application/json");
Map<String, List<String>> content = Maps.newHashMap();
//识别图片路径数组
content.put("upload_img_path", pictureUrls);
//识别图片id数组
content.put("upload_img_id", ids);
content.put("upload_img_category", category);
RequestBody body = RequestBody.create(mediaType, JSON.toJSONString(content));
Request request = new Request.Builder()
.url(accessPythonIp + ":9993/api/attribute")
.method("POST", body)
.addHeader("Authorization", "Basic YWlkbGFiOjEyMw==")
.addHeader("Content-Type", "application/json")
.build();
Response response = null;
String bodyStr = null;
try {
log.info("识别python对应的属性标签值请求入参content###{}", JSON.toJSONString(content));
response = client.newCall(request).execute();
bodyStr = response.body().string();
} catch (IOException ioException) {
log.error("PythonService###attributeRecognition异常##{}", ExceptionUtil.getThrowableList(ioException));
}
log.info("识别python对应的属性标签值结果###{}",bodyStr.trim());
//去除限流
AccessLimitUtils.validateOut("attributeRecognition");
if (Objects.isNull(response)) {
log.error("PythonService##attributeRecognition异常###{}", "response or body is empty!");
throw new BusinessException("attribute recognition exception!");
}
JSONObject jsonObject = JSON.parseObject(JSON.toJSONString(response));
Boolean result = jsonObject.getBoolean("successful");
if (result) {
JSONObject attributeJSONObject = JSON.parseObject(bodyStr.trim());
return attributeJSONObject;
}
log.info("识别python对应的属性标签值异常###{}", jsonObject);
//生成失败
throw new BusinessException("Atribute recognition exception!");
}
2024-12-13 16:07:21 +08:00
2024-12-19 10:51:38 +08:00
public String designBatch(DesignPythonObjects designPythonObjects, Long accountId, int designNum, String taskId) {
2024-12-13 16:07:21 +08:00
// todo 限流校验
2024-12-19 10:51:38 +08:00
// AccessLimitUtils.validate("design",5);
// 将 designPythonObjects 写入文件
File file = new File("design_batch_test.txt");
try (FileWriter writer = new FileWriter(file)) {
String param = JSON.toJSONString(designPythonObjects, SerializerFeature.DisableCircularReferenceDetect);
writer.write(param);
log.info("设计请求参数已写入文件:####{}", file.getAbsolutePath());
} catch (IOException e) {
log.error("写入文件异常:{}", e.getMessage());
throw new BusinessException("file.write.exception");
}
2024-12-13 16:07:21 +08:00
OkHttpClient client = new OkHttpClient().newBuilder()
.connectTimeout(30, TimeUnit.SECONDS)
2024-12-19 10:51:38 +08:00
.pingInterval(5, TimeUnit.SECONDS)
.readTimeout(60, TimeUnit.SECONDS)
.writeTimeout(60, TimeUnit.SECONDS)
.build();
// 构建 multipart 表单
RequestBody body = new MultipartBody.Builder().setType(MultipartBody.FORM)
.addFormDataPart("file", "design_batch_test.txt",
RequestBody.create(MediaType.parse("text/plain"), file))
.addFormDataPart("tasks_id", taskId)
.addFormDataPart("user_id", String.valueOf(accountId))
.addFormDataPart("file_name", "design_batch_test" + taskId + ".json")
.addFormDataPart("total", String.valueOf(designNum))
2024-12-13 16:07:21 +08:00
.build();
Request request = new Request.Builder()
2024-12-19 10:51:38 +08:00
.url("http://18.167.251.121:9994/api/design_batch_generate")
2024-12-13 16:07:21 +08:00
.method("POST", body)
2024-12-19 10:51:38 +08:00
.addHeader("Content-Type", "multipart/form-data")
2024-12-13 16:07:21 +08:00
.build();
2024-12-19 10:51:38 +08:00
2024-12-13 16:07:21 +08:00
Response response;
String responseBody;
try {
response = client.newCall(request).execute();
} catch (IOException ioException) {
AccessLimitUtils.validateOut("design");
log.error("PythonService##design异常###{}", ExceptionUtil.getThrowableList(ioException));
throw new BusinessException("design.interface.exception");
}
if (response.isSuccessful()) {
try {
if (Objects.nonNull(response.body())) {
responseBody = response.body().string();
JSONObject responseObject = JSON.parseObject(responseBody);
log.info("PythonService##responseObject###{}", responseObject);
2024-12-19 10:51:38 +08:00
return taskId;
2024-12-13 16:07:21 +08:00
}
throw new BusinessException("design.interface.exception");
} catch (IOException | JSONException e) {
log.error("PythonService##design异常###{}", e.getMessage());
throw new BusinessException("design.interface.exception");
}
}
log.error("PythonService##design异常response###{}", response);
throw new BusinessException("design.interface.exception");
}
2024-12-19 10:51:38 +08:00
2025-06-10 10:55:56 +08:00
public List<String> getSystemSketchByCategory(String category, Long brandId, Double brandScale) {
2025-03-18 13:43:59 +08:00
AuthPrincipalVo userHolder = UserContext.getUserHolder();
OkHttpClient client = new OkHttpClient().newBuilder()
.connectTimeout(30, TimeUnit.SECONDS)
.readTimeout(60, TimeUnit.SECONDS)
.writeTimeout(60, TimeUnit.SECONDS)
.build();
// 构建动态路径参数(保留两位小数)
// String url = String.format("%s:%s/recommend/%d/%s/1",
// accessPythonIp,
// accessPythonPort,
// userHolder.getId(),
// category);
2025-06-10 11:13:17 +08:00
String brandIdParam = (brandId != null) ? "brandId=" + brandId : "";
String brandScaleParam = (brandScale != null) ? "&brandScale=" + String.format("%.2f", brandScale) : "";
2025-06-10 15:02:44 +08:00
String url = String.format("%s:%s/api/recommend/%d/%s/1/%s/%s",
2025-03-19 10:39:42 +08:00
"http://18.167.251.121",
"9994",
2025-03-18 13:43:59 +08:00
userHolder.getId(),
2025-06-10 10:55:56 +08:00
category,
2025-06-10 11:13:17 +08:00
brandIdParam,
brandScaleParam);
2025-03-18 13:43:59 +08:00
log.info("Recommendation request URL: {}", url);
Request request = new Request.Builder()
.url(url)
.get()
.addHeader("Authorization", "Basic YWlkbGFiOjEyMw==")
.build();
try (Response response = client.newCall(request).execute()) {
log.info("Response status: {}", response.code());
if (!response.isSuccessful()) {
String errorBody = response.body() != null ?
response.body().string() : "empty response";
log.error("Request failed with code: {}, body: {}",
response.code(), errorBody);
throw new BusinessException("Recommendation service unavailable");
}
// 解析图片路径数组
String responseBody = response.body().string();
List<String> imagePaths = JSON.parseArray(responseBody, String.class);
if (imagePaths == null || imagePaths.isEmpty()) {
log.warn("Empty recommendation result for {}", category);
return Collections.emptyList();
}
log.info("Received {} recommended images", imagePaths.size());
return imagePaths;
} catch (IOException e) {
log.error("Network error: {}", ExceptionUtil.getRootCauseMessage(e));
throw new BusinessException("Failed to get recommendations: " + e.getMessage());
} catch (JSONException e) {
log.error("Response parsing error: {}", ExceptionUtil.getMessage(e));
throw new BusinessException("Invalid service response format");
}
}
2025-03-24 15:59:46 +08:00
public JSONObject segProduct(String url) {
OkHttpClient client = new OkHttpClient().newBuilder()
.connectTimeout(30, TimeUnit.SECONDS)
.pingInterval(5, TimeUnit.SECONDS)//websocket轮训间隔(单位:秒)
.readTimeout(60, TimeUnit.SECONDS)//读取超时(单位:秒)
.writeTimeout(60, TimeUnit.SECONDS)//写入超时(单位:秒)
.build();
MediaType mediaType = MediaType.parse("application/json");
//关闭FastJson的引用检测 防止出现$ref 现象
Map<String, Object> map = new HashMap<>();
map.put("image_url", url);
2025-05-06 17:30:01 +08:00
map.put("is_brand_dna", Boolean.FALSE);
2025-03-24 15:59:46 +08:00
log.info("bright请求python 参数:####{}", map);
String param = JSON.toJSONString(map, SerializerFeature.WriteNullStringAsEmpty);
log.info(param);
RequestBody body = RequestBody.create(mediaType, param);
Request request = new Request.Builder()
// .url(accessPythonIp + ":" + accessPythonPort + "/api/generate_product_image")
// .url(accessPythonIp + ":9996/api/generate_product_image")
.url(accessPythonIp + ":" + accessPythonPort + "/api/seg_product")
.method("POST", body)
.addHeader("Authorization", "Basic YWlkbGFiOjEyMw==")
.addHeader("Content-Type", "application/json")
.build();
Response response;
String responseBody;
try {
response = client.newCall(request).execute();
} catch (IOException ioException) {
log.error("PythonService##bright异常###{}", ExceptionUtil.getThrowableList(ioException));
throw new BusinessException("segProduct.interface.exception");
}
if (response.isSuccessful()) {
try {
if (Objects.nonNull(response.body())) {
responseBody = response.body().string();
JSONObject responseObject = JSON.parseObject(responseBody);
log.info("PythonService##responseObject###{}", responseObject);
return responseObject;
}
throw new BusinessException("segProduct.interface.exception");
} catch (IOException | JSONException e) {
log.error("PythonService##segProduct异常###{}", e.getMessage());
throw new BusinessException("segProduct.interface.exception");
}
}
log.error("PythonService##segProduct异常response###{}", response);
//生成失败
throw new BusinessException("segProduct.interface.exception");
}
2025-03-20 17:42:16 +08:00
public Boolean poseTransformation(String productImage, int poseId, String taskId) {
OkHttpClient client = new OkHttpClient().newBuilder()
.connectTimeout(30, TimeUnit.SECONDS)
.pingInterval(5, TimeUnit.SECONDS)//websocket轮训间隔(单位:秒)
.readTimeout(60, TimeUnit.SECONDS)//读取超时(单位:秒)
.writeTimeout(60, TimeUnit.SECONDS)//写入超时(单位:秒)
.build();
MediaType mediaType = MediaType.parse("application/json");
Map<String, String> content = Maps.newHashMap();
content.put("image_url", productImage);
content.put("tasks_id", taskId);
content.put("pose_id", String.valueOf(poseId));
RequestBody body = RequestBody.create(mediaType, JSON.toJSONString(content));
log.info("poseTransformation 请求地址: {}", accessPythonIp + ":" + accessPythonPort + "/api/pose_transform");
Request request = new Request.Builder()
.url(accessPythonIp + ":" + accessPythonPort + "/api/pose_transform")
.method("POST", body)
.addHeader("Content-Type", "application/json")
.build();
Response response = null;
String bodyString;
try {
log.info("poseTransformation请求入参content###{}", JSON.toJSONString(content));
response = client.newCall(request).execute();
} catch (IOException ioException) {
log.error("PythonService##poseTransformation异常###{}", ExceptionUtil.getThrowableList(ioException));
throw new BusinessException(ioException.getMessage());
}
// 判断是否生成失败
if (Objects.isNull(response.body())) {
log.error("PythonService##poseTransformation异常###{}", "response or body is empty!");
throw new BusinessException("PythonService##poseTransformation异常###: response or body is empty!");
} else if (response.code() != HttpURLConnection.HTTP_OK) {
log.error("PythonService##poseTransformation异常###{}", "Response error!Response code ## " + response.code() + " ##");
throw new BusinessException("PythonService##poseTransformation异常### Response error!Response code ## " + response.code() + " ##");
} else {
try {
bodyString = response.body().string();
} catch (IOException e) {
log.error(e.getMessage());
throw new BusinessException(e.getMessage());
}
}
JSONObject jsonObject = JSON.parseObject(bodyString);
Boolean result = JSON.parseObject(JSON.toJSONString(response)).getBoolean("successful");
if (result && jsonObject.get("code").equals(200)) {
log.info("poseTransformation##responseObject###{}", jsonObject);
return Boolean.TRUE;
} else {
log.info("poseTransformation失败###{}", jsonObject);
log.info("poseTransformation Exception! Code : {}", jsonObject.get("code"));
return Boolean.FALSE;
}
}
2025-03-25 17:37:35 +08:00
public String modifyModelProportion(String mannequinPath, Float stretch, String name, int top, int bottom) {
2025-03-25 11:19:55 +08:00
OkHttpClient client = new OkHttpClient().newBuilder()
.connectTimeout(30, TimeUnit.SECONDS)
.pingInterval(5, TimeUnit.SECONDS)//websocket轮训间隔(单位:秒)
.readTimeout(60, TimeUnit.SECONDS)//读取超时(单位:秒)
.writeTimeout(60, TimeUnit.SECONDS)//写入超时(单位:秒)
.build();
MediaType mediaType = MediaType.parse("application/json");
Map<String, String> content = Maps.newHashMap();
// 模特的minio地址
content.put("mannequins", mannequinPath);
// 缩放比
2025-03-25 17:37:35 +08:00
content.put("resize_pixel", stretch.toString());
2025-03-25 11:19:55 +08:00
// 结果存放桶名
content.put("bucket_name", "aida-users");
// 模特名uuid
content.put("mannequin_name", name);
content.put("top", String.valueOf(top));
content.put("bottom", String.valueOf(bottom));
RequestBody body = RequestBody.create(mediaType, JSON.toJSONString(content));
log.info("modifyModelProportion 请求地址: {}\n 参数:{}", accessPythonIp + ":" + accessPythonPort + "/api/mannequins_edit", JSON.toJSONString(content));
Request request = new Request.Builder()
.url(accessPythonIp + ":" + accessPythonPort + "/api/mannequins_edit")
.method("POST", body)
.addHeader("Content-Type", "application/json")
.build();
Response response = null;
try {
response = client.newCall(request).execute();
} catch (IOException ioException) {
log.error("PythonService##modifyModelProportion异常###{}", ExceptionUtil.getThrowableList(ioException));
throw new BusinessException("generate.interface.error");
}
int responseCode = response.code();
String bodyString;
try {
bodyString = response.body().string();
if (responseCode != HttpURLConnection.HTTP_OK) {
// 基本不会有除200以外的code
log.info("modifyModelProportion 失败。 Response code {}", responseCode);
throw new BusinessException("modifyModelProportion 失败。 Response code " + responseCode);
}
JSONObject jsonObject = JSON.parseObject(bodyString);
if (response.isSuccessful() && jsonObject.get("msg").equals("OK!")) {
String modifiedModel = jsonObject.get("data").toString();
log.info("modifyModelProportion 结果 {}", modifiedModel);
return modifiedModel;
}else {
log.info("modifyModelProportion 失败。 Response code {}", responseCode);
throw new BusinessException("modifyModelProportion 失败。 Response code " + responseCode);
}
} catch (IOException e) {
log.error("modifyModelProportion 失败; error message => {}", e.getMessage());
response.close();
throw new BusinessException("generate.interface.error");
} finally {
response.close();
}
}
2025-03-27 14:32:56 +08:00
public JSONObject brandDNAGenerate(String prompt) {
OkHttpClient client = new OkHttpClient().newBuilder()
.connectTimeout(30, TimeUnit.SECONDS)
.pingInterval(5, TimeUnit.SECONDS)//websocket轮训间隔(单位:秒)
.readTimeout(60, TimeUnit.SECONDS)//读取超时(单位:秒)
.writeTimeout(60, TimeUnit.SECONDS)//写入超时(单位:秒)
.build();
MediaType mediaType = MediaType.parse("application/json");
//关闭FastJson的引用检测 防止出现$ref 现象
Map<String, Object> map = new HashMap<>();
map.put("prompt", prompt);
AuthPrincipalVo userHolder = UserContext.getUserHolder();
map.put("user_id", userHolder.getId());
log.info("brandDNAGenerate请求python 参数:####{}", map);
String param = JSON.toJSONString(map, SerializerFeature.WriteNullStringAsEmpty);
log.info(param);
RequestBody body = RequestBody.create(mediaType, param);
Request request = new Request.Builder()
// .url(accessPythonIp + ":" + accessPythonPort + "/api/generate_product_image")
// .url(accessPythonIp + ":9996/api/generate_product_image")
.url(accessPythonIp + ":" + accessPythonPort + "/api/GenerateBrand")
.method("POST", body)
.addHeader("Authorization", "Basic YWlkbGFiOjEyMw==")
.addHeader("Content-Type", "application/json")
.build();
Response response;
String responseBody;
try {
response = client.newCall(request).execute();
} catch (IOException ioException) {
log.error("PythonService##brandDNAGenerate异常###{}", ExceptionUtil.getThrowableList(ioException));
throw new BusinessException("brandDNAGenerate.interface.exception");
}
if (response.isSuccessful()) {
try {
if (Objects.nonNull(response.body())) {
responseBody = response.body().string();
JSONObject responseObject = JSON.parseObject(responseBody);
log.info("PythonService##responseObject###{}", responseObject);
return responseObject;
}
throw new BusinessException("brandDNAGenerate.interface.exception");
} catch (IOException | JSONException e) {
log.error("PythonService##brandDNAGenerate异常###{}", e.getMessage());
throw new BusinessException("brandDNAGenerate.interface.exception");
}
}
log.error("PythonService##brandDNAGenerate异常response###{}", response);
//生成失败
throw new BusinessException("brandDNAGenerate.interface.exception");
}
2025-04-14 13:26:56 +08:00
public List<ImageSegmentation.ImageDate> imageSegmentation(ImageSegmentation imageSegmentation) {
OkHttpClient client = new OkHttpClient().newBuilder()
.connectTimeout(30, TimeUnit.SECONDS)
.pingInterval(5, TimeUnit.SECONDS)//websocket轮训间隔(单位:秒)
.readTimeout(60, TimeUnit.SECONDS)//读取超时(单位:秒)
.writeTimeout(60, TimeUnit.SECONDS)//写入超时(单位:秒)
.build();
MediaType mediaType = MediaType.parse("application/json");
RequestBody body = RequestBody.create(mediaType, JSON.toJSONString(imageSegmentation));
log.info("modifyModelProportion 请求地址: {}\n 参数:{}", accessPythonIp + ":" + accessPythonPort + "/api/clothing_seg", JSON.toJSONString(imageSegmentation));
Request request = new Request.Builder()
.url(accessPythonIp + ":" + accessPythonPort + "/api/clothing_seg")
.method("POST", body)
.addHeader("Content-Type", "application/json")
.build();
Response response = null;
try {
response = client.newCall(request).execute();
} catch (IOException ioException) {
log.error("PythonService##imageSegmentation异常###{}", ExceptionUtil.getThrowableList(ioException));
throw new BusinessException("generate.interface.error");
}
int responseCode = response.code();
String bodyString;
try {
bodyString = response.body().string();
if (responseCode != HttpURLConnection.HTTP_OK) {
// 基本不会有除200以外的code
log.info("imageSegmentation 失败。 Response code {}", responseCode);
throw new BusinessException("imageSegmentation 失败。 Response code " + responseCode);
}
JSONObject jsonObject = JSON.parseObject(bodyString);
if (response.isSuccessful() && jsonObject.get("msg").equals("OK!")) {
log.info("imageSegmentation 结果 {}", jsonObject.get("data").toString());
List<ImageSegmentation.ImageDate> seg = JSONObject.parseObject(
jsonObject.get("data").toString(),
new TypeReference<List<ImageSegmentation.ImageDate>>() {}
);
return seg;
}else {
log.info("imageSegmentation 失败。 Response code {}", responseCode);
throw new BusinessException("imageSegmentation 失败。 Response code " + responseCode);
}
} catch (IOException e) {
log.error("imageSegmentation 失败; error message => {}", e.getMessage());
response.close();
throw new BusinessException("generate.interface.error");
} finally {
response.close();
}
}
2025-04-21 18:51:43 +08:00
2025-06-05 13:35:13 +08:00
public Boolean toProductImageBatch(String taskIdBatch, List<BatchParamDTO> paramList, String userId) {
2025-04-21 18:51:43 +08:00
// todo 限流校验
// AccessLimitUtils.validate("design",5);
OkHttpClient client = new OkHttpClient().newBuilder()
.connectTimeout(30, TimeUnit.SECONDS)
.pingInterval(5, TimeUnit.SECONDS)//websocket轮训间隔(单位:秒)
.readTimeout(60, TimeUnit.SECONDS)//读取超时(单位:秒)
.writeTimeout(60, TimeUnit.SECONDS)//写入超时(单位:秒)
.build();
MediaType mediaType = MediaType.parse("application/json");
//关闭FastJson的引用检测 防止出现$ref 现象
Map<String, Object> map = new HashMap<>();
2025-06-05 13:35:13 +08:00
map.put("user_id", userId);
map.put("batch_data_list", paramList);
map.put("batch_tasks_id", taskIdBatch);
2025-04-21 18:51:43 +08:00
log.info("toProductImage请求python 参数:####{}", map);
String param = JSON.toJSONString(map, SerializerFeature.WriteNullStringAsEmpty);
2025-06-06 17:18:59 +08:00
System.out.println(JSONObject.toJSONString(param));
2025-04-21 18:51:43 +08:00
RequestBody body = RequestBody.create(mediaType, param);
Request request = new Request.Builder()
// .url(accessPythonIp + ":" + accessPythonPort + "/api/generate_product_image")
// .url(accessPythonIp + ":9996/api/generate_product_image")
.url(accessPythonIp + ":" + accessPythonPort + "/api/batch_generate_product_image")
.method("POST", body)
.addHeader("Authorization", "Basic YWlkbGFiOjEyMw==")
.addHeader("Content-Type", "application/json")
.build();
Response response;
String responseBody;
try {
response = client.newCall(request).execute();
} catch (IOException ioException) {
log.error("PythonService##toProductImage异常###{}", ExceptionUtil.getThrowableList(ioException));
throw new BusinessException("toProductImage.interface.exception");
}
if (response.isSuccessful()) {
return Boolean.TRUE;
}
log.error("PythonService##toProductImage异常response###{}", response);
//生成失败
throw new BusinessException("toProductImage.interface.exception");
}
2025-06-05 17:06:11 +08:00
public Boolean relightBatch(String taskIdBatch, List<BatchParamDTO> paramList, String userId) {
2025-04-21 18:51:43 +08:00
// todo 限流校验
// AccessLimitUtils.validate("design",5);
OkHttpClient client = new OkHttpClient().newBuilder()
.connectTimeout(30, TimeUnit.SECONDS)
.pingInterval(5, TimeUnit.SECONDS)//websocket轮训间隔(单位:秒)
.readTimeout(60, TimeUnit.SECONDS)//读取超时(单位:秒)
.writeTimeout(60, TimeUnit.SECONDS)//写入超时(单位:秒)
.build();
MediaType mediaType = MediaType.parse("application/json");
//关闭FastJson的引用检测 防止出现$ref 现象
Map<String, Object> map = new HashMap<>();
2025-06-05 17:06:11 +08:00
map.put("batch_tasks_id", taskIdBatch);
map.put("user_id", userId);
map.put("batch_data_list", paramList);
2025-04-21 18:51:43 +08:00
log.info("relightImage请求python 参数:####{}", map);
String param = JSON.toJSONString(map, SerializerFeature.WriteNullStringAsEmpty);
log.info(param);
RequestBody body = RequestBody.create(mediaType, param);
Request request = new Request.Builder()
// .url(accessPythonIp + ":" + accessPythonPort + "/api/generate_product_image")
// .url(accessPythonIp + ":9996/api/generate_product_image")
.url(accessPythonIp + ":" + accessPythonPort + "/api/batch_generate_relight_image")
.method("POST", body)
.addHeader("Authorization", "Basic YWlkbGFiOjEyMw==")
.addHeader("Content-Type", "application/json")
.build();
Response response;
String responseBody;
try {
response = client.newCall(request).execute();
} catch (IOException ioException) {
log.error("PythonService##relightImage异常###{}", ExceptionUtil.getThrowableList(ioException));
throw new BusinessException("relightImage.interface.exception");
}
if (response.isSuccessful()) {
return Boolean.TRUE;
}
log.error("PythonService##relightImage异常response###{}", response);
//生成失败
throw new BusinessException("relightImage.interface.exception");
}
2025-04-22 13:48:36 +08:00
public Boolean poseTransformationBatch(String productImage, Integer poseId, String taskId) {
OkHttpClient client = new OkHttpClient().newBuilder()
.connectTimeout(30, TimeUnit.SECONDS)
.pingInterval(5, TimeUnit.SECONDS)//websocket轮训间隔(单位:秒)
.readTimeout(60, TimeUnit.SECONDS)//读取超时(单位:秒)
.writeTimeout(60, TimeUnit.SECONDS)//写入超时(单位:秒)
.build();
MediaType mediaType = MediaType.parse("application/json");
Map<String, Object> content = Maps.newHashMap();
content.put("image_url", productImage);
content.put("tasks_id", taskId);
content.put("pose_id", String.valueOf(poseId));
content.put("batch_size", 1);
RequestBody body = RequestBody.create(mediaType, JSON.toJSONString(content));
2025-04-22 14:20:57 +08:00
log.info("poseTransformation 请求地址: {}", accessPythonIp + ":" + accessPythonPort + "/api/batch_generate_pose_transform_image");
2025-04-22 13:48:36 +08:00
Request request = new Request.Builder()
2025-04-22 15:26:55 +08:00
.url(accessPythonIp + ":" + accessPythonPort + "/api/batch_generate_pose_transform_image")
2025-04-22 13:48:36 +08:00
.method("POST", body)
.addHeader("Content-Type", "application/json")
.build();
Response response = null;
try {
response = client.newCall(request).execute();
} catch (IOException ioException) {
2025-04-22 15:59:08 +08:00
log.error("PythonService##poseTransferBatch异常###{}", ExceptionUtil.getThrowableList(ioException));
throw new BusinessException("poseTransferBatch.interface.exception");
2025-04-22 13:48:36 +08:00
}
2025-04-22 16:11:00 +08:00
if (response.isSuccessful() && response.body() != null) {
String responseBody = response.body().toString();
log.info("PythonService##poseTransferBatch返回内容###{}", responseBody);
2025-04-22 13:48:36 +08:00
return Boolean.TRUE;
}
2025-04-22 16:11:00 +08:00
log.error("PythonService##poseTransferBatch接口调用失败###{}", response);
2025-04-22 15:59:08 +08:00
throw new BusinessException("poseTransferBatch.interface.exception");
2025-04-22 13:48:36 +08:00
}
2025-05-18 12:46:12 +08:00
2025-05-20 16:54:20 +08:00
public JSONObject getProjectParam(String prompt, String fileUrl, List<String> imageUrlList) {
2025-05-18 12:46:12 +08:00
OkHttpClient client = new OkHttpClient().newBuilder()
.connectTimeout(30, TimeUnit.SECONDS)
.pingInterval(5, TimeUnit.SECONDS)//websocket轮训间隔(单位:秒)
.readTimeout(60, TimeUnit.SECONDS)//读取超时(单位:秒)
.writeTimeout(60, TimeUnit.SECONDS)//写入超时(单位:秒)
.build();
MediaType mediaType = MediaType.parse("application/json");
Map<String, Object> content = Maps.newHashMap();
content.put("prompt", prompt);
2025-05-20 16:59:07 +08:00
content.put("image_list", !CollectionUtils.isEmpty(imageUrlList) ? imageUrlList : new ArrayList<>());
content.put("file_list", !StringUtils.isEmpty(fileUrl) ? Collections.singletonList(fileUrl) : new ArrayList<>());
2025-05-18 12:46:12 +08:00
RequestBody body = RequestBody.create(mediaType, JSON.toJSONString(content));
log.info("getProjectParam 请求地址: {}", accessPythonIp + ":" + accessPythonPort + "/api/extraction_project_info");
Request request = new Request.Builder()
.url(accessPythonIp + ":" + accessPythonPort + "/api/extraction_project_info")
.method("POST", body)
.addHeader("Content-Type", "application/json")
.build();
Response response = null;
try {
response = client.newCall(request).execute();
} catch (IOException ioException) {
log.error("PythonService##getProjectParam异常###{}", ExceptionUtil.getThrowableList(ioException));
throw new BusinessException("getProjectParam.interface.exception");
}
String responseBody;
if (response.isSuccessful() && response.body() != null) {
try {
responseBody = response.body().string();
JSONObject responseObject = JSON.parseObject(responseBody);
log.info("PythonService##responseObject###{}", responseObject);
return responseObject;
} catch (IOException | JSONException e) {
log.error("PythonService##getProjectParam异常###{}", e.getMessage());
throw new BusinessException("getProjectParam.interface.exception");
}
}
log.error("PythonService##getProjectParam接口调用失败###{}", response);
throw new BusinessException("getProjectParam.interface.exception");
}
2025-06-05 13:35:13 +08:00
public List<String> getPrompt(String string, int num) {
OkHttpClient client = new OkHttpClient().newBuilder()
.connectTimeout(30, TimeUnit.SECONDS)
.pingInterval(5, TimeUnit.SECONDS)//websocket轮训间隔(单位:秒)
.readTimeout(60, TimeUnit.SECONDS)//读取超时(单位:秒)
.writeTimeout(60, TimeUnit.SECONDS)//写入超时(单位:秒)
.build();
MediaType mediaType = MediaType.parse("application/json");
Map<String, Object> content = Maps.newHashMap();
content.put("text", string);
content.put("num", num);
content.put("language", "english");
RequestBody body = RequestBody.create(mediaType, JSON.toJSONString(content));
log.info("batch_prompt_optimizer 请求地址: {}", accessPythonIp + ":" + accessPythonPort + "/api/batch_prompt_optimizer");
Request request = new Request.Builder()
.url(accessPythonIp + ":" + "10002" + "/api/batch_prompt_optimizer")
.method("POST", body)
.addHeader("Content-Type", "application/json")
.build();
Response response = null;
try {
response = client.newCall(request).execute();
} catch (IOException ioException) {
log.error("PythonService##batch_prompt_optimizer异常###{}", ExceptionUtil.getThrowableList(ioException));
throw new BusinessException("batch_prompt_optimizer.interface.exception");
}
String responseBody;
if (response.isSuccessful() && response.body() != null) {
try {
responseBody = response.body().string();
JSONObject responseObject = JSON.parseObject(responseBody);
JSONObject dataObject = responseObject.getJSONObject("data");
if (dataObject != null) {
// 获取prompt_list数组
JSONArray promptArray = dataObject.getJSONArray("prompt_list");
if (promptArray != null) {
// 转换为List<String>
List<String> promptList = new ArrayList<>();
for (int i = 0; i < promptArray.size(); i++) {
promptList.add(promptArray.getString(i));
}
return promptList;
}
}
log.info("PythonService##responseObject###{}", responseObject);
return null;
} catch (IOException | JSONException e) {
log.error("PythonService##batch_prompt_optimizer异常###{}", e.getMessage());
throw new BusinessException("batch_prompt_optimizer.interface.exception");
}
}
log.error("PythonService##batch_prompt_optimizer接口调用失败###{}", response);
throw new BusinessException("batch_prompt_optimizer.interface.exception");
}
2023-01-06 15:17:37 +08:00
}