fix(mileage): 年度考核区间按批次展示
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:
@@ -354,7 +354,9 @@ export default function StatisticsView() {
|
|||||||
<>
|
<>
|
||||||
<div className="space-y-0.5">
|
<div className="space-y-0.5">
|
||||||
<p className="text-[8px] font-bold text-slate-400 uppercase tracking-wider">{assessment.label}区间</p>
|
<p className="text-[8px] font-bold text-slate-400 uppercase tracking-wider">{assessment.label}区间</p>
|
||||||
<p className="text-[10px] font-black text-slate-700">{assessment.startDate} ~ {assessment.endDate}</p>
|
{(assessment.periods.length > 0 ? assessment.periods : [`${assessment.startDate} ~ ${assessment.endDate}`]).map((period, i) => (
|
||||||
|
<p key={i} className="text-[10px] font-black text-slate-700">{period}</p>
|
||||||
|
))}
|
||||||
</div>
|
</div>
|
||||||
<div className="space-y-0.5">
|
<div className="space-y-0.5">
|
||||||
<p className="text-[8px] font-bold text-slate-400 uppercase tracking-wider">{assessment.label}任务/辆</p>
|
<p className="text-[8px] font-bold text-slate-400 uppercase tracking-wider">{assessment.label}任务/辆</p>
|
||||||
|
|||||||
@@ -93,6 +93,7 @@ export interface TargetYearlyAssessment {
|
|||||||
dailyTarget: number;
|
dailyTarget: number;
|
||||||
startDate: string | null;
|
startDate: string | null;
|
||||||
endDate: string | null;
|
endDate: string | null;
|
||||||
|
periods: string[];
|
||||||
}
|
}
|
||||||
|
|
||||||
export interface TargetVehicle {
|
export interface TargetVehicle {
|
||||||
|
|||||||
@@ -84,6 +84,31 @@ app.get('/', async (c) => {
|
|||||||
yearlyMap.set(row.target_id, list);
|
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<string, string[]>();
|
||||||
|
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(`
|
const [periodRows] = await pool.execute(`
|
||||||
SELECT target_id,
|
SELECT target_id,
|
||||||
DATE_FORMAT(assessment_start_date, '%Y-%m-%d') as start_date,
|
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,
|
dailyTarget: assessmentDaysLeft > 0 ? Math.round((remainingMileage / assessmentDaysLeft) * 10) / 10 : 0,
|
||||||
startDate: row.start_date || null,
|
startDate: row.start_date || null,
|
||||||
endDate: row.end_date || null,
|
endDate: row.end_date || null,
|
||||||
|
periods: yearlyPeriodsMap.get(`${row.target_id}-${row.year_number}`) || [],
|
||||||
};
|
};
|
||||||
});
|
});
|
||||||
|
|
||||||
|
|||||||
Reference in New Issue
Block a user