# deal - 成交行情路由 # Version: 0.0.1 # 更新: from fastapi import APIRouter, Depends, Query, HTTPException # 更新: # Version: 1.2.x # 更新: from sqlalchemy.orm import Session # 更新: from pydantic import BaseModel # 更新: from typing import Optional # 更新: from datetime import datetime, date # 更新: from app.core.database import get_db # 更新: from app.core.auth import get_current_user # 更新: from app.models.deal_info import DealInfo # 更新: # 更新: router = APIRouter(prefix="/api/deal", tags=["成交行情"]) # 更新: # 更新: # ============ Schema ============ # 更新: class DealInfoCreate(BaseModel): # 更新: title: str # 更新: content: Optional[str] = None # 更新: deal_price: Optional[float] = None # 更新: deal_date: Optional[str] = None # YYYY-MM-DD # 更新: packaging: Optional[str] = None # 更新: category: Optional[str] = None # 更新: is_graded: Optional[bool] = False # 更新: grading_company: Optional[str] = None # 更新: grading_score: Optional[str] = None # 更新: tail_number: Optional[str] = None # 更新: size_type: Optional[str] = None # 更新: version: Optional[str] = None # 更新: platform: Optional[str] = None # 更新: seller: Optional[str] = None # 更新: buyer: Optional[str] = None # 更新: # 更新: class DealInfoUpdate(BaseModel): # 更新: title: Optional[str] = None # 更新: content: Optional[str] = None # 更新: deal_price: Optional[float] = None # 更新: deal_date: Optional[str] = None # 更新: packaging: Optional[str] = None # 更新: category: Optional[str] = None # 更新: is_graded: Optional[bool] = None # 更新: grading_company: Optional[str] = None # 更新: grading_score: Optional[str] = None # 更新: tail_number: Optional[str] = None # 更新: size_type: Optional[str] = None # 更新: version: Optional[str] = None # 更新: platform: Optional[str] = None # 更新: seller: Optional[str] = None # 更新: buyer: Optional[str] = None # 更新: status: Optional[str] = None # 更新: # 更新: class DealInfoResponse(BaseModel): # 更新: id: str # 更新: user_id: Optional[str] # 更新: title: str # 更新: content: Optional[str] # 更新: deal_price: Optional[float] # 更新: deal_date: Optional[date] # 更新: deal_no: Optional[str] # 更新: packaging: Optional[str] # 更新: category: Optional[str] # 更新: is_graded: Optional[bool] # 更新: grading_company: Optional[str] # 更新: grading_score: Optional[str] # 更新: tail_number: Optional[str] # 更新: size_type: Optional[str] # 更新: version: Optional[str] # 更新: platform: Optional[str] # 更新: seller: Optional[str] # 更新: buyer: Optional[str] # 更新: status: str # 更新: view_count: int # 更新: contact_count: int # 更新: created_at: Optional[datetime] # 更新: updated_at: Optional[datetime] # 更新: # 更新: class Config: # 更新: from_attributes = True # 更新: # 更新: # 生成行情编号 # 更新: def generate_deal_no(db: Session): # 更新: """生成行情编号,从A000001开始递增""" # 更新: last = db.query(DealInfo).order_by(DealInfo.deal_no.desc()).first() # 更新: if last and last.deal_no: # 更新: # 例如 A000001 -> 2 -> A000002 # 更新: num = int(last.deal_no[1:]) + 1 # 更新: return f"A{num:06d}" # 更新: return "A000001" # 更新: # 更新: # ============ API ============ # 更新: @router.get("/list", response_model=list[DealInfoResponse]) # 更新: def get_deal_list( # 更新: status: str = Query("active"), # 更新: deal_date: Optional[str] = Query(None), # 更新: page: int = Query(1, ge=1), # 更新: page_size: int = Query(20, ge=1, le=1000), # 更新: user_only: bool = Query(False), # 是否只查看自己的 # 更新: current_user: Optional = Depends(get_current_user), # 更新: db: Session = Depends(get_db) # 更新: ): # 更新: """获取成交行情列表""" # 更新: query = db.query(DealInfo).filter(DealInfo.status == status) # 更新: # 更新: # 我的行情:只查看自己的(管理员也只看自己的) # 更新: if user_only and current_user: # 更新: query = query.filter(DealInfo.user_id == current_user.f99_90_id) # 更新: # 更新: # 成交日期过滤 # 更新: if deal_date: # 更新: query = query.filter(DealInfo.deal_date == deal_date) # 更新: # 更新: # 排序:优先成交日期倒序,同日按编号倒序 # 更新: query = query.order_by(DealInfo.deal_date.desc().nullslast(), DealInfo.deal_no.desc().nullslast()) # 更新: # 更新: # 分页 # 更新: offset = (page - 1) * page_size # 更新: items = query.offset(offset).limit(page_size).all() # 更新: # 更新: return items # 更新: # 更新: @router.get("/stats") # 更新: def get_deal_stats( # 更新: db: Session = Depends(get_db) # 更新: ): # 更新: """获取成交行情统计""" # 更新: total = db.query(DealInfo).filter(DealInfo.status == "active").count() # 更新: # 更新: # 按日期统计 # 更新: from sqlalchemy import func # 更新: date_stats = db.query( # 更新: DealInfo.deal_date, # 更新: func.count(DealInfo.id).label('count') # 更新: ).filter( # 更新: DealInfo.status == "active", # 更新: DealInfo.deal_date.isnot(None) # 更新: ).group_by(DealInfo.deal_date).order_by(DealInfo.deal_date.desc()).limit(10).all() # 更新: # 更新: return { # 更新: "total": total, # 更新: "by_date": [{"date": str(d.deal_date), "count": d.count} for d in date_stats] # 更新: } # 更新: # 更新: @router.post("", response_model=DealInfoResponse) # 更新: def create_deal( # 更新: data: DealInfoCreate, # 更新: current_user = Depends(get_current_user), # 更新: db: Session = Depends(get_db) # 更新: ): # 更新: """创建成交行情""" # 更新: if not current_user: # 更新: raise HTTPException(status_code=401, detail="请先登录") # 更新: # 更新: # 生成行情编号 # 更新: deal_no = generate_deal_no(db) # 更新: # 更新: # 解析日期 # 更新: deal_date = None # 更新: if data.deal_date: # 更新: try: # 更新: deal_date = datetime.strptime(data.deal_date, "%Y-%m-%d").date() # 更新: except: # 更新: pass # 更新: # 更新: deal = DealInfo( # 更新: user_id=current_user.f99_90_id if current_user else None, # 更新: title=data.title, # 更新: content=data.content, # 更新: deal_price=data.deal_price, # 更新: deal_date=deal_date, # 更新: deal_no=deal_no, # 更新: packaging=data.packaging, # 更新: category=data.category, # 更新: is_graded=data.is_graded or False, # 更新: grading_company=data.grading_company, # 更新: grading_score=data.grading_score, # 更新: tail_number=data.tail_number, # 更新: size_type=data.size_type, # 更新: version=data.version, # 更新: platform=data.platform, # 更新: seller=data.seller, # 更新: buyer=data.buyer, # 更新: status="active" # 更新: ) # 更新: db.add(deal) # 更新: db.commit() # 更新: db.refresh(deal) # 更新: return deal # 更新: # 更新: @router.get("/{deal_id}", response_model=DealInfoResponse) # 更新: def get_deal( # 更新: deal_id: str, # 更新: current_user = Depends(get_current_user), # 更新: db: Session = Depends(get_db) # 更新: ): # 更新: """获取成交行情详情""" # 更新: deal = db.query(DealInfo).filter(DealInfo.id == deal_id).first() # 更新: if not deal: # 更新: raise HTTPException(status_code=404, detail="成交行情不存在") # 更新: # 更新: # 增加浏览数 # 更新: deal.view_count += 1 # 更新: db.commit() # 更新: # 更新: return deal # 更新: # 更新: @router.put("/{deal_id}", response_model=DealInfoResponse) # 更新: def update_deal( # 更新: deal_id: str, # 更新: data: DealInfoUpdate, # 更新: current_user = Depends(get_current_user), # 更新: db: Session = Depends(get_db) # 更新: ): # 更新: """更新成交行情""" # 更新: if not current_user: # 更新: raise HTTPException(status_code=401, detail="请先登录") # 更新: # 更新: deal = db.query(DealInfo).filter(DealInfo.id == deal_id).first() # 更新: if not deal: # 更新: raise HTTPException(status_code=404, detail="成交行情不存在") # 更新: # 更新: # 处理日期 # 更新: if data.deal_date: # 更新: try: # 更新: data.deal_date = datetime.strptime(data.deal_date, "%Y-%m-%d").date() # 更新: except: # 更新: data.deal_date = None # 更新: # 更新: for key, value in data.model_dump(exclude_unset=True).items(): # 更新: setattr(deal, key, value) # 更新: # 更新: db.commit() # 更新: db.refresh(deal) # 更新: return deal # 更新: # 更新: @router.delete("/{deal_id}") # 更新: def delete_deal( # 更新: deal_id: str, # 更新: current_user = Depends(get_current_user), # 更新: db: Session = Depends(get_db) # 更新: ): # 更新: """删除成交行情""" # 更新: if not current_user: # 更新: raise HTTPException(status_code=401, detail="请先登录") # 更新: # 更新: deal = db.query(DealInfo).filter(DealInfo.id == deal_id).first() # 更新: if not deal: # 更新: raise HTTPException(status_code=404, detail="成交行情不存在") # 更新: # 更新: deal.status = "deleted" # 更新: db.commit() # 更新: # 更新: return {"message": "删除成功"} # 更新: