import { useState } from 'react'; import { Button, Descriptions, Drawer, Form, Input, Modal, Select, Space, Table, Tabs, Tag, Typography, message, } from 'antd'; import type { ColumnsType } from 'antd/es/table'; import { request, type Paginated } from '../lib/api'; import { ACCOUNT_STATUS_LABELS, ORDER_STATUS_LABELS, PARTNER_BILL_STATUS_LABELS, fmtTime } from '../lib/constants'; import { useAdminList } from '../lib/useAdminList'; type Row = { id: string; phone: string; name: string; status: string; isPrimary: number; createdAt: string; partner?: { id: string; companyName: string }; }; type BillRow = { id: string; billNo: string; totalAmount: number; orderCommission: number; redeemCommission: number; status: string; periodStart: string; periodEnd: string; createdAt: string; }; type OrderRow = { id: string; orderNo: string; status: string; payAmount: number; createdAt: string; user?: { userNo: string; phone: string | null }; }; type PartnerOption = { id: string; companyName: string }; type Detail = Row & { bills?: BillRow[]; orders?: OrderRow[] }; export default function PartnerAccountsPage() { const [form] = Form.useForm(); const [createForm] = Form.useForm(); const [filters, setFilters] = useState>({}); const { data, loading, page, pageSize, setPage, setPageSize, reload } = useAdminList( '/admin/partner-accounts', () => { const qs = new URLSearchParams(); if (filters.phone) qs.set('phone', filters.phone); if (filters.status) qs.set('status', filters.status); return qs; }, [filters], ); const [detail, setDetail] = useState(null); const [drawerOpen, setDrawerOpen] = useState(false); const [createOpen, setCreateOpen] = useState(false); const [partners, setPartners] = useState([]); async function loadPartners() { const res = await request>('/admin/partners?pageSize=200'); setPartners(res.items); } const columns: ColumnsType = [ { title: '姓名', dataIndex: 'name', width: 100 }, { title: '手机', dataIndex: 'phone', width: 120 }, { title: '开城合伙人', dataIndex: ['partner', 'companyName'], width: 140 }, { title: '主账号', dataIndex: 'isPrimary', width: 80, render: (v) => (v === 1 ? '是' : '否') }, { title: '状态', dataIndex: 'status', width: 80, render: (s) => {ACCOUNT_STATUS_LABELS[s] || s} }, { title: '创建', dataIndex: 'createdAt', width: 160, render: fmtTime }, { title: '操作', width: 80, render: (_, row) => ( ), }, ]; const billColumns: ColumnsType = [ { title: '账单号', dataIndex: 'billNo', width: 140 }, { title: '总额', dataIndex: 'totalAmount', width: 90, render: (v) => `¥${v}` }, { title: '订单佣金', dataIndex: 'orderCommission', width: 90, render: (v) => `¥${v}` }, { title: '核销佣金', dataIndex: 'redeemCommission', width: 90, render: (v) => `¥${v}` }, { title: '状态', dataIndex: 'status', width: 90, render: (s) => {PARTNER_BILL_STATUS_LABELS[s] || s} }, { title: '周期', width: 200, render: (_, r) => `${fmtTime(r.periodStart)} ~ ${fmtTime(r.periodEnd)}` }, ]; const orderColumns: ColumnsType = [ { title: '订单号', dataIndex: 'orderNo', width: 160 }, { title: '用户', dataIndex: ['user', 'userNo'], width: 110 }, { title: '金额', dataIndex: 'payAmount', width: 90, render: (v) => `¥${v}` }, { title: '状态', dataIndex: 'status', width: 90, render: (s) => {ORDER_STATUS_LABELS[s] || s} }, { title: '下单', dataIndex: 'createdAt', width: 160, render: fmtTime }, ]; return (
开城合伙人账户
{ setFilters(v); setPage(1); }}> ({ value, label }))} onChange={async (status) => { await request(`/admin/partner-accounts/${detail.id}`, { method: 'PUT', body: JSON.stringify({ status }) }); message.success('已更新'); void reload(); }} /> )}> {detail && ( {detail.name} {detail.phone} {detail.partner?.companyName} ), }, { key: 'bills', label: `账单 (${detail.bills?.length ?? 0})`, children: ( ), }, { key: 'orders', label: `名下订单 (${detail.orders?.length ?? 0})`, children: (
), }, ]} /> )} setCreateOpen(false)} onOk={async () => { const v = await createForm.validateFields(); await request('/admin/partner-accounts', { method: 'POST', body: JSON.stringify(v) }); message.success('已创建'); setCreateOpen(false); createForm.resetFields(); void reload(); }}> ); }