site_plan.py 3.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108
  1. """小程序/门户登录态 · 运输计划单(现场记录/回传)"""
  2. from __future__ import annotations
  3. from typing import Optional
  4. from fastapi import APIRouter, Depends, File, Form, HTTPException, Query, UploadFile
  5. from sqlalchemy.orm import Session
  6. from app.core.database import get_db
  7. from app.core.db_auth import DbUserContext, get_db_current_user
  8. from app.core.response import error_response, success_response
  9. from app.core.tenant_context import get_tenant_no
  10. from app.schemas.pl.transport import PublicTransportSiteStopFeedback
  11. from app.services import pl_site_plan_service as site_svc
  12. router = APIRouter(prefix="/site-plan", tags=["运输计划-现场计划单"])
  13. @router.get("/history")
  14. def get_site_plan_history(
  15. date: str = Query(..., description="筛选日 YYYY-MM-DD"),
  16. q: Optional[str] = Query(None, description="车牌号/产品名称模糊"),
  17. db: Session = Depends(get_db),
  18. user: DbUserContext = Depends(get_db_current_user),
  19. ):
  20. tenant_no = get_tenant_no(db, user.to_tenant_user_dict())
  21. page, err = site_svc.build_site_history_page(
  22. db, tenant_no=tenant_no, date_str=date, keyword=q
  23. )
  24. if err:
  25. return error_response(400, err)
  26. return success_response(page.model_dump(by_alias=True))
  27. @router.get("/calendar-counts")
  28. def get_site_plan_calendar_counts(
  29. month: str = Query(..., description="月份 YYYY-MM"),
  30. db: Session = Depends(get_db),
  31. user: DbUserContext = Depends(get_db_current_user),
  32. ):
  33. tenant_no = get_tenant_no(db, user.to_tenant_user_dict())
  34. counts, err = site_svc.build_site_calendar_counts(
  35. db, tenant_no=tenant_no, month_str=month
  36. )
  37. if err:
  38. return error_response(400, err)
  39. return success_response({"month": month, "counts": counts or {}})
  40. @router.get("/{plan_id}")
  41. def get_site_plan_detail(
  42. plan_id: str,
  43. db: Session = Depends(get_db),
  44. user: DbUserContext = Depends(get_db_current_user),
  45. ):
  46. tenant_no = get_tenant_no(db, user.to_tenant_user_dict())
  47. page, err = site_svc.build_site_page_for_plan(
  48. db, tenant_no=tenant_no, plan_id=plan_id
  49. )
  50. if err or page is None:
  51. raise HTTPException(status_code=404, detail=err or "计划不存在或无现场链接")
  52. return success_response(page.model_dump(by_alias=True))
  53. @router.post("/{plan_id}/feedback")
  54. def save_site_plan_feedback(
  55. plan_id: str,
  56. payload: PublicTransportSiteStopFeedback,
  57. db: Session = Depends(get_db),
  58. user: DbUserContext = Depends(get_db_current_user),
  59. ):
  60. tenant_no = get_tenant_no(db, user.to_tenant_user_dict())
  61. ok, msg = site_svc.save_site_feedback_for_plan(
  62. db,
  63. tenant_no=tenant_no,
  64. plan_id=plan_id,
  65. stop_type=payload.stop_type,
  66. stop_id=payload.stop_id,
  67. quantity=payload.quantity,
  68. attachment_urls=payload.attachment_urls,
  69. remark=payload.remark,
  70. )
  71. if not ok:
  72. return error_response(400, msg or "保存失败")
  73. db.commit()
  74. return success_response({"success": True, "message": "保存成功"})
  75. @router.post("/{plan_id}/attachments")
  76. def upload_site_plan_attachment(
  77. plan_id: str,
  78. file: UploadFile = File(...),
  79. folder: Optional[str] = Form(""),
  80. db: Session = Depends(get_db),
  81. user: DbUserContext = Depends(get_db_current_user),
  82. ):
  83. tenant_no = get_tenant_no(db, user.to_tenant_user_dict())
  84. data, err = site_svc.upload_site_attachment_for_plan(
  85. db,
  86. tenant_no=tenant_no,
  87. plan_id=plan_id,
  88. file=file,
  89. folder=folder or "",
  90. )
  91. if err:
  92. code, msg = err
  93. return error_response(code, msg)
  94. return success_response(data)