util.ts 1.7 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364
  1. import moment from 'moment'
  2. import { message } from 'antd'
  3. import { IFieldConfig } from './types'
  4. import { IQueryVariableMap } from 'app/containers/Dashboard/types'
  5. export function getDefaultFieldConfig (): IFieldConfig {
  6. return {
  7. alias: '',
  8. desc: '',
  9. useExpression: false
  10. }
  11. }
  12. export function extractQueryVariableNames (expression: string, withBoundaryToken: boolean = false) {
  13. const names = []
  14. if (!expression) { return names }
  15. const varReg = /\$(\w+)\$/g
  16. expression.replace(varReg, (match: string, p: string) => {
  17. const name = withBoundaryToken ? match : p
  18. if (!names.includes(name)) {
  19. names.push(name)
  20. }
  21. return name
  22. })
  23. return names
  24. }
  25. export function getFieldAlias (fieldConfig: IFieldConfig, queryVariableMap: IQueryVariableMap) {
  26. if (!fieldConfig) { return '' }
  27. const { alias, useExpression } = fieldConfig
  28. if (!useExpression) { return alias }
  29. const queryKeys = extractQueryVariableNames(alias, true)
  30. const keys = []
  31. const vals = []
  32. queryKeys.forEach((queryKey) => {
  33. keys.push(queryKey)
  34. const queryValue = queryVariableMap[queryKey]
  35. if (queryValue === undefined) {
  36. vals.push('')
  37. } else {
  38. vals.push(
  39. typeof queryValue === 'number'
  40. ? queryValue
  41. : queryValue.replace(/^(['"])|(['"])$/g, ''))
  42. }
  43. })
  44. const Moment = moment
  45. let funcBody = alias
  46. if (!alias.includes('return')) {
  47. funcBody = 'return ' + funcBody
  48. }
  49. const paramNames = ['Moment', ...keys, funcBody]
  50. try {
  51. const func = Function.apply(null, paramNames)
  52. const params = [Moment, ...vals]
  53. const dynamicAlias: string = func(...params)
  54. return dynamicAlias
  55. } catch (e) {
  56. message.error(`字段别名转换错误:${e.message}`)
  57. }
  58. }