You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
 
 
 
 
 
 

97 lines
3.2 KiB

/**
* 字典工具 —— 通用字典加载、缓存、翻译
* 使用方式:
* import { loadDict, getDictText, getDictColumns } from '@/util/dictUtil';
* loadDict('caseType'); // 加载字典(自动缓存)
* getDictText('caseType', 0); // 翻译 value → text
* getDictColumns('caseType'); // 获取 [{text, value}] 用于 van-picker
*/
import { queryDict } from '@/api/enterprise';
// 内存缓存 { dictType → [{text, value}] }
const dictStore = {};
// sessionStorage key 生成
const cacheKey = (dictType) => `DICT_CACHE::${dictType}`;
/**
* 解析接口响应,兼容多种结构
*/
const parseRows = (res) => {
if (Array.isArray(res)) return res;
if (res && Array.isArray(res.rows)) return res.rows;
if (res && Array.isArray(res.data)) return res.data;
if (res && res.data && Array.isArray(res.data.rows)) return res.data.rows;
return [];
};
/**
* 标准化为 [{text, value}]
*/
const normalizeColumns = (rows) => {
return rows.map(item => ({
text: item.dictLabel || item.label || item.name || '',
value: item.dictValue || item.value || item.code || ''
})).filter(c => c.text);
};
/**
* 加载指定字典类型(含 sessionStorage 缓存)
* @param {string} dictType 字典类型
* @param {Function} [onSuccess] 可选回调,接收 columns [{text, value}]
* @param {Function} [onError] 可选失败回调
*/
export const loadDict = (dictType, onSuccess, onError) => {
// 内存命中直接返回
if (dictStore[dictType] && dictStore[dictType].length > 0) {
onSuccess && onSuccess(dictStore[dictType]);
return;
}
// sessionStorage 命中
const cached = sessionStorage.getItem(cacheKey(dictType));
if (cached) {
try {
const columns = JSON.parse(cached);
if (Array.isArray(columns) && columns.length > 0) {
dictStore[dictType] = columns;
onSuccess && onSuccess(columns);
return;
}
} catch (e) { /* 解析失败继续走接口 */ }
}
// 请求接口
queryDict({ dictType }, (res) => {
const columns = normalizeColumns(parseRows(res));
dictStore[dictType] = columns;
if (columns.length > 0) {
sessionStorage.setItem(cacheKey(dictType), JSON.stringify(columns));
}
onSuccess && onSuccess(columns);
}, (err) => {
onError && onError(err);
});
};
/**
* 获取字典翻译文本
* @param {string} dictType 字典类型
* @param {*} val 字典值
* @param {string} [fallback='-'] 未匹配时的降级显示
* @returns {string}
*/
export const getDictText = (dictType, val, fallback) => {
if (val === undefined || val === null || val === '') return fallback !== undefined ? fallback : '-';
const columns = dictStore[dictType] || [];
const key = String(val);
const found = columns.find(c => String(c.value) === key);
return found ? found.text : (fallback !== undefined ? fallback : val);
};
/**
* 获取字典列表(用于 van-picker :columns)
* @param {string} dictType
* @returns {Array} [{text, value}]
*/
export const getDictColumns = (dictType) => {
return dictStore[dictType] || [];
};