f
This commit is contained in:
@@ -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>
|
||||
|
||||
Reference in New Issue
Block a user