From 495210c6b13c6fe43fb6433874b78f1023095615 Mon Sep 17 00:00:00 2001
From: Jerry Yan <792602257@qq.com>
Date: Thu, 2 Jan 2025 10:45:07 +0800
Subject: [PATCH] bug

---
 .../com/ycwl/basic/constant/TaskConstant.java |   1 +
 .../controller/mobile/AppGoodsController.java |  16 +-
 .../controller/task/TaskTaskController.java   |   6 -
 .../com/ycwl/basic/mapper/SourceMapper.java   |   2 +
 .../com/ycwl/basic/mapper/VideoMapper.java    |  11 ++
 .../model/mobile/goods/VideoTaskStatusVO.java |   2 +
 .../pc/video/entity/MemberVideoEntity.java    |   3 +
 .../model/pc/video/resp/VideoRespVO.java      |   2 -
 .../impl/mobile/AppScenicServiceImpl.java     |   7 +-
 .../service/impl/mobile/GoodsServiceImpl.java | 144 ++++++++++--------
 .../service/impl/mobile/WxPayServiceImpl.java |  12 +-
 .../service/impl/pc/FaceServiceImpl.java      |   3 +-
 .../impl/task/TaskTaskServiceImpl.java        |  85 ++++++-----
 .../impl/task/TaskTemplateServiceImpl.java    |  31 ++++
 .../basic/service/mobile/GoodsService.java    |   8 +-
 .../ycwl/basic/service/task/TaskService.java  |   4 +-
 .../service/task/TaskTemplateService.java     |   4 +
 .../ycwl/basic/task/DynamicTaskGenerator.java |   2 +-
 .../com/ycwl/basic/task/VideoPieceGetter.java |   2 +
 src/main/resources/mapper/FaceMapper.xml      |   2 +
 src/main/resources/mapper/SourceMapper.xml    |  10 +-
 src/main/resources/mapper/VideoMapper.xml     |  43 +++++-
 22 files changed, 261 insertions(+), 139 deletions(-)
 create mode 100644 src/main/java/com/ycwl/basic/service/impl/task/TaskTemplateServiceImpl.java
 create mode 100644 src/main/java/com/ycwl/basic/service/task/TaskTemplateService.java

diff --git a/src/main/java/com/ycwl/basic/constant/TaskConstant.java b/src/main/java/com/ycwl/basic/constant/TaskConstant.java
index 15ff9a0..8ae316a 100644
--- a/src/main/java/com/ycwl/basic/constant/TaskConstant.java
+++ b/src/main/java/com/ycwl/basic/constant/TaskConstant.java
@@ -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";
 }
diff --git a/src/main/java/com/ycwl/basic/controller/mobile/AppGoodsController.java b/src/main/java/com/ycwl/basic/controller/mobile/AppGoodsController.java
index 4d985ca..4599a1e 100644
--- a/src/main/java/com/ycwl/basic/controller/mobile/AppGoodsController.java
+++ b/src/main/java/com/ycwl/basic/controller/mobile/AppGoodsController.java
@@ -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("成功");
     }
 }
diff --git a/src/main/java/com/ycwl/basic/controller/task/TaskTaskController.java b/src/main/java/com/ycwl/basic/controller/task/TaskTaskController.java
index a39308f..177ea1b 100644
--- a/src/main/java/com/ycwl/basic/controller/task/TaskTaskController.java
+++ b/src/main/java/com/ycwl/basic/controller/task/TaskTaskController.java
@@ -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");
-    }
 }
diff --git a/src/main/java/com/ycwl/basic/mapper/SourceMapper.java b/src/main/java/com/ycwl/basic/mapper/SourceMapper.java
index 4c903f1..ebd3673 100644
--- a/src/main/java/com/ycwl/basic/mapper/SourceMapper.java
+++ b/src/main/java/com/ycwl/basic/mapper/SourceMapper.java
@@ -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);
 }
diff --git a/src/main/java/com/ycwl/basic/mapper/VideoMapper.java b/src/main/java/com/ycwl/basic/mapper/VideoMapper.java
index 487343f..e4fd5a4 100644
--- a/src/main/java/com/ycwl/basic/mapper/VideoMapper.java
+++ b/src/main/java/com/ycwl/basic/mapper/VideoMapper.java
@@ -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);
 }
diff --git a/src/main/java/com/ycwl/basic/model/mobile/goods/VideoTaskStatusVO.java b/src/main/java/com/ycwl/basic/model/mobile/goods/VideoTaskStatusVO.java
index 3ea303d..293024a 100644
--- a/src/main/java/com/ycwl/basic/model/mobile/goods/VideoTaskStatusVO.java
+++ b/src/main/java/com/ycwl/basic/model/mobile/goods/VideoTaskStatusVO.java
@@ -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;
 }
diff --git a/src/main/java/com/ycwl/basic/model/pc/video/entity/MemberVideoEntity.java b/src/main/java/com/ycwl/basic/model/pc/video/entity/MemberVideoEntity.java
index c2d5866..b13dbdd 100644
--- a/src/main/java/com/ycwl/basic/model/pc/video/entity/MemberVideoEntity.java
+++ b/src/main/java/com/ycwl/basic/model/pc/video/entity/MemberVideoEntity.java
@@ -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;
diff --git a/src/main/java/com/ycwl/basic/model/pc/video/resp/VideoRespVO.java b/src/main/java/com/ycwl/basic/model/pc/video/resp/VideoRespVO.java
index e210065..c267189 100644
--- a/src/main/java/com/ycwl/basic/model/pc/video/resp/VideoRespVO.java
+++ b/src/main/java/com/ycwl/basic/model/pc/video/resp/VideoRespVO.java
@@ -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")
diff --git a/src/main/java/com/ycwl/basic/service/impl/mobile/AppScenicServiceImpl.java b/src/main/java/com/ycwl/basic/service/impl/mobile/AppScenicServiceImpl.java
index 31d753a..4ca5bd1 100644
--- a/src/main/java/com/ycwl/basic/service/impl/mobile/AppScenicServiceImpl.java
+++ b/src/main/java/com/ycwl/basic/service/impl/mobile/AppScenicServiceImpl.java
@@ -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);
             }
         });
 
diff --git a/src/main/java/com/ycwl/basic/service/impl/mobile/GoodsServiceImpl.java b/src/main/java/com/ycwl/basic/service/impl/mobile/GoodsServiceImpl.java
index 6af314d..23cbbd0 100644
--- a/src/main/java/com/ycwl/basic/service/impl/mobile/GoodsServiceImpl.java
+++ b/src/main/java/com/ycwl/basic/service/impl/mobile/GoodsServiceImpl.java
@@ -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);
     }
 
 }
diff --git a/src/main/java/com/ycwl/basic/service/impl/mobile/WxPayServiceImpl.java b/src/main/java/com/ycwl/basic/service/impl/mobile/WxPayServiceImpl.java
index 987bc4b..9901877 100644
--- a/src/main/java/com/ycwl/basic/service/impl/mobile/WxPayServiceImpl.java
+++ b/src/main/java/com/ycwl/basic/service/impl/mobile/WxPayServiceImpl.java
@@ -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);
diff --git a/src/main/java/com/ycwl/basic/service/impl/pc/FaceServiceImpl.java b/src/main/java/com/ycwl/basic/service/impl/pc/FaceServiceImpl.java
index 4f9331e..012ccc9 100644
--- a/src/main/java/com/ycwl/basic/service/impl/pc/FaceServiceImpl.java
+++ b/src/main/java/com/ycwl/basic/service/impl/pc/FaceServiceImpl.java
@@ -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);
diff --git a/src/main/java/com/ycwl/basic/service/impl/task/TaskTaskServiceImpl.java b/src/main/java/com/ycwl/basic/service/impl/task/TaskTaskServiceImpl.java
index 63bb7aa..48b1f72 100644
--- a/src/main/java/com/ycwl/basic/service/impl/task/TaskTaskServiceImpl.java
+++ b/src/main/java/com/ycwl/basic/service/impl/task/TaskTaskServiceImpl.java
@@ -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());
         }
     }
 
