From d860996f6d40ad2e944173e1b1db3fc61a1abd1c Mon Sep 17 00:00:00 2001 From: Jerry Yan <792602257@qq.com> Date: Fri, 26 Sep 2025 15:51:15 +0800 Subject: [PATCH] =?UTF-8?q?feat(face):=E4=BC=98=E5=8C=96=E8=A7=86=E9=A2=91?= =?UTF-8?q?=E9=87=8D=E5=88=87=E4=BB=BB=E5=8A=A1=E7=9A=84=E6=A0=B7=E6=9C=AC?= =?UTF-8?q?=E9=80=89=E6=8B=A9=E9=80=BB=E8=BE=91?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - 根据设备配置限制视频样本数量 - 实现按设备分组并应用数量限制- 更新视频重切任务中的样本ID列表 - 保留原有照片与视频数量比较逻辑 --- .../service/pc/impl/FaceServiceImpl.java | 19 ++++++++++++++++++- .../task/impl/TaskFaceServiceImpl.java | 15 ++++++++++++++- .../task/impl/TaskTaskServiceImpl.java | 17 ++++++++++++++--- 3 files changed, 46 insertions(+), 5 deletions(-) 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 89cb7739..f164642f 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 @@ -627,13 +627,30 @@ public class FaceServiceImpl implements FaceService { .filter(item -> Integer.valueOf(2).equals(item.getType())) .count(); + List faceSampleList = faceRepository.getFaceSampleList(faceId); + if (faceSampleList.isEmpty()) { + log.info("faceId:{} sample list not exist", faceId); + return; + } + List faceSampleIds = faceSampleList.stream() + .collect(Collectors.groupingBy(FaceSampleEntity::getDeviceId)) + .entrySet() + .stream().flatMap(entry -> { + DeviceConfigManager configManager = deviceRepository.getDeviceConfigManager(entry.getKey()); + if (configManager.getInteger("limit_video", 0) > 0) { + return entry.getValue().subList(0, Math.min(entry.getValue().size(), configManager.getInteger("limit_video", 0))).stream(); + } + return entry.getValue().stream(); + }).toList() + .stream().map(FaceSampleEntity::getId).toList(); + log.info("视频切分任务: faceId={}, 原始数量={}, 筛选后数量={}", faceId, sampleListIds.size(), faceSampleIds.size()); log.debug("视频重切逻辑:视频数量 {}, 照片数量 {}", videoCount, photoCount); // 只有照片数量大于视频数量时才创建重切任务 if (photoCount > videoCount) { VideoPieceGetter.Task task = new VideoPieceGetter.Task(); task.faceId = faceId; - task.faceSampleIds = sampleListIds; + task.faceSampleIds = faceSampleIds; task.templateId = null; task.memberId = memberId; task.callback = () -> { 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 c6913674..e9412974 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 @@ -164,9 +164,22 @@ public class TaskFaceServiceImpl implements TaskFaceService { log.warn("没有有效的关联关系可创建: faceId={}, 原始数量={}", faceId, memberSourceEntityList.size()); } memberRelationRepository.clearSCacheByFace(faceId); + List faceSampleList = faceRepository.getFaceSampleList(faceId); + List faceSampleIds = faceSampleList.stream() + .collect(Collectors.groupingBy(FaceSampleEntity::getDeviceId)) + .entrySet() + .stream().flatMap(entry -> { + DeviceConfigManager configManager = deviceRepository.getDeviceConfigManager(entry.getKey()); + if (configManager.getInteger("limit_video", 0) > 0) { + return entry.getValue().subList(0, Math.min(entry.getValue().size(), configManager.getInteger("limit_video", 0))).stream(); + } + return entry.getValue().stream(); + }).toList() + .stream().map(FaceSampleEntity::getId).toList(); + log.info("视频切分任务: faceId={}, 原始数量={}, 筛选后数量={}", faceId, sampleListIds.size(), faceSampleIds.size()); VideoPieceGetter.Task task = new VideoPieceGetter.Task(); task.faceId = faceEntity.getId(); - task.faceSampleIds = sampleListIds; + task.faceSampleIds = faceSampleIds; task.memberId = face.getMemberId(); VideoPieceGetter.addTask(task); } 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 cff618c2..49f1c353 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 @@ -255,7 +255,7 @@ public class TaskTaskServiceImpl implements TaskService { @Override public void autoCreateTaskByFaceId(Long faceId) { - FaceRespVO faceRespVO = faceMapper.getById(faceId); + FaceEntity faceRespVO = faceRepository.getFace(faceId); if (faceRespVO == null) { log.info("faceId:{} is not exist", faceId); return; @@ -264,18 +264,28 @@ public class TaskTaskServiceImpl implements TaskService { log.info("faceId:{} matchSampleIds is empty", faceId); return; } - List faceSampleList = faceSampleMapper.listByIds(Arrays.stream(faceRespVO.getMatchSampleIds().split(",")).filter(StringUtils::isNumeric).map(Long::valueOf).collect(Collectors.toList())); + List faceSampleList = faceRepository.getFaceSampleList(faceId); if (faceSampleList.isEmpty()) { log.info("faceId:{} faceSampleList is empty", faceId); return; } + List faceSampleIds = faceSampleList.stream().collect(Collectors.groupingBy(FaceSampleEntity::getDeviceId)).entrySet() + .stream().flatMap(entry -> { + DeviceConfigManager configManager = deviceRepository.getDeviceConfigManager(entry.getKey()); + if (configManager.getInteger("limit_video", 0) > 0) { + return entry.getValue().subList(0, Math.min(entry.getValue().size(), configManager.getInteger("limit_video", 0))).stream(); + } + return entry.getValue().stream(); + }).toList() + .stream().map(FaceSampleEntity::getId).toList(); + log.info("视频切分任务: faceId={}, 原始数量={}, 筛选后数量={}", faceId, faceSampleList.size(), faceSampleIds.size()); ScenicConfigManager scenicConfig = scenicRepository.getScenicConfigManager(faceRespVO.getScenicId()); List templateList = templateRepository.getTemplateListByScenicId(faceRespVO.getScenicId()); if (templateList == null || templateList.isEmpty()) { // 没有vlog视频的情况下 VideoPieceGetter.Task task = new VideoPieceGetter.Task(); task.faceId = faceId; - task.faceSampleIds = faceSampleList.stream().map(FaceSampleEntity::getId).toList(); + task.faceSampleIds = faceSampleIds; task.templateId = null; task.memberId = faceRespVO.getMemberId(); task.callback = () -> { @@ -343,6 +353,7 @@ public class TaskTaskServiceImpl implements TaskService { return entry.getValue().stream(); }).toList() .stream().map(FaceSampleEntity::getId).collect(Collectors.toList()); + log.info("视频切分任务: faceId={}, 原始数量={}, 筛选后数量={}", faceId, faceSampleList.size(), faceSampleIds.size()); List sourceList = sourceMapper.listVideoByScenicFaceRelation(face.getScenicId(), faceId); VideoPieceGetter.Task task = new VideoPieceGetter.Task(); task.faceId = faceId;