Files
xk-doctor-wx/utils/vip.js

88 lines
2.7 KiB
JavaScript
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
/**
* 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 []
}
}