Files
shanxia2.0/backend/app/api/pl/vehicle_recharge_approval.py
T

155 lines
5.7 KiB
Python

"""车辆充值审批 API"""
from datetime import date
from typing import Any, Optional
from fastapi import APIRouter, Depends, Query, Request
from sqlalchemy.orm import Session
from app.core.database import get_db
from app.core.db_auth import DbUserContext, get_db_current_user
from app.core.tenant_context import get_tenant_no
from app.schemas.pl.vehicle_recharge import (
VehicleRechargeApplyListResponse,
VehicleRechargeApplyRead,
VehicleRechargeOpinionBody,
VehicleRechargeRecordCreate,
)
from app.services import pl_vehicle_recharge_approval_service as approval_svc
approval_router = APIRouter(
prefix="/vehicle-recharge-approval", tags=["运输计划-ETC油卡充值审批"]
)
def _param_get(params: dict, *keys: str) -> Any:
for key in keys:
if key in params and params[key] not in (None, ""):
return params[key]
return None
def _merge_query(request: Request, **declared: Any) -> dict:
params = dict(declared)
for key, value in request.query_params.multi_items():
if key not in params or params[key] in (None, ""):
params[key] = value
return params
def _approval_list_kwargs(params: dict) -> dict:
return dict(
apply_no=_param_get(params, "applyNo", "apply_no"),
license_plate=_param_get(params, "licensePlate", "license_plate"),
recharge_type=_param_get(params, "rechargeType", "recharge_type"),
recharge_type_in=_param_get(params, "rechargeTypeIn", "recharge_type_in"),
status=_param_get(params, "status"),
status_in=_param_get(params, "statusIn", "status_in"),
apply_date_from=_param_get(params, "applyDateFrom", "apply_date_from"),
apply_date_to=_param_get(params, "applyDateTo", "apply_date_to"),
applicant_name=_param_get(params, "applicantName", "applicant_name"),
remark=_param_get(params, "remark"),
current_node_name=_param_get(params, "currentNodeName", "current_node_name"),
odometer_km_op=_param_get(params, "odometerKmOp", "odometer_km_op"),
odometer_km=_param_get(params, "odometerKm", "odometer_km"),
odometer_km_min=_param_get(params, "odometerKmMin", "odometer_km_min"),
odometer_km_max=_param_get(params, "odometerKmMax", "odometer_km_max"),
create_time_from=_param_get(params, "createTimeFrom", "create_time_from"),
create_time_to=_param_get(params, "createTimeTo", "create_time_to"),
)
@approval_router.get("/pending", response_model=VehicleRechargeApplyListResponse)
def list_pending(
request: Request,
apply_date_from: Optional[date] = Query(default=None, alias="applyDateFrom"),
apply_date_to: Optional[date] = Query(default=None, alias="applyDateTo"),
page: int = Query(default=1, ge=1),
page_size: int = Query(default=20, ge=1, le=500, alias="pageSize"),
db: Session = Depends(get_db),
user: DbUserContext = Depends(get_db_current_user),
) -> VehicleRechargeApplyListResponse:
tenant_no = get_tenant_no(db, user.to_tenant_user_dict())
params = _merge_query(
request,
applyDateFrom=apply_date_from,
applyDateTo=apply_date_to,
)
items, total = approval_svc.list_pending(
db,
tenant_no,
user,
**_approval_list_kwargs(params),
page=page,
page_size=page_size,
)
return VehicleRechargeApplyListResponse(
items=items, total=total, page=page, pageSize=page_size
)
@approval_router.get("/done", response_model=VehicleRechargeApplyListResponse)
def list_done(
request: Request,
apply_date_from: Optional[date] = Query(default=None, alias="applyDateFrom"),
apply_date_to: Optional[date] = Query(default=None, alias="applyDateTo"),
page: int = Query(default=1, ge=1),
page_size: int = Query(default=20, ge=1, le=500, alias="pageSize"),
db: Session = Depends(get_db),
user: DbUserContext = Depends(get_db_current_user),
) -> VehicleRechargeApplyListResponse:
tenant_no = get_tenant_no(db, user.to_tenant_user_dict())
params = _merge_query(
request,
applyDateFrom=apply_date_from,
applyDateTo=apply_date_to,
)
items, total = approval_svc.list_done(
db,
tenant_no,
user,
**_approval_list_kwargs(params),
page=page,
page_size=page_size,
)
return VehicleRechargeApplyListResponse(
items=items, total=total, page=page, pageSize=page_size
)
@approval_router.post("/{apply_id}/approve", response_model=VehicleRechargeApplyRead)
def approve_apply(
apply_id: str,
body: Optional[VehicleRechargeOpinionBody] = None,
db: Session = Depends(get_db),
user: DbUserContext = Depends(get_db_current_user),
) -> VehicleRechargeApplyRead:
tenant_no = get_tenant_no(db, user.to_tenant_user_dict())
opinion = body.opinion if body else None
return approval_svc.approve_apply(
db, tenant_no, user, apply_id, opinion=opinion
)
@approval_router.post("/{apply_id}/reject", response_model=VehicleRechargeApplyRead)
def reject_apply(
apply_id: str,
body: VehicleRechargeOpinionBody,
db: Session = Depends(get_db),
user: DbUserContext = Depends(get_db_current_user),
) -> VehicleRechargeApplyRead:
tenant_no = get_tenant_no(db, user.to_tenant_user_dict())
return approval_svc.reject_apply(
db, tenant_no, user, apply_id, opinion=body.opinion
)
@approval_router.post("/{apply_id}/disburse", response_model=VehicleRechargeApplyRead)
def disburse_apply(
apply_id: str,
payload: VehicleRechargeRecordCreate,
db: Session = Depends(get_db),
user: DbUserContext = Depends(get_db_current_user),
) -> VehicleRechargeApplyRead:
tenant_no = get_tenant_no(db, user.to_tenant_user_dict())
return approval_svc.disburse_apply(db, tenant_no, user, apply_id, payload)