|
@@ -0,0 +1,74 @@
|
|
|
+import { defineStore } from 'pinia';
|
|
|
+import { reactive } from 'vue';
|
|
|
+import { SetupStoreId } from '@/enum';
|
|
|
+import { getDicts } from '@/service/api';
|
|
|
+
|
|
|
+interface dictItem {
|
|
|
+ label: string;
|
|
|
+ value: string;
|
|
|
+}
|
|
|
+
|
|
|
+interface StoreState {
|
|
|
+ dictionaries: { [key: string]: dictItem[] };
|
|
|
+ loading: boolean;
|
|
|
+ errors: Error | null;
|
|
|
+ pendingRequests: Map<any, any>;
|
|
|
+}
|
|
|
+
|
|
|
+export const useDictStore = defineStore(SetupStoreId.Dict, () => {
|
|
|
+ const store = reactive<StoreState>({
|
|
|
+ dictionaries: {},
|
|
|
+ loading: false,
|
|
|
+ errors: null,
|
|
|
+ pendingRequests: new Map() // 用于跟踪正在进行的请求
|
|
|
+ });
|
|
|
+ async function loadDict(type: string) {
|
|
|
+ if (store.dictionaries[type]) return store.dictionaries[type];
|
|
|
+
|
|
|
+ // 检查是否有正在进行的相同请求
|
|
|
+ if (store.pendingRequests.has(type)) {
|
|
|
+ return store.pendingRequests.get(type);
|
|
|
+ }
|
|
|
+
|
|
|
+ store.loading = true;
|
|
|
+ store.errors = null;
|
|
|
+
|
|
|
+ // 创建一个新的 Promise 来跟踪这个请求
|
|
|
+ const requestPromise = getDicts(type)
|
|
|
+ .then(({ data }) => {
|
|
|
+ store.dictionaries[type] = data;
|
|
|
+ return data;
|
|
|
+ })
|
|
|
+ .catch(error => {
|
|
|
+ store.errors = error;
|
|
|
+ throw error;
|
|
|
+ })
|
|
|
+ .finally(() => {
|
|
|
+ store.loading = false;
|
|
|
+ store.pendingRequests.delete(type); // 请求完成后移除
|
|
|
+ });
|
|
|
+
|
|
|
+ // 将请求存储在 pendingRequests 中
|
|
|
+ store.pendingRequests.set(type, requestPromise);
|
|
|
+
|
|
|
+ // 返回请求的 Promise
|
|
|
+ return requestPromise;
|
|
|
+ }
|
|
|
+
|
|
|
+ function findNameByValue(options: dictItem[], value: string, separator: string = ',') {
|
|
|
+ return options.flatMap(option => (option.value === value ? option.label : [])).join(separator);
|
|
|
+ }
|
|
|
+
|
|
|
+ function findNameByDict(dictKey: string, value: string, separator: string = ',') {
|
|
|
+ if (store.dictionaries[dictKey]) {
|
|
|
+ return findNameByValue(store.dictionaries[dictKey], value, separator);
|
|
|
+ }
|
|
|
+ loadDict(dictKey);
|
|
|
+ return '-';
|
|
|
+ }
|
|
|
+ return {
|
|
|
+ loadDict,
|
|
|
+ findNameByDict,
|
|
|
+ findNameByValue
|
|
|
+ };
|
|
|
+});
|