From 0d2c92e8e1325294ca3581c928b8eb7eaa7ef946 Mon Sep 17 00:00:00 2001
From: Jerry Yan <792602257@qq.com>
Date: Sat, 11 Jan 2025 16:13:19 +0800
Subject: [PATCH] =?UTF-8?q?=E4=BC=98=E5=8C=96=E6=98=AF=E5=90=A6=E8=83=BD?=
 =?UTF-8?q?=E7=94=9F=E6=88=90=E5=88=A4=E6=96=AD=E9=80=BB=E8=BE=91?=
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit

---
 .../java/com/ycwl/basic/biz/TemplateBiz.java  | 42 +++++++++++++++++++
 .../basic/controller/wvp/WvpController.java   | 21 ++++++++++
 .../basic/interceptor/AuthInterceptor.java    |  3 +-
 .../com/ycwl/basic/mapper/FaceMapper.java     |  1 +
 .../ycwl/basic/mapper/FaceSampleMapper.java   |  2 +-
 .../ycwl/basic/repository/FaceRepository.java | 20 +++++++++
 .../basic/repository/TemplateRepository.java  | 33 +++------------
 .../impl/mobile/AppScenicServiceImpl.java     |  5 ++-
 .../service/impl/mobile/GoodsServiceImpl.java |  6 ++-
 .../impl}/TaskFaceServiceImpl.java            |  2 +-
 .../impl}/TaskTaskServiceImpl.java            | 16 ++++---
 .../impl}/TaskTemplateServiceImpl.java        |  2 +-
 .../ycwl/basic/service/wvp/WvpService.java    |  4 ++
 .../service/wvp/impl/WvpServiceImpl.java      | 18 ++++++++
 .../ycwl/basic/task/DynamicTaskGenerator.java | 42 ++++---------------
 src/main/resources/mapper/FaceMapper.xml      |  5 +++
 .../resources/mapper/FaceSampleMapper.xml     |  4 +-
 src/main/resources/mapper/SourceMapper.xml    |  1 +
 18 files changed, 150 insertions(+), 77 deletions(-)
 create mode 100644 src/main/java/com/ycwl/basic/biz/TemplateBiz.java
 create mode 100644 src/main/java/com/ycwl/basic/controller/wvp/WvpController.java
 rename src/main/java/com/ycwl/basic/service/{impl/task => task/impl}/TaskFaceServiceImpl.java (99%)
 rename src/main/java/com/ycwl/basic/service/{impl/task => task/impl}/TaskTaskServiceImpl.java (97%)
 rename src/main/java/com/ycwl/basic/service/{impl/task => task/impl}/TaskTemplateServiceImpl.java (96%)
 create mode 100644 src/main/java/com/ycwl/basic/service/wvp/WvpService.java
 create mode 100644 src/main/java/com/ycwl/basic/service/wvp/impl/WvpServiceImpl.java

