From 02d67ff733488e61311b7ff2ac523da556d2aabb Mon Sep 17 00:00:00 2001 From: PotapovaA Date: Thu, 22 Oct 2026 15:35:56 +0300 Subject: [PATCH] =?UTF-8?q?=D1=83=D0=B1=D1=80=D0=B0=D0=BD=20=D0=BB=D0=B8?= =?UTF-8?q?=D1=88=D0=BD=D0=B8=D0=B9=20=D0=BC=D0=B5=D1=82=D0=BE=D0=B4=20bui?= =?UTF-8?q?ld=5Fwith=5Fmembers?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- api/src/services/consolidated_osv.py | 16 ++++++---------- 1 file changed, 6 insertions(+), 10 deletions(-) diff --git a/api/src/services/consolidated_osv.py b/api/src/services/consolidated_osv.py index d58860b..3dd9166 100644 --- a/api/src/services/consolidated_osv.py +++ b/api/src/services/consolidated_osv.py @@ -110,7 +110,7 @@ def _source_row(entry: OsvEntry) -> domain.SourceRow: def _candidate_ids(rows: Sequence[domain.SourceRow], index: CounterpartyIndex) -> set[uuid.UUID]: - """Идентификаторы контрагентов, имена которых понадобятся `build`: хранимые `counterparty_id` и результат дорезолва + """Идентификаторы контрагентов для `build_with_members`: хранимые `counterparty_id` и результат дорезолва для строк без него (`resolve` — по словарям индекса, без обращений к БД; ключ склейки включает имя и ИНН, поэтому результат для представителя группы равен результату для любой её строки).""" ids: set[uuid.UUID] = set() @@ -147,12 +147,8 @@ class ConsolidatedOsvService: self._session = session self._scope = scope - async def build(self, version_id: uuid.UUID) -> ConsolidatedOsvBuildResult: - """Свод версии и данные его расчёта; версия вне видимости — 404.""" - return await self.build_with_members(version_id) - async def build_with_members(self, version_id: uuid.UUID) -> ConsolidatedOsvBuildResult: - """Свод и участники периметра, загруженные при его расчёте.""" + """Свод и участники периметра, загруженные при его расчёте; версия вне видимости — 404.""" found = await repo.get_version(self._session, self._scope, version_id) if found is None: raise NotFoundError(VERSION_NOT_FOUND) @@ -191,7 +187,7 @@ class ConsolidatedOsvService: async def page(self, version_id: uuid.UUID, f: OsvFilters, page: OsvPageParams) -> Page[ConsolidatedRowOut]: """Страница свода после фильтров: `total` — число строк после фильтра, срез — в памяти (порядок D-16).""" - result = await self.build(version_id) + result = await self.build_with_members(version_id) rows = domain.apply_filter(result.consolidated.rows, domain_filter(f)) window = rows[page.offset : page.offset + page.limit] return Page[ConsolidatedRowOut]( @@ -202,7 +198,7 @@ class ConsolidatedOsvService: """xlsx сводной ОСВ (spec «Экспорт xlsx», D-14): строки после тех же фильтров, что у `page`, без пагинации, в порядке D-16; лист пробелов — по своду целиком. Имя файла — `svod-osv_<ГК>_<год>-<квартал>_v.xlsx` (без percent-кодирования: оно в маршруте). `audit_event(EXPORT)` пишется после сборки книги, в транзакции запроса.""" - result = await self.build(version_id) + result = await self.build_with_members(version_id) rows = domain.apply_filter(result.consolidated.rows, domain_filter(f)) content = await run_in_threadpool(build_workbook, result.consolidated, rows) group_name = ( @@ -228,7 +224,7 @@ class ConsolidatedOsvService: async def summary(self, version_id: uuid.UUID) -> OsvSummaryOut: """Сводка: строки, несопоставленные, автосопоставленные по имени/алиасу, ОСВ-документы версии и пробелы.""" - result = await self.build(version_id) + result = await self.build_with_members(version_id) rows_total, unmapped_total, auto_matched_total = domain.summary(result.consolidated) return OsvSummaryOut( rows_total=rows_total, @@ -241,7 +237,7 @@ class ConsolidatedOsvService: async def row_for_entry(self, version_id: uuid.UUID, entry_id: uuid.UUID) -> ConsolidatedRowOut | None: """Строка свода, в `entry_ids` которой есть `entry_id`; `None` — строка в своде не участвует (пара с пробелом или документ не выбран источником при наличии нарастающего).""" - result = await self.build(version_id) + result = await self.build_with_members(version_id) row = next((row for row in result.consolidated.rows if entry_id in row.entry_ids), None) return None if row is None else row_out(row)