diff --git a/src/modules/mileage/StatisticsView.tsx b/src/modules/mileage/StatisticsView.tsx index 095aba5..8078c06 100644 --- a/src/modules/mileage/StatisticsView.tsx +++ b/src/modules/mileage/StatisticsView.tsx @@ -260,7 +260,9 @@ export default function StatisticsView() {

考核区间

-

{target.period}

+ {target.periods.map((p, i) => ( +

{p}

+ ))}

总考核里程

@@ -443,7 +445,7 @@ export default function StatisticsView() { {target.avgCompletion.toFixed(1)}%
- {target.period} + {target.periods.join('\n')} {target.annualMileagePerVehicle} {target.yearQualifiedCount} {target.halfQualifiedCount} diff --git a/src/modules/mileage/types.ts b/src/modules/mileage/types.ts index 9a90cba..589b0d1 100644 --- a/src/modules/mileage/types.ts +++ b/src/modules/mileage/types.ts @@ -23,7 +23,7 @@ export interface TargetSummary { totalMileagePerVehicle: number; annualMileagePerVehicle: number; assessmentYears: number; - period: string; + periods: string[]; todayTotal: number; cumulativeTotal: number; avgCompletion: number; diff --git a/src/server/routes/mileage.ts b/src/server/routes/mileage.ts index 0cb1df5..3c74fc1 100644 --- a/src/server/routes/mileage.ts +++ b/src/server/routes/mileage.ts @@ -107,6 +107,25 @@ app.get('/targets', async (c) => { statsMap.set(s.target_id, s); } + // 查询每个 target 的不同考核区间 + const [periodRows] = await pool.execute(` + SELECT target_id, + DATE_FORMAT(assessment_start_date, '%Y-%m-%d') as start_date, + DATE_FORMAT(assessment_end_date, '%Y-%m-%d') as end_date, + COUNT(*) as cnt + FROM tab_mileage_assessment_vehicle + WHERE is_deleted = 0 + GROUP BY target_id, assessment_start_date, assessment_end_date + ORDER BY target_id, assessment_start_date + `) as any; + + const periodsMap = new Map(); + for (const p of periodRows) { + const list = periodsMap.get(p.target_id) || []; + list.push(`${p.start_date} ~ ${p.end_date} (${p.cnt}台)`); + periodsMap.set(p.target_id, list); + } + const now = new Date(); const result = targets.map((t: any) => { const s = statsMap.get(t.id) || {}; @@ -117,12 +136,16 @@ app.get('/targets', async (c) => { const daysLeft = Math.max(1, Math.ceil((yearEnd.getTime() - now.getTime()) / 86400000)); const dailyTarget = remaining / daysLeft; - const startDate = t.default_start_date - ? new Date(t.default_start_date).toISOString().split('T')[0] - : ''; - const endDate = t.default_end_date - ? new Date(t.default_end_date).toISOString().split('T')[0] - : ''; + const periods = periodsMap.get(t.id) || []; + if (periods.length === 0) { + const startDate = t.default_start_date + ? new Date(t.default_start_date).toISOString().split('T')[0] + : ''; + const endDate = t.default_end_date + ? new Date(t.default_end_date).toISOString().split('T')[0] + : ''; + if (startDate || endDate) periods.push(`${startDate} ~ ${endDate}`); + } return { id: t.id, @@ -131,7 +154,7 @@ app.get('/targets', async (c) => { totalMileagePerVehicle: Number(t.total_mileage_per_vehicle), annualMileagePerVehicle: Number(t.annual_mileage_per_vehicle), assessmentYears: t.assessment_years, - period: `${startDate} ~ ${endDate}`, + periods, todayTotal: Number(s.today_total) || 0, cumulativeTotal: Number(s.cumulative_total) || 0, avgCompletion: (Number(s.avg_completion) || 0) * 100,