import { CheckCircleOutlined, PlusOutlined, ReloadOutlined, SwapOutlined, WalletOutlined, } from '@ant-design/icons' import { useQuery, useQueryClient } from '@tanstack/react-query' import { Alert, App, Button, Card, Checkbox, Col, DatePicker, Descriptions, Drawer, Form, Input, InputNumber, Modal, Row, Select, Space, Statistic, Tabs, Tag, Typography, } from 'antd' import PercentTable from '@/components/common/PercentTable' import type { TableColumnsType } from 'antd' import dayjs from 'dayjs' import type { Dayjs } from 'dayjs' import { useState } from 'react' import { PlatformCreditPanel } from './PlatformCreditPanel' import ImagePreviewList from '@/components/files/ImagePreviewList' import ImageUpload from '@/components/files/ImageUpload' import PageHeader from '@/components/admin/PageHeader' import { confirmAdminFundReconciliation, createAdminFundAccount, createAdminFundExpense, createAdminFundFunding, createAdminFundIssue, createAdminFundReconciliation, createAdminFundReturn, ensureAdminFundAgentAccounts, fetchAdminFundAccountDetail, fetchAdminFundAccounts, fetchAdminFundExpenses, fetchAdminFundOverview, fetchAdminFundReconciliations, fetchAdminFundSetupOptions, updateAdminFundAccount, } from '@/services/admin' import type { AdminFundAccount, AdminFundEntry, AdminFundExpense, AdminFundExpenseCategory, AdminFundPayeeType, AdminFundReconciliation, AdminFundSetupUser, } from '@/types/admin' import type { UploadedFile } from '@/types/worker-platform' import { formatAdminDateTime } from '@/utils/admin-time' import { buildAdminTablePagination } from '@/utils/admin-pagination' import { FUND_ACCOUNT_STATUS_LABELS, FUND_CATEGORY_LABELS, FUND_ENTRY_COLORS, FUND_ENTRY_LABELS, FUND_PAYEE_LABELS, FUND_RECONCILIATION_STATUS_COLORS, FUND_RECONCILIATION_STATUS_LABELS, formatFundAmount, fromFen, toFen, } from './fund-labels' type ManagementRole = 'admin' | 'operator' | 'finance' type IssueFormValues = { agentAccountId: number supervisorAccountId?: number amountYuan: number occurredAt: Dayjs evidence: UploadedFile[] note?: string } type FundingFormValues = { supervisorAccountId: number amountYuan: number occurredAt: Dayjs evidence: UploadedFile[] note?: string } type ExpenseFormValues = { agentAccountId: number amountYuan: number category: AdminFundExpenseCategory payeeType: AdminFundPayeeType payeeName: string payeeAccount?: string platformName?: string platformAccount?: string orderId?: number paidAt: Dayjs evidence: UploadedFile[] note?: string allowDuplicate?: boolean } type ReturnFormValues = { agentAccountId: number supervisorAccountId?: number amountYuan: number occurredAt: Dayjs evidence: UploadedFile[] note?: string } type ReconcileFormValues = { accountId: number period: [Dayjs, Dayjs] actualBalanceYuan: number reason?: string evidence: UploadedFile[] } type ConfirmReconcileFormValues = { reason?: string evidence: UploadedFile[] } type CreateAccountFormValues = { accountType: 'supervisor' | 'agent' ownerAdminUserId: number responsibleSupervisorAccountId?: number openingBalanceYuan?: number } type BulkAgentsFormValues = { responsibleSupervisorAccountId: number openingBalanceYuan?: number } export default function FundManagementView({ role }: { role: ManagementRole }) { const { message } = App.useApp() const queryClient = useQueryClient() const isAdmin = role === 'admin' const canIssue = role === 'admin' || role === 'operator' const canReconcile = role === 'admin' || role === 'operator' || role === 'finance' const canExpense = role === 'admin' const canManageCredits = role === 'admin' || role === 'finance' const [activeTab, setActiveTab] = useState('overview') const [submitting, setSubmitting] = useState(false) const [issueOpen, setIssueOpen] = useState(false) const [fundingOpen, setFundingOpen] = useState(false) const [expenseOpen, setExpenseOpen] = useState(false) const [returnOpen, setReturnOpen] = useState(false) const [reconcileOpen, setReconcileOpen] = useState(false) const [confirmReconcileOpen, setConfirmReconcileOpen] = useState(false) const [createAccountOpen, setCreateAccountOpen] = useState(false) const [bulkAgentsOpen, setBulkAgentsOpen] = useState(false) const [detailAccount, setDetailAccount] = useState(null) const [confirmReconciliation, setConfirmReconciliation] = useState(null) const [expensePage, setExpensePage] = useState(1) const [expensePageSize, setExpensePageSize] = useState(20) const [expenseKeyword, setExpenseKeyword] = useState('') const [expenseCategory, setExpenseCategory] = useState('') const [expenseRange, setExpenseRange] = useState<[Dayjs, Dayjs] | null>(null) const [reconciliationPage, setReconciliationPage] = useState(1) const [reconciliationPageSize, setReconciliationPageSize] = useState(20) const [reconciliationStatus, setReconciliationStatus] = useState('') const [issueForm] = Form.useForm() const [fundingForm] = Form.useForm() const [expenseForm] = Form.useForm() const [returnForm] = Form.useForm() const [reconcileForm] = Form.useForm() const [confirmReconcileForm] = Form.useForm() const [createAccountForm] = Form.useForm() const [bulkAgentsForm] = Form.useForm() const createAccountType = Form.useWatch('accountType', createAccountForm) || 'agent' const overviewQuery = useQuery({ queryKey: ['admin-fund-overview'], queryFn: fetchAdminFundOverview, }) const agentsQuery = useQuery({ queryKey: ['admin-fund-accounts', 'agent'], queryFn: () => fetchAdminFundAccounts({ accountType: 'agent', pageSize: 100 }), }) const supervisorsQuery = useQuery({ queryKey: ['admin-fund-accounts', 'supervisor'], queryFn: () => fetchAdminFundAccounts({ accountType: 'supervisor', pageSize: 100 }), }) const expensesQuery = useQuery({ queryKey: [ 'admin-fund-expenses', expensePage, expensePageSize, expenseKeyword, expenseCategory, expenseRange?.[0]?.format('YYYY-MM-DD HH:mm:ss') || '', expenseRange?.[1]?.format('YYYY-MM-DD HH:mm:ss') || '', ], queryFn: () => fetchAdminFundExpenses({ page: expensePage, pageSize: expensePageSize, keyword: expenseKeyword || undefined, category: expenseCategory || undefined, dateFrom: expenseRange?.[0]?.format('YYYY-MM-DD HH:mm:ss'), dateTo: expenseRange?.[1]?.format('YYYY-MM-DD HH:mm:ss'), }), }) const reconciliationsQuery = useQuery({ queryKey: [ 'admin-fund-reconciliations', reconciliationPage, reconciliationPageSize, reconciliationStatus, ], queryFn: () => fetchAdminFundReconciliations({ page: reconciliationPage, pageSize: reconciliationPageSize, status: reconciliationStatus || undefined, }), }) const setupQuery = useQuery({ queryKey: ['admin-fund-options'], queryFn: fetchAdminFundSetupOptions, enabled: isAdmin, }) const detailQuery = useQuery({ queryKey: ['admin-fund-account-detail', detailAccount?.id], queryFn: () => fetchAdminFundAccountDetail(detailAccount!.id, { page: 1, pageSize: 100 }), enabled: Boolean(detailAccount?.id), }) const overview = overviewQuery.data?.data const agentAccounts = agentsQuery.data?.data.items || [] const supervisorAccounts = supervisorsQuery.data?.data.items || [] const expenses = expensesQuery.data?.data.items || [] const expensePagination = expensesQuery.data?.data.pagination const reconciliations = reconciliationsQuery.data?.data.items || [] const reconciliationPagination = reconciliationsQuery.data?.data.pagination const setup = setupQuery.data?.data const agentOptions = agentAccounts.map((account) => ({ value: account.id, label: `${account.ownerName}(余额 ${formatFundAmount(account.balanceFen)})`, })) const supervisorOptions = supervisorAccounts.map((account) => ({ value: account.id, label: `${account.ownerName}(余额 ${formatFundAmount(account.balanceFen)})`, })) function refreshAll() { void queryClient.invalidateQueries({ queryKey: ['admin-fund-overview'] }) void queryClient.invalidateQueries({ queryKey: ['admin-fund-accounts'] }) void queryClient.invalidateQueries({ queryKey: ['admin-fund-expenses'] }) void queryClient.invalidateQueries({ queryKey: ['admin-fund-reconciliations'] }) void queryClient.invalidateQueries({ queryKey: ['admin-fund-account-detail'] }) void queryClient.invalidateQueries({ queryKey: ['admin-fund-options'] }) void queryClient.invalidateQueries({ queryKey: ['admin-fund-my'] }) } function openIssue(account?: AdminFundAccount) { issueForm.resetFields() issueForm.setFieldsValue({ agentAccountId: account?.accountType === 'agent' ? account.id : (agentAccounts[0]?.id as number | undefined), supervisorAccountId: account?.accountType === 'supervisor' ? account.id : (supervisorAccounts[0]?.id as number | undefined), occurredAt: dayjs(), evidence: [], }) setIssueOpen(true) } function openFunding(account?: AdminFundAccount) { fundingForm.resetFields() fundingForm.setFieldsValue({ supervisorAccountId: account?.id || (supervisorAccounts[0]?.id as number | undefined), occurredAt: dayjs(), evidence: [], }) setFundingOpen(true) } function openExpense(account?: AdminFundAccount) { expenseForm.resetFields() expenseForm.setFieldsValue({ agentAccountId: account?.accountType === 'agent' ? account.id : (agentAccounts[0]?.id as number | undefined), category: 'platform_recharge', payeeType: 'platform', paidAt: dayjs(), evidence: [], allowDuplicate: false, }) setExpenseOpen(true) } function openReturn(account?: AdminFundAccount) { returnForm.resetFields() returnForm.setFieldsValue({ agentAccountId: account?.accountType === 'agent' ? account.id : (agentAccounts[0]?.id as number | undefined), supervisorAccountId: account?.accountType === 'supervisor' ? account.id : (supervisorAccounts[0]?.id as number | undefined), occurredAt: dayjs(), evidence: [], }) setReturnOpen(true) } function openReconcile(account?: AdminFundAccount) { reconcileForm.resetFields() reconcileForm.setFieldsValue({ accountId: account?.accountType === 'agent' ? account.id : (agentAccounts[0]?.id as number | undefined), period: [dayjs().subtract(7, 'day'), dayjs()], actualBalanceYuan: account ? fromFen(account.balanceFen) : 0, evidence: [], }) setReconcileOpen(true) } function openConfirmReconcile(reconciliation: AdminFundReconciliation) { setConfirmReconciliation(reconciliation) confirmReconcileForm.resetFields() confirmReconcileForm.setFieldsValue({ reason: reconciliation.reason || '', evidence: [], }) setConfirmReconcileOpen(true) } async function submitIssue(values: IssueFormValues) { setSubmitting(true) try { await createAdminFundIssue(values.agentAccountId, { agentAccountId: values.agentAccountId, supervisorAccountId: values.supervisorAccountId, amountFen: toFen(values.amountYuan), occurredAt: values.occurredAt.toISOString(), evidence: values.evidence || [], note: values.note || '', }) message.success('备用金已发放') setIssueOpen(false) refreshAll() } catch (error) { message.error(error instanceof Error ? error.message : '发放备用金失败') } finally { setSubmitting(false) } } async function submitFunding(values: FundingFormValues) { setSubmitting(true) try { await createAdminFundFunding(values.supervisorAccountId, { supervisorAccountId: values.supervisorAccountId, amountFen: toFen(values.amountYuan), occurredAt: values.occurredAt.toISOString(), evidence: values.evidence || [], note: values.note || '', }) message.success('主管资金池已拨付') setFundingOpen(false) refreshAll() } catch (error) { message.error(error instanceof Error ? error.message : '拨付失败') } finally { setSubmitting(false) } } async function submitExpense(values: ExpenseFormValues) { setSubmitting(true) try { await createAdminFundExpense(values.agentAccountId, { amountFen: toFen(values.amountYuan), category: values.category, payeeType: values.payeeType, payeeName: values.payeeName, payeeAccount: values.payeeAccount || '', platformName: values.platformName || '', platformAccount: values.platformAccount || '', orderId: values.orderId || null, paidAt: values.paidAt.toISOString(), evidence: values.evidence || [], note: values.note || '', allowDuplicate: values.allowDuplicate === true, }) message.success('支出已登记') setExpenseOpen(false) refreshAll() } catch (error) { message.error(error instanceof Error ? error.message : '登记支出失败') } finally { setSubmitting(false) } } async function submitReturn(values: ReturnFormValues) { setSubmitting(true) try { await createAdminFundReturn(values.agentAccountId, { agentAccountId: values.agentAccountId, supervisorAccountId: values.supervisorAccountId, amountFen: toFen(values.amountYuan), occurredAt: values.occurredAt.toISOString(), evidence: values.evidence || [], note: values.note || '', }) message.success('备用金已缴回') setReturnOpen(false) refreshAll() } catch (error) { message.error(error instanceof Error ? error.message : '缴回失败') } finally { setSubmitting(false) } } async function submitReconcile(values: ReconcileFormValues) { setSubmitting(true) try { await createAdminFundReconciliation({ accountId: values.accountId, periodStart: values.period[0].toISOString(), periodEnd: values.period[1].toISOString(), actualBalanceFen: toFen(values.actualBalanceYuan), reason: values.reason || '', evidence: values.evidence || [], }) message.success('对账已发起') setReconcileOpen(false) refreshAll() } catch (error) { message.error(error instanceof Error ? error.message : '发起对账失败') } finally { setSubmitting(false) } } async function submitConfirmReconcile(values: ConfirmReconcileFormValues) { if (!confirmReconciliation) return setSubmitting(true) try { await confirmAdminFundReconciliation(confirmReconciliation.id, { reason: values.reason || '', evidence: values.evidence || [], }) message.success('对账已确认') setConfirmReconcileOpen(false) setConfirmReconciliation(null) refreshAll() } catch (error) { message.error(error instanceof Error ? error.message : '确认对账失败') } finally { setSubmitting(false) } } async function submitCreateAccount(values: CreateAccountFormValues) { setSubmitting(true) try { await createAdminFundAccount({ accountType: values.accountType, ownerAdminUserId: values.ownerAdminUserId, responsibleSupervisorAccountId: values.responsibleSupervisorAccountId, openingBalanceFen: toFen(values.openingBalanceYuan || 0), }) message.success('备用金账户已创建') setCreateAccountOpen(false) refreshAll() } catch (error) { message.error(error instanceof Error ? error.message : '创建账户失败') } finally { setSubmitting(false) } } async function submitBulkAgents(values: BulkAgentsFormValues) { setSubmitting(true) try { const result = await ensureAdminFundAgentAccounts({ responsibleSupervisorAccountId: values.responsibleSupervisorAccountId, openingBalanceFen: toFen(values.openingBalanceYuan || 0), }) message.success(`已创建 ${result.data.createdCount} 个客服账户`) setBulkAgentsOpen(false) refreshAll() } catch (error) { message.error(error instanceof Error ? error.message : '批量初始化失败') } finally { setSubmitting(false) } } async function toggleAccountStatus(account: AdminFundAccount) { setSubmitting(true) try { await updateAdminFundAccount(account.id, { status: account.status === 'active' ? 'frozen' : 'active', }) message.success(account.status === 'active' ? '账户已冻结' : '账户已启用') refreshAll() } catch (error) { message.error(error instanceof Error ? error.message : '更新账户状态失败') } finally { setSubmitting(false) } } function buildAccountColumns(type: 'agent' | 'supervisor'): TableColumnsType { return [ { title: '账户编号', dataIndex: 'accountNo', width: 150 }, { title: '姓名', dataIndex: 'ownerName', width: 120 }, ...(type === 'agent' ? [ { title: '责任主管', dataIndex: 'responsibleSupervisorName', width: 120, render: (value: string) => value || '-', }, ] : []), { title: '当前余额', dataIndex: 'balanceFen', width: 130, render: (value: number) => ( {formatFundAmount(value)} ), }, { title: '本月流入', dataIndex: 'monthInFen', width: 120, render: (value: number) => formatFundAmount(value), }, { title: '本月流出', dataIndex: 'monthOutFen', width: 120, render: (value: number) => formatFundAmount(value), }, { title: '最后流水', dataIndex: 'lastEntryAt', width: 170, render: (value: string | null) => (value ? formatAdminDateTime(value) : '-'), }, { title: '最后对账', dataIndex: 'lastReconciledAt', width: 170, render: (value: string | null) => (value ? formatAdminDateTime(value) : '-'), }, { title: '状态', dataIndex: 'status', width: 90, render: (value: string) => ( {FUND_ACCOUNT_STATUS_LABELS[value] || value} ), }, { title: '操作', key: 'actions', width: 260, fixed: 'right', render: (_value, record) => ( {isAdmin && type === 'supervisor' ? ( ) : null} {canIssue ? ( ) : null} {type === 'agent' && canIssue ? ( ) : null} {type === 'agent' && canReconcile ? ( ) : null} {isAdmin ? ( ) : null} ), }, ] } const expenseColumns: TableColumnsType = [ { title: '付款时间', dataIndex: 'paidAt', width: 170, render: (value: string) => formatAdminDateTime(value), }, { title: '支出单号', dataIndex: 'expenseNo', width: 150 }, { title: '客服', dataIndex: 'agentName', width: 110 }, { title: '分类', dataIndex: 'category', width: 110, render: (value: AdminFundExpenseCategory) => FUND_CATEGORY_LABELS[value] || value, }, { title: '收款方', dataIndex: 'payeeName', width: 180, render: (_value: string, row) => ( {row.payeeName} {FUND_PAYEE_LABELS[row.payeeType]} {row.payeeAccount ? ` · ${row.payeeAccount}` : ''} ), }, { title: '平台/账号', dataIndex: 'platformName', width: 180, render: (_value: string, row) => row.platformName || row.platformAccount ? `${row.platformName || '-'}${row.platformAccount ? ` / ${row.platformAccount}` : ''}` : '-', }, { title: '关联订单', dataIndex: 'orderId', width: 100, render: (value: number | null) => (value ? `#${value}` : '-'), }, { title: '金额', dataIndex: 'amountFen', width: 120, render: (value: number) => ( {formatFundAmount(value)} ), }, { title: '凭证', dataIndex: 'evidence', width: 100, render: (value: UploadedFile[]) => ( ), }, { title: '说明', dataIndex: 'note', render: (value: string) => value || '-' }, ] const reconciliationColumns: TableColumnsType = [ { title: '对账区间', dataIndex: 'periodStart', width: 230, render: (_value: string, row) => `${formatAdminDateTime(row.periodStart)} ~ ${formatAdminDateTime(row.periodEnd)}`, }, { title: '对账单号', dataIndex: 'reconciliationNo', width: 150 }, { title: '客服', dataIndex: 'agentName', width: 110 }, { title: '系统余额', dataIndex: 'systemBalanceFen', width: 120, render: (value: number) => formatFundAmount(value), }, { title: '实际余额', dataIndex: 'actualBalanceFen', width: 120, render: (value: number) => formatFundAmount(value), }, { title: '差异', dataIndex: 'differenceFen', width: 120, render: (value: number) => ( {formatFundAmount(value, true)} ), }, { title: '状态', dataIndex: 'status', width: 100, render: (value: AdminFundReconciliation['status']) => ( {FUND_RECONCILIATION_STATUS_LABELS[value]} ), }, { title: '原因', dataIndex: 'reason', render: (value: string) => value || '-', }, { title: '确认人', dataIndex: 'confirmedByUsername', width: 110, render: (value: string, row) => value ? `${value}${row.confirmedAt ? ` · ${formatAdminDateTime(row.confirmedAt)}` : ''}` : '-', }, { title: '操作', key: 'actions', width: 100, fixed: 'right', render: (_value, row) => row.status === 'confirmed' ? ( 已确认 ) : ( ), }, ] const detailEntries = detailQuery.data?.data.items || [] const detailEntryColumns: TableColumnsType = [ { title: '时间', dataIndex: 'occurredAt', width: 170, render: (value: string) => formatAdminDateTime(value), }, { title: '类型', dataIndex: 'entryType', width: 110, render: (value: AdminFundEntry['entryType']) => ( {FUND_ENTRY_LABELS[value]} ), }, { title: '金额', dataIndex: 'amountFen', width: 120, render: (value: number) => ( = 0 ? 'success' : 'danger'}> {formatFundAmount(value, true)} ), }, { title: '余额', dataIndex: 'balanceAfterFen', width: 120, render: (value: number) => formatFundAmount(value), }, { title: '对方账户', dataIndex: 'counterpartyName', width: 130, render: (value: string) => value || '-', }, { title: '凭证', dataIndex: 'evidence', width: 100, render: (value: UploadedFile[]) => ( ), }, { title: '说明', dataIndex: 'note', render: (value: string) => value || '-' }, ] const setupSupportUsersWithoutAccount = setup?.users.filter( (user) => user.role === 'support' && !setup.agentAccounts.some((account) => account.ownerAdminUserId === user.id), ) || [] const setupSupervisorUsersWithoutAccount = setup?.users.filter( (user) => (user.role === 'operator' || user.role === 'admin') && !setup.supervisorAccounts.some((account) => account.ownerAdminUserId === user.id), ) || [] function openCreateAccount(prefill?: Partial) { createAccountForm.resetFields() createAccountForm.setFieldsValue({ accountType: 'agent', openingBalanceYuan: 0, ...prefill, }) setCreateAccountOpen(true) } function openBulkAgents() { bulkAgentsForm.resetFields() bulkAgentsForm.setFieldsValue({ responsibleSupervisorAccountId: supervisorAccounts[0]?.id, openingBalanceYuan: 0, }) setBulkAgentsOpen(true) } const createAccountUserOptions = createAccountType === 'supervisor' ? (setup?.users || []).filter( (user) => (user.role === 'operator' || user.role === 'admin') && !setup?.supervisorAccounts.some((account) => account.ownerAdminUserId === user.id), ) : (setup?.users || []).filter( (user) => user.role === 'support' && !setup?.agentAccounts.some((account) => account.ownerAdminUserId === user.id), ) return (
} loading={overviewQuery.isFetching} onClick={refreshAll}> 刷新 } /> {overviewQuery.error ? ( ) : null} } /> 0 ? '#cf1322' : undefined, }} /> {canIssue ? ( ) : null} {canManageCredits ? ( ) : null} {canExpense ? ( ) : null} {canReconcile ? ( ) : null} {isAdmin ? : null} {(overview?.unreconciledAgentCount || 0) > 0 ? ( ) : null} ), }, { key: 'agents', label: '客服现金钱包', children: ( openIssue()}> 发放备用金 ) : null } > rowKey="id" size="small" columns={buildAccountColumns('agent')} dataSource={agentAccounts} loading={agentsQuery.isLoading} pagination={false} scroll={{ x: 1250 }} /> ), }, { key: 'supervisors', label: '现金资金池', children: ( openFunding()}> 公司拨付 ) : null } > rowKey="id" size="small" columns={buildAccountColumns('supervisor')} dataSource={supervisorAccounts} loading={supervisorsQuery.isLoading} pagination={false} scroll={{ x: 1150 }} /> ), }, { key: 'platform-credits', label: '客服积分钱包', children: , }, { key: 'expenses', label: '现金支出', children: ( openExpense()}> 登记支出 ) : null } > { setExpensePage(1) setExpenseKeyword(event.target.value) }} style={{ width: 260 }} /> { setReconciliationPage(1) setReconciliationStatus(value || '') }} style={{ width: 140 }} options={Object.entries(FUND_RECONCILIATION_STATUS_LABELS).map( ([value, label]) => ({ value, label }), )} /> rowKey="id" size="small" columns={reconciliationColumns} dataSource={reconciliations} loading={reconciliationsQuery.isLoading} pagination={buildAdminTablePagination({ current: reconciliationPage, pageSize: reconciliationPageSize, total: reconciliationPagination?.total || 0, onChange: (page, pageSize) => { setReconciliationPage(page || 1) setReconciliationPageSize(pageSize || 20) }, })} scroll={{ x: 1250 }} /> ), }, ...(isAdmin ? [ { key: 'setup', label: '账户初始化', children: ( } > rowKey="id" size="small" columns={buildAccountColumns('supervisor')} dataSource={setup?.supervisorAccounts || []} loading={setupQuery.isLoading} pagination={false} scroll={{ x: 1150 }} /> {setupSupervisorUsersWithoutAccount.length > 0 ? ( user.displayName || user.username) .join('、')} /> ) : null} } > rowKey="id" size="small" columns={buildAccountColumns('agent')} dataSource={setup?.agentAccounts || []} loading={setupQuery.isLoading} pagination={false} scroll={{ x: 1250 }} /> {setupSupportUsersWithoutAccount.length > 0 ? ( user.displayName || user.username) .join('、')} /> ) : null} ), }, ] : []), ]} /> setIssueOpen(false)} onOk={() => issueForm.submit()} confirmLoading={submitting} destroyOnHidden width={720} > form={issueForm} layout="vertical" onFinish={submitIssue}> ) : null} setFundingOpen(false)} onOk={() => fundingForm.submit()} confirmLoading={submitting} destroyOnHidden > form={fundingForm} layout="vertical" onFinish={submitFunding}> ({ value, label, }))} /> 我已确认这不是重复支出(同一客服、金额、收款方 24 小时内) setReturnOpen(false)} onOk={() => returnForm.submit()} confirmLoading={submitting} destroyOnHidden width={680} > form={returnForm} layout="vertical" onFinish={submitReturn}> ) : null} setReconcileOpen(false)} onOk={() => reconcileForm.submit()} confirmLoading={submitting} destroyOnHidden width={680} > form={reconcileForm} layout="vertical" onFinish={submitReconcile} > createAccountForm.setFieldsValue({ ownerAdminUserId: undefined })} /> ) : null} setBulkAgentsOpen(false)} onOk={() => bulkAgentsForm.submit()} confirmLoading={submitting} destroyOnHidden > form={bulkAgentsForm} layout="vertical" onFinish={submitBulkAgents} >