Files
crm.clientright.ru/ticket_form/SESSION_LOG_2025-12-03.md
Fedor 003210dcfc fix: исправлены проблемы с формами и циклическими ссылками
- Исправлена проблема с циклическими ссылками в Step1Phone.tsx при onPaste (добавлен setTimeout)
- Добавлены name атрибуты во все поля формы для правильной работы форм и автозаполнения
- Исправлены проблемы с label/input связями (все label имеют правильные for/id)
- Все поля теперь имеют id и name атрибуты (исправляет предупреждения в консоли)

Исправленные функции:
- createField: добавлен name атрибут
- createReadonlyField: добавлен name атрибут
- createDateField: добавлен name атрибут
- createMoneyField: добавлен name атрибут
- createTextarea: добавлен name атрибут
- createBankSelect: добавлен name атрибут для основного поля и скрытого bank_id
- createCheckbox: добавлен name атрибут, проверена связь label/input
2025-12-04 09:21:12 +03:00

7.8 KiB
Raw Permalink Blame History

Лог сессии 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

# 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 запрос:

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" или NULLcontact_data_confirmed = False, contact_data_can_edit = True

5. Обновлены SQL файлы и документация

  • N8N_POSTGRESQL_GET_CONTACT_DATA.sqlN8N_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 запрос:

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 тест:

curl "http://localhost:8200/api/v1/claims/drafts/226564ce-d7cf-48ee-a820-690e8f5ec8e5"

Результат:

{
  "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
Статус: Завершено успешно