75 lines
2.2 KiB
Python
75 lines
2.2 KiB
Python
"""
|
|
积分充值订单 CRUD
|
|
=================
|
|
|
|
支持按订单号、用户、状态查询。
|
|
"""
|
|
|
|
from sqlalchemy import select
|
|
from sqlalchemy.ext.asyncio import AsyncSession
|
|
|
|
from app.crud.base import CRUDBase
|
|
from app.models.point_recharge_order import PointRechargeOrder
|
|
|
|
|
|
class PointRechargeOrderCRUD(CRUDBase[PointRechargeOrder]):
|
|
"""积分充值订单数据访问对象"""
|
|
|
|
def __init__(self) -> None:
|
|
super().__init__(PointRechargeOrder)
|
|
|
|
async def get_by_out_trade_no(
|
|
self, db: AsyncSession, *, out_trade_no: str
|
|
) -> PointRechargeOrder | None:
|
|
"""根据商户订单号查询"""
|
|
result = await db.execute(
|
|
select(PointRechargeOrder).where(PointRechargeOrder.out_trade_no == out_trade_no)
|
|
)
|
|
return result.scalar_one_or_none()
|
|
|
|
async def get_by_wx_order_no(
|
|
self, db: AsyncSession, *, wx_order_no: str
|
|
) -> PointRechargeOrder | None:
|
|
"""根据微信支付订单号查询"""
|
|
result = await db.execute(
|
|
select(PointRechargeOrder).where(PointRechargeOrder.wx_order_no == wx_order_no)
|
|
)
|
|
return result.scalar_one_or_none()
|
|
|
|
async def get_by_user_id(
|
|
self,
|
|
db: AsyncSession,
|
|
*,
|
|
user_id: str,
|
|
skip: int = 0,
|
|
limit: int = 20,
|
|
) -> list[PointRechargeOrder]:
|
|
"""根据用户 ID 查询充值记录(分页,按时间倒序)"""
|
|
result = await db.execute(
|
|
select(PointRechargeOrder)
|
|
.where(PointRechargeOrder.user_id == user_id)
|
|
.order_by(PointRechargeOrder.created_at.desc())
|
|
.offset(skip)
|
|
.limit(limit)
|
|
)
|
|
return list(result.scalars().all())
|
|
|
|
async def get_pending_orders(
|
|
self,
|
|
db: AsyncSession,
|
|
*,
|
|
limit: int = 100,
|
|
) -> list[PointRechargeOrder]:
|
|
"""获取待支付的订单(用于定时清理超时订单)"""
|
|
result = await db.execute(
|
|
select(PointRechargeOrder)
|
|
.where(PointRechargeOrder.status == "pending")
|
|
.order_by(PointRechargeOrder.created_at.asc())
|
|
.limit(limit)
|
|
)
|
|
return list(result.scalars().all())
|
|
|
|
|
|
# 导出实例
|
|
point_recharge_order = PointRechargeOrderCRUD()
|