Files
shanxia2.0/backend/app/api/pl/public_transport_site.py
T
2026-09-13 13:08:52 +08:00

101 lines
3.1 KiB
Python

"""运输计划 · 现场按段免登录公共 API(一车多卸)"""
from __future__ import annotations
from typing import Optional
from fastapi import APIRouter, Depends, File, Form, HTTPException, Query, UploadFile
from sqlalchemy.orm import Session
from app.core.database import get_db
from app.core.response import error_response, success_response
from app.models.pl_models import PlTransport
from app.schemas.pl.transport import PublicTransportSiteStopFeedback
from app.services.pl_site_plan_service import (
build_site_history_page,
build_site_page_for_transport,
save_site_feedback_for_transport,
upload_site_attachment_for_transport,
)
router = APIRouter(prefix="/public/pl/transport-site", tags=["运输计划-现场按段公共"])
def _get_transport_by_site_token(db: Session, token: str) -> PlTransport:
transport = (
db.query(PlTransport)
.filter(
PlTransport.site_access_token == token,
PlTransport.del_flag == 0,
)
.first()
)
if not transport:
raise HTTPException(status_code=404, detail="链接无效或已失效")
return transport
@router.get("/{token}/history")
def get_public_transport_site_history(
token: str,
date: str = Query(..., description="筛选日 YYYY-MM-DD"),
q: Optional[str] = Query(None, description="车牌号/产品名称模糊"),
db: Session = Depends(get_db),
):
transport = _get_transport_by_site_token(db, token)
page, err = build_site_history_page(
db,
tenant_no=transport.tenant_no,
date_str=date,
keyword=q,
license_plate_hint=transport.license_plate,
)
if err:
return error_response(400, err)
return success_response(page.model_dump(by_alias=True))
@router.get("/{token}")
def get_public_transport_site(token: str, db: Session = Depends(get_db)):
transport = _get_transport_by_site_token(db, token)
page = build_site_page_for_transport(db, transport)
return success_response(page.model_dump(by_alias=True))
@router.post("/{token}/feedback")
def save_public_site_stop_feedback(
token: str,
payload: PublicTransportSiteStopFeedback,
db: Session = Depends(get_db),
):
transport = _get_transport_by_site_token(db, token)
ok, err = save_site_feedback_for_transport(
db,
transport,
stop_type=payload.stop_type,
stop_id=payload.stop_id,
quantity=payload.quantity,
attachment_urls=payload.attachment_urls,
remark=payload.remark,
)
if not ok:
return error_response(400, err or "保存失败")
db.commit()
return success_response({"success": True, "message": "保存成功"})
@router.post("/{token}/attachments")
def upload_public_site_attachment(
token: str,
file: UploadFile = File(...),
folder: Optional[str] = Form(""),
db: Session = Depends(get_db),
):
transport = _get_transport_by_site_token(db, token)
data, err = upload_site_attachment_for_transport(
db, transport, file=file, folder=folder
)
if err:
code, msg = err
return error_response(code, msg)
return success_response(data)