From 72855344053f5078804fe90c14726e627be2b5f1 Mon Sep 17 00:00:00 2001
From: shenaowei <450702724@qq.com>
Date: Wed, 25 Feb 2026 01:24:57 +0800
Subject: [PATCH] =?UTF-8?q?feat:=20=E7=83=AD=E7=82=B9=E6=94=B9=E8=BF=9B?=
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit
---
frontend/app/web-gold/src/api/forecast.js | 75 ++++
.../web-gold/src/views/trends/Forecast.vue | 373 ++++++++++++------
.../module/tik/dify/client/DifyClient.java | 49 +++
.../dify/controller/AppDifyController.java | 11 +
.../module/tik/dify/service/DifyService.java | 10 +
.../tik/dify/service/DifyServiceImpl.java | 108 +++++
.../tik/dify/vo/ForecastRewriteReqVO.java | 29 ++
.../module/tik/enums/AiModelTypeEnum.java | 4 +
8 files changed, 537 insertions(+), 122 deletions(-)
create mode 100644 frontend/app/web-gold/src/api/forecast.js
create mode 100644 yudao-module-tik/src/main/java/cn/iocoder/yudao/module/tik/dify/vo/ForecastRewriteReqVO.java
diff --git a/frontend/app/web-gold/src/api/forecast.js b/frontend/app/web-gold/src/api/forecast.js
new file mode 100644
index 0000000000..bf19faf032
--- /dev/null
+++ b/frontend/app/web-gold/src/api/forecast.js
@@ -0,0 +1,75 @@
+/**
+ * Forecast 文案改写 API
+ */
+import { fetchEventSource } from '@microsoft/fetch-event-source'
+import tokenManager from '@gold/utils/token-manager'
+import { API_BASE } from '@gold/config/api'
+
+const BASE_URL = `${API_BASE.APP_TIK}`
+
+/**
+ * 流式文案改写(SSE)
+ * @param {Object} options - 请求配置
+ * @param {number} options.agentId - 智能体ID
+ * @param {string} options.userText - 用户输入文案
+ * @param {number} [options.level] - 改写级别/强度
+ * @param {string} [options.modelType] - 模型类型:forecast_standard/forecast_meiju
+ * @param {AbortController} [options.ctrl] - 取消控制器
+ * @param {Function} options.onMessage - 消息回调
+ * @param {Function} [options.onError] - 错误回调
+ * @param {Function} [options.onClose] - 关闭回调
+ */
+export async function rewriteStream(options) {
+ const {
+ agentId,
+ userText,
+ level = 50,
+ modelType = 'forecast_standard',
+ ctrl,
+ onMessage,
+ onError,
+ onClose
+ } = options || {}
+
+ const token = tokenManager.getAccessToken()
+
+ return fetchEventSource(`${BASE_URL}/dify/forecast/rewrite`, {
+ method: 'post',
+ headers: {
+ 'Content-Type': 'application/json',
+ 'Authorization': `Bearer ${token}`,
+ 'tenant-id': import.meta.env?.VITE_TENANT_ID
+ },
+ openWhenHidden: true,
+ body: JSON.stringify({
+ agentId,
+ userText,
+ level,
+ modelType
+ }),
+ onmessage: (event) => {
+ if (typeof onMessage === 'function') {
+ try {
+ const data = JSON.parse(event.data)
+ // 解析 CommonResult 包装
+ const result = data.code === 0 ? data.data : data
+ onMessage(result)
+ } catch (e) {
+ console.error('解析 SSE 数据失败:', e)
+ }
+ }
+ },
+ onerror: (err) => {
+ if (typeof onError === 'function') {
+ onError(err)
+ }
+ throw err // 不重试
+ },
+ onclose: () => {
+ if (typeof onClose === 'function') {
+ onClose()
+ }
+ },
+ signal: ctrl ? ctrl.signal : undefined
+ })
+}
diff --git a/frontend/app/web-gold/src/views/trends/Forecast.vue b/frontend/app/web-gold/src/views/trends/Forecast.vue
index 66a6afda4b..f718dd4650 100644
--- a/frontend/app/web-gold/src/views/trends/Forecast.vue
+++ b/frontend/app/web-gold/src/views/trends/Forecast.vue
@@ -1,11 +1,10 @@
@@ -413,26 +414,26 @@ onMounted(() => {