TASK:AiDA

This commit is contained in:
shahaibo
2024-12-09 13:31:30 +08:00
parent 9f064609e7
commit 1c96522447
26 changed files with 778 additions and 40 deletions

View File

@@ -51,7 +51,7 @@ public class AuthenticationFilter extends OncePerRequestFilter {
"/api/python/flush","/api/account/healthy","/api/ali-pay/trade/notify","/api/paypal/ipn/back","/api/alipay-hk/trade/notify", "/api/python/flush","/api/account/healthy","/api/ali-pay/trade/notify","/api/paypal/ipn/back","/api/alipay-hk/trade/notify",
"/api/portfolio/page", "/api/portfolio/detail", "/api/portfolio/commentPage", "/api/portfolio/viewsIncrease", "/api/portfolio/page", "/api/portfolio/detail", "/api/portfolio/commentPage", "/api/portfolio/viewsIncrease",
"/api/account/designWorksRegister","/api/account/questionnaire","/api/stripe/trade/notify", "/api/account/designWorksRegister","/api/account/questionnaire","/api/stripe/trade/notify",
"/notification","/api/account/activateNewEmail","/api/third/party/auth/google_callback","/api/third/party/parseGoogleCredential" "/notification","/api/account/activateNewEmail","/api/third/party/auth/google_callback","/api/third/party/parseGoogleCredential","/api/third/party/receiveDesignResults","/api/third/party/parseWeChatCode"
); );
@Override @Override

View File

@@ -297,4 +297,10 @@ public class AccountController {
public Response<Account> accountDetail(@RequestParam("id") Long id) { public Response<Account> accountDetail(@RequestParam("id") Long id) {
return Response.success(accountService.accountDetail(id)); return Response.success(accountService.accountDetail(id));
} }
@PostMapping("getAccountDetail")
@ApiOperation(value = "获取账户信息")
public Response<AccountLoginVO> getAccountDetail() {
return Response.success(accountService.getAccountDetail());
}
} }

View File

@@ -31,7 +31,7 @@ public class DesignController {
@ApiOperation(value = "设计 Conllection") @ApiOperation(value = "设计 Conllection")
@PostMapping("/designCollection") @PostMapping("/designCollection")
@CrossOrigin @CrossOrigin
public Response<DesignCollectionVO> designCollection(@Valid @RequestBody DesignCollectionDTO designDTO) { public Response<String> designCollection(@Valid @RequestBody DesignCollectionDTO designDTO) {
return Response.success(designService.designCollection(designDTO)); return Response.success(designService.designCollection(designDTO));
} }
@@ -43,7 +43,7 @@ public class DesignController {
@ApiOperation(value = "重新设计 Collection") @ApiOperation(value = "重新设计 Collection")
@PostMapping("/reDesignCollection") @PostMapping("/reDesignCollection")
public Response<DesignCollectionVO> reDesignCollection(@Valid @RequestBody ReDesignCollectionDTO reDesignDTO) { public Response<String> reDesignCollection(@Valid @RequestBody ReDesignCollectionDTO reDesignDTO) {
return Response.success(designService.reDesignCollection(reDesignDTO)); return Response.success(designService.reDesignCollection(reDesignDTO));
} }
@@ -83,4 +83,16 @@ public class DesignController {
return Response.success(designService.getModel(designItemIdList)); return Response.success(designService.getModel(designItemIdList));
} }
@ApiOperation(value = "获取design结果")
@GetMapping("/getDesignResult")
public Response<DesignCollectionVO> getDesignResult(@RequestParam("requestId") String requestId, @RequestParam("objectSignList") List<String> objectSignList){
return Response.success(designService.getDesignResult(requestId, objectSignList));
}
@ApiOperation(value = "云生成")
@PostMapping("/designCloud")
@CrossOrigin
public Response<String> designCloud(@Valid @RequestBody DesignCollectionDTO designDTO) {
return Response.success(designService.designCloud(designDTO));
}
} }

View File

@@ -245,4 +245,10 @@ public class SavedCollectionController {
public Response<String> likeHistoryRelSketch() { public Response<String> likeHistoryRelSketch() {
return Response.success(userLikeGroupService.likeHistoryRelSketch()); return Response.success(userLikeGroupService.likeHistoryRelSketch());
} }
@ApiOperation(value = "productImageInitialize")
@PostMapping("/productImageInitialize")
public Response<Boolean> productImageUpload(@Valid @RequestBody ProductImageInitializeDTO productImageInitializeDTO) {
return Response.success(userLikeGroupService.productImageInitialize(productImageInitializeDTO));
}
} }

View File

