You cannot select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
88 lines
2.7 KiB
Python
88 lines
2.7 KiB
Python
"""订单与支付 CRUD"""
|
|
|
|
from typing import Any
|
|
|
|
from app.core.base_crud import CRUDBase
|
|
from app.core.base_schema import AuthSchema
|
|
|
|
from .model import OrderModel, PaymentRecordModel, RefundModel
|
|
from .schema import (
|
|
OrderCreateInternalSchema,
|
|
OrderUpdateInternalSchema,
|
|
PaymentRecordCreateSchema,
|
|
RefundCreateSchema,
|
|
RefundUpdateSchema,
|
|
)
|
|
|
|
|
|
class OrderCRUD(CRUDBase[OrderModel, OrderCreateInternalSchema, OrderUpdateInternalSchema]):
|
|
"""订单 CRUD"""
|
|
|
|
def __init__(self, auth: AuthSchema) -> None:
|
|
super().__init__(model=OrderModel, auth=auth)
|
|
|
|
async def get_by_order_no(self, order_no: str) -> OrderModel | None:
|
|
return await self.get(order_no=order_no)
|
|
|
|
async def query(
|
|
self,
|
|
*,
|
|
tenant_id: int | None = None,
|
|
status: int | None = None,
|
|
order_type: str | None = None,
|
|
offset: int = 0,
|
|
limit: int = 20,
|
|
) -> tuple[list[OrderModel], int]:
|
|
result = await self.page(
|
|
search={"tenant_id": tenant_id, "status": status, "order_type": order_type},
|
|
order_by=[{"created_time": "desc"}],
|
|
offset=offset,
|
|
limit=limit,
|
|
)
|
|
return result.items, result.total
|
|
|
|
async def mark_refunded(self, order_id: int) -> None:
|
|
from sqlalchemy import update as sa_update
|
|
|
|
await self.db.execute(
|
|
sa_update(OrderModel)
|
|
.where(OrderModel.id == order_id)
|
|
.where(OrderModel.is_deleted == False) # noqa: E712
|
|
.values(status=3)
|
|
)
|
|
|
|
|
|
class PaymentRecordCRUD(CRUDBase[PaymentRecordModel, PaymentRecordCreateSchema, Any]):
|
|
"""支付记录 CRUD"""
|
|
|
|
def __init__(self, auth: AuthSchema) -> None:
|
|
super().__init__(model=PaymentRecordModel, auth=auth)
|
|
|
|
async def query(self, offset: int = 0, limit: int = 20) -> tuple[list[PaymentRecordModel], int]:
|
|
result = await self.page(
|
|
order_by=[{"created_time": "desc"}],
|
|
offset=offset,
|
|
limit=limit,
|
|
search={},
|
|
)
|
|
return result.items, result.total
|
|
|
|
|
|
class RefundCRUD(CRUDBase[RefundModel, RefundCreateSchema, RefundUpdateSchema]):
|
|
"""退款 CRUD"""
|
|
|
|
def __init__(self, auth: AuthSchema) -> None:
|
|
super().__init__(model=RefundModel, auth=auth)
|
|
|
|
async def get_by_order_id(self, order_id: int) -> RefundModel | None:
|
|
return await self.get(order_id=order_id)
|
|
|
|
async def query(self, status: int | None = None, offset: int = 0, limit: int = 20) -> tuple[list[RefundModel], int]:
|
|
result = await self.page(
|
|
search={"status": status},
|
|
order_by=[{"created_time": "desc"}],
|
|
offset=offset,
|
|
limit=limit,
|
|
)
|
|
return result.items, result.total
|