From becbe5f6abe71b692e057c1b3ee9a96c2eb488d3 Mon Sep 17 00:00:00 2001 From: Jerry Yan <792602257@qq.com> Date: Wed, 24 Sep 2025 05:03:47 +0800 Subject: [PATCH] =?UTF-8?q?=E5=85=81=E8=AE=B8=E9=87=8D=E5=A4=8D?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../java/com/ycwl/basic/biz/TemplateBiz.java | 45 +++++++++++++++---- 1 file changed, 37 insertions(+), 8 deletions(-) diff --git a/src/main/java/com/ycwl/basic/biz/TemplateBiz.java b/src/main/java/com/ycwl/basic/biz/TemplateBiz.java index 11de4d0c..6005bd4c 100644 --- a/src/main/java/com/ycwl/basic/biz/TemplateBiz.java +++ b/src/main/java/com/ycwl/basic/biz/TemplateBiz.java @@ -132,6 +132,7 @@ public class TemplateBiz { log.info("filterTaskParams: templateId:{} has no placeholders", templateId); return Map.of(); } + TemplateConfigEntity templateConfig = templateRepository.getTemplateConfig(templateId); // 统计每个 placeholder 在模板中出现的次数 Map placeholderCounts = templatePlaceholders.stream() @@ -142,6 +143,9 @@ public class TemplateBiz { Map> filteredParams = new HashMap<>(); + // 判断是否允许片段重复 + boolean allowDuplicate = templateConfig != null && Integer.valueOf(1).equals(templateConfig.getDuplicateEnable()); + for (Map.Entry entry : placeholderCounts.entrySet()) { String placeholder = entry.getKey(); Long requiredCount = entry.getValue(); @@ -151,28 +155,53 @@ public class TemplateBiz { String imageKey = placeholder; if (allTaskParams.containsKey(imageKey)) { List allSources = allTaskParams.get(imageKey); - int actualCount = Math.min(requiredCount.intValue(), allSources.size()); - List selectedSources = allSources.subList(0, actualCount); - filteredParams.put(imageKey, new ArrayList<>(selectedSources)); + List selectedSources = selectSources(allSources, requiredCount.intValue(), allowDuplicate); + if (!selectedSources.isEmpty()) { + filteredParams.put(imageKey, selectedSources); + } } } else { // 视频源:占位符直接对应设备ID String videoKey = placeholder; if (allTaskParams.containsKey(videoKey)) { List allSources = allTaskParams.get(videoKey); - int actualCount = Math.min(requiredCount.intValue(), allSources.size()); - List selectedSources = allSources.subList(0, actualCount); - filteredParams.put(videoKey, new ArrayList<>(selectedSources)); + List selectedSources = selectSources(allSources, requiredCount.intValue(), allowDuplicate); + if (!selectedSources.isEmpty()) { + filteredParams.put(videoKey, selectedSources); + } } } } - log.debug("filterTaskParams: templateId:{}, original keys:{}, filtered keys:{}, placeholder counts:{}", - templateId, allTaskParams.keySet().size(), filteredParams.keySet().size(), placeholderCounts); + log.debug("filterTaskParams: templateId:{}, original keys:{}, filtered keys:{}, placeholder counts:{}, allowDuplicate:{}", + templateId, allTaskParams.keySet().size(), filteredParams.keySet().size(), placeholderCounts, allowDuplicate); return filteredParams; } + private List selectSources(List allSources, int requiredCount, boolean allowDuplicate) { + if (allSources == null || allSources.isEmpty()) { + return new ArrayList<>(); + } + + if (!allowDuplicate) { + // 不允许重复,使用原有逻辑 + int actualCount = Math.min(requiredCount, allSources.size()); + return new ArrayList<>(allSources.subList(0, actualCount)); + } + + // 允许重复,循环填充到所需数量 + List selectedSources = new ArrayList<>(); + int sourceIndex = 0; + + for (int i = 0; i < requiredCount; i++) { + selectedSources.add(allSources.get(sourceIndex)); + sourceIndex = (sourceIndex + 1) % allSources.size(); + } + + return selectedSources; + } + public Long findFirstAvailableTemplate(List templateIds, Long faceId, boolean scanSource) { if (templateIds == null || templateIds.isEmpty() || faceId == null) { return null;