File size: 1,769 Bytes
b4f2238 | 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 | """当事人内部查询服务。"""
from __future__ import annotations
from apps.client.models import Client, ClientIdentityDoc, PropertyClue
class ClientInternalQueryService:
def get_client(self, *, client_id: int) -> Client | None:
return Client.objects.prefetch_related("identity_docs").filter(id=client_id).first()
def get_clients_by_ids(self, *, client_ids: list[int]) -> list[Client]:
if not client_ids:
return []
clients: list[Client] = list(Client.objects.filter(id__in=client_ids))
client_map: dict[int, Client] = {c.id: c for c in clients}
return [client_map[cid] for cid in client_ids if cid in client_map]
def get_client_by_name(self, *, name: str) -> Client | None:
return Client.objects.filter(name=name).first()
def list_all_clients(self) -> list[Client]:
return list(Client.objects.order_by("id"))
def search_clients_by_name(self, *, name: str, exact_match: bool = False) -> list[Client]:
if not name:
return []
if exact_match:
qs = Client.objects.filter(name=name)
else:
qs = Client.objects.filter(name__icontains=name)
return list(qs)
def list_property_clues_by_client(self, *, client_id: int) -> list[PropertyClue]:
return list(PropertyClue.objects.filter(client_id=client_id))
def is_natural_person(self, *, client_id: int) -> bool:
client_type: str | None = Client.objects.filter(id=client_id).values_list("client_type", flat=True).first()
return bool(client_type == Client.NATURAL)
def list_identity_docs_by_client(self, *, client_id: int) -> list[ClientIdentityDoc]:
return list(ClientIdentityDoc.objects.filter(client_id=client_id))
|