From 3a3638295b6894de32c038aba25201741bc6c89c Mon Sep 17 00:00:00 2001
From: sion123 <450702724@qq.com>
Date: Wed, 3 Jun 2026 22:19:03 +0800
Subject: [PATCH] =?UTF-8?q?refactor(tik):=20=E6=8A=BD=E5=8F=96=20ICE=20SDK?=
=?UTF-8?q?=20=E8=B0=83=E7=94=A8=E5=88=B0=E7=BB=9F=E4=B8=80=E5=AE=A2?=
=?UTF-8?q?=E6=88=B7=E7=AB=AF=E5=B1=82?=
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit
将 `BatchProduceAlignment` 中的 ICE `Client` 初始化与 API 调用逻辑抽离到 `IceClient`,
作为项目中唯一 ICE SDK 入口,避免各业务类自行创建客户端实例。
主要变更:
- `IceClient`:重构为最终的统一封装入口,支持懒加载 + 线程安全 Client 创建,
新增 `submitJob(SubmitMediaProducingJobRequest)` 和 `getJobStatus()` 方法,
保留旧方法标记为 `@Deprecated` 以兼容存量调用。
- `BatchProduceAlignment`:移除内部 `initClient()` 与直接 SDK 调用,全部委托 `IceClient`;
同时重构 Timeline 构建逻辑,提取 `buildOutputPath()` 等工具方法,
并补充 Javadoc 架构说明。
- `MixTaskServiceImpl`:同步使用 `iceClient.getJobStatus()` 替代已废弃的旧方法名。
---
.../tik/media/BatchProduceAlignment.java | 357 ++++++------------
.../module/tik/mix/client/IceClient.java | 135 ++++---
.../tik/mix/service/MixTaskServiceImpl.java | 2 +-
3 files changed, 217 insertions(+), 277 deletions(-)
diff --git a/yudao-module-tik/src/main/java/cn/iocoder/yudao/module/tik/media/BatchProduceAlignment.java b/yudao-module-tik/src/main/java/cn/iocoder/yudao/module/tik/media/BatchProduceAlignment.java
index 4cf95ae3b3..ff7906d949 100644
--- a/yudao-module-tik/src/main/java/cn/iocoder/yudao/module/tik/media/BatchProduceAlignment.java
+++ b/yudao-module-tik/src/main/java/cn/iocoder/yudao/module/tik/media/BatchProduceAlignment.java
@@ -2,13 +2,11 @@ package cn.iocoder.yudao.module.tik.media;
import cn.iocoder.yudao.module.infra.api.file.FileApi;
import cn.iocoder.yudao.module.tik.file.service.TikOssInitService;
+import cn.iocoder.yudao.module.tik.mix.client.IceClient;
import cn.iocoder.yudao.module.tik.mix.config.IceProperties;
import com.alibaba.fastjson.JSONArray;
import com.alibaba.fastjson.JSONObject;
-import com.aliyun.ice20201109.Client;
import com.aliyun.ice20201109.models.*;
-import com.aliyun.teaopenapi.models.Config;
-import lombok.RequiredArgsConstructor;
import lombok.extern.slf4j.Slf4j;
import org.springframework.stereotype.Component;
@@ -16,301 +14,162 @@ import cn.iocoder.yudao.module.tik.mix.vo.MixTaskSaveReqVO;
import java.util.*;
-// 成功视频
-// http://oushu-test-shanghai.oss-cn-shanghai.aliyuncs.com/ice_output/46b29eb5775f4f758846171ab79bfca7.mp4
-
/**
- * 需要maven引入二方包依赖:
- *
+ * 职责:将素材列表构建为 ICE Timeline JSON,委托 {@link IceClient} 提交任务。 + *
+ * 架构原则: + *
+ * 设计原则: + *
+ * 供 {@link cn.iocoder.yudao.module.tik.media.BatchProduceAlignment} 等 + * 需要自定义 Timeline 构建逻辑的上层组件调用。 + * + * @param request 已填充 timeline 和 outputMediaConfig 的请求对象 + * @return ICE 任务 ID(jobId) */ - public String submitMediaProducingJob(String timeline, String outputMediaConfig) { + public String submitJob(SubmitMediaProducingJobRequest request) { try { - Client client = getClient(); - SubmitMediaProducingJobRequest request = new SubmitMediaProducingJobRequest(); - request.setTimeline(timeline); - request.setOutputMediaConfig(outputMediaConfig); - - SubmitMediaProducingJobResponse response = client.submitMediaProducingJob(request); + SubmitMediaProducingJobResponse response = getClient().submitMediaProducingJob(request); String jobId = response.getBody().getJobId(); - - log.info("[ICE][提交任务成功][jobId={}]", jobId); + log.info("[ICE][提交成功] jobId={}", jobId); return jobId; - } catch (Exception e) { - log.error("[ICE][提交任务失败]", e); + log.error("[ICE][提交失败]", e); throw exception0(VOICE_TTS_FAILED.getCode(), "ICE 提交任务失败: " + e.getMessage()); } } /** - * 查询媒体制作任务状态 + * 提交媒体制作任务(便捷方法,接受字符串参数) + * + * @param timeline 时间线 JSON + * @param outputMediaConfig 输出媒体配置 JSON + * @return ICE 任务 ID(jobId) */ - public String getMediaProducingJobStatus(String jobId) { + public String submitJob(String timeline, String outputMediaConfig) { + SubmitMediaProducingJobRequest request = new SubmitMediaProducingJobRequest(); + request.setTimeline(timeline); + request.setOutputMediaConfig(outputMediaConfig); + return submitJob(request); + } + + /** + * 查询媒体制作任务状态 + * + * @param jobId ICE 任务 ID + * @return 任务状态:Success / Failed / Running / Pending 等 + */ + public String getJobStatus(String jobId) { try { - Client client = getClient(); GetMediaProducingJobRequest request = new GetMediaProducingJobRequest(); request.setJobId(jobId); - GetMediaProducingJobResponse response = client.getMediaProducingJob(request); + GetMediaProducingJobResponse response = getClient().getMediaProducingJob(request); String status = response.getBody().getMediaProducingJob().getStatus(); - log.debug("[ICE][查询任务状态][jobId={}, status={}]", jobId, status); + log.debug("[ICE][状态查询] jobId={}, status={}", jobId, status); return status; } catch (Exception e) { - log.error("[ICE][查询任务状态失败][jobId={}]", jobId, e); + log.error("[ICE][状态查询失败] jobId={}", jobId, e); throw exception0(VOICE_TTS_FAILED.getCode(), "ICE 查询任务状态失败: " + e.getMessage()); } } + + /* ════════════════════════════════════════════════════════════════════════════ + * 历史兼容方法(逐步废弃) + * ════════════════════════════════════════════════════════════════════════════ */ + + /** + * @deprecated 请使用 {@link #submitJob(String, String)} + */ + @Deprecated + public String submitMediaProducingJob(String timeline, String outputMediaConfig) { + return submitJob(timeline, outputMediaConfig); + } + + /** + * @deprecated 请使用 {@link #getJobStatus(String)} + */ + @Deprecated + public String getMediaProducingJobStatus(String jobId) { + return getJobStatus(jobId); + } } diff --git a/yudao-module-tik/src/main/java/cn/iocoder/yudao/module/tik/mix/service/MixTaskServiceImpl.java b/yudao-module-tik/src/main/java/cn/iocoder/yudao/module/tik/mix/service/MixTaskServiceImpl.java index 69d2fe08c1..ff5a0cf61f 100644 --- a/yudao-module-tik/src/main/java/cn/iocoder/yudao/module/tik/mix/service/MixTaskServiceImpl.java +++ b/yudao-module-tik/src/main/java/cn/iocoder/yudao/module/tik/mix/service/MixTaskServiceImpl.java @@ -384,7 +384,7 @@ public class MixTaskServiceImpl implements MixTaskService { for (String jobId : jobIds) { try { - String status = iceClient.getMediaProducingJobStatus(jobId); + String status = iceClient.getJobStatus(jobId); log.debug("[MixTask][jobId状态] taskId={}, jobId={}, status={}", taskId, jobId, status); if ("Success".equalsIgnoreCase(status)) { successJobIds.add(jobId);