@@ -4,6 +4,7 @@ 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.CollectionLevel2TypeEnum ;
import com.ai.da.common.enums.CreditsEventsEnum ;
import com.ai.da.common.enums.GenerateModeEnum ;
import com.ai.da.common.enums.ModelNameEnum ;
import com.ai.da.common.utils.* ;
@@ -14,10 +15,7 @@ import com.ai.da.model.dto.GenerateThroughImageTextDTO;
import com.ai.da.model.dto.GenerateToPythonDTO ;
import com.ai.da.model.vo.* ;
import com.ai.da.python.PythonService ;
import com.ai.da.service.CollectionElementService ;
import com.ai.da.service.GenerateService ;
import com.ai.da.service.LibraryService ;
import com.ai.da.service.RabbitMQService ;
import com.ai.da.service.* ;
import com.alibaba.fastjson.JSON ;
import com.alibaba.fastjson.serializer.SerializerFeature ;
import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper ;
@@ -45,28 +43,22 @@ public class GenerateServiceImpl extends ServiceImpl<GenerateMapper, Generate> 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<GenerateMapper, Generate> 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<GenerateCollectionItemVO> 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<Map<String, Long>> 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<GenerateMapper, Generate> 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<GenerateMapper, Generate> 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<GenerateMapper, Generate> 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<GenerateMapper, Generate> 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<GenerateMapper, Generate> i
generateThroughImageTextDTO . setCollectionElementId ( collectionElement . getId ( ) ) ;
generateThroughImageTextDTO . setSloganBase64 ( null ) ;
generateThroughImageTextDTO . setDesignType ( " collection " ) ;
creditsEventsEnum = CreditsEventsEnum . SLOGAN ;
}
// Logo参数校验
@@ -575,10 +546,17 @@ public class GenerateServiceImpl extends ServiceImpl<GenerateMapper, Generate> 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 < String > taskIdList = new ArrayList < > ( ) ;
@@ -589,7 +567,7 @@ public class GenerateServiceImpl extends ServiceImpl<GenerateMapper, Generate> 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<GenerateMapper, Generate> 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<GenerateMapper, Generate> 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<GenerateDetail> qw = new QueryWrapper<>();
qw.eq("generate_id", generateId);
List<GenerateDetail> generateDetails = generateDetailMapper.selectList(qw);
if (CollectionUtils.isEmpty(generateDetails)) {
// 会有这种情况吗? 存到generate中, 但是还没存到generateDetail中
return new GenerateCollectionVO(1L);
}
List<GenerateCollectionItemVO> 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 < GenerateResultVO > getGenerateResultList ( List < String > taskIdList ) {
List < GenerateResultVO > results = new ArrayList < > ( ) ;