OfficeSystem/store/dict.js

221 lines
6.9 KiB
JavaScript
Raw Permalink Normal View History

2025-11-14 11:45:19 +08:00
import { defineStore } from 'pinia'
import { getDictDataList } from '@/api/common'
/**
* 字典数据 Store
* 用于管理数据字典提供字典数据的存储和映射功能
*/
export const useDictStore = defineStore('dict', {
state: () => {
return {
// 所有字典数据列表
dictList: [],
// 按 dictType 分组的字典数据,格式:{ dictType: [dictItems] }
dictMap: {},
// 字典数据是否已加载
isLoaded: false,
// 加载时间戳,用于判断是否需要刷新
loadTime: null
}
},
getters: {
/**
* 根据字典类型获取字典列表
* @param {string} dictType 字典类型
* @returns {Array} 字典项列表
*/
getDictByType: (state) => (dictType) => {
return state.dictMap[dictType] || []
},
/**
* 根据字典类型和值获取字典标签
* @param {string} dictType 字典类型
* @param {string|number} dictValue 字典值
* @returns {string} 字典标签如果未找到返回原值
*/
getDictLabel: (state) => (dictType, dictValue) => {
const dictItems = state.dictMap[dictType] || []
const item = dictItems.find(item => String(item.dictValue) === String(dictValue))
return item ? item.dictLabel : dictValue
},
/**
* 根据字典类型和值获取完整的字典项
* @param {string} dictType 字典类型
* @param {string|number} dictValue 字典值
* @returns {Object|null} 字典项对象如果未找到返回 null
*/
getDictItem: (state) => (dictType, dictValue) => {
const dictItems = state.dictMap[dictType] || []
return dictItems.find(item => String(item.dictValue) === String(dictValue)) || null
},
/**
* 批量获取字典标签
* @param {string} dictType 字典类型
* @param {Array<string|number>} dictValues 字典值数组
* @returns {Array<string>} 字典标签数组
*/
getDictLabels: (state) => (dictType, dictValues) => {
if (!Array.isArray(dictValues)) {
return []
}
const dictItems = state.dictMap[dictType] || []
return dictValues.map(value => {
const item = dictItems.find(item => String(item.dictValue) === String(value))
return item ? item.dictLabel : value
})
}
},
actions: {
/**
* 加载字典数据
* @param {boolean} forceRefresh 是否强制刷新默认 false
* @returns {Promise} 返回加载结果
*/
async loadDictData(forceRefresh = false) {
// 如果已加载且不强制刷新,直接返回
if (this.isLoaded && !forceRefresh) {
2025-11-26 15:12:24 +08:00
return Promise.resolve(this.dictList)
2025-11-14 11:45:19 +08:00
}
try {
const response = await getDictDataList()
// 根据响应数据结构处理
// 如果响应直接是数组,使用 response
// 如果响应有 rows 字段,使用 response.rows
const dictList = Array.isArray(response) ? response : (response.rows || [])
console.log('dictList',dictList)
2025-11-14 11:45:19 +08:00
// 过滤掉 status 不为 '0' 的字典项(停用的字典)
const activeDictList = dictList.filter(item => item.status === '0' || item.status === 0)
this.dictList = activeDictList
this.isLoaded = true
this.loadTime = Date.now()
// 按 dictType 分组
this.dictMap = {}
activeDictList.forEach(item => {
if (!this.dictMap[item.dictType]) {
this.dictMap[item.dictType] = []
}
this.dictMap[item.dictType].push(item)
})
// 按 dictSort 排序
Object.keys(this.dictMap).forEach(dictType => {
this.dictMap[dictType].sort((a, b) => {
const sortA = parseInt(a.dictSort) || 0
const sortB = parseInt(b.dictSort) || 0
return sortA - sortB
})
})
// 保存到本地存储
try {
uni.setStorageSync('dictData', {
dictList: this.dictList,
dictMap: this.dictMap,
loadTime: this.loadTime
})
} catch (error) {
console.warn('保存字典数据到本地存储失败:', error)
}
return this.dictList
} catch (error) {
console.error('加载字典数据失败:', error)
// 如果加载失败,尝试从本地存储恢复
try {
const cached = uni.getStorageSync('dictData')
if (cached && cached.dictList) {
this.dictList = cached.dictList
this.dictMap = cached.dictMap
this.loadTime = cached.loadTime
this.isLoaded = true
console.log('从本地存储恢复字典数据')
return this.dictList
}
} catch (e) {
console.error('从本地存储恢复字典数据失败:', e)
}
throw error
}
},
/**
* 加载特定类型的字典数据
* @param {string} dictType 字典类型
* @returns {Promise} 返回该类型的字典列表
*/
async loadDictByType(dictType) {
try {
const response = await getDictDataList({ dictType })
const dictList = Array.isArray(response) ? response : (response.rows || [])
const activeDictList = dictList.filter(item => item.status === '0' || item.status === 0)
// 更新该类型的字典数据
if (!this.dictMap[dictType]) {
this.dictMap[dictType] = []
}
this.dictMap[dictType] = activeDictList.sort((a, b) => {
const sortA = parseInt(a.dictSort) || 0
const sortB = parseInt(b.dictSort) || 0
return sortA - sortB
})
// 更新主列表
const existingIndex = this.dictList.findIndex(item => item.dictType === dictType)
if (existingIndex >= 0) {
// 移除旧的该类型数据
this.dictList = this.dictList.filter(item => item.dictType !== dictType)
}
this.dictList.push(...activeDictList)
return this.dictMap[dictType]
} catch (error) {
console.error(`加载字典类型 ${dictType} 失败:`, error)
throw error
}
},
/**
* 初始化字典数据从本地存储恢复
*/
initFromCache() {
try {
const cached = uni.getStorageSync('dictData')
if (cached && cached.dictList) {
this.dictList = cached.dictList
this.dictMap = cached.dictMap
this.loadTime = cached.loadTime
this.isLoaded = true
}
} catch (error) {
console.warn('从本地存储初始化字典数据失败:', error)
}
},
/**
* 清除字典数据
*/
clearDictData() {
this.dictList = []
this.dictMap = {}
this.isLoaded = false
this.loadTime = null
try {
uni.removeStorageSync('dictData')
} catch (error) {
console.warn('清除本地存储的字典数据失败:', error)
}
}
}
})