From f003bd0498ade6257bb88ed795632cb2b550605d Mon Sep 17 00:00:00 2001 From: root Date: Sat, 17 Jan 2026 18:05:31 +0500 Subject: [PATCH] . --- src/service/MarketingService.js | 5 +- src/views/pages/MarketingAnalysis.vue | 3 +- .../pages/marketing/MarketingAnalysis.vue | 80 ++++++++++++------- 3 files changed, 58 insertions(+), 30 deletions(-) diff --git a/src/service/MarketingService.js b/src/service/MarketingService.js index 58f29c3..c122870 100644 --- a/src/service/MarketingService.js +++ b/src/service/MarketingService.js @@ -134,12 +134,13 @@ class MarketingService { throw new Error(result?.message || result?.error?.message || `HTTP ${response.status}: ${response.statusText}`); } - // v2: ожидаем сырой отчёт, без result.success/result.data if (!result) { throw new Error('Пустой ответ от сервера'); } - return result; + // v2: извлекаем data из обёртки {success, message, data}, если она есть + // для обратной совместимости поддерживаем оба формата + return result.data || result; } catch (error) { console.error('Ошибка при запуске маркетингового анализа v2:', error); throw error; diff --git a/src/views/pages/MarketingAnalysis.vue b/src/views/pages/MarketingAnalysis.vue index f5653df..d4e7b3d 100644 --- a/src/views/pages/MarketingAnalysis.vue +++ b/src/views/pages/MarketingAnalysis.vue @@ -1180,7 +1180,8 @@ async function loadAnalysisV2() { if (formData.value.weakSide?.trim()) requestData.weakSide = formData.value.weakSide.trim(); const data = await MarketingService.fetchAnalysisV2(requestData); - localReport.value = data || null; + // Извлекаем data из обёртки {success, message, data}, если она есть + localReport.value = (data?.data || data) || null; toast.add({ severity: 'success', summary: 'Готово', diff --git a/src/views/pages/marketing/MarketingAnalysis.vue b/src/views/pages/marketing/MarketingAnalysis.vue index 955bbf6..b18495a 100644 --- a/src/views/pages/marketing/MarketingAnalysis.vue +++ b/src/views/pages/marketing/MarketingAnalysis.vue @@ -895,6 +895,19 @@ const v2Report = ref(null); // raw v2 payload from GET /api/marketing/analysis/v const v2Loading = ref(false); const v2Error = ref(null); +const isV2ReportPayload = (payload) => { + if (!payload || typeof payload !== 'object') return false; + if (payload.report_title || payload.reportTitle) return true; + if (payload.sections && typeof payload.sections === 'object') return true; + return false; +}; + +const applyV2Report = (payload) => { + v2Report.value = payload; + v2Loading.value = false; + v2Error.value = null; +}; + const v2ReportNormalized = computed(() => { const root = v2Report.value; if (!root) return null; @@ -1050,6 +1063,13 @@ const startPolling = (id) => { try { const result = await MarketingService.getAnalysisResult(id); + if (!result) return; + if (isV2ReportPayload(result)) { + stopPolling(); + applyV2Report(result); + status.value = 'completed'; + return; + } status.value = result.status; if (result.status === 'completed' && result.report) { @@ -3286,37 +3306,43 @@ onMounted(async () => { try { analysisId.value = queryAnalysisId; const result = await MarketingService.getAnalysisResult(queryAnalysisId); - status.value = result.status; + const isV2 = isV2ReportPayload(result); + if (isV2) { + applyV2Report(result); + status.value = 'completed'; + } else if (result) { + status.value = result.status; - // Сохраняем тип анализа, если он есть - if (result.analysisType) { - currentAnalysisType.value = result.analysisType; - } + // Сохраняем тип анализа, если он есть + if (result.analysisType) { + currentAnalysisType.value = result.analysisType; + } - if (result.status === 'completed' && result.report) { - report.value = result.report; - } else if (result.status === 'processing' || result.status === 'queued') { - estimatedCompletionTime.value = result.estimatedCompletionTime; - startPolling(queryAnalysisId); - } + if (result.status === 'completed' && result.report) { + report.value = result.report; + } else if (result.status === 'processing' || result.status === 'queued') { + estimatedCompletionTime.value = result.estimatedCompletionTime; + startPolling(queryAnalysisId); + } - // v2 restore: - // 1) from query param - // 2) fallback to /analysis/my lookup (docs say v2AnalysisId is present there) - if (queryV2AnalysisId) { - v2AnalysisId.value = String(queryV2AnalysisId); - await refreshV2(); - } else { - try { - const list = await MarketingService.getMyAnalyses(); - const found = Array.isArray(list) ? list.find((a) => a?.analysisId === queryAnalysisId) : null; - if (found?.v2AnalysisId) { - v2AnalysisId.value = found.v2AnalysisId; - router.replace({ query: { ...route.query, v2AnalysisId: v2AnalysisId.value } }); - await refreshV2(); + // v2 restore: + // 1) from query param + // 2) fallback to /analysis/my lookup (docs say v2AnalysisId is present there) + if (queryV2AnalysisId) { + v2AnalysisId.value = String(queryV2AnalysisId); + await refreshV2(); + } else { + try { + const list = await MarketingService.getMyAnalyses(); + const found = Array.isArray(list) ? list.find((a) => a?.analysisId === queryAnalysisId) : null; + if (found?.v2AnalysisId) { + v2AnalysisId.value = found.v2AnalysisId; + router.replace({ query: { ...route.query, v2AnalysisId: v2AnalysisId.value } }); + await refreshV2(); + } + } catch (_) { + // ignore v2 restore errors; old analysis page must keep working } - } catch (_) { - // ignore v2 restore errors; old analysis page must keep working } } } catch (error) {