TASK: 保存画布时返回画布id

BUGFIX: 用户输入的prompt没有传入flux
This commit is contained in:
2025-07-31 14:57:20 +08:00
parent c444d5a69f
commit 7edc959432
10 changed files with 130 additions and 43 deletions

View File

@@ -3,9 +3,13 @@ package com.ai.da.service;
import com.ai.da.mapper.primary.entity.APIGenerate;
import com.baomidou.mybatisplus.extension.service.IService;
import java.util.List;
public interface APIGenerateService extends IService<APIGenerate> {
void addAPIGenerateRecordAsync(String taskId, String function, String modelName, String status);
void addAPIGenerateRecordAsync(Long accountId, String taskId, String function, String modelName, String status);
void updateAPIGenerateStatusAsync(String taskId, String status);
List<APIGenerate> getPendingTaskByStatus(String modelName);
}

View File

@@ -44,7 +44,7 @@ public interface UserLikeGroupService extends IService<UserLikeGroup> {
void updateDate(Long id,String timeZone);
Boolean exportSave(MultipartFile file, Long projectId, String module, Long designItemDetailId);
Long exportSave(MultipartFile file, Long projectId, String module, Long designItemDetailId);
List<ToProductImageResultVO> toProduct(ToProductImageDTO toProductImageDTO);

View File

@@ -12,17 +12,24 @@ import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;
import java.time.LocalDateTime;
import java.util.Arrays;
import java.util.List;
import java.util.Objects;
import static com.ai.da.common.enums.FluxTaskStatusEnum.PENDING_F;
import static com.ai.da.common.enums.WangXiangTaskStatusEnum.PENDING_W;
import static com.ai.da.common.enums.WangXiangTaskStatusEnum.RUNNING;
@Slf4j
@Service
public class APIGenerateServiceImpl extends ServiceImpl<APIGenerateMapper, APIGenerate> implements APIGenerateService {
@Async
public void addAPIGenerateRecordAsync(String taskId, String function, String modelName, String status){
public void addAPIGenerateRecordAsync(Long accountId, String taskId, String function, String modelName, String status){
log.info("异步执行添加");
if (!StringUtil.isNullOrEmpty(taskId) && !StringUtil.isNullOrEmpty(modelName)){
APIGenerate apiGenerate = new APIGenerate();
apiGenerate.setAccountId(accountId);
apiGenerate.setTaskId(taskId);
apiGenerate.setFunc(function);
apiGenerate.setModelName(modelName);
@@ -65,4 +72,14 @@ public class APIGenerateServiceImpl extends ServiceImpl<APIGenerateMapper, APIGe
public void updateAPIGenerateRecord(APIGenerate apiGenerate){
baseMapper.updateById(apiGenerate);
}
public List<APIGenerate> getPendingTaskByStatus(String modelName){
QueryWrapper<APIGenerate> qw = new QueryWrapper<>();
// 仅获取还在运行中的任务,成功的,失败的,均需排除
// flux 任务状态:
List<String> pendingStatus = Arrays.asList(PENDING_F.getName(), PENDING_W.getName(), RUNNING.getName());
qw.lambda().eq(APIGenerate::getModelName, modelName).in(APIGenerate::getStatus, pendingStatus);
return baseMapper.selectList(qw);
}
}

View File

@@ -49,7 +49,6 @@ import org.bytedeco.javacv.FFmpegFrameGrabber;
import org.bytedeco.javacv.Java2DFrameConverter;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.dao.DuplicateKeyException;
import org.springframework.scheduling.annotation.Async;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;
import org.springframework.util.StringUtils;
@@ -72,6 +71,8 @@ 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.TO_PRODUCT_IMAGE;
import static com.ai.da.common.enums.CreditsEventsEnum.TO_PRODUCT_IMAGE_FLUX;
import static com.ai.da.common.enums.WangXiangTaskStatusEnum.FAILED;
import static com.ai.da.common.enums.WangXiangTaskStatusEnum.UNKNOWN_W;
@Slf4j
@Service
@@ -437,6 +438,7 @@ public class GenerateServiceImpl extends ServiceImpl<GenerateMapper, Generate> i
}
// generate.setText(text);
default:
text = translated;
}
return text;
}
@@ -1481,7 +1483,7 @@ public class GenerateServiceImpl extends ServiceImpl<GenerateMapper, Generate> i
taskId = animateAnyone(poseTransformDTO, accountId);
if (!StringUtil.isNullOrEmpty(taskId)){
isRequestSuccess = true;
apiGenerateService.addAPIGenerateRecordAsync(taskId, Module.poseTransfer.getValue(), "wx", "Pending");
apiGenerateService.addAPIGenerateRecordAsync(accountId, taskId, Module.poseTransfer.getValue(), "wx", "Pending");
}
poseTransformation.setModelName("wx");
} else {
@@ -2282,7 +2284,7 @@ public class GenerateServiceImpl extends ServiceImpl<GenerateMapper, Generate> i
JSONObject jsonResponse = JSONUtil.parseObj(resp);
JSONObject output = jsonResponse.getJSONObject("output");
String status = output.getStr("task_status");
if (status.equals(STATUS_FAILED) || status.equals(STATUS_UNKNOWN)) {
if (status.equals(FAILED.getName()) || status.equals(UNKNOWN_W.getName())) {
return null;
}
return output.getStr("task_id");
@@ -2355,13 +2357,6 @@ public class GenerateServiceImpl extends ServiceImpl<GenerateMapper, Generate> i
return templateId;
}
// 定义任务状态常量
private static final String STATUS_SUCCESS = "SUCCEEDED";
private static final String STATUS_FAILED = "FAILED";
private static final String STATUS_UNKNOWN = "UNKNOWN";
private static final String STATUS_RUNNING = "RUNNING";
private static final String STATUS_PENDING = "PENDING";
public String pollTemplateIdResult(String taskId) {
int attempt = 0;
boolean isCompleted = false;
@@ -2382,21 +2377,21 @@ public class GenerateServiceImpl extends ServiceImpl<GenerateMapper, Generate> i
JSONObject response = JSONUtil.parseObj(httpResponse.body());
JSONObject output = JSONUtil.parseObj(response.getStr("output"));
String taskStatus = output.getStr("task_status", "UNKNOWN");
WangXiangTaskStatusEnum statusEnum = WangXiangTaskStatusEnum.fromName(taskStatus);
System.out.println("当前任务状态: " + taskStatus);
switch (taskStatus) {
case STATUS_SUCCESS:
switch (statusEnum) {
case SUCCEEDED:
templateId = handleSuccessResponse(response);
isCompleted = true;
break;
case STATUS_FAILED:
case STATUS_UNKNOWN:
case FAILED:
case UNKNOWN_W:
handleFailedResponse(response);
isCompleted = true;
break;
case STATUS_RUNNING:
case STATUS_PENDING:
case RUNNING:
case PENDING_W:
// 任务仍在运行,继续等待
break;
default:
@@ -2455,12 +2450,13 @@ public class GenerateServiceImpl extends ServiceImpl<GenerateMapper, Generate> i
JSONObject output = JSONUtil.parseObj(outputStr);
String videoUrl = output.getStr("video_url");
String status = output.getStr("task_status");
WangXiangTaskStatusEnum statusEnum = WangXiangTaskStatusEnum.fromName(status);
apiGenerateService.updateAPIGenerateStatusAsync(taskId, status);
PoseTransformationVO poseTransformationVO = new PoseTransformationVO();
switch (status) {
case STATUS_SUCCESS:
switch (statusEnum) {
case SUCCEEDED:
List<PoseTransformation> poseTransformations = poseTransformationMapper.selectList(new QueryWrapper<PoseTransformation>().eq("unique_id", taskId).orderByDesc("id"));
if (!poseTransformations.isEmpty()) {
PoseTransformation poseTransformation = poseTransformations.get(0);
@@ -2488,13 +2484,13 @@ public class GenerateServiceImpl extends ServiceImpl<GenerateMapper, Generate> i
redisUtil.addToString(key, new Gson().toJson(poseTransformationVO), CommonConstant.GENERATE_RESULT_EXPIRE_TIME);
}
break;
case STATUS_FAILED:
case FAILED:
throw new BusinessException(output.getStr("message"), ResultEnum.PROMPT.getCode());
case STATUS_UNKNOWN:
case UNKNOWN_W:
poseTransformationVO.setStatus("Fail");
break;
case STATUS_RUNNING:
case STATUS_PENDING:
case RUNNING:
case PENDING_W:
// 任务仍在运行,继续等待
poseTransformationVO.setStatus("Executing");
break;
@@ -2786,6 +2782,7 @@ public class GenerateServiceImpl extends ServiceImpl<GenerateMapper, Generate> i
requestBody.set("output_format", "png");
log.info("flux 请求入参:{}", requestBody);
if (prompt.isEmpty())throw new BusinessException("test");
if (!StringUtil.isNullOrEmpty(imagePath)) {
try {
String imageAsBase64 = null;
@@ -2816,7 +2813,7 @@ public class GenerateServiceImpl extends ServiceImpl<GenerateMapper, Generate> i
String key = RedisUtil.FLUX_POLLING_URL + taskId;
redisUtil.addToString(key, pollingUrl, CommonConstant.GENERATE_RESULT_EXPIRE_TIME);
// 添加到api_generate表中以便之后对结果查询做补偿
apiGenerateService.addAPIGenerateRecordAsync(taskId, func.getName(), "flux", "Pending");
apiGenerateService.addAPIGenerateRecordAsync(UserContext.getUserHolder().getId(), taskId, func.getName(), "flux", "Pending");
return taskId;
}
@@ -2842,23 +2839,23 @@ public class GenerateServiceImpl extends ServiceImpl<GenerateMapper, Generate> i
JSONObject respObj = JSONUtil.parseObj(resp);
String status = respObj.getStr("status");
FluxTaskStatusEnum statusEnum = FluxTaskStatusEnum.fromName(status);
// 异步更新状态
apiGenerateService.updateAPIGenerateStatusAsync(taskId, status);
// 处理不同状态
switch (status) {
case "Task not found":
switch (statusEnum) {
case TASK_NOT_FOUND:
// 审核没过
case "Request Moderated":
case REQUEST_MODERATED:
// 审核没过
case "Content Moderated":
case CONTENT_MODERATED:
// 出错
case "Error":
case ERROR:
return "Fail";
case "Pending":
case PENDING_F:
return "Pending";
case "Ready":
case SUCCESS:
// 已完成 获取结果
return handleReadyStatus(respObj, objectName);
default:

View File

@@ -354,7 +354,7 @@ public class UserLikeGroupServiceImpl extends ServiceImpl<UserLikeGroupMapper, U
}
@Override
public Boolean exportSave(MultipartFile file, Long projectId, String module, Long designItemDetailId) {
public Long exportSave(MultipartFile file, Long projectId, String module, Long designItemDetailId) {
AuthPrincipalVo userHolder = UserContext.getUserHolder();
if (Objects.isNull(projectId) && !module.equals("designItemDetail")){
log.warn("用户 {} 保存 {} 模块的画布时, projectId为空", userHolder.getId(), module);
@@ -377,8 +377,9 @@ public class UserLikeGroupServiceImpl extends ServiceImpl<UserLikeGroupMapper, U
}
// String upload = minioUtil.upload("aida-users", userHolder.getId() + "/exportFile", file);
ExportFile exportFile = null;
if (CollectionUtil.isNotEmpty(exportFiles)) {
ExportFile exportFile = exportFiles.get(0);
exportFile = exportFiles.get(0);
// 更新画布信息时只重新上传图片不用修改数据库url
String url = exportFile.getUrl();
String path = url.substring(url.indexOf("/") + 1);
@@ -387,7 +388,7 @@ public class UserLikeGroupServiceImpl extends ServiceImpl<UserLikeGroupMapper, U
// exportFileMapper.updateById(exportFile);
}else {
String upload = minioUtil.upload("aida-users", userHolder.getId() + "/exportFile", file);
ExportFile exportFile = new ExportFile();
exportFile = new ExportFile();
exportFile.setProjectId(projectId);
exportFile.setModule(module);
exportFile.setUrl(upload);
@@ -396,7 +397,7 @@ public class UserLikeGroupServiceImpl extends ServiceImpl<UserLikeGroupMapper, U
designItemDetailService.saveDesignItemDetailCanvas(designItemDetailId, exportFile.getId());
}
}
return Boolean.TRUE;
return exportFile.getId();
}
@Override
@@ -1268,7 +1269,7 @@ public class UserLikeGroupServiceImpl extends ServiceImpl<UserLikeGroupMapper, U
if (toProductImageResult.getStatus().equals("Success") && !StringUtil.isNullOrEmpty(toProductImageResult.getUrl())){
fluxResult = toProductImageResult.getUrl();
}else {
String objectName = project.getAccountId() + "/product_image/" + taskId + ".png";
String objectName = project.getAccountId() + "/relight_image/" + taskId + ".png";
fluxResult = generateService.getFluxResult(taskId, objectName);
}