diff --git a/apps/src/api/legacy/resident-activity.ts b/apps/src/api/legacy/resident-activity.ts index fcd2e53..5584549 100644 --- a/apps/src/api/legacy/resident-activity.ts +++ b/apps/src/api/legacy/resident-activity.ts @@ -110,6 +110,15 @@ export async function saveResidentRechargeRewardConfig(data: Record ); } +export async function pageResidentRechargeRewardClaimRecords( + params: Record, +) { + return requestClient.get>( + `${RECHARGE_REWARD_BASE}/claim-record/page`, + { params }, + ); +} + export async function pageSpecifiedGiftWeeklyRankConfigs(params: Record) { return requestClient.get>>( `${SPECIFIED_GIFT_WEEKLY_RANK_BASE}/config/page`, diff --git a/apps/src/views/resident-activity/recharge-reward-config.vue b/apps/src/views/resident-activity/recharge-reward-config.vue index 6ec6084..b660763 100644 --- a/apps/src/views/resident-activity/recharge-reward-config.vue +++ b/apps/src/views/resident-activity/recharge-reward-config.vue @@ -16,11 +16,14 @@ import { Spin, Switch, Table, + Tabs, + TabPane, Tag, } from 'antdv-next'; import { getResidentRechargeRewardConfig, + pageResidentRechargeRewardClaimRecords, saveResidentRechargeRewardConfig, } from '#/api/legacy/resident-activity'; import ActivityResourceGroupSelectDrawer from '#/views/props/components/activity-resource-group-select-drawer.vue'; @@ -66,7 +69,9 @@ const sysOriginOptions = computed(() => { }); const selectedSysOrigin = ref(''); +const activeTab = ref('config'); const loading = ref(false); +const recordLoading = ref(false); const saving = ref(false); const groupPickerOpen = ref(false); const pickerLevelIndex = ref(-1); @@ -104,6 +109,31 @@ const statusMeta = computed(() => { return { color: 'default', text: '已关闭' }; }); +const recordQuery = reactive>({ + cursor: 1, + limit: 20, + month: '', + userId: '', +}); + +const recordPage = reactive>({ + current: 1, + month: '', + records: [], + size: 20, + timezone: '', + total: 0, +}); + +const recordColumns = [ + { dataIndex: 'user', key: 'user', title: '用户', width: 280 }, + { dataIndex: 'rechargeMonth', key: 'rechargeMonth', title: '统计月份', width: 120 }, + { dataIndex: 'rechargeAmount', key: 'rechargeAmount', title: '充值金额', width: 140 }, + { dataIndex: 'reachedLevels', key: 'reachedLevels', title: '达到档位', width: 300 }, + { dataIndex: 'claimedRewards', key: 'claimedRewards', title: '领取奖励', width: 420 }, + { dataIndex: 'lastRechargeTime', key: 'lastRechargeTime', title: '最后充值时间', width: 180 }, +]; + function toAmountCents(value: number | string | undefined) { const numeric = Number(value || 0); if (!Number.isFinite(numeric)) { @@ -164,6 +194,35 @@ async function loadConfig() { } } +function normalizeRecordPage(result: null | Record | undefined) { + const value = result || {}; + recordPage.records = Array.isArray(value.records) ? value.records : []; + recordPage.total = Number(value.total || 0); + recordPage.current = Number(value.current || 1); + recordPage.size = Number(value.size || 20); + recordPage.month = String(value.month || ''); + recordPage.timezone = String(value.timezone || ''); + if (!recordQuery.month && recordPage.month) { + recordQuery.month = recordPage.month; + } +} + +async function loadClaimRecords() { + if (!selectedSysOrigin.value) { + return; + } + recordLoading.value = true; + try { + const result = await pageResidentRechargeRewardClaimRecords({ + ...recordQuery, + sysOrigin: selectedSysOrigin.value, + }); + normalizeRecordPage(result); + } finally { + recordLoading.value = false; + } +} + function addLevel() { const levels = form.levelConfigs as Array>; const maxLevel = Math.max(0, ...levels.map((item) => Number(item.level || 0))); @@ -273,11 +332,55 @@ async function submitForm() { }); message.success('保存成功'); await loadConfig(); + if (activeTab.value === 'claims') { + await loadClaimRecords(); + } } finally { saving.value = false; } } +function searchClaimRecords() { + recordQuery.cursor = 1; + void loadClaimRecords(); +} + +function handleClaimTableChange(pagination: Record) { + recordQuery.cursor = Number(pagination.current || 1); + recordQuery.limit = Number(pagination.pageSize || 20); + void loadClaimRecords(); +} + +function avatarBackgroundStyle(url: string) { + return { + backgroundImage: `url("${String(url || '').replaceAll('"', '%22')}")`, + }; +} + +function rewardText(item: Record) { + const parts: string[] = []; + const rewardGold = Number(item.rewardGold || 0); + if (rewardGold > 0) { + parts.push(`${rewardGold} 金币`); + } + if (item.rewardGroupName || item.rewardGroupId) { + parts.push(item.rewardGroupName || `奖励组 ${item.rewardGroupId}`); + } + const rewardItems = Array.isArray(item.rewardItems) ? item.rewardItems : []; + if (rewardItems.length > 0) { + parts.push( + rewardItems + .map((reward: Record) => { + const name = reward.name || reward.type || reward.content || '奖励'; + const quantity = Number(reward.quantity || 0); + return quantity > 0 ? `${name} x${quantity}` : String(name); + }) + .join('、'), + ); + } + return parts.length > 0 ? parts.join(' / ') : '-'; +} + watch( sysOriginOptions, (options) => { @@ -292,11 +395,19 @@ watch( selectedSysOrigin, (value) => { if (value) { + recordQuery.cursor = 1; void loadConfig(); + void loadClaimRecords(); } }, { immediate: true }, ); + +watch(activeTab, (value) => { + if (value === 'claims') { + void loadClaimRecords(); + } +});