feat: Интеграция создания черновика заявки в Step2EventType

-  Вызов n8n webhook после выбора типа события
-  Формирование title из event_type + voucher
-  Передача всех данных: claim_id, contact_id, project_id, event_type
-  Сохранение ticket_id и ticket_number в formData
-  Loading состояние кнопки
-  Debug события для отслеживания
This commit is contained in:
AI Assistant
2025-11-02 00:09:35 +03:00
parent b06fdb731c
commit 793177b1e2
3 changed files with 60 additions and 11 deletions

View File

@@ -547,3 +547,4 @@ Last commit: c049ed6 - "fix: Добавлены n8n webhook URLs в docker-compo
**Последнее обновление:** 1 ноября 2025, 13:39 MSK **Последнее обновление:** 1 ноября 2025, 13:39 MSK
**Автор:** Фёдор + AI Assistant (Claude Sonnet 4.5) **Автор:** Фёдор + AI Assistant (Claude Sonnet 4.5)

View File

@@ -1,4 +1,4 @@
import { Form, Select, Button, Card, Alert } from 'antd'; import { Form, Select, Button, Card, Alert, message } from 'antd';
import { ThunderboltOutlined } from '@ant-design/icons'; import { ThunderboltOutlined } from '@ant-design/icons';
import { useState } from 'react'; import { useState } from 'react';
@@ -9,6 +9,7 @@ interface Props {
updateFormData: (data: any) => void; updateFormData: (data: any) => void;
onNext: () => void; onNext: () => void;
onPrev: () => void; onPrev: () => void;
addDebugEvent?: (type: string, status: string, message: string, data?: any) => void;
} }
// Типы страховых случаев // Типы страховых случаев
@@ -22,15 +23,61 @@ const EVENT_TYPES = [
{ value: 'delay_ferry', label: 'Задержка/отмена парома/круиза', icon: '⛴️' }, { value: 'delay_ferry', label: 'Задержка/отмена парома/круиза', icon: '⛴️' },
]; ];
const Step2EventType: React.FC<Props> = ({ formData, updateFormData, onNext, onPrev }) => { const Step2EventType: React.FC<Props> = ({ formData, updateFormData, onNext, onPrev, addDebugEvent }) => {
const [form] = Form.useForm(); const [form] = Form.useForm();
const [selectedEventType, setSelectedEventType] = useState<string | undefined>(formData.eventType); const [selectedEventType, setSelectedEventType] = useState<string | undefined>(formData.eventType);
const [loading, setLoading] = useState(false);
const handleSubmit = () => { const handleSubmit = async () => {
form.validateFields().then(values => { try {
updateFormData({ eventType: values.eventType }); const values = await form.validateFields();
onNext(); setLoading(true);
});
addDebugEvent?.('claim', 'pending', `📝 Создаю черновик заявки для типа: ${values.eventType}`);
// Формируем title из типа события и номера полиса
const eventLabel = EVENT_TYPES.find(e => e.value === values.eventType)?.label || values.eventType;
const title = `${eventLabel} - ${formData.voucher || 'полис не указан'}`;
// Вызываем n8n webhook для создания черновика заявки
const response = await fetch('https://n8n.clientright.pro/webhook/d5bf4ca6-9e44-44b9-9714-3186ea703e7d', {
method: 'POST',
headers: { 'Content-Type': 'application/json' },
body: JSON.stringify({
claim_id: formData.claim_id,
contact_id: formData.contact_id,
project_id: formData.project_id,
event_type: values.eventType,
title: title,
voucher: formData.voucher,
session_id: formData.session_id
})
});
const result = await response.json();
if (response.ok && result.success) {
addDebugEvent?.('claim', 'success', `✅ Черновик заявки создан`, result);
// Сохраняем данные заявки
updateFormData({
eventType: values.eventType,
ticket_id: result.result?.ticket_id,
ticket_number: result.result?.ticket_number
});
message.success(`Черновик заявки создан: ${result.result?.ticket_number || 'N/A'}`);
onNext();
} else {
addDebugEvent?.('claim', 'error', `❌ Ошибка создания черновика`, result);
message.error('Ошибка создания черновика заявки');
}
} catch (error: any) {
addDebugEvent?.('claim', 'error', `❌ Ошибка соединения`, { error: error.message });
message.error('Ошибка соединения с сервером');
} finally {
setLoading(false);
}
}; };
const selectedEvent = EVENT_TYPES.find(e => e.value === selectedEventType); const selectedEvent = EVENT_TYPES.find(e => e.value === selectedEventType);
@@ -86,11 +133,11 @@ const Step2EventType: React.FC<Props> = ({ formData, updateFormData, onNext, onP
)} )}
<div style={{ display: 'flex', gap: 12 }}> <div style={{ display: 'flex', gap: 12 }}>
<Button onClick={onPrev} size="large"> <Button onClick={onPrev} size="large" disabled={loading}>
Назад Назад
</Button> </Button>
<Button type="primary" htmlType="submit" size="large" style={{ flex: 1 }}> <Button type="primary" htmlType="submit" size="large" style={{ flex: 1 }} loading={loading}>
Далее: Загрузка документов {loading ? 'Создаю черновик заявки...' : 'Далее: Загрузка документов →'}
</Button> </Button>
</div> </div>
</Form> </Form>

View File

@@ -193,7 +193,7 @@ export default function ClaimForm() {
), ),
}); });
// Шаг 2: Event Type Selection (всегда) // Шаг 3: Event Type Selection (всегда)
stepsArray.push({ stepsArray.push({
title: 'Тип события', title: 'Тип события',
description: 'Выбор случая', description: 'Выбор случая',
@@ -203,6 +203,7 @@ export default function ClaimForm() {
updateFormData={updateFormData} updateFormData={updateFormData}
onNext={nextStep} onNext={nextStep}
onPrev={prevStep} onPrev={prevStep}
addDebugEvent={addDebugEvent}
/> />
), ),
}); });