átlagos kiegészítséek jó sok
This commit is contained in:
@@ -1,12 +1,14 @@
|
||||
# /opt/docker/dev/service_finder/backend/app/services/geo_service.py
|
||||
import uuid
|
||||
import logging
|
||||
from datetime import datetime, timezone
|
||||
from typing import Optional, List, Dict, Any
|
||||
from sqlalchemy.ext.asyncio import AsyncSession
|
||||
from sqlalchemy import text, select
|
||||
from sqlalchemy import text, select, and_
|
||||
|
||||
from app.services.config_service import config # 2.0 Dinamikus konfig
|
||||
from app.db.session import AsyncSessionLocal
|
||||
from app.models.identity.address import GeoPostalCode, GeoStreet, GeoStreetType, Address
|
||||
|
||||
logger = logging.getLogger("Geo-Service-2.2")
|
||||
|
||||
@@ -74,27 +76,49 @@ class GeoService:
|
||||
default="{zip} {city}, {street} {type} {number}."
|
||||
)
|
||||
|
||||
# 2. Irányítószám és Város (Auto-learning / Upsert)
|
||||
zip_id_query = text("""
|
||||
INSERT INTO system.geo_postal_codes (zip_code, city, country_code)
|
||||
VALUES (:z, :c, :cc)
|
||||
ON CONFLICT (country_code, zip_code, city) DO UPDATE SET city = EXCLUDED.city
|
||||
RETURNING id
|
||||
""")
|
||||
zip_res = await db.execute(zip_id_query, {"z": zip_code, "c": city, "cc": default_country})
|
||||
zip_id = zip_res.scalar()
|
||||
# 2. Irányítószám és Város (Auto-learning / Upsert) - SELECT, majd INSERT
|
||||
stmt = select(GeoPostalCode).where(
|
||||
and_(
|
||||
GeoPostalCode.country_code == default_country,
|
||||
GeoPostalCode.zip_code == zip_code,
|
||||
GeoPostalCode.city == city
|
||||
)
|
||||
)
|
||||
existing_pc = (await db.execute(stmt)).scalar_one_or_none()
|
||||
|
||||
if existing_pc:
|
||||
zip_id = existing_pc.id
|
||||
else:
|
||||
# 2. Beszúrás ha nem létezik
|
||||
new_pc = GeoPostalCode(
|
||||
country_code=default_country,
|
||||
zip_code=zip_code,
|
||||
city=city
|
||||
)
|
||||
db.add(new_pc)
|
||||
await db.flush()
|
||||
zip_id = new_pc.id
|
||||
|
||||
# 3. Utca szótár frissítése
|
||||
await db.execute(text("""
|
||||
INSERT INTO system.geo_streets (postal_code_id, name) VALUES (:zid, :n)
|
||||
ON CONFLICT (postal_code_id, name) DO NOTHING
|
||||
"""), {"zid": zip_id, "n": street_name})
|
||||
# 3. Utca szótár frissítése (SELECT, majd INSERT)
|
||||
stmt_street = select(GeoStreet).where(
|
||||
and_(
|
||||
GeoStreet.postal_code_id == zip_id,
|
||||
GeoStreet.name == street_name
|
||||
)
|
||||
)
|
||||
existing_street = (await db.execute(stmt_street)).scalar_one_or_none()
|
||||
if not existing_street:
|
||||
new_street = GeoStreet(postal_code_id=zip_id, name=street_name)
|
||||
db.add(new_street)
|
||||
await db.flush()
|
||||
|
||||
# 4. Közterület típus (út, utca, köz...)
|
||||
await db.execute(text("""
|
||||
INSERT INTO system.geo_street_types (name) VALUES (:n)
|
||||
ON CONFLICT (name) DO NOTHING
|
||||
"""), {"n": street_type.lower()})
|
||||
# 4. Közterület típus (SELECT, majd INSERT)
|
||||
stmt_type = select(GeoStreetType).where(GeoStreetType.name == street_type.lower())
|
||||
existing_type = (await db.execute(stmt_type)).scalar_one_or_none()
|
||||
if not existing_type:
|
||||
new_type = GeoStreetType(name=street_type.lower())
|
||||
db.add(new_type)
|
||||
await db.flush()
|
||||
|
||||
# 5. SZÖVEGES CÍM GENERÁLÁSA SABLON ALAPJÁN (2.2 Újdonság)
|
||||
# Megformázzuk az alapcímet az admin sablon szerint
|
||||
@@ -111,42 +135,37 @@ class GeoService:
|
||||
if floor: full_text += f" {floor}. em."
|
||||
if door: full_text += f" {door}. ajtó"
|
||||
|
||||
# 6. Központi Address rekord rögzítése vagy lekérése
|
||||
address_query = text("""
|
||||
INSERT INTO system.addresses (
|
||||
postal_code_id, street_name, street_type, house_number,
|
||||
stairwell, floor, door, parcel_id, full_address_text
|
||||
# 6. Központi Address rekord rögzítése vagy lekérése (SELECT, majd INSERT)
|
||||
stmt_addr = select(Address).where(
|
||||
and_(
|
||||
Address.postal_code_id == zip_id,
|
||||
Address.street_name == street_name,
|
||||
Address.street_type == street_type,
|
||||
Address.house_number == house_number,
|
||||
Address.stairwell == stairwell,
|
||||
Address.floor == floor,
|
||||
Address.door == door
|
||||
)
|
||||
VALUES (:zid, :sn, :st, :hn, :sw, :fl, :dr, :pid, :txt)
|
||||
ON CONFLICT (postal_code_id, street_name, street_type, house_number, stairwell, floor, door)
|
||||
DO NOTHING
|
||||
RETURNING id
|
||||
""")
|
||||
|
||||
params = {
|
||||
"zid": zip_id, "sn": street_name, "st": street_type,
|
||||
"hn": house_number, "sw": stairwell, "fl": floor,
|
||||
"dr": door, "pid": parcel_id, "txt": full_text
|
||||
}
|
||||
|
||||
res = await db.execute(address_query, params)
|
||||
addr_id = res.scalar()
|
||||
|
||||
# 7. Biztonsági keresés: Ha létezett a rekord, de nem kaptunk ID-t a RETURNING-gal
|
||||
if not addr_id:
|
||||
lookup_query = text("""
|
||||
SELECT id FROM system.addresses
|
||||
WHERE postal_code_id = :zid
|
||||
AND street_name = :sn
|
||||
AND street_type = :st
|
||||
AND house_number = :hn
|
||||
AND (stairwell IS NOT DISTINCT FROM :sw)
|
||||
AND (floor IS NOT DISTINCT FROM :fl)
|
||||
AND (door IS NOT DISTINCT FROM :dr)
|
||||
LIMIT 1
|
||||
""")
|
||||
lookup_res = await db.execute(lookup_query, params)
|
||||
addr_id = lookup_res.scalar()
|
||||
)
|
||||
existing_addr = (await db.execute(stmt_addr)).scalar_one_or_none()
|
||||
if existing_addr:
|
||||
addr_id = existing_addr.id
|
||||
else:
|
||||
new_addr = Address(
|
||||
postal_code_id=zip_id,
|
||||
street_name=street_name,
|
||||
street_type=street_type,
|
||||
house_number=house_number,
|
||||
stairwell=stairwell,
|
||||
floor=floor,
|
||||
door=door,
|
||||
parcel_id=parcel_id,
|
||||
full_address_text=full_text,
|
||||
created_at=datetime.now(timezone.utc)
|
||||
)
|
||||
db.add(new_addr)
|
||||
await db.flush()
|
||||
addr_id = new_addr.id
|
||||
|
||||
return addr_id
|
||||
|
||||
|
||||
Reference in New Issue
Block a user