This commit is contained in:
Jerry Yan 2025-01-02 10:45:07 +08:00
parent cfd48861d5
commit 495210c6b1
22 changed files with 261 additions and 139 deletions

View File

@ -4,4 +4,5 @@ public class TaskConstant {
public static final String TASK_TEMPLATE_KEY_PFX="task:template:cache:";
public static final String TASK_ONLINE_WORKER_KEY_PFX="task:online_worker:";
public static final String TASK_WORKER_TASK_KEY_PFX="task:worker:task:";
public static final String TASK_AUTOMATIC_KEY_PFX = "task:face:%s:template:%s:id";
}

View File

@ -44,9 +44,10 @@ public class AppGoodsController {
}
@ApiOperation("成片vlog商品详情")
@GetMapping("/getVideoGoodsDetail/{goodId}")
public ApiResponse<VideoGoodsDetailVO> videoGoodsDetail(@PathVariable("goodId") Long goodsId) {
return goodsService.videoGoodsDetail(goodsId);
@GetMapping("/getVideoGoodsDetail/{videoId}")
public ApiResponse<VideoGoodsDetailVO> videoGoodsDetail(@PathVariable("videoId") Long videoId) {
JwtInfo worker = JwtTokenUtil.getWorker();
return goodsService.videoGoodsDetail(worker.getUserId(), videoId);
}
@ApiOperation("查询价格")
@ -80,20 +81,21 @@ public class AppGoodsController {
/**
* 查询用户当前景区的具体模版视频合成任务状态
*
* @param templateId 模版id
* @return 1 合成中 2 合成成功
*/
@ApiOperation("查询用户当前景区的具体模版视频合成任务状态 1 合成中 2 合成成功 ")
@GetMapping("/task/template/{templateId}")
public ApiResponse<Integer> getTemplateTaskStatus(@PathVariable("templateId") Long templateId) {
@GetMapping("/task/face/{faceId}/template/{templateId}")
public ApiResponse<VideoTaskStatusVO> getTemplateTaskStatus(@PathVariable("faceId") Long faceId, @PathVariable("templateId") Long templateId) {
JwtInfo worker = JwtTokenUtil.getWorker();
return goodsService.getTemplateTaskStatus(worker.getUserId(),templateId);
return goodsService.getTemplateTaskStatus(worker.getUserId(), faceId, templateId);
}
@PostMapping("/submitVideoTask")
public ApiResponse<String> submitVideoTask(@RequestBody VideoTaskReq videoTaskReq) {
JwtInfo worker = JwtTokenUtil.getWorker();
taskService.autoCreateTaskByFaceIdAndTempalteId(videoTaskReq.getFaceId(),videoTaskReq.getTemplateId(),0);
taskService.createTaskByFaceIdAndTempalteId(videoTaskReq.getFaceId(),videoTaskReq.getTemplateId(),0);
return ApiResponse.success("成功");
}
}

View File

@ -59,10 +59,4 @@ public class TaskTaskController {
taskService.taskFail(taskId, req);
return ApiResponse.success("OK");
}
@PostMapping("/test/createRenderTask/{scenicId}/{templateId}/{faceId}")
public ApiResponse<String> createRenderTask(@PathVariable Long scenicId, @PathVariable Long templateId, @PathVariable Long faceId) {
taskService.createRenderTask(scenicId, templateId, faceId);
return ApiResponse.success("ok");
}
}

View File

@ -59,4 +59,6 @@ public interface SourceMapper {
SourceEntity querySameVideo(Long faceSampleId, Long deviceId);
int hasRelationTo(Long memberId, Long sourceId, int type);
List<SourceEntity> listVideoByFaceRelation(Long faceId);
}

View File

@ -1,5 +1,6 @@
package com.ycwl.basic.mapper;
import com.ycwl.basic.model.pc.task.entity.TaskEntity;
import com.ycwl.basic.model.pc.video.entity.MemberVideoEntity;
import com.ycwl.basic.model.pc.video.entity.VideoEntity;
import com.ycwl.basic.model.pc.video.req.VideoReqQuery;
@ -32,4 +33,14 @@ public interface VideoMapper {
List<VideoRespVO> queryByRelation(VideoReqQuery videoReqQuery);
List<MemberVideoEntity> userFaceTemplateVideo(Long userId, Long faceId, Long templateId);
List<TaskEntity> listTaskByFaceRelation(Long userId, Long faceId);
List<TaskEntity> listTaskByFaceTemplateRelation(Long userId, Long faceId, Long templateId);
List<TaskEntity> listTaskByScenicRelation(Long userId, Long scenicId);
MemberVideoEntity queryUserVideo(Long userId, Long videoId);
int updateRelationWhenTaskSuccess(Long taskId, Long videoId);
}

View File

@ -5,6 +5,8 @@ import lombok.Data;
@Data
public class VideoTaskStatusVO {
private Integer status;
private Long videoId;
private Long templateId;
private Long faceId;
private Long scenicId;
}

View File

@ -5,7 +5,10 @@ import lombok.Data;
@Data
public class MemberVideoEntity {
private Long id;
private Long scenicId;
private Long memberId;
private Long faceId;
private Long templateId;
private Long taskId;
private Long videoId;
private Integer isBuy;

View File

@ -56,8 +56,6 @@ public class VideoRespVO {
*/
@ApiModelProperty("视频链接")
private String videoUrl;
@ApiModelProperty("是否购买 1是 0否")
private Integer isBuy;
@JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss", timezone = "GMT+8")
private Date createTime;
@JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss", timezone = "GMT+8")

View File

@ -142,7 +142,7 @@ public class AppScenicServiceImpl implements AppScenicService {
List<MemberVideoEntity> memberVideoEntityList = videoMapper.userFaceTemplateVideo(worker.getUserId(), faceId, contentPageVO.getTemplateId());
if (!memberVideoEntityList.isEmpty()) {
contentPageVO.setIsBuy(memberVideoEntityList.get(0).getIsBuy());
contentPageVO.setContentId(memberVideoEntityList.get(0).getId());
contentPageVO.setContentId(memberVideoEntityList.get(0).getVideoId());
}
});
@ -181,7 +181,10 @@ public class AppScenicServiceImpl implements AppScenicService {
List<MemberVideoEntity> memberVideoEntityList = videoMapper.userFaceTemplateVideo(userId, faceId, contentPageVO.getTemplateId());
if (!memberVideoEntityList.isEmpty()) {
contentPageVO.setIsBuy(memberVideoEntityList.get(0).getIsBuy());
contentPageVO.setContentId(memberVideoEntityList.get(0).getId());
contentPageVO.setContentId(memberVideoEntityList.get(0).getVideoId());
contentPageVO.setContentType(1);
} else {
contentPageVO.setContentType(0);
}
});

View File

@ -9,8 +9,10 @@ import com.ycwl.basic.model.pc.face.resp.FaceRespVO;
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.task.req.TaskReqQuery;
import com.ycwl.basic.model.pc.task.entity.TaskEntity;
import com.ycwl.basic.model.pc.task.resp.TaskRespVO;
import com.ycwl.basic.model.pc.video.entity.MemberVideoEntity;
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;
@ -25,6 +27,7 @@ import java.math.RoundingMode;
import java.text.DecimalFormat;
import java.util.ArrayList;
import java.util.List;
import java.util.Objects;
import java.util.Optional;
import java.util.stream.Collectors;
@ -61,7 +64,7 @@ public class GoodsServiceImpl implements GoodsService {
goodsPageVO.setGoodsName(videoRespVO.getTemplateName());
goodsPageVO.setScenicId(videoRespVO.getScenicId());
goodsPageVO.setScenicName(videoRespVO.getScenicName());
goodsPageVO.setGoodsType(1);
goodsPageVO.setGoodsType(0);
goodsPageVO.setGoodsId(videoRespVO.getId());
goodsPageVO.setTemplateName(videoRespVO.getTemplateName());
goodsPageVO.setTemplateCoverUrl(videoRespVO.getTemplateCoverUrl());
@ -79,10 +82,10 @@ public class GoodsServiceImpl implements GoodsService {
GoodsPageVO goodsPageVO = new GoodsPageVO();
if (type == 1) {
goodsPageVO.setGoodsName("原片集");
goodsPageVO.setGoodsType(2);
goodsPageVO.setGoodsType(1);
} else {
goodsPageVO.setGoodsName("照片集");
goodsPageVO.setGoodsType(3);
goodsPageVO.setGoodsType(2);
}
goodsPageVO.setScenicId(query.getScenicId());
goodsList.add(goodsPageVO);
@ -126,7 +129,7 @@ public class GoodsServiceImpl implements GoodsService {
goodsDetailVO.setScenicName(sourceRespVO.getScenicName());
goodsDetailVO.setLongitude(sourceRespVO.getLongitude());
goodsDetailVO.setLatitude(sourceRespVO.getLatitude());
goodsDetailVO.setGoodsType(2);
goodsDetailVO.setGoodsType(sourceType);
goodsDetailVO.setSourceType(sourceType);
goodsDetailVO.setGoodsId(sourceRespVO.getId());
goodsDetailVO.setVideoUrl(sourceRespVO.getVideoUrl());
@ -144,20 +147,20 @@ public class GoodsServiceImpl implements GoodsService {
public ApiResponse<BigDecimal> queryPrice(GoodsPriceQueryReq queryPriceData) {
Integer goodsType = queryPriceData.getGoodsType();
if(goodsType==1){//成片vlog
if(goodsType==0){//成片vlog
//成片的价格就是成片所用template的价格
Long videoId = queryPriceData.getGoodsId();
VideoRespVO videoRespVO = videoMapper.getById(videoId);
if(videoRespVO==null){
return ApiResponse.fail("该vlog不存在或已失效");
}
BigDecimal tmplatePrice = videoRespVO.getTemplatePrice();
if(tmplatePrice==null){
BigDecimal templatePrice = videoRespVO.getTemplatePrice();
if(templatePrice==null){
return ApiResponse.fail("该vlog使用的模板价格或状态异常请联系管理员");
}
return ApiResponse.success(tmplatePrice);
return ApiResponse.success(templatePrice);
}else if(goodsType==2){//原素材
}else if(goodsType==1 || goodsType == 2){//原素材
//原素材的价格就是原素材对应景区定的价格
Long scenicId = queryPriceData.getScenicId();
ScenicRespVO scenicRespVO = scenicMapper.getById(scenicId);
@ -174,27 +177,35 @@ public class GoodsServiceImpl implements GoodsService {
}
@Override
public ApiResponse<VideoGoodsDetailVO> videoGoodsDetail(Long goodsId) {
public ApiResponse<VideoGoodsDetailVO> videoGoodsDetail(Long userId, Long videoId) {
MemberVideoEntity entity = videoMapper.queryUserVideo(userId, videoId);
if (entity == null) {
return ApiResponse.fail("该视频不属于您");
}
VideoGoodsDetailVO goodsDetailVO = new VideoGoodsDetailVO();
VideoRespVO videoRespVO = videoMapper.getById(goodsId);
VideoRespVO videoRespVO = videoMapper.getById(videoId);
if(videoRespVO==null){
return ApiResponse.fail("该vlog不存在或已失效");
}
goodsDetailVO.setGoodsName(videoRespVO.getTemplateName());
goodsDetailVO.setScenicId(videoRespVO.getScenicId());
goodsDetailVO.setScenicName(videoRespVO.getScenicName());
goodsDetailVO.setGoodsType(1);
goodsDetailVO.setGoodsType(0);
goodsDetailVO.setGoodsId(videoRespVO.getId());
goodsDetailVO.setVideoUrl(videoRespVO.getVideoUrl());
goodsDetailVO.setTemplateCoverUrl(videoRespVO.getTemplateCoverUrl());
goodsDetailVO.setCreateTime(videoRespVO.getCreateTime());
BigDecimal templatePrice = videoRespVO.getTemplatePrice();
BigDecimal slashPrice = videoRespVO.getSlashPrice();
// 使用DecimalFormat格式化输出
DecimalFormat df = new DecimalFormat("0.00");
goodsDetailVO.setPrice(templatePrice==null?"":df.format(templatePrice.setScale(2, RoundingMode.HALF_UP)));
goodsDetailVO.setSlashPrice(slashPrice==null?null:df.format(slashPrice.setScale(2, RoundingMode.HALF_UP)));
goodsDetailVO.setIsBuy(videoRespVO.getIsBuy());
if (entity.getIsBuy() == 1) {
goodsDetailVO.setIsBuy(1);
} else {
goodsDetailVO.setIsBuy(0);
BigDecimal templatePrice = videoRespVO.getTemplatePrice();
BigDecimal slashPrice = videoRespVO.getSlashPrice();
// 使用DecimalFormat格式化输出
DecimalFormat df = new DecimalFormat("0.00");
goodsDetailVO.setPrice(templatePrice==null?"":df.format(templatePrice.setScale(2, RoundingMode.HALF_UP)));
goodsDetailVO.setSlashPrice(slashPrice==null?null:df.format(slashPrice.setScale(2, RoundingMode.HALF_UP)));
}
TaskRespVO taskRespVO = taskMapper.getById(videoRespVO.getTaskId());
JSONObject paramJson = JSON.parseObject(taskRespVO.getTaskParams());
long deviceCount;
@ -204,7 +215,7 @@ public class GoodsServiceImpl implements GoodsService {
deviceCount = paramJson.keySet().stream().filter(StringUtils::isNumeric).count();
}
goodsDetailVO.setLensNum((int) deviceCount);
goodsDetailVO.setFaceId(taskRespVO.getFaceId());
goodsDetailVO.setFaceId(entity.getFaceId());
return ApiResponse.success(goodsDetailVO);
}
@ -216,27 +227,28 @@ public class GoodsServiceImpl implements GoodsService {
*/
@Override
public ApiResponse<VideoTaskStatusVO> getTaskStatusByFaceId(Long userId, Long faceId) {
TaskReqQuery taskReqQuery = new TaskReqQuery();
taskReqQuery.setMemberId(userId);
taskReqQuery.setFaceId(faceId);
List<TaskEntity> taskList = videoMapper.listTaskByFaceRelation(userId, faceId);
VideoTaskStatusVO response = new VideoTaskStatusVO();
List<TaskRespVO> list=taskMapper.list(taskReqQuery);
if(list.isEmpty()){//没有任务
response.setFaceId(faceId);
if (taskList.isEmpty()) {
response.setStatus(0);
return ApiResponse.success(response);
}
Optional<TaskRespVO> first = list.stream().filter(item -> item.getStatus() == 0 || item.getStatus() == 2).findFirst();
if (first.isPresent()) {
response.setStatus(1);
response.setScenicId(first.get().getScenicId());
response.setFaceId(first.get().getFaceId());
return ApiResponse.success(response);
} else {
response.setStatus(2);
response.setScenicId(list.get(0).getScenicId());
response.setFaceId(list.get(0).getFaceId());
long nullTask = taskList.stream().filter(Objects::isNull).count();
if (nullTask > 0) {
response.setStatus(0);
return ApiResponse.success(response);
}
Optional<TaskEntity> taskEntity = taskList.stream().filter(task -> 1 == task.getStatus()).findFirst();
if (taskEntity.isPresent()) {
response.setTemplateId(taskEntity.get().getTemplateId());
VideoEntity video = videoMapper.findByTaskId(taskEntity.get().getId());
response.setVideoId(video.getId());
response.setStatus(1);
} else {
response.setStatus(2);
}
return ApiResponse.success(response);
}
@Override
@ -246,48 +258,52 @@ public class GoodsServiceImpl implements GoodsService {
}
@Override
public ApiResponse<Integer> getTemplateTaskStatus(Long userId, Long templateId) {
TaskReqQuery taskReqQuery = new TaskReqQuery();
taskReqQuery.setMemberId(userId);
taskReqQuery.setTemplateId(templateId);
int allCount=taskMapper.countTask(taskReqQuery);
if(allCount==0){//没有任务
return ApiResponse.success(0);
public ApiResponse<VideoTaskStatusVO> getTemplateTaskStatus(Long userId, Long faceId, Long templateId) {
List<TaskEntity> taskList = videoMapper.listTaskByFaceTemplateRelation(userId, faceId, templateId);
VideoTaskStatusVO response = new VideoTaskStatusVO();
response.setFaceId(faceId);
if (taskList.isEmpty()) {
response.setStatus(0);
return ApiResponse.success(response);
}
taskReqQuery.setStatus(2);
int count=taskMapper.countTask(taskReqQuery);
if(count>0){
return ApiResponse.success(1);
}else {
return ApiResponse.success(2);
Optional<TaskEntity> taskEntity = taskList.stream().filter(task -> task.getStatus() == 1).findFirst();
if (taskEntity.isPresent()) {
response.setTemplateId(taskEntity.get().getTemplateId());
VideoEntity video = videoMapper.findByTaskId(taskEntity.get().getId());
response.setVideoId(video.getId());
response.setStatus(1);
} else {
response.setStatus(2);
}
return ApiResponse.success(response);
}
@Override
public ApiResponse<VideoTaskStatusVO> getTaskStatusByScenicId(Long userId, Long scenicId) {
TaskReqQuery taskReqQuery = new TaskReqQuery();
taskReqQuery.setMemberId(userId);
taskReqQuery.setScenicId(scenicId);
int allCount=taskMapper.countTask(taskReqQuery);
FaceRespVO faceVO = faceMapper.getByMemberId(userId, scenicId);
VideoTaskStatusVO response = new VideoTaskStatusVO();
if(allCount==0){//没有任务
response.setScenicId(scenicId);
if (faceVO == null) {
// 从来没露脸
response.setStatus(-2);
return ApiResponse.success(response);
}
response.setFaceId(faceVO.getId());
List<TaskEntity> taskList = videoMapper.listTaskByScenicRelation(userId, scenicId);
if (taskList.isEmpty()) {
response.setStatus(0);
return ApiResponse.success(response);
}
List<TaskRespVO> list=taskMapper.list(taskReqQuery);
// 未完成是等于0或2
Optional<TaskRespVO> first = list.stream().filter(item -> item.getStatus() == 0 || item.getStatus() == 2).findFirst();
if (first.isPresent()) {
Optional<TaskEntity> taskEntity = taskList.stream().filter(task -> task.getStatus() == 1).findFirst();
if (taskEntity.isPresent()) {
response.setTemplateId(taskEntity.get().getTemplateId());
VideoEntity video = videoMapper.findByTaskId(taskEntity.get().getId());
response.setVideoId(video.getId());
response.setStatus(1);
response.setScenicId(first.get().getScenicId());
response.setFaceId(first.get().getFaceId());
return ApiResponse.success(response);
} else {
response.setStatus(2);
response.setScenicId(list.get(0).getScenicId());
response.setFaceId(list.get(0).getFaceId());
return ApiResponse.success(response);
}
return ApiResponse.success(response);
}
}

View File

@ -212,7 +212,7 @@ public class WxPayServiceImpl implements WxPayService {
List<OrderItemEntity> orderItemList = orderMapper.listOrderItemByOrderId(orderId);
orderItemList.forEach(orderItemVO -> {
switch (orderItemVO.getGoodsType()) {
case 1: // 成片
case 0: // 成片
MemberVideoEntity memberVideoEntity = new MemberVideoEntity();
memberVideoEntity.setMemberId(byId.getMemberId());
memberVideoEntity.setVideoId(orderItemVO.getGoodsId());
@ -220,6 +220,7 @@ public class WxPayServiceImpl implements WxPayService {
memberVideoEntity.setOrderId(orderId);
videoMapper.updateRelation(memberVideoEntity);
break;
case 1: // 源视频
case 2: // 源素材
MemberSourceEntity memberSourceEntity = new MemberSourceEntity();
memberSourceEntity.setMemberId(byId.getMemberId());
@ -252,12 +253,13 @@ public class WxPayServiceImpl implements WxPayService {
StatisticsRecordAddReq statisticsRecordAddReq = new StatisticsRecordAddReq();
statisticsRecordAddReq.setMemberId(orderData.getMemberId());
// TODO
//如果订单在商品创建后30分钟内支付则为现场支付否则为事后支付
if(DateUtils.addDateMinute(createTime,30).compareTo(payAt)>0){//
// if(DateUtils.addDateMinute(createTime,30).compareTo(payAt)>0){//
statisticsRecordAddReq.setType(StatisticEnum.ON_SITE_PAYMENT.code);
}else {
statisticsRecordAddReq.setType(StatisticEnum.POST_PAYMENT.code);
}
// }else {
// statisticsRecordAddReq.setType(StatisticEnum.POST_PAYMENT.code);
// }
statisticsRecordAddReq.setScenicId(orderData.getScenicId());
statisticsRecordAddReq.setMorphId(orderId);
statisticsMapper.addStatisticsRecord(statisticsRecordAddReq);

View File

@ -187,11 +187,9 @@ public class FaceServiceImpl implements FaceService {
//新增人脸
faceEntity.setId(newFaceId);
faceMapper.add(faceEntity);
taskTaskService.autoCreateTaskByFaceId(faceEntity.getId());
} else {
//2更新人脸
faceMapper.update(faceEntity);
taskTaskService.autoCreateTaskByFaceId(faceEntity.getId());
}
List<MemberSourceEntity> memberSourceEntityList = sourceEntities.stream().map(sourceEntity -> {
MemberSourceEntity memberSourceEntity = new MemberSourceEntity();
@ -213,6 +211,7 @@ public class FaceServiceImpl implements FaceService {
task.createTime = sampleRespVO.getCreateAt();
VideoPieceGetter.addTask(task);
}
taskTaskService.autoCreateTaskByFaceId(faceEntity.getId());
StatisticsRecordAddReq statisticsRecordAddReq = new StatisticsRecordAddReq();
statisticsRecordAddReq.setMemberId(userId);
statisticsRecordAddReq.setType(StatisticEnum.UPLOAD_FACE.code);

View File

@ -20,6 +20,7 @@ import com.ycwl.basic.model.pc.task.resp.TaskRespVO;
import com.ycwl.basic.model.pc.template.entity.TemplateConfigEntity;
import com.ycwl.basic.model.pc.template.entity.TemplateEntity;
import com.ycwl.basic.model.pc.template.resp.TemplateRespVO;
import com.ycwl.basic.model.pc.video.entity.MemberVideoEntity;
import com.ycwl.basic.model.pc.video.entity.VideoEntity;
import com.ycwl.basic.model.task.req.ClientStatusReqVo;
import com.ycwl.basic.model.task.req.TaskReqVo;
@ -43,7 +44,6 @@ import java.util.Date;
import java.util.List;
import java.util.Map;
import java.util.Objects;
import java.util.Optional;
import java.util.concurrent.TimeUnit;
import java.util.stream.Collectors;
@ -190,8 +190,8 @@ public class TaskTaskServiceImpl implements TaskService {
}
@Override
public void autoCreateTaskByFaceId(Long id) {
FaceRespVO faceRespVO = faceMapper.getById(id);
public void autoCreateTaskByFaceId(Long faceId) {
FaceRespVO faceRespVO = faceMapper.getById(faceId);
if (faceRespVO == null) {
return;
}
@ -206,19 +206,19 @@ public class TaskTaskServiceImpl implements TaskService {
if (templateList == null || templateList.isEmpty()) {
return;
}
TaskEntity faceAutomaticTask = taskMapper.getFaceAutomaticTask(id);
TaskEntity faceAutomaticTask = taskMapper.getFaceAutomaticTask(faceId);
if (faceAutomaticTask != null) {
return;
}
autoCreateTaskByFaceIdAndTempalteId(id, templateList.get(0).getId(), 1);
createTaskByFaceIdAndTempalteId(faceId, templateList.get(0).getId(), 1);
}
@Override
public void autoCreateTaskByFaceIdAndTempalteId(Long faceId, Long templateId) {
autoCreateTaskByFaceIdAndTempalteId(faceId, templateId, 0);
public void createTaskByFaceIdAndTempalteId(Long faceId, Long templateId) {
createTaskByFaceIdAndTempalteId(faceId, templateId, 0);
}
@Override
public void autoCreateTaskByFaceIdAndTempalteId(Long faceId, Long templateId, int automatic) {
public void createTaskByFaceIdAndTempalteId(Long faceId, Long templateId, int automatic) {
FaceRespVO faceRespVO = faceMapper.getById(faceId);
List<FaceSampleRespVO> faceSampleList = faceSampleMapper.listByIds(Arrays.stream(faceRespVO.getMatchSampleIds().split(",")).map(Long::valueOf).collect(Collectors.toList()));
if (faceSampleList.isEmpty()) {
@ -237,45 +237,56 @@ public class TaskTaskServiceImpl implements TaskService {
return;
}
}
Thread taskThread = new Thread(() -> {
List<SourceEntity> vSourceList = sourceMapper.listVideoBySampleIds(faceSampleList.stream().map(FaceSampleRespVO::getId).collect(Collectors.toList()));
List<VideoPieceGetter.Task> tasks = faceSampleList.stream().map(sample -> {
Optional<SourceEntity> optional = vSourceList.stream().filter(video -> video.getFaceSampleId().equals(sample.getId())).findFirst();
if (optional.isPresent()) {
return null;
}
VideoPieceGetter.Task task = new VideoPieceGetter.Task();
task.setFaceSampleId(sample.getId());
task.setMemberId(faceRespVO.getMemberId());
task.setCreateTime(sample.getCreateAt());
return task;
}).filter(Objects::nonNull).collect(Collectors.toList());
faceSampleList.stream().map(sample -> {
VideoPieceGetter.Task task = new VideoPieceGetter.Task();
task.setType("callback");
task.setCallback(() -> {
List<SourceEntity> videoSourceList = sourceMapper.listVideoBySampleIds(faceSampleList.stream().map(FaceSampleRespVO::getId).collect(Collectors.toList()));
Map<String, List<SourceEntity>> sourcesMap = videoSourceList.stream()
.peek(item -> item.setUrl(item.getVideoUrl()))
.collect(Collectors.groupingBy(item -> item.getDeviceId().toString()));
task.setFaceSampleId(sample.getId());
task.setMemberId(faceRespVO.getMemberId());
task.setCreateTime(sample.getCreateAt());
return task;
}).forEach(VideoPieceGetter::addTask);
VideoPieceGetter.Task task = new VideoPieceGetter.Task();
task.type = "callback";
task.callback = () -> {
List<SourceEntity> videoSourceList = sourceMapper.listVideoByFaceRelation(faceId);
Map<String, List<SourceEntity>> sourcesMap = videoSourceList.stream()
.peek(item -> item.setUrl(item.getVideoUrl()))
.collect(Collectors.groupingBy(item -> item.getDeviceId().toString()));
TaskReqQuery taskReqQuery = new TaskReqQuery();
taskReqQuery.setFaceId(faceId);
taskReqQuery.setTemplateId(templateId);
taskReqQuery.setTaskParams(JSON.toJSONString(sourcesMap));
List<TaskRespVO> list = taskMapper.list(taskReqQuery);
MemberVideoEntity memberVideoEntity = new MemberVideoEntity();
memberVideoEntity.setMemberId(faceRespVO.getMemberId());
memberVideoEntity.setScenicId(faceRespVO.getScenicId());
memberVideoEntity.setFaceId(faceId);
memberVideoEntity.setTemplateId(templateId);
memberVideoEntity.setIsBuy(0);
if (list.isEmpty()) {
TaskEntity taskEntity = new TaskEntity();
taskEntity.setId(SnowFlakeUtil.getLongId());
taskEntity.setScenicId(faceRespVO.getScenicId());
taskEntity.setFaceId(faceId);
taskEntity.setMemberId(faceRespVO.getMemberId());
taskEntity.setTemplateId(templateId);
taskEntity.setTaskParams(JSON.toJSONString(sourcesMap));
taskEntity.setStatus(0);
taskEntity.setAutomatic(automatic);
taskEntity.setTaskParams(JSON.toJSONString(sourcesMap));
taskMapper.add(taskEntity);
});
if (!tasks.isEmpty()) {
tasks.forEach(VideoPieceGetter::addTask);
VideoPieceGetter.addTask(task);
} else {
task.getCallback().onInvoke();
memberVideoEntity.setTaskId(taskEntity.getId());
} else{
memberVideoEntity.setTaskId(list.get(0).getId());
VideoEntity video = videoMapper.findByTaskId(list.get(0).getId());
if (video != null) {
memberVideoEntity.setVideoId(video.getId());
}
}
});
taskThread.start();
videoMapper.addRelation(memberVideoEntity);
};
VideoPieceGetter.addTask(task);
}
@Override
@ -297,6 +308,7 @@ public class TaskTaskServiceImpl implements TaskService {
if (video != null) {
video.setVideoUrl(task.getVideoUrl());
videoMapper.update(video);
videoMapper.updateRelationWhenTaskSuccess(taskId, video.getId());
} else {
video = new VideoEntity();
video.setId(SnowFlakeUtil.getLongId());
@ -308,6 +320,7 @@ public class TaskTaskServiceImpl implements TaskService {
video.setVideoUrl(task.getVideoUrl());
video.setCreateTime(new Date());
videoMapper.add(video);
videoMapper.updateRelationWhenTaskSuccess(taskId, video.getId());
}
}

View File

@ -0,0 +1,31 @@
package com.ycwl.basic.service.impl.task;
import com.alibaba.fastjson.JSON;
import com.ycwl.basic.mapper.TemplateMapper;
import com.ycwl.basic.model.pc.template.entity.TemplateConfigEntity;
import com.ycwl.basic.service.task.TaskTemplateService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.data.redis.core.RedisTemplate;
import org.springframework.stereotype.Service;
@Service
public class TaskTemplateServiceImpl implements TaskTemplateService {
@Autowired
private RedisTemplate<String, String> redisTemplate;
@Autowired
private TemplateMapper templateMapper;
private static final String TEMPLATE_KEY = "template:";
private static final String TEMPLATE_CONFIG_KEY = "template:config:";
private TemplateConfigEntity getTemplateConfig(Long templateId) {
if (redisTemplate.hasKey(TEMPLATE_CONFIG_KEY + templateId)) {
return JSON.parseObject(redisTemplate.opsForValue().get(TEMPLATE_CONFIG_KEY + templateId), TemplateConfigEntity.class);
}
TemplateConfigEntity config = templateMapper.getConfig(templateId);
if (config != null) {
redisTemplate.opsForValue().set(TEMPLATE_CONFIG_KEY + templateId, JSON.toJSONString(config));
}
return config;
}
}

View File

@ -34,11 +34,11 @@ public interface GoodsService {
ApiResponse<BigDecimal> queryPrice(GoodsPriceQueryReq queryPriceData);
/**
*
* @param goodsId 商品vlogid
* @param userId 商品vlogid
* @param videoId
* @return
*/
ApiResponse<VideoGoodsDetailVO> videoGoodsDetail(Long goodsId);
ApiResponse<VideoGoodsDetailVO> videoGoodsDetail(Long userId, Long videoId);
/**
* 查询当前用户的成片合成任务状态
@ -48,7 +48,7 @@ public interface GoodsService {
ApiResponse<VideoTaskStatusVO> getTaskStatusByFaceId(Long userId ,Long faceId);
ApiResponse<VideoTaskStatusVO> getAllTaskStatus(Long userId);
ApiResponse<Integer> getTemplateTaskStatus(Long userId, Long templateId);
ApiResponse<VideoTaskStatusVO> getTemplateTaskStatus(Long userId, Long faceId, Long templateId);
ApiResponse<VideoTaskStatusVO> getTaskStatusByScenicId(Long userId, Long scenicId);
}

View File

@ -11,9 +11,9 @@ public interface TaskService {
TemplateRespVO workerGetTemplate(Long templateId, WorkerAuthReqVo req);
void autoCreateTaskByFaceIdAndTempalteId(Long faceId, Long templateId);
void createTaskByFaceIdAndTempalteId(Long faceId, Long templateId);
void autoCreateTaskByFaceIdAndTempalteId(Long faceId, Long templateId, int automatic);
void createTaskByFaceIdAndTempalteId(Long faceId, Long templateId, int automatic);
void taskSuccess(Long taskId, WorkerAuthReqVo req);

View File

@ -0,0 +1,4 @@
package com.ycwl.basic.service.task;
public interface TaskTemplateService {
}

View File

@ -52,7 +52,7 @@ public class DynamicTaskGenerator {
for (ScenicRespVO scenic : scenicList) {
log.info("定时任务执行,当前景区:{}", scenic.getName());
ScenicConfigEntity scenicConfig = scenicMapper.getConfig(scenic.getId());
if (scenicConfig == null || scenicConfig.getBookRoutine() == 2) {
if (scenicConfig == null || 2 == scenicConfig.getBookRoutine()) {
log.info("当前景区{},未启用提前预约流程", scenic.getName());
continue;
}

View File

@ -156,6 +156,8 @@ public class VideoPieceGetter {
videoSource.setMemberId(task.getMemberId());
videoSource.setType(1);
videoSource.setIsBuy(0);
videoSource.setFaceId(task.getFaceId());
videoSource.setScenicId(faceSample.getScenicId());
videoSource.setSourceId(sourceEntity.getId());
if (imgSource != null) {
sourceEntity.setUrl(imgSource.getUrl());

View File

@ -74,6 +74,8 @@
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
limit 1
</select>
<select id="listByScenicIdAndNotFinished" resultType="com.ycwl.basic.model.pc.face.resp.FaceRespVO">
select id, scenic_id, member_id, face_url,score, match_sample_ids, first_match_rate, match_result, create_at, update_at

View File

@ -118,7 +118,7 @@
where
ms.member_id = #{memberId}
<if test="scenicId!= null">and ms.scenic_id = #{scenicId} </if>
<if test="isBuy!=null">and ms.is_buy = #{isBuy}</if>
<if test="isBuy!=null">and ms.is_buy = #{isBuy} </if>
<if test="type!=null">and ms.type = #{type} </if>
<if test="faceId!=null">and ms.face_id = #{faceId} </if>
order by so.create_time desc
@ -145,4 +145,12 @@
from member_source
where member_id = #{memberId} and source_id = #{sourceId} and type = #{type}
</select>
<select id="listVideoByFaceRelation" resultType="com.ycwl.basic.model.pc.source.entity.SourceEntity">
select *
from source
where source.id in (
select source_id from member_source where face_id = #{faceId} and type = 1
)
order by create_time desc
</select>
</mapper>

View File

@ -6,14 +6,14 @@
values (#{id}, #{scenicId}, #{memberId}, #{templateId}, #{taskId}, #{workerId}, #{videoUrl})
</insert>
<insert id="addRelation">
replace member_video(member_id, task_id, video_id, is_buy, order_id)
values (#{memberId}, #{taskId}, #{videoId}, #{isBuy}, #{orderId})
replace member_video(member_id, scenic_id, face_id, template_id, task_id, video_id, is_buy, order_id)
values (#{memberId}, #{scenicId}, #{faceId}, #{templateId}, #{taskId}, #{videoId}, #{isBuy}, #{orderId})
</insert>
<insert id="addRelations">
replace member_video(member_id, task_id, video_id, is_buy, order_id)
replace member_video(member_id, scenic_id, face_id, template_id, task_id, video_id, is_buy, order_id)
values
<foreach collection="list" item="item" separator=",">
(#{item.memberId}, #{item.taskId}, #{item.videoId}, #{item.isBuy}, #{orderId})
(#{item.memberId}, #{item.scenicId}, #{item.faceId}, #{item.templateId}, #{item.taskId}, #{item.videoId}, #{item.isBuy}, #{orderId})
</foreach>
</insert>
<update id="update">
@ -37,6 +37,11 @@
</set>
where member_id = #{memberId} and video_id = #{videoId}
</update>
<update id="updateRelationWhenTaskSuccess">
update member_video
set video_id = #{videoId}
where task_id = #{taskId}
</update>
<delete id="deleteById">
delete from video where id = #{id}
</delete>
@ -69,7 +74,7 @@
</select>
<select id="getById" resultType="com.ycwl.basic.model.pc.video.resp.VideoRespVO">
select v.id, v.scenic_id, member_id, template_id, task_id, worker_id, video_url, v.create_time, v.update_time,
t.name templateName,t.price templatePrice,v.is_buy isBuy, t.cover_url templateCoverUrl, t.slash_price slashPrice,
t.name templateName,t.price templatePrice, t.cover_url templateCoverUrl, t.slash_price slashPrice,
s.name scenicName
from video v
left join scenic s on v.scenic_id = s.id
@ -85,11 +90,11 @@
from member_video mv
left join video v on mv.video_id = v.id
left join scenic s on s.id = v.scenic_id
left join template t on v.template_id = t.id
left join template t on mv.template_id = t.id
<where>
<if test="scenicId!= null">and mv.scenic_id = #{scenicId} </if>
<if test="memberId!= null">and mv.member_id = #{memberId} </if>
<if test="templateId!= null">and template_id = #{templateId} </if>
<if test="templateId!= null">and mv.template_id = #{templateId} </if>
<if test="taskId!=null">and mv.task_id = #{taskId} </if>
<if test="isBuy!=null">and mv.is_buy = #{isBuy}</if>
<if test="startTime!= null">and v.create_time &gt;= #{startTime} </if>
@ -105,4 +110,28 @@
<select id="userFaceTemplateVideo" resultType="com.ycwl.basic.model.pc.video.entity.MemberVideoEntity">
select * from member_video where member_id = #{userId} and face_id = #{faceId} and template_id = #{templateId} order by id desc
</select>
<select id="listTaskByFaceRelation" resultType="com.ycwl.basic.model.pc.task.entity.TaskEntity">
select t.*
from member_video mv
left join task t on mv.task_id = t.id
where mv.member_id = #{userId} and mv.face_id = #{faceId}
</select>
<select id="listTaskByFaceTemplateRelation" resultType="com.ycwl.basic.model.pc.task.entity.TaskEntity">
select t.*
from member_video mv
left join task t on mv.task_id = t.id
where mv.member_id = #{userId} and mv.face_id = #{faceId} and mv.template_id = #{templateId}
</select>
<select id="listTaskByScenicRelation" resultType="com.ycwl.basic.model.pc.task.entity.TaskEntity">
select t.*
from member_video mv
left join task t on mv.task_id = t.id
where mv.member_id = #{userId} and t.scenic_id = #{scenicId}
</select>
<select id="queryUserVideo" resultType="com.ycwl.basic.model.pc.video.entity.MemberVideoEntity">
select *
from member_video
where member_id = #{userId} and video_id = #{videoId}
limit 1
</select>
</mapper>