This commit is contained in:
zlwu committed 2026-07-16 08:13:05 +08:00
1 parent 5c6ace1dd3
commit 8be55c08e9
32 files changed
+18546 -4422

No files matched your search

@@ -0,0 +1,66 @@
import { ref } from 'vue'
import { fetchGetMenuCodes } from '@/api/auth'
import { useUserStore } from '@/store/modules/user'
const PRICE_LETTER_PERM_MAP: Record<string, string> = {
list: 'crm:priceLetter:list',
add: 'crm:priceLetter:add',
edit: 'crm:priceLetter:edit',
query: 'crm:priceLetter:query',
print: 'crm:priceLetter:print',
void: 'crm:priceLetter:void'
}
let cachedCodes: Set<string> | null = null
let cachedAll = false
let loadingPromise: Promise<void> | null = null
function isSuperAdmin(userStore: ReturnType<typeof useUserStore>) {
const roles = userStore.info?.roles || []
return userStore.info?.role === 'super_admin' || roles.includes('super_admin')
}
export function usePriceLetterPerm() {
const userStore = useUserStore()
const ready = ref(cachedAll || !!cachedCodes)
async function loadPerms() {
if (cachedAll || cachedCodes) {
ready.value = true
return
}
if (isSuperAdmin(userStore)) {
cachedAll = true
ready.value = true
return
}
if (!loadingPromise) {
loadingPromise = fetchGetMenuCodes()
.then((res) => {
if (res?.all || res?.isSuperAdmin) {
cachedAll = true
cachedCodes = null
} else {
cachedCodes = new Set(res?.menuCodes || [])
}
})
.catch(() => {
cachedCodes = new Set()
})
.finally(() => {
ready.value = true
loadingPromise = null
})
}
await loadingPromise
}
function hasPriceLetterPerm(action: keyof typeof PRICE_LETTER_PERM_MAP | string) {
if (cachedAll || isSuperAdmin(userStore)) return true
const code = PRICE_LETTER_PERM_MAP[action] || String(action)
if (!cachedCodes) return true
return cachedCodes.has(code) || cachedCodes.has('crm:priceLetter:list')
}
return { ready, loadPerms, hasPriceLetterPerm }
}