Commit 372bb60d0a813ef303cc14ba0faec86d713d6d5b

Authored by ww
1 parent e1bad79c

fix(动态请求): 优化时间周期聚合条件

@@ -392,8 +392,8 @@ export const useDynamicPublicForm = (paramsItemList: Ref<ParamsItemType[]>) => { @@ -392,8 +392,8 @@ export const useDynamicPublicForm = (paramsItemList: Ref<ParamsItemType[]>) => {
392 continue 392 continue
393 } 393 }
394 if (mores) { 394 if (mores) {
395 - const { agg, interval, timePeriod } = Params  
396 - params[BuiltInVariable.SELECT_TIME_AGGREGATION] = { agg, interval, timePeriod } 395 + const { agg, interval, startTs, endTs, limit } = Params
  396 + params[BuiltInVariable.SELECT_TIME_AGGREGATION] = { agg, interval, startTs, endTs, limit }
397 } else { 397 } else {
398 const value = [Params[splitKeys[0]], Params[splitKeys[1]]] 398 const value = [Params[splitKeys[0]], Params[splitKeys[1]]]
399 params[key] = value.every(Boolean) ? value : null 399 params[key] = value.every(Boolean) ? value : null
1 -<script lang="ts">  
2 -export default {  
3 - inheritAttrs: true,  
4 - components: { NFormItem }  
5 -}  
6 -</script>  
7 <script lang="ts" setup> 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 import { defaultIntervalOptions, aggergationOptions } from '../DynamicForm/timeInterval' 3 import { defaultIntervalOptions, aggergationOptions } from '../DynamicForm/timeInterval'
10 import { unref, computed, ref, watch } from 'vue'; 4 import { unref, computed, ref, watch } from 'vue';
11 import { isObject } from '@/utils/external/is'; 5 import { isObject } from '@/utils/external/is';
12 6
13 interface Value { 7 interface Value {
14 - timePeriod?: Nullable<number>  
15 agg?: Nullable<string> 8 agg?: Nullable<string>
16 interval?: Nullable<number> 9 interval?: Nullable<number>
  10 + startTs?: Nullable<number>
  11 + endTs?: Nullable<number>
  12 + limit?: Nullable<number>
17 } 13 }
18 14
19 const props = withDefaults( 15 const props = withDefaults(
@@ -31,120 +27,95 @@ const emit = defineEmits<{ @@ -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 const handleAggChange = (value: string) => { 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 const handleIntervalChange = (value: number) => { 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 watch(() => props.value, (target) => { 81 watch(() => props.value, (target) => {
93 if (target && isObject(target)) { 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 agg.value = _agg 89 agg.value = _agg
  90 + limit.value = _limit!
97 interval.value = _interval 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 </script> 94 </script>
129 95
130 <template> 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 </NFormItem> 102 </NFormItem>
137 </NGi> 103 </NGi>
138 - <NGi>  
139 - <NFormItem :show-label="false" :rule="aggRule"> 104 + <NGi :span="4">
  105 + <NFormItem :show-label="false">
140 <NSelect v-model:value="agg" @update:value="handleAggChange" :options="aggergationOptions" label-field="name" 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 </NFormItem> 108 </NFormItem>
143 </NGi> 109 </NGi>
144 - <NGi>  
145 - <NFormItem :show-label="false" :rule="intervalRule"> 110 + <NGi v-if="!getShowLimit" :span="4">
  111 + <NFormItem :show-label="false">
146 <NSelect v-model:value="interval" @update:value="handleIntervalChange" :options="getIntervalTimeOptions" 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 </NFormItem> 119 </NFormItem>
149 </NGi> 120 </NGi>
150 </NGrid> 121 </NGrid>