From a0ece486d8b9374a09e22476e2b4736062e8185b Mon Sep 17 00:00:00 2001 From: xupei Date: Fri, 20 Jun 2025 14:49:15 +0800 Subject: [PATCH 1/2] =?UTF-8?q?TASK:=E6=9B=B4=E6=96=B0=E5=90=84=E7=94=9F?= =?UTF-8?q?=E6=88=90=E5=8A=9F=E8=83=BD=E9=9C=80=E8=A6=81=E6=B6=88=E8=80=97?= =?UTF-8?q?=E7=9A=84=E7=A7=AF=E5=88=86?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../ai/da/controller/GenerateController.java | 4 +- .../com/ai/da/model/vo/MagicToolResultVO.java | 3 +- .../da/service/impl/GenerateServiceImpl.java | 62 ++++++++++++------- .../impl/UserLikeGroupServiceImpl.java | 47 +++++++++----- 4 files changed, 73 insertions(+), 43 deletions(-) diff --git a/src/main/java/com/ai/da/controller/GenerateController.java b/src/main/java/com/ai/da/controller/GenerateController.java index 5ec38bef..2853debc 100644 --- a/src/main/java/com/ai/da/controller/GenerateController.java +++ b/src/main/java/com/ai/da/controller/GenerateController.java @@ -173,7 +173,7 @@ public class GenerateController { @GetMapping("/getAnimateResult") public Response getAnimateResult(@RequestParam("taskId") String taskId){ return Response.success(generateService.getAnimateResult(taskId)); - }*/ + } @ApiOperation(value = "freepik toProductImage") @GetMapping("/reimagineFreePik") @@ -187,7 +187,7 @@ public class GenerateController { @GetMapping("/getImageDescription") public Response getImageDescription(@RequestParam("path") String path) { return Response.success(generateService.getImageDescription(path)); - } + }*/ // @ApiOperation(value = "试用flux") // @GetMapping("/flux") diff --git a/src/main/java/com/ai/da/model/vo/MagicToolResultVO.java b/src/main/java/com/ai/da/model/vo/MagicToolResultVO.java index 24b2a7ed..21de4975 100644 --- a/src/main/java/com/ai/da/model/vo/MagicToolResultVO.java +++ b/src/main/java/com/ai/da/model/vo/MagicToolResultVO.java @@ -29,7 +29,8 @@ public class MagicToolResultVO { private Long elementId; - public MagicToolResultVO(String status) { + public MagicToolResultVO(String taskId, String status) { + this.taskId = taskId; this.status = status; } } 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 e831be0a..b27a4993 100644 --- a/src/main/java/com/ai/da/service/impl/GenerateServiceImpl.java +++ b/src/main/java/com/ai/da/service/impl/GenerateServiceImpl.java @@ -294,8 +294,8 @@ public class GenerateServiceImpl extends ServiceImpl i if (!status.equals("Invalid")) { String accountId = taskId.substring(taskId.lastIndexOf("-") + 1); String uuid = taskId.substring(0, taskId.substring(0, taskId.lastIndexOf("-")).lastIndexOf("-")); - Boolean flag = creditsService.taskCreditsDeduction(Long.parseLong(accountId), uuid); - if (flag) creditsService.updateChangedCredits(accountId, uuid); + Boolean flag = creditsService.taskCreditsDeduction(Long.parseLong(accountId), taskId); + if (flag) creditsService.updateChangedCredits(accountId, taskId); } } @@ -530,10 +530,10 @@ public class GenerateServiceImpl extends ServiceImpl i } CreditsEventsEnum creditsEventsEnum = CreditsEventsEnum.OTHER; - if (generateThroughImageTextDTO.getModelName().equals("wx")){ String taskId = createAsyncTask(generateThroughImageTextDTO); // String taskId = "e53c86ea-53be-424b-8ac7-3c01c141f4f7"; + creditsEventsEnum = CreditsEventsEnum.WX_TEXT2IMG; // 6、添加预扣除积分到redis creditsService.addRecordToCreditsDeduction(generateThroughImageTextDTO.getUserId(), taskId, creditsEventsEnum); // 6.1 添加积分扣除记录到db @@ -560,12 +560,14 @@ public class GenerateServiceImpl extends ServiceImpl i validateGeneraType(generate, text, elementId); // 校验后获取 generateThroughImageTextDTO.setGenerateType(generate.getGenerateType()); - creditsEventsEnum = CreditsEventsEnum.PATTERN; +// creditsEventsEnum = CreditsEventsEnum.PATTERN; + creditsEventsEnum = CreditsEventsEnum.LOCAL_TEXT2IMG; // 模型迁移SD1.? -> flux,从而产生了不同模型的选择, // high -> 生成图片质量高,但生成速度慢,每次生成只返回一张图片 // fast -> 生成图片质量低,但生成速度快,每次生成返回四张图片 if (!StringUtil.isNullOrEmpty(generateThroughImageTextDTO.getModelName()) && generateThroughImageTextDTO.getModelName().equals("high")){ + creditsEventsEnum = CreditsEventsEnum.LOCAL_TEXT2IMG_HIGH; times = 1; } } @@ -623,13 +625,15 @@ public class GenerateServiceImpl extends ServiceImpl i creditsEventsEnum = CreditsEventsEnum.LOGO; } } else if (generateThroughImageTextDTO.getLevel1Type().equals(MOOD_BOARD.getRealName())) { - creditsEventsEnum = CreditsEventsEnum.MOOD_BOARD; + creditsEventsEnum = CreditsEventsEnum.LOCAL_TEXT2IMG; if (!StringUtil.isNullOrEmpty(generateThroughImageTextDTO.getModelName()) && generateThroughImageTextDTO.getModelName().equals("high")){ + creditsEventsEnum = CreditsEventsEnum.LOCAL_TEXT2IMG_HIGH; times = 1; } } else if (generateThroughImageTextDTO.getLevel1Type().equals(SKETCH_BOARD.getRealName())) { - creditsEventsEnum = CreditsEventsEnum.SKETCH_BOARD; + creditsEventsEnum = CreditsEventsEnum.LOCAL_TEXT2IMG; if (!StringUtil.isNullOrEmpty(generateThroughImageTextDTO.getModelName()) && generateThroughImageTextDTO.getModelName().equals("high")){ + creditsEventsEnum = CreditsEventsEnum.LOCAL_TEXT2IMG_HIGH; times = 1; } } @@ -650,30 +654,30 @@ public class GenerateServiceImpl extends ServiceImpl i ArrayList taskIdList = new ArrayList<>(); for (int i = 1; i <= times; i++) { - String temp = uuid; - temp += "-" + i + "-" + generateThroughImageTextDTO.getUserId(); - taskIdList.add(temp); - generateThroughImageTextDTO.setUniqueId(temp); + String taskId = uuid; + taskId += "-" + i + "-" + generateThroughImageTextDTO.getUserId(); + taskIdList.add(taskId); + generateThroughImageTextDTO.setUniqueId(taskId); String jsonString = JSON.toJSONString(generateThroughImageTextDTO); // 4、加入redis排队,便于获取实时排队信息 Double maxScore = redisUtil.getMaxScore(consumptionOrderKey); - redisUtil.addToZSet(consumptionOrderKey, temp, maxScore); + redisUtil.addToZSet(consumptionOrderKey, taskId, maxScore); // 加入resultMap - String key = generateResultKey + ":" + temp; + String key = generateResultKey + ":" + taskId; GenerateResultVO generateResultVO = new GenerateResultVO(generateThroughImageTextDTO.getUniqueId(), null, null, "Waiting"); redisUtil.addToString(key, new Gson().toJson(generateResultVO), CommonConstant.GENERATE_RESULT_EXPIRE_TIME); // 5、将消息发布到MQ消息队列 rabbitMQService.publishMessageToGenerate(jsonString); + // update 积分扣除由按次收费改为按生成图片数量收费 + // 6、添加预扣除积分到redis + creditsService.addRecordToCreditsDeduction(generateThroughImageTextDTO.getUserId(), taskId, creditsEventsEnum); + // 6.1 添加积分扣除记录到db + creditsService.preInsert(generateThroughImageTextDTO.getUserId(), creditsEventsEnum.getName(), taskId, Boolean.TRUE, null); } - // 6、添加预扣除积分到redis - creditsService.addRecordToCreditsDeduction(generateThroughImageTextDTO.getUserId(), uuid, creditsEventsEnum); - // 6.1 添加积分扣除记录到db - creditsService.preInsert(generateThroughImageTextDTO.getUserId(), creditsEventsEnum.getName(), uuid, Boolean.TRUE, null); - // 7、返回唯一id return new PrepareForGenerateVO(taskIdList, 2); } @@ -987,7 +991,8 @@ public class GenerateServiceImpl extends ServiceImpl i log.info("imageToSketch parameter : {}", imageToSketchDTO); // 检查积分是否够本次扣除 - CreditsEventsEnum event = CreditsEventsEnum.IMAGE_TO_SKETCH; +// CreditsEventsEnum event = CreditsEventsEnum.IMAGE_TO_SKETCH; + CreditsEventsEnum event = CreditsEventsEnum.FLUX_IMG2IMG; Boolean b = creditsService.checkCredits(accountId, event, 1); if (!b) { throw new BusinessException("remaining.credits.insufficient", ResultEnum.PROMPT.getCode()); @@ -1005,15 +1010,21 @@ public class GenerateServiceImpl extends ServiceImpl i }else { imagePath = collagePictureUrl; } - taskId = flux(CreditsEventsEnum.IMAGE_TO_SKETCH, null, imagePath); + taskId = flux(event, null, imagePath); // 存数据库 saveExtractSketchRequest(imageToSketchDTO, collagePictureUrl, projectId, accountId, imageToSketchDTO.getStyle(), "flux", taskId); + + // 6、添加预扣除积分到redis + creditsService.addRecordToCreditsDeduction(accountId, taskId, event); + // 6.1 添加积分扣除记录到db + creditsService.preInsert(accountId, event.getName(), taskId, Boolean.TRUE, null); + return taskId; } taskId = UUID.randomUUID().toString(); - // 异步执行耗时操作 + // 异步执行耗时操作(由于prompt提取耗时较长,页面暂时只提供flux生成,废弃以下部分) CompletableFuture.runAsync(() -> { try { processImageToSketch(taskId, imageToSketchDTO, collagePictureUrl, projectId, accountId, event); @@ -1117,9 +1128,10 @@ public class GenerateServiceImpl extends ServiceImpl i Long projectId = poseTransformDTO.getProjectId(); String productImage = poseTransformDTO.getProductImage(); Integer poseId = poseTransformDTO.getPoseId(); + boolean wxTask = StringUtil.isNullOrEmpty(poseTransformDTO.getModelName()) && poseTransformDTO.getModelName().equals("wx"); // 1、判断用户当前积分是否够本次生成消耗 - CreditsEventsEnum creditsEventsEnum = CreditsEventsEnum.POSE_TRANSFORMATION; + CreditsEventsEnum creditsEventsEnum = wxTask ? CreditsEventsEnum.WX_ANIMATION : CreditsEventsEnum.LOCAL_ANIMATION; Boolean preDeduction = creditsService.creditsPreDeduction(creditsEventsEnum, 1); if (!preDeduction) { throw new BusinessException("remaining.credits.insufficient", ResultEnum.WARNING.getCode()); @@ -2162,16 +2174,20 @@ public class GenerateServiceImpl extends ServiceImpl i String objectName = accountId + "/imageToSketch/" + taskId + ".png"; String fluxResult = getFluxResult(taskId, objectName); if (Objects.isNull(generateDetail)){ - if (fluxResult.equals("Fail") || fluxResult.equals("Pending")){ + if (StringUtil.isNullOrEmpty(fluxResult)){ + return new GenerateResultVO(taskId, "Fail"); + }else if (fluxResult.equals("Fail") || fluxResult.equals("Pending")){ String status = fluxResult.equals("Fail") ? "Fail" : "Executing"; return new GenerateResultVO(taskId, status); } - generateDetail = new GenerateDetail(generate.getId(), fluxResult, MD5Utils.encryptFile( minioUtil.getPreSignedUrl(fluxResult, CommonConstant.MINIO_IMAGE_EXPIRE_TIME), false), LocalDateTime.now()); generateDetailMapper.insert(generateDetail); + // 扣积分 + Boolean flag = creditsService.taskCreditsDeduction(accountId, taskId); + if (flag) creditsService.updateChangedCredits(String.valueOf(accountId), taskId); } else if (StringUtil.isNullOrEmpty(generateDetail.getUrl())){ // 一般来说这条线应该走不到 generateDetail.setGenerateId(generate.getId()); 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 47ebf47f..2cd8f05e 100644 --- a/src/main/java/com/ai/da/service/impl/UserLikeGroupServiceImpl.java +++ b/src/main/java/com/ai/da/service/impl/UserLikeGroupServiceImpl.java @@ -375,7 +375,10 @@ public class UserLikeGroupServiceImpl extends ServiceImpl toProduct(ToProductImageDTO toProductImageDTO) { // 判断用户当前积分是否够本次生成消耗 - Boolean preDeduction = creditsService.creditsPreDeduction(CreditsEventsEnum.TO_PRODUCT_IMAGE, toProductImageDTO.getToProductImageVOList().size()); + boolean fluxTask = !StringUtil.isNullOrEmpty(toProductImageDTO.getModelName()) + && toProductImageDTO.getModelName().equals("flux"); + CreditsEventsEnum creditsEventsEnum = fluxTask ? CreditsEventsEnum.FLUX_IMG2IMG : CreditsEventsEnum.TO_PRODUCT_IMAGE; + Boolean preDeduction = creditsService.creditsPreDeduction(creditsEventsEnum, toProductImageDTO.getToProductImageVOList().size()); if (!preDeduction) { throw new BusinessException("Your remaining credits are insufficient for this generation. Please recharge.", ResultEnum.WARNING.getCode()); } @@ -399,7 +402,7 @@ public class UserLikeGroupServiceImpl extends ServiceImpl 200) { + if (words.length > 180) { throw new BusinessException("Please keep your input text under 200 words. Thanks!"); } @@ -454,8 +457,7 @@ public class UserLikeGroupServiceImpl extends ServiceImpl relight(ToProductImageDTO toProductImageDTO) { // 判断用户当前积分是否够本次生成消耗 - Boolean preDeduction = creditsService.creditsPreDeduction(CreditsEventsEnum.RELIGHT, toProductImageDTO.getToProductImageVOList().size()); + boolean fluxTask = !StringUtil.isNullOrEmpty(toProductImageDTO.getModelName()) + && toProductImageDTO.getModelName().equals("flux"); + CreditsEventsEnum creditsEventsEnum = fluxTask ? CreditsEventsEnum.FLUX_IMG2IMG : CreditsEventsEnum.RELIGHT; + Boolean preDeduction = creditsService.creditsPreDeduction(creditsEventsEnum, toProductImageDTO.getToProductImageVOList().size()); if (!preDeduction) { throw new BusinessException("Your remaining credits are insufficient for this generation. Please recharge.", ResultEnum.WARNING.getCode()); } @@ -985,8 +995,7 @@ public class UserLikeGroupServiceImpl extends ServiceImpl Date: Fri, 20 Jun 2025 14:53:10 +0800 Subject: [PATCH 2/2] =?UTF-8?q?TASK:=E6=9B=B4=E6=96=B0=E5=90=84=E7=94=9F?= =?UTF-8?q?=E6=88=90=E5=8A=9F=E8=83=BD=E9=9C=80=E8=A6=81=E6=B6=88=E8=80=97?= =?UTF-8?q?=E7=9A=84=E7=A7=AF=E5=88=86?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../ai/da/common/enums/CreditsEventsEnum.java | 18 +++++++++++++++--- 1 file changed, 15 insertions(+), 3 deletions(-) diff --git a/src/main/java/com/ai/da/common/enums/CreditsEventsEnum.java b/src/main/java/com/ai/da/common/enums/CreditsEventsEnum.java index 5dc8ff30..2bff5ae3 100644 --- a/src/main/java/com/ai/da/common/enums/CreditsEventsEnum.java +++ b/src/main/java/com/ai/da/common/enums/CreditsEventsEnum.java @@ -39,15 +39,27 @@ public enum CreditsEventsEnum { QUESTIONNAIRE("Questionnaire","100"), IMAGE_TO_SKETCH("ImageToSketch","5"), POSE_TRANSFORMATION("PoseTransformation","10"), + OTHER("Other","5"), - OTHER("Other","5"); + WX_TEXT2IMG("WX_Text2Image", "5"), + WX_ANIMATION("WX_Animation", "30"), + FREEPIK_IMG2IMG("Freepik_img2img", "20"), + FLUX_IMG2IMG("Flux_img2img","10"), - private String name; + LOCAL_TEXT2IMG("Local_text2img","1.25"), + LOCAL_IMG2IMG("Local_img2img","1.25"), + LOCAL_TEXT2IMG_HIGH("Local_text2img_high","5"), + LOCAL_IMG2IMG_HIGH("Local_img2img_high","5"), + LOCAL_SLOGAN("Local_Slogan","10"), + LOCAL_ANIMATION("Local_Animation","15"), + ; + + private final String name; /** * 对应事件需要消耗or获得的积分 */ - private String value; + private final String value; public static List generateFunctionNames() { return Arrays.asList(SLOGAN.name, LOGO.name, PATTERN.name, MOOD_BOARD.name, SKETCH_BOARD.name,