feat(查询组件): 日期范围组件,默认值没有本月、本年等 #11283

This commit is contained in:
dataeaseShu 2024-08-07 11:14:06 +08:00
parent c78f4ef398
commit 52f71875ab
6 changed files with 191 additions and 58 deletions

View File

@ -3,11 +3,12 @@ import { toRefs, PropType, onBeforeMount, watch, computed } from 'vue'
import { Calendar } from '@element-plus/icons-vue' import { Calendar } from '@element-plus/icons-vue'
import { type DatePickType } from 'element-plus-secondary' import { type DatePickType } from 'element-plus-secondary'
import type { ManipulateType } from 'dayjs' import type { ManipulateType } from 'dayjs'
import { getAround } from './time-format-dayjs' import { getAround, getCustomRange } from './time-format-dayjs'
interface SelectConfig { interface SelectConfig {
regularOrTrends: string regularOrTrends: string
regularOrTrendsValue: [Date, Date] regularOrTrendsValue: [Date, Date]
intervalType: string intervalType: string
relativeToCurrentRange: string
timeNum: number timeNum: number
relativeToCurrentType: ManipulateType relativeToCurrentType: ManipulateType
around: string around: string
@ -27,6 +28,7 @@ const props = defineProps({
regularOrTrends: 'fixed', regularOrTrends: 'fixed',
timeNum: 0, timeNum: 0,
intervalType: 'none', intervalType: 'none',
relativeToCurrentRange: 'custom',
relativeToCurrentType: 'year', relativeToCurrentType: 'year',
around: 'f', around: 'f',
timeGranularity: 'date', timeGranularity: 'date',
@ -50,6 +52,7 @@ const timeConfig = computed(() => {
timeNum, timeNum,
relativeToCurrentType, relativeToCurrentType,
around, around,
relativeToCurrentRange,
intervalType, intervalType,
regularOrTrends, regularOrTrends,
timeGranularity, timeGranularity,
@ -62,6 +65,7 @@ const timeConfig = computed(() => {
relativeToCurrentType, relativeToCurrentType,
around, around,
intervalType, intervalType,
relativeToCurrentRange,
regularOrTrends, regularOrTrends,
timeGranularity, timeGranularity,
timeNumRange, timeNumRange,
@ -87,10 +91,13 @@ watch(
) )
const init = () => { const init = () => {
console.log('relativeToCurrentRange')
const { const {
timeNum, timeNum,
relativeToCurrentType, relativeToCurrentType,
around, around,
relativeToCurrentRange,
regularOrTrends, regularOrTrends,
timeNumRange, timeNumRange,
relativeToCurrentTypeRange, relativeToCurrentTypeRange,
@ -117,6 +124,11 @@ const init = () => {
timeNumRange timeNumRange
) )
if (!!relativeToCurrentRange && relativeToCurrentRange !== 'custom') {
config.value.regularOrTrendsValue = getCustomRange(relativeToCurrentRange)
return
}
config.value.regularOrTrendsValue = [startTime, endTime] config.value.regularOrTrendsValue = [startTime, endTime]
} }

View File

@ -576,16 +576,21 @@ const isInRange = (ele, startWindowTime, timeStamp) => {
if (intervalType === 'timeInterval') { if (intervalType === 'timeInterval') {
const startTime = const startTime =
regularOrTrends === 'fixed' regularOrTrends === 'fixed'
? regularOrTrendsValue[0] ? new Date(
dayjs(new Date(regularOrTrendsValue[0])).startOf(noTime).format('YYYY/MM/DD HH:mm:ss')
)
: getAround(relativeToCurrentType, around === 'f' ? 'subtract' : 'add', timeNum) : getAround(relativeToCurrentType, around === 'f' ? 'subtract' : 'add', timeNum)
const endTime = const endTime =
regularOrTrends === 'fixed' regularOrTrends === 'fixed'
? regularOrTrendsValue[1] ? new Date(
dayjs(new Date(regularOrTrendsValue[1])).endOf(noTime).format('YYYY/MM/DD HH:mm:ss')
)
: getAround( : getAround(
relativeToCurrentTypeRange, relativeToCurrentTypeRange,
aroundRange === 'f' ? 'subtract' : 'add', aroundRange === 'f' ? 'subtract' : 'add',
timeNumRange timeNumRange
) )
return ( return (
startWindowTime < +new Date(startTime) - 1000 || startWindowTime < +new Date(startTime) - 1000 ||
timeStamp > +new Date(endTime) || timeStamp > +new Date(endTime) ||
@ -760,7 +765,7 @@ const validate = () => {
'end-config' 'end-config'
) )
: new Date(ele.defaultValue[1]) : new Date(ele.defaultValue[1])
if (!relativeToCurrentRange || relativeToCurrentRange === 'custom') { if (!!relativeToCurrentRange && relativeToCurrentRange !== 'custom') {
;[startTime, endTime] = getCustomRange(relativeToCurrentRange) ;[startTime, endTime] = getCustomRange(relativeToCurrentRange)
} }
if (+startTime > +endTime) { if (+startTime > +endTime) {
@ -1032,6 +1037,10 @@ const parameterCompletion = () => {
Object.entries(attributes).forEach(([key, val]) => { Object.entries(attributes).forEach(([key, val]) => {
!curComponent.value[key] && (curComponent.value[key] = val) !curComponent.value[key] && (curComponent.value[key] = val)
}) })
if (!curComponent.value.timeRange.relativeToCurrentRange) {
curComponent.value.timeRange.relativeToCurrentRange = 'custom'
}
} }
const handleCondition = item => { const handleCondition = item => {

View File

@ -11,6 +11,7 @@ const props = defineProps({
dynamicWindow: false, dynamicWindow: false,
maximumSingleQuery: 0, maximumSingleQuery: 0,
regularOrTrends: 'fixed', regularOrTrends: 'fixed',
relativeToCurrentRange: 'custom',
regularOrTrendsValue: '', regularOrTrendsValue: '',
relativeToCurrent: 'custom', relativeToCurrent: 'custom',
timeNum: 0, timeNum: 0,
@ -173,6 +174,85 @@ const relativeToCurrentList = computed(() => {
} }
] ]
}) })
const relativeToCurrentListRange = computed(() => {
let list = []
if (!timeRange.value) return list
switch (props.timeGranularityMultiple) {
case 'yearrange':
list = [
{
label: '今年',
value: 'thisYear'
},
{
label: '去年',
value: 'lastYear'
}
]
break
case 'monthrange':
list = [
{
label: '本月',
value: 'thisMonth'
},
{
label: '上月',
value: 'lastMonth'
},
{
label: '最近 3 个 月',
value: 'LastThreeMonths'
},
{
label: '最近 6 个 月',
value: 'LastSixMonths'
},
{
label: '最近 12 个 月',
value: 'LastTwelveMonths'
}
]
break
case 'daterange':
case 'datetimerange':
list = [
{
label: '今天',
value: 'today'
},
{
label: '昨天',
value: 'yesterday'
},
{
label: '最近 3 天',
value: 'LastThreeDays'
},
{
label: '月初至今',
value: 'monthBeginning'
},
{
label: '年初至今',
value: 'yearBeginning'
}
]
break
default:
break
}
return [
...list,
{
label: '自定义',
value: 'custom'
}
]
})
</script> </script>
<template> <template>
@ -200,7 +280,7 @@ const relativeToCurrentList = computed(() => {
</el-radio-group> </el-radio-group>
</div> </div>
<template v-if="dynamicTime && timeRange.intervalType !== 'timeInterval'"> <template v-if="dynamicTime && timeRange.intervalType !== 'timeInterval'">
<div class="setting"> <div class="setting" v-if="timeRange.intervalType !== 'timeInterval'">
<div class="setting-label">相对当前</div> <div class="setting-label">相对当前</div>
<div class="setting-value select"> <div class="setting-value select">
<el-select v-model="timeRange.relativeToCurrent"> <el-select v-model="timeRange.relativeToCurrent">
@ -236,26 +316,12 @@ const relativeToCurrentList = computed(() => {
</div> </div>
</template> </template>
<template v-else-if="dynamicTime && timeRange.intervalType === 'timeInterval'"> <template v-else-if="dynamicTime && timeRange.intervalType === 'timeInterval'">
<div <div class="setting">
class="setting" <div class="setting-label">相对当前</div>
:class=" <div class="setting-value select">
['yearrange', 'monthrange'].includes(timeGranularityMultiple) && 'is-year-month-range' <el-select v-model="timeRange.relativeToCurrentRange">
"
>
<div class="setting-label">开始时间</div>
<div class="setting-input range">
<el-input-number v-model="timeRange.timeNum" :min="0" controls-position="right" />
<el-select v-model="timeRange.relativeToCurrentType">
<el-option <el-option
v-for="item in relativeToCurrentTypeList" v-for="item in relativeToCurrentListRange"
:key="item.value"
:label="item.label"
:value="item.value"
/>
</el-select>
<el-select v-model="timeRange.around">
<el-option
v-for="item in aroundList"
:key="item.value" :key="item.value"
:label="item.label" :label="item.label"
:value="item.value" :value="item.value"
@ -263,37 +329,68 @@ const relativeToCurrentList = computed(() => {
</el-select> </el-select>
</div> </div>
</div> </div>
<div <template v-if="timeRange.relativeToCurrentRange === 'custom'">
class="setting" <div
:class=" class="setting"
['yearrange', 'monthrange'].includes(timeGranularityMultiple) && 'is-year-month-range' :class="
" ['yearrange', 'monthrange'].includes(timeGranularityMultiple) &&
> 'is-year-month-range'
<div class="setting-label">结束时间</div> "
<div class="setting-input range"> >
<el-input-number <div class="setting-label">开始时间</div>
v-model="timeRange.timeNumRange" <div class="setting-input range">
:min="0" <el-input-number v-model="timeRange.timeNum" :min="0" controls-position="right" />
controls-position="right" <el-select v-model="timeRange.relativeToCurrentType">
/> <el-option
<el-select v-model="timeRange.relativeToCurrentTypeRange"> v-for="item in relativeToCurrentTypeList"
<el-option :key="item.value"
v-for="item in relativeToCurrentTypeList" :label="item.label"
:key="item.value" :value="item.value"
:label="item.label" />
:value="item.value" </el-select>
/> <el-select v-model="timeRange.around">
</el-select> <el-option
<el-select v-model="timeRange.aroundRange"> v-for="item in aroundList"
<el-option :key="item.value"
v-for="item in aroundList" :label="item.label"
:key="item.value" :value="item.value"
:label="item.label" />
:value="item.value" </el-select>
/> </div>
</el-select>
</div> </div>
</div> <div
class="setting"
:class="
['yearrange', 'monthrange'].includes(timeGranularityMultiple) &&
'is-year-month-range'
"
>
<div class="setting-label">结束时间</div>
<div class="setting-input range">
<el-input-number
v-model="timeRange.timeNumRange"
:min="0"
controls-position="right"
/>
<el-select v-model="timeRange.relativeToCurrentTypeRange">
<el-option
v-for="item in relativeToCurrentTypeList"
:key="item.value"
:label="item.label"
:value="item.value"
/>
</el-select>
<el-select v-model="timeRange.aroundRange">
<el-option
v-for="item in aroundList"
:key="item.value"
:label="item.label"
:value="item.value"
/>
</el-select>
</div>
</div>
</template>
</template> </template>
</div> </div>
<div class="parameters" :class="dynamicTime && 'setting'"> <div class="parameters" :class="dynamicTime && 'setting'">

View File

@ -299,11 +299,19 @@ const disabledDate = val => {
if (intervalType === 'timeInterval') { if (intervalType === 'timeInterval') {
const startTime = const startTime =
regularOrTrends === 'fixed' regularOrTrends === 'fixed'
? regularOrTrendsValue[0] ? new Date(
dayjs(new Date(regularOrTrendsValue[0]))
.startOf(queryTimeType.value)
.format('YYYY/MM/DD HH:mm:ss')
)
: getAround(relativeToCurrentType, around === 'f' ? 'subtract' : 'add', timeNum) : getAround(relativeToCurrentType, around === 'f' ? 'subtract' : 'add', timeNum)
const endTime = const endTime =
regularOrTrends === 'fixed' regularOrTrends === 'fixed'
? regularOrTrendsValue[1] ? new Date(
dayjs(new Date(regularOrTrendsValue[1]))
.endOf(queryTimeType.value)
.format('YYYY/MM/DD HH:mm:ss')
)
: getAround( : getAround(
relativeToCurrentTypeRange, relativeToCurrentTypeRange,
aroundRange === 'f' ? 'subtract' : 'add', aroundRange === 'f' ? 'subtract' : 'add',

View File

@ -233,6 +233,7 @@ interface TimeRange {
regularOrTrends: string regularOrTrends: string
regularOrTrendsValue: string regularOrTrendsValue: string
relativeToCurrent: string relativeToCurrent: string
relativeToCurrentRange: string
timeNum: number timeNum: number
relativeToCurrentType: ManipulateType relativeToCurrentType: ManipulateType
around: string around: string

View File

@ -1,6 +1,7 @@
import { dvMainStoreWithOut } from '@/store/modules/data-visualization/dvMain' import { dvMainStoreWithOut } from '@/store/modules/data-visualization/dvMain'
import { storeToRefs } from 'pinia' import { storeToRefs } from 'pinia'
import { getDynamicRange, getCustomTime } from '@/custom-component/v-query/time-format' import { getDynamicRange, getCustomTime } from '@/custom-component/v-query/time-format'
import { getCustomRange } from '@/custom-component/v-query/time-format-dayjs'
const dvMainStore = dvMainStoreWithOut() const dvMainStore = dvMainStoreWithOut()
const { componentData } = storeToRefs(dvMainStore) const { componentData } = storeToRefs(dvMainStore)
@ -266,6 +267,7 @@ export const searchQuery = (queryComponentList, filter, curComponentId, firstLoa
timeNum, timeNum,
relativeToCurrentType, relativeToCurrentType,
around, around,
relativeToCurrentRange,
arbitraryTime, arbitraryTime,
timeGranularity, timeGranularity,
timeNumRange, timeNumRange,
@ -275,7 +277,7 @@ export const searchQuery = (queryComponentList, filter, curComponentId, firstLoa
arbitraryTimeRange arbitraryTimeRange
} = item } = item
const startTime = getCustomTime( let startTime = getCustomTime(
timeNum, timeNum,
relativeToCurrentType, relativeToCurrentType,
timeGranularity, timeGranularity,
@ -284,7 +286,7 @@ export const searchQuery = (queryComponentList, filter, curComponentId, firstLoa
timeGranularityMultiple, timeGranularityMultiple,
'start-panel' 'start-panel'
) )
const endTime = getCustomTime( let endTime = getCustomTime(
timeNumRange, timeNumRange,
relativeToCurrentTypeRange, relativeToCurrentTypeRange,
timeGranularity, timeGranularity,
@ -293,6 +295,10 @@ export const searchQuery = (queryComponentList, filter, curComponentId, firstLoa
timeGranularityMultiple, timeGranularityMultiple,
'end-panel' 'end-panel'
) )
if (!!relativeToCurrentRange && relativeToCurrentRange !== 'custom') {
;[startTime, endTime] = getCustomRange(relativeToCurrentRange)
}
item.defaultValue = [startTime, endTime] item.defaultValue = [startTime, endTime]
item.selectValue = [startTime, endTime] item.selectValue = [startTime, endTime]
selectValue = [startTime, endTime] selectValue = [startTime, endTime]