81 lines
3.0 KiB
TypeScript
81 lines
3.0 KiB
TypeScript
import pool from '../../db.js';
|
|
import { LATEST_VEHICLE_LEASE_JOIN_SQL } from '../../vehicle-lease-sql.js';
|
|
import type { VehicleInfoRow } from './types.js';
|
|
|
|
/** 车辆关联信息 SQL(客户名、部门、经理、租赁状态、主体、项目、品牌) */
|
|
export const VEHICLE_INFO_SQL = `SELECT
|
|
vi.plate_number AS plate,
|
|
vi.vin AS vin,
|
|
vor.customer_name AS customer,
|
|
vor.business_dept AS department,
|
|
vor.business_manager AS manager,
|
|
CAST(COALESCE(c.business_manager_id, vi.business_id) AS CHAR) AS manager_id,
|
|
CASE vs.operation_status
|
|
WHEN '1' THEN '租赁'
|
|
WHEN '2' THEN '自营'
|
|
WHEN '3' THEN '可运营'
|
|
WHEN '4' THEN '待运营'
|
|
WHEN '5' THEN '退出运营'
|
|
ELSE vs.operation_status
|
|
END AS rent_status,
|
|
NULLIF(vi.registered_ownership, '') AS entity,
|
|
vor.project_name AS project,
|
|
COALESCE(vi_operation_city.NAME, NULLIF(vi.operation_city, '')) AS inventory_location,
|
|
CASE vm.brand
|
|
WHEN 'hyundai' THEN CASE WHEN vm.model LIKE '%帕力安%' OR vm.model LIKE '%冷链%' OR vm.model LIKE '%双飞翼%' THEN '帕力安牌' ELSE '现代' END
|
|
WHEN 'yuejin' THEN '跃进'
|
|
WHEN 'feichi' THEN '飞驰'
|
|
WHEN 'sulong' THEN '苏龙'
|
|
WHEN 'higer' THEN '海格'
|
|
WHEN 'dongfeng' THEN '东风'
|
|
WHEN 'yutong' THEN '宇通'
|
|
WHEN 'chufeng' THEN '楚风'
|
|
WHEN 'tonghua' THEN '通华'
|
|
WHEN 'maxus' THEN '大通'
|
|
WHEN 'mingwei' THEN '明威'
|
|
WHEN 'wanfeng' THEN '万风'
|
|
WHEN 'shujie' THEN '舒捷'
|
|
WHEN 'denza' THEN '腾势'
|
|
WHEN 'hongyan' THEN '红岩'
|
|
WHEN 'yuanchang brand' THEN '远程牌'
|
|
WHEN 'others' THEN '其他'
|
|
ELSE vm.brand
|
|
END AS brand_label
|
|
FROM vehicle_info vi
|
|
LEFT JOIN vehicle_status vs
|
|
ON vs.vehicle_id = vi.id
|
|
AND vs.del_flag = 0
|
|
LEFT JOIN vehicle_model vm
|
|
ON vm.id = vi.vehicle_model_id
|
|
AND vm.del_flag = '0'
|
|
LEFT JOIN common_district vi_operation_city
|
|
ON vi_operation_city.CODE = vi.operation_city COLLATE utf8mb4_unicode_ci
|
|
AND vi_operation_city.STATUS = 'VALID'
|
|
${LATEST_VEHICLE_LEASE_JOIN_SQL}
|
|
WHERE vi.del_flag = '0'
|
|
AND COALESCE(vs.operation_status, '') <> '5'`;
|
|
|
|
/** 查询所有车辆关联信息,返回 plate→info 的 Map */
|
|
export async function fetchVehicleInfoMap(): Promise<Map<string, VehicleInfoRow>> {
|
|
const [rows] = await pool.execute(VEHICLE_INFO_SQL) as [VehicleInfoRow[], unknown];
|
|
const map = new Map<string, VehicleInfoRow>();
|
|
for (const row of rows) {
|
|
map.set(row.plate, row);
|
|
}
|
|
return map;
|
|
}
|
|
|
|
/** 查询指定车牌的关联信息 */
|
|
export async function fetchVehicleInfoByPlates(plates: string[]): Promise<Map<string, VehicleInfoRow>> {
|
|
if (plates.length === 0) return new Map();
|
|
const [rows] = await pool.execute(
|
|
`${VEHICLE_INFO_SQL} AND vi.plate_number IN (${plates.map(() => '?').join(',')})`,
|
|
plates
|
|
) as [VehicleInfoRow[], unknown];
|
|
const map = new Map<string, VehicleInfoRow>();
|
|
for (const row of rows) {
|
|
map.set(row.plate, row);
|
|
}
|
|
return map;
|
|
}
|