You've already forked FrameTour-BE
feat(task):优化设备照片数量限制逻辑
- 新增根据样本数量与限制关系的多种处理策略 - 实现去首尾和去尾部的样本筛选逻辑 - 添加按创建时间排序和恢复原始排序的功能 -重构代码结构,提取处理逻辑到独立方法 - 更新日志记录以反映新的处理流程 - 使用 toList() 替代 collect(Collectors.toList()) 提升可读性
This commit is contained in:
@@ -518,23 +518,42 @@ public class TaskFaceServiceImpl implements TaskFaceService {
|
||||
if (limitPhoto == null || limitPhoto <= 0) {
|
||||
List<Long> deviceSampleIds = deviceSamples.stream()
|
||||
.map(FaceSampleEntity::getId)
|
||||
.collect(Collectors.toList());
|
||||
.toList();
|
||||
resultIds.addAll(deviceSampleIds);
|
||||
log.debug("设备照片限制:设备ID={}, 无限制,保留{}张照片",
|
||||
deviceId, deviceSampleIds.size());
|
||||
} else {
|
||||
// 取前N张
|
||||
List<FaceSampleEntity> limitedSamples = deviceSamples.stream()
|
||||
.limit(limitPhoto)
|
||||
.collect(Collectors.toList());
|
||||
|
||||
List<Long> limitedIds = limitedSamples.stream()
|
||||
.map(FaceSampleEntity::getId)
|
||||
.collect(Collectors.toList());
|
||||
|
||||
resultIds.addAll(limitedIds);
|
||||
log.debug("设备照片限制:设备ID={}, 限制={}张, 原始{}张,最终{}张",
|
||||
deviceId, limitPhoto, deviceSamples.size(), limitedIds.size());
|
||||
// 根据样本数量与限制的关系进行不同处理
|
||||
if (deviceSamples.size() > (limitPhoto + 2)) {
|
||||
// 样本数大于(limit_photo+2)时,去掉首尾
|
||||
List<Long> limitedIds = processDeviceSamples(deviceSamples, limitPhoto, true);
|
||||
resultIds.addAll(limitedIds);
|
||||
log.debug("设备照片限制:设备ID={}, 限制={}张, 原始{}张,去首尾后最终{}张",
|
||||
deviceId, limitPhoto, deviceSamples.size(), limitedIds.size());
|
||||
} else if (deviceSamples.size() > (limitPhoto + 1)) {
|
||||
// 样本数大于(limit_photo+1)时,去掉尾部
|
||||
List<Long> limitedIds = processDeviceSamples(deviceSamples, limitPhoto, false);
|
||||
resultIds.addAll(limitedIds);
|
||||
log.debug("设备照片限制:设备ID={}, 限制={}张, 原始{}张,去尾部后最终{}张",
|
||||
deviceId, limitPhoto, deviceSamples.size(), limitedIds.size());
|
||||
} else if (deviceSamples.size() > limitPhoto) {
|
||||
// 样本数大于limit_photo但小于等于(limit_photo+1),取前N张
|
||||
List<Long> limitedIds = deviceSamples.stream()
|
||||
.limit(limitPhoto)
|
||||
.map(FaceSampleEntity::getId)
|
||||
.toList();
|
||||
resultIds.addAll(limitedIds);
|
||||
log.debug("设备照片限制:设备ID={}, 限制={}张, 原始{}张,取前{}张",
|
||||
deviceId, limitPhoto, deviceSamples.size(), limitedIds.size());
|
||||
} else {
|
||||
// 样本数小于等于limit_photo,不做操作
|
||||
List<Long> limitedIds = deviceSamples.stream()
|
||||
.map(FaceSampleEntity::getId)
|
||||
.toList();
|
||||
resultIds.addAll(limitedIds);
|
||||
log.debug("设备照片限制:设备ID={}, 限制={}张, 原始{}张,无需筛选,保留全部",
|
||||
deviceId, limitPhoto, deviceSamples.size());
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@@ -543,4 +562,48 @@ public class TaskFaceServiceImpl implements TaskFaceService {
|
||||
|
||||
return resultIds;
|
||||
}
|
||||
|
||||
/**
|
||||
* 处理设备样本,根据参数决定是否去掉首尾
|
||||
*
|
||||
* @param deviceSamples 设备样本列表
|
||||
* @param limitPhoto 限制数量
|
||||
* @param removeBoth 是否去掉首尾,true去掉首尾,false只去掉尾部
|
||||
* @return 处理后的样本ID列表
|
||||
*/
|
||||
private List<Long> processDeviceSamples(List<FaceSampleEntity> deviceSamples, int limitPhoto, boolean removeBoth) {
|
||||
// 创建原始排序的索引映射,用于后续恢复排序
|
||||
Map<Long, Integer> originalIndexMap = new HashMap<>();
|
||||
for (int i = 0; i < deviceSamples.size(); i++) {
|
||||
originalIndexMap.put(deviceSamples.get(i).getId(), i);
|
||||
}
|
||||
|
||||
// 按创建时间排序
|
||||
List<FaceSampleEntity> sortedByCreateTime = deviceSamples.stream()
|
||||
.sorted(Comparator.comparing(FaceSampleEntity::getCreateAt))
|
||||
.toList();
|
||||
|
||||
// 根据参数决定去掉首尾还是只去掉尾部
|
||||
List<FaceSampleEntity> filteredSamples;
|
||||
if (removeBoth && sortedByCreateTime.size() > 2) {
|
||||
// 去掉首尾
|
||||
filteredSamples = sortedByCreateTime.subList(1, sortedByCreateTime.size() - 1);
|
||||
} else if (!removeBoth && sortedByCreateTime.size() > 1) {
|
||||
// 只去掉尾部(最新的)
|
||||
filteredSamples = sortedByCreateTime.subList(0, sortedByCreateTime.size() - 1);
|
||||
} else {
|
||||
// 样本数量不足,无法去掉
|
||||
filteredSamples = sortedByCreateTime;
|
||||
}
|
||||
|
||||
// 恢复原排序并取限制数量
|
||||
List<FaceSampleEntity> finalSamples = filteredSamples.stream()
|
||||
.sorted(Comparator.comparing(sample -> originalIndexMap.get(sample.getId())))
|
||||
.limit(limitPhoto)
|
||||
.toList();
|
||||
|
||||
return finalSamples.stream()
|
||||
.map(FaceSampleEntity::getId)
|
||||
.toList();
|
||||
}
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user