diff --git a/src/main/java/kz/konturai/parser/dto/MarketingAnalysisV3Result.java b/src/main/java/kz/konturai/parser/dto/MarketingAnalysisV3Result.java index 5ca6266..e580b56 100644 --- a/src/main/java/kz/konturai/parser/dto/MarketingAnalysisV3Result.java +++ b/src/main/java/kz/konturai/parser/dto/MarketingAnalysisV3Result.java @@ -50,7 +50,7 @@ public class MarketingAnalysisV3Result { private String geography; private int activeCompetitors; private String competitionLevel; - private String averageNicheEr; + private double averageNicheEr; private double averageRating; private String demandTrend; private List keyFigures; @@ -60,7 +60,6 @@ public class MarketingAnalysisV3Result { public static class MarketLandscape { private Map activePlayersByPlatform; private Map cityDistribution; - private List demandDynamics; private double nicheReputationLevel; } @@ -100,8 +99,8 @@ public class MarketingAnalysisV3Result { private double reviewsContentPercent; private double engagementContentPercent; private double videoShare; - private String avgTextLength; - private String ctaFrequency; + private int avgTextLengthCharacters; + private double ctaUsagePercent; } @Data @@ -117,22 +116,21 @@ public class MarketingAnalysisV3Result { private int medianReviews; private Map starDistribution; private double highTrustBusinessShare; - private String avgOwnerResponseSpeed; + private int avgOwnerResponseTimeHours; } @Data public static class BehavioralPattern { - private String promoFrequency; - private String bookingFrequency; - private String dmRequestFrequency; - private String priceVisibility; - private String avgCycleDuration; + private double promoUsagePercent; + private double directBookingPercent; + private double priceVisibilityPercent; + private int avgCycleDays; private List commonCta; } @Data public static class SearchDemand { - private String avgFrequency; + private int avgMonthlySearches; private List seasonality; private List peakPeriods; private List relatedQueries; diff --git a/src/main/java/kz/konturai/parser/service/MarketingAnalysisV3Service.java b/src/main/java/kz/konturai/parser/service/MarketingAnalysisV3Service.java index 44b33fc..3a3e94a 100644 --- a/src/main/java/kz/konturai/parser/service/MarketingAnalysisV3Service.java +++ b/src/main/java/kz/konturai/parser/service/MarketingAnalysisV3Service.java @@ -241,9 +241,9 @@ public class MarketingAnalysisV3Service { КРИТИЧЕСКИЕ ПРАВИЛА (ANTI-HALLUCINATION PROTOCOL): 1. ТОЛЬКО РЕАЛЬНЫЕ ДАННЫЕ: Вся аналитика строится на переданном SEARCH EVIDENCE. - 2. РЕАЛЬНЫЕ КОНКУРЕНТЫ: В блоке `3_competitor_map` ОБЯЗАНО быть строго от 5 до 10 РЕАЛЬНЫХ компаний из предоставленных данных. Ровно 3 — ЗАПРЕЩЕНО. Использовать плейсхолдеры — ЗАПРЕЩЕНО. - 3. ПОЛНАЯ РУСИФИКАЦИЯ: Все значения статусов, уровней и трендов (businessStage, competitionLevel, demandTrend, intensityLabel, status) СТРОГО на русском языке. Запрещено копировать английские слова (JUST_STARTING, HIGH, STABLE, NONE) из DTO. Переводи их по смыслу (Например: 'Запуск', 'Высокая', 'Стабильный', 'Отсутствует'). - 4. ОЦИФРОВКА: В Казахстане все измеряется в KZT. Приложение Kaspi.kz и 2GIS — основа рынка. Учитывай это в анализе. + 2. РЕАЛЬНЫЕ КОНКУРЕНТЫ: В блоке `3_competitor_map` ОБЯЗАНО быть строго от 5 до 10 РЕАЛЬНЫХ компаний из предоставленных данных. Ровно 3 — ЗАПРЕЩЕНО. + 3. ПОЛНАЯ РУСИФИКАЦИЯ: Все текстовые значения статусов, уровней и трендов (businessStage, competitionLevel, demandTrend, intensityLabel, status) СТРОГО на русском языке. Запрещено копировать английские слова (JUST_STARTING, HIGH, STABLE, NONE) из DTO. Переводи их по смыслу (Например: 'На старте', 'Высокая', 'Стабильный', 'Отсутствует'). + 4. ОЦИФРОВКА И ТИПЫ ДАННЫХ: Возвращай строго те типы данных, которые указаны в шаблоне. Если указано число (0 или 0.0), возвращай число, а не строку. 5. СВЯЗЬ СО СТРАТЕГИЕЙ: Твой анализ — это фундамент для будущего SMM-Scoring Model. 6. НИКАКИХ NULL: Заполни абсолютно все поля JSON. Если точной цифры нет, примени метод Ферми и сделай экстраполяцию, характерную для рынка РК. """; @@ -272,36 +272,39 @@ public class MarketingAnalysisV3Service { %s ИНСТРУКЦИИ ПО СЕКЦИЯМ (СТРОГО): - + СТРОГО ИСПОЛЬЗУЙ ВСЕ ГОРОДА, КОТОРЫЕ ТЕБЕ ОТПРАВЛЯЮТ, ПРЯМ ВСЕ [0_executive_summary] - - activeCompetitors: Реальное количество найденных в поиске игроков (минимум 5). - - keyFigures: 5-7 мощных метрик. Обязательно укажи оценку объема рынка/спроса. + - Все статусы СТРОГО на русском. + - averageNicheEr: Верни число (double, например 0.05). [1_market_landscape] и [2_geo_structure] - - ОБЯЗАТЕЛЬНО выведи метрики в этих блоках для КАЖДОГО из этих городов: %s. Пропуск любого города — критическая ошибка. - - demandDynamics: 12 объектов. Поле "period" СТРОГО на русском (Январь, Февраль...). + - ОБЯЗАТЕЛЬНО выведи метрики распределения для КАЖДОГО из этих городов: %s. Пропуск любого города — критическая ошибка. [3_competitor_map] - - ОБЯЗАНО быть строго от 5 до 10 РЕАЛЬНЫХ компаний. Ровно 3 — ЗАПРЕЩЕНО. + - ОБЯЗАНО быть строго от 5 до 10 РЕАЛЬНЫХ компаний. - Рассчитай реалистичный ER (от 0.01 до 0.08). [4_content_profile] - Сумма всех ContentPercent должна быть ровно 100.0. + - avgTextLengthCharacters: Верни конкретное число символов (int, например 400). + - ctaUsagePercent: Верни процент использования призывов (double, например 85.0). - [5_competition_intensity] - - ciiIndex: 0-100. Оцени по плотности выдачи 2GIS и Google в EVIDENCE. + [6_reputation_analysis] + - avgOwnerResponseTimeHours: Верни среднее время ответа в часах (int, например 2 или 24). [7_behavioral_pattern] - - Отрази привычки КЗ: Kaspi Red, WhatsApp, чувствительность к скидкам. + - Все показатели верни в процентах (double, например 45.0). + - avgCycleDays: Верни цикл сделки в днях (int, например 7). + + [8_search_demand] + - avgMonthlySearches: Верни число поисковых запросов в месяц (int, например 15000). + - seasonality: 12 объектов. Поле "period" СТРОГО на русском (Январь, Февраль...). [9_user_positioning] - - Если DTO smmStatus == "NONE", радар-чарт по нулям, а статус напиши "Отсутствует". - - [10_structured_conclusions] - - Подведи итог: Какой фактор доминирует? + - status: СТРОГО на русском (например 'Отсутствует', 'Действующий'). [11_smm_strategy_rationale] - - МИНИМУМ 50 СЛОВ. Обоснуй стратегию на основе реальных данных из блоков 5 и 7. Свяжи барьеры аудитории с выбором SMM. + - МИНИМУМ 50 СЛОВ. Обоснуй стратегию на основе реальных данных из блоков 5 и 7. ЭТАЛОННЫЙ JSON: %s @@ -315,32 +318,18 @@ public class MarketingAnalysisV3Service { return """ { "0_executive_summary": { - "businessStage": "СТРОГО НА РУССКОМ (например 'На старте', 'Действующий бизнес')", - "geography": "СТРОГО НА РУССКОМ (например 'Несколько городов', 'Один город')", + "businessStage": "СТРОГО НА РУССКОМ", + "geography": "СТРОГО НА РУССКОМ", "activeCompetitors": 0, - "competitionLevel": "СТРОГО НА РУССКОМ (например 'Высокий', 'Средний')", - "averageNicheEr": "string", + "competitionLevel": "СТРОГО НА РУССКОМ", + "averageNicheEr": 0.0, "averageRating": 0.0, - "demandTrend": "СТРОГО НА РУССКОМ (например 'Стабильный', 'Растущий')", + "demandTrend": "СТРОГО НА РУССКОМ", "keyFigures": ["string", "string", "string"] }, "1_market_landscape": { "activePlayersByPlatform": {"Instagram": 0, "TikTok": 0, "GoogleMaps": 0}, "cityDistribution": {"Almaty": 0}, - "demandDynamics": [ - {"period": "Январь", "value": 0.0}, - {"period": "Февраль", "value": 0.0}, - {"period": "Март", "value": 0.0}, - {"period": "Апрель", "value": 0.0}, - {"period": "Май", "value": 0.0}, - {"period": "Июнь", "value": 0.0}, - {"period": "Июль", "value": 0.0}, - {"period": "Август", "value": 0.0}, - {"period": "Сентябрь", "value": 0.0}, - {"period": "Октябрь", "value": 0.0}, - {"period": "Ноябрь", "value": 0.0}, - {"period": "Декабрь", "value": 0.0} - ], "nicheReputationLevel": 0.0 }, "2_geo_structure": { @@ -367,12 +356,12 @@ public class MarketingAnalysisV3Service { "reviewsContentPercent": 0.0, "engagementContentPercent": 0.0, "videoShare": 0.0, - "avgTextLength": "string", - "ctaFrequency": "string" + "avgTextLengthCharacters": 0, + "ctaUsagePercent": 0.0 }, "5_competition_intensity": { "ciiIndex": 0, - "intensityLabel": "СТРОГО НА РУССКОМ (например 'Высокая', 'Низкая')", + "intensityLabel": "СТРОГО НА РУССКОМ", "contributingFactors": ["string"] }, "6_reputation_analysis": { @@ -380,18 +369,17 @@ public class MarketingAnalysisV3Service { "medianReviews": 0, "starDistribution": {"5": 0.0, "4": 0.0, "3": 0.0, "2": 0.0, "1": 0.0}, "highTrustBusinessShare": 0.0, - "avgOwnerResponseSpeed": "string" + "avgOwnerResponseTimeHours": 0 }, "7_behavioral_pattern": { - "promoFrequency": "string", - "bookingFrequency": "string", - "dmRequestFrequency": "string", - "priceVisibility": "string", - "avgCycleDuration": "СТРОГО числовой диапазон, например '5-7 дней', НИКАКИХ абстрактных слов", + "promoUsagePercent": 0.0, + "directBookingPercent": 0.0, + "priceVisibilityPercent": 0.0, + "avgCycleDays": 0, "commonCta": ["string"] }, "8_search_demand": { - "avgFrequency": "СТРОГО числовой диапазон, например '10000-15000', НИКАКИХ абстрактных слов", + "avgMonthlySearches": 0, "seasonality": [ {"period": "Январь", "value": 0.0}, {"period": "Февраль", "value": 0.0}, @@ -417,11 +405,11 @@ public class MarketingAnalysisV3Service { "reputation": 0, "frequency": 0 }, - "status": "СТРОГО НА РУССКОМ (например 'Отсутствует', 'Активный')", + "status": "СТРОГО НА РУССКОМ", "gaps": ["string"] }, "10_structured_conclusions": ["string", "string", "string"], - "11_smm_strategy_rationale": "МИНИМУМ 50 СЛОВ. Обосновать стратегию на основе данных конкуренции и паттернов поведения." + "11_smm_strategy_rationale": "string" } """; }