import { useEffect, useState } from 'react'; import { Button, Descriptions, Drawer, Form, Input, Segmented, Space, Table, Tag, Typography } from 'antd'; import type { ColumnsType } from 'antd/es/table'; import { useSearchParams } from 'react-router-dom'; import { PARTNER_LOG_CATEGORY_OPTIONS, PARTNER_LOG_CATEGORY_LABELS, resolvePartnerLogCategory, type PartnerLogCategory, } from '../lib/partner-log'; import { request } from '../lib/api'; import { fmtTime } from '../lib/constants'; import { useAdminList } from '../lib/useAdminList'; type Row = { id: string; partnerId: string; partnerAccountId: string | null; accountName: string | null; accountPhone: string | null; companyName: string | null; category: PartnerLogCategory | null; eventName: string; clientApp: string | null; refType: string | null; refId: string | null; extraJson: Record | null; createdAt: string; }; function summarizeExtra(json: Record | null) { if (!json) return '—'; const text = JSON.stringify(json); return text.length > 80 ? `${text.slice(0, 80)}…` : text; } export default function PartnerLogsPage() { const [searchParams, setSearchParams] = useSearchParams(); const [form] = Form.useForm(); const [category, setCategory] = useState(searchParams.get('category') ?? ''); const [filters, setFilters] = useState>(() => ({ partnerId: searchParams.get('partnerId') ?? '', partnerAccountId: searchParams.get('partnerAccountId') ?? '', phone: searchParams.get('phone') ?? '', companyName: searchParams.get('companyName') ?? '', eventName: searchParams.get('eventName') ?? '', })); const { data, loading, page, pageSize, setPage, setPageSize } = useAdminList( '/admin/logs/partners', () => { const qs = new URLSearchParams(); if (filters.partnerId) qs.set('partnerId', filters.partnerId); if (filters.partnerAccountId) qs.set('partnerAccountId', filters.partnerAccountId); if (filters.phone) qs.set('phone', filters.phone); if (filters.companyName) qs.set('companyName', filters.companyName); if (filters.eventName) qs.set('eventName', filters.eventName); if (category) qs.set('category', category); return qs; }, [filters, category], ); const [detail, setDetail] = useState | null>(null); const [drawerOpen, setDrawerOpen] = useState(false); useEffect(() => { form.setFieldsValue(filters); }, [form, filters]); const columns: ColumnsType = [ { title: '时间', dataIndex: 'createdAt', width: 160, render: fmtTime }, { title: '合伙人', width: 180, render: (_, r) => (
{r.companyName || '—'}
{r.partnerId}
), }, { title: '账号', width: 150, render: (_, r) => (
{r.accountName || '—'}
{r.accountPhone || r.partnerAccountId || '—'}
), }, { title: '分类', dataIndex: 'category', width: 100, render: (v: PartnerLogCategory | null, r) => ( {PARTNER_LOG_CATEGORY_LABELS[v ?? ''] || resolvePartnerLogCategory(r.eventName) || '其他'} ), }, { title: '事件', dataIndex: 'eventName', width: 180 }, { title: '关联', width: 120, render: (_, r) => (r.refType && r.refId ? `${r.refType}#${r.refId}` : '—'), }, { title: '摘要', ellipsis: true, render: (_, r) => summarizeExtra(r.extraJson), }, { title: '操作', width: 80, render: (_, row) => ( ), }, ]; return (
合伙人日志 ({ value: o.value, label: o.label }))} value={category} onChange={(v) => { setCategory(String(v)); setPage(1); setSearchParams((prev) => { const next = new URLSearchParams(prev); if (v) next.set('category', String(v)); else next.delete('category'); return next; }); }} style={{ marginBottom: 16 }} />
{ setFilters(values); setPage(1); }} >
{ setPage(p); setPageSize(ps); }, }} scroll={{ x: 1100 }} /> setDrawerOpen(false)} width={520}> {detail && ( {Object.entries(detail).map(([k, v]) => ( {typeof v === 'object' ? JSON.stringify(v, null, 2) : String(v ?? '—')} ))} )} ); }