wangrong
2026-08-30 4c949c0dc9bcae785c281c9d8125295f09810b15
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
import { EnumValue, enumValueObj } from '@/api/dataset'
 
let filterEnumMap = {}
 
const filterIdNameEnumMap = {}
 
const findFilterEnum = async (val: EnumValue) => {
  const queryId = val.queryId
  const displayId = val.displayId
  const arr = await enumValueObj({ queryId: queryId, displayId: displayId, searchText: '' })
  return arr?.reduce((acc, item) => {
    acc[item[displayId]] = item[queryId]
    return acc
  }, {})
}
 
export const filterEnumParams = (queryParams, fieldId: string) => {
  const resultMap = filterEnumMap[fieldId]
  if (resultMap) {
    const resultParams = []
    queryParams.forEach(param => {
      resultParams.push(resultMap[param] || param)
    })
    return resultParams
  } else {
    return queryParams
  }
}
 
export const filterEnumParamsReduce = (queryParams, fieldId: string) => {
  const resultMap = filterEnumMap[fieldId]
  if (resultMap) {
    const resultMapReduce = Object.fromEntries(
      Object.entries(resultMap).map(([key, value]) => [value, key])
    )
    const resultParams = []
    queryParams.forEach(param => {
      resultParams.push(resultMapReduce[param] || param)
    })
    return resultParams
  } else {
    return queryParams
  }
}
 
export const filterEnumMapSync = async componentData => {
  filterEnumMap = {}
  for (const element of componentData) {
    if (element.component === 'VQuery') {
      for (const filterItem of element.propValue) {
        const { optionValueSource, field, displayId } = filterItem
        if (optionValueSource === 1 && field.id) {
          filterEnumMap[field.id] = await findFilterEnum({
            queryId: field.id,
            displayId,
            searchText: ''
          })
        }
      }
    }
  }
}
 
export function filterParamsOptions(params, paramsOption) {
  // 如果 params 为空,直接返回 null
  if (!params || (Array.isArray(params) && params.length === 0)) {
    return null
  }
  // 如果 paramsOption 为空,直接返回 null
  if (!paramsOption || paramsOption.length === 0) {
    return null
  }
  // 创建 paramsOption 集合和前缀集合用于快速查找
  const optionSet = new Set(paramsOption)
  const prefixSet = new Set()
  // 收集所有可能的父级前缀
  paramsOption.forEach(option => {
    if (option.includes('-de-')) {
      const parts = option.split('-de-')
      // 收集所有前缀:父级、祖父级等
      for (let i = 1; i < parts.length; i++) {
        const prefix = parts.slice(0, i).join('-de-')
        prefixSet.add(prefix)
      }
    }
  })
 
  // 检查一个值是否在 paramsOption 中存在(考虑层级关系)
  function checkValueExists(value) {
    // 直接存在
    if (optionSet.has(value)) {
      return true
    }
    // 如果是层级结构,检查所有父级前缀
    if (value.includes('-de-')) {
      const parts = value.split('-de-')
 
      // 检查所有可能的父级前缀
      for (let i = 1; i < parts.length; i++) {
        const prefix = parts.slice(0, i).join('-de-')
        if (optionSet.has(prefix)) {
          return true
        }
      }
    }
 
    // 检查该值是否是某个选项的父级
    // 如:paramsOption 中有 "香橙店-de-浓郁椰奶",传入 "香橙店" 也应该匹配
    if (
      Array.from(optionSet).some(option => option.startsWith(value + '-de-') || option === value)
    ) {
      return true
    }
    // 检查该值是否是某个选项的前缀(通过 prefixSet)
    if (prefixSet.has(value)) {
      return true
    }
    return false
  }
  // 处理单值情况(字符串)
  if (typeof params === 'string') {
    return checkValueExists(params) ? params : null
  }
  // 处理数组情况
  if (Array.isArray(params)) {
    // 过滤出存在的值
    const filtered = params.filter(value => typeof value === 'string' && checkValueExists(value))
    // 如果过滤后为空,返回 null,否则返回过滤后的数组
    return filtered.length > 0 ? filtered : null
  }
  // 其他类型返回 null
  return null
}