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,