@@ -4,7 +4,10 @@ import com.ai.da.common.response.Response;
import com.ai.da.mapper.primary.entity.GoogleUser; import com.ai.da.mapper.primary.entity.GoogleUser;
import com.ai.da.model.dto.*; import com.ai.da.model.dto.*;
import com.ai.da.model.vo.AccountLoginVO; import com.ai.da.model.vo.AccountLoginVO;
import com.ai.da.model.vo.DesignCollectionVO;
import com.ai.da.service.AccountService; import com.ai.da.service.AccountService;
import com.ai.da.service.DesignService;
import com.alibaba.fastjson.JSONObject;
import io.swagger.annotations.Api; import io.swagger.annotations.Api;
import io.swagger.annotations.ApiOperation; import io.swagger.annotations.ApiOperation;
import lombok.extern.slf4j.Slf4j; import lombok.extern.slf4j.Slf4j;
@@ -29,6 +32,9 @@ public class ThirdPartyController {
@Resource @Resource
private AccountService accountService; private AccountService accountService;
@Resource
private DesignService designService;
/*@ApiOperation(value = "Add user information") /*@ApiOperation(value = "Add user information")
@PostMapping("/addUser") @PostMapping("/addUser")
public Response<Boolean> addUser(@Valid @RequestBody AccountAddDTO accountAddDTO) { public Response<Boolean> addUser(@Valid @RequestBody AccountAddDTO accountAddDTO) {
@@ -124,9 +130,20 @@ public class ThirdPartyController {
} }
@CrossOrigin @CrossOrigin
@GetMapping("/parseGoogleCredential") @GetMapping("/parseGoogleCredential")
public Response<GoogleUser> parseGoogleCredential(@RequestParam("credential") String credential) { public Response<AccountLoginVO> parseGoogleCredential(@RequestParam("credential") String credential) {
return Response.success(accountService.parseGoogleCredential(credential)); return Response.success(accountService.parseGoogleCredential(credential));
} }
@CrossOrigin
@GetMapping("/parseWeChatCode")
public Response<AccountLoginVO> parseWeChatCode(@RequestParam("code") String code) {
return Response.success(accountService.parseWeChatCode(code));
}
@ApiOperation(value = "接收Design结果")
@PostMapping("/receiveDesignResults")
@CrossOrigin
public Response<Boolean> receiveDesignResults(@Valid @RequestBody JSONObject responseObject) {
return Response.success(designService.receiveDesignResults(responseObject));
}
} }

View File

@@ -1,6 +1,7 @@
package com.ai.da.mapper.primary.entity; package com.ai.da.mapper.primary;
import com.ai.da.common.config.mybatis.plus.CommonMapper; import com.ai.da.common.config.mybatis.plus.CommonMapper;
import com.ai.da.mapper.primary.entity.AccountExtend;
import java.util.Date; import java.util.Date;
import java.util.List; import java.util.List;

View File

@@ -0,0 +1,7 @@
package com.ai.da.mapper.primary;
import com.ai.da.common.config.mybatis.plus.CommonMapper;
import com.ai.da.mapper.primary.entity.ProductImageAttribute;
public interface ProductImageAttributeMapper extends CommonMapper<ProductImageAttribute> {
}

View File

@@ -118,4 +118,6 @@ public class Account implements Serializable {
private BigDecimal shareCredits; private BigDecimal shareCredits;
private Integer subAccountNum; private Integer subAccountNum;
private String invitationCode;
} }

View File

@@ -0,0 +1,35 @@
package com.ai.da.mapper.primary.entity;
import com.baomidou.mybatisplus.annotation.IdType;
import com.baomidou.mybatisplus.annotation.TableId;
import com.baomidou.mybatisplus.annotation.TableName;
import lombok.Data;
import lombok.EqualsAndHashCode;
import lombok.experimental.Accessors;
import java.io.Serializable;
@Data
@EqualsAndHashCode(callSuper = false)
@Accessors(chain = true)
@TableName("product_image_attribute")
public class ProductImageAttribute implements Serializable {
private static final long serialVersionUID = 1L;
@TableId(value = "id", type = IdType.AUTO)
private Long id;
private String imgName;
private String length;
private String sleeveLength;
private String sleeveShape;
private String sleeveShoulder;
private String neckline;
private String collar;
private String design;
private String silhouette;
private String type;
private String openingType;
private String subtype;
private String style;
}

View File

@@ -19,6 +19,4 @@ public class AttributeRetrieval {
private String subtype; private String subtype;
private String style; private String style;
private Integer deprecated;
} }

View File

@@ -63,4 +63,8 @@ public class DesignCollectionDTO {
private String moodboardPostion; private String moodboardPostion;
private List<String> requestIdList;
private Integer designNum;
} }

View File

@@ -0,0 +1,10 @@
package com.ai.da.model.dto;
import lombok.Data;
import java.util.List;
@Data
public class ProductImageInitializeDTO {
private List<Long> libraryIds;
}

View File

@@ -33,7 +33,7 @@ public class ReDesignCollectionDTO {
@ApiModelProperty("市场手稿板图片id 数组") @ApiModelProperty("市场手稿板图片id 数组")
private List<DesignCollectionElementDTO> marketingSketchs; private List<DesignCollectionElementDTO> marketingSketchs;
@NotNull(message = "colorBoards.cannot.be.empty") @NotNull(message = "systemScale.cannot.be.empty")
@ApiModelProperty("系统取图比列") @ApiModelProperty("系统取图比列")
private BigDecimal systemScale; private BigDecimal systemScale;

View File

@@ -22,6 +22,8 @@ public class DesignCollectionItemVO {
@ApiModelProperty("t_design_python_outfit id") @ApiModelProperty("t_design_python_outfit id")
private String designOutfitUrl; private String designOutfitUrl;
private String objectSign;
public DesignCollectionItemVO() { public DesignCollectionItemVO() {
} }

View File

@@ -23,6 +23,8 @@ public class DesignCollectionVO {
private String processId; private String processId;
private List<String> UnfinishedList;
public DesignCollectionVO() { public DesignCollectionVO() {
} }
} }

View File

@@ -47,4 +47,8 @@ public class ValidateElementVO {
private String modelSex; private String modelSex;
private String style; private String style;
private List<String> requestIdList;
private Integer designNum;
} }

View File

@@ -230,13 +230,14 @@ public class PythonService {
designPythonObjects.setProcess_id(processId); designPythonObjects.setProcess_id(processId);
long pinPrintNum = calculateDesignPinPrintNum(elementVO.getPrintBoardElements()); long pinPrintNum = calculateDesignPinPrintNum(elementVO.getPrintBoardElements());
long noPinPrintNum = calculateDesignNoPinPrintNum(elementVO.getPrintBoardElements()); long noPinPrintNum = calculateDesignNoPinPrintNum(elementVO.getPrintBoardElements(), elementVO.getDesignNum());
long noPrintNum = 8 - pinPrintNum - noPinPrintNum; long noPrintNum = elementVO.getDesignNum() - pinPrintNum - noPinPrintNum;
elementVO.setNoPinPrintNum(noPinPrintNum); elementVO.setNoPinPrintNum(noPinPrintNum);
int[] sketchNumbers = new int[3]; int[] sketchNumbers = new int[3];
for (int i = 0; i < 8; i++) { int designNum = elementVO.getDesignNum();
for (int i = 0; i < designNum; i++) {
CurrentDesignPictureTypeEnum designPictureType = calculateCurrentDesignPictureTypeNew(elementVO, sketchNumbers, systemScale); CurrentDesignPictureTypeEnum designPictureType = calculateCurrentDesignPictureTypeNew(elementVO, sketchNumbers, systemScale);
if (designPictureType == null) break; if (designPictureType == null) break;
@@ -261,7 +262,7 @@ public class PythonService {
elementVO.setDesignPythonItemPrint(designPythonItemPrint); elementVO.setDesignPythonItemPrint(designPythonItemPrint);
elementVO.setDesignPrintPictureTypeLayoutList(calculateCurrentDesignPintPictureTypeLayout(elementVO.getModelSex())); elementVO.setDesignPrintPictureTypeLayoutList(calculateCurrentDesignPintPictureTypeLayout(elementVO.getModelSex()));
DesignPythonObject pythonObject = createDesignPythonObject(elementVO, designPictureType, systemScale, singleOverall, switchCategory); DesignPythonObject pythonObject = createDesignPythonObject(elementVO, designPictureType, systemScale, singleOverall, switchCategory, i);
objects.add(pythonObject); objects.add(pythonObject);
redisUtil.addProcessId(processId, i + 1); redisUtil.addProcessId(processId, i + 1);
} }
@@ -296,22 +297,24 @@ public class PythonService {
} }
} }
private DesignPythonObject createDesignPythonObject(ValidateElementVO elementVO, CurrentDesignPictureTypeEnum designPictureType, BigDecimal systemScale, String singleOverall, String switchCategory) { private DesignPythonObject createDesignPythonObject(ValidateElementVO elementVO, CurrentDesignPictureTypeEnum designPictureType, BigDecimal systemScale, String singleOverall, String switchCategory, int i) {
DesignPythonObject pythonObject = new DesignPythonObject(); DesignPythonObject pythonObject = new DesignPythonObject();
pythonObject.setItems(coverToDesignPythonItemNew(elementVO, designPictureType, systemScale)); pythonObject.setItems(coverToDesignPythonItemNew(elementVO, designPictureType, systemScale));
pythonObject.setBasic(coverToBasic(pythonObject.getItems().get(0), singleOverall, switchCategory, elementVO.getDesignLibraryModelPoint())); pythonObject.setBasic(coverToBasic(pythonObject.getItems().get(0), singleOverall, switchCategory, elementVO.getDesignLibraryModelPoint()));
pythonObject.setObjectSign(elementVO.getRequestIdList().get(i));
return pythonObject; return pythonObject;
} }
private CurrentDesignPictureTypeEnum calculateCurrentDesignPictureTypeNew(ValidateElementVO elementVO, int[] sketchNumbers, BigDecimal systemScale) { private CurrentDesignPictureTypeEnum calculateCurrentDesignPictureTypeNew(ValidateElementVO elementVO, int[] sketchNumbers, BigDecimal systemScale) {
List<CollectionElement> pinData = getPinData(elementVO); List<CollectionElement> pinData = getPinData(elementVO);
Integer designNum = elementVO.getDesignNum();
if (CollectionUtil.isNotEmpty(pinData)) { if (CollectionUtil.isNotEmpty(pinData)) {
return CurrentDesignPictureTypeEnum.PIN; return CurrentDesignPictureTypeEnum.PIN;
} else { } else {
if (sketchNumbers[1] == 0 && sketchNumbers[2] == 0) { if (sketchNumbers[1] == 0 && sketchNumbers[2] == 0) {
sketchNumbers[1] = systemScale.multiply(BigDecimal.valueOf(8 - sketchNumbers[0])).setScale(0, BigDecimal.ROUND_HALF_UP).intValue(); sketchNumbers[1] = systemScale.multiply(BigDecimal.valueOf(designNum - sketchNumbers[0])).setScale(0, BigDecimal.ROUND_HALF_UP).intValue();
sketchNumbers[2] = 8 - sketchNumbers[0] - sketchNumbers[1]; sketchNumbers[2] = designNum - sketchNumbers[0] - sketchNumbers[1];
} }
if (sketchNumbers[2] > 0 && sketchNumbers[1] > 0) { if (sketchNumbers[2] > 0 && sketchNumbers[1] > 0) {
Long l = RandomsUtil.randomSysFile(0l, 2l); Long l = RandomsUtil.randomSysFile(0l, 2l);
@@ -491,7 +494,7 @@ public class PythonService {
} }
//计算print 非Pin图片剩余张数 //计算print 非Pin图片剩余张数
private long calculateDesignNoPinPrintNum(List<CollectionElement> printBoardElements) { private long calculateDesignNoPinPrintNum(List<CollectionElement> printBoardElements, Integer designNum) {
if (CollectionUtils.isEmpty(printBoardElements)) { if (CollectionUtils.isEmpty(printBoardElements)) {
return 0; return 0;
} }
@@ -500,10 +503,10 @@ public class PythonService {
return 0; return 0;
} else { } else {
long pinNum = printBoardElements.stream().filter(f -> f.getHasPin() == 1).count(); long pinNum = printBoardElements.stream().filter(f -> f.getHasPin() == 1).count();
if (8 - pinNum < 4) { if (designNum - pinNum < designNum/2) {
return RandomsUtil.randomSysFile(0L, 8 - pinNum + 1); return RandomsUtil.randomSysFile(0L, designNum - pinNum + 1);
} else { } else {
return RandomsUtil.randomSysFile(0L, 4L + 1); return RandomsUtil.randomSysFile(0L, (long) (designNum/2 + 1));
} }
} }
} }
@@ -553,7 +556,7 @@ public class PythonService {
if (elementVO.getSingleOverall().equals(SingleOverallEnum.OVERALL.getRealName())) { if (elementVO.getSingleOverall().equals(SingleOverallEnum.OVERALL.getRealName())) {
List<String> otherSketchCategoryList = getOtherSketchCategoryList(elementVO.getModelSex(), designPythonItem); List<String> otherSketchCategoryList = getOtherSketchCategoryList(elementVO.getModelSex(), designPythonItem);
if (!otherSketchCategoryList.isEmpty()) { if (!otherSketchCategoryList.isEmpty()) {
JSONObject attributeRecognition = getAttributeRecognition(designPythonItem, designPythonItem.getType(), elementVO.getModelSex()); JSONObject attributeRecognition = getAttributeRecognition(designPythonItem.getPath(), designPythonItem.getType(), elementVO.getModelSex());
for (String styleCategory : otherSketchCategoryList) { for (String styleCategory : otherSketchCategoryList) {
DesignPythonItem otherSketch = processAttributeRecognition(attributeRecognition, elementVO, designPictureType, styleCategory, systemScale); DesignPythonItem otherSketch = processAttributeRecognition(attributeRecognition, elementVO, designPictureType, styleCategory, systemScale);
itemList.add(otherSketch); itemList.add(otherSketch);
@@ -790,7 +793,7 @@ public class PythonService {
return attributeRetrieval; return attributeRetrieval;
} }
public JSONObject getAttributeRecognition(DesignPythonItem designPythonItem, String styleCategory, String modelSex) { public JSONObject getAttributeRecognition(String sketchImgUrl, String styleCategory, String modelSex) {
OkHttpClient client = new OkHttpClient().newBuilder() OkHttpClient client = new OkHttpClient().newBuilder()
.connectTimeout(30, TimeUnit.SECONDS) .connectTimeout(30, TimeUnit.SECONDS)
.readTimeout(60, TimeUnit.SECONDS) .readTimeout(60, TimeUnit.SECONDS)
@@ -801,7 +804,7 @@ public class PythonService {
JSONObject paramJSONObject = new JSONObject(); JSONObject paramJSONObject = new JSONObject();
paramJSONObject.put("category", styleCategory); paramJSONObject.put("category", styleCategory);
paramJSONObject.put("colony", modelSex); paramJSONObject.put("colony", modelSex);
paramJSONObject.put("sketch_img_url", designPythonItem.getPath()); paramJSONObject.put("sketch_img_url", sketchImgUrl);
JSONArray paramArray = new JSONArray(); JSONArray paramArray = new JSONArray();
paramArray.add(paramJSONObject); paramArray.add(paramJSONObject);
String param = JSON.toJSONString(paramArray, SerializerFeature.DisableCircularReferenceDetect); String param = JSON.toJSONString(paramArray, SerializerFeature.DisableCircularReferenceDetect);
@@ -3003,6 +3006,58 @@ public class PythonService {
throw new BusinessException("design.interface.exception"); throw new BusinessException("design.interface.exception");
} }
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");
}
/** /**
* 暂时未用 * 暂时未用
*/ */
@@ -3566,4 +3621,54 @@ public class PythonService {
//生成失败 //生成失败
throw new BusinessException("bright.interface.exception"); throw new BusinessException("bright.interface.exception");
} }
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!");
}
} }

