From 738f76c486fb09ffc7979bd556c85d9d08f1189d Mon Sep 17 00:00:00 2001 From: wuzilong <704541015@qq.com> Date: Thu, 12 Nov 2026 18:50:41 +0800 Subject: [PATCH] feat(pl): add rechargeTypeNe filter for vehicle recharge lists Co-authored-by: Cursor --- backend/app/api/pl/vehicle_recharge.py | 10 ++++++++++ backend/app/api/pl/vehicle_recharge_approval.py | 5 +++++ .../services/pl/vehicle_recharge_list_filters.py | 10 ++++++++++ .../pl_vehicle_recharge_approval_service.py | 4 ++++ .../app/services/pl_vehicle_recharge_service.py | 9 +++++++++ backend/tests/test_pl_vehicle_ops_list_filters.py | 14 ++++++++++++++ 6 files changed, 52 insertions(+) diff --git a/backend/app/api/pl/vehicle_recharge.py b/backend/app/api/pl/vehicle_recharge.py index 9c2d962b4..a351f4ac1 100644 --- a/backend/app/api/pl/vehicle_recharge.py +++ b/backend/app/api/pl/vehicle_recharge.py @@ -113,6 +113,7 @@ def _apply_list_kwargs(params: dict) -> dict: 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"), + recharge_type_ne=_param_get(params, "rechargeTypeNe", "recharge_type_ne"), status=_param_get(params, "status"), status_in=_param_get(params, "statusIn", "status_in"), apply_date_from=_param_get(params, "applyDateFrom", "apply_date_from"), @@ -139,6 +140,7 @@ def _disburse_list_kwargs(params: dict) -> dict: 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"), + recharge_type_ne=_param_get(params, "rechargeTypeNe", "recharge_type_ne"), apply_status=_param_get(params, "applyStatus", "apply_status"), apply_status_in=_param_get(params, "applyStatusIn", "apply_status_in"), apply_date_from=_param_get(params, "applyDateFrom", "apply_date_from"), @@ -170,6 +172,7 @@ def list_applies( request: Request, q: Optional[str] = Query(default=None), recharge_type: Optional[str] = Query(default=None, alias="rechargeType"), + recharge_type_ne: Optional[str] = Query(default=None, alias="rechargeTypeNe"), status: Optional[str] = Query(default=None), apply_date_from: Optional[date] = Query(default=None, alias="applyDateFrom"), apply_date_to: Optional[date] = Query(default=None, alias="applyDateTo"), @@ -185,6 +188,7 @@ def list_applies( request, q=q, rechargeType=recharge_type, + rechargeTypeNe=recharge_type_ne, status=status, applyDateFrom=apply_date_from, applyDateTo=apply_date_to, @@ -233,6 +237,7 @@ RECHARGE_APPLY_EXPORT_COLUMNS = [ class RechargeApplyExportBody(BaseModel): q: Optional[str] = None recharge_type: Optional[str] = Field(default=None, alias="rechargeType") + recharge_type_ne: Optional[str] = Field(default=None, alias="rechargeTypeNe") status: Optional[str] = None apply_date_from: Optional[date] = Field(default=None, alias="applyDateFrom") apply_date_to: Optional[date] = Field(default=None, alias="applyDateTo") @@ -422,6 +427,7 @@ def delete_applies( def list_records( q: Optional[str] = Query(default=None), recharge_type: Optional[str] = Query(default=None, alias="rechargeType"), + recharge_type_ne: Optional[str] = Query(default=None, alias="rechargeTypeNe"), recharge_date_from: Optional[date] = Query(default=None, alias="rechargeDateFrom"), recharge_date_to: Optional[date] = Query(default=None, alias="rechargeDateTo"), gas_station: Optional[str] = Query(default=None, alias="gasStation"), @@ -438,6 +444,7 @@ def list_records( user, q=q, recharge_type=recharge_type, + recharge_type_ne=recharge_type_ne, recharge_date_from=recharge_date_from, recharge_date_to=recharge_date_to, gas_station=gas_station, @@ -455,6 +462,7 @@ def list_disburse_board( request: Request, q: Optional[str] = Query(default=None), recharge_type: Optional[str] = Query(default=None, alias="rechargeType"), + recharge_type_ne: Optional[str] = Query(default=None, alias="rechargeTypeNe"), apply_status: Optional[str] = Query(default=None, alias="applyStatus"), apply_date_from: Optional[date] = Query(default=None, alias="applyDateFrom"), apply_date_to: Optional[date] = Query(default=None, alias="applyDateTo"), @@ -470,6 +478,7 @@ def list_disburse_board( request, q=q, rechargeType=recharge_type, + rechargeTypeNe=recharge_type_ne, applyStatus=apply_status, applyDateFrom=apply_date_from, applyDateTo=apply_date_to, @@ -513,6 +522,7 @@ RECHARGE_DISBURSE_EXPORT_COLUMNS = [ class RechargeDisburseExportBody(BaseModel): q: Optional[str] = None recharge_type: Optional[str] = Field(default=None, alias="rechargeType") + recharge_type_ne: Optional[str] = Field(default=None, alias="rechargeTypeNe") apply_status: Optional[str] = Field(default=None, alias="applyStatus") apply_date_from: Optional[date] = Field(default=None, alias="applyDateFrom") apply_date_to: Optional[date] = Field(default=None, alias="applyDateTo") diff --git a/backend/app/api/pl/vehicle_recharge_approval.py b/backend/app/api/pl/vehicle_recharge_approval.py index 7ae3695e9..767e2a80c 100644 --- a/backend/app/api/pl/vehicle_recharge_approval.py +++ b/backend/app/api/pl/vehicle_recharge_approval.py @@ -42,6 +42,7 @@ def _approval_list_kwargs(params: dict) -> dict: 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"), + recharge_type_ne=_param_get(params, "rechargeTypeNe", "recharge_type_ne"), status=_param_get(params, "status"), status_in=_param_get(params, "statusIn", "status_in"), apply_date_from=_param_get(params, "applyDateFrom", "apply_date_from"), @@ -61,6 +62,7 @@ def _approval_list_kwargs(params: dict) -> dict: @approval_router.get("/pending", response_model=VehicleRechargeApplyListResponse) def list_pending( request: Request, + recharge_type_ne: Optional[str] = Query(default=None, alias="rechargeTypeNe"), 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), @@ -71,6 +73,7 @@ def list_pending( tenant_no = get_tenant_no(db, user.to_tenant_user_dict()) params = _merge_query( request, + rechargeTypeNe=recharge_type_ne, applyDateFrom=apply_date_from, applyDateTo=apply_date_to, ) @@ -90,6 +93,7 @@ def list_pending( @approval_router.get("/done", response_model=VehicleRechargeApplyListResponse) def list_done( request: Request, + recharge_type_ne: Optional[str] = Query(default=None, alias="rechargeTypeNe"), 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), @@ -100,6 +104,7 @@ def list_done( tenant_no = get_tenant_no(db, user.to_tenant_user_dict()) params = _merge_query( request, + rechargeTypeNe=recharge_type_ne, applyDateFrom=apply_date_from, applyDateTo=apply_date_to, ) diff --git a/backend/app/services/pl/vehicle_recharge_list_filters.py b/backend/app/services/pl/vehicle_recharge_list_filters.py index da39cfba2..98a6b439c 100644 --- a/backend/app/services/pl/vehicle_recharge_list_filters.py +++ b/backend/app/services/pl/vehicle_recharge_list_filters.py @@ -25,6 +25,12 @@ def _split_csv(raw: Optional[str]) -> List[str]: return [s.strip() for s in str(raw).split(",") if s.strip()] +def _append_ne_filter(filters: list, col, raw: Optional[str]) -> None: + value = (raw or "").strip() + if value: + filters.append(col != value) + + def _append_enum_filter( filters: list, col, @@ -148,6 +154,7 @@ def build_recharge_apply_column_filters( license_plate: Optional[str] = None, recharge_type: Optional[str] = None, recharge_type_in: Optional[str] = None, + recharge_type_ne: Optional[str] = None, status: Optional[str] = None, status_in: Optional[str] = None, apply_date_from: DateLike = None, @@ -175,6 +182,7 @@ def build_recharge_apply_column_filters( single=recharge_type, multi=recharge_type_in, ) + _append_ne_filter(filters, PlVehicleRechargeApply.recharge_type, recharge_type_ne) _append_enum_filter( filters, PlVehicleRechargeApply.status, single=status, multi=status_in ) @@ -223,6 +231,7 @@ def build_recharge_disburse_board_column_filters( license_plate: Optional[str] = None, recharge_type: Optional[str] = None, recharge_type_in: Optional[str] = None, + recharge_type_ne: Optional[str] = None, apply_status: Optional[str] = None, apply_status_in: Optional[str] = None, apply_date_from: DateLike = None, @@ -256,6 +265,7 @@ def build_recharge_disburse_board_column_filters( single=recharge_type, multi=recharge_type_in, ) + _append_ne_filter(filters, PlVehicleRechargeApply.recharge_type, recharge_type_ne) _append_enum_filter( filters, PlVehicleRechargeApply.status, diff --git a/backend/app/services/pl_vehicle_recharge_approval_service.py b/backend/app/services/pl_vehicle_recharge_approval_service.py index 0eee2323e..3b0d11259 100644 --- a/backend/app/services/pl_vehicle_recharge_approval_service.py +++ b/backend/app/services/pl_vehicle_recharge_approval_service.py @@ -119,6 +119,7 @@ def list_pending( license_plate: Optional[str] = None, recharge_type: Optional[str] = None, recharge_type_in: Optional[str] = None, + recharge_type_ne: Optional[str] = None, status: Optional[str] = None, status_in: Optional[str] = None, apply_date_from=None, @@ -155,6 +156,7 @@ def list_pending( license_plate=license_plate, recharge_type=recharge_type, recharge_type_in=recharge_type_in, + recharge_type_ne=recharge_type_ne, status=status, status_in=status_in, apply_date_from=apply_date_from, @@ -192,6 +194,7 @@ def list_done( license_plate: Optional[str] = None, recharge_type: Optional[str] = None, recharge_type_in: Optional[str] = None, + recharge_type_ne: Optional[str] = None, status: Optional[str] = None, status_in: Optional[str] = None, apply_date_from=None, @@ -233,6 +236,7 @@ def list_done( license_plate=license_plate, recharge_type=recharge_type, recharge_type_in=recharge_type_in, + recharge_type_ne=recharge_type_ne, status=status, status_in=status_in, apply_date_from=apply_date_from, diff --git a/backend/app/services/pl_vehicle_recharge_service.py b/backend/app/services/pl_vehicle_recharge_service.py index bca94e4c6..8a46005bd 100644 --- a/backend/app/services/pl_vehicle_recharge_service.py +++ b/backend/app/services/pl_vehicle_recharge_service.py @@ -513,6 +513,7 @@ def list_applies( license_plate: Optional[str] = None, recharge_type: Optional[str] = None, recharge_type_in: Optional[str] = None, + recharge_type_ne: Optional[str] = None, status: Optional[str] = None, status_in: Optional[str] = None, apply_date_from: Optional[date] = None, @@ -555,6 +556,7 @@ def list_applies( license_plate=license_plate, recharge_type=recharge_type, recharge_type_in=recharge_type_in, + recharge_type_ne=recharge_type_ne, status=status, status_in=status_in, apply_date_from=apply_date_from, @@ -854,6 +856,7 @@ def list_records( *, q: Optional[str] = None, recharge_type: Optional[str] = None, + recharge_type_ne: Optional[str] = None, recharge_date_from: Optional[date] = None, recharge_date_to: Optional[date] = None, gas_station: Optional[str] = None, @@ -875,6 +878,10 @@ def list_records( ) if recharge_type: query = query.filter(PlVehicleRechargeRecord.recharge_type == recharge_type) + if recharge_type_ne and str(recharge_type_ne).strip(): + query = query.filter( + PlVehicleRechargeRecord.recharge_type != str(recharge_type_ne).strip() + ) if recharge_date_from: query = query.filter(PlVehicleRechargeRecord.recharge_date >= recharge_date_from) if recharge_date_to: @@ -937,6 +944,7 @@ def list_disburse_board( license_plate: Optional[str] = None, recharge_type: Optional[str] = None, recharge_type_in: Optional[str] = None, + recharge_type_ne: Optional[str] = None, apply_status: Optional[str] = None, apply_status_in: Optional[str] = None, apply_date_from: Optional[date] = None, @@ -997,6 +1005,7 @@ def list_disburse_board( license_plate=license_plate, recharge_type=recharge_type, recharge_type_in=recharge_type_in, + recharge_type_ne=recharge_type_ne, apply_status=apply_status, apply_status_in=apply_status_in, apply_date_from=apply_date_from, diff --git a/backend/tests/test_pl_vehicle_ops_list_filters.py b/backend/tests/test_pl_vehicle_ops_list_filters.py index 49bab5e48..801f0b9e6 100644 --- a/backend/tests/test_pl_vehicle_ops_list_filters.py +++ b/backend/tests/test_pl_vehicle_ops_list_filters.py @@ -119,6 +119,20 @@ def test_maintenance_process_board_filters(): assert "handler_id" in joined +def test_recharge_apply_type_ne_filter(): + filters = build_recharge_apply_column_filters(recharge_type_ne="etc") + assert len(filters) == 1 + sql = _compile(filters[0]) + assert "recharge_type" in sql + assert "!=" in sql or "<>" in sql + assert "etc" in sql + + +def test_recharge_disburse_board_type_ne_filter(): + filters = build_recharge_disburse_board_column_filters(recharge_type_ne="etc") + assert any("recharge_type" in _compile(f) for f in filters) + + def test_empty(): assert build_recharge_apply_column_filters() == [] assert build_recharge_disburse_board_column_filters() == []