diff --git a/src/main/java/com/ycwl/basic/biz/TemplateBiz.java b/src/main/java/com/ycwl/basic/biz/TemplateBiz.java
new file mode 100644
index 0000000..4a3740f
--- /dev/null
+++ b/src/main/java/com/ycwl/basic/biz/TemplateBiz.java
@@ -0,0 +1,42 @@
+package com.ycwl.basic.biz;
+
+import com.ycwl.basic.model.pc.face.resp.FaceRespVO;
+import com.ycwl.basic.model.pc.faceSample.entity.FaceSampleEntity;
+import com.ycwl.basic.model.pc.faceSample.resp.FaceSampleRespVO;
+import com.ycwl.basic.model.pc.template.entity.TemplateConfigEntity;
+import com.ycwl.basic.repository.FaceRepository;
+import com.ycwl.basic.repository.TemplateRepository;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.stereotype.Component;
+
+import java.util.Arrays;
+import java.util.List;
+import java.util.concurrent.atomic.AtomicInteger;
+import java.util.stream.Collectors;
+
+@Component
+public class TemplateBiz {
+    @Autowired
+    private TemplateRepository templateRepository;
+    @Autowired
+    private FaceRepository faceRepository;
+
+
+    public boolean determineTemplateCanGenerate(Long templateId, Long faceId) {
+        List<String> placeholderList = templateRepository.getTemplatePlaceholder(templateId);
+        TemplateConfigEntity templateConfig = templateRepository.getTemplateConfig(templateId);
+        int minimalPlaceholderFill = 1;
+        if (null != templateConfig) {
+            if (null != templateConfig.getMinimalPlaceholderFill()) {
+                minimalPlaceholderFill = templateConfig.getMinimalPlaceholderFill();
+            }
+        }
+        if (minimalPlaceholderFill <= 0) {
+            return true;
+        }
+        List<FaceSampleEntity> faceSampleList = faceRepository.getFaceSampleList(faceId);
+        long count = faceSampleList.stream().map(FaceSampleEntity::getDeviceId).filter(deviceId -> placeholderList.contains(deviceId.toString())).count();
+        return count >= minimalPlaceholderFill;
+    }
+
+}
diff --git a/src/main/java/com/ycwl/basic/controller/wvp/WvpController.java b/src/main/java/com/ycwl/basic/controller/wvp/WvpController.java
new file mode 100644
index 0000000..02851c4
--- /dev/null
+++ b/src/main/java/com/ycwl/basic/controller/wvp/WvpController.java
@@ -0,0 +1,21 @@
+package com.ycwl.basic.controller.wvp;
+
+import com.ycwl.basic.annotation.IgnoreLogReq;
+import com.ycwl.basic.annotation.IgnoreToken;
+import com.ycwl.basic.utils.ApiResponse;
+import io.swagger.annotations.Api;
+import org.springframework.web.bind.annotation.PostMapping;
+import org.springframework.web.bind.annotation.RequestMapping;
+import org.springframework.web.bind.annotation.RestController;
+
+@IgnoreToken
+@RestController
+@Api(tags = "WVP对接接口")
+@RequestMapping("/wvp/v1/")
+public class WvpController {
+    @IgnoreLogReq
+    @PostMapping("/sync")
+    public ApiResponse sync() {
+        return ApiResponse.success("success");
+    }
+}
diff --git a/src/main/java/com/ycwl/basic/interceptor/AuthInterceptor.java b/src/main/java/com/ycwl/basic/interceptor/AuthInterceptor.java
index 13c686b..6bc6cb2 100644
--- a/src/main/java/com/ycwl/basic/interceptor/AuthInterceptor.java
+++ b/src/main/java/com/ycwl/basic/interceptor/AuthInterceptor.java
@@ -74,8 +74,7 @@ public class AuthInterceptor extends HandlerInterceptorAdapter {
         // 解析 token  & 验证 token 有效期
         JwtInfo jwtInfo;
         try {
-            jwtInfo = jwtTokenUtil.parsingToken(token);
-            log.info("用户信息:" + jwtInfo.toString());
+            jwtInfo = JwtTokenUtil.parsingToken(token);
             LocalDateTime expireTime = jwtInfo.getExpireTime();
             if (LocalDateTime.now(ZoneId.systemDefault()).isAfter(expireTime)) {
                 throw new TokenExpireException("token过期");
diff --git a/src/main/java/com/ycwl/basic/mapper/FaceMapper.java b/src/main/java/com/ycwl/basic/mapper/FaceMapper.java
index e3b5279..9423505 100644
--- a/src/main/java/com/ycwl/basic/mapper/FaceMapper.java
+++ b/src/main/java/com/ycwl/basic/mapper/FaceMapper.java
@@ -18,6 +18,7 @@ public interface FaceMapper {
     List<FaceRespVO> list(FaceReqQuery faceReqQuery);
     List<FaceRespVO> listByScenicIdAndNotFinished(Long scenicId);
     FaceRespVO getById(Long id);
+    FaceEntity get(Long id);
     int add(FaceEntity face);
     int deleteById(Long id);
     int deleteByIds(@Param("list") List<Long> ids);
diff --git a/src/main/java/com/ycwl/basic/mapper/FaceSampleMapper.java b/src/main/java/com/ycwl/basic/mapper/FaceSampleMapper.java
index df15489..068effd 100644
--- a/src/main/java/com/ycwl/basic/mapper/FaceSampleMapper.java
+++ b/src/main/java/com/ycwl/basic/mapper/FaceSampleMapper.java
@@ -22,5 +22,5 @@ public interface FaceSampleMapper {
     int deleteByIds(@Param("list") List<Long> ids);
     int update(FaceSampleEntity faceSample);
 
-    List<FaceSampleRespVO> listByIds(List<Long> list);
+    List<FaceSampleEntity> listByIds(List<Long> list);
 }
diff --git a/src/main/java/com/ycwl/basic/repository/FaceRepository.java b/src/main/java/com/ycwl/basic/repository/FaceRepository.java
index a011480..c49ec75 100644
--- a/src/main/java/com/ycwl/basic/repository/FaceRepository.java
+++ b/src/main/java/com/ycwl/basic/repository/FaceRepository.java
@@ -2,10 +2,19 @@ package com.ycwl.basic.repository;
 
 import com.ycwl.basic.mapper.FaceMapper;
 import com.ycwl.basic.mapper.FaceSampleMapper;
+import com.ycwl.basic.model.pc.face.entity.FaceEntity;
+import com.ycwl.basic.model.pc.faceSample.entity.FaceSampleEntity;
+import com.ycwl.basic.model.pc.faceSample.resp.FaceSampleRespVO;
+import org.apache.commons.lang3.StringUtils;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.data.redis.core.RedisTemplate;
 import org.springframework.stereotype.Component;
 
+import java.util.Arrays;
+import java.util.Collections;
+import java.util.List;
+import java.util.stream.Collectors;
+
 @Component
 public class FaceRepository {
     @Autowired
@@ -14,4 +23,15 @@ public class FaceRepository {
     private FaceMapper faceMapper;
     @Autowired
     private FaceSampleMapper faceSampleMapper;
+
+    public List<FaceSampleEntity> getFaceSampleList(Long faceId) {
+        FaceEntity face = faceMapper.get(faceId);
+        if (face == null) {
+            return Collections.emptyList();
+        }
+        if (StringUtils.isBlank(face.getMatchSampleIds())) {
+            return Collections.emptyList();
+        }
+        return faceSampleMapper.listByIds(Arrays.stream(face.getMatchSampleIds().split(",")).map(Long::valueOf).collect(Collectors.toList()));
+    }
 }
diff --git a/src/main/java/com/ycwl/basic/repository/TemplateRepository.java b/src/main/java/com/ycwl/basic/repository/TemplateRepository.java
index ef085c4..22ebd51 100644
--- a/src/main/java/com/ycwl/basic/repository/TemplateRepository.java
+++ b/src/main/java/com/ycwl/basic/repository/TemplateRepository.java
@@ -4,8 +4,6 @@ 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;
@@ -13,11 +11,8 @@ 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.Collections;
-import java.util.HashMap;
 import java.util.List;
-import java.util.Map;
 import java.util.stream.Collectors;
 
 @Service // 临时这么用
@@ -35,29 +30,13 @@ public class TemplateRepository {
     public static final String TEMPLATE_CONFIG_CACHE_KEY = "template:%s:config";
 
 
-    public boolean determineTemplateCanGenerate(Long templateId, Long faceId) {
+    public List<String> getTemplatePlaceholder(Long templateId) {
         TemplateRespVO template = getTemplate(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();
+        return template.getChildren().stream()
+                .filter(item -> item.getIsPlaceholder() == 1)
+                .map(TemplateRespVO::getSourceUrl)
+                .distinct()
+                .collect(Collectors.toList());
     }
 
     public List<TemplateRespVO> getTemplateListByScenicId(Long scenicId) {
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 76e26d9..db32b24 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
@@ -4,6 +4,7 @@ import cn.hutool.core.bean.BeanUtil;
 import com.github.pagehelper.PageHelper;
 import com.github.pagehelper.PageInfo;
 import com.ycwl.basic.biz.OrderBiz;
+import com.ycwl.basic.biz.TemplateBiz;
 import com.ycwl.basic.constant.BaseContextHandler;
 import com.ycwl.basic.mapper.*;
 import com.ycwl.basic.model.jwt.JwtInfo;
@@ -75,6 +76,8 @@ public class AppScenicServiceImpl implements AppScenicService {
     private OrderBiz orderBiz;
     @Autowired
     private ScenicRepository scenicRepository;
+    @Autowired
+    private TemplateBiz templateBiz;
 
     @Override
     public ApiResponse<PageInfo<ScenicAppVO>> pageQuery(ScenicReqQuery scenicReqQuery) {
@@ -126,7 +129,7 @@ public class AppScenicServiceImpl implements AppScenicService {
                 contentPageVO.setLockType(-1);
             } else {
                 contentPageVO.setContentType(0);
-                boolean canGenerate = templateRepository.determineTemplateCanGenerate(contentPageVO.getTemplateId(), faceId);
+                boolean canGenerate = templateBiz.determineTemplateCanGenerate(contentPageVO.getTemplateId(), faceId);
                 if (canGenerate) {
                     contentPageVO.setLockType(0);
                 } else {
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 813d4ee..76ecf56 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
@@ -232,7 +232,11 @@ public class GoodsServiceImpl implements GoodsService {
         if (paramJson == null) {
             deviceCount = 1;
         } else {
-            deviceCount = paramJson.keySet().stream().filter(StringUtils::isNumeric).count();
+            List<String> templatePlaceholder = templateRepository.getTemplatePlaceholder(task.getTemplateId());
+            deviceCount = paramJson.keySet().stream()
+                    .filter(StringUtils::isNumeric)
+                    .filter(templatePlaceholder::contains)
+                    .count();
         }
         goodsDetailVO.setLensNum((int) deviceCount);
         return ApiResponse.success(goodsDetailVO);
diff --git a/src/main/java/com/ycwl/basic/service/impl/task/TaskFaceServiceImpl.java b/src/main/java/com/ycwl/basic/service/task/impl/TaskFaceServiceImpl.java
similarity index 99%
rename from src/main/java/com/ycwl/basic/service/impl/task/TaskFaceServiceImpl.java
rename to src/main/java/com/ycwl/basic/service/task/impl/TaskFaceServiceImpl.java
index cced975..2af4f5f 100644
--- a/src/main/java/com/ycwl/basic/service/impl/task/TaskFaceServiceImpl.java
+++ b/src/main/java/com/ycwl/basic/service/task/impl/TaskFaceServiceImpl.java
@@ -1,4 +1,4 @@
-package com.ycwl.basic.service.impl.task;
+package com.ycwl.basic.service.task.impl;
 
 import cn.hutool.core.date.DateUtil;
 import com.alibaba.fastjson.JSON;
diff --git a/src/main/java/com/ycwl/basic/service/impl/task/TaskTaskServiceImpl.java b/src/main/java/com/ycwl/basic/service/task/impl/TaskTaskServiceImpl.java
similarity index 97%
rename from src/main/java/com/ycwl/basic/service/impl/task/TaskTaskServiceImpl.java
rename to src/main/java/com/ycwl/basic/service/task/impl/TaskTaskServiceImpl.java
index c70d909..bd9d18d 100644
--- a/src/main/java/com/ycwl/basic/service/impl/task/TaskTaskServiceImpl.java
+++ b/src/main/java/com/ycwl/basic/service/task/impl/TaskTaskServiceImpl.java
@@ -1,10 +1,11 @@
-package com.ycwl.basic.service.impl.task;
+package com.ycwl.basic.service.task.impl;
 
 import cn.hutool.core.date.DateUtil;
 import com.alibaba.fastjson.JSON;
 import com.alibaba.fastjson.JSONArray;
 import com.alibaba.fastjson.JSONObject;
 import com.ycwl.basic.biz.OrderBiz;
+import com.ycwl.basic.biz.TemplateBiz;
 import com.ycwl.basic.constant.TaskConstant;
 import com.ycwl.basic.mapper.FaceMapper;
 import com.ycwl.basic.mapper.FaceSampleMapper;
@@ -16,6 +17,7 @@ import com.ycwl.basic.mapper.TemplateMapper;
 import com.ycwl.basic.mapper.VideoMapper;
 import com.ycwl.basic.model.mobile.order.PriceObj;
 import com.ycwl.basic.model.pc.face.resp.FaceRespVO;
+import com.ycwl.basic.model.pc.faceSample.entity.FaceSampleEntity;
 import com.ycwl.basic.model.pc.faceSample.resp.FaceSampleRespVO;
 import com.ycwl.basic.model.pc.member.resp.MemberRespVO;
 import com.ycwl.basic.model.pc.mp.MpConfigEntity;
@@ -96,6 +98,8 @@ public class TaskTaskServiceImpl implements TaskService {
     private MemberMapper memberMapper;
     @Autowired
     private ScenicRepository scenicRepository;
+    @Autowired
+    private TemplateBiz templateBiz;
 
     private RenderWorkerEntity getWorker(@NonNull WorkerAuthReqVo req) {
         String accessKey = req.getAccessKey();
@@ -152,7 +156,7 @@ public class TaskTaskServiceImpl implements TaskService {
         if (faceId == null) {
             return;
         }
-        boolean canGenerate = templateRepository.determineTemplateCanGenerate(templateId, faceId);
+        boolean canGenerate = templateBiz.determineTemplateCanGenerate(templateId, faceId);
         if (!canGenerate) {
             return;
         }
@@ -221,7 +225,7 @@ public class TaskTaskServiceImpl implements TaskService {
         if (!StringUtils.isNotBlank(faceRespVO.getMatchSampleIds())) {
             return;
         }
-        List<FaceSampleRespVO> faceSampleList = faceSampleMapper.listByIds(Arrays.stream(faceRespVO.getMatchSampleIds().split(",")).map(Long::valueOf).collect(Collectors.toList()));
+        List<FaceSampleEntity> faceSampleList = faceSampleMapper.listByIds(Arrays.stream(faceRespVO.getMatchSampleIds().split(",")).map(Long::valueOf).collect(Collectors.toList()));
         if (faceSampleList.isEmpty()) {
             return;
         }
@@ -247,11 +251,11 @@ public class TaskTaskServiceImpl implements TaskService {
     public void createTaskByFaceIdAndTempalteId(Long faceId, Long templateId, int automatic) {
         FaceRespVO faceRespVO = faceMapper.getById(faceId);
         ScenicConfigEntity scenicConfig = scenicRepository.getScenicConfig(faceRespVO.getScenicId());
-        List<FaceSampleRespVO> faceSampleList = faceSampleMapper.listByIds(Arrays.stream(faceRespVO.getMatchSampleIds().split(",")).map(Long::valueOf).collect(Collectors.toList()));
+        List<FaceSampleEntity> faceSampleList = faceSampleMapper.listByIds(Arrays.stream(faceRespVO.getMatchSampleIds().split(",")).map(Long::valueOf).collect(Collectors.toList()));
         if (faceSampleList.isEmpty()) {
             return;
         }
-        List<Long> faceSampleIds = faceSampleList.stream().map(FaceSampleRespVO::getId).collect(Collectors.toList());
+        List<Long> faceSampleIds = faceSampleList.stream().map(FaceSampleEntity::getId).collect(Collectors.toList());
         List<SourceEntity> sourceList = sourceMapper.listBySampleIds(faceSampleIds);
         if (sourceList.isEmpty()) {
             return;
@@ -294,7 +298,7 @@ public class TaskTaskServiceImpl implements TaskService {
         task.faceSampleIds = faceSampleIds;
         task.memberId = faceRespVO.getMemberId();
         task.callback = () -> {
-            boolean canGenerate = templateRepository.determineTemplateCanGenerate(templateId, faceId);
+            boolean canGenerate = templateBiz.determineTemplateCanGenerate(templateId, faceId);
             if (!canGenerate) {
                 return;
             }
diff --git a/src/main/java/com/ycwl/basic/service/impl/task/TaskTemplateServiceImpl.java b/src/main/java/com/ycwl/basic/service/task/impl/TaskTemplateServiceImpl.java
similarity index 96%
rename from src/main/java/com/ycwl/basic/service/impl/task/TaskTemplateServiceImpl.java
rename to src/main/java/com/ycwl/basic/service/task/impl/TaskTemplateServiceImpl.java
index eb3d334..7671eb9 100644
--- a/src/main/java/com/ycwl/basic/service/impl/task/TaskTemplateServiceImpl.java
+++ b/src/main/java/com/ycwl/basic/service/task/impl/TaskTemplateServiceImpl.java
@@ -1,4 +1,4 @@
-package com.ycwl.basic.service.impl.task;
+package com.ycwl.basic.service.task.impl;
 
 import com.alibaba.fastjson.JSON;
 import com.ycwl.basic.mapper.TemplateMapper;
diff --git a/src/main/java/com/ycwl/basic/service/wvp/WvpService.java b/src/main/java/com/ycwl/basic/service/wvp/WvpService.java
new file mode 100644
index 0000000..ed10093
--- /dev/null
+++ b/src/main/java/com/ycwl/basic/service/wvp/WvpService.java
@@ -0,0 +1,4 @@
+package com.ycwl.basic.service.wvp;
+
+public interface WvpService {
+}
diff --git a/src/main/java/com/ycwl/basic/service/wvp/impl/WvpServiceImpl.java b/src/main/java/com/ycwl/basic/service/wvp/impl/WvpServiceImpl.java
new file mode 100644
index 0000000..c2eaca2
--- /dev/null
+++ b/src/main/java/com/ycwl/basic/service/wvp/impl/WvpServiceImpl.java
@@ -0,0 +1,18 @@
+package com.ycwl.basic.service.wvp.impl;
+
+import com.ycwl.basic.device.repository.DeviceRepository;
+import com.ycwl.basic.repository.ScenicRepository;
+import com.ycwl.basic.service.wvp.WvpService;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.data.redis.core.RedisTemplate;
+import org.springframework.stereotype.Service;
+
+@Service
+public class WvpServiceImpl implements WvpService {
+    @Autowired
+    private RedisTemplate<String, String> redisTemplate;
+    @Autowired
+    private DeviceRepository deviceRepository;
+    @Autowired
+    private ScenicRepository scenicRepository;
+}
diff --git a/src/main/java/com/ycwl/basic/task/DynamicTaskGenerator.java b/src/main/java/com/ycwl/basic/task/DynamicTaskGenerator.java
index abe5461..daf0c8e 100644
--- a/src/main/java/com/ycwl/basic/task/DynamicTaskGenerator.java
+++ b/src/main/java/com/ycwl/basic/task/DynamicTaskGenerator.java
@@ -1,11 +1,13 @@
 package com.ycwl.basic.task;
 
+import com.ycwl.basic.biz.TemplateBiz;
 import com.ycwl.basic.mapper.DeviceMapper;
 import com.ycwl.basic.mapper.FaceMapper;
 import com.ycwl.basic.mapper.FaceSampleMapper;
 import com.ycwl.basic.mapper.ScenicMapper;
 import com.ycwl.basic.mapper.TemplateMapper;
 import com.ycwl.basic.model.pc.face.resp.FaceRespVO;
+import com.ycwl.basic.model.pc.faceSample.entity.FaceSampleEntity;
 import com.ycwl.basic.model.pc.faceSample.resp.FaceSampleRespVO;
 import com.ycwl.basic.model.pc.scenic.entity.ScenicConfigEntity;
 import com.ycwl.basic.model.pc.scenic.req.ScenicReqQuery;
@@ -45,6 +47,8 @@ public class DynamicTaskGenerator {
     private TaskService taskService;
     @Autowired
     private DeviceMapper deviceMapper;
+    @Autowired
+    private TemplateBiz templateBiz;
 
     @Scheduled(cron = "0 0 * * * ?")
     public void dynamicTask() {
@@ -77,27 +81,6 @@ public class DynamicTaskGenerator {
                         continue;
                     }
                 }
-                Integer minimalPlaceholderFill = templateConfig.getMinimalPlaceholderFill();
-                int maxPlaceholder = 0;
-                List<String> placeholderList = new ArrayList<>();
-                if (minimalPlaceholderFill == null) {
-                    minimalPlaceholderFill = 0;
-                }
-                List<TemplateRespVO> subTemplateList = templateMapper.getByPid(template.getId());
-                for (TemplateRespVO subTemplate : subTemplateList) {
-                    if (subTemplate.getIsPlaceholder() == 1) {
-                        placeholderList.add(subTemplate.getSourceUrl());
-                    }
-                }
-                if (minimalPlaceholderFill == 0) {
-                    for (TemplateRespVO subTemplate : subTemplateList) {
-                        maxPlaceholder += 1;
-                        if (subTemplate.getIsPlaceholder() == 1) {
-                            minimalPlaceholderFill += 1;
-                        }
-                    }
-                }
-                log.info("当前模板{}启用默认,最小占位素材:{}", template.getName(), minimalPlaceholderFill);
                 // 查找人脸样本
                 List<FaceRespVO> list = faceMapper.listByScenicIdAndNotFinished(scenic.getId());
                 for (FaceRespVO face : list) {
@@ -122,23 +105,12 @@ public class DynamicTaskGenerator {
                                 continue;
                             }
                         }
-                        List<FaceSampleRespVO> faceSampleList = faceSampleMapper.listByIds(searchFace.getSampleListIds());
-                        int matchedPlaceholder = 0;
-                        for (FaceSampleRespVO faceSample : faceSampleList) {
-                            if (placeholderList.contains(faceSample.getDeviceId().toString())) {
-                                matchedPlaceholder += 1;
-                            }
-                        }
-                        if (matchedPlaceholder >= maxPlaceholder) {
-                            log.info("当前人脸样本{}已超过最大占位素材{},自动创建任务", face.getFaceUrl(), maxPlaceholder);
-                            taskService.createRenderTask(scenic.getId(), template.getId(), face.getId());
-                            faceMapper.finishedJourney(face.getId());
-                        } else if (matchedPlaceholder >= minimalPlaceholderFill) {
-                            log.info("当前人脸样本{}已超过最小占位素材{},自动创建任务", face.getFaceUrl(), minimalPlaceholderFill);
+                        if (templateBiz.determineTemplateCanGenerate(template.getId(), face.getId())) {
+                            log.info("当前人脸样本{}已超过最小占位素材,自动创建任务", face.getFaceUrl());
                             taskService.createRenderTask(scenic.getId(), template.getId(), face.getId());
                             faceMapper.finishedJourney(face.getId());
                         } else {
-                            log.info("当前人脸样本{}未超过最小占位素材{},未达到自动生成条件", face.getFaceUrl(), minimalPlaceholderFill);
+                            log.info("当前人脸样本{}未超过最小占位素材,未达到自动生成条件", face.getFaceUrl());
                         }
                     }
                 }
diff --git a/src/main/resources/mapper/FaceMapper.xml b/src/main/resources/mapper/FaceMapper.xml
index e4909a1..b9eab10 100644
--- a/src/main/resources/mapper/FaceMapper.xml
+++ b/src/main/resources/mapper/FaceMapper.xml
@@ -89,4 +89,9 @@
         order by update_at desc
         limit 1
     </select>
+    <select id="get" resultType="com.ycwl.basic.model.pc.face.entity.FaceEntity">
+        select *
+        from face
+        where id = #{id}
+    </select>
 </mapper>
diff --git a/src/main/resources/mapper/FaceSampleMapper.xml b/src/main/resources/mapper/FaceSampleMapper.xml
index bbf070e..42632da 100644
--- a/src/main/resources/mapper/FaceSampleMapper.xml
+++ b/src/main/resources/mapper/FaceSampleMapper.xml
@@ -86,8 +86,8 @@
         from face_sample
         where id = #{id}
     </select>
-    <select id="listByIds" resultType="com.ycwl.basic.model.pc.faceSample.resp.FaceSampleRespVO">
-        select id, scenic_id, device_id, face_url, match_sample_ids, first_match_rate, source_id, match_result,`status`, create_at
+    <select id="listByIds" resultType="com.ycwl.basic.model.pc.faceSample.entity.FaceSampleEntity">
+        select *
         from face_sample
         where id in (
         <foreach collection="list" item="id" separator=",">
diff --git a/src/main/resources/mapper/SourceMapper.xml b/src/main/resources/mapper/SourceMapper.xml
index 34b0c94..6b8bd4a 100644
--- a/src/main/resources/mapper/SourceMapper.xml
+++ b/src/main/resources/mapper/SourceMapper.xml
@@ -93,6 +93,7 @@
         <foreach collection="list" item="item" open="(" separator="," close=")">
             #{item}
         </foreach>
+        order by create_time desc
     </select>
     <select id="listVideoBySampleIds" resultType="com.ycwl.basic.model.pc.source.entity.SourceEntity">
         select *