import type { AuthUser } from './types.js'; import type { Vehicle } from '../types.js'; import { isInventoryVehicle } from '../routes/vehicles/model.js'; /** 当前库存为公共资产;非库存车辆继续遵守本人/部门权限。历史业务使用原权限过滤。 */ export function filterAssetVehiclesByPermission(items: T[], user: AuthUser): T[] { if (user.permissionLevel === 'full') return items; const authorized = new Set(filterByPermission(items, user)); return items.filter(vehicle => isInventoryVehicle(vehicle) || authorized.has(vehicle)); } /** 客户名称脱敏 */ export function maskCustomerName(name: string | null): string | null { if (!name) return name; const len = name.length; if (len <= 1) return '*'; if (len <= 3) return name[0] + '*'; if (len <= 6) return name.slice(0, 2) + '***' + name.slice(-1); return name.slice(0, 4) + '***' + name.slice(-2); } /** 对数据列表中的客户名称进行脱敏 */ export function maskCustomerNames(items: T[]): T[] { return items.map(v => { const obj = v as any; const copy = { ...obj }; if ('customer' in copy && copy.customer) copy.customer = maskCustomerName(copy.customer); if ('customerName' in copy && copy.customerName) copy.customerName = maskCustomerName(copy.customerName); if (copy.pendingDelivery) copy.pendingDelivery = { ...copy.pendingDelivery, customerName: maskCustomerName(copy.pendingDelivery.customerName), }; return copy as T; }); } /** * 通用权限过滤函数 * 适配 CachedVehicle(department, manager, managerId)和 Vehicle(departmentName, customerManager, managerId) */ export function filterByPermission( items: T[], user: AuthUser, ): T[] { if (user.permissionLevel === 'full') return items; if (user.permissionLevel === 'department') { return items.filter(v => { const obj = v as any; const dept = obj.departmentName || obj.department || null; return dept === user.depName; }); } // personal: 仅看自己负责的车辆 (bd = userId) return items.filter(v => { const obj = v as any; return (user.managerIds ?? [user.userId]).includes(obj.managerId); }); }