Instruction file imported from david12345abc/Tender (
.cursor/rules/01-search-flow.mdc). Copyright stays with the author.
Поиск процедур — end-to-end
Цепочка
- Sidebar (
sidebar.client_filters()) → dataclassClientFilters(params.py) - MainWindow._on_search →
_start_task(make_search_task(...)) - Worker (QThread):
ensure_chrome()+connect()+pull_token()(если нужен)- цикл
client.fetch_page(start, limit, client_filters=...) - probe-фильтрация →
w.batch.emit(procedures)
- MainWindow._on_batch_loaded →
ProcedureTableModel+ProcedureFilterProxy
ClientFilters — ключевые поля
step_ids # статусы (UI label или API code — зависит от платформы)
trend_pur_values # типы процедур
registry_contains, title_contains, quick_search
price_min/max, published_from/to, end_from/to, results_from/to
keywords, blacklist_keywords # локальная лемматизация
Sidebar показывает разные поля per platform (_apply_platform_filter_visibility).
Стратегия фильтров в worker (make_search_task)
| Группа | Сервер | Локально (probe_proxy) |
|---|---|---|
| GPB / Business | почти всё → Procedure.list RPC |
только keywords |
| Roseltorg | всё через REST | только keywords |
| Trading portal | RPC payload | полный ClientFilters |
| Tek-Torg | URL/query params (частично) | status/type + keywords |
GPB: fan-out по статусам и типам
Если выбрано несколько step_ids или trend_pur_values, worker строит server_filter_variants — декартово произведение и шлёт отдельный API-запрос на каждую комбинацию, затем dedupe по id.
«Активные» (-2) — особый статус: не фильтрует локально, означает «все активные на сервере».
Probe proxy
После каждого fetch_page worker прогоняет строки через ProcedureFilterProxy с урезанным probe_filters, чтобы отсеять то, что сервер не отфильтровал.
fetch_page по платформам
GPB (etp_client.py): Ext.Direct Procedure.list через _FETCH_LIST_JS в контексте страницы. Поля payload = поля формы сайта (procedure_number_like, status, procedure_type, даты…).
Roseltorg: REST /api/v1/procedures, JWT из localStorage. set_client_filters() сохраняет фильтры в client.
Business Procurement: POST grid API на com.etpgpb.ru, Bearer + CSRF из localStorage/cookies.
Tek-Torg: driver.get(url + query), данные из window.__NEXT_DATA__.props.pageProps.initialReduxState.listingProcedures.
Пагинация и лимиты
- GPB server limit ~25–30 строк, payload limit до 500
- UI batch: до 10 000 страниц за задачу
- При потере сессии: signal
session(False)→ диалог «Я вошёл — повторить»
Анализ и документы (соседние задачи worker)
make_download_documents_task→client.download_procedure_documents(proc)make_analyze_procedure_task→extract_procedure_card_text+ RAG/LM Studio- Слепок карточки для анализа:
{ANALYSIS_DIR}/.../ _карточка_страницы_полный_текст.txt