From 7edc9594328a0060f519e02af008a96ad0643ad5 Mon Sep 17 00:00:00 2001 From: xupei Date: Thu, 31 Jul 2025 14:57:20 +0800 Subject: [PATCH] =?UTF-8?q?TASK:=20=E4=BF=9D=E5=AD=98=E7=94=BB=E5=B8=83?= =?UTF-8?q?=E6=97=B6=E8=BF=94=E5=9B=9E=E7=94=BB=E5=B8=83id=20BUGFIX:=20?= =?UTF-8?q?=E7=94=A8=E6=88=B7=E8=BE=93=E5=85=A5=E7=9A=84prompt=E6=B2=A1?= =?UTF-8?q?=E6=9C=89=E4=BC=A0=E5=85=A5flux?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../da/common/enums/FluxTaskStatusEnum.java | 34 +++++++++++ .../common/enums/WangXiangTaskStatusEnum.java | 32 ++++++++++ .../controller/SavedCollectionController.java | 2 +- .../da/mapper/primary/entity/APIGenerate.java | 5 +- .../java/com/ai/da/python/PythonService.java | 1 + .../com/ai/da/service/APIGenerateService.java | 6 +- .../ai/da/service/UserLikeGroupService.java | 2 +- .../service/impl/APIGenerateServiceImpl.java | 19 +++++- .../da/service/impl/GenerateServiceImpl.java | 61 +++++++++---------- .../impl/UserLikeGroupServiceImpl.java | 11 ++-- 10 files changed, 130 insertions(+), 43 deletions(-) create mode 100644 src/main/java/com/ai/da/common/enums/FluxTaskStatusEnum.java create mode 100644 src/main/java/com/ai/da/common/enums/WangXiangTaskStatusEnum.java diff --git a/src/main/java/com/ai/da/common/enums/FluxTaskStatusEnum.java b/src/main/java/com/ai/da/common/enums/FluxTaskStatusEnum.java new file mode 100644 index 00000000..368447b2 --- /dev/null +++ b/src/main/java/com/ai/da/common/enums/FluxTaskStatusEnum.java @@ -0,0 +1,34 @@ +package com.ai.da.common.enums; + + +import lombok.AllArgsConstructor; +import lombok.Getter; + +@AllArgsConstructor +@Getter +public enum FluxTaskStatusEnum { + + SUCCESS("Ready"), + + TASK_NOT_FOUND("Task not found"), + + REQUEST_MODERATED("Request Moderated"), + + CONTENT_MODERATED("Content Moderated"), + + ERROR("Error"), + + PENDING_F("Pending"); + + private final String name; + + public static FluxTaskStatusEnum fromName(String name) { + for (FluxTaskStatusEnum status : values()) { + if (status.name.equalsIgnoreCase(name)) { + return status; + } + } + // 或者返回默认值 + return TASK_NOT_FOUND; + } +} diff --git a/src/main/java/com/ai/da/common/enums/WangXiangTaskStatusEnum.java b/src/main/java/com/ai/da/common/enums/WangXiangTaskStatusEnum.java new file mode 100644 index 00000000..eccc9d22 --- /dev/null +++ b/src/main/java/com/ai/da/common/enums/WangXiangTaskStatusEnum.java @@ -0,0 +1,32 @@ +package com.ai.da.common.enums; + +import lombok.AllArgsConstructor; +import lombok.Getter; + +@AllArgsConstructor +@Getter +public enum WangXiangTaskStatusEnum { + + SUCCEEDED("SUCCEEDED"), + + UNKNOWN_W("UNKNOWN"), + + FAILED("FAILED"), + + RUNNING("RUNNING"), + + PENDING_W("PENDING"); + + private final String name; + + // 通过name查找枚举的静态方法 + public static WangXiangTaskStatusEnum fromName(String name) { + for (WangXiangTaskStatusEnum status : values()) { + if (status.name.equalsIgnoreCase(name)) { + return status; + } + } + // 或者返回默认值 + return UNKNOWN_W; + } +} diff --git a/src/main/java/com/ai/da/controller/SavedCollectionController.java b/src/main/java/com/ai/da/controller/SavedCollectionController.java index 6957f91a..4bc6a939 100644 --- a/src/main/java/com/ai/da/controller/SavedCollectionController.java +++ b/src/main/java/com/ai/da/controller/SavedCollectionController.java @@ -178,7 +178,7 @@ public class SavedCollectionController { @ApiOperation(value = "exportSave") @PostMapping("/exportSave") - public Response exportSave(@RequestParam("file") MultipartFile file, @RequestParam(value = "projectId", required = false) Long projectId, + public Response exportSave(@RequestParam("file") MultipartFile file, @RequestParam(value = "projectId", required = false) Long projectId, @RequestParam("module") String module, @RequestParam(value = "designItemDetailId", required = false) Long designItemDetailId) { return Response.success(userLikeGroupService.exportSave(file, projectId, module, designItemDetailId)); } diff --git a/src/main/java/com/ai/da/mapper/primary/entity/APIGenerate.java b/src/main/java/com/ai/da/mapper/primary/entity/APIGenerate.java index a797c12f..282c686c 100644 --- a/src/main/java/com/ai/da/mapper/primary/entity/APIGenerate.java +++ b/src/main/java/com/ai/da/mapper/primary/entity/APIGenerate.java @@ -7,10 +7,11 @@ import lombok.EqualsAndHashCode; @EqualsAndHashCode(callSuper = true) @Data -@TableName("t_API_generate") +@TableName("t_api_generate") @ApiModel("调用第三方api的所有记录") public class APIGenerate extends BaseEntity{ - + // 用户id + private Long accountId; // 任务id 加唯一索引 private String taskId; // 什么功能调用的api diff --git a/src/main/java/com/ai/da/python/PythonService.java b/src/main/java/com/ai/da/python/PythonService.java index c0812b55..779528a2 100644 --- a/src/main/java/com/ai/da/python/PythonService.java +++ b/src/main/java/com/ai/da/python/PythonService.java @@ -3599,6 +3599,7 @@ public class PythonService { log.info("promptTranslation请求入参content###{}", jsonString); response = client.newCall(request).execute(); } catch (IOException ioException) { + response.close(); log.error("PythonService##promptTranslation异常###{}", ExceptionUtil.getThrowableList(ioException)); return text; } diff --git a/src/main/java/com/ai/da/service/APIGenerateService.java b/src/main/java/com/ai/da/service/APIGenerateService.java index 432c636a..270c68a2 100644 --- a/src/main/java/com/ai/da/service/APIGenerateService.java +++ b/src/main/java/com/ai/da/service/APIGenerateService.java @@ -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 { - 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 getPendingTaskByStatus(String modelName); } diff --git a/src/main/java/com/ai/da/service/UserLikeGroupService.java b/src/main/java/com/ai/da/service/UserLikeGroupService.java index ab0ce46f..55eb1f39 100644 --- a/src/main/java/com/ai/da/service/UserLikeGroupService.java +++ b/src/main/java/com/ai/da/service/UserLikeGroupService.java @@ -44,7 +44,7 @@ public interface UserLikeGroupService extends IService { 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 toProduct(ToProductImageDTO toProductImageDTO); diff --git a/src/main/java/com/ai/da/service/impl/APIGenerateServiceImpl.java b/src/main/java/com/ai/da/service/impl/APIGenerateServiceImpl.java index 2391980b..c4f7a4d9 100644 --- a/src/main/java/com/ai/da/service/impl/APIGenerateServiceImpl.java +++ b/src/main/java/com/ai/da/service/impl/APIGenerateServiceImpl.java @@ -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 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 getPendingTaskByStatus(String modelName){ + QueryWrapper qw = new QueryWrapper<>(); + // 仅获取还在运行中的任务,成功的,失败的,均需排除 + // flux 任务状态: + List 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); + } } diff --git a/src/main/java/com/ai/da/service/impl/GenerateServiceImpl.java b/src/main/java/com/ai/da/service/impl/GenerateServiceImpl.java index d430e6ff..ed14dc68 100644 --- a/src/main/java/com/ai/da/service/impl/GenerateServiceImpl.java +++ b/src/main/java/com/ai/da/service/impl/GenerateServiceImpl.java @@ -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 i } // generate.setText(text); default: + text = translated; } return text; } @@ -1481,7 +1483,7 @@ public class GenerateServiceImpl extends ServiceImpl 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 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 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 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 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 poseTransformations = poseTransformationMapper.selectList(new QueryWrapper().eq("unique_id", taskId).orderByDesc("id")); if (!poseTransformations.isEmpty()) { PoseTransformation poseTransformation = poseTransformations.get(0); @@ -2488,13 +2484,13 @@ public class GenerateServiceImpl extends ServiceImpl 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 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 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 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: diff --git a/src/main/java/com/ai/da/service/impl/UserLikeGroupServiceImpl.java b/src/main/java/com/ai/da/service/impl/UserLikeGroupServiceImpl.java index 5d0fc274..060f6132 100644 --- a/src/main/java/com/ai/da/service/impl/UserLikeGroupServiceImpl.java +++ b/src/main/java/com/ai/da/service/impl/UserLikeGroupServiceImpl.java @@ -354,7 +354,7 @@ public class UserLikeGroupServiceImpl extends ServiceImpl