diff --git a/src/main/java/com/ycwl/basic/service/impl/task/TaskTemplateServiceImpl.java b/src/main/java/com/ycwl/basic/service/impl/task/TaskTemplateServiceImpl.java
new file mode 100644
index 0000000..eb3d334
--- /dev/null
+++ b/src/main/java/com/ycwl/basic/service/impl/task/TaskTemplateServiceImpl.java
@@ -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;
+    }
+}
diff --git a/src/main/java/com/ycwl/basic/service/mobile/GoodsService.java b/src/main/java/com/ycwl/basic/service/mobile/GoodsService.java
index d49b93e..c065408 100644
--- a/src/main/java/com/ycwl/basic/service/mobile/GoodsService.java
+++ b/src/main/java/com/ycwl/basic/service/mobile/GoodsService.java
@@ -34,11 +34,11 @@ public interface GoodsService {
     ApiResponse<BigDecimal> queryPrice(GoodsPriceQueryReq queryPriceData);
 
     /**
-     *
-     * @param goodsId 商品(vlog)id
+     * @param userId  商品(vlog)id
+     * @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);
 }
diff --git a/src/main/java/com/ycwl/basic/service/task/TaskService.java b/src/main/java/com/ycwl/basic/service/task/TaskService.java
index da07160..b07c234 100644
--- a/src/main/java/com/ycwl/basic/service/task/TaskService.java
+++ b/src/main/java/com/ycwl/basic/service/task/TaskService.java
@@ -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);
 
diff --git a/src/main/java/com/ycwl/basic/service/task/TaskTemplateService.java b/src/main/java/com/ycwl/basic/service/task/TaskTemplateService.java
new file mode 100644
index 0000000..a5ad1e4
--- /dev/null
+++ b/src/main/java/com/ycwl/basic/service/task/TaskTemplateService.java
@@ -0,0 +1,4 @@
+package com.ycwl.basic.service.task;
+
+public interface TaskTemplateService {
+}
diff --git a/src/main/java/com/ycwl/basic/task/DynamicTaskGenerator.java b/src/main/java/com/ycwl/basic/task/DynamicTaskGenerator.java
index 20ad866..9ee469f 100644
--- a/src/main/java/com/ycwl/basic/task/DynamicTaskGenerator.java
+++ b/src/main/java/com/ycwl/basic/task/DynamicTaskGenerator.java
@@ -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;
             }
diff --git a/src/main/java/com/ycwl/basic/task/VideoPieceGetter.java b/src/main/java/com/ycwl/basic/task/VideoPieceGetter.java
index cf21c6a..931b7dd 100644
--- a/src/main/java/com/ycwl/basic/task/VideoPieceGetter.java
+++ b/src/main/java/com/ycwl/basic/task/VideoPieceGetter.java
@@ -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());
diff --git a/src/main/resources/mapper/FaceMapper.xml b/src/main/resources/mapper/FaceMapper.xml
index b6b447a..92a9acd 100644
--- a/src/main/resources/mapper/FaceMapper.xml
+++ b/src/main/resources/mapper/FaceMapper.xml
@@ -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
diff --git a/src/main/resources/mapper/SourceMapper.xml b/src/main/resources/mapper/SourceMapper.xml
index f7cdbd6..6ab3cad 100644
--- a/src/main/resources/mapper/SourceMapper.xml
+++ b/src/main/resources/mapper/SourceMapper.xml
@@ -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>
diff --git a/src/main/resources/mapper/VideoMapper.xml b/src/main/resources/mapper/VideoMapper.xml
index 115d53c..abbf398 100644
--- a/src/main/resources/mapper/VideoMapper.xml
+++ b/src/main/resources/mapper/VideoMapper.xml
@@ -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>
\ No newline at end of file