TASK:1. 通过定时任务,补偿获取第三方api的运行结果;

2. pose 生成,对使用万相模型的生成限流,最大支持5个并发
3. Slogan限流,一分钟内,最多接收3个请求
This commit is contained in:
2025-08-01 17:21:41 +08:00
parent 132f48eb60
commit 4ad2cd027c
9 changed files with 3511 additions and 3326 deletions

View File

@@ -293,7 +293,7 @@ public class GenerateConsumer {
} else { } else {
// 修改redis中的数据状态为exception // 修改redis中的数据状态为exception
String key = generateResultKey + ":" + generateResult.get("tasks_id"); String key = generateResultKey + ":" + generateResult.get("tasks_id");
generateService.updatePoseTransferStatus(generateResult.get("tasks_id"), "Fail"); generateService.updatePoseTransferStatus(generateResult.get("tasks_id"), "Fail", null);
redisUtil.addToString(key, new Gson().toJson(new PoseTransformationVO(null, generateResult.get("tasks_id"),null, null, null, (byte)0, "Fail")), CommonConstant.GENERATE_RESULT_EXPIRE_TIME); redisUtil.addToString(key, new Gson().toJson(new PoseTransformationVO(null, generateResult.get("tasks_id"),null, null, null, (byte)0, "Fail")), CommonConstant.GENERATE_RESULT_EXPIRE_TIME);
// 将异常信息存到exception中 // 将异常信息存到exception中
HashMap<String, String> exceptionInfo = new HashMap<>(); HashMap<String, String> exceptionInfo = new HashMap<>();
@@ -529,7 +529,7 @@ public class GenerateConsumer {
} else { } else {
// 修改redis中的数据状态为exception // 修改redis中的数据状态为exception
String key = generateResultKey + ":" + generateResult.getString("task_id"); String key = generateResultKey + ":" + generateResult.getString("task_id");
generateService.updatePoseTransferStatus(generateResult.getString("task_id"), "Fail"); generateService.updatePoseTransferStatus(generateResult.getString("task_id"), "Fail", null);
redisUtil.addToString(key, new Gson().toJson(new PoseTransformationVO(null, generateResult.getString("task_id"),null, null, null, (byte)0, "Fail")), CommonConstant.GENERATE_RESULT_EXPIRE_TIME); redisUtil.addToString(key, new Gson().toJson(new PoseTransformationVO(null, generateResult.getString("task_id"),null, null, null, (byte)0, "Fail")), CommonConstant.GENERATE_RESULT_EXPIRE_TIME);
// 将异常信息存到exception中 // 将异常信息存到exception中
HashMap<String, String> exceptionInfo = new HashMap<>(); HashMap<String, String> exceptionInfo = new HashMap<>();

View File

@@ -0,0 +1,134 @@
package com.ai.da.common.task;
import com.ai.da.common.config.exception.BusinessException;
import com.ai.da.common.utils.DateUtil;
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.service.APIGenerateService;
import com.ai.da.service.CreditsService;
import com.ai.da.service.GenerateService;
import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
import io.netty.util.internal.StringUtil;
import lombok.extern.slf4j.Slf4j;
import org.springframework.scheduling.annotation.Scheduled;
import org.springframework.stereotype.Component;
import javax.annotation.Resource;
import java.time.LocalDateTime;
import java.util.List;
import java.util.Objects;
import static com.ai.da.common.enums.CreditsEventsEnum.TO_PRODUCT_IMAGE;
@Slf4j
@Component
public class GenerateTask {
@Resource
private APIGenerateService apiGenerateService;
@Resource
private CreditsService creditsService;
@Resource
private GenerateService generateService;
@Resource
private ToProductImageResultMapper toProductImageResultMapper;
@Resource
private PoseTransformationMapper poseTransformationMapper;
/*
* 对于使用了第三方api的允许异步获得结果的生成功能可能在第三方接口的结果Ready时没有及时存储结果导致第三方链接失效
* 万相 24h失效
* flux 10mins失效 使用了flux接口的功能 ToProductImage || Relight, Pattern这里不做补偿
* 故这里通过定时任务做补偿
* flux五分钟查询一次万相1小时查询一次
*/
@Scheduled(cron = "0 */4 * * * ?")
public void fluxCompensationMechanism(){
// 1、查所有 任务还没成功、还没失败正在等待或者执行中的任务id有哪些
// 由于获取结果的polling_url在redis中只存一天大部分结果超过一天之后就无法再找到任务小部分可以通过公共路径查到结果
List<APIGenerate> apiGenerates = apiGenerateService.getPendingTaskByStatus("flux");
if (apiGenerates != null && !apiGenerates.isEmpty()){
for (APIGenerate apiGenerate : apiGenerates){
String taskId = apiGenerate.getTaskId();
// 1. 根据taskId查toProductImageResult 判断当前任务状态与超时状态
ToProductImageResult toProductImageResult = toProductImageResultMapper.selectOne(new QueryWrapper<ToProductImageResult>().eq("task_id", taskId));
if (Objects.nonNull(toProductImageResult) && "Pending".equals(toProductImageResult.getStatus())){
// 判断当前任务的超时状态
if (!DateUtil.isMoreThanOneDayApart(toProductImageResult.getCreateTime())){
// 1. 未超时,获取当前任务结果
String fileName = toProductImageResult.getResultType().equals(TO_PRODUCT_IMAGE.getName()) ? "product_image" : "relight_image";
String objectName = apiGenerate.getAccountId() + "/" + fileName +"/" + taskId + ".png";
String fluxResult = generateService.getFluxResult(taskId, objectName);
// 2. 成功获取结果下载图片上传至minio,更新toProductImageResult表
if (StringUtil.isNullOrEmpty(fluxResult) || fluxResult.equals("Fail")){
toProductImageResult.setStatus("Fail");
toProductImageResultMapper.updateById(toProductImageResult);
apiGenerate.setStatus("Fail");
apiGenerate.setUpdateTime(LocalDateTime.now());
apiGenerateService.updateById(apiGenerate);
} else if (!fluxResult.equals("Pending")){
if (StringUtil.isNullOrEmpty(toProductImageResult.getUrl())){
toProductImageResult.setStatus("Success");
toProductImageResult.setUrl(fluxResult);
toProductImageResultMapper.updateById(toProductImageResult);
apiGenerate.setStatus("Success");
apiGenerate.setUpdateTime(LocalDateTime.now());
apiGenerateService.updateById(apiGenerate);
}
// 扣积分
Boolean flag = creditsService.taskCreditsDeduction(apiGenerate.getAccountId(), taskId);
if (flag) creditsService.updateChangedCredits(String.valueOf(apiGenerate.getAccountId()), taskId);
}
} else {
// 超时,设置状态为失败
toProductImageResult.setStatus("Fail");
toProductImageResultMapper.updateById(toProductImageResult);
apiGenerate.setStatus("Fail");
apiGenerate.setUpdateTime(LocalDateTime.now());
apiGenerateService.updateById(apiGenerate);
}
}
}
}
}
// 万相 -> pose transformation 补偿 一小时执行一次
@Scheduled(fixedDelay = 60 * 60 * 1000)
public void wxCompensationMechanism(){
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 (!DateUtil.isMoreThanOneDayApart(poseTransformation.getCreateTime())){
try {
// 方法中已经完成了pose_transformation和api_generate表的更新不用额外做处理
generateService.getAnimateResult(taskId);
} catch (BusinessException e){
log.warn("万相 animation 生成失败,原因:{}", e.getMessage());
}
}
} else {
poseTransformation.setTaskStatus("Fail");
poseTransformation.setUpdateTime(LocalDateTime.now());
poseTransformationMapper.updateById(poseTransformation);
apiGenerate.setStatus("Fail");
apiGenerate.setUpdateTime(LocalDateTime.now());
apiGenerateService.updateById(apiGenerate);
}
}
}
}
}

