Files
aiform_dev/frontend/src/components/form/StepDescription.tsx
AI Assistant 4c8fda5f55 Добавлено логирование для отладки черновиков
- Добавлены логи в frontend (ClaimForm.tsx) для отслеживания unified_id и запросов к API
- Добавлены логи в backend (claims.py) для отладки SQL запросов
- Создан лог сессии с описанием проблемы и текущего состояния
- Проблема: API возвращает 0 черновиков, хотя в БД есть данные
2025-11-19 18:46:48 +03:00

204 lines
6.7 KiB
TypeScript
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

import { Form, Input, Button, Typography, message, Checkbox } from 'antd';
import { useEffect, useState } from 'react';
import wizardPlanSample from '../../mocks/wizardPlanSample';
const { TextArea } = Input;
const { Paragraph } = Typography;
interface Props {
formData: any;
updateFormData: (data: any) => void;
onPrev: () => void;
onNext: () => void;
}
export default function StepDescription({
formData,
updateFormData,
onPrev,
onNext,
}: Props) {
const [form] = Form.useForm();
const [submitting, setSubmitting] = useState(false);
const [useMockWizard, setUseMockWizard] = useState(true);
const buildPrefillMap = (prefill?: Array<{ name: string; value: any }>) => {
if (!prefill) {
return {};
}
return prefill.reduce<Record<string, any>>((acc, item) => {
if (item?.name) {
acc[item.name] = item.value;
}
return acc;
}, {});
};
useEffect(() => {
form.setFieldsValue({
problemDescription: formData.problemDescription ?? '',
});
}, [form, formData.problemDescription]);
const handleContinue = async () => {
try {
let problemDescription = form.getFieldValue('problemDescription');
if (!useMockWizard) {
const values = await form.validateFields();
problemDescription = values.problemDescription;
}
const safeDescription = problemDescription || '';
if (!formData.session_id) {
message.error('Не найден session_id. Попробуйте обновить страницу.');
return;
}
if (!formData.claim_id) {
message.error('Не удалось определить номер обращения. Вернитесь на шаг с телефоном.');
return;
}
setSubmitting(true);
if (useMockWizard && wizardPlanSample?.wizard_plan) {
const mockPrefill = buildPrefillMap(wizardPlanSample.answers_prefill);
const mockClaimId = wizardPlanSample.claim_id || formData.claim_id;
updateFormData({
problemDescription: safeDescription,
claim_id: mockClaimId,
wizardPlan: wizardPlanSample.wizard_plan,
wizardPlanStatus: 'ready',
wizardPrefill: mockPrefill,
wizardPrefillArray: wizardPlanSample.answers_prefill,
wizardCoverageReport: wizardPlanSample.coverage_report,
wizardAnswers: undefined,
});
message.success('Загружены сохранённые рекомендации (DEV).');
onNext();
return;
}
const response = await fetch('/api/v1/claims/description', {
method: 'POST',
headers: { 'Content-Type': 'application/json' },
body: JSON.stringify({
session_id: formData.session_id,
claim_id: formData.claim_id,
phone: formData.phone,
email: formData.email,
problem_description: safeDescription,
}),
});
if (!response.ok) {
throw new Error(`Ошибка API: ${response.status}`);
}
message.success('Описание отправлено, подбираем рекомендации...');
updateFormData({
problemDescription: safeDescription,
wizardPlan: undefined,
wizardPlanStatus: 'pending',
wizardAnswers: undefined,
wizardPrefill: undefined,
wizardPrefillArray: undefined,
});
onNext();
} catch (error) {
console.error(error);
message.error('Не получилось сохранить описание. Попробуйте ещё раз.');
} finally {
setSubmitting(false);
}
};
return (
<div style={{ marginTop: 24 }}>
<Button onClick={onPrev} size="large">
Назад
</Button>
<div
style={{
marginTop: 24,
padding: 24,
background: '#f6f8fa',
borderRadius: 8,
border: '1px solid #e0e6ed',
}}
>
<Paragraph style={{ fontSize: 18, fontWeight: 600, marginBottom: 8 }}>
📄 Опишите проблему
</Paragraph>
<Paragraph type="secondary" style={{ marginBottom: 24 }}>
Расскажите, что произошло, в свободной форме. Чем больше деталей
тем быстрее команда сможет разобраться, какие документы нужны и куда
направить заявку.
</Paragraph>
<Form layout="vertical" form={form}>
<Form.Item
label="Описание ситуации"
name="problemDescription"
rules={[
{
validator: (_, value) => {
if (useMockWizard) {
return Promise.resolve();
}
if (!value) {
return Promise.reject(new Error('Поле обязательно'));
}
if (value.length < 20) {
return Promise.reject(
new Error('Опишите, пожалуйста, минимум в пару предложений')
);
}
return Promise.resolve();
},
},
]}
>
<TextArea
disabled={useMockWizard}
autoSize={{ minRows: 6 }}
maxLength={3000}
showCount={!useMockWizard}
placeholder="Например: заключил договор на оказание услуг..., деньги списали..., услугу не выполнили..."
/>
</Form.Item>
</Form>
<div
style={{
marginTop: 12,
padding: 12,
borderRadius: 8,
background: '#fafafa',
border: '1px dashed #d9d9d9',
}}
>
<Checkbox
checked={useMockWizard}
onChange={(e) => setUseMockWizard(e.target.checked)}
>
Использовать сохранённые рекомендации (DEV)
</Checkbox>
<Paragraph type="secondary" style={{ marginBottom: 0, marginTop: 4 }}>
Если включено, план вопросов берётся из локального файла и не запускает модель.
</Paragraph>
</div>
<div style={{ display: 'flex', justifyContent: 'flex-end', gap: 12 }}>
<Button type="primary" size="large" onClick={handleContinue} loading={submitting}>
Продолжить
</Button>
</div>
</div>
</div>
);
}