|
@@ -1,7 +1,7 @@
|
|
from fastapi import FastAPI, HTTPException, Depends, APIRouter,Query,Body
|
|
from fastapi import FastAPI, HTTPException, Depends, APIRouter,Query,Body
|
|
from sqlalchemy.engine.reflection import Inspector
|
|
from sqlalchemy.engine.reflection import Inspector
|
|
from common.security import valid_access_token
|
|
from common.security import valid_access_token
|
|
-from pydantic import BaseModel,Extra
|
|
|
|
|
|
+from pydantic import BaseModel,Extra,Field
|
|
from datetime import datetime
|
|
from datetime import datetime
|
|
from typing import List, Optional,Any,Dict
|
|
from typing import List, Optional,Any,Dict
|
|
from sqlalchemy import create_engine, Column, Integer, String, Boolean, MetaData, Table, inspect, exists,or_,text,insert
|
|
from sqlalchemy import create_engine, Column, Integer, String, Boolean, MetaData, Table, inspect, exists,or_,text,insert
|
|
@@ -163,7 +163,7 @@ def create_dynamic_table(table_name: str, field_names: List[str], db: Session):
|
|
|
|
|
|
class ReportCreate(BaseModel):
|
|
class ReportCreate(BaseModel):
|
|
table_name: str
|
|
table_name: str
|
|
- start_time: str
|
|
|
|
|
|
+ #start_time: str
|
|
end_time: str
|
|
end_time: str
|
|
status: str
|
|
status: str
|
|
issued_status: str
|
|
issued_status: str
|
|
@@ -195,8 +195,8 @@ def create_report_and_table(report: ReportCreate, db: Session = Depends(get_db),
|
|
report_id=get_next_event_id(db),
|
|
report_id=get_next_event_id(db),
|
|
table_name=report.table_name,
|
|
table_name=report.table_name,
|
|
data_table_name=data_table_name,
|
|
data_table_name=data_table_name,
|
|
- start_time=start_time,
|
|
|
|
- end_time=datetime.now(),
|
|
|
|
|
|
+ start_time=datetime.now(),
|
|
|
|
+ end_time=report.end_time,
|
|
status=report.status,
|
|
status=report.status,
|
|
issued_status=report.issued_status,
|
|
issued_status=report.issued_status,
|
|
collection_status=0,#未收取
|
|
collection_status=0,#未收取
|
|
@@ -226,47 +226,50 @@ def create_report_and_table(report: ReportCreate, db: Session = Depends(get_db),
|
|
raise HTTPException(status_code=400, detail=str(e))
|
|
raise HTTPException(status_code=400, detail=str(e))
|
|
|
|
|
|
|
|
|
|
|
|
+# 定义请求体的 Pydantic 模型
|
|
class ReportQuery(BaseModel):
|
|
class ReportQuery(BaseModel):
|
|
- # creator_id: str # 创建者ID,必须提供
|
|
|
|
- table_name: Optional[str] = None
|
|
|
|
- status: Optional[List[int]] = None
|
|
|
|
- start_time: Optional[datetime] = None
|
|
|
|
- end_time: Optional[datetime] = None
|
|
|
|
- issued_status: Optional[List[int]] = None
|
|
|
|
- page_num: int = 1
|
|
|
|
- page_size: int = 10
|
|
|
|
|
|
+ table_name: Optional[str] = Field(None, description="Table name filter")
|
|
|
|
+ status: Optional[str] = Field(None, description="Status filter (comma-separated values, e.g., '1,2,3')")
|
|
|
|
+ start_time: Optional[datetime] = Field(None, description="Start time filter")
|
|
|
|
+ end_time: Optional[datetime] = Field(None, description="End time filter")
|
|
|
|
+ issued_status: Optional[str] = Field(None, description="Issued status filter (comma-separated values, e.g., '0,1')")
|
|
|
|
+ page: int = Field(1, gt=0, description="Page number for pagination")
|
|
|
|
+ pageSize: int = Field(10, gt=0, description="Page size for pagination")
|
|
|
|
|
|
@router.post("/select")
|
|
@router.post("/select")
|
|
-@router.get("/select")
|
|
|
|
async def select_report(
|
|
async def select_report(
|
|
- db: Session = Depends(get_db),
|
|
|
|
- query: ReportQuery = Depends(),
|
|
|
|
- creator_id = Depends(valid_access_token)
|
|
|
|
|
|
+ db: Session = Depends(get_db),
|
|
|
|
+ query: ReportQuery = Body(..., description="Report query parameters in the request body"),
|
|
|
|
+ creator_id: str = Depends(valid_access_token)
|
|
):
|
|
):
|
|
-
|
|
|
|
-
|
|
|
|
|
|
+ # 构建查询
|
|
data_query = db.query(ReportManagement).filter(ReportManagement.creator_id == creator_id)
|
|
data_query = db.query(ReportManagement).filter(ReportManagement.creator_id == creator_id)
|
|
|
|
|
|
- # 过滤条件
|
|
|
|
|
|
+ # 应用过滤条件
|
|
if query.table_name:
|
|
if query.table_name:
|
|
data_query = data_query.filter(ReportManagement.table_name.ilike(f"%{query.table_name}%"))
|
|
data_query = data_query.filter(ReportManagement.table_name.ilike(f"%{query.table_name}%"))
|
|
|
|
|
|
if query.start_time and query.end_time:
|
|
if query.start_time and query.end_time:
|
|
- data_query = data_query.filter(ReportManagement.start_time >= query.start_time,
|
|
|
|
- ReportManagement.end_time <= query.end_time)
|
|
|
|
|
|
+ data_query = data_query.filter(
|
|
|
|
+ ReportManagement.start_time >= query.start_time,
|
|
|
|
+ ReportManagement.end_time <= query.end_time
|
|
|
|
+ )
|
|
|
|
|
|
|
|
+ # 处理 status 和 issued_status 的逗号分隔字符串
|
|
if query.status:
|
|
if query.status:
|
|
- data_query = data_query.filter(ReportManagement.status.in_(query.status))
|
|
|
|
|
|
+ status_list = [int(s) for s in query.status.split(",")]
|
|
|
|
+ data_query = data_query.filter(ReportManagement.status.in_(status_list))
|
|
|
|
|
|
if query.issued_status:
|
|
if query.issued_status:
|
|
- data_query = data_query.filter(ReportManagement.issued_status.in_(query.issued_status))
|
|
|
|
|
|
+ issued_status_list = [int(s) for s in query.issued_status.split(",")]
|
|
|
|
+ data_query = data_query.filter(ReportManagement.issued_status.in_(issued_status_list))
|
|
|
|
|
|
# 计算总数
|
|
# 计算总数
|
|
total_count = data_query.count()
|
|
total_count = data_query.count()
|
|
|
|
|
|
# 分页查询
|
|
# 分页查询
|
|
- offset = (query.page_num - 1) * query.page_size
|
|
|
|
- data = data_query.offset(offset).limit(query.page_size).all()
|
|
|
|
|
|
+ offset = (query.page - 1) * query.pageSize
|
|
|
|
+ data = data_query.offset(offset).limit(query.pageSize).all()
|
|
|
|
|
|
# 构造结果
|
|
# 构造结果
|
|
result_items = []
|
|
result_items = []
|
|
@@ -292,12 +295,12 @@ async def select_report(
|
|
|
|
|
|
result = {
|
|
result = {
|
|
"code": 200,
|
|
"code": 200,
|
|
- 'msg': '查询成功',
|
|
|
|
- 'pages': (total_count + query.page_size - 1) // query.page_size,
|
|
|
|
- 'total': total_count,
|
|
|
|
- "currentPage": query.page_num,
|
|
|
|
- "pageSize": query.page_size,
|
|
|
|
- 'data': result_items
|
|
|
|
|
|
+ "msg": "查询成功",
|
|
|
|
+ "total": total_count,
|
|
|
|
+ "pages": (total_count + query.pageSize - 1) // query.pageSize,
|
|
|
|
+ "currentPage": query.page,
|
|
|
|
+ "pageSize": query.pageSize,
|
|
|
|
+ "data": result_items
|
|
}
|
|
}
|
|
|
|
|
|
return result
|
|
return result
|
|
@@ -711,8 +714,8 @@ def has_matching_column_comments(
|
|
return bool(get_columns_with_comment_like(inspector, table_name, comment_like))
|
|
return bool(get_columns_with_comment_like(inspector, table_name, comment_like))
|
|
|
|
|
|
|
|
|
|
-@router.post("/reports_by_creator/")
|
|
|
|
-@router.get("/reports_by_creator/")
|
|
|
|
|
|
+@router.post("/reports_by_creator")
|
|
|
|
+@router.get("/reports_by_creator")
|
|
async def get_reports_by_creator(
|
|
async def get_reports_by_creator(
|
|
field_comment: Optional[str] = Query(None, description="Optional comment of the field to match"),
|
|
field_comment: Optional[str] = Query(None, description="Optional comment of the field to match"),
|
|
page: int = Query(default=1, gt=0), # 分页参数:当前页码,默认为1
|
|
page: int = Query(default=1, gt=0), # 分页参数:当前页码,默认为1
|