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/portfolio/page", "/api/portfolio/detail", "/api/portfolio/commentPage", "/api/portfolio/viewsIncrease",
"/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

View File

@@ -297,4 +297,10 @@ public class AccountController {
public Response<Account> accountDetail(@RequestParam("id") Long 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")
@PostMapping("/designCollection")
@CrossOrigin
public Response<DesignCollectionVO> designCollection(@Valid @RequestBody DesignCollectionDTO designDTO) {
public Response<String> designCollection(@Valid @RequestBody DesignCollectionDTO designDTO) {
return Response.success(designService.designCollection(designDTO));
}
@@ -43,7 +43,7 @@ public class DesignController {
@ApiOperation(value = "重新设计 Collection")
@PostMapping("/reDesignCollection")
public Response<DesignCollectionVO> reDesignCollection(@Valid @RequestBody ReDesignCollectionDTO reDesignDTO) {
public Response<String> reDesignCollection(@Valid @RequestBody ReDesignCollectionDTO reDesignDTO) {
return Response.success(designService.reDesignCollection(reDesignDTO));
}
@@ -83,4 +83,16 @@ public class DesignController {
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() {
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.model.dto.*;
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.DesignService;
import com.alibaba.fastjson.JSONObject;
import io.swagger.annotations.Api;
import io.swagger.annotations.ApiOperation;
import lombok.extern.slf4j.Slf4j;
@@ -29,6 +32,9 @@ public class ThirdPartyController {
@Resource
private AccountService accountService;
@Resource
private DesignService designService;
/*@ApiOperation(value = "Add user information")
@PostMapping("/addUser")
public Response<Boolean> addUser(@Valid @RequestBody AccountAddDTO accountAddDTO) {
@@ -124,9 +130,20 @@ public class ThirdPartyController {
}
@CrossOrigin
@GetMapping("/parseGoogleCredential")
public Response<GoogleUser> parseGoogleCredential(@RequestParam("credential") String credential) {
public Response<AccountLoginVO> parseGoogleCredential(@RequestParam("credential") String 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.mapper.primary.entity.AccountExtend;
import java.util.Date;
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 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 style;
private Integer deprecated;
}

View File

@@ -63,4 +63,8 @@ public class DesignCollectionDTO {
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 数组")
private List<DesignCollectionElementDTO> marketingSketchs;
@NotNull(message = "colorBoards.cannot.be.empty")
@NotNull(message = "systemScale.cannot.be.empty")
@ApiModelProperty("系统取图比列")
private BigDecimal systemScale;

View File

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

View File

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

View File

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

View File

@@ -230,13 +230,14 @@ public class PythonService {
designPythonObjects.setProcess_id(processId);
long pinPrintNum = calculateDesignPinPrintNum(elementVO.getPrintBoardElements());
long noPinPrintNum = calculateDesignNoPinPrintNum(elementVO.getPrintBoardElements());
long noPrintNum = 8 - pinPrintNum - noPinPrintNum;
long noPinPrintNum = calculateDesignNoPinPrintNum(elementVO.getPrintBoardElements(), elementVO.getDesignNum());
long noPrintNum = elementVO.getDesignNum() - pinPrintNum - noPinPrintNum;
elementVO.setNoPinPrintNum(noPinPrintNum);
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);
if (designPictureType == null) break;
@@ -261,7 +262,7 @@ public class PythonService {
elementVO.setDesignPythonItemPrint(designPythonItemPrint);
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);
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();
pythonObject.setItems(coverToDesignPythonItemNew(elementVO, designPictureType, systemScale));
pythonObject.setBasic(coverToBasic(pythonObject.getItems().get(0), singleOverall, switchCategory, elementVO.getDesignLibraryModelPoint()));
pythonObject.setObjectSign(elementVO.getRequestIdList().get(i));
return pythonObject;
}
private CurrentDesignPictureTypeEnum calculateCurrentDesignPictureTypeNew(ValidateElementVO elementVO, int[] sketchNumbers, BigDecimal systemScale) {
List<CollectionElement> pinData = getPinData(elementVO);
Integer designNum = elementVO.getDesignNum();
if (CollectionUtil.isNotEmpty(pinData)) {
return CurrentDesignPictureTypeEnum.PIN;
} else {
if (sketchNumbers[1] == 0 && sketchNumbers[2] == 0) {
sketchNumbers[1] = systemScale.multiply(BigDecimal.valueOf(8 - sketchNumbers[0])).setScale(0, BigDecimal.ROUND_HALF_UP).intValue();
sketchNumbers[2] = 8 - sketchNumbers[0] - sketchNumbers[1];
sketchNumbers[1] = systemScale.multiply(BigDecimal.valueOf(designNum - sketchNumbers[0])).setScale(0, BigDecimal.ROUND_HALF_UP).intValue();
sketchNumbers[2] = designNum - sketchNumbers[0] - sketchNumbers[1];
}
if (sketchNumbers[2] > 0 && sketchNumbers[1] > 0) {
Long l = RandomsUtil.randomSysFile(0l, 2l);
@@ -491,7 +494,7 @@ public class PythonService {
}
//计算print 非Pin图片剩余张数
private long calculateDesignNoPinPrintNum(List<CollectionElement> printBoardElements) {
private long calculateDesignNoPinPrintNum(List<CollectionElement> printBoardElements, Integer designNum) {
if (CollectionUtils.isEmpty(printBoardElements)) {
return 0;
}
@@ -500,10 +503,10 @@ public class PythonService {
return 0;
} else {
long pinNum = printBoardElements.stream().filter(f -> f.getHasPin() == 1).count();
if (8 - pinNum < 4) {
return RandomsUtil.randomSysFile(0L, 8 - pinNum + 1);
if (designNum - pinNum < designNum/2) {
return RandomsUtil.randomSysFile(0L, designNum - pinNum + 1);
} 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())) {
List<String> otherSketchCategoryList = getOtherSketchCategoryList(elementVO.getModelSex(), designPythonItem);
if (!otherSketchCategoryList.isEmpty()) {
JSONObject attributeRecognition = getAttributeRecognition(designPythonItem, designPythonItem.getType(), elementVO.getModelSex());
JSONObject attributeRecognition = getAttributeRecognition(designPythonItem.getPath(), designPythonItem.getType(), elementVO.getModelSex());
for (String styleCategory : otherSketchCategoryList) {
DesignPythonItem otherSketch = processAttributeRecognition(attributeRecognition, elementVO, designPictureType, styleCategory, systemScale);
itemList.add(otherSketch);
@@ -790,7 +793,7 @@ public class PythonService {
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()
.connectTimeout(30, TimeUnit.SECONDS)
.readTimeout(60, TimeUnit.SECONDS)
@@ -801,7 +804,7 @@ public class PythonService {
JSONObject paramJSONObject = new JSONObject();
paramJSONObject.put("category", styleCategory);
paramJSONObject.put("colony", modelSex);
paramJSONObject.put("sketch_img_url", designPythonItem.getPath());
paramJSONObject.put("sketch_img_url", sketchImgUrl);
JSONArray paramArray = new JSONArray();
paramArray.add(paramJSONObject);
String param = JSON.toJSONString(paramArray, SerializerFeature.DisableCircularReferenceDetect);
@@ -3003,6 +3006,58 @@ public class PythonService {
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");
}
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 选项
*/
DesignPythonBasic basic;
private String objectSign;
}

View File

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

View File

@@ -201,5 +201,9 @@ public interface AccountService extends IService<Account> {
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.DesignLikeVO;
import com.ai.da.python.vo.DesignPythonObjects;
import com.alibaba.fastjson.JSONObject;
import com.baomidou.mybatisplus.extension.service.IService;
import java.math.BigDecimal;
@@ -25,7 +26,7 @@ public interface DesignService extends IService<Design> {
* @param designDTO
* @return
*/
DesignCollectionVO designCollection(DesignCollectionDTO designDTO);
String designCollection(DesignCollectionDTO designDTO);
/**
* redesign
@@ -33,7 +34,7 @@ public interface DesignService extends IService<Design> {
* @param reDesignDTO
* @return
*/
DesignCollectionVO reDesignCollection(ReDesignCollectionDTO reDesignDTO);
String reDesignCollection(ReDesignCollectionDTO reDesignDTO);
/**
* redesign
@@ -99,4 +100,10 @@ public interface DesignService extends IService<Design> {
List<String> getModel(List<Long> designItemIdList);
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.UserLikeGroup;
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.ToProductImageDTO;
import com.ai.da.model.vo.*;
@@ -62,4 +63,6 @@ public interface UserLikeGroupService extends IService<UserLikeGroup> {
List<MagicToolResultVO> getRelightResult(List<String> taskIdList);
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.security.jwt.JWTTokenHelper;
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.QuestionnaireMapper;
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.service.*;
import com.alibaba.fastjson.JSON;
import com.alibaba.fastjson.JSONObject;
import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
import com.baomidou.mybatisplus.core.conditions.update.UpdateWrapper;
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.http.javanet.NetHttpTransport;
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.HikariDataSource;
import io.netty.util.internal.StringUtil;
@@ -1202,9 +1201,10 @@ public class AccountServiceImpl extends ServiceImpl<AccountMapper, Account> impl
if (StringUtils.isBlank(accountDesignWorksRegisterDTO.getLanguage())) {
account.setLanguage(Language.ENGLISH.name());
}
account.setIsTrial(0);
account.setIsTrial(1);
account.setIsBeginner(1);
account.setValidStartTime(Instant.now().toEpochMilli());
toDayEnd(Instant.now().plus(5, ChronoUnit.DAYS).toEpochMilli());
account.setCreateDate(new Date());
account.setCredits(BigDecimal.valueOf(0));
accountMapper.insert(account);
@@ -2099,7 +2099,7 @@ public class AccountServiceImpl extends ServiceImpl<AccountMapper, Account> impl
}
@Override
public GoogleUser parseGoogleCredential(String credential) {
public AccountLoginVO parseGoogleCredential(String credential) {
try {
// 配置 Google ID Token 验证器
GoogleIdTokenVerifier verifier = new GoogleIdTokenVerifier.Builder(
@@ -2111,6 +2111,7 @@ public class AccountServiceImpl extends ServiceImpl<AccountMapper, Account> impl
// 验证并解析 ID Token
GoogleIdToken idToken = verifier.verify(credential);
if (idToken != null) {
GoogleIdToken.Payload payload = idToken.getPayload();
@@ -2122,7 +2123,54 @@ public class AccountServiceImpl extends ServiceImpl<AccountMapper, Account> impl
log.info(email);
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 {
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());
}
}
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.setModelSex(designDTO.getModelSex());
elementVO.setRequestIdList(designDTO.getRequestIdList());
if (null != designDTO.getDesignNum()) {
elementVO.setDesignNum(designDTO.getDesignNum());
}else {
elementVO.setDesignNum(8);
}
return elementVO;
}

View File

@@ -41,6 +41,7 @@ import java.io.IOException;
import java.math.BigDecimal;
import java.time.LocalDateTime;
import java.util.*;
import java.util.concurrent.ConcurrentHashMap;
import java.util.concurrent.TimeUnit;
import java.util.stream.Collectors;
@@ -109,8 +110,11 @@ public class DesignServiceImpl extends ServiceImpl<DesignMapper, Design> impleme
@Resource
private RedisUtil redisUtil;
private final ConcurrentHashMap<String, Map<String, Object>> designContext = new ConcurrentHashMap<>();
@Override
public DesignCollectionVO designCollection(DesignCollectionDTO designDTO) {
public String designCollection(DesignCollectionDTO designDTO) {
AuthPrincipalVo userInfo = UserContext.getUserHolder();
//校验collection element
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());
// }
private DesignCollectionVO designOrRedesignOperateNew(DesignCollectionDTO designDTO, AuthPrincipalVo userInfo,
private String designOrRedesignOperateNew(DesignCollectionDTO designDTO, AuthPrincipalVo userInfo,
Long collectionIdParam, ValidateElementVO elementVO) {
if (CollectionUtil.isNotEmpty(designDTO.getSketchBoards())) {
//编辑sketchBoard
@@ -336,7 +340,9 @@ public class DesignServiceImpl extends ServiceImpl<DesignMapper, Design> impleme
log.info("增加image_id关联运行时间" + totalTimeInSeconds + "");
//design
startTime = System.currentTimeMillis();
JSONObject responseJSONObject = pythonService.designNew(pythonObjects);
String requestId = UUID.randomUUID().toString();
pythonObjects.setRequestId(requestId);
JSONObject responseJSONObject = pythonService.designStream(pythonObjects);
endTime = System.currentTimeMillis();
totalTimeInSeconds = (endTime - startTime) / 1000;
log.info("design python端运行时间" + totalTimeInSeconds + "");
@@ -350,10 +356,26 @@ public class DesignServiceImpl extends ServiceImpl<DesignMapper, Design> impleme
endTime = System.currentTimeMillis();
totalTimeInSeconds = (endTime - startTime) / 1000;
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
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
public void relationImageId(DesignPythonObjects pythonObjects) {
if (Objects.isNull(pythonObjects)) {
@@ -601,6 +623,152 @@ public class DesignServiceImpl extends ServiceImpl<DesignMapper, Design> impleme
@Resource
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
, Long designId, Long collectionId, AuthPrincipalVo userInfo, String timeZone, JSONObject responseJSONObject, String singleOverall) {
DesignCollectionVO response = new DesignCollectionVO();
@@ -612,6 +780,7 @@ public class DesignServiceImpl extends ServiceImpl<DesignMapper, Design> impleme
if (data == null) {
throw new BusinessException("design.interface.exception");
}
for (int i = 0; i < pythonObjects.getObjects().size(); i++) {
DesignPythonObject item = pythonObjects.getObjects().get(i);
DesignItem designItem = new DesignItem();
@@ -641,6 +810,7 @@ public class DesignServiceImpl extends ServiceImpl<DesignMapper, Design> impleme
throw new BusinessException("design.interface.exception");
}
designPythonOutfitService.save(designPythonOutfit);
JSONArray layers = outfit.getJSONArray("layers");
List<TDesignPythonOutfitDetail> list = new ArrayList<>();
DesignCollectionItemVO designCollectionItemVO = new DesignCollectionItemVO();
@@ -750,7 +920,7 @@ public class DesignServiceImpl extends ServiceImpl<DesignMapper, Design> impleme
//生成designItem
Long designItemId = designItemService.saveOne(designItem);
//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();
item.getItems().forEach(detail -> {
@@ -797,7 +967,7 @@ public class DesignServiceImpl extends ServiceImpl<DesignMapper, Design> impleme
}
@Override
public DesignCollectionVO reDesignCollection(ReDesignCollectionDTO reDesignDTO) {
public String reDesignCollection(ReDesignCollectionDTO reDesignDTO) {
//校验collection
Collection collection = collectionService.getById(reDesignDTO.getCollectionId());
if (Objects.isNull(collection)) {
@@ -849,15 +1019,15 @@ public class DesignServiceImpl extends ServiceImpl<DesignMapper, Design> impleme
}
List<DesignItem> designItems = designItemService.getByDesignId(designId);
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) {
List<DesignCollectionItemVO> response = Lists.newArrayList();
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;
}
@@ -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.entity.*;
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.ProductImageInitializeDTO;
import com.ai.da.model.dto.ProductImageLikeDTO;
import com.ai.da.model.dto.ToProductImageDTO;
import com.ai.da.model.vo.*;
@@ -79,6 +81,8 @@ public class UserLikeGroupServiceImpl extends ServiceImpl<UserLikeGroupMapper, U
private CollectionElementMapper collectionElementMapper;
@Resource
private AttributeRetrievalMapper attributeRetrievalMapper;
@Resource
private ProductImageAttributeMapper productImageAttributeMapper;
@Override
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;
}
}