diff --git a/src/main/java/com/ycwl/basic/controller/viid/ViidController.java b/src/main/java/com/ycwl/basic/controller/viid/ViidController.java
index a0fce10..931e302 100644
--- a/src/main/java/com/ycwl/basic/controller/viid/ViidController.java
+++ b/src/main/java/com/ycwl/basic/controller/viid/ViidController.java
@@ -1,6 +1,7 @@
 package com.ycwl.basic.controller.viid;
 
 import cn.hutool.core.collection.CollUtil;
+import cn.hutool.core.thread.ThreadFactoryBuilder;
 import cn.hutool.core.util.ObjectUtil;
 import com.alibaba.fastjson.JSON;
 import com.alibaba.fastjson.JSONObject;
@@ -69,6 +70,7 @@ import java.util.TimeZone;
 import java.util.UUID;
 import java.util.concurrent.ArrayBlockingQueue;
 import java.util.concurrent.ConcurrentHashMap;
+import java.util.concurrent.ThreadFactory;
 import java.util.concurrent.ThreadPoolExecutor;
 import java.util.concurrent.TimeUnit;
 import java.util.stream.Collectors;
@@ -93,17 +95,20 @@ public class ViidController {
     private ScenicRepository scenicRepository;
     @Autowired
     private TaskFaceService taskFaceService;
-    private final Map<String, ThreadPoolExecutor> executors = new ConcurrentHashMap<>();
+    private final Map<Long, ThreadPoolExecutor> executors = new ConcurrentHashMap<>();
     @Autowired
     private ScenicService scenicService;
 
-    private ThreadPoolExecutor getExecutor(String deviceId) {
-        ThreadPoolExecutor executor = executors.get(deviceId);
-        if (executor == null) {
-            executor = new ThreadPoolExecutor(4, 4096, 0L, TimeUnit.MILLISECONDS, new ArrayBlockingQueue<>(4096));
-            executors.put(deviceId, executor);
-        }
-        return executor;
+    private ThreadPoolExecutor getExecutor(Long scenicId) {
+        return executors.computeIfAbsent(scenicId, k -> {
+            ThreadFactory threadFactory = new ThreadFactoryBuilder()
+                    .setNamePrefix("VIID-" + scenicId + "-t")
+                    .build();
+            return new ThreadPoolExecutor(
+                    4, 4096, 0L, TimeUnit.MILLISECONDS,
+                    new ArrayBlockingQueue<>(4096),
+                    threadFactory);
+        });
     }
 
     // region 注册注销基础接口
@@ -310,7 +315,7 @@ public class ViidController {
                                 String url = adapter.uploadFile(file, "user-face", UUID.randomUUID() + "." + ext);
                                 faceSample.setFaceUrl(url);
                                 faceSampleMapper.add(faceSample);
-                                ThreadPoolExecutor executor = getExecutor(device.getId().toString());
+                                ThreadPoolExecutor executor = getExecutor(scenicId);
                                 executor.execute(() -> {
                                     if (faceBodyAdapter != null) {
                                         taskFaceService.assureFaceDb(faceBodyAdapter, scenicId.toString());
@@ -372,7 +377,7 @@ public class ViidController {
                                 faceSample.setFaceUrl(url);
                                 faceSampleMapper.add(faceSample);
                                 DynamicTaskGenerator.addTask(faceSample.getId());
-                                ThreadPoolExecutor executor = getExecutor(device.getId().toString());
+                                ThreadPoolExecutor executor = getExecutor(scenicId);
                                 executor.execute(() -> {
                                     if (faceBodyAdapter != null) {
                                         taskFaceService.assureFaceDb(faceBodyAdapter, scenicId.toString());
diff --git a/src/main/java/com/ycwl/basic/service/pc/impl/FaceServiceImpl.java b/src/main/java/com/ycwl/basic/service/pc/impl/FaceServiceImpl.java
index c15cee0..b605850 100644
--- a/src/main/java/com/ycwl/basic/service/pc/impl/FaceServiceImpl.java
+++ b/src/main/java/com/ycwl/basic/service/pc/impl/FaceServiceImpl.java
@@ -136,14 +136,7 @@ public class FaceServiceImpl implements FaceService {
         String faceUrl = adapter.uploadFile(file, filePath, fileName);
         Long newFaceId = SnowFlakeUtil.getLongId();
         Long oldFaceId = null;
-        ScenicConfigEntity scenicConfig = scenicRepository.getScenicConfig(scenicId);
-        IFaceBodyAdapter faceBodyAdapter;
-        if (scenicConfig != null && scenicConfig.getFaceType() != null) {
-            faceBodyAdapter = FaceBodyFactory.getAdapter(scenicConfig.getFaceType());
-            faceBodyAdapter.loadConfig(JSONObject.parseObject(scenicConfig.getFaceConfigJson(), Map.class));
-        } else {
-            faceBodyAdapter = FaceBodyFactory.use();
-        }
+        IFaceBodyAdapter faceBodyAdapter = scenicService.getScenicFaceBodyAdapter(scenicId);
         faceService.assureFaceDb(faceBodyAdapter, USER_FACE_DB_NAME+scenicId);
         SearchFaceRespVo userDbSearchResult = faceService.searchFace(faceBodyAdapter, USER_FACE_DB_NAME+scenicId, faceUrl, "判断是否为用户上传过的人脸");
         float strictScore = 0.6F;
@@ -225,13 +218,7 @@ public class FaceServiceImpl implements FaceService {
             return null;
         }
         ScenicConfigEntity scenicConfig = scenicRepository.getScenicConfig(face.getScenicId());
-        IFaceBodyAdapter faceBodyAdapter;
-        if (scenicConfig != null && scenicConfig.getFaceType() != null) {
-            faceBodyAdapter = FaceBodyFactory.getAdapter(scenicConfig.getFaceType());
-            faceBodyAdapter.loadConfig(JSONObject.parseObject(scenicConfig.getFaceConfigJson(), Map.class));
-        } else {
-            faceBodyAdapter = FaceBodyFactory.use();
-        }
+        IFaceBodyAdapter faceBodyAdapter = scenicService.getScenicFaceBodyAdapter(face.getScenicId());
         SearchFaceRespVo scenicDbSearchResult = faceService.searchFace(faceBodyAdapter, String.valueOf(face.getScenicId()), face.getFaceUrl(), "人脸识别");
         if (scenicDbSearchResult == null) {
             throw new BaseException("人脸识别失败,请换一张试试把~");
diff --git a/src/main/java/com/ycwl/basic/service/task/impl/TaskFaceServiceImpl.java b/src/main/java/com/ycwl/basic/service/task/impl/TaskFaceServiceImpl.java
index 28f3940..1b97b4d 100644
--- a/src/main/java/com/ycwl/basic/service/task/impl/TaskFaceServiceImpl.java
+++ b/src/main/java/com/ycwl/basic/service/task/impl/TaskFaceServiceImpl.java
@@ -239,30 +239,27 @@ public class TaskFaceServiceImpl implements TaskFaceService {
             List<FaceSampleEntity> allFaceSampleList = new ArrayList<>();
             if (StringUtils.isNumeric(dbName)) { // 景区
                 allFaceSampleList = faceSampleMapper.listByIds(allFaceSampleIds);
-                Long firstFaceSampleId = acceptFaceSampleIds.get(0);
-                Optional<FaceSampleEntity> firstFaceSample = allFaceSampleList.stream().filter(faceSample -> faceSample.getId().equals(firstFaceSampleId)).findAny();
-                if (firstFaceSample.isPresent()) {
-                    if (tourMinutes > 0) {
-                        List<FaceSampleEntity> acceptFaceSampleList = faceSampleMapper.listByIds(acceptFaceSampleIds);
-                        Date startDate = DateUtil.offsetMinute(firstFaceSample.get().getCreateAt(), -tourMinutes/2);
-                        Date endDate = DateUtil.offsetMinute(firstFaceSample.get().getCreateAt(), tourMinutes/2);
-                        acceptFaceSampleIds = acceptFaceSampleList.stream()
-                                .filter(faceSample -> faceSample.getCreateAt().after(startDate) && faceSample.getCreateAt().before(endDate))
-                                .map(FaceSampleEntity::getId)
-                                .collect(Collectors.toList());
-                        log.info("时间范围逻辑:最高匹配:{},时间范围需要在:{}~{}间", firstFaceSample, startDate, endDate);
+                if (!acceptFaceSampleIds.isEmpty()) {
+                    Long firstFaceSampleId = acceptFaceSampleIds.get(0);
+                    Optional<FaceSampleEntity> firstFaceSample = allFaceSampleList.stream().filter(faceSample -> faceSample.getId().equals(firstFaceSampleId)).findAny();
+                    if (firstFaceSample.isPresent()) {
+                        if (tourMinutes > 0) {
+                            List<FaceSampleEntity> acceptFaceSampleList = faceSampleMapper.listByIds(acceptFaceSampleIds);
+                            Date startDate = DateUtil.offsetMinute(firstFaceSample.get().getCreateAt(), -tourMinutes/2);
+                            Date endDate = DateUtil.offsetMinute(firstFaceSample.get().getCreateAt(), tourMinutes/2);
+                            acceptFaceSampleIds = acceptFaceSampleList.stream()
+                                    .filter(faceSample -> faceSample.getCreateAt().after(startDate) && faceSample.getCreateAt().before(endDate))
+                                    .map(FaceSampleEntity::getId)
+                                    .collect(Collectors.toList());
+                            log.info("时间范围逻辑:最高匹配:{},时间范围需要在:{}~{}间", firstFaceSample, startDate, endDate);
+                        } else {
+                            log.info("时间范围逻辑:景区未限制");
+                        }
                     } else {
-                        log.info("时间范围逻辑:景区未限制");
+                        log.info("时间范围逻辑:最高匹配ID:{},未找到", firstFaceSampleId);
                     }
-                } else {
-                    log.info("时间范围逻辑:最高匹配ID:{},未找到", firstFaceSampleId);
                 }
             }
-            if (acceptFaceSampleIds.isEmpty()) {
-                respVo.setFirstMatchRate(0f);
-                respVo.setSampleListIds(Collections.emptyList());
-                return respVo;
-            }
             List<MatchLocalRecord> collect = new ArrayList<>();
             for (SearchFaceResultItem item : records) {
                 MatchLocalRecord record = new MatchLocalRecord();
@@ -286,6 +283,11 @@ public class TaskFaceServiceImpl implements TaskFaceService {
                 record.setMatched(item.getScore() > _threshold);
                 collect.add(record);
             }
+            if (acceptFaceSampleIds.isEmpty()) {
+                respVo.setFirstMatchRate(0f);
+                respVo.setSampleListIds(Collections.emptyList());
+                return respVo;
+            }
             logEntity.setMatchLocalRecord(JSONObject.toJSONString(collect));
             respVo.setFirstMatchRate(response.getFirstMatchRate());
             respVo.setSampleListIds(acceptFaceSampleIds);
diff --git a/src/main/java/com/ycwl/basic/service/task/impl/TaskTaskServiceImpl.java b/src/main/java/com/ycwl/basic/service/task/impl/TaskTaskServiceImpl.java
index d191ce3..f5ad39c 100644
--- a/src/main/java/com/ycwl/basic/service/task/impl/TaskTaskServiceImpl.java
+++ b/src/main/java/com/ycwl/basic/service/task/impl/TaskTaskServiceImpl.java
@@ -117,8 +117,6 @@ public class TaskTaskServiceImpl implements TaskService {
     @Autowired
     private VideoRepository videoRepository;
     @Autowired
-    private OrderRepository orderRepository;
-    @Autowired
     private ScenicService scenicService;
 
     private final ReentrantLock lock = new ReentrantLock();
@@ -126,7 +124,6 @@ public class TaskTaskServiceImpl implements TaskService {
     private TaskStatusBiz taskStatusBiz;
     @Autowired
     private DeviceRepository deviceRepository;
-    private final ThreadPoolExecutor executor = new ThreadPoolExecutor(8, 1024, 0L, TimeUnit.MILLISECONDS, new ArrayBlockingQueue<>(1024));
 
 
     private RenderWorkerEntity getWorker(@NonNull WorkerAuthReqVo req) {
@@ -619,9 +616,9 @@ public class TaskTaskServiceImpl implements TaskService {
             }
         }
         videoMapper.updateRelationWhenTaskSuccess(taskId, video.getId(), isBuy);
-        executor.execute(() -> {
+        new Thread(() -> {
             sendVideoGeneratedServiceNotification(taskId);
-        });
+        }).start();
     }
 
     @Override
diff --git a/src/main/java/com/ycwl/basic/task/VideoPieceGetter.java b/src/main/java/com/ycwl/basic/task/VideoPieceGetter.java
index d90798d..3ef1228 100644
--- a/src/main/java/com/ycwl/basic/task/VideoPieceGetter.java
+++ b/src/main/java/com/ycwl/basic/task/VideoPieceGetter.java
@@ -1,5 +1,6 @@
 package com.ycwl.basic.task;
 
+import cn.hutool.core.thread.ThreadFactoryBuilder;
 import com.ycwl.basic.biz.OrderBiz;
 import com.ycwl.basic.biz.TaskStatusBiz;
 import com.ycwl.basic.device.DeviceFactory;
@@ -41,6 +42,7 @@ import java.util.Map;
 import java.util.concurrent.ArrayBlockingQueue;
 import java.util.concurrent.ConcurrentHashMap;
 import java.util.concurrent.ConcurrentLinkedQueue;
+import java.util.concurrent.ThreadFactory;
 import java.util.concurrent.ThreadPoolExecutor;
 import java.util.concurrent.TimeUnit;
 import java.util.concurrent.atomic.AtomicBoolean;
@@ -118,7 +120,13 @@ public class VideoPieceGetter {
 //            taskStatusBiz.setFaceCutStatus(task.faceId, 0);
 //        }
         AtomicBoolean invoke = new AtomicBoolean(false);
-        final ThreadPoolExecutor executor = new ThreadPoolExecutor(16, 512, 0L, TimeUnit.MILLISECONDS, new ArrayBlockingQueue<>(512));
+        final ThreadFactory threadFactory = new ThreadFactoryBuilder()
+                .setNamePrefix("VPG-" + task.faceId + "-t")
+                .build();
+        final ThreadPoolExecutor executor = new ThreadPoolExecutor(16, 512, 0L, TimeUnit.MILLISECONDS,
+                new ArrayBlockingQueue<>(512),
+                threadFactory
+        );
         List<String> currentPlaceholder = new ArrayList<>();
         List<FaceSampleEntity> list = faceSampleMapper.listByIds(task.getFaceSampleIds());
         Map<Long, Long> pairDeviceMap = new ConcurrentHashMap<>();