import { useState } from 'react'; import { Button, Form, Input, Select, Table, Typography, message, Modal, DatePicker } from 'antd'; import type { ColumnsType } from 'antd/es/table'; import dayjs from 'dayjs'; import { request } from '../lib/api'; import { fmtTime } from '../lib/constants'; import { useAdminList } from '../lib/useAdminList'; type Row = { id: string; billNo: string; orderCommission: number; redeemCommission: number; totalAmount: number; status: string; periodStart: string; periodEnd: string; partner?: { companyName: string }; }; export default function PartnerBillsPage() { const [filters, setFilters] = useState>({}); const { data, loading, page, pageSize, setPage, setPageSize, reload } = useAdminList( '/admin/partner-bills', () => { const qs = new URLSearchParams(); if (filters.status) qs.set('status', filters.status); if (filters.partnerId) qs.set('partnerId', filters.partnerId); return qs; }, [filters], ); const [genOpen, setGenOpen] = useState(false); const [genForm] = Form.useForm(); async function generateBill(values: { partnerId: string; month: dayjs.Dayjs }) { await request('/admin/partner-bills/generate', { method: 'POST', body: JSON.stringify({ partnerId: values.partnerId, year: values.month.year(), month: values.month.month() + 1, }), }); message.success('账单已生成'); setGenOpen(false); reload(); } async function confirmBill(id: string) { await request(`/admin/partner-bills/${id}/confirm`, { method: 'POST' }); message.success('已确认'); reload(); } async function markPaid(id: string) { await request(`/admin/partner-bills/${id}/mark-paid`, { method: 'POST', body: JSON.stringify({ paymentRef: `PAY-${Date.now()}` }), }); message.success('已标记打款'); reload(); } async function exportCsv() { const result = await request<{ csv: string }>('/admin/partner-bills/export'); const blob = new Blob([result.csv], { type: 'text/csv;charset=utf-8' }); const url = URL.createObjectURL(blob); const a = document.createElement('a'); a.href = url; a.download = 'partner-bills.csv'; a.click(); URL.revokeObjectURL(url); } const columns: ColumnsType = [ { title: '账单号', dataIndex: 'billNo', width: 180 }, { title: '合伙人', dataIndex: ['partner', 'companyName'] }, { title: '订单佣金', dataIndex: 'orderCommission', width: 100, render: (v) => `¥${v}` }, { title: '核销佣金', dataIndex: 'redeemCommission', width: 100, render: (v) => `¥${v}` }, { title: '合计', dataIndex: 'totalAmount', width: 100, render: (v) => `¥${v}` }, { title: '状态', dataIndex: 'status', width: 90 }, { title: '周期', width: 200, render: (_, r) => `${fmtTime(r.periodStart).slice(0, 10)} ~ ${fmtTime(r.periodEnd).slice(0, 10)}` }, { title: '操作', width: 180, render: (_, row) => ( <> {row.status === 'DRAFT' && } {row.status === 'CONFIRMED' && } ), }, ]; return (
合伙人结算(T+30)
{ setFilters(v); setPage(1); }}>
{ setPage(p); setPageSize(ps); } }} /> setGenOpen(false)} footer={null}>
); }