1
|
|
-<script lang="ts">
|
2
|
|
-export default {
|
3
|
|
- inheritAttrs: true,
|
4
|
|
- components: { NFormItem }
|
5
|
|
-}
|
6
|
|
-</script>
|
7
|
1
|
<script lang="ts" setup>
|
8
|
|
-import { FormItemRule, NFormItem, NGi, NGrid, NSelect } from 'naive-ui';
|
|
2
|
+import { NFormItem, NGi, NGrid, NSelect, NDatePicker, NInputNumber } from 'naive-ui';
|
9
|
3
|
import { defaultIntervalOptions, aggergationOptions } from '../DynamicForm/timeInterval'
|
10
|
4
|
import { unref, computed, ref, watch } from 'vue';
|
11
|
5
|
import { isObject } from '@/utils/external/is';
|
12
|
6
|
|
13
|
7
|
interface Value {
|
14
|
|
- timePeriod?: Nullable<number>
|
15
|
8
|
agg?: Nullable<string>
|
16
|
9
|
interval?: Nullable<number>
|
|
10
|
+ startTs?: Nullable<number>
|
|
11
|
+ endTs?: Nullable<number>
|
|
12
|
+ limit?: Nullable<number>
|
17
|
13
|
}
|
18
|
14
|
|
19
|
15
|
const props = withDefaults(
|
...
|
...
|
@@ -31,120 +27,95 @@ const emit = defineEmits<{ |
31
|
27
|
}>()
|
32
|
28
|
|
33
|
29
|
|
34
|
|
-const timePeriod = ref(props.value?.timePeriod)
|
35
|
|
-const agg = ref(props.value?.agg)
|
36
|
|
-const interval = ref(props.value?.interval)
|
37
|
|
-
|
38
|
|
-const getIntervalTimeOptions = computed(() => {
|
39
|
|
- return defaultIntervalOptions.find(item => item.id === unref(timePeriod))?.linkage || []
|
40
|
|
-})
|
41
|
|
-
|
42
|
|
-// const getTimePeriod = computed({
|
43
|
|
-// get() {
|
44
|
|
-// return props.value?.timePeriod
|
45
|
|
-// },
|
46
|
|
-// set(value) {
|
47
|
|
-// emit('update:value', { ...props.value || {}, timePeriod: value })
|
48
|
|
-// emit('change', { ...props.value || {}, timePeriod: value })
|
49
|
|
-// }
|
50
|
|
-// })
|
|
30
|
+const timePeriod = ref<Nullable<[number, number]>>(null)
|
|
31
|
+const agg = ref()
|
|
32
|
+const interval = ref()
|
|
33
|
+const limit = ref(7)
|
51
|
34
|
|
52
|
|
-// const getAggereation = computed({
|
53
|
|
-// get() {
|
54
|
|
-// return props.value?.agg
|
55
|
|
-// },
|
56
|
|
-// set(value) {
|
57
|
|
-// emit('update:value', { ...props.value || {}, agg: value })
|
58
|
|
-// emit('change', { ...props.value || {}, agg: value })
|
|
35
|
+const getRangeOptions = (number: number) => {
|
|
36
|
+ for (let i = 0; i < defaultIntervalOptions.length; i++) {
|
|
37
|
+ const option = defaultIntervalOptions[i]
|
|
38
|
+ if (option.id >= number || i === defaultIntervalOptions.length - 1) {
|
|
39
|
+ return option.linkage
|
|
40
|
+ }
|
59
|
41
|
|
60
|
|
-// }
|
61
|
|
-// })
|
62
|
|
-// const getInterval = computed({
|
63
|
|
-// get() {
|
64
|
|
-// return props.value?.interval
|
65
|
|
-// },
|
66
|
|
-// set(value) {
|
67
|
|
-// emit('update:value', { ...props.value || {}, interval: value })
|
68
|
|
-// emit('change', { ...props.value || {}, interval: value })
|
|
42
|
+ }
|
|
43
|
+}
|
69
|
44
|
|
70
|
|
-// }
|
71
|
|
-// })
|
|
45
|
+const getShowLimit = computed(() => {
|
|
46
|
+ return unref(agg) === 'NONE'
|
|
47
|
+})
|
72
|
48
|
|
73
|
|
-// const getTimePeriod = computed(() => props.value.timePeriod)
|
74
|
|
-// const getAggereation = computed(() => props.value.agg)
|
75
|
|
-// const getInterval = computed(() => props.value.interval)
|
|
49
|
+const getIntervalTimeOptions = computed(() => {
|
|
50
|
+ const [startTs, endTs] = unref(timePeriod) || []
|
|
51
|
+ if (!startTs || !endTs) return []
|
|
52
|
+ const diff = Math.abs(startTs - endTs)
|
|
53
|
+ return getRangeOptions(diff)
|
|
54
|
+})
|
76
|
55
|
|
77
|
|
-const handleTimePerionChange = (value: number) => {
|
78
|
|
- emit('update:value', { ...props.value, timePeriod: value, interval: null })
|
79
|
|
- emit('change', { ...props.value || {}, timePeriod: value, interval: null })
|
|
56
|
+const handleTimePerionChange = (value: number[]) => {
|
|
57
|
+ const [startTs, endTs] = value
|
|
58
|
+ emit('update:value', { ...props.value, startTs, endTs, interval: null })
|
|
59
|
+ emit('change', { ...props.value || {}, startTs, endTs, interval: null })
|
80
|
60
|
}
|
81
|
61
|
|
82
|
62
|
const handleAggChange = (value: string) => {
|
83
|
|
- emit('update:value', { ...props.value, agg: value })
|
84
|
|
- emit('change', { ...props.value, agg: value })
|
|
63
|
+ const _value = { ...props.value, agg: value }
|
|
64
|
+ Reflect.deleteProperty(_value, value === 'NONE' ? 'interval' : 'limit')
|
|
65
|
+ emit('update:value', _value)
|
|
66
|
+ emit('change', _value)
|
85
|
67
|
}
|
86
|
68
|
|
87
|
69
|
const handleIntervalChange = (value: number) => {
|
88
|
|
- emit('update:value', { ...props.value, interval: value })
|
89
|
|
- emit('change', { ...props.value, interval: value })
|
|
70
|
+ const _value = { ...props.value, interval: value }
|
|
71
|
+ emit('update:value', _value)
|
|
72
|
+ emit('change', _value)
|
|
73
|
+}
|
|
74
|
+
|
|
75
|
+const handleLimitChange = (value: Nullable<number>) => {
|
|
76
|
+ const _value = { ...props.value, limit: value }
|
|
77
|
+ emit('update:value', _value)
|
|
78
|
+ emit('change', _value)
|
90
|
79
|
}
|
91
|
80
|
|
92
|
81
|
watch(() => props.value, (target) => {
|
93
|
82
|
if (target && isObject(target)) {
|
94
|
|
- const { agg: _agg, interval: _interval, timePeriod: _timePeriod } = target || {}
|
95
|
|
- timePeriod.value = _timePeriod
|
|
83
|
+ const { agg: _agg, interval: _interval, startTs, endTs, limit: _limit } = target || {}
|
|
84
|
+ if (startTs && endTs) {
|
|
85
|
+ timePeriod.value = [startTs!, endTs!]
|
|
86
|
+ } else {
|
|
87
|
+ timePeriod.value = null
|
|
88
|
+ }
|
96
|
89
|
agg.value = _agg
|
|
90
|
+ limit.value = _limit!
|
97
|
91
|
interval.value = _interval
|
98
|
92
|
}
|
99
|
93
|
})
|
100
|
|
-
|
101
|
|
-const timePeriodRule: FormItemRule = {
|
102
|
|
- trigger: ['blur'],
|
103
|
|
- validator() {
|
104
|
|
- if (!unref(timePeriod)) {
|
105
|
|
- return new Error('请选择时间周期')
|
106
|
|
- }
|
107
|
|
- }
|
108
|
|
-}
|
109
|
|
-
|
110
|
|
-const aggRule: FormItemRule = {
|
111
|
|
- trigger: ['blur'],
|
112
|
|
- validator() {
|
113
|
|
- if (!unref(agg)) {
|
114
|
|
- return new Error('请选择聚合方式')
|
115
|
|
- }
|
116
|
|
- }
|
117
|
|
-}
|
118
|
|
-
|
119
|
|
-const intervalRule: FormItemRule = {
|
120
|
|
- trigger: ['blur'],
|
121
|
|
- validator() {
|
122
|
|
- if (!unref(interval)) {
|
123
|
|
- return new Error('请选择间隔时间')
|
124
|
|
- }
|
125
|
|
- }
|
126
|
|
-}
|
127
|
|
-
|
128
|
94
|
</script>
|
129
|
95
|
|
130
|
96
|
<template>
|
131
|
|
- <NGrid :cols="3">
|
132
|
|
- <NGi>
|
133
|
|
- <NFormItem :show-label="false" :rule="timePeriodRule">
|
134
|
|
- <NSelect v-model:value="timePeriod" :options="defaultIntervalOptions" label-field="name" value-field="id"
|
135
|
|
- @update:value="handleTimePerionChange" placeholder="请选择时间周期"></NSelect>
|
|
97
|
+ <NGrid :cols="24">
|
|
98
|
+ <NGi :span="16">
|
|
99
|
+ <NFormItem :show-label="false">
|
|
100
|
+ <NDatePicker v-model:value="timePeriod" type="datetimerange" placeholder="请选择时间范围"
|
|
101
|
+ @update-value="handleTimePerionChange" clearable></NDatePicker>
|
136
|
102
|
</NFormItem>
|
137
|
103
|
</NGi>
|
138
|
|
- <NGi>
|
139
|
|
- <NFormItem :show-label="false" :rule="aggRule">
|
|
104
|
+ <NGi :span="4">
|
|
105
|
+ <NFormItem :show-label="false">
|
140
|
106
|
<NSelect v-model:value="agg" @update:value="handleAggChange" :options="aggergationOptions" label-field="name"
|
141
|
|
- value-field="id" placeholder="聚合方式"></NSelect>
|
|
107
|
+ value-field="id" placeholder="聚合方式" clearable></NSelect>
|
142
|
108
|
</NFormItem>
|
143
|
109
|
</NGi>
|
144
|
|
- <NGi>
|
145
|
|
- <NFormItem :show-label="false" :rule="intervalRule">
|
|
110
|
+ <NGi v-if="!getShowLimit" :span="4">
|
|
111
|
+ <NFormItem :show-label="false">
|
146
|
112
|
<NSelect v-model:value="interval" @update:value="handleIntervalChange" :options="getIntervalTimeOptions"
|
147
|
|
- label-field="name" value-field="id" placeholder="间隔时间"></NSelect>
|
|
113
|
+ label-field="name" value-field="id" placeholder="间隔时间" clearable></NSelect>
|
|
114
|
+ </NFormItem>
|
|
115
|
+ </NGi>
|
|
116
|
+ <NGi v-if="getShowLimit" :span="4">
|
|
117
|
+ <NFormItem :show-label="false">
|
|
118
|
+ <NInputNumber v-model:value="limit" @update:value="handleLimitChange" :min="7" :step="1" placeholder="请输入最大条数" />
|
148
|
119
|
</NFormItem>
|
149
|
120
|
</NGi>
|
150
|
121
|
</NGrid>
|
...
|
...
|
|