This commit is contained in:
Jerry Yan 2025-01-02 15:12:20 +08:00
parent c000eb2700
commit 1923a5c438
10 changed files with 132 additions and 22 deletions

View File

@ -23,6 +23,7 @@ public class ContentPageVO {
private Integer contentType;
@ApiModelProperty("源素材类型 1:视频 2:图片")
private Integer sourceType;
private int lockType;
@ApiModelProperty("内容id contentType为0或1时才有值")
private Long contentId;
@ApiModelProperty("模版id")

View File

@ -22,9 +22,8 @@ import com.ycwl.basic.model.pc.scenic.resp.ScenicRespVO;
import com.ycwl.basic.model.pc.source.req.SourceReqQuery;
import com.ycwl.basic.model.pc.source.resp.SourceRespVO;
import com.ycwl.basic.model.pc.video.entity.MemberVideoEntity;
import com.ycwl.basic.model.pc.video.req.VideoReqQuery;
import com.ycwl.basic.model.pc.video.resp.VideoRespVO;
import com.ycwl.basic.service.mobile.AppScenicService;
import com.ycwl.basic.template.repository.TemplateRepository;
import com.ycwl.basic.utils.ApiResponse;
import com.ycwl.basic.utils.JwtTokenUtil;
import lombok.extern.slf4j.Slf4j;
@ -66,6 +65,8 @@ public class AppScenicServiceImpl implements AppScenicService {
@Value("${face.score}")
private BigDecimal faceScore;
@Autowired
private TemplateRepository templateRepository;
@Override
public ApiResponse<PageInfo<ScenicAppVO>> pageQuery(ScenicReqQuery scenicReqQuery) {
@ -179,12 +180,19 @@ public class AppScenicServiceImpl implements AppScenicService {
List<ContentPageVO> contentList = templateMapper.listFor(faceRespVO.getScenicId());
contentList.forEach(contentPageVO -> {
List<MemberVideoEntity> memberVideoEntityList = videoMapper.userFaceTemplateVideo(userId, faceId, contentPageVO.getTemplateId());
contentPageVO.setContentType(1);
if (!memberVideoEntityList.isEmpty()) {
contentPageVO.setIsBuy(memberVideoEntityList.get(0).getIsBuy());
contentPageVO.setContentId(memberVideoEntityList.get(0).getVideoId());
contentPageVO.setContentType(1);
contentPageVO.setLockType(-1);
} else {
contentPageVO.setContentType(0);
boolean canGenerate = templateRepository.determineTemplateCanGenerate(contentPageVO.getTemplateId(), faceId);
if (canGenerate) {
contentPageVO.setLockType(0);
} else {
contentPageVO.setLockType(1);
}
}
});

View File

@ -16,6 +16,7 @@ import com.ycwl.basic.model.pc.video.entity.VideoEntity;
import com.ycwl.basic.model.pc.video.req.VideoReqQuery;
import com.ycwl.basic.model.pc.video.resp.VideoRespVO;
import com.ycwl.basic.service.mobile.GoodsService;
import com.ycwl.basic.template.repository.TemplateRepository;
import com.ycwl.basic.utils.ApiResponse;
import com.ycwl.basic.utils.DateUtils;
import org.apache.commons.lang3.StringUtils;
@ -48,6 +49,8 @@ public class GoodsServiceImpl implements GoodsService {
private DeviceMapper deviceMapper;
@Autowired
private FaceMapper faceMapper;
@Autowired
private TemplateRepository templateRepository;
public ApiResponse<List<GoodsPageVO>> goodsList(GoodsReqQuery query) {
//查询原素材

View File

@ -208,7 +208,6 @@ public class FaceServiceImpl implements FaceService {
task.faceId = faceEntity.getId();
task.faceSampleId = sampleRespVO.getId();
task.memberId = userId;
task.createTime = sampleRespVO.getCreateAt();
VideoPieceGetter.addTask(task);
}
taskTaskService.autoCreateTaskByFaceId(faceEntity.getId());

View File

@ -8,6 +8,7 @@ import com.ycwl.basic.model.pc.template.entity.TemplateEntity;
import com.ycwl.basic.model.pc.template.req.TemplateReqQuery;
import com.ycwl.basic.model.pc.template.resp.TemplateRespVO;
import com.ycwl.basic.service.pc.TemplateService;
import com.ycwl.basic.template.repository.TemplateRepository;
import com.ycwl.basic.utils.ApiResponse;
import com.ycwl.basic.utils.SnowFlakeUtil;
import org.springframework.beans.factory.annotation.Autowired;
@ -24,6 +25,8 @@ public class TemplateServiceImpl implements TemplateService {
@Autowired
private TemplateMapper templateMapper;
@Autowired
private TemplateRepository templateRepository;
@Override
public ApiResponse<PageInfo<TemplateRespVO>> pageQuery(TemplateReqQuery templateReqQuery) {
@ -40,9 +43,7 @@ public class TemplateServiceImpl implements TemplateService {
@Override
public ApiResponse<TemplateRespVO> getById(Long id) {
TemplateRespVO data = templateMapper.getById(id);
data.setChildren(templateMapper.getByPid(id));
return ApiResponse.success(data);
return ApiResponse.success(templateRepository.getTemplate(id));
}
@Override
@ -70,6 +71,7 @@ public class TemplateServiceImpl implements TemplateService {
int i = templateMapper.deleteById(id);
if (i > 0) {
templateMapper.deleteByPid(id);
templateRepository.clearTemplateCache(id);
return ApiResponse.success(i);
}else {
return ApiResponse.fail("删除模版失败");
@ -88,6 +90,7 @@ public class TemplateServiceImpl implements TemplateService {
item.setStatus(1);
templateMapper.add(item);
});
templateRepository.clearTemplateCache(template.getId());
}
if (i > 0) {
return ApiResponse.success(true);
@ -108,19 +111,13 @@ public class TemplateServiceImpl implements TemplateService {
@Override
public TemplateConfigEntity getConfig(Long templateId) {
TemplateConfigEntity config = templateMapper.getConfig(templateId);
if (config == null) {
config = new TemplateConfigEntity();
config.setId(SnowFlakeUtil.getLongId());
config.setTemplateId(templateId);
templateMapper.addConfig(config);
}
return config;
return templateRepository.getTemplateConfig(templateId);
}
@Override
public void saveConfig(Long configId, TemplateConfigEntity config) {
config.setId(configId);
templateRepository.clearTemplateCache(config.getTemplateId());
templateMapper.updateConfigById(config);
}
}

View File

@ -241,7 +241,6 @@ public class TaskTaskServiceImpl implements TaskService {
VideoPieceGetter.Task task = new VideoPieceGetter.Task();
task.setFaceSampleId(sample.getId());
task.setMemberId(faceRespVO.getMemberId());
task.setCreateTime(sample.getCreateAt());
return task;
}).forEach(VideoPieceGetter::addTask);

View File

@ -53,7 +53,6 @@ public class VideoPieceGetter {
public static class Task {
public String type = "normal";
public Long faceSampleId;
public Date createTime;
public Callback callback;
public Long memberId;
public Long faceId;
@ -127,14 +126,14 @@ public class VideoPieceGetter {
}
BigDecimal duration = cutPre.add(cutPost);
List<FileObject> listByDtRange = pieceGetter.getFileListByDtRange(
new Date(task.getCreateTime().getTime() - cutPre.multiply(BigDecimal.valueOf(1000)).longValue()),
new Date(task.getCreateTime().getTime() + cutPost.multiply(BigDecimal.valueOf(1000)).longValue())
new Date(faceSample.getCreateAt().getTime() - cutPre.multiply(BigDecimal.valueOf(1000)).longValue()),
new Date(faceSample.getCreateAt().getTime() + cutPost.multiply(BigDecimal.valueOf(1000)).longValue())
);
if (listByDtRange.isEmpty()) {
log.warn("没有可用的文件");
return;
}
long offset = task.getCreateTime().getTime() - cutPre.multiply(BigDecimal.valueOf(1000)).longValue() - listByDtRange.get(0).getCreateTime().getTime();
long offset = faceSample.getCreateAt().getTime() - cutPre.multiply(BigDecimal.valueOf(1000)).longValue() - listByDtRange.get(0).getCreateTime().getTime();
FfmpegTask ffmpegTask = new FfmpegTask();
ffmpegTask.setFileList(listByDtRange);
ffmpegTask.setDuration(duration);
@ -149,9 +148,12 @@ public class VideoPieceGetter {
log.info("视频裁切成功");
IStorageAdapter adapter = StorageFactory.use("assets");
String url = adapter.uploadFile(outFile, "video-source", outFile.getName());
// 上传成功后删除文件
outFile.delete();
SourceEntity imgSource = sourceMapper.findBySampleId(faceSample.getId());
SourceEntity sourceEntity = new SourceEntity();
sourceEntity.setId(SnowFlakeUtil.getLongId());
sourceEntity.setCreateTime(faceSample.getCreateAt());
MemberSourceEntity videoSource = new MemberSourceEntity();
videoSource.setMemberId(task.getMemberId());
videoSource.setType(1);

View File

@ -0,0 +1,4 @@
package com.ycwl.basic.template;
public class TemplateFactory {
}

View File

@ -0,0 +1,97 @@
package com.ycwl.basic.template.repository;
import com.alibaba.fastjson.JSONObject;
import com.ycwl.basic.mapper.FaceMapper;
import com.ycwl.basic.mapper.FaceSampleMapper;
import com.ycwl.basic.mapper.TemplateMapper;
import com.ycwl.basic.model.pc.face.resp.FaceRespVO;
import com.ycwl.basic.model.pc.faceSample.resp.FaceSampleRespVO;
import com.ycwl.basic.model.pc.template.entity.TemplateConfigEntity;
import com.ycwl.basic.model.pc.template.resp.TemplateRespVO;
import com.ycwl.basic.utils.SnowFlakeUtil;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.data.redis.core.RedisTemplate;
import org.springframework.stereotype.Service;
import java.util.Arrays;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import java.util.stream.Collectors;
@Service // 临时这么用
public class TemplateRepository {
@Autowired
private FaceMapper faceMapper;
@Autowired
private FaceSampleMapper faceSampleMapper;
@Autowired
private TemplateMapper templateMapper;
@Autowired
private RedisTemplate<String, String> redisTemplate;
public static final String TEMPLATE_CACHE_KEY = "template:%s";
public static final String TEMPLATE_CONFIG_CACHE_KEY = "template:%s:config";
public boolean determineTemplateCanGenerate(Long templateId, Long faceId) {
TemplateRespVO template = templateMapper.getById(templateId);
template.setChildren(templateMapper.getByPid(templateId));
Map<String, Boolean> map = new HashMap<>();
for (TemplateRespVO child : template.getChildren()) {
if (child.getIsPlaceholder() == 1) {
map.put(child.getSourceUrl(), false);
}
}
TemplateConfigEntity templateConfig = templateMapper.getConfig(templateId);
if (0 == templateConfig.getMinimalPlaceholderFill()) {
return true;
}
FaceRespVO face = faceMapper.getById(faceId);
if (face.getMatchSampleIds() == null) {
return false;
}
List<FaceSampleRespVO> faceSample = faceSampleMapper.listByIds(Arrays.stream(face.getMatchSampleIds().split(",")).map(Long::valueOf).collect(Collectors.toList()));
faceSample.stream().collect(Collectors.groupingBy(FaceSampleRespVO::getDeviceId)).forEach((deviceId, value) -> {
if (map.containsKey(deviceId.toString())) {
map.put(deviceId.toString(), true);
}
});
return map.values().stream().filter(item -> item).count() >= templateConfig.getMinimalPlaceholderFill();
}
public TemplateRespVO getTemplate(Long templateId) {
if (redisTemplate.hasKey(String.format(TEMPLATE_CACHE_KEY, templateId))) {
return JSONObject.parseObject(redisTemplate.opsForValue().get(String.format(TEMPLATE_CACHE_KEY, templateId)), TemplateRespVO.class);
}
TemplateRespVO template = templateMapper.getById(templateId);
if (null == template.getPid() || template.getPid() == 0) {
template.setChildren(templateMapper.getByPid(templateId));
redisTemplate.opsForValue().set(String.format(TEMPLATE_CACHE_KEY, templateId), JSONObject.toJSONString(template));
return template;
} else {
clearTemplateCache(templateId);
return null;
}
}
public TemplateConfigEntity getTemplateConfig(Long templateId) {
if (redisTemplate.hasKey(String.format(TEMPLATE_CONFIG_CACHE_KEY, templateId))) {
return JSONObject.parseObject(redisTemplate.opsForValue().get(String.format(TEMPLATE_CONFIG_CACHE_KEY, templateId)), TemplateConfigEntity.class);
}
TemplateConfigEntity templateConfig = templateMapper.getConfig(templateId);
if (templateConfig == null) {
templateConfig = new TemplateConfigEntity();
templateConfig.setId(SnowFlakeUtil.getLongId());
templateConfig.setTemplateId(templateId);
templateMapper.addConfig(templateConfig);
}
redisTemplate.opsForValue().set(String.format(TEMPLATE_CONFIG_CACHE_KEY, templateId), JSONObject.toJSONString(templateConfig));
return templateConfig;
}
public boolean clearTemplateCache(Long templateId) {
redisTemplate.delete(String.format(TEMPLATE_CACHE_KEY, templateId));
redisTemplate.delete(String.format(TEMPLATE_CONFIG_CACHE_KEY, templateId));
return true;
}
}

View File

@ -74,7 +74,7 @@
select id, scenic_id, member_id, face_url,score, match_sample_ids, first_match_rate, match_result, create_at, update_at
from face
where member_id = #{userId} and scenic_id = #{scenicId}
order by id desc
order by update_at desc
limit 1
</select>
<select id="listByScenicIdAndNotFinished" resultType="com.ycwl.basic.model.pc.face.resp.FaceRespVO">
@ -86,7 +86,7 @@
select id, scenic_id, member_id, face_url,score, match_sample_ids, first_match_rate, match_result, create_at, update_at
from face
where member_id = #{userId}
order by create_at desc
order by update_at desc
limit 1
</select>
</mapper>