import { ref, Ref, onMounted, nextTick, unref } from 'vue';import _ from 'lodash';import * as DbCacheUtils from '@/utils/DbCacheUtils';import type { TableColumnCtx } from 'element-plus/es/components/table/src/table-column/defaults';import { setup as useRx } from './RxBusMixins';interface MyProps {  table: Ref<any>;  /** 是否主动加载配置 */  auto?: boolean;  cacheKey?: string;}interface MyOption {  label: string;  prop: string;  is_check: boolean;}interface TableStore {  commit(name: string, ...args);  states: {    _columns: Ref<TableColumnCtx<any>[]>;  };  updateColumns();}function SaveData(key: string, options: MyOption[]) {  return DbCacheUtils.SetValue(key, JSON.stringify(options));}async function GetData(key: string): Promise<MyOption[]> {  const json = await DbCacheUtils.GetValue<string>(key);  if (!json) return null;  return JSON.parse(json);}/** * @param props  * @returns  */export function useTableColumns<T = any>(props: MyProps) {  const options = ref<MyOption[]>([]);  const rxHub = useRx();  function GetCacheKey() {    return props.cacheKey || 'table';  }  let storeColumns: TableColumnCtx<T>[];  /**   * 依据配置初始化列   */  async function InitShowColumns() {    const table = props.table.value;    const store: TableStore = table.store;    const array = unref(store.states._columns);    storeColumns = _.clone(array);    const list = await GetData(GetCacheKey());    if (list != null && list.length > 0) {      options.value = list;      InitConfig();    }    else {      const array = unref(store.states._columns);      options.value = array.filter(t => t.property != null).map(t => ({        prop: t.property,        label: t.label,        is_check: true,      }));    }        // console.log('table store', table.store);  }  onMounted(async () => {    await nextTick();    if (props.auto !== false) {      InitShowColumns();    }  });  /**   * 弹出列设置   */  function ShowColumnsConfig() {    rxHub.emit('ShowTableColumnDialog', {      options: options.value,      callback: async (list) => {        options.value = list;        InitConfig();      }    });  }  async function InitConfig() {    const table = props.table.value;    const store: TableStore = table.store;    const array = unref(store.states._columns);    options.value.forEach(option => {      if (option.is_check === false) {        const col = array.find(t => t.property === option.prop);        if (col != null) {          store.commit('removeColumn', col, null);        }      }      else {        const col = storeColumns.find(t => t.property === option.prop);        if (!array.some(t => t.property === option.prop)) {          store.commit('insertColumn', col, null);        }      }    });    await nextTick();    store.updateColumns();    await SaveData(GetCacheKey(), options.value);  }  return {    InitShowColumns,    ShowColumnsConfig,  };}