# seek - 寻号匹配路由 # Version: 1.2.70 # 更新: 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 # 更新: from app.core.database import get_db # 更新: from app.core.auth import get_current_user # 更新: from app.models.seek_info import SeekInfo # 更新: # 更新: router = APIRouter(prefix="/api/seek", tags=["寻配号"]) # 更新: # 更新: # ============ Schema ============ # 更新: class SeekInfoCreate(BaseModel): # 更新: title: str # 更新: content: Optional[str] = None # 更新: expect_category: Optional[str] = None # 更新: expect_version: Optional[str] = None # 更新: expect_packaging: Optional[str] = None # 更新: expect_number: Optional[str] = None # 更新: expect_price_min: Optional[float] = None # 更新: expect_price_max: Optional[float] = None # 更新: # 更新: class SeekInfoUpdate(BaseModel): # 更新: title: Optional[str] = None # 更新: content: Optional[str] = None # 更新: expect_category: Optional[str] = None # 更新: expect_version: Optional[str] = None # 更新: expect_packaging: Optional[str] = None # 更新: expect_number: Optional[str] = None # 更新: expect_price_min: Optional[float] = None # 更新: expect_price_max: Optional[float] = None # 更新: status: Optional[str] = None # 更新: # 更新: class SeekInfoResponse(BaseModel): # 更新: id: str # 更新: user_id: str # 更新: title: str # 更新: content: Optional[str] # 更新: expect_category: Optional[str] # 更新: expect_version: Optional[str] # 更新: expect_packaging: Optional[str] # 更新: expect_number: Optional[str] # 更新: expect_price_min: Optional[float] # 更新: expect_price_max: Optional[float] # 更新: status: str # 更新: is_matched: Optional[str] # 更新: matched_user_id: Optional[str] # 更新: matched_contact: Optional[str] # 更新: view_count: int # 更新: contact_count: int # 更新: created_at: Optional[datetime] # 更新: updated_at: Optional[datetime] # 更新: # 更新: class Config: # 更新: from_attributes = True # 更新: # 更新: # ============ API ============ # 更新: @router.get("/list", response_model=list[SeekInfoResponse]) # 更新: def get_seek_list( # 更新: status: str = Query("active"), # 更新: 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(SeekInfo).filter(SeekInfo.status == status) # 更新: # 更新: # 我的寻配号:只查看自己的 # 更新: if user_only and current_user: # 更新: query = query.filter(SeekInfo.user_id == current_user.f99_90_id) # 更新: # 更新: # 排序 # 更新: query = query.order_by(SeekInfo.created_at.desc()) # 更新: # 更新: # 分页 # 更新: offset = (page - 1) * page_size # 更新: items = query.offset(offset).limit(page_size).all() # 更新: # 更新: return items # 更新: # 更新: @router.get("/stats") # 更新: def get_seek_stats( # 更新: current_user = Depends(get_current_user), # 更新: db: Session = Depends(get_db) # 更新: ): # 更新: """获取寻配号统计""" # 更新: total = db.query(SeekInfo).filter(SeekInfo.status == "active").count() # 更新: matched = db.query(SeekInfo).filter(SeekInfo.is_matched == "true").count() # 更新: # 更新: return { # 更新: "total": total, # 更新: "matched": matched, # 更新: "unmatched": total - matched # 更新: } # 更新: # 更新: @router.post("", response_model=SeekInfoResponse) # 更新: def create_seek( # 更新: data: SeekInfoCreate, # 更新: current_user = Depends(get_current_user), # 更新: db: Session = Depends(get_db) # 更新: ): # 更新: """创建寻配号""" # 更新: if not current_user: # 更新: raise HTTPException(status_code=401, detail="请先登录") # 更新: # 更新: seek = SeekInfo( # 更新: user_id=current_user.f99_90_id, # 更新: title=data.title, # 更新: content=data.content, # 更新: expect_category=data.expect_category, # 更新: expect_version=data.expect_version, # 更新: expect_packaging=data.expect_packaging, # 更新: expect_number=data.expect_number, # 更新: expect_price_min=data.expect_price_min, # 更新: expect_price_max=data.expect_price_max, # 更新: status="active" # 更新: ) # 更新: db.add(seek) # 更新: db.commit() # 更新: db.refresh(seek) # 更新: return seek # 更新: # 更新: @router.get("/{seek_id}", response_model=SeekInfoResponse) # 更新: def get_seek( # 更新: seek_id: str, # 更新: current_user = Depends(get_current_user), # 更新: db: Session = Depends(get_db) # 更新: ): # 更新: """获取寻配号详情""" # 更新: seek = db.query(SeekInfo).filter(SeekInfo.id == seek_id).first() # 更新: if not seek: # 更新: raise HTTPException(status_code=404, detail="寻配号不存在") # 更新: # 更新: # 增加浏览数 # 更新: seek.view_count += 1 # 更新: db.commit() # 更新: # 更新: return seek # 更新: # 更新: @router.put("/{seek_id}", response_model=SeekInfoResponse) # 更新: def update_seek( # 更新: seek_id: str, # 更新: data: SeekInfoUpdate, # 更新: current_user = Depends(get_current_user), # 更新: db: Session = Depends(get_db) # 更新: ): # 更新: """更新寻配号""" # 更新: if not current_user: # 更新: raise HTTPException(status_code=401, detail="请先登录") # 更新: # 更新: seek = db.query(SeekInfo).filter( # 更新: SeekInfo.id == seek_id, # 更新: SeekInfo.user_id == current_user.f99_90_id # 更新: ).first() # 更新: # 更新: if not seek: # 更新: raise HTTPException(status_code=404, detail="寻配号不存在") # 更新: # 更新: for key, value in data.model_dump(exclude_unset=True).items(): # 更新: setattr(seek, key, value) # 更新: # 更新: db.commit() # 更新: db.refresh(seek) # 更新: return seek # 更新: # 更新: @router.delete("/{seek_id}") # 更新: def delete_seek( # 更新: seek_id: str, # 更新: current_user = Depends(get_current_user), # 更新: db: Session = Depends(get_db) # 更新: ): # 更新: """删除寻配号""" # 更新: if not current_user: # 更新: raise HTTPException(status_code=401, detail="请先登录") # 更新: # 更新: seek = db.query(SeekInfo).filter( # 更新: SeekInfo.id == seek_id, # 更新: SeekInfo.user_id == current_user.f99_90_id # 更新: ).first() # 更新: # 更新: if not seek: # 更新: raise HTTPException(status_code=404, detail="寻配号不存在") # 更新: # 更新: seek.status = "deleted" # 更新: db.commit() # 更新: # 更新: return {"message": "删除成功"} # 更新: