155 lines
5.7 KiB
Python
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)
|