.
This commit is contained in:
@@ -140,7 +140,18 @@ class MarketingService {
|
||||
|
||||
// v2: извлекаем data из обёртки {success, message, data}, если она есть
|
||||
// для обратной совместимости поддерживаем оба формата
|
||||
return result.data || result;
|
||||
let extracted = result.data || result;
|
||||
|
||||
// Убеждаемся, что sources сохраняются, если они есть в исходных данных
|
||||
if (extracted && !extracted.sources) {
|
||||
if (result.data?.sources) {
|
||||
extracted.sources = result.data.sources;
|
||||
} else if (result.sources) {
|
||||
extracted.sources = result.sources;
|
||||
}
|
||||
}
|
||||
|
||||
return extracted;
|
||||
} catch (error) {
|
||||
console.error('Ошибка при запуске маркетингового анализа v2:', error);
|
||||
throw error;
|
||||
|
||||
@@ -922,21 +922,41 @@
|
||||
</section>
|
||||
|
||||
<!-- Источники -->
|
||||
<section v-if="report?.sources && report.sources.length > 0" class="space-y-3">
|
||||
<div class="text-2xl font-semibold text-slate-900">Источники</div>
|
||||
|
||||
<section class="space-y-3">
|
||||
<div class="rounded-2xl bg-white shadow-sm border border-slate-200/60 p-4 md:p-6">
|
||||
<div class="space-y-2">
|
||||
<div v-for="(source, index) in report.sources" :key="index" class="flex items-start gap-2">
|
||||
<i class="pi pi-link text-slate-400 mt-1 text-sm"></i>
|
||||
<a
|
||||
:href="source"
|
||||
target="_blank"
|
||||
rel="noopener noreferrer"
|
||||
class="text-sm text-blue-600 hover:text-blue-800 hover:underline break-all"
|
||||
>
|
||||
{{ source }}
|
||||
</a>
|
||||
<div class="text-[13px] text-slate-500 mb-1">Маркетинг <span class="mx-1">›</span> Источники</div>
|
||||
<div class="flex items-center justify-center gap-2">
|
||||
<div class="text-3xl font-semibold tracking-wide text-center text-slate-800">ИСТОЧНИКИ</div>
|
||||
<i
|
||||
class="pi pi-info-circle text-[14px] text-slate-400 cursor-help"
|
||||
v-tooltip.top="'Список источников данных, использованных при подготовке маркетингового анализа'"
|
||||
></i>
|
||||
</div>
|
||||
<div class="text-center text-slate-500 text-sm mt-1">список источников данных для анализа</div>
|
||||
|
||||
|
||||
|
||||
<div class="mt-6">
|
||||
<template v-if="report?.sources && Array.isArray(report.sources) && report.sources.length > 0">
|
||||
<div class="space-y-3">
|
||||
<div v-for="(source, index) in report.sources" :key="index" class="flex items-start gap-3 p-3 rounded-xl border border-slate-200/60 hover:bg-slate-50/50 transition-colors">
|
||||
<div class="h-8 w-8 rounded-lg flex items-center justify-center border border-slate-200/70 bg-slate-50/50 flex-shrink-0">
|
||||
<i class="pi pi-link text-slate-500 text-sm"></i>
|
||||
</div>
|
||||
<a
|
||||
:href="source"
|
||||
target="_blank"
|
||||
rel="noopener noreferrer"
|
||||
class="text-sm text-blue-600 hover:text-blue-800 hover:underline break-all flex-1"
|
||||
>
|
||||
{{ source }}
|
||||
</a>
|
||||
</div>
|
||||
</div>
|
||||
</template>
|
||||
<div v-else class="text-center text-slate-400 text-sm py-8">
|
||||
<i class="pi pi-info-circle mr-2"></i>
|
||||
Источники не найдены
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
@@ -993,10 +1013,28 @@ const localLoading = ref(false);
|
||||
const localError = ref(null);
|
||||
|
||||
// unify both modes: in embedded mode we read props; otherwise local state
|
||||
const report = computed(() => props.report || localReport.value);
|
||||
const report = computed(() => {
|
||||
const r = props.report || localReport.value;
|
||||
if (r && !r.sources) {
|
||||
// Если sources отсутствуют, проверяем исходные данные
|
||||
if (props.report?.sources) {
|
||||
return { ...r, sources: props.report.sources };
|
||||
} else if (localReport.value?.sources) {
|
||||
return { ...r, sources: localReport.value.sources };
|
||||
}
|
||||
}
|
||||
return r;
|
||||
});
|
||||
const loading = computed(() => (props.embedded ? props.loading : localLoading.value));
|
||||
const error = computed(() => (props.embedded ? props.error : localError.value));
|
||||
|
||||
// Watch для отслеживания изменений report и sources (можно использовать для отладки)
|
||||
// watch(() => report.value, (newReport) => {
|
||||
// if (newReport) {
|
||||
// console.log('Report updated:', { keys: Object.keys(newReport), hasSources: !!newReport.sources });
|
||||
// }
|
||||
// }, { immediate: true, deep: true });
|
||||
|
||||
const DETAIL_LEVEL_OPTIONS = ['КРАТКО', 'СТАНДАРТНО', 'ПОДРОБНО'];
|
||||
const ANALYSIS_TYPE_OPTIONS = ['РЫНОК', 'КОНКУРЕНТЫ', 'ЦА', 'КАНАЛЫ', 'SWOT'];
|
||||
const GENDER_OPTIONS = ['Женщины', 'Мужчины'];
|
||||
@@ -1049,8 +1087,29 @@ async function loadAnalysisV2() {
|
||||
if (formData.value.weakSide?.trim()) requestData.weakSide = formData.value.weakSide.trim();
|
||||
|
||||
const data = await MarketingService.fetchAnalysisV2(requestData);
|
||||
// Извлекаем data из обёртки {success, message, data}, если она есть
|
||||
localReport.value = (data?.data || data) || null;
|
||||
// MarketingService.fetchAnalysisV2 уже извлекает data из обёртки {success, message, data}
|
||||
// Но на всякий случай проверяем, может быть еще одна обёртка
|
||||
let extractedData = (data?.data || data) || null;
|
||||
|
||||
// Убеждаемся, что sources сохраняются - проверяем все возможные места
|
||||
if (extractedData && !extractedData.sources) {
|
||||
// Проверяем все возможные места, где могут быть sources
|
||||
if (data?.data?.sources) {
|
||||
extractedData.sources = data.data.sources;
|
||||
} else if (data?.sources) {
|
||||
extractedData.sources = data.sources;
|
||||
}
|
||||
}
|
||||
|
||||
// Создаём новый объект, чтобы гарантировать, что все поля сохранены
|
||||
if (extractedData) {
|
||||
localReport.value = {
|
||||
...extractedData,
|
||||
sources: extractedData.sources || []
|
||||
};
|
||||
} else {
|
||||
localReport.value = null;
|
||||
}
|
||||
toast.add({
|
||||
severity: 'success',
|
||||
summary: 'Готово',
|
||||
|
||||
@@ -937,7 +937,8 @@ const v2ReportNormalized = computed(() => {
|
||||
marketing_economics: pick('marketingEconomics', 'marketing_economics'),
|
||||
bottlenecks: pick('bottlenecks', 'bottlenecks'),
|
||||
recommendations: pick('recommendations', 'recommendations')
|
||||
}
|
||||
},
|
||||
sources: root.sources || []
|
||||
};
|
||||
});
|
||||
|
||||
|
||||
Reference in New Issue
Block a user