Merge remote-tracking branch 'origin/dev/3.1_release_merge' into dev-ltx
This commit is contained in:
@@ -6,10 +6,7 @@ import com.ai.da.common.utils.RedisUtil;
|
||||
import com.ai.da.model.dto.GenerateThroughImageTextDTO;
|
||||
import com.ai.da.model.vo.GenerateResultVO;
|
||||
import com.ai.da.model.vo.PoseTransformationVO;
|
||||
import com.ai.da.service.CloudTaskService;
|
||||
import com.ai.da.service.DesignService;
|
||||
import com.ai.da.service.GenerateService;
|
||||
import com.ai.da.service.UserLikeGroupService;
|
||||
import com.ai.da.service.*;
|
||||
import com.alibaba.fastjson.JSONArray;
|
||||
import com.alibaba.fastjson.JSONObject;
|
||||
import com.fasterxml.jackson.core.JsonParseException;
|
||||
@@ -17,17 +14,16 @@ import com.fasterxml.jackson.core.type.TypeReference;
|
||||
import com.fasterxml.jackson.databind.ObjectMapper;
|
||||
import com.google.gson.Gson;
|
||||
import com.rabbitmq.client.Channel;
|
||||
import lombok.RequiredArgsConstructor;
|
||||
import lombok.extern.slf4j.Slf4j;
|
||||
import org.apache.commons.text.StringEscapeUtils;
|
||||
import org.springframework.amqp.core.Message;
|
||||
import org.springframework.amqp.rabbit.annotation.RabbitHandler;
|
||||
import org.springframework.amqp.rabbit.annotation.RabbitListener;
|
||||
import org.springframework.beans.factory.annotation.Autowired;
|
||||
import org.springframework.beans.factory.annotation.Value;
|
||||
import org.springframework.stereotype.Component;
|
||||
import org.springframework.util.StringUtils;
|
||||
|
||||
import javax.annotation.Resource;
|
||||
import java.io.IOException;
|
||||
import java.nio.charset.StandardCharsets;
|
||||
import java.util.HashMap;
|
||||
@@ -37,25 +33,22 @@ import java.util.Objects;
|
||||
|
||||
@Slf4j
|
||||
@Component
|
||||
@RequiredArgsConstructor
|
||||
public class GenerateConsumer {
|
||||
|
||||
@Resource
|
||||
private GenerateService generateService;
|
||||
private final GenerateService generateService;
|
||||
|
||||
@Resource
|
||||
private UserLikeGroupService userLikeGroupService;
|
||||
private final UserLikeGroupService userLikeGroupService;
|
||||
|
||||
@Resource
|
||||
private DesignService designService;
|
||||
private final DesignService designService;
|
||||
|
||||
@Resource
|
||||
private CloudTaskService cloudTaskService;
|
||||
private final CloudTaskService cloudTaskService;
|
||||
|
||||
@Autowired
|
||||
private RabbitMQProperties rabbitMQProperties;
|
||||
private final RabbitMQProperties rabbitMQProperties;
|
||||
|
||||
@Resource
|
||||
private RedisUtil redisUtil;
|
||||
private final RedisUtil redisUtil;
|
||||
|
||||
private final MessageCenterService messageCenterService;
|
||||
|
||||
@Value("${redis.key.orderForGenerate}")
|
||||
private String consumptionOrderKey;
|
||||
@@ -301,8 +294,11 @@ public class GenerateConsumer {
|
||||
exceptionInfo.put(generateResult.get("tasks_id"), generateResult.get("message"));
|
||||
// 存redis
|
||||
redisUtil.addToMap(exceptionMapKey, exceptionInfo);
|
||||
// 记录失败状态并向用户发送提示消息
|
||||
generateService.processPTFailSituation(generateResult.get("tasks_id"));
|
||||
}
|
||||
} catch (Exception e) {
|
||||
e.printStackTrace();
|
||||
log.error(e.getMessage());
|
||||
try {
|
||||
channel.basicAck(msg.getMessageProperties().getDeliveryTag(), false);
|
||||
@@ -318,6 +314,8 @@ public class GenerateConsumer {
|
||||
exceptionInfo.put(String.valueOf(generateResult.get("tasks_id")), exceptionMessage);
|
||||
// 存redis
|
||||
redisUtil.addToMap(exceptionMapKey, exceptionInfo);
|
||||
// 记录失败状态并向用户发送提示消息
|
||||
generateService.processPTFailSituation(generateResult.get("tasks_id"));
|
||||
}
|
||||
|
||||
long end = System.currentTimeMillis();
|
||||
|
||||
@@ -6,12 +6,10 @@ import com.ai.da.mapper.primary.PoseTransformationMapper;
|
||||
import com.ai.da.mapper.primary.ToProductImageResultMapper;
|
||||
import com.ai.da.mapper.primary.entity.*;
|
||||
import com.ai.da.model.vo.PoseTransformationVO;
|
||||
import com.ai.da.service.APIGenerateService;
|
||||
import com.ai.da.service.CreditsService;
|
||||
import com.ai.da.service.GenerateService;
|
||||
import com.ai.da.service.MessageCenterService;
|
||||
import com.ai.da.service.*;
|
||||
import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
|
||||
import io.netty.util.internal.StringUtil;
|
||||
import lombok.RequiredArgsConstructor;
|
||||
import lombok.extern.slf4j.Slf4j;
|
||||
import org.springframework.scheduling.annotation.Scheduled;
|
||||
import org.springframework.stereotype.Component;
|
||||
@@ -25,19 +23,13 @@ import static com.ai.da.common.enums.CreditsEventsEnum.TO_PRODUCT_IMAGE;
|
||||
|
||||
@Slf4j
|
||||
@Component
|
||||
@RequiredArgsConstructor
|
||||
public class GenerateTask {
|
||||
@Resource
|
||||
private APIGenerateService apiGenerateService;
|
||||
@Resource
|
||||
private CreditsService creditsService;
|
||||
@Resource
|
||||
private GenerateService generateService;
|
||||
@Resource
|
||||
private MessageCenterService messageCenterService;
|
||||
@Resource
|
||||
private ToProductImageResultMapper toProductImageResultMapper;
|
||||
@Resource
|
||||
private PoseTransformationMapper poseTransformationMapper;
|
||||
private final APIGenerateService apiGenerateService;
|
||||
private final CreditsService creditsService;
|
||||
private final GenerateService generateService;
|
||||
private final PoseTransformationMapper poseTransformationMapper;
|
||||
private final ToProductImageResultMapper toProductImageResultMapper;
|
||||
|
||||
|
||||
/*
|
||||
@@ -106,15 +98,16 @@ public class GenerateTask {
|
||||
|
||||
}
|
||||
|
||||
// 万相 -> pose transformation 补偿 一小时执行一次
|
||||
// 万相 -> pose transformation 补偿 当前任务执行完后,5分钟再执行一次(不会出现任务重叠的情况)
|
||||
@Scheduled(fixedDelay = 5 * 60 * 1000)
|
||||
public void wxCompensationMechanism(){
|
||||
log.info("=====万相补偿获取结果开始=====");
|
||||
List<APIGenerate> apiGenerates = apiGenerateService.getPendingTaskByStatus("wx");
|
||||
if (apiGenerates != null && !apiGenerates.isEmpty()){
|
||||
for (APIGenerate apiGenerate : apiGenerates){
|
||||
String taskId = apiGenerate.getTaskId();
|
||||
PoseTransformation poseTransformation = poseTransformationMapper.selectOne(new QueryWrapper<PoseTransformation>().eq("unique_id", taskId));
|
||||
if (Objects.nonNull(poseTransformation) && "Pending".equals(poseTransformation.getTaskStatus())){
|
||||
if (Objects.nonNull(poseTransformation) && ("Pending".equals(poseTransformation.getTaskStatus()) || "Executing".equals(poseTransformation.getTaskStatus()))){
|
||||
// 判断当前任务的超时状态
|
||||
if (!DateUtil.isMoreThanOneDayApart(poseTransformation.getCreateTime())){
|
||||
try {
|
||||
@@ -122,7 +115,6 @@ public class GenerateTask {
|
||||
PoseTransformationVO animateResult = generateService.getAnimateResult(taskId);
|
||||
if (animateResult.getStatus().equals("Success")){
|
||||
log.info("补偿获取结果成功,发送系统消息");
|
||||
sendSysMsgToUser(poseTransformation.getAccountId(), "您的姿势变换生成任务已完成");
|
||||
}
|
||||
} catch (BusinessException e){
|
||||
log.warn("万相 animation 生成失败,原因:{}", e.getMessage());
|
||||
@@ -136,19 +128,13 @@ public class GenerateTask {
|
||||
apiGenerate.setStatus("Fail");
|
||||
apiGenerate.setUpdateTime(LocalDateTime.now());
|
||||
apiGenerateService.updateById(apiGenerate);
|
||||
generateService.sendSysMsgForPT(poseTransformation);
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
public void sendSysMsgToUser(Long accountId, String content){
|
||||
Notification notification = new Notification();
|
||||
notification.setType("system");
|
||||
notification.setReceiverId(accountId);
|
||||
notification.setContent(content);
|
||||
|
||||
messageCenterService.prePushMessage(notification);
|
||||
}
|
||||
|
||||
|
||||
|
||||
|
||||
@@ -87,9 +87,9 @@ public class PaymentTask {
|
||||
// !!关闭此定时器,改为提前三天站内信提醒!!
|
||||
// 提前7天向用户发送提醒邮件,每天早上8点执行
|
||||
// @Scheduled(cron = "0 0 8 * * ?")
|
||||
public void subscriptionReminder(){
|
||||
stripeService.subscriptionReminder();
|
||||
}
|
||||
// public void subscriptionReminder(){
|
||||
// stripeService.subscriptionReminder();
|
||||
// }
|
||||
|
||||
|
||||
// 如果有订阅已创建,但是没有发邮件通知的,需要主动获取回调信息并向用户发送邮件
|
||||
|
||||
@@ -0,0 +1,129 @@
|
||||
package com.ai.da.common.task;
|
||||
|
||||
import com.ai.da.common.utils.SendEmailUtil;
|
||||
import com.ai.da.mapper.primary.AccountMapper;
|
||||
import com.ai.da.mapper.primary.SubscriptionInfoMapper;
|
||||
import com.ai.da.mapper.primary.entity.Account;
|
||||
import com.ai.da.mapper.primary.entity.SubscriptionInfo;
|
||||
import com.ai.da.service.StripeService;
|
||||
import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
|
||||
import lombok.RequiredArgsConstructor;
|
||||
import lombok.extern.slf4j.Slf4j;
|
||||
|
||||
import java.time.LocalDateTime;
|
||||
import java.time.ZoneOffset;
|
||||
import java.util.ArrayList;
|
||||
import java.util.HashMap;
|
||||
import java.util.List;
|
||||
import java.util.Map;
|
||||
|
||||
@Slf4j
|
||||
@RequiredArgsConstructor
|
||||
public class SubscriptionReminderTask {
|
||||
|
||||
public final AccountMapper accountMapper;
|
||||
|
||||
public final SubscriptionInfoMapper subscriptionInfoMapper;
|
||||
|
||||
public final StripeService stripeService;
|
||||
|
||||
// 订阅类型与提前天数的映射配置
|
||||
private static final Map<String, Integer> REMINDER_DAYS_CONFIG = new HashMap<>();
|
||||
|
||||
static {
|
||||
REMINDER_DAYS_CONFIG.put("monthly", 7);
|
||||
REMINDER_DAYS_CONFIG.put("yearly", 14);
|
||||
}
|
||||
|
||||
public void subscriptionReminder() {
|
||||
// 获取所有需要通知的订阅
|
||||
List<SubscriptionInfo> subscriptionInfos = getDueSubscriptions();
|
||||
|
||||
for (SubscriptionInfo subscriptionInfo : subscriptionInfos) {
|
||||
Integer daysBefore = REMINDER_DAYS_CONFIG.get(subscriptionInfo.getType());
|
||||
if (daysBefore == null) {
|
||||
log.warn("未知的订阅类型: {}", subscriptionInfo.getType());
|
||||
continue;
|
||||
}
|
||||
|
||||
boolean success = stripeService.sendEmail(subscriptionInfo.getSubscriptionId(), "reminder_subscriber", null);
|
||||
if (success) {
|
||||
log.info("提前{}天向用户 {} 发送续订通知邮件,订阅类型: {}",
|
||||
daysBefore, subscriptionInfo.getAccountId(), subscriptionInfo.getType());
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
private List<SubscriptionInfo> getDueSubscriptions() {
|
||||
List<SubscriptionInfo> results = new ArrayList<>();
|
||||
|
||||
for (Map.Entry<String, Integer> entry : REMINDER_DAYS_CONFIG.entrySet()) {
|
||||
String subscriptionType = entry.getKey();
|
||||
int daysBefore = entry.getValue();
|
||||
|
||||
results.addAll(getSubscriptionsDueInDays(subscriptionType, daysBefore));
|
||||
}
|
||||
|
||||
return results;
|
||||
}
|
||||
|
||||
private List<SubscriptionInfo> getSubscriptionsDueInDays(String subscriptionType, int daysBefore) {
|
||||
LocalDateTime targetDate = LocalDateTime.now().plusDays(daysBefore);
|
||||
LocalDateTime startOfDay = targetDate.toLocalDate().atStartOfDay();
|
||||
LocalDateTime endOfDay = targetDate.toLocalDate().atTime(23, 59, 59);
|
||||
|
||||
long startTimestamp = startOfDay.toEpochSecond(ZoneOffset.UTC);
|
||||
long endTimestamp = endOfDay.toEpochSecond(ZoneOffset.UTC);
|
||||
|
||||
QueryWrapper<SubscriptionInfo> qw = new QueryWrapper<>();
|
||||
qw.ge("current_period_end", startTimestamp);
|
||||
qw.lt("current_period_end", endTimestamp);
|
||||
qw.eq("status", "active");
|
||||
qw.eq("subscription_type", subscriptionType);
|
||||
|
||||
return subscriptionInfoMapper.selectList(qw);
|
||||
}
|
||||
|
||||
public void trialReminder() {
|
||||
// 今天的 00:00:00 和 23:59:59
|
||||
LocalDateTime startOfDay = LocalDateTime.now().toLocalDate().atStartOfDay();
|
||||
LocalDateTime endOfDay = LocalDateTime.now().toLocalDate().atTime(23, 59, 59);
|
||||
|
||||
// 转为时间戳
|
||||
long startTimestamp = startOfDay.toEpochSecond(ZoneOffset.UTC);
|
||||
long endTimestamp = endOfDay.toEpochSecond(ZoneOffset.UTC);
|
||||
|
||||
QueryWrapper<Account> queryWrapper = new QueryWrapper<>();
|
||||
queryWrapper.lambda().gt(Account::getValidEndTime, startTimestamp)
|
||||
.lt(Account::getValidEndTime, endTimestamp)
|
||||
.eq(Account::getSystemUser, 3);
|
||||
|
||||
List<Account> accounts = accountMapper.selectList(queryWrapper);
|
||||
for (Account account : accounts) {
|
||||
String language = stripeService.getLanguage(account.getLanguage(), account.getCountry(), "reminder_trial");
|
||||
SendEmailUtil.subscriptionEmailReminder("reminder_trial", null, language, account.getUserEmail());
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
/* public void subscriptionReminder(){
|
||||
// 提前7天的 00:00:00 和 23:59:59
|
||||
LocalDateTime startOfDay = LocalDateTime.now().plusDays(7).toLocalDate().atStartOfDay();
|
||||
LocalDateTime endOfDay = LocalDateTime.now().plusDays(7).toLocalDate().atTime(23, 59, 59);
|
||||
|
||||
// 转为时间戳
|
||||
long startTimestamp = startOfDay.toEpochSecond(ZoneOffset.UTC);
|
||||
long endTimestamp = endOfDay.toEpochSecond(ZoneOffset.UTC);
|
||||
|
||||
QueryWrapper<SubscriptionInfo> qw = new QueryWrapper<>();
|
||||
qw.ge("current_period_end", startTimestamp);
|
||||
qw.lt("current_period_end", endTimestamp);
|
||||
qw.eq("status", "active");
|
||||
|
||||
List<SubscriptionInfo> subscriptionInfos = subscriptionInfoMapper.selectList(qw);
|
||||
for (SubscriptionInfo subscriptionInfo : subscriptionInfos) {
|
||||
boolean b = sendEmail(subscriptionInfo.getSubscriptionId(), "reminder", null);
|
||||
if (b) log.info("提前7天向用户 {} 发送续订通知邮件", subscriptionInfo.getAccountId());
|
||||
}
|
||||
}*/
|
||||
}
|
||||
@@ -97,6 +97,8 @@ public class RedisUtil {
|
||||
|
||||
//- - - - - - - - - - - - - - - - - - - - - set类型 - - - - - - - - - - - - - - - - - - - -
|
||||
|
||||
public final static String VIDEO_FINISHED_TASKS = "VideoFinishedTasks";
|
||||
|
||||
/**
|
||||
* 将数据放入set缓存
|
||||
*/
|
||||
|
||||
@@ -828,15 +828,31 @@ public class SendEmailUtil {
|
||||
templateUser.setTemplateID(RENEWAL_USER_CN);
|
||||
}
|
||||
break;
|
||||
case "reminder":
|
||||
case "reminder_subscriber":
|
||||
if (language.equals("ENGLISH")) {
|
||||
user.setSubject("[Code-Create] AiDA Subscription Renewal Reminder");
|
||||
templateUser.setTemplateID(RENEWAL_REMINDER_USER_EN);
|
||||
} else {
|
||||
templateUser.setTemplateID(156072L);
|
||||
} else if (language.equals("CHINESE")){
|
||||
user.setSubject("[Code-Create] AiDA续订提醒");
|
||||
templateUser.setTemplateID(RENEWAL_REMINDER_USER_CN);
|
||||
templateUser.setTemplateID(156073L);
|
||||
} else {
|
||||
user.setSubject("[Code-Create] AiDA續訂提醒");
|
||||
templateUser.setTemplateID(156074L);
|
||||
}
|
||||
break;
|
||||
case "reminder_trial":
|
||||
if (language.equals("ENGLISH")) {
|
||||
user.setSubject("[Code-Create] AiDA — Free Trial Ending");
|
||||
templateUser.setTemplateID(156075L);
|
||||
} else if (language.equals("CHINESE")){
|
||||
user.setSubject("[Code-Create] AiDA — 免费试用结束提醒");
|
||||
templateUser.setTemplateID(156076L);
|
||||
} else {
|
||||
user.setSubject("[Code-Create] AiDA — 免費試用結束提醒");
|
||||
templateUser.setTemplateID(156077L);
|
||||
}
|
||||
break;
|
||||
|
||||
default:
|
||||
log.error("unknown subscription email type");
|
||||
return false;
|
||||
@@ -855,7 +871,7 @@ public class SendEmailUtil {
|
||||
SendEmailResponse respUser = client.SendEmail(user);
|
||||
log.info("邮件主题:{},发送结果toUser###{}", user.getSubject(), SendEmailResponse.toJsonString(respUser));
|
||||
}
|
||||
if (!type.equals("reminder")) {
|
||||
if (!type.startsWith("reminder")) {
|
||||
SendEmailResponse respMerchant = client.SendEmail(merchant);
|
||||
log.info("邮件主题:{},发送结果toMerchant###{}", merchant.getSubject(), SendEmailResponse.toJsonString(respMerchant));
|
||||
}
|
||||
|
||||
@@ -3,13 +3,12 @@ package com.ai.da.controller;
|
||||
import com.ai.da.common.config.exception.BusinessException;
|
||||
import com.ai.da.common.response.PageBaseResponse;
|
||||
import com.ai.da.common.response.Response;
|
||||
import com.ai.da.mapper.primary.entity.Account;
|
||||
import com.ai.da.model.dto.*;
|
||||
import com.ai.da.model.vo.*;
|
||||
import com.ai.da.model.vo.CommentVO;
|
||||
import com.ai.da.model.vo.PortfolioVO;
|
||||
import com.ai.da.model.vo.UserLikeChooseVO;
|
||||
import com.ai.da.service.PortfolioService;
|
||||
import com.ai.da.service.UserFollowService;
|
||||
import io.swagger.annotations.Api;
|
||||
import io.swagger.annotations.ApiOperation;
|
||||
import lombok.extern.slf4j.Slf4j;
|
||||
@@ -29,6 +28,9 @@ public class PortfolioController {
|
||||
@Resource
|
||||
private PortfolioService portfolioService;
|
||||
|
||||
@Resource
|
||||
private UserFollowService userFollowService;
|
||||
|
||||
@ApiOperation(value = "发布作品集")
|
||||
@PostMapping("/publish")
|
||||
public Response<Long> publish(@RequestParam("file") MultipartFile canvas, @RequestParam("data") String data) {
|
||||
@@ -138,13 +140,13 @@ public class PortfolioController {
|
||||
@ApiOperation(value = "获取关注列表")
|
||||
@PostMapping("/getFolloweeList")
|
||||
public Response<List<AccountFollowVO>> getFolloweeList(@Valid @RequestBody GetFollowListDTO getFollowListDTO) {
|
||||
return Response.success(portfolioService.getFolloweeList(getFollowListDTO));
|
||||
return Response.success(userFollowService.getFolloweeList(getFollowListDTO));
|
||||
}
|
||||
|
||||
@ApiOperation(value = "获取粉丝列表")
|
||||
@PostMapping("/getFollowerList")
|
||||
public Response<List<AccountFollowVO>> getFollowerList(@Valid @RequestBody GetFollowListDTO getFollowListDTO) {
|
||||
return Response.success(portfolioService.getFollowerList(getFollowListDTO));
|
||||
return Response.success(userFollowService.getFollowerList(getFollowListDTO));
|
||||
}
|
||||
|
||||
|
||||
|
||||
@@ -29,7 +29,7 @@ public class PoseTransformDTO {
|
||||
@ApiModelProperty("design结果在collectionSort中的id")
|
||||
private Long parentId;
|
||||
|
||||
@ApiModelProperty("子集中的元素作为父元素")
|
||||
@ApiModelProperty("子集中的元素作为父元素,用于重新排序")
|
||||
private Long userLikeSortId;
|
||||
|
||||
@ApiModelProperty("是否默认喜欢")
|
||||
@@ -39,5 +39,5 @@ public class PoseTransformDTO {
|
||||
private String prompt;
|
||||
|
||||
@ApiModelProperty("生成模式 1.pose2video | 2.prompt2video | 3.FLFrame2video ")
|
||||
private int mode;
|
||||
private Integer mode;
|
||||
}
|
||||
|
||||
@@ -61,5 +61,5 @@ public class SubscriptionEmailParamsDTO {
|
||||
// 付款失败原因
|
||||
private String failMessage;
|
||||
|
||||
|
||||
private String days;
|
||||
}
|
||||
|
||||
@@ -95,10 +95,6 @@ public interface DesignService extends IService<Design> {
|
||||
|
||||
Integer designProcess(String processId);
|
||||
|
||||
void parseMoodboardPosition(String moodboardPosition, Long collectionIdParam);
|
||||
|
||||
void relationImageId(DesignPythonObjects objects);
|
||||
|
||||
List<CollectionSketchVO> sketchesBoundingBox(ReDesignCollectionDTO reDesignCollectionDTO);
|
||||
|
||||
List<String> getModel(List<Long> designItemIdList);
|
||||
@@ -124,6 +120,4 @@ public interface DesignService extends IService<Design> {
|
||||
Boolean cloudTaskNameUpdate(CloudTaskDTO cloudTaskDTO);
|
||||
|
||||
Boolean cloudTaskDelete(CloudTaskDTO cloudTaskDTO);
|
||||
|
||||
String getAgeGroupByProjectOrCollectionId(Long projectId, Long collectionId);
|
||||
}
|
||||
|
||||
@@ -57,6 +57,10 @@ public interface GenerateService extends IService<Generate> {
|
||||
|
||||
void processPoseTransformResult(String taskId, String gifUrl, String videoUrl, String imageUrl);
|
||||
|
||||
void processPTFailSituation(String taskId);
|
||||
|
||||
void sendSysMsgForPT(PoseTransformation poseTransformation);
|
||||
|
||||
List<PoseTransformationVO> getPoseTransformationResult(List<String> taskIdList, Long projectId, Boolean like);
|
||||
|
||||
void updatePoseTransferStatus(String taskId, String status, PoseTransformation poseTransformation);
|
||||
|
||||
@@ -27,4 +27,6 @@ public interface MessageCenterService extends IService<Notification> {
|
||||
void setReadAll(String type);
|
||||
|
||||
void publishSystemNotification(PublishSysNotificationDTO message);
|
||||
|
||||
void videoFinishedMsg(Long userId, String projectName, boolean isSuccess);
|
||||
}
|
||||
|
||||
@@ -0,0 +1,9 @@
|
||||
package com.ai.da.service;
|
||||
|
||||
import com.ai.da.mapper.primary.entity.MoodboardPosition;
|
||||
import com.baomidou.mybatisplus.extension.service.IService;
|
||||
|
||||
public interface MoodboardPositionService extends IService<MoodboardPosition> {
|
||||
|
||||
void parseMoodboardPosition(String moodboardPosition, Long collectionIdParam);
|
||||
}
|
||||
@@ -47,20 +47,8 @@ public interface PortfolioService extends IService<Portfolio> {
|
||||
|
||||
void cancelFollow(Long followeeId);
|
||||
|
||||
Long getFolloweeCount(Long accountId);
|
||||
|
||||
List<AccountFollowVO> getFolloweeList(GetFollowListDTO getFollowListDTO);
|
||||
|
||||
Long getFollowerCount(Long accountId);
|
||||
|
||||
List<AccountFollowVO> getFollowerList(GetFollowListDTO getFollowListDTO);
|
||||
|
||||
Integer getIfFollowed(Long followeeId, Long followerId);
|
||||
|
||||
Long getPortfolioCount(Long accountId);
|
||||
|
||||
List<Long> getFolloweeList(Long accountId);
|
||||
|
||||
// List<PortfolioVO> queryPortfolioByTag(String tagName, Long tagId);
|
||||
|
||||
void setPortfolioToPublic(Long portfolioId);
|
||||
|
||||
@@ -2,6 +2,7 @@ package com.ai.da.service;
|
||||
|
||||
|
||||
import com.ai.da.mapper.primary.entity.PythonTAllInfo;
|
||||
import com.ai.da.python.vo.DesignPythonObjects;
|
||||
import com.baomidou.mybatisplus.extension.service.IService;
|
||||
|
||||
/**
|
||||
@@ -14,4 +15,6 @@ public interface PythonTAllInfoService extends IService<PythonTAllInfo> {
|
||||
|
||||
|
||||
Long getImageIdByPath(String path);
|
||||
|
||||
void relationImageId(DesignPythonObjects pythonObjects);
|
||||
}
|
||||
|
||||
@@ -37,11 +37,13 @@ public interface StripeService {
|
||||
|
||||
boolean sendEmail(String subscriptionId, String type, String orderNo);
|
||||
|
||||
String getLanguage(String language, String country, String type);
|
||||
|
||||
/*void updateSubscription(String subscriptionId);
|
||||
|
||||
void resume(String subscriptionId);*/
|
||||
|
||||
void subscriptionReminder();
|
||||
// void subscriptionReminder();
|
||||
|
||||
void checkSubscriptionExpiration();
|
||||
|
||||
|
||||
@@ -0,0 +1,9 @@
|
||||
package com.ai.da.service;
|
||||
|
||||
import com.ai.da.mapper.primary.entity.ToProductImageResult;
|
||||
import com.baomidou.mybatisplus.extension.service.IService;
|
||||
|
||||
public interface ToProductImageResultService extends IService<ToProductImageResult> {
|
||||
|
||||
Long getUnlikedResultParentId(ToProductImageResult toProductImageResult, String url);
|
||||
}
|
||||
24
src/main/java/com/ai/da/service/UserFollowService.java
Normal file
24
src/main/java/com/ai/da/service/UserFollowService.java
Normal file
@@ -0,0 +1,24 @@
|
||||
package com.ai.da.service;
|
||||
|
||||
import com.ai.da.mapper.primary.entity.UserFollow;
|
||||
import com.ai.da.model.dto.GetFollowListDTO;
|
||||
import com.ai.da.model.vo.AccountFollowVO;
|
||||
import com.baomidou.mybatisplus.extension.service.IService;
|
||||
|
||||
import java.util.List;
|
||||
|
||||
public interface UserFollowService extends IService<UserFollow> {
|
||||
|
||||
Long getFollowerCount(Long accountId);
|
||||
|
||||
List<AccountFollowVO> getFollowerList(GetFollowListDTO getFollowListDTO);
|
||||
|
||||
Long getFolloweeCount(Long accountId);
|
||||
|
||||
List<AccountFollowVO> getFolloweeList(GetFollowListDTO getFollowListDTO);
|
||||
|
||||
Integer getIfFollowed(Long followeeId, Long followerId);
|
||||
|
||||
List<Long> getFolloweeList(Long accountId);
|
||||
|
||||
}
|
||||
@@ -121,6 +121,4 @@ public interface UserLikeGroupService extends IService<UserLikeGroup> {
|
||||
Boolean toProductImageElementDelete(Long id);
|
||||
|
||||
ToProductElementVO convertRelightElement(Long id);
|
||||
|
||||
Long getUnlikedResultParentId(ToProductImageResult toProductImageResult, String url);
|
||||
}
|
||||
|
||||
@@ -70,4 +70,6 @@ public interface WorkspaceService extends IService<Workspace> {
|
||||
String getProjectSexById(Long projectId);
|
||||
|
||||
String getStyleByProjectId(Long projectId);
|
||||
|
||||
String getAgeGroupByProjectOrCollectionId(Long projectId, Long collectionId);
|
||||
}
|
||||
|
||||
@@ -143,6 +143,9 @@ public class AccountServiceImpl extends ServiceImpl<AccountMapper, Account> impl
|
||||
@Resource
|
||||
private AffiliateService affiliateService;
|
||||
|
||||
@Resource
|
||||
private UserFollowService userFollowService;
|
||||
|
||||
@Override
|
||||
@Transactional(rollbackFor = Exception.class)
|
||||
public AccountPreLoginVO preLogin(AccountPreLoginDTO accountDTO) {
|
||||
@@ -261,8 +264,8 @@ public class AccountServiceImpl extends ServiceImpl<AccountMapper, Account> impl
|
||||
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()));
|
||||
response.setFolloweeCount(userFollowService.getFolloweeCount(account.getId()));
|
||||
response.setFollowerCount(userFollowService.getFollowerCount(account.getId()));
|
||||
//判断是否常用ip 不是则发邮件提示
|
||||
calculateExceptionIp(RequestInfoUtil.getIpAddress(request), account);
|
||||
return response;
|
||||
@@ -2050,8 +2053,8 @@ public class AccountServiceImpl extends ServiceImpl<AccountMapper, Account> impl
|
||||
personalHomepageVO.setAvatar(minioUtil.getPreSignedUrl(avatar, CommonConstant.MINIO_IMAGE_EXPIRE_TIME));
|
||||
|
||||
personalHomepageVO.setPortfolioCount(portfolioService.getPortfolioCount(accountId));
|
||||
personalHomepageVO.setFolloweeCount(portfolioService.getFolloweeCount(accountId));
|
||||
personalHomepageVO.setFollowerCount(portfolioService.getFollowerCount(accountId));
|
||||
personalHomepageVO.setFolloweeCount(userFollowService.getFolloweeCount(accountId));
|
||||
personalHomepageVO.setFollowerCount(userFollowService.getFollowerCount(accountId));
|
||||
personalHomepageVO.setHomepageViewCount(viewPersonalHomepageCount(0L));
|
||||
|
||||
|
||||
@@ -2061,7 +2064,7 @@ public class AccountServiceImpl extends ServiceImpl<AccountMapper, Account> impl
|
||||
// 只有本人才能看到个人主页浏览量
|
||||
personalHomepageVO.setHomepageViewCount(viewCount == null ? 0 : viewCount);
|
||||
} else {
|
||||
personalHomepageVO.setIsFollow(portfolioService.getIfFollowed(accountId, currentUserId));
|
||||
personalHomepageVO.setIsFollow(userFollowService.getIfFollowed(accountId, currentUserId));
|
||||
// 非本人浏览主页时增加浏览量
|
||||
viewsIncrease(accountId);
|
||||
}
|
||||
@@ -2925,8 +2928,8 @@ public class AccountServiceImpl extends ServiceImpl<AccountMapper, Account> impl
|
||||
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()));
|
||||
response.setFolloweeCount(userFollowService.getFolloweeCount(account.getId()));
|
||||
response.setFollowerCount(userFollowService.getFollowerCount(account.getId()));
|
||||
return response;
|
||||
} else {
|
||||
throw new IllegalArgumentException("Invalid ID token.");
|
||||
@@ -3030,8 +3033,8 @@ public class AccountServiceImpl extends ServiceImpl<AccountMapper, Account> impl
|
||||
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()));
|
||||
response.setFolloweeCount(userFollowService.getFolloweeCount(account.getId()));
|
||||
response.setFollowerCount(userFollowService.getFollowerCount(account.getId()));
|
||||
return response;
|
||||
}
|
||||
|
||||
@@ -3122,8 +3125,8 @@ public class AccountServiceImpl extends ServiceImpl<AccountMapper, Account> impl
|
||||
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()));
|
||||
response.setFolloweeCount(userFollowService.getFolloweeCount(account.getId()));
|
||||
response.setFollowerCount(userFollowService.getFollowerCount(account.getId()));
|
||||
|
||||
QueryWrapper<AccountExtend> qw = new QueryWrapper<>();
|
||||
qw.lambda().eq(AccountExtend::getAccountId, response.getUserId());
|
||||
|
||||
@@ -59,29 +59,19 @@ import java.util.stream.Collectors;
|
||||
@Service
|
||||
@RequiredArgsConstructor
|
||||
public class CollectionElementServiceImpl extends ServiceImpl<CollectionElementMapper, CollectionElement> implements CollectionElementService {
|
||||
@Resource
|
||||
private CollectionElementMapper collectionElementMapper;
|
||||
@Resource
|
||||
private FileProperties fileProperties;
|
||||
@Resource
|
||||
private PanToneService panToneService;
|
||||
@Resource
|
||||
private PythonService pythonService;
|
||||
@Resource
|
||||
private LibraryService libraryService;
|
||||
@Resource
|
||||
private SysFileService sysFileService;
|
||||
@Resource
|
||||
private GenerateMapper generateMapper;
|
||||
@Resource
|
||||
private GenerateDetailMapper generateDetailMapper;
|
||||
@Resource
|
||||
private LibraryModelPointService libraryModelPointService;
|
||||
@Resource
|
||||
private TCollectionElementRelationService tCollectionElementRelationService;
|
||||
@Resource
|
||||
private MinioUtil minioUtil;
|
||||
|
||||
private final CollectionElementMapper collectionElementMapper;
|
||||
private final EmailService emailService;
|
||||
private final FileProperties fileProperties;
|
||||
private final GenerateMapper generateMapper;
|
||||
private final GenerateDetailMapper generateDetailMapper;
|
||||
private final LibraryModelPointService libraryModelPointService;
|
||||
private final LibraryService libraryService;
|
||||
private final MinioUtil minioUtil;
|
||||
private final PanToneService panToneService;
|
||||
private final PythonService pythonService;
|
||||
private final RedisUtil redisUtil;
|
||||
private final SysFileService sysFileService;
|
||||
private final TCollectionElementRelationService tCollectionElementRelationService;
|
||||
private final WorkspaceService workspaceService;
|
||||
|
||||
@Value("${minio.bucketName.collectionElement}")
|
||||
@@ -90,13 +80,7 @@ public class CollectionElementServiceImpl extends ServiceImpl<CollectionElementM
|
||||
private String gradientBucketName;
|
||||
@Value("${minio.bucketName.users}")
|
||||
private String userBucketName;
|
||||
@Resource
|
||||
private RedisUtil redisUtil;
|
||||
|
||||
// @Resource
|
||||
// private RedisUtil redisUtil;
|
||||
@Resource
|
||||
private EmailService emailService;
|
||||
|
||||
@Transactional(rollbackFor = Exception.class)
|
||||
@Override
|
||||
|
||||
@@ -57,7 +57,7 @@ public class ConvenientInquiryServiceImpl extends ServiceImpl<QuestionnaireMappe
|
||||
@Resource
|
||||
private AccountLoginLogService accountLoginLogService;
|
||||
@Resource
|
||||
private GenerateService generateService;
|
||||
private GenerateMapper generateMapper;
|
||||
@Resource
|
||||
private ToProductImageResultMapper toProductImageResultMapper;
|
||||
@Resource
|
||||
@@ -452,7 +452,8 @@ public class ConvenientInquiryServiceImpl extends ServiceImpl<QuestionnaireMappe
|
||||
Long singleDesignTimes = designItemService.getCountByUserAndTime(startTime, endTime, ids);
|
||||
|
||||
// generate -> MoodBoard\PrintBoard\SketchBoard
|
||||
List<Map<String, Object>> countGenerate = generateService.getCountByUserAndTime(startTime, endTime, ids);
|
||||
// List<Map<String, Object>> countGenerate = generateService.getCountByUserAndTime(startTime, endTime, ids);
|
||||
List<Map<String, Object>> countGenerate = generateMapper.getByTypeAndTime(startTime, endTime, ids);
|
||||
// 使用Stream API和lambda表达式将数据合并到一个Map中
|
||||
Map<String, Long> countGenerateMerge = countGenerate.stream()
|
||||
.collect(Collectors.toMap(
|
||||
|
||||
@@ -10,6 +10,7 @@ import com.ai.da.common.enums.SingleOverallEnum;
|
||||
import com.ai.da.common.enums.SysFileLevel2TypeEnum;
|
||||
import com.ai.da.common.utils.*;
|
||||
import com.ai.da.mapper.primary.DesignItemMapper;
|
||||
import com.ai.da.mapper.primary.DesignMapper;
|
||||
import com.ai.da.mapper.primary.UserLikeMapper;
|
||||
import com.ai.da.mapper.primary.entity.*;
|
||||
import com.ai.da.model.dto.*;
|
||||
@@ -28,6 +29,7 @@ import com.fasterxml.jackson.databind.ObjectMapper;
|
||||
import com.fasterxml.jackson.databind.SerializationFeature;
|
||||
import com.google.common.collect.Lists;
|
||||
import io.netty.util.internal.StringUtil;
|
||||
import lombok.RequiredArgsConstructor;
|
||||
import lombok.extern.slf4j.Slf4j;
|
||||
import org.apache.commons.lang3.SerializationUtils;
|
||||
import org.springframework.beans.factory.annotation.Autowired;
|
||||
@@ -56,37 +58,25 @@ import java.util.stream.Collectors;
|
||||
*/
|
||||
@Slf4j
|
||||
@Service
|
||||
@RequiredArgsConstructor
|
||||
public class DesignItemServiceImpl extends ServiceImpl<DesignItemMapper, DesignItem> implements DesignItemService {
|
||||
@Resource
|
||||
private DesignItemMapper designItemMapper;
|
||||
@Resource
|
||||
private SysFileService sysFileService;
|
||||
@Resource
|
||||
private PythonService pythonService;
|
||||
@Resource
|
||||
private DesignService designService;
|
||||
@Resource
|
||||
private DesignItemDetailService designItemDetailService;
|
||||
@Resource
|
||||
private LibraryModelPointService libraryModelPointService;
|
||||
@Resource
|
||||
private LibraryService libraryService;
|
||||
@Resource
|
||||
private CollectionElementService collectionElementService;
|
||||
@Resource
|
||||
private ITDesignPythonOutfitService designPythonOutfitService;
|
||||
@Resource
|
||||
private ITDesignPythonOutfitDetailService designPythonOutfitDetailService;
|
||||
@Resource
|
||||
private PanToneService panToneService;
|
||||
@Resource
|
||||
private DesignItemDetailPrintService designItemDetailPrintService;
|
||||
@Resource
|
||||
private MinioUtil minioUtil;
|
||||
@Resource
|
||||
private UserLikeService userLikeService;
|
||||
@Resource
|
||||
private UserLikeGroupService userLikeGroupService;
|
||||
|
||||
private final CollectionElementService collectionElementService;
|
||||
private final DesignMapper designMapper;
|
||||
private final DesignItemMapper designItemMapper;
|
||||
private final DesignItemDetailService designItemDetailService;
|
||||
private final DesignItemDetailPrintService designItemDetailPrintService;
|
||||
private final ITDesignPythonOutfitService designPythonOutfitService;
|
||||
private final ITDesignPythonOutfitDetailService designPythonOutfitDetailService;
|
||||
private final LibraryService libraryService;
|
||||
private final LibraryModelPointService libraryModelPointService;
|
||||
private final MinioUtil minioUtil;
|
||||
private final PythonService pythonService;
|
||||
private final PanToneService panToneService;
|
||||
private final SysFileService sysFileService;
|
||||
private final UserLikeService userLikeService;
|
||||
private final UserLikeGroupService userLikeGroupService;
|
||||
private final WorkspaceService workspaceService;
|
||||
|
||||
@Value("${minio.bucketName.modifiedSketch}")
|
||||
private String modifiedSketchBucket;
|
||||
@@ -197,7 +187,7 @@ public class DesignItemServiceImpl extends ServiceImpl<DesignItemMapper, DesignI
|
||||
if (Objects.isNull(designItem)) {
|
||||
throw new BusinessException("designItem.not.found");
|
||||
}
|
||||
Design design = designService.getById(designItem.getDesignId());
|
||||
Design design = designMapper.selectById(designItem.getDesignId());
|
||||
if (Objects.isNull(design)) {
|
||||
throw new BusinessException("design.not.found");
|
||||
}
|
||||
@@ -247,7 +237,7 @@ public class DesignItemServiceImpl extends ServiceImpl<DesignItemMapper, DesignI
|
||||
if (Objects.isNull(designItem)) {
|
||||
throw new BusinessException("designItem.not.found");
|
||||
}
|
||||
Design design = designService.getById(designItem.getDesignId());
|
||||
Design design = designMapper.selectById(designItem.getDesignId());
|
||||
if (Objects.isNull(design)) {
|
||||
throw new BusinessException("design.not.found");
|
||||
}
|
||||
@@ -284,6 +274,7 @@ public class DesignItemServiceImpl extends ServiceImpl<DesignItemMapper, DesignI
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
// todo check这个方法是否还在用
|
||||
private DesignCollectionItemVO saveSingleDesignItemAndDetail(DesignPythonObjects pythonObjects
|
||||
, Long designId, Long designItemId, Long collectionId, AuthPrincipalVo userInfo, String timeZone) {
|
||||
@@ -631,7 +622,7 @@ public class DesignItemServiceImpl extends ServiceImpl<DesignItemMapper, DesignI
|
||||
if (Objects.isNull(designItem)) {
|
||||
throw new BusinessException("designItem.not.found");
|
||||
}
|
||||
Design design = designService.getById(designItem.getDesignId());
|
||||
Design design = designMapper.selectById(designItem.getDesignId());
|
||||
if (Objects.isNull(design)) {
|
||||
throw new BusinessException("design.not.found");
|
||||
}
|
||||
@@ -874,7 +865,8 @@ public class DesignItemServiceImpl extends ServiceImpl<DesignItemMapper, DesignI
|
||||
JSONObject jsonObject = layers.getJSONObject(i);
|
||||
String priority = jsonObject.getString("priority");
|
||||
String category = jsonObject.getString("image_category").split("_")[0];
|
||||
if (!category.equals("body") && !priorityAndLayer.containsKey(priority)) priorityAndLayer.put(priority, Arrays.asList(jsonObject.getString("pattern_overall_image_url"), jsonObject.getString("pattern_print_image_url")));
|
||||
if (!category.equals("body") && !priorityAndLayer.containsKey(priority))
|
||||
priorityAndLayer.put(priority, Arrays.asList(jsonObject.getString("pattern_overall_image_url"), jsonObject.getString("pattern_print_image_url")));
|
||||
}
|
||||
return priorityAndLayer;
|
||||
}
|
||||
@@ -886,7 +878,8 @@ public class DesignItemServiceImpl extends ServiceImpl<DesignItemMapper, DesignI
|
||||
for (int i = 0; i < layers.size(); i++) {
|
||||
JSONObject jsonObject = layers.getJSONObject(i);
|
||||
String category = jsonObject.getString("image_category").split("_")[0];
|
||||
if (!category.equals("body") && !typeAndLayer.containsKey(category)) typeAndLayer.put(category, jsonObject.getString("pattern_image_url"));
|
||||
if (!category.equals("body") && !typeAndLayer.containsKey(category))
|
||||
typeAndLayer.put(category, jsonObject.getString("pattern_image_url"));
|
||||
}
|
||||
return typeAndLayer;
|
||||
}
|
||||
@@ -976,6 +969,7 @@ public class DesignItemServiceImpl extends ServiceImpl<DesignItemMapper, DesignI
|
||||
userLikeGroupService.updateDate(userLikeGroupId, timeZone);
|
||||
}
|
||||
}
|
||||
|
||||
private void updateUserLikeConvertStatus(Long designItemId, String timeZone) {
|
||||
UserLike userLike = userLikeService.getByDesignItemId(designItemId);
|
||||
if (!ObjectUtil.isEmpty(userLike) && userLike.getConverted() == 0) {
|
||||
@@ -1016,7 +1010,8 @@ public class DesignItemServiceImpl extends ServiceImpl<DesignItemMapper, DesignI
|
||||
// 重置sketch的minio临时访问凭证
|
||||
designItemClothesDetailVO.setPath(minioUtil.getPreSignedUrl(singleItem.getPath(), 24 * 60, true));
|
||||
designItemClothesDetailVO.setMinIOPath(singleItem.getPath());
|
||||
if (!StringUtil.isNullOrEmpty(singleItem.getColor())) designItemClothesDetailVO.setColor(panToneService.getPantoneByRgb(singleItem.getColor()));
|
||||
if (!StringUtil.isNullOrEmpty(singleItem.getColor()))
|
||||
designItemClothesDetailVO.setColor(panToneService.getPantoneByRgb(singleItem.getColor()));
|
||||
designItemClothesDetailVO.setPrintObject(singleItem.getPrintObject());
|
||||
designItemClothesDetailVO.setTrims(singleItem.getTrims());
|
||||
designItemClothesDetailVO.setLayersObject(layersObject.stream().filter(
|
||||
@@ -1193,7 +1188,7 @@ public class DesignItemServiceImpl extends ServiceImpl<DesignItemMapper, DesignI
|
||||
library.setLevel1Type(CollectionLevel1TypeEnum.SKETCH_BOARD.getRealName());
|
||||
library.setLevel2Type(designSingleItem.getType());
|
||||
library.setLevel3Type(designSingleIncludeLayersDTO.getGender());
|
||||
String ageGroup = designService.getAgeGroupByProjectOrCollectionId(designSingleIncludeLayersDTO.getProjectId(), null);
|
||||
String ageGroup = workspaceService.getAgeGroupByProjectOrCollectionId(designSingleIncludeLayersDTO.getProjectId(), null);
|
||||
library.setAgeGroup(ageGroup);
|
||||
library.setUrl(designSingleItem.getPath());
|
||||
library.setName(LocalDate.now().format(DateTimeFormatter.ofPattern("yyyyMMdd")));
|
||||
@@ -1260,6 +1255,7 @@ public class DesignItemServiceImpl extends ServiceImpl<DesignItemMapper, DesignI
|
||||
|
||||
@Resource
|
||||
private UserLikeMapper userLikeMapper;
|
||||
|
||||
@Override
|
||||
public void convertHistoryMaskWithoutGradient() {
|
||||
// 1、获取全部需要转换的designOutfitId
|
||||
|
||||
@@ -30,6 +30,7 @@ import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
|
||||
import com.google.common.base.Function;
|
||||
import com.google.common.collect.Lists;
|
||||
import io.netty.util.internal.StringUtil;
|
||||
import lombok.RequiredArgsConstructor;
|
||||
import lombok.extern.slf4j.Slf4j;
|
||||
import okhttp3.*;
|
||||
import org.springframework.beans.factory.annotation.Value;
|
||||
@@ -61,56 +62,47 @@ import static com.ai.da.python.vo.DesignPythonItem.*;
|
||||
*/
|
||||
@Slf4j
|
||||
@Service
|
||||
@RequiredArgsConstructor
|
||||
public class DesignServiceImpl extends ServiceImpl<DesignMapper, Design> implements DesignService {
|
||||
@Resource
|
||||
private DesignMapper designMapper;
|
||||
@Resource
|
||||
private CollectionElementService collectionElementService;
|
||||
@Resource
|
||||
private CollectionService collectionService;
|
||||
@Resource
|
||||
private PythonService pythonService;
|
||||
@Resource
|
||||
private LibraryService libraryService;
|
||||
@Resource
|
||||
private GenerateDetailMapper generateDetailMapper;
|
||||
@Resource
|
||||
private DesignItemService designItemService;
|
||||
@Resource
|
||||
private DesignItemDetailService designItemDetailService;
|
||||
@Resource
|
||||
private FileProperties fileProperties;
|
||||
@Resource
|
||||
private UserLikeGroupService userLikeGroupService;
|
||||
@Resource
|
||||
private UserLikeService userLikeService;
|
||||
@Resource
|
||||
private SysFileService sysFileService;
|
||||
@Resource
|
||||
private TCollectionElementRelationService tCollectionElementRelationService;
|
||||
@Resource
|
||||
private ITDesignPythonOutfitService designPythonOutfitService;
|
||||
@Resource
|
||||
private ITDesignPythonOutfitDetailService designPythonOutfitDetailService;
|
||||
@Resource
|
||||
private PanToneService panToneService;
|
||||
@Resource
|
||||
private PythonTAllInfoService pythonTAllInfoService;
|
||||
@Resource
|
||||
private DesignItemDetailPrintService designItemDetailPrintService;
|
||||
|
||||
@Resource
|
||||
private TDesignPythonOutfitMapper designPythonOutfitMapper;
|
||||
@Resource
|
||||
private DesignItemDetailMapper designItemDetailMapper;
|
||||
@Resource
|
||||
private ToProductImageResultMapper toProductImageResultMapper;
|
||||
@Resource
|
||||
private ToProductElementMapper toProductElementMapper;
|
||||
@Resource
|
||||
private MoodboardPositionMapper moodboardPositionMapper;
|
||||
@Resource
|
||||
private CollectionSortService collectionSortService;
|
||||
private final CloudTaskMapper cloudTaskMapper;
|
||||
private final CloudTaskService cloudTaskService;
|
||||
private final CreditsService creditsService;
|
||||
private final CollectionElementService collectionElementService;
|
||||
private final CollectionService collectionService;
|
||||
private final CollectionSortService collectionSortService;
|
||||
private final ColorLoopUpTableService colorLoopUpTableService;
|
||||
private final CollectionElementRelModelMapper collectionElementRelModelMapper;
|
||||
private final DesignBatchMapper designBatchMapper;
|
||||
private final DesignMapper designMapper;
|
||||
private final DesignItemService designItemService;
|
||||
private final DesignItemDetailMapper designItemDetailMapper;
|
||||
private final DesignItemDetailService designItemDetailService;
|
||||
private final DesignItemDetailPrintService designItemDetailPrintService;
|
||||
private final TDesignPythonOutfitMapper designPythonOutfitMapper;
|
||||
private final ITDesignPythonOutfitService designPythonOutfitService;
|
||||
private final ITDesignPythonOutfitDetailService designPythonOutfitDetailService;
|
||||
private final FileProperties fileProperties;
|
||||
private final GenerateDetailMapper generateDetailMapper;
|
||||
private final LibraryService libraryService;
|
||||
private final MinioUtil minioUtil;
|
||||
private final MoodboardPositionMapper moodboardPositionMapper;
|
||||
private final ProjectService projectService;
|
||||
private final PythonService pythonService;
|
||||
private final PanToneMapper panToneMapper;
|
||||
private final PanToneService panToneService;
|
||||
private final PoseTransformationMapper poseTransformationMapper;
|
||||
private final PythonTAllInfoService pythonTAllInfoService;
|
||||
private final RedisUtil redisUtil;
|
||||
private final SysFileService sysFileService;
|
||||
private final TCollectionElementRelationService tCollectionElementRelationService;
|
||||
private final ToProductImageResultMapper toProductImageResultMapper;
|
||||
private final ToProductElementMapper toProductElementMapper;
|
||||
private final ToProductImageRecordMapper toProductImageRecordMapper;
|
||||
private final UserLikeGroupService userLikeGroupService;
|
||||
private final UserLikeService userLikeService;
|
||||
private final UserBehaviorMapper userBehaviorMapper;
|
||||
private final UserPreferenceLogMapper userPreferenceLogMapper;
|
||||
private final WorkspaceService workspaceService;
|
||||
|
||||
@Value("${minio.endpoint}")
|
||||
private String endpoint;
|
||||
@@ -123,34 +115,6 @@ public class DesignServiceImpl extends ServiceImpl<DesignMapper, Design> impleme
|
||||
@Value("${access.python.port:''}")
|
||||
private String accessPythonPort;
|
||||
|
||||
@Resource
|
||||
private RedisUtil redisUtil;
|
||||
@Resource
|
||||
private PoseTransformationMapper poseTransformationMapper;
|
||||
|
||||
@Resource
|
||||
private DesignBatchMapper designBatchMapper;
|
||||
@Resource
|
||||
private ProjectService projectService;
|
||||
@Resource
|
||||
private WorkspaceService workspaceService;
|
||||
@Resource
|
||||
private CloudTaskMapper cloudTaskMapper;
|
||||
@Resource
|
||||
private CloudTaskService cloudTaskService;
|
||||
@Resource
|
||||
private CreditsService creditsService;
|
||||
@Resource
|
||||
private ToProductImageRecordMapper toProductImageRecordMapper;
|
||||
@Resource
|
||||
private ColorLoopUpTableService colorLoopUpTableService;
|
||||
@Resource
|
||||
private UserBehaviorMapper userBehaviorMapper;
|
||||
@Resource
|
||||
private UserPreferenceLogMapper userPreferenceLogMapper;
|
||||
@Resource
|
||||
private CollectionElementRelModelMapper collectionElementRelModelMapper;
|
||||
|
||||
private final ConcurrentHashMap<String, Map<String, Object>> designContext = new ConcurrentHashMap<>();
|
||||
|
||||
|
||||
@@ -323,11 +287,11 @@ public class DesignServiceImpl extends ServiceImpl<DesignMapper, Design> impleme
|
||||
// List<Long> reLationelementIds = reLationelements.stream().map(CollectionElement::getId).collect(Collectors.toList());
|
||||
// handleCollectionElementRelation(collectionId, (null == collectionIdParam) ? false : true, reLationelementIds);
|
||||
// //保存python返回信息
|
||||
|
||||
/// / return savePythonDesignItemAndDetail(pythonObjects,designId,collectionId,userInfo,designDTO.getTimeZone(),responseJSONObject);
|
||||
// //保存designItem 和detail
|
||||
// return saveDesignItemAndDetail(pythonObjects, designId, collectionId, userInfo, designDTO.getTimeZone());
|
||||
// }
|
||||
|
||||
private String designOrRedesignOperateNew(DesignCollectionDTO designDTO, AuthPrincipalVo userInfo,
|
||||
Long collectionIdParam, ValidateElementVO elementVO) {
|
||||
// if (CollectionUtil.isNotEmpty(designDTO.getSketchBoards())) {
|
||||
@@ -388,7 +352,7 @@ public class DesignServiceImpl extends ServiceImpl<DesignMapper, Design> impleme
|
||||
|
||||
// 生成library - 根据设计元素生成设计库信息
|
||||
startTime = System.currentTimeMillis();
|
||||
String ageGroup = getAgeGroupByProjectOrCollectionId(designDTO.getProjectId(), collectionId);
|
||||
String ageGroup = workspaceService.getAgeGroupByProjectOrCollectionId(designDTO.getProjectId(), collectionId);
|
||||
generateLibrary(elementVO, designDTO.getTimeZone(), ageGroup);
|
||||
//处理关联关系,修复element覆盖得情况
|
||||
// List<CollectionElement> relationElements = collectionElementService.getByOnlyCollectionId(collectionId);
|
||||
@@ -419,124 +383,6 @@ public class DesignServiceImpl extends ServiceImpl<DesignMapper, Design> impleme
|
||||
return requestId;
|
||||
}
|
||||
|
||||
public String getAgeGroupByProjectOrCollectionId(Long projectId, Long collectionId){
|
||||
if (Objects.nonNull(projectId)){
|
||||
Workspace workspace = workspaceService.getWSByProjectId(projectId);
|
||||
if (workspace != null && !StringUtil.isNullOrEmpty(workspace.getAgeGroup())){
|
||||
return workspace.getAgeGroup();
|
||||
}
|
||||
} else if (Objects.nonNull(collectionId) && collectionId != 0){
|
||||
List<CollectionElement> byCollectionId = collectionElementService.getByCollectionId(collectionId);
|
||||
if (byCollectionId != null && !byCollectionId.isEmpty()){
|
||||
projectId = byCollectionId.get(0).getProjectId();
|
||||
if (projectId != null && projectId != 0L){
|
||||
Workspace workspace = workspaceService.getWSByProjectId(projectId);
|
||||
if (workspace != null && !StringUtil.isNullOrEmpty(workspace.getAgeGroup())){
|
||||
return workspace.getAgeGroup();
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
return AgeGroup.ADULT.getValue();
|
||||
}
|
||||
|
||||
@Override
|
||||
public void parseMoodboardPosition(String moodboardPosition, Long collectionIdParam) {
|
||||
if (!StringUtils.isEmpty(moodboardPosition)) {
|
||||
// 将 JSON 字符串解析为 JSONObject
|
||||
JSONObject moodboardPositionJson = JSONObject.parseObject(moodboardPosition);
|
||||
|
||||
// 准备保存的 MoodboardPosition 列表
|
||||
List<MoodboardPosition> moodboardPositions = new ArrayList<>();
|
||||
|
||||
// 遍历 JSON 对象的 key(即样式类型)
|
||||
for (String key : moodboardPositionJson.keySet()) {
|
||||
// 特殊处理 "class" 字段
|
||||
if ("class".equals(key)) {
|
||||
// 获取 "class" 字段的值并将其转为 List<String>
|
||||
JSONArray classArray = moodboardPositionJson.getJSONArray(key);
|
||||
if (classArray != null) {
|
||||
|
||||
for (int j = 0; j < classArray.size(); j++) {
|
||||
// 将 classList 存入 MoodboardPosition(或者其他结构)
|
||||
|
||||
MoodboardPosition position = new MoodboardPosition()
|
||||
.setCollectionId(collectionIdParam) // 关联 Collection ID
|
||||
.setType(key) // 样式类型
|
||||
.setStyleData(classArray.getString(j)) // 设置 class 字段
|
||||
.setSequence(j) // 根据索引值设置顺序
|
||||
.setCreateTime(LocalDateTime.now()) // 创建时间
|
||||
.setUpdateTime(LocalDateTime.now()); // 更新时间
|
||||
|
||||
// 添加到列表中
|
||||
moodboardPositions.add(position);
|
||||
}
|
||||
}
|
||||
continue; // 跳过 "class" 字段的常规处理
|
||||
}
|
||||
|
||||
JSONArray styleArray = moodboardPositionJson.getJSONArray(key);
|
||||
if (styleArray != null) {
|
||||
for (int i = 0; i < styleArray.size(); i++) {
|
||||
// 获取当前样式数据
|
||||
JSONObject styleData = styleArray.getJSONObject(i);
|
||||
|
||||
// 构建 MoodboardPosition 实例
|
||||
MoodboardPosition position = new MoodboardPosition()
|
||||
.setCollectionId(collectionIdParam) // 关联 Collection ID
|
||||
.setType(key) // 样式类型
|
||||
.setStyleData(styleData.toJSONString()) // 样式数据存为 JSON 字符串
|
||||
.setSequence(i) // 根据索引值设置顺序
|
||||
.setCreateTime(LocalDateTime.now()) // 创建时间
|
||||
.setUpdateTime(LocalDateTime.now()); // 更新时间
|
||||
|
||||
// 添加到列表中
|
||||
moodboardPositions.add(position);
|
||||
}
|
||||
}
|
||||
}
|
||||
// 如果解析结果非空,保存到数据库
|
||||
if (!moodboardPositions.isEmpty()) {
|
||||
for (MoodboardPosition position : moodboardPositions) {
|
||||
moodboardPositionMapper.insert(position);
|
||||
}
|
||||
log.info("成功解析并保存 {} 条 MoodboardPosition 数据", moodboardPositions.size());
|
||||
} else {
|
||||
log.warn("未找到可保存的 MoodboardPosition 数据");
|
||||
}
|
||||
} else {
|
||||
log.warn("传入的 moodboardPosition 字段为空");
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
@Override
|
||||
public void relationImageId(DesignPythonObjects pythonObjects) {
|
||||
if (Objects.isNull(pythonObjects)) {
|
||||
return;
|
||||
}
|
||||
pythonObjects.getObjects().forEach(
|
||||
o -> {
|
||||
for (DesignPythonItem item : o.getItems()) {
|
||||
List<Long> list = new ArrayList<>();
|
||||
list.add(1L);
|
||||
list.add(1L);
|
||||
item.setOffset(list);
|
||||
item.setResize_scale(new Float[]{1.0f,1.0f});
|
||||
String path = item.getPath();
|
||||
if (StringUtils.isEmpty(path)) {
|
||||
String bodyPath = item.getBody_path();
|
||||
Long imageId = pythonTAllInfoService.getImageIdByPath(bodyPath);
|
||||
item.setImage_id(imageId);
|
||||
} else {
|
||||
Long imageId = pythonTAllInfoService.getImageIdByPath(path);
|
||||
item.setImage_id(imageId);
|
||||
}
|
||||
}
|
||||
}
|
||||
);
|
||||
}
|
||||
|
||||
@Override
|
||||
public List<CollectionSketchVO> sketchesBoundingBox(ReDesignCollectionDTO reDesignDTO) {
|
||||
List<CollectionSketchDTO> sketchBoards = new ArrayList<>();
|
||||
@@ -757,8 +603,6 @@ public class DesignServiceImpl extends ServiceImpl<DesignMapper, Design> impleme
|
||||
LocalCacheUtils.setDesignProcessCache(userId, saveNames);
|
||||
}
|
||||
|
||||
@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");
|
||||
@@ -928,6 +772,7 @@ public class DesignServiceImpl extends ServiceImpl<DesignMapper, Design> impleme
|
||||
}
|
||||
return response;
|
||||
}
|
||||
|
||||
private DesignCollectionVO savePythonDesignItemAndDetail(DesignPythonObjects pythonObjects
|
||||
, Long designId, Long collectionId, AuthPrincipalVo userInfo, String timeZone, JSONObject responseJSONObject, String singleOverall) {
|
||||
DesignCollectionVO response = new DesignCollectionVO();
|
||||
@@ -1197,7 +1042,7 @@ public class DesignServiceImpl extends ServiceImpl<DesignMapper, Design> impleme
|
||||
@Override
|
||||
@Transactional(rollbackFor = Exception.class)
|
||||
public DesignLikeVO like(DesignLikeDTO designLikeDTO) {
|
||||
Long userGroupId = designLikeDTO.getUserGroupId();;
|
||||
Long userGroupId = designLikeDTO.getUserGroupId();
|
||||
Long groupDetailId;
|
||||
AuthPrincipalVo userInfo = UserContext.getUserHolder();
|
||||
DesignItem designItem = designItemService.getById(designLikeDTO.getDesignItemId());
|
||||
@@ -2526,7 +2371,7 @@ public class DesignServiceImpl extends ServiceImpl<DesignMapper, Design> impleme
|
||||
log.info("design python端运行时间:" + totalTimeInSeconds + " 秒");
|
||||
//生成library
|
||||
startTime = System.currentTimeMillis();
|
||||
String ageGroup = getAgeGroupByProjectOrCollectionId(designDTO.getProjectId(), collectionId);
|
||||
String ageGroup = workspaceService.getAgeGroupByProjectOrCollectionId(designDTO.getProjectId(), collectionId);
|
||||
generateLibrary(elementVO, designDTO.getTimeZone(), ageGroup);
|
||||
//处理关联关系,修复element覆盖得情况
|
||||
// List<CollectionElement> relationElements = collectionElementService.getByOnlyCollectionId(collectionId);
|
||||
@@ -2902,9 +2747,6 @@ public class DesignServiceImpl extends ServiceImpl<DesignMapper, Design> impleme
|
||||
return result;
|
||||
}
|
||||
|
||||
@Resource
|
||||
private PanToneMapper panToneMapper;
|
||||
|
||||
@Override
|
||||
public Boolean receiveDesignParams(ReceiveDesignParam receiveDesignParam) {
|
||||
List<ReceiveCollectionElement> receiveCollectionElementList = receiveDesignParam.getReceiveCollectionElementList();
|
||||
|
||||
@@ -634,7 +634,7 @@ public class EmailServiceImpl implements EmailService {
|
||||
userTemplate = RENEWAL_USER_CN;
|
||||
}
|
||||
break;
|
||||
case "reminder":
|
||||
/*case "reminder":
|
||||
if (language.equals("ENGLISH")) {
|
||||
userSubject = "[Code-Create] AiDA Subscription Renewal Reminder";
|
||||
userTemplate = RENEWAL_REMINDER_USER_EN;
|
||||
@@ -642,6 +642,30 @@ public class EmailServiceImpl implements EmailService {
|
||||
userSubject = "[Code-Create] AiDA续订提醒";
|
||||
userTemplate = RENEWAL_REMINDER_USER_CN;
|
||||
}
|
||||
break;*/
|
||||
case "reminder_subscriber":
|
||||
if (language.equals("ENGLISH")) {
|
||||
userSubject = "[Code-Create] AiDA Subscription Renewal Reminder";
|
||||
userTemplate = String.valueOf(156072L);
|
||||
} else if (language.equals("CHINESE")){
|
||||
userSubject = "[Code-Create] AiDA续订提醒";
|
||||
userTemplate = String.valueOf(156073L);
|
||||
} else {
|
||||
userSubject = "[Code-Create] AiDA續訂提醒";
|
||||
userTemplate = String.valueOf(156074L);
|
||||
}
|
||||
break;
|
||||
case "reminder_trial":
|
||||
if (language.equals("ENGLISH")) {
|
||||
userSubject = "[Code-Create] AiDA — Free Trial Ending";
|
||||
userTemplate = String.valueOf(156075L);
|
||||
} else if (language.equals("CHINESE")){
|
||||
userSubject = "[Code-Create] AiDA — 免费试用结束提醒";
|
||||
userTemplate = String.valueOf(156076L);
|
||||
} else {
|
||||
userSubject = "[Code-Create] AiDA — 免費試用結束提醒";
|
||||
userTemplate = String.valueOf(156077L);
|
||||
}
|
||||
break;
|
||||
default:
|
||||
log.error("unknown subscription email type");
|
||||
@@ -654,7 +678,7 @@ public class EmailServiceImpl implements EmailService {
|
||||
sendEmail(Collections.singletonList(receiverAddress), jsonObject, userTemplate, userSubject, null, null);
|
||||
}
|
||||
// 排除不向商家发送邮件的情况
|
||||
if (!type.equals("reminder")) {
|
||||
if (!type.startsWith("reminder")) {
|
||||
sendEmail(merchantReceiver, jsonObject, merchantTemplate, merchantSubject, null, null);
|
||||
}
|
||||
return true;
|
||||
|
||||
@@ -44,6 +44,7 @@ import com.volcengine.ark.runtime.model.images.generation.ImagesResponse;
|
||||
import com.volcengine.ark.runtime.service.ArkService;
|
||||
import io.minio.errors.MinioException;
|
||||
import io.netty.util.internal.StringUtil;
|
||||
import lombok.RequiredArgsConstructor;
|
||||
import lombok.extern.slf4j.Slf4j;
|
||||
import okhttp3.*;
|
||||
import org.apache.commons.io.IOUtils;
|
||||
@@ -77,6 +78,7 @@ import java.util.regex.Pattern;
|
||||
|
||||
import static com.ai.da.common.enums.CollectionLevel1TypeEnum.*;
|
||||
import static com.ai.da.common.enums.CreditsEventsEnum.PATTERN;
|
||||
import static com.ai.da.common.enums.CreditsEventsEnum.POSE_TRANSFORMATION;
|
||||
import static com.ai.da.common.enums.CreditsEventsEnum.TO_PRODUCT_IMAGE;
|
||||
import static com.ai.da.common.enums.CreditsEventsEnum.TO_PRODUCT_IMAGE_ADVANCED;
|
||||
import static com.ai.da.common.enums.WangXiangTaskStatusEnum.FAILED;
|
||||
@@ -84,59 +86,34 @@ import static com.ai.da.common.enums.WangXiangTaskStatusEnum.UNKNOWN_W;
|
||||
|
||||
@Slf4j
|
||||
@Service
|
||||
@RequiredArgsConstructor
|
||||
public class GenerateServiceImpl extends ServiceImpl<GenerateMapper, Generate> implements GenerateService {
|
||||
|
||||
@Resource
|
||||
private CollectionElementMapper collectionElementMapper;
|
||||
@Resource
|
||||
private GenerateDetailMapper generateDetailMapper;
|
||||
@Resource
|
||||
private LibraryService libraryService;
|
||||
@Resource
|
||||
private PythonService pythonService;
|
||||
@Resource
|
||||
private CollectionElementService collectionElementService;
|
||||
@Resource
|
||||
private CreditsService creditsService;
|
||||
@Resource
|
||||
private MinioUtil minioUtil;
|
||||
@Resource
|
||||
private RabbitMQService rabbitMQService;
|
||||
@Resource
|
||||
private RedisUtil redisUtil;
|
||||
@Resource
|
||||
private GenerateCancelMapper generateCancelMapper;
|
||||
@Resource
|
||||
private SketchReconstructionMapper sketchReconstructionMapper;
|
||||
@Resource
|
||||
private SendRequestUtil sendRequestUtil;
|
||||
@Resource
|
||||
private ProjectService projectService;
|
||||
@Resource
|
||||
private CollectionSortService collectionSortService;
|
||||
@Resource
|
||||
private CloudTaskService cloudTaskService;
|
||||
@Resource
|
||||
private APIGenerateMapper apiGenerateMapper;
|
||||
@Resource
|
||||
private CollectionSortMapper collectionSortMapper;
|
||||
@Resource
|
||||
private SysFileService sysFileService;
|
||||
@Resource
|
||||
private LibraryModelPointService libraryModelPointService;
|
||||
@Resource
|
||||
private PoseTransformationMapper poseTransformationMapper;
|
||||
@Resource
|
||||
private CloudTaskMapper cloudTaskMapper;
|
||||
@Resource
|
||||
private ToProductImageResultMapper toProductImageResultMapper;
|
||||
@Resource
|
||||
private AccountService accountService;
|
||||
@Resource
|
||||
private APIGenerateService apiGenerateService;
|
||||
@Resource
|
||||
private UserLikeGroupService userLikeGroupService;
|
||||
|
||||
private final AccountService accountService;
|
||||
private final APIGenerateService apiGenerateService;
|
||||
private final CollectionElementMapper collectionElementMapper;
|
||||
private final CollectionElementService collectionElementService;
|
||||
private final CreditsService creditsService;
|
||||
private final CollectionSortMapper collectionSortMapper;
|
||||
private final CollectionSortService collectionSortService;
|
||||
private final CloudTaskMapper cloudTaskMapper;
|
||||
private final CloudTaskService cloudTaskService;
|
||||
private final GenerateCancelMapper generateCancelMapper;
|
||||
private final GenerateDetailMapper generateDetailMapper;
|
||||
private final LibraryService libraryService;
|
||||
// private final LibraryModelPointService libraryModelPointService;
|
||||
private final MinioUtil minioUtil;
|
||||
private final MessageCenterService messageCenterService;
|
||||
private final PythonService pythonService;
|
||||
private final ProjectService projectService;
|
||||
private final PoseTransformationMapper poseTransformationMapper;
|
||||
private final RabbitMQService rabbitMQService;
|
||||
private final RedisUtil redisUtil;
|
||||
private final SketchReconstructionMapper sketchReconstructionMapper;
|
||||
private final SendRequestUtil sendRequestUtil;
|
||||
private final SysFileService sysFileService;
|
||||
private final ToProductImageResultMapper toProductImageResultMapper;
|
||||
private final ToProductImageResultService toProductImageResultService;
|
||||
@Value("${redis.key.orderForGenerate}")
|
||||
private String consumptionOrderKey;
|
||||
|
||||
@@ -2472,6 +2449,9 @@ public class GenerateServiceImpl extends ServiceImpl<GenerateMapper, Generate> i
|
||||
}
|
||||
|
||||
public ToProductImageResultVO poseTransform(PoseTransformDTO poseTransformDTO) {
|
||||
// 参数判断
|
||||
handleMotionParams(poseTransformDTO);
|
||||
|
||||
Long accountId = UserContext.getUserHolder().getId();
|
||||
Long projectId = poseTransformDTO.getProjectId();
|
||||
String productImage = poseTransformDTO.getProductImage();
|
||||
@@ -2490,6 +2470,7 @@ public class GenerateServiceImpl extends ServiceImpl<GenerateMapper, Generate> i
|
||||
Boolean isRequestSuccess = false;
|
||||
PoseTransformation poseTransformation = new PoseTransformation();
|
||||
if (!StringUtil.isNullOrEmpty(poseTransformDTO.getModelName()) && poseTransformDTO.getModelName().equals("wx")) {
|
||||
// 请求生成视频
|
||||
taskId = animateAnyone(poseTransformDTO, accountId);
|
||||
if (!StringUtil.isNullOrEmpty(taskId)) {
|
||||
isRequestSuccess = true;
|
||||
@@ -2503,6 +2484,7 @@ public class GenerateServiceImpl extends ServiceImpl<GenerateMapper, Generate> i
|
||||
com.alibaba.fastjson.JSONObject params = createParamsForMotion(poseTransformDTO, taskId);
|
||||
String api = params.getString("api");
|
||||
params.remove("api");
|
||||
// 请求生成视频
|
||||
isRequestSuccess = pythonService.poseTransformation(params, api);
|
||||
}
|
||||
|
||||
@@ -2557,27 +2539,39 @@ public class GenerateServiceImpl extends ServiceImpl<GenerateMapper, Generate> i
|
||||
throw new BusinessException("pose.transformation.error", ResultEnum.ERROR.getCode());
|
||||
}
|
||||
|
||||
private void handleMotionParams(PoseTransformDTO poseTransformDTO) {
|
||||
if (Objects.isNull(poseTransformDTO.getMode()) || poseTransformDTO.getMode() == 0) {
|
||||
throw new BusinessException("Mode cannot be empty");
|
||||
}
|
||||
MotionModeEnum motionModeEnum = MotionModeEnum.of(poseTransformDTO.getMode());
|
||||
if (Objects.isNull(motionModeEnum)) {
|
||||
throw new BusinessException("unknown.mode");
|
||||
}
|
||||
if (poseTransformDTO.getMode() == 1 && Objects.isNull(poseTransformDTO.getPoseId())) {
|
||||
throw new BusinessException("Please choose a pose");
|
||||
}
|
||||
if (poseTransformDTO.getMode() == 3 && StringUtil.isNullOrEmpty(poseTransformDTO.getLastFrameProductImage())) {
|
||||
throw new BusinessException("Last frame cannot be empty");
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
private CollectionSort addPoseTransferLike(PoseTransformDTO poseTransformDTO, Long poseTransformationId) {
|
||||
if (Objects.nonNull(poseTransformDTO.getParentId())
|
||||
&& !poseTransformDTO.getParentId().equals(0L)) {
|
||||
return disOrLikePose(poseTransformationId, "like",
|
||||
poseTransformDTO.getProjectId(), poseTransformDTO.getUserLikeSortId());
|
||||
poseTransformDTO.getProjectId(), poseTransformDTO.getParentId());
|
||||
}
|
||||
return null;
|
||||
}
|
||||
|
||||
public void processPoseTransformResult(String taskId, String gifUrl, String videoUrl, String imageUrl) {
|
||||
// 1、存储模型返回的数据
|
||||
PoseTransformation poseTransformation;
|
||||
QueryWrapper<PoseTransformation> qw = new QueryWrapper<>();
|
||||
qw.eq("unique_id", taskId);
|
||||
List<PoseTransformation> poseTransformations = poseTransformationMapper.selectList(qw);
|
||||
if (poseTransformations != null && poseTransformations.size() > 1) {
|
||||
log.warn("通过taskId {} 查询到的PoseTransformation的结果不止一条", taskId);
|
||||
} else if (poseTransformations == null || poseTransformations.isEmpty()) {
|
||||
PoseTransformation poseTransformation = getPoseTransformationByTaskId(taskId);
|
||||
if (Objects.isNull(poseTransformation)) {
|
||||
return;
|
||||
}
|
||||
poseTransformation = poseTransformations.get(0);
|
||||
|
||||
poseTransformation.setGifUrl(gifUrl);
|
||||
poseTransformation.setVideoUrl(videoUrl);
|
||||
poseTransformation.setFirstFrameUrl(imageUrl);
|
||||
@@ -2599,6 +2593,64 @@ public class GenerateServiceImpl extends ServiceImpl<GenerateMapper, Generate> i
|
||||
// String uuid = taskId.substring(0, taskId.lastIndexOf("-"));
|
||||
Boolean flag = creditsService.taskCreditsDeduction(Long.parseLong(accountId), taskId);
|
||||
if (flag) creditsService.updateChangedCredits(accountId, taskId);
|
||||
|
||||
// 发消息
|
||||
sendSysMsgForPT(poseTransformation);
|
||||
}
|
||||
|
||||
// 处理PoseTransformation失败的情况
|
||||
public void processPTFailSituation(String taskId) {
|
||||
PoseTransformation poseTransformation = getPoseTransformationByTaskId(taskId);
|
||||
if (Objects.isNull(poseTransformation)) {
|
||||
return;
|
||||
}
|
||||
|
||||
// 更新生成记录的状态
|
||||
poseTransformation.setTaskStatus("Fail");
|
||||
poseTransformation.setUpdateTime(LocalDateTime.now());
|
||||
poseTransformationMapper.updateById(poseTransformation);
|
||||
// 发消息
|
||||
sendSysMsgForPT(poseTransformation);
|
||||
}
|
||||
|
||||
private PoseTransformation getPoseTransformationByTaskId(String taskId) {
|
||||
QueryWrapper<PoseTransformation> qw = new QueryWrapper<>();
|
||||
qw.eq("unique_id", taskId);
|
||||
List<PoseTransformation> poseTransformations = poseTransformationMapper.selectList(qw);
|
||||
if (poseTransformations != null && poseTransformations.size() > 1) {
|
||||
log.warn("通过taskId {} 查询到的PoseTransformation的结果不止一条", taskId);
|
||||
} else if (poseTransformations == null || poseTransformations.isEmpty()) {
|
||||
return null;
|
||||
}
|
||||
return poseTransformations.get(0);
|
||||
}
|
||||
|
||||
@Override
|
||||
public void sendSysMsgForPT(PoseTransformation poseTransformation) {
|
||||
// 确认当前任务是否已通知过,是 -> 不再通知;否 -> 通知
|
||||
Boolean elementExistsInSet = redisUtil.isElementExistsInSet(RedisUtil.VIDEO_FINISHED_TASKS, poseTransformation.getUniqueId());
|
||||
if (elementExistsInSet) {
|
||||
// 已通知过,不再通知
|
||||
return;
|
||||
}
|
||||
|
||||
boolean isSuccess;
|
||||
if (!StringUtil.isNullOrEmpty(poseTransformation.getTaskStatus()) && poseTransformation.getTaskStatus().equals("Success")) {
|
||||
isSuccess = true;
|
||||
} else if (!StringUtil.isNullOrEmpty(poseTransformation.getTaskStatus()) && poseTransformation.getTaskStatus().equals("Fail")) {
|
||||
isSuccess = false;
|
||||
} else {
|
||||
// 不通知
|
||||
return;
|
||||
}
|
||||
|
||||
Project project = projectService.getById(poseTransformation.getProjectId());
|
||||
// 发通知
|
||||
if (Objects.nonNull(project) && !StringUtil.isNullOrEmpty(project.getName())) {
|
||||
messageCenterService.videoFinishedMsg(poseTransformation.getAccountId(), project.getName(), isSuccess);
|
||||
// 添加已通知记录到redis
|
||||
redisUtil.addToSet(RedisUtil.VIDEO_FINISHED_TASKS, poseTransformation.getUniqueId(), CommonConstant.GENERATE_RESULT_EXPIRE_TIME);
|
||||
}
|
||||
}
|
||||
|
||||
public List<PoseTransformationVO> getPoseTransformationResult(List<String> taskIdList, Long projectId, Boolean like) {
|
||||
@@ -2639,7 +2691,7 @@ public class GenerateServiceImpl extends ServiceImpl<GenerateMapper, Generate> i
|
||||
}
|
||||
|
||||
private PoseTransformationVO buildPoseTransformationVO(String taskId, PoseTransformation dbItem) {
|
||||
String type = resolveModelType(taskId, CreditsEventsEnum.POSE_TRANSFORMATION.getValue());
|
||||
String type = resolveModelType(taskId, POSE_TRANSFORMATION.getName());
|
||||
String key = generateResultKey + ":" + taskId;
|
||||
String resultJson = redisUtil.getFromString(key);
|
||||
|
||||
@@ -2731,7 +2783,7 @@ public class GenerateServiceImpl extends ServiceImpl<GenerateMapper, Generate> i
|
||||
Long parentId = collectionSortService.getParentIdByElementIdAndElementType(
|
||||
productResult.getId(), CollectionType.TO_PRODUCT_IMAGE.getValue());
|
||||
if (Objects.isNull(parentId)) {
|
||||
parentId = userLikeGroupService.getUnlikedResultParentId(null, poseTransformation.getProductImage());
|
||||
parentId = toProductImageResultService.getUnlikedResultParentId(null, poseTransformation.getProductImage());
|
||||
}
|
||||
vo.setParentId(parentId);
|
||||
vo.setId(poseTransformation.getId());
|
||||
@@ -3018,16 +3070,11 @@ public class GenerateServiceImpl extends ServiceImpl<GenerateMapper, Generate> i
|
||||
@Transactional
|
||||
public void processPoseTransformResultBatch(String taskId, String gifUrl, String videoUrl, String imageUrl, String progress) {
|
||||
// 1、存储模型返回的数据
|
||||
PoseTransformation poseTransformation;
|
||||
QueryWrapper<PoseTransformation> qw = new QueryWrapper<>();
|
||||
qw.eq("unique_id", taskId);
|
||||
List<PoseTransformation> poseTransformations = poseTransformationMapper.selectList(qw);
|
||||
if (poseTransformations != null && poseTransformations.size() > 1) {
|
||||
log.warn("通过taskId {} 查询到的PoseTransformation的结果不止一条", taskId);
|
||||
} else if (poseTransformations == null || poseTransformations.isEmpty()) {
|
||||
PoseTransformation poseTransformation = getPoseTransformationByTaskId(taskId);
|
||||
if (Objects.isNull(poseTransformation)) {
|
||||
return;
|
||||
}
|
||||
poseTransformation = poseTransformations.get(0);
|
||||
|
||||
poseTransformation.setGifUrl(gifUrl);
|
||||
poseTransformation.setVideoUrl(videoUrl);
|
||||
poseTransformation.setFirstFrameUrl(imageUrl);
|
||||
@@ -3070,17 +3117,11 @@ public class GenerateServiceImpl extends ServiceImpl<GenerateMapper, Generate> i
|
||||
@Transactional
|
||||
public void processPoseTransformResultBatch(String progress, String taskId) {
|
||||
// 1、存储模型返回的数据
|
||||
PoseTransformation poseTransformation;
|
||||
QueryWrapper<PoseTransformation> qw = new QueryWrapper<>();
|
||||
qw.eq("unique_id", taskId);
|
||||
List<PoseTransformation> poseTransformations = poseTransformationMapper.selectList(qw);
|
||||
log.info("poseTransformations : {}", poseTransformations);
|
||||
if (poseTransformations != null && poseTransformations.size() > 1) {
|
||||
log.warn("通过taskId {} 查询到的PoseTransformation的结果不止一条", taskId);
|
||||
} else if (poseTransformations == null || poseTransformations.isEmpty()) {
|
||||
PoseTransformation poseTransformation = getPoseTransformationByTaskId(taskId);
|
||||
if (Objects.isNull(poseTransformation)) {
|
||||
return;
|
||||
}
|
||||
poseTransformation = poseTransformations.get(0);
|
||||
|
||||
String taskIdBatch = poseTransformation.getTaskIdBatch();
|
||||
log.info("progress:{}", progress);
|
||||
log.info("taskIdBatch:{}", taskIdBatch);
|
||||
@@ -3706,6 +3747,8 @@ public class GenerateServiceImpl extends ServiceImpl<GenerateMapper, Generate> i
|
||||
creditsService.deleteCreditsDeduction(accountId, taskId);
|
||||
}
|
||||
poseTransformationVO.setTaskId(taskId);
|
||||
// 发送提示消息
|
||||
sendSysMsgForPT(poseTransformation);
|
||||
|
||||
return poseTransformationVO;
|
||||
}
|
||||
@@ -3912,7 +3955,7 @@ public class GenerateServiceImpl extends ServiceImpl<GenerateMapper, Generate> i
|
||||
private String resolveModelType(String taskId, String func) {
|
||||
// 判断当前task来自哪个模型
|
||||
if (!StringUtil.isNullOrEmpty(func)
|
||||
&& func.equals(CreditsEventsEnum.POSE_TRANSFORMATION.getValue())) {
|
||||
&& func.equals(POSE_TRANSFORMATION.getName())) {
|
||||
List<PoseTransformation> poseTransformations = poseTransformationMapper.selectList(
|
||||
new QueryWrapper<PoseTransformation>().eq("unique_id", taskId));
|
||||
if (!poseTransformations.isEmpty()
|
||||
@@ -4210,8 +4253,7 @@ public class GenerateServiceImpl extends ServiceImpl<GenerateMapper, Generate> i
|
||||
}
|
||||
}
|
||||
|
||||
public
|
||||
com.alibaba.fastjson.JSONObject createParamsForMotion(PoseTransformDTO poseTransformDTO, String taskId) {
|
||||
public com.alibaba.fastjson.JSONObject createParamsForMotion(PoseTransformDTO poseTransformDTO, String taskId) {
|
||||
|
||||
com.alibaba.fastjson.JSONObject params = new com.alibaba.fastjson.JSONObject();
|
||||
params.put("tasks_id", taskId);
|
||||
|
||||
@@ -17,21 +17,20 @@ import com.ai.da.model.enums.Sex;
|
||||
import com.ai.da.model.vo.LibraryModelPointVO;
|
||||
import com.ai.da.python.PythonService;
|
||||
import com.ai.da.python.vo.DesignPythonObjects;
|
||||
import com.ai.da.service.DesignService;
|
||||
import com.ai.da.service.LibraryModelPointService;
|
||||
import com.ai.da.service.LibraryService;
|
||||
import com.ai.da.service.PythonTAllInfoService;
|
||||
import com.alibaba.fastjson.JSON;
|
||||
import com.alibaba.fastjson.JSONObject;
|
||||
import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
|
||||
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
|
||||
import io.netty.util.internal.StringUtil;
|
||||
import lombok.RequiredArgsConstructor;
|
||||
import lombok.extern.slf4j.Slf4j;
|
||||
import org.springframework.beans.factory.annotation.Autowired;
|
||||
import org.springframework.stereotype.Service;
|
||||
import org.springframework.util.CollectionUtils;
|
||||
import org.springframework.util.StringUtils;
|
||||
|
||||
import javax.annotation.Resource;
|
||||
import java.util.Collections;
|
||||
import java.util.Date;
|
||||
import java.util.List;
|
||||
@@ -45,17 +44,13 @@ import java.util.Objects;
|
||||
*/
|
||||
@Slf4j
|
||||
@Service
|
||||
@RequiredArgsConstructor
|
||||
public class LibraryModelPointServiceImpl extends ServiceImpl<LibraryModelPointMapper, LibraryModelPoint> implements LibraryModelPointService {
|
||||
@Resource
|
||||
private LibraryModelPointMapper libraryModelPointMapper;
|
||||
@Resource
|
||||
private LibraryService libraryService;
|
||||
@Resource
|
||||
private PythonService pythonService;
|
||||
@Resource
|
||||
private DesignService designService;
|
||||
@Autowired
|
||||
private MinioUtil minioUtil;
|
||||
private final LibraryModelPointMapper libraryModelPointMapper;
|
||||
private final LibraryService libraryService;
|
||||
private final MinioUtil minioUtil;
|
||||
private final PythonService pythonService;
|
||||
private final PythonTAllInfoService pythonTAllInfoService;
|
||||
|
||||
@Override
|
||||
public LibraryModelPointVO saveOrEditTemplatePoint(LibraryModelPointDTO libraryModelPointDTO) {
|
||||
@@ -226,7 +221,7 @@ public class LibraryModelPointServiceImpl extends ServiceImpl<LibraryModelPointM
|
||||
public String modelsDot(ModelsDotDTO modelsDotDTO) {
|
||||
DesignPythonObjects objects = pythonService.covertModelsDotParam(
|
||||
modelsDotDTO, SingleOverallEnum.OVERALL.getRealName(), "");
|
||||
designService.relationImageId(objects);
|
||||
pythonTAllInfoService.relationImageId(objects);
|
||||
JSONObject jsonObject = pythonService.designNew(objects);
|
||||
JSONObject data = jsonObject.getJSONObject("data");
|
||||
if (data == null) {
|
||||
|
||||
@@ -1068,7 +1068,7 @@ public class LibraryServiceImpl extends ServiceImpl<LibraryMapper, Library> impl
|
||||
|
||||
// 2. 是。获取当前用户id,随机生成4位数
|
||||
String sourceObject = path.substring(path.indexOf("/") + 1);
|
||||
String subPath = sourceObject.substring(sourceObject.indexOf("images/") + 1, sourceObject.lastIndexOf("."));
|
||||
String subPath = sourceObject.substring(sourceObject.indexOf("images/") + "images/".length(), sourceObject.lastIndexOf("."));
|
||||
String gender = subPath.substring(0, subPath.indexOf("/")).equals("female") ? "Female" : "Male";
|
||||
String category = subPath.substring(subPath.indexOf("/") + 1, subPath.lastIndexOf("/"));
|
||||
CollectionLevel2TypeEnum collectionLevel2TypeEnum = CollectionLevel2TypeEnum.ofWithLoweCase(category);
|
||||
@@ -1079,6 +1079,7 @@ public class LibraryServiceImpl extends ServiceImpl<LibraryMapper, Library> impl
|
||||
}
|
||||
String suffix = sourceObject.substring(sourceObject.lastIndexOf(".") + 1);
|
||||
Long userId = UserContext.getUserHolder().getId();
|
||||
// 由于允许将同一张系统sketch多次添加到个人library,但是路径相对固定,所以这里添加随机数以作区分
|
||||
String name = subPath.substring(subPath.lastIndexOf("/") + 1) + "_" + RandomsUtil.generateVerifyCode(1000L, 9999L);
|
||||
String targetObject = userId + "/sketchboard/" + gender.toLowerCase() + "/" + category + "/" +
|
||||
name + "." + suffix;
|
||||
|
||||
@@ -8,19 +8,15 @@ import com.ai.da.common.utils.CopyUtil;
|
||||
import com.ai.da.common.utils.MinioUtil;
|
||||
import com.ai.da.common.utils.RedisUtil;
|
||||
import com.ai.da.common.websocket.NotificationConnection;
|
||||
import com.ai.da.mapper.primary.CanvasMapper;
|
||||
import com.ai.da.mapper.primary.NotificationMapper;
|
||||
import com.ai.da.mapper.primary.SysNotificationReadStatusMapper;
|
||||
import com.ai.da.mapper.primary.entity.Account;
|
||||
import com.ai.da.mapper.primary.entity.Notification;
|
||||
import com.ai.da.mapper.primary.entity.Portfolio;
|
||||
import com.ai.da.mapper.primary.entity.SysNotificationReadStatus;
|
||||
import com.ai.da.mapper.primary.*;
|
||||
import com.ai.da.mapper.primary.entity.*;
|
||||
import com.ai.da.model.dto.GetNotificationDTO;
|
||||
import com.ai.da.model.dto.PublishSysNotificationDTO;
|
||||
import com.ai.da.model.enums.Language;
|
||||
import com.ai.da.model.vo.NotificationVO;
|
||||
import com.ai.da.service.AccountService;
|
||||
import com.ai.da.service.MessageCenterService;
|
||||
import com.ai.da.service.PortfolioService;
|
||||
import com.ai.da.service.UserFollowService;
|
||||
import com.alibaba.fastjson.JSON;
|
||||
import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
|
||||
import com.baomidou.mybatisplus.core.conditions.update.UpdateWrapper;
|
||||
@@ -30,12 +26,12 @@ import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
|
||||
import com.google.gson.Gson;
|
||||
import com.mysql.cj.util.StringUtils;
|
||||
import io.netty.util.internal.StringUtil;
|
||||
import lombok.RequiredArgsConstructor;
|
||||
import lombok.extern.slf4j.Slf4j;
|
||||
import org.springframework.beans.factory.annotation.Value;
|
||||
import org.springframework.stereotype.Service;
|
||||
import org.springframework.transaction.annotation.Transactional;
|
||||
|
||||
import javax.annotation.Resource;
|
||||
import java.io.IOException;
|
||||
import java.time.LocalDateTime;
|
||||
import java.time.format.DateTimeFormatter;
|
||||
import java.util.*;
|
||||
@@ -44,22 +40,18 @@ import java.util.stream.Collectors;
|
||||
|
||||
@Service
|
||||
@Slf4j
|
||||
@RequiredArgsConstructor
|
||||
public class MessageCenterServiceImpl extends ServiceImpl<NotificationMapper, Notification> implements MessageCenterService {
|
||||
|
||||
@Resource
|
||||
private NotificationConnection notificationConnection;
|
||||
@Resource
|
||||
private SysNotificationReadStatusMapper sysNotificationReadStatusMapper;
|
||||
@Resource
|
||||
private AccountService accountService;
|
||||
@Resource
|
||||
private MinioUtil minioUtil;
|
||||
@Resource
|
||||
private PortfolioService portfolioService;
|
||||
@Resource
|
||||
private CanvasMapper canvasMapper;
|
||||
@Resource
|
||||
private RedisUtil redisUtil;
|
||||
private final AccountService accountService;
|
||||
private final CanvasMapper canvasMapper;
|
||||
private final MinioUtil minioUtil;
|
||||
private final NotificationConnection notificationConnection;
|
||||
private final PortfolioMapper portfolioMapper;
|
||||
private final RedisUtil redisUtil;
|
||||
private final SysNotificationReadStatusMapper sysNotificationReadStatusMapper;
|
||||
private final UserFollowService userFollowService;
|
||||
|
||||
@Value("${redis.key.newPosted}")
|
||||
private String lastViewNewPostedTimeKey;
|
||||
|
||||
@@ -72,7 +64,7 @@ public class MessageCenterServiceImpl extends ServiceImpl<NotificationMapper, No
|
||||
.collect(Collectors.toMap(
|
||||
map -> (String) map.get("type"),
|
||||
map -> Objects.isNull(map.get("count")) ? 0L : (Long) map.get("count")));
|
||||
msgTypeCount.put("system", getUnreadSystemNotification());
|
||||
msgTypeCount.put("system", getUnreadSystemNotification(accountId));
|
||||
msgTypeCount.put("newPosted", getNewPostedCount(accountId));
|
||||
log.info(msgTypeCount.toString());
|
||||
// 整理数据 加上系统消息未读数
|
||||
@@ -97,9 +89,18 @@ public class MessageCenterServiceImpl extends ServiceImpl<NotificationMapper, No
|
||||
if (!StringUtils.isNullOrEmpty(getNotificationDTO.getType())) {
|
||||
queryWrapper.eq("type", getNotificationDTO.getType());
|
||||
}
|
||||
if (!getNotificationDTO.getType().equals("system")){
|
||||
queryWrapper.eq("receiver_id", accountId);
|
||||
|
||||
if (getNotificationDTO.getType().equals("system")) {
|
||||
queryWrapper.lambda().eq(Notification::getType, "system")
|
||||
.and(wrapper -> wrapper
|
||||
.isNull(Notification::getReceiverId)
|
||||
.or()
|
||||
.eq(Notification::getReceiverId, accountId)
|
||||
);
|
||||
} else {
|
||||
queryWrapper.lambda().eq(Notification::getReceiverId, accountId);
|
||||
}
|
||||
|
||||
Page<Notification> notificationPage = baseMapper.selectPage(new Page<>(getNotificationDTO.getPage(), getNotificationDTO.getSize()), queryWrapper);
|
||||
|
||||
List<Long> unreadSysNotificationIds = baseMapper.getUnreadSysNotification(accountId);
|
||||
@@ -115,7 +116,7 @@ public class MessageCenterServiceImpl extends ServiceImpl<NotificationMapper, No
|
||||
if (Objects.isNull(notificationVO.getPortfolioId())) {
|
||||
notificationVO.setPortfolioId(null);
|
||||
} else {
|
||||
Portfolio byId = portfolioService.getById(notificationVO.getPortfolioId());
|
||||
Portfolio byId = portfolioMapper.selectById(notificationVO.getPortfolioId());
|
||||
if (!Objects.isNull(byId)) {
|
||||
if (Objects.isNull(byId.getPortfolioName())) {
|
||||
notificationVO.setPortfolioName(null);
|
||||
@@ -161,6 +162,7 @@ public class MessageCenterServiceImpl extends ServiceImpl<NotificationMapper, No
|
||||
/**
|
||||
* 只记录唯一点赞和关注
|
||||
* 重复点赞、关注只会记录最新的一次操作
|
||||
*
|
||||
* @param notification
|
||||
* @return
|
||||
*/
|
||||
@@ -192,13 +194,13 @@ public class MessageCenterServiceImpl extends ServiceImpl<NotificationMapper, No
|
||||
count = getUnreadCountByType(type, receiverId);
|
||||
} else {
|
||||
// 系统未读消息
|
||||
count = getUnreadSystemNotification();
|
||||
count = getUnreadSystemNotification(receiverId);
|
||||
}
|
||||
if (type.equals("follow")) {
|
||||
HashMap<String, Object> followee = new HashMap<>();
|
||||
HashMap<String, Object> follower = new HashMap<>();
|
||||
follower.put("followerCount",portfolioService.getFollowerCount(receiverId));
|
||||
followee.put("followeeCount",portfolioService.getFolloweeCount(receiverId));
|
||||
follower.put("followerCount", userFollowService.getFollowerCount(receiverId));
|
||||
followee.put("followeeCount", userFollowService.getFolloweeCount(receiverId));
|
||||
resp.add(followee);
|
||||
resp.add(follower);
|
||||
}
|
||||
@@ -243,15 +245,21 @@ public class MessageCenterServiceImpl extends ServiceImpl<NotificationMapper, No
|
||||
return baseMapper.selectCount(queryWrapper);
|
||||
}
|
||||
|
||||
private Long getUnreadSystemNotification() {
|
||||
private Long getUnreadSystemNotification(Long receiverId) {
|
||||
// Long accountId = UserContext.getUserHolder().getId();
|
||||
// 计算总的系统通知数量
|
||||
QueryWrapper<Notification> queryWrapper = new QueryWrapper<>();
|
||||
queryWrapper.eq("type", "system");
|
||||
queryWrapper.lambda().eq(Notification::getType, "system")
|
||||
.and(wrapper -> wrapper
|
||||
.isNull(Notification::getReceiverId)
|
||||
.or()
|
||||
.eq(Notification::getReceiverId, receiverId)
|
||||
);
|
||||
Long totalSysCount = baseMapper.selectCount(queryWrapper);
|
||||
|
||||
// 计算单个用户读了多少条系统数据
|
||||
QueryWrapper<SysNotificationReadStatus> wrapper = new QueryWrapper<>();
|
||||
wrapper.eq("account_id", UserContext.getUserHolder().getId());
|
||||
wrapper.eq("account_id", receiverId);
|
||||
Long readCount = sysNotificationReadStatusMapper.selectCount(wrapper);
|
||||
|
||||
// 计算差
|
||||
@@ -279,11 +287,17 @@ public class MessageCenterServiceImpl extends ServiceImpl<NotificationMapper, No
|
||||
public void setReadStatusSystem(List<Long> notificationIdList) {
|
||||
Long id = UserContext.getUserHolder().getId();
|
||||
for (Long notificationId : notificationIdList) {
|
||||
Notification notification = getById(notificationId);
|
||||
if (Objects.nonNull(notification) && notification.getType().equals("system")) {
|
||||
// 当系统消息指定了接收人员时,不允许其他人员已读
|
||||
if (Objects.isNull(notification.getReceiverId()) || notification.getReceiverId().equals(id)) {
|
||||
SysNotificationReadStatus sysNotificationReadStatus = new SysNotificationReadStatus(notificationId, id);
|
||||
sysNotificationReadStatus.setCreateTime(LocalDateTime.now());
|
||||
sysNotificationReadStatusMapper.insert(sysNotificationReadStatus);
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
// 一键已读
|
||||
public void setReadAll(String type) {
|
||||
@@ -314,7 +328,7 @@ public class MessageCenterServiceImpl extends ServiceImpl<NotificationMapper, No
|
||||
|
||||
public Long getNewPostedCount(Long accountId) {
|
||||
// 1.1 获取我关注的所有用户
|
||||
List<Long> followeeList = portfolioService.getFolloweeList(accountId);
|
||||
List<Long> followeeList = userFollowService.getFolloweeList(accountId);
|
||||
// 1.2 查询我关注的用户在我上次查看动态之后发布的作品数量
|
||||
String lastViewTime = redisUtil.getFromString(lastViewNewPostedTimeKey + ":" + accountId);
|
||||
|
||||
@@ -330,7 +344,7 @@ public class MessageCenterServiceImpl extends ServiceImpl<NotificationMapper, No
|
||||
} else {
|
||||
return 0L;
|
||||
}
|
||||
return portfolioService.getBaseMapper().selectCount(queryWrapper);
|
||||
return portfolioMapper.selectCount(queryWrapper);
|
||||
}
|
||||
|
||||
/**
|
||||
@@ -340,7 +354,7 @@ public class MessageCenterServiceImpl extends ServiceImpl<NotificationMapper, No
|
||||
|
||||
// 1、获取关注用户发布的所有作品
|
||||
// 1.1 获取我关注的所有用户
|
||||
List<Long> followeeList = portfolioService.getFolloweeList(accountId);
|
||||
List<Long> followeeList = userFollowService.getFolloweeList(accountId);
|
||||
// 1.2 分页查询我关注的用户发布的作品
|
||||
QueryWrapper<Portfolio> queryWrapper = new QueryWrapper<>();
|
||||
if (!followeeList.isEmpty()) {
|
||||
@@ -349,7 +363,7 @@ public class MessageCenterServiceImpl extends ServiceImpl<NotificationMapper, No
|
||||
return new PageBaseResponse<>(new ArrayList<>(), page, size, 0, 0);
|
||||
}
|
||||
queryWrapper.orderByDesc("create_date");
|
||||
Page<Portfolio> portfolioPage = portfolioService.getBaseMapper().selectPage(new Page<>(page, size), queryWrapper);
|
||||
Page<Portfolio> portfolioPage = portfolioMapper.selectPage(new Page<>(page, size), queryWrapper);
|
||||
// 2、组装返回的数据
|
||||
|
||||
IPage<NotificationVO> convert = portfolioPage.convert(o -> {
|
||||
@@ -378,4 +392,38 @@ public class MessageCenterServiceImpl extends ServiceImpl<NotificationMapper, No
|
||||
return PageBaseResponse.success(convert);
|
||||
}
|
||||
|
||||
@Override
|
||||
@Transactional(rollbackFor = Exception.class)
|
||||
public void videoFinishedMsg(Long userId, String projectName, boolean isSuccess) {
|
||||
Account account = accountService.getById(userId);
|
||||
String language = account.getLanguage();
|
||||
PublishSysNotificationDTO sysNotificationDTO = new PublishSysNotificationDTO();
|
||||
Notification notification = new Notification();
|
||||
notification.setType("system");
|
||||
notification.setReceiverId(userId);
|
||||
if (isSuccess) {
|
||||
if (language.equals(Language.ENGLISH.name())) {
|
||||
sysNotificationDTO.setTitle("System Notification");
|
||||
sysNotificationDTO.setContent("Your video generation task in Project " + projectName + " is ready!");
|
||||
} else {
|
||||
sysNotificationDTO.setTitle("系统通知");
|
||||
sysNotificationDTO.setContent("您在项目 " + projectName + " 中创建的视频生成任务已完成!");
|
||||
}
|
||||
} else {
|
||||
if (language.equals(Language.ENGLISH.name())) {
|
||||
sysNotificationDTO.setTitle("System Notification");
|
||||
sysNotificationDTO.setContent("Your video generation task in Project " + projectName + " has failed.");
|
||||
} else {
|
||||
sysNotificationDTO.setTitle("系统通知");
|
||||
sysNotificationDTO.setContent("视频生成任务失败。");
|
||||
}
|
||||
}
|
||||
notification.setContent(JSON.toJSONString(sysNotificationDTO));
|
||||
notification.setIsRead(0);
|
||||
notification.setCreateTime(LocalDateTime.now());
|
||||
save(notification);
|
||||
// 这里推送消息是在接受到视频生成结束后发生的,所以UserContext中没有用户信息
|
||||
pushMessage("system", userId);
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
@@ -0,0 +1,90 @@
|
||||
package com.ai.da.service.impl;
|
||||
|
||||
import com.ai.da.mapper.primary.MoodboardPositionMapper;
|
||||
import com.ai.da.mapper.primary.entity.MoodboardPosition;
|
||||
import com.ai.da.service.MoodboardPositionService;
|
||||
import com.alibaba.fastjson.JSONArray;
|
||||
import com.alibaba.fastjson.JSONObject;
|
||||
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
|
||||
import lombok.extern.slf4j.Slf4j;
|
||||
import org.springframework.stereotype.Service;
|
||||
import org.springframework.util.StringUtils;
|
||||
|
||||
import java.time.LocalDateTime;
|
||||
import java.util.ArrayList;
|
||||
import java.util.List;
|
||||
|
||||
@Slf4j
|
||||
@Service
|
||||
public class MoodboardPositionServiceImpl extends ServiceImpl<MoodboardPositionMapper, MoodboardPosition> implements MoodboardPositionService {
|
||||
|
||||
@Override
|
||||
public void parseMoodboardPosition(String moodboardPosition, Long collectionIdParam) {
|
||||
if (!StringUtils.isEmpty(moodboardPosition)) {
|
||||
// 将 JSON 字符串解析为 JSONObject
|
||||
JSONObject moodboardPositionJson = JSONObject.parseObject(moodboardPosition);
|
||||
|
||||
// 准备保存的 MoodboardPosition 列表
|
||||
List<MoodboardPosition> moodboardPositions = new ArrayList<>();
|
||||
|
||||
// 遍历 JSON 对象的 key(即样式类型)
|
||||
for (String key : moodboardPositionJson.keySet()) {
|
||||
// 特殊处理 "class" 字段
|
||||
if ("class".equals(key)) {
|
||||
// 获取 "class" 字段的值并将其转为 List<String>
|
||||
JSONArray classArray = moodboardPositionJson.getJSONArray(key);
|
||||
if (classArray != null) {
|
||||
|
||||
for (int j = 0; j < classArray.size(); j++) {
|
||||
// 将 classList 存入 MoodboardPosition(或者其他结构)
|
||||
|
||||
MoodboardPosition position = new MoodboardPosition()
|
||||
.setCollectionId(collectionIdParam) // 关联 Collection ID
|
||||
.setType(key) // 样式类型
|
||||
.setStyleData(classArray.getString(j)) // 设置 class 字段
|
||||
.setSequence(j) // 根据索引值设置顺序
|
||||
.setCreateTime(LocalDateTime.now()) // 创建时间
|
||||
.setUpdateTime(LocalDateTime.now()); // 更新时间
|
||||
|
||||
// 添加到列表中
|
||||
moodboardPositions.add(position);
|
||||
}
|
||||
}
|
||||
continue; // 跳过 "class" 字段的常规处理
|
||||
}
|
||||
|
||||
JSONArray styleArray = moodboardPositionJson.getJSONArray(key);
|
||||
if (styleArray != null) {
|
||||
for (int i = 0; i < styleArray.size(); i++) {
|
||||
// 获取当前样式数据
|
||||
JSONObject styleData = styleArray.getJSONObject(i);
|
||||
|
||||
// 构建 MoodboardPosition 实例
|
||||
MoodboardPosition position = new MoodboardPosition()
|
||||
.setCollectionId(collectionIdParam) // 关联 Collection ID
|
||||
.setType(key) // 样式类型
|
||||
.setStyleData(styleData.toJSONString()) // 样式数据存为 JSON 字符串
|
||||
.setSequence(i) // 根据索引值设置顺序
|
||||
.setCreateTime(LocalDateTime.now()) // 创建时间
|
||||
.setUpdateTime(LocalDateTime.now()); // 更新时间
|
||||
|
||||
// 添加到列表中
|
||||
moodboardPositions.add(position);
|
||||
}
|
||||
}
|
||||
}
|
||||
// 如果解析结果非空,保存到数据库
|
||||
if (!moodboardPositions.isEmpty()) {
|
||||
for (MoodboardPosition position : moodboardPositions) {
|
||||
baseMapper.insert(position);
|
||||
}
|
||||
log.info("成功解析并保存 {} 条 MoodboardPosition 数据", moodboardPositions.size());
|
||||
} else {
|
||||
log.warn("未找到可保存的 MoodboardPosition 数据");
|
||||
}
|
||||
} else {
|
||||
log.warn("传入的 moodboardPosition 字段为空");
|
||||
}
|
||||
}
|
||||
|
||||
}
|
||||
@@ -30,6 +30,7 @@ import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
|
||||
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
|
||||
import com.google.common.base.Function;
|
||||
import io.netty.util.internal.StringUtil;
|
||||
import lombok.RequiredArgsConstructor;
|
||||
import lombok.extern.slf4j.Slf4j;
|
||||
import org.springframework.stereotype.Service;
|
||||
import org.springframework.transaction.annotation.Transactional;
|
||||
@@ -45,107 +46,41 @@ import java.util.stream.Collectors;
|
||||
|
||||
@Slf4j
|
||||
@Service
|
||||
@RequiredArgsConstructor
|
||||
public class PortfolioServiceImpl extends ServiceImpl<PortfolioMapper, Portfolio> implements PortfolioService {
|
||||
|
||||
@Resource
|
||||
private UserLikeGroupMapper userLikeGroupMapper;
|
||||
|
||||
@Resource
|
||||
private CollectionMapper collectionMapper;
|
||||
|
||||
@Resource
|
||||
private CollectionElementService collectionElementService;
|
||||
|
||||
@Resource
|
||||
private CollectionElementMapper collectionElementMapper;
|
||||
@Resource
|
||||
private CollectionSortService collectionSortService;
|
||||
@Resource
|
||||
private CollectionSortMapper collectionSortMapper;
|
||||
@Resource
|
||||
private TCollectionElementRelationMapper collectionElementRelationMapper;
|
||||
|
||||
@Resource
|
||||
private PortfolioMapper portfolioMapper;
|
||||
|
||||
@Resource
|
||||
private UserLikeService userLikeService;
|
||||
|
||||
@Resource
|
||||
private UserLikeMapper userLikeMapper;
|
||||
|
||||
@Resource
|
||||
private TDesignPythonOutfitMapper designPythonOutfitMapper;
|
||||
|
||||
@Resource
|
||||
private TDesignPythonOutfitDetailMapper designPythonOutfitDetailMapper;
|
||||
|
||||
@Resource
|
||||
private DesignItemMapper designItemMapper;
|
||||
|
||||
@Resource
|
||||
private DesignItemDetailMapper designItemDetailMapper;
|
||||
|
||||
@Resource
|
||||
private DesignItemDetailPrintMapper designItemDetailPrintMapper;
|
||||
|
||||
|
||||
@Resource
|
||||
private MinioUtil minioUtil;
|
||||
|
||||
@Resource
|
||||
private WorkspaceService workspaceService;
|
||||
|
||||
@Resource
|
||||
private DesignMapper designMapper;
|
||||
|
||||
@Resource
|
||||
private UserLikeGroupService userLikeGroupService;
|
||||
|
||||
@Resource
|
||||
private CanvasMapper canvasMapper;
|
||||
|
||||
@Resource
|
||||
private AccountMapper accountMapper;
|
||||
|
||||
@Resource
|
||||
private WorkspaceMapper workspaceMapper;
|
||||
|
||||
@Resource
|
||||
private SysFileMapper sysFileMapper;
|
||||
|
||||
@Resource
|
||||
private LibraryMapper libraryMapper;
|
||||
|
||||
@Resource
|
||||
private StyleMapper styleMapper;
|
||||
|
||||
@Resource
|
||||
private WorkspaceRelStyleMapper workspaceRelStyleMapper;
|
||||
|
||||
@Resource
|
||||
private UserFollowMapper userFollowMapper;
|
||||
|
||||
@Resource
|
||||
private PortfolioTagsMapper portfolioTagsMapper;
|
||||
|
||||
@Resource
|
||||
private TagsService tagsService;
|
||||
|
||||
@Resource
|
||||
private TagsMapper tagsMapper;
|
||||
|
||||
@Resource
|
||||
private ProjectMapper projectMapper;
|
||||
|
||||
@Resource
|
||||
private CollectionElementRelModelMapper collectionElementRelModelMapper;
|
||||
@Resource
|
||||
private ToProductImageResultMapper toProductImageResultMapper;
|
||||
@Resource
|
||||
private ToProductImageRecordMapper toProductImageRecordMapper;
|
||||
@Resource
|
||||
private PoseTransformationMapper poseTransformationMapper;
|
||||
private final AccountMapper accountMapper;
|
||||
private final CanvasMapper canvasMapper;
|
||||
private final CollectionMapper collectionMapper;
|
||||
private final CollectionElementMapper collectionElementMapper;
|
||||
private final CollectionElementService collectionElementService;
|
||||
private final CollectionSortMapper collectionSortMapper;
|
||||
private final CollectionSortService collectionSortService;
|
||||
private final CollectionElementRelModelMapper collectionElementRelModelMapper;
|
||||
private final TCollectionElementRelationMapper collectionElementRelationMapper;
|
||||
private final DesignMapper designMapper;
|
||||
private final DesignItemMapper designItemMapper;
|
||||
private final DesignItemDetailMapper designItemDetailMapper;
|
||||
private final DesignItemDetailPrintMapper designItemDetailPrintMapper;
|
||||
private final TDesignPythonOutfitMapper designPythonOutfitMapper;
|
||||
private final TDesignPythonOutfitDetailMapper designPythonOutfitDetailMapper;
|
||||
private final MinioUtil minioUtil;
|
||||
private final ProjectMapper projectMapper;
|
||||
private final PortfolioMapper portfolioMapper;
|
||||
private final PortfolioTagsMapper portfolioTagsMapper;
|
||||
private final PoseTransformationMapper poseTransformationMapper;
|
||||
private final TagsMapper tagsMapper;
|
||||
private final TagsService tagsService;
|
||||
private final ToProductImageResultMapper toProductImageResultMapper;
|
||||
private final ToProductImageRecordMapper toProductImageRecordMapper;
|
||||
private final UserFollowMapper userFollowMapper;
|
||||
private final UserFollowService userFollowService;
|
||||
private final UserLikeService userLikeService;
|
||||
private final UserLikeMapper userLikeMapper;
|
||||
private final UserLikeGroupMapper userLikeGroupMapper;
|
||||
private final UserLikeGroupService userLikeGroupService;
|
||||
private final WorkspaceMapper workspaceMapper;
|
||||
private final WorkspaceService workspaceService;
|
||||
|
||||
@Override
|
||||
@Transactional(rollbackFor = Exception.class)
|
||||
@@ -585,7 +520,7 @@ public class PortfolioServiceImpl extends ServiceImpl<PortfolioMapper, Portfolio
|
||||
vo.setIsLike(0);
|
||||
}
|
||||
// 设置当前用户是否关注了所查看作品的作者
|
||||
Integer ifFollowed = getIfFollowed(portfolio.getAccountId(), portfolioDTO.getAccountId());
|
||||
Integer ifFollowed = userFollowService.getIfFollowed(portfolio.getAccountId(), portfolioDTO.getAccountId());
|
||||
vo.setIsFollow(ifFollowed);
|
||||
avatar = StringUtil.isNullOrEmpty(account.getAvatar()) ? CommonConstant.DEFAULT_AVATAR : account.getAvatar();
|
||||
}
|
||||
@@ -1157,7 +1092,7 @@ public class PortfolioServiceImpl extends ServiceImpl<PortfolioMapper, Portfolio
|
||||
if (!collect.contains(CommonConstant.RCA_WORKSHOP_TAG)) {
|
||||
return false;
|
||||
} else {
|
||||
UserLikeGroup userLikeGroup = userLikeGroupService.getById(userLikeGroupId);
|
||||
UserLikeGroup userLikeGroup = userLikeGroupMapper.selectById(userLikeGroupId);
|
||||
// 不是原创的作品不能参与活动
|
||||
if (userLikeGroup.getOriginal().equals(0)) {
|
||||
throw new BusinessException("only.original.works.can.participate.in.the.event", ResultEnum.PROMPT.getCode());
|
||||
@@ -1276,86 +1211,6 @@ public class PortfolioServiceImpl extends ServiceImpl<PortfolioMapper, Portfolio
|
||||
messageCenterService.pushMessage("follow", followeeId);
|
||||
}
|
||||
|
||||
public Long getFolloweeCount(Long accountId) {
|
||||
QueryWrapper<UserFollow> queryWrapper = new QueryWrapper<>();
|
||||
queryWrapper.eq("follower_id", accountId).select("followee_id");
|
||||
return userFollowMapper.selectCount(queryWrapper);
|
||||
}
|
||||
|
||||
// 获取某个用户的关注列表 + 按名字查询
|
||||
public List<AccountFollowVO> getFolloweeList(GetFollowListDTO getFollowListDTO) {
|
||||
Long accountId = UserContext.getUserHolder().getId();
|
||||
// 1、判断是否有按用户名查询
|
||||
List<AccountFollowVO> followeeList;
|
||||
if (!StringUtil.isNullOrEmpty(getFollowListDTO.getSearchByName())) {
|
||||
followeeList = userFollowMapper.getFolloweeListByName(getFollowListDTO.getSearchByName(), accountId);
|
||||
} else {
|
||||
// 2、查全部 分页查询
|
||||
String order = StringUtil.isNullOrEmpty(getFollowListDTO.getOrder()) ? "DESC" : getFollowListDTO.getOrder().equals("DESC") ? "DESC" : "ASC";
|
||||
Integer limit = getFollowListDTO.getSize() > 0 ? getFollowListDTO.getSize() : 20;
|
||||
Integer offset = getFollowListDTO.getPage() > 0 ? (getFollowListDTO.getPage() - 1) * getFollowListDTO.getSize() : 0;
|
||||
followeeList = userFollowMapper.getFolloweeListByFollower(accountId, limit, offset, order);
|
||||
}
|
||||
|
||||
if (!followeeList.isEmpty()) {
|
||||
followeeList.forEach(followee -> {
|
||||
String avatar = StringUtil.isNullOrEmpty(followee.getAvatar()) ? CommonConstant.DEFAULT_AVATAR : followee.getAvatar();
|
||||
followee.setAvatar(minioUtil.getPreSignedUrl(avatar, CommonConstant.MINIO_IMAGE_EXPIRE_TIME));
|
||||
});
|
||||
return followeeList;
|
||||
}
|
||||
return new ArrayList<>();
|
||||
}
|
||||
|
||||
public Long getFollowerCount(Long accountId) {
|
||||
QueryWrapper<UserFollow> queryWrapper = new QueryWrapper<>();
|
||||
queryWrapper.eq("followee_id", accountId).select("follower_id");
|
||||
return userFollowMapper.selectCount(queryWrapper);
|
||||
}
|
||||
|
||||
// 获取某个用户的粉丝列表 + 按名字查询 需返回是否关注该粉丝
|
||||
public List<AccountFollowVO> getFollowerList(GetFollowListDTO getFollowListDTO) {
|
||||
Long accountId = UserContext.getUserHolder().getId();
|
||||
|
||||
// 获取当前用户的所有粉丝
|
||||
QueryWrapper<UserFollow> qw = new QueryWrapper<>();
|
||||
qw.eq("follower_id", accountId).select("followee_id", "create_time");
|
||||
List<UserFollow> userFollows = userFollowMapper.selectList(qw);
|
||||
Map<Long, LocalDateTime> followeeMap = userFollows.stream().collect(Collectors.toMap(UserFollow::getFolloweeId, UserFollow::getCreateTime));
|
||||
|
||||
List<AccountFollowVO> followerList;
|
||||
// 1、判断是否有按用户名查询粉丝
|
||||
if (!StringUtil.isNullOrEmpty(getFollowListDTO.getSearchByName())) {
|
||||
followerList = userFollowMapper.getFollowerListByName(getFollowListDTO.getSearchByName(), accountId);
|
||||
} else {
|
||||
// 2、查全部 分页查询
|
||||
String order = StringUtil.isNullOrEmpty(getFollowListDTO.getOrder()) ? "DESC" : getFollowListDTO.getOrder().equals("DESC") ? "DESC" : "ASC";
|
||||
Integer limit = getFollowListDTO.getSize() > 0 ? getFollowListDTO.getSize() : 20;
|
||||
Integer offset = getFollowListDTO.getPage() > 0 ? (getFollowListDTO.getPage() - 1) * getFollowListDTO.getSize() : 0;
|
||||
followerList = userFollowMapper.getFollowerListByFollowee(accountId, limit, offset, order);
|
||||
}
|
||||
|
||||
if (!followerList.isEmpty()) {
|
||||
// 判断当前用户是否与粉丝互关
|
||||
followerList.forEach(follower -> {
|
||||
String avatar = StringUtil.isNullOrEmpty(follower.getAvatar()) ? CommonConstant.DEFAULT_AVATAR : follower.getAvatar();
|
||||
follower.setAvatar(minioUtil.getPreSignedUrl(avatar, CommonConstant.MINIO_IMAGE_EXPIRE_TIME));
|
||||
follower.setIsFollow(Objects.isNull(followeeMap.get(follower.getSenderId())) ? 0 : 1);
|
||||
// follower.setFollowTime(followeeMap.get(follower.getUserId()));
|
||||
});
|
||||
return followerList;
|
||||
}
|
||||
return new ArrayList<>();
|
||||
}
|
||||
|
||||
public Integer getIfFollowed(Long followeeId, Long followerId) {
|
||||
// 设置当前用户是否关注了所查看作品的作者
|
||||
QueryWrapper<UserFollow> queryWrapper = new QueryWrapper<>();
|
||||
queryWrapper.eq("followee_id", followeeId).eq("follower_id", followerId);
|
||||
UserFollow userFollow = userFollowMapper.selectOne(queryWrapper);
|
||||
return Objects.isNull(userFollow) ? 0 : 1;
|
||||
}
|
||||
|
||||
public Long getPortfolioCount(Long accountId) {
|
||||
QueryWrapper<Portfolio> queryWrapper = new QueryWrapper<>();
|
||||
queryWrapper.eq("account_id", accountId);
|
||||
@@ -1363,19 +1218,6 @@ public class PortfolioServiceImpl extends ServiceImpl<PortfolioMapper, Portfolio
|
||||
return baseMapper.selectCount(queryWrapper);
|
||||
}
|
||||
|
||||
/**
|
||||
* 获取关注列表
|
||||
*
|
||||
* @param accountId
|
||||
* @return
|
||||
*/
|
||||
public List<Long> getFolloweeList(Long accountId) {
|
||||
QueryWrapper<UserFollow> qw = new QueryWrapper<>();
|
||||
qw.eq("follower_id", accountId).select("followee_id");
|
||||
|
||||
List<UserFollow> userFollows = userFollowMapper.selectList(qw);
|
||||
return userFollows.stream().map(UserFollow::getFolloweeId).collect(Collectors.toList());
|
||||
}
|
||||
|
||||
public void setPortfolioToPublic(Long portfolioId) {
|
||||
// 判断当前用户与作品用户是不是一家公司的
|
||||
|
||||
@@ -4,6 +4,8 @@ package com.ai.da.service.impl;
|
||||
import com.ai.da.common.config.exception.BusinessException;
|
||||
import com.ai.da.mapper.primary.PythonTAllInfoMapper;
|
||||
import com.ai.da.mapper.primary.entity.PythonTAllInfo;
|
||||
import com.ai.da.python.vo.DesignPythonItem;
|
||||
import com.ai.da.python.vo.DesignPythonObjects;
|
||||
import com.ai.da.service.PythonTAllInfoService;
|
||||
import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
|
||||
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
|
||||
@@ -13,7 +15,9 @@ import org.springframework.util.CollectionUtils;
|
||||
import org.springframework.util.StringUtils;
|
||||
|
||||
import javax.annotation.Resource;
|
||||
import java.util.ArrayList;
|
||||
import java.util.List;
|
||||
import java.util.Objects;
|
||||
|
||||
/**
|
||||
* (PythonTAllInfo)表服务实现类
|
||||
@@ -48,4 +52,31 @@ public class PythonTAllInfoServiceImpl extends ServiceImpl<PythonTAllInfoMapper,
|
||||
}
|
||||
return pythonTAllInfo.getId();
|
||||
}
|
||||
|
||||
@Override
|
||||
public void relationImageId(DesignPythonObjects pythonObjects) {
|
||||
if (Objects.isNull(pythonObjects)) {
|
||||
return;
|
||||
}
|
||||
pythonObjects.getObjects().forEach(
|
||||
o -> {
|
||||
for (DesignPythonItem item : o.getItems()) {
|
||||
List<Long> list = new ArrayList<>();
|
||||
list.add(1L);
|
||||
list.add(1L);
|
||||
item.setOffset(list);
|
||||
item.setResize_scale(new Float[]{1.0f, 1.0f});
|
||||
String path = item.getPath();
|
||||
if (StringUtils.isEmpty(path)) {
|
||||
String bodyPath = item.getBody_path();
|
||||
Long imageId = getImageIdByPath(bodyPath);
|
||||
item.setImage_id(imageId);
|
||||
} else {
|
||||
Long imageId = getImageIdByPath(path);
|
||||
item.setImage_id(imageId);
|
||||
}
|
||||
}
|
||||
}
|
||||
);
|
||||
}
|
||||
}
|
||||
|
||||
@@ -16,6 +16,7 @@ import com.ai.da.model.dto.CreateCouponDTO;
|
||||
import com.ai.da.model.dto.ProductPurchaseDTO;
|
||||
import com.ai.da.model.dto.QueryCouponsPageDTO;
|
||||
import com.ai.da.model.dto.SubscriptionEmailParamsDTO;
|
||||
import com.ai.da.model.enums.Language;
|
||||
import com.ai.da.model.vo.CheckCouponsVO;
|
||||
import com.ai.da.service.*;
|
||||
import com.alibaba.fastjson.JSON;
|
||||
@@ -1072,7 +1073,7 @@ public class StripeServiceImpl implements StripeService {
|
||||
String key = RedisUtil.SUBSCRIPTION_SENT_EMAIL_TYPE + subscriptionInfo.getId();
|
||||
// 先判断当前订单 这个类型的邮件是否已发送过
|
||||
Boolean elementExistsInSet = redisUtil.isElementExistsInSet(key, type);
|
||||
if (!type.equals("reminder") && !type.equals("cancel") && paymentInfo.getNotified() == 1 && elementExistsInSet){
|
||||
if (!type.startsWith("reminder") && !type.equals("cancel") && paymentInfo.getNotified() == 1 && elementExistsInSet){
|
||||
// 已经邮件通知过,直接返回
|
||||
log.info("不发送邮件,原因:【type为:{},order_no为:{},已经进行邮件通知】", type, orderNo);
|
||||
return true;
|
||||
@@ -1080,7 +1081,7 @@ public class StripeServiceImpl implements StripeService {
|
||||
|
||||
com.ai.da.mapper.primary.entity.Account account = accountMapper.selectById(subscriptionInfo.getAccountId());
|
||||
String userName = account.getUserName();
|
||||
String language = account.getLanguage();
|
||||
String language = getLanguage(account.getLanguage(), account.getCountry(), type);
|
||||
OrderInfo orderByOrderNo = orderInfoService.getOrderByOrderNo(subscriptionInfo.getOrderNo());
|
||||
|
||||
SubscriptionEmailParamsDTO emailParamsDTO = new SubscriptionEmailParamsDTO();
|
||||
@@ -1101,7 +1102,7 @@ public class StripeServiceImpl implements StripeService {
|
||||
if (!b) return false;
|
||||
|
||||
// 邮件通知成功后,更新标志
|
||||
if (!type.equals("reminder") && !type.equals("cancel")){
|
||||
if (!type.startsWith("reminder") && !type.equals("cancel")){
|
||||
PaymentInfo payment = new PaymentInfo();
|
||||
payment.setId(paymentInfo.getId());
|
||||
payment.setNotified(1);
|
||||
@@ -1114,6 +1115,20 @@ public class StripeServiceImpl implements StripeService {
|
||||
return true;
|
||||
}
|
||||
|
||||
public String getLanguage(String language, String country, String type) {
|
||||
if (StringUtil.isNullOrEmpty(language)){
|
||||
return Language.ENGLISH.name();
|
||||
} else {
|
||||
if (!StringUtil.isNullOrEmpty(type) && type.startsWith("reminder")
|
||||
&& language.equals(Language.CHINESE_SIMPLIFIED.name())
|
||||
&& !StringUtil.isNullOrEmpty(country)
|
||||
&& (country.equals("Hong Kong, China") || country.equals("Taiwan, China"))) {
|
||||
return "zh-Hant";
|
||||
}
|
||||
return language;
|
||||
}
|
||||
}
|
||||
|
||||
public boolean sendEmail(String orderNo){
|
||||
SubscriptionEmailParamsDTO emailParamsDTO = new SubscriptionEmailParamsDTO();
|
||||
OrderInfo orderInfo = orderInfoService.getOrderByOrderNo(orderNo);
|
||||
@@ -1257,9 +1272,10 @@ public class StripeServiceImpl implements StripeService {
|
||||
emailParamsDTO.setNextPayDate(DateUtil.changeTimeStampFormat(subscriptionInfo.getCurrentPeriodEnd(), "seconds", CommonConstant.TIME_FORMAT_MMM_dd_yyyy));
|
||||
}
|
||||
emailParamsDTO.setRenewalTime(DateUtil.changeTimeStampFormat(subscriptionInfo.getCurrentPeriodEnd(), "seconds", CommonConstant.TIME_FORMAT_MMM_dd_yyyy));
|
||||
emailParamsDTO.setDays(subscriptionInfo.getType().equals("month") ? "7" : subscriptionInfo.getType().equals("year") ? "14" : "N/A");
|
||||
}
|
||||
|
||||
public void subscriptionReminder(){
|
||||
/*public void subscriptionReminder(){
|
||||
// 提前7天的 00:00:00 和 23:59:59
|
||||
LocalDateTime startOfDay = LocalDateTime.now().plusDays(7).toLocalDate().atStartOfDay();
|
||||
LocalDateTime endOfDay = LocalDateTime.now().plusDays(7).toLocalDate().atTime(23, 59, 59);
|
||||
@@ -1278,7 +1294,7 @@ public class StripeServiceImpl implements StripeService {
|
||||
boolean b = sendEmail(subscriptionInfo.getSubscriptionId(), "reminder", null);
|
||||
if (b) log.info("提前7天向用户 {} 发送续订通知邮件", subscriptionInfo.getAccountId());
|
||||
}
|
||||
}
|
||||
}*/
|
||||
|
||||
public void checkSubscriptionExpiration(){
|
||||
long epochSecond = Instant.now().getEpochSecond();
|
||||
|
||||
@@ -0,0 +1,78 @@
|
||||
package com.ai.da.service.impl;
|
||||
|
||||
import com.ai.da.mapper.primary.ToProductImageResultMapper;
|
||||
import com.ai.da.mapper.primary.entity.CollectionSort;
|
||||
import com.ai.da.mapper.primary.entity.ToProductImageResult;
|
||||
import com.ai.da.mapper.primary.entity.UserLike;
|
||||
import com.ai.da.service.CollectionSortService;
|
||||
import com.ai.da.service.ToProductImageResultService;
|
||||
import com.ai.da.service.UserLikeService;
|
||||
import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
|
||||
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
|
||||
import io.netty.util.internal.StringUtil;
|
||||
import lombok.RequiredArgsConstructor;
|
||||
import lombok.extern.slf4j.Slf4j;
|
||||
import org.springframework.stereotype.Service;
|
||||
|
||||
import java.util.Objects;
|
||||
|
||||
@Slf4j
|
||||
@Service
|
||||
@RequiredArgsConstructor
|
||||
public class ToProductImageResultServiceImpl extends ServiceImpl<ToProductImageResultMapper, ToProductImageResult> implements ToProductImageResultService {
|
||||
|
||||
private final CollectionSortService collectionSortService;
|
||||
|
||||
private final UserLikeService userLikeService;
|
||||
|
||||
// 获取未被like的to product\relight的parentId
|
||||
public Long getUnlikedResultParentId(ToProductImageResult toProductImageResult, String url) {
|
||||
// 卫语句处理null情况
|
||||
if (toProductImageResult == null && StringUtil.isNullOrEmpty(url)) {
|
||||
return null;
|
||||
}
|
||||
|
||||
// 如果需要查询结果对象
|
||||
if (toProductImageResult == null) {
|
||||
toProductImageResult = baseMapper.selectOne(
|
||||
new QueryWrapper<ToProductImageResult>().eq("url", url));
|
||||
}
|
||||
|
||||
// 卫语句处理查询结果为空的情况
|
||||
if (toProductImageResult == null) {
|
||||
return null;
|
||||
}
|
||||
|
||||
// 根据不同类型处理
|
||||
String elementType = toProductImageResult.getElementType();
|
||||
if ("DesignOutfit".equals(elementType)) {
|
||||
return handleDesignOutfitCase(toProductImageResult);
|
||||
} else if ("ToProductImage".equals(elementType)) {
|
||||
// 两种情况 resultType : ToProductImage | Relight
|
||||
return handleToProductImageCase(toProductImageResult);
|
||||
}
|
||||
|
||||
return null;
|
||||
}
|
||||
|
||||
private Long handleDesignOutfitCase(ToProductImageResult result) {
|
||||
UserLike userLike = userLikeService.getByDesignOutfitId(result.getElementId());
|
||||
if (userLike == null) {
|
||||
return null;
|
||||
}
|
||||
|
||||
CollectionSort collectionSort = collectionSortService.queryCollectionSortByRelation(
|
||||
userLike.getId(), "Design", result.getProjectId());
|
||||
return collectionSort != null ? collectionSort.getId() : null;
|
||||
}
|
||||
|
||||
private Long handleToProductImageCase(ToProductImageResult result) {
|
||||
CollectionSort collectionSort = collectionSortService.queryCollectionSortByRelation(
|
||||
result.getElementId(), result.getResultType(), result.getProjectId());
|
||||
if (Objects.isNull(collectionSort) && result.getElementType().equals("ToProductImage")) {
|
||||
ToProductImageResult toProductImageResult = baseMapper.selectById(result.getElementId());
|
||||
return getUnlikedResultParentId(toProductImageResult, null);
|
||||
}
|
||||
return collectionSort != null ? collectionSort.getParentId() : null;
|
||||
}
|
||||
}
|
||||
125
src/main/java/com/ai/da/service/impl/UserFollowServiceImpl.java
Normal file
125
src/main/java/com/ai/da/service/impl/UserFollowServiceImpl.java
Normal file
@@ -0,0 +1,125 @@
|
||||
package com.ai.da.service.impl;
|
||||
|
||||
import com.ai.da.common.constant.CommonConstant;
|
||||
import com.ai.da.common.context.UserContext;
|
||||
import com.ai.da.common.utils.MinioUtil;
|
||||
import com.ai.da.mapper.primary.UserFollowMapper;
|
||||
import com.ai.da.mapper.primary.entity.UserFollow;
|
||||
import com.ai.da.model.dto.GetFollowListDTO;
|
||||
import com.ai.da.model.vo.AccountFollowVO;
|
||||
import com.ai.da.service.UserFollowService;
|
||||
import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
|
||||
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
|
||||
import io.netty.util.internal.StringUtil;
|
||||
import lombok.RequiredArgsConstructor;
|
||||
import lombok.extern.slf4j.Slf4j;
|
||||
import org.springframework.stereotype.Service;
|
||||
|
||||
import java.time.LocalDateTime;
|
||||
import java.util.ArrayList;
|
||||
import java.util.List;
|
||||
import java.util.Map;
|
||||
import java.util.Objects;
|
||||
import java.util.stream.Collectors;
|
||||
|
||||
@Slf4j
|
||||
@Service
|
||||
@RequiredArgsConstructor
|
||||
public class UserFollowServiceImpl extends ServiceImpl<UserFollowMapper, UserFollow> implements UserFollowService {
|
||||
|
||||
private final MinioUtil minioUtil;
|
||||
|
||||
public Long getFolloweeCount(Long accountId) {
|
||||
QueryWrapper<UserFollow> queryWrapper = new QueryWrapper<>();
|
||||
queryWrapper.eq("follower_id", accountId).select("followee_id");
|
||||
return baseMapper.selectCount(queryWrapper);
|
||||
}
|
||||
|
||||
// 获取某个用户的关注列表 + 按名字查询
|
||||
public List<AccountFollowVO> getFolloweeList(GetFollowListDTO getFollowListDTO) {
|
||||
Long accountId = UserContext.getUserHolder().getId();
|
||||
// 1、判断是否有按用户名查询
|
||||
List<AccountFollowVO> followeeList;
|
||||
if (!StringUtil.isNullOrEmpty(getFollowListDTO.getSearchByName())) {
|
||||
followeeList = baseMapper.getFolloweeListByName(getFollowListDTO.getSearchByName(), accountId);
|
||||
} else {
|
||||
// 2、查全部 分页查询
|
||||
String order = StringUtil.isNullOrEmpty(getFollowListDTO.getOrder()) ? "DESC" : getFollowListDTO.getOrder().equals("DESC") ? "DESC" : "ASC";
|
||||
Integer limit = getFollowListDTO.getSize() > 0 ? getFollowListDTO.getSize() : 20;
|
||||
Integer offset = getFollowListDTO.getPage() > 0 ? (getFollowListDTO.getPage() - 1) * getFollowListDTO.getSize() : 0;
|
||||
followeeList = baseMapper.getFolloweeListByFollower(accountId, limit, offset, order);
|
||||
}
|
||||
|
||||
if (!followeeList.isEmpty()) {
|
||||
followeeList.forEach(followee -> {
|
||||
String avatar = StringUtil.isNullOrEmpty(followee.getAvatar()) ? CommonConstant.DEFAULT_AVATAR : followee.getAvatar();
|
||||
followee.setAvatar(minioUtil.getPreSignedUrl(avatar, CommonConstant.MINIO_IMAGE_EXPIRE_TIME));
|
||||
});
|
||||
return followeeList;
|
||||
}
|
||||
return new ArrayList<>();
|
||||
}
|
||||
|
||||
public Long getFollowerCount(Long accountId) {
|
||||
QueryWrapper<UserFollow> queryWrapper = new QueryWrapper<>();
|
||||
queryWrapper.eq("followee_id", accountId).select("follower_id");
|
||||
return baseMapper.selectCount(queryWrapper);
|
||||
}
|
||||
|
||||
// 获取某个用户的粉丝列表 + 按名字查询 需返回是否关注该粉丝
|
||||
public List<AccountFollowVO> getFollowerList(GetFollowListDTO getFollowListDTO) {
|
||||
Long accountId = UserContext.getUserHolder().getId();
|
||||
|
||||
// 获取当前用户的所有粉丝
|
||||
QueryWrapper<UserFollow> qw = new QueryWrapper<>();
|
||||
qw.eq("follower_id", accountId).select("followee_id", "create_time");
|
||||
List<UserFollow> userFollows = baseMapper.selectList(qw);
|
||||
Map<Long, LocalDateTime> followeeMap = userFollows.stream().collect(Collectors.toMap(UserFollow::getFolloweeId, UserFollow::getCreateTime));
|
||||
|
||||
List<AccountFollowVO> followerList;
|
||||
// 1、判断是否有按用户名查询粉丝
|
||||
if (!StringUtil.isNullOrEmpty(getFollowListDTO.getSearchByName())) {
|
||||
followerList = baseMapper.getFollowerListByName(getFollowListDTO.getSearchByName(), accountId);
|
||||
} else {
|
||||
// 2、查全部 分页查询
|
||||
String order = StringUtil.isNullOrEmpty(getFollowListDTO.getOrder()) ? "DESC" : getFollowListDTO.getOrder().equals("DESC") ? "DESC" : "ASC";
|
||||
Integer limit = getFollowListDTO.getSize() > 0 ? getFollowListDTO.getSize() : 20;
|
||||
Integer offset = getFollowListDTO.getPage() > 0 ? (getFollowListDTO.getPage() - 1) * getFollowListDTO.getSize() : 0;
|
||||
followerList = baseMapper.getFollowerListByFollowee(accountId, limit, offset, order);
|
||||
}
|
||||
|
||||
if (!followerList.isEmpty()) {
|
||||
// 判断当前用户是否与粉丝互关
|
||||
followerList.forEach(follower -> {
|
||||
String avatar = StringUtil.isNullOrEmpty(follower.getAvatar()) ? CommonConstant.DEFAULT_AVATAR : follower.getAvatar();
|
||||
follower.setAvatar(minioUtil.getPreSignedUrl(avatar, CommonConstant.MINIO_IMAGE_EXPIRE_TIME));
|
||||
follower.setIsFollow(Objects.isNull(followeeMap.get(follower.getSenderId())) ? 0 : 1);
|
||||
// follower.setFollowTime(followeeMap.get(follower.getUserId()));
|
||||
});
|
||||
return followerList;
|
||||
}
|
||||
return new ArrayList<>();
|
||||
}
|
||||
|
||||
public Integer getIfFollowed(Long followeeId, Long followerId) {
|
||||
// 设置当前用户是否关注了所查看作品的作者
|
||||
QueryWrapper<UserFollow> queryWrapper = new QueryWrapper<>();
|
||||
queryWrapper.eq("followee_id", followeeId).eq("follower_id", followerId);
|
||||
UserFollow userFollow = baseMapper.selectOne(queryWrapper);
|
||||
return Objects.isNull(userFollow) ? 0 : 1;
|
||||
}
|
||||
|
||||
/**
|
||||
* 获取关注列表
|
||||
*
|
||||
* @param accountId
|
||||
* @return
|
||||
*/
|
||||
public List<Long> getFolloweeList(Long accountId) {
|
||||
QueryWrapper<UserFollow> qw = new QueryWrapper<>();
|
||||
qw.eq("follower_id", accountId).select("followee_id");
|
||||
|
||||
List<UserFollow> userFollows = baseMapper.selectList(qw);
|
||||
return userFollows.stream().map(UserFollow::getFolloweeId).collect(Collectors.toList());
|
||||
}
|
||||
}
|
||||
@@ -29,7 +29,9 @@ import com.alibaba.fastjson.JSONObject;
|
||||
import com.alibaba.fastjson.serializer.SerializerFeature;
|
||||
import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
|
||||
import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
|
||||
|
||||
import java.util.Comparator;
|
||||
|
||||
import com.baomidou.mybatisplus.core.conditions.update.UpdateWrapper;
|
||||
import com.baomidou.mybatisplus.core.metadata.IPage;
|
||||
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
|
||||
@@ -38,6 +40,7 @@ import com.google.common.base.Function;
|
||||
import com.google.gson.Gson;
|
||||
import io.minio.errors.MinioException;
|
||||
import io.netty.util.internal.StringUtil;
|
||||
import lombok.RequiredArgsConstructor;
|
||||
import lombok.extern.slf4j.Slf4j;
|
||||
import org.springframework.beans.factory.annotation.Value;
|
||||
import org.springframework.stereotype.Service;
|
||||
@@ -66,98 +69,54 @@ import java.util.stream.Collectors;
|
||||
*/
|
||||
@Slf4j
|
||||
@Service
|
||||
@RequiredArgsConstructor
|
||||
public class UserLikeGroupServiceImpl extends ServiceImpl<UserLikeGroupMapper, UserLikeGroup> implements UserLikeGroupService {
|
||||
@Resource
|
||||
private UserLikeGroupMapper userLikeGroupMapper;
|
||||
@Resource
|
||||
private AccountService accountService;
|
||||
@Resource
|
||||
private CollectionService collectionService;
|
||||
@Resource
|
||||
private UserLikeService userLikeService;
|
||||
@Resource
|
||||
private WorkspaceService workspaceService;
|
||||
@Resource
|
||||
private UserLikeMapper userLikeMapper;
|
||||
@Resource
|
||||
private MinioUtil minioUtil;
|
||||
@Resource
|
||||
private TDesignPythonOutfitMapper designPythonOutfitMapper;
|
||||
@Resource
|
||||
private DesignMapper designMapper;
|
||||
@Resource
|
||||
private DesignService designService;
|
||||
@Resource
|
||||
private SysFileMapper sysFileMapper;
|
||||
@Resource
|
||||
private LibraryMapper libraryMapper;
|
||||
@Resource
|
||||
private GenerateDetailMapper generateDetailMapper;
|
||||
@Resource
|
||||
private PortfolioMapper portfolioMapper;
|
||||
@Resource
|
||||
private TagsMapper tagsMapper;
|
||||
@Resource
|
||||
private DesignItemDetailService designItemDetailService;
|
||||
@Resource
|
||||
private CollectionElementMapper collectionElementMapper;
|
||||
@Resource
|
||||
private AttributeRetrievalMapper attributeRetrievalMapper;
|
||||
@Resource
|
||||
private ProductImageAttributeMapper productImageAttributeMapper;
|
||||
@Resource
|
||||
private CollectionSortMapper collectionSortMapper;
|
||||
@Resource
|
||||
private ClassificationService classificationService;
|
||||
@Resource
|
||||
private final UserLikeGroupMapper userLikeGroupMapper;
|
||||
private final AccountService accountService;
|
||||
private final CollectionService collectionService;
|
||||
private final UserLikeService userLikeService;
|
||||
private final WorkspaceService workspaceService;
|
||||
private final UserLikeMapper userLikeMapper;
|
||||
private final MinioUtil minioUtil;
|
||||
private final TDesignPythonOutfitMapper designPythonOutfitMapper;
|
||||
private final DesignMapper designMapper;
|
||||
private final MoodboardPositionService moodboardPositionService;
|
||||
private final SysFileMapper sysFileMapper;
|
||||
private final LibraryMapper libraryMapper;
|
||||
private final GenerateDetailMapper generateDetailMapper;
|
||||
private final PortfolioMapper portfolioMapper;
|
||||
private final TagsMapper tagsMapper;
|
||||
private final DesignItemDetailService designItemDetailService;
|
||||
private final CollectionElementMapper collectionElementMapper;
|
||||
private final AttributeRetrievalMapper attributeRetrievalMapper;
|
||||
private final ProductImageAttributeMapper productImageAttributeMapper;
|
||||
private final CollectionSortMapper collectionSortMapper;
|
||||
private final ClassificationService classificationService;
|
||||
// private ProjectMapper projectMapper;
|
||||
private ProjectService projectService;
|
||||
@Resource
|
||||
private PortfolioService portfolioService;
|
||||
@Resource
|
||||
private LibraryModelPointMapper libraryModelPointMapper;
|
||||
@Resource
|
||||
private LibraryService libraryService;
|
||||
@Resource
|
||||
private BrandDNAMapper brandDNAMapper;
|
||||
@Resource
|
||||
private BrandRelLibraryMapper brandRelLibraryMapper;
|
||||
@Resource
|
||||
private ThreeDLayoutMapper threeDLayoutMapper;
|
||||
@Resource
|
||||
private ThreeDPatternLayoutMapper threeDPatternLayoutMapper;
|
||||
@Resource
|
||||
private ThreeDDetailMapper threeDDetailMapper;
|
||||
@Resource
|
||||
private ThreeDSimpleMapper threeDSimpleMapper;
|
||||
@Resource
|
||||
private ThreeDModuleMapper threeDModuleMapper;
|
||||
@Resource
|
||||
private ProductImageService productImageService;
|
||||
@Resource
|
||||
private CollectionElementRelModelMapper collectionElementRelModelMapper;
|
||||
@Resource
|
||||
private CollectionSortService collectionSortService;
|
||||
@Resource
|
||||
private GenerateService generateService;
|
||||
@Resource
|
||||
private ToProductElementMapper toProductElementMapper;
|
||||
@Resource
|
||||
private ToProductImageRecordMapper toProductImageRecordMapper;
|
||||
@Resource
|
||||
private ToProductImageResultMapper toProductImageResultMapper;
|
||||
@Resource
|
||||
private CloudTaskMapper cloudTaskMapper;
|
||||
@Resource
|
||||
private PythonService pythonService;
|
||||
@Resource
|
||||
private CreditsService creditsService;
|
||||
@Resource
|
||||
private PoseTransformationMapper poseTransformationMapper;
|
||||
@Resource
|
||||
private ExportFileMapper exportFileMapper;
|
||||
@Resource
|
||||
private DesignItemDetailCanvasMapper designItemDetailCanvasMapper;
|
||||
private final ProjectService projectService;
|
||||
private final LibraryModelPointMapper libraryModelPointMapper;
|
||||
private final LibraryService libraryService;
|
||||
private final BrandDNAMapper brandDNAMapper;
|
||||
private final BrandRelLibraryMapper brandRelLibraryMapper;
|
||||
private final ThreeDLayoutMapper threeDLayoutMapper;
|
||||
private final ThreeDPatternLayoutMapper threeDPatternLayoutMapper;
|
||||
private final ThreeDDetailMapper threeDDetailMapper;
|
||||
private final ThreeDSimpleMapper threeDSimpleMapper;
|
||||
private final ThreeDModuleMapper threeDModuleMapper;
|
||||
private final ProductImageService productImageService;
|
||||
private final CollectionElementRelModelMapper collectionElementRelModelMapper;
|
||||
private final CollectionSortService collectionSortService;
|
||||
private final GenerateService generateService;
|
||||
private final ToProductElementMapper toProductElementMapper;
|
||||
private final ToProductImageRecordMapper toProductImageRecordMapper;
|
||||
private final ToProductImageResultMapper toProductImageResultMapper;
|
||||
private final ToProductImageResultService toProductImageResultService;
|
||||
private final CloudTaskMapper cloudTaskMapper;
|
||||
private final PythonService pythonService;
|
||||
private final CreditsService creditsService;
|
||||
private final PoseTransformationMapper poseTransformationMapper;
|
||||
private final ExportFileMapper exportFileMapper;
|
||||
private final DesignItemDetailCanvasMapper designItemDetailCanvasMapper;
|
||||
@Value("${redis.key.generateResult}")
|
||||
private String generateResultKey;
|
||||
|
||||
@@ -2033,7 +1992,7 @@ public class UserLikeGroupServiceImpl extends ServiceImpl<UserLikeGroupMapper, U
|
||||
}
|
||||
if (userLikeGroupVO.getOriginal() == 0) {
|
||||
userLikeGroupVO.setOriginalAccountName(accountService.getById(userLikeGroupVO.getOriginalAccountId()).getUserName());
|
||||
Portfolio byId = portfolioService.getByIdAll(userLikeGroupVO.getOriginalPortfolioId());
|
||||
Portfolio byId = portfolioMapper.getByIdAll(userLikeGroupVO.getOriginalPortfolioId());
|
||||
if (Objects.nonNull(byId)) {
|
||||
String portfolioName = byId.getPortfolioName();
|
||||
userLikeGroupVO.setOriginalPortfolioName(portfolioName);
|
||||
@@ -2368,7 +2327,7 @@ public class UserLikeGroupServiceImpl extends ServiceImpl<UserLikeGroupMapper, U
|
||||
if (Objects.nonNull(toProductImageRecord)) {
|
||||
vo.setPrompt(toProductImageRecord.getPrompt());
|
||||
}
|
||||
vo.setParentId(getUnlikedResultParentId(result, null));
|
||||
vo.setParentId(toProductImageResultService.getUnlikedResultParentId(result, null));
|
||||
// 按isLike分类
|
||||
if (result.getIsLike() != null && result.getIsLike() == 1) {
|
||||
likedList.add(vo);
|
||||
@@ -2497,56 +2456,6 @@ public class UserLikeGroupServiceImpl extends ServiceImpl<UserLikeGroupMapper, U
|
||||
return duration.toHours() >= 1;
|
||||
}
|
||||
|
||||
// 获取未被like的to product\relight的parentId
|
||||
public Long getUnlikedResultParentId(ToProductImageResult toProductImageResult, String url) {
|
||||
// 卫语句处理null情况
|
||||
if (toProductImageResult == null && StringUtil.isNullOrEmpty(url)) {
|
||||
return null;
|
||||
}
|
||||
|
||||
// 如果需要查询结果对象
|
||||
if (toProductImageResult == null) {
|
||||
toProductImageResult = toProductImageResultMapper.selectOne(
|
||||
new QueryWrapper<ToProductImageResult>().eq("url", url));
|
||||
}
|
||||
|
||||
// 卫语句处理查询结果为空的情况
|
||||
if (toProductImageResult == null) {
|
||||
return null;
|
||||
}
|
||||
|
||||
// 根据不同类型处理
|
||||
String elementType = toProductImageResult.getElementType();
|
||||
if ("DesignOutfit".equals(elementType)) {
|
||||
return handleDesignOutfitCase(toProductImageResult);
|
||||
} else if ("ToProductImage".equals(elementType)) {
|
||||
// 两种情况 resultType : ToProductImage | Relight
|
||||
return handleToProductImageCase(toProductImageResult);
|
||||
}
|
||||
|
||||
return null;
|
||||
}
|
||||
|
||||
private Long handleDesignOutfitCase(ToProductImageResult result) {
|
||||
UserLike userLike = userLikeService.getByDesignOutfitId(result.getElementId());
|
||||
if (userLike == null) {
|
||||
return null;
|
||||
}
|
||||
|
||||
CollectionSort collectionSort = collectionSortService.queryCollectionSortByRelation(
|
||||
userLike.getId(), "Design", result.getProjectId());
|
||||
return collectionSort != null ? collectionSort.getId() : null;
|
||||
}
|
||||
|
||||
private Long handleToProductImageCase(ToProductImageResult result) {
|
||||
CollectionSort collectionSort = collectionSortService.queryCollectionSortByRelation(
|
||||
result.getElementId(), result.getResultType(), result.getProjectId());
|
||||
if (Objects.isNull(collectionSort) && result.getElementType().equals("ToProductImage")) {
|
||||
ToProductImageResult toProductImageResult = toProductImageResultMapper.selectById(result.getElementId());
|
||||
return getUnlikedResultParentId(toProductImageResult, null);
|
||||
}
|
||||
return collectionSort != null ? collectionSort.getParentId() : null;
|
||||
}
|
||||
|
||||
@Override
|
||||
@Transactional
|
||||
@@ -2568,7 +2477,7 @@ public class UserLikeGroupServiceImpl extends ServiceImpl<UserLikeGroupMapper, U
|
||||
collectionElementMapper.updateById(compositeImage);
|
||||
if (!StringUtils.isEmpty(moodBoard.getMoodboardPosition())) {
|
||||
// 合成图位置信息通过collectElementId关联(旧逻辑通过collectionId关联)
|
||||
designService.parseMoodboardPosition(moodBoard.getMoodboardPosition(), compositeImage.getId());
|
||||
moodboardPositionService.parseMoodboardPosition(moodBoard.getMoodboardPosition(), compositeImage.getId());
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -3358,6 +3267,7 @@ public class UserLikeGroupServiceImpl extends ServiceImpl<UserLikeGroupMapper, U
|
||||
toProductElementVO.setUrl(minioUtil.getPreSignedUrl(toProductElementVO.getUrl(), 24 * 60));
|
||||
return toProductElementVO;
|
||||
}
|
||||
|
||||
private String buildAdvancedPrompt(Long projectId, String prompt) {
|
||||
String process = projectService.getById(projectId).getProcess();
|
||||
String ageGroup = null;
|
||||
|
||||
@@ -12,17 +12,14 @@ import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
|
||||
import com.baomidou.mybatisplus.core.conditions.update.UpdateWrapper;
|
||||
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
|
||||
import com.google.common.collect.Lists;
|
||||
import lombok.RequiredArgsConstructor;
|
||||
import lombok.extern.slf4j.Slf4j;
|
||||
import org.springframework.stereotype.Service;
|
||||
import org.springframework.transaction.annotation.Transactional;
|
||||
import org.springframework.util.CollectionUtils;
|
||||
|
||||
import javax.annotation.Resource;
|
||||
import java.util.ArrayList;
|
||||
import java.util.HashMap;
|
||||
import java.util.List;
|
||||
import java.util.Map;
|
||||
import java.util.stream.Collectors;
|
||||
|
||||
/**
|
||||
* 服务实现类
|
||||
@@ -32,13 +29,10 @@ import java.util.stream.Collectors;
|
||||
*/
|
||||
@Slf4j
|
||||
@Service
|
||||
@RequiredArgsConstructor
|
||||
public class UserLikeServiceImpl extends ServiceImpl<UserLikeMapper, UserLike> implements UserLikeService {
|
||||
@Resource
|
||||
private UserLikeMapper userLikeMapper;
|
||||
@Resource
|
||||
private UserLikeGroupMapper userLikeGroupMapper;
|
||||
@Resource
|
||||
private DesignItemServiceImpl designItemService;
|
||||
private final UserLikeMapper userLikeMapper;
|
||||
private final UserLikeGroupMapper userLikeGroupMapper;
|
||||
|
||||
@Override
|
||||
public List<UserLikeVO> getGroupDetail(Long userGroupId) {
|
||||
@@ -50,12 +44,6 @@ public class UserLikeServiceImpl extends ServiceImpl<UserLikeMapper, UserLike> i
|
||||
return Lists.newArrayList();
|
||||
}
|
||||
return CopyUtil.copyList(userLikes, UserLikeVO.class);
|
||||
// List<Long> designItemIds = userLikes.stream().map(UserLike::getDesignItemId).collect(Collectors.toList());
|
||||
// List<DesignItem> designItems = designItemService.listByIds(designItemIds);
|
||||
// Map<Long,String> idToUrlMap = designItems.stream().collect(Collectors.toMap(DesignItem::getId,DesignItem::getDesignUrl));
|
||||
// return CopyUtil.copyList(userLikes,UserLikeVO.class,(o,d) ->{
|
||||
// d.setUrl(idToUrlMap.get(o.getDesignItemId()));
|
||||
// });
|
||||
}
|
||||
|
||||
@Override
|
||||
|
||||
@@ -1112,4 +1112,32 @@ public class WorkspaceServiceImpl extends ServiceImpl<WorkspaceMapper, Workspace
|
||||
return kvs;
|
||||
}
|
||||
|
||||
@Override
|
||||
public String getAgeGroupByProjectOrCollectionId(Long projectId, Long collectionId) {
|
||||
if (Objects.nonNull(projectId)) {
|
||||
Workspace workspace = getWSByProjectId(projectId);
|
||||
if (workspace != null && !StringUtil.isNullOrEmpty(workspace.getAgeGroup())) {
|
||||
return workspace.getAgeGroup();
|
||||
}
|
||||
} else if (Objects.nonNull(collectionId) && collectionId != 0) {
|
||||
List<CollectionElement> byCollectionId = getByCollectionId(collectionId);
|
||||
if (byCollectionId != null && !byCollectionId.isEmpty()) {
|
||||
projectId = byCollectionId.get(0).getProjectId();
|
||||
if (projectId != null && projectId != 0L) {
|
||||
Workspace workspace = getWSByProjectId(projectId);
|
||||
if (workspace != null && !StringUtil.isNullOrEmpty(workspace.getAgeGroup())) {
|
||||
return workspace.getAgeGroup();
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
return AgeGroup.ADULT.getValue();
|
||||
}
|
||||
|
||||
private List<CollectionElement> getByCollectionId(Long collectionId) {
|
||||
QueryWrapper<CollectionElement> queryWrapper = new QueryWrapper<>();
|
||||
queryWrapper.lambda().eq(CollectionElement::getCollectionId, collectionId);
|
||||
return collectionElementMapper.selectList(queryWrapper);
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
@@ -7,7 +7,7 @@ spring.datasource.primary.username=root
|
||||
spring.datasource.primary.password=QWa998345
|
||||
|
||||
spring.datasource.secondary.driver-class-name=com.mysql.cj.jdbc.Driver
|
||||
spring.datasource.secondary.jdbcUrl=jdbc:mysql://18.167.251.121:33008/attribute_retrieval_new_style?useUnicode=true&characterEncoding=UTF-8&useSSL=false&serverTimezone=Asia/Shanghai&allowPublicKeyRetrieval=true
|
||||
spring.datasource.secondary.jdbcUrl=jdbc:mysql://18.167.251.121:33008/attribute_retrieval_style?useUnicode=true&characterEncoding=UTF-8&useSSL=false&serverTimezone=Asia/Shanghai&allowPublicKeyRetrieval=true
|
||||
spring.datasource.secondary.username=aida_con
|
||||
spring.datasource.secondary.password=123456
|
||||
|
||||
|
||||
Reference in New Issue
Block a user