@netang/quasar 0.2.54 → 0.2.57

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -1,603 +1,603 @@
1
- import $n_has from 'lodash/has'
2
- import $n_isArray from 'lodash/isArray'
3
- import $n_cloneDeep from 'lodash/cloneDeep'
4
- import $n_merge from 'lodash/merge'
5
- import $n_isFunction from 'lodash/isFunction'
6
- import $n_findIndex from 'lodash/findIndex'
7
-
8
- import $n_forEach from '@netang/utils/forEach'
9
- import $n_split from '@netang/utils/split'
10
- import $n_isJson from '@netang/utils/isJson'
11
- import $n_json from '@netang/utils/json'
12
- import $n_indexOf from '@netang/utils/indexOf'
13
-
14
- import $n_isRequired from '@netang/utils/isRequired'
15
- import $n_forIn from '@netang/utils/forIn'
16
- import $n_runAsync from '@netang/utils/runAsync'
17
- import $n_isValidObject from '@netang/utils/isValidObject'
18
- import $n_isValidArray from '@netang/utils/isValidArray'
19
- import $n_isValidValue from '@netang/utils/isValidValue'
20
- import $n_trimString from '@netang/utils/trimString'
21
- import $n_numberDeep from '@netang/utils/numberDeep'
22
- import $n_toDate from '@netang/utils/toDate'
23
- import $n_replaceAll from '@netang/utils/replaceAll'
24
-
25
- import { date as quasarDate } from 'quasar'
26
- import { getQuickRange, quickRange } from '../components/field-date/methods'
27
-
28
- import $n_dictOptions from './dictOptions'
29
- import { configs } from './config'
30
-
31
- const {
32
- // 字典常量
33
- dicts,
34
- } = configs
35
-
36
- /**
37
- * 比较类型默认值
38
- */
39
- const COMPARE_TYPE_MAPS = {
40
- // 数字
41
- number: dicts.SEARCH_COMPARE_TYPE__EQUAL,
42
- // 文字
43
- text: dicts.SEARCH_COMPARE_TYPE__LIKE,
44
- // 价格
45
- price: dicts.SEARCH_COMPARE_TYPE__EQUAL,
46
- // 日期
47
- date: dicts.SEARCH_COMPARE_TYPE__EQUAL,
48
- }
49
-
50
- /**
51
- * 设置单个比较条件
52
- */
53
- function setItemCompare(item) {
54
-
55
- // 初始比较条件数组
56
- let opts1 = item.type === 'text'
57
- // 如果类型为 文字
58
- ? [
59
- { label: '相同', value: dicts.SEARCH_COMPARE_TYPE__EQUAL },
60
- { label: '不同', value: dicts.SEARCH_COMPARE_TYPE__NOT_EQUAL },
61
- { label: '包含', value: dicts.SEARCH_COMPARE_TYPE__LIKE },
62
- { label: '不含', value: dicts.SEARCH_COMPARE_TYPE__NOT_LIKE },
63
- ]
64
- // 否则为数字
65
- : [
66
- { label: '=', value: dicts.SEARCH_COMPARE_TYPE__EQUAL },
67
- { label: '!=', value: dicts.SEARCH_COMPARE_TYPE__NOT_EQUAL },
68
- { label: '>', value: dicts.SEARCH_COMPARE_TYPE__GT },
69
- { label: '≥', value: dicts.SEARCH_COMPARE_TYPE__GTE },
70
- { label: '<', value: dicts.SEARCH_COMPARE_TYPE__LT },
71
- { label: '≤', value: dicts.SEARCH_COMPARE_TYPE__LTE },
72
- ]
73
-
74
- // 如果类型为日期
75
- if (item.type === 'date') {
76
- // 添加日期快捷选项
77
- $n_forEach(quickRange, function(label, key) {
78
- opts1.push({ label, value: key + 20 })
79
- })
80
-
81
- // 否则为其他
82
- } else {
83
- opts1.push(
84
- { label: 'IN', value: dicts.SEARCH_COMPARE_TYPE__IN },
85
- { label: 'NOT IN', value: dicts.SEARCH_COMPARE_TYPE__NOT_IN },
86
- )
87
- }
88
-
89
- // 如果有比较类型
90
- if (
91
- $n_has(item, 'compare')
92
- && $n_isValidArray(item.compare)
93
- ) {
94
- const {
95
- compare,
96
- compareIgnore
97
- } = item
98
-
99
- // 如果有筛选比较条件
100
- // 筛选比较条件
101
- opts1 = opts1.filter(
102
- compareIgnore === true
103
- // 如果为忽略比较条件
104
- ? e => compare.indexOf(e.value) === -1
105
- // 否则为限制比较条件
106
- : e => compare.indexOf(e.value) > -1
107
- )
108
- }
109
-
110
- // 如果没有比较选项, 则设置相同为默认
111
- if (! opts1.length) {
112
- opts1.push({ label: type === 'text' ? '相同' : '=', value: dicts.SEARCH_COMPARE_TYPE__EQUAL })
113
- }
114
-
115
- // 值1 比较类型条件
116
- item.compareOptions1 = opts1
117
- // 值2 比较类型条件
118
- item.compareOptions2 = []
119
-
120
- if (
121
- // 如果比较类型有 >
122
- $n_findIndex(opts1, { value: dicts.SEARCH_COMPARE_TYPE__GT }) > -1
123
- // 如果比较类型有 >=
124
- || $n_findIndex(opts1, { value: dicts.SEARCH_COMPARE_TYPE__GTE }) > -1
125
- ) {
126
- item.compareOptions2.push(
127
- { label: '<', value: dicts.SEARCH_COMPARE_TYPE__LT },
128
- { label: '≤', value: dicts.SEARCH_COMPARE_TYPE__LTE },
129
- )
130
- }
131
- }
132
-
133
- /**
134
- * 设置单个搜索值
135
- */
136
- export function setItemValue(value, val) {
137
-
138
- // 如果值为数组
139
- if (Array.isArray(val)) {
140
-
141
- // 比较类型为 in
142
- value[0].compare = dicts.SEARCH_COMPARE_TYPE__IN
143
-
144
- } else {
145
-
146
- // 如果值是逗号隔开
147
- const arr = $n_split(val, ',')
148
- if (arr.length > 1) {
149
- // 比较类型为 in
150
- value[0].compare = dicts.SEARCH_COMPARE_TYPE__IN
151
- val = arr
152
-
153
- // 否则为单个值
154
- } else {
155
-
156
- // 比较类型为 ==
157
- value[0].compare = dicts.SEARCH_COMPARE_TYPE__EQUAL
158
- }
159
- }
160
-
161
- // 设置值为当前值
162
- value[0].value = $n_numberDeep(val)
163
- }
164
-
165
- /**
166
- * 格式化单个比较条件
167
- */
168
- function formatItemValueCompare(value, { compareOptions1 }) {
169
-
170
- // 获取第一个值
171
- const value1 = value[0]
172
-
173
- // 如果值1 的比较条件不在值1 的限制范围内
174
- if ($n_findIndex(compareOptions1, { value: value1.compare }) === -1) {
175
- // 则取比较条件中的第一个
176
- value1.compare = compareOptions1[0].value
177
- }
178
-
179
- // 如果比较类型不为 in / not in
180
- if ($n_indexOf([ dicts.SEARCH_COMPARE_TYPE__IN, dicts.SEARCH_COMPARE_TYPE__NOT_IN ], value1.compare) === -1) {
181
- // 如果值中含有逗号
182
- const arr = $n_split(value1.value, ',')
183
- if (arr.length > 1) {
184
- value1.value = arr[0]
185
- }
186
- }
187
-
188
- // 如果值1 比较类型为 >
189
- if (value1.compare === dicts.SEARCH_COMPARE_TYPE__GT) {
190
- // 则修改值2 类型为 <
191
- value[1].compare = dicts.SEARCH_COMPARE_TYPE__LT
192
-
193
- // 如果值1 比较类型为 >=
194
- } else if (value1.compare === dicts.SEARCH_COMPARE_TYPE__GTE) {
195
- // 则修改值2 类型为 <=
196
- value[1].compare = dicts.SEARCH_COMPARE_TYPE__LTE
197
- }
198
- }
199
-
200
- /**
201
- * 从表格列获取原始值
202
- */
203
- export function getRawData(tableColumns, query, searchFromQuery = true) {
204
-
205
- // 原始参数
206
- const rawQuery = {}
207
- // 原始表格搜索参数
208
- const rawSearchOptions = []
209
- // 原始表格搜索值(空表格搜索值, 用于搜索重置)
210
- const rawTableSearchValue = []
211
- // 首次表格搜索值(如果表格搜索参数中带了初始值, 则设置初始值)
212
- const firstTableSearchValue = []
213
-
214
- // 搜索参数键值数组
215
- const searchQueryKey = []
216
-
217
- $n_forEach(tableColumns, function (item) {
218
- if ($n_has(item, 'search.type')) {
219
-
220
- // 【设置原始表格搜索参数】
221
- // --------------------------------------------------
222
-
223
- // 搜索参数
224
- const newItem = $n_merge({
225
- // 标签
226
- label: item.label,
227
- }, item.search)
228
-
229
- // 标识
230
- newItem.name = $n_has(newItem, 'name') ? newItem.name : item.name
231
-
232
- // 如果有字典标识
233
- if ($n_has(item, 'dict')) {
234
- newItem.dict = item.dict
235
- }
236
-
237
- // 设置单个比较条件
238
- setItemCompare(newItem)
239
-
240
- // 原始表格搜索参数
241
- rawSearchOptions.push(newItem)
242
-
243
- // 【原始表格搜索值】
244
- // --------------------------------------------------
245
-
246
- let value = [
247
- // 值1
248
- {
249
- // 比较类型
250
- compare: COMPARE_TYPE_MAPS[newItem.type],
251
- // 值
252
- value: '',
253
- },
254
- // 值2
255
- {
256
- // 比较类型
257
- compare: dicts.SEARCH_COMPARE_TYPE__LT,
258
- // 值
259
- value: '',
260
- },
261
- ]
262
-
263
- // 如果是日期
264
- if (newItem.type === 'date') {
265
- // 设置日期类型
266
- value[0].dateType = 'day'
267
- }
268
-
269
- // 添加原始表格搜索值
270
- rawTableSearchValue.push($n_cloneDeep(value))
271
-
272
- if (
273
- // 如果开启从参数中获取搜索值
274
- searchFromQuery
275
- // 如果在传参中有搜索参数
276
- && $n_has(query, newItem.name)
277
- ) {
278
- let newVal = query[newItem.name]
279
-
280
- // 如果有值
281
- if ($n_isRequired(newVal)) {
282
-
283
- newVal = decodeURIComponent(newVal)
284
- if ($n_isJson(newVal)) {
285
- $n_forEach($n_json.parse(newVal), function (v, i) {
286
-
287
- if (
288
- i <= 1
289
- && $n_isValidArray(v)
290
- && v.length >= 2
291
- ) {
292
- let newVal = v[1]
293
-
294
- // 如果比较类型为 in / not in
295
- if ($n_indexOf([ dicts.SEARCH_COMPARE_TYPE__IN, dicts.SEARCH_COMPARE_TYPE__NOT_IN ], v[0]) > -1) {
296
- // 如果不为数组
297
- if (! Array.isArray(v[1])) {
298
- newVal = $n_split(newVal, ',')
299
- }
300
-
301
- } else if (! $n_isRequired(newVal)) {
302
- newVal = ''
303
- }
304
-
305
- value[i] = {
306
- compare: v[0],
307
- value: $n_numberDeep(newVal),
308
- }
309
- }
310
- })
311
-
312
- } else {
313
- // 设置单个搜索值
314
- setItemValue(value, newVal)
315
- }
316
- }
317
-
318
- // 设置参数中搜索的 key
319
- searchQueryKey.push(newItem.name)
320
-
321
- // 否则, 如果表格参数中有设置初始值
322
- } else if (
323
- $n_has(newItem, 'value')
324
- && $n_isValidArray(newItem.value)
325
- ) {
326
- value = $n_merge([], value, newItem.value)
327
- }
328
-
329
- // 格式化单个值的比较条件
330
- formatItemValueCompare(value, newItem)
331
-
332
- // 首次初始表格搜索值
333
- firstTableSearchValue.push(value)
334
- }
335
- })
336
-
337
- if (searchQueryKey.length) {
338
- $n_forIn(query, function(val, key) {
339
- if (searchQueryKey.indexOf(key) === -1) {
340
- rawQuery[key] = val
341
- }
342
- })
343
- } else {
344
- Object.assign(rawQuery, query)
345
- }
346
-
347
- return {
348
- // 原始参数
349
- rawQuery,
350
- // 原始表格搜索参数
351
- rawSearchOptions,
352
- // 原始表格搜索值(空表格搜索值, 用于搜索重置)
353
- rawTableSearchValue,
354
- // 首次表格搜索值(如果表格搜索参数中带了初始值, 则设置初始值)
355
- firstTableSearchValue,
356
- }
357
- }
358
-
359
- /**
360
- * 获取参数
361
- */
362
- export async function getOptions(rawSearchOptions, format) {
363
-
364
- const lists = []
365
-
366
- if ($n_isValidArray(rawSearchOptions)) {
367
- for (const item of rawSearchOptions) {
368
-
369
- const newItem = Object.assign({}, item)
370
-
371
- // 格式化单个参数
372
- if ($n_isFunction(format)) {
373
- const res = await $n_runAsync(format)(newItem)
374
- if ($n_isValidObject(res)) {
375
- $n_merge(newItem, res)
376
- }
377
- }
378
-
379
- // 如果有字典标识, 则一定是下拉菜单
380
- if ($n_has(newItem, 'dict')) {
381
- $n_merge(newItem, {
382
- searchType: 'select',
383
- select: {
384
- options: $n_isArray(newItem.dict) ? newItem.dict : $n_dictOptions(newItem.dict),
385
- },
386
- })
387
-
388
- // 如果有下拉菜单选项
389
- } else if ($n_has(newItem, 'select')) {
390
- newItem.searchType = 'select'
391
- newItem.select = Object.assign({
392
- options: [],
393
- }, newItem.select)
394
-
395
- // 如果下拉选项是方法
396
- if ($n_isFunction(newItem.select.options)) {
397
- // 读取下拉选项
398
- newItem.select.options = await $n_runAsync(newItem.select.options)()
399
- }
400
-
401
- // 如果有树选项(调用的是 <n-field-tree> 组件)
402
- } else if ($n_has(newItem, 'tree')) {
403
- newItem.searchType = 'tree'
404
- newItem.tree = Object.assign({
405
- nodes: [],
406
- accordion: true,
407
- clearable: true,
408
- }, newItem.tree)
409
-
410
- // 如果有表格选项(调用的是 <n-field-table.md> 组件)
411
- } else if ($n_has(newItem, 'table')) {
412
- newItem.searchType = 'table'
413
- newItem.table = Object.assign({
414
- // 值字段(必填)
415
- valueKey: newItem.name,
416
- // 是否可清除
417
- clearable: true,
418
- // 是否开启筛选
419
- filter: true,
420
- }, newItem.table)
421
-
422
- // 否则为输入框
423
- } else {
424
- newItem.searchType = 'input'
425
- newItem.input = Object.assign({}, newItem.input)
426
- }
427
-
428
- lists.push(newItem)
429
- }
430
- }
431
-
432
- return lists
433
- }
434
-
435
- /**
436
- * 格式化值
437
- */
438
- export function formatValue(rawSearchOptions, searchValue) {
439
-
440
- const lists = []
441
-
442
- $n_forEach(rawSearchOptions, function ({ name, type }, itemIndex) {
443
-
444
- // 添加值1
445
- function addValue1(value1) {
446
-
447
- // 如果有值1
448
- if ($n_isRequired(value1.value)) {
449
-
450
- // 如果值1 类型为 in / not in
451
- if ($n_indexOf([dicts.SEARCH_COMPARE_TYPE__IN, dicts.SEARCH_COMPARE_TYPE__NOT_IN], value1.compare) > -1) {
452
-
453
- const vals = []
454
-
455
- const values = $n_isArray(value1.value) ? value1.value : $n_split($n_replaceAll($n_trimString(value1.value), ',', ','), ',')
456
- $n_forEach(values, function (item) {
457
- item = $n_numberDeep(item)
458
- if ($n_isValidValue(item)) {
459
- vals.push(item)
460
- }
461
- })
462
-
463
- if (vals.length) {
464
- lists.push({
465
- field: name,
466
- compare: value1.compare,
467
- value: vals,
468
- })
469
- }
470
- return
471
- }
472
-
473
- // 否则添加值1
474
- lists.push({
475
- field: name,
476
- compare: value1.compare,
477
- value: $n_numberDeep(value1.value),
478
- })
479
- }
480
- }
481
-
482
- // 第一个值
483
- const value1 = searchValue[itemIndex][0]
484
-
485
- // 如果是文字
486
- if (type === 'text') {
487
- // 添加值1
488
- addValue1(value1)
489
-
490
- // 否则为数字
491
- } else {
492
-
493
- // 如果是日期
494
- if (type === 'date') {
495
-
496
- // 如果 为 == || !=
497
- const isEqual = value1.compare === dicts.SEARCH_COMPARE_TYPE__EQUAL
498
- if (isEqual || value1.compare === dicts.SEARCH_COMPARE_TYPE__NOT_EQUAL) {
499
- const { value, dateType } = value1
500
- if ($n_isRequired(value)) {
501
-
502
- // 当前时间
503
- const now = $n_toDate(value)
504
-
505
- let end
506
- switch (dateType) {
507
- // 年
508
- case 'year':
509
- // 月
510
- case 'month':
511
- // 日
512
- case 'day':
513
- end = quasarDate.endOfDate(now, dateType)
514
- break
515
- // 分
516
- case 'datetime':
517
- end = $n_toDate(quasarDate.formatDate(now, 'YYYY/MM/DD HH:mm:59'))
518
- break
519
- }
520
-
521
- let compare1
522
- let compare2
523
-
524
- // 如果为 ==
525
- if (isEqual) {
526
- // ≥
527
- compare1 = dicts.SEARCH_COMPARE_TYPE__GTE
528
- // ≤
529
- compare2 = dicts.SEARCH_COMPARE_TYPE__LTE
530
-
531
- // 否则为 !=
532
- } else {
533
- // <
534
- compare1 = dicts.SEARCH_COMPARE_TYPE__LT
535
- // >
536
- compare2 = dicts.SEARCH_COMPARE_TYPE__GT
537
- }
538
-
539
- lists.push(
540
- // 日期起
541
- {
542
- field: name,
543
- // ≥
544
- compare: compare1,
545
- value,
546
- },
547
- // 日期止
548
- {
549
- field: name,
550
- // ≤
551
- compare: compare2,
552
- value: $n_numberDeep(quasarDate.formatDate(end, 'X')),
553
- }
554
- )
555
- }
556
- return
557
-
558
- // 如果类型为快捷日期
559
- } else if (value1.compare >= 20) {
560
-
561
- const res = getQuickRange(value1.compare - 20, true)
562
- if (res) {
563
-
564
- lists.push(
565
- // 日期起
566
- {
567
- field: name,
568
- // ≥
569
- compare: dicts.SEARCH_COMPARE_TYPE__GTE,
570
- value: $n_numberDeep(quasarDate.formatDate($n_toDate(`${res.date.from} ${res.time.from}`), 'X')),
571
- },
572
- // 日期止
573
- {
574
- field: name,
575
- // ≤
576
- compare: dicts.SEARCH_COMPARE_TYPE__LTE,
577
- value: $n_numberDeep(quasarDate.formatDate($n_toDate(`${res.date.to} ${res.time.to}`), 'X')),
578
- }
579
- )
580
- }
581
- return
582
- }
583
- }
584
-
585
- // 添加值1
586
- addValue1(value1)
587
-
588
- // 只有值1 类型为 > / ≥ 值2才有效
589
- if ($n_indexOf([dicts.SEARCH_COMPARE_TYPE__GT, dicts.SEARCH_COMPARE_TYPE__GTE], value1.compare) > -1) {
590
- const value2 = searchValue[itemIndex][1]
591
- if ($n_isValidValue(value2.value)) {
592
- lists.push({
593
- field: name,
594
- compare: value2.compare,
595
- value: $n_numberDeep(value2.value),
596
- })
597
- }
598
- }
599
- }
600
- })
601
-
602
- return lists
603
- }
1
+ import $n_has from 'lodash/has'
2
+ import $n_isArray from 'lodash/isArray'
3
+ import $n_cloneDeep from 'lodash/cloneDeep'
4
+ import $n_merge from 'lodash/merge'
5
+ import $n_isFunction from 'lodash/isFunction'
6
+ import $n_findIndex from 'lodash/findIndex'
7
+
8
+ import $n_forEach from '@netang/utils/forEach'
9
+ import $n_split from '@netang/utils/split'
10
+ import $n_isJson from '@netang/utils/isJson'
11
+ import $n_json from '@netang/utils/json'
12
+ import $n_indexOf from '@netang/utils/indexOf'
13
+
14
+ import $n_isRequired from '@netang/utils/isRequired'
15
+ import $n_forIn from '@netang/utils/forIn'
16
+ import $n_runAsync from '@netang/utils/runAsync'
17
+ import $n_isValidObject from '@netang/utils/isValidObject'
18
+ import $n_isValidArray from '@netang/utils/isValidArray'
19
+ import $n_isValidValue from '@netang/utils/isValidValue'
20
+ import $n_trimString from '@netang/utils/trimString'
21
+ import $n_numberDeep from '@netang/utils/numberDeep'
22
+ import $n_toDate from '@netang/utils/toDate'
23
+ import $n_replaceAll from '@netang/utils/replaceAll'
24
+
25
+ import { date as quasarDate } from 'quasar'
26
+ import { getQuickRange, quickRange } from '../components/field-date/methods'
27
+
28
+ import $n_dictOptions from './dictOptions'
29
+ import { configs } from './config'
30
+
31
+ const {
32
+ // 字典常量
33
+ dicts,
34
+ } = configs
35
+
36
+ /**
37
+ * 比较类型默认值
38
+ */
39
+ const COMPARE_TYPE_MAPS = {
40
+ // 数字
41
+ number: dicts.SEARCH_COMPARE_TYPE__EQUAL,
42
+ // 文字
43
+ text: dicts.SEARCH_COMPARE_TYPE__LIKE,
44
+ // 价格
45
+ price: dicts.SEARCH_COMPARE_TYPE__EQUAL,
46
+ // 日期
47
+ date: dicts.SEARCH_COMPARE_TYPE__EQUAL,
48
+ }
49
+
50
+ /**
51
+ * 设置单个比较条件
52
+ */
53
+ function setItemCompare(item) {
54
+
55
+ // 初始比较条件数组
56
+ let opts1 = item.type === 'text'
57
+ // 如果类型为 文字
58
+ ? [
59
+ { label: '相同', value: dicts.SEARCH_COMPARE_TYPE__EQUAL },
60
+ { label: '不同', value: dicts.SEARCH_COMPARE_TYPE__NOT_EQUAL },
61
+ { label: '包含', value: dicts.SEARCH_COMPARE_TYPE__LIKE },
62
+ { label: '不含', value: dicts.SEARCH_COMPARE_TYPE__NOT_LIKE },
63
+ ]
64
+ // 否则为数字
65
+ : [
66
+ { label: '=', value: dicts.SEARCH_COMPARE_TYPE__EQUAL },
67
+ { label: '!=', value: dicts.SEARCH_COMPARE_TYPE__NOT_EQUAL },
68
+ { label: '>', value: dicts.SEARCH_COMPARE_TYPE__GT },
69
+ { label: '≥', value: dicts.SEARCH_COMPARE_TYPE__GTE },
70
+ { label: '<', value: dicts.SEARCH_COMPARE_TYPE__LT },
71
+ { label: '≤', value: dicts.SEARCH_COMPARE_TYPE__LTE },
72
+ ]
73
+
74
+ // 如果类型为日期
75
+ if (item.type === 'date') {
76
+ // 添加日期快捷选项
77
+ $n_forEach(quickRange, function(label, key) {
78
+ opts1.push({ label, value: key + 20 })
79
+ })
80
+
81
+ // 否则为其他
82
+ } else {
83
+ opts1.push(
84
+ { label: 'IN', value: dicts.SEARCH_COMPARE_TYPE__IN },
85
+ { label: 'NOT IN', value: dicts.SEARCH_COMPARE_TYPE__NOT_IN },
86
+ )
87
+ }
88
+
89
+ // 如果有比较类型
90
+ if (
91
+ $n_has(item, 'compare')
92
+ && $n_isValidArray(item.compare)
93
+ ) {
94
+ const {
95
+ compare,
96
+ compareIgnore
97
+ } = item
98
+
99
+ // 如果有筛选比较条件
100
+ // 筛选比较条件
101
+ opts1 = opts1.filter(
102
+ compareIgnore === true
103
+ // 如果为忽略比较条件
104
+ ? e => compare.indexOf(e.value) === -1
105
+ // 否则为限制比较条件
106
+ : e => compare.indexOf(e.value) > -1
107
+ )
108
+ }
109
+
110
+ // 如果没有比较选项, 则设置相同为默认
111
+ if (! opts1.length) {
112
+ opts1.push({ label: type === 'text' ? '相同' : '=', value: dicts.SEARCH_COMPARE_TYPE__EQUAL })
113
+ }
114
+
115
+ // 值1 比较类型条件
116
+ item.compareOptions1 = opts1
117
+ // 值2 比较类型条件
118
+ item.compareOptions2 = []
119
+
120
+ if (
121
+ // 如果比较类型有 >
122
+ $n_findIndex(opts1, { value: dicts.SEARCH_COMPARE_TYPE__GT }) > -1
123
+ // 如果比较类型有 >=
124
+ || $n_findIndex(opts1, { value: dicts.SEARCH_COMPARE_TYPE__GTE }) > -1
125
+ ) {
126
+ item.compareOptions2.push(
127
+ { label: '<', value: dicts.SEARCH_COMPARE_TYPE__LT },
128
+ { label: '≤', value: dicts.SEARCH_COMPARE_TYPE__LTE },
129
+ )
130
+ }
131
+ }
132
+
133
+ /**
134
+ * 设置单个搜索值
135
+ */
136
+ export function setItemValue(value, val) {
137
+
138
+ // 如果值为数组
139
+ if (Array.isArray(val)) {
140
+
141
+ // 比较类型为 in
142
+ value[0].compare = dicts.SEARCH_COMPARE_TYPE__IN
143
+
144
+ } else {
145
+
146
+ // 如果值是逗号隔开
147
+ const arr = $n_split(val, ',')
148
+ if (arr.length > 1) {
149
+ // 比较类型为 in
150
+ value[0].compare = dicts.SEARCH_COMPARE_TYPE__IN
151
+ val = arr
152
+
153
+ // 否则为单个值
154
+ } else {
155
+
156
+ // 比较类型为 ==
157
+ value[0].compare = dicts.SEARCH_COMPARE_TYPE__EQUAL
158
+ }
159
+ }
160
+
161
+ // 设置值为当前值
162
+ value[0].value = $n_numberDeep(val)
163
+ }
164
+
165
+ /**
166
+ * 格式化单个比较条件
167
+ */
168
+ function formatItemValueCompare(value, { compareOptions1 }) {
169
+
170
+ // 获取第一个值
171
+ const value1 = value[0]
172
+
173
+ // 如果值1 的比较条件不在值1 的限制范围内
174
+ if ($n_findIndex(compareOptions1, { value: value1.compare }) === -1) {
175
+ // 则取比较条件中的第一个
176
+ value1.compare = compareOptions1[0].value
177
+ }
178
+
179
+ // 如果比较类型不为 in / not in
180
+ if ($n_indexOf([ dicts.SEARCH_COMPARE_TYPE__IN, dicts.SEARCH_COMPARE_TYPE__NOT_IN ], value1.compare) === -1) {
181
+ // 如果值中含有逗号
182
+ const arr = $n_split(value1.value, ',')
183
+ if (arr.length > 1) {
184
+ value1.value = arr[0]
185
+ }
186
+ }
187
+
188
+ // 如果值1 比较类型为 >
189
+ if (value1.compare === dicts.SEARCH_COMPARE_TYPE__GT) {
190
+ // 则修改值2 类型为 <
191
+ value[1].compare = dicts.SEARCH_COMPARE_TYPE__LT
192
+
193
+ // 如果值1 比较类型为 >=
194
+ } else if (value1.compare === dicts.SEARCH_COMPARE_TYPE__GTE) {
195
+ // 则修改值2 类型为 <=
196
+ value[1].compare = dicts.SEARCH_COMPARE_TYPE__LTE
197
+ }
198
+ }
199
+
200
+ /**
201
+ * 从表格列获取原始值
202
+ */
203
+ export function getRawData(tableColumns, query, searchFromQuery = true) {
204
+
205
+ // 原始参数
206
+ const rawQuery = {}
207
+ // 原始表格搜索参数
208
+ const rawSearchOptions = []
209
+ // 原始表格搜索值(空表格搜索值, 用于搜索重置)
210
+ const rawTableSearchValue = []
211
+ // 首次表格搜索值(如果表格搜索参数中带了初始值, 则设置初始值)
212
+ const firstTableSearchValue = []
213
+
214
+ // 搜索参数键值数组
215
+ const searchQueryKey = []
216
+
217
+ $n_forEach(tableColumns, function (item) {
218
+ if ($n_has(item, 'search.type')) {
219
+
220
+ // 【设置原始表格搜索参数】
221
+ // --------------------------------------------------
222
+
223
+ // 搜索参数
224
+ const newItem = $n_merge({
225
+ // 标签
226
+ label: item.label,
227
+ }, item.search)
228
+
229
+ // 标识
230
+ newItem.name = $n_has(newItem, 'name') ? newItem.name : item.name
231
+
232
+ // 如果有字典标识
233
+ if ($n_has(item, 'dict')) {
234
+ newItem.dict = item.dict
235
+ }
236
+
237
+ // 设置单个比较条件
238
+ setItemCompare(newItem)
239
+
240
+ // 原始表格搜索参数
241
+ rawSearchOptions.push(newItem)
242
+
243
+ // 【原始表格搜索值】
244
+ // --------------------------------------------------
245
+
246
+ let value = [
247
+ // 值1
248
+ {
249
+ // 比较类型
250
+ compare: COMPARE_TYPE_MAPS[newItem.type],
251
+ // 值
252
+ value: '',
253
+ },
254
+ // 值2
255
+ {
256
+ // 比较类型
257
+ compare: dicts.SEARCH_COMPARE_TYPE__LT,
258
+ // 值
259
+ value: '',
260
+ },
261
+ ]
262
+
263
+ // 如果是日期
264
+ if (newItem.type === 'date') {
265
+ // 设置日期类型
266
+ value[0].dateType = 'day'
267
+ }
268
+
269
+ // 添加原始表格搜索值
270
+ rawTableSearchValue.push($n_cloneDeep(value))
271
+
272
+ if (
273
+ // 如果开启从参数中获取搜索值
274
+ searchFromQuery
275
+ // 如果在传参中有搜索参数
276
+ && $n_has(query, newItem.name)
277
+ ) {
278
+ let newVal = query[newItem.name]
279
+
280
+ // 如果有值
281
+ if ($n_isRequired(newVal)) {
282
+
283
+ newVal = decodeURIComponent(newVal)
284
+ if ($n_isJson(newVal)) {
285
+ $n_forEach($n_json.parse(newVal), function (v, i) {
286
+
287
+ if (
288
+ i <= 1
289
+ && $n_isValidArray(v)
290
+ && v.length >= 2
291
+ ) {
292
+ let newVal = v[1]
293
+
294
+ // 如果比较类型为 in / not in
295
+ if ($n_indexOf([ dicts.SEARCH_COMPARE_TYPE__IN, dicts.SEARCH_COMPARE_TYPE__NOT_IN ], v[0]) > -1) {
296
+ // 如果不为数组
297
+ if (! Array.isArray(v[1])) {
298
+ newVal = $n_split(newVal, ',')
299
+ }
300
+
301
+ } else if (! $n_isRequired(newVal)) {
302
+ newVal = ''
303
+ }
304
+
305
+ value[i] = {
306
+ compare: v[0],
307
+ value: $n_numberDeep(newVal),
308
+ }
309
+ }
310
+ })
311
+
312
+ } else {
313
+ // 设置单个搜索值
314
+ setItemValue(value, newVal)
315
+ }
316
+ }
317
+
318
+ // 设置参数中搜索的 key
319
+ searchQueryKey.push(newItem.name)
320
+
321
+ // 否则, 如果表格参数中有设置初始值
322
+ } else if (
323
+ $n_has(newItem, 'value')
324
+ && $n_isValidArray(newItem.value)
325
+ ) {
326
+ value = $n_merge([], value, newItem.value)
327
+ }
328
+
329
+ // 格式化单个值的比较条件
330
+ formatItemValueCompare(value, newItem)
331
+
332
+ // 首次初始表格搜索值
333
+ firstTableSearchValue.push(value)
334
+ }
335
+ })
336
+
337
+ if (searchQueryKey.length) {
338
+ $n_forIn(query, function(val, key) {
339
+ if (searchQueryKey.indexOf(key) === -1) {
340
+ rawQuery[key] = val
341
+ }
342
+ })
343
+ } else {
344
+ Object.assign(rawQuery, query)
345
+ }
346
+
347
+ return {
348
+ // 原始参数
349
+ rawQuery,
350
+ // 原始表格搜索参数
351
+ rawSearchOptions,
352
+ // 原始表格搜索值(空表格搜索值, 用于搜索重置)
353
+ rawTableSearchValue,
354
+ // 首次表格搜索值(如果表格搜索参数中带了初始值, 则设置初始值)
355
+ firstTableSearchValue,
356
+ }
357
+ }
358
+
359
+ /**
360
+ * 获取参数
361
+ */
362
+ export async function getOptions(rawSearchOptions, format) {
363
+
364
+ const lists = []
365
+
366
+ if ($n_isValidArray(rawSearchOptions)) {
367
+ for (const item of rawSearchOptions) {
368
+
369
+ const newItem = Object.assign({}, item)
370
+
371
+ // 格式化单个参数
372
+ if ($n_isFunction(format)) {
373
+ const res = await $n_runAsync(format)(newItem)
374
+ if ($n_isValidObject(res)) {
375
+ $n_merge(newItem, res)
376
+ }
377
+ }
378
+
379
+ // 如果有字典标识, 则一定是下拉菜单
380
+ if ($n_has(newItem, 'dict')) {
381
+ $n_merge(newItem, {
382
+ searchType: 'select',
383
+ select: {
384
+ options: $n_isArray(newItem.dict) ? newItem.dict : $n_dictOptions(newItem.dict),
385
+ },
386
+ })
387
+
388
+ // 如果有下拉菜单选项
389
+ } else if ($n_has(newItem, 'select')) {
390
+ newItem.searchType = 'select'
391
+ newItem.select = Object.assign({
392
+ options: [],
393
+ }, newItem.select)
394
+
395
+ // 如果下拉选项是方法
396
+ if ($n_isFunction(newItem.select.options)) {
397
+ // 读取下拉选项
398
+ newItem.select.options = await $n_runAsync(newItem.select.options)()
399
+ }
400
+
401
+ // 如果有树选项(调用的是 <n-field-tree> 组件)
402
+ } else if ($n_has(newItem, 'tree')) {
403
+ newItem.searchType = 'tree'
404
+ newItem.tree = Object.assign({
405
+ nodes: [],
406
+ accordion: true,
407
+ clearable: true,
408
+ }, newItem.tree)
409
+
410
+ // 如果有表格选项(调用的是 <n-field-table.md> 组件)
411
+ } else if ($n_has(newItem, 'table')) {
412
+ newItem.searchType = 'table'
413
+ newItem.table = Object.assign({
414
+ // 值字段(必填)
415
+ valueKey: newItem.name,
416
+ // 是否可清除
417
+ clearable: true,
418
+ // 是否开启筛选
419
+ filter: true,
420
+ }, newItem.table)
421
+
422
+ // 否则为输入框
423
+ } else {
424
+ newItem.searchType = 'input'
425
+ newItem.input = Object.assign({}, newItem.input)
426
+ }
427
+
428
+ lists.push(newItem)
429
+ }
430
+ }
431
+
432
+ return lists
433
+ }
434
+
435
+ /**
436
+ * 格式化值
437
+ */
438
+ export function formatValue(rawSearchOptions, searchValue) {
439
+
440
+ const lists = []
441
+
442
+ $n_forEach(rawSearchOptions, function ({ name, type }, itemIndex) {
443
+
444
+ // 添加值1
445
+ function addValue1(value1) {
446
+
447
+ // 如果有值1
448
+ if ($n_isRequired(value1.value)) {
449
+
450
+ // 如果值1 类型为 in / not in
451
+ if ($n_indexOf([dicts.SEARCH_COMPARE_TYPE__IN, dicts.SEARCH_COMPARE_TYPE__NOT_IN], value1.compare) > -1) {
452
+
453
+ const vals = []
454
+
455
+ const values = $n_isArray(value1.value) ? value1.value : $n_split($n_replaceAll($n_trimString(value1.value), ',', ','), ',')
456
+ $n_forEach(values, function (item) {
457
+ item = $n_numberDeep(item)
458
+ if ($n_isValidValue(item)) {
459
+ vals.push(item)
460
+ }
461
+ })
462
+
463
+ if (vals.length) {
464
+ lists.push({
465
+ field: name,
466
+ compare: value1.compare,
467
+ value: vals,
468
+ })
469
+ }
470
+ return
471
+ }
472
+
473
+ // 否则添加值1
474
+ lists.push({
475
+ field: name,
476
+ compare: value1.compare,
477
+ value: $n_numberDeep(value1.value),
478
+ })
479
+ }
480
+ }
481
+
482
+ // 第一个值
483
+ const value1 = searchValue[itemIndex][0]
484
+
485
+ // 如果是文字
486
+ if (type === 'text') {
487
+ // 添加值1
488
+ addValue1(value1)
489
+
490
+ // 否则为数字
491
+ } else {
492
+
493
+ // 如果是日期
494
+ if (type === 'date') {
495
+
496
+ // 如果 为 == || !=
497
+ const isEqual = value1.compare === dicts.SEARCH_COMPARE_TYPE__EQUAL
498
+ if (isEqual || value1.compare === dicts.SEARCH_COMPARE_TYPE__NOT_EQUAL) {
499
+ const { value, dateType } = value1
500
+ if ($n_isRequired(value)) {
501
+
502
+ // 当前时间
503
+ const now = $n_toDate(value)
504
+
505
+ let end
506
+ switch (dateType) {
507
+ // 年
508
+ case 'year':
509
+ // 月
510
+ case 'month':
511
+ // 日
512
+ case 'day':
513
+ end = quasarDate.endOfDate(now, dateType)
514
+ break
515
+ // 分
516
+ case 'datetime':
517
+ end = $n_toDate(quasarDate.formatDate(now, 'YYYY/MM/DD HH:mm:59'))
518
+ break
519
+ }
520
+
521
+ let compare1
522
+ let compare2
523
+
524
+ // 如果为 ==
525
+ if (isEqual) {
526
+ // ≥
527
+ compare1 = dicts.SEARCH_COMPARE_TYPE__GTE
528
+ // ≤
529
+ compare2 = dicts.SEARCH_COMPARE_TYPE__LTE
530
+
531
+ // 否则为 !=
532
+ } else {
533
+ // <
534
+ compare1 = dicts.SEARCH_COMPARE_TYPE__LT
535
+ // >
536
+ compare2 = dicts.SEARCH_COMPARE_TYPE__GT
537
+ }
538
+
539
+ lists.push(
540
+ // 日期起
541
+ {
542
+ field: name,
543
+ // ≥
544
+ compare: compare1,
545
+ value,
546
+ },
547
+ // 日期止
548
+ {
549
+ field: name,
550
+ // ≤
551
+ compare: compare2,
552
+ value: $n_numberDeep(quasarDate.formatDate(end, 'X')),
553
+ }
554
+ )
555
+ }
556
+ return
557
+
558
+ // 如果类型为快捷日期
559
+ } else if (value1.compare >= 20) {
560
+
561
+ const res = getQuickRange(value1.compare - 20, true)
562
+ if (res) {
563
+
564
+ lists.push(
565
+ // 日期起
566
+ {
567
+ field: name,
568
+ // ≥
569
+ compare: dicts.SEARCH_COMPARE_TYPE__GTE,
570
+ value: $n_numberDeep(quasarDate.formatDate($n_toDate(`${res.date.from} ${res.time.from}`), 'X')),
571
+ },
572
+ // 日期止
573
+ {
574
+ field: name,
575
+ // ≤
576
+ compare: dicts.SEARCH_COMPARE_TYPE__LTE,
577
+ value: $n_numberDeep(quasarDate.formatDate($n_toDate(`${res.date.to} ${res.time.to}`), 'X')),
578
+ }
579
+ )
580
+ }
581
+ return
582
+ }
583
+ }
584
+
585
+ // 添加值1
586
+ addValue1(value1)
587
+
588
+ // 只有值1 类型为 > / ≥ 值2才有效
589
+ if ($n_indexOf([dicts.SEARCH_COMPARE_TYPE__GT, dicts.SEARCH_COMPARE_TYPE__GTE], value1.compare) > -1) {
590
+ const value2 = searchValue[itemIndex][1]
591
+ if ($n_isValidValue(value2.value)) {
592
+ lists.push({
593
+ field: name,
594
+ compare: value2.compare,
595
+ value: $n_numberDeep(value2.value),
596
+ })
597
+ }
598
+ }
599
+ }
600
+ })
601
+
602
+ return lists
603
+ }