from fastapi import APIRouter, Depends, Query, HTTPException, UploadFile, File from sqlalchemy.orm import Session from typing import List, Optional from datetime import date from app.core.database import get_db from app.services.lottery import LotteryService from app.schemas.lottery import SSQLottery, DLTLottery, LotteryQuery import random import tempfile router = APIRouter() @router.get("/ssq/latest", response_model=SSQLottery) def get_latest_ssq(db: Session = Depends(get_db)): """获取最新一期双色球开奖记录""" return LotteryService.get_latest_ssq(db) @router.get("/dlt/latest", response_model=DLTLottery) def get_latest_dlt(db: Session = Depends(get_db)): """获取最新一期大乐透开奖记录""" return LotteryService.get_latest_dlt(db) @router.get("/ssq/", response_model=List[SSQLottery]) def get_ssq_lotteries( db: Session = Depends(get_db), issue: Optional[str] = Query(None, description="期号"), start_date: Optional[str] = Query(None, description="开始日期 (YYYY-MM-DD)"), end_date: Optional[str] = Query(None, description="结束日期 (YYYY-MM-DD)"), page: int = Query(1, ge=1, description="页码"), page_size: int = Query(20, ge=1, le=100, description="每页记录数") ): """获取双色球开奖记录列表""" query = LotteryQuery( issue=issue, start_date=start_date, end_date=end_date, page=page, page_size=page_size ) lotteries, _ = LotteryService.get_ssq_lotteries(db, query) return lotteries @router.get("/dlt/", response_model=List[DLTLottery]) def get_dlt_lotteries( db: Session = Depends(get_db), issue: Optional[str] = Query(None, description="期号"), start_date: Optional[str] = Query(None, description="开始日期 (YYYY-MM-DD)"), end_date: Optional[str] = Query(None, description="结束日期 (YYYY-MM-DD)"), page: int = Query(1, ge=1, description="页码"), page_size: int = Query(20, ge=1, le=100, description="每页记录数") ): """获取大乐透开奖记录列表""" query = LotteryQuery( issue=issue, start_date=start_date, end_date=end_date, page=page, page_size=page_size ) lotteries, _ = LotteryService.get_dlt_lotteries(db, query) return lotteries @router.get("/ssq/statistics") def get_ssq_statistics(db: Session = Depends(get_db)): """获取双色球统计数据""" return LotteryService.get_ssq_statistics(db) @router.get("/dlt/statistics") def get_dlt_statistics(db: Session = Depends(get_db)): """获取大乐透统计数据""" return LotteryService.get_dlt_statistics(db) @router.get("/ssq/generate") def generate_ssq_numbers(strategy: str = Query("random"), count: int = Query(1)): """ 智能生成双色球号码 - strategy: 选号策略(目前仅支持 random) - count: 生成注数 """ results = [] for _ in range(count): red_balls = sorted(random.sample(range(1, 34), 6)) blue_ball = random.randint(1, 16) results.append({ "red_balls": red_balls, "blue_ball": blue_ball }) return {"results": results} @router.get("/dlt/generate") def generate_dlt_numbers(strategy: str = Query("random"), count: int = Query(1)): """ 智能生成大乐透号码 - strategy: 选号策略(目前仅支持 random) - count: 生成注数 """ results = [] for _ in range(count): front_balls = sorted(random.sample(range(1, 36), 5)) back_balls = sorted(random.sample(range(1, 13), 2)) results.append({ "front_balls": front_balls, "back_balls": back_balls }) return {"results": results} @router.post("/ssq/import") def import_ssq_data(file: UploadFile = File(...), db: Session = Depends(get_db)): with tempfile.NamedTemporaryFile(delete=False) as tmp: tmp.write(file.file.read()) tmp_path = tmp.name count = LotteryService.import_ssq_data(db, tmp_path) return {"imported": count} @router.post("/dlt/import") def import_dlt_data(file: UploadFile = File(...), db: Session = Depends(get_db)): with tempfile.NamedTemporaryFile(delete=False) as tmp: tmp.write(file.file.read()) tmp_path = tmp.name count = LotteryService.import_dlt_data(db, tmp_path) return {"imported": count} @router.post("/update/ssq") async def update_ssq_data(db: Session = Depends(get_db)): """更新双色球数据""" try: result = LotteryService.update_ssq_data(db) return { "success": True, "message": f"双色球数据更新成功,新增 {result.get('new_count', 0)} 条记录", "data": result } except Exception as e: raise HTTPException(status_code=500, detail=f"更新双色球数据失败: {str(e)}") @router.post("/update/dlt") async def update_dlt_data(db: Session = Depends(get_db)): """更新大乐透数据""" try: result = LotteryService.update_dlt_data(db) return { "success": True, "message": f"大乐透数据更新成功,新增 {result.get('new_count', 0)} 条记录", "data": result } except Exception as e: raise HTTPException(status_code=500, detail=f"更新大乐透数据失败: {str(e)}") @router.post("/update/all") async def update_all_lottery_data(db: Session = Depends(get_db)): """更新所有彩票数据""" try: result = LotteryService.update_all_lottery_data(db) return { "success": True, "message": "所有彩票数据更新完成", "data": result } except Exception as e: raise HTTPException(status_code=500, detail=f"更新彩票数据失败: {str(e)}")