101 lines
3.1 KiB
Python
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)
|