From ebe46c6f731453b5dd0dc9fab2357476c0966cf9 Mon Sep 17 00:00:00 2001 From: kkfluous Date: Thu, 16 Apr 2026 20:20:18 +0800 Subject: [PATCH] feat(scheduling): add backend type definitions Co-Authored-By: Claude Sonnet 4.6 --- src/server/routes/scheduling/types.ts | 99 +++++++++++++++++++++++++++ 1 file changed, 99 insertions(+) create mode 100644 src/server/routes/scheduling/types.ts diff --git a/src/server/routes/scheduling/types.ts b/src/server/routes/scheduling/types.ts new file mode 100644 index 0000000..eac2b5a --- /dev/null +++ b/src/server/routes/scheduling/types.ts @@ -0,0 +1,99 @@ +export interface SchedulingVehicleInfo { + plateNumber: string; + targetId: number; + targetName: string; + vehicleType: string; + totalMileage: number; + completionRate: number; + yearTarget: number; + region: string; + province: string; + customer: string | null; + customerAvgDaily: number; + predictedYearEnd: number; + daysLeft: number; +} + +export interface CandidateVehicle { + plateNumber: string; + targetId: number | null; + targetName: string | null; + vehicleType: string; + totalMileage: number; + completionRate: number; + yearTarget: number | null; + region: string; + province: string; + mileageGap: number; + predictedAfterSwap: number; + canQualifyAfterSwap: boolean; +} + +export interface SchedulingSuggestion { + id: string; + priority: 'high' | 'medium'; + type: 'replace_qualified' | 'rescue_hopeless'; + currentVehicle: SchedulingVehicleInfo; + candidates: CandidateVehicle[]; + reason: string; +} + +export interface SchedulingSummary { + qualifiedCount: number; + hopelessCount: number; + suggestionCount: number; + estimatedGain: number; +} + +export interface SchedulingTargetOption { + id: number; + name: string; + vehicleCount: number; +} + +export interface SchedulingResponse { + summary: SchedulingSummary; + suggestions: SchedulingSuggestion[]; + targets: SchedulingTargetOption[]; +} + +export interface NotifyRequest { + suggestionId: string; + currentPlate: string; + candidatePlate: string; +} + +export type VehicleClassification = 'qualified' | 'hopeless' | 'normal'; + +export interface EnrichedVehicle { + plateNumber: string; + targetId: number; + targetName: string; + vehicleType: string; + totalMileage: number; + currentYearMileage: number; + completionRate: number; + yearTarget: number; + isQualified: boolean; + currentYearIsQualified: boolean; + dailyRequiredMileage: number; + region: string; + province: string; + customer: string | null; + customerAvgDaily: number; + predictedYearEnd: number; + daysLeft: number; + classification: VehicleClassification; +} + +export interface InventoryVehicle { + plateNumber: string; + vehicleType: string; + region: string; + province: string; + totalMileage: number; + targetId: number | null; + targetName: string | null; + yearTarget: number | null; + completionRate: number; +}