Files
aiform_dev/frontend/src/components/form/Step2Details.tsx

638 lines
23 KiB
TypeScript
Raw Normal View History

feat: Пошаговая загрузка документов с модалкой на Step 2 🎯 Изменения: - Документы загружаются по очереди (один за другим) - После загрузки каждого документа открывается модалка с крутилкой - SSE слушает конкретный event_type: {file_type}_processed - Модалка показывает результат распознавания с извлечёнными данными - Кнопка 'Продолжить' → переход к следующему документу - Опциональные документы можно пропустить - После обработки всех обязательных → 'Далее на Step 3' 📊 UX флоу: 1. Выбор типа события → показываются нужные документы 2. Документ 1: Выбрать файл → Загрузить → Модалка → Результат → Продолжить 3. Документ 2: Выбрать файл → Загрузить → Модалка → Результат → Продолжить 4. Документ 3 (опц): Загрузить ИЛИ Пропустить 5. Все обязательные обработаны → Далее на Step 3 🔑 Каждый документ получает свой уникальный event_type: - frontend отправляет file_type - n8n возвращает event_type = {file_type}_processed - frontend слушает этот конкретный event_type через SSE
2025-10-28 12:43:38 +03:00
import { Form, Button, Select, Upload, message, Spin, Card, Modal, Progress } from 'antd';
import { UploadOutlined, LoadingOutlined, CheckCircleOutlined } from '@ant-design/icons';
feat: Умная форма Step2 с автоматическим распознаванием документов 🤖 Переход на OCR/AI для извлечения данных из документов: ✅ Изменения: - Убран ручной ввод полей (дата, номер рейса и тд) - Добавлена умная загрузка документов в зависимости от типа события - Каждый тип документа получает уникальный file_type для n8n - Валидация обязательных документов перед переходом 📋 Типы документов и их file_type: 1. Задержка рейса: - flight_delay_boarding_or_ticket (обяз) - flight_delay_confirmation (обяз) 2. Отмена рейса: - flight_cancel_ticket (обяз) - flight_cancel_notice (обяз) 3. Пропуск стыковки: - connection_arrival_boarding (обяз) - connection_departure_boarding_or_ticket (обяз) - connection_delay_proof (опц) 4. Поезд (задержка): - train_ticket (обяз) - train_delay_proof (обяз) 5. Поезд (отмена): - train_ticket (обяз) - train_cancel_proof (обяз) 6. Паром: - ferry_ticket (обяз) - ferry_delay_proof (обяз) 7. Запасной аэродром: - emergency_boarding_or_ticket (обяз) - emergency_landing_proof (обяз) 🔑 file_type позволяет n8n разделять потоки и применять разные AI промпты для каждого типа документа. Backup старой версии: Step2Details.OLD_MANUAL_INPUT.tsx
2025-10-28 12:03:12 +03:00
import { useState, useEffect, useRef } from 'react';
feat: Step2 переделан + улучшен Debug Panel с полными S3 URL Step2Details (по скриншоту): ✅ Индикатор '✅ Полис найден' вверху ✅ Select с типами событий из erv_ticket: - Задержка авиарейса (более 3 часов) - Отмена авиарейса - Пропуск стыковочного рейса - Посадка на запасной аэродром - Задержка отправки поезда - Отмена поезда - Задержка/отмена парома/круизного судна ✅ Дата наступления страхового случая (DatePicker) ✅ Номер рейса/поезда/парома ✅ Загрузка подтверждающих документов: - Посадочный талон, билет, справка и т.д. - До 10 файлов по 15MB - HEIC, PDF, фото Debug Panel улучшения: ✅ Полные S3 URL (не обрезанные) ✅ Кнопка '🔗 Открыть в новой вкладке' ✅ word-break: break-all для длинных URL ✅ Показывает все файлы из массива ✅ Для каждого файла: - Filename - File ID (UUID) - Size (KB) - Полный S3 URL (кликабельный) Теперь в Debug видно КУДА загрузилось: https://s3.twcstorage.ru/f9825c87-.../policies/20251024_213045_abc123_file.jpg Можно кликнуть и посмотреть глазами! 👀
2025-10-25 09:27:56 +03:00
import type { UploadFile } from 'antd/es/upload/interface';
import dayjs from 'dayjs';
const { Option } = Select;
interface Props {
formData: any;
updateFormData: (data: any) => void;
onNext: () => void;
onPrev: () => void;
feat: Step2 переделан + улучшен Debug Panel с полными S3 URL Step2Details (по скриншоту): ✅ Индикатор '✅ Полис найден' вверху ✅ Select с типами событий из erv_ticket: - Задержка авиарейса (более 3 часов) - Отмена авиарейса - Пропуск стыковочного рейса - Посадка на запасной аэродром - Задержка отправки поезда - Отмена поезда - Задержка/отмена парома/круизного судна ✅ Дата наступления страхового случая (DatePicker) ✅ Номер рейса/поезда/парома ✅ Загрузка подтверждающих документов: - Посадочный талон, билет, справка и т.д. - До 10 файлов по 15MB - HEIC, PDF, фото Debug Panel улучшения: ✅ Полные S3 URL (не обрезанные) ✅ Кнопка '🔗 Открыть в новой вкладке' ✅ word-break: break-all для длинных URL ✅ Показывает все файлы из массива ✅ Для каждого файла: - Filename - File ID (UUID) - Size (KB) - Полный S3 URL (кликабельный) Теперь в Debug видно КУДА загрузилось: https://s3.twcstorage.ru/f9825c87-.../policies/20251024_213045_abc123_file.jpg Можно кликнуть и посмотреть глазами! 👀
2025-10-25 09:27:56 +03:00
addDebugEvent?: (type: string, status: string, message: string, data?: any) => void;
}
feat: Умная форма Step2 с автоматическим распознаванием документов 🤖 Переход на OCR/AI для извлечения данных из документов: ✅ Изменения: - Убран ручной ввод полей (дата, номер рейса и тд) - Добавлена умная загрузка документов в зависимости от типа события - Каждый тип документа получает уникальный file_type для n8n - Валидация обязательных документов перед переходом 📋 Типы документов и их file_type: 1. Задержка рейса: - flight_delay_boarding_or_ticket (обяз) - flight_delay_confirmation (обяз) 2. Отмена рейса: - flight_cancel_ticket (обяз) - flight_cancel_notice (обяз) 3. Пропуск стыковки: - connection_arrival_boarding (обяз) - connection_departure_boarding_or_ticket (обяз) - connection_delay_proof (опц) 4. Поезд (задержка): - train_ticket (обяз) - train_delay_proof (обяз) 5. Поезд (отмена): - train_ticket (обяз) - train_cancel_proof (обяз) 6. Паром: - ferry_ticket (обяз) - ferry_delay_proof (обяз) 7. Запасной аэродром: - emergency_boarding_or_ticket (обяз) - emergency_landing_proof (обяз) 🔑 file_type позволяет n8n разделять потоки и применять разные AI промпты для каждого типа документа. Backup старой версии: Step2Details.OLD_MANUAL_INPUT.tsx
2025-10-28 12:03:12 +03:00
// Типы страховых случаев
feat: Step2 переделан + улучшен Debug Panel с полными S3 URL Step2Details (по скриншоту): ✅ Индикатор '✅ Полис найден' вверху ✅ Select с типами событий из erv_ticket: - Задержка авиарейса (более 3 часов) - Отмена авиарейса - Пропуск стыковочного рейса - Посадка на запасной аэродром - Задержка отправки поезда - Отмена поезда - Задержка/отмена парома/круизного судна ✅ Дата наступления страхового случая (DatePicker) ✅ Номер рейса/поезда/парома ✅ Загрузка подтверждающих документов: - Посадочный талон, билет, справка и т.д. - До 10 файлов по 15MB - HEIC, PDF, фото Debug Panel улучшения: ✅ Полные S3 URL (не обрезанные) ✅ Кнопка '🔗 Открыть в новой вкладке' ✅ word-break: break-all для длинных URL ✅ Показывает все файлы из массива ✅ Для каждого файла: - Filename - File ID (UUID) - Size (KB) - Полный S3 URL (кликабельный) Теперь в Debug видно КУДА загрузилось: https://s3.twcstorage.ru/f9825c87-.../policies/20251024_213045_abc123_file.jpg Можно кликнуть и посмотреть глазами! 👀
2025-10-25 09:27:56 +03:00
const EVENT_TYPES = [
{ value: 'delay_flight', label: 'Задержка авиарейса (более 3 часов)' },
{ value: 'cancel_flight', label: 'Отмена авиарейса' },
feat: Умная форма Step2 с автоматическим распознаванием документов 🤖 Переход на OCR/AI для извлечения данных из документов: ✅ Изменения: - Убран ручной ввод полей (дата, номер рейса и тд) - Добавлена умная загрузка документов в зависимости от типа события - Каждый тип документа получает уникальный file_type для n8n - Валидация обязательных документов перед переходом 📋 Типы документов и их file_type: 1. Задержка рейса: - flight_delay_boarding_or_ticket (обяз) - flight_delay_confirmation (обяз) 2. Отмена рейса: - flight_cancel_ticket (обяз) - flight_cancel_notice (обяз) 3. Пропуск стыковки: - connection_arrival_boarding (обяз) - connection_departure_boarding_or_ticket (обяз) - connection_delay_proof (опц) 4. Поезд (задержка): - train_ticket (обяз) - train_delay_proof (обяз) 5. Поезд (отмена): - train_ticket (обяз) - train_cancel_proof (обяз) 6. Паром: - ferry_ticket (обяз) - ferry_delay_proof (обяз) 7. Запасной аэродром: - emergency_boarding_or_ticket (обяз) - emergency_landing_proof (обяз) 🔑 file_type позволяет n8n разделять потоки и применять разные AI промпты для каждого типа документа. Backup старой версии: Step2Details.OLD_MANUAL_INPUT.tsx
2025-10-28 12:03:12 +03:00
{ value: 'miss_connection', label: 'Пропуск (задержка прибытия) стыковочного рейса' },
feat: Step2 переделан + улучшен Debug Panel с полными S3 URL Step2Details (по скриншоту): ✅ Индикатор '✅ Полис найден' вверху ✅ Select с типами событий из erv_ticket: - Задержка авиарейса (более 3 часов) - Отмена авиарейса - Пропуск стыковочного рейса - Посадка на запасной аэродром - Задержка отправки поезда - Отмена поезда - Задержка/отмена парома/круизного судна ✅ Дата наступления страхового случая (DatePicker) ✅ Номер рейса/поезда/парома ✅ Загрузка подтверждающих документов: - Посадочный талон, билет, справка и т.д. - До 10 файлов по 15MB - HEIC, PDF, фото Debug Panel улучшения: ✅ Полные S3 URL (не обрезанные) ✅ Кнопка '🔗 Открыть в новой вкладке' ✅ word-break: break-all для длинных URL ✅ Показывает все файлы из массива ✅ Для каждого файла: - Filename - File ID (UUID) - Size (KB) - Полный S3 URL (кликабельный) Теперь в Debug видно КУДА загрузилось: https://s3.twcstorage.ru/f9825c87-.../policies/20251024_213045_abc123_file.jpg Можно кликнуть и посмотреть глазами! 👀
2025-10-25 09:27:56 +03:00
{ value: 'emergency_landing', label: 'Посадка воздушного судна на запасной аэродром' },
{ value: 'delay_train', label: 'Задержка отправки поезда' },
{ value: 'cancel_train', label: 'Отмена поезда' },
{ value: 'delay_ferry', label: 'Задержка/отмена отправки парома/круизного судна' },
];
feat: Умная форма Step2 с автоматическим распознаванием документов 🤖 Переход на OCR/AI для извлечения данных из документов: ✅ Изменения: - Убран ручной ввод полей (дата, номер рейса и тд) - Добавлена умная загрузка документов в зависимости от типа события - Каждый тип документа получает уникальный file_type для n8n - Валидация обязательных документов перед переходом 📋 Типы документов и их file_type: 1. Задержка рейса: - flight_delay_boarding_or_ticket (обяз) - flight_delay_confirmation (обяз) 2. Отмена рейса: - flight_cancel_ticket (обяз) - flight_cancel_notice (обяз) 3. Пропуск стыковки: - connection_arrival_boarding (обяз) - connection_departure_boarding_or_ticket (обяз) - connection_delay_proof (опц) 4. Поезд (задержка): - train_ticket (обяз) - train_delay_proof (обяз) 5. Поезд (отмена): - train_ticket (обяз) - train_cancel_proof (обяз) 6. Паром: - ferry_ticket (обяз) - ferry_delay_proof (обяз) 7. Запасной аэродром: - emergency_boarding_or_ticket (обяз) - emergency_landing_proof (обяз) 🔑 file_type позволяет n8n разделять потоки и применять разные AI промпты для каждого типа документа. Backup старой версии: Step2Details.OLD_MANUAL_INPUT.tsx
2025-10-28 12:03:12 +03:00
// Конфигурация документов для каждого типа события с уникальными file_type
const DOCUMENT_CONFIGS: Record<string, any[]> = {
delay_flight: [
{
name: "Посадочный талон или Билет",
field: "boarding_or_ticket",
file_type: "flight_delay_boarding_or_ticket",
required: true,
maxFiles: 1,
description: "Boarding pass или ticket/booking confirmation"
},
{
name: "Подтверждение задержки",
field: "delay_confirmation",
file_type: "flight_delay_confirmation",
required: true,
maxFiles: 3,
description: "Справка от АК, email/SMS, или фото табло"
}
],
cancel_flight: [
{
name: "Билет",
field: "ticket",
file_type: "flight_cancel_ticket",
required: true,
maxFiles: 1,
description: "Ticket/booking confirmation"
},
{
name: "Уведомление об отмене",
field: "cancellation_notice",
file_type: "flight_cancel_notice",
required: true,
maxFiles: 3,
description: "Email, SMS или скриншот из приложения АК"
}
],
miss_connection: [
{
name: "Посадочный талон рейса ПРИБЫТИЯ",
field: "arrival_boarding",
file_type: "connection_arrival_boarding",
required: true,
maxFiles: 1,
description: "Boarding pass рейса, который задержался"
},
{
name: "Посадочный талон ИЛИ Билет рейса ОТПРАВЛЕНИЯ",
field: "departure_boarding_or_ticket",
file_type: "connection_departure_boarding_or_ticket",
required: true,
maxFiles: 1,
description: "Boarding pass (если успели) ИЛИ билет (если не успели)"
},
{
name: "Доказательство задержки (опционально)",
field: "delay_proof",
file_type: "connection_delay_proof",
required: false,
maxFiles: 5,
description: "Справка, фото табло, email/SMS"
}
],
delay_train: [
{
name: "Билет на поезд",
field: "train_ticket",
file_type: "train_ticket",
required: true,
maxFiles: 1,
description: "Билет РЖД или другого перевозчика"
},
{
name: "Подтверждение задержки",
field: "delay_proof",
file_type: "train_delay_proof",
required: true,
maxFiles: 3,
description: "Справка от РЖД, фото табло, скриншот приложения"
}
],
cancel_train: [
{
name: "Билет на поезд",
field: "train_ticket",
file_type: "train_ticket",
required: true,
maxFiles: 1,
description: "Билет РЖД или другого перевозчика"
},
{
name: "Подтверждение отмены",
field: "cancel_proof",
file_type: "train_cancel_proof",
required: true,
maxFiles: 3,
description: "Справка от РЖД, фото табло, скриншот приложения"
}
],
delay_ferry: [
{
name: "Билет на паром/круиз",
field: "ferry_ticket",
file_type: "ferry_ticket",
required: true,
maxFiles: 1,
description: "Билет или booking confirmation"
},
{
name: "Подтверждение задержки/отмены",
field: "delay_proof",
file_type: "ferry_delay_proof",
required: true,
maxFiles: 3,
description: "Справка от перевозчика, фото расписания, email/SMS"
}
],
emergency_landing: [
{
name: "Посадочный талон или Билет",
field: "boarding_or_ticket",
file_type: "emergency_boarding_or_ticket",
required: true,
maxFiles: 1,
description: "Boarding pass или ticket"
},
{
name: "Подтверждение посадки на запасной аэродром",
field: "emergency_proof",
file_type: "emergency_landing_proof",
required: true,
maxFiles: 3,
description: "Справка от АК, email/SMS, документы"
}
]
};
feat: Step2 переделан + улучшен Debug Panel с полными S3 URL Step2Details (по скриншоту): ✅ Индикатор '✅ Полис найден' вверху ✅ Select с типами событий из erv_ticket: - Задержка авиарейса (более 3 часов) - Отмена авиарейса - Пропуск стыковочного рейса - Посадка на запасной аэродром - Задержка отправки поезда - Отмена поезда - Задержка/отмена парома/круизного судна ✅ Дата наступления страхового случая (DatePicker) ✅ Номер рейса/поезда/парома ✅ Загрузка подтверждающих документов: - Посадочный талон, билет, справка и т.д. - До 10 файлов по 15MB - HEIC, PDF, фото Debug Panel улучшения: ✅ Полные S3 URL (не обрезанные) ✅ Кнопка '🔗 Открыть в новой вкладке' ✅ word-break: break-all для длинных URL ✅ Показывает все файлы из массива ✅ Для каждого файла: - Filename - File ID (UUID) - Size (KB) - Полный S3 URL (кликабельный) Теперь в Debug видно КУДА загрузилось: https://s3.twcstorage.ru/f9825c87-.../policies/20251024_213045_abc123_file.jpg Можно кликнуть и посмотреть глазами! 👀
2025-10-25 09:27:56 +03:00
export default function Step2Details({ formData, updateFormData, onNext, onPrev, addDebugEvent }: Props) {
const [form] = Form.useForm();
feat: Умная форма Step2 с автоматическим распознаванием документов 🤖 Переход на OCR/AI для извлечения данных из документов: ✅ Изменения: - Убран ручной ввод полей (дата, номер рейса и тд) - Добавлена умная загрузка документов в зависимости от типа события - Каждый тип документа получает уникальный file_type для n8n - Валидация обязательных документов перед переходом 📋 Типы документов и их file_type: 1. Задержка рейса: - flight_delay_boarding_or_ticket (обяз) - flight_delay_confirmation (обяз) 2. Отмена рейса: - flight_cancel_ticket (обяз) - flight_cancel_notice (обяз) 3. Пропуск стыковки: - connection_arrival_boarding (обяз) - connection_departure_boarding_or_ticket (обяз) - connection_delay_proof (опц) 4. Поезд (задержка): - train_ticket (обяз) - train_delay_proof (обяз) 5. Поезд (отмена): - train_ticket (обяз) - train_cancel_proof (обяз) 6. Паром: - ferry_ticket (обяз) - ferry_delay_proof (обяз) 7. Запасной аэродром: - emergency_boarding_or_ticket (обяз) - emergency_landing_proof (обяз) 🔑 file_type позволяет n8n разделять потоки и применять разные AI промпты для каждого типа документа. Backup старой версии: Step2Details.OLD_MANUAL_INPUT.tsx
2025-10-28 12:03:12 +03:00
const [eventType, setEventType] = useState(formData.eventType || '');
feat: Пошаговая загрузка документов с модалкой на Step 2 🎯 Изменения: - Документы загружаются по очереди (один за другим) - После загрузки каждого документа открывается модалка с крутилкой - SSE слушает конкретный event_type: {file_type}_processed - Модалка показывает результат распознавания с извлечёнными данными - Кнопка 'Продолжить' → переход к следующему документу - Опциональные документы можно пропустить - После обработки всех обязательных → 'Далее на Step 3' 📊 UX флоу: 1. Выбор типа события → показываются нужные документы 2. Документ 1: Выбрать файл → Загрузить → Модалка → Результат → Продолжить 3. Документ 2: Выбрать файл → Загрузить → Модалка → Результат → Продолжить 4. Документ 3 (опц): Загрузить ИЛИ Пропустить 5. Все обязательные обработаны → Далее на Step 3 🔑 Каждый документ получает свой уникальный event_type: - frontend отправляет file_type - n8n возвращает event_type = {file_type}_processed - frontend слушает этот конкретный event_type через SSE
2025-10-28 12:43:38 +03:00
const [currentDocumentIndex, setCurrentDocumentIndex] = useState(0);
const [processedDocuments, setProcessedDocuments] = useState<Record<string, any>>({});
const [currentFile, setCurrentFile] = useState<File | null>(null);
feat: Step2 переделан + улучшен Debug Panel с полными S3 URL Step2Details (по скриншоту): ✅ Индикатор '✅ Полис найден' вверху ✅ Select с типами событий из erv_ticket: - Задержка авиарейса (более 3 часов) - Отмена авиарейса - Пропуск стыковочного рейса - Посадка на запасной аэродром - Задержка отправки поезда - Отмена поезда - Задержка/отмена парома/круизного судна ✅ Дата наступления страхового случая (DatePicker) ✅ Номер рейса/поезда/парома ✅ Загрузка подтверждающих документов: - Посадочный талон, билет, справка и т.д. - До 10 файлов по 15MB - HEIC, PDF, фото Debug Panel улучшения: ✅ Полные S3 URL (не обрезанные) ✅ Кнопка '🔗 Открыть в новой вкладке' ✅ word-break: break-all для длинных URL ✅ Показывает все файлы из массива ✅ Для каждого файла: - Filename - File ID (UUID) - Size (KB) - Полный S3 URL (кликабельный) Теперь в Debug видно КУДА загрузилось: https://s3.twcstorage.ru/f9825c87-.../policies/20251024_213045_abc123_file.jpg Можно кликнуть и посмотреть глазами! 👀
2025-10-25 09:27:56 +03:00
const [uploading, setUploading] = useState(false);
feat: Пошаговая загрузка документов с модалкой на Step 2 🎯 Изменения: - Документы загружаются по очереди (один за другим) - После загрузки каждого документа открывается модалка с крутилкой - SSE слушает конкретный event_type: {file_type}_processed - Модалка показывает результат распознавания с извлечёнными данными - Кнопка 'Продолжить' → переход к следующему документу - Опциональные документы можно пропустить - После обработки всех обязательных → 'Далее на Step 3' 📊 UX флоу: 1. Выбор типа события → показываются нужные документы 2. Документ 1: Выбрать файл → Загрузить → Модалка → Результат → Продолжить 3. Документ 2: Выбрать файл → Загрузить → Модалка → Результат → Продолжить 4. Документ 3 (опц): Загрузить ИЛИ Пропустить 5. Все обязательные обработаны → Далее на Step 3 🔑 Каждый документ получает свой уникальный event_type: - frontend отправляет file_type - n8n возвращает event_type = {file_type}_processed - frontend слушает этот конкретный event_type через SSE
2025-10-28 12:43:38 +03:00
const [ocrModalVisible, setOcrModalVisible] = useState(false);
const [ocrModalContent, setOcrModalContent] = useState<any>(null);
feat: Умная форма Step2 с автоматическим распознаванием документов 🤖 Переход на OCR/AI для извлечения данных из документов: ✅ Изменения: - Убран ручной ввод полей (дата, номер рейса и тд) - Добавлена умная загрузка документов в зависимости от типа события - Каждый тип документа получает уникальный file_type для n8n - Валидация обязательных документов перед переходом 📋 Типы документов и их file_type: 1. Задержка рейса: - flight_delay_boarding_or_ticket (обяз) - flight_delay_confirmation (обяз) 2. Отмена рейса: - flight_cancel_ticket (обяз) - flight_cancel_notice (обяз) 3. Пропуск стыковки: - connection_arrival_boarding (обяз) - connection_departure_boarding_or_ticket (обяз) - connection_delay_proof (опц) 4. Поезд (задержка): - train_ticket (обяз) - train_delay_proof (обяз) 5. Поезд (отмена): - train_ticket (обяз) - train_cancel_proof (обяз) 6. Паром: - ferry_ticket (обяз) - ferry_delay_proof (обяз) 7. Запасной аэродром: - emergency_boarding_or_ticket (обяз) - emergency_landing_proof (обяз) 🔑 file_type позволяет n8n разделять потоки и применять разные AI промпты для каждого типа документа. Backup старой версии: Step2Details.OLD_MANUAL_INPUT.tsx
2025-10-28 12:03:12 +03:00
const eventSourceRef = useRef<EventSource | null>(null);
const handleEventTypeChange = (value: string) => {
setEventType(value);
feat: Пошаговая загрузка документов с модалкой на Step 2 🎯 Изменения: - Документы загружаются по очереди (один за другим) - После загрузки каждого документа открывается модалка с крутилкой - SSE слушает конкретный event_type: {file_type}_processed - Модалка показывает результат распознавания с извлечёнными данными - Кнопка 'Продолжить' → переход к следующему документу - Опциональные документы можно пропустить - После обработки всех обязательных → 'Далее на Step 3' 📊 UX флоу: 1. Выбор типа события → показываются нужные документы 2. Документ 1: Выбрать файл → Загрузить → Модалка → Результат → Продолжить 3. Документ 2: Выбрать файл → Загрузить → Модалка → Результат → Продолжить 4. Документ 3 (опц): Загрузить ИЛИ Пропустить 5. Все обязательные обработаны → Далее на Step 3 🔑 Каждый документ получает свой уникальный event_type: - frontend отправляет file_type - n8n возвращает event_type = {file_type}_processed - frontend слушает этот конкретный event_type через SSE
2025-10-28 12:43:38 +03:00
setCurrentDocumentIndex(0);
setProcessedDocuments({});
setCurrentFile(null);
feat: Умная форма Step2 с автоматическим распознаванием документов 🤖 Переход на OCR/AI для извлечения данных из документов: ✅ Изменения: - Убран ручной ввод полей (дата, номер рейса и тд) - Добавлена умная загрузка документов в зависимости от типа события - Каждый тип документа получает уникальный file_type для n8n - Валидация обязательных документов перед переходом 📋 Типы документов и их file_type: 1. Задержка рейса: - flight_delay_boarding_or_ticket (обяз) - flight_delay_confirmation (обяз) 2. Отмена рейса: - flight_cancel_ticket (обяз) - flight_cancel_notice (обяз) 3. Пропуск стыковки: - connection_arrival_boarding (обяз) - connection_departure_boarding_or_ticket (обяз) - connection_delay_proof (опц) 4. Поезд (задержка): - train_ticket (обяз) - train_delay_proof (обяз) 5. Поезд (отмена): - train_ticket (обяз) - train_cancel_proof (обяз) 6. Паром: - ferry_ticket (обяз) - ferry_delay_proof (обяз) 7. Запасной аэродром: - emergency_boarding_or_ticket (обяз) - emergency_landing_proof (обяз) 🔑 file_type позволяет n8n разделять потоки и применять разные AI промпты для каждого типа документа. Backup старой версии: Step2Details.OLD_MANUAL_INPUT.tsx
2025-10-28 12:03:12 +03:00
form.setFieldValue('eventType', value);
};
// Получаем конфигурацию документов для выбранного типа события
const currentDocuments = eventType ? DOCUMENT_CONFIGS[eventType] || [] : [];
feat: Пошаговая загрузка документов с модалкой на Step 2 🎯 Изменения: - Документы загружаются по очереди (один за другим) - После загрузки каждого документа открывается модалка с крутилкой - SSE слушает конкретный event_type: {file_type}_processed - Модалка показывает результат распознавания с извлечёнными данными - Кнопка 'Продолжить' → переход к следующему документу - Опциональные документы можно пропустить - После обработки всех обязательных → 'Далее на Step 3' 📊 UX флоу: 1. Выбор типа события → показываются нужные документы 2. Документ 1: Выбрать файл → Загрузить → Модалка → Результат → Продолжить 3. Документ 2: Выбрать файл → Загрузить → Модалка → Результат → Продолжить 4. Документ 3 (опц): Загрузить ИЛИ Пропустить 5. Все обязательные обработаны → Далее на Step 3 🔑 Каждый документ получает свой уникальный event_type: - frontend отправляет file_type - n8n возвращает event_type = {file_type}_processed - frontend слушает этот конкретный event_type через SSE
2025-10-28 12:43:38 +03:00
const currentDocConfig = currentDocuments[currentDocumentIndex];
// Проверяем все ли обязательные документы обработаны
const allRequiredProcessed = currentDocuments
.filter(doc => doc.required)
.every(doc => processedDocuments[doc.field]);
feat: Умная форма Step2 с автоматическим распознаванием документов 🤖 Переход на OCR/AI для извлечения данных из документов: ✅ Изменения: - Убран ручной ввод полей (дата, номер рейса и тд) - Добавлена умная загрузка документов в зависимости от типа события - Каждый тип документа получает уникальный file_type для n8n - Валидация обязательных документов перед переходом 📋 Типы документов и их file_type: 1. Задержка рейса: - flight_delay_boarding_or_ticket (обяз) - flight_delay_confirmation (обяз) 2. Отмена рейса: - flight_cancel_ticket (обяз) - flight_cancel_notice (обяз) 3. Пропуск стыковки: - connection_arrival_boarding (обяз) - connection_departure_boarding_or_ticket (обяз) - connection_delay_proof (опц) 4. Поезд (задержка): - train_ticket (обяз) - train_delay_proof (обяз) 5. Поезд (отмена): - train_ticket (обяз) - train_cancel_proof (обяз) 6. Паром: - ferry_ticket (обяз) - ferry_delay_proof (обяз) 7. Запасной аэродром: - emergency_boarding_or_ticket (обяз) - emergency_landing_proof (обяз) 🔑 file_type позволяет n8n разделять потоки и применять разные AI промпты для каждого типа документа. Backup старой версии: Step2Details.OLD_MANUAL_INPUT.tsx
2025-10-28 12:03:12 +03:00
feat: Пошаговая загрузка документов с модалкой на Step 2 🎯 Изменения: - Документы загружаются по очереди (один за другим) - После загрузки каждого документа открывается модалка с крутилкой - SSE слушает конкретный event_type: {file_type}_processed - Модалка показывает результат распознавания с извлечёнными данными - Кнопка 'Продолжить' → переход к следующему документу - Опциональные документы можно пропустить - После обработки всех обязательных → 'Далее на Step 3' 📊 UX флоу: 1. Выбор типа события → показываются нужные документы 2. Документ 1: Выбрать файл → Загрузить → Модалка → Результат → Продолжить 3. Документ 2: Выбрать файл → Загрузить → Модалка → Результат → Продолжить 4. Документ 3 (опц): Загрузить ИЛИ Пропустить 5. Все обязательные обработаны → Далее на Step 3 🔑 Каждый документ получает свой уникальный event_type: - frontend отправляет file_type - n8n возвращает event_type = {file_type}_processed - frontend слушает этот конкретный event_type через SSE
2025-10-28 12:43:38 +03:00
// SSE подключение для получения результатов OCR
useEffect(() => {
const claimId = formData.claim_id;
if (!claimId || !uploading || !currentDocConfig) {
return;
}
feat: Пошаговая загрузка документов с модалкой на Step 2 🎯 Изменения: - Документы загружаются по очереди (один за другим) - После загрузки каждого документа открывается модалка с крутилкой - SSE слушает конкретный event_type: {file_type}_processed - Модалка показывает результат распознавания с извлечёнными данными - Кнопка 'Продолжить' → переход к следующему документу - Опциональные документы можно пропустить - После обработки всех обязательных → 'Далее на Step 3' 📊 UX флоу: 1. Выбор типа события → показываются нужные документы 2. Документ 1: Выбрать файл → Загрузить → Модалка → Результат → Продолжить 3. Документ 2: Выбрать файл → Загрузить → Модалка → Результат → Продолжить 4. Документ 3 (опц): Загрузить ИЛИ Пропустить 5. Все обязательные обработаны → Далее на Step 3 🔑 Каждый документ получает свой уникальный event_type: - frontend отправляет file_type - n8n возвращает event_type = {file_type}_processed - frontend слушает этот конкретный event_type через SSE
2025-10-28 12:43:38 +03:00
console.log('🔌 SSE: Открываю соединение для', currentDocConfig.file_type);
const eventSource = new EventSource(`/events/${claimId}`);
eventSourceRef.current = eventSource;
const expectedEventType = `${currentDocConfig.file_type}_processed`;
console.log('👀 Ожидаю event_type:', expectedEventType);
eventSource.onmessage = (event) => {
try {
const data = JSON.parse(event.data);
console.log('📨 SSE event received:', data);
if (data.event_type === expectedEventType) {
console.log('✅ Получил результат для документа:', currentDocConfig.name);
// Сохраняем результат
setProcessedDocuments(prev => ({
...prev,
[currentDocConfig.field]: data.data?.output || data.data
}));
// Показываем результат в модалке
setOcrModalContent({
success: data.status === 'completed',
data: data.data?.output || data.data,
message: data.message,
documentName: currentDocConfig.name
});
setUploading(false);
eventSource.close();
addDebugEvent?.('ocr', 'success', `${currentDocConfig.name} обработан`, {
file_type: currentDocConfig.file_type,
data: data.data?.output || data.data
});
}
} catch (error) {
console.error('SSE parse error:', error);
}
};
eventSource.onerror = (error) => {
console.error('❌ SSE connection error:', error);
feat: Step2 переделан + улучшен Debug Panel с полными S3 URL Step2Details (по скриншоту): ✅ Индикатор '✅ Полис найден' вверху ✅ Select с типами событий из erv_ticket: - Задержка авиарейса (более 3 часов) - Отмена авиарейса - Пропуск стыковочного рейса - Посадка на запасной аэродром - Задержка отправки поезда - Отмена поезда - Задержка/отмена парома/круизного судна ✅ Дата наступления страхового случая (DatePicker) ✅ Номер рейса/поезда/парома ✅ Загрузка подтверждающих документов: - Посадочный талон, билет, справка и т.д. - До 10 файлов по 15MB - HEIC, PDF, фото Debug Panel улучшения: ✅ Полные S3 URL (не обрезанные) ✅ Кнопка '🔗 Открыть в новой вкладке' ✅ word-break: break-all для длинных URL ✅ Показывает все файлы из массива ✅ Для каждого файла: - Filename - File ID (UUID) - Size (KB) - Полный S3 URL (кликабельный) Теперь в Debug видно КУДА загрузилось: https://s3.twcstorage.ru/f9825c87-.../policies/20251024_213045_abc123_file.jpg Можно кликнуть и посмотреть глазами! 👀
2025-10-25 09:27:56 +03:00
feat: Пошаговая загрузка документов с модалкой на Step 2 🎯 Изменения: - Документы загружаются по очереди (один за другим) - После загрузки каждого документа открывается модалка с крутилкой - SSE слушает конкретный event_type: {file_type}_processed - Модалка показывает результат распознавания с извлечёнными данными - Кнопка 'Продолжить' → переход к следующему документу - Опциональные документы можно пропустить - После обработки всех обязательных → 'Далее на Step 3' 📊 UX флоу: 1. Выбор типа события → показываются нужные документы 2. Документ 1: Выбрать файл → Загрузить → Модалка → Результат → Продолжить 3. Документ 2: Выбрать файл → Загрузить → Модалка → Результат → Продолжить 4. Документ 3 (опц): Загрузить ИЛИ Пропустить 5. Все обязательные обработаны → Далее на Step 3 🔑 Каждый документ получает свой уникальный event_type: - frontend отправляет file_type - n8n возвращает event_type = {file_type}_processed - frontend слушает этот конкретный event_type через SSE
2025-10-28 12:43:38 +03:00
setOcrModalContent((prev) => {
if (prev && prev !== 'loading') {
console.log('✅ SSE закрыто после получения результата');
return prev;
}
return { success: false, data: null, message: 'Ошибка подключения к серверу' };
});
feat: Умная форма Step2 с автоматическим распознаванием документов 🤖 Переход на OCR/AI для извлечения данных из документов: ✅ Изменения: - Убран ручной ввод полей (дата, номер рейса и тд) - Добавлена умная загрузка документов в зависимости от типа события - Каждый тип документа получает уникальный file_type для n8n - Валидация обязательных документов перед переходом 📋 Типы документов и их file_type: 1. Задержка рейса: - flight_delay_boarding_or_ticket (обяз) - flight_delay_confirmation (обяз) 2. Отмена рейса: - flight_cancel_ticket (обяз) - flight_cancel_notice (обяз) 3. Пропуск стыковки: - connection_arrival_boarding (обяз) - connection_departure_boarding_or_ticket (обяз) - connection_delay_proof (опц) 4. Поезд (задержка): - train_ticket (обяз) - train_delay_proof (обяз) 5. Поезд (отмена): - train_ticket (обяз) - train_cancel_proof (обяз) 6. Паром: - ferry_ticket (обяз) - ferry_delay_proof (обяз) 7. Запасной аэродром: - emergency_boarding_or_ticket (обяз) - emergency_landing_proof (обяз) 🔑 file_type позволяет n8n разделять потоки и применять разные AI промпты для каждого типа документа. Backup старой версии: Step2Details.OLD_MANUAL_INPUT.tsx
2025-10-28 12:03:12 +03:00
feat: Пошаговая загрузка документов с модалкой на Step 2 🎯 Изменения: - Документы загружаются по очереди (один за другим) - После загрузки каждого документа открывается модалка с крутилкой - SSE слушает конкретный event_type: {file_type}_processed - Модалка показывает результат распознавания с извлечёнными данными - Кнопка 'Продолжить' → переход к следующему документу - Опциональные документы можно пропустить - После обработки всех обязательных → 'Далее на Step 3' 📊 UX флоу: 1. Выбор типа события → показываются нужные документы 2. Документ 1: Выбрать файл → Загрузить → Модалка → Результат → Продолжить 3. Документ 2: Выбрать файл → Загрузить → Модалка → Результат → Продолжить 4. Документ 3 (опц): Загрузить ИЛИ Пропустить 5. Все обязательные обработаны → Далее на Step 3 🔑 Каждый документ получает свой уникальный event_type: - frontend отправляет file_type - n8n возвращает event_type = {file_type}_processed - frontend слушает этот конкретный event_type через SSE
2025-10-28 12:43:38 +03:00
setUploading(false);
eventSource.close();
};
eventSource.onopen = () => {
console.log('✅ SSE: Соединение открыто');
};
return () => {
if (eventSourceRef.current) {
eventSourceRef.current.close();
eventSourceRef.current = null;
feat: Умная форма Step2 с автоматическим распознаванием документов 🤖 Переход на OCR/AI для извлечения данных из документов: ✅ Изменения: - Убран ручной ввод полей (дата, номер рейса и тд) - Добавлена умная загрузка документов в зависимости от типа события - Каждый тип документа получает уникальный file_type для n8n - Валидация обязательных документов перед переходом 📋 Типы документов и их file_type: 1. Задержка рейса: - flight_delay_boarding_or_ticket (обяз) - flight_delay_confirmation (обяз) 2. Отмена рейса: - flight_cancel_ticket (обяз) - flight_cancel_notice (обяз) 3. Пропуск стыковки: - connection_arrival_boarding (обяз) - connection_departure_boarding_or_ticket (обяз) - connection_delay_proof (опц) 4. Поезд (задержка): - train_ticket (обяз) - train_delay_proof (обяз) 5. Поезд (отмена): - train_ticket (обяз) - train_cancel_proof (обяз) 6. Паром: - ferry_ticket (обяз) - ferry_delay_proof (обяз) 7. Запасной аэродром: - emergency_boarding_or_ticket (обяз) - emergency_landing_proof (обяз) 🔑 file_type позволяет n8n разделять потоки и применять разные AI промпты для каждого типа документа. Backup старой версии: Step2Details.OLD_MANUAL_INPUT.tsx
2025-10-28 12:03:12 +03:00
}
feat: Пошаговая загрузка документов с модалкой на Step 2 🎯 Изменения: - Документы загружаются по очереди (один за другим) - После загрузки каждого документа открывается модалка с крутилкой - SSE слушает конкретный event_type: {file_type}_processed - Модалка показывает результат распознавания с извлечёнными данными - Кнопка 'Продолжить' → переход к следующему документу - Опциональные документы можно пропустить - После обработки всех обязательных → 'Далее на Step 3' 📊 UX флоу: 1. Выбор типа события → показываются нужные документы 2. Документ 1: Выбрать файл → Загрузить → Модалка → Результат → Продолжить 3. Документ 2: Выбрать файл → Загрузить → Модалка → Результат → Продолжить 4. Документ 3 (опц): Загрузить ИЛИ Пропустить 5. Все обязательные обработаны → Далее на Step 3 🔑 Каждый документ получает свой уникальный event_type: - frontend отправляет file_type - n8n возвращает event_type = {file_type}_processed - frontend слушает этот конкретный event_type через SSE
2025-10-28 12:43:38 +03:00
};
}, [formData.claim_id, uploading, currentDocConfig]);
const handleFileSelect = (file: File) => {
setCurrentFile(file);
return false; // Предотвращаем автозагрузку
};
const handleUploadAndProcess = async () => {
if (!currentFile || !currentDocConfig) {
message.error('Выберите файл');
return;
}
feat: Step2 переделан + улучшен Debug Panel с полными S3 URL Step2Details (по скриншоту): ✅ Индикатор '✅ Полис найден' вверху ✅ Select с типами событий из erv_ticket: - Задержка авиарейса (более 3 часов) - Отмена авиарейса - Пропуск стыковочного рейса - Посадка на запасной аэродром - Задержка отправки поезда - Отмена поезда - Задержка/отмена парома/круизного судна ✅ Дата наступления страхового случая (DatePicker) ✅ Номер рейса/поезда/парома ✅ Загрузка подтверждающих документов: - Посадочный талон, билет, справка и т.д. - До 10 файлов по 15MB - HEIC, PDF, фото Debug Panel улучшения: ✅ Полные S3 URL (не обрезанные) ✅ Кнопка '🔗 Открыть в новой вкладке' ✅ word-break: break-all для длинных URL ✅ Показывает все файлы из массива ✅ Для каждого файла: - Filename - File ID (UUID) - Size (KB) - Полный S3 URL (кликабельный) Теперь в Debug видно КУДА загрузилось: https://s3.twcstorage.ru/f9825c87-.../policies/20251024_213045_abc123_file.jpg Можно кликнуть и посмотреть глазами! 👀
2025-10-25 09:27:56 +03:00
feat: Пошаговая загрузка документов с модалкой на Step 2 🎯 Изменения: - Документы загружаются по очереди (один за другим) - После загрузки каждого документа открывается модалка с крутилкой - SSE слушает конкретный event_type: {file_type}_processed - Модалка показывает результат распознавания с извлечёнными данными - Кнопка 'Продолжить' → переход к следующему документу - Опциональные документы можно пропустить - После обработки всех обязательных → 'Далее на Step 3' 📊 UX флоу: 1. Выбор типа события → показываются нужные документы 2. Документ 1: Выбрать файл → Загрузить → Модалка → Результат → Продолжить 3. Документ 2: Выбрать файл → Загрузить → Модалка → Результат → Продолжить 4. Документ 3 (опц): Загрузить ИЛИ Пропустить 5. Все обязательные обработаны → Далее на Step 3 🔑 Каждый документ получает свой уникальный event_type: - frontend отправляет file_type - n8n возвращает event_type = {file_type}_processed - frontend слушает этот конкретный event_type через SSE
2025-10-28 12:43:38 +03:00
try {
feat: Умная форма Step2 с автоматическим распознаванием документов 🤖 Переход на OCR/AI для извлечения данных из документов: ✅ Изменения: - Убран ручной ввод полей (дата, номер рейса и тд) - Добавлена умная загрузка документов в зависимости от типа события - Каждый тип документа получает уникальный file_type для n8n - Валидация обязательных документов перед переходом 📋 Типы документов и их file_type: 1. Задержка рейса: - flight_delay_boarding_or_ticket (обяз) - flight_delay_confirmation (обяз) 2. Отмена рейса: - flight_cancel_ticket (обяз) - flight_cancel_notice (обяз) 3. Пропуск стыковки: - connection_arrival_boarding (обяз) - connection_departure_boarding_or_ticket (обяз) - connection_delay_proof (опц) 4. Поезд (задержка): - train_ticket (обяз) - train_delay_proof (обяз) 5. Поезд (отмена): - train_ticket (обяз) - train_cancel_proof (обяз) 6. Паром: - ferry_ticket (обяз) - ferry_delay_proof (обяз) 7. Запасной аэродром: - emergency_boarding_or_ticket (обяз) - emergency_landing_proof (обяз) 🔑 file_type позволяет n8n разделять потоки и применять разные AI промпты для каждого типа документа. Backup старой версии: Step2Details.OLD_MANUAL_INPUT.tsx
2025-10-28 12:03:12 +03:00
setUploading(true);
feat: Пошаговая загрузка документов с модалкой на Step 2 🎯 Изменения: - Документы загружаются по очереди (один за другим) - После загрузки каждого документа открывается модалка с крутилкой - SSE слушает конкретный event_type: {file_type}_processed - Модалка показывает результат распознавания с извлечёнными данными - Кнопка 'Продолжить' → переход к следующему документу - Опциональные документы можно пропустить - После обработки всех обязательных → 'Далее на Step 3' 📊 UX флоу: 1. Выбор типа события → показываются нужные документы 2. Документ 1: Выбрать файл → Загрузить → Модалка → Результат → Продолжить 3. Документ 2: Выбрать файл → Загрузить → Модалка → Результат → Продолжить 4. Документ 3 (опц): Загрузить ИЛИ Пропустить 5. Все обязательные обработаны → Далее на Step 3 🔑 Каждый документ получает свой уникальный event_type: - frontend отправляет file_type - n8n возвращает event_type = {file_type}_processed - frontend слушает этот конкретный event_type через SSE
2025-10-28 12:43:38 +03:00
setOcrModalVisible(true);
setOcrModalContent('loading');
feat: Умная форма Step2 с автоматическим распознаванием документов 🤖 Переход на OCR/AI для извлечения данных из документов: ✅ Изменения: - Убран ручной ввод полей (дата, номер рейса и тд) - Добавлена умная загрузка документов в зависимости от типа события - Каждый тип документа получает уникальный file_type для n8n - Валидация обязательных документов перед переходом 📋 Типы документов и их file_type: 1. Задержка рейса: - flight_delay_boarding_or_ticket (обяз) - flight_delay_confirmation (обяз) 2. Отмена рейса: - flight_cancel_ticket (обяз) - flight_cancel_notice (обяз) 3. Пропуск стыковки: - connection_arrival_boarding (обяз) - connection_departure_boarding_or_ticket (обяз) - connection_delay_proof (опц) 4. Поезд (задержка): - train_ticket (обяз) - train_delay_proof (обяз) 5. Поезд (отмена): - train_ticket (обяз) - train_cancel_proof (обяз) 6. Паром: - ferry_ticket (обяз) - ferry_delay_proof (обяз) 7. Запасной аэродром: - emergency_boarding_or_ticket (обяз) - emergency_landing_proof (обяз) 🔑 file_type позволяет n8n разделять потоки и применять разные AI промпты для каждого типа документа. Backup старой версии: Step2Details.OLD_MANUAL_INPUT.tsx
2025-10-28 12:03:12 +03:00
const claimId = formData.claim_id;
feat: Пошаговая загрузка документов с модалкой на Step 2 🎯 Изменения: - Документы загружаются по очереди (один за другим) - После загрузки каждого документа открывается модалка с крутилкой - SSE слушает конкретный event_type: {file_type}_processed - Модалка показывает результат распознавания с извлечёнными данными - Кнопка 'Продолжить' → переход к следующему документу - Опциональные документы можно пропустить - После обработки всех обязательных → 'Далее на Step 3' 📊 UX флоу: 1. Выбор типа события → показываются нужные документы 2. Документ 1: Выбрать файл → Загрузить → Модалка → Результат → Продолжить 3. Документ 2: Выбрать файл → Загрузить → Модалка → Результат → Продолжить 4. Документ 3 (опц): Загрузить ИЛИ Пропустить 5. Все обязательные обработаны → Далее на Step 3 🔑 Каждый документ получает свой уникальный event_type: - frontend отправляет file_type - n8n возвращает event_type = {file_type}_processed - frontend слушает этот конкретный event_type через SSE
2025-10-28 12:43:38 +03:00
addDebugEvent?.('upload', 'pending', `📤 Загружаю: ${currentDocConfig.name}`, {
file_type: currentDocConfig.file_type,
filename: currentFile.name
});
feat: Умная форма Step2 с автоматическим распознаванием документов 🤖 Переход на OCR/AI для извлечения данных из документов: ✅ Изменения: - Убран ручной ввод полей (дата, номер рейса и тд) - Добавлена умная загрузка документов в зависимости от типа события - Каждый тип документа получает уникальный file_type для n8n - Валидация обязательных документов перед переходом 📋 Типы документов и их file_type: 1. Задержка рейса: - flight_delay_boarding_or_ticket (обяз) - flight_delay_confirmation (обяз) 2. Отмена рейса: - flight_cancel_ticket (обяз) - flight_cancel_notice (обяз) 3. Пропуск стыковки: - connection_arrival_boarding (обяз) - connection_departure_boarding_or_ticket (обяз) - connection_delay_proof (опц) 4. Поезд (задержка): - train_ticket (обяз) - train_delay_proof (обяз) 5. Поезд (отмена): - train_ticket (обяз) - train_cancel_proof (обяз) 6. Паром: - ferry_ticket (обяз) - ferry_delay_proof (обяз) 7. Запасной аэродром: - emergency_boarding_or_ticket (обяз) - emergency_landing_proof (обяз) 🔑 file_type позволяет n8n разделять потоки и применять разные AI промпты для каждого типа документа. Backup старой версии: Step2Details.OLD_MANUAL_INPUT.tsx
2025-10-28 12:03:12 +03:00
feat: Пошаговая загрузка документов с модалкой на Step 2 🎯 Изменения: - Документы загружаются по очереди (один за другим) - После загрузки каждого документа открывается модалка с крутилкой - SSE слушает конкретный event_type: {file_type}_processed - Модалка показывает результат распознавания с извлечёнными данными - Кнопка 'Продолжить' → переход к следующему документу - Опциональные документы можно пропустить - После обработки всех обязательных → 'Далее на Step 3' 📊 UX флоу: 1. Выбор типа события → показываются нужные документы 2. Документ 1: Выбрать файл → Загрузить → Модалка → Результат → Продолжить 3. Документ 2: Выбрать файл → Загрузить → Модалка → Результат → Продолжить 4. Документ 3 (опц): Загрузить ИЛИ Пропустить 5. Все обязательные обработаны → Далее на Step 3 🔑 Каждый документ получает свой уникальный event_type: - frontend отправляет file_type - n8n возвращает event_type = {file_type}_processed - frontend слушает этот конкретный event_type через SSE
2025-10-28 12:43:38 +03:00
const uploadFormData = new FormData();
uploadFormData.append('claim_id', claimId);
uploadFormData.append('file_type', currentDocConfig.file_type);
uploadFormData.append('filename', currentFile.name);
uploadFormData.append('voucher', formData.voucher || '');
uploadFormData.append('session_id', sessionStorage.getItem('session_id') || 'unknown');
uploadFormData.append('upload_timestamp', new Date().toISOString());
uploadFormData.append('file', currentFile);
feat: Интеграция n8n + Redis Pub/Sub + SSE для real-time обработки заявок 🎯 Основные изменения: Backend: - ✅ Добавлен SSE endpoint для real-time событий (/api/v1/events/{task_id}) - ✅ Redis Pub/Sub для публикации/подписки на события OCR/Vision - ✅ Удален aioboto3 из requirements.txt (конфликт зависимостей) - ✅ Добавлен OCR worker (deprecated, логика перенесена в n8n) Frontend (React): - ✅ Автогенерация claim_id и session_id - ✅ Клиентская конвертация файлов в PDF (JPG/PNG/HEIC/WEBP) - ✅ Сжатие изображений до 2MB перед конвертацией - ✅ SSE подписка на события OCR/Vision в Step1Policy - ✅ Валидация документов (полис vs неподходящий контент) - ✅ Real-time прогресс загрузки и обработки файлов - ✅ Интеграция с n8n webhooks для проверки полиса и загрузки файлов n8n Workflows: - ✅ Проверка полиса в MySQL + запись в PostgreSQL - ✅ Загрузка файлов в S3 + OCR + Vision AI - ✅ Публикация событий в Redis через backend API - ✅ Валидация документов (распознавание полисов ERV) Документация: - 📝 N8N_INTEGRATION.md - интеграция с n8n - 📝 N8N_SQL_QUERIES.md - SQL запросы для workflows - 📝 N8N_PDF_COMPRESS.md - сжатие PDF - 📝 N8N_STIRLING_COMPRESS.md - интеграция Stirling-PDF Утилиты: - 🔧 monitor_redis.py/sh - мониторинг Redis Pub/Sub - 🔧 test_redis_events.sh - тестирование событий - 🔧 pdfConverter.ts - клиентская конвертация в PDF Архитектура: React → n8n webhooks (sync) → MySQL/PostgreSQL/S3 → n8n workflows (async) → OCR/Vision → Redis Pub/Sub → SSE → React
2025-10-27 08:33:16 +03:00
feat: Пошаговая загрузка документов с модалкой на Step 2 🎯 Изменения: - Документы загружаются по очереди (один за другим) - После загрузки каждого документа открывается модалка с крутилкой - SSE слушает конкретный event_type: {file_type}_processed - Модалка показывает результат распознавания с извлечёнными данными - Кнопка 'Продолжить' → переход к следующему документу - Опциональные документы можно пропустить - После обработки всех обязательных → 'Далее на Step 3' 📊 UX флоу: 1. Выбор типа события → показываются нужные документы 2. Документ 1: Выбрать файл → Загрузить → Модалка → Результат → Продолжить 3. Документ 2: Выбрать файл → Загрузить → Модалка → Результат → Продолжить 4. Документ 3 (опц): Загрузить ИЛИ Пропустить 5. Все обязательные обработаны → Далее на Step 3 🔑 Каждый документ получает свой уникальный event_type: - frontend отправляет file_type - n8n возвращает event_type = {file_type}_processed - frontend слушает этот конкретный event_type через SSE
2025-10-28 12:43:38 +03:00
const uploadResponse = await fetch('https://n8n.clientright.pro/webhook/7e2abc64-eaca-4671-86e4-12786700fe95', {
method: 'POST',
body: uploadFormData,
});
feat: Step2 переделан + улучшен Debug Panel с полными S3 URL Step2Details (по скриншоту): ✅ Индикатор '✅ Полис найден' вверху ✅ Select с типами событий из erv_ticket: - Задержка авиарейса (более 3 часов) - Отмена авиарейса - Пропуск стыковочного рейса - Посадка на запасной аэродром - Задержка отправки поезда - Отмена поезда - Задержка/отмена парома/круизного судна ✅ Дата наступления страхового случая (DatePicker) ✅ Номер рейса/поезда/парома ✅ Загрузка подтверждающих документов: - Посадочный талон, билет, справка и т.д. - До 10 файлов по 15MB - HEIC, PDF, фото Debug Panel улучшения: ✅ Полные S3 URL (не обрезанные) ✅ Кнопка '🔗 Открыть в новой вкладке' ✅ word-break: break-all для длинных URL ✅ Показывает все файлы из массива ✅ Для каждого файла: - Filename - File ID (UUID) - Size (KB) - Полный S3 URL (кликабельный) Теперь в Debug видно КУДА загрузилось: https://s3.twcstorage.ru/f9825c87-.../policies/20251024_213045_abc123_file.jpg Можно кликнуть и посмотреть глазами! 👀
2025-10-25 09:27:56 +03:00
feat: Пошаговая загрузка документов с модалкой на Step 2 🎯 Изменения: - Документы загружаются по очереди (один за другим) - После загрузки каждого документа открывается модалка с крутилкой - SSE слушает конкретный event_type: {file_type}_processed - Модалка показывает результат распознавания с извлечёнными данными - Кнопка 'Продолжить' → переход к следующему документу - Опциональные документы можно пропустить - После обработки всех обязательных → 'Далее на Step 3' 📊 UX флоу: 1. Выбор типа события → показываются нужные документы 2. Документ 1: Выбрать файл → Загрузить → Модалка → Результат → Продолжить 3. Документ 2: Выбрать файл → Загрузить → Модалка → Результат → Продолжить 4. Документ 3 (опц): Загрузить ИЛИ Пропустить 5. Все обязательные обработаны → Далее на Step 3 🔑 Каждый документ получает свой уникальный event_type: - frontend отправляет file_type - n8n возвращает event_type = {file_type}_processed - frontend слушает этот конкретный event_type через SSE
2025-10-28 12:43:38 +03:00
const uploadResult = await uploadResponse.json();
console.log('📤 Файл загружен, ждём OCR результат...');
addDebugEvent?.('upload', 'success', `✅ Файл загружен, обрабатывается...`, {
file_type: currentDocConfig.file_type
});
// SSE обработчик получит результат и обновит состояние
feat: Step2 переделан + улучшен Debug Panel с полными S3 URL Step2Details (по скриншоту): ✅ Индикатор '✅ Полис найден' вверху ✅ Select с типами событий из erv_ticket: - Задержка авиарейса (более 3 часов) - Отмена авиарейса - Пропуск стыковочного рейса - Посадка на запасной аэродром - Задержка отправки поезда - Отмена поезда - Задержка/отмена парома/круизного судна ✅ Дата наступления страхового случая (DatePicker) ✅ Номер рейса/поезда/парома ✅ Загрузка подтверждающих документов: - Посадочный талон, билет, справка и т.д. - До 10 файлов по 15MB - HEIC, PDF, фото Debug Panel улучшения: ✅ Полные S3 URL (не обрезанные) ✅ Кнопка '🔗 Открыть в новой вкладке' ✅ word-break: break-all для длинных URL ✅ Показывает все файлы из массива ✅ Для каждого файла: - Filename - File ID (UUID) - Size (KB) - Полный S3 URL (кликабельный) Теперь в Debug видно КУДА загрузилось: https://s3.twcstorage.ru/f9825c87-.../policies/20251024_213045_abc123_file.jpg Можно кликнуть и посмотреть глазами! 👀
2025-10-25 09:27:56 +03:00
feat: Пошаговая загрузка документов с модалкой на Step 2 🎯 Изменения: - Документы загружаются по очереди (один за другим) - После загрузки каждого документа открывается модалка с крутилкой - SSE слушает конкретный event_type: {file_type}_processed - Модалка показывает результат распознавания с извлечёнными данными - Кнопка 'Продолжить' → переход к следующему документу - Опциональные документы можно пропустить - После обработки всех обязательных → 'Далее на Step 3' 📊 UX флоу: 1. Выбор типа события → показываются нужные документы 2. Документ 1: Выбрать файл → Загрузить → Модалка → Результат → Продолжить 3. Документ 2: Выбрать файл → Загрузить → Модалка → Результат → Продолжить 4. Документ 3 (опц): Загрузить ИЛИ Пропустить 5. Все обязательные обработаны → Далее на Step 3 🔑 Каждый документ получает свой уникальный event_type: - frontend отправляет file_type - n8n возвращает event_type = {file_type}_processed - frontend слушает этот конкретный event_type через SSE
2025-10-28 12:43:38 +03:00
} catch (error: any) {
console.error('Ошибка загрузки:', error);
message.error('Ошибка загрузки файла');
feat: Step2 переделан + улучшен Debug Panel с полными S3 URL Step2Details (по скриншоту): ✅ Индикатор '✅ Полис найден' вверху ✅ Select с типами событий из erv_ticket: - Задержка авиарейса (более 3 часов) - Отмена авиарейса - Пропуск стыковочного рейса - Посадка на запасной аэродром - Задержка отправки поезда - Отмена поезда - Задержка/отмена парома/круизного судна ✅ Дата наступления страхового случая (DatePicker) ✅ Номер рейса/поезда/парома ✅ Загрузка подтверждающих документов: - Посадочный талон, билет, справка и т.д. - До 10 файлов по 15MB - HEIC, PDF, фото Debug Panel улучшения: ✅ Полные S3 URL (не обрезанные) ✅ Кнопка '🔗 Открыть в новой вкладке' ✅ word-break: break-all для длинных URL ✅ Показывает все файлы из массива ✅ Для каждого файла: - Filename - File ID (UUID) - Size (KB) - Полный S3 URL (кликабельный) Теперь в Debug видно КУДА загрузилось: https://s3.twcstorage.ru/f9825c87-.../policies/20251024_213045_abc123_file.jpg Можно кликнуть и посмотреть глазами! 👀
2025-10-25 09:27:56 +03:00
setUploading(false);
feat: Пошаговая загрузка документов с модалкой на Step 2 🎯 Изменения: - Документы загружаются по очереди (один за другим) - После загрузки каждого документа открывается модалка с крутилкой - SSE слушает конкретный event_type: {file_type}_processed - Модалка показывает результат распознавания с извлечёнными данными - Кнопка 'Продолжить' → переход к следующему документу - Опциональные документы можно пропустить - После обработки всех обязательных → 'Далее на Step 3' 📊 UX флоу: 1. Выбор типа события → показываются нужные документы 2. Документ 1: Выбрать файл → Загрузить → Модалка → Результат → Продолжить 3. Документ 2: Выбрать файл → Загрузить → Модалка → Результат → Продолжить 4. Документ 3 (опц): Загрузить ИЛИ Пропустить 5. Все обязательные обработаны → Далее на Step 3 🔑 Каждый документ получает свой уникальный event_type: - frontend отправляет file_type - n8n возвращает event_type = {file_type}_processed - frontend слушает этот конкретный event_type через SSE
2025-10-28 12:43:38 +03:00
setOcrModalVisible(false);
addDebugEvent?.('upload', 'error', `❌ Ошибка загрузки: ${error.message}`);
}
};
feat: Пошаговая загрузка документов с модалкой на Step 2 🎯 Изменения: - Документы загружаются по очереди (один за другим) - После загрузки каждого документа открывается модалка с крутилкой - SSE слушает конкретный event_type: {file_type}_processed - Модалка показывает результат распознавания с извлечёнными данными - Кнопка 'Продолжить' → переход к следующему документу - Опциональные документы можно пропустить - После обработки всех обязательных → 'Далее на Step 3' 📊 UX флоу: 1. Выбор типа события → показываются нужные документы 2. Документ 1: Выбрать файл → Загрузить → Модалка → Результат → Продолжить 3. Документ 2: Выбрать файл → Загрузить → Модалка → Результат → Продолжить 4. Документ 3 (опц): Загрузить ИЛИ Пропустить 5. Все обязательные обработаны → Далее на Step 3 🔑 Каждый документ получает свой уникальный event_type: - frontend отправляет file_type - n8n возвращает event_type = {file_type}_processed - frontend слушает этот конкретный event_type через SSE
2025-10-28 12:43:38 +03:00
const handleContinueToNextDocument = () => {
setOcrModalVisible(false);
setCurrentFile(null);
setCurrentDocumentIndex(prev => prev + 1);
};
const handleSkipOptionalDocument = () => {
setCurrentFile(null);
setCurrentDocumentIndex(prev => prev + 1);
};
const handleFinishStep = () => {
updateFormData({
eventType,
processedDocuments
});
onNext();
};
// Прогресс загрузки
const totalRequired = currentDocuments.filter(d => d.required).length;
const processedRequired = currentDocuments.filter(d => d.required && processedDocuments[d.field]).length;
const progressPercent = totalRequired > 0 ? Math.round((processedRequired / totalRequired) * 100) : 0;
return (
<Form
form={form}
layout="vertical"
initialValues={formData}
style={{ marginTop: 24 }}
>
<Form.Item
feat: Step2 переделан + улучшен Debug Panel с полными S3 URL Step2Details (по скриншоту): ✅ Индикатор '✅ Полис найден' вверху ✅ Select с типами событий из erv_ticket: - Задержка авиарейса (более 3 часов) - Отмена авиарейса - Пропуск стыковочного рейса - Посадка на запасной аэродром - Задержка отправки поезда - Отмена поезда - Задержка/отмена парома/круизного судна ✅ Дата наступления страхового случая (DatePicker) ✅ Номер рейса/поезда/парома ✅ Загрузка подтверждающих документов: - Посадочный талон, билет, справка и т.д. - До 10 файлов по 15MB - HEIC, PDF, фото Debug Panel улучшения: ✅ Полные S3 URL (не обрезанные) ✅ Кнопка '🔗 Открыть в новой вкладке' ✅ word-break: break-all для длинных URL ✅ Показывает все файлы из массива ✅ Для каждого файла: - Filename - File ID (UUID) - Size (KB) - Полный S3 URL (кликабельный) Теперь в Debug видно КУДА загрузилось: https://s3.twcstorage.ru/f9825c87-.../policies/20251024_213045_abc123_file.jpg Можно кликнуть и посмотреть глазами! 👀
2025-10-25 09:27:56 +03:00
label="Выберите тип события"
name="eventType"
rules={[{ required: true, message: 'Выберите тип события' }]}
>
feat: Step2 переделан + улучшен Debug Panel с полными S3 URL Step2Details (по скриншоту): ✅ Индикатор '✅ Полис найден' вверху ✅ Select с типами событий из erv_ticket: - Задержка авиарейса (более 3 часов) - Отмена авиарейса - Пропуск стыковочного рейса - Посадка на запасной аэродром - Задержка отправки поезда - Отмена поезда - Задержка/отмена парома/круизного судна ✅ Дата наступления страхового случая (DatePicker) ✅ Номер рейса/поезда/парома ✅ Загрузка подтверждающих документов: - Посадочный талон, билет, справка и т.д. - До 10 файлов по 15MB - HEIC, PDF, фото Debug Panel улучшения: ✅ Полные S3 URL (не обрезанные) ✅ Кнопка '🔗 Открыть в новой вкладке' ✅ word-break: break-all для длинных URL ✅ Показывает все файлы из массива ✅ Для каждого файла: - Filename - File ID (UUID) - Size (KB) - Полный S3 URL (кликабельный) Теперь в Debug видно КУДА загрузилось: https://s3.twcstorage.ru/f9825c87-.../policies/20251024_213045_abc123_file.jpg Можно кликнуть и посмотреть глазами! 👀
2025-10-25 09:27:56 +03:00
<Select
placeholder="Выберите тип события"
size="large"
fix: 3 критических исправления - OCR прогресс, условные поля, убран некорректный статус 1. ✅ OCR Progress Bar: - Добавлен polling OCR результатов каждые 3 сек - Визуальный индикатор: 🔍 Обработка OCR... (1/10) - Progress bar с анимацией - Статусы: 🔄 Запуск → 🔍 Обработка → ✅ Завершен - Gemini Vision результаты в Debug панели 2. ✅ Убран некорректный 'Полис найден': - Было: показывался сразу после загрузки файла - Проблема: OCR еще не закончился, может быть шляпа - Решение: убрана зеленая плашка с Step2 - Статус полиса только после реальной проверки 3. ✅ Условные поля для стыковочного рейса: - Если выбран 'miss_connection' → показываются 4 доп поля: • Номер рейса прибытия • Дата рейса прибытия • Номер рейса отправления • Дата рейса отправления - Если выбран 'cancel_flight' → доп поле: • Подтверждение отмены от АК - Для обычных рейсов: только номер рейса Frontend изменения: - Step1Policy: OCR polling, progress bar - Step2Details: условная логика полей (как в erv_ticket) - useState для eventType - handleEventTypeChange для динамики Теперь: ✅ Видно прогресс OCR ✅ Видно результаты Gemini Vision ✅ Условные поля работают ✅ Нет ложных статусов
2025-10-25 10:12:41 +03:00
onChange={handleEventTypeChange}
feat: Step2 переделан + улучшен Debug Panel с полными S3 URL Step2Details (по скриншоту): ✅ Индикатор '✅ Полис найден' вверху ✅ Select с типами событий из erv_ticket: - Задержка авиарейса (более 3 часов) - Отмена авиарейса - Пропуск стыковочного рейса - Посадка на запасной аэродром - Задержка отправки поезда - Отмена поезда - Задержка/отмена парома/круизного судна ✅ Дата наступления страхового случая (DatePicker) ✅ Номер рейса/поезда/парома ✅ Загрузка подтверждающих документов: - Посадочный талон, билет, справка и т.д. - До 10 файлов по 15MB - HEIC, PDF, фото Debug Panel улучшения: ✅ Полные S3 URL (не обрезанные) ✅ Кнопка '🔗 Открыть в новой вкладке' ✅ word-break: break-all для длинных URL ✅ Показывает все файлы из массива ✅ Для каждого файла: - Filename - File ID (UUID) - Size (KB) - Полный S3 URL (кликабельный) Теперь в Debug видно КУДА загрузилось: https://s3.twcstorage.ru/f9825c87-.../policies/20251024_213045_abc123_file.jpg Можно кликнуть и посмотреть глазами! 👀
2025-10-25 09:27:56 +03:00
>
{EVENT_TYPES.map(type => (
<Option key={type.value} value={type.value}>
{type.label}
</Option>
))}
</Select>
</Form.Item>
feat: Пошаговая загрузка документов с модалкой на Step 2 🎯 Изменения: - Документы загружаются по очереди (один за другим) - После загрузки каждого документа открывается модалка с крутилкой - SSE слушает конкретный event_type: {file_type}_processed - Модалка показывает результат распознавания с извлечёнными данными - Кнопка 'Продолжить' → переход к следующему документу - Опциональные документы можно пропустить - После обработки всех обязательных → 'Далее на Step 3' 📊 UX флоу: 1. Выбор типа события → показываются нужные документы 2. Документ 1: Выбрать файл → Загрузить → Модалка → Результат → Продолжить 3. Документ 2: Выбрать файл → Загрузить → Модалка → Результат → Продолжить 4. Документ 3 (опц): Загрузить ИЛИ Пропустить 5. Все обязательные обработаны → Далее на Step 3 🔑 Каждый документ получает свой уникальный event_type: - frontend отправляет file_type - n8n возвращает event_type = {file_type}_processed - frontend слушает этот конкретный event_type через SSE
2025-10-28 12:43:38 +03:00
{/* Прогресс обработки документов */}
feat: Умная форма Step2 с автоматическим распознаванием документов 🤖 Переход на OCR/AI для извлечения данных из документов: ✅ Изменения: - Убран ручной ввод полей (дата, номер рейса и тд) - Добавлена умная загрузка документов в зависимости от типа события - Каждый тип документа получает уникальный file_type для n8n - Валидация обязательных документов перед переходом 📋 Типы документов и их file_type: 1. Задержка рейса: - flight_delay_boarding_or_ticket (обяз) - flight_delay_confirmation (обяз) 2. Отмена рейса: - flight_cancel_ticket (обяз) - flight_cancel_notice (обяз) 3. Пропуск стыковки: - connection_arrival_boarding (обяз) - connection_departure_boarding_or_ticket (обяз) - connection_delay_proof (опц) 4. Поезд (задержка): - train_ticket (обяз) - train_delay_proof (обяз) 5. Поезд (отмена): - train_ticket (обяз) - train_cancel_proof (обяз) 6. Паром: - ferry_ticket (обяз) - ferry_delay_proof (обяз) 7. Запасной аэродром: - emergency_boarding_or_ticket (обяз) - emergency_landing_proof (обяз) 🔑 file_type позволяет n8n разделять потоки и применять разные AI промпты для каждого типа документа. Backup старой версии: Step2Details.OLD_MANUAL_INPUT.tsx
2025-10-28 12:03:12 +03:00
{eventType && currentDocuments.length > 0 && (
feat: Пошаговая загрузка документов с модалкой на Step 2 🎯 Изменения: - Документы загружаются по очереди (один за другим) - После загрузки каждого документа открывается модалка с крутилкой - SSE слушает конкретный event_type: {file_type}_processed - Модалка показывает результат распознавания с извлечёнными данными - Кнопка 'Продолжить' → переход к следующему документу - Опциональные документы можно пропустить - После обработки всех обязательных → 'Далее на Step 3' 📊 UX флоу: 1. Выбор типа события → показываются нужные документы 2. Документ 1: Выбрать файл → Загрузить → Модалка → Результат → Продолжить 3. Документ 2: Выбрать файл → Загрузить → Модалка → Результат → Продолжить 4. Документ 3 (опц): Загрузить ИЛИ Пропустить 5. Все обязательные обработаны → Далее на Step 3 🔑 Каждый документ получает свой уникальный event_type: - frontend отправляет file_type - n8n возвращает event_type = {file_type}_processed - frontend слушает этот конкретный event_type через SSE
2025-10-28 12:43:38 +03:00
<Card style={{ marginBottom: 24, background: '#f0f9ff', borderColor: '#91d5ff' }}>
<div style={{ marginBottom: 12 }}>
<strong>Прогресс обработки документов:</strong>
</div>
<Progress
percent={progressPercent}
status={allRequiredProcessed ? 'success' : 'active'}
format={() => `${processedRequired}/${totalRequired} обязательных`}
/>
{/* Список обработанных документов */}
{Object.keys(processedDocuments).length > 0 && (
<div style={{ marginTop: 16 }}>
{currentDocuments.map(doc =>
processedDocuments[doc.field] ? (
<div key={doc.field} style={{ marginBottom: 8, color: '#52c41a' }}>
<CheckCircleOutlined /> {doc.name} - Обработан
</div>
) : null
)}
</div>
)}
</Card>
)}
{/* Текущий документ для загрузки */}
{eventType && currentDocConfig && (
feat: Умная форма Step2 с автоматическим распознаванием документов 🤖 Переход на OCR/AI для извлечения данных из документов: ✅ Изменения: - Убран ручной ввод полей (дата, номер рейса и тд) - Добавлена умная загрузка документов в зависимости от типа события - Каждый тип документа получает уникальный file_type для n8n - Валидация обязательных документов перед переходом 📋 Типы документов и их file_type: 1. Задержка рейса: - flight_delay_boarding_or_ticket (обяз) - flight_delay_confirmation (обяз) 2. Отмена рейса: - flight_cancel_ticket (обяз) - flight_cancel_notice (обяз) 3. Пропуск стыковки: - connection_arrival_boarding (обяз) - connection_departure_boarding_or_ticket (обяз) - connection_delay_proof (опц) 4. Поезд (задержка): - train_ticket (обяз) - train_delay_proof (обяз) 5. Поезд (отмена): - train_ticket (обяз) - train_cancel_proof (обяз) 6. Паром: - ferry_ticket (обяз) - ferry_delay_proof (обяз) 7. Запасной аэродром: - emergency_boarding_or_ticket (обяз) - emergency_landing_proof (обяз) 🔑 file_type позволяет n8n разделять потоки и применять разные AI промпты для каждого типа документа. Backup старой версии: Step2Details.OLD_MANUAL_INPUT.tsx
2025-10-28 12:03:12 +03:00
<Card
feat: Пошаговая загрузка документов с модалкой на Step 2 🎯 Изменения: - Документы загружаются по очереди (один за другим) - После загрузки каждого документа открывается модалка с крутилкой - SSE слушает конкретный event_type: {file_type}_processed - Модалка показывает результат распознавания с извлечёнными данными - Кнопка 'Продолжить' → переход к следующему документу - Опциональные документы можно пропустить - После обработки всех обязательных → 'Далее на Step 3' 📊 UX флоу: 1. Выбор типа события → показываются нужные документы 2. Документ 1: Выбрать файл → Загрузить → Модалка → Результат → Продолжить 3. Документ 2: Выбрать файл → Загрузить → Модалка → Результат → Продолжить 4. Документ 3 (опц): Загрузить ИЛИ Пропустить 5. Все обязательные обработаны → Далее на Step 3 🔑 Каждый документ получает свой уникальный event_type: - frontend отправляет file_type - n8n возвращает event_type = {file_type}_processed - frontend слушает этот конкретный event_type через SSE
2025-10-28 12:43:38 +03:00
title={`📋 Шаг ${currentDocumentIndex + 1}/${currentDocuments.length}: ${currentDocConfig.name}`}
feat: Умная форма Step2 с автоматическим распознаванием документов 🤖 Переход на OCR/AI для извлечения данных из документов: ✅ Изменения: - Убран ручной ввод полей (дата, номер рейса и тд) - Добавлена умная загрузка документов в зависимости от типа события - Каждый тип документа получает уникальный file_type для n8n - Валидация обязательных документов перед переходом 📋 Типы документов и их file_type: 1. Задержка рейса: - flight_delay_boarding_or_ticket (обяз) - flight_delay_confirmation (обяз) 2. Отмена рейса: - flight_cancel_ticket (обяз) - flight_cancel_notice (обяз) 3. Пропуск стыковки: - connection_arrival_boarding (обяз) - connection_departure_boarding_or_ticket (обяз) - connection_delay_proof (опц) 4. Поезд (задержка): - train_ticket (обяз) - train_delay_proof (обяз) 5. Поезд (отмена): - train_ticket (обяз) - train_cancel_proof (обяз) 6. Паром: - ferry_ticket (обяз) - ferry_delay_proof (обяз) 7. Запасной аэродром: - emergency_boarding_or_ticket (обяз) - emergency_landing_proof (обяз) 🔑 file_type позволяет n8n разделять потоки и применять разные AI промпты для каждого типа документа. Backup старой версии: Step2Details.OLD_MANUAL_INPUT.tsx
2025-10-28 12:03:12 +03:00
style={{ marginTop: 24 }}
feat: Пошаговая загрузка документов с модалкой на Step 2 🎯 Изменения: - Документы загружаются по очереди (один за другим) - После загрузки каждого документа открывается модалка с крутилкой - SSE слушает конкретный event_type: {file_type}_processed - Модалка показывает результат распознавания с извлечёнными данными - Кнопка 'Продолжить' → переход к следующему документу - Опциональные документы можно пропустить - После обработки всех обязательных → 'Далее на Step 3' 📊 UX флоу: 1. Выбор типа события → показываются нужные документы 2. Документ 1: Выбрать файл → Загрузить → Модалка → Результат → Продолжить 3. Документ 2: Выбрать файл → Загрузить → Модалка → Результат → Продолжить 4. Документ 3 (опц): Загрузить ИЛИ Пропустить 5. Все обязательные обработаны → Далее на Step 3 🔑 Каждый документ получает свой уникальный event_type: - frontend отправляет file_type - n8n возвращает event_type = {file_type}_processed - frontend слушает этот конкретный event_type через SSE
2025-10-28 12:43:38 +03:00
headStyle={{ background: currentDocConfig.required ? '#fff7e6' : '#f0f9ff', borderBottom: '2px solid #ffa940' }}
fix: 3 критических исправления - OCR прогресс, условные поля, убран некорректный статус 1. ✅ OCR Progress Bar: - Добавлен polling OCR результатов каждые 3 сек - Визуальный индикатор: 🔍 Обработка OCR... (1/10) - Progress bar с анимацией - Статусы: 🔄 Запуск → 🔍 Обработка → ✅ Завершен - Gemini Vision результаты в Debug панели 2. ✅ Убран некорректный 'Полис найден': - Было: показывался сразу после загрузки файла - Проблема: OCR еще не закончился, может быть шляпа - Решение: убрана зеленая плашка с Step2 - Статус полиса только после реальной проверки 3. ✅ Условные поля для стыковочного рейса: - Если выбран 'miss_connection' → показываются 4 доп поля: • Номер рейса прибытия • Дата рейса прибытия • Номер рейса отправления • Дата рейса отправления - Если выбран 'cancel_flight' → доп поле: • Подтверждение отмены от АК - Для обычных рейсов: только номер рейса Frontend изменения: - Step1Policy: OCR polling, progress bar - Step2Details: условная логика полей (как в erv_ticket) - useState для eventType - handleEventTypeChange для динамики Теперь: ✅ Видно прогресс OCR ✅ Видно результаты Gemini Vision ✅ Условные поля работают ✅ Нет ложных статусов
2025-10-25 10:12:41 +03:00
>
feat: Умная форма Step2 с автоматическим распознаванием документов 🤖 Переход на OCR/AI для извлечения данных из документов: ✅ Изменения: - Убран ручной ввод полей (дата, номер рейса и тд) - Добавлена умная загрузка документов в зависимости от типа события - Каждый тип документа получает уникальный file_type для n8n - Валидация обязательных документов перед переходом 📋 Типы документов и их file_type: 1. Задержка рейса: - flight_delay_boarding_or_ticket (обяз) - flight_delay_confirmation (обяз) 2. Отмена рейса: - flight_cancel_ticket (обяз) - flight_cancel_notice (обяз) 3. Пропуск стыковки: - connection_arrival_boarding (обяз) - connection_departure_boarding_or_ticket (обяз) - connection_delay_proof (опц) 4. Поезд (задержка): - train_ticket (обяз) - train_delay_proof (обяз) 5. Поезд (отмена): - train_ticket (обяз) - train_cancel_proof (обяз) 6. Паром: - ferry_ticket (обяз) - ferry_delay_proof (обяз) 7. Запасной аэродром: - emergency_boarding_or_ticket (обяз) - emergency_landing_proof (обяз) 🔑 file_type позволяет n8n разделять потоки и применять разные AI промпты для каждого типа документа. Backup старой версии: Step2Details.OLD_MANUAL_INPUT.tsx
2025-10-28 12:03:12 +03:00
<div style={{ marginBottom: 16, padding: 12, background: '#e6f7ff', borderRadius: 8 }}>
<p style={{ margin: 0, fontSize: 13, color: '#0050b3' }}>
feat: Пошаговая загрузка документов с модалкой на Step 2 🎯 Изменения: - Документы загружаются по очереди (один за другим) - После загрузки каждого документа открывается модалка с крутилкой - SSE слушает конкретный event_type: {file_type}_processed - Модалка показывает результат распознавания с извлечёнными данными - Кнопка 'Продолжить' → переход к следующему документу - Опциональные документы можно пропустить - После обработки всех обязательных → 'Далее на Step 3' 📊 UX флоу: 1. Выбор типа события → показываются нужные документы 2. Документ 1: Выбрать файл → Загрузить → Модалка → Результат → Продолжить 3. Документ 2: Выбрать файл → Загрузить → Модалка → Результат → Продолжить 4. Документ 3 (опц): Загрузить ИЛИ Пропустить 5. Все обязательные обработаны → Далее на Step 3 🔑 Каждый документ получает свой уникальный event_type: - frontend отправляет file_type - n8n возвращает event_type = {file_type}_processed - frontend слушает этот конкретный event_type через SSE
2025-10-28 12:43:38 +03:00
💡 {currentDocConfig.description}
feat: Умная форма Step2 с автоматическим распознаванием документов 🤖 Переход на OCR/AI для извлечения данных из документов: ✅ Изменения: - Убран ручной ввод полей (дата, номер рейса и тд) - Добавлена умная загрузка документов в зависимости от типа события - Каждый тип документа получает уникальный file_type для n8n - Валидация обязательных документов перед переходом 📋 Типы документов и их file_type: 1. Задержка рейса: - flight_delay_boarding_or_ticket (обяз) - flight_delay_confirmation (обяз) 2. Отмена рейса: - flight_cancel_ticket (обяз) - flight_cancel_notice (обяз) 3. Пропуск стыковки: - connection_arrival_boarding (обяз) - connection_departure_boarding_or_ticket (обяз) - connection_delay_proof (опц) 4. Поезд (задержка): - train_ticket (обяз) - train_delay_proof (обяз) 5. Поезд (отмена): - train_ticket (обяз) - train_cancel_proof (обяз) 6. Паром: - ferry_ticket (обяз) - ferry_delay_proof (обяз) 7. Запасной аэродром: - emergency_boarding_or_ticket (обяз) - emergency_landing_proof (обяз) 🔑 file_type позволяет n8n разделять потоки и применять разные AI промпты для каждого типа документа. Backup старой версии: Step2Details.OLD_MANUAL_INPUT.tsx
2025-10-28 12:03:12 +03:00
</p>
feat: Пошаговая загрузка документов с модалкой на Step 2 🎯 Изменения: - Документы загружаются по очереди (один за другим) - После загрузки каждого документа открывается модалка с крутилкой - SSE слушает конкретный event_type: {file_type}_processed - Модалка показывает результат распознавания с извлечёнными данными - Кнопка 'Продолжить' → переход к следующему документу - Опциональные документы можно пропустить - После обработки всех обязательных → 'Далее на Step 3' 📊 UX флоу: 1. Выбор типа события → показываются нужные документы 2. Документ 1: Выбрать файл → Загрузить → Модалка → Результат → Продолжить 3. Документ 2: Выбрать файл → Загрузить → Модалка → Результат → Продолжить 4. Документ 3 (опц): Загрузить ИЛИ Пропустить 5. Все обязательные обработаны → Далее на Step 3 🔑 Каждый документ получает свой уникальный event_type: - frontend отправляет file_type - n8n возвращает event_type = {file_type}_processed - frontend слушает этот конкретный event_type через SSE
2025-10-28 12:43:38 +03:00
{currentDocConfig.required && (
<p style={{ margin: '8px 0 0 0', fontSize: 12, color: '#d46b08' }}>
Этот документ обязательный
</p>
)}
feat: Умная форма Step2 с автоматическим распознаванием документов 🤖 Переход на OCR/AI для извлечения данных из документов: ✅ Изменения: - Убран ручной ввод полей (дата, номер рейса и тд) - Добавлена умная загрузка документов в зависимости от типа события - Каждый тип документа получает уникальный file_type для n8n - Валидация обязательных документов перед переходом 📋 Типы документов и их file_type: 1. Задержка рейса: - flight_delay_boarding_or_ticket (обяз) - flight_delay_confirmation (обяз) 2. Отмена рейса: - flight_cancel_ticket (обяз) - flight_cancel_notice (обяз) 3. Пропуск стыковки: - connection_arrival_boarding (обяз) - connection_departure_boarding_or_ticket (обяз) - connection_delay_proof (опц) 4. Поезд (задержка): - train_ticket (обяз) - train_delay_proof (обяз) 5. Поезд (отмена): - train_ticket (обяз) - train_cancel_proof (обяз) 6. Паром: - ferry_ticket (обяз) - ferry_delay_proof (обяз) 7. Запасной аэродром: - emergency_boarding_or_ticket (обяз) - emergency_landing_proof (обяз) 🔑 file_type позволяет n8n разделять потоки и применять разные AI промпты для каждого типа документа. Backup старой версии: Step2Details.OLD_MANUAL_INPUT.tsx
2025-10-28 12:03:12 +03:00
</div>
fix: 3 критических исправления - OCR прогресс, условные поля, убран некорректный статус 1. ✅ OCR Progress Bar: - Добавлен polling OCR результатов каждые 3 сек - Визуальный индикатор: 🔍 Обработка OCR... (1/10) - Progress bar с анимацией - Статусы: 🔄 Запуск → 🔍 Обработка → ✅ Завершен - Gemini Vision результаты в Debug панели 2. ✅ Убран некорректный 'Полис найден': - Было: показывался сразу после загрузки файла - Проблема: OCR еще не закончился, может быть шляпа - Решение: убрана зеленая плашка с Step2 - Статус полиса только после реальной проверки 3. ✅ Условные поля для стыковочного рейса: - Если выбран 'miss_connection' → показываются 4 доп поля: • Номер рейса прибытия • Дата рейса прибытия • Номер рейса отправления • Дата рейса отправления - Если выбран 'cancel_flight' → доп поле: • Подтверждение отмены от АК - Для обычных рейсов: только номер рейса Frontend изменения: - Step1Policy: OCR polling, progress bar - Step2Details: условная логика полей (как в erv_ticket) - useState для eventType - handleEventTypeChange для динамики Теперь: ✅ Видно прогресс OCR ✅ Видно результаты Gemini Vision ✅ Условные поля работают ✅ Нет ложных статусов
2025-10-25 10:12:41 +03:00
feat: Пошаговая загрузка документов с модалкой на Step 2 🎯 Изменения: - Документы загружаются по очереди (один за другим) - После загрузки каждого документа открывается модалка с крутилкой - SSE слушает конкретный event_type: {file_type}_processed - Модалка показывает результат распознавания с извлечёнными данными - Кнопка 'Продолжить' → переход к следующему документу - Опциональные документы можно пропустить - После обработки всех обязательных → 'Далее на Step 3' 📊 UX флоу: 1. Выбор типа события → показываются нужные документы 2. Документ 1: Выбрать файл → Загрузить → Модалка → Результат → Продолжить 3. Документ 2: Выбрать файл → Загрузить → Модалка → Результат → Продолжить 4. Документ 3 (опц): Загрузить ИЛИ Пропустить 5. Все обязательные обработаны → Далее на Step 3 🔑 Каждый документ получает свой уникальный event_type: - frontend отправляет file_type - n8n возвращает event_type = {file_type}_processed - frontend слушает этот конкретный event_type через SSE
2025-10-28 12:43:38 +03:00
<Upload
beforeUpload={handleFileSelect}
accept="image/*,.pdf,.heic,.heif,.webp"
maxCount={1}
showUploadList={true}
fileList={currentFile ? [{
uid: '-1',
name: currentFile.name,
status: 'done',
url: URL.createObjectURL(currentFile),
}] : []}
onRemove={() => setCurrentFile(null)}
>
<Button
icon={<UploadOutlined />}
size="large"
block
disabled={!!currentFile}
>
Выбрать файл (JPG, PNG, PDF, HEIC, макс 15MB)
</Button>
</Upload>
feat: Умная форма Step2 с автоматическим распознаванием документов 🤖 Переход на OCR/AI для извлечения данных из документов: ✅ Изменения: - Убран ручной ввод полей (дата, номер рейса и тд) - Добавлена умная загрузка документов в зависимости от типа события - Каждый тип документа получает уникальный file_type для n8n - Валидация обязательных документов перед переходом 📋 Типы документов и их file_type: 1. Задержка рейса: - flight_delay_boarding_or_ticket (обяз) - flight_delay_confirmation (обяз) 2. Отмена рейса: - flight_cancel_ticket (обяз) - flight_cancel_notice (обяз) 3. Пропуск стыковки: - connection_arrival_boarding (обяз) - connection_departure_boarding_or_ticket (обяз) - connection_delay_proof (опц) 4. Поезд (задержка): - train_ticket (обяз) - train_delay_proof (обяз) 5. Поезд (отмена): - train_ticket (обяз) - train_cancel_proof (обяз) 6. Паром: - ferry_ticket (обяз) - ferry_delay_proof (обяз) 7. Запасной аэродром: - emergency_boarding_or_ticket (обяз) - emergency_landing_proof (обяз) 🔑 file_type позволяет n8n разделять потоки и применять разные AI промпты для каждого типа документа. Backup старой версии: Step2Details.OLD_MANUAL_INPUT.tsx
2025-10-28 12:03:12 +03:00
feat: Пошаговая загрузка документов с модалкой на Step 2 🎯 Изменения: - Документы загружаются по очереди (один за другим) - После загрузки каждого документа открывается модалка с крутилкой - SSE слушает конкретный event_type: {file_type}_processed - Модалка показывает результат распознавания с извлечёнными данными - Кнопка 'Продолжить' → переход к следующему документу - Опциональные документы можно пропустить - После обработки всех обязательных → 'Далее на Step 3' 📊 UX флоу: 1. Выбор типа события → показываются нужные документы 2. Документ 1: Выбрать файл → Загрузить → Модалка → Результат → Продолжить 3. Документ 2: Выбрать файл → Загрузить → Модалка → Результат → Продолжить 4. Документ 3 (опц): Загрузить ИЛИ Пропустить 5. Все обязательные обработаны → Далее на Step 3 🔑 Каждый документ получает свой уникальный event_type: - frontend отправляет file_type - n8n возвращает event_type = {file_type}_processed - frontend слушает этот конкретный event_type через SSE
2025-10-28 12:43:38 +03:00
<div style={{ marginTop: 16, display: 'flex', gap: 8 }}>
<Button
type="primary"
size="large"
onClick={handleUploadAndProcess}
disabled={!currentFile || uploading}
loading={uploading}
style={{ flex: 1 }}
>
{uploading ? 'Обрабатываем...' : 'Загрузить и обработать'}
</Button>
{!currentDocConfig.required && (
<Button
size="large"
onClick={handleSkipOptionalDocument}
disabled={uploading}
feat: Умная форма Step2 с автоматическим распознаванием документов 🤖 Переход на OCR/AI для извлечения данных из документов: ✅ Изменения: - Убран ручной ввод полей (дата, номер рейса и тд) - Добавлена умная загрузка документов в зависимости от типа события - Каждый тип документа получает уникальный file_type для n8n - Валидация обязательных документов перед переходом 📋 Типы документов и их file_type: 1. Задержка рейса: - flight_delay_boarding_or_ticket (обяз) - flight_delay_confirmation (обяз) 2. Отмена рейса: - flight_cancel_ticket (обяз) - flight_cancel_notice (обяз) 3. Пропуск стыковки: - connection_arrival_boarding (обяз) - connection_departure_boarding_or_ticket (обяз) - connection_delay_proof (опц) 4. Поезд (задержка): - train_ticket (обяз) - train_delay_proof (обяз) 5. Поезд (отмена): - train_ticket (обяз) - train_cancel_proof (обяз) 6. Паром: - ferry_ticket (обяз) - ferry_delay_proof (обяз) 7. Запасной аэродром: - emergency_boarding_or_ticket (обяз) - emergency_landing_proof (обяз) 🔑 file_type позволяет n8n разделять потоки и применять разные AI промпты для каждого типа документа. Backup старой версии: Step2Details.OLD_MANUAL_INPUT.tsx
2025-10-28 12:03:12 +03:00
>
feat: Пошаговая загрузка документов с модалкой на Step 2 🎯 Изменения: - Документы загружаются по очереди (один за другим) - После загрузки каждого документа открывается модалка с крутилкой - SSE слушает конкретный event_type: {file_type}_processed - Модалка показывает результат распознавания с извлечёнными данными - Кнопка 'Продолжить' → переход к следующему документу - Опциональные документы можно пропустить - После обработки всех обязательных → 'Далее на Step 3' 📊 UX флоу: 1. Выбор типа события → показываются нужные документы 2. Документ 1: Выбрать файл → Загрузить → Модалка → Результат → Продолжить 3. Документ 2: Выбрать файл → Загрузить → Модалка → Результат → Продолжить 4. Документ 3 (опц): Загрузить ИЛИ Пропустить 5. Все обязательные обработаны → Далее на Step 3 🔑 Каждый документ получает свой уникальный event_type: - frontend отправляет file_type - n8n возвращает event_type = {file_type}_processed - frontend слушает этот конкретный event_type через SSE
2025-10-28 12:43:38 +03:00
Пропустить
</Button>
)}
</div>
feat: Умная форма Step2 с автоматическим распознаванием документов 🤖 Переход на OCR/AI для извлечения данных из документов: ✅ Изменения: - Убран ручной ввод полей (дата, номер рейса и тд) - Добавлена умная загрузка документов в зависимости от типа события - Каждый тип документа получает уникальный file_type для n8n - Валидация обязательных документов перед переходом 📋 Типы документов и их file_type: 1. Задержка рейса: - flight_delay_boarding_or_ticket (обяз) - flight_delay_confirmation (обяз) 2. Отмена рейса: - flight_cancel_ticket (обяз) - flight_cancel_notice (обяз) 3. Пропуск стыковки: - connection_arrival_boarding (обяз) - connection_departure_boarding_or_ticket (обяз) - connection_delay_proof (опц) 4. Поезд (задержка): - train_ticket (обяз) - train_delay_proof (обяз) 5. Поезд (отмена): - train_ticket (обяз) - train_cancel_proof (обяз) 6. Паром: - ferry_ticket (обяз) - ferry_delay_proof (обяз) 7. Запасной аэродром: - emergency_boarding_or_ticket (обяз) - emergency_landing_proof (обяз) 🔑 file_type позволяет n8n разделять потоки и применять разные AI промпты для каждого типа документа. Backup старой версии: Step2Details.OLD_MANUAL_INPUT.tsx
2025-10-28 12:03:12 +03:00
</Card>
fix: 3 критических исправления - OCR прогресс, условные поля, убран некорректный статус 1. ✅ OCR Progress Bar: - Добавлен polling OCR результатов каждые 3 сек - Визуальный индикатор: 🔍 Обработка OCR... (1/10) - Progress bar с анимацией - Статусы: 🔄 Запуск → 🔍 Обработка → ✅ Завершен - Gemini Vision результаты в Debug панели 2. ✅ Убран некорректный 'Полис найден': - Было: показывался сразу после загрузки файла - Проблема: OCR еще не закончился, может быть шляпа - Решение: убрана зеленая плашка с Step2 - Статус полиса только после реальной проверки 3. ✅ Условные поля для стыковочного рейса: - Если выбран 'miss_connection' → показываются 4 доп поля: • Номер рейса прибытия • Дата рейса прибытия • Номер рейса отправления • Дата рейса отправления - Если выбран 'cancel_flight' → доп поле: • Подтверждение отмены от АК - Для обычных рейсов: только номер рейса Frontend изменения: - Step1Policy: OCR polling, progress bar - Step2Details: условная логика полей (как в erv_ticket) - useState для eventType - handleEventTypeChange для динамики Теперь: ✅ Видно прогресс OCR ✅ Видно результаты Gemini Vision ✅ Условные поля работают ✅ Нет ложных статусов
2025-10-25 10:12:41 +03:00
)}
feat: Пошаговая загрузка документов с модалкой на Step 2 🎯 Изменения: - Документы загружаются по очереди (один за другим) - После загрузки каждого документа открывается модалка с крутилкой - SSE слушает конкретный event_type: {file_type}_processed - Модалка показывает результат распознавания с извлечёнными данными - Кнопка 'Продолжить' → переход к следующему документу - Опциональные документы можно пропустить - После обработки всех обязательных → 'Далее на Step 3' 📊 UX флоу: 1. Выбор типа события → показываются нужные документы 2. Документ 1: Выбрать файл → Загрузить → Модалка → Результат → Продолжить 3. Документ 2: Выбрать файл → Загрузить → Модалка → Результат → Продолжить 4. Документ 3 (опц): Загрузить ИЛИ Пропустить 5. Все обязательные обработаны → Далее на Step 3 🔑 Каждый документ получает свой уникальный event_type: - frontend отправляет file_type - n8n возвращает event_type = {file_type}_processed - frontend слушает этот конкретный event_type через SSE
2025-10-28 12:43:38 +03:00
{/* Если все документы обработаны или текущий индекс вышел за пределы */}
{eventType && currentDocumentIndex >= currentDocuments.length && (
<Card
style={{ marginTop: 24, background: '#f6ffed', borderColor: '#b7eb8f' }}
>
<div style={{ textAlign: 'center', padding: '20px 0' }}>
<CheckCircleOutlined style={{ fontSize: 48, color: '#52c41a', marginBottom: 16 }} />
<h3 style={{ color: '#52c41a' }}> Все документы обработаны!</h3>
<p style={{ color: '#666' }}>
Обработано обязательных документов: {processedRequired}/{totalRequired}
</p>
</div>
</Card>
feat: Интеграция n8n + Redis Pub/Sub + SSE для real-time обработки заявок 🎯 Основные изменения: Backend: - ✅ Добавлен SSE endpoint для real-time событий (/api/v1/events/{task_id}) - ✅ Redis Pub/Sub для публикации/подписки на события OCR/Vision - ✅ Удален aioboto3 из requirements.txt (конфликт зависимостей) - ✅ Добавлен OCR worker (deprecated, логика перенесена в n8n) Frontend (React): - ✅ Автогенерация claim_id и session_id - ✅ Клиентская конвертация файлов в PDF (JPG/PNG/HEIC/WEBP) - ✅ Сжатие изображений до 2MB перед конвертацией - ✅ SSE подписка на события OCR/Vision в Step1Policy - ✅ Валидация документов (полис vs неподходящий контент) - ✅ Real-time прогресс загрузки и обработки файлов - ✅ Интеграция с n8n webhooks для проверки полиса и загрузки файлов n8n Workflows: - ✅ Проверка полиса в MySQL + запись в PostgreSQL - ✅ Загрузка файлов в S3 + OCR + Vision AI - ✅ Публикация событий в Redis через backend API - ✅ Валидация документов (распознавание полисов ERV) Документация: - 📝 N8N_INTEGRATION.md - интеграция с n8n - 📝 N8N_SQL_QUERIES.md - SQL запросы для workflows - 📝 N8N_PDF_COMPRESS.md - сжатие PDF - 📝 N8N_STIRLING_COMPRESS.md - интеграция Stirling-PDF Утилиты: - 🔧 monitor_redis.py/sh - мониторинг Redis Pub/Sub - 🔧 test_redis_events.sh - тестирование событий - 🔧 pdfConverter.ts - клиентская конвертация в PDF Архитектура: React → n8n webhooks (sync) → MySQL/PostgreSQL/S3 → n8n workflows (async) → OCR/Vision → Redis Pub/Sub → SSE → React
2025-10-27 08:33:16 +03:00
)}
feat: Пошаговая загрузка документов с модалкой на Step 2 🎯 Изменения: - Документы загружаются по очереди (один за другим) - После загрузки каждого документа открывается модалка с крутилкой - SSE слушает конкретный event_type: {file_type}_processed - Модалка показывает результат распознавания с извлечёнными данными - Кнопка 'Продолжить' → переход к следующему документу - Опциональные документы можно пропустить - После обработки всех обязательных → 'Далее на Step 3' 📊 UX флоу: 1. Выбор типа события → показываются нужные документы 2. Документ 1: Выбрать файл → Загрузить → Модалка → Результат → Продолжить 3. Документ 2: Выбрать файл → Загрузить → Модалка → Результат → Продолжить 4. Документ 3 (опц): Загрузить ИЛИ Пропустить 5. Все обязательные обработаны → Далее на Step 3 🔑 Каждый документ получает свой уникальный event_type: - frontend отправляет file_type - n8n возвращает event_type = {file_type}_processed - frontend слушает этот конкретный event_type через SSE
2025-10-28 12:43:38 +03:00
{/* Модальное окно обработки OCR */}
<Modal
open={ocrModalVisible}
closable={ocrModalContent !== 'loading'}
maskClosable={false}
footer={ocrModalContent === 'loading' ? null :
ocrModalContent?.success ? [
<Button key="next" type="primary" onClick={handleContinueToNextDocument}>
{currentDocumentIndex < currentDocuments.length - 1 ? 'Продолжить к следующему документу →' : 'Завершить загрузку документов'}
</Button>
] : [
<Button key="retry" type="primary" onClick={() => {
setOcrModalVisible(false);
setUploading(false);
}}>
Попробовать другой файл
</Button>
]
}
width={700}
centered
>
{ocrModalContent === 'loading' ? (
<div style={{ textAlign: 'center', padding: '40px 20px' }}>
<Spin indicator={<LoadingOutlined style={{ fontSize: 48 }} spin />} />
<h3 style={{ marginTop: 24, marginBottom: 12 }}> Обрабатываем документ</h3>
<p style={{ color: '#666', marginBottom: 8 }}>📤 Загрузка в облако...</p>
<p style={{ color: '#666', marginBottom: 8 }}>📝 OCR распознавание текста...</p>
<p style={{ color: '#666', marginBottom: 8 }}>🤖 AI анализ документа...</p>
<p style={{ color: '#666' }}> Извлечение данных...</p>
<p style={{ color: '#999', fontSize: 12, marginTop: 20 }}>
Это может занять 20-30 секунд. Пожалуйста, подождите...
</p>
</div>
) : ocrModalContent ? (
<div>
<h3 style={{ marginBottom: 16 }}>
{ocrModalContent.success ? '✅ Результат обработки' : '❌ Ошибка обработки'}
</h3>
{ocrModalContent.success ? (
<div>
<p style={{ marginBottom: 16, fontSize: 15, fontWeight: 500 }}>
📋 {ocrModalContent.documentName}
</p>
<div style={{
padding: 16,
background: '#f6ffed',
borderRadius: 8,
border: '1px solid #b7eb8f',
marginBottom: 16
}}>
<p style={{ margin: '0 0 8px 0', color: '#52c41a', fontWeight: 500 }}>
Документ успешно распознан
</p>
<p style={{ margin: 0, fontSize: 13, color: '#666' }}>
Данные извлечены и сохранены
</p>
</div>
<p style={{ marginTop: 16 }}><strong>Извлечённые данные:</strong></p>
<pre style={{
background: '#f5f5f5',
padding: 12,
borderRadius: 4,
fontSize: 12,
maxHeight: 400,
overflow: 'auto'
}}>
{JSON.stringify(ocrModalContent.data, null, 2)}
</pre>
</div>
) : (
<div>
<p>{ocrModalContent.message || 'Документ не распознан'}</p>
<p style={{ marginTop: 16 }}><strong>Детали:</strong></p>
<pre style={{
background: '#fff3f3',
padding: 12,
borderRadius: 4,
fontSize: 12,
maxHeight: 400,
overflow: 'auto'
}}>
{JSON.stringify(ocrModalContent.data, null, 2)}
</pre>
</div>
)}
</div>
) : null}
</Modal>
{/* Кнопки навигации */}
<Form.Item>
feat: Step2 переделан + улучшен Debug Panel с полными S3 URL Step2Details (по скриншоту): ✅ Индикатор '✅ Полис найден' вверху ✅ Select с типами событий из erv_ticket: - Задержка авиарейса (более 3 часов) - Отмена авиарейса - Пропуск стыковочного рейса - Посадка на запасной аэродром - Задержка отправки поезда - Отмена поезда - Задержка/отмена парома/круизного судна ✅ Дата наступления страхового случая (DatePicker) ✅ Номер рейса/поезда/парома ✅ Загрузка подтверждающих документов: - Посадочный талон, билет, справка и т.д. - До 10 файлов по 15MB - HEIC, PDF, фото Debug Panel улучшения: ✅ Полные S3 URL (не обрезанные) ✅ Кнопка '🔗 Открыть в новой вкладке' ✅ word-break: break-all для длинных URL ✅ Показывает все файлы из массива ✅ Для каждого файла: - Filename - File ID (UUID) - Size (KB) - Полный S3 URL (кликабельный) Теперь в Debug видно КУДА загрузилось: https://s3.twcstorage.ru/f9825c87-.../policies/20251024_213045_abc123_file.jpg Можно кликнуть и посмотреть глазами! 👀
2025-10-25 09:27:56 +03:00
<div style={{ display: 'flex', gap: 8, marginTop: 32 }}>
feat: Интеграция n8n + Redis Pub/Sub + SSE для real-time обработки заявок 🎯 Основные изменения: Backend: - ✅ Добавлен SSE endpoint для real-time событий (/api/v1/events/{task_id}) - ✅ Redis Pub/Sub для публикации/подписки на события OCR/Vision - ✅ Удален aioboto3 из requirements.txt (конфликт зависимостей) - ✅ Добавлен OCR worker (deprecated, логика перенесена в n8n) Frontend (React): - ✅ Автогенерация claim_id и session_id - ✅ Клиентская конвертация файлов в PDF (JPG/PNG/HEIC/WEBP) - ✅ Сжатие изображений до 2MB перед конвертацией - ✅ SSE подписка на события OCR/Vision в Step1Policy - ✅ Валидация документов (полис vs неподходящий контент) - ✅ Real-time прогресс загрузки и обработки файлов - ✅ Интеграция с n8n webhooks для проверки полиса и загрузки файлов n8n Workflows: - ✅ Проверка полиса в MySQL + запись в PostgreSQL - ✅ Загрузка файлов в S3 + OCR + Vision AI - ✅ Публикация событий в Redis через backend API - ✅ Валидация документов (распознавание полисов ERV) Документация: - 📝 N8N_INTEGRATION.md - интеграция с n8n - 📝 N8N_SQL_QUERIES.md - SQL запросы для workflows - 📝 N8N_PDF_COMPRESS.md - сжатие PDF - 📝 N8N_STIRLING_COMPRESS.md - интеграция Stirling-PDF Утилиты: - 🔧 monitor_redis.py/sh - мониторинг Redis Pub/Sub - 🔧 test_redis_events.sh - тестирование событий - 🔧 pdfConverter.ts - клиентская конвертация в PDF Архитектура: React → n8n webhooks (sync) → MySQL/PostgreSQL/S3 → n8n workflows (async) → OCR/Vision → Redis Pub/Sub → SSE → React
2025-10-27 08:33:16 +03:00
<Button onClick={onPrev} size="large" disabled={uploading}>Назад</Button>
feat: Step2 переделан + улучшен Debug Panel с полными S3 URL Step2Details (по скриншоту): ✅ Индикатор '✅ Полис найден' вверху ✅ Select с типами событий из erv_ticket: - Задержка авиарейса (более 3 часов) - Отмена авиарейса - Пропуск стыковочного рейса - Посадка на запасной аэродром - Задержка отправки поезда - Отмена поезда - Задержка/отмена парома/круизного судна ✅ Дата наступления страхового случая (DatePicker) ✅ Номер рейса/поезда/парома ✅ Загрузка подтверждающих документов: - Посадочный талон, билет, справка и т.д. - До 10 файлов по 15MB - HEIC, PDF, фото Debug Panel улучшения: ✅ Полные S3 URL (не обрезанные) ✅ Кнопка '🔗 Открыть в новой вкладке' ✅ word-break: break-all для длинных URL ✅ Показывает все файлы из массива ✅ Для каждого файла: - Filename - File ID (UUID) - Size (KB) - Полный S3 URL (кликабельный) Теперь в Debug видно КУДА загрузилось: https://s3.twcstorage.ru/f9825c87-.../policies/20251024_213045_abc123_file.jpg Можно кликнуть и посмотреть глазами! 👀
2025-10-25 09:27:56 +03:00
<Button
type="primary"
feat: Пошаговая загрузка документов с модалкой на Step 2 🎯 Изменения: - Документы загружаются по очереди (один за другим) - После загрузки каждого документа открывается модалка с крутилкой - SSE слушает конкретный event_type: {file_type}_processed - Модалка показывает результат распознавания с извлечёнными данными - Кнопка 'Продолжить' → переход к следующему документу - Опциональные документы можно пропустить - После обработки всех обязательных → 'Далее на Step 3' 📊 UX флоу: 1. Выбор типа события → показываются нужные документы 2. Документ 1: Выбрать файл → Загрузить → Модалка → Результат → Продолжить 3. Документ 2: Выбрать файл → Загрузить → Модалка → Результат → Продолжить 4. Документ 3 (опц): Загрузить ИЛИ Пропустить 5. Все обязательные обработаны → Далее на Step 3 🔑 Каждый документ получает свой уникальный event_type: - frontend отправляет file_type - n8n возвращает event_type = {file_type}_processed - frontend слушает этот конкретный event_type через SSE
2025-10-28 12:43:38 +03:00
onClick={handleFinishStep}
disabled={!allRequiredProcessed || uploading}
feat: Step2 переделан + улучшен Debug Panel с полными S3 URL Step2Details (по скриншоту): ✅ Индикатор '✅ Полис найден' вверху ✅ Select с типами событий из erv_ticket: - Задержка авиарейса (более 3 часов) - Отмена авиарейса - Пропуск стыковочного рейса - Посадка на запасной аэродром - Задержка отправки поезда - Отмена поезда - Задержка/отмена парома/круизного судна ✅ Дата наступления страхового случая (DatePicker) ✅ Номер рейса/поезда/парома ✅ Загрузка подтверждающих документов: - Посадочный талон, билет, справка и т.д. - До 10 файлов по 15MB - HEIC, PDF, фото Debug Panel улучшения: ✅ Полные S3 URL (не обрезанные) ✅ Кнопка '🔗 Открыть в новой вкладке' ✅ word-break: break-all для длинных URL ✅ Показывает все файлы из массива ✅ Для каждого файла: - Filename - File ID (UUID) - Size (KB) - Полный S3 URL (кликабельный) Теперь в Debug видно КУДА загрузилось: https://s3.twcstorage.ru/f9825c87-.../policies/20251024_213045_abc123_file.jpg Можно кликнуть и посмотреть глазами! 👀
2025-10-25 09:27:56 +03:00
style={{ flex: 1 }}
size="large"
>
feat: Пошаговая загрузка документов с модалкой на Step 2 🎯 Изменения: - Документы загружаются по очереди (один за другим) - После загрузки каждого документа открывается модалка с крутилкой - SSE слушает конкретный event_type: {file_type}_processed - Модалка показывает результат распознавания с извлечёнными данными - Кнопка 'Продолжить' → переход к следующему документу - Опциональные документы можно пропустить - После обработки всех обязательных → 'Далее на Step 3' 📊 UX флоу: 1. Выбор типа события → показываются нужные документы 2. Документ 1: Выбрать файл → Загрузить → Модалка → Результат → Продолжить 3. Документ 2: Выбрать файл → Загрузить → Модалка → Результат → Продолжить 4. Документ 3 (опц): Загрузить ИЛИ Пропустить 5. Все обязательные обработаны → Далее на Step 3 🔑 Каждый документ получает свой уникальный event_type: - frontend отправляет file_type - n8n возвращает event_type = {file_type}_processed - frontend слушает этот конкретный event_type через SSE
2025-10-28 12:43:38 +03:00
{allRequiredProcessed ? 'Далее →' : `Осталось документов: ${totalRequired - processedRequired}`}
</Button>
</div>
</Form.Item>
{/* 🔧 Технические кнопки для разработки */}
<div style={{
marginTop: 24,
padding: 16,
background: '#f0f0f0',
borderRadius: 8,
border: '2px dashed #999'
}}>
<div style={{ marginBottom: 8, fontSize: 12, color: '#666', fontWeight: 'bold' }}>
🔧 DEV MODE - Быстрая навигация (без валидации)
</div>
<div style={{ display: 'flex', gap: 8 }}>
<Button
onClick={onPrev}
size="small"
disabled={uploading}
>
Назад (Step 1)
</Button>
<Button
type="dashed"
onClick={() => {
const devData = {
eventType: 'delay_flight',
feat: Пошаговая загрузка документов с модалкой на Step 2 🎯 Изменения: - Документы загружаются по очереди (один за другим) - После загрузки каждого документа открывается модалка с крутилкой - SSE слушает конкретный event_type: {file_type}_processed - Модалка показывает результат распознавания с извлечёнными данными - Кнопка 'Продолжить' → переход к следующему документу - Опциональные документы можно пропустить - После обработки всех обязательных → 'Далее на Step 3' 📊 UX флоу: 1. Выбор типа события → показываются нужные документы 2. Документ 1: Выбрать файл → Загрузить → Модалка → Результат → Продолжить 3. Документ 2: Выбрать файл → Загрузить → Модалка → Результат → Продолжить 4. Документ 3 (опц): Загрузить ИЛИ Пропустить 5. Все обязательные обработаны → Далее на Step 3 🔑 Каждый документ получает свой уникальный event_type: - frontend отправляет file_type - n8n возвращает event_type = {file_type}_processed - frontend слушает этот конкретный event_type через SSE
2025-10-28 12:43:38 +03:00
processedDocuments: {
boarding_or_ticket: { flight_number: 'DEV123', date: '2025-10-28' },
delay_confirmation: { delay_duration: '4h' }
}
};
updateFormData(devData);
onNext();
}}
size="small"
style={{ flex: 1 }}
>
Далее (Step 3) [пропустить]
</Button>
</div>
</div>
</Form>
);
}