From cce0b45e700830e26fe314fe5af9164c31e34e5e Mon Sep 17 00:00:00 2001 From: Jerry Yan <792602257@qq.com> Date: Mon, 15 Sep 2025 22:17:38 +0800 Subject: [PATCH] =?UTF-8?q?refactor(task):=20=E9=87=8D=E6=9E=84=E4=BB=BB?= =?UTF-8?q?=E5=8A=A1=E5=8F=82=E6=95=B0=E5=A4=84=E7=90=86=E9=80=BB=E8=BE=91?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - 新增 filterTaskParams 方法,用于过滤模板所需的源数据 - 新增 getTaskParams 方法,用于获取任务参数并进行预处理 - 优化了视频源和图片源的处理逻辑,提高了代码可读性和可维护性 - 重构了任务回调中的源数据处理流程,使用新方法替代原有逻辑 --- .../java/com/ycwl/basic/biz/TemplateBiz.java | 37 ++++++++++ .../basic/repository/SourceRepository.java | 68 +++++++++++++++++++ .../task/impl/TaskTaskServiceImpl.java | 58 +++------------- 3 files changed, 114 insertions(+), 49 deletions(-) diff --git a/src/main/java/com/ycwl/basic/biz/TemplateBiz.java b/src/main/java/com/ycwl/basic/biz/TemplateBiz.java index c9734b71..1cbf6894 100644 --- a/src/main/java/com/ycwl/basic/biz/TemplateBiz.java +++ b/src/main/java/com/ycwl/basic/biz/TemplateBiz.java @@ -15,7 +15,9 @@ import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Component; import java.util.Arrays; +import java.util.HashMap; import java.util.List; +import java.util.Map; import java.util.Objects; import java.util.concurrent.atomic.AtomicInteger; import java.util.stream.Collectors; @@ -121,4 +123,39 @@ public class TemplateBiz { return count >= minimalPlaceholderFill; } + public Map> filterTaskParams(Long templateId, Map> allTaskParams) { + if (allTaskParams == null || allTaskParams.isEmpty()) { + return Map.of(); + } + + List templatePlaceholders = templateRepository.getTemplatePlaceholder(templateId); + if (templatePlaceholders == null || templatePlaceholders.isEmpty()) { + log.info("filterTaskParams: templateId:{} has no placeholders", templateId); + return Map.of(); + } + + Map> filteredParams = new HashMap<>(); + + for (String placeholder : templatePlaceholders) { + if (placeholder.startsWith("P")) { + // 图片源:占位符格式为 "P{deviceId}" + String imageKey = placeholder; + if (allTaskParams.containsKey(imageKey)) { + filteredParams.put(imageKey, allTaskParams.get(imageKey)); + } + } else { + // 视频源:占位符直接对应设备ID + String videoKey = placeholder; + if (allTaskParams.containsKey(videoKey)) { + filteredParams.put(videoKey, allTaskParams.get(videoKey)); + } + } + } + + log.info("filterTaskParams: templateId:{}, original keys:{}, filtered keys:{}", + templateId, allTaskParams.keySet().size(), filteredParams.keySet().size()); + + return filteredParams; + } + } diff --git a/src/main/java/com/ycwl/basic/repository/SourceRepository.java b/src/main/java/com/ycwl/basic/repository/SourceRepository.java index b0965dd9..27b40ec0 100644 --- a/src/main/java/com/ycwl/basic/repository/SourceRepository.java +++ b/src/main/java/com/ycwl/basic/repository/SourceRepository.java @@ -4,6 +4,7 @@ import com.ycwl.basic.mapper.SourceMapper; import com.ycwl.basic.model.pc.face.entity.FaceEntity; import com.ycwl.basic.model.pc.source.entity.MemberSourceEntity; import com.ycwl.basic.model.pc.source.entity.SourceEntity; +import com.ycwl.basic.model.pc.device.entity.DeviceEntity; import com.ycwl.basic.pricing.dto.VoucherInfo; import com.ycwl.basic.pricing.enums.VoucherDiscountType; import com.ycwl.basic.pricing.service.IVoucherService; @@ -13,7 +14,9 @@ import org.springframework.data.redis.core.RedisTemplate; import org.springframework.stereotype.Component; import java.util.List; +import java.util.Map; import java.util.Objects; +import java.util.stream.Collectors; @Slf4j @Component @@ -26,6 +29,10 @@ public class SourceRepository { private IVoucherService iVoucherService; @Autowired private FaceRepository faceRepository; + @Autowired + private TemplateRepository templateRepository; + @Autowired + private DeviceRepository deviceRepository; public void addSource(SourceEntity source) { sourceMapper.add(source); @@ -86,4 +93,65 @@ public class SourceRepository { public SourceEntity getSource(Long id) { return sourceMapper.getEntity(id); } + + public Map> getTaskParams(Long faceId, Long templateId) { + FaceEntity face = faceRepository.getFace(faceId); + if (face == null) { + log.info("getTaskParams: faceId:{} is not exist", faceId); + return Map.of(); + } + + List videoSourceList = sourceMapper.listVideoByScenicFaceRelation(face.getScenicId(), faceId); + Map> sourcesMap = videoSourceList.stream() + .peek(item -> item.setUrl(item.getVideoUrl())) + .filter(item -> item.getDeviceId() != null) + .filter(item -> { + DeviceEntity device = deviceRepository.getDevice(item.getDeviceId()); + if (device == null) { + log.info("getTaskParams: deviceId:{} is not exist", item.getDeviceId()); + return false; + } + return Integer.valueOf(1).equals(device.getStatus()); + }) + .collect(Collectors.groupingBy(item -> item.getDeviceId().toString())); + + if (sourcesMap.isEmpty()) { + log.info("getTaskParams: 没有视频源,templateId: {}", templateId); + return Map.of(); + } + + List templatePlaceholder = templateRepository.getTemplatePlaceholder(templateId); + if (templatePlaceholder.stream().distinct().count() == templatePlaceholder.size()) { + sourcesMap.forEach((key, value) -> { + value.removeIf(item -> !value.getFirst().equals(item)); + }); + } + + boolean hasPPlaceholder = templatePlaceholder.stream().anyMatch(placeholder -> placeholder.startsWith("P")); + if (hasPPlaceholder) { + List imageSourceList = sourceMapper.listImageSourcesByFaceId(faceId); + if (!imageSourceList.isEmpty()) { + Map> imageSourceMap = imageSourceList.stream() + .peek(item -> item.setUrl(item.getUrl())) + .filter(item -> item.getDeviceId() != null) + .filter(item -> { + DeviceEntity device = deviceRepository.getDevice(item.getDeviceId()); + if (device == null) { + return false; + } + return Integer.valueOf(1).equals(device.getStatus()); + }) + .collect(Collectors.groupingBy(item -> "P" + item.getDeviceId().toString())); + + imageSourceMap.forEach((key, value) -> { + sourcesMap.merge(key, value, (existing, replacement) -> { + existing.addAll(replacement); + return existing; + }); + }); + } + } + + return sourcesMap; + } } 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 b6cc0d3f..d826d91c 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 @@ -5,6 +5,7 @@ import cn.hutool.crypto.digest.MD5; import com.ycwl.basic.integration.common.manager.DeviceConfigManager; import com.ycwl.basic.integration.common.manager.RenderWorkerConfigManager; import com.ycwl.basic.integration.common.manager.ScenicConfigManager; +import com.ycwl.basic.repository.SourceRepository; import com.ycwl.basic.utils.JacksonUtil; import com.ycwl.basic.biz.OrderBiz; import com.ycwl.basic.biz.TaskStatusBiz; @@ -126,6 +127,8 @@ public class TaskTaskServiceImpl implements TaskService { private VideoReUploader videoReUploader; @Autowired private RedisTemplate redisTemplate; + @Autowired + private SourceRepository sourceRepository; private RenderWorkerEntity getWorker(@NonNull WorkerAuthReqVo req) { String accessKey = req.getAccessKey(); @@ -348,58 +351,15 @@ public class TaskTaskServiceImpl implements TaskService { } } - List videoSourceList = sourceMapper.listVideoByScenicFaceRelation(face.getScenicId(), faceId); - Map> sourcesMap = videoSourceList.stream() - .peek(item -> item.setUrl(item.getVideoUrl())) - .filter(item -> item.getDeviceId() != null) // 添加对 deviceId 为 null 的检查 - .filter(item -> { - DeviceEntity device = deviceRepository.getDevice(item.getDeviceId()); - if (device == null) { - log.info("task callback: deviceId:{} is not exist", item.getDeviceId()); - return false; - } - return Integer.valueOf(1).equals(device.getStatus()); - }) - .collect(Collectors.groupingBy(item -> item.getDeviceId().toString())); - if (sourcesMap.isEmpty()) { - // 主动禁止没有视频源视频生成 - log.info("task callback: 没有视频源,templateId: {}", templateId); + Map> allTaskParams = sourceRepository.getTaskParams(faceId, templateId); + if (allTaskParams.isEmpty()) { return; } - List templatePlaceholder = templateRepository.getTemplatePlaceholder(templateId); - if (templatePlaceholder.stream().distinct().count() == templatePlaceholder.size()) { - sourcesMap.forEach((key, value) -> { - // 每个value只保留第一个 - value.removeIf(item -> !value.getFirst().equals(item)); - }); - } - // 处理以P开头的templatePlaceHolder,添加type=2的source - boolean hasPPlaceholder = templatePlaceholder.stream().anyMatch(placeholder -> placeholder.startsWith("P")); - if (hasPPlaceholder) { - List imageSourceList = sourceMapper.listImageSourcesByFaceId(faceId); - if (!imageSourceList.isEmpty()) { - // 将图片source按设备ID分组并添加到sourcesMap中 - Map> imageSourceMap = imageSourceList.stream() - .peek(item -> item.setUrl(item.getUrl())) // 图片使用url字段 - .filter(item -> item.getDeviceId() != null) - .filter(item -> { - DeviceEntity device = deviceRepository.getDevice(item.getDeviceId()); - if (device == null) { - return false; - } - return Integer.valueOf(1).equals(device.getStatus()); - }) - .collect(Collectors.groupingBy(item -> Strings.concat("P", item.getDeviceId().toString()))); - - // 合并到现有的sourcesMap中 - imageSourceMap.forEach((key, value) -> { - sourcesMap.merge(key, value, (existing, replacement) -> { - existing.addAll(replacement); - return existing; - }); - }); - } + Map> sourcesMap = templateBiz.filterTaskParams(templateId, allTaskParams); + if (sourcesMap.isEmpty()) { + log.info("task callback: 筛选后无有效源数据,templateId: {}", templateId); + return; } TaskReqQuery taskReqQuery = new TaskReqQuery(); taskReqQuery.setFaceId(faceId);