dict.js 2.3 KB
import globalConfig from '@/common/config/global';
import cache from '@/common/utils/cache';
import { useUserStore } from '@/pinia/user';

/**
 * 内部辅助函数:获取完整字典数据(优先从userStore,其次缓存)
 * @returns {Array} 字典数组
 */
const getDictData = () => {
  const userStore = useUserStore();
  // 优先取userStore中的字典,无则从缓存取,兜底空数组
  return userStore.dictData || cache.get(globalConfig.cache.dictDataKey) || [];
};

/**
 * 获取指定dictType的所有字典项
 * @param {string} dictType 字典类型(如:ai_image_status)
 * @returns {Array} 对应字典类型的[{value, label, ...}]数组
 */
export const getDictList = (dictType) => {
  if (!dictType) return [];
  const dictData = getDictData();
  // 过滤时增加空值保护,避免filter报错
  return Array.isArray(dictData) ? dictData.filter(item => item?.dictType === dictType) : [];
};

/**
 * 根据dictType和value获取对应的label
 * @param {string} dictType 字典类型
 * @param {string|number} value 字典值
 * @returns {string} 对应的label(未找到返回空字符串)
 */
export const getDictLabel = (dictType, value) => {
  if (!dictType || value === undefined || value === null) return '';
  const dictData = getDictData();
  if (!Array.isArray(dictData)) return '';

  const targetItem = dictData.find(
    item => item?.dictType === dictType && String(item?.value) === String(value)
  );
  return targetItem?.label || '';
};

/**
 * 根据dictType和label获取对应的value
 * @param {string} dictType 字典类型
 * @param {string} label 字典标签
 * @returns {string} 对应的value(未找到返回空字符串)
 */
export const getDictValue = (dictType, label) => {
  if (!dictType || !label) return '';
  const dictData = getDictData();
  if (!Array.isArray(dictData)) return '';

  const targetItem = dictData.find(
    item => item?.dictType === dictType && item?.label === label
  );
  return targetItem?.value || '';
};

/**
 * 获取指定dictType的字典项,仅返回{value, label}结构的简化数组
 * @param {string} dictType 字典类型
 * @returns {Array} 简化后的[{value, label}]数组
 */
export const getDictSimpleList = (dictType) => {
  return getDictList(dictType).map(item => ({
    value: item.value || '',
    label: item.label || ''
  }));
};