diff --git a/src/modules/mileage/StatisticsView.tsx b/src/modules/mileage/StatisticsView.tsx index 38d7fc1..4d6f98f 100644 --- a/src/modules/mileage/StatisticsView.tsx +++ b/src/modules/mileage/StatisticsView.tsx @@ -354,7 +354,9 @@ export default function StatisticsView() { <>

{assessment.label}区间

-

{assessment.startDate} ~ {assessment.endDate}

+ {(assessment.periods.length > 0 ? assessment.periods : [`${assessment.startDate} ~ ${assessment.endDate}`]).map((period, i) => ( +

{period}

+ ))}

{assessment.label}任务/辆

diff --git a/src/modules/mileage/types.ts b/src/modules/mileage/types.ts index 435e5ac..e7371ca 100644 --- a/src/modules/mileage/types.ts +++ b/src/modules/mileage/types.ts @@ -93,6 +93,7 @@ export interface TargetYearlyAssessment { dailyTarget: number; startDate: string | null; endDate: string | null; + periods: string[]; } export interface TargetVehicle { diff --git a/src/server/routes/mileage/targets.ts b/src/server/routes/mileage/targets.ts index f848c89..4f1dbb3 100644 --- a/src/server/routes/mileage/targets.ts +++ b/src/server/routes/mileage/targets.ts @@ -84,6 +84,31 @@ app.get('/', async (c) => { yearlyMap.set(row.target_id, list); } + const [yearlyPeriodRows] = await pool.execute(` + SELECT + v.target_id, + y.year_number, + DATE_FORMAT(DATE_ADD(v.assessment_start_date, INTERVAL y.year_number - 1 YEAR), '%Y-%m-%d') as start_date, + DATE_FORMAT(DATE_SUB(DATE_ADD(v.assessment_start_date, INTERVAL y.year_number YEAR), INTERVAL 1 DAY), '%Y-%m-%d') as end_date, + COUNT(*) as cnt + FROM tab_mileage_assessment_vehicle v + JOIN tab_mileage_assessment_target t ON t.id = v.target_id AND t.is_deleted = 0 + JOIN ( + SELECT 1 as year_number UNION ALL SELECT 2 UNION ALL SELECT 3 UNION ALL SELECT 4 UNION ALL SELECT 5 + ) y ON y.year_number <= LEAST(t.assessment_years, v.current_year_number) + WHERE v.is_deleted = 0 + GROUP BY v.target_id, y.year_number, v.assessment_start_date + ORDER BY v.target_id, y.year_number, v.assessment_start_date + `) as [any[], unknown]; + + const yearlyPeriodsMap = new Map(); + for (const row of yearlyPeriodRows) { + const key = `${row.target_id}-${row.year_number}`; + const list = yearlyPeriodsMap.get(key) || []; + list.push(`${row.start_date} ~ ${row.end_date} (${row.cnt}台)`); + yearlyPeriodsMap.set(key, list); + } + const [periodRows] = await pool.execute(` SELECT target_id, DATE_FORMAT(assessment_start_date, '%Y-%m-%d') as start_date, @@ -158,6 +183,7 @@ app.get('/', async (c) => { dailyTarget: assessmentDaysLeft > 0 ? Math.round((remainingMileage / assessmentDaysLeft) * 10) / 10 : 0, startDate: row.start_date || null, endDate: row.end_date || null, + periods: yearlyPeriodsMap.get(`${row.target_id}-${row.year_number}`) || [], }; });