View File

@@ -15,4 +15,6 @@ public class DesignPythonObject {
* basic 选项 * basic 选项
*/ */
DesignPythonBasic basic; DesignPythonBasic basic;
private String objectSign;
} }

View File

@@ -16,4 +16,6 @@ public class DesignPythonObjects {
* design新增的library * design新增的library
*/ */
List<Library> addLibrary; List<Library> addLibrary;
private String requestId;
} }

View File

@@ -201,5 +201,9 @@ public interface AccountService extends IService<Account> {
Account accountDetail(Long id); Account accountDetail(Long id);
GoogleUser parseGoogleCredential(String credential); AccountLoginVO parseGoogleCredential(String credential);
AccountLoginVO parseWeChatCode(String code);
AccountLoginVO getAccountDetail();
} }

View File

@@ -7,6 +7,7 @@ import com.ai.da.model.vo.DesignCollectionVO;
import com.ai.da.model.vo.DesignItemDetailVO; import com.ai.da.model.vo.DesignItemDetailVO;
import com.ai.da.model.vo.DesignLikeVO; import com.ai.da.model.vo.DesignLikeVO;
import com.ai.da.python.vo.DesignPythonObjects; import com.ai.da.python.vo.DesignPythonObjects;
import com.alibaba.fastjson.JSONObject;
import com.baomidou.mybatisplus.extension.service.IService; import com.baomidou.mybatisplus.extension.service.IService;
import java.math.BigDecimal; import java.math.BigDecimal;
@@ -25,7 +26,7 @@ public interface DesignService extends IService<Design> {
* @param designDTO * @param designDTO
* @return * @return
*/ */
DesignCollectionVO designCollection(DesignCollectionDTO designDTO); String designCollection(DesignCollectionDTO designDTO);
/** /**
* redesign * redesign
@@ -33,7 +34,7 @@ public interface DesignService extends IService<Design> {
* @param reDesignDTO * @param reDesignDTO
* @return * @return
*/ */
DesignCollectionVO reDesignCollection(ReDesignCollectionDTO reDesignDTO); String reDesignCollection(ReDesignCollectionDTO reDesignDTO);
/** /**
* redesign * redesign
@@ -99,4 +100,10 @@ public interface DesignService extends IService<Design> {
List<String> getModel(List<Long> designItemIdList); List<String> getModel(List<Long> designItemIdList);
Long getCountByUserAndTime(String startTime, String endTime, List<Long> accountIds); Long getCountByUserAndTime(String startTime, String endTime, List<Long> accountIds);
Boolean receiveDesignResults(JSONObject responseObject);
DesignCollectionVO getDesignResult(String requestId, List<String> objectSignList);
String designCloud(DesignCollectionDTO designDTO);
} }

View File

@@ -4,6 +4,7 @@ import com.ai.da.mapper.primary.entity.CanvasElementUpload;
import com.ai.da.mapper.primary.entity.ToProductImageResult; import com.ai.da.mapper.primary.entity.ToProductImageResult;
import com.ai.da.mapper.primary.entity.UserLikeGroup; import com.ai.da.mapper.primary.entity.UserLikeGroup;
import com.ai.da.model.dto.ExportSaveDTO; import com.ai.da.model.dto.ExportSaveDTO;
import com.ai.da.model.dto.ProductImageInitializeDTO;
import com.ai.da.model.dto.ProductImageLikeDTO; import com.ai.da.model.dto.ProductImageLikeDTO;
import com.ai.da.model.dto.ToProductImageDTO; import com.ai.da.model.dto.ToProductImageDTO;
import com.ai.da.model.vo.*; import com.ai.da.model.vo.*;
@@ -62,4 +63,6 @@ public interface UserLikeGroupService extends IService<UserLikeGroup> {
List<MagicToolResultVO> getRelightResult(List<String> taskIdList); List<MagicToolResultVO> getRelightResult(List<String> taskIdList);
String likeHistoryRelSketch(); String likeHistoryRelSketch();
Boolean productImageInitialize(ProductImageInitializeDTO productImageInitializeDTO);
} }

View File

@@ -11,6 +11,7 @@ import com.ai.da.common.response.PageBaseResponse;
import com.ai.da.common.response.ResultEnum; import com.ai.da.common.response.ResultEnum;
import com.ai.da.common.security.jwt.JWTTokenHelper; import com.ai.da.common.security.jwt.JWTTokenHelper;
import com.ai.da.common.utils.*; import com.ai.da.common.utils.*;
import com.ai.da.mapper.primary.AccountExtendMapper;
import com.ai.da.mapper.primary.AccountMapper; import com.ai.da.mapper.primary.AccountMapper;
import com.ai.da.mapper.primary.QuestionnaireMapper; import com.ai.da.mapper.primary.QuestionnaireMapper;
import com.ai.da.mapper.primary.TrialOrderMapper; import com.ai.da.mapper.primary.TrialOrderMapper;
@@ -21,6 +22,7 @@ import com.ai.da.model.enums.Language;
import com.ai.da.model.vo.*; import com.ai.da.model.vo.*;
import com.ai.da.service.*; import com.ai.da.service.*;
import com.alibaba.fastjson.JSON; import com.alibaba.fastjson.JSON;
import com.alibaba.fastjson.JSONObject;
import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
import com.baomidou.mybatisplus.core.conditions.update.UpdateWrapper; import com.baomidou.mybatisplus.core.conditions.update.UpdateWrapper;
import com.baomidou.mybatisplus.core.metadata.IPage; import com.baomidou.mybatisplus.core.metadata.IPage;
@@ -30,9 +32,6 @@ import com.google.api.client.googleapis.auth.oauth2.GoogleIdToken;
import com.google.api.client.googleapis.auth.oauth2.GoogleIdTokenVerifier; import com.google.api.client.googleapis.auth.oauth2.GoogleIdTokenVerifier;
import com.google.api.client.http.javanet.NetHttpTransport; import com.google.api.client.http.javanet.NetHttpTransport;
import com.google.api.client.json.jackson2.JacksonFactory; import com.google.api.client.json.jackson2.JacksonFactory;
import com.google.auth.oauth2.IdToken;
import com.google.auth.oauth2.TokenVerifier;
import com.google.common.base.Function;
import com.zaxxer.hikari.HikariConfig; import com.zaxxer.hikari.HikariConfig;
import com.zaxxer.hikari.HikariDataSource; import com.zaxxer.hikari.HikariDataSource;
import io.netty.util.internal.StringUtil; import io.netty.util.internal.StringUtil;
@@ -1202,9 +1201,10 @@ public class AccountServiceImpl extends ServiceImpl<AccountMapper, Account> impl
if (StringUtils.isBlank(accountDesignWorksRegisterDTO.getLanguage())) { if (StringUtils.isBlank(accountDesignWorksRegisterDTO.getLanguage())) {
account.setLanguage(Language.ENGLISH.name()); account.setLanguage(Language.ENGLISH.name());
} }
account.setIsTrial(0); account.setIsTrial(1);
account.setIsBeginner(1); account.setIsBeginner(1);
account.setValidStartTime(Instant.now().toEpochMilli()); account.setValidStartTime(Instant.now().toEpochMilli());
toDayEnd(Instant.now().plus(5, ChronoUnit.DAYS).toEpochMilli());
account.setCreateDate(new Date()); account.setCreateDate(new Date());
account.setCredits(BigDecimal.valueOf(0)); account.setCredits(BigDecimal.valueOf(0));
accountMapper.insert(account); accountMapper.insert(account);
@@ -2099,7 +2099,7 @@ public class AccountServiceImpl extends ServiceImpl<AccountMapper, Account> impl
} }
@Override @Override
public GoogleUser parseGoogleCredential(String credential) { public AccountLoginVO parseGoogleCredential(String credential) {
try { try {
// 配置 Google ID Token 验证器 // 配置 Google ID Token 验证器
GoogleIdTokenVerifier verifier = new GoogleIdTokenVerifier.Builder( GoogleIdTokenVerifier verifier = new GoogleIdTokenVerifier.Builder(
@@ -2111,6 +2111,7 @@ public class AccountServiceImpl extends ServiceImpl<AccountMapper, Account> impl
// 验证并解析 ID Token // 验证并解析 ID Token
GoogleIdToken idToken = verifier.verify(credential); GoogleIdToken idToken = verifier.verify(credential);
if (idToken != null) { if (idToken != null) {
GoogleIdToken.Payload payload = idToken.getPayload(); GoogleIdToken.Payload payload = idToken.getPayload();
@@ -2122,7 +2123,54 @@ public class AccountServiceImpl extends ServiceImpl<AccountMapper, Account> impl
log.info(email); log.info(email);
log.info(name); log.info(name);
return new GoogleUser(); // 检查数据库中是否已有该用户
QueryWrapper<Account> queryWrapper = new QueryWrapper<>();
queryWrapper.lambda().eq(Account::getUserEmail, email); // 根据邮箱查询用户
List<Account> accounts = accountMapper.selectList(queryWrapper);
Account account = new Account();
if (CollectionUtil.isNotEmpty(accounts)) {
account = accounts.get(0);
} else {
// 用户不存在,创建新用户(自动注册)
Account newUser = new Account();
newUser.setUserEmail(email);
newUser.setUserName(name);
newUser.setUserPassword("Third-000000");
newUser.setLanguage(Language.ENGLISH.name());
newUser.setValidStartTime(System.currentTimeMillis());
newUser.setValidEndTime(toDayEnd(Instant.now().plus(5, ChronoUnit.DAYS).toEpochMilli()));
newUser.setCreateDate(new Date());
newUser.setIsTrial(1);
newUser.setIsBeginner(1);
newUser.setCredits(BigDecimal.valueOf(100));
newUser.setSystemUser(3);
accountMapper.insert(newUser);
account = newUser;
}
AccountLoginVO response = CopyUtil.copyObject(account, AccountLoginVO.class);
response.setEmail(account.getUserEmail());
String token = LocalCacheUtils.getTokenCache(String.valueOf(account.getId()));
if (StringUtils.isNotBlank(token)) {
//用户已登入
response.setToken(token);
} else {
response.setToken(createAccountToken(account));
}
response.setUserId(account.getId());
response.setSystemUser(account.getSystemUser());
// 设置头像
String avatar;
if (StringUtil.isNullOrEmpty(account.getAvatar())){
avatar = CommonConstant.DEFAULT_AVATAR;
}else {
avatar = account.getAvatar();
}
response.setAvatar(minioUtil.getPreSignedUrl(avatar, CommonConstant.MINIO_IMAGE_EXPIRE_TIME));
response.setFolloweeCount(portfolioService.getFolloweeCount(account.getId()));
response.setFollowerCount(portfolioService.getFollowerCount(account.getId()));
return response;
} else { } else {
throw new IllegalArgumentException("Invalid ID token."); throw new IllegalArgumentException("Invalid ID token.");
} }
@@ -2132,4 +2180,178 @@ public class AccountServiceImpl extends ServiceImpl<AccountMapper, Account> impl
throw new RuntimeException("Failed to verify ID token: " + e.getMessage()); throw new RuntimeException("Failed to verify ID token: " + e.getMessage());
} }
} }
private static final String WECHAT_ACCESS_TOKEN_URL =
"https://api.weixin.qq.com/sns/oauth2/access_token";
private static final String APP_ID = "wxcfb92eb28d6385f5";
private static final String APP_SECRET = "e5592c691756455b2d03ebfd21fc3131";
@Override
public AccountLoginVO parseWeChatCode(String code) {
// 1. 获取 access_token 和 openid
JSONObject accessTokenResponse = getAccessTokenFromWeChat(code);
String accessToken = accessTokenResponse.getString("access_token");
String openId = accessTokenResponse.getString("openid");
if (StringUtils.isEmpty(accessToken) || StringUtils.isEmpty(openId)) {
throw new RuntimeException("微信接口返回数据缺失: " + accessTokenResponse.toJSONString());
}
// 2. 获取用户信息
JSONObject userInfoResponse = getUserInfoFromWeChat(accessToken, openId);
// 提取 unionid 和 nickname
String unionId = userInfoResponse.getString("unionid");
String userName = userInfoResponse.getString("nickname");
if (unionId == null) {
throw new IllegalArgumentException("无法获取 unionid请检查微信开发平台配置");
}
// 检查数据库中是否已有该unionid
QueryWrapper<AccountExtend> queryWrapper = new QueryWrapper<>();
queryWrapper.lambda().eq(AccountExtend::getAuthType, "WeChat");
queryWrapper.lambda().eq(AccountExtend::getAuth, unionId);
List<AccountExtend> accountExtends = accountExtendMapper.selectList(queryWrapper);
Account account = new Account();
if (CollectionUtil.isEmpty(accountExtends)) {
AccountExtend accountExtendInsert = new AccountExtend();
accountExtendInsert.setAuth(unionId);
accountExtendInsert.setAuthType("WeChat");
// 用户不存在,创建新用户(自动注册)
Account newUser = new Account();
// newUser.setUserEmail(email);
newUser.setUserName(userName);
newUser.setUserPassword("Third-000000");
newUser.setLanguage(Language.ENGLISH.name());
newUser.setValidStartTime(System.currentTimeMillis());
newUser.setValidEndTime(toDayEnd(Instant.now().plus(5, ChronoUnit.DAYS).toEpochMilli()));
newUser.setCreateDate(new Date());
newUser.setIsTrial(1);
newUser.setIsBeginner(1);
newUser.setCredits(BigDecimal.valueOf(100));
newUser.setSystemUser(3);
accountMapper.insert(newUser);
accountExtendInsert.setAccountId(newUser.getId());
accountExtendMapper.insert(accountExtendInsert);
account = newUser;
}else {
AccountExtend accountExtend = accountExtends.get(0);
account = accountMapper.selectById(accountExtend.getAccountId());
}
AccountLoginVO response = CopyUtil.copyObject(account, AccountLoginVO.class);
response.setEmail(account.getUserEmail());
String token = LocalCacheUtils.getTokenCache(String.valueOf(account.getId()));
if (StringUtils.isNotBlank(token)) {
//用户已登入
response.setToken(token);
} else {
response.setToken(createAccountToken(account));
}
response.setUserId(account.getId());
response.setSystemUser(account.getSystemUser());
// 设置头像
String avatar;
if (StringUtil.isNullOrEmpty(account.getAvatar())){
avatar = CommonConstant.DEFAULT_AVATAR;
}else {
avatar = account.getAvatar();
}
response.setAvatar(minioUtil.getPreSignedUrl(avatar, CommonConstant.MINIO_IMAGE_EXPIRE_TIME));
response.setFolloweeCount(portfolioService.getFolloweeCount(account.getId()));
response.setFollowerCount(portfolioService.getFollowerCount(account.getId()));
return response;
// // 2. 根据 unionid 检查用户是否存在
// User user = userRepository.findByUnionid(unionid);
// if (user == null) {
// // 用户不存在,进行注册
// user = new User();
// user.setUnionid(unionid);
// user.setOpenid(weChatResponse.getString("openid"));
// user.setNickname(weChatResponse.getString("nickname"));
// user.setAvatar(weChatResponse.getString("headimgurl"));
// userRepository.save(user);
// }
//
// // 3. 返回 unionid
// return unionid;
}
private static final String WECHAT_USER_INFO_URL = "https://api.weixin.qq.com/sns/userinfo";
private JSONObject getUserInfoFromWeChat(String accessToken, String openId) {
// 构造微信用户信息接口的 URL
String url = String.format(
"%s?access_token=%s&openid=%s&lang=zh_CN",
WECHAT_USER_INFO_URL, accessToken, openId
);
// 调用微信接口
RestTemplate restTemplate = new RestTemplate();
String response = restTemplate.getForObject(url, String.class);
// 转换为 JSON 对象
JSONObject jsonResponse = JSONObject.parseObject(response);
if (jsonResponse.containsKey("errcode")) {
throw new RuntimeException("微信用户信息接口调用失败: " + jsonResponse.getString("errmsg"));
}
return jsonResponse;
}
private JSONObject getAccessTokenFromWeChat(String code) {
// 构造微信接口请求 URL
String url = String.format(
"%s?appid=%s&secret=%s&code=%s&grant_type=authorization_code",
WECHAT_ACCESS_TOKEN_URL, APP_ID, APP_SECRET, code
);
// 调用微信接口
RestTemplate restTemplate = new RestTemplate();
String response = restTemplate.getForObject(url, String.class);
// 转换为 JSON 对象
JSONObject jsonResponse = JSONObject.parseObject(response);
if (jsonResponse.containsKey("errcode")) {
throw new RuntimeException("微信接口调用失败: " + jsonResponse.getString("errmsg"));
}
return jsonResponse;
}
@Override
public AccountLoginVO getAccountDetail() {
AuthPrincipalVo authPrincipalVo = UserContext.getUserHolder();
Long accountId = authPrincipalVo.getId();
Account account = accountMapper.selectById(accountId);
AccountLoginVO response = CopyUtil.copyObject(account, AccountLoginVO.class);
response.setEmail(account.getUserEmail());
String token = LocalCacheUtils.getTokenCache(String.valueOf(account.getId()));
if (StringUtils.isNotBlank(token)) {
//用户已登入
response.setToken(token);
} else {
response.setToken(createAccountToken(account));
}
response.setUserId(account.getId());
response.setSystemUser(account.getSystemUser());
// 设置头像
String avatar;
if (StringUtil.isNullOrEmpty(account.getAvatar())){
avatar = CommonConstant.DEFAULT_AVATAR;
}else {
avatar = account.getAvatar();
}
response.setAvatar(minioUtil.getPreSignedUrl(avatar, CommonConstant.MINIO_IMAGE_EXPIRE_TIME));
response.setFolloweeCount(portfolioService.getFolloweeCount(account.getId()));
response.setFollowerCount(portfolioService.getFollowerCount(account.getId()));
//判断是否常用ip 不是则发邮件提示
// calculateExceptionIp(RequestInfoUtil.getIpAddress(request), account);
return response;
}
} }

View File

@@ -607,6 +607,12 @@ public class CollectionElementServiceImpl extends ServiceImpl<CollectionElementM
elementVO.setDesignLibraryModelPoint(calculateTemplatePointTemplate(modelPoint, 700, 320, byId.getUrl())); elementVO.setDesignLibraryModelPoint(calculateTemplatePointTemplate(modelPoint, 700, 320, byId.getUrl()));
} }
elementVO.setModelSex(designDTO.getModelSex()); elementVO.setModelSex(designDTO.getModelSex());
elementVO.setRequestIdList(designDTO.getRequestIdList());
if (null != designDTO.getDesignNum()) {
elementVO.setDesignNum(designDTO.getDesignNum());
}else {
elementVO.setDesignNum(8);
}
return elementVO; return elementVO;
} }

View File

@@ -41,6 +41,7 @@ import java.io.IOException;
import java.math.BigDecimal; import java.math.BigDecimal;
import java.time.LocalDateTime; import java.time.LocalDateTime;
import java.util.*; import java.util.*;
import java.util.concurrent.ConcurrentHashMap;
import java.util.concurrent.TimeUnit; import java.util.concurrent.TimeUnit;
import java.util.stream.Collectors; import java.util.stream.Collectors;
@@ -109,8 +110,11 @@ public class DesignServiceImpl extends ServiceImpl<DesignMapper, Design> impleme
@Resource @Resource
private RedisUtil redisUtil; private RedisUtil redisUtil;
private final ConcurrentHashMap<String, Map<String, Object>> designContext = new ConcurrentHashMap<>();
@Override @Override
public DesignCollectionVO designCollection(DesignCollectionDTO designDTO) { public String designCollection(DesignCollectionDTO designDTO) {
AuthPrincipalVo userInfo = UserContext.getUserHolder(); AuthPrincipalVo userInfo = UserContext.getUserHolder();
//校验collection element //校验collection element
ValidateElementVO elementVO = collectionElementService.validateElement(designDTO); ValidateElementVO elementVO = collectionElementService.validateElement(designDTO);
@@ -283,7 +287,7 @@ public class DesignServiceImpl extends ServiceImpl<DesignMapper, Design> impleme
// return saveDesignItemAndDetail(pythonObjects, designId, collectionId, userInfo, designDTO.getTimeZone()); // return saveDesignItemAndDetail(pythonObjects, designId, collectionId, userInfo, designDTO.getTimeZone());
// } // }
private DesignCollectionVO designOrRedesignOperateNew(DesignCollectionDTO designDTO, AuthPrincipalVo userInfo, private String designOrRedesignOperateNew(DesignCollectionDTO designDTO, AuthPrincipalVo userInfo,
Long collectionIdParam, ValidateElementVO elementVO) { Long collectionIdParam, ValidateElementVO elementVO) {
if (CollectionUtil.isNotEmpty(designDTO.getSketchBoards())) { if (CollectionUtil.isNotEmpty(designDTO.getSketchBoards())) {
//编辑sketchBoard //编辑sketchBoard
@@ -336,7 +340,9 @@ public class DesignServiceImpl extends ServiceImpl<DesignMapper, Design> impleme
log.info("增加image_id关联运行时间" + totalTimeInSeconds + ""); log.info("增加image_id关联运行时间" + totalTimeInSeconds + "");
//design //design
startTime = System.currentTimeMillis(); startTime = System.currentTimeMillis();
JSONObject responseJSONObject = pythonService.designNew(pythonObjects); String requestId = UUID.randomUUID().toString();
pythonObjects.setRequestId(requestId);
JSONObject responseJSONObject = pythonService.designStream(pythonObjects);
endTime = System.currentTimeMillis(); endTime = System.currentTimeMillis();
totalTimeInSeconds = (endTime - startTime) / 1000; totalTimeInSeconds = (endTime - startTime) / 1000;
log.info("design python端运行时间" + totalTimeInSeconds + ""); log.info("design python端运行时间" + totalTimeInSeconds + "");
@@ -350,10 +356,26 @@ public class DesignServiceImpl extends ServiceImpl<DesignMapper, Design> impleme
endTime = System.currentTimeMillis(); endTime = System.currentTimeMillis();
totalTimeInSeconds = (endTime - startTime) / 1000; totalTimeInSeconds = (endTime - startTime) / 1000;
log.info("处理关联关系运行时间:" + totalTimeInSeconds + ""); log.info("处理关联关系运行时间:" + totalTimeInSeconds + "");
Map<String, Object> context = new HashMap<>();
context.put("pythonObjects", pythonObjects); // 转换后的 Python 请求参数
context.put("designId", designId); // 设计 ID
context.put("collectionId", collectionId); // 集合 ID
context.put("userInfo", userInfo); // 用户信息
context.put("timeZone", designDTO.getTimeZone()); // 时区
context.put("singleOverall", designDTO.getSingleOverall()); // 其他设计参数
context.put("requestIdList", elementVO.getRequestIdList());
// 将上下文存入全局设计上下文中
designContext.put(requestId, context);
//保存python返回信息;保存designItem和detail //保存python返回信息;保存designItem和detail
return savePythonDesignItemAndDetail(pythonObjects, designId, collectionId, userInfo, designDTO.getTimeZone(), responseJSONObject, designDTO.getSingleOverall()); // return savePythonDesignItemAndDetail(pythonObjects, designId, collectionId, userInfo, designDTO.getTimeZone(), responseJSONObject, designDTO.getSingleOverall());
return requestId;
} }
@Override @Override
public void relationImageId(DesignPythonObjects pythonObjects) { public void relationImageId(DesignPythonObjects pythonObjects) {
if (Objects.isNull(pythonObjects)) { if (Objects.isNull(pythonObjects)) {
@@ -601,6 +623,152 @@ public class DesignServiceImpl extends ServiceImpl<DesignMapper, Design> impleme
@Resource @Resource
private MinioUtil minioUtil; private MinioUtil minioUtil;
private DesignCollectionVO savePythonDesignItemAndDetailSingle(DesignPythonObjects pythonObjects, Long designId, Long collectionId, AuthPrincipalVo userInfo, String timeZone, JSONObject outfit, String singleOverall, Map<String, Object> context) {
Object designCollectionVO = context.get("DesignCollectionVO");
DesignCollectionVO response;
List<DesignCollectionItemVO> designCollectionItems = Lists.newArrayList();
if (null == designCollectionVO) {
response = new DesignCollectionVO();
response.setDesignId(designId);
response.setCollectionId(collectionId);
response.setProcessId(pythonObjects.getProcess_id());
}else {
response = (DesignCollectionVO) designCollectionVO;
designCollectionItems = response.getDesignCollectionItems();
}
response.setDesignCollectionItems(designCollectionItems);
DesignPythonObject item = new DesignPythonObject();
String objectSign = outfit.getString("objectSign");
log.info(objectSign);
for (DesignPythonObject object : pythonObjects.getObjects()) {
if (object.getObjectSign().equals(objectSign)) {
item = object;
continue;
}
}
DesignItem designItem = new DesignItem();
designItem.setAccountId(userInfo.getId());
designItem.setCollectionId(collectionId);
designItem.setDesignId(designId);
designItem.setCreateDate(DateUtil.getByTimeZone(timeZone));
//生成的八张图片
designItem.setDesignUrl(item.getBasic().getSave_name());
designItem.setHasLike((byte) 0);
//生成designItem
Long designItemId = designItemService.saveOne(designItem);
// python design返回入库及封装
// JSONObject outfit = data.getJSONObject(i + "");
// if (null == outfit) {
// continue;
// }
TDesignPythonOutfit designPythonOutfit = new TDesignPythonOutfit();
designPythonOutfit.setDesignItemId(designItemId);
designPythonOutfit.setUserId(userInfo.getId());
designPythonOutfit.setDesignId(designId);
designPythonOutfit.setCollectionId(collectionId);
String synthesisUrl = outfit.getString("synthesis_url");
if (!StringUtils.isEmpty(synthesisUrl)) {
designPythonOutfit.setDesignUrl(synthesisUrl);
} else {
throw new BusinessException("design.interface.exception");
}
designPythonOutfitService.save(designPythonOutfit);
JSONArray layers = outfit.getJSONArray("layers");
List<TDesignPythonOutfitDetail> list = new ArrayList<>();
DesignCollectionItemVO designCollectionItemVO = new DesignCollectionItemVO();
designCollectionItemVO.setObjectSign(objectSign);
for (int i1 = 0; i1 < layers.size(); i1++) {
JSONObject jsonObject = layers.getJSONObject(i1);
TDesignPythonOutfitDetail designPythonOutfitDetail = new TDesignPythonOutfitDetail();
designPythonOutfitDetail.setDesignId(designId);
designPythonOutfitDetail.setDesignPythonOutfitId(designPythonOutfit.getId());
designPythonOutfitDetail.setPosition(jsonObject.getString("position"));
designPythonOutfitDetail.setImageSize(jsonObject.getString("image_size"));
designPythonOutfitDetail.setImageUrl(jsonObject.getString("image_url"));
if (singleOverall.equals(SingleOverallEnum.SINGLE.getRealName())) {
designCollectionItemVO.setDesignItemUrl(designItem.getDesignUrl());
}
designPythonOutfitDetail.setImageCategory(jsonObject.getString("image_category"));
designPythonOutfitDetail.setMaskUrl(jsonObject.getString("mask_url"));
designPythonOutfitDetail.setUserId(userInfo.getId());
designPythonOutfitDetail.setPriority(Integer.parseInt(jsonObject.getString("priority")));
designPythonOutfitDetail.setCreateDate(LocalDateTime.now());
list.add(designPythonOutfitDetail);
}
designPythonOutfitDetailService.saveBatch(list);
designCollectionItemVO.setDesignItemId(designItemId);
designCollectionItemVO.setDesignItemUrl(designItem.getDesignUrl());
designCollectionItemVO.setDesignOutfitId(designPythonOutfit.getId());
String designUrl = designPythonOutfit.getDesignUrl();
if (!StringUtils.isEmpty(designUrl) && designUrl.contains("/")) {
int firstIndex = designUrl.indexOf("/");
designCollectionItemVO.setDesignOutfitUrl(minioUtil.getPreSignedUrl(designUrl.substring(0, firstIndex) + "/" + designUrl.substring(firstIndex + 1), 24 * 60));
}
//response
designCollectionItems.add(designCollectionItemVO);
List<DesignItemDetail> designItemDetails = Lists.newArrayList();
Map<String, Integer> typePriority = list.stream().collect(Collectors.toMap(d -> d.getImageCategory().split("_")[0],
d -> Math.abs(d.getPriority()),
(existing, replacement) -> replacement));
Map<String, String> typeAndUndividedLayer = designItemService.setTypeAndUndividedLayer(layers);
for (DesignPythonItem detail : item.getItems()) {
if (null == detail) {
continue;
}
DesignItemDetail designItemDetail = CopyUtil.copyObject(detail, DesignItemDetail.class);
designItemDetail.setAccountId(userInfo.getId());
designItemDetail.setDesignId(designId);
designItemDetail.setDesignItemId(designItemId);
designItemDetail.setCollectionElementId(detail.getElementId());
designItemDetail.setCreateDate(DateUtil.getByTimeZone(timeZone));
designItemDetail.setUndividedLayer(typeAndUndividedLayer.get(designItemDetail.getType().toLowerCase()));
if (SysFileLevel2TypeEnum.BODY.getRealName().equals(detail.getType())) {
designItemDetail.setPath(detail.getBody_path());
//BODY不关联businessId
designItemDetail.setBusinessId(0L);
}
designItemDetail.setIconPath(detail.getIcon());
designItemDetail.setPriority(typePriority.get(detail.getType().toLowerCase()));
if (!detail.getType().equals("Body")){
DesignPythonItemPrint printObject = detail.getPrint().getOverall();
// designItemDetail.setPrintPath(Objects.isNull(printObject) ? "" : printObject.getPath());
designItemDetail.setPrintPath(CollectionUtils.isEmpty(printObject.getPrint_path_list()) ? "" : printObject.getPrint_path_list().get(0));
}
designItemDetailService.save(designItemDetail);
if (!SysFileLevel2TypeEnum.BODY.getRealName().equals(detail.getType()) && !StringUtil.isNullOrEmpty(designItemDetail.getPrintPath())) {
DesignItemDetailPrint print = new DesignItemDetailPrint();
print.setDesignItemDetailId(designItemDetail.getId());
print.setPrintType("print");
print.setPath(designItemDetail.getPrintPath());
print.setSingleOrOverall("overall");
print.setPosition("[0.0,0.0]");
// print.setScale(1d);
// todo mark 将print默认scale置为0.3
print.setScale(0.3d);
print.setAngle(0.0);
print.setPriority(1);
QueryWrapper<CollectionElement> getPrintboardLevel2TypeQw = new QueryWrapper<>();
getPrintboardLevel2TypeQw.lambda().eq(CollectionElement::getUrl, print.getPath());
getPrintboardLevel2TypeQw.lambda().orderByDesc(CollectionElement::getCreateDate);
getPrintboardLevel2TypeQw.last("limit 1");
CollectionElement one = collectionElementService.getOne(getPrintboardLevel2TypeQw);
print.setLevel2Type(one.getLevel2Type());
print.setCreateDate(LocalDateTime.now());
designItemDetailPrintService.save(print);
}
}
synchronized (context) {
context.put("DesignCollectionVO", response);
}
return response;
}
private DesignCollectionVO savePythonDesignItemAndDetail(DesignPythonObjects pythonObjects private DesignCollectionVO savePythonDesignItemAndDetail(DesignPythonObjects pythonObjects
, Long designId, Long collectionId, AuthPrincipalVo userInfo, String timeZone, JSONObject responseJSONObject, String singleOverall) { , Long designId, Long collectionId, AuthPrincipalVo userInfo, String timeZone, JSONObject responseJSONObject, String singleOverall) {
DesignCollectionVO response = new DesignCollectionVO(); DesignCollectionVO response = new DesignCollectionVO();
@@ -612,6 +780,7 @@ public class DesignServiceImpl extends ServiceImpl<DesignMapper, Design> impleme
if (data == null) { if (data == null) {
throw new BusinessException("design.interface.exception"); throw new BusinessException("design.interface.exception");
} }
for (int i = 0; i < pythonObjects.getObjects().size(); i++) { for (int i = 0; i < pythonObjects.getObjects().size(); i++) {
DesignPythonObject item = pythonObjects.getObjects().get(i); DesignPythonObject item = pythonObjects.getObjects().get(i);
DesignItem designItem = new DesignItem(); DesignItem designItem = new DesignItem();
@@ -641,6 +810,7 @@ public class DesignServiceImpl extends ServiceImpl<DesignMapper, Design> impleme
throw new BusinessException("design.interface.exception"); throw new BusinessException("design.interface.exception");
} }
designPythonOutfitService.save(designPythonOutfit); designPythonOutfitService.save(designPythonOutfit);
JSONArray layers = outfit.getJSONArray("layers"); JSONArray layers = outfit.getJSONArray("layers");
List<TDesignPythonOutfitDetail> list = new ArrayList<>(); List<TDesignPythonOutfitDetail> list = new ArrayList<>();
DesignCollectionItemVO designCollectionItemVO = new DesignCollectionItemVO(); DesignCollectionItemVO designCollectionItemVO = new DesignCollectionItemVO();
@@ -750,7 +920,7 @@ public class DesignServiceImpl extends ServiceImpl<DesignMapper, Design> impleme
//生成designItem //生成designItem
Long designItemId = designItemService.saveOne(designItem); Long designItemId = designItemService.saveOne(designItem);
//response //response
designCollectionItems.add(new DesignCollectionItemVO(designItemId, designItem.getDesignUrl(), null, null)); designCollectionItems.add(new DesignCollectionItemVO(designItemId, designItem.getDesignUrl(), null, null, null));
List<DesignItemDetail> designItemDetails = Lists.newArrayList(); List<DesignItemDetail> designItemDetails = Lists.newArrayList();
item.getItems().forEach(detail -> { item.getItems().forEach(detail -> {
@@ -797,7 +967,7 @@ public class DesignServiceImpl extends ServiceImpl<DesignMapper, Design> impleme
} }
@Override @Override
public DesignCollectionVO reDesignCollection(ReDesignCollectionDTO reDesignDTO) { public String reDesignCollection(ReDesignCollectionDTO reDesignDTO) {
//校验collection //校验collection
Collection collection = collectionService.getById(reDesignDTO.getCollectionId()); Collection collection = collectionService.getById(reDesignDTO.getCollectionId());
if (Objects.isNull(collection)) { if (Objects.isNull(collection)) {
@@ -849,15 +1019,15 @@ public class DesignServiceImpl extends ServiceImpl<DesignMapper, Design> impleme
} }
List<DesignItem> designItems = designItemService.getByDesignId(designId); List<DesignItem> designItems = designItemService.getByDesignId(designId);
if (CollectionUtils.isEmpty(designItems)) { if (CollectionUtils.isEmpty(designItems)) {
return new DesignCollectionVO(designId, design.getCollectionId(), null, null); return new DesignCollectionVO(designId, design.getCollectionId(), null, null, null);
} }
return new DesignCollectionVO(designId, design.getCollectionId(), coverDesignItemToVO(designItems), null); return new DesignCollectionVO(designId, design.getCollectionId(), coverDesignItemToVO(designItems), null, null);
} }
private List<DesignCollectionItemVO> coverDesignItemToVO(List<DesignItem> designItems) { private List<DesignCollectionItemVO> coverDesignItemToVO(List<DesignItem> designItems) {
List<DesignCollectionItemVO> response = Lists.newArrayList(); List<DesignCollectionItemVO> response = Lists.newArrayList();
designItems.forEach(designItem -> { designItems.forEach(designItem -> {
response.add(new DesignCollectionItemVO(designItem.getId(), designItem.getDesignUrl(), null, null)); response.add(new DesignCollectionItemVO(designItem.getId(), designItem.getDesignUrl(), null, null, null));
}); });
return response; return response;
} }
@@ -1389,4 +1559,62 @@ public class DesignServiceImpl extends ServiceImpl<DesignMapper, Design> impleme
} }
} }
@Override
@Transactional(rollbackFor = Exception.class)
public Boolean receiveDesignResults(JSONObject responseJSONObject) {
String requestId = "UUID.randomUUID().toString()";
// String requestId = responseJSONObject.getString("requestId");
Map<String, Object> context;
synchronized (designContext) {
log.info(designContext.toString());
context = designContext.get(requestId);
if (context == null) {
log.error("上下文数据缺失,无法完成操作");
return false;
}
DesignPythonObjects pythonObjects = (DesignPythonObjects) context.get("pythonObjects");
Long designId = (Long) context.get("designId");
Long collectionId = (Long) context.get("collectionId");
AuthPrincipalVo userInfo = (AuthPrincipalVo) context.get("userInfo");
String timeZone = (String) context.get("timeZone");
String singleOverall = (String) context.get("singleOverall");
DesignCollectionVO designCollectionVO = savePythonDesignItemAndDetailSingle(pythonObjects, designId, collectionId, userInfo, timeZone, responseJSONObject, singleOverall, context);
log.info(designContext.toString());
designContext.put(requestId, context);
}
return Boolean.TRUE;
}
@Override
public DesignCollectionVO getDesignResult(String requestId, List<String> objectSignList) {
// Map<String, Object> stringObjectMap = designContext.get("UUID.randomUUID().toString()");
Map<String, Object> stringObjectMap = designContext.get(requestId);
log.info(stringObjectMap.toString());
DesignCollectionVO result = (DesignCollectionVO) stringObjectMap.get("DesignCollectionVO");
if (Objects.isNull(result)) {
DesignCollectionVO noneResult = new DesignCollectionVO();
noneResult.setUnfinishedList(objectSignList);
return noneResult;
}
for (DesignCollectionItemVO designCollectionItem : result.getDesignCollectionItems()) {
String objectSign = designCollectionItem.getObjectSign();
objectSignList.remove(objectSign);
}
result.setUnfinishedList(objectSignList);
return result;
}
@Override
public String designCloud(DesignCollectionDTO designDTO) {
AuthPrincipalVo userInfo = UserContext.getUserHolder();
//校验collection element
ValidateElementVO elementVO = collectionElementService.validateElement(designDTO);
//design
return designOrRedesignOperateNew(designDTO, userInfo, null, elementVO);
}
} }

View File

@@ -9,7 +9,9 @@ import com.ai.da.common.utils.*;
import com.ai.da.mapper.primary.*; import com.ai.da.mapper.primary.*;
import com.ai.da.mapper.primary.entity.*; import com.ai.da.mapper.primary.entity.*;
import com.ai.da.mapper.secondary.AttributeRetrievalMapper; import com.ai.da.mapper.secondary.AttributeRetrievalMapper;
import com.ai.da.mapper.secondary.entity.AttributeRecognitionJSON;
import com.ai.da.model.dto.PortfolioDTO; import com.ai.da.model.dto.PortfolioDTO;
import com.ai.da.model.dto.ProductImageInitializeDTO;
import com.ai.da.model.dto.ProductImageLikeDTO; import com.ai.da.model.dto.ProductImageLikeDTO;
import com.ai.da.model.dto.ToProductImageDTO; import com.ai.da.model.dto.ToProductImageDTO;
import com.ai.da.model.vo.*; import com.ai.da.model.vo.*;
@@ -79,6 +81,8 @@ public class UserLikeGroupServiceImpl extends ServiceImpl<UserLikeGroupMapper, U
private CollectionElementMapper collectionElementMapper; private CollectionElementMapper collectionElementMapper;
@Resource @Resource
private AttributeRetrievalMapper attributeRetrievalMapper; private AttributeRetrievalMapper attributeRetrievalMapper;
@Resource
private ProductImageAttributeMapper productImageAttributeMapper;
@Override @Override
public void deleteUserGroup(Long userGroupId) { public void deleteUserGroup(Long userGroupId) {
@@ -721,4 +725,53 @@ public class UserLikeGroupServiceImpl extends ServiceImpl<UserLikeGroupMapper, U
} }
} }
} }
@Override
public Boolean productImageInitialize(ProductImageInitializeDTO productImageInitializeDTO) {
AuthPrincipalVo authPrincipalVo = UserContext.getUserHolder();
accountService.getById(authPrincipalVo.getId());
for (Long libraryId : productImageInitializeDTO.getLibraryIds()) {
Library library = libraryMapper.selectById(libraryId);
String url = library.getUrl();
String gender = library.getLevel2Type();
String clothCategory = pythonService.getClothCategory(url, gender);
JSONObject attributeRecognition = pythonService.getAttributeRecognition(url, clothCategory, gender);
JSONObject data = attributeRecognition.getJSONObject("data");
JSONObject attrDict = ((JSONObject) data.getJSONArray("list").get(0)).getJSONObject("attr_dict");
AttributeRecognitionJSON attrDictJSON = attrDict.toJavaObject(AttributeRecognitionJSON.class);
ProductImageAttribute productImageAttribute = toAttrDict(attrDictJSON);
productImageAttributeMapper.insert(productImageAttribute);
}
return null;
}
private ProductImageAttribute toAttrDict(AttributeRecognitionJSON attrDictJSON) {
ProductImageAttribute attributeRetrieval = new ProductImageAttribute();
// 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;
}
} }