This commit is contained in:
2026-04-27 14:48:54 +08:00
parent 739e08157b
commit 893a223e0e
28 changed files with 828 additions and 634 deletions

View File

@@ -1,5 +1,6 @@
<script setup>
import { onMounted, ref } from 'vue'
import { onReachBottom } from '@dcloudio/uni-app'
import { useRoute } from '@/composables/uni-router'
import useApiFetch from '@/composables/useApiFetch'
@@ -14,15 +15,65 @@ const rewardDetails = ref([])
const userInfo = ref({})
const summary = ref({})
const statistics = ref([])
const subordinateId = ref(0)
const hasMore = ref(true)
const loadMoreState = ref('loading')
function normalizeAgentLevel(value) {
const raw = String(value || '').trim()
if (!raw)
return 'NORMAL'
const cleaned = raw.replace(/代理$/, '')
if (cleaned === '普通')
return 'NORMAL'
const upper = cleaned.toUpperCase()
if (upper.includes('SVIP'))
return 'SVIP'
if (upper.includes('VIP'))
return 'VIP'
if (upper === 'NORMAL' || upper === 'NORNAL')
return 'NORMAL'
return 'NORMAL'
}
function getAgentLevelLabel(value) {
return {
NORMAL: '普通代理',
VIP: 'VIP代理',
SVIP: 'SVIP代理',
}[normalizeAgentLevel(value)] || '普通代理'
}
// 获取收益列表
async function fetchRewardDetails() {
function mergeUniqueById(oldList, newList) {
const map = new Map()
const resolveKey = (item, index) => String(item?.id ?? item?.order_id ?? `${item?.create_time || ''}_${item?.type || ''}_${index}`)
oldList.forEach((item, index) => {
map.set(resolveKey(item, index), item)
})
newList.forEach((item, index) => {
map.set(resolveKey(item, oldList.length + index), item)
})
return Array.from(map.values())
}
async function fetchRewardDetails(reset = false) {
if (loading.value)
return
if (!subordinateId.value)
return
if (!reset && !hasMore.value)
return
loading.value = true
if (reset) {
page.value = 1
hasMore.value = true
loadMoreState.value = 'loading'
rewardDetails.value = []
}
const { data, error } = await useApiFetch(
`/agent/subordinate/contribution/detail?subordinate_id=${route.params.id}&page=${page.value}&page_size=${pageSize}`,
`/agent/subordinate/contribution/detail?subordinate_id=${subordinateId.value}&page=${page.value}&page_size=${pageSize}`,
{ silent: true },
)
.get()
@@ -34,7 +85,7 @@ async function fetchRewardDetails() {
// 更新用户信息
userInfo.value = {
createTime: data.value.data.create_time,
level: data.value.data.level_name || '普通',
level: data.value.data.level_name || data.value.data.level || '',
mobile: data.value.data.mobile,
}
// 更新汇总数据
@@ -122,28 +173,57 @@ async function fetchRewardDetails() {
conversionSvipStat.count = stats.descendant_upgrade_svip_count || 0
}
}
rewardDetails.value = []
}
total.value = data.value.data.total || 0
// 处理列表数据
if (data.value.data.list) {
const list = data.value.data.list
rewardDetails.value = list
}
else {
rewardDetails.value = []
}
const list = data.value.data.list || []
rewardDetails.value = reset ? list : mergeUniqueById(rewardDetails.value, list)
const isLastPage = list.length < pageSize || rewardDetails.value.length >= total.value
hasMore.value = !isLastPage
loadMoreState.value = isLastPage ? 'finished' : 'loading'
if (!isLastPage)
page.value += 1
}
else {
loadMoreState.value = 'error'
}
}
else {
loadMoreState.value = 'error'
}
loading.value = false
}
function onPageChange({ value }) {
page.value = value
fetchRewardDetails()
function resolveSubordinateId(query) {
const rawId = query?.id
?? query?.subordinate_id
?? route.params?.id
?? route.query?.id
?? route.params?.subordinate_id
?? route.query?.subordinate_id
const parsedId = Number.parseInt(String(rawId ?? ''), 10)
return Number.isFinite(parsedId) && parsedId > 0 ? parsedId : 0
}
onLoad((query) => {
const parsedId = resolveSubordinateId(query)
subordinateId.value = parsedId
})
onMounted(() => {
const parsedId = subordinateId.value || resolveSubordinateId()
if (!Number.isFinite(parsedId) || parsedId <= 0) {
uni.showToast({ title: '下级参数错误', icon: 'none' })
setTimeout(() => {
uni.navigateBack()
}, 800)
return
}
subordinateId.value = parsedId
fetchRewardDetails(true)
})
onReachBottom(() => {
fetchRewardDetails()
})
@@ -213,7 +293,7 @@ function formatNumber(num) {
{{ userInfo.mobile }}
</view>
<text class="rounded-full bg-blue-100 px-3 py-1 text-sm text-blue-600 font-medium">
{{ userInfo.level }}代理
{{ getAgentLevelLabel(userInfo.level) }}
</text>
</view>
</view>
@@ -320,16 +400,7 @@ function formatNumber(num) {
加载中...
</view>
</view>
<view class="px-4 pb-4">
<wd-pagination
v-model="page"
:total="total"
:page-size="pageSize"
show-icon
show-message
@change="onPageChange"
/>
</view>
<wd-loadmore :state="loadMoreState" @reload="fetchRewardDetails" />
</view>
</view>
</view>