dispatch_calendar.py 4.3 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485868788
  1. """双端手工派车日历 API;读取与维护权限分离。"""
  2. from typing import Optional
  3. from fastapi import APIRouter, Depends, HTTPException, Query
  4. from sqlalchemy.orm import Session
  5. from app.core import menu_guard
  6. from app.core.database import get_db
  7. from app.core.db_auth import DbUserContext, get_db_current_user
  8. from app.core.tenant_context import get_tenant_no
  9. from app.schemas.pl.dispatch_calendar import CreateBody, UpdateBody
  10. from app.services import pl_dispatch_calendar_service as svc
  11. from app.services.web_auth_roles import iter_user_menu_perm_codes
  12. def _require_calendar_permission(action: str):
  13. """menu_guard 仅支持单码,这里沿用其角色守卫和多角色权限并集。"""
  14. def dependency(current_user: dict = Depends(menu_guard.require_admin_or_super_admin),
  15. db: Session = Depends(get_db)):
  16. if current_user.get("role") != menu_guard.SUPER_ADMIN_ROLE:
  17. tenant = get_tenant_no(db, current_user)
  18. codes = iter_user_menu_perm_codes(db, current_user.get("user_id"), tenant)
  19. allowed = {f"pl:dispatch-calendar:{action}", f"mini:pl:dispatch-calendar:{action}"}
  20. if not codes.intersection(allowed):
  21. raise HTTPException(status_code=403, detail="无派车日历访问权限" if action == "list" else "无派车日历维护权限")
  22. return current_user
  23. return dependency
  24. require_manage = _require_calendar_permission("manage")
  25. router = APIRouter(
  26. prefix="/transport/dispatch-calendar", tags=["手工派车日历"],
  27. dependencies=[Depends(_require_calendar_permission("list"))],
  28. )
  29. @router.get("")
  30. def list_records(month: str = Query(...), vehicle_id: Optional[str] = Query(None, alias="vehicleId"),
  31. calendar_kind: Optional[str] = Query("acid", alias="calendarKind"),
  32. page: int = Query(1, ge=1), page_size: int = Query(500, alias="pageSize", ge=1, le=500),
  33. db: Session = Depends(get_db), user: DbUserContext = Depends(get_db_current_user)):
  34. tenant = get_tenant_no(db, user.to_tenant_user_dict())
  35. return svc.list_records(db, tenant, user, month=month, vehicle_id=vehicle_id,
  36. calendar_kind=calendar_kind, page=page, page_size=page_size)
  37. @router.get("/vehicles")
  38. def vehicle_options(q: Optional[str] = None, page: int = Query(1, ge=1),
  39. page_size: int = Query(500, alias="pageSize", ge=1, le=500),
  40. db: Session = Depends(get_db), user: DbUserContext = Depends(get_db_current_user)):
  41. tenant = get_tenant_no(db, user.to_tenant_user_dict())
  42. return svc.list_vehicles(db, tenant, user, q=q, page=page, page_size=page_size)
  43. @router.get("/products")
  44. def product_options(q: Optional[str] = None, page: int = Query(1, ge=1),
  45. page_size: int = Query(500, alias="pageSize", ge=1, le=500),
  46. db: Session = Depends(get_db), user: DbUserContext = Depends(get_db_current_user)):
  47. tenant = get_tenant_no(db, user.to_tenant_user_dict())
  48. return svc.list_products(db, tenant, user, q=q, page=page, page_size=page_size)
  49. @router.post("", dependencies=[Depends(require_manage)])
  50. def create_record(body: CreateBody, db: Session = Depends(get_db),
  51. user: DbUserContext = Depends(get_db_current_user)):
  52. tenant = get_tenant_no(db, user.to_tenant_user_dict())
  53. return svc._row_to_dict(svc.create_record(db, tenant, user, body))
  54. @router.get("/{record_id}")
  55. def get_record(record_id: str, db: Session = Depends(get_db),
  56. user: DbUserContext = Depends(get_db_current_user)):
  57. tenant = get_tenant_no(db, user.to_tenant_user_dict())
  58. return svc._row_to_dict(svc.get_record(db, tenant, user, record_id))
  59. @router.put("/{record_id}", dependencies=[Depends(require_manage)])
  60. def update_record(record_id: str, body: UpdateBody, db: Session = Depends(get_db),
  61. user: DbUserContext = Depends(get_db_current_user)):
  62. tenant = get_tenant_no(db, user.to_tenant_user_dict())
  63. return svc._row_to_dict(svc.update_record(db, tenant, user, record_id, body))
  64. @router.delete("/{record_id}", dependencies=[Depends(require_manage)])
  65. def delete_record(record_id: str, db: Session = Depends(get_db),
  66. user: DbUserContext = Depends(get_db_current_user)):
  67. tenant = get_tenant_no(db, user.to_tenant_user_dict())
  68. return {"deleted": svc.delete_record(db, tenant, user, record_id)}