Merge branch 'refs/heads/dev/dev' into dev/dev_xp
# Conflicts: # src/main/java/com/ai/da/common/utils/SendEmailUtil.java # src/main/java/com/ai/da/mapper/primary/entity/Account.java
This commit is contained in:
@@ -7,9 +7,11 @@ import com.ai.da.common.context.UserContext;
|
||||
import com.ai.da.common.enums.AuthenticationOperationTypeEnum;
|
||||
import com.ai.da.common.enums.CreditsEventsEnum;
|
||||
import com.ai.da.common.enums.LoginTypeEnum;
|
||||
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;
|
||||
@@ -20,11 +22,16 @@ 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;
|
||||
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
|
||||
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
|
||||
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.zaxxer.hikari.HikariConfig;
|
||||
import com.zaxxer.hikari.HikariDataSource;
|
||||
import io.netty.util.internal.StringUtil;
|
||||
@@ -538,7 +545,12 @@ public class AccountServiceImpl extends ServiceImpl<AccountMapper, Account> impl
|
||||
// .like(TrialOrder::getUserName, accountTrialDTO.getUserName()));
|
||||
List<TrialOrder> trialOrders = trialOrderMapper.selectList(trialOrderQueryWrapper);
|
||||
if (CollectionUtil.isNotEmpty(trialOrders)) {
|
||||
throw new BusinessException("You have submitted a trial application, please wait for approval.");
|
||||
TrialOrder trialOrder = trialOrders.get(0);
|
||||
if (trialOrder.getStatus() == 1) {
|
||||
throw new BusinessException("You have submitted a trial application, please wait for approval.");
|
||||
}else {
|
||||
throw new BusinessException("You have already been approved for a trial, please do not apply for the trial again");
|
||||
}
|
||||
}
|
||||
// 先检测用户名和邮箱
|
||||
QueryWrapper<Account> qw = new QueryWrapper<>();
|
||||
@@ -1392,7 +1404,7 @@ public class AccountServiceImpl extends ServiceImpl<AccountMapper, Account> impl
|
||||
|
||||
private static final String QUERY_MAXIMUM_USERID = "SELECT MAX(ID) AS max_id FROM pmr_users;";
|
||||
|
||||
private static final String QUERY_NEW_USER_EMAIL = "SELECT user_email FROM pmr_users " +
|
||||
private static final String QUERY_NEW_USER_EMAIL = "SELECT user_email, user_nicename FROM pmr_users " +
|
||||
"WHERE ID > ? ";
|
||||
|
||||
@Value("${redis.key.maximumUserId}")
|
||||
@@ -1404,7 +1416,8 @@ public class AccountServiceImpl extends ServiceImpl<AccountMapper, Account> impl
|
||||
@Override
|
||||
@Transactional(rollbackFor = Exception.class)
|
||||
public void registerUserToVisitor(){
|
||||
ArrayList<String> newUserEmails = new ArrayList<>();
|
||||
ArrayList<Map<String, String>> newUsersInfo = new ArrayList<>();
|
||||
ArrayList<String> allEmail = new ArrayList<>();
|
||||
long maxUserId = CommonConstant.MAXIMUM_USER_ID;
|
||||
try (Connection connection = dataSource.getConnection();
|
||||
PreparedStatement preparedStatement = connection.prepareStatement(QUERY_MAXIMUM_USERID)) {
|
||||
@@ -1420,9 +1433,14 @@ public class AccountServiceImpl extends ServiceImpl<AccountMapper, Account> impl
|
||||
// 填充参数 - 历史最大用户ID
|
||||
newUserEmail.setLong(1, maxUserIdHistory);
|
||||
try (ResultSet queryEmailResultSet = newUserEmail.executeQuery()) {
|
||||
if (queryEmailResultSet.next()) {
|
||||
while (queryEmailResultSet.next()) {
|
||||
String email = queryEmailResultSet.getString("user_email");
|
||||
newUserEmails.add(email);
|
||||
String username = queryEmailResultSet.getString("user_nicename");
|
||||
HashMap<String, String> info = new HashMap<>();
|
||||
info.put("email", email);
|
||||
info.put("username", username);
|
||||
newUsersInfo.add(info);
|
||||
allEmail.add(email);
|
||||
} /*else {
|
||||
log.error("未知错误。code-create的用户表中没有付费用户的信息");
|
||||
throw new BusinessException("user info missing");
|
||||
@@ -1437,22 +1455,36 @@ public class AccountServiceImpl extends ServiceImpl<AccountMapper, Account> impl
|
||||
// return null;
|
||||
}
|
||||
|
||||
if (!newUserEmails.isEmpty()){
|
||||
if (!newUsersInfo.isEmpty()){
|
||||
// 查询这些邮箱在aida上是否有账号
|
||||
QueryWrapper<Account> queryWrapper = new QueryWrapper<>();
|
||||
queryWrapper.in("user_email", newUserEmails).select("user_email");
|
||||
queryWrapper.in("user_email", allEmail).select("user_email");
|
||||
|
||||
List<String> collect = baseMapper.selectList(queryWrapper).stream().map(Account::getUserEmail).collect(Collectors.toList());
|
||||
if (!collect.isEmpty()){
|
||||
// 移除Code-Create新增用户中在AiDA已有账号的邮箱
|
||||
newUserEmails.removeAll(collect);
|
||||
// 重复的邮箱
|
||||
List<String> duplicateEmails = baseMapper.selectList(queryWrapper).stream().map(Account::getUserEmail).collect(Collectors.toList());
|
||||
if (!duplicateEmails.isEmpty()){
|
||||
// 移除Code-Create新增用户中在AiDA已有账号的邮箱,allEmail中剩余邮箱均为新用户邮箱
|
||||
allEmail.removeIf(item -> duplicateEmails.stream()
|
||||
.anyMatch(removeItem -> removeItem.equalsIgnoreCase(item)));
|
||||
if (!allEmail.isEmpty()){
|
||||
Iterator<Map<String, String>> iterator = newUsersInfo.iterator();
|
||||
while (iterator.hasNext()) {
|
||||
Map<String, String> userInfo = iterator.next();
|
||||
String email = userInfo.get("email");
|
||||
if (!allEmail.contains(email)) {
|
||||
iterator.remove(); // 使用迭代器安全地移除元素
|
||||
}
|
||||
}
|
||||
}else {
|
||||
newUsersInfo.clear();
|
||||
}
|
||||
}
|
||||
// 将新增用户添加到AiDA,身份为游客
|
||||
if (!newUserEmails.isEmpty()){
|
||||
newUserEmails.forEach(email -> {
|
||||
if (!newUsersInfo.isEmpty()){
|
||||
newUsersInfo.forEach(userInfo -> {
|
||||
Account account = new Account();
|
||||
account.setUserEmail(email);
|
||||
account.setUserName(email);
|
||||
account.setUserEmail(userInfo.get("email"));
|
||||
account.setUserName(userInfo.get("username"));
|
||||
account.setUserPassword("Third-000000");
|
||||
account.setLanguage(Language.ENGLISH.name());
|
||||
account.setValidStartTime(Instant.now().toEpochMilli());
|
||||
@@ -1463,7 +1495,7 @@ public class AccountServiceImpl extends ServiceImpl<AccountMapper, Account> impl
|
||||
account.setSystemUser(0);
|
||||
baseMapper.insert(account);
|
||||
// 邮件通知用户
|
||||
SendEmailUtil.notificationForRegisterUser(email);
|
||||
SendEmailUtil.notificationForRegisterUser(userInfo.get("email"));
|
||||
});
|
||||
}
|
||||
// 记录当前最大的用户id
|
||||
@@ -1471,6 +1503,16 @@ public class AccountServiceImpl extends ServiceImpl<AccountMapper, Account> impl
|
||||
}
|
||||
}
|
||||
|
||||
public static void main(String[] args) {
|
||||
List<String> a = new ArrayList<>();
|
||||
a.add("1023316923@qq.com");
|
||||
a.add("Malinyuquan@gmail.com");
|
||||
|
||||
if (a.contains("malinyuquan@gmail.com")) {
|
||||
log.info("aaaaaaaaaaaaaaaaaaaaa");
|
||||
}
|
||||
}
|
||||
|
||||
private static final String QUERY_PAID_CUSTOMER_EMAIL = "SELECT distinct c.email " +
|
||||
"FROM `pmr_wc_order_stats` o " +
|
||||
"inner join `pmr_wc_customer_lookup` c " +
|
||||
@@ -1857,27 +1899,39 @@ public class AccountServiceImpl extends ServiceImpl<AccountMapper, Account> impl
|
||||
@Override
|
||||
public String googleCallback(String code, HttpSession session) {
|
||||
try {
|
||||
log.info("code:" + code);
|
||||
log.info("code: " + code);
|
||||
// 使用 code 获取 Google 用户信息
|
||||
GoogleUser googleUser = getGoogleUserFromCode(code);
|
||||
log.info("googleUser:" + JSON.toJSONString(googleUser));
|
||||
log.info("googleUser: " + JSON.toJSONString(googleUser));
|
||||
|
||||
// 检查数据库中是否已有该用户
|
||||
// QueryWrapper<AccountExtend> qw = new QueryWrapper<>();
|
||||
// qw.lambda().eq(AccountExtend::getAuth, googleUser.getId());
|
||||
// List<AccountExtend> accountExtends = accountExtendMapper.selectList(qw);
|
||||
// Account existingUser = findUserByGoogleId(googleUser.getId());
|
||||
return "Login successful";
|
||||
// if (CollectionUtil.isNotEmpty(accountExtends)) {
|
||||
// // 用户已存在,直接登录
|
||||
//// session.setAttribute("user", existingUser);
|
||||
// return "Login successful";
|
||||
// } else {
|
||||
// // 用户不存在,创建新用户(自动注册)
|
||||
//// User newUser = googleAuthService.registerNewUser(googleUser);
|
||||
//// session.setAttribute("user", newUser);
|
||||
// return "Registration and login successful";
|
||||
// }
|
||||
QueryWrapper<Account> queryWrapper = new QueryWrapper<>();
|
||||
queryWrapper.lambda().eq(Account::getUserEmail, googleUser.getEmail()); // 根据邮箱查询用户
|
||||
List<Account> accounts = accountMapper.selectList(queryWrapper);
|
||||
|
||||
if (CollectionUtil.isNotEmpty(accounts)) {
|
||||
// 用户已存在,直接登录
|
||||
session.setAttribute("user", accounts.get(0));
|
||||
return "Login successful";
|
||||
} else {
|
||||
// 用户不存在,创建新用户(自动注册)
|
||||
Account newUser = new Account();
|
||||
newUser.setUserEmail(googleUser.getEmail());
|
||||
newUser.setUserName(googleUser.getName());
|
||||
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);
|
||||
session.setAttribute("user", newUser);
|
||||
|
||||
return "Registration and login successful";
|
||||
}
|
||||
} catch (Exception e) {
|
||||
return "Error processing Google login: " + e.getMessage();
|
||||
}
|
||||
@@ -1887,6 +1941,7 @@ public class AccountServiceImpl extends ServiceImpl<AccountMapper, Account> impl
|
||||
private static final String USER_INFO_URL = "https://www.googleapis.com/oauth2/v3/userinfo";
|
||||
private static final String CLIENT_ID = "194770296147-njd68pm7tnapgonkj2h48mhf63n15n3f.apps.googleusercontent.com";
|
||||
private static final String CLIENT_SECRET = "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";
|
||||
// private static final String REDIRECT_URI = "https://0551-117-143-125-51.ngrok-free.app/api/third/party/auth/google_callback";
|
||||
private static final String REDIRECT_URI = "https://develop.api.aida.com.hk/api/third/party/auth/google_callback";
|
||||
|
||||
public GoogleUser getGoogleUserFromCode(String code) {
|
||||
@@ -1932,4 +1987,516 @@ public class AccountServiceImpl extends ServiceImpl<AccountMapper, Account> impl
|
||||
// return userRepository.save(newUser);
|
||||
// }
|
||||
|
||||
@Override
|
||||
public void temporaryUpgrade() {
|
||||
QueryWrapper<Account> queryWrapper = new QueryWrapper<>();
|
||||
queryWrapper.lambda().ne(Account::getSystemUser, 0);
|
||||
queryWrapper.lambda().isNotNull(Account::getUserEmail);
|
||||
// queryWrapper.lambda().eq(Account::getId, 6);
|
||||
List<Account> accountList = accountMapper.selectList(queryWrapper);
|
||||
int i = 0;
|
||||
for (Account account : accountList) {
|
||||
if (i >= 0) {
|
||||
try {
|
||||
// 判断用户语言,调用相应邮件发送方法
|
||||
if (Language.CHINESE_SIMPLIFIED.name().equals(account.getLanguage())) {
|
||||
// SendEmailUtil.temporaryUpgrade(account, null, 0);
|
||||
} else {
|
||||
// SendEmailUtil.temporaryUpgrade(account, null, 1);
|
||||
}
|
||||
} catch (Exception e) {
|
||||
// 捕获单个用户的发送失败异常,记录日志但不中断流程
|
||||
log.error("邮件发送失败,用户邮箱:{},原因:{}", account.getUserEmail(), e.getMessage(), e);
|
||||
}
|
||||
}
|
||||
i ++;
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
@Override
|
||||
public AccountLoginVO enterpriseLogin(AccountLoginDTO accountDTO) {
|
||||
QueryWrapper<Account> qw = new QueryWrapper<>();
|
||||
qw.lambda().eq(Account::getUserName, accountDTO.getUserName());
|
||||
qw.lambda().eq(Account::getOrganizationName, accountDTO.getOrganizationName());
|
||||
List<Account> accounts = accountMapper.selectList(qw);
|
||||
if (CollectionUtil.isEmpty(accounts)) {
|
||||
throw new BusinessException("Username or enterprise name incorrect.");
|
||||
}
|
||||
qw.lambda().eq(Account::getUserPassword, accountDTO.getPassword());
|
||||
accounts = accountMapper.selectList(qw);
|
||||
if (CollectionUtil.isEmpty(accounts)) {
|
||||
throw new BusinessException("Password error.");
|
||||
}
|
||||
Account account = accounts.get(0);
|
||||
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;
|
||||
}
|
||||
|
||||
@Override
|
||||
public AccountLoginVO schoolLogin(AccountLoginDTO accountDTO) {
|
||||
QueryWrapper<Account> qw = new QueryWrapper<>();
|
||||
qw.lambda().eq(Account::getUserName, accountDTO.getUserName());
|
||||
qw.lambda().eq(Account::getOrganizationName, accountDTO.getOrganizationName());
|
||||
List<Account> accounts = accountMapper.selectList(qw);
|
||||
if (CollectionUtil.isEmpty(accounts)) {
|
||||
throw new BusinessException("Username or school name incorrect.");
|
||||
}
|
||||
qw.lambda().eq(Account::getUserPassword, accountDTO.getPassword());
|
||||
accounts = accountMapper.selectList(qw);
|
||||
if (CollectionUtil.isEmpty(accounts)) {
|
||||
throw new BusinessException("Password error.");
|
||||
}
|
||||
Account account = accounts.get(0);
|
||||
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;
|
||||
}
|
||||
|
||||
@Override
|
||||
public Boolean addSubAccount(AddSubAccountDTO addSubAccountDTO) {
|
||||
if (null == addSubAccountDTO.getId()) {
|
||||
AuthPrincipalVo authPrincipalVo = UserContext.getUserHolder();
|
||||
Account account = accountMapper.selectById(authPrincipalVo.getId());
|
||||
|
||||
QueryWrapper<Account> qw = new QueryWrapper<>();
|
||||
qw.lambda().eq(Account::getOrganizationName, account.getOrganizationName());
|
||||
List<Account> accounts = accountMapper.selectList(qw);
|
||||
if (accounts.size() >= account.getSubAccountNum()) {
|
||||
throw new BusinessException("The maximum number of sub accounts that can be created has been reached.");
|
||||
}
|
||||
|
||||
qw.lambda().eq(Account::getUserName, addSubAccountDTO.getUserName());
|
||||
accounts = accountMapper.selectList(qw);
|
||||
if (CollectionUtil.isNotEmpty(accounts)) {
|
||||
throw new BusinessException("The enterprise already has an account with the same username.");
|
||||
}
|
||||
|
||||
Account subAccount = CopyUtil.copyObject(addSubAccountDTO, Account.class);
|
||||
subAccount.setSystemUser(6);
|
||||
subAccount.setValidStartTime(account.getValidStartTime());
|
||||
subAccount.setValidEndTime(account.getValidEndTime());
|
||||
subAccount.setLanguage(Language.ENGLISH.name());
|
||||
subAccount.setCreateDate(new Date());
|
||||
subAccount.setIsTrial(0);
|
||||
subAccount.setIsBeginner(1);
|
||||
subAccount.setParentId(account.getParentId());
|
||||
accountMapper.insert(subAccount);
|
||||
}else {
|
||||
Account subAccount = CopyUtil.copyObject(addSubAccountDTO, Account.class);
|
||||
accountMapper.updateById(subAccount);
|
||||
}
|
||||
|
||||
|
||||
return Boolean.TRUE;
|
||||
}
|
||||
|
||||
@Override
|
||||
public Boolean deleteSubAccount(AddSubAccountDTO addSubAccountDTO) {
|
||||
accountMapper.deleteBatchIds(addSubAccountDTO.getDeleteIdList());
|
||||
return Boolean.TRUE;
|
||||
}
|
||||
|
||||
@Override
|
||||
public PageBaseResponse<Account> subAccountList(SubAccountPageDTO subAccountPageDTO) {
|
||||
AuthPrincipalVo authPrincipalVo = UserContext.getUserHolder();
|
||||
Account account = accountMapper.selectById(authPrincipalVo);
|
||||
QueryWrapper<Account> qw = new QueryWrapper<>();
|
||||
qw.lambda().ne(Account::getId, account.getId());
|
||||
qw.lambda().eq(Account::getOrganizationName, account.getOrganizationName());
|
||||
// 执行分页查询
|
||||
IPage<Account> page = accountMapper.selectPage(new Page<>(subAccountPageDTO.getPage(), subAccountPageDTO.getSize()), qw);
|
||||
|
||||
return PageBaseResponse.success(page);
|
||||
}
|
||||
|
||||
@Override
|
||||
public Account accountDetail(Long id) {
|
||||
return accountMapper.selectById(id);
|
||||
}
|
||||
|
||||
@Override
|
||||
public AccountLoginVO parseGoogleCredential(String credential) {
|
||||
try {
|
||||
// 配置 Google ID Token 验证器
|
||||
GoogleIdTokenVerifier verifier = new GoogleIdTokenVerifier.Builder(
|
||||
new NetHttpTransport(),
|
||||
JacksonFactory.getDefaultInstance())
|
||||
.setAudience(Collections.singletonList(CLIENT_ID))
|
||||
.build();
|
||||
|
||||
// 验证并解析 ID Token
|
||||
GoogleIdToken idToken = verifier.verify(credential);
|
||||
|
||||
|
||||
if (idToken != null) {
|
||||
GoogleIdToken.Payload payload = idToken.getPayload();
|
||||
|
||||
// 提取用户信息
|
||||
String userId = payload.getSubject();
|
||||
String email = payload.getEmail();
|
||||
String name = (String) payload.get("name");
|
||||
String pictureUrl = (String) payload.get("picture");
|
||||
log.info(userId);
|
||||
log.info(email);
|
||||
log.info(name);
|
||||
|
||||
// 检查数据库中是否已有该用户
|
||||
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 {
|
||||
|
||||
AccountExtend accountExtendInsert = new AccountExtend();
|
||||
accountExtendInsert.setAuth(userId);
|
||||
accountExtendInsert.setAuthType("Google");
|
||||
accountExtendInsert.setHeadImgUrl(pictureUrl);
|
||||
accountExtendInsert.setName(name);
|
||||
|
||||
// 用户不存在,创建新用户(自动注册)
|
||||
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);
|
||||
|
||||
accountExtendInsert.setAccountId(newUser.getId());
|
||||
accountExtendMapper.insert(accountExtendInsert);
|
||||
|
||||
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.");
|
||||
}
|
||||
|
||||
} catch (Exception e) {
|
||||
e.printStackTrace();
|
||||
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");
|
||||
String headimgurl = userInfoResponse.getString("headimgurl");
|
||||
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");
|
||||
accountExtendInsert.setHeadImgUrl(headimgurl);
|
||||
accountExtendInsert.setName(userName);
|
||||
|
||||
// 用户不存在,创建新用户(自动注册)
|
||||
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;
|
||||
}
|
||||
|
||||
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()));
|
||||
|
||||
QueryWrapper<AccountExtend> qw = new QueryWrapper<>();
|
||||
qw.lambda().eq(AccountExtend::getAccountId, response.getUserId());
|
||||
List<AccountExtend> accountExtends = accountExtendMapper.selectList(qw);
|
||||
if (CollectionUtil.isNotEmpty(accountExtends)) {
|
||||
response.setAccountExtendList(accountExtends);
|
||||
}
|
||||
|
||||
return response;
|
||||
}
|
||||
|
||||
@Override
|
||||
public Boolean bindGoogle(String credential) {
|
||||
try {
|
||||
// 配置 Google ID Token 验证器
|
||||
GoogleIdTokenVerifier verifier = new GoogleIdTokenVerifier.Builder(
|
||||
new NetHttpTransport(),
|
||||
JacksonFactory.getDefaultInstance())
|
||||
.setAudience(Collections.singletonList(CLIENT_ID))
|
||||
.build();
|
||||
|
||||
// 验证并解析 ID Token
|
||||
GoogleIdToken idToken = verifier.verify(credential);
|
||||
|
||||
|
||||
if (idToken != null) {
|
||||
GoogleIdToken.Payload payload = idToken.getPayload();
|
||||
|
||||
// 提取用户信息
|
||||
String userId = payload.getSubject();
|
||||
String email = payload.getEmail();
|
||||
String name = (String) payload.get("name");
|
||||
String pictureUrl = (String) payload.get("picture");
|
||||
|
||||
|
||||
AccountExtend accountExtendInsert = new AccountExtend();
|
||||
accountExtendInsert.setAuth(userId);
|
||||
accountExtendInsert.setAuthType("Google");
|
||||
accountExtendInsert.setHeadImgUrl(pictureUrl);
|
||||
accountExtendInsert.setName(name);
|
||||
|
||||
|
||||
AuthPrincipalVo authPrincipalVo = UserContext.getUserHolder();
|
||||
accountExtendInsert.setAccountId(authPrincipalVo.getId());
|
||||
accountExtendMapper.insert(accountExtendInsert);
|
||||
|
||||
return Boolean.TRUE;
|
||||
} else {
|
||||
throw new IllegalArgumentException("Invalid ID token.");
|
||||
}
|
||||
|
||||
} catch (Exception e) {
|
||||
e.printStackTrace();
|
||||
throw new RuntimeException("Failed to verify ID token: " + e.getMessage());
|
||||
}
|
||||
}
|
||||
|
||||
@Override
|
||||
public Boolean bindWeChat(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");
|
||||
String headimgurl = userInfoResponse.getString("headimgurl");
|
||||
if (unionId == null) {
|
||||
throw new IllegalArgumentException("无法获取 unionid,请检查微信开发平台配置");
|
||||
}
|
||||
AccountExtend accountExtendInsert = new AccountExtend();
|
||||
accountExtendInsert.setAuth(unionId);
|
||||
accountExtendInsert.setAuthType("WeChat");
|
||||
accountExtendInsert.setHeadImgUrl(headimgurl);
|
||||
accountExtendInsert.setName(userName);
|
||||
|
||||
AuthPrincipalVo authPrincipalVo = UserContext.getUserHolder();
|
||||
accountExtendInsert.setAccountId(authPrincipalVo.getId());
|
||||
accountExtendMapper.insert(accountExtendInsert);
|
||||
|
||||
return Boolean.TRUE;
|
||||
}
|
||||
}
|
||||
|
||||
@@ -609,6 +609,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;
|
||||
}
|
||||
|
||||
|
||||
@@ -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);
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
@@ -150,6 +150,14 @@ public class GenerateServiceImpl extends ServiceImpl<GenerateMapper, Generate> i
|
||||
String port = generateServicePort;
|
||||
String jsonString = "";
|
||||
HashMap<String, String> params = new HashMap<>();
|
||||
String version = null;
|
||||
if (!StringUtil.isNullOrEmpty(generateThroughImageTextDTO.getVersion()) && generateThroughImageTextDTO.getVersion().equals("high")){
|
||||
version = "high";
|
||||
params.put("version","high");
|
||||
}else if (!StringUtil.isNullOrEmpty(generateThroughImageTextDTO.getVersion()) && generateThroughImageTextDTO.getVersion().equals("fast")){
|
||||
version = "fast";
|
||||
params.put("version","fast");
|
||||
}
|
||||
// 3.1 确定不同类型的印花分别调哪个接口
|
||||
if (generateThroughImageTextDTO.getLevel1Type().equals(PRINT_BOARD.getRealName())) {
|
||||
switch (generateThroughImageTextDTO.getLevel2Type()) {
|
||||
@@ -171,15 +179,16 @@ public class GenerateServiceImpl extends ServiceImpl<GenerateMapper, Generate> i
|
||||
break;
|
||||
case "Pattern":
|
||||
GenerateToPythonDTO generateToPythonDTO = new GenerateToPythonDTO(generateThroughImageTextDTO.getUniqueId(), text, Objects.isNull(collectionElement) ? "" : collectionElement.getUrl(),
|
||||
mode, category, generateThroughImageTextDTO.getGender());
|
||||
mode, category, generateThroughImageTextDTO.getGender(), version);
|
||||
jsonString = JSON.toJSONString(generateToPythonDTO, SerializerFeature.WriteMapNullValue);
|
||||
}
|
||||
} else {
|
||||
GenerateToPythonDTO generateToPythonDTO = new GenerateToPythonDTO(generateThroughImageTextDTO.getUniqueId(), text, Objects.isNull(collectionElement) ? "" : collectionElement.getUrl(),
|
||||
mode, category, generateThroughImageTextDTO.getGender());
|
||||
mode, category, generateThroughImageTextDTO.getGender(), version);
|
||||
jsonString = JSON.toJSONString(generateToPythonDTO, SerializerFeature.WriteMapNullValue);
|
||||
}
|
||||
|
||||
|
||||
Boolean requestResult = pythonService.generateSketchOrPrint(jsonString, port, path);
|
||||
|
||||
// 4、将请求信息落库,将本次generate的请求信息添加到t_generate表中
|
||||
@@ -325,7 +334,8 @@ public class GenerateServiceImpl extends ServiceImpl<GenerateMapper, Generate> i
|
||||
// generate.setText(text);
|
||||
break;
|
||||
case "Sketchboard":
|
||||
text = "clear lines, simple outlines monochrome white vector image of " + translated + ", no background, sketch flat, front view display, best quality, ultra-high resolution 8k";
|
||||
// text = "clear lines, simple outlines monochrome white vector image of " + translated + ", no background, sketch flat, front view display, best quality, ultra-high resolution 8k";
|
||||
text = "a single item of sketch of " + translated + ", 4k, white background";
|
||||
// generate.setText(text);
|
||||
default:
|
||||
}
|
||||
@@ -498,6 +508,13 @@ public class GenerateServiceImpl extends ServiceImpl<GenerateMapper, Generate> i
|
||||
// 校验后获取
|
||||
generateThroughImageTextDTO.setGenerateType(generate.getGenerateType());
|
||||
creditsEventsEnum = CreditsEventsEnum.PATTERN;
|
||||
|
||||
// 模型迁移SD1.? -> flux,从而产生了不同模型的选择,
|
||||
// high -> 生成图片质量高,但生成速度慢,每次生成只返回一张图片
|
||||
// fast -> 生成图片质量低,但生成速度快,每次生成返回四张图片
|
||||
if (!StringUtil.isNullOrEmpty(generateThroughImageTextDTO.getVersion()) && generateThroughImageTextDTO.getVersion().equals("high")){
|
||||
times = 1;
|
||||
}
|
||||
}
|
||||
// Slogan 参数校验
|
||||
if (generateThroughImageTextDTO.getLevel2Type().equals(CollectionLevel2TypeEnum.SLOGAN.getRealName())) {
|
||||
@@ -554,8 +571,14 @@ public class GenerateServiceImpl extends ServiceImpl<GenerateMapper, Generate> i
|
||||
}
|
||||
} else if (generateThroughImageTextDTO.getLevel1Type().equals(MOOD_BOARD.getRealName())) {
|
||||
creditsEventsEnum = CreditsEventsEnum.MOOD_BOARD;
|
||||
if (!StringUtil.isNullOrEmpty(generateThroughImageTextDTO.getVersion()) && generateThroughImageTextDTO.getVersion().equals("high")){
|
||||
times = 1;
|
||||
}
|
||||
} else if (generateThroughImageTextDTO.getLevel1Type().equals(SKETCH_BOARD.getRealName())) {
|
||||
creditsEventsEnum = CreditsEventsEnum.SKETCH_BOARD;
|
||||
if (!StringUtil.isNullOrEmpty(generateThroughImageTextDTO.getVersion()) && generateThroughImageTextDTO.getVersion().equals("high")){
|
||||
times = 1;
|
||||
}
|
||||
}
|
||||
|
||||
// 2、判断用户当前积分是否够本次生成消耗
|
||||
@@ -567,6 +590,11 @@ public class GenerateServiceImpl extends ServiceImpl<GenerateMapper, Generate> i
|
||||
// 3、生成唯一id 使用uuid,由于uuid重复的几率很小,故取消对uuid重复性的校验
|
||||
String uuid = UUID.randomUUID().toString();
|
||||
|
||||
// 除了 Moodboard || Printboard->Pattern(可以区分三种风格) || Sketchboard(Generate Sketch)这三个地方需要区分high || fast之外,其他地方保持原样
|
||||
if (generateThroughImageTextDTO.getLevel1Type().equals("Printboard") && !generateThroughImageTextDTO.getLevel2Type().equals("Pattern")){
|
||||
generateThroughImageTextDTO.setVersion(null);
|
||||
}
|
||||
|
||||
ArrayList<String> taskIdList = new ArrayList<>();
|
||||
for (int i = 1; i <= times; i++) {
|
||||
String temp = uuid;
|
||||
|
||||
@@ -9,14 +9,18 @@ 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.*;
|
||||
import com.ai.da.python.PythonService;
|
||||
import com.ai.da.service.*;
|
||||
import com.alibaba.fastjson.JSON;
|
||||
import com.alibaba.fastjson.JSONArray;
|
||||
import com.alibaba.fastjson.JSONObject;
|
||||
import com.alibaba.fastjson.serializer.SerializerFeature;
|
||||
import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
|
||||
import com.baomidou.mybatisplus.core.conditions.update.UpdateWrapper;
|
||||
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
|
||||
@@ -30,13 +34,14 @@ import org.springframework.util.StringUtils;
|
||||
import org.springframework.web.multipart.MultipartFile;
|
||||
|
||||
import javax.annotation.Resource;
|
||||
import java.io.BufferedReader;
|
||||
import java.io.InputStream;
|
||||
import java.io.InputStreamReader;
|
||||
import java.io.*;
|
||||
import java.nio.file.Paths;
|
||||
import java.time.LocalDateTime;
|
||||
import java.util.*;
|
||||
import java.util.stream.Collectors;
|
||||
|
||||
import static cn.hutool.poi.excel.sax.AttributeName.s;
|
||||
|
||||
/**
|
||||
* 服务实现类
|
||||
*
|
||||
@@ -79,6 +84,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) {
|
||||
@@ -258,25 +265,47 @@ public class UserLikeGroupServiceImpl extends ServiceImpl<UserLikeGroupMapper, U
|
||||
int i = 0;
|
||||
// 翻译
|
||||
String prompt = toProductImageDTO.getPrompt();
|
||||
String s = "";
|
||||
StringBuilder sb = new StringBuilder("The best quality, masterpiece, real image.");
|
||||
if (!StringUtil.isNullOrEmpty(prompt)) {
|
||||
s = pythonService.promptTranslate(prompt);
|
||||
}else {
|
||||
s = "best quality, masterpiece. detailed, high-res, simple background, studio photography, extremely detailed, updo, detailed face, face, close-up, HDR, UHD, 8K realistic, Highly detailed, simple background, Studio lighting";
|
||||
prompt = pythonService.promptTranslate(prompt);
|
||||
}
|
||||
// else {
|
||||
// s = "best quality, masterpiece. detailed, high-res, simple background, studio photography, extremely detailed, updo, detailed face, face, close-up, HDR, UHD, 8K realistic, Highly detailed, simple background, Studio lighting";
|
||||
// }
|
||||
for (ToProductImageVO toProductImageVO : toProductImageDTO.getToProductImageVOList()) {
|
||||
String taskId;
|
||||
if (toProductImageVO.getElementType().equals("DesignOutfit")) {
|
||||
taskId = UUID.randomUUID() + "-" + i + "-" + userHolder.getId();
|
||||
TDesignPythonOutfit tDesignPythonOutfit = designPythonOutfitMapper.selectById(toProductImageVO.getElementId());
|
||||
|
||||
Long designItemId = tDesignPythonOutfit.getDesignItemId();
|
||||
QueryWrapper<DesignItemDetail> designItemDetailQueryWrapper = new QueryWrapper<>();
|
||||
designItemDetailQueryWrapper.lambda().eq(DesignItemDetail::getDesignItemId, designItemId);
|
||||
designItemDetailQueryWrapper.lambda().ne(DesignItemDetail::getType, "Body");
|
||||
List<DesignItemDetail> designItemDetails = designItemDetailMapper.selectList(designItemDetailQueryWrapper);
|
||||
String collect = designItemDetails.stream().map(DesignItemDetail::getType).collect(Collectors.joining(","));
|
||||
|
||||
Long designId = tDesignPythonOutfit.getDesignId();
|
||||
Design design = designMapper.selectById(designId);
|
||||
String productType = "overall";
|
||||
if (design.getSingleOverall().equals("single")) {
|
||||
productType = "single";
|
||||
sb.append(collect);
|
||||
}else {
|
||||
if (collect.contains("Tops")) {
|
||||
sb.append("a handsome man,");
|
||||
}else {
|
||||
sb.append("a beautiful women,");
|
||||
}
|
||||
sb.append("wearing ").append(collect);
|
||||
}
|
||||
if (StringUtils.isEmpty(prompt)) {
|
||||
sb.append(",8K realistic,HDR");
|
||||
}else {
|
||||
sb.append(",").append(prompt).append(",8K realistic,HDR");
|
||||
}
|
||||
// 走模型
|
||||
pythonService.toProductImage(tDesignPythonOutfit.getDesignUrl(), taskId, s, toProductImageDTO.getImageStrength(), productType);
|
||||
pythonService.toProductImage(tDesignPythonOutfit.getDesignUrl(), taskId, sb.toString(), toProductImageDTO.getImageStrength(), productType);
|
||||
ToProductImageResult toProductImageResult = new ToProductImageResult();
|
||||
toProductImageResult.setElementId(tDesignPythonOutfit.getId());
|
||||
toProductImageResult.setElementType("DesignOutfit");
|
||||
@@ -290,10 +319,16 @@ public class UserLikeGroupServiceImpl extends ServiceImpl<UserLikeGroupMapper, U
|
||||
// toProductImageResult.setUrl(minioUtil.getPresignedUrl(toProductImageResult.getUrl(), 24 * 60));
|
||||
result.add(toProductImageResult);
|
||||
}else {
|
||||
if (StringUtils.isEmpty(prompt)) {
|
||||
sb.append(",8K realistic,HDR");
|
||||
}else {
|
||||
sb.append(",").append(prompt).append(",8K realistic,HDR");
|
||||
}
|
||||
|
||||
taskId = UUID.randomUUID() + "-" + i + "-" + userHolder.getId();
|
||||
ToProductElement toProductElement = toProductElementMapper.selectById(toProductImageVO.getElementId());
|
||||
// 走模型
|
||||
pythonService.toProductImage(toProductElement.getUrl(), taskId, s, toProductImageDTO.getImageStrength(), "overall");
|
||||
pythonService.toProductImage(toProductElement.getUrl(), taskId, sb.toString(), toProductImageDTO.getImageStrength(), "overall");
|
||||
ToProductImageResult toProductImageResult = new ToProductImageResult();
|
||||
toProductImageResult.setElementId(toProductElement.getId());
|
||||
toProductImageResult.setElementType("ProductElement");
|
||||
@@ -611,67 +646,150 @@ public class UserLikeGroupServiceImpl extends ServiceImpl<UserLikeGroupMapper, U
|
||||
public String likeHistoryRelSketch() {
|
||||
QueryWrapper<UserLikeGroup> qw = new QueryWrapper<>();
|
||||
List<UserLikeGroup> userLikeGroups = userLikeGroupMapper.selectList(qw);
|
||||
Map<Long, List<List<Map<String, Object>>>> result = new HashMap<>();
|
||||
List<List<Map<String, Object>>> result = new ArrayList<>();
|
||||
|
||||
for (UserLikeGroup userLikeGroup : userLikeGroups) {
|
||||
Long accountId = userLikeGroup.getAccountId();
|
||||
Long collectionId = userLikeGroup.getCollectionId();
|
||||
|
||||
QueryWrapper<CollectionElement> collectionElementQueryWrapper = new QueryWrapper<>();
|
||||
collectionElementQueryWrapper.lambda().eq(CollectionElement::getCollectionId, collectionId);
|
||||
collectionElementQueryWrapper.lambda().eq(CollectionElement::getLevel1Type, "Sketchboard");
|
||||
List<CollectionElement> collectionElements = collectionElementMapper.selectList(collectionElementQueryWrapper);
|
||||
List<String> urlList = collectionElements.stream().map(CollectionElement::getUrl).collect(Collectors.toList());
|
||||
// 提前转换为Set以提高contains的效率
|
||||
List<CollectionElement> collectionElements = getCollectionElementsByCollectionId(collectionId);
|
||||
Set<String> urlSet = collectionElements.stream()
|
||||
.map(CollectionElement::getUrl)
|
||||
.collect(Collectors.toSet());
|
||||
|
||||
QueryWrapper<UserLike> userLikeQueryWrapper = new QueryWrapper<>();
|
||||
userLikeQueryWrapper.lambda().eq(UserLike::getUserLikeGroupId, userLikeGroup.getId());
|
||||
List<UserLike> userLikes = userLikeMapper.selectList(userLikeQueryWrapper);
|
||||
|
||||
List<Map<String, Object>> list = new ArrayList<>();
|
||||
List<UserLike> userLikes = getUserLikesByGroupId(userLikeGroup.getId());
|
||||
|
||||
for (UserLike userLike : userLikes) {
|
||||
QueryWrapper<DesignItemDetail> designItemDetailQueryWrapper = new QueryWrapper<>();
|
||||
designItemDetailQueryWrapper.lambda().eq(DesignItemDetail::getDesignItemId, userLike.getDesignItemId());
|
||||
designItemDetailQueryWrapper.lambda().ne(DesignItemDetail::getType, "Body");
|
||||
List<DesignItemDetail> designItemDetails = designItemDetailMapper.selectList(designItemDetailQueryWrapper);
|
||||
Map<String, Object> sketch = new HashMap<>();
|
||||
List<Map<String, Object>> userLikeSketchList = new ArrayList<>();
|
||||
List<DesignItemDetail> designItemDetails = getDesignItemDetails(userLike.getDesignItemId());
|
||||
|
||||
for (DesignItemDetail designItemDetail : designItemDetails) {
|
||||
Map<String, Object> sketch = new HashMap<>();
|
||||
String path = designItemDetail.getPath();
|
||||
|
||||
// 下载路径到本地
|
||||
// if (!StringUtils.isEmpty(path)) {
|
||||
// String bucketName = minioUtil.getBucketNameFromPath(path);
|
||||
// String objectName = minioUtil.getObjectNameFromPath(path);
|
||||
// String localBasePath = "C:\\workspace\\fileData\\minio";
|
||||
// String localFilePath = Paths.get(localBasePath, path).toString();
|
||||
//
|
||||
// // 检查文件是否已经存在,避免重复下载
|
||||
// File localFile = new File(localFilePath);
|
||||
// if (!localFile.exists()) {
|
||||
// minioUtil.downloadMinioObjectToLocal(bucketName, objectName, localFilePath);
|
||||
// } else {
|
||||
// log.info("File already exists, skipping download: {}", localFilePath);
|
||||
// }
|
||||
// }
|
||||
|
||||
Long designId = designItemDetail.getDesignId();
|
||||
Design design = designMapper.selectById(designId);
|
||||
if (null == design) {
|
||||
continue;
|
||||
}
|
||||
if (design.getSingleOverall().equals("single")) {
|
||||
continue;
|
||||
}
|
||||
if (design.getModelType().equals("System")) {
|
||||
SysFile sysFile = sysFileMapper.selectById(design.getTemplateId());
|
||||
if (null == sysFile) {
|
||||
continue;
|
||||
}
|
||||
sketch.put("sex", sysFile.getLevel2Type().equals("Male") ? "Male" : "Female");
|
||||
} else {
|
||||
Library library = libraryMapper.selectById(design.getTemplateId());
|
||||
if (null == library) {
|
||||
continue;
|
||||
}
|
||||
sketch.put("sex", library.getLevel2Type().equals("Female") ? "Female" : "Male");
|
||||
}
|
||||
|
||||
sketch.put("type", designItemDetail.getType());
|
||||
sketch.put("path", path);
|
||||
if (urlList.contains(path)) {
|
||||
sketch.put("beSelected", true);
|
||||
}else {
|
||||
sketch.put("beSelected", false);
|
||||
}
|
||||
sketch.put("beSelected", urlSet.contains(path));
|
||||
sketch.put("accountId", accountId);
|
||||
|
||||
if (path.contains("aida-sys-image/images/")) {
|
||||
String searchPath = new String(path);
|
||||
String replace = searchPath.replace("aida-sys-image/images/", "");
|
||||
String replace = path.replace("aida-sys-image/images/", "");
|
||||
String style = getStyleByUrl(replace);
|
||||
if (!StringUtils.isEmpty(style)) {
|
||||
sketch.put("style", style);
|
||||
}
|
||||
}
|
||||
userLikeSketchList.add(sketch);
|
||||
}
|
||||
if (CollectionUtil.isNotEmpty(userLikeSketchList)) {
|
||||
result.add(userLikeSketchList);
|
||||
}
|
||||
list.add(sketch);
|
||||
}
|
||||
if (result.containsKey(accountId)) {
|
||||
result.get(accountId).add(list);
|
||||
}else {
|
||||
List<List<Map<String, Object>>> lists = new ArrayList<>();
|
||||
lists.add(list);
|
||||
result.put(accountId, lists);
|
||||
}
|
||||
}
|
||||
System.out.println(JSONObject.toJSONString(result));
|
||||
|
||||
// 将结果以美观的JSON形式保存到文件中
|
||||
saveResultAsPrettyJson(result, "C:\\Users\\10233\\Desktop\\result.json");
|
||||
|
||||
return null;
|
||||
}
|
||||
|
||||
@Override
|
||||
public String download() {
|
||||
// 下载 aida-collection-element bucket 下所有 Sketchboard 文件夹内容
|
||||
// String sketchboardLocalPath = "C:\\workspace\\fileData\\minio";
|
||||
// minioUtil.downloadSketchboardDirectories(sketchboardLocalPath);
|
||||
//
|
||||
// // 下载整个 aida-users bucket
|
||||
// String aidaUsersLocalPath = "C:\\workspace\\fileData\\minio";
|
||||
// minioUtil.downloadEntireBucket("aida-users", aidaUsersLocalPath);
|
||||
return null;
|
||||
}
|
||||
|
||||
// 提取公共方法
|
||||
private List<CollectionElement> getCollectionElementsByCollectionId(Long collectionId) {
|
||||
QueryWrapper<CollectionElement> qw = new QueryWrapper<>();
|
||||
qw.lambda().eq(CollectionElement::getCollectionId, collectionId)
|
||||
.eq(CollectionElement::getLevel1Type, "Sketchboard");
|
||||
return collectionElementMapper.selectList(qw);
|
||||
}
|
||||
|
||||
private List<UserLike> getUserLikesByGroupId(Long groupId) {
|
||||
QueryWrapper<UserLike> qw = new QueryWrapper<>();
|
||||
qw.lambda().eq(UserLike::getUserLikeGroupId, groupId);
|
||||
return userLikeMapper.selectList(qw);
|
||||
}
|
||||
|
||||
private List<DesignItemDetail> getDesignItemDetails(Long designItemId) {
|
||||
QueryWrapper<DesignItemDetail> qw = new QueryWrapper<>();
|
||||
qw.lambda().eq(DesignItemDetail::getDesignItemId, designItemId)
|
||||
.ne(DesignItemDetail::getType, "Body");
|
||||
return designItemDetailMapper.selectList(qw);
|
||||
}
|
||||
|
||||
private void saveResultAsPrettyJson(List<List<Map<String, Object>>> result, String filePath) {
|
||||
// 使用一个 Map<String, Object> 将结果存储为字符串键
|
||||
Map<String, Object> resultMap = new HashMap<>();
|
||||
resultMap.put("data", result);
|
||||
|
||||
try (FileWriter file = new FileWriter(filePath)) {
|
||||
// 使用 JSONObject 将转换后的 Map 转为 JSON
|
||||
JSONObject jsonObject = new JSONObject(resultMap);
|
||||
// 格式化输出为美观的 JSON
|
||||
file.write(JSON.toJSONString(jsonObject, SerializerFeature.PrettyFormat));
|
||||
} catch (IOException e) {
|
||||
e.printStackTrace();
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
|
||||
|
||||
private String getStyleByUrl(String replace) {
|
||||
String[] split = replace.split("/");
|
||||
String tableName = getTableName(split);
|
||||
if (StringUtils.isEmpty(tableName)) {
|
||||
return null;
|
||||
}else {
|
||||
replace = split[1] + "/" + split[2];
|
||||
return attributeRetrievalMapper.getStyleByUrl(replace, tableName);
|
||||
}
|
||||
}
|
||||
@@ -721,4 +839,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;
|
||||
}
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user