feat: 新增首页统计图筛选条件

This commit is contained in:
xlsea 2024-03-30 17:55:53 +08:00
parent b50946de26
commit 65d46fec51
4 changed files with 59 additions and 7 deletions

View File

@ -43,6 +43,7 @@ declare module 'vue' {
NCheckbox: typeof import('naive-ui')['NCheckbox'] NCheckbox: typeof import('naive-ui')['NCheckbox']
NColorPicker: typeof import('naive-ui')['NColorPicker'] NColorPicker: typeof import('naive-ui')['NColorPicker']
NDataTable: typeof import('naive-ui')['NDataTable'] NDataTable: typeof import('naive-ui')['NDataTable']
NDatePicker: typeof import('naive-ui')['NDatePicker']
NDescriptions: typeof import('naive-ui')['NDescriptions'] NDescriptions: typeof import('naive-ui')['NDescriptions']
NDescriptionsItem: typeof import('naive-ui')['NDescriptionsItem'] NDescriptionsItem: typeof import('naive-ui')['NDescriptionsItem']
NDialogProvider: typeof import('naive-ui')['NDialogProvider'] NDialogProvider: typeof import('naive-ui')['NDialogProvider']

View File

@ -16,6 +16,10 @@ const cardCount = ref<Api.Dashboard.CardCount>();
const tabParams = ref<Api.Dashboard.DashboardLineParams>({ const tabParams = ref<Api.Dashboard.DashboardLineParams>({
type: 'WEEK' type: 'WEEK'
}); });
const dateRange = ref<[number, number] | null>();
const formattedValue = ref<[string, string] | null>(
tabParams.value.startTime && tabParams.value.endTime ? [tabParams.value.startTime, tabParams.value.endTime] : null
);
const getCardData = async () => { const getCardData = async () => {
const { data: cardData, error } = await fetchCardCount(); const { data: cardData, error } = await fetchCardCount();
@ -25,6 +29,29 @@ const getCardData = async () => {
}; };
getCardData(); getCardData();
const onUpdateDate = (value: [string, string]) => {
if (value) {
tabParams.value.type = 'OTHERS';
tabParams.value.startTime = value[0];
tabParams.value.endTime = value[1];
}
};
const onClearDate = () => {
tabParams.value.type = 'WEEK';
tabParams.value.startTime = undefined;
tabParams.value.endTime = undefined;
};
const onUpdateType = (value: string) => {
if (value !== 'OTHERS') {
dateRange.value = null;
formattedValue.value = null;
tabParams.value.startTime = undefined;
tabParams.value.endTime = undefined;
}
};
</script> </script>
<template> <template>
@ -35,19 +62,30 @@ getCardData();
<div class="relative"> <div class="relative">
<NTabs type="line" animated> <NTabs type="line" animated>
<NTabPane name="retryTask" :tab="$t('page.home.retryTask')"> <NTabPane name="retryTask" :tab="$t('page.home.retryTask')">
<RetryTab :type="0" /> <RetryTab :type="0" :line-params="tabParams" />
</NTabPane> </NTabPane>
<NTabPane name="jobTask" :tab="$t('page.home.jobTask')"> <NTabPane name="jobTask" :tab="$t('page.home.jobTask')">
<RetryTab :type="1" /> <RetryTab :type="1" :line-params="tabParams" />
</NTabPane> </NTabPane>
</NTabs> </NTabs>
<div class="absolute right-40px top-4px"> <div class="absolute right-40px top-0 flex gap-16px">
<NRadioGroup v-model:value="tabParams.type"> <NRadioGroup v-model:value="tabParams.type" @update:value="onUpdateType">
<NRadioButton value="DAY" label="今日" /> <NRadioButton value="DAY" label="今日" />
<NRadioButton value="WEEK" label="最近一周" /> <NRadioButton value="WEEK" label="最近一周" />
<NRadioButton value="MONTH" label="最近一月" /> <NRadioButton value="MONTH" label="最近一月" />
<NRadioButton value="YEAR" label="全年" /> <NRadioButton value="YEAR" label="全年" />
</NRadioGroup> </NRadioGroup>
<NDatePicker
v-model:value="dateRange"
v-model:formatted-value="formattedValue"
value-format="yyyy-MM-dd HH:mm:ss"
type="daterange"
class="w-300px"
clearable
@update:formatted-value="onUpdateDate"
@clear="onClearDate"
/>
<NSelect v-model:value="tabParams.groupName" class="w-200px" />
</div> </div>
</div> </div>
</NCard> </NCard>

View File

@ -210,6 +210,13 @@ function updateLocale() {
}); });
} }
watch(
() => props.modelValue,
() => {
getData();
}
);
watch( watch(
() => props.type, () => props.type,
() => { () => {

View File

@ -1,5 +1,5 @@
<script setup lang="ts"> <script setup lang="ts">
import { computed, ref } from 'vue'; import { computed, ref, watch } from 'vue';
import { useAppStore } from '@/store/modules/app'; import { useAppStore } from '@/store/modules/app';
import { fetchJobLine, fetchRetryLine } from '@/service/api'; import { fetchJobLine, fetchRetryLine } from '@/service/api';
import LineRetryChart from './line-retry-chart.vue'; import LineRetryChart from './line-retry-chart.vue';
@ -10,6 +10,7 @@ defineOptions({
interface Props { interface Props {
type?: number; type?: number;
lineParams: Api.Dashboard.DashboardLineParams;
} }
const props = withDefaults(defineProps<Props>(), { const props = withDefaults(defineProps<Props>(), {
@ -23,20 +24,25 @@ const gap = computed(() => (appStore.isMobile ? 0 : 16));
const data = ref<Api.Dashboard.DashboardLine>(); const data = ref<Api.Dashboard.DashboardLine>();
const getData = async () => { const getData = async () => {
const { data: lineData, error } = props.type === 1 ? await fetchJobLine() : await fetchRetryLine(); const { data: lineData, error } =
props.type === 1 ? await fetchJobLine(props.lineParams) : await fetchRetryLine(props.lineParams);
if (!error) { if (!error) {
data.value = lineData; data.value = lineData;
} }
}; };
watch(props.lineParams, () => {
getData();
});
getData(); getData();
</script> </script>
<template> <template>
<NGrid :x-gap="gap" :y-gap="16" responsive="screen" item-responsive> <NGrid :x-gap="gap" :y-gap="16" responsive="screen" item-responsive>
<NGi span="24 s:24 m:16"> <NGi span="24 s:24 m:16">
<LineRetryChart :type="type" :model-value="data!"></LineRetryChart> <LineRetryChart v-model="data!" :type="type"></LineRetryChart>
</NGi> </NGi>
<NGi span="24 s:24 m:8"> <NGi span="24 s:24 m:8">
<div>任务量排名</div> <div>任务量排名</div>