import { OmsLoginType } from '@/api/rbac' /** 解析 JWT payload(不做签名校验,仅读取客户端声明) */ export function parseJwtPayload(token: string): Record | null { const raw = token.startsWith('Bearer ') ? token.slice(7) : token const parts = raw.split('.') if (parts.length < 2) return null try { const base64 = parts[1].replace(/-/g, '+').replace(/_/g, '/') const padded = base64 + '='.repeat((4 - (base64.length % 4)) % 4) const json = decodeURIComponent( atob(padded) .split('') .map((c) => `%${`00${c.charCodeAt(0).toString(16)}`.slice(-2)}`) .join('') ) return JSON.parse(json) as Record } catch { return null } } /** 从 access token 读取 RBAC mapId(user.userid,对应 t_customer.UserId) */ export function getMapIdFromAccessToken(token?: string | null): number | null { if (!token) return null const payload = parseJwtPayload(token) if (!payload) return null const raw = payload.mapId ?? payload.MapId if (raw == null || raw === '') return null const n = Number(raw) return Number.isFinite(n) && n > 0 ? n : null } /** 从 access token 读取登录主体(claim: loginType,0=管理端 1=客户) */ export function getLoginTypeFromAccessToken(token?: string | null): OmsLoginType | null { if (!token) return null const payload = parseJwtPayload(token) if (!payload) return null const raw = payload.loginType ?? payload.LoginType if (raw == null || raw === '') return null const n = Number(raw) if (n === OmsLoginType.Customer) return OmsLoginType.Customer if (n === OmsLoginType.User) return OmsLoginType.User return null }