View File

@@ -5,10 +5,7 @@ import lombok.extern.slf4j.Slf4j;
import java.text.ParseException; import java.text.ParseException;
import java.text.SimpleDateFormat; import java.text.SimpleDateFormat;
import java.time.Instant; import java.time.*;
import java.time.LocalDate;
import java.time.LocalDateTime;
import java.time.ZoneId;
import java.time.format.DateTimeFormatter; import java.time.format.DateTimeFormatter;
import java.util.Date; import java.util.Date;
import java.util.Locale; import java.util.Locale;
@@ -101,4 +98,10 @@ public class DateUtil {
return localDate.format(DateTimeFormatter.ofPattern(CommonConstant.TIME_FORMAT_MMM_dd_yyyy_EEEE, Locale.US)); return localDate.format(DateTimeFormatter.ofPattern(CommonConstant.TIME_FORMAT_MMM_dd_yyyy_EEEE, Locale.US));
} }
public static boolean isMoreThanOneDayApart(LocalDateTime givenDateTime) {
LocalDateTime now = LocalDateTime.now();
Duration duration = Duration.between(givenDateTime, now);
return duration.toHours() >= 24;
}
} }

View File

@@ -9,6 +9,7 @@ import com.fasterxml.jackson.databind.ObjectMapper;
import lombok.extern.slf4j.Slf4j; import lombok.extern.slf4j.Slf4j;
import org.apache.commons.lang3.StringUtils; import org.apache.commons.lang3.StringUtils;
import org.springframework.data.redis.core.RedisTemplate; import org.springframework.data.redis.core.RedisTemplate;
import org.springframework.data.redis.core.ValueOperations;
import org.springframework.data.redis.core.ZSetOperations; import org.springframework.data.redis.core.ZSetOperations;
import org.springframework.data.redis.core.script.DefaultRedisScript; import org.springframework.data.redis.core.script.DefaultRedisScript;
import org.springframework.stereotype.Component; import org.springframework.stereotype.Component;
@@ -594,4 +595,19 @@ public class RedisUtil {
return count; return count;
} }
public boolean allowRequest(String apiKey) {
String key = "rate_limit:" + apiKey;
ValueOperations<String, String> ops = redisTemplate.opsForValue();
// 使用Redis的INCR命令
Long count = ops.increment(key, 1);
if (count == 1) {
// 第一次调用,设置过期时间
redisTemplate.expire(key, 1, TimeUnit.MINUTES);
}
return count <= 3;
}
} }

View File

@@ -1,233 +1,240 @@
package com.ai.da.controller; package com.ai.da.controller;
import com.ai.da.common.enums.CreditsEventsEnum; import com.ai.da.common.enums.CreditsEventsEnum;
import com.ai.da.common.response.Response; import com.ai.da.common.response.Response;
import com.ai.da.mapper.primary.entity.CollectionSort; import com.ai.da.mapper.primary.entity.CollectionSort;
import com.ai.da.model.dto.*; import com.ai.da.model.dto.*;
import com.ai.da.model.vo.*; import com.ai.da.model.vo.*;
import com.ai.da.service.GenerateService; import com.ai.da.service.GenerateService;
import io.swagger.annotations.Api; import io.swagger.annotations.Api;
import io.swagger.annotations.ApiOperation; import io.swagger.annotations.ApiOperation;
import io.swagger.annotations.ApiParam; import io.swagger.annotations.ApiParam;
import lombok.extern.slf4j.Slf4j; import lombok.extern.slf4j.Slf4j;
import org.springframework.web.bind.annotation.*; import org.springframework.http.ResponseEntity;
import org.springframework.web.bind.annotation.*;
import javax.annotation.Resource;
import javax.validation.Valid; import javax.annotation.Resource;
import javax.validation.constraints.NotNull; import javax.validation.Valid;
import java.util.List; import javax.validation.constraints.NotNull;
import java.util.Map; import java.util.List;
import java.util.Map;
/**
* @author XP /**
*/ * @author XP
@Api(tags = "Generate模块") */
@Slf4j @Api(tags = "Generate模块")
@RestController @Slf4j
@RequestMapping("/api/generate") @RestController
public class GenerateController { @RequestMapping("/api/generate")
public class GenerateController {
@Resource
private GenerateService generateService; @Resource
private GenerateService generateService;
/*@ApiOperation("自动识别sketch的caption 暂时未上")
@PostMapping("/caption") /*@ApiOperation("自动识别sketch的caption 暂时未上")
public Response<GenerateCaptionVO> generateCaption(@RequestParam Long sketchElementId) { @PostMapping("/caption")
return Response.success(generateService.generateCaption(sketchElementId)); public Response<GenerateCaptionVO> generateCaption(@RequestParam Long sketchElementId) {
}*/ return Response.success(generateService.generateCaption(sketchElementId));
}*/
/*@ApiOperation("通过文字、图片生成图片")
@PostMapping("/sketchAndPrint") /*@ApiOperation("通过文字、图片生成图片")
public void generateThroughImageText(@Valid @RequestBody GenerateThroughImageTextDTO generateThroughImageTextDTO) { @PostMapping("/sketchAndPrint")
// return Response.success(generateService.generateThroughImageText(generateThroughImageTextDTO)); public void generateThroughImageText(@Valid @RequestBody GenerateThroughImageTextDTO generateThroughImageTextDTO) {
generateService.generateThroughImageText(generateThroughImageTextDTO); // return Response.success(generateService.generateThroughImageText(generateThroughImageTextDTO));
}*/ generateService.generateThroughImageText(generateThroughImageTextDTO);
}*/
@ApiOperation("喜欢生成的图片")
@PostMapping("/like") @ApiOperation("喜欢生成的图片")
public Response<GenerateLikeVO> like(@Valid @RequestBody GenerateLikeDTO generateLikeDTO) { @PostMapping("/like")
return Response.success(generateService.generateLike(generateLikeDTO)); public Response<GenerateLikeVO> like(@Valid @RequestBody GenerateLikeDTO generateLikeDTO) {
} return Response.success(generateService.generateLike(generateLikeDTO));
}
@ApiOperation(value = "取消喜欢")
@GetMapping("/dislike") @ApiOperation(value = "取消喜欢")
public Response<Boolean> dislike(@ApiParam("generateDetailId") @RequestParam Long generateDetailId, @GetMapping("/dislike")
@ApiParam("timeZone") @RequestParam String timeZone) { public Response<Boolean> dislike(@ApiParam("generateDetailId") @RequestParam Long generateDetailId,
return Response.success(generateService.generateDislike(generateDetailId, timeZone)); @ApiParam("timeZone") @RequestParam String timeZone) {
} return Response.success(generateService.generateDislike(generateDetailId, timeZone));
}
@ApiOperation(value = "发起生成请求,异步获取结果")
@PostMapping("/prepare") @ApiOperation(value = "发起生成请求,异步获取结果")
public Response<PrepareForGenerateVO> prepareForGenerate(@Valid @RequestBody GenerateThroughImageTextDTO generateThroughImageTextDTO) { @PostMapping("/prepare")
return Response.success(generateService.prepareForGenerate(generateThroughImageTextDTO)); public ResponseEntity<Response<PrepareForGenerateVO>> prepareForGenerate(@Valid @RequestBody GenerateThroughImageTextDTO generateThroughImageTextDTO) {
} PrepareForGenerateVO prepareForGenerateVO = generateService.prepareForGenerate(generateThroughImageTextDTO);
if (prepareForGenerateVO.getStatus().equals(200)){
@ApiOperation(value = "取消继续生成") prepareForGenerateVO.setStatus(0);
@GetMapping("/stopWaiting") return ResponseEntity.ok(Response.success(prepareForGenerateVO));
public Response<String> stopWaiting(@RequestParam("userId") Long userId, } else {
@RequestParam("uniqueId") List<String> uniqueId, return ResponseEntity.status(prepareForGenerateVO.getStatus()).body(Response.fail("The rate limit has been exceeded. Please wait 1 minute before retrying."));
@RequestParam("timeZone") String timeZone, }
@RequestParam("type") String type) { }
generateService.cancelGenerate(userId, uniqueId, timeZone, type);
return Response.success("stop waiting successfully"); @ApiOperation(value = "取消继续生成")
} @GetMapping("/stopWaiting")
public Response<String> stopWaiting(@RequestParam("userId") Long userId,
/*@ApiOperation(value = "获取生成结果") @RequestParam("uniqueId") List<String> uniqueId,
@GetMapping("/result") @RequestParam("timeZone") String timeZone,
public Response<GenerateCollectionVO> getGenerateResult(@RequestParam("uniqueId") String uniqueId) { @RequestParam("type") String type) {
GenerateCollectionVO generateResult = generateService.getGenerateResult(uniqueId); generateService.cancelGenerate(userId, uniqueId, timeZone, type);
return Response.success(generateResult); return Response.success("stop waiting successfully");
}*/ }
@ApiOperation(value = "获取生成结果") /*@ApiOperation(value = "获取生成结果")
@PostMapping("/result") @GetMapping("/result")
public Response<List<GenerateResultVO>> getGenerateResults(@Valid @RequestBody List<String> taskIdList) { public Response<GenerateCollectionVO> getGenerateResult(@RequestParam("uniqueId") String uniqueId) {
List<GenerateResultVO> generateResult = generateService.getGenerateResultList(taskIdList); GenerateCollectionVO generateResult = generateService.getGenerateResult(uniqueId);
return Response.success(generateResult); return Response.success(generateResult);
} }*/
@ApiOperation(value = "imageToSketch") @ApiOperation(value = "获取生成结果")
@PostMapping("/imageToSketch") @PostMapping("/result")
public Response<String> imageToSketch(@Valid @RequestBody ImageToSketchDTO imageToSketchDTO) { public Response<List<GenerateResultVO>> getGenerateResults(@Valid @RequestBody List<String> taskIdList) {
return Response.success(generateService.imageToSketchAsync(imageToSketchDTO, null, null)); List<GenerateResultVO> generateResult = generateService.getGenerateResultList(taskIdList);
// return Response.success(generateService.imageToSketch(imageToSketchDTO, null, null)); return Response.success(generateResult);
} }
// modifySketch @ApiOperation(value = "imageToSketch")
@ApiOperation(value = "modifySketch") @PostMapping("/imageToSketch")
@PostMapping("/modifySketch") public Response<String> imageToSketch(@Valid @RequestBody ImageToSketchDTO imageToSketchDTO) {
public Response<GenerateResultVO> modifySketch(@Valid @RequestBody GenerateModifyDTO generateModifyDTO) { return Response.success(generateService.imageToSketchAsync(imageToSketchDTO, null, null));
return Response.success(generateService.modifySketch(generateModifyDTO)); // return Response.success(generateService.imageToSketch(imageToSketchDTO, null, null));
} }
@ApiOperation(value = "请求进行姿势变换") // modifySketch
@PostMapping("/poseTransform") @ApiOperation(value = "modifySketch")
public Response<ToProductImageResultVO> poseTransform(@Valid @RequestBody PoseTransformDTO poseTransformDTO) { @PostMapping("/modifySketch")
return Response.success(generateService.poseTransform(poseTransformDTO)); public Response<GenerateResultVO> modifySketch(@Valid @RequestBody GenerateModifyDTO generateModifyDTO) {
} return Response.success(generateService.modifySketch(generateModifyDTO));
}
@ApiOperation(value = "获取姿势变换生成结果")
@PostMapping("/poseTransformResult") @ApiOperation(value = "请求进行姿势变换")
public Response<List<PoseTransformationVO>> getPoseTransformationResults(@Valid @RequestBody List<String> taskIdList) { @PostMapping("/poseTransform")
List<PoseTransformationVO> generateResult = generateService.getPoseTransformationResult(taskIdList, null, null); public Response<ToProductImageResultVO> poseTransform(@Valid @RequestBody PoseTransformDTO poseTransformDTO) {
return Response.success(generateResult); return Response.success(generateService.poseTransform(poseTransformDTO));
} }
@ApiOperation("喜欢或取消喜欢姿势变换生成的图片") @ApiOperation(value = "获取姿势变换生成结果")
@PostMapping("/likeOrDislike") @PostMapping("/poseTransformResult")
public Response<CollectionSort> likeOrDislike(@ApiParam("id") @RequestParam Long transformedId, @ApiParam("like || dislike") @RequestParam String likeOrDislike, @RequestParam("projectId") Long projectId, @RequestParam(value = "collectionSortParentId", required = false) Long collectionSortParentId) { public Response<List<PoseTransformationVO>> getPoseTransformationResults(@Valid @RequestBody List<String> taskIdList) {
return Response.success(generateService.disOrLikePose(transformedId, likeOrDislike, projectId, collectionSortParentId)); List<PoseTransformationVO> generateResult = generateService.getPoseTransformationResult(taskIdList, null, null);
} return Response.success(generateResult);
}
@ApiOperation(value = "修改模特比例")
@PostMapping("/modifyProportion") @ApiOperation("喜欢或取消喜欢姿势变换生成的图片")
public Response<String> modifyModelProportion(@Valid @RequestBody ModifyModelProportionDTO proportionDTO){ @PostMapping("/likeOrDislike")
String path = generateService.modifyModelProportion(proportionDTO); public Response<CollectionSort> likeOrDislike(@ApiParam("id") @RequestParam Long transformedId, @ApiParam("like || dislike") @RequestParam String likeOrDislike, @RequestParam("projectId") Long projectId, @RequestParam(value = "collectionSortParentId", required = false) Long collectionSortParentId) {
return Response.success(path); return Response.success(generateService.disOrLikePose(transformedId, likeOrDislike, projectId, collectionSortParentId));
} }
@ApiOperation(value = "拼贴图生成线稿") @ApiOperation(value = "修改模特比例")
@PostMapping("/genSketchRecon") @PostMapping("/modifyProportion")
public Response<GenerateResultVO> sketchReconstructionGenerate(@Valid @RequestBody SketchReconstructionDTO sketchReconstructionDTO){ public Response<String> modifyModelProportion(@Valid @RequestBody ModifyModelProportionDTO proportionDTO){
GenerateResultVO generateResultVO = generateService.sketchReconstructionGenerate(sketchReconstructionDTO); String path = generateService.modifyModelProportion(proportionDTO);
return Response.success(generateResultVO); return Response.success(path);
} }
@ApiOperation(value = "获取拼贴图最后一次生成结果") @ApiOperation(value = "拼贴图生成线稿")
@GetMapping("/getReconLastResult") @PostMapping("/genSketchRecon")
public Response<SketchReconstructionVO> getSketchReconstruction(@RequestParam("projectId") Long projectId){ public Response<GenerateResultVO> sketchReconstructionGenerate(@Valid @RequestBody SketchReconstructionDTO sketchReconstructionDTO){
SketchReconstructionVO sketchReconstruction = generateService.getSketchReconstruction(projectId); GenerateResultVO generateResultVO = generateService.sketchReconstructionGenerate(sketchReconstructionDTO);
return Response.success(sketchReconstruction); return Response.success(generateResultVO);
} }
@ApiOperation(value = "获取pose transfer的所有pose") @ApiOperation(value = "获取拼贴图最后一次生成结果")
@GetMapping("/getAllPose") @GetMapping("/getReconLastResult")
public Response<List<Map<String, String>>> getAllPose(){ public Response<SketchReconstructionVO> getSketchReconstruction(@RequestParam("projectId") Long projectId){
return Response.success(generateService.getAllPose()); SketchReconstructionVO sketchReconstruction = generateService.getSketchReconstruction(projectId);
} return Response.success(sketchReconstruction);
}
@ApiOperation(value = "删除pose transfer的结果")
@GetMapping("/deleteResult") @ApiOperation(value = "获取pose transfer的所有pose")
public Response<String> deleteToProductRelightResult(@RequestParam("projectId") @NotNull Long projectId, @GetMapping("/getAllPose")
@RequestParam("id") @NotNull Long id){ public Response<List<Map<String, String>>> getAllPose(){
try{ return Response.success(generateService.getAllPose());
generateService.deleteGeneratedPose(projectId, id); }
return Response.success();
}catch (Exception e){ @ApiOperation(value = "删除pose transfer的结果")
return Response.fail(e.getMessage()); @GetMapping("/deleteResult")
} public Response<String> deleteToProductRelightResult(@RequestParam("projectId") @NotNull Long projectId,
} @RequestParam("id") @NotNull Long id){
try{
/*@ApiOperation(value = "万象 t2i 创建异步任务") generateService.deleteGeneratedPose(projectId, id);
@GetMapping("/createAsyncTask") return Response.success();
public Response<String> createAsyncTask(@RequestParam("prompt") String prompt){ }catch (Exception e){
return Response.success(generateService.createAsyncTask(87L, prompt, "")); return Response.fail(e.getMessage());
} }
}
@ApiOperation(value = "万象 t2i 获取异步任务结果")
@GetMapping("/waitAsyncTask") /*@ApiOperation(value = "万象 t2i 创建异步任务")
public Response<GenerateResultVO> waitAsyncTask(@RequestParam("taskId") String taskId){ @GetMapping("/createAsyncTask")
return Response.success(generateService.getAsyncTaskResult(taskId)); public Response<String> createAsyncTask(@RequestParam("prompt") String prompt){
} return Response.success(generateService.createAsyncTask(87L, prompt, ""));
}
@ApiOperation(value = "万象 图生动图")
@GetMapping("/animateAnyone") @ApiOperation(value = "万象 t2i 获取异步任务结果")
public Response<String> animateAnyone(@Valid @RequestBody PoseTransformDTO poseTransformDTO){ @GetMapping("/waitAsyncTask")
return Response.success(generateService.animateAnyone(poseTransformDTO, null)); public Response<GenerateResultVO> waitAsyncTask(@RequestParam("taskId") String taskId){
} return Response.success(generateService.getAsyncTaskResult(taskId));
}
@ApiOperation(value = "万象 获取动图模板id")
@GetMapping("/getVideoTemplateId") @ApiOperation(value = "万象 图生动图")
public Response<String> getVideoTemplateId(@RequestParam("videoPath") String videoPath){ @GetMapping("/animateAnyone")
return Response.success(generateService.getVideoTemplateId(videoPath)); public Response<String> animateAnyone(@Valid @RequestBody PoseTransformDTO poseTransformDTO){
} return Response.success(generateService.animateAnyone(poseTransformDTO, null));
}
@ApiOperation(value = "万象 获取动图结果")
@GetMapping("/getAnimateResult") @ApiOperation(value = "万象 获取动图模板id")
public Response<PoseTransformationVO> getAnimateResult(@RequestParam("taskId") String taskId){ @GetMapping("/getVideoTemplateId")
return Response.success(generateService.getAnimateResult(taskId)); public Response<String> getVideoTemplateId(@RequestParam("videoPath") String videoPath){
} return Response.success(generateService.getVideoTemplateId(videoPath));
}
@ApiOperation(value = "freepik toProductImage")
@GetMapping("/reimagineFreePik") @ApiOperation(value = "万象 获取动图结果")
public Response<String> reimagineFreePik(@RequestParam("path") String path, @GetMapping("/getAnimateResult")
@RequestParam("prompt") String prompt, public Response<PoseTransformationVO> getAnimateResult(@RequestParam("taskId") String taskId){
@RequestParam("style") String style) throws IOException { return Response.success(generateService.getAnimateResult(taskId));
return Response.success(generateService.reimagineFreePik(path, prompt, style)); }
}
@ApiOperation(value = "freepik toProductImage")
@ApiOperation(value = "获取图片描述") @GetMapping("/reimagineFreePik")
@GetMapping("/getImageDescription") public Response<String> reimagineFreePik(@RequestParam("path") String path,
public Response<String> getImageDescription(@RequestParam("path") String path) { @RequestParam("prompt") String prompt,
return Response.success(generateService.getImageDescription(path)); @RequestParam("style") String style) throws IOException {
}*/ return Response.success(generateService.reimagineFreePik(path, prompt, style));
}
// @ApiOperation(value = "试用flux")
// @GetMapping("/flux") @ApiOperation(value = "获取图片描述")
public Response<String> flux(@RequestParam(value = "path", required = false) String path, @GetMapping("/getImageDescription")
@RequestParam("type") int type, public Response<String> getImageDescription(@RequestParam("path") String path) {
@RequestParam(value = "prompt", required = false) String prompt){ return Response.success(generateService.getImageDescription(path));
CreditsEventsEnum typeEnum = CreditsEventsEnum.RELIGHT; }*/
switch (type){
case 1: // @ApiOperation(value = "试用flux")
typeEnum = CreditsEventsEnum.TO_PRODUCT_IMAGE; // @GetMapping("/flux")
break; public Response<String> flux(@RequestParam(value = "path", required = false) String path,
case 2: @RequestParam("type") int type,
typeEnum = CreditsEventsEnum.IMAGE_TO_SKETCH; @RequestParam(value = "prompt", required = false) String prompt){
break; CreditsEventsEnum typeEnum = CreditsEventsEnum.RELIGHT;
case 3: switch (type){
typeEnum = CreditsEventsEnum.PATTERN; case 1:
break; typeEnum = CreditsEventsEnum.TO_PRODUCT_IMAGE;
} break;
return Response.success(generateService.flux(typeEnum, prompt, path, false)); case 2:
} typeEnum = CreditsEventsEnum.IMAGE_TO_SKETCH;
break;
// @ApiOperation(value = "获取flux结果") case 3:
// @GetMapping("/fluxResult") typeEnum = CreditsEventsEnum.PATTERN;
public Response<String> fluxResult(@RequestParam("taskId") String taskId){ break;
return Response.success(generateService.getFluxResult(taskId, "87/" + taskId + ".png")); }
} return Response.success(generateService.flux(typeEnum, prompt, path, false));
}
// @ApiOperation(value = "获取flux结果")
} // @GetMapping("/fluxResult")
public Response<String> fluxResult(@RequestParam("taskId") String taskId){
return Response.success(generateService.getFluxResult(taskId, "87/" + taskId + ".png"));
}
}

View File

@@ -1,27 +1,27 @@
package com.ai.da.model.vo; package com.ai.da.model.vo;
import io.swagger.annotations.ApiModel; import io.swagger.annotations.ApiModel;
import io.swagger.annotations.ApiModelProperty; import io.swagger.annotations.ApiModelProperty;
import lombok.Data; import lombok.Data;
import java.util.List; import java.util.List;
@Data @Data
@ApiModel("prepare for generate响应vo") @ApiModel("prepare for generate响应vo")
public class PrepareForGenerateVO { public class PrepareForGenerateVO {
@ApiModelProperty("uniqueId") @ApiModelProperty("uniqueId")
private List<String> uniqueId; private List<String> uniqueId;
@ApiModelProperty("剩余使用次数") @ApiModelProperty("剩余使用次数")
private Integer leftUsageCount; private Integer status;
public PrepareForGenerateVO(List<String> uniqueId, Integer leftUsageCount) { public PrepareForGenerateVO(List<String> uniqueId, Integer status) {
this.uniqueId = uniqueId; this.uniqueId = uniqueId;
this.leftUsageCount = leftUsageCount; this.status = status;
} }
public PrepareForGenerateVO(Integer leftUsageCount) { public PrepareForGenerateVO(Integer status) {
this.leftUsageCount = leftUsageCount; this.status = status;
} }
} }

View File

@@ -1,99 +1,99 @@
package com.ai.da.service; package com.ai.da.service;
import com.ai.da.common.enums.CreditsEventsEnum; import com.ai.da.common.enums.CreditsEventsEnum;
import com.ai.da.mapper.primary.entity.CollectionSort; import com.ai.da.mapper.primary.entity.CollectionSort;
import com.ai.da.mapper.primary.entity.Generate; import com.ai.da.mapper.primary.entity.Generate;
import com.ai.da.mapper.primary.entity.GenerateDetail; import com.ai.da.mapper.primary.entity.GenerateDetail;
import com.ai.da.model.dto.*; import com.ai.da.mapper.primary.entity.PoseTransformation;
import com.ai.da.model.vo.*; import com.ai.da.model.dto.*;
import com.baomidou.mybatisplus.extension.service.IService; import com.ai.da.model.vo.*;
import com.baomidou.mybatisplus.extension.service.IService;
import java.io.IOException;
import java.util.List; import java.io.IOException;
import java.util.Map; import java.util.List;
import java.util.Map;
public interface GenerateService extends IService<Generate> {
public interface GenerateService extends IService<Generate> {
GenerateCaptionVO generateCaption(Long sketchElementId);
GenerateCaptionVO generateCaption(Long sketchElementId);
void generateThroughImageText(GenerateThroughImageTextDTO generateThroughImageTextDTO);
void generateThroughImageText(GenerateThroughImageTextDTO generateThroughImageTextDTO);
void processGenerateResult(String taskId, String url, String category);
void processGenerateResult(String taskId, String url, String category);
void processToProductImageResult(String taskId, String url, String category);
void processToProductImageResult(String taskId, String url, String category);
void updateToProductTaskStatus(String taskId, String status);
void updateToProductTaskStatus(String taskId, String status);
GenerateLikeVO generateLike(GenerateLikeDTO generateLikeDTO);
GenerateLikeVO generateLike(GenerateLikeDTO generateLikeDTO);
Boolean generateDislike(Long generateDetailId, String timeZone);
Boolean generateDislike(Long generateDetailId, String timeZone);
void updateLikeStatusBatch(List<Long> generateDetailIdList, Byte hasLike, Long libraryId, String timeZone);
void updateLikeStatusBatch(List<Long> generateDetailIdList, Byte hasLike, Long libraryId, String timeZone);
List<GenerateDetail> selectBatchByLibraryId(List<Long> libraryId);
List<GenerateDetail> selectBatchByLibraryId(List<Long> libraryId);
// GenerateCollectionVO getGenerateResult(String uniqueId);
// GenerateCollectionVO getGenerateResult(String uniqueId);
List<GenerateResultVO> getGenerateResultList(List<String> taskIdList);
List<GenerateResultVO> getGenerateResultList(List<String> taskIdList);
PrepareForGenerateVO prepareForGenerate(GenerateThroughImageTextDTO generateThroughImageTextDTO);
PrepareForGenerateVO prepareForGenerate(GenerateThroughImageTextDTO generateThroughImageTextDTO);
Long getRankPosition(String uniqueId);
Long getRankPosition(String uniqueId);
void cancelGenerate(Long userId, List<String> uniqueId, String timeZone, String type);
void cancelGenerate(Long userId, List<String> uniqueId, String timeZone, String type);
void processRelightResult(String taskId, String url, String category);
void processRelightResult(String taskId, String url, String category);
List<Map<String, Object>> getCountByUserAndTime(String startTime, String endTime, List<Long> accountIdList);
List<Map<String, Object>> getCountByUserAndTime(String startTime, String endTime, List<Long> accountIdList);
GenerateResultVO imageToSketch(ImageToSketchDTO imageToSketchDTO, String collagePictureUrl, Long projectId);
GenerateResultVO imageToSketch(ImageToSketchDTO imageToSketchDTO, String collagePictureUrl, Long projectId);
String imageToSketchAsync(ImageToSketchDTO imageToSketchDTO, String collagePictureUrl, Long projectId);
String imageToSketchAsync(ImageToSketchDTO imageToSketchDTO, String collagePictureUrl, Long projectId);
GenerateResultVO modifySketch(GenerateModifyDTO generateModifyDTO);
GenerateResultVO modifySketch(GenerateModifyDTO generateModifyDTO);
ToProductImageResultVO poseTransform(PoseTransformDTO poseTransformDTO);
ToProductImageResultVO poseTransform(PoseTransformDTO poseTransformDTO);
void processPoseTransformResult(String taskId, String gifUrl, String videoUrl, String imageUrl);
void processPoseTransformResult(String taskId, String gifUrl, String videoUrl, String imageUrl);
List<PoseTransformationVO> getPoseTransformationResult(List<String> taskIdList, Long projectId, Boolean like);
List<PoseTransformationVO> getPoseTransformationResult(List<String> taskIdList, Long projectId, Boolean like);
void updatePoseTransferStatus(String taskId, String status);
void updatePoseTransferStatus(String taskId, String status, PoseTransformation poseTransformation);
CollectionSort disOrLikePose(Long transformedId, String likeOrDislike, Long projectId, Long sortLikeParentId); CollectionSort disOrLikePose(Long transformedId, String likeOrDislike, Long projectId, Long sortLikeParentId);
String modifyModelProportion(ModifyModelProportionDTO proportionDTO); String modifyModelProportion(ModifyModelProportionDTO proportionDTO);
GenerateResultVO sketchReconstructionGenerate(SketchReconstructionDTO sketchReconstructionDTO); GenerateResultVO sketchReconstructionGenerate(SketchReconstructionDTO sketchReconstructionDTO);
SketchReconstructionVO getSketchReconstruction(Long projectId); SketchReconstructionVO getSketchReconstruction(Long projectId);
List<Map<String, String>> getAllPose(); List<Map<String, String>> getAllPose();
void processPoseTransformResultBatch(String taskId, String gifUrl, String videoUrl, String imageUrl, String progress); void processPoseTransformResultBatch(String taskId, String gifUrl, String videoUrl, String imageUrl, String progress);
void processPoseTransformResultBatch(String taskId, String progress); void processPoseTransformResultBatch(String taskId, String progress);
void deleteGeneratedPose(Long projectId, Long id); void deleteGeneratedPose(Long projectId, Long id);
String createAsyncTask(GenerateThroughImageTextDTO generateThroughImageTextDTO); String createAsyncTask(GenerateThroughImageTextDTO generateThroughImageTextDTO);
GenerateResultVO getAsyncTaskResult(String taskId); GenerateResultVO getAsyncTaskResult(String taskId);
String animateAnyone(PoseTransformDTO poseTransformDTO, Long accountId); String animateAnyone(PoseTransformDTO poseTransformDTO, Long accountId);
String getVideoTemplateId(String videoPath); String getVideoTemplateId(String videoPath);
PoseTransformationVO getAnimateResult(String taskId); PoseTransformationVO getAnimateResult(String taskId);
String reimagineFreePik(String path, String prompt, String style) throws IOException; String reimagineFreePik(String path, String prompt, String style) throws IOException;
String getImageDescription(String imagePath); String getImageDescription(String imagePath);
String flux(CreditsEventsEnum func, String prompt, String imagePath, boolean childStyle); String flux(CreditsEventsEnum func, String prompt, String imagePath, boolean childStyle);
String getFluxResult(String taskId, String objectName); String getFluxResult(String taskId, String objectName);
byte[] downloadVideoOrImage(String url); byte[] downloadVideoOrImage(String url);
} }

View File

@@ -53,7 +53,8 @@ public class APIGenerateServiceImpl extends ServiceImpl<APIGenerateMapper, APIGe
qw.lambda().eq(APIGenerate::getTaskId, taskId); qw.lambda().eq(APIGenerate::getTaskId, taskId);
APIGenerate apiGenerate = baseMapper.selectOne(qw); APIGenerate apiGenerate = baseMapper.selectOne(qw);
if (Objects.nonNull(apiGenerate)){ if (Objects.nonNull(apiGenerate)){
if (apiGenerate.getStatus().equals("Ready") || apiGenerate.getStatus().equals("SUCCEEDED")) { if (apiGenerate.getStatus().equals("Ready") || apiGenerate.getStatus().equals("SUCCEEDED")
|| apiGenerate.getStatus().equals("Success")) {
log.warn("当前任务 {} 状态已达Success, 不做修改", taskId); log.warn("当前任务 {} 状态已达Success, 不做修改", taskId);
} else { } else {
apiGenerate.setStatus(status); apiGenerate.setStatus(status);

File diff suppressed because it is too large Load Diff