|
@@ -22,9 +22,13 @@ import org.apache.commons.lang3.StringUtils; |
|
|
import org.slf4j.Logger; |
|
|
import org.slf4j.Logger; |
|
|
import org.slf4j.LoggerFactory; |
|
|
import org.slf4j.LoggerFactory; |
|
|
import org.springframework.beans.factory.annotation.Autowired; |
|
|
import org.springframework.beans.factory.annotation.Autowired; |
|
|
|
|
|
import org.springframework.beans.factory.annotation.Qualifier; |
|
|
|
|
|
import org.springframework.beans.factory.annotation.Value; |
|
|
|
|
|
import org.springframework.data.redis.core.RedisTemplate; |
|
|
import org.springframework.scheduling.annotation.Async; |
|
|
import org.springframework.scheduling.annotation.Async; |
|
|
import org.springframework.scheduling.annotation.AsyncResult; |
|
|
import org.springframework.scheduling.annotation.AsyncResult; |
|
|
import org.springframework.stereotype.Service; |
|
|
import org.springframework.stereotype.Service; |
|
|
|
|
|
import org.springframework.util.CollectionUtils; |
|
|
import org.springframework.util.ObjectUtils; |
|
|
import org.springframework.util.ObjectUtils; |
|
|
|
|
|
|
|
|
import javax.transaction.xa.XAException; |
|
|
import javax.transaction.xa.XAException; |
|
@@ -33,6 +37,7 @@ import java.util.Date; |
|
|
import java.util.List; |
|
|
import java.util.List; |
|
|
import java.util.Objects; |
|
|
import java.util.Objects; |
|
|
import java.util.concurrent.Future; |
|
|
import java.util.concurrent.Future; |
|
|
|
|
|
import java.util.concurrent.atomic.AtomicInteger; |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
@Service |
|
|
@Service |
|
@@ -191,190 +196,8 @@ public class PhotoSpeakVideoServiceImpl implements PhotoSpeakVideoService { |
|
|
photoSpeakVideoMapper.deleteById(id); |
|
|
photoSpeakVideoMapper.deleteById(id); |
|
|
} |
|
|
} |
|
|
|
|
|
|
|
|
@Override |
|
|
|
|
|
public Future createVideo(PhotoSpeakVideo photoSpeakVideo,Boolean flag) { |
|
|
|
|
|
boolean isCreate = false; |
|
|
|
|
|
String msg = ""; |
|
|
|
|
|
PhotoSpeakVideo videoUpd = new PhotoSpeakVideo(); |
|
|
|
|
|
videoUpd.setId(photoSpeakVideo.getId()); |
|
|
|
|
|
|
|
|
|
|
|
String personPhotoUrl = null; |
|
|
|
|
|
if (photoSpeakVideo.getPersonPhotoId() == null) { |
|
|
|
|
|
msg = "未查询到人物照片"; |
|
|
|
|
|
} else { |
|
|
|
|
|
personPhotoUrl = photoSpeakVideo.getPersonPhotoUrl(); |
|
|
|
|
|
PersonPhoto personPhotoInfo = personPhotoService.getById(photoSpeakVideo.getPersonPhotoId()); |
|
|
|
|
|
//如果是上传图片就去检验合法 |
|
|
|
|
|
if (EnumMouldSendType.build.getCode().equals(personPhotoInfo.getSendType())) { |
|
|
|
|
|
//校验图片是否合法 |
|
|
|
|
|
AiCheckPhotoParam param = new AiCheckPhotoParam(); |
|
|
|
|
|
param.setImg(Base64Util.imageUrlToBase64(personPhotoUrl)); |
|
|
|
|
|
AiCheckPhotoResult result = AiVideoHelper.checkPhoto(param); |
|
|
|
|
|
if (result.getCode() != 2000) { |
|
|
|
|
|
videoUpd.setVideoStatus(EnumVideoStatus.fail.getCode()); |
|
|
|
|
|
videoUpd.setVideoMsg("图片质量审核:" + result.getMsg()); |
|
|
|
|
|
this.saveOrUpdate(videoUpd); |
|
|
|
|
|
return new AsyncResult<>(0); |
|
|
|
|
|
} |
|
|
|
|
|
} |
|
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
if(StringUtils.isBlank(personPhotoUrl)){ |
|
|
|
|
|
videoUpd.setVideoStatus(EnumVideoStatus.fail.getCode()); |
|
|
|
|
|
videoUpd.setVideoMsg(msg); |
|
|
|
|
|
this.saveOrUpdate(videoUpd); |
|
|
|
|
|
return new AsyncResult<>(0); |
|
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
Integer voiceFrom = photoSpeakVideo.getVoiceFrom(); |
|
|
|
|
|
String voiceMouldSmId = null; |
|
|
|
|
|
String voiceType = "default";//默认 |
|
|
|
|
|
Integer sex = 1; |
|
|
|
|
|
Double videoTime = null;//用户创建视频的时长 |
|
|
|
|
|
|
|
|
|
|
|
//TODO 关闭用户相关流程 |
|
|
|
|
|
UserCreateVideoNum videoNum = userCreateVideoNumService.queryInfoByUserId(photoSpeakVideo.getUserId()); |
|
|
|
|
|
// if (videoNum == null) { |
|
|
|
|
|
// videoUpd.setVideoStatus(EnumVideoStatus.fail.getCode()); |
|
|
|
|
|
// videoUpd.setVideoMsg("用户没有创建视频时长"); |
|
|
|
|
|
// this.saveOrUpdate(videoUpd); |
|
|
|
|
|
// return new AsyncResult<>(0); |
|
|
|
|
|
// } else { |
|
|
|
|
|
// if (DateUtils.isDateAfter(String.valueOf(videoNum.getEffectiveDate()))) { |
|
|
|
|
|
// videoUpd.setVideoStatus(EnumVideoStatus.fail.getCode()); |
|
|
|
|
|
// videoUpd.setVideoMsg("有效期已到期"); |
|
|
|
|
|
// this.saveOrUpdate(videoUpd); |
|
|
|
|
|
// return new AsyncResult<>(0); |
|
|
|
|
|
// } |
|
|
|
|
|
// } |
|
|
|
|
|
|
|
|
|
|
|
String voiceMaterialUrl = null; |
|
|
|
|
|
if(EnumVoiceFrom.FROM_MOULD.getCode().equals(voiceFrom)){ |
|
|
|
|
|
try{ |
|
|
|
|
|
JSONObject personMouldObject = JSONObject.parseObject(photoSpeakVideo.getVoiceMouldSm()); |
|
|
|
|
|
voiceMouldSmId = personMouldObject.getString("mouldSmId"); |
|
|
|
|
|
Integer speakType = personMouldObject.getInteger("speakType"); |
|
|
|
|
|
Integer personType = personMouldObject.getInteger("personType"); |
|
|
|
|
|
sex = personMouldObject.getInteger("sex"); |
|
|
|
|
|
if(speakType != null && speakType > 0){ |
|
|
|
|
|
voiceType = EnumSpeakType.getEnum(speakType).getType(); |
|
|
|
|
|
}else if(personType != null && personType > 0){ |
|
|
|
|
|
voiceType = EnumPersonType.getEnum(personType).getType(); |
|
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
}catch(Exception e){} |
|
|
|
|
|
if(StringUtils.isBlank(voiceMouldSmId)){ |
|
|
|
|
|
msg = "参数错误,未找到声音模板数据"; |
|
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
//获取视频时长 |
|
|
|
|
|
AiPreviewParam param = new AiPreviewParam(); |
|
|
|
|
|
if (StringUtils.isBlank(photoSpeakVideo.getPaperwork())){ |
|
|
|
|
|
msg = "未填写视频文案数据"; |
|
|
|
|
|
} |
|
|
|
|
|
param.setGen_txt(photoSpeakVideo.getPaperwork().replaceAll(str, "[*]")); |
|
|
|
|
|
param.setGender(sex == 1 ? "male" : "female"); |
|
|
|
|
|
param.setVoice_id(voiceMouldSmId); |
|
|
|
|
|
param.setVoice_style(voiceType); |
|
|
|
|
|
AiPreviewResult result = AiVideoHelper.voicePreview(param); |
|
|
|
|
|
if (result.isSuccess()) { |
|
|
|
|
|
videoTime = result.getTime(); |
|
|
|
|
|
} |
|
|
|
|
|
}else if(EnumVoiceFrom.FROM_UPD.getCode().equals(voiceFrom)){ |
|
|
|
|
|
voiceMaterialUrl = photoSpeakVideo.getVoiceMaterialUrl(); |
|
|
|
|
|
VoiceMaterial voiceMaterial = voiceMaterialService.getById(photoSpeakVideo.getVoiceMaterialId()); |
|
|
|
|
|
if(StringUtils.isBlank(voiceMaterialUrl)){ |
|
|
|
|
|
voiceMaterialService.handVideoUrl(voiceMaterial); |
|
|
|
|
|
voiceMaterialUrl = voiceMaterial.getMaterial(); |
|
|
|
|
|
videoUpd.setVoiceMaterialUrl(voiceMaterialUrl); |
|
|
|
|
|
} |
|
|
|
|
|
if(StringUtils.isBlank(voiceMaterialUrl)){ |
|
|
|
|
|
msg = "未找到上传声音文件"; |
|
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
//判断用户时长是否够创建该视频 |
|
|
|
|
|
VideUploadResult videoDetail = videoFactory.getExcutor(videoType).getVideoDetailWithCache(voiceMaterial.getVideoId()); |
|
|
|
|
|
if (videoDetail.isSuccess() && StringUtils.isNotBlank(videoDetail.getDuration()) && !"0.0".equals(videoDetail.getDuration())) { |
|
|
|
|
|
String duration = videoDetail.getDuration(); |
|
|
|
|
|
videoTime = Double.valueOf(duration); |
|
|
|
|
|
} |
|
|
|
|
|
} else if (EnumVoiceFrom.MUSIC.getCode().equals(voiceFrom)) { |
|
|
|
|
|
Long musicId = photoSpeakVideo.getMusicId(); |
|
|
|
|
|
MusicInfo musicInfo = musicInfoService.getById(musicId); |
|
|
|
|
|
if (ObjectUtils.isEmpty(musicInfo)) { |
|
|
|
|
|
msg = "未找到音乐文件"; |
|
|
|
|
|
} |
|
|
|
|
|
voiceMaterialUrl = musicInfo.getUrl(); |
|
|
|
|
|
if (StringUtils.isBlank(voiceMaterialUrl)) { |
|
|
|
|
|
msg = "音乐文件错误"; |
|
|
|
|
|
} |
|
|
|
|
|
videoTime = Double.valueOf(musicInfo.getTime()); |
|
|
|
|
|
} else { |
|
|
|
|
|
msg = "声音数据异常"; |
|
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
//判断获取创建的视频时长 |
|
|
|
|
|
if (videoTime == null){ |
|
|
|
|
|
videoUpd.setVideoStatus(EnumVideoStatus.fail.getCode()); |
|
|
|
|
|
videoUpd.setVideoMsg("获取创建的视频时长失败"); |
|
|
|
|
|
this.saveOrUpdate(videoUpd); |
|
|
|
|
|
return new AsyncResult<>(0); |
|
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
//TODO 关闭用户相关流程 |
|
|
|
|
|
//获取套餐信息 |
|
|
|
|
|
// UserConsumptionPackage infoById = userConsumptionPackageService.getPackageInfoById(videoNum.getPackageId()); |
|
|
|
|
|
// if (infoById == null){ |
|
|
|
|
|
// videoUpd.setVideoStatus(EnumVideoStatus.fail.getCode()); |
|
|
|
|
|
// videoUpd.setVideoMsg("套餐信息不存在"); |
|
|
|
|
|
// this.saveOrUpdate(videoUpd); |
|
|
|
|
|
// return new AsyncResult<>(0); |
|
|
|
|
|
// } |
|
|
|
|
|
// //生成视频时长不能超过对应套餐的时长 |
|
|
|
|
|
// if (infoById.getChargeTime() < videoTime) { |
|
|
|
|
|
// videoUpd.setVideoStatus(EnumVideoStatus.fail.getCode()); |
|
|
|
|
|
// videoUpd.setVideoMsg("视频时长不能超过" + infoById.getChargeTime() + "s"); |
|
|
|
|
|
// this.saveOrUpdate(videoUpd); |
|
|
|
|
|
// return new AsyncResult<>(0); |
|
|
|
|
|
// } |
|
|
|
|
|
videoUpd.setVideoTime(String.valueOf(videoTime)); |
|
|
|
|
|
|
|
|
|
|
|
if(StringUtils.isBlank(voiceMouldSmId) && StringUtils.isBlank(voiceMaterialUrl)){ |
|
|
|
|
|
videoUpd.setVideoStatus(EnumVideoStatus.fail.getCode()); |
|
|
|
|
|
videoUpd.setVideoMsg(msg); |
|
|
|
|
|
this.saveOrUpdate(videoUpd); |
|
|
|
|
|
return new AsyncResult<>(0); |
|
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
String paperwork = photoSpeakVideo.getPaperwork(); |
|
|
|
|
|
if(EnumVoiceFrom.FROM_MOULD.getCode().equals(voiceFrom) && StringUtils.isBlank(paperwork)){ |
|
|
|
|
|
videoUpd.setVideoStatus(EnumVideoStatus.fail.getCode()); |
|
|
|
|
|
videoUpd.setVideoMsg("未填写视频文案数据"); |
|
|
|
|
|
this.saveOrUpdate(videoUpd); |
|
|
|
|
|
return new AsyncResult<>(0); |
|
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
double useCredit = 0; |
|
|
|
|
|
//修改用户创建视频时间表 |
|
|
|
|
|
if (flag) { |
|
|
|
|
|
// //每秒消耗的积分 |
|
|
|
|
|
// double i = (double)( videoNum.getVideoPrice() / 60); |
|
|
|
|
|
// i = i < 1 ? 1.0 : i; //如果小于1 就直接取1 |
|
|
|
|
|
// //用户创建视频需要时积分 |
|
|
|
|
|
// useCredit = (videoTime * i); |
|
|
|
|
|
// //判断用户积分是否足够 |
|
|
|
|
|
// if (videoNum.getResidueCredits() < useCredit) { |
|
|
|
|
|
// videoUpd.setVideoStatus(EnumVideoStatus.fail.getCode()); |
|
|
|
|
|
// videoUpd.setVideoMsg("创建视频时长不足,请充值"); |
|
|
|
|
|
// this.saveOrUpdate(videoUpd); |
|
|
|
|
|
// return new AsyncResult<>(0); |
|
|
|
|
|
// } |
|
|
|
|
|
// useCredit = Math.round(useCredit); |
|
|
|
|
|
//如果时间够,就去减去相对应的数据 |
|
|
|
|
|
userCreateVideoNumService.addOrSubtractNumberOfTimes(1, videoNum, useCredit, videoTime); |
|
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
@Async |
|
|
@Async |
|
|
|
|
|
@Override |
|
|
public ResultData createVideo(PhotoSpeakVideo photoSpeakVideo) { |
|
|
public ResultData createVideo(PhotoSpeakVideo photoSpeakVideo) { |
|
|
try { |
|
|
try { |
|
|
AiPhotoSpeakParam param = new AiPhotoSpeakParam(); |
|
|
AiPhotoSpeakParam param = new AiPhotoSpeakParam(); |
|
|