feat: product search
This commit is contained in:
@@ -32,6 +32,7 @@ class DealSummary(BaseSchema):
|
|||||||
total_price: int
|
total_price: int
|
||||||
rank: int
|
rank: int
|
||||||
base_marketplace: Optional[BaseMarketplaceSchema] = None
|
base_marketplace: Optional[BaseMarketplaceSchema] = None
|
||||||
|
total_products: int
|
||||||
|
|
||||||
shipment_warehouse_id: Optional[int]
|
shipment_warehouse_id: Optional[int]
|
||||||
shipment_warehouse_name: Optional[str]
|
shipment_warehouse_name: Optional[str]
|
||||||
|
|||||||
@@ -6,7 +6,7 @@ from starlette import status
|
|||||||
|
|
||||||
import models.deal
|
import models.deal
|
||||||
import models.secondary
|
import models.secondary
|
||||||
from models import User, Service, Client
|
from models import User, Service, Client, DealProduct
|
||||||
from models.deal import *
|
from models.deal import *
|
||||||
from schemas.client import ClientDetailsSchema
|
from schemas.client import ClientDetailsSchema
|
||||||
from schemas.deal import *
|
from schemas.deal import *
|
||||||
@@ -15,6 +15,7 @@ from services.base import BaseService
|
|||||||
from services.client import ClientService
|
from services.client import ClientService
|
||||||
from services.service import ServiceService
|
from services.service import ServiceService
|
||||||
from services.shipping_warehouse import ShippingWarehouseService
|
from services.shipping_warehouse import ShippingWarehouseService
|
||||||
|
from utils.list_utils import compile_query_to_plain_sql
|
||||||
|
|
||||||
|
|
||||||
class DealService(BaseService):
|
class DealService(BaseService):
|
||||||
@@ -165,8 +166,20 @@ class DealService(BaseService):
|
|||||||
)
|
)
|
||||||
return final_subquery
|
return final_subquery
|
||||||
|
|
||||||
|
def _get_products_quantity_subquery(self):
|
||||||
|
deal_products_subquery = (
|
||||||
|
select(
|
||||||
|
models.secondary.DealProduct.deal_id,
|
||||||
|
func.sum(models.secondary.DealProduct.quantity).label('total_quantity')
|
||||||
|
)
|
||||||
|
.group_by(models.secondary.DealProduct.deal_id)
|
||||||
|
.subquery()
|
||||||
|
)
|
||||||
|
return deal_products_subquery
|
||||||
|
|
||||||
async def get_summary(self, full: bool = False) -> DealSummaryResponse:
|
async def get_summary(self, full: bool = False) -> DealSummaryResponse:
|
||||||
price_subquery = self._get_price_subquery()
|
price_subquery = self._get_price_subquery()
|
||||||
|
products_quantity_subquery = self._get_products_quantity_subquery()
|
||||||
q = (
|
q = (
|
||||||
select(
|
select(
|
||||||
Deal,
|
Deal,
|
||||||
@@ -174,7 +187,8 @@ class DealService(BaseService):
|
|||||||
func.row_number().over(
|
func.row_number().over(
|
||||||
partition_by=Deal.current_status,
|
partition_by=Deal.current_status,
|
||||||
order_by=Deal.lexorank
|
order_by=Deal.lexorank
|
||||||
).label('rank')
|
).label('rank'),
|
||||||
|
func.coalesce(products_quantity_subquery.c.total_quantity, 0)
|
||||||
)
|
)
|
||||||
.options(
|
.options(
|
||||||
selectinload(Deal.status_history),
|
selectinload(Deal.status_history),
|
||||||
@@ -182,7 +196,11 @@ class DealService(BaseService):
|
|||||||
joinedload(Deal.shipping_warehouse),
|
joinedload(Deal.shipping_warehouse),
|
||||||
)
|
)
|
||||||
.outerjoin(
|
.outerjoin(
|
||||||
price_subquery, Deal.id == price_subquery.c.deal_id)
|
price_subquery, Deal.id == price_subquery.c.deal_id,
|
||||||
|
)
|
||||||
|
.outerjoin(
|
||||||
|
products_quantity_subquery, Deal.id == products_quantity_subquery.c.deal_id
|
||||||
|
)
|
||||||
.where(
|
.where(
|
||||||
Deal.is_deleted == False,
|
Deal.is_deleted == False,
|
||||||
)
|
)
|
||||||
@@ -194,9 +212,10 @@ class DealService(BaseService):
|
|||||||
)
|
)
|
||||||
else:
|
else:
|
||||||
q = q.order_by(Deal.created_at.desc())
|
q = q.order_by(Deal.created_at.desc())
|
||||||
|
print(compile_query_to_plain_sql(q))
|
||||||
deals_query = await self.session.execute(q)
|
deals_query = await self.session.execute(q)
|
||||||
summaries = []
|
summaries = []
|
||||||
for deal, total_price, rank in deals_query.all():
|
for deal, total_price, rank, products_count in deals_query.all():
|
||||||
deal: Deal
|
deal: Deal
|
||||||
last_status: DealStatusHistory = max(deal.status_history, key=lambda status: status.changed_at)
|
last_status: DealStatusHistory = max(deal.status_history, key=lambda status: status.changed_at)
|
||||||
deadline = last_status.next_status_deadline
|
deadline = last_status.next_status_deadline
|
||||||
@@ -217,7 +236,8 @@ class DealService(BaseService):
|
|||||||
base_marketplace=base_marketplace,
|
base_marketplace=base_marketplace,
|
||||||
created_at=deal.created_at,
|
created_at=deal.created_at,
|
||||||
shipment_warehouse_id=deal.shipping_warehouse_id,
|
shipment_warehouse_id=deal.shipping_warehouse_id,
|
||||||
shipment_warehouse_name=shipment_warehouse_name
|
shipment_warehouse_name=shipment_warehouse_name,
|
||||||
|
total_products=products_count
|
||||||
)
|
)
|
||||||
)
|
)
|
||||||
return DealSummaryResponse(summaries=summaries)
|
return DealSummaryResponse(summaries=summaries)
|
||||||
|
|||||||
Reference in New Issue
Block a user