fix: 部门出勤/闲置下钻改为基于当日里程区分
All checks were successful
ci/woodpecker/push/woodpecker Pipeline was successful

- 后端/list新增attendance参数(active/idle),查询当日里程表区分
  出勤(mileage>0)和闲置(mileage=0),仅对Operating车辆生效
- 前端部门Tab出勤/闲置点击改用attendance:'active'/'idle'替代
  原来错误的category:'Operating'/'Inventory'
- 修复department='公务车'过滤:匹配departmentName为null的车辆
- 前端API层新增attendance参数传递

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
This commit is contained in:
kkfluous
2026-03-28 20:01:58 +08:00
parent 29d295fceb
commit 8727dc36ab
3 changed files with 25 additions and 8 deletions

View File

@@ -858,9 +858,22 @@ const VEHICLE_TYPE_FILTERS: Record<string, (v: Vehicle) => boolean> = {
// GET /api/vehicles/list — flat list with optional filters
app.get('/list', async (c) => {
const vehicles = await getVehicles();
const { batch, model, location, status, category, vehicleType, manager, customer, isColdChain, isTrailer, department } = c.req.query();
const { batch, model, location, status, category, vehicleType, manager, customer, isColdChain, isTrailer, department, attendance } = c.req.query();
let filtered = vehicles;
// attendance filter: active = today mileage > 0, idle = today mileage = 0 (only for Operating vehicles)
if (attendance === 'active' || attendance === 'idle') {
const [todayRows] = await pool.query<any[]>(`SELECT plateNumber, dayMileage FROM ln_vehicle_day_mileage WHERE dates = CURDATE()`);
const todayMap = new Map<string, number>();
for (const row of todayRows as any[]) todayMap.set(row.plateNumber, Number(row.dayMileage));
filtered = filtered.filter((v) => v.status === 'Operating');
if (attendance === 'active') {
filtered = filtered.filter((v) => (todayMap.get(v.plateNumber) || 0) > 0);
} else {
filtered = filtered.filter((v) => (todayMap.get(v.plateNumber) || 0) === 0);
}
}
if (vehicleType) {
if (VEHICLE_TYPE_FILTERS[vehicleType]) {
filtered = filtered.filter(VEHICLE_TYPE_FILTERS[vehicleType]);
@@ -904,7 +917,7 @@ app.get('/list', async (c) => {
filtered = filtered.filter((v) => customer === '未分配客户' ? !v.customerName : v.customerName === customer);
}
if (department) {
filtered = filtered.filter((v) => v.departmentName === department);
filtered = filtered.filter((v) => department === '公务车' ? !v.departmentName : v.departmentName === department);
}
if (isColdChain !== undefined) {
const wantCold = isColdChain === 'true';