vehicle_recharge.py 8.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228
  1. """车辆 ETC/加油充值 API"""
  2. from datetime import date
  3. from typing import Optional
  4. from fastapi import APIRouter, Depends, Query, status
  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.tenant_context import get_tenant_no
  9. from app.schemas.pl.vehicle_recharge import (
  10. VehicleRechargeApplyCreate,
  11. VehicleRechargeApplyListResponse,
  12. VehicleRechargeApplyOption,
  13. VehicleRechargeApplyRead,
  14. VehicleRechargeApplyUpdate,
  15. VehicleRechargeDisburseBoardListResponse,
  16. VehicleRechargeRecordCreate,
  17. VehicleRechargeRecordListResponse,
  18. VehicleRechargeRecordRead,
  19. VehicleRechargeRecordUpdate,
  20. )
  21. from app.services import pl_vehicle_recharge_service as svc
  22. apply_router = APIRouter(prefix="/vehicle-recharge-apply", tags=["运输计划-ETC加油申请"])
  23. record_router = APIRouter(prefix="/vehicle-recharge-record", tags=["运输计划-ETC加油发放"])
  24. @apply_router.get("/", response_model=VehicleRechargeApplyListResponse)
  25. def list_applies(
  26. q: Optional[str] = Query(default=None),
  27. recharge_type: Optional[str] = Query(default=None, alias="rechargeType"),
  28. status: Optional[str] = Query(default=None),
  29. apply_date_from: Optional[date] = Query(default=None, alias="applyDateFrom"),
  30. apply_date_to: Optional[date] = Query(default=None, alias="applyDateTo"),
  31. applicant_id: Optional[str] = Query(default=None, alias="applicantId"),
  32. page: int = Query(default=1, ge=1),
  33. page_size: int = Query(default=20, ge=1, le=100, alias="pageSize"),
  34. db: Session = Depends(get_db),
  35. user: DbUserContext = Depends(get_db_current_user),
  36. ) -> VehicleRechargeApplyListResponse:
  37. tenant_no = get_tenant_no(db, user.to_tenant_user_dict())
  38. items, total = svc.list_applies(
  39. db,
  40. tenant_no,
  41. user,
  42. q=q,
  43. recharge_type=recharge_type,
  44. status=status,
  45. apply_date_from=apply_date_from,
  46. apply_date_to=apply_date_to,
  47. applicant_id=applicant_id,
  48. page=page,
  49. page_size=page_size,
  50. )
  51. return VehicleRechargeApplyListResponse(
  52. items=items, total=total, page=page, pageSize=page_size
  53. )
  54. @apply_router.get("/pending-options", response_model=list[VehicleRechargeApplyOption])
  55. def pending_apply_options(
  56. db: Session = Depends(get_db),
  57. user: DbUserContext = Depends(get_db_current_user),
  58. ) -> list[VehicleRechargeApplyOption]:
  59. tenant_no = get_tenant_no(db, user.to_tenant_user_dict())
  60. rows = svc.list_pending_apply_options(db, tenant_no, user)
  61. return [VehicleRechargeApplyOption.model_validate(row) for row in rows]
  62. @apply_router.get("/{id}", response_model=VehicleRechargeApplyRead)
  63. def get_apply(
  64. id: str,
  65. db: Session = Depends(get_db),
  66. user: DbUserContext = Depends(get_db_current_user),
  67. ) -> VehicleRechargeApplyRead:
  68. tenant_no = get_tenant_no(db, user.to_tenant_user_dict())
  69. return svc.get_apply(db, tenant_no, user, id)
  70. @apply_router.post("/", response_model=VehicleRechargeApplyRead, status_code=status.HTTP_201_CREATED)
  71. def create_apply(
  72. payload: VehicleRechargeApplyCreate,
  73. db: Session = Depends(get_db),
  74. user: DbUserContext = Depends(get_db_current_user),
  75. ) -> VehicleRechargeApplyRead:
  76. tenant_no = get_tenant_no(db, user.to_tenant_user_dict())
  77. return svc.create_apply(db, tenant_no, user, payload)
  78. @apply_router.put("/{id}", response_model=VehicleRechargeApplyRead)
  79. def update_apply(
  80. id: str,
  81. payload: VehicleRechargeApplyUpdate,
  82. db: Session = Depends(get_db),
  83. user: DbUserContext = Depends(get_db_current_user),
  84. ) -> VehicleRechargeApplyRead:
  85. tenant_no = get_tenant_no(db, user.to_tenant_user_dict())
  86. return svc.update_apply(db, tenant_no, user, id, payload)
  87. @apply_router.post("/{id}/cancel", response_model=VehicleRechargeApplyRead)
  88. def cancel_apply(
  89. id: str,
  90. db: Session = Depends(get_db),
  91. user: DbUserContext = Depends(get_db_current_user),
  92. ) -> VehicleRechargeApplyRead:
  93. tenant_no = get_tenant_no(db, user.to_tenant_user_dict())
  94. return svc.cancel_apply(db, tenant_no, user, id)
  95. @apply_router.delete("/{ids}", status_code=status.HTTP_204_NO_CONTENT)
  96. def delete_applies(
  97. ids: str,
  98. db: Session = Depends(get_db),
  99. user: DbUserContext = Depends(get_db_current_user),
  100. ) -> None:
  101. tenant_no = get_tenant_no(db, user.to_tenant_user_dict())
  102. apply_ids = [item for item in ids.split(",") if item]
  103. svc.delete_applies(db, tenant_no, user, apply_ids)
  104. @record_router.get("/", response_model=VehicleRechargeRecordListResponse)
  105. def list_records(
  106. q: Optional[str] = Query(default=None),
  107. recharge_type: Optional[str] = Query(default=None, alias="rechargeType"),
  108. recharge_date_from: Optional[date] = Query(default=None, alias="rechargeDateFrom"),
  109. recharge_date_to: Optional[date] = Query(default=None, alias="rechargeDateTo"),
  110. gas_station: Optional[str] = Query(default=None, alias="gasStation"),
  111. apply_no: Optional[str] = Query(default=None, alias="applyNo"),
  112. page: int = Query(default=1, ge=1),
  113. page_size: int = Query(default=20, ge=1, le=100, alias="pageSize"),
  114. db: Session = Depends(get_db),
  115. user: DbUserContext = Depends(get_db_current_user),
  116. ) -> VehicleRechargeRecordListResponse:
  117. tenant_no = get_tenant_no(db, user.to_tenant_user_dict())
  118. items, total = svc.list_records(
  119. db,
  120. tenant_no,
  121. user,
  122. q=q,
  123. recharge_type=recharge_type,
  124. recharge_date_from=recharge_date_from,
  125. recharge_date_to=recharge_date_to,
  126. gas_station=gas_station,
  127. apply_no=apply_no,
  128. page=page,
  129. page_size=page_size,
  130. )
  131. return VehicleRechargeRecordListResponse(
  132. items=items, total=total, page=page, pageSize=page_size
  133. )
  134. @record_router.get("/disburse-board", response_model=VehicleRechargeDisburseBoardListResponse)
  135. def list_disburse_board(
  136. q: Optional[str] = Query(default=None),
  137. recharge_type: Optional[str] = Query(default=None, alias="rechargeType"),
  138. apply_status: Optional[str] = Query(default=None, alias="applyStatus"),
  139. apply_date_from: Optional[date] = Query(default=None, alias="applyDateFrom"),
  140. apply_date_to: Optional[date] = Query(default=None, alias="applyDateTo"),
  141. recharge_date_from: Optional[date] = Query(default=None, alias="rechargeDateFrom"),
  142. recharge_date_to: Optional[date] = Query(default=None, alias="rechargeDateTo"),
  143. page: int = Query(default=1, ge=1),
  144. page_size: int = Query(default=20, ge=1, le=100, alias="pageSize"),
  145. db: Session = Depends(get_db),
  146. user: DbUserContext = Depends(get_db_current_user),
  147. ) -> VehicleRechargeDisburseBoardListResponse:
  148. tenant_no = get_tenant_no(db, user.to_tenant_user_dict())
  149. items, total = svc.list_disburse_board(
  150. db,
  151. tenant_no,
  152. user,
  153. q=q,
  154. recharge_type=recharge_type,
  155. apply_status=apply_status,
  156. apply_date_from=apply_date_from,
  157. apply_date_to=apply_date_to,
  158. recharge_date_from=recharge_date_from,
  159. recharge_date_to=recharge_date_to,
  160. page=page,
  161. page_size=page_size,
  162. )
  163. return VehicleRechargeDisburseBoardListResponse(
  164. items=items, total=total, page=page, pageSize=page_size
  165. )
  166. @record_router.get("/{id}", response_model=VehicleRechargeRecordRead)
  167. def get_record(
  168. id: str,
  169. db: Session = Depends(get_db),
  170. user: DbUserContext = Depends(get_db_current_user),
  171. ) -> VehicleRechargeRecordRead:
  172. tenant_no = get_tenant_no(db, user.to_tenant_user_dict())
  173. return svc.get_record(db, tenant_no, user, id)
  174. @record_router.post("/", response_model=VehicleRechargeRecordRead, status_code=status.HTTP_201_CREATED)
  175. def create_record(
  176. payload: VehicleRechargeRecordCreate,
  177. db: Session = Depends(get_db),
  178. user: DbUserContext = Depends(get_db_current_user),
  179. ) -> VehicleRechargeRecordRead:
  180. tenant_no = get_tenant_no(db, user.to_tenant_user_dict())
  181. return svc.create_record(db, tenant_no, user, payload)
  182. @record_router.put("/{id}", response_model=VehicleRechargeRecordRead)
  183. def update_record(
  184. id: str,
  185. payload: VehicleRechargeRecordUpdate,
  186. db: Session = Depends(get_db),
  187. user: DbUserContext = Depends(get_db_current_user),
  188. ) -> VehicleRechargeRecordRead:
  189. tenant_no = get_tenant_no(db, user.to_tenant_user_dict())
  190. return svc.update_record(db, tenant_no, user, id, payload)
  191. @record_router.delete("/{ids}", status_code=status.HTTP_204_NO_CONTENT)
  192. def delete_records(
  193. ids: str,
  194. db: Session = Depends(get_db),
  195. user: DbUserContext = Depends(get_db_current_user),
  196. ) -> None:
  197. tenant_no = get_tenant_no(db, user.to_tenant_user_dict())
  198. record_ids = [item for item in ids.split(",") if item]
  199. svc.delete_records(db, tenant_no, user, record_ids)