From 7adb815b351489e6ac2009b5ecd48c5c842cb53c Mon Sep 17 00:00:00 2001 From: root Date: Wed, 24 Sep 2025 00:47:20 +0500 Subject: [PATCH] simple generate --- .../parser/controller/ReportController.java | 2 +- .../service/ReportGenerationService.java | 35 +++++++++++++++++++ 2 files changed, 36 insertions(+), 1 deletion(-) diff --git a/src/main/java/kz/konturai/parser/controller/ReportController.java b/src/main/java/kz/konturai/parser/controller/ReportController.java index e6438ca..97e6380 100644 --- a/src/main/java/kz/konturai/parser/controller/ReportController.java +++ b/src/main/java/kz/konturai/parser/controller/ReportController.java @@ -36,7 +36,7 @@ public class ReportController { @PostMapping("/generate") public ResponseEntity generate(@Validated @RequestBody ReportGenerateRequest request) { - ReportBinary rb = reportGenerationService.generate(request); + ReportBinary rb = reportGenerationService.simpleGenerate(request); return ResponseEntity.ok() .header(HttpHeaders.CONTENT_DISPOSITION, "attachment; filename=\"" + rb.getFilename() + "\"") .contentType(rb.getMediaType()) diff --git a/src/main/java/kz/konturai/parser/service/ReportGenerationService.java b/src/main/java/kz/konturai/parser/service/ReportGenerationService.java index 6261dd0..18dca36 100644 --- a/src/main/java/kz/konturai/parser/service/ReportGenerationService.java +++ b/src/main/java/kz/konturai/parser/service/ReportGenerationService.java @@ -95,6 +95,41 @@ public class ReportGenerationService { this.minIOService = minIOService; } + public ReportBinary simpleGenerate(ReportGenerateRequest req) { + LocalDateTime start = req.getStartDate(); + LocalDateTime end = req.getEndDate(); + + List items = marketItemRepository + .findByPublishedAtBetween(start, end, org.springframework.data.domain.Pageable.unpaged()) + .getContent(); + + String combined = getCombinedSummaries(items); + String contextBlock = String.format( + "Заголовок отчёта: %s\nАвтор: %s\nКомпания: %s\nПериод: %s — %s\n", + Optional.ofNullable(req.getReportTitle()).orElse("Отчёт"), + Optional.ofNullable(req.getAuthorName()).orElse("Не указан"), + Optional.ofNullable(req.getCompanyName()).orElse("Не указана"), + start == null ? "?" : start.toString(), + end == null ? "?" : end.toString()); + + String instruction = "Ты — аналитик. На основе кратких сводок новостей ниже напиши цельный аналитический текст отчёта для руководства. " + + "Структура (без нумерации разделов): Краткое содержание (2–3 абзаца), Введение (1 абзац: цель, источники, подход), " + + "Основная часть (3–5 ключевых тенденций и событий периода с краткими пояснениями, допускаются маркированные списки), " + + "Рекомендации (4–6 практических пунктов), Заключение (1 абзац). Стиль: деловой, нейтральный, без вводных вроде 'в данном тексте'. " + + "Не упоминай, что ты ИИ. Используй русский язык.\n\nКонтекст отчёта:\n" + contextBlock + + "\nСводки новостей:\n"; + + String generated = ollamaAnalyticsService.generateWithInstruction(combined, instruction); + if (generated == null) { + generated = "(Не удалось сгенерировать текст отчёта по предоставленным данным.)"; + } + + String filename = "report_simple_" + (end == null ? "date" : end.toLocalDate().toString()) + "-" + + System.currentTimeMillis() + ".txt"; + return new ReportBinary(filename, MediaType.TEXT_PLAIN, + generated.getBytes(java.nio.charset.StandardCharsets.UTF_8)); + } + public ReportBinary generate(ReportGenerateRequest req) { LocalDateTime start = req.getStartDate(); LocalDateTime end = req.getEndDate();