feat(scheduling): show all candidates instead of top 5, update section title
All checks were successful
ci/woodpecker/push/woodpecker Pipeline was successful
All checks were successful
ci/woodpecker/push/woodpecker Pipeline was successful
This commit is contained in:
@@ -116,11 +116,11 @@ export default function SuggestionDetail({ suggestion: s, onClose, onNotifySucce
|
|||||||
|
|
||||||
{/* Candidates */}
|
{/* Candidates */}
|
||||||
<div className="px-4 py-3">
|
<div className="px-4 py-3">
|
||||||
<div className="flex items-center justify-between mb-2.5">
|
<div className="mb-2.5">
|
||||||
<span className="text-xs font-bold text-slate-700">
|
<div className="flex items-center justify-between">
|
||||||
{isRescue ? '建议替换车辆' : '建议替换车辆'}
|
<span className="text-xs font-bold text-slate-700">当前区域所有可替换在库车辆</span>
|
||||||
</span>
|
<span className="text-[10px] text-slate-400">{s.candidates.length} 辆</span>
|
||||||
<span className="text-[10px] text-slate-400">{s.candidates.length} 辆可选</span>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
|
|
||||||
<div className="space-y-2">
|
<div className="space-y-2">
|
||||||
|
|||||||
@@ -129,7 +129,7 @@ export function generateSuggestions(
|
|||||||
// Among non-qualifiable: smallest gap first (closest to target)
|
// Among non-qualifiable: smallest gap first (closest to target)
|
||||||
return a.mileageGap - b.mileageGap;
|
return a.mileageGap - b.mileageGap;
|
||||||
})
|
})
|
||||||
.slice(0, 5);
|
;
|
||||||
|
|
||||||
const gap = Math.max(0, vehicle.yearTarget - vehicle.currentYearMileage);
|
const gap = Math.max(0, vehicle.yearTarget - vehicle.currentYearMileage);
|
||||||
const dailyReq = vehicle.daysLeft > 0 ? Math.round(gap / vehicle.daysLeft) : 0;
|
const dailyReq = vehicle.daysLeft > 0 ? Math.round(gap / vehicle.daysLeft) : 0;
|
||||||
@@ -192,7 +192,7 @@ export function generateSuggestions(
|
|||||||
})
|
})
|
||||||
// Only keep candidates that can actually qualify at this customer
|
// Only keep candidates that can actually qualify at this customer
|
||||||
.filter(c => c.canQualifyAfterSwap)
|
.filter(c => c.canQualifyAfterSwap)
|
||||||
.slice(0, 5);
|
;
|
||||||
|
|
||||||
// Skip if no candidate can reach target — swap would be pointless
|
// Skip if no candidate can reach target — swap would be pointless
|
||||||
if (candidates.length === 0) continue;
|
if (candidates.length === 0) continue;
|
||||||
|
|||||||
Reference in New Issue
Block a user