110 lines
4.7 KiB
Markdown
110 lines
4.7 KiB
Markdown
Я хочу изменить логику формирования Markdown-отчета в методе `buildMarkdownFromReport` класса `MarketingAnalysisService`.
|
|
|
|
Сейчас метод создает Markdown-таблицы (ASCII tables) для отображения данных (сезонность, конкуренты и т.д.).
|
|
Мне нужно изменить это поведение: вместо таблиц я хочу встраивать JSON-данные для графиков прямо в текст отчета, используя Markdown code blocks.
|
|
|
|
**Требования:**
|
|
|
|
1. Найди метод `buildMarkdownFromReport`.
|
|
2. В местах, где сейчас формируются таблицы (например, для "seasonality", "competitors", "audienceSegmentation", "channelsPotential", "conversionFunnel"), замени генерацию таблиц на вставку JSON-блока.
|
|
3. Формат блока должен быть таким:
|
|
```json:chart-type
|
|
{ ... json data ... }
|
|
```
|
|
|
|
````
|
|
|
|
Где `chart-type` — это идентификатор типа графика (например, `json:seasonality`, `json:competitors`, `json:funnel`). Это поможет фронтенду понять, какой компонент графика рисовать.
|
|
4\. Используй поле `objectMapper` для сериализации соответствующих карт/списков (chartsData) в JSON-строку перед вставкой.
|
|
5\. Убедись, что JSON отформатирован красиво (pretty print), чтобы он был читаемым, если смотреть на raw text.
|
|
|
|
**Пример желаемого результата в Markdown:**
|
|
Вместо таблицы с месяцами, должно получиться:
|
|
|
|
### 1️⃣ Сезонность спроса (12 месяцев)
|
|
|
|
```json:seasonality
|
|
{
|
|
"Январь": 70,
|
|
"Февраль": 60,
|
|
...
|
|
}
|
|
```
|
|
|
|
Пожалуйста, рефактори метод `buildMarkdownFromReport` соответствующим образом.
|
|
|
|
````
|
|
|
|
---
|
|
|
|
### Как это будет работать (для твоего понимания)
|
|
|
|
После того как Cursor применит изменения, твой метод `buildMarkdownFromReport` будет выглядеть примерно так (псевдокод):
|
|
|
|
````java
|
|
// Внутри buildMarkdownFromReport
|
|
|
|
// ... заголовки ...
|
|
|
|
if (chartsData.containsKey("seasonality")) {
|
|
markdown.append("### 1️⃣ Сезонность спроса (12 месяцев)\n\n");
|
|
|
|
// Сериализуем данные в JSON
|
|
String jsonStr = objectMapper.writerWithDefaultPrettyPrinter()
|
|
.writeValueAsString(chartsData.get("seasonality"));
|
|
|
|
// Вставляем как блок кода с уникальным идентификатором языка
|
|
markdown.append("```json:seasonality\n");
|
|
markdown.append(jsonStr);
|
|
markdown.append("\n```\n\n");
|
|
}
|
|
````
|
|
|
|
### Что нужно сделать на Фронтенде?
|
|
|
|
Так как мы изменили подход, фронтенд (React/Vue) должен использовать библиотеку для рендеринга Markdown (например, `react-markdown`).
|
|
|
|
Тебе нужно будет написать кастомный рендерер для элементов `code`.
|
|
|
|
**Пример логики для фронтенда (React + react-markdown):**
|
|
|
|
```javascript
|
|
import ReactMarkdown from 'react-markdown';
|
|
import { SeasonalityChart, FunnelChart } from './MyCharts'; // Твои компоненты графиков
|
|
|
|
const MarkdownRender = ({ content }) => {
|
|
return (
|
|
<ReactMarkdown
|
|
components={{
|
|
code({ node, inline, className, children, ...props }) {
|
|
const match = /language-(\w+):(\w+)/.exec(className || '');
|
|
// match[1] будет "json", match[2] будет тип графика (seasonality, funnel и т.д.)
|
|
|
|
if (!inline && match && match[1] === 'json') {
|
|
const chartType = match[2];
|
|
const data = JSON.parse(String(children).replace(/\n$/, ''));
|
|
|
|
switch (chartType) {
|
|
case 'seasonality':
|
|
return <SeasonalityChart data={data} />;
|
|
case 'funnel':
|
|
return <FunnelChart data={data} />;
|
|
default:
|
|
return <pre>{children}</pre>; // Фоллбек
|
|
}
|
|
}
|
|
|
|
return (
|
|
<code className={className} {...props}>
|
|
{children}
|
|
</code>
|
|
);
|
|
},
|
|
}}
|
|
>
|
|
{content}
|
|
</ReactMarkdown>
|
|
);
|
|
};
|
|
```
|