mirror of
https://github.com/Tria-plc/edr-platform.git
synced 2026-09-02 04:33:40 +00:00
feat: add fleet-wide fuel and maintenance stats endpoints
Backend: FuelService + FuelController: - Added getFleetFuelStats() aggregating all vehicles - Route: GET /api/fuel/stats (before :vehicleId route) - Returns: totalCost, totalLiters, totalPurchases, averagePricePerLiter MaintenanceService + MaintenanceController: - Added getFleetMaintenanceStats() aggregating all vehicles - Route: GET /api/maintenance/stats (before :vehicleId route) - Returns: totalCost, numberOfMaintenanceItems, averageCostPerMaintenance, costByType Both endpoints aggregate over past 12 months (customizable via query param). Enables dashboard to show fleet-wide operating costs. Co-Authored-By: Claude Haiku 4.5 <noreply@anthropic.com>
This commit is contained in:
@@ -43,6 +43,12 @@ export class FuelController {
|
|||||||
return this.fuelService.getMonthlyConsumption(vehicleId, new Date(month));
|
return this.fuelService.getMonthlyConsumption(vehicleId, new Date(month));
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@Get('stats')
|
||||||
|
@ApiOperation({ summary: 'Get fleet-wide fuel statistics' })
|
||||||
|
async getFleetFuelStats(@Query('months') months: number = 12) {
|
||||||
|
return this.fuelService.getFleetFuelStats(months);
|
||||||
|
}
|
||||||
|
|
||||||
@Get('stats/:vehicleId')
|
@Get('stats/:vehicleId')
|
||||||
@ApiOperation({ summary: 'Get fuel statistics for vehicle' })
|
@ApiOperation({ summary: 'Get fuel statistics for vehicle' })
|
||||||
async getVehicleFuelStats(
|
async getVehicleFuelStats(
|
||||||
|
|||||||
@@ -53,6 +53,29 @@ export class FuelService {
|
|||||||
return this.fuelRepository.getMonthlyConsumption(vehicleId, month);
|
return this.fuelRepository.getMonthlyConsumption(vehicleId, month);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
async getFleetFuelStats(monthsBack: number = 12) {
|
||||||
|
const endDate = new Date();
|
||||||
|
const startDate = new Date(endDate.getFullYear(), endDate.getMonth() - monthsBack, 1);
|
||||||
|
|
||||||
|
const purchases = await this.purchaseRepository
|
||||||
|
.createQueryBuilder('purchase')
|
||||||
|
.where('purchase.purchaseDate BETWEEN :startDate AND :endDate', { startDate, endDate })
|
||||||
|
.getMany();
|
||||||
|
|
||||||
|
const totalLiters = purchases.reduce((sum: number, p: FuelPurchase) => sum + Number(p.liters), 0);
|
||||||
|
const totalCost = purchases.reduce((sum: number, p: FuelPurchase) => sum + Number(p.totalCost), 0);
|
||||||
|
const averagePrice = totalLiters > 0 ? totalCost / totalLiters : 0;
|
||||||
|
|
||||||
|
return {
|
||||||
|
totalPurchases: purchases.length,
|
||||||
|
totalLiters,
|
||||||
|
totalCost,
|
||||||
|
averagePricePerLiter: averagePrice,
|
||||||
|
averageEfficiency: 0, // Placeholder - would need distance data
|
||||||
|
dateRange: { startDate, endDate },
|
||||||
|
};
|
||||||
|
}
|
||||||
|
|
||||||
async getVehicleFuelStats(vehicleId: string, monthsBack: number = 12) {
|
async getVehicleFuelStats(vehicleId: string, monthsBack: number = 12) {
|
||||||
const endDate = new Date();
|
const endDate = new Date();
|
||||||
const startDate = new Date(endDate.getFullYear(), endDate.getMonth() - monthsBack, 1);
|
const startDate = new Date(endDate.getFullYear(), endDate.getMonth() - monthsBack, 1);
|
||||||
|
|||||||
@@ -38,6 +38,12 @@ export class MaintenanceController {
|
|||||||
return this.maintenanceService.getMaintenanceHistory(vehicleId);
|
return this.maintenanceService.getMaintenanceHistory(vehicleId);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@Get('stats')
|
||||||
|
@ApiOperation({ summary: 'Get fleet-wide maintenance statistics' })
|
||||||
|
async getFleetStats() {
|
||||||
|
return this.maintenanceService.getFleetMaintenanceStats();
|
||||||
|
}
|
||||||
|
|
||||||
@Get('stats/:vehicleId')
|
@Get('stats/:vehicleId')
|
||||||
@ApiOperation({ summary: 'Get maintenance statistics' })
|
@ApiOperation({ summary: 'Get maintenance statistics' })
|
||||||
async getStats(@Param('vehicleId') vehicleId: string) {
|
async getStats(@Param('vehicleId') vehicleId: string) {
|
||||||
|
|||||||
@@ -55,6 +55,25 @@ export class MaintenanceService {
|
|||||||
return this.maintenanceRepository.getMaintenanceCosts(vehicleId, startDate, endDate);
|
return this.maintenanceRepository.getMaintenanceCosts(vehicleId, startDate, endDate);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
async getFleetMaintenanceStats(monthsBack: number = 12) {
|
||||||
|
const endDate = new Date();
|
||||||
|
const startDate = new Date(endDate.getFullYear(), endDate.getMonth() - monthsBack, 1);
|
||||||
|
|
||||||
|
const costs = await this.costRepository
|
||||||
|
.createQueryBuilder('cost')
|
||||||
|
.where('cost.incurredDate BETWEEN :startDate AND :endDate', { startDate, endDate })
|
||||||
|
.getMany();
|
||||||
|
|
||||||
|
const totalCost = costs.reduce((sum: number, c: MaintenanceCost) => sum + Number(c.costAmount), 0);
|
||||||
|
|
||||||
|
return {
|
||||||
|
totalCost,
|
||||||
|
numberOfMaintenanceItems: costs.length,
|
||||||
|
averageCostPerMaintenance: costs.length > 0 ? totalCost / costs.length : 0,
|
||||||
|
costByType: this.groupCostsByType(costs),
|
||||||
|
};
|
||||||
|
}
|
||||||
|
|
||||||
async getVehicleMaintenanceStats(vehicleId: string, monthsBack: number = 12) {
|
async getVehicleMaintenanceStats(vehicleId: string, monthsBack: number = 12) {
|
||||||
const endDate = new Date();
|
const endDate = new Date();
|
||||||
const startDate = new Date(endDate.getFullYear(), endDate.getMonth() - monthsBack, 1);
|
const startDate = new Date(endDate.getFullYear(), endDate.getMonth() - monthsBack, 1);
|
||||||
|
|||||||
Reference in New Issue
Block a user