199 lines
7.8 KiB
Markdown
199 lines
7.8 KiB
Markdown
|
|
# Лог сессии 2025-12-03
|
|||
|
|
|
|||
|
|
## Задача 1: Получение cf_2624 из MySQL при загрузке черновика
|
|||
|
|
|
|||
|
|
### Проблема
|
|||
|
|
Пользователь заметил, что для `claim_id: "226564ce-d7cf-48ee-a820-690e8f5ec8e5"` доступно редактирование, хотя в CRM стоит галка "Данные подтверждены" (`cf_2624 = "1"`).
|
|||
|
|
|
|||
|
|
### Решение
|
|||
|
|
Вместо передачи `cf_2624` через события Redis, реализован прямой SQL запрос к MySQL БД vtiger CRM при загрузке черновика.
|
|||
|
|
|
|||
|
|
## Изменения
|
|||
|
|
|
|||
|
|
### 1. Добавлены credentials для MySQL CRM в `config.py`
|
|||
|
|
```python
|
|||
|
|
# MySQL CRM (vtiger CRM)
|
|||
|
|
mysql_crm_host: str = "localhost"
|
|||
|
|
mysql_crm_port: int = 3306
|
|||
|
|
mysql_crm_db: str = "ci20465_72new"
|
|||
|
|
mysql_crm_user: str = "ci20465_72new"
|
|||
|
|
mysql_crm_password: str = "EcY979Rn"
|
|||
|
|
```
|
|||
|
|
|
|||
|
|
### 2. Создан сервис `CrmMySQLService`
|
|||
|
|
**Файл:** `ticket_form/backend/app/services/crm_mysql_service.py`
|
|||
|
|
|
|||
|
|
- Подключение к MySQL БД vtiger CRM
|
|||
|
|
- Методы: `fetch_one()`, `fetch_all()`, `execute()`
|
|||
|
|
- Использует `aiomysql` для асинхронных запросов
|
|||
|
|
|
|||
|
|
### 3. Обновлён `main.py`
|
|||
|
|
- Добавлено подключение к MySQL CRM при старте
|
|||
|
|
- Добавлено закрытие соединения при остановке
|
|||
|
|
|
|||
|
|
### 4. Обновлён `claims.py` - метод `get_draft()`
|
|||
|
|
**Эндпоинт:** `GET /api/v1/claims/drafts/{claim_id}`
|
|||
|
|
|
|||
|
|
**Изменения:**
|
|||
|
|
- Убран webservice API (getchallenge → login → retrieve)
|
|||
|
|
- Добавлен прямой SQL запрос к MySQL для получения `cf_2624`
|
|||
|
|
- Получаем все данные контакта, включая `cf_2624`
|
|||
|
|
- Добавлено логирование для отладки
|
|||
|
|
|
|||
|
|
**SQL запрос:**
|
|||
|
|
```sql
|
|||
|
|
SELECT
|
|||
|
|
cd.contactid,
|
|||
|
|
cd.firstname,
|
|||
|
|
cd.lastname,
|
|||
|
|
cd.email,
|
|||
|
|
cd.mobile,
|
|||
|
|
ccf.cf_2624 AS cf_2624
|
|||
|
|
FROM vtiger_contactdetails cd
|
|||
|
|
LEFT JOIN vtiger_contactscf ccf ON ccf.contactid = cd.contactid
|
|||
|
|
LEFT JOIN vtiger_crmentity ce ON ce.crmid = cd.contactid
|
|||
|
|
WHERE cd.contactid = %s
|
|||
|
|
AND ce.deleted = 0
|
|||
|
|
LIMIT 1
|
|||
|
|
```
|
|||
|
|
|
|||
|
|
**Логика:**
|
|||
|
|
- Если `cf_2624 = "1"` → `contact_data_confirmed = True`, `contact_data_can_edit = False`
|
|||
|
|
- Если `cf_2624 = "0"` или `NULL` → `contact_data_confirmed = False`, `contact_data_can_edit = True`
|
|||
|
|
|
|||
|
|
### 5. Обновлены SQL файлы и документация
|
|||
|
|
- `N8N_POSTGRESQL_GET_CONTACT_DATA.sql` → `N8N_MYSQL_GET_CONTACT_DATA.sql`
|
|||
|
|
- Изменён синтаксис: `$1` → `?` (для n8n MySQL ноды)
|
|||
|
|
- Обновлена документация `BACKEND_GET_CONTACT_CF_2624_FROM_POSTGRESQL.md`
|
|||
|
|
- Создан `N8N_MYSQL_GET_CONTACT_DATA.md`
|
|||
|
|
|
|||
|
|
## Преимущества нового подхода
|
|||
|
|
|
|||
|
|
1. ✅ **Проще** - один SQL запрос вместо цепочки HTTP запросов
|
|||
|
|
2. ✅ **Быстрее** - прямой запрос к БД
|
|||
|
|
3. ✅ **Надёжнее** - не зависит от webservice API
|
|||
|
|
4. ✅ **Актуальнее** - всегда получаем свежие данные из БД
|
|||
|
|
|
|||
|
|
## Проблемы и решения
|
|||
|
|
|
|||
|
|
### Проблема 1: Файл crm_mysql_service.py отсутствовал в контейнере
|
|||
|
|
**Решение:** Пересобран контейнер через `docker-compose build ticket_form_backend`
|
|||
|
|
|
|||
|
|
### Проблема 2: MySQL не подключался из Docker контейнера
|
|||
|
|
**Ошибка:** `Can't connect to MySQL server on 'localhost'`
|
|||
|
|
|
|||
|
|
**Решение:**
|
|||
|
|
- Изменён `docker-compose.yml`: добавлен `network_mode: host`
|
|||
|
|
- Изменён `config.py`: `mysql_crm_host = "localhost"` (в режиме host работает)
|
|||
|
|
|
|||
|
|
**Результат:** `✅ MySQL CRM DB connected: localhost:3306/ci20465_72new`
|
|||
|
|
|
|||
|
|
### Проблема 3: contact_data_confirmed возвращал None
|
|||
|
|
**Причина:** Флаг не передавался в компонент `StepClaimConfirmation`
|
|||
|
|
|
|||
|
|
**Решение:**
|
|||
|
|
- Добавлен prop `contact_data_confirmed` в `StepClaimConfirmation`
|
|||
|
|
- Передача флага из `formData.contact_data_confirmed` в компонент
|
|||
|
|
- Исправлена логика получения флага (приоритет: props > claimPlanData > false)
|
|||
|
|
|
|||
|
|
## Проверка
|
|||
|
|
|
|||
|
|
**MySQL запрос:**
|
|||
|
|
```bash
|
|||
|
|
mysql -h localhost -u ci20465_72new -p'EcY979Rn' ci20465_72new \
|
|||
|
|
-e "SELECT contactid, cf_2624 FROM vtiger_contactscf WHERE contactid = '399542' LIMIT 1;"
|
|||
|
|
```
|
|||
|
|
|
|||
|
|
**Результат:**
|
|||
|
|
```
|
|||
|
|
contactid cf_2624
|
|||
|
|
399542 1
|
|||
|
|
```
|
|||
|
|
|
|||
|
|
✅ В MySQL `cf_2624 = "1"` для `contact_id = "399542"` - данные подтверждены.
|
|||
|
|
|
|||
|
|
**API тест:**
|
|||
|
|
```bash
|
|||
|
|
curl "http://localhost:8200/api/v1/claims/drafts/226564ce-d7cf-48ee-a820-690e8f5ec8e5"
|
|||
|
|
```
|
|||
|
|
|
|||
|
|
**Результат:**
|
|||
|
|
```json
|
|||
|
|
{
|
|||
|
|
"contact_data_confirmed": true,
|
|||
|
|
"contact_data_can_edit": false,
|
|||
|
|
"contact_data_from_crm": {
|
|||
|
|
"contactid": "399542",
|
|||
|
|
"cf_2624": "1",
|
|||
|
|
...
|
|||
|
|
}
|
|||
|
|
}
|
|||
|
|
```
|
|||
|
|
|
|||
|
|
## Текущий статус
|
|||
|
|
|
|||
|
|
- ✅ Код обновлён
|
|||
|
|
- ✅ Бэкенд пересобран и перезапущен
|
|||
|
|
- ✅ MySQL CRM подключён
|
|||
|
|
- ✅ API возвращает правильные данные
|
|||
|
|
- ✅ Фронтенд получает `contact_data_confirmed` и блокирует поля
|
|||
|
|
- ✅ Поля формы блокируются (readonly) при `contact_data_confirmed = true`
|
|||
|
|
|
|||
|
|
## Блокировка полей
|
|||
|
|
|
|||
|
|
При `contact_data_confirmed = true` блокируются следующие поля:
|
|||
|
|
- `firstname` (Имя)
|
|||
|
|
- `lastname` (Фамилия)
|
|||
|
|
- `secondname` / `middle_name` (Отчество)
|
|||
|
|
- `inn` (ИНН)
|
|||
|
|
- `birthday` (Дата рождения)
|
|||
|
|
- `birthplace` / `birth_place` (Место рождения)
|
|||
|
|
- `address` / `mailingstreet` (Адрес)
|
|||
|
|
- `email` (E-mail)
|
|||
|
|
|
|||
|
|
Поля становятся `readonly` и отображаются с серым фоном.
|
|||
|
|
|
|||
|
|
---
|
|||
|
|
|
|||
|
|
## Задача 2: Выбор банка для СБП выплат
|
|||
|
|
|
|||
|
|
### Реализация
|
|||
|
|
- Динамическая загрузка списка банков из API `http://212.193.27.93/api/payouts/dictionaries/nspk-banks`
|
|||
|
|
- Добавлено в форму создания заявки (`Step3Payment.tsx`)
|
|||
|
|
- Добавлено в форму редактирования (`generateConfirmationFormHTML.ts`)
|
|||
|
|
- Используется `input` + `datalist` для автоподстановки
|
|||
|
|
|
|||
|
|
---
|
|||
|
|
|
|||
|
|
## Файлы изменены
|
|||
|
|
|
|||
|
|
### Backend:
|
|||
|
|
- `ticket_form/backend/app/config.py` - добавлены credentials для MySQL CRM
|
|||
|
|
- `ticket_form/backend/app/services/crm_mysql_service.py` - новый сервис
|
|||
|
|
- `ticket_form/backend/app/main.py` - подключение к MySQL CRM
|
|||
|
|
- `ticket_form/backend/app/api/claims.py` - прямой SQL запрос к MySQL
|
|||
|
|
- `ticket_form/docker-compose.yml` - добавлен `network_mode: host`
|
|||
|
|
|
|||
|
|
### Frontend:
|
|||
|
|
- `ticket_form/frontend/src/components/form/StepClaimConfirmation.tsx` - передача `contact_data_confirmed`
|
|||
|
|
- `ticket_form/frontend/src/pages/ClaimForm.tsx` - передача флага в компонент
|
|||
|
|
- `ticket_form/frontend/src/components/form/generateConfirmationFormHTML.ts` - блокировка полей
|
|||
|
|
|
|||
|
|
### Документация:
|
|||
|
|
- `ticket_form/docs/N8N_MYSQL_GET_CONTACT_DATA.sql` - SQL запрос для n8n
|
|||
|
|
- `ticket_form/docs/N8N_MYSQL_GET_CONTACT_DATA.md` - документация
|
|||
|
|
- `ticket_form/docs/BACKEND_GET_CONTACT_CF_2624_FROM_POSTGRESQL.md` - обновлена документация
|
|||
|
|
|
|||
|
|
---
|
|||
|
|
|
|||
|
|
## Коммиты
|
|||
|
|
|
|||
|
|
1. `e1142315` - feat: Получение cf_2624 из MySQL при загрузке черновика
|
|||
|
|
2. `a86120dd` - fix: передача contact_data_confirmed в StepClaimConfirmation для блокировки полей
|
|||
|
|
|
|||
|
|
---
|
|||
|
|
|
|||
|
|
**Время работы:** 2025-12-03 16:00-17:00
|
|||
|
|
**Статус:** ✅ Завершено успешно
|
|||
|
|
|