88 lines
2.7 KiB
JavaScript
88 lines
2.7 KiB
JavaScript
/**
|
||
* VIP 权限判断(医生小程序全局方法)
|
||
* - 履约诊所 permissions 来自 get-current-store-type 的 vip.permissions
|
||
* - 业务里用 hasVipPermission(code, permissions) / fetchStoreVipPermissions
|
||
* - 模板显隐可用 components/vip-gate/vip-gate.vue
|
||
*/
|
||
import { getCurrentStoreTypeApi } from '@/api/reception.js'
|
||
|
||
/** 与后台 xk_vip_feature.code 对齐 */
|
||
export const VIP_FEATURE = {
|
||
MEDICAL_RECORD: 'medical_record',
|
||
AI_MEDICAL_RECORD: 'ai_medical_record',
|
||
AI_PRESCRIPTION: 'ai_prescription',
|
||
GOLDEN_FORMULA: 'golden_formula',
|
||
}
|
||
|
||
/**
|
||
* 从接口响应解出业务体(兼容 result / data / 已解包)
|
||
*/
|
||
function unwrapPayload(res) {
|
||
if (!res || typeof res !== 'object') return {}
|
||
if (res.result != null && typeof res.result === 'object') return res.result
|
||
if (res.data != null && typeof res.data === 'object') return res.data
|
||
return res
|
||
}
|
||
|
||
/**
|
||
* 从 get-current-store-type 响应取出 permissions 数组
|
||
* @param {any} res
|
||
* @returns {string[]}
|
||
*/
|
||
export function parseVipPermissionsFromRes(res) {
|
||
const data = unwrapPayload(res)
|
||
const vip = data && data.vip
|
||
const list = vip && Array.isArray(vip.permissions) ? vip.permissions : []
|
||
return list.filter((x) => typeof x === 'string' && x)
|
||
}
|
||
|
||
/**
|
||
* 从响应取出完整 vip 对象
|
||
* @param {any} res
|
||
* @returns {object|null}
|
||
*/
|
||
export function pickVipFromRes(res) {
|
||
const data = unwrapPayload(res)
|
||
const vip = data && data.vip
|
||
return vip && typeof vip === 'object' ? vip : null
|
||
}
|
||
|
||
/**
|
||
* 是否拥有指定 VIP 功能码
|
||
* @param {string} code
|
||
* @param {string[]|object|null|undefined} vipOrPermissions vip 对象或 permissions 数组(医生端必须传履约诊所)
|
||
*/
|
||
export function hasVipPermission(code, vipOrPermissions) {
|
||
if (!code) return false
|
||
if (vipOrPermissions == null) return false
|
||
let list = []
|
||
if (Array.isArray(vipOrPermissions)) {
|
||
list = vipOrPermissions
|
||
} else if (typeof vipOrPermissions === 'object') {
|
||
list = Array.isArray(vipOrPermissions.permissions) ? vipOrPermissions.permissions : []
|
||
}
|
||
return list.indexOf(code) >= 0
|
||
}
|
||
|
||
/**
|
||
* 拉取履约诊所 VIP permissions(统一入口,避免各页复制 getCurrentStoreType)
|
||
* @param {{ storeId?: number|string, registerId?: number|string }} opts
|
||
* @returns {Promise<string[]>}
|
||
*/
|
||
export async function fetchStoreVipPermissions(opts) {
|
||
const storeId = Number((opts && opts.storeId) || 0)
|
||
const registerId = Number((opts && opts.registerId) || 0)
|
||
const params = {}
|
||
if (storeId > 0) params.store_id = storeId
|
||
if (registerId > 0) params.register_id = registerId
|
||
if (!params.store_id && !params.register_id) {
|
||
return []
|
||
}
|
||
try {
|
||
const res = await getCurrentStoreTypeApi(params)
|
||
return parseVipPermissionsFromRes(res)
|
||
} catch (e) {
|
||
return []
|
||
}
|
||
}
|