diff --git a/src/main/java/com/ycwl/basic/biz/TemplateBiz.java b/src/main/java/com/ycwl/basic/biz/TemplateBiz.java index 1cbf6894..3c22c7de 100644 --- a/src/main/java/com/ycwl/basic/biz/TemplateBiz.java +++ b/src/main/java/com/ycwl/basic/biz/TemplateBiz.java @@ -14,6 +14,7 @@ import lombok.extern.slf4j.Slf4j; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Component; +import java.util.ArrayList; import java.util.Arrays; import java.util.HashMap; import java.util.List; @@ -134,26 +135,42 @@ public class TemplateBiz { return Map.of(); } + // 统计每个 placeholder 在模板中出现的次数 + Map placeholderCounts = templatePlaceholders.stream() + .collect(Collectors.groupingBy( + placeholder -> placeholder, + Collectors.counting() + )); + Map> filteredParams = new HashMap<>(); - for (String placeholder : templatePlaceholders) { + for (Map.Entry entry : placeholderCounts.entrySet()) { + String placeholder = entry.getKey(); + Long requiredCount = entry.getValue(); + if (placeholder.startsWith("P")) { // 图片源:占位符格式为 "P{deviceId}" String imageKey = placeholder; if (allTaskParams.containsKey(imageKey)) { - filteredParams.put(imageKey, allTaskParams.get(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)); } } else { // 视频源:占位符直接对应设备ID String videoKey = placeholder; if (allTaskParams.containsKey(videoKey)) { - filteredParams.put(videoKey, allTaskParams.get(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)); } } } - log.info("filterTaskParams: templateId:{}, original keys:{}, filtered keys:{}", - templateId, allTaskParams.keySet().size(), filteredParams.keySet().size()); + log.info("filterTaskParams: templateId:{}, original keys:{}, filtered keys:{}, placeholder counts:{}", + templateId, allTaskParams.keySet().size(), filteredParams.keySet().size(), placeholderCounts); return filteredParams; }