87 lines
3.5 KiB
Python
87 lines
3.5 KiB
Python
from decimal import Decimal
|
|
from typing import List
|
|
|
|
from fastapi import FastAPI
|
|
from sqlmodel import Field, select
|
|
|
|
from app.model.BasicModel import BasicModel
|
|
from app.model.LlmDemoModel import LlmDemoModel
|
|
from app.utils.model_utils import FormattedDatetime
|
|
from app.utils.mysql_utils import AsyncSessionDep
|
|
|
|
|
|
def add_complex_search_route(app: FastAPI):
|
|
@app.post('/llm_demo/search')
|
|
async def _search(
|
|
session: AsyncSessionDep,
|
|
body: SearchQuerySchema,
|
|
):
|
|
"""
|
|
多条件组合查询用户
|
|
"""
|
|
query = select(LlmDemoModel)
|
|
|
|
# 按名称模糊查询
|
|
if body.full_name:
|
|
query = query.where(LlmDemoModel.full_name.like(f"%{body.full_name}%"))
|
|
|
|
# 按开通会员时间范围查询
|
|
if body.datetime_start_min:
|
|
query = query.where(LlmDemoModel.datetime_start >= body.datetime_start_min)
|
|
if body.datetime_start_max:
|
|
query = query.where(LlmDemoModel.datetime_start <= body.datetime_start_max)
|
|
|
|
# 按会员到期时间范围查询
|
|
if body.datetime_end_min:
|
|
query = query.where(LlmDemoModel.datetime_end >= body.datetime_end_min)
|
|
if body.datetime_end_max:
|
|
query = query.where(LlmDemoModel.datetime_end <= body.datetime_end_max)
|
|
|
|
# 按金额范围查询
|
|
if body.amount_min is not None:
|
|
query = query.where(LlmDemoModel.amount >= body.amount_min)
|
|
if body.amount_max is not None:
|
|
query = query.where(LlmDemoModel.amount <= body.amount_max)
|
|
|
|
# 按创建时间范围查询
|
|
if body.created_at_min:
|
|
query = query.where(LlmDemoModel.created_at >= body.created_at_min)
|
|
if body.created_at_max:
|
|
query = query.where(LlmDemoModel.created_at <= body.created_at_max)
|
|
|
|
# 排序
|
|
if body.order_by:
|
|
if body.order_by == "amount_desc":
|
|
query = query.order_by(LlmDemoModel.amount.desc())
|
|
elif body.order_by == "amount_asc":
|
|
query = query.order_by(LlmDemoModel.amount.asc())
|
|
elif body.order_by == "created_at_desc":
|
|
query = query.order_by(LlmDemoModel.created_at.desc())
|
|
elif body.order_by == "created_at_asc":
|
|
query = query.order_by(LlmDemoModel.created_at.asc())
|
|
else:
|
|
query = query.order_by(LlmDemoModel.created_at.desc())
|
|
|
|
# 分页
|
|
query = query.offset(body.page * body.page_size).limit(body.page_size)
|
|
|
|
result = await session.execute(query)
|
|
query_cls_list: List[LlmDemoModel] = result.scalars().all()
|
|
|
|
return {"list": query_cls_list}
|
|
|
|
|
|
class SearchQuerySchema(BasicModel):
|
|
full_name: str | None = Field(default=None, description="用户名称(模糊查询)")
|
|
datetime_start_min: FormattedDatetime | None = Field(default=None, description="开通会员开始时间")
|
|
datetime_start_max: FormattedDatetime | None = Field(default=None, description="开通会员结束时间")
|
|
datetime_end_min: FormattedDatetime | None = Field(default=None, description="会员到期开始时间")
|
|
datetime_end_max: FormattedDatetime | None = Field(default=None, description="会员到期结束时间")
|
|
amount_min: Decimal | None = Field(default=None, description="最小金额")
|
|
amount_max: Decimal | None = Field(default=None, description="最大金额")
|
|
created_at_min: FormattedDatetime | None = Field(default=None, description="创建开始时间")
|
|
created_at_max: FormattedDatetime | None = Field(default=None, description="创建结束时间")
|
|
order_by: str | None = Field(default=None, description="排序字段:amount_desc, amount_asc, created_at_desc, created_at_asc")
|
|
page: int = Field(default=0, description="页码")
|
|
page_size: int = Field(default=10, description="每页数量")
|