driver_plan.py 4.5 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138
  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 (
  11. PublicTransportDriverStopFeedback,
  12. PublicTransportFeedback,
  13. )
  14. from app.services import pl_driver_plan_service as drv_svc
  15. router = APIRouter(prefix="/driver-plan", tags=["运输计划-司机计划单"])
  16. def _resolve_personnel_or_empty(db: Session, user: DbUserContext, tenant_no: str):
  17. return drv_svc.resolve_personnel_for_user(
  18. db, tenant_no=tenant_no, user_id=user.id
  19. )
  20. @router.get("/history")
  21. def get_driver_plan_history(
  22. date: str = Query(..., description="筛选日 YYYY-MM-DD"),
  23. db: Session = Depends(get_db),
  24. user: DbUserContext = Depends(get_db_current_user),
  25. ):
  26. tenant_no = get_tenant_no(db, user.to_tenant_user_dict())
  27. page, err = drv_svc.build_driver_history_page(
  28. db,
  29. tenant_no=tenant_no,
  30. user_id=user.id,
  31. date_str=date,
  32. )
  33. if err:
  34. return error_response(400, err)
  35. return success_response(page.model_dump(by_alias=True))
  36. @router.get("/{plan_id}")
  37. def get_driver_plan_detail(
  38. plan_id: str,
  39. db: Session = Depends(get_db),
  40. user: DbUserContext = Depends(get_db_current_user),
  41. ):
  42. tenant_no = get_tenant_no(db, user.to_tenant_user_dict())
  43. personnel = _resolve_personnel_or_empty(db, user, tenant_no)
  44. if not personnel:
  45. raise HTTPException(status_code=404, detail="未关联驾押人员,无法查看")
  46. page, err = drv_svc.build_driver_page_for_plan(
  47. db,
  48. tenant_no=tenant_no,
  49. plan_id=plan_id,
  50. personnel_id=personnel.id,
  51. )
  52. if err or page is None:
  53. raise HTTPException(status_code=404, detail=err or "计划不存在")
  54. return success_response(page.model_dump(by_alias=True))
  55. @router.post("/{plan_id}/feedback")
  56. def save_driver_plan_feedback(
  57. plan_id: str,
  58. payload: PublicTransportFeedback,
  59. db: Session = Depends(get_db),
  60. user: DbUserContext = Depends(get_db_current_user),
  61. ):
  62. tenant_no = get_tenant_no(db, user.to_tenant_user_dict())
  63. personnel = _resolve_personnel_or_empty(db, user, tenant_no)
  64. if not personnel:
  65. return error_response(400, "未关联驾押人员,无法提交回执")
  66. ok, msg = drv_svc.save_driver_feedback_for_plan(
  67. db,
  68. tenant_no=tenant_no,
  69. plan_id=plan_id,
  70. personnel_id=personnel.id,
  71. payload=payload,
  72. )
  73. if not ok:
  74. return error_response(400, msg or "保存失败")
  75. db.commit()
  76. return success_response({"success": True, "message": "保存成功"})
  77. @router.post("/{plan_id}/driver-feedback")
  78. def save_driver_plan_stop_feedback(
  79. plan_id: str,
  80. payload: PublicTransportDriverStopFeedback,
  81. db: Session = Depends(get_db),
  82. user: DbUserContext = Depends(get_db_current_user),
  83. ):
  84. tenant_no = get_tenant_no(db, user.to_tenant_user_dict())
  85. personnel = _resolve_personnel_or_empty(db, user, tenant_no)
  86. if not personnel:
  87. return error_response(400, "未关联驾押人员,无法提交回执")
  88. ok, msg = drv_svc.save_driver_stop_feedback_for_plan(
  89. db,
  90. tenant_no=tenant_no,
  91. plan_id=plan_id,
  92. personnel_id=personnel.id,
  93. payload=payload,
  94. )
  95. if not ok:
  96. return error_response(400, msg or "保存失败")
  97. db.commit()
  98. return success_response({"success": True, "message": "保存成功"})
  99. @router.post("/{plan_id}/attachments")
  100. def upload_driver_plan_attachment(
  101. plan_id: str,
  102. file: UploadFile = File(...),
  103. folder: Optional[str] = Form(""),
  104. db: Session = Depends(get_db),
  105. user: DbUserContext = Depends(get_db_current_user),
  106. ):
  107. tenant_no = get_tenant_no(db, user.to_tenant_user_dict())
  108. personnel = _resolve_personnel_or_empty(db, user, tenant_no)
  109. if not personnel:
  110. return error_response(400, "未关联驾押人员,无法上传附件")
  111. data, err = drv_svc.upload_driver_attachment_for_plan(
  112. db,
  113. tenant_no=tenant_no,
  114. plan_id=plan_id,
  115. personnel_id=personnel.id,
  116. file=file,
  117. folder=folder or "",
  118. )
  119. if err:
  120. code, msg = err
  121. return error_response(code, msg)
  122. return success_response(data)