/** * 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} */ 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 [] } }