61 lines
2.2 KiB
TypeScript
61 lines
2.2 KiB
TypeScript
import type { AuthUser } from './types.js';
|
||
import type { Vehicle } from '../types.js';
|
||
import { isInventoryVehicle } from '../routes/vehicles/model.js';
|
||
|
||
/** 当前库存为公共资产;非库存车辆继续遵守本人/部门权限。历史业务使用原权限过滤。 */
|
||
export function filterAssetVehiclesByPermission<T extends Vehicle>(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<T>(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<T>(
|
||
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);
|
||
});
|
||
}
|