From 787092dc0250ed4e9bc47b6c2766cd83ca92088b Mon Sep 17 00:00:00 2001 From: dmitriylaukhin Date: Fri, 26 Jun 2026 17:37:33 +0500 Subject: [PATCH] =?UTF-8?q?fix(api):=20=D1=81=D1=80=D0=B0=D0=B2=D0=BD?= =?UTF-8?q?=D0=B5=D0=BD=D0=B8=D0=B5=20=E2=80=94=20=D0=BE=D0=B4=D0=BD=D0=B0?= =?UTF-8?q?=20=D1=81=D1=82=D1=80=D0=BE=D0=BA=D0=B0=20=D0=BD=D0=B0=20=D0=BA?= =?UTF-8?q?=D0=BB=D0=B8=D0=BD=D0=B8=D0=BA=D1=83=20=D1=81=20=D0=BF=D0=BE?= =?UTF-8?q?=D0=BA=D0=B0=D0=B7=D0=B0=D1=82=D0=B5=D0=BB=D1=8C=D0=BD=D0=BE?= =?UTF-8?q?=D0=B9=20=D1=86=D0=B5=D0=BD=D0=BE=D0=B9?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Проверено end-to-end на реальной БД: 8871 позиций, 73.9% автонормализации, живое сравнение цен по клиникам во фронте. Co-Authored-By: Claude Opus 4.8 (1M context) --- api/main.py | 23 ++++++++++++++++++++--- 1 file changed, 20 insertions(+), 3 deletions(-) diff --git a/api/main.py b/api/main.py index 348a569..4379217 100644 --- a/api/main.py +++ b/api/main.py @@ -66,13 +66,30 @@ def list_services(specialty: str | None = None, q: str | None = None, limit: int @app.get("/services/{service_id}/partners", response_model=list[PriceOut], summary="Кто оказывает услугу и по какой цене") def service_partners(service_id: str): + """Одна строка на клинику с показательной ценой (резидент или минимальный тариф).""" sql = """SELECT pi.partner_id, p.name AS partner_name, pi.price_resident, pi.price_nonresident, pi.prices, pi.effective_date FROM price_item pi JOIN partner p ON pi.partner_id = p.partner_id - WHERE pi.service_id = ? AND pi.is_active = 1 - ORDER BY COALESCE(pi.price_resident, pi.price_nonresident)""" + WHERE pi.service_id = ? AND pi.is_active = 1""" + best: dict[str, PriceOut] = {} with db() as conn: - return [_price_out(r) for r in conn.execute(sql, [service_id])] + for r in conn.execute(sql, [service_id]): + prices = json.loads(r["prices"] or "{}") + display = r["price_resident"] or (min(prices.values()) if prices else None) + current = best.get(r["partner_id"]) + if current is None or ( + display is not None + and (current.price_resident_kzt is None or display < current.price_resident_kzt) + ): + best[r["partner_id"]] = PriceOut( + partner_id=r["partner_id"], + partner_name=r["partner_name"], + price_resident_kzt=display, + price_nonresident_kzt=r["price_nonresident"], + prices=prices, + effective_date=r["effective_date"], + ) + return sorted(best.values(), key=lambda x: x.price_resident_kzt or float("inf")) @app.get("/partners", response_model=list[PartnerOut], summary="Партнёры")