Commit 372bb60d0a813ef303cc14ba0faec86d713d6d5b

Authored by ww
1 parent e1bad79c

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

... ... @@ -392,8 +392,8 @@ export const useDynamicPublicForm = (paramsItemList: Ref<ParamsItemType[]>) => {
392 392 continue
393 393 }
394 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 397 } else {
398 398 const value = [Params[splitKeys[0]], Params[splitKeys[1]]]
399 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 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>
... ...