|
|
@@ -1,6 +1,8 @@
|
|
|
package com.yhlxj.service.midjourney.impl;
|
|
|
|
|
|
import cn.hutool.core.bean.BeanUtil;
|
|
|
+import cn.hutool.core.date.DateTime;
|
|
|
+import cn.hutool.core.date.DateUtil;
|
|
|
import cn.hutool.core.map.MapUtil;
|
|
|
import cn.hutool.core.util.StrUtil;
|
|
|
import cn.hutool.http.HttpRequest;
|
|
|
@@ -8,7 +10,6 @@ import cn.hutool.http.HttpResponse;
|
|
|
import cn.hutool.http.HttpUtil;
|
|
|
import cn.hutool.json.JSONObject;
|
|
|
import cn.hutool.json.JSONUtil;
|
|
|
-import com.baomidou.mybatisplus.core.conditions.update.LambdaUpdateWrapper;
|
|
|
import com.baomidou.mybatisplus.core.toolkit.Wrappers;
|
|
|
import com.cyksj.common.exception.BusinessRuntimeException;
|
|
|
import com.cyksj.common.task.GlobalThreadPoolTaskExecutor;
|
|
|
@@ -179,34 +180,7 @@ public class LumaServiceImpl implements LumaService {
|
|
|
if (lumaUserConversation == null) {
|
|
|
throw BusinessRuntimeException.getInstance("视频不存在");
|
|
|
}
|
|
|
- Long providerId = lumaUserConversation.getProviderId();
|
|
|
- LumaUserApiProvider apiProvider = lumaUserApiProviderMapper.selectById(providerId);
|
|
|
- String url = apiProvider.getDomain() + "/luma/generations/" + lumaUserConversation.getTaskId();
|
|
|
- HttpRequest request = HttpRequest.get(url);
|
|
|
- request.header("Authorization", apiProvider.getAuth());
|
|
|
-
|
|
|
- String body = request.setConnectionTimeout(50000).execute().body();
|
|
|
- log.info("action body:{}", body);
|
|
|
- SubmitResult submitResult = Jsons.parseObject(body, SubmitResult.class);
|
|
|
- if (submitResult.getId() == null) {
|
|
|
- throw BusinessRuntimeException.getInstance("视频不存在");
|
|
|
- }
|
|
|
- if (FINISH_STATUS.contains(submitResult.getState())) {
|
|
|
- String id = submitResult.getId();
|
|
|
- if (!FINISH_STATUS.contains(lumaUserConversation.getStatus())) {
|
|
|
- lumaUserConversation.setStatus(submitResult.getState());
|
|
|
- SubmitResult.Video video = submitResult.getVideo();
|
|
|
- lumaUserConversation.setFinishTime(System.currentTimeMillis());
|
|
|
- //出水印
|
|
|
- String removeVideoWatermarkUrl = removeVideoWatermark(lumaUserConversation.getProviderId(),lumaUserConversation.getTaskId());
|
|
|
- lumaUserConversation.setVideoUrl(removeVideoWatermarkUrl);
|
|
|
- lumaUserConversation.setThumbnail(video.getThumbnail());
|
|
|
- TASK_EXECUTOR.execute(() -> {
|
|
|
- //同步
|
|
|
- sync(lumaUserConversation);
|
|
|
- });
|
|
|
- }
|
|
|
- }
|
|
|
+ SubmitResult submitResult = syncConversation(lumaUserConversation);
|
|
|
return submitResult;
|
|
|
}
|
|
|
|
|
|
@@ -405,6 +379,39 @@ public class LumaServiceImpl implements LumaService {
|
|
|
return null;
|
|
|
}
|
|
|
|
|
|
+ @Override
|
|
|
+ public void syncConversation() {
|
|
|
+ List<LumaUserConversation> pending = conversationMapper.selectList(Wrappers.lambdaQuery(LumaUserConversation.class)
|
|
|
+ .eq(LumaUserConversation::getStatus, status.get(0))
|
|
|
+ .orderByAsc(LumaUserConversation::getId)
|
|
|
+ .last("limit 50"));
|
|
|
+ log.info("正在定时同步更新任务状态--->size:{}", pending.size());
|
|
|
+ DateTime limitTime = DateUtil.offsetMinute(DateTime.now(), -30);
|
|
|
+ pending.forEach(conversation -> {
|
|
|
+ if (conversation.getCreatedTime().compareTo(limitTime) <= 0) {
|
|
|
+ log.info("任务超过过30m,任务taskId:{}直接失败,返还执行次数", conversation.getTaskId());
|
|
|
+ conversation.setStatus(FINISH_STATUS.get(1));
|
|
|
+ conversationMapper.updateById(conversation);
|
|
|
+ recoverUserLimit(conversation.getUserId());
|
|
|
+ return;
|
|
|
+ }
|
|
|
+ try {
|
|
|
+ syncConversation(conversation);
|
|
|
+ } catch (Exception ex) {
|
|
|
+ log.error("定时同步任务执行状态失败:{}", StringUtil.getErrorText(ex));
|
|
|
+ }
|
|
|
+ });
|
|
|
+ }
|
|
|
+
|
|
|
+ /**
|
|
|
+ * 恢复次数
|
|
|
+ */
|
|
|
+ @Override
|
|
|
+ public void recoverUserLimit(Long id){
|
|
|
+ redisService.incr(RedisService.key.LUMA_NUM_LIMIT.getName() + id, 1L);
|
|
|
+ lumaUserMapper.incrNum(id, 1);
|
|
|
+ }
|
|
|
+
|
|
|
public void sync(LumaUserConversation conversation) {
|
|
|
if (FINISH_STATUS.contains(conversation.getStatus())) {
|
|
|
//重复更新数据
|
|
|
@@ -416,7 +423,7 @@ public class LumaServiceImpl implements LumaService {
|
|
|
LumaUserConversation dbConversation = conversationMapper.selectOne(Wrappers.lambdaQuery(LumaUserConversation.class).eq(LumaUserConversation::getTaskId, conversation.getTaskId())
|
|
|
.eq(LumaUserConversation::getUserId, userId).orderByDesc(LumaUserConversation::getId).last("limit 1"));
|
|
|
if (dbConversation != null) {
|
|
|
- if ("completed".equals(dbConversation.getStatus())) {
|
|
|
+ if (FINISH_STATUS.contains(dbConversation.getStatus())) {
|
|
|
return;
|
|
|
}
|
|
|
conversation.setProgress("100%");
|
|
|
@@ -437,12 +444,8 @@ public class LumaServiceImpl implements LumaService {
|
|
|
}
|
|
|
});
|
|
|
//失败返还次数
|
|
|
- if ("failed".equals(conversation.getStatus())){
|
|
|
- LambdaUpdateWrapper<LumaUser> wrapper = Wrappers.lambdaUpdate(LumaUser.class)
|
|
|
- .eq(LumaUser::getId, userId);
|
|
|
- Object num = redisService.incr(RedisService.key.LUMA_NUM_LIMIT.getName() + userId, 1L);
|
|
|
- wrapper.set(LumaUser::getNum, num);
|
|
|
- lumaUserMapper.update(null, wrapper);
|
|
|
+ if (FINISH_STATUS.get(1).equals(conversation.getStatus())){
|
|
|
+ recoverUserLimit(conversation.getUserId());
|
|
|
}
|
|
|
}
|
|
|
}
|
|
|
@@ -520,4 +523,36 @@ public class LumaServiceImpl implements LumaService {
|
|
|
}
|
|
|
return null;
|
|
|
}
|
|
|
+
|
|
|
+ public SubmitResult syncConversation(LumaUserConversation lumaUserConversation) throws Exception {
|
|
|
+ Long providerId = lumaUserConversation.getProviderId();
|
|
|
+ LumaUserApiProvider apiProvider = lumaUserApiProviderMapper.selectById(providerId);
|
|
|
+ String url = apiProvider.getDomain() + "/luma/generations/" + lumaUserConversation.getTaskId();
|
|
|
+ HttpRequest request = HttpRequest.get(url);
|
|
|
+ request.header("Authorization", apiProvider.getAuth());
|
|
|
+
|
|
|
+ String body = request.setConnectionTimeout(50000).execute().body();
|
|
|
+ log.info("action body:{}", body);
|
|
|
+ SubmitResult submitResult = Jsons.parseObject(body, SubmitResult.class);
|
|
|
+ if (submitResult.getId() == null) {
|
|
|
+ throw BusinessRuntimeException.getInstance("视频不存在");
|
|
|
+ }
|
|
|
+ if (FINISH_STATUS.contains(submitResult.getState())) {
|
|
|
+ String id = submitResult.getId();
|
|
|
+ if (!FINISH_STATUS.contains(lumaUserConversation.getStatus())) {
|
|
|
+ lumaUserConversation.setStatus(submitResult.getState());
|
|
|
+ SubmitResult.Video video = submitResult.getVideo();
|
|
|
+ lumaUserConversation.setFinishTime(System.currentTimeMillis());
|
|
|
+ //出水印
|
|
|
+ String removeVideoWatermarkUrl = removeVideoWatermark(lumaUserConversation.getProviderId(),lumaUserConversation.getTaskId());
|
|
|
+ lumaUserConversation.setVideoUrl(removeVideoWatermarkUrl);
|
|
|
+ lumaUserConversation.setThumbnail(video.getThumbnail());
|
|
|
+ TASK_EXECUTOR.execute(() -> {
|
|
|
+ //同步
|
|
|
+ sync(lumaUserConversation);
|
|
|
+ });
|
|
|
+ }
|
|
|
+ }
|
|
|
+ return submitResult;
|
|
|
+ }
|
|
|
}
|