diff --git a/src/main/java/com/ai/da/controller/GenerateController.java b/src/main/java/com/ai/da/controller/GenerateController.java index 0c1506b7..b3f6fb5b 100644 --- a/src/main/java/com/ai/da/controller/GenerateController.java +++ b/src/main/java/com/ai/da/controller/GenerateController.java @@ -61,8 +61,10 @@ public class GenerateController { @ApiOperation(value = "取消继续生成") @GetMapping("/stopWaiting") - public Response stopWaiting(@RequestParam("uniqueId") String uniqueId) { - generateService.cancelGenerate(uniqueId); + public Response stopWaiting(@RequestParam("userId") Long userId, + @RequestParam("uniqueId") String uniqueId, + @RequestParam("timeZone") String timeZone) { + generateService.cancelGenerate(userId, uniqueId, timeZone); return Response.success("stop waiting successfully"); } diff --git a/src/main/java/com/ai/da/mapper/GenerateCancelMapper.java b/src/main/java/com/ai/da/mapper/GenerateCancelMapper.java new file mode 100644 index 00000000..3e24ea09 --- /dev/null +++ b/src/main/java/com/ai/da/mapper/GenerateCancelMapper.java @@ -0,0 +1,7 @@ +package com.ai.da.mapper; + +import com.ai.da.common.config.mybatis.plus.CommonMapper; +import com.ai.da.mapper.entity.GenerateCancel; + +public interface GenerateCancelMapper extends CommonMapper { +} diff --git a/src/main/java/com/ai/da/mapper/entity/GenerateCancel.java b/src/main/java/com/ai/da/mapper/entity/GenerateCancel.java new file mode 100644 index 00000000..8726b9ed --- /dev/null +++ b/src/main/java/com/ai/da/mapper/entity/GenerateCancel.java @@ -0,0 +1,44 @@ +package com.ai.da.mapper.entity; + +import com.baomidou.mybatisplus.annotation.IdType; +import com.baomidou.mybatisplus.annotation.TableId; +import com.baomidou.mybatisplus.annotation.TableName; +import lombok.Data; +import lombok.EqualsAndHashCode; +import lombok.experimental.Accessors; + +import java.util.Date; + +@Data +@EqualsAndHashCode(callSuper = false) +@Accessors(chain = true) +@TableName("t_generate_cancel") +public class GenerateCancel { + + /** + * ID + */ + @TableId(value = "id", type = IdType.AUTO) + private Long id; + + /** + * 用户ID + */ + private Long accountId; + + /** + * 唯一id(任务id) + */ + private String uniqueId; + + /** + * 创建时间 + */ + private Date createDate; + + public GenerateCancel(Long accountId, String uniqueId, Date createDate) { + this.accountId = accountId; + this.uniqueId = uniqueId; + this.createDate = createDate; + } +} diff --git a/src/main/java/com/ai/da/service/GenerateService.java b/src/main/java/com/ai/da/service/GenerateService.java index cb97d9f8..d1a327bd 100644 --- a/src/main/java/com/ai/da/service/GenerateService.java +++ b/src/main/java/com/ai/da/service/GenerateService.java @@ -31,6 +31,6 @@ public interface GenerateService extends IService { Long getRankPosition(String uniqueId); - void cancelGenerate(String uniqueId); + void cancelGenerate(Long userId, String uniqueId, String timeZone); } 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 8039fbcd..095db937 100644 --- a/src/main/java/com/ai/da/service/impl/GenerateServiceImpl.java +++ b/src/main/java/com/ai/da/service/impl/GenerateServiceImpl.java @@ -6,6 +6,7 @@ import com.ai.da.common.enums.GenerateModeEnum; import com.ai.da.common.enums.ModelNameEnum; import com.ai.da.common.utils.*; import com.ai.da.mapper.CollectionElementMapper; +import com.ai.da.mapper.GenerateCancelMapper; import com.ai.da.mapper.GenerateDetailMapper; import com.ai.da.mapper.GenerateMapper; import com.ai.da.mapper.entity.*; @@ -64,6 +65,9 @@ public class GenerateServiceImpl extends ServiceImpl i @Resource private RedisUtil redisUtil; + @Resource + private GenerateCancelMapper generateCancelMapper; + @Value("${redis.key.consumptionOrder}") private String consumptionOrderKey; @@ -330,8 +334,10 @@ public class GenerateServiceImpl extends ServiceImpl i // long snowflakeId = idWorker.nextId(); int num = 1; - // 判断与已经正常生成结果的uuid中有相同的id - while (redisUtil.isElementExistsInMap(resultMapKey, uuid) && num < 10) { + // 判断已经正常生成结果的uuid或正在排队的uuid中是否有相同的id + while ((redisUtil.isElementExistsInMap(resultMapKey, uuid) || + redisUtil.isElementExistsInZSet(consumptionOrderKey, uuid)) + && num < 10) { uuid = UUID.randomUUID().toString(); num++; } @@ -378,7 +384,7 @@ public class GenerateServiceImpl extends ServiceImpl i // 排队中,给出当前排序位置,rank从0开始 Long rankPosition = getRankPosition(uniqueId); // 有9个消费者,所以当rank>8即当前请求至少排在第九位时,其实际排队位置为9-8+1,当rank <=8,请求均在处理中 - return new GenerateCollectionVO( rankPosition > 8L ? rankPosition - 8 + 1 : 1L); + return new GenerateCollectionVO(rankPosition > 8L ? rankPosition - 8 + 1 : 1L); } // 3、判断redis中有没有 @@ -393,7 +399,7 @@ public class GenerateServiceImpl extends ServiceImpl i Generate generate = selectByUniqueId(uniqueId); if (Objects.isNull(generate)) { // 3.3 还没执行完,给出当前位置 - return new GenerateCollectionVO(0L); + return new GenerateCollectionVO(1L); } Long generateId = generate.getId(); QueryWrapper qw = new QueryWrapper<>(); @@ -401,7 +407,7 @@ public class GenerateServiceImpl extends ServiceImpl i List generateDetails = generateDetailMapper.selectList(qw); if (CollectionUtils.isEmpty(generateDetails)) { // 会有这种情况吗?存到generate中,但是还没存到generateDetail中 - return new GenerateCollectionVO(0L); + return new GenerateCollectionVO(1L); } List generatedCollectionItems = new ArrayList<>(); @@ -423,7 +429,8 @@ public class GenerateServiceImpl extends ServiceImpl i } @Override - public void cancelGenerate(String uniqueId) { + @Transactional(rollbackFor = Exception.class) + public void cancelGenerate(Long userId, String uniqueId, String timeZone) { // 1、确认当前消息是否还在排队中 Boolean exists = redisUtil.isElementExistsInZSet(consumptionOrderKey, uniqueId); Boolean flag = Boolean.FALSE; @@ -446,5 +453,9 @@ public class GenerateServiceImpl extends ServiceImpl i pythonService.cancelGenerateTask(uniqueId); } } + + // 3、考虑加一张表,专门用于记录哪些用户在什么时间进行了取消操作 + GenerateCancel generateCancel = new GenerateCancel(userId, uniqueId, DateUtil.getByTimeZone(timeZone)); + generateCancelMapper.insert(generateCancel); } }