Files
template-10560/src/dealer/capital/index.tsx
赵忠林 159869a381 feat(dealer): 更新经销商资本和订单页面功能
- 在 ShopDealerCapitalParam 接口中新增 userId 和 month 字段
- 在 ShopDealerOrder 接口添加商品名称字段 title
- 修改资本页面默认日期为年月格式,并调整相关查询逻辑
- 调整订单页面收益显示文案及逻辑,支持多级佣金展示
- 修改首页跳转链接,将“收益明细”改为“电费订单”并指向订单页面
2025-10-19 13:59:58 +08:00

207 lines
6.2 KiB
TypeScript
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

import React, {useState, useEffect, useCallback} from 'react'
import {View, Text, ScrollView} from '@tarojs/components'
import {ArrowDown} from '@nutui/icons-react-taro'
import {Empty, PullToRefresh, DatePicker,Space, Loading} from '@nutui/nutui-react-taro'
import Taro from '@tarojs/taro'
import {pageShopDealerCapital} from '@/api/shop/shopDealerCapital'
import {useDealerUser} from '@/hooks/useDealerUser'
import type {ShopDealerCapital} from '@/api/shop/shopDealerCapital/model'
import navTo from "@/utils/common";
const DealerCapital: React.FC = () => {
const [loading, setLoading] = useState<boolean>(false)
const d = new Date()
const currMonth = `${d.getFullYear()}${d.getMonth() + 1}`;
const currDate = `${d.getFullYear()}-${d.getMonth() + 1}-${d.getDate()}`;
const [date, setDate] = useState(currMonth)
const [show1, setShow1] = useState(false)
const [refreshing, setRefreshing] = useState<boolean>(false)
const [loadingMore, setLoadingMore] = useState<boolean>(false)
const [capital, setCapital] = useState<ShopDealerCapital[]>([])
const [currentPage, setCurrentPage] = useState<number>(1)
const [hasMore, setHasMore] = useState<boolean>(true)
const {dealerUser} = useDealerUser()
// 获取订单数据
const fetchCapital = useCallback(async (page: number = 1, isRefresh: boolean = false) => {
// if (!dealerUser?.userId) return
try {
if (isRefresh) {
setRefreshing(true)
} else if (page === 1) {
setLoading(true)
} else {
setLoadingMore(true)
}
const result = await pageShopDealerCapital({
page,
limit: 10,
month: date,
userId: Taro.getStorageSync('UserId')
})
if (result?.list) {
const newCapital = result.list.map(item => ({
...item,
orderNo: item.orderNo
}))
if (page === 1) {
setCapital(newCapital)
} else {
setCapital(prev => [...prev, ...newCapital])
}
setHasMore(newCapital.length === 10)
setCurrentPage(page)
}
} catch (error) {
console.error('获取分销订单失败:', error)
Taro.showToast({
title: '获取订单失败',
icon: 'error'
})
} finally {
setLoading(false)
setRefreshing(false)
setLoadingMore(false)
}
}, [dealerUser?.userId])
// 下拉刷新
const handleRefresh = async () => {
await fetchCapital(1, true)
}
// 加载更多
const handleLoadMore = async () => {
if (!loadingMore && hasMore) {
await fetchCapital(currentPage + 1)
}
}
const getFlowType = (index?: number) => {
if (index === 10) return '电费收益'
if (index === 20) return '提现支出'
if (index === 30) return '转账支出'
if (index === 40) return '转账收入'
return 'warning'
}
// 初始化加载数据
useEffect(() => {
if (dealerUser?.userId) {
fetchCapital(1)
}
}, [fetchCapital,date])
const renderCapitalItem = (item: ShopDealerCapital) => (
<View key={item.id} className="bg-white rounded-lg p-4 mb-3 shadow-sm"
onClick={() => navTo(`/dealer/capital/detail?id=${item.id}`)}>
<View className="flex justify-between items-start mb-1">
<Text className="font-semibold text-gray-800">
{getFlowType(item.flowType)}
</Text>
<Text className="text-lg text-orange-500 font-semibold">
¥{Number(item.money).toFixed(2)}
</Text>
</View>
{item.orderNo && (
<View className="flex justify-between items-center mb-1">
<Text className="text-sm text-gray-400">
{item.orderNo}
</Text>
</View>
)}
<View className="flex justify-between items-center mb-1">
<Text className="text-sm text-gray-400">
{item.createTime}
</Text>
<Text className="text-sm text-gray-400">
{item.money}
</Text>
</View>
</View>
)
return (
<View className="min-h-screen bg-gray-50">
<PullToRefresh
onRefresh={handleRefresh}
disabled={refreshing}
pullingText="下拉刷新"
canReleaseText="释放刷新"
refreshingText="刷新中..."
completeText="刷新完成"
>
<ScrollView
scrollY
className={'h-screen'}
onScrollToLower={handleLoadMore}
lowerThreshold={50}
>
{/*筛选工具条*/}
<Space
className={'px-4 mt-4'}
>
<Text className={'text-sm'} onClick={() => setShow1(true)}>{date ? `${date}` : '请选择'}</Text>
<ArrowDown size={10} className={'text-gray-400'} onClick={() => setShow1(true)}/>
</Space>
{/*账单列表*/}
<View className="p-4">
{loading && capital.length === 0 ? (
<View className="text-center py-8">
<Loading/>
<Text className="text-gray-500 mt-2">...</Text>
</View>
) : capital.length > 0 ? (
<>
{capital.map(renderCapitalItem)}
{loadingMore && (
<View className="text-center py-4">
<Loading/>
<Text className="text-gray-500 mt-1 text-sm">...</Text>
</View>
)}
{!hasMore && capital.length > 0 && (
<View className="text-center py-4">
<Text className="text-gray-400 text-sm"></Text>
</View>
)}
</>
) : (
<Empty description="暂无收益" style={{
backgroundColor: 'transparent'
}}/>
)}
</View>
</ScrollView>
</PullToRefresh>
<DatePicker
title="日期选择"
visible={show1}
pickerProps={{
popupProps: {zIndex: 1220},
}}
type={'year-month'}
defaultValue={new Date(`${currDate}`)}
showChinese
onCancel={() => setShow1(false)}
onConfirm={(_, values) => {
setShow1(false)
setDate(`${values[0]}${values[1]}`)
}}
/>
</View>
)
}
export default DealerCapital