You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

114 lines
4.2 KiB

"""
财务数据路由
"""
from fastapi import APIRouter, Depends, Query
from sqlalchemy.orm import Session
from app.db.session import get_db
from app.schemas.base import ResponseModel
from app.services.finance_service import FinanceService
from app.core.security import get_current_user
from app.models.user import User
from app.utils.date_utils import parse_date
router = APIRouter()
@router.get("/balance-sheet", response_model=ResponseModel)
async def get_balance_sheet(
codes: str = Query(..., description="股票代码,多个用逗号分隔"),
start_date: str = Query(..., description="开始报告期(YYYYMMDD)"),
end_date: str = Query(..., description="结束报告期(YYYYMMDD)"),
db: Session = Depends(get_db),
current_user: User = Depends(get_current_user)
):
"""获取资产负债表"""
service = FinanceService(db)
code_list = [c.strip() for c in codes.split(",")]
start = parse_date(start_date)
end = parse_date(end_date)
data = service.get_balance_sheet(code_list, start, end)
return ResponseModel(data=data)
@router.get("/cash-flow", response_model=ResponseModel)
async def get_cash_flow(
codes: str = Query(..., description="股票代码,多个用逗号分隔"),
start_date: str = Query(..., description="开始报告期(YYYYMMDD)"),
end_date: str = Query(..., description="结束报告期(YYYYMMDD)"),
db: Session = Depends(get_db),
current_user: User = Depends(get_current_user)
):
"""获取现金流量表"""
service = FinanceService(db)
code_list = [c.strip() for c in codes.split(",")]
start = parse_date(start_date)
end = parse_date(end_date)
data = service.get_cash_flow(code_list, start, end)
return ResponseModel(data=data)
@router.get("/income", response_model=ResponseModel)
async def get_income(
codes: str = Query(..., description="股票代码,多个用逗号分隔"),
start_date: str = Query(..., description="开始报告期(YYYYMMDD)"),
end_date: str = Query(..., description="结束报告期(YYYYMMDD)"),
db: Session = Depends(get_db),
current_user: User = Depends(get_current_user)
):
"""获取利润表"""
service = FinanceService(db)
code_list = [c.strip() for c in codes.split(",")]
start = parse_date(start_date)
end = parse_date(end_date)
data = service.get_income_statement(code_list, start, end)
return ResponseModel(data=data)
@router.get("/profit-express", response_model=ResponseModel)
async def get_profit_express(
codes: str = Query(..., description="股票代码,多个用逗号分隔"),
start_date: str = Query(..., description="开始报告期(YYYYMMDD)"),
end_date: str = Query(..., description="结束报告期(YYYYMMDD)"),
db: Session = Depends(get_db),
current_user: User = Depends(get_current_user)
):
"""获取业绩快报"""
service = FinanceService(db)
code_list = [c.strip() for c in codes.split(",")]
start = parse_date(start_date)
end = parse_date(end_date)
# 从SDK获取业绩快报
try:
adapter = service.base_service._get_adapter()
data = adapter.get_profit_express(code_list, start, end)
return ResponseModel(data=data.to_dict("records") if not data.empty else [])
except Exception as e:
return ResponseModel(data=[], message=str(e))
@router.get("/profit-notice", response_model=ResponseModel)
async def get_profit_notice(
codes: str = Query(..., description="股票代码,多个用逗号分隔"),
start_date: str = Query(..., description="开始报告期(YYYYMMDD)"),
end_date: str = Query(..., description="结束报告期(YYYYMMDD)"),
db: Session = Depends(get_db),
current_user: User = Depends(get_current_user)
):
"""获取业绩预告"""
service = FinanceService(db)
code_list = [c.strip() for c in codes.split(",")]
start = parse_date(start_date)
end = parse_date(end_date)
try:
adapter = service.base_service._get_adapter()
data = adapter.get_profit_notice(code_list, start, end)
return ResponseModel(data=data.to_dict("records") if not data.empty else [])
except Exception as e:
return ResponseModel(data=[], message=str(e))