From 0b2e2f23b57241f9faa97e49a67df51b7e5845ce Mon Sep 17 00:00:00 2001 From: kkfluous Date: Thu, 26 Mar 2026 14:50:22 +0800 Subject: [PATCH] =?UTF-8?q?fix:=20=E4=BF=AE=E5=A4=8Dbigint=E7=B2=BE?= =?UTF-8?q?=E5=BA=A6=E4=B8=A2=E5=A4=B1=E5=AF=BC=E8=87=B4=E4=BA=A4=E8=BF=98?= =?UTF-8?q?=E6=9B=BF=E6=8D=A2=E6=95=B0=E6=8D=AE=E8=86=A8=E8=83=80?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit truck ID 为 MySQL bigint,JavaScript Number 精度不够导致 不同 ID 被截断为相同值造成误匹配。改用 CAST AS CHAR + 字符串 Set 比较。 Co-Authored-By: Claude Opus 4.6 (1M context) --- src/server/routes/vehicles.ts | 30 +++++++++++++++--------------- src/server/types.ts | 4 ++-- 2 files changed, 17 insertions(+), 17 deletions(-) diff --git a/src/server/routes/vehicles.ts b/src/server/routes/vehicles.ts index 79340e1..7935116 100644 --- a/src/server/routes/vehicles.ts +++ b/src/server/routes/vehicles.ts @@ -14,7 +14,7 @@ import type { const app = new Hono(); const MAIN_SQL = `SELECT - truck.id AS id, + CAST(truck.id AS CHAR) AS id, truck.plate_number AS 车牌号, truck.vin AS vin, truck.brand AS 车辆品牌, @@ -269,10 +269,10 @@ function getRegionCounts(vehicles: Vehicle[], regions: readonly string[]): Recor // Weekly truck ID sets, cached interface WeeklyTruckIds { - pending: Set; - delivered: Set; - returned: Set; - replaced: Set; + pending: Set; + delivered: Set; + returned: Set; + replaced: Set; } let cachedWeeklyTruckIds: WeeklyTruckIds | null = null; let weeklyTruckIdsLastFetch = 0; @@ -284,19 +284,19 @@ async function getWeeklyTruckIds(): Promise { } const [[pendingRows], [deliveredRows], [returnedRows], [replacedRows]] = await Promise.all([ - pool.query(`SELECT id AS truck_id FROM tab_truck WHERE is_deleted=0 AND is_operation=1 AND truck_rent_status=7`), - pool.query(`SELECT rent_truck.truck_id FROM tab_truck_rent_take take + pool.query(`SELECT CAST(id AS CHAR) AS truck_id FROM tab_truck WHERE is_deleted=0 AND is_operation=1 AND truck_rent_status=7`), + pool.query(`SELECT CAST(rent_truck.truck_id AS CHAR) AS truck_id FROM tab_truck_rent_take take LEFT JOIN tab_truck_rent_task task ON task.id = take.truck_rent_task_id LEFT JOIN tab_contract_rent_truck rent_truck ON rent_truck.id = task.contract_rent_truck_id WHERE take.is_deleted=0 AND take.take_name IS NOT NULL AND task.task_type=1 AND task.task_status=1 AND take.update_time IS NOT NULL AND take.handover_date >= ${WEEK_START_SQL} AND take.handover_date < ${WEEK_END_SQL}`), - pool.query(`SELECT rent_truck.truck_id FROM tab_truck_rent_return r + pool.query(`SELECT CAST(rent_truck.truck_id AS CHAR) AS truck_id FROM tab_truck_rent_return r LEFT JOIN tab_truck_rent_task task ON task.id = r.truck_rent_task_id LEFT JOIN tab_contract_rent_truck rent_truck ON rent_truck.id = task.contract_rent_truck_id WHERE r.is_deleted=0 AND r.return_date IS NOT NULL AND r.return_date >= ${WEEK_START_SQL} AND r.return_date < ${WEEK_END_SQL}`), - pool.query(`SELECT rent_truck.truck_id FROM tab_truck_rent_take take + pool.query(`SELECT CAST(rent_truck.truck_id AS CHAR) AS truck_id FROM tab_truck_rent_take take LEFT JOIN tab_truck_rent_task task ON task.id = take.truck_rent_task_id LEFT JOIN tab_contract_rent_truck rent_truck ON rent_truck.id = task.contract_rent_truck_id WHERE take.is_deleted=0 AND take.take_name IS NOT NULL @@ -304,7 +304,7 @@ async function getWeeklyTruckIds(): Promise { AND take.handover_date >= ${WEEK_START_SQL} AND take.handover_date < ${WEEK_END_SQL}`), ]); - const toSet = (rows: any[]) => new Set((rows as any[]).map((r) => Number(r.truck_id)).filter(Boolean)); + const toSet = (rows: any[]) => new Set((rows as any[]).map((r) => String(r.truck_id)).filter((s) => s && s !== 'null')); cachedWeeklyTruckIds = { pending: toSet(pendingRows as any[]), delivered: toSet(deliveredRows as any[]), @@ -316,7 +316,7 @@ async function getWeeklyTruckIds(): Promise { } function getStats(list: Vehicle[], weeklyIds?: WeeklyTruckIds) { - const ids = list.map((v) => v.id); + const strIds = list.map((v) => String(v.id)); return { total: list.length, inventory: list.filter((v) => v.status === 'Inventory').length, @@ -324,11 +324,11 @@ function getStats(list: Vehicle[], weeklyIds?: WeeklyTruckIds) { list.filter((v) => v.status === 'Inventory'), REGIONS, ), - pending: weeklyIds ? ids.filter((id) => weeklyIds.pending.has(id)).length : 0, + pending: weeklyIds ? strIds.filter((id) => weeklyIds.pending.has(id)).length : 0, operating: list.filter((v) => v.status === 'Operating').length, - weeklyDelivered: weeklyIds ? ids.filter((id) => weeklyIds.delivered.has(id)).length : 0, - weeklyReturned: weeklyIds ? ids.filter((id) => weeklyIds.returned.has(id)).length : 0, - weeklyReplaced: weeklyIds ? ids.filter((id) => weeklyIds.replaced.has(id)).length : 0, + weeklyDelivered: weeklyIds ? strIds.filter((id) => weeklyIds.delivered.has(id)).length : 0, + weeklyReturned: weeklyIds ? strIds.filter((id) => weeklyIds.returned.has(id)).length : 0, + weeklyReplaced: weeklyIds ? strIds.filter((id) => weeklyIds.replaced.has(id)).length : 0, }; } diff --git a/src/server/types.ts b/src/server/types.ts index 9e309f3..9bc1a32 100644 --- a/src/server/types.ts +++ b/src/server/types.ts @@ -1,5 +1,5 @@ export interface VehicleRow { - id: number; + id: string; 车牌号: string; vin: string; 车辆品牌: string; @@ -28,7 +28,7 @@ export interface VehicleRow { } export interface Vehicle { - id: number; + id: string; plateNumber: string; vin: string; type: string;