import React from 'react'; import { Button, Popconfirm, Space, Table, Tag } from 'antd'; import { DeleteOutlined, InboxOutlined } from '@ant-design/icons'; import dayjs from 'dayjs'; import PermissionButton from '../../components/PermissionButton'; import { QueryEmpty } from '../../components/QueryState'; import { message } from '../../ui/app-message'; import { statusMap } from './DepositModals'; import type { DepositRecord } from './DepositModals'; export interface DepositTableProps { data: any[]; loading: boolean; canPurgeDeposit: boolean; canCreateDeposit?: boolean; onCreateDeposit?: () => void; refundForm: ReturnType[0]; onDetail: (record: DepositRecord) => void; onRefund: (record: DepositRecord) => void; onArchive: (id: number) => Promise | unknown; onPurge: (id: number) => Promise | unknown; } export const DepositTable: React.FC = ({ data, loading, canPurgeDeposit, canCreateDeposit, onCreateDeposit, refundForm, onDetail, onRefund, onArchive, onPurge, }) => { const columns = [ { title: '学生', width: 120, render: (_: unknown, r: any) => r.student?.name || '-' }, { title: '当前可用押金', dataIndex: 'amount', width: 130, render: (v: number) => `¥${Number(v || 0).toFixed(2)}`, }, { title: '房间', width: 120, render: (_: unknown, r: any) => r.roomNumber ? `${r.building ? `${r.building}-` : ''}${r.roomNumber}` : '-', }, { title: '房型', dataIndex: 'roomType', width: 100, render: (v: string) => v || '-' }, { title: '最近收取日期', dataIndex: 'paidDate', width: 120, render: (v: string) => v || '-' }, { title: '状态', dataIndex: 'status', render: (s: string) => s === 'unpaid' ? ( 未缴 ) : ( {statusMap[s]?.text || s} ), }, { title: '退还日期', dataIndex: 'refundDate', width: 110, render: (v: unknown) => v || '-' }, { title: '备注', dataIndex: 'notes', width: 120, render: (v: unknown) => v || '-' }, { title: '操作', fixed: 'right' as const, width: 240, render: (_: unknown, record: any) => { const hasDeposit = typeof record.id === 'number'; return ( {hasDeposit && ( onDetail(record)}> 详情 )} {record.status === 'paid' && hasDeposit && ( { onRefund(record); refundForm.setFieldsValue({ refundDate: dayjs() }); }} > 退还 )} {hasDeposit && ( { try { await onArchive(record.id); message.success('归档成功'); } catch { // 错误提示由 useApiMutation 统一处理 } }} > } > 归档 )} {record.status === 'archived' && hasDeposit && canPurgeDeposit ? ( { try { await onPurge(record.id); message.success('已永久删除(不可恢复)'); } catch { // 错误提示由 useApiMutation 统一处理 } }} > ) : null} ); }, }, ]; return ( `共 ${total} 条`, }} locale={{ emptyText: ( ), }} /> ); };