diff --git a/backend/app/api/pl/vehicle_maintenance.py b/backend/app/api/pl/vehicle_maintenance.py index 7da2cd083..cefc97746 100644 --- a/backend/app/api/pl/vehicle_maintenance.py +++ b/backend/app/api/pl/vehicle_maintenance.py @@ -239,6 +239,68 @@ def list_process_board( ) + +MAINT_PROCESS_EXPORT_COLUMNS = [ + ExportColumn(title="申请单号", field="applyNo"), + ExportColumn(title="申请日期", field="applyDate"), + ExportColumn(title="申请人", field="applicantName"), + ExportColumn(title="申请状态", field="applyStatus"), + ExportColumn(title="车牌号", field="licensePlate"), + ExportColumn(title="维保类型", field="maintenanceType"), + ExportColumn(title="处理单号", field="processNo"), + ExportColumn(title="处理日期", field="processDate"), + ExportColumn(title="处理人", field="handlerName"), + ExportColumn(title="金额(元)", field="amount"), +] + + +class MaintProcessExportBody(BaseModel): + q: Optional[str] = None + maintenance_type: Optional[str] = Field(default=None, alias="maintenanceType") + 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") + process_date_from: Optional[date] = Field(default=None, alias="processDateFrom") + process_date_to: Optional[date] = Field(default=None, alias="processDateTo") + ids: Optional[List[str]] = None + columns: Optional[List[str]] = None + model_config = {"populate_by_name": True} + + +@process_router.post("/process-board/export") +def export_process_board( + body: MaintProcessExportBody, + db: Session = Depends(get_db), + user: DbUserContext = Depends(get_db_current_user), +): + try: + tenant_no = get_tenant_no(db, user.to_tenant_user_dict()) + items, _ = svc.list_process_board( + db, tenant_no, user, + q=body.q, maintenance_type=body.maintenance_type, apply_status=body.apply_status, + apply_date_from=body.apply_date_from, apply_date_to=body.apply_date_to, + process_date_from=body.process_date_from, process_date_to=body.process_date_to, + ids=body.ids, page=1, page_size=EXPORT_MAX_ROWS, max_page_size=EXPORT_MAX_ROWS, + ) + + rows = [] + for item in items: + data = item.model_dump(by_alias=True) + for k, v in list(data.items()): + if hasattr(v, 'isoformat'): + data[k] = str(v)[:19] + rows.append(data) + + cols = filter_export_columns(MAINT_PROCESS_EXPORT_COLUMNS, body.columns) + date_str = datetime.now().strftime("%Y%m%d") + return export_rows_to_xlsx_response( + db, tenant_no=tenant_no, sheet_title="维保过程", columns=cols, rows=rows, + filename_stem=f"维保过程_{date_str}", + ) + except ExportValidationError as e: + raise HTTPException(status_code=400, detail=str(e)) from e + + @process_router.get("/{id}", response_model=VehicleMaintenanceProcessRead) def get_process( id: str, diff --git a/backend/app/api/pl/vehicle_recharge.py b/backend/app/api/pl/vehicle_recharge.py index 814a36c66..aa1f7ed79 100644 --- a/backend/app/api/pl/vehicle_recharge.py +++ b/backend/app/api/pl/vehicle_recharge.py @@ -1,13 +1,21 @@ """车辆 ETC/加油充值 API""" -from datetime import date -from typing import Optional +from datetime import date, datetime +from typing import List, Optional -from fastapi import APIRouter, Depends, Query, status +from pydantic import BaseModel, Field +from fastapi import APIRouter, Depends, HTTPException, Query, status 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.utils.excel_export import ( + EXPORT_MAX_ROWS, + ExportColumn, + ExportValidationError, + export_rows_to_xlsx_response, + filter_export_columns, +) from app.schemas.pl.vehicle_recharge import ( VehicleRechargeApplyCreate, VehicleRechargeApplyListResponse, @@ -68,6 +76,63 @@ def pending_apply_options( return [VehicleRechargeApplyOption.model_validate(row) for row in rows] + +RECHARGE_APPLY_EXPORT_COLUMNS = [ + ExportColumn(title="申请单号", field="applyNo"), + ExportColumn(title="车牌号", field="licensePlate"), + ExportColumn(title="充值类型", field="rechargeType"), + ExportColumn(title="申请日期", field="applyDate"), + ExportColumn(title="期初公里数", field="odometerKm"), + ExportColumn(title="申请人", field="applicantName"), + ExportColumn(title="状态", field="status"), + ExportColumn(title="创建时间", field="createTime"), +] + + +class RechargeApplyExportBody(BaseModel): + q: Optional[str] = None + recharge_type: Optional[str] = Field(default=None, alias="rechargeType") + status: Optional[str] = None + apply_date_from: Optional[date] = Field(default=None, alias="applyDateFrom") + apply_date_to: Optional[date] = Field(default=None, alias="applyDateTo") + ids: Optional[List[str]] = None + columns: Optional[List[str]] = None + model_config = {"populate_by_name": True} + + +@apply_router.post("/export") +def export_recharge_applies( + body: RechargeApplyExportBody, + db: Session = Depends(get_db), + user: DbUserContext = Depends(get_db_current_user), +): + try: + tenant_no = get_tenant_no(db, user.to_tenant_user_dict()) + items, _ = svc.list_applies( + db, tenant_no, user, + q=body.q, recharge_type=body.recharge_type, status=body.status, + apply_date_from=body.apply_date_from, apply_date_to=body.apply_date_to, + ids=body.ids, page=1, page_size=EXPORT_MAX_ROWS, max_page_size=EXPORT_MAX_ROWS, + ) + + rows = [] + for item in items: + data = item.model_dump(by_alias=True) + for k, v in list(data.items()): + if hasattr(v, 'isoformat'): + data[k] = str(v)[:19] + rows.append(data) + + cols = filter_export_columns(RECHARGE_APPLY_EXPORT_COLUMNS, body.columns) + date_str = datetime.now().strftime("%Y%m%d") + return export_rows_to_xlsx_response( + db, tenant_no=tenant_no, sheet_title="充值申请", columns=cols, rows=rows, + filename_stem=f"充值申请_{date_str}", + ) + except ExportValidationError as e: + raise HTTPException(status_code=400, detail=str(e)) from e + + @apply_router.get("/{id}", response_model=VehicleRechargeApplyRead) def get_apply( id: str, @@ -186,6 +251,68 @@ def list_disburse_board( ) + +RECHARGE_DISBURSE_EXPORT_COLUMNS = [ + ExportColumn(title="申请单号", field="applyNo"), + ExportColumn(title="车牌号", field="licensePlate"), + ExportColumn(title="充值类型", field="rechargeType"), + ExportColumn(title="申请日期", field="applyDate"), + ExportColumn(title="申请人", field="applicantName"), + ExportColumn(title="申请状态", field="applyStatus"), + ExportColumn(title="期初公里数", field="odometerKm"), + ExportColumn(title="充值日期", field="rechargeDate"), + ExportColumn(title="充值金额", field="amount"), + ExportColumn(title="加油站", field="gasStation"), +] + + +class RechargeDisburseExportBody(BaseModel): + q: Optional[str] = None + recharge_type: Optional[str] = Field(default=None, alias="rechargeType") + 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") + recharge_date_from: Optional[date] = Field(default=None, alias="rechargeDateFrom") + recharge_date_to: Optional[date] = Field(default=None, alias="rechargeDateTo") + ids: Optional[List[str]] = None + columns: Optional[List[str]] = None + model_config = {"populate_by_name": True} + + +@record_router.post("/disburse-board/export") +def export_recharge_disburse_board( + body: RechargeDisburseExportBody, + db: Session = Depends(get_db), + user: DbUserContext = Depends(get_db_current_user), +): + try: + tenant_no = get_tenant_no(db, user.to_tenant_user_dict()) + items, _ = svc.list_disburse_board( + db, tenant_no, user, + q=body.q, recharge_type=body.recharge_type, apply_status=body.apply_status, + apply_date_from=body.apply_date_from, apply_date_to=body.apply_date_to, + recharge_date_from=body.recharge_date_from, recharge_date_to=body.recharge_date_to, + ids=body.ids, page=1, page_size=EXPORT_MAX_ROWS, max_page_size=EXPORT_MAX_ROWS, + ) + + rows = [] + for item in items: + data = item.model_dump(by_alias=True) + for k, v in list(data.items()): + if hasattr(v, 'isoformat'): + data[k] = str(v)[:19] + rows.append(data) + + cols = filter_export_columns(RECHARGE_DISBURSE_EXPORT_COLUMNS, body.columns) + date_str = datetime.now().strftime("%Y%m%d") + return export_rows_to_xlsx_response( + db, tenant_no=tenant_no, sheet_title="充值发放", columns=cols, rows=rows, + filename_stem=f"充值发放_{date_str}", + ) + except ExportValidationError as e: + raise HTTPException(status_code=400, detail=str(e)) from e + + @record_router.get("/{id}", response_model=VehicleRechargeRecordRead) def get_record( id: str, diff --git a/backend/app/api/pl/vehicle_urea.py b/backend/app/api/pl/vehicle_urea.py index d412ff3d6..3fd445c40 100644 --- a/backend/app/api/pl/vehicle_urea.py +++ b/backend/app/api/pl/vehicle_urea.py @@ -1,13 +1,21 @@ """车辆尿素 API""" -from datetime import date -from typing import Optional +from datetime import date, datetime +from typing import List, Optional -from fastapi import APIRouter, Depends, Query, status +from pydantic import BaseModel, Field +from fastapi import APIRouter, Depends, HTTPException, Query, status 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.utils.excel_export import ( + EXPORT_MAX_ROWS, + ExportColumn, + ExportValidationError, + export_rows_to_xlsx_response, + filter_export_columns, +) from app.schemas.pl.vehicle_urea import ( VehicleUreaApplyCreate, VehicleUreaApplyListResponse, @@ -54,6 +62,62 @@ def list_applies( ) + +UREA_APPLY_EXPORT_COLUMNS = [ + ExportColumn(title="申请单号", field="applyNo"), + ExportColumn(title="车牌号", field="licensePlate"), + ExportColumn(title="申请时间", field="applyDate"), + ExportColumn(title="入库时间", field="warehouseInDate"), + ExportColumn(title="单位", field="unit"), + ExportColumn(title="入库数量", field="quantity"), + ExportColumn(title="申请人", field="applicantName"), + ExportColumn(title="状态", field="status"), +] + + +class UreaApplyExportBody(BaseModel): + q: Optional[str] = None + status: Optional[str] = None + apply_date_from: Optional[date] = Field(default=None, alias="applyDateFrom") + apply_date_to: Optional[date] = Field(default=None, alias="applyDateTo") + ids: Optional[List[str]] = None + columns: Optional[List[str]] = None + model_config = {"populate_by_name": True} + + +@apply_router.post("/export") +def export_urea_applies( + body: UreaApplyExportBody, + db: Session = Depends(get_db), + user: DbUserContext = Depends(get_db_current_user), +): + try: + tenant_no = get_tenant_no(db, user.to_tenant_user_dict()) + items, _ = svc.list_applies( + db, tenant_no, user, + q=body.q, status=body.status, + apply_date_from=body.apply_date_from, apply_date_to=body.apply_date_to, + ids=body.ids, page=1, page_size=EXPORT_MAX_ROWS, max_page_size=EXPORT_MAX_ROWS, + ) + + rows = [] + for item in items: + data = item.model_dump(by_alias=True) + for k, v in list(data.items()): + if hasattr(v, 'isoformat'): + data[k] = str(v)[:19] + rows.append(data) + + cols = filter_export_columns(UREA_APPLY_EXPORT_COLUMNS, body.columns) + date_str = datetime.now().strftime("%Y%m%d") + return export_rows_to_xlsx_response( + db, tenant_no=tenant_no, sheet_title="尿素申请", columns=cols, rows=rows, + filename_stem=f"尿素申请_{date_str}", + ) + except ExportValidationError as e: + raise HTTPException(status_code=400, detail=str(e)) from e + + @apply_router.get("/{id}", response_model=VehicleUreaApplyRead) def get_apply( id: str, @@ -138,6 +202,67 @@ def list_disburse_board( ) + +UREA_DISBURSE_EXPORT_COLUMNS = [ + ExportColumn(title="申请单号", field="applyNo"), + ExportColumn(title="车牌号", field="licensePlate"), + ExportColumn(title="申请时间", field="applyDate"), + ExportColumn(title="入库时间", field="warehouseInDate"), + ExportColumn(title="申请人", field="applicantName"), + ExportColumn(title="单位", field="unit"), + ExportColumn(title="入库数量", field="quantity"), + ExportColumn(title="申请状态", field="applyStatus"), + ExportColumn(title="发放日期", field="disburseDate"), + ExportColumn(title="发放金额", field="amount"), +] + + +class UreaDisburseExportBody(BaseModel): + q: Optional[str] = None + 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") + disburse_date_from: Optional[date] = Field(default=None, alias="disburseDateFrom") + disburse_date_to: Optional[date] = Field(default=None, alias="disburseDateTo") + ids: Optional[List[str]] = None + columns: Optional[List[str]] = None + model_config = {"populate_by_name": True} + + +@disburse_router.post("/disburse-board/export") +def export_urea_disburse_board( + body: UreaDisburseExportBody, + db: Session = Depends(get_db), + user: DbUserContext = Depends(get_db_current_user), +): + try: + tenant_no = get_tenant_no(db, user.to_tenant_user_dict()) + items, _ = svc.list_disburse_board( + db, tenant_no, user, + q=body.q, apply_status=body.apply_status, + apply_date_from=body.apply_date_from, apply_date_to=body.apply_date_to, + disburse_date_from=body.disburse_date_from, disburse_date_to=body.disburse_date_to, + ids=body.ids, page=1, page_size=EXPORT_MAX_ROWS, max_page_size=EXPORT_MAX_ROWS, + ) + + rows = [] + for item in items: + data = item.model_dump(by_alias=True) + for k, v in list(data.items()): + if hasattr(v, 'isoformat'): + data[k] = str(v)[:19] + rows.append(data) + + cols = filter_export_columns(UREA_DISBURSE_EXPORT_COLUMNS, body.columns) + date_str = datetime.now().strftime("%Y%m%d") + return export_rows_to_xlsx_response( + db, tenant_no=tenant_no, sheet_title="尿素发放", columns=cols, rows=rows, + filename_stem=f"尿素发放_{date_str}", + ) + except ExportValidationError as e: + raise HTTPException(status_code=400, detail=str(e)) from e + + @disburse_router.get("/{id}", response_model=VehicleUreaDisburseRead) def get_disburse( id: str, diff --git a/backend/app/services/pl_vehicle_maintenance_service.py b/backend/app/services/pl_vehicle_maintenance_service.py index 63d6a54fd..732734be8 100644 --- a/backend/app/services/pl_vehicle_maintenance_service.py +++ b/backend/app/services/pl_vehicle_maintenance_service.py @@ -514,8 +514,10 @@ def list_process_board( apply_date_to: Optional[date] = None, process_date_from: Optional[date] = None, process_date_to: Optional[date] = None, + ids: Optional[list[str]] = None, page: int = 1, page_size: int = 20, + max_page_size: Optional[int] = None, ) -> tuple[list[VehicleMaintenanceProcessBoardItem], int]: query = ( db.query(PlVehicleMaintenanceApply, PlVehicleMaintenanceProcess) @@ -557,8 +559,14 @@ def list_process_board( if process_date_to: query = query.filter(PlVehicleMaintenanceProcess.process_date <= process_date_to) + if ids: + query = query.filter(PlVehicleMaintenanceApply.id.in_(ids)) + query = apply_pl_scope(query, PlVehicleMaintenanceApply, user, db, tenant_no) total = query.count() + page = max(1, page) + cap = int(max_page_size) if max_page_size else 500 + page_size = min(max(1, page_size), cap) rows = ( query.order_by(PlVehicleMaintenanceApply.create_time.desc()) .offset((page - 1) * page_size) diff --git a/backend/app/services/pl_vehicle_recharge_service.py b/backend/app/services/pl_vehicle_recharge_service.py index 1dc131e02..77eb36710 100644 --- a/backend/app/services/pl_vehicle_recharge_service.py +++ b/backend/app/services/pl_vehicle_recharge_service.py @@ -255,8 +255,10 @@ def list_applies( apply_date_from: Optional[date] = None, apply_date_to: Optional[date] = None, applicant_id: Optional[str] = None, + ids: Optional[list[str]] = None, page: int = 1, page_size: int = 20, + max_page_size: Optional[int] = None, ) -> tuple[list[VehicleRechargeApplyRead], int]: query = db.query(PlVehicleRechargeApply).filter( PlVehicleRechargeApply.tenant_no == tenant_no, @@ -280,8 +282,14 @@ def list_applies( if applicant_id: query = query.filter(PlVehicleRechargeApply.applicant_id == applicant_id) + if ids: + query = query.filter(PlVehicleRechargeApply.id.in_(ids)) + query = apply_pl_scope(query, PlVehicleRechargeApply, user, db, tenant_no) total = query.count() + page = max(1, page) + cap = int(max_page_size) if max_page_size else 500 + page_size = min(max(1, page_size), cap) rows = ( query.order_by(PlVehicleRechargeApply.create_time.desc()) .offset((page - 1) * page_size) @@ -500,8 +508,10 @@ def list_disburse_board( apply_date_to: Optional[date] = None, recharge_date_from: Optional[date] = None, recharge_date_to: Optional[date] = None, + ids: Optional[list[str]] = None, page: int = 1, page_size: int = 20, + max_page_size: Optional[int] = None, ) -> tuple[list[VehicleRechargeDisburseBoardItem], int]: query = ( db.query(PlVehicleRechargeApply, PlVehicleRechargeRecord) @@ -540,8 +550,14 @@ def list_disburse_board( if recharge_date_to: query = query.filter(PlVehicleRechargeRecord.recharge_date <= recharge_date_to) + if ids: + query = query.filter(PlVehicleRechargeApply.id.in_(ids)) + query = apply_pl_scope(query, PlVehicleRechargeApply, user, db, tenant_no) total = query.count() + page = max(1, page) + cap = int(max_page_size) if max_page_size else 500 + page_size = min(max(1, page_size), cap) rows = ( query.order_by(PlVehicleRechargeApply.create_time.desc()) .offset((page - 1) * page_size) diff --git a/backend/app/services/pl_vehicle_urea_service.py b/backend/app/services/pl_vehicle_urea_service.py index 391606606..36240ad6c 100644 --- a/backend/app/services/pl_vehicle_urea_service.py +++ b/backend/app/services/pl_vehicle_urea_service.py @@ -246,8 +246,10 @@ def list_applies( apply_date_from: Optional[date] = None, apply_date_to: Optional[date] = None, applicant_id: Optional[str] = None, + ids: Optional[list[str]] = None, page: int = 1, page_size: int = 20, + max_page_size: Optional[int] = None, ) -> tuple[list[VehicleUreaApplyRead], int]: query = db.query(PlVehicleUreaApply).filter( PlVehicleUreaApply.tenant_no == tenant_no, @@ -269,8 +271,14 @@ def list_applies( if applicant_id: query = query.filter(PlVehicleUreaApply.applicant_id == applicant_id) + if ids: + query = query.filter(PlVehicleUreaApply.id.in_(ids)) + query = apply_pl_scope(query, PlVehicleUreaApply, user, db, tenant_no) total = query.count() + page = max(1, page) + cap = int(max_page_size) if max_page_size else 500 + page_size = min(max(1, page_size), cap) rows = ( query.order_by(PlVehicleUreaApply.create_time.desc()) .offset((page - 1) * page_size) @@ -422,8 +430,10 @@ def list_disburse_board( apply_date_to: Optional[date] = None, disburse_date_from: Optional[date] = None, disburse_date_to: Optional[date] = None, + ids: Optional[list[str]] = None, page: int = 1, page_size: int = 20, + max_page_size: Optional[int] = None, ) -> tuple[list[VehicleUreaDisburseBoardItem], int]: query = ( db.query(PlVehicleUreaApply, PlVehicleUreaDisburse) @@ -459,8 +469,14 @@ def list_disburse_board( if disburse_date_to: query = query.filter(PlVehicleUreaDisburse.disburse_date <= disburse_date_to) + if ids: + query = query.filter(PlVehicleUreaApply.id.in_(ids)) + query = apply_pl_scope(query, PlVehicleUreaApply, user, db, tenant_no) total = query.count() + page = max(1, page) + cap = int(max_page_size) if max_page_size else 500 + page_size = min(max(1, page_size), cap) rows = ( query.order_by(PlVehicleUreaApply.create_time.desc()) .offset((page - 1) * page_size) diff --git a/web-admin/src/api/pl/index.ts b/web-admin/src/api/pl/index.ts index c6dd3624d..8b9d95f07 100644 --- a/web-admin/src/api/pl/index.ts +++ b/web-admin/src/api/pl/index.ts @@ -1412,6 +1412,8 @@ export interface VehicleRechargeDisburseBoardListResponse { export const vehicleRechargeApplyApi = { list: (params?: Record) => request.get('/transport/vehicle-recharge-apply/', { params }), + export: (data: Record) => + request.post('/transport/vehicle-recharge-apply/export', data, { responseType: 'blob' }), get: (id: string) => request.get(`/transport/vehicle-recharge-apply/${id}`), create: (data: Partial) => request.post('/transport/vehicle-recharge-apply/', data), @@ -1430,6 +1432,8 @@ export const vehicleRechargeRecordApi = { '/transport/vehicle-recharge-record/disburse-board', { params } ), + export: (data: Record) => + request.post('/transport/vehicle-recharge-record/disburse-board/export', data, { responseType: 'blob' }), list: (params?: Record) => request.get('/transport/vehicle-recharge-record/', { params }), get: (id: string) => request.get(`/transport/vehicle-recharge-record/${id}`), @@ -1530,11 +1534,11 @@ export interface VehicleMaintenanceProcessBoardListResponse { export const vehicleMaintenanceApplyApi = { list: (params?: Record) => - export: (data: Record) => - request.post('/transport/vehicle-maintenance-apply/export', data, { responseType: 'blob' }), request.get('/transport/vehicle-maintenance-apply/', { params }), + export: (data: Record) => + request.post('/transport/vehicle-maintenance-apply/export', data, { responseType: 'blob' }), get: (id: string) => request.get(`/transport/vehicle-maintenance-apply/${id}`), create: (data: Partial) => @@ -1556,6 +1560,8 @@ export const vehicleMaintenanceProcessApi = { '/transport/vehicle-maintenance-process/process-board', { params } ), + export: (data: Record) => + request.post('/transport/vehicle-maintenance-process/process-board/export', data, { responseType: 'blob' }), get: (id: string) => request.get(`/transport/vehicle-maintenance-process/${id}`), create: (data: Partial) => @@ -1642,6 +1648,8 @@ export interface VehicleUreaDisburseBoardListResponse { export const vehicleUreaApplyApi = { list: (params?: Record) => request.get('/transport/vehicle-urea-apply/', { params }), + export: (data: Record) => + request.post('/transport/vehicle-urea-apply/export', data, { responseType: 'blob' }), get: (id: string) => request.get(`/transport/vehicle-urea-apply/${id}`), create: (data: Partial) => request.post('/transport/vehicle-urea-apply/', data), @@ -1658,6 +1666,8 @@ export const vehicleUreaDisburseApi = { '/transport/vehicle-urea-disburse/disburse-board', { params } ), + export: (data: Record) => + request.post('/transport/vehicle-urea-disburse/disburse-board/export', data, { responseType: 'blob' }), get: (id: string) => request.get(`/transport/vehicle-urea-disburse/${id}`), create: (data: Partial) => request.post('/transport/vehicle-urea-disburse/', data), diff --git a/web-admin/src/views/pl/vehicle-maintenance-process/index.vue b/web-admin/src/views/pl/vehicle-maintenance-process/index.vue index 1de181956..519625510 100644 --- a/web-admin/src/views/pl/vehicle-maintenance-process/index.vue +++ b/web-admin/src/views/pl/vehicle-maintenance-process/index.vue @@ -101,6 +101,15 @@ 无申请补录 + + import ListQuickSearchInput from '@/components/business/list-quick-search-input/index.vue' import ListToolbarEndActions from '@/components/business/list-toolbar-end-actions/index.vue' +import ListExportDropdown from '@/components/business/list-export-dropdown/index.vue' import ListColumnStatsRow from '@/components/business/list-column-stats-row/index.vue' import type { StatsRowColumn } from '@/utils/list-column-stats' import { useDbInstantSearch } from '@/composables/useDbInstantSearch' @@ -518,6 +528,25 @@ function getMaintProcessStatCellValue(row: VehicleMaintenanceProcessBoardItem, p const submitLoading = ref(false) const deleteLoadingMap = reactive>({}) const selectedRows = ref([]) + +function getMaintProcessExportFilterParams() { + return { + q: quickSearchKeyword.value.trim() || searchForm.q || undefined, + maintenanceType: searchForm.maintenanceType || undefined, + applyStatus: searchForm.applyStatus || undefined, + applyDateFrom: applyDateRange.value?.[0], + applyDateTo: applyDateRange.value?.[1], + processDateFrom: processDateRange.value?.[0], + processDateTo: processDateRange.value?.[1] + } +} + +const maintProcessExportColumns = computed(() => { + const cols = [...visibleColumns.value] + if (!cols.includes('applyNo')) cols.unshift('applyNo') + return cols +}) + const tableData = ref([]) const vehicleOptions = ref([]) const vehicleTrailerLookup = computed(() => buildVehicleTrailerLookup(vehicleOptions.value)) diff --git a/web-admin/src/views/pl/vehicle-recharge-apply/index.vue b/web-admin/src/views/pl/vehicle-recharge-apply/index.vue index e9a1e4ba8..97e2f8664 100644 --- a/web-admin/src/views/pl/vehicle-recharge-apply/index.vue +++ b/web-admin/src/views/pl/vehicle-recharge-apply/index.vue @@ -74,6 +74,15 @@ 作废 + + import ListQuickSearchInput from '@/components/business/list-quick-search-input/index.vue' import ListToolbarEndActions from '@/components/business/list-toolbar-end-actions/index.vue' +import ListExportDropdown from '@/components/business/list-export-dropdown/index.vue' import { useDbInstantSearch } from '@/composables/useDbInstantSearch' import { usePersistedListColumns } from '@/composables/usePersistedListColumns' import { @@ -376,6 +386,23 @@ const submitLoading = ref(false) const cancelLoadingMap = reactive>({}) const tableData = ref([]) const selectedRows = ref([]) + +function getRechargeApplyExportFilterParams() { + return { + q: quickSearchKeyword.value.trim() || searchForm.q || undefined, + rechargeType: searchForm.rechargeType || undefined, + status: searchForm.status || undefined, + applyDateFrom: dateRange.value?.[0], + applyDateTo: dateRange.value?.[1] + } +} + +const rechargeApplyExportColumns = computed(() => { + const cols = [...visibleColumns.value] + if (!cols.includes('applyNo')) cols.unshift('applyNo') + return cols +}) + const vehicleOptions = ref([]) const vehicleTrailerLookup = computed(() => buildVehicleTrailerLookup(vehicleOptions.value)) const dateRange = ref([]) diff --git a/web-admin/src/views/pl/vehicle-recharge-record/index.vue b/web-admin/src/views/pl/vehicle-recharge-record/index.vue index a547db082..3407cf02a 100644 --- a/web-admin/src/views/pl/vehicle-recharge-record/index.vue +++ b/web-admin/src/views/pl/vehicle-recharge-record/index.vue @@ -104,6 +104,15 @@ 撤销发放 + + import ListQuickSearchInput from '@/components/business/list-quick-search-input/index.vue' import ListToolbarEndActions from '@/components/business/list-toolbar-end-actions/index.vue' +import ListExportDropdown from '@/components/business/list-export-dropdown/index.vue' import { useDbInstantSearch } from '@/composables/useDbInstantSearch' import { usePersistedListColumns } from '@/composables/usePersistedListColumns' import { Check, Close, Delete, Edit, Money, Plus, RefreshLeft, Search } from '@element-plus/icons-vue' @@ -476,6 +486,25 @@ const submitLoading = ref(false) const deleteLoadingMap = reactive>({}) const tableData = ref([]) const selectedRows = ref([]) + +function getRechargeDisburseExportFilterParams() { + return { + q: quickSearchKeyword.value.trim() || searchForm.q || undefined, + rechargeType: searchForm.rechargeType || undefined, + applyStatus: searchForm.applyStatus || undefined, + applyDateFrom: applyDateRange.value?.[0], + applyDateTo: applyDateRange.value?.[1], + rechargeDateFrom: rechargeDateRange.value?.[0], + rechargeDateTo: rechargeDateRange.value?.[1] + } +} + +const rechargeDisburseExportColumns = computed(() => { + const cols = [...visibleColumns.value] + if (!cols.includes('applyNo')) cols.unshift('applyNo') + return cols +}) + const vehicleOptions = ref([]) const vehicleTrailerLookup = computed(() => buildVehicleTrailerLookup(vehicleOptions.value)) const applyDateRange = ref([]) diff --git a/web-admin/src/views/pl/vehicle-urea-apply/index.vue b/web-admin/src/views/pl/vehicle-urea-apply/index.vue index fdd30b334..2f50f6b50 100644 --- a/web-admin/src/views/pl/vehicle-urea-apply/index.vue +++ b/web-admin/src/views/pl/vehicle-urea-apply/index.vue @@ -68,6 +68,15 @@ 作废 + + import ListQuickSearchInput from '@/components/business/list-quick-search-input/index.vue' import ListToolbarEndActions from '@/components/business/list-toolbar-end-actions/index.vue' +import ListExportDropdown from '@/components/business/list-export-dropdown/index.vue' import ListColumnStatsRow from '@/components/business/list-column-stats-row/index.vue' import type { StatsRowColumn } from '@/utils/list-column-stats' import { useDbInstantSearch } from '@/composables/useDbInstantSearch' @@ -436,6 +446,22 @@ const submitLoading = ref(false) const cancelLoadingMap = reactive>({}) const tableData = ref([]) const selectedRows = ref([]) + +function getUreaApplyExportFilterParams() { + return { + q: quickSearchKeyword.value.trim() || searchForm.q || undefined, + status: searchForm.status || undefined, + applyDateFrom: dateRange.value?.[0], + applyDateTo: dateRange.value?.[1] + } +} + +const ureaApplyExportColumns = computed(() => { + const cols = [...visibleColumns.value] + if (!cols.includes('applyNo')) cols.unshift('applyNo') + return cols +}) + const vehicleOptions = ref([]) const vehicleTrailerLookup = computed(() => buildVehicleTrailerLookup(vehicleOptions.value)) const dateRange = ref([]) diff --git a/web-admin/src/views/pl/vehicle-urea-disburse/index.vue b/web-admin/src/views/pl/vehicle-urea-disburse/index.vue index b3c93d7c3..6433982f9 100644 --- a/web-admin/src/views/pl/vehicle-urea-disburse/index.vue +++ b/web-admin/src/views/pl/vehicle-urea-disburse/index.vue @@ -83,6 +83,15 @@ 无申请补录 + + import ListQuickSearchInput from '@/components/business/list-quick-search-input/index.vue' import ListToolbarEndActions from '@/components/business/list-toolbar-end-actions/index.vue' +import ListExportDropdown from '@/components/business/list-export-dropdown/index.vue' import ListColumnStatsRow from '@/components/business/list-column-stats-row/index.vue' import type { StatsRowColumn } from '@/utils/list-column-stats' import { useDbInstantSearch } from '@/composables/useDbInstantSearch' @@ -484,6 +494,24 @@ function getUreaDisburseStatCellValue(row: VehicleUreaDisburseBoardItem, prop: s const submitLoading = ref(false) const deleteLoadingMap = reactive>({}) const selectedRows = ref([]) + +function getUreaDisburseExportFilterParams() { + return { + q: quickSearchKeyword.value.trim() || searchForm.q || undefined, + applyStatus: searchForm.applyStatus || undefined, + applyDateFrom: applyDateRange.value?.[0], + applyDateTo: applyDateRange.value?.[1], + disburseDateFrom: disburseDateRange.value?.[0], + disburseDateTo: disburseDateRange.value?.[1] + } +} + +const ureaDisburseExportColumns = computed(() => { + const cols = [...visibleColumns.value] + if (!cols.includes('applyNo')) cols.unshift('applyNo') + return cols +}) + const tableData = ref([]) const vehicleOptions = ref([]) const vehicleTrailerLookup = computed(() => buildVehicleTrailerLookup(vehicleOptions.value))