From 8457a61ded5315669d32b1a854c16b78b2941edf Mon Sep 17 00:00:00 2001 From: xupei Date: Thu, 20 Jun 2024 15:26:22 +0800 Subject: [PATCH] =?UTF-8?q?generate=20=E6=B7=BB=E5=8A=A0=E7=A7=AF=E5=88=86?= =?UTF-8?q?=E6=89=A3=E9=99=A4?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../ai/da/common/enums/CreditsEventsEnum.java | 24 ++-- .../da/controller/ThirdPartyController.java | 4 +- .../com/ai/da/service/CreditsService.java | 4 +- .../da/service/impl/CreditsServiceImpl.java | 23 ++-- .../da/service/impl/GenerateServiceImpl.java | 128 ++++-------------- .../impl/SuperResolutionServiceImpl.java | 3 +- 6 files changed, 59 insertions(+), 127 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 0b00fa84..2fcc8fde 100644 --- a/src/main/java/com/ai/da/common/enums/CreditsEventsEnum.java +++ b/src/main/java/com/ai/da/common/enums/CreditsEventsEnum.java @@ -7,20 +7,22 @@ import lombok.Getter; @Getter public enum CreditsEventsEnum { -// PRICE("price","6"), - PRICE("price","0.1"), + PRICE("price","6"), +// PRICE("price","0.1"), -// BUY_CREDITS("Buy Credits","600"), - BUY_CREDITS("Buy Credits","10"), + BUY_CREDITS("Buy Credits","60"), +// BUY_CREDITS("Buy Credits","10"), - INIT("init", "500"), + // 每月更新 + INIT_YEARLY("init", "6000"), + INIT_MONTHLY("init", "5000"), + INIT_TRIAL("init", "100"), - DAILY_CHECKIN("Daily Check-In", "20"), - - SOCIAL_MEDIA_SHARING("Social Media Sharing","20"), - -// SUPER_RESOLUTION("Super Resolution","300"), - SUPER_RESOLUTION("Super Resolution","5"), +// SUPER_RESOLUTION("Super Resolution","30"), + SUPER_RESOLUTION("Super Resolution","10"), + SLOGAN("Slogan","10"), + NORMAL_GENERATE("Normal_Generate","5"), + QUESTIONNAIRE("Questionnaire","100"), OTHER("Other","10"); diff --git a/src/main/java/com/ai/da/controller/ThirdPartyController.java b/src/main/java/com/ai/da/controller/ThirdPartyController.java index 7132d9b2..1f4f64c3 100644 --- a/src/main/java/com/ai/da/controller/ThirdPartyController.java +++ b/src/main/java/com/ai/da/controller/ThirdPartyController.java @@ -27,11 +27,11 @@ public class ThirdPartyController { @Resource private AccountService accountService; - @ApiOperation(value = "Add user information") + /*@ApiOperation(value = "Add user information") @PostMapping("/addUser") public Response addUser(@Valid @RequestBody AccountAddDTO accountAddDTO) { return Response.success(accountService.addUser(accountAddDTO)); - } + }*/ @ApiOperation(value = "Edit user information") @PostMapping("/editUser") diff --git a/src/main/java/com/ai/da/service/CreditsService.java b/src/main/java/com/ai/da/service/CreditsService.java index cf733baf..ec2592c4 100644 --- a/src/main/java/com/ai/da/service/CreditsService.java +++ b/src/main/java/com/ai/da/service/CreditsService.java @@ -9,8 +9,6 @@ import com.baomidou.mybatisplus.extension.service.IService; public interface CreditsService extends IService { - void initCredits(); - Boolean buyCredits(Long accountId, Float quantity); void creditsIncrease(Long accountId, String event); @@ -29,6 +27,8 @@ public interface CreditsService extends IService { Boolean creditsPreDeduction(CreditsEventsEnum event, Integer num); + void addRecordToCreditsDeduction(Long accountId, String taskId, CreditsEventsEnum creditsEventsEnum); + void taskCreditsDeduction(Long accountId, String taskId); CreditsDetail getByAccountIdAndChangeEvent(Long accountId, String changeEvent, String changedCredits); diff --git a/src/main/java/com/ai/da/service/impl/CreditsServiceImpl.java b/src/main/java/com/ai/da/service/impl/CreditsServiceImpl.java index 2e2d9c66..61b67921 100644 --- a/src/main/java/com/ai/da/service/impl/CreditsServiceImpl.java +++ b/src/main/java/com/ai/da/service/impl/CreditsServiceImpl.java @@ -1,6 +1,7 @@ package com.ai.da.service.impl; import com.ai.da.common.config.exception.BusinessException; +import com.ai.da.common.constant.CommonConstant; import com.ai.da.common.context.UserContext; import com.ai.da.common.enums.CreditsEventsEnum; import com.ai.da.common.response.PageBaseResponse; @@ -42,11 +43,6 @@ public class CreditsServiceImpl extends ServiceImpl keys = redisUtil.getKeysFromString(creditsDeduction + ":" + accountId + ":*"); List multiValue = redisUtil.getMultiValue(keys); + // 1.1 预扣除区 积分总和 int sum = multiValue.stream().mapToInt(Integer::parseInt).sum(); + // 1.2 加上本次操作需要扣除的积分 sum += Integer.parseInt(event.getValue()) * num; // 2、获取当前积分 @@ -221,6 +214,12 @@ public class CreditsServiceImpl extends ServiceImpl i @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; @@ -196,41 +188,12 @@ public class GenerateServiceImpl extends ServiceImpl i GenerateResultVO generateResultVO = new GenerateResultVO(generateThroughImageTextDTO.getUniqueId(), null, null, status); redisUtil.addToString(key, new Gson().toJson(generateResultVO), CommonConstant.GENERATE_RESULT_EXPIRE_TIME); - // 5、处理模型返回的数据 - // 5.1 将相应的url保存到数据库 - /*List generatedCollectionItems = new ArrayList<>(); - generatedSketchUrl.forEach(item -> { - GenerateDetail generateDetail = new GenerateDetail(); - GenerateCollectionItemVO generateCollectionItemVO = new GenerateCollectionItemVO(); - String md5 = MD5Utils.encryptFile(minioUtil.getPresignedUrl(item, 24 * 60), Boolean.FALSE); - // 通过MD5值和level1Type,判断不同level1Type下相同的图片是否被like过 - List> libraryIdList = generateDetailMapper.getLibraryIdThroughMD5(md5, generateThroughImageTextDTO.getLevel1Type()); - if (!libraryIdList.isEmpty()) { - generateDetail.setIsLike((byte) 1); - generateDetail.setLibraryId(libraryIdList.get(0).get("library_id")); - generateCollectionItemVO.setIsLiked(Boolean.TRUE); - } - generateDetail.setUrl(item); - generateDetail.setGenerateId(generate.getId()); - generateDetail.setCreateDate(DateUtil.getByTimeZone(generateThroughImageTextDTO.getTimeZone())); - generateDetail.setMd5(md5); - generateDetailMapper.insert(generateDetail); - - generateCollectionItemVO.setGenerateItemId(generateDetail.getId()); - generateCollectionItemVO.setGenerateItemUrl(minioUtil.getPresignedUrl(item, 24 * 60)); - generatedCollectionItems.add(generateCollectionItemVO); - }); - - // 6、将模型返回的图片地址返回给前端 - Long collectionId = Objects.isNull(collectionElement) ? null : collectionElement.getCollectionId(); - return new GenerateCollectionVO(generate.getId(), collectionId, generatedCollectionItems);*/ } @Override @Transactional(rollbackFor = Exception.class) public void processGenerateResult(String taskId, String url, String category) { - // 5、处理模型返回的数据 - // 5.1 将相应的url保存到数据库 + // 1、处理模型返回的数据 GenerateDetail generateDetail = new GenerateDetail(); GenerateCollectionItemVO generateCollectionItemVO = new GenerateCollectionItemVO(); Generate generate; @@ -243,7 +206,6 @@ public class GenerateServiceImpl extends ServiceImpl i } else { throw new BusinessException("There are some problems with database query, please try again."); } - } // Generate generate = selectByUniqueId(taskId); String md5 = MD5Utils.encryptFile(minioUtil.getPresignedUrl(url, 24 * 60), Boolean.FALSE); @@ -258,13 +220,20 @@ public class GenerateServiceImpl extends ServiceImpl i generateDetail.setGenerateId(generate.getId()); generateDetail.setCreateDate(LocalDateTime.now()); generateDetail.setMd5(md5); + // 将相应的url保存到数据库 generateDetailMapper.insert(generateDetail); String key = generateResultKey + ":" + taskId; String imageName = url.substring(url.lastIndexOf("/") + 1); String status = imageName.equals("white_image.jpg") ? "Invalid" : "Success"; GenerateResultVO generateResultVO = new GenerateResultVO(taskId, generateDetail.getId(), url, status, category); + // 更新redis redisUtil.addToString(key, new Gson().toJson(generateResultVO), CommonConstant.GENERATE_RESULT_EXPIRE_TIME); + + // 执行积分扣除 + String accountId = taskId.substring(taskId.lastIndexOf("-") + 1); + String uuid = taskId.substring(0,taskId.substring(0, taskId.lastIndexOf("-")).lastIndexOf("-")); + creditsService.taskCreditsDeduction(Long.parseLong(accountId), uuid); } @Resource @@ -506,7 +475,7 @@ public class GenerateServiceImpl extends ServiceImpl i return new PrepareForGenerateVO(0); } } - + CreditsEventsEnum creditsEventsEnum = null; int times = 4; // 当level1Type为Print_board时,level2Type为pattern时需要确定generateType if (generateThroughImageTextDTO.getLevel1Type().equals(PRINT_BOARD.getRealName())){ @@ -524,6 +493,7 @@ public class GenerateServiceImpl extends ServiceImpl i validateGeneraType(generate, text, elementId); // 校验后获取 generateThroughImageTextDTO.setGenerateType(generate.getGenerateType()); + creditsEventsEnum = CreditsEventsEnum.NORMAL_GENERATE; } // Slogan 参数校验 if (generateThroughImageTextDTO.getLevel2Type().equals(CollectionLevel2TypeEnum.SLOGAN.getRealName())){ @@ -559,6 +529,7 @@ public class GenerateServiceImpl extends ServiceImpl i generateThroughImageTextDTO.setCollectionElementId(collectionElement.getId()); generateThroughImageTextDTO.setSloganBase64(null); generateThroughImageTextDTO.setDesignType("collection"); + creditsEventsEnum = CreditsEventsEnum.SLOGAN; } // Logo参数校验 @@ -575,10 +546,17 @@ public class GenerateServiceImpl extends ServiceImpl i if (seed < 0 || seed > 99999){ throw new BusinessException("the.value.range.of.seed"); } + creditsEventsEnum = CreditsEventsEnum.NORMAL_GENERATE; } } - // 2、生成唯一id 使用uuid,由于uuid重复的几率很小,故取消对uuid重复性的校验 + // 2、判断用户当前积分是否够本次生成消耗 + Boolean preDeduction = creditsService.creditsPreDeduction(creditsEventsEnum, 1); + if (!preDeduction) { + throw new BusinessException("Not enough Credits"); + } + + // 3、生成唯一id 使用uuid,由于uuid重复的几率很小,故取消对uuid重复性的校验 String uuid = UUID.randomUUID().toString(); ArrayList taskIdList = new ArrayList<>(); @@ -589,7 +567,7 @@ public class GenerateServiceImpl extends ServiceImpl i generateThroughImageTextDTO.setUniqueId(temp); String jsonString = JSON.toJSONString(generateThroughImageTextDTO); - // 3、加入redis排队,便于获取实时排队信息 + // 4、加入redis排队,便于获取实时排队信息 Double maxScore = redisUtil.getMaxScore(consumptionOrderKey); redisUtil.addToZSet(consumptionOrderKey, temp, maxScore); @@ -598,11 +576,14 @@ public class GenerateServiceImpl extends ServiceImpl i GenerateResultVO generateResultVO = new GenerateResultVO(generateThroughImageTextDTO.getUniqueId(), null, null, "Waiting"); redisUtil.addToString(key, new Gson().toJson(generateResultVO), CommonConstant.GENERATE_RESULT_EXPIRE_TIME); - // 4、将消息发布到MQ消息队列 + // 5、将消息发布到MQ消息队列 rabbitMQService.publishMessageToGenerate(jsonString); } - // 5、返回唯一id + // 6、添加预扣除积分到redis + creditsService.addRecordToCreditsDeduction(generateThroughImageTextDTO.getUserId(), uuid, creditsEventsEnum); + + // 7、返回唯一id return new PrepareForGenerateVO(taskIdList, 2 - trialsCount); } @@ -612,57 +593,6 @@ public class GenerateServiceImpl extends ServiceImpl i return redisUtil.getRank(consumptionOrderKey, uniqueId); } - /*@Override - public GenerateCollectionVO getGenerateResult(String uniqueId) { - // 1、判断该请求是否已经异常 - Boolean isMember = redisUtil.isElementExistsInMap(exceptionMapKey, uniqueId); - if (isMember) { - throw new BusinessException("generate.interface.error"); - } - - // 2、判断该请求是否还在排队 - Boolean existsInZSet = redisUtil.isElementExistsInZSet(consumptionOrderKey, uniqueId); - if (existsInZSet) { - // 排队中,给出当前排序位置,rank从0开始 - Long rankPosition = getRankPosition(uniqueId); - // 有9个消费者,所以当rank>8即当前请求至少排在第九位时,其实际排队位置为9-8+1,当rank <=8,请求均在处理中 - return new GenerateCollectionVO(rankPosition > 8L ? rankPosition - 8 + 1 : 1L); - } - - // 3、判断redis中有没有 - boolean hasHashKey = redisUtil.isElementExistsInMap(resultMapKey, uniqueId); - if (hasHashKey) { - // 3.1 有直接从redis中拿 - String resultString = redisUtil.getMapValue(resultMapKey, uniqueId); - return JSONObject.parseObject(resultString, GenerateCollectionVO.class); - } - - // 3.2 判断数据库中有没有 - Generate generate = selectByUniqueId(uniqueId); - if (Objects.isNull(generate)) { - // 3.3 还没执行完,给出当前位置 - return new GenerateCollectionVO(1L); - } - Long generateId = generate.getId(); - QueryWrapper qw = new QueryWrapper<>(); - qw.eq("generate_id", generateId); - List generateDetails = generateDetailMapper.selectList(qw); - if (CollectionUtils.isEmpty(generateDetails)) { - // 会有这种情况吗?存到generate中,但是还没存到generateDetail中 - return new GenerateCollectionVO(1L); - } - - List generatedCollectionItems = new ArrayList<>(); - generateDetails.forEach(item -> { - GenerateCollectionItemVO generateCollectionItemVO = new GenerateCollectionItemVO(); - generateCollectionItemVO.setGenerateItemId(item.getId()); - generateCollectionItemVO.setGenerateItemUrl(minioUtil.getPresignedUrl(item.getUrl(), 24 * 60)); - generatedCollectionItems.add(generateCollectionItemVO); - }); - - return new GenerateCollectionVO(generateId, null, generatedCollectionItems); - }*/ - @Override public List getGenerateResultList(List taskIdList) { List results = new ArrayList<>(); diff --git a/src/main/java/com/ai/da/service/impl/SuperResolutionServiceImpl.java b/src/main/java/com/ai/da/service/impl/SuperResolutionServiceImpl.java index ee1fb6ff..be795aa4 100644 --- a/src/main/java/com/ai/da/service/impl/SuperResolutionServiceImpl.java +++ b/src/main/java/com/ai/da/service/impl/SuperResolutionServiceImpl.java @@ -109,7 +109,8 @@ public class SuperResolutionServiceImpl extends ServiceImpl