102 lines
4.1 KiB
Python
102 lines
4.1 KiB
Python
"""通用高级筛选与聚合接口(需求 2.7.1 / 2.7.2)。"""
|
||
|
||
from __future__ import annotations
|
||
|
||
from fastapi import APIRouter
|
||
|
||
from app.core.deps import DbSession, ReadAccount
|
||
from app.core.response import Resp, ok
|
||
from app.schema.advanced_schema import AggregationParams, AggregationResult, QueryRequest
|
||
from app.service.advanced_service import AdvancedQueryService
|
||
|
||
router = APIRouter(prefix="/advanced", tags=["2.7 高级筛选与聚合"])
|
||
|
||
|
||
@router.get("/meta", summary="可选模型与字段白名单(前端规则构建器用)")
|
||
def meta(_: ReadAccount):
|
||
return ok(AdvancedQueryService.meta())
|
||
|
||
|
||
@router.post("/query", summary="2.7.1 通用高级筛选(支持嵌套 AND/OR、8 种操作符)")
|
||
def advanced_query(db: DbSession, _: ReadAccount, payload: QueryRequest):
|
||
result = AdvancedQueryService.execute(db, payload)
|
||
return ok(result, msg=f"命中 {result['total']} 条")
|
||
|
||
|
||
@router.post(
|
||
"/aggregate",
|
||
response_model=Resp[AggregationResult],
|
||
summary="2.7.2 通用分组聚合(count/avg/sum/max/min,可带 having)",
|
||
)
|
||
def advanced_aggregate(db: DbSession, _: ReadAccount, payload: AggregationParams):
|
||
return ok(AdvancedQueryService.aggregate(db, payload))
|
||
|
||
|
||
@router.get("/examples", summary="规则示例(直接复制改改就能用)")
|
||
def examples(_: ReadAccount):
|
||
return ok(
|
||
[
|
||
{
|
||
"title": "年龄大于 25 且(薪资 >= 15000 或 班级名含 Java)—— 需求 2.7.1 的原始示例",
|
||
"body": {
|
||
"model": "student",
|
||
"rules": [
|
||
{"field": "age", "operator": ">", "value": 25},
|
||
{"field": "gender", "operator": "=", "value": "男"},
|
||
{
|
||
"logic": "OR",
|
||
"sub_rules": [
|
||
{"field": "salary", "operator": ">=", "value": 15000},
|
||
{"field": "class_name", "operator": "like", "value": "Java"},
|
||
],
|
||
},
|
||
],
|
||
"order_by": "salary",
|
||
"order": "desc",
|
||
"page": 1,
|
||
"page_size": 10,
|
||
},
|
||
},
|
||
{
|
||
"title": "2026 年入学的、30 岁以下、学历在大专/本科之间的学生",
|
||
"body": {
|
||
"model": "student",
|
||
"rules": [
|
||
{"field": "age", "operator": "between", "value": [18, 30]},
|
||
{"field": "enroll_date", "operator": ">=", "value": "2026-01-01"},
|
||
{"field": "education", "operator": "in", "value": ["大专", "本科"]},
|
||
],
|
||
"fields": ["stu_no", "name", "age", "education", "class_name", "enroll_date"],
|
||
},
|
||
},
|
||
{
|
||
"title": "成绩在 60-70 分之间的成绩记录(含学生与班级)",
|
||
"body": {
|
||
"model": "score",
|
||
"rules": [
|
||
{"field": "score", "operator": "between", "value": [60, 70]},
|
||
{"field": "exam_seq", "operator": "<=", "value": 3},
|
||
],
|
||
"order_by": "score",
|
||
"order": "asc",
|
||
},
|
||
},
|
||
{
|
||
"title": "聚合:按班级算平均薪资、最高薪资,只看平均薪资 > 10000 的班",
|
||
"body": {
|
||
"model": "employment",
|
||
"group_by": ["class_name"],
|
||
"metrics": [
|
||
{"func": "count", "alias": "人数"},
|
||
{"func": "avg", "field": "salary", "alias": "平均薪资"},
|
||
{"func": "max", "field": "salary", "alias": "最高薪资"},
|
||
],
|
||
"having": [{"field": "平均薪资", "operator": ">", "value": 10000}],
|
||
"order_by": "平均薪资",
|
||
"order": "desc",
|
||
"limit": 20,
|
||
},
|
||
},
|
||
]
|
||
)
|