07497055创建于 2023年8月30日历史提交
import { getTableFields, getTableList } from '@/api/modeling'
import { defineStore } from 'pinia'
import { Message } from '@arco-design/web-vue'
import { KeyValue } from '@/api/modeling/request'
import { Graph } from '@antv/x6'

interface stateType {
  graph: any,
  dataFlowInfo: KeyValue,
  rawData: KeyValue,
  useData: KeyValue,
  useDatabase: string,
  useTable: string[],
  fieldsAlias: { database: string, table: string, name: string }[]
}
const defineState: stateType = {
  graph: null,
  dataFlowInfo: {},
  rawData: {},
  useData: {},
  useDatabase: ``,
  useTable: [],
  fieldsAlias: []
}

export const useDataFlowStore = defineStore(`dataFlow`, {
  state () {
    return JSON.parse(JSON.stringify(defineState))
  },
  getters: {
    getTableSelectList: (state: stateType) => {
      if (state.useDatabase) {
        return state.useData[state.useDatabase]
      } else return []
    },
    getFieldsSelectList: (state: stateType) => {
      if (state.useDatabase && state.useTable.length > 0) {
        const database = state.useData[state.useDatabase]
        const tableList: { group: string, fields: KeyValue[] }[] = []
        state.useTable.forEach((item: string) => {
          const arr = { group: item, fields: [] } as any
          const index = database.findIndex((item2: KeyValue) => item2.tablename === item)
          if (index !== -1) {
            arr.fields = database[index].fields
          }
          if (arr.fields && Array.isArray(arr.fields)) {
            state.fieldsAlias.forEach(item => {
              if (item.table === arr.group) {
                arr.fields.push({
                  name: item.name
                })
              }
            })
          }
          tableList.push(arr)
        })
        console.log(tableList)
        console.log(state.fieldsAlias)
        return tableList
      } else return []
    },
    getFlowDataInfo: (state: stateType) => state.dataFlowInfo,
    getFieldsByTable: (state: stateType) => (tableName: string | number) => {
      if (state.useDatabase) {
        const database = state.useData[state.useDatabase]
        if (tableName === 0 || tableName === '0') {
          const index = database.findIndex((item2: KeyValue) => item2.tablename === state.useTable[0])
          if (index === -1) return []
          else return database[index].fields
        } else {
          const index = database.findIndex((item2: KeyValue) => item2.tablename === tableName)
          if (index === -1) return []
          else return database[index].fields
        }
      } else return []
    },
    getUseTable: (state: stateType) => state.useTable,
    getUseDatabase: (state: stateType) => state.useDatabase
  },
  actions: {
    clearFieldsAlias () {
      this.$patch((state: stateType) => {
        state.fieldsAlias = []
      })
    },
    setFieldsAlias (field: { database: string, table: string, name: string, value: string }) {
      this.$patch((state: stateType) => {
        const i = state.fieldsAlias.findIndex(item => (item.database === field.database && item.table === field.table && item.name === field.value))
        if (i === -1) {
          state.fieldsAlias.push({
            database: field.database,
            table: field.table,
            name: field.value + '[as]'
          })
        }
      })
    },
    setGraph (graph: Graph) {
      this.$patch((state: stateType) => {
        state.graph = graph
      })
    },
    initState () {
      return new Promise((resolve) => {
        this.$patch((state: stateType) => {
          state.useData = []
          state.useDatabase = ``
          state.useTable = []
          state.rawData = []
          state.dataFlowInfo = []
          resolve(true)
        })
      })
    },
    clearUse () {
      return new Promise((resolve) => {
        this.$patch((state: stateType) => {
          state.useDatabase = ``
          state.useTable = []
          resolve(true)
        })
      })
    },
    setFlowDataInfo (info: KeyValue) {
      this.$patch((state: stateType) => state.dataFlowInfo = info)
    },
    setDatabaseInfo (dbName: string, clusterNodeId: string, schema: string) {
      return new Promise((resolve, reject) => {
        this.$patch((state: stateType) => {
          state.useDatabase = `${dbName}|,|${clusterNodeId}|,|${schema}`
          state.useTable = []
          if (!Object.keys(state.rawData).includes(`${dbName}|,|${clusterNodeId}|,|${schema}`)) {
            getTableList(dbName, clusterNodeId, schema).then((res: KeyValue) => {
              if (Number(res.code) === 200) {
                const arr = res.data.map((item: KeyValue) => ({ ...item, tables: {}}))
                state.rawData[`${dbName}|,|${clusterNodeId}|,|${schema}`] = arr
                state.useData[`${dbName}|,|${clusterNodeId}|,|${schema}`] = arr
                resolve(true)
              } else {
                Message.error(`database not found`)
                reject(true)
              }
            }).catch(() => {
              Message.error(`database not found`)
              reject(true)
            })
          } else {
            resolve(true)
          }
        })
      })
    },
    setDatabaseTableInfo (tableName: string, params?: KeyValue) {
      return new Promise(resolve => {
        this.$patch((state: stateType) => {
          if (tableName) {
            if (params && (params.tableKey || params.tableKey === 0)) state.useTable[params.tableKey] = tableName
            else {
              if (!(params && params.noUse)) state.useTable.push(tableName)
            }

            const index = state.rawData[state.useDatabase].findIndex((item: KeyValue) => item.tablename === tableName)
            if (!Object.keys(state.rawData[state.useDatabase][index].tables).includes(tableName)) {
              getTableFields(`${state.useDatabase.split('|,|').join('/')}/${tableName}`).then((res: KeyValue) => {
                resolve(true)
                state.rawData[state.useDatabase][index].fields = res.data
                state.useData[state.useDatabase][index].fields = res.data
              })
            } else resolve(false)
          } else resolve(false)
        })
      })
    },
    removeDatabaseTable (tableName: string) {
      return new Promise(resolve => {
        this.$patch((state: stateType) => {
          const index = state.useTable.indexOf(tableName)
          if (index !== -1) {
            state.useTable.splice(index, 1)
            resolve(true)
          } else resolve(false)
        })
      })
    }
  }
})