Merge branch 'dev/dev_xp' into dev/dev

This commit is contained in:
2024-04-18 16:49:26 +08:00
7 changed files with 82 additions and 47 deletions

View File

@@ -109,6 +109,7 @@ public class GenerateConsumer {
long start = System.currentTimeMillis();
Map<String, String> generateResult = JSONObject.parseObject(msg.getBody(), Map.class);
log.info("tasks_id : {} start ",generateResult.get("tasks_id"));
// log.info("tasks_id : {}, message : {}",generateResult.get("tasks_id"), generateResult.get("message") );
if (generateResult.get("status").equals("SUCCESS")){
String url = generateResult.get("data");
@@ -118,7 +119,7 @@ public class GenerateConsumer {
// 修改redis中的数据状态为exception
String key = generateResultKey + ":" + generateResult.get("tasks_id");
Long expire = redisUtil.getExpire(key);
redisUtil.addToString(key, new Gson().toJson(new GenerateResultVO(null, null, "Fail")), expire);
redisUtil.addToString(key, new Gson().toJson(new GenerateResultVO(generateResult.get("tasks_id"), null, null, "Fail")), expire);
// 将异常信息存到exception中
HashMap<String, String> exceptionInfo = new HashMap<>();
exceptionInfo.put(generateResult.get("tasks_id"), generateResult.get("data"));

View File

@@ -33,12 +33,12 @@ public class GenerateController {
return Response.success(generateService.generateCaption(sketchElementId));
}
@ApiOperation("通过文字、图片生成图片")
/*@ApiOperation("通过文字、图片生成图片")
@PostMapping("/sketchAndPrint")
public void generateThroughImageText(@Valid @RequestBody GenerateThroughImageTextDTO generateThroughImageTextDTO) {
// return Response.success(generateService.generateThroughImageText(generateThroughImageTextDTO));
generateService.generateThroughImageText(generateThroughImageTextDTO);
}
}*/
@ApiOperation("喜欢生成的图片")
@PostMapping("/like")
@@ -55,14 +55,14 @@ public class GenerateController {
@ApiOperation(value = "发起生成请求,异步获取结果")
@PostMapping("/prepare")
public Response<List<String>> prepareForGenerate(@Valid @RequestBody GenerateThroughImageTextDTO generateThroughImageTextDTO) {
public Response<PrepareForGenerateVO> prepareForGenerate(@Valid @RequestBody GenerateThroughImageTextDTO generateThroughImageTextDTO) {
return Response.success(generateService.prepareForGenerate(generateThroughImageTextDTO));
}
@ApiOperation(value = "取消继续生成")
@GetMapping("/stopWaiting")
public Response<String> stopWaiting(@RequestParam("userId") Long userId,
@RequestParam("uniqueId") String uniqueId,
@RequestParam("uniqueId") List<String> uniqueId,
@RequestParam("timeZone") String timeZone) {
generateService.cancelGenerate(userId, uniqueId, timeZone);
return Response.success("stop waiting successfully");

View File

@@ -48,6 +48,7 @@ public class GenerateThroughImageTextDTO {
@ApiModelProperty("唯一id用于保持消息唯一性")
String uniqueId;
@NotNull(message = "Please check if the required fields are empty.(isTestUser)")
@ApiModelProperty("是否是测试用户")
Boolean isTestUser;
}

View File

@@ -9,9 +9,17 @@ import lombok.Data;
@AllArgsConstructor
public class GenerateResultVO {
private String taskId;
private Long id;
private String url;
private String status;
public GenerateResultVO(Long id, String url, String status) {
this.id = id;
this.url = url;
this.status = status;
}
}

View File

@@ -4,17 +4,19 @@ import io.swagger.annotations.ApiModel;
import io.swagger.annotations.ApiModelProperty;
import lombok.Data;
import java.util.List;
@Data
@ApiModel("prepare for generate响应vo")
public class PrepareForGenerateVO {
@ApiModelProperty("uniqueId")
private String uniqueId;
private List<String> uniqueId;
@ApiModelProperty("剩余使用次数")
private Integer leftUsageCount;
public PrepareForGenerateVO(String uniqueId, Integer leftUsageCount) {
public PrepareForGenerateVO(List<String> uniqueId, Integer leftUsageCount) {
this.uniqueId = uniqueId;
this.leftUsageCount = leftUsageCount;
}

View File

@@ -29,10 +29,10 @@ public interface GenerateService extends IService<Generate> {
List<GenerateResultVO> getGenerateResultList(List<String> taskIdList);
List<String> prepareForGenerate(GenerateThroughImageTextDTO generateThroughImageTextDTO);
PrepareForGenerateVO prepareForGenerate(GenerateThroughImageTextDTO generateThroughImageTextDTO);
Long getRankPosition(String uniqueId);
void cancelGenerate(Long userId, String uniqueId, String timeZone);
void cancelGenerate(Long userId, List<String> uniqueId, String timeZone);
}

View File

@@ -23,6 +23,7 @@ import com.ai.da.service.RabbitMQService;
import com.alibaba.fastjson.JSON;
import com.alibaba.fastjson.JSONObject;
import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
import com.baomidou.mybatisplus.core.exceptions.MybatisPlusException;
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
import com.google.gson.Gson;
import io.minio.errors.MinioException;
@@ -153,7 +154,7 @@ public class GenerateServiceImpl extends ServiceImpl<GenerateMapper, Generate> i
}else {
status = "Fail";
}
GenerateResultVO generateResultVO = new GenerateResultVO(null, null, status);
GenerateResultVO generateResultVO = new GenerateResultVO(generateThroughImageTextDTO.getUniqueId(), null, null, status);
redisUtil.addToString(key, new Gson().toJson(generateResultVO), CommonConstant.GENERATE_RESULT_EXPIRE_TIME);
// 5、处理模型返回的数据
@@ -193,7 +194,19 @@ public class GenerateServiceImpl extends ServiceImpl<GenerateMapper, Generate> i
// 5.1 将相应的url保存到数据库
GenerateDetail generateDetail = new GenerateDetail();
GenerateCollectionItemVO generateCollectionItemVO = new GenerateCollectionItemVO();
Generate generate = selectByUniqueId(taskId);
Generate generate ;
try{
generate = selectByUniqueId(taskId);
}catch (MybatisPlusException e){
log.error(e.getMessage());
if (e.getMessage().equals("One record is expected, but the query result is multiple records")){
generate = selectListByUniqueId(taskId).get(0);
}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);
// 通过MD5值和level1Type,判断不同level1Type下相同的图片是否被like过
List<Map<String, Long>> libraryIdList = generateDetailMapper.getLibraryIdThroughMD5(md5, generate.getLevel1Type());
@@ -210,7 +223,7 @@ public class GenerateServiceImpl extends ServiceImpl<GenerateMapper, Generate> i
String key = generateResultKey + ":" + taskId;
Long expire = redisUtil.getExpire(key);
GenerateResultVO generateResultVO = new GenerateResultVO(generateDetail.getId(), url, "Success");
GenerateResultVO generateResultVO = new GenerateResultVO(taskId, generateDetail.getId(), url, "Success");
redisUtil.addToString(key, new Gson().toJson(generateResultVO), expire);
}
@@ -360,8 +373,8 @@ public class GenerateServiceImpl extends ServiceImpl<GenerateMapper, Generate> i
}
@Override
// public PrepareForGenerateVO prepareForGenerate(GenerateThroughImageTextDTO generateThroughImageTextDTO) {
public List<String> prepareForGenerate(GenerateThroughImageTextDTO generateThroughImageTextDTO) {
public PrepareForGenerateVO prepareForGenerate(GenerateThroughImageTextDTO generateThroughImageTextDTO) {
// public List<String> prepareForGenerate(GenerateThroughImageTextDTO generateThroughImageTextDTO) {
// 1、参数检查判断必须参数是否为空
if (Objects.isNull(generateThroughImageTextDTO.getUserId())) {
throw new BusinessException("userId cannot be empty");
@@ -376,7 +389,7 @@ public class GenerateServiceImpl extends ServiceImpl<GenerateMapper, Generate> i
if (generateThroughImageTextDTO.getIsTestUser()){
trialsCount = getTrialsCount(generateThroughImageTextDTO.getUserId(), generateThroughImageTextDTO.getLevel1Type());
if (trialsCount >= 2){
return new ArrayList<>();
return new PrepareForGenerateVO(0);
}
}
@@ -422,7 +435,7 @@ public class GenerateServiceImpl extends ServiceImpl<GenerateMapper, Generate> i
}
// 5、返回唯一id
return taskIdList;
return new PrepareForGenerateVO(taskIdList, 2 - trialsCount);
}
@Override
@@ -504,46 +517,56 @@ public class GenerateServiceImpl extends ServiceImpl<GenerateMapper, Generate> i
return getOne(qw);
}
@Override
@Transactional(rollbackFor = Exception.class)
public void cancelGenerate(Long userId, String uniqueId, String timeZone) {
// 1、确认当前消息是否还在排队中
Boolean exists = redisUtil.isElementExistsInZSet(consumptionOrderKey, uniqueId);
Boolean flag = Boolean.FALSE;
if (exists) flag = redisUtil.getRank(consumptionOrderKey, uniqueId) > 1L ? Boolean.TRUE : Boolean.FALSE;
// 不管flag的默认值是true还是false只要exists为false&& 将短路
if (exists && flag) {
// 1.1、将需要取消的唯一id加入redis以便及时取消生成
redisUtil.addToSet(cancelSetKey, uniqueId);
// 1.2 将需要取消的id从redis的ConsumptionOrder中删除
redisUtil.removeFromZSet(consumptionOrderKey, uniqueId);
} else {
// 2、判断该消息是否异常
boolean hasKey = redisUtil.isElementExistsInMap(exceptionMapKey, uniqueId);
// 3、判断该消息是否已经消费结束
Boolean existsInResult = redisUtil.isElementExistsInMap(resultMapKey, uniqueId);
if (!hasKey && !existsInResult) {
// 设置取等待状态为false
AsyncCallerUtil.waitingStatus.put(uniqueId, false);
// 3、直接发送取消请求到python端
pythonService.cancelGenerateTask(uniqueId);
}
}
public List<Generate> selectListByUniqueId(String uniqueId) {
QueryWrapper<Generate> qw = new QueryWrapper<>();
qw.eq("unique_id", uniqueId).orderByDesc("id");
// 3、考虑加一张表专门用于记录哪些用户在什么时间进行了取消操作,包括已经异常的请求
GenerateCancel generateCancel = new GenerateCancel(userId, uniqueId, DateUtil.getByTimeZone(timeZone));
generateCancelMapper.insert(generateCancel);
return baseMapper.selectList(qw);
}
// 判断试用用户试用generate机会是否使用完毕
@Override
@Transactional(rollbackFor = Exception.class)
public void cancelGenerate(Long userId, List<String> uniqueIdList, String timeZone) {
uniqueIdList.forEach(uniqueId -> {
// 1、确认当前消息是否还在排队中
Boolean exists = redisUtil.isElementExistsInZSet(consumptionOrderKey, uniqueId);
Boolean flag = Boolean.FALSE;
if (exists) flag = redisUtil.getRank(consumptionOrderKey, uniqueId) > 1L ? Boolean.TRUE : Boolean.FALSE;
// 不管flag的默认值是true还是false只要exists为false&& 将短路
if (exists && flag) {
// 1.1、将需要取消的唯一id加入redis以便及时取消生成
redisUtil.addToSet(cancelSetKey, uniqueId);
// 1.2 将需要取消的id从redis的ConsumptionOrder中删除
redisUtil.removeFromZSet(consumptionOrderKey, uniqueId);
} else {
// 2、判断该消息是否异常
boolean hasKey = redisUtil.isElementExistsInMap(exceptionMapKey, uniqueId);
// 3、判断该消息是否已经消费结束
Boolean existsInResult = redisUtil.isElementExistsInMap(resultMapKey, uniqueId);
if (!hasKey && !existsInResult) {
// 设置取等待状态为false
AsyncCallerUtil.waitingStatus.put(uniqueId, false);
// 3、直接发送取消请求到python端
pythonService.cancelGenerateTask(uniqueId);
}
}
// 3、考虑加一张表专门用于记录哪些用户在什么时间进行了取消操作,包括已经异常的请求
GenerateCancel generateCancel = new GenerateCancel(userId, uniqueId, DateUtil.getByTimeZone(timeZone));
generateCancelMapper.insert(generateCancel);
});
}
// 判断试用用户试用generate机会是否使用完毕 每个board 3次机会
private int getTrialsCount(Long userId, String level1Type){
List<Generate> getGenerateList = getGenerateByAccountId(userId, level1Type);
int trialsCount ;
if (getGenerateList.isEmpty()){
trialsCount = 0;
} else if (getGenerateList.size() == 1) {
} else if (getGenerateList.size() == 1 || (getGenerateList.size() >= 4 && getGenerateList.size() / 4 == 1)) {
trialsCount = 1;
} else if (getGenerateList.size() == 2) {
} else if (getGenerateList.size() == 2 || (getGenerateList.size() >= 4 && getGenerateList.size() / 4 == 2)) {
trialsCount = 2;
}else {
trialsCount = 2;