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