import { View, Text, ScrollView } from '@tarojs/components'; import { useState, useEffect, useCallback } from 'react'; import { useDidShow } from '@tarojs/taro'; import Taro from '@tarojs/taro'; import NavBar from '@/components/NavBar'; import LoadMore from '@/components/common/LoadMore'; import EmptyState from '@/components/common/EmptyState'; import { pageShopInvoiceRecord } from '@/api/shop/shopInvoiceTitle'; import type { ShopInvoiceRecord, ShopInvoiceRecordParam } from '@/api/shop/shopInvoiceTitle/model'; import type { PageResult } from '@/api'; // 发票状态映射 const statusMap = { 0: { text: '待处理', color: 'text-orange-500', bgColor: 'bg-orange-100', textColor: 'text-orange-600' }, 1: { text: '开票中', color: 'text-blue-500', bgColor: 'bg-blue-100', textColor: 'text-blue-600' }, 2: { text: '已完成', color: 'text-green-500', bgColor: 'bg-green-100', textColor: 'text-green-600' }, 3: { text: '失败', color: 'text-red-500', bgColor: 'bg-red-100', textColor: 'text-red-600' }, }; // 发票类型映射 const invoiceTypeMap = { normal: { label: '普通发票', bgColor: 'bg-blue-100', textColor: 'text-blue-600' }, vat: { label: '增值税发票', bgColor: 'bg-orange-100', textColor: 'text-orange-600' }, }; export default function InvoiceRecordsPage() { const [records, setRecords] = useState([]); const [loading, setLoading] = useState(true); const [loadingMore, setLoadingMore] = useState(false); const [hasMore, setHasMore] = useState(true); const [page, setPage] = useState(1); const [activeTab, setActiveTab] = useState<'all' | 'pending' | 'completed'>('all'); // 过滤后的记录 const filteredRecords = records.filter(record => { if (activeTab === 'all') return true; if (activeTab === 'pending') return record.status === 0 || record.status === 1; if (activeTab === 'completed') return record.status === 2; return true; }); // 加载数据 const loadData = useCallback(async (pageNum: number = 1, isLoadMore = false) => { if (isLoadMore) { setLoadingMore(true); } else { setLoading(true); } try { const params: ShopInvoiceRecordParam = { page: pageNum, limit: 10, order: 'desc', sort: 'createTime', }; const result: PageResult = await pageShopInvoiceRecord(params); if (result && result.list) { if (isLoadMore) { setRecords(prev => [...prev, ...result.list]); } else { setRecords(result.list); } setHasMore(result.list.length >= 10); setPage(pageNum); } } catch (e: any) { console.error('获取发票记录失败:', e); Taro.showToast({ title: e.message || '获取数据失败', icon: 'none' }); } finally { setLoading(false); setLoadingMore(false); } }, []); // 下拉刷新 const onPullDownRefresh = useCallback(() => { loadData(1).then(() => { Taro.stopPullDownRefresh(); }); }, [loadData]); // 上拉加载更多 const onReachBottom = useCallback(() => { if (!loadingMore && hasMore) { loadData(page + 1, true); } }, [loadingMore, hasMore, page, loadData]); useEffect(() => { loadData(1); }, []); // 格式化金额 const formatMoney = (money: number | undefined) => { return `¥${(money || 0).toFixed(2)}`; }; // 格式化时间 const formatDate = (dateStr: string | undefined) => { if (!dateStr) return ''; const date = new Date(dateStr); const month = String(date.getMonth() + 1).padStart(2, '0'); const day = String(date.getDate()).padStart(2, '0'); const hour = String(date.getHours()).padStart(2, '0'); const minute = String(date.getMinutes()).padStart(2, '0'); return `${date.getFullYear()}-${month}-${day} ${hour}:${minute}`; }; // 获取状态信息 const getStatusInfo = (status: number | undefined) => { return statusMap[status as keyof typeof statusMap] || statusMap[0]; }; // 获取类型信息 const getTypeInfo = (invoiceType: string | undefined) => { return invoiceTypeMap[invoiceType as keyof typeof invoiceTypeMap] || invoiceTypeMap.normal; }; // 查看发票 const handleViewInvoice = (record: ShopInvoiceRecord) => { if (record.invoiceUrl) { Taro.previewImage({ urls: [record.invoiceUrl] }); } else { Taro.showToast({ title: '暂无发票', icon: 'none' }); } }; return ( {/* 标签切换 */} {[ { key: 'all', label: '全部' }, { key: 'pending', label: '待处理' }, { key: 'completed', label: '已完成' } ].map(tab => ( setActiveTab(tab.key as any)} > {tab.label} {activeTab === tab.key && ( )} ))} {/* 记录列表 */} {loading ? ( ) : filteredRecords.length === 0 ? ( ) : ( {filteredRecords.map(record => { const statusInfo = getStatusInfo(record.status); const typeInfo = getTypeInfo(record.invoiceType); return ( {typeInfo.label} {statusInfo.text} {record.titleName} {record.orderNo && ( 订单号:{record.orderNo} )} {formatMoney(record.amount)} 申请时间 {formatDate(record.applyTime)} {record.invoiceNo && ( 发票号 {record.invoiceNo} )} {record.status === 2 && ( handleViewInvoice(record)} > 查看发票 )} ); })} )} ); }