fix: show bound tenant in im menus
This commit is contained in:
@@ -0,0 +1,88 @@
|
||||
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<ImTenantOption[]>,
|
||||
params: Record<string, any> = { 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 {};
|
||||
}
|
||||
}
|
||||
Reference in New Issue
Block a user