zs
2025-04-29 716eeb4b87efbdc5b149410bbea4c1f35ac116ac
HIAWms/web/src/libs/Base/Base.ts
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,191 @@
import sdk from 'sdk'
import { ref, reactive, Ref, computed, onMounted, nextTick } from 'vue'
import { Create } from '@/libs/Create/Create'
import { globalState } from '../Store/Store'
const { request } = sdk.utils
// @ts-ignore
import compose from 'koa-compose'
let composeMiddleArray: any = []
let flag = 0
export class Base<
  T extends {
    [key: string]: any
  } = {}
> {
  // çŠ¶æ€
  [key: string]: any
  constructor(initState?: T) {
    if (initState) {
      this.initState(initState)
      // this.getVariable()
      this.onMounted && onMounted(this.onMounted.bind(this))
    }
  }
  /**
   * å…¨å±€çŠ¶æ€
   */
  //@ts-ignore
  static globalState: Record<string, any> = globalState
  /**
   * è¯·æ±‚request,request.get request.post...
   */
  static request = request
  /**
   * å˜é‡key
   */
  static MAP_KEY = 'varMap'
  /**
   * ç¼“存时间KEY
   */
  static CACHE_KEY = 'cacheKey'
  /**
   * ç¼“存时长,目前5分钟
   */
  static CACHE_TIME = 5 * 60 * 1000
  /**
   * ç³»ç»Ÿé…ç½®
   */
  baseSystemConfig = ref({})
  /**
   * åˆ¤æ–­æ˜¯å¦ä¸ºå¯¹è±¡
   * @param str
   * @returns
   */
  isStringAnObject(str: string) {
    try {
      const obj = JSON.parse(str)
      return typeof obj === 'object' && obj !== null
    } catch (e) {
      return false
    }
  }
  /**
   * æ ¹æ®name获取变量ID
   * @param name
   * @returns
   */
  static getVariableIdByName(name: string) {
    const map = globalState[Base.MAP_KEY]
    return map.get(name) || ''
  }
  /**
   * å°†å˜é‡è½¬æ¢æˆMap
   * @param args æ•°ç»„
   * @returns
   */
  private transformArrayToMap(args: any[]) {
    const map = new Map()
    args.forEach((item) => {
      map.set(item.name, item.id)
    })
    return map
  }
  /**
   * æŸ¥è¯¢å˜é‡ï¼Œ5分钟缓存
   * @param next
   * @returns
   */
  private async queryVariable(next: () => void) {
    const size = this.getState(Base.MAP_KEY)?.size
    const t = this.getState(Base.CACHE_KEY) || Date.now()
    flag++
    this.clear()
    // ç¼“存一分钟,如果下次重新请求,则更新
    if (size > 0 && Date.now() - t < Base.CACHE_TIME) return next && next()
    try {
      const vars = await request.get('/api/v1/variable/query')
      const varMap = this.transformArrayToMap(vars.result)
      this.setState(Base.CACHE_KEY, Date.now())
      this.setState(Base.MAP_KEY, varMap)
      next && next()
    } catch (error) {
      // next()
      console.error(error, '变量查询接口报错,暂停请求')
    }
  }
  /**
   * æ¸…理全局参数
   */
  private clear() {
    if (flag === composeMiddleArray.length) {
      composeMiddleArray = []
      flag = 0
    }
  }
  /**
   * èŽ·å–å˜é‡æŒ‰é˜Ÿåˆ—æ‰§è¡Œ
   */
  private async getVariable() {
    composeMiddleArray.push((context: any, next: () => void) =>
      this.queryVariable(next)
    )
    nextTick(() => {
      if (!flag) {
        const fn = compose(composeMiddleArray)
        fn()
      }
    })
  }
  private initState(state = {}) {
    const entry = Object.entries(state)
    if (Array.isArray(entry)) {
      entry.forEach(([key, value]) => {
        this[key] = ref(value)
      })
    }
  }
  // çŠ¶æ€
  /**
   * èŽ·å–çŠ¶æ€å€¼
   * @param key key
   * @returns any
   */
  getState(key: string | any) {
    return Base.globalState[key]
  }
  /**
   * ä¿®æ”¹çŠ¶æ€
   * @param key key
   * @param value value
   * @returns void
   */
  setState(key: string | any, value: any) {
    return (Base.globalState[key] = ref(value))
  }
  removeState(key: string) {
    if (!key) return
    return delete Base.globalState[key]
  }
  /**
   * åˆå§‹åŒ–对象
   * @param data
   * @returns
   */
  createObject(data: string | number | any[][] | any) {
    return new Create(data)
  }
  /**
   * èŽ·å–ç”¨æˆ·ä¿¡æ¯
   */
  get userInfo() {
    return sdk.userInfo || {}
  }
  // useVModels
}