feat: add daily task claim record filters

This commit is contained in:
zhx 2026-05-15 15:57:10 +08:00
parent b1bb7a2267
commit fabe307a22

View File

@ -1,4 +1,6 @@
<script lang="ts" setup>
import type { Dayjs } from 'dayjs';
import { computed, reactive, ref, watch } from 'vue';
import { Page } from '@vben/common-ui';
@ -7,6 +9,7 @@ import { useAccessStore } from '@vben/stores';
import {
Button,
Card,
DatePicker,
Input,
InputNumber,
message,
@ -20,6 +23,7 @@ import {
Tabs,
Tag,
} from 'antdv-next';
import dayjs from 'dayjs';
import {
getResidentDailyTaskConfig,
@ -175,6 +179,12 @@ const claimQuery = reactive<Record<string, any>>({
userId: '',
});
function defaultClaimDateRange(): [Dayjs, Dayjs] {
return [dayjs().startOf('day'), dayjs().endOf('day')];
}
const claimDateRange = ref<[Dayjs, Dayjs] | null>(defaultClaimDateRange());
const claimPage = reactive<Record<string, any>>({
current: 1,
records: [],
@ -182,6 +192,12 @@ const claimPage = reactive<Record<string, any>>({
total: 0,
});
const claimSummary = reactive<Record<string, any>>({
selectedTaskRewardGold: 0,
taskCode: '',
totalRewardGold: 0,
});
const statusMeta = computed(() => {
if (!form.configured) {
return { color: 'processing', text: '未配置' };
@ -196,6 +212,24 @@ const activeTaskCategoryLabel = computed(() => {
return taskCategoryOptions.find((item) => item.value === activeTaskCategory.value)?.label || '每日任务';
});
const taskCodeOptions = computed(() => {
const seen = new Set<string>();
return ((form.tasks || []) as Array<Record<string, any>>)
.map((item) => {
const value = String(item.taskCode || '').trim();
if (!value || seen.has(value)) {
return null;
}
seen.add(value);
const taskName = String(item.taskName || '').trim();
return {
label: taskName ? `${value} / ${taskName}` : value,
value,
};
})
.filter(Boolean) as Array<{ label: string; value: string }>;
});
function normalizeConditionJumpRows(
rows: Array<Record<string, any>>,
tasks: Array<Record<string, any>>,
@ -543,6 +577,20 @@ function normalizePage(target: Record<string, any>, result: Record<string, any>)
target.total = Number(result?.total || 0);
target.current = Number(result?.current || 1);
target.size = Number(result?.size || 20);
const summary = result?.summary || {};
claimSummary.totalRewardGold = Number(summary.totalRewardGold || 0);
claimSummary.selectedTaskRewardGold = Number(summary.selectedTaskRewardGold || 0);
claimSummary.taskCode = String(summary.taskCode || '');
}
function claimTimeParams() {
if (!claimDateRange.value?.[0] || !claimDateRange.value?.[1]) {
return {};
}
return {
endTime: String(claimDateRange.value[1].valueOf()),
startTime: String(claimDateRange.value[0].valueOf()),
};
}
async function loadClaimRecords() {
@ -553,6 +601,7 @@ async function loadClaimRecords() {
try {
const result = await pageResidentDailyTaskClaimRecords({
...claimQuery,
...claimTimeParams(),
sysOrigin: selectedSysOrigin.value,
taskCategory: activeTaskCategory.value,
});
@ -567,6 +616,11 @@ function searchClaimRecords() {
void loadClaimRecords();
}
function resetClaimDateRange() {
claimDateRange.value = defaultClaimDateRange();
searchClaimRecords();
}
function handleClaimTableChange(pagination: Record<string, any>) {
claimQuery.cursor = Number(pagination.current || 1);
claimQuery.limit = Number(pagination.pageSize || 20);
@ -585,12 +639,13 @@ watch(
watch(
selectedSysOrigin,
(value) => {
if (value) {
claimQuery.cursor = 1;
void loadConfig();
void loadClaimRecords();
}
(value) => {
if (value) {
claimQuery.cursor = 1;
claimQuery.taskCode = '';
void loadConfig();
void loadClaimRecords();
}
},
{ immediate: true },
);
@ -600,6 +655,7 @@ watch(activeTaskCategory, () => {
return;
}
claimQuery.cursor = 1;
claimQuery.taskCode = '';
void loadConfig();
void loadClaimRecords();
});
@ -786,11 +842,21 @@ watch(activeTaskCategory, () => {
placeholder="用户ID"
style="width: 160px"
/>
<Input
<Select
v-model:value="claimQuery.taskCode"
allow-clear
:options="taskCodeOptions"
option-filter-prop="label"
placeholder="任务编码"
style="width: 220px"
show-search
style="width: 280px"
/>
<DatePicker.RangePicker
v-model:value="claimDateRange"
allow-clear
format="YYYY-MM-DD HH:mm:ss"
show-time
style="width: 390px"
/>
<Select
v-model:value="claimQuery.status"
@ -805,6 +871,17 @@ watch(activeTaskCategory, () => {
<Button :loading="claimLoading" type="primary" @click="searchClaimRecords">
查询
</Button>
<Button @click="resetClaimDateRange">今天</Button>
</div>
<div class="claim-summary">
<Tag color="blue">
当前时间总发放金币{{ claimSummary.totalRewardGold }}
</Tag>
<Tag v-if="claimQuery.taskCode" color="green">
{{ claimQuery.taskCode }} 发放金币{{
claimSummary.selectedTaskRewardGold
}}
</Tag>
</div>
<Table
:columns="claimColumns"
@ -850,6 +927,10 @@ watch(activeTaskCategory, () => {
font-size: 12px;
}
.claim-summary {
margin-bottom: 12px;
}
.actions {
display: flex;
gap: 12px;