import { Ref } from 'vue'; import { List as TenantList } from '@/api/imTenant'; import { useUserStore } from '@/store/modules/user'; export interface ImTenantOption { label: string; value: number; code?: string; name?: string; } export function formatImTenantLabel(item: any): string { const code = item?.code || item?.tenantCode || ''; const name = item?.name || item?.tenantName || '当前商户'; return code ? `${name} (${code})` : name; } export function getDefaultTenantValue(options: any[]) { const defaultTenant = options.find( (item) => item.code === 'default' || String(item.label || '').includes('(default)') ); return defaultTenant?.value || options.find((item) => Number(item.value) > 0)?.value || 0; } export async function loadImTenantOptions( target: Ref, params: Record = { page: 1, perPage: 100 } ) { const userStore = useUserStore(); const userInfo = { ...readTokenUserInfo(userStore.getToken), ...(userStore.getUserInfo as any) }; const boundTenantId = Number(userInfo?.tenantId || userInfo?.tenantID || 0); if (!userStore.isCompanyDept) { if (boundTenantId <= 0) { target.value = []; return target.value; } let tenant: any = null; try { const res = await TenantList({ ...params, id: boundTenantId, page: 1, perPage: 1 }); tenant = (res?.list || []).find((item) => Number(item.id) === boundTenantId); } catch { tenant = null; } target.value = [ tenant ? toTenantOption(tenant) : { label: formatImTenantLabel({ id: boundTenantId, name: userInfo?.tenantName, code: userInfo?.tenantCode, }), value: boundTenantId, code: userInfo?.tenantCode, name: userInfo?.tenantName, }, ]; return target.value; } const res = await TenantList(params); target.value = (res?.list || []).map(toTenantOption); return target.value; } function toTenantOption(item: any): ImTenantOption { return { label: formatImTenantLabel(item), value: Number(item.id), code: item.code, name: item.name, }; } function readTokenUserInfo(token: string) { try { const payload = token.split('.')[1]; if (!payload) return {}; const normalized = payload.replace(/-/g, '+').replace(/_/g, '/'); const padded = normalized.padEnd(Math.ceil(normalized.length / 4) * 4, '='); const binary = window.atob(padded); const bytes = Uint8Array.from(binary, (char) => char.charCodeAt(0)); return JSON.parse(new TextDecoder().decode(bytes)); } catch { return {}; } }