- 新增 auth 模块:jumpToken 代理交换、用户信息获取、JWT 签发 - 三级权限:full(所有权限/数智中心/BI-Leader)、department(BI-Leader-Dep)、personal - 添加 managerId 到车辆数据模型,支持个人级别按 userId 精确过滤 - auth 中间件保护所有 /api/* 端点(跳过 /api/health 和 /api/auth/*) - 所有路由集成 filterByPermission 权限过滤 Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
48 lines
2.0 KiB
TypeScript
48 lines
2.0 KiB
TypeScript
import pool from '../../db.js';
|
||
import type { VehicleInfoRow } from './types.js';
|
||
|
||
/** 车辆关联信息 SQL(客户名、部门、经理、租赁状态、主体、项目) */
|
||
export const VEHICLE_INFO_SQL = `SELECT
|
||
truck.plate_number AS plate,
|
||
cus.customer_name AS customer,
|
||
dep.dep_name AS department,
|
||
u.user_name AS manager,
|
||
CAST(c.bd AS CHAR) AS manager_id,
|
||
dic_status.dic_name AS rent_status,
|
||
org_truck.org_name AS entity,
|
||
c.project_name AS project
|
||
FROM tab_truck truck
|
||
LEFT JOIN tab_truck_status_info si ON si.truck_id = truck.id AND si.is_deleted = 0
|
||
LEFT JOIN tab_contract c ON c.id = si.contract_id AND c.is_deleted = 0
|
||
LEFT JOIN tab_customer cus ON cus.id = c.customer_id AND cus.is_deleted = 0
|
||
LEFT JOIN tab_user u ON u.id = c.bd AND u.is_deleted = 0
|
||
LEFT JOIN tab_department dep ON dep.id = u.dep_id AND dep.is_deleted = 0
|
||
LEFT JOIN tab_dic dic_status ON dic_status.parent_code = 'dic_truck_rent_status'
|
||
AND dic_status.dic_code = truck.truck_rent_status AND dic_status.is_deleted = 0
|
||
LEFT JOIN tab_org org_truck ON org_truck.id = truck.org_id AND org_truck.is_deleted = 0
|
||
WHERE truck.is_deleted = 0 AND truck.is_operation = 1`;
|
||
|
||
/** 查询所有车辆关联信息,返回 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 truck.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;
|
